0

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

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
4

2 回答 2

2

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

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

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

  1. 定义一个参数 NUM_OF_INSTANCES

  2. 将模块的所有端口(clk 和 rst 除外)定义为打包数组。IE

    输入 [1:NUM_OF_INSTANCES][7:0] 一个;

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

  4. 使用参数化接口并以通常的方式将其绑定到模块的端口。

希望这可以帮助。

于 2013-06-23T16:24:16.633 回答
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到您的测试台。

于 2013-06-22T20:13:49.057 回答