Concurrent Signal Assignment

Used In

  • Architecture

Reference Manual

VHDL-93:
  • Section 9.5

Syntax

signal_name <= expression;
label: signal_name <= expression;
signal_name <= expression after delay;

Rules and Examples

A concurrent signal assignment assigns a new value to the target signal whenever any of the signals on the right hand side change:

architecture CONC of HA is
begin
    SUM   <= A xor B;
    CARRY <= A and B;
end CONC;

Concurrent assignments have an “equivalent process”. This is the equivalent process for the concurrent statements above.

architecture SEQ of HA is
begin
    process (A, B)
    begin
        SUM   <= A xor B;
        CARRY <= A and B;
    end process;
end SEQ;

A signal assignment may have a delay specified:

architecture DELAYS of X is
    constant PERIOD : time := 10 ns;
begin
    SUM   <= A xor B after 5 ns;
    CARRY <= A and B after 3 ns;
    CLK   <= not CLK after PERIOD/2;
end DELAYS;

The default delay model is inertial. This means that “pulses” shorter than the delay time are not propagated. The alternative is transport delay, which propagates all transitions:

architecture TRANS of BUFF is
    constant DELAY : time := 10 ns;
begin
    O_PIN <= transport I_PIN after DELAY;
end TRANS;

A delayed signal assignment with inertial delay may be explicitly preceded by the keyword inertial. It may also have a reject time specified. This is the minimum “pulse width” to be propagated, if different from the inertial delay:

OUTPUT <= reject 2 ns inertial not (INPUT) after 10 ns;

Multiple concurrent assignments to the same signal imply multiple drivers. A signal which is the target of multiple concurrent signal assignments must be of a resolved type, e.g. std_logic, std_logic_vector.

For guarded assignments, see blocks.

A concurrent signal assignment can be specified to run as a postponed process (see process).

Synthesis Issues

Concurrent signal assignments are generally synthesizable, providing they use types and operators acceptable to the synthesis tool.

A signal assigned with a concurrent statement will be inferred as combinational logic.

Guarded assignments are not usually supported, and delays are ignored.

See Also