MMU description » History » Revision 91
Revision 90 (Alexander Kamkin, 12/02/2014 10:10 AM) → Revision 91/132 (Alexander Kamkin, 12/03/2014 01:26 PM)
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 : bufferOrAddress* ; bufferOrAddress : address | buffer ; </pre> The expression syntax is derived from nML/Sim-nML (see _MicroTESK Language 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 | 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 Format (format) The @format@ parameter specifies the address _format_ (a number of named fields). The parameter is optional. By default, the address is unstructured (no fields are specified). A field has three attributes: a _name_, a _width_ and, optionally, an _initial value_. h4. Grammar <pre> format : ''format'' ''='' ''('' 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 = ( 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). The parameter is optional. By default, the buffer line is unstructured (no fields are specified). A field has three attributes: a name, a width and, optionally, an initial value. h4. Grammar <pre> format : ''format'' ''='' ''('' 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 = ( 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> == TAG // The data replacement policy (example: using predefined policy LRU - Least Recently Used). policy = LRU </pre> h2. Memory Description (memory) h3. Grammar <pre> memory : ''memory'' memoryID ''('' addressTypeID addressArgID '')'' (memoryParameter)* ; memoryParameter : read | write ; </pre> h3. Read Action Description (read) h4. Grammar <pre> read : ''read'' ''='' ''{'' sequence ''}'' ; </pre> h3. Write Action Description (write) h4. Grammar <pre> write : ''write'' ''='' ''{'' sequence ''}'' ; </pre> h3. Examples <pre> memory Mem read = { } write = { } </pre>