A module may have any number of continuous assign statements. Continuous assign statements are used to drive values on to wires. For example:
assign a = b & c;
This is referred to as a continuous assign because the wire on the left-hand side of the assignment operator is continuously driven with the value of the expression on the right hand side. The target of the assign statement must be a wire. The continuous assign statement is not a procedural statement and so must be used at the module level; it cannot be placed in an initial or always process.
You can add delay to a continuous assign statement as follows:
assign #10 a = b & c;
In this case, the value of
a changes 10 units of time after the expression
b & c changes. Continuous assign statement implement inertial delay, meaning
that continuous assign statements swallow glitches. This is illustrated below
with the assumption that the unit of time is 1ns.
It is possible to specify up to three delay values on a continuous assignment:
assign #(10,15) a = b & c; assign #(10,15,25) x = y ^ z;
When you specify more than one:
The first delay refers to the transition to the 1 value (rise delay).
The second delay refers to the transition to the 0 value (fall delay).
The third delay refers to the transition to the high-impedance value.
When a value changes to the unknown (x) value, the delay is the smallest of the delays specified.
If only two delays are specified, then the delay to high-impedance is the smallest of the two values specified.