首页 > 解决方案 > 为什么这个输出会延迟一下?

问题描述

我用 2_to_1 MUX 制作了 4_to_1 MUX。我使用always了语法。输出延迟一个时间单位,但我不知道为什么。当我将always4_to_1 MUX 模块的条件更改sel为 时*,它运行良好。为什么这行得通?

module MUX_2_to_1 (
            a0,a1,sel,out);
input [3:0]a0;
input [3:0]a1;
input sel;
output reg [3:0]out;

always @(sel)
begin

    if (sel == 0)
        out <= a0;
    else if (sel == 1)
        out <= a1;
end
endmodule

*

    module MUX_4_to_1(
        x0,x1,x2,x3,sel,out);

input [3:0]x0;
input [3:0]x1;
input [3:0]x2;
input [3:0]x3;

input [1:0]sel;

output reg [3:0]out;

wire [3:0]w0;
wire [3:0]w1;


MUX_2_to_1 m0 (x0,x1,sel[0],w0);
MUX_2_to_1 m1 (x2,x3,sel[0],w1);

always @(sel)
begin
    if(sel[1] == 0)
        out <= w0;

    else if (sel[1] == 1)   
        out <= w1;

end



endmodule

*

`timescale 100ps/1ps

module Testbench_Mux;

reg [3:0]x0;
reg [3:0]x1;
reg [3:0]x2;
reg [3:0]x3;
reg [1:0]sel;

wire [3:0]out;

MUX_4_to_1 m0 (x0,x1,x2,x3,sel,out);


initial
begin


    x0 = 4'b0001; x1 = 4'b0010; x2 = 4'b0100; x3 = 4'b1000;
    #0  sel = 2'b00;
    #5  sel = 2'b01;
    #5  sel = 2'b10;
    #5  sel = 2'b11;
    #5 $stop;
end

endmodule

在此处输入图像描述

标签: verilogdelaymux

解决方案


您没有将推荐的 Verilog 编码实践用于组合逻辑。一个问题是您使用了不完整的敏感度列表:

always @(sel)

由于在块中读取了2 个其他信号w0和,因此它们也必须在敏感度列表中。执行此操作的详细方法是:w1always

always @(sel or w0 or w1)

执行此操作的首选方法是使用紧凑*语法:

always @(*)

这确保了在always块中读取的任何信号发生任何变化时都会触发该块。

另一个问题是您应该始终对组合逻辑使用阻塞赋值。关于原因,有足够的文档。更改<==

always @(*)
begin
    if(sel[1] == 0)
        out = w0;
    else if (sel[1] == 1)   
        out = w1;
end

如果您不遵循这些建议,您将获得不希望的模拟结果。

你也应该改变你的MUX_2_to_1模块。


推荐阅读