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

Interface 如何在不复制代码的情况下将接口绑定到多个端口?,interface,system-verilog,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

在本例中,我如何创建一个可以对模块的两个端口重用的接口绑定语句:

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
您可以使用宏:

`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_if0
dut.adderSubtractor_if1
传递到您的测试台。

我相信您正在寻找的是参数化接口

一般来说,使用“ifdef”屏蔽端口是非常危险的,您必须有很好的理由这样做。关于这个话题已经有过讨论

我看不出有任何理由在你的情况下使用'ifdef'。你可以:

  • 定义参数NUM_OF_实例

  • 将模块的所有端口(clk和rst除外)定义为压缩阵列。i、 e

    输入[1:NUM\u OF_INSTANCES][7:0]a

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

  • 使用可参数化接口,并以常规方式将其绑定到模块的端口


  • 希望这能有所帮助。

    我不明白你想做什么。您定义了一个接口,但根本不使用它。您是在询问接口的使用情况,还是如何将可变数量的接口实例化到您的模块中?我在上面的示例中添加了额外的行,以说明如何连接接口。在我的示例中,adderSubtractor2模块端口和模块内的所有代码都是固定的——代码来自另一个团队,他们不会更改它。从验证的角度来看,我的选择是什么?射杀编写代码的设计师。如果是这种情况,我建议您为每个子模块添加单独的绑定(当然在“ifdef”下)。您编写的带有宏的代码(即使它可以工作)看起来很奇怪,将来查看您的代码的人将会受到影响。无论如何,您都会受到影响-您必须在代码中的每个位置添加这些ifdef。这是一个非常糟糕的设计,如果不能更改,验证代码也会很差。我想不出其他几个涉及将定义转换为参数的选项,但它们也很难看,可能不起作用。顺便说一句,你介意我在这个页面上添加一个链接来讨论“ifdefs vs generates”吗?我认为这个例子显示了对ifdefs.Sure,addon:)的滥用。谢谢你的评论。