2

当我尝试使用 STRUCTURAL 代码制作 5 位 2x1 MUX 时,我遇到了一个令人困惑的 Verilog 错误,但我似乎找不到任何关于我的代码为什么会显示错误的信息。错误是:

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

我知道它在谈论我的一个输入,但我不知道端口 1 中的哪个输入。但是根据其余代码的布局方式,我很确定所有 5 位宽的输入都匹配带 5 位线和 5 位输出。任何帮助,将不胜感激!

供参考的是我的 .v 和 tb.v

.v: {module mux_2x1_5bit(in1, in2, gate, out);

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

结核病:

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
4

1 回答 1

0

问题出在这里:

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];
于 2019-03-05T06:03:10.160 回答