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 を除く) をパック配列として定義します。すなわち

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

  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_if0渡します。dut.adderSubtractor_if1

于 2013-06-22T20:13:49.057 に答える