Blocking Assignment
The blocking assignment operator is denoted by an equal sign ("="). The blocking assignment evaluates the RHS arguments and complete its assignment without interrupt from any other Verilog statement.
Execution of blocking assignments can be seen as a one-step process:
- Evaluate the RHS and update the LHS of the blocking assignment without interruption from any other Verilog statement.
The problem occurs, when the RHS side of one assignment in one procedural block is same as the LHS side of another assignment in another procedural block and both the assignments are scheduled to be executed in the same simulation time step, then in this case there is no sure way to predict which assignment will occur first. This condition is known as Verilog race condition. The race condition is shown using the below example
module tp ( output reg o1,
output reg o2,
input clk,
input rst
);
always @(posedge clk or posedge rst)
if (rst)
o1 = 1;
else
o1 = o2; //------> I
always @(posedge clk or posedge rst)
if (rst)
o2 = 0;
else
o2 = o1; //-------> II
endmodule
In this case, when the design gets out of reset, we cannot predict whether statement I will be executed first or statement II. If statement I is executed first, then values of o1 = 0, o2 = 0 ; if statement II is executed first, then o1 = 1; o2 = 1, hence this is a Verilog race condition.
Nonblocking Assignment
The nonblocking assignment operator is denoted by "<=". A nonblocking assignment evaluates the RHS side of a nonblocking statement at the beginning of a time step and schedules the LHS update to take place at the end of the time step. Between evaluation of the RHS expression and update of the LHS expression, other Verilog statements can be evaluated and updated and the RHS expression of other Verilog nonblocking assignments can also be evaluated and LHS updates scheduled.
Execution of nonblocking assignments can be seen as a two-step process:
- Evaluate the RHS of nonblocking statements at the beginning of the time step.
- Update the LHS of nonblocking statements at the end of the time step.
module tp ( output reg o1,
output reg o2,
input clk,
input rst
);
always @(posedge clk or posedge rst)
if (rst)
o1 <= 1;
else
o1 <= o2; //------> I
always @(posedge clk or posedge rst)
if (rst)
o2 <= 0;
else
o2 <= o1; //-------> II
endmodule
In this case, when reset is applied, o1 = '1' and o2 = '0', when the reset is de-asserted, the RHS side of both the statements are updated at the start of time step, but the assignment takes place only at the end of the time step, hence there is no race condition. At the end of time step , o1 = '0' and o2 = '1'.
No comments:
Post a Comment