【问题标题】:Why this output get out with one delay?为什么这个输出会延迟一下?
【发布时间】:2020-04-19 12:05:52
【问题描述】:

我用 2_to_1 MUX 制作了 4_to_1 MUX。我使用了always 语法。输出延迟一个时间单位,但我不知道为什么。 当我将 4_to_1 MUX 的模块 selalways 条件更改为 * 时,效果很好。为什么会这样?

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

【问题讨论】:

    标签: verilog delay mux


    【解决方案1】:

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

    always @(sel)
    

    由于在always 块中读取了另外两个信号w0w1,因此它们也必须在敏感度列表中。详细的方法是:

    always @(sel or w0 or w1)
    

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

    always @(*)
    

    这确保了always 块将在块中读取的任何信号发生任何更改时被触发。

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

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

    如果您不遵循这些建议,您会得到不理想的模拟结果。

    您也应该更改您的 MUX_2_to_1 模块。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-07
      • 2021-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多