У меня есть фундаментальная проблема с пониманием System Verilog. Я работаю над дизайном процессора, в котором некоторые системы шин должны быть разделены между несколькими процессорами (модули System Verilog). С арбитром одновременно должен быть активен только один модуль, управляющий шиной, в то время как все остальные являются высокоимпедансными.
Я избавился от предупреждений о многоуправляемых сетях в Vivado во время синтеза, и больше нет конфликтов шин, но симулятор выдает предупреждение, что сигналы шины «могут» быть многоуправляемыми. Я сделал крошечный пример кода, и я ожидал получить для «данных» «11», когда «выбрать» равно «10»?
В то время как в Vivado симуляция вообще останавливается, она работает с симулятором Cadence, но с неправильными результатами - моделирование снимка экрана< /а>
testbench.sv
`timescale 1ns / 1ps
module testbench_top();
logic [1:0] select;
logic [1:0] data;
top top_inst(.*);
initial
begin
select = 0;
#2 select = 1;
#2 select = 2;
#2 select = 0;;
end
initial
begin
$monitor("t=%3d s=%b,d=%b\n",$time,select,data);
end
endmodule
дизайн.sv
`timescale 1ns / 1ps
module top
(
input logic [1:0] select,
output logic [1:0] data
);
driver_1 driver_1_inst(.*);
driver_2 driver_2_inst(.*);
endmodule
module driver_1
(
input logic [1:0] select,
output logic [1:0] data
);
always_comb
begin
if (select == 2'b10)
data = 2'b11;
else
data = 'z;
end
endmodule
module driver_2
(
input logic [1:0] select,
output logic [1:0] data
);
always_comb
begin
if (select == 2'b01)
data = 2'b01;
else
data = 'z;
end
endmodule