verilog总是,开始和结束评估

Fra*_*jay 5 verilog

我正在尝试使用Pong P. Chu的书来学习Verilog.我有一个关于如何评估和实现always块的问题.作者代码中的一种风格令我感到困惑.

在这个例子中,他用一个带有两个输出寄存器'y1'和'y2'的FSM编码.我困惑的部分是在NEXT STATE LOGIC和OUTPUT LOGIC总是阻塞,在begin语句之后,always@*y1和y0被设置为0.我似乎无论状态如何,y1和y0将在每个时钟切换为0循环和信号变化.根据书中的状态图,在状态0或1时,reg y1应该等于1.

那么y1在每个时钟周期切换到0然后回到它在当前状态下的值吗?我认为情况并非如此,我只是对如何评估块感到困惑.有人可以解释代码的这一部分正在做什么.我迷路了.谢谢

module fsm_eg_2_seg
    (
     input wire clk, reset, a, b,
     output reg y0, y1
    );

    //STATE DECLARATION
    localparam [1:0]    s0 =2'b00, 
                    s1=2'b01, 
                    s2=2'b10;

    // SIGNAL DECLARATION
    reg [1:0] state_reg, state_next ;

    //STATE REGISTER
    always @(posedge clk, posedge reset)
        if (reset)
            state_reg <= s0;
        else
            state_reg <= state_next;

    //NEXT STATE LOGIC AND OUTPUT LOGIC
    always @*
    begin
        state_next = state_reg; // default next state: the same
        y1 = 1'b0;              // default output:  0
        y0 = 1'b0;              // default output:  0
        case (state_reg)
            s0:  begin
                y1 = 1'b1;
                if (a)
                    if(b)
                        begin
                            state_next = s2;
                            y0 = 1'b1;
                        end
                    else
                        state_next = s1;
                end
            s1:  begin
                    y1 = 1'b1;
                    if (a) 
                        state_next = s0;
                    end
            s2: state_next = s0;
            default: state_next = s0;
        endcase
    end
endmodule
Run Code Online (Sandbox Code Playgroud)

Nat*_*ton 4

表达方式

always @* begin : name_of_my_combinational_logic_block
    // code
end
Run Code Online (Sandbox Code Playgroud)

描述组合逻辑。通常,clk 和 rst 信号不是从这种类型的always块内部读取的,因此它们不会像wisemonkey所说的那样出现在敏感度列表中。最佳实践是使用 @* 作为组合逻辑的敏感度列表,这样您就不会忘记包含一个信号,该信号会推断出一些内存并且不再是组合逻辑。

在组合逻辑块内,您应该使用所谓的阻塞赋值。这些看起来像大多数编程语言中的常规变量赋值并使用单个等于。您分配给组合逻辑块内部的变量 (reg) 的值会立即相对于同一组合逻辑块中的其他语句和表达式发生,但在到达末尾之前不会传播到该组合逻辑块之外。在块外部看到任何更改之前,always 块必须到达末尾。Paul S 是对的,每当执行always 块时,您总是希望为变量分配一些内容,否则您将推断内存。