SystemVerilog新手在这里,我有一个2个APB接口阵列:apb_if m_apb_if[0:1]
用于连接TB中的线束。最初,我写了这样的任务:
task foo;
input string DUT_name;
if (DUT_name == "DUT1")
##1 m_apb_if[0].write...
else if (DUT_name == "DUT2")
##1 m_apb_if[1].write...
上面的代码可以工作,但是50%的代码是多余的(如果是20,那就相同)。我想减少任务代码长度。我试过了:
task foo;
input string DUT_name;
int dut_number;
dut_number = set_name_number(DUT_name);//function returning int
##1 m_apb_if[dut_number].write... //this line fails
将int作为输入传递给task时,在尝试调用.write时会出现同样的错误:
input int dut_name;
数组的索引是否必须是常量,因为它必须在模拟开始时知道?我怎样才能实现目标?
答案 0 :(得分:4)
模块和接口数组的索引需要是常量。解决方法是虚拟接口,它可以具有动态索引并指向真实接口。
apb_if m_apb_if[0:1]();
virtual apb_if m_apb_vif[0:1];
initial begin : map_physical2virtual
m_apb_vif[0] = m_apb_if[0]; // Note: for-loop does not work here
m_apb_vif[1] = m_apb_if[1]; // Index to phy-if must a constant
end : map_physical2virtual
...
task foo ( input string DUT_name);
int dut_number;
dut_number = set_name_number(DUT_name);//function returning int
##1 m_apb_vif[dut_number].write... // should work
endtask : foo
您的虚拟界面也可以是一个关联数组,其索引是dut的名称
apb_if m_apb_if[0:1]();
virtual apb_if m_apb_vif[string];
initial begin : map_physical2virtual
m_apb_vif["DUT1"] = m_apb_if[0]; // Note: for-loop does not work here
m_apb_vif["DUT2"] = m_apb_if[1]; // Index to phy-if must a constant
end : map_physical2virtual
...
task foo ( input string DUT_name);
if(!m_apb_vif.exists(DUT_name) begin
// throw error or something
end
else begin
##1 m_apb_vif[dut_number].write... // should work
end
endtask : foo