在我的测试平台中,有几个具有不同通道的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)
的类型不同,我想知道这些代码是否在运行时间中有一些副作用?
感谢任何帮助。
答案 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