我正在使用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是事件驱动的模拟器。后置(除非时钟出现毛刺或复位)通常每个模拟周期执行一次。如果您正确地使用了非阻塞分配(看起来像您所做的那样),则每个由边沿触发的始终阻塞都将使用输入变量值的旧版本,这些值在时钟边沿之前存在。 这里是一个简化的示例:
always @(posedge clk)
r <= in;
always @(posedge clk)
out <= r;
在这种情况下,将发生以下情况:
r
稍后将在模拟滴答之后被分配in
的值,在评估了始终块之后(请参见nba调度区域)。r
尚未真正更改,因此计划将out
的值与边沿之前的值一起分配给r
。 如果r
在边之前为0,in
为1,则在模拟结束时r
将变为1,out
将变为0。
这模拟了硬件中实际触发器的行为。