Verification Of UART Part - III

In

UART Scoreboard

  1 <'
  2 struct uart_sb {
  3    ! tx : list of byte;
  4    ! rx : list of byte;
  5 
  6   txAdd(data : byte) is {
  7     tx.push(data);
  8   };
  9 
 10   rxAdd(data : byte) is {
 11     rx.push(data);
 12   };
 13 
 14   txCompare(data : byte) is {
 15     var org_data : byte = tx.pop0();
 16     if (data  ! = org_data) {
 17       outf("%dns : txCompare : Error : Expected data %x, Got %x\n",
 18        sys.time, org_data, data); 
 19     };
 20   };
 21 
 22   rxCompare(data : byte) is {
 23     var org_data : byte = rx.pop0();
 24     if (data  ! = org_data) {
 25       outf("%dns : rxCompare : Error : Expected data %x, Got %x\n",
 26         sys.time, org_data, data); 
 27     };
 28   };
 29 
 30 };
 31 '>

UART Transcation Generator

   1 <'
   2 struct uart_txgen {
   3    sb : uart_sb;
   4 
   5     ! tx_done      : bit;
   6     ! rx_done      : bit;
   7 
   8    // Connects the transmitter output to recevier input
   9    loopback     : bit;
  10      keep loopback == 0;
  11    // Number of frames to send to transmitter
  12    no_tx_cmds   : uint;
  13      keep no_tx_cmds == 1;
  14    // Number of frames to send to receiver
  15    no_rx_cmds   : uint;
  16      keep no_rx_cmds == 1;
  17    // Delay the reading of data from receiver
  18    rx_over_flow : bit;
  19      keep rx_over_flow == 0;
  20    // Send frame to transmitter before it has sent out last frame
  21    tx_over_flow : bit;
  22      keep tx_over_flow == 0;
  23    // Insert framming error (stop bit) in frame sent to receiver
  24    rx_frame_err : bit;
  25      keep rx_frame_err == 0;
  26   
  27    // Main method, which starts rest of methods 
  28    goTxgen()@sys.any is {
  29      tx_done = 0;
  30      rx_done = 0;
  31      assertReset();
  32      start txDriver();
  33      start rxDriver();
  34      start txMonitor();
  35      start rxMonitor();
  36    };
  37    // This method asserts method
  38    assertReset()@sys.rxclk is {
  39       wait cycle;
  40       'top.reset' = 1;
  41       outf("%dns : Asserting reset to Uart\n",sys.time);
  42       wait [5]*cycle;
  43       'top.reset' = 0;
  44    };
  45 
  46    txDriver()@sys.txclk is {
  47      var tx_timeout : uint = 0;
  48      var tx_data : byte = 0;
  49      'top.tx_enable' = 1;
  50      for {var i : uint = 0; i < no_tx_cmds; i = i + 1} do {
  51        gen tx_data;
  52        sb.txAdd(tx_data);
  53        if (loopback == 1) {
  54          sb.rxAdd(tx_data);
  55        };
  56        // Check if uart is ready to accept data for transmission
  57        while ('top.tx_empty' == 0) {
  58          wait cycle;
  59          tx_timeout =+ 1 ;
  60          if (tx_timeout > 10) {
  61            outf("%dns : txDriver : Warning : tx_empty is 0 for more then 10 clocks\n",
  62              sys.time);
  63          };
  64        };
  65        tx_timeout = 0;
  66        // Drive the data in UART for transmitting
  67        wait cycle;
  68        'top.ld_tx_data' = 1;
  69        'top.tx_data'    = tx_data;
  70        outf("%dns : txDriver : Transmitting data %x\n",sys.time, tx_data);
  71        wait cycle;
  72        'top.ld_tx_data' = 0;
  73        'top.tx_data'    = 0;
  74        while ('top.tx_empty' == 1) {
  75          wait cycle;
  76          tx_timeout =+ 1 ;
  77          if (tx_timeout > 10) {
  78            outf("%dns : txDriver : Warning : tx_empty is 1 for more then 10 clocks\n",
  79              sys.time);
  80          };
  81        };
  82        tx_timeout = 0;
  83      };
  84      tx_done = 1;
  85    };
  86 
  87    rxDriver()@sys.txclk is {
  88      var rx_data : byte = 0;
  89      'top.rx_enable' = 1;
  90      if (loopback == 1) {
  91        'top.loopback' = 1;
  92      } else {
  93        'top.loopback' = 0;
  94        for {var i : uint = 0; i < no_rx_cmds; i = i + 1} do {
  95          gen rx_data; 
  96          sb.rxAdd(rx_data);
  97          outf("%dns : rxDriver : Transmitting data %x\n",sys.time, rx_data);
  98          wait cycle;
  99          'top.rx_in' = 0;
 100          for {var j : uint = 0; j < 8; j = j + 1} do {
 101            wait cycle;
 102            'top.rx_in' = rx_data[j:j];
 103          };
 104          wait cycle;
 105          'top.rx_in' = 1;
 106          wait cycle;
 107        };
 108      };
 109      rx_done = 1;
 110    };
 111 
 112    txMonitor()@sys.txclk is {
 113      var tx_data : byte = 0;
 114      while (TRUE) {
 115        wait cycle;
 116        if ('top.tx_out' == 0) {
 117           outf("%dns : txMonitor : Found start of frame\n",sys.time);
 118           for {var i : uint = 0; i < 8; i = i + 1} do {
 119             wait cycle;
 120             tx_data[i:i] = 'top.tx_out';
 121           };
 122           wait cycle;
 123           if ('top.tx_out' == 0) {
 124             outf("%dns : txMonitor Error : Framing error detecting\n",sys.time);
 125             sb.txCompare(8'b0);
 126           } else {
 127             outf("%dns : txMonitor : Sampled data %x\n",sys.time, tx_data);
 128             sb.txCompare(tx_data);
 129           };
 130        };
 131      };
 132    };
 133 
 134    rxMonitor()@sys.rxclk is {
 135      var rx_data : byte = 0;
 136      while (TRUE) {
 137        wait cycle;
 138        if ('top.rx_empty' == 0) {
 139          'top.uld_rx_data' = 1;
 140          wait cycle;
 141          rx_data = 'top.rx_data';
 142          'top.uld_rx_data' = 0;
 143          outf("%dns : rxMonitor : Sampled data %x\n",sys.time, rx_data);
 144          sb.rxCompare(rx_data);
 145          wait cycle;
 146        };
 147      };
 148    };
 149    
 150    isDone() : bool is {
 151      var status : bool = FALSE;
 152      if (tx_done == 1 && rx_done == 1) {
 153        status =  TRUE;
 154      };
 155      return status;
 156    };
 157 };
 158 '>

   Bạn Có Đam Mê Với Vi Mạch hay Nhúng      -     Bạn Muốn Trau Dồi Thêm Kĩ Năng

Mong Muốn Có Thêm Cơ Hội Trong Công Việc

Và Trở Thành Một Người Có Giá Trị Hơn

Bạn Chưa Biết Phương Thức Nào Nhanh Chóng Để Đạt Được Chúng

Hãy Để Chúng Tôi Hỗ Trợ Cho Bạn. SEMICON  

Lần cập nhật cuối ( Thứ ba, 03 Tháng 5 2022 19:35 )