Memories
  
    
    
     
   
   Formal Definition
  
   Memories are arrays of registers. 
  
   Simplified Syntax
  
   reg memory_width 
   memory_identifier memory_depth; 
  
   integer memory_identifier memory_length; 
  
   time memory_identifier memory_length; 
  
   Description
  
   Memories can be declared only for reg,
    integer and time 
   data types. Depth of memory should be declared by specifying a range 
   following the memory identifier (Example 1). Registers and memories 
   can be declared in the same line (Example 2). Elements of memory type 
   can be accessed by memory index (Example 3). An assignment to a 
   memory identifier without specified memory index is illegal. 
   Bit-selects and part-selects on memory elements are not allowed. If 
   access to individual bits of memory is needed, then a word containing 
   that bit should be assigned to a register with the same width. All 
   operations should then be done on this register and the result should 
   be assigned back to the memory word (Example 5). Memory words can be 
   accessed individually, but bit-select and part-select operations 
   cannot be done on memories or memory words directly. 
  
   Vector declaration and memory declaration are not the same. If a 
   variable is declared as a vector, all bits can be assigned a value in 
   one statement. If a variable is declared as memory then a value to 
   each element should be assigned separately (Example 4). 
  
   Examples
  
   Example 1 
  
   reg [7:0] mem[1023:0]; 
   integer i_mem[8:1]; 
  
   The 'mem' variable is a memory that contains 1024 8-bit words. 
  
   The 'i_mem' variable has 8 words (each word is an integer register). 
  
   Example 2 
  
   reg [3:0] mem[255:0], r; 
  
   This line a declares 4-bit register 'r' and memory 'mem', which 
   contains 256 4-bit words. 
  
   Example 3 
  
   reg [7:0] mem [3:0], r; 
   mem[0] = 7; 
   r = mem[3]; 
   mem[1] = r; 
  
   Example 4 
  
   reg [7:0] vect; 
   reg array[7:0]; 
   vect = 8'b11001010; 
   array[7] = 1'b1; 
   array[6] = 1'b1; 
   array[5] = 1'b0; 
   array[4] = 1'b0; 
   array[3] = 1'b1; 
   array[2] = 1'b0; 
   array[1] = 1'b1; 
   array[0] = 1'b0; 
  
   If the variable is declared as a vector (variable vect), then the new 
   value can be assigned to all bits at the same time. If a variable is 
   declared as a memory (variable array) type, then the new value should 
   be assigned to each element of memory separately. 
  
   Example 5 
  
   reg [7:0] mem[255:0], r; 
   r = mem[135]; 
   r[3:1] = 3'b100; 
   mem[135] = r; 
  
   This example shows how to access particular bits of memory. 
  
   Important Notes
  
   - 
   
    Memories can be declared only for reg,
     integer and time 
    registers types. 
    - 
   
    Bit-selects and part-selects on memory elements are prohibited. 
     
  
    
 
    |