group-telegram.com/enginegger/4
Create:
Last Update:
Last Update:
Продолжаю тыкать палкой интерфейсы совместно с опенсорсными тулами. На этот раз речь пойдет про массивы интерфейсов, в частности их применимость в портах модулей.
Следующий код компилируется в Verilator, Tabby CAD (Yosys+Verific) и в Vivado. Yosys с открытым плагином от Antmicro ругается на массив интерфейсов в описании портов модуля (Encountered unhandled type in process_port: interface_array).
interface iface;Одиночный интерфейс, не в виде массива, открытым плагином поддерживается и успешно синтезируется.
logic a;
modport in(input a);
endinterface
module test_mod (iface.in x[2], output logic y);
assign y = x[0].a | x[1].a;
endmodule
module top (input logic [1:0] x, output logic y);
iface i[2]();
test_mod DUT (i, y);
assign i[0].a = x[0];
assign i[1].a = x[1];
endmodule
Порадовала утилита sv2v, которая преобразовала этот код в код на чистом верилоге, который успешно синтезировался Yosys без плагинов.
module top (x, y);Можно заметить, что утилита сохранила иерархию интерфейсов. Т.е., например, констрейны не сломаются, т.к. пути к сигналам сохранятся. Можно безболезненно симулировать код в Icarus, не опасаясь поломки иерархии.
input wire [1:0] x;
output wire y;
genvar _arr_DA352;
generate
for (_arr_DA352 = 0; _arr_DA352 <= 1; _arr_DA352 = _arr_DA352 + 1) begin : i
wire a;
end
endgenerate
localparam _bbase_D0DCC_x = 0;
generate
if (1) begin : DUT
localparam _mbase_x = 0;
wire y;
assign y = top.i[0].a | top.i[1].a;
end
endgenerate
assign y = DUT.y;
assign i[0].a = x[0];
assign i[1].a = x[1];
endmodule
BY Arnold Enginegger

Share with your friend now:
group-telegram.com/enginegger/4