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