gpt4 book ai didi

system-verilog - 实例数组的非常量索引

转载 作者:行者123 更新时间:2023-12-04 06:45:15 28 4
gpt4 key购买 nike

SystemVerilog 新手,我有一组 2 个 APB 接口(interface):apb_if m_apb_if[0:1]用于与 TB 中的线束接口(interface)。最初,我写了这样的任务:

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 if 上的相同内容)。我想 reduce task 代码长度。我试过了:
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

尝试调用 .write 时,将 int 作为输入传递给任务会产生相同的错误:
input int dut_name;

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

最佳答案

模块和接口(interface)数组的索引需要是一个常量。变通的是一个虚拟接口(interface),它可以有一个动态索引并指向一个真实的接口(interface)。

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

您的虚拟接口(interface)也可以是一个关联数组,索引是 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

关于system-verilog - 实例数组的非常量索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36339368/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com