>我有一个完整的AXI接口和一个精简的AXI接口,如下所示:
interface axi_full ();
logic [63:0] wdata;
logic . wid;
logic wcredit;
endinterface
interface axi_lite();
logic [63:0] wdata;
logic wcredit;
endinterface
有没有办法我可以只使用一个带有参数 lite 的接口,如下所示,而不是两个单独的接口?唯一的区别是在AXI lite的情况下没有wid。
interface axi #(bit Lite = 1'b0) ();
...
...
endinterface
不幸的是不是。您应该能够使用axi_full
,而不使用wid
信号。
标准中没有任何内容会阻止在接口中使用生成块。因此,以下内容应该有效:
interface axi #(FULL=1)();
logic [63:0] wdata;
logic wid;
if (FULL != 0) begin: fff
logic wcredit;
end
endinterface
module top;
axi#(1) full();
axi#(0) lite();
imod fm(full);
//imod lm(lite);
endmodule
module imod(axi i);
initial begin
$display(i.wdata, i.wid, i.fff.wcredit);
end
endmodule
问题始终在于供应商实施。以上似乎在节奏的nc
中效果很好。取消注释"lite"字符串将导致它生成错误。
然而,synopsys vcs,至少是 eda playground 中的那个拒绝编译它,抱怨 xmrs 未实现的功能到接口中。
综合可能对此有自己的想法。因此,最好的方法是使用单独的定义。
这也取决于您如何使用它们,modports
可以很方便。它们实现得更好,以下示例应该在任何地方都有效:
interface axi_if;
logic [63:0] wdata;
logic wid;
logic wcredit;
modport full (input wdata, wid, wcredit);
modport lite(input wdata, wid);
endinterface
module top;
axi_if intf();
fmod fm(intf);
lmod lm(intf);
endmodule
module fmod(axi_if.full i);
initial begin
$display(i.wdata, i.wid, i.wcredit);
end
endmodule
module lmod(axi_if.lite i);
initial begin
$display(i.wdata, i.wid); //, i.wcredit);
end
endmodule
你说的是不可能的,但你可以把 wid 信号放在 ifdef 编译指令中,如下所示
interface axi();
logic [63:0] wdata;
`ifdef AXI_FULL
logic wid;
`endif
logic wcredit;
endinterface
定义不使用 AXI-Lite 时的AXI_FULL 连接 AXI 接口时也要考虑到这一点