Почему этот выход вылезает с одной задержкой? - PullRequest
0 голосов
/ 19 апреля 2020

Я сделал 4_to_1 MUX с 2_to_1 MUX. Я использовал always синтаксис. Вывод задерживается на единицу времени, но я не знаю почему. Когда я меняю условие always модуля 4_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

enter image description here

1 Ответ

1 голос
/ 19 апреля 2020

Вы не используете рекомендуемые методы кодирования Verilog для комбинационных логик c. Одна из проблем заключается в том, что вы использовали неполный список чувствительности:

always @(sel)

Поскольку есть 2 других сигнала, w0 и w1, которые считываются в блоке always, они также должны быть в список чувствительности. Подробный способ сделать это:

always @(sel or w0 or w1)

Предпочтительный способ сделать это - использовать компактный синтаксис *:

always @(*)

Это гарантирует, что блок always будет сработать, когда произойдет какое-либо изменение в любом сигнале, считанном в блоке.

Другая проблема заключается в том, что вы всегда должны использовать блокирующие назначения для комбинационной логики c. Существует достаточно документации о причине. Измените <= на =:

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

Если вы не будете следовать этим рекомендациям, вы получите нежелательные результаты моделирования.

Вам также следует изменить модуль MUX_2_to_1.

...