[UVM]通過RAL Test來驗證APB_WR與APB_RD PORT

       在驗證寄存器的過程中,同時也驗證了BUS是否能通,APB PORT是否都對。比如有時候會給Modul留2套甚至更多的APB接口,有些只能做Write,有些只能做Read,有些Read與Write都可以。那麼怎麼去驗證這種場景呢?下面提供一種方法作為參考:

1、怎麼從testlist中傳遞參數到Bench呢?例如我們可以透過testlist來選擇現在是驗APB_RD PORT還是驗APB_WR PORT。

  /dev/null UVM_TEST=normal_testcase1 -testname=test_case_o0_1_${iii} +UVM_VERBOSITY=UVM_LOW +ROMODE=0 +SLOWMODE=0

  /dev/null UVM_TEST=normal_testcase2 -testname=test_case_o0_2_${iii} +UVM_VERBOSITY=UVM_LOW +ROMODE=1 +SLOWMODE=0

       在上面的例子中,我們可以根據ROMODE傳進來的參數來選擇是不是走APB_RO PORT。為此,我們可以在top.sv中用如下代碼來實現:

bit                             romode;

initial begin
  $value$plusarge("ROMODE = %b", romode);
end

assign apb_mst_if.slave_if[0].pready = (romode === 1'b1) ? RO_pready : RW_pready;
assign apb_mst_if.slave_if[0].pdata  = (romode === 1'b1) ? RO_prdata : RW_prdata;
/////////////////////////////////////////////////////////////////////////////////////////
`ifdef APB_RD_PORT_TEST
  assign pclk_RO     = (romode === 1'b1) ? apb_mst_if.pclk      : 0;
  assign psel_RO     = (romode === 1'b1) ? apb_mst_if.psel[0]   : 0;
  assign penable_RO  = (romode === 1'b1) ? apb_mst_if.pclk      : 0;
  assign paddr_RO    = (romode === 1'b1) ? apb_mst_if.pclk      : 0;
  assign pwrite_RO   = (romode === 1'b1) ? apb_mst_if.pclk      : 0;
  assign pwdata_RO   = (romode === 1'b1) ? apb_mst_if.pclk      : 0;
`else
/////////////////////////////////////////////////////////////////////////////////////////
  assign pclk_WO     = (romode === 1'b0) ? apb_mst_if.pclk      : 0;
  assign psel_WO     = (romode === 1'b0) ? apb_mst_if.psel[0]   : 0;
  assign penable_WO  = (romode === 1'b0) ? apb_mst_if.pclk      : 0;
  assign paddr_WO    = (romode === 1'b0) ? apb_mst_if.pclk      : 0;
  assign pwrite_WO   = (romode === 1'b0) ? apb_mst_if.pclk      : 0;
  assign pwdata_WO   = (romode === 1'b0) ? apb_mst_if.pclk      : 0;
/////////////////////////////////////////////////////////////////////////////////////////
  assign pclk_RO     = (romode === 1'b1) ? apb_mst_if.pclk      : 0;
  assign psel_RO     = (romode === 1'b1) ? apb_mst_if.psel[1]   : 0;
  assign penable_RO  = (romode === 1'b1) ? apb_mst_if.pclk      : 0;
  assign paddr_RO    = (romode === 1'b1) ? apb_mst_if.pclk      : 0;
  assign pwrite_RO   = (romode === 1'b1) ? apb_mst_if.pclk      : 0;
  assign pwdata_RO   = (romode === 1'b1) ? apb_mst_if.pclk      : 0;
`endif
/////////////////////////////////////////////////////////////////////////////////////////

     如下圖所示的代碼,是在top interface的鏈接方案:

digrf_dfe_dsb_top dut_i(
////////////////////////////////////////////////////////////////////////////////////////
//APB RW Interface
  .pclk_wr    (apb_mst_if.pclk        ),        
  .psel_wr    (apb_mst_if.psel[0]     ),        
  .penbale_wr (apb_mst_if.penable     ),        
  .paddr_wr   (apb_mst_if.paddr       ),        
  .pwrite_wr  (apb_mst_if.pwrite      ),   
////////////////////////////////////////////////////////////////////////////////////////     
`ifdef APB_RD_PORT_TEST
  .pwdata_wr  ('h0                    ),    
`else
  .pwdata_wr  (apb_mst_if.pwdata      ),        
`endif
////////////////////////////////////////////////////////////////////////////////////////
  .pready_wr  (RW_pready              ),        
  .prdata_wr  (RW_pdata               ), 
////////////////////////////////////////////////////////////////////////////////////////
//APB RD Interface
  .pclk_rd    (pclk_RO                ),        
  .psel_rd    (psel_RO                ),        
  .penbale_rd (penable_RO             ),        
  .paddr_rd   (paddr_RO               ),        
  .pwrite_rd  (pwrite_RO              ),        
  .pwdata_rd  (pwdata_RO              ),    
  .pready_rd  (RO_pready              ),        
  .prdata_rd  (RO_prdata              )
       
)

 

 

你可能感兴趣的:(UVM)