Почему iverilog жалуется на эту ширину выражения / порта?

У меня появляется сбивающая с толку ошибка Verilog, когда я пытаюсь создать 5-битный мультиплексор 2x1 с использованием СТРУКТУРНОГО кода, и я не могу найти никакой информации о том, почему мой код будет отображаться неправильно. Ошибка:

error: Expression width 5 does not match width 1 of logic gate array port 1.

Я знаю, что речь идет об одном из моих входов, но я не знаю, какой из них находится в порту 1. Но, судя по тому, как выложен остальной код, я почти уверен, что все входы шириной 5 бит совпадают. с 5-битными проводами и с 5-битным выходом. Любая помощь будет оценена по достоинству!

Для справки вот мои .v и tb.v

.v: {модуль mux_2x1_5bit (вход1, вход2, вентиль, выход);

input [4:0] in1, in2;
input gate;
output [4:0] out;

wire [4:0] a, b;

and #4 and1(a, {5{gate}}, in1);
and #5 and2(b, {5{~gate}}, in2);
or #4 or1(out, a, b);

endmodule

tb.v:

module mux_2x1_5bitTEST();

wire [4:0] out;
reg [4:0] in1;
reg [4:0] in2;
reg gate;

mux_2x1_5bit DUT(in1, in2, gate, out);

initial
begin
    in1 = 5'b00000;
    in2 = 5'b00010;
    gate = 0;

    #20 in1 = 5'b00001;
    #20 gate = 1;
    #20 in2 = 5'b10101;
    #20 in1 = 5'b01101;
    #20 gate = 0;

end

always @(in1 or in2 or gate)
    #1 $display("| gate = %b | in1 = %b | in2 = %b | out = %b |",  gate,   in1,   in2,   out);

endmodule

person Barnabas Bullion    schedule 05.03.2019    source источник


Ответы (1)


Проблема здесь:

and #4 and1(a, {5{gate}}, in1);
and #5 and2(a, {5{~gate}}, in2);
or #4 or1(out, a, b);

Входы и выход ворот and имеют ширину только 1, но здесь ваши входы - 5. Чтобы исправить это, вы можете сделать это следующим образом:

assign a = {5{gate}} & in1;
assign b = {5{~gate}} & in2;
assign out = a | b;

или вы можете разделить свои входы на 1 ширину, если хотите использовать and следующим образом:

and and_a_1(a[0],gate,in2[0]);
and and_a_2(a[1],gate,in2[1]);
...
and and_a_i(a[i],gate,in2[i];
person thangpx1706    schedule 05.03.2019
comment
Я пишу в структуре для задания, поэтому придерживаюсь версии и. Придется ли мне сделать это как для a, так и для b? Итак, чтобы последовать вашему примеру and_a_i & and_b_i? - person Barnabas Bullion; 05.03.2019
comment
Ответ нашел сам. Да. Спасибо за вашу помощь! - person Barnabas Bullion; 05.03.2019
comment
Другой вариант - массив экземпляров. Пример: and #4 and1[4:0](a, {5{gate}}, in1); - person Greg; 05.03.2019