我正在尝试创建一个接口,它是一个简单接口的数组。在VHDL中,我可以简单地定义两种类型,一个记录和一个记录数组。但是如何在SystemVerilog中做到这一点呢?以下是我尝试过的:
`define MAX_TC 15
...
interface scorecard_if;
score_if if_score [`MAX_TC];
endinterface
interface score_if;
integer tc;
integer pass;
integer fail;
bit flag_match;
real bandwidth;
endinterface但我从Aldec Active-HDL中得到了一个错误:
错误: VCP2571 TestBench/m3_test_load_tb_interfaces.sv:(53,34):实例化必须有方括号():if_score。
我也试过
interface scorecard_if;
score_if [`MAX_TC] if_score;
endinterface和
interface scorecard_if;
score_if [`MAX_TC];
endinterface但这两种方法都导致了“意想不到的令牌”语法错误。
有可能这样做吗?如果没有办法做到这一点,我可以想出两个解决办法。首先,我可以将score_if的所有单独元素定义为未打包的数组:
interface score_if;
integer tc [1:`MAX_TC];
integer pass [1:`MAX_TC];
integer fail [1:`MAX_TC];
bit flag_match [1:`MAX_TC];
real bandwidth [1:`MAX_TC];
endinterface这是编译,但它是丑陋的,因为我不能再把一个单一的分数作为一个组。
我还可能实例化一个score_if数组(使用原始代码),但我确实希望在generate循环中实例化scorecard_if,这将允许我根据参数实例化可变数量的scorecard_if接口。
为了解释一下我想做什么,score_if应该是给定测试用例得分的记录,scorecard_if是所有测试用例的数组。但我的测试平台有多个独立的刺激生成器、监视器和记分卡,用于处理DUT中的多个独立模块,其中多个模块是一个参数。
发布于 2015-01-25 08:12:09
这也有效: 1.定义一个“容器”接口:
interface environment_if (input serial_clk);
serial_if eng_if[`NUM_OF_ENGINES](serial_clk);
virtual serial_if eng_virtual_if[`NUM_OF_ENGINES];
endinterfacemodule testbench;
....
environment_if env_if(serial_clk);
.....
dut i_dut(...);
genvar eng_idx
generate
for(eng_idx=0; eng_idx<`NUM_OF_ENGINES; eng_idx++) begin
env_if.eng_if[eng_idx].serial_bit = assign i_dut.engine[eng_idx].serial_bit;
end
endgenerate
......
initial begin
env_if.eng_virtual_if = env_if.eng_if[0:`NUM_OF_ENGINES-1];
//now possible to iterate over eng_virtual_if[]
for(int eng_idx=0; eng_idx<`NUM_OF_ENGINES; eng_idx++)
uvm_config_db#(virtual serial_if)::set(null, "uvm_test_top.env", "tx_vif", env_if.env_virtual_if[eng_idx]);
end
endmodule https://stackoverflow.com/questions/28121432
复制相似问题