多驱动网络,或 reg 未被驱动

multi-driven net, or reg not being driven

我正在完成一项任务,我需要创建一个累积奖金游戏。但是我在驱动控制获胜条件的寄存器时遇到了问题,我不知道为什么。据我所知,每当我将开关拨到向上位置时, always@(posedge zero) 块应该能够 运行 。然后,只要在同一时刻出现正确的热寄存器值,就应该能够设置 win 寄存器。然而,这种情况并非如此。似乎什么都没有发生,我不确定为什么。我已经尝试 运行 将 always 块设置为不同的敏感度,但似乎没有任何效果。也许我只是误解了块的工作方式或开关的工作方式,我们将不胜感激。

module jackpot(
    input [3:0] SWITCHES,
    output [3:0] LEDS,
    input CLOCK,
    input reset
    );
    
    reg [3:0] hot = 4'd1;
    reg win;
    wire clk, zero, one, two, three;
    Clock_Div CDD (CLOCK, clk);
    
    assign LEDS[2:0] = hot[2:0];
    assign zero = SWITCHES[0];
    assign one = SWITCHES[1];
    assign two = SWITCHES[2];
    assign three = SWITCHES[3];
    assign LEDS[3] = zero;
    
    initial begin
        win <= 1'b0;
    end
    
    always @(posedge zero) begin
        if(hot[0] && zero)
            win <= 1'd1;
    end
    
    always @(posedge clk) begin
        if (reset == 1'b1) begin
            hot <= 4'd1;
            win <= 1'd0;
        end
        else if(win == 1'b1) begin
            hot <= 4'b1111;
        end
        else begin
            if(hot == 4'b1000) begin
                hot <= 4'b0001;
            end
            else begin
                hot <= hot << 1;
            end
        end
    end
    
    
endmodule

多亏了 Serge 的评论,我才意识到这个问题。正如他的评论所说,从多个 always 块中驱动一个寄存器会引发严重警告,Vivado 会选择其中一个块来使用另一个块。一旦我确定将一个 reg 隔离为一个 always 块,行为开始看起来像我预期的那样。这一定是在 class 期间被掩盖的事情,或者我没有足够注意。