Variable Assignment

Used In

  • Process
  • Procedure
  • Function

Reference Manual

VHDL-93:
  • Section 8.4

Syntax

variable_name := expression;

Rules and Examples

Assignments may be made from signals to variables and vice-versa, providing the types match:

process (A, B, C, SEL)
    variable X : integer range 0 to 7;
begin
    if SEL = '1' then
        X := B;
    else
        X := C;
    end if;

    Z <= A + X;
end process;

A variable assignment takes effect immediately:

architecture EX1 of V is
    signal A, B, Y, Z : integer;
begin
    process (A, B)
        variable M, N : integer;
    begin
        M := A;
        N := B;
        Z <= M + N;
        M := 2 * A;
        Y <= M + N;
    end process;
end EX1;

An equivalent architecture with concurrent signal assignments:

architecture EX2 of V is
    signal A, B, Y, Z : integer;
begin
     Z <= A + B;
     Y <= 2*A + B;
end EX2;

A variable assignment may not be given a delay.

A variable in a process can act as a register if it is read before it has been written to, since it retains its value between successive process activations.

process (CLK)
    variable Q : std_ulogic;
begin
    if CLK'event and CLK='1' then
        PULSE <= D and not(Q);
        Q := D;
        -- PULSE and Q act as registers
    end if;
end process;

A variable assignment may have a label:

label: variable_name := expression;

Synthesis Issues

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

In a “clocked process”, each variable which has its value read before it has had an assignment to it will be synthesized as the output of a register.

In a “combinational process”, reading a variable before it has had an assignment may cause a latch to be synthesized.

Variables declared in a subprogram are synthesized as combinational logic.