以下verilog代码是否存在竞争条件问题?

问题描述 投票:0回答:1

我正在使用verilog模块(如下所示),它有两个总是块。因为一个块设置了一个寄存器,而另一个使用了该寄存器,所以不会出现某种竞争情况。这会导致什么问题?

谢谢,斯蒂芬

module XYZ
(                               
    input  wire         CLK,    
    input  wire         Reset,    
    input  wire         nReset,   
    input  wire [15:0]  X,      
    input  wire [15:0]  A,    
    input  wire         T,  
    input  wire         B,  
    output reg          M     
);

assign C = X > A;

reg P;  
reg N;

always @(posedge CLK, negedge nReset)
begin
    if (~nReset)
    begin
        P <= 1;
        N <= 1;
    end else begin
        if (Reset)
        begin
            P <= 1;
            N <= 1;
        end else begin
            P <= T?  1:  ((C & ~M)?  0:  P);
            N <= B?  1:  ((M & ~C)?  0:  N);
        end
    end
end

always @(posedge CLK, negedge nReset)
begin
    if (~nReset)
    begin
        M <= 0;
    end else begin
        if (Reset)
        begin
            M <= 0;
        end else begin
            M <= M?  ~(N & ~C):  (P & C);
         end
    end
end

endmodule

verilog race-condition
1个回答
0
投票

不,没有比赛条件。 Verilog是事件驱动的模拟器。后置(除非时钟出现毛刺或复位)通常每个模拟周期执行一次。如果您正确地使用了非阻塞分配(看起来像您所做的那样),则每个由边沿触发的始终阻塞都将使用输入变量值的旧版本,这些值在时钟边沿之前存在。 这里是一个简化的示例:

always @(posedge clk) r <= in; always @(posedge clk) out <= r;

在这种情况下,将发生以下情况:

  1. [r稍后将在模拟滴答之后被分配in的值,在评估了始终块之后(请参见nba调度区域)。

  2. 由于r尚未真正更改,因此计划将out的值与边沿之前的值一起分配给r
  3. 如果r在边之前为0,in为1,则在模拟结束时r将变为1,out将变为0。

这模拟了硬件中实际触发器的行为。

© www.soinside.com 2019 - 2024. All rights reserved.