Systemverilog Testbench如何处理可配置数量的接口

时间:2016-12-29 19:30:39

标签: 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 [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中处理这种设计情况?

非常感谢!

1 个答案:

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