在此示例中,如何创建可以为模块的两个端口重用的单个接口绑定语句:
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
答案 0 :(得分:2)
我相信您正在寻找的是可参数化的界面。
通常,使用`ifdef屏蔽端口是非常危险的,并且您必须有充分的理由这样做。已就此主题进行了讨论here。
我认为没有理由在你的情况下使用`ifdef。你可以:
将模块的所有端口(clk和rst除外)定义为压缩数组。即。
输入[1:NUM_OF_INSTANCES] [7:0] a;
在模块内使用“generate for”语句来实例化多个加法器
希望这有帮助。
答案 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_if0
和dut.adderSubtractor_if1
传递到您的测试平台。