如何在不重复代码的情况下将接口绑定到多个端口?

时间:2013-06-22 20:13:49

标签: interface system-verilog

在此示例中,如何创建可以为模块的两个端口重用的单个接口绑定语句:

module adderSubtractor2(
  input            clk,
  input [7:0]      a0,
  input [7:0]      b0,
  input            doAdd0, // if this is 1, add; else subtract
  output reg [8:0] result0
`ifdef HAS_UNIT_2
  ,
  input [7:0]      a1,
  input [7:0]      b1,
  input            doAdd1, // if this is 1, add; else subtract
  output reg [8:0] result1  
`endif
);
  // ...
endmodule

interface adderSubtractor_if(
  input bit clk,
  input [7:0] a,
  input [7:0] b,
  input       doAdd,
  input [8:0] result
);
  // ...
endinterface: adderSubtractor_if

// BIND STATEMENT(S) HERE

// The test that will be run on the DUT
program automatic test(adderSubtractor_if addSub);
  initial begin
    // do stuff with interface
  end
endprogram // test

// The top level testbench.
module testbench;
  reg clk;
  adderSubtractor2 dut(.clk (clk));
  test test0(dut.adderSubtractor_if0);
`ifdef HAS_UNIT_2
  test test1(dut.adderSubtractor_if1);
`endif

  // ...
endmodule // testbench

2 个答案:

答案 0 :(得分:2)

我相信您正在寻找的是可参数化的界面。

通常,使用`ifdef屏蔽端口是非常危险的,并且您必须有充分的理由这样做。已就此主题进行了讨论here

我认为没有理由在你的情况下使用`ifdef。你可以:

  1. 定义参数NUM_OF_INSTANCES
  2. 将模块的所有端口(clk和rst除外)定义为压缩数组。即。

    输入[1:NUM_OF_INSTANCES] [7:0] a;

  3. 在模块内使用“generate for”语句来实例化多个加法器

  4. 使用可参数化的界面并以通常的方式将其绑定到模块的端口。
  5. 希望这有帮助。

答案 1 :(得分:0)

您可以使用宏:

`define BIND_ADD_SUB(INDEX) \
bind adderSubtractor2 adderSubtractor_if adderSubtractor_if``INDEX``( \
  .clk(clk), \
  .a(a``INDEX``), \
  .b(b``INDEX``), \
  .doAdd(doAdd``INDEX``), \
  .result(result``INDEX``) \
); \

`BIND_ADD_SUB(0)
`ifdef HAS_UNIT_2
`BIND_ADD_SUB(1)
`endif

然后将dut.adderSubtractor_if0dut.adderSubtractor_if1传递到您的测试平台。