OpenCores
URL https://opencores.org/ocsvn/pcie_vera_tb/pcie_vera_tb/trunk

Subversion Repositories pcie_vera_tb

[/] [pcie_vera_tb/] [trunk/] [ti_phy_top.vr] - Rev 8

Compare with Previous | Blame | View Log

// ===========================================================================
// File    : ti_phy_top.vr
// Author  : cmagleby
// Date    : Mon Dec 3 11:03:46 MST 2007
// Project : TI PHY design
//
// Copyright (c) notice
// This code adheres to the GNU public license
// Please contact www.gutzlogic.com for details.
// cmagleby@gutzlogic.com; cwinward@gutzlogic.com
// ===========================================================================
//
// $Id: ti_phy_top.vr,v 1.1.1.1 2007-12-05 18:37:07 cmagleby Exp $
//
// ===========================================================================
//
// $Log: not supported by cvs2svn $
//
// ===========================================================================
// Function : This is the top level VERA file.  It call all tasks and brings
// up the PHY.
// ===========================================================================
// ===========================================================================

#define OUTPUT_EDGE  PHOLD
#define OUTPUT_SKEW  #1
#define INPUT_SKEW   #-1
#define INPUT_EDGE   PSAMPLE
#include <vera_defines.vrh>

// define interfaces, and verilog_node here if necessary

#include "ti_phy_top.if.vrh"
#include "receive_packet.vri"
#include "send_packet.vri"
#include "pcie_phy_packet.vri"
#include "link_training.vri"
#include "skip_order_set.vri"
#include "pcie_dllp_packet.vri"
#include "InitFC1.vri"
#include "pcie_tlp_packet.vri"
#include "tlp_gen.vri"

//kcode symbols
#define COM_s 8'hbc
#define SKP_s 8'h1c
#define IDLE_s 8'h7c
#define FTS_s 8'h3c
#define STP_s 8'hfb
#define SDP_s 8'h5c
#define EDB   8'hfe
#define END_s 8'hfd
program ti_phy_top_test {
  
  pcie_phy_packet training_set;
  pcie_phy_packet skip_set;
  //********************************
  //link training gobal variables
  integer send_ts1 = 1;
  integer send_ts2 = 0;
  bit [11:0] sequence_id;
  bit [31:0] packet_array [1040];
  bit [7:0] link = 8'hf7;
  bit [7:0] lane = 8'hf7;
  integer ts1_cycle_cnt = 1;
  integer ts2_cycle_cnt = 1;
  integer LINK_UP = 0;
  bit [7:0]  ph_cl   = 8'b0;
  bit [11:0] pd_cl   = 12'b0;
  bit [7:0]  cplh_cl = 8'b0;
  bit [11:0] cpld_cl = 12'b0;
  bit [7:0]  nph_cl  = 8'b0;
  bit [11:0] npd_cl  = 12'b0;
  bit        INITFC_DONE = 1'b0;
  //********************************
  pcie_dllp_packet flowcntrl_1;
  pcie_dllp_packet ack_seq_num;
  pcie_tlp_packet tlp_packet;
  integer phy_rdy = 0;
  integer my_semaphore;
  bit [8:0]  tx_data_mailbox;
  bit [15:0] tlp_header_mailbox;
  bit [31:0] tlp_data_mailbox;
  bit [47:0] dllp_mailbox;
  bit [127:0] phy_mailbox;
  bit [17:0]  rx_data_mailbox;

  //create mailboxes for transmit and receive packets
  tx_data_mailbox     = alloc(MAILBOX,0,1);
  rx_data_mailbox     = alloc(MAILBOX,0,1);
  
  tlp_header_mailbox  = alloc(MAILBOX,0,1);
  tlp_data_mailbox    = alloc(MAILBOX,0,1);
  dllp_mailbox        = alloc(MAILBOX,0,1);
  phy_mailbox         = alloc(MAILBOX,0,1);
  
  //create a packet arbiter for packet going out on the rx line.
  my_semaphore = alloc(SEMAPHORE, 0, 1, 1);
  if (!my_semaphore) error ("Semaphore could not be allocated\n");
  
  fork
    clk_50mhz_gen();
    phy_status();   
    skip_order_set();
    receive_packet();
    send_packet();
    wait_var(phy_rdy);
    link_training();
  join none
  
  init_ports ();
  reset_sequence();
  wait_var(LINK_UP);
  fork
    zero_fill();
  join none
  InitFC1(ph_cl,pd_cl,cplh_cl,cpld_cl,nph_cl,npd_cl,INITFC_DONE);        

  printf("Posted Header credit %h\n",ph_cl);
  printf("Posted Data credit %h\n",pd_cl);

  printf("NonPosted Header credit %h\n",nph_cl);
  printf("NonPosted Data credit %h\n",npd_cl);

  printf("Completion Header credit %h\n",cplh_cl);
  printf("Completion Data credit %h\n",cpld_cl);

  printf("INITFC_DONE=%d\n.",INITFC_DONE);  
  tlp_gen();
  repeat (10000) @(posedge CLOCK);
}  // end of program ti_phy_top_test

// define tasks/classes/functions here if necessary

task clk_50mhz_gen () {
  ti_phy_top.clk_50mhz = 0;
  @(posedge ti_phy_top.rxclk);  
  while(1) {
    @10 ti_phy_top.clk_50mhz = 1;
    @10 ti_phy_top.clk_50mhz = 0;
  }
}

task init_ports () {
  printf("Task init_ports\n");
  @(posedge ti_phy_top.rxclk);
  ti_phy_top.FPGA_RESET_n = 1'b0;
  ti_phy_top.rxdata16     = 16'b0;
  ti_phy_top.rxdatak16    = 2'b0;
  ti_phy_top.rxvalid16    = 1'b0;
  ti_phy_top.rxidle16     = 1'b0;
  ti_phy_top.rxstatus     = 1'b1;
  ti_phy_top.phystatus    = 1'b1;
}

task reset_sequence() {
  printf("Task phy bring up\n");
  
  @5 ti_phy_top.FPGA_RESET_n = 1'b0;     
  @1 ti_phy_top.FPGA_RESET_n = 1'b1;
}


task phy_status () {
  bit [1:0] prev_pwrdwn = 0;
  integer loop_back_high;
  integer phy_status_arb;
  phy_status_arb = alloc(SEMAPHORE,0,1,1);
  if (!phy_status_arb) error ("Semaphore could not be allocated\n");
  printf("Look for power changes\n");
  @50 ti_phy_top.rxidle16    = 1'b0;
  @100 ti_phy_top.phystatus  = 1'b0;
    while (1){
      prev_pwrdwn = ti_phy_top.pwrdwn;
      @(posedge CLOCK);
      //receiver detect
      if (ti_phy_top.rxdet_loopb == 1'b1 && ti_phy_top.pwrdwn == 2'b10) {
        loop_back_high = 1;
        if (!semaphore_get(WAIT,phy_status_arb,1))
          error ("Semaphore_get returned 0\n");
        //printf("GOT PHY ARB1 /n");
        @10 ti_phy_top.rxstatus = 3'b11;
        @10 ti_phy_top.phystatus = 1'b1;
        while(loop_back_high) {
          @(posedge CLOCK);
          if (ti_phy_top.rxdet_loopb == 1'b0) {
            loop_back_high = 1'b0;
          }
        }
        @4 ti_phy_top.phystatus = 1'b0;
        ti_phy_top.rxstatus = 3'b0;
        semaphore_put (phy_status_arb, 1);        
      }
      if (ti_phy_top.pwrdwn != prev_pwrdwn){
        if (!semaphore_get(WAIT,phy_status_arb,1))
          error ("Semaphore_get returned 0\n");
        //printf("GOT PHY ARB2 /n");
        @1 ti_phy_top.rxstatus = 3'b100;
        ti_phy_top.phystatus = 1'b1;
        @1 ti_phy_top.phystatus = 1'b0;
        if (ti_phy_top.pwrdwn == 2'b00) phy_rdy = 1;
        semaphore_put (phy_status_arb, 1);
        
      }
    }
}



Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.