System verilog Systemverilog测试台如何处理可配置数量的接口

System verilog Systemverilog测试台如何处理可配置数量的接口,system-verilog,test-bench,object-test-bench,System Verilog,Test Bench,Object Test Bench,我有一个设计要验证。该设计类似于网络路由器。它有多个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

我有一个设计要验证。该设计类似于网络路由器。它有多个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接口的数量是参数化的。 所以

然后我需要做一些从连接接口到fifo接口的路由

   genvar i;
    generate
        for (i = 0; i < NUM_IN; i++) begin
            assign connect_if.sop[i]   = fifo_if_i[i].sop;
    endgenerate
NUM\u In和
NUM\u 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_是什么,例如

`ifdef PROJ_A
    `define NUM_IN_IS_1
`elsif PROJ_B
    `define NUM_IN_IS_2
`endif
然后

在另一个include文件中

`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 
我认为我们可以使用一些脚本来生成测试台代码,但我正在尝试寻找一种不使用脚本的方法。我愿意听取建议。您如何在测试台上处理这种设计情况


非常感谢

若要避免数组到数组的分配,请在
中对循环进行上卷:

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

谢谢你的回答,但我认为这行不通。我以前试过。据报道“如果在接口top intf中输入,则找不到成员fifo。我认为你不能索引接口数组。@Shuo这是合法的语法。您应该向您的工具供应商提出一个案例。我认为@dave_59的答案解释了为什么您不能使用变量来索引接口数组:我认为如果这种用法很普遍,VCS应该已经支持它了。@Shao但答案没有说这是不允许的。它说明了为什么OP显示的代码是允许的。
`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 
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