Continuous Assigns

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.

../../_images/inertial-delay.png

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.