0

我正在使用 verilog 执行反馈多路复用器计算。但是,系统不会响应(给 X)输入之一,即 B(由多路复用器控制的输入)。可以帮助我指出错误在哪里以及如何解决它。

以下是代码:

module test(input sel,input [3:0]a,b,output [3:0]o);
localparam in_0 = 4'd0;
wire [3:0]w1;

assign w1 = a + b;
assign o = w1 | 4'd0;
assign b = (sel)?w1:in_0;

endmodule

这是测试台:

module test_tb();

reg sel;
reg [3:0] a,b;
wire [3:0]o;

test U1(.sel(sel),.a(a),.b(b),.o(o));

initial begin
sel <= 1'b0;
a <= 4'd2;
#2;
sel <= 1'b1;
#2;
a <= 4'd1;
#2;
sel <= 1'b0;
a <= 4'd4;
#2;
end
endmodule
4

2 回答 2

1

根据测试台(初始化),它似乎b不是input(它只是多路复用器的输出)

我想你想实现以下电路:

在此处输入图像描述

但是为了避免创建循环(当 sel=1 时),您应该clk在设计中添加一个端口以控制操作:

module test(
    input  clk,
    input  sel,
    input  [3:0] a,
    output [3:0] o
);

    wire [3:0] b;
    reg  [3:0] w1;

    assign o = w1;
    assign b = (sel)?w1:4'd0;

    always @(posedge clk)
        w1 <= a + b;

endmodule
于 2015-03-11T10:48:29.570 回答
0

看看你的例子:

module test(
  input sel,
  input [3:0] a,
  input [3:0] b,
  output [3:0]o
);
localparam in_0 = 4'd0;
wire [3:0]w1;

assign w1 = a + b;
assign o = w1 | 4'd0;
assign b = (sel)? w1 : in_0;

请注意,sel==1您有w1 = a+b,b =w1即 w1= a+w1; 作为一个组合循环。这行不通。如果内部有一个触发器来打破循环,那么它的行为就像一个累加器。

Aa 由Emman指出,b 是一个输入,因此该值不能被覆盖。

此行assign b = (sel)? w1 : in_0;无效。请注意,它从不实际使用输入值,因为这在所有情况下都会完全覆盖它。

于 2015-03-11T10:26:48.507 回答