談一談UVM中的p_sequencer

先從SystemVerilog的語法說起

我們先來看一個(gè)簡單的例子:

bird是一個(gè)基類

class bird;
bit [3:0] src =0;
bit [3:0] drc = 1;

virtual task exec_task();
     $display("in bird");
endtask
endclass

parr是一個(gè)bird的擴(kuò)展類

class parr extends bird;
bit [3:0] test =2;
virtual task exec_task();
  $display("in parr");
endtask
endclass

top層調(diào)用

program ex6_14_tb;
bird A;
parr B;
parr C;
 initial 
      begin
              A = new();
              B = new();
              C = new();
              A = B;
              //$cast(C,A);
              A.exec_task(); 
              $display("A.src = %d,A.drc = %d",A.src,A.drc);
              $display("A.test = %d",A.test);
     end
endprogram
仿真結(jié)果

原因分析:

  • A是bird的基類句柄,A=B,A基類的句柄指向B擴(kuò)展類。
  • A.exec_task因?yàn)橛衯irtual修飾,所以是調(diào)用A句柄指向的B的對象,也就是B的exec_task的定義。
  • A雖然是指向的B的對象,但是A句柄的類型是bird,并沒有test的變量。

綜上:所以會報(bào)錯(cuò)!

解決方案:A句柄指向的是B擴(kuò)展類,C是擴(kuò)展類的句柄,如果指向B擴(kuò)展類對象是可以的。**用cast做類型轉(zhuǎn)換,cast(C,A)**,這樣的話就可以通過C的句柄訪問擴(kuò)展類的中獨(dú)有的變量。參考cast的用法:https://www.cnblogs.com/xuqing125/p/14759124.html

修改top層代碼:

program ex6_14_tb;
bird A;
parr B;
parr C;
 initial 
      begin
              A = new();
              B = new();
              C = new();
              A = B;
              $cast(C,A);
              A.exec_task(); 
              $display("A.src = %d,A.drc = %d",A.src,A.drc);
              $display("C.test = %d",C.test);
     end
endprogram
仿真結(jié)果

m_sequencer與p_sequencer

uvm_sequencer_base m_sequencer;是uvm_sequence中的protected變量。

  • my_sequencer是從uvm_sequencer中擴(kuò)展來的,并擁有獨(dú)特的dmac/smac的變量。
  • m_sequencer是uvm_sequencer_base類型的句柄,實(shí)際指向的對象是my_sequencer。
  • 所以如果想通過基類的句柄m_sequencer來訪問擴(kuò)展類在中獨(dú)有的damc/smac的變量是不合法的,解決方案就是按照上面的來。
  • p_sequencer和m_sequencer實(shí)際上都是指向my_sequencer的對象!

宏定義:`uvm_declare_p_sequencer(my_sequencer)

  • 宏定義其實(shí)就是將上面的操作打了一個(gè)報(bào),封裝了一下。
  • m_set_p_seqeuncer():是set_item_context(parent_seq, sqr);的callback函數(shù),(如果沒有定義的話,默認(rèn)為空)也就是說這個(gè)uvm_declare_p_sequencer宏只能在uvm_sequence的擴(kuò)展類中定義。

如果你沒有訪問my_sequencer中相對于uvm_sequencer_base中獨(dú)有的變量話,你是沒有必要聲明uvm_declare_p_sequencer這個(gè)宏定義的。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容