谈一谈UVM中的p_sequencer

2022-02-23  本文已影响0人  li_li_li_1202

先从SystemVerilog的语法说起

我们先来看一个简单的例子:

bird是一个基类

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

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

parr是一个bird的扩展类

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

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("A.test = %d",A.test);
     end
endprogram
仿真结果

原因分析:

综上:所以会报错!

解决方案:A句柄指向的是B扩展类,C是扩展类的句柄,如果指向B扩展类对象是可以的。**用cast做类型转换,cast(C,A)**,这样的话就可以通过C的句柄访问扩展类的中独有的变量。参考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
仿真结果

m_sequencer与p_sequencer

uvm_sequencer_base m_sequencer;是uvm_sequence中的protected变量。

宏定义:`uvm_declare_p_sequencer(my_sequencer)

如果你没有访问my_sequencer中相对于uvm_sequencer_base中独有的变量话,你是没有必要声明uvm_declare_p_sequencer这个宏定义的。

上一篇 下一篇

猜你喜欢

热点阅读