我有一个设计要验证。该设计类似于网络路由器。它有许多FIFO输入接口和许多FIFO输出接口。因此,同一组接口将一遍又一遍地重复。 DUT示例:
module router(
input logic [0:NUM_IN] sop_i,
input logic [0:NUM_IN] eop_i,
input logic [0:NUM_IN][128:0] data_i,
output logic [0:NUM_OUT] sop_o,
output logic [0:NUM_OUT] eop_o,
output logic [0:NUM_OUT][128:0] data_o,
)
......
endmodule
所以我认为在我的测试平台中,驱动程序的数量也应该是可配置的,因为我想分别驱动每个FIFO接口。
interface fifo_intf;
logic sop;
logic eop;
logic [128:0] data
endinterface
所以第一个问题是如何将此接口连接到DUT。我正在寻找像
这样的东西module tb_top;
...
top_intf top_if();
router dut (.sop_i(top_if.connect_if.sop)
.eop_i(top_if.connect_if.eop),
.data_i(top_if.connect_if.data))
endmodule
interface connect_intf #(NUM);
logic [0:NUM-1] sop;
logic [0:NUM-1] eop;
logic [0:NUM-1][128:0] data;
endinterface
我还认为将顶层接口包装器传递给env可能更容易,因为FIFO接口的数量是参数化的。 所以,
interface top_intf:
fifo_intf fifo_if_input[`NUM_IN]();
fifo_intf fifo_if_output[`NUM_OUT]();
connect_intf #(`NUM_IN)connect_if();
endinterface
然后我需要做一些从connect接口到fifo接口的路由
genvar i;
generate
for (i = 0; i < NUM_IN; i++) begin
assign connect_if.sop[i] = fifo_if_i[i].sop;
endgenerate
但是当我将top_intf传递给testbench环境时会出现一些问题。
class env;
// local interfaces to avoid hierarchical reference??
virtual fifo_intf fifo_if_i[`NUM_IN];
virtual fifo_intf fifo_if_o[`NUM_OUT];
function env::new(virtual top_intf top_vif);
this.top_vif = top_vif;
fifo_if_i[0:`NUM_IN-1] = top_vif.fifo_if_input[0:`NUM_IN-1];
fifo_if_o[0:`NUM_OUT-1] = top_vif.fifo_if_output[0:`NUM_OUT-1];
endfunction: new
endclass;
这适用于NUM_In and
NUM_OUT大于1.但是当NUM为1时出现一些问题。错误是
Incompatible complex type assignment
Type of source expression is incompatible with type of target expression.
Mismatching types cannot be used in assignments, initializations and
instantiations. The type of the target is 'virtual interface
fifo_intf$[0:0]', while the type of the source is 'interface fifo_intf'.
Source Expression: this.top_vif.fifo_if_input[0]
我现在正在做的是设置一些定义以指示NUM_IN值是什么,例如
`ifdef PROJ_A
`define NUM_IN_IS_1
`elsif PROJ_B
`define NUM_IN_IS_2
`endif
然后
在另一个包含文件
中`ifdef NUM_IN_IS_1
fifo_if_i[0] = top_vif.fifo_if_input[0];
`elsif NUM_IN_IS_2
fifo_if_i[0] = top_vif.fifo_if_input[0];
fifo_if_i[1] = top_vif.fifo_if_input[1];
`endif
我认为我们可以使用一些脚本来生成测试平台代码,但我正在尝试寻找一种没有脚本的方法。我愿意接受建议。你如何在testbench中处理这种设计情况?
非常感谢!
答案 0 :(得分:0)
要避免数组到数组的分配,请在for
循环内滚动它们:
function env::new(virtual top_intf top_vif);
this.top_vif = top_vif;
foreach (fifo_if_i[i])
fifo_if_i[i] = top_vif.fifo_if_input[i];
foreach (fifo_if_o[i])
fifo_if_o[i] = top_vif.fifo_if_output[i];
endfunction: new