Block Statement
  
    
    
     
   
   Formal Definition
  
   The block statement
    is a representation of design or hierarchy section, used for
   partitioning architecture into self-contained parts. 
  
   Simplified Syntax
  
   block_label : block (optional_guard_condition) 
  
      declarations 
  
      begin 
  
      concurrent statements 
  
      end block block_label; 
  
   Description
  
   The block statement is a way 
   of grouping concurrent statements in an architecture. There are two 
   main purposes for using blocks:
    to improve readability of the specification and to disable some 
   signals by using the guard expression
    (see guard for details). 
  
   The main purpose of block 
   statement is organisational only - introduction of a block 
   does not directly affect the execution of a simulation model. For 
   example, both the upper and lower sections of code in Example 1 will 
   generate the same simulation results. 
  
   Each block must be assigned a label placed just before the block 
   reserved word. The same label may be optionally repeated at the end 
   of the block, right after the end block
    reserved words. 
  
   A block statement can be 
   preceded by two optional parts: a header 
   and a declarative part. The 
   latter allows to introduce declarations of subprograms, types, 
   subtypes, constants, signals, shared variables, files, aliases, 
   components, attributes, configurations, disconnections, use clauses 
   and groups (i.e. any of the declarations possible for an 
   architecture). All declarations specified here are local to the block 
   and are not visible outside it. 
  
   A block header may contain port 
   and generic declarations 
   (like in an entity), as well as so called port
    map and generic map 
   declarations. The purpose of port map 
   and generic map statements 
   is to map signals and other objects declared outside of the block 
   into the ports and generic parameters that have been declared inside 
   of the block, respectively. 
   This construct, however, has only a small practical importance. The 
   Example 2 illustrates typical block declarations. 
  
   If an optional guard condition is specified at the beginning of the 
   block then this block becomes a guarded block. See guard 
   for details. 
  
   The statements part may contain any concurrent constructs allowed in 
   an architecture. In 
   particular, other block 
   statements can be used here. This way, a kind of hierarchical 
   structure can be introduced into a single architecture body. 
  
   Examples
  
   Example 1 
  
   A1: OUT1 <= '1' after 5 ns; 
   LEVEL1 : block 
   begin 
      A2: OUT2 
   <= '1' after 5 ns; 
      A3: OUT3 
   <= '0' after 4 ns; 
   end block LEVEL1; 
   A1: OUT1 <= '1' after 5 ns; 
   A2: OUT2 <= '1' after 5 ns; 
   A3: OUT3 <= '0' after 4 ns; 
  
     
   Both pieces of code above will behave in exactly the same way during 
   simulation - block construct only separates part of the code without 
   adding any functionality. 
  
   Example 2 
  
   entity X_GATE is 
   generic (LongTime : Time; 
   ShortTime : Time); 
     port (P1, P2, P3 
   : inout BIT); 
   end X_GATE; 
   architecture STRUCTURE of 
   X_GATE is 
   -- global declarations of signal: 
   signal A, B : BIT; 
   begin 
   LEVEL1 : block 
   -- local declaration of generic parameters 
      generic 
   (GB1, GB2 : Time); 
   -- local binding of generic parameters 
      generic map 
   (GB1 => LongTime, GB2 => ShortTime); 
   -- local declaration of ports 
      port (PB1: 
   in BIT; PB2 : inout BIT ); 
   -- local binding of ports and signals 
      port map 
   (PB1 => P1, PB2 => B); 
   -- local declarations: 
      constant 
   Delay : Time := 1 ms; 
      signal S1 
   : BIT; 
   begin 
      S1 <= PB1 after Delay; 
      PB2 <= S1 after 
   GB1, P1 after GB2; 
   end block LEVEL1; 
   end architecture STRUCTURE; 
  
     
   The signals PB1 and PB2
    have here the same values as P1 
   and B (in port
    map statement), respectively, and the generics GB1
    and GB2 (see generic
    map statement) have the same values as LongTime 
   and ShortTime, 
   respectively. However, such assignment is redundant because a block may
    use any declarations of an entity, including generics and ports. The Example
    2 is presented here only for illustration purpose of the 
   block syntax. 
  
   Important Notes
  
   - 
   
    Guarded blocks are generally not synthesizeable. 
    - 
   
    Unguarded blocks are usually ignored by synthesis tools. 
    - 
   
    It is strongly recommended NOT to use blocks in non-VITAL designs - 
    the package Std_logic_1164 supports mechanisms and multiple value 
    logic which make the reserved words bus,
     disconnect, guarded 
    and register unnecessary. 
    Also, instead of guarded blocks for modelling sequential behaviour it 
    is recommended to used clocked processes. 
    - 
   
    VITAL specifications require the use of blocks. 
    - 
   
    VHDL supports a more powerful mechanism of design partitioning which 
    is called component instantiation.
     Component instantiation 
    allows connecting a component reference in one entity with its 
    declaration in another entity. 
     
  
    
 
    |