在 verilog 中对多路复用器的反馈
feedback on mux in verilog
我正在使用 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
看看你的例子:
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;
无效。请注意,它从未实际使用输入值,因为这在所有情况下都会完全覆盖它。
根据测试台(初始化),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
我正在使用 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
看看你的例子:
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;
无效。请注意,它从未实际使用输入值,因为这在所有情况下都会完全覆盖它。
根据测试台(初始化),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