Project

General

Profile

MMU description » History » Revision 103

Revision 102 (Andrei Tatarnikov, 01/29/2015 11:36 AM) → Revision 103/132 (Andrei Tatarnikov, 01/29/2015 11:37 AM)

h1. MMU Description 

 _~By Alexander Kamkin and Taya Sergeeva~_ 

 {{toc}} 

 A _memory management unit_ (_MMU_) is known to be one of the most complex and error-prone components of a modern microprocessor. MicroTESK has a special subsystem, called _MMU subsystem_, intended for (1) specifying memory devices and (2) deriving testing knowledge from such specifications. The subsystem provides unified facilities for describing memory buffers (like _L1_ and _L2 caches_, _translation look-aside buffers_ (_TLBs_), etc.) as well as a means for connecting several buffers into a memory hierarchy. 

 h2. Grammar 

 <pre> 
 startRule 
     : declaration* EOF! 
     ; 

 declaration 
     : address 
     | segment 
     | buffer 
     | mmu 
     ; 
 </pre> 

 The expression syntax is derived from nML/Sim-nML (see [[Sim-nML _MicroTESK Language Reference]]). Reference_). 

 h2. Address Description (address) 

 A buffer is accessed by an _address_, which is typically a _bit vector_ of a fixed length (width). Different buffers are allowed to have a common address space (e.g., L1 and L2 are usually both addressed by physical addresses). However, in general case, each buffer has its own domain. 

 An address space is described using a keyword @address@. The description can specify two parameters: @width@ (obligatory) and @format@ (optional). 

 h3. Grammar 

 <pre> 
 address 
     : ''address'' ID 
         (addressParameter)* 
     ; 

 addressParameter 
     : width 
     | segment 
     | format 
     ; 
 </pre> 

 h3. Address Width (width) 

 The @width@ parameter specifies the address _width_. The parameter is obligatory; its value should be non-negative (zero-length addresses are permitted). 

 h4. Grammar 

 <pre> 
 width 
     : ''width'' ''='' expr 
     ; 
 </pre> 

 h3. Address Space Segment (segment) 

 The @segment@ parameter specifies the address space _segment_. Any number (&ge; 0) of segments (with different names) can be specified for one address. Each segment is characterized by its _name_ and _address range_. Different segments should have different names, but address ranges are allowed to overlap, and moreover, to be the same. 

 h4. Grammar 

 <pre> 
 segment 
     : ''segment'' segmentID ''='' ''('' expr '','' expr '')'' 
     ; 
 </pre> 

 h3. Address Format (format) 

 The @format@ parameter specifies the address _format_ (a number of named fields). Any number (&ge; 0) of formats (with different names) can be specified for one address. 

 A field has three attributes: a _name_, a _width_ and, optionally, an _initial value_. 

 h4. Grammar 

 <pre> 
 format 
     : ''format'' formatID ''='' ''('' 
         field ('','' field)* 
       '')'' 
     ; 

 field 
     : ID '':'' expr (''='' expr)? 
     ; 
 </pre> 

 h2. Examples 

 <pre> 
 // The singleton. 
 address Void 
   // The address width is zero (this is admissible for single-item buffers). 
   width = 0 
 </pre> 

 <pre> 
 // An unstructured 64-bit virtual addresses (VA). 
 address VA 
   // The address width. 
   width = 64 
 </pre> 

 <pre> 
 // A stuctured 40-bit physical addresses (PA). 
 address PA 
   // The address width. 
   width = 40 
   // The address format: (<39..36>, TAG=<35..12>, INDEX=<11..5>, LOCAL=<4..0>). 
   format PA_L1 = ( 
     TAG     : 24, // The tag (the <35..12> address bits). 
     INDEX : 7,    // The set index (the <11..5> address bits). 
     LOCAL : 5,    // The byte position (the <0..4> address bits). 
   ) 
 </pre> 

 h2. Buffer Description (buffer) 

 A buffer is described using a keyword @buffer@. The description specifies a set of parameters, including @ways@, @sets@, @format@, @index@, @match@ and @policy@. All of the parameters except @index@ (if @sets = 1@) and @policy@ are obligatory. 

 h3. Grammar 

 <pre> 
 buffer 
     : ''buffer'' bufferTypeID ''('' addressTypeID addressArgID '')'' 
         (bufferParameter)* 
     ; 

 bufferParameter 
     : ways 
     | sets 
     | format 
     | index 
     | match 
     | policy 
     ; 
 </pre> 

 h3. Buffer Associativity (ways) 

 The @ways@ parameter specifies the buffer _associativity_ (the number of lines in a set). The parameter is obligatory; its value should be positive. 

 h4. Grammar 

 <pre> 
 ways 
     : ''ways'' ''='' expr 
     ; 
 </pre> 

 h3. Buffer Length (sets) 

 The @sets@ parameter specifies the buffer _length_ (the number of sets a cache). The parameter is obligatory; its value should be positive. 

 h4. Grammar 

 <pre> 
 sets 
     : ''sets'' ''='' expr 
     ; 
 </pre> 

 h3. Buffer Line Format (format) 

 The @format@ parameter specifies the buffer _line format_ (a number of named fields). Any number (&ge; 0) of formats (with different names) can be specified for one buffer. 

 A field has three attributes: a name, a width and, optionally, an initial value. 

 h4. Grammar 

 <pre> 
 format 
     : ''format'' formatID ''='' ''('' field ('','' field)* '')'' 
     ; 

 field 
     : fieldID '':'' expr (''='' expr)? 
     ; 
 </pre> 

 h3. Buffer Index Function (index) 

 The @index@ parameter specifies the _address-to-index function_, which maps an address into the set index. The function may be omitted if the number of sets is @1@. 

 h4. Grammar 

 <pre> 
 index 
     : ''index'' ''='' expr 
     ; 
 </pre> 

 h3. Buffer Match Predicate (match) 

 The @match@ parameter specifies the _address-line match predicate_, which checks if an address matches a line. The parameter is obligatory. 

 h4. Grammar 

 <pre> 
 index 
     : ''match'' ''='' expr 
     ; 
 </pre> 

 h3. Buffer Data Replacement Policy (policy) 

 The @policy@ parameters specifies the _data replacement_ (_eviction_) _policy_. The parameter is optional. The list of supported policies includes: @RANDOM@, @FIFO@, @PLRU@ and @LRU@. 

 h4. Grammar 

 <pre> 
 policy 
     : ''policy'' ''='' policyID 
     ; 
 </pre> 

 h3. Examples 

 <pre> 
 // A 4-way set associative cache (L1) addressed by physical addresses (PA). 
 buffer L1(PA addr) 
   // The cache associativity. 
   ways = 4 
   // The number of sets. 
   sets = 128 
   // The line format. 
   format LINE = ( 
     V      : 1 = 0, // The validity flag (by default, the line is invalid). 
     TAG    : 24,      // The tag (the <35..12> address bits). 
     DATA : 256      // The data (4 double words). 
   ) 
   // The address-to-index function (example: using address fields). 
   index = addr.INDEX 
   // The address-line predicate (example: using address bits). 
   match = addr<35..12> == LINE.TAG 
   // The data replacement policy (example: using predefined policy LRU - Least Recently Used). 
   policy = LRU 
 </pre> 

 h2. Memory Description (memory) 

 A memory is described using a keyword @memory@. The description includes two obligatory parameters @read@ and @write@. 

 h3. Grammar 

 <pre> 
 memory 
     : ''memory'' memoryTypeID ''('' addressTypeID addressArgID '')'' 
         (memoryParameter)* 
     ; 

 memoryParameter 
     : read 
     | write 
     ; 
 </pre> 

 h3. Memory Read Action (read) 

 The @read@ parameter specifies the _read action_, which is a sequence of statements describing how the read operation is to be performed (by means of data transfers between buffers). The parameter is obligatory. 

 h4. Grammar 

 <pre> 
 read 
     : ''read'' ''='' ''{'' sequence ''}'' 
     ; 
 </pre> 

 h3. Memory Write Action (write) 

 The @write@ parameter specifies the _read action_, which is a sequence of statements describing how the write operation is to be performed (by means of data transfers between buffers). The parameter is obligatory. 

 h4. Grammar 

 <pre> 
 write 
     : ''write'' ''='' ''{'' sequence ''}'' 
     ; 
 </pre> 

 h3. Examples 

 <pre> 
 // A memory unit addressed by virtual addresses (VA). 
 memory Memory(VA addr) 
   // The read action. 
   read = { 
     // Some statements. 
     ... 
   } 
   // The write action. 
   write = { 
     // Some statements. 
     ... 
   } 
 </pre>