sv中的参数化类队列

时间:2017-09-04 10:04:09

标签: system-verilog uvm

在我的测试平台中,有几个具有不同通道的pcie_agents。我从pcie VIP扩展了自己的课程。类似的东西:

class mt_pcie_agent#(int INST=0) extends pcie_agent((INTS==0)?2:(INTST==1)?4:(INST==2)?8:16);//different lanes by instance.
...
endcase

现在我想把它们放入我的环境中。

class mt_env extend uvm_env;
...
mt_pcie_agent rc_agent[$:8];
...
virtual function void build_phase(uvm_phase phase);
  super.build_phase(phase);
  ...
  for(int i=0; i<`NUM_RC; i++) begin //`NUM_RC = 1~8
    case (i)
      0: begin
           rc_agent.push_back(mt_pcie_agent#(0)::type_id::create($sformatf("rc%0d_agent",i), this);
         end
      1: begin
           rc_agent.push_back(mt_pcie_agent#(1)::type_id::create($sformatf("rc%0d_agent",i), this);
         end
      ...
   endcase
   ...
endfunction
...
endclass

VCS编译这些代码是可以的。但由于mt_pcie_agent#(0)mt_pcie_agent#(1)的类型不同,我想知道这些代码是否在运行时间中有一些副作用?

感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

大多数模拟器都会因类型不匹配而引发错误。如您所知,mt_pcie_agent#(1)不是同一类型或被视为mt_pcie_agent#(0)的扩展类。可能有一个模拟器只会发出警告,让你逃脱它,但这不是一个好习惯。

您可以将mt_pcie_agent rc_agent[$:8];更改为uvm_agent rc_agent[$:8];(或pcie_agent的某个中间非参数或公共参数值父类)。父句柄可以指向子对象,但它可以访问的范围是有限的。例如,您将无法在env的连接阶段将顺控程序直接连接到代理程序/驱动程序,因为uvm_agent句柄不知道该对象是否有连接的对象。

你可以通过config_db解决这个问题,你在::set设置将连接到env的build_phase中的rc_agent的音序器,然后在rc_agents connect_phase中设置::get

或者,有时将rc_agent风格添加到环境中更容易,只需要::create个所需的风格。这只是打字更多。如果您特别需要代理队列,您也可以保留它(指向同一对象的两个指针)。例如:

mt_pcie_agent#(0) rc0_agent;
mt_pcie_agent#(1) rc1_agent;
...
mt_pcie_agent#(7) rc7_agent;
uvm_agent rc_agent[$]; // for what ever reference
...
virtual function void build_phase(uvm_phase phase);
  super.build_phase(phase);
  ...
  for(int i=0; i<`NUM_RC; i++) begin //`NUM_RC = 1~8
    case (i)
      0: begin
           rc0_agent = mt_pcie_agent#(0)::type_id::create($sformatf("rc%0d_agent",i), this);
           rc_agent.push_back(rc0_agent);
         end
      1: begin
           rc1_agent = mt_pcie_agent#(1)::type_id::create($sformatf("rc%0d_agent",i), this);
           rc_agent.push_back(rc1_agent);
         end
      ...
   endcase
   ...
endfunction