Так что я пытаюсь написать простой 2-1 мукс в Verilog с помощью логических ворот, и я не уверен, что я делаю неправильно. Код для мультиплексоров заключается в следующем:Структурный 2-1 мук не работает во время разработки
module MUX_2_1 (i0 ,i1, sel ,o);
input [31:0] i0, i1;
input sel;
output [31:0] o;
wire [31:0] a, b;
and #(8) and1(a, {32{sel}}, i0);
and #(8) and2(b, {32{~sel}}, i1);
or #(8) or1(o, a, b);
endmodule
модуль компилируется нормально, но когда я развиваю свой испытательный стенд я получаю несколько ошибок (по одному для каждого строба), которые принимают форму
ворота (and1) имеет незаконную спецификацию вывода.
Я понимаю, как написать один и тот же мультиплексор, используя поток данных, но мне любопытно, в чем проблема. Я не могу найти что-либо в Интернете, что предполагает, что приведенный выше код не должен работать.
Для справки, вот мой тестовый код скамейки:
module test_bench;
reg [31:0] I0, I1, I2, I3, I4, I5, I6, I7;
reg [2:0] SEL;
wire [31:0] O8;
//MUX_8_1 mux(I0, I1, I2, I3, I4, I5, I6, I7, SEL, O8);
MUX_2_1 mux(I0, I1, SEL[0], O8);
initial
begin
I0 = 1;
I1 = 2;
I2 = 4;
I3 = 8;
I4 = 16;
I5 = 32;
I6 = 64;
I7 = 128;
SEL = 3'b000;
#50 $display("SEL = %u, O8 = %u\n", SEL, O8);
SEL = 3'b001;
#50 $display("SEL = %u, O8 = %u\n", SEL, O8);
SEL = 3'b010;
#50 $display("SEL = %u, O8 = %u\n", SEL, O8);
SEL = 3'b011;
#50 $display("SEL = %u, O8 = %u\n", SEL, O8);
SEL = 3'b111;
#50 $display("SEL = %u, O8 = %u\n", SEL, O8);
SEL = 3'b110;
#50 $display("SEL = %u, O8 = %u\n", SEL, O8);
SEL = 3'b100;
#50 $display("SEL = %u, O8 = %u\n", SEL, O8);
SEL = 3'b101;
#50 $display("SEL = %u, O8 = %u\n", SEL, O8);
end
endmodule
'and # 8 and1 [31: 0] ...' – toolic
Ну, это кажется очевидным в ретроспективе. Последующий вопрос, есть ли хорошая ссылка Verilog, которую я мог бы найти для ответа? –
Чтобы ответить на этот вопрос, я взглянул на источник, бесплатный IEEE Std 1800-2012, раздел 28. Моделирование уровня ворот и коммутатора. – toolic