В стандарте нет ничего, что препятствовало бы использованию блоков генерации внутри интерфейсов. Итак, должно работать следующее:
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 детской площадке, отказывается компилировать его, жалуясь на невыполненную функцию 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