| 
   | 
  
   | 
  
   | 
  
   | 
  
The procedural assignments enable updating registers.
register_identifier = expression;
register_identifier <= expression;
The procedural assignments can be used only within the structured procedures (always, initial, task, function).
The left-hand side of assignment should be one of the following:
Register.
Bit-select of register.
Part-select of reg, integer, or time data type.
Memory word.
Concatenation of any of the above.
The Verilog HDL contains two types of procedural assignments statements: blocking (Example 1) and non-blocking (Example 2) procedural assignments.
If a current statement contains a blocking procedural assignment then the next statement will be executed after the execution of the current statement (in the next step of the simulation).
If a current statement contains a non-blocking procedural assignment then the next statement will be executed at the same time (in the same step of the simulation).
A block of statements with non-blocking procedural assignments has similar functionality as a group of statements within a fork-join block (Example 3).
Example 1
   begin
     a = 1;
     #10 a = 0;
     #5 a = 4;
   end
During the simulation, this block will be executed in 15 time units. At time 0 the 'a' variable will be 1, at time 10 the 'a' variable will be 0, and at time 15 (#10 + #5) the 'a' variable will be 4.
Example 2
   begin
     a <= 1;
     #10 a <= 0;
     #5 a <= 4;
   end
During the simulation this block will be executed in 10 time units. At time 0 the 'a' variable will be 1, at time 5 the 'a' variable will be 4, and at time 10 the 'a' variable will be 0.
Example 3
   fork
     a = 1;
     #10 a = 0;
     #5 a = 4;
   join
This fork-join block has the same functionality as the block with non-blocking assignments from example 2.
Statements that contain the non-blocking procedural assignments are executed in the same simulation cycle.
| 
   | 
  
   | 
  
   | 
  
   | 
  
| Powered by IXwebhosting |