标准中没有任何内容可以阻止在接口内使用生成块。因此,以下应该起作用:
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 的未实现功能到接口中。
Synthesis 可能对此有自己的想法。因此,最好的方法是使用单独的定义。
这也取决于你如何使用它们,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