非常量索引到实例数组中

时间:2016-03-31 16:55:07

标签: system-verilog

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;

数组的索引是否必须是常量,因为它必须在模拟开始时知道?我怎样才能实现目标?

1 个答案:

答案 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