Variable Declaration
  
    
    
     
   
   Formal Definition
  
   Variable
   is an object with a single current value. 
  
   Simplified Syntax
  
   variable variable_name : type; 
  
   variable variable_name : 
   type := initial_value; 
  
   Description
  
   Variables are objects which 
   store information local to processes and subprograms (procedures and 
   functions) in which they are defined. Their values can be changed 
   during simulation through the variable
    assignment statements. 
  
   A variable declaration 
   includes one or more identifiers, a subtype indication and an 
   optional globally static expression defining the initial value for 
   the variable(s). The 
   identifiers specify names for the variables,
    with one identifier per each variable.
    The variable can be 
   declared to be of any type or subtype available, either constrained 
   or unconstrained (Example 1). 
  
   The initial value of a variable 
   can be assigned by a globally static expression. The expression must 
   reference a value of the same type as the variable 
   itself. If the variable is 
   declared to be of a composite 
   type other than a string, Bit_Vector or Std_Logic_Vector, then an aggregate 
   must be used (see Example 2). 
  
   If the initial value of a variable 
   is not specified, then it is implicitly set as the left bound of the 
   type used. For example for a scalar 
   named T, the default 
   initial value will be T'LEFT.
    For a composite type, the 
   initial value will be the aggregate 
   consisting of the set of the default values of all the scalar 
   elements. The default initial value for a variable of the access 
   type is null. 
  
   Variables declared in 
   processes are initialized with their default values, given either 
   explicitly or implicitly, at the start of the simulation. Variables
    declared in subprograms are initialized each time the 
   subprogram is called. 
  
   The scope of variables is 
   limited to the process or subprogram they are defined in. The only 
   exception to this rule is a shared variable,
    which may be shared by multiple processes. 
  
   Variables 
   can be also declared outside of a procedure or process to be shared 
   between many processes. Shared variables may be declared within an 
   architecture, block, generate statement or package. Declaration of a 
   shared variable 
   must be preceded by the shared 
   keyword (Example 3). 
  
   Although the Language Reference Manual allows several processes to 
   access a single shared variable it does not define what happens when 
   two or more conflicting processes try to access the same variable at 
   the same time. Such a situation may lead to unpredictable results and 
   therefore should be avoided. 
  
   Examples
  
   Example 1 
  
   type Mem is array 
   (Natural range <>, 
   Natural range <>) of Std_Logic; 
   variable Delay1, Delay2 : Time; 
   variable RAM1: Mem (0 to 
   1023, 0 to 8); 
  
     
   The type Mem is specified as an unconstrained memory (the limit 
   depends on the implementation of the Natural subtype). The variable 
   RAM1, specified in the third line, is based on the Mem type and is 
   defined as a subtype constrained to a 1 KB memory. 
  
   Both Delay1 and Delay2 variables are of the Time type and are 
   declared in the second line. 
  
   Example 2 
  
   type Mem is array 
   (Natural range <>, 
   Natural range <>) of Std_Logic; 
   variable TempCond : Boolean 
   := true; 
   variable RAM2: Mem (0 to 
   7, 0 to 7):= 
     (('0', '0', '0', '0', '0', '0', '0', '0'), 
     ('0', '0', '0', '0', '0', '0', '0', '0'), 
     ('0', '0', '0', '0', '0', '0', '0', '0'), 
     ('0', '0', '0', '0', '0', '0', '0', '0'), 
     ('0', '0', '0', '0', '0', '0', '0', '0'), 
     ('0', '0', '0', '0', '0', '0', '0', '0'), 
     ('0', '0', '0', '0', '0', '0', '0', '0'), 
     ('0', '0', '0', '0', '0', '0', '0', '0')); 
  
     
   Both variables are initialized according to the types used. Note the 
   aggregate has been used for initializing RAM2, which is an 88 bit memory. 
  
   Example 3 
  
   shared variable FreeAccess : 
   Boolean := true; 
  
     
   The shared variable FreeAccess 
   statement is used to determine whether a shared resource can be 
   accessed at any particular time. However, in real applications a 
   signal declaration would better serve for this purpose because using signals 
   makes the specification more deterministic. 
  
   Important Notes
  
   - 
   
    Unlike signals, variables have
     neither history nor future, because according to its definition, 
    each variable has only current value. No checking for the last
     event, time elapsed since 
    the last event, previous value,
     etc. can be performed on variables. 
    - 
   
    The non-shared variables are limited to subprograms and processes only. 
    - 
   
    If a value of a variable is read before it is assigned in a clocked 
    process (i.e. where operations are performed when an edge of clock 
    signal is detected) then a register will be synthesized for this 
    variable. A similar situation inside a combinatorial process may lead 
    to generation of a latch. 
    - 
   
    Variables declared in a subprogram are synthesized as combinatorial logic. 
    - 
   
    During simulation variables consume
     a lot less (even an order of magnitude) memory space than signals. 
    Therefore, it is highly recommended to use them for storage elements 
    (such as memories) instead of signals. 
    - 
   
    Shared variables may cause 
    a system to be non-deterministic and therefore they should be avoided. 
     
  
    
 
    |