Project

General

Profile

NML Language Reference » History » Version 48

Andrei Tatarnikov, 02/14/2014 03:21 PM

1 21 Andrei Tatarnikov
h1. Sim-nML Language Reference
2
3
*UNDER CONSTRUCTION*
4 1 Alexander Kamkin
5 20 Andrei Tatarnikov
_~By Andrei Tatarnikov~_
6
7 1 Alexander Kamkin
This reference manual describes syntax and semantics of the Sim-nML language. It covers language facilities supported by MicroTESK and does not attempt to be complete. It may differ from documentation provided by other vendors as there are differences in language implementations.
8 22 Andrei Tatarnikov
9 27 Andrei Tatarnikov
{{toc}}
10 6 Andrei Tatarnikov
11 24 Andrei Tatarnikov
h2. Introduction
12 23 Andrei Tatarnikov
13
*_Sim-nML_* is an architecture description language (ADL) used in MicroTESK to describe the architecture of a microprocessor under verification. It is a flexible and easy-to-use language based on attribute grammar. Sim-nML was designed to provide a retargetable way to specify microprocessor architecture for various microprocessor-related software tools including instruction-set simulators, assemblers, disassemblers, compiler back-ends etc. It works at the instruction-set level concentrating on behavioral properties and hiding implementation details of the microprocessor. A Sim-nML specification represents a programmer''s model of the microprocessor that covers the following aspects:
14
15
* supported data types;
16
* registers and memory;
17
* addressing modes;
18
* syntax and semantics of instructions.
19
20 42 Andrei Tatarnikov
Sim-nML uses a hierarchical tree-like structure to describe an instruction set. Such a structure facilitates grouping related instructions and sharing their common parts. An instruction is described as a path in the tree from the root node to a leaf node. The set of all possible paths represents an instruction set. A node describes a primitive operation responsible for some task within an instruction. Each nodes has certain attributes that can be shared by its descendants. Actions performed by instructions are described as operations with registers and memory represented by bit vectors of arbitrary size.
21 23 Andrei Tatarnikov
22
A specification in Sim-nML starts with definitions of types and constants. For example, a type definition for a 32-bit word looks as follows:
23
24 35 Andrei Tatarnikov
<pre><code>let WORD_SIZE = 32
25 39 Andrei Tatarnikov
type word = card(WORD_SIZE)</code></pre>
26 23 Andrei Tatarnikov
27 28 Andrei Tatarnikov
Type definitions and constants can be used to describe registers and memory. In addition to registers and memory, it is also possible to define temporary variables, internal abstractions provided by Sim-nML to store intermediate results of operations. They do not correspond to any data storage in real hardware and do not save their data across instruction calls. Also, there is often a need to specify some properties of the described model. For this purpose, special constants are used. For example, the code below defines general-purpose registers, memory and a temporary variable. Also, it includes a special constant to establish a correspondence between the general purpose register number 15 and the program counter (PC). Here is the code:
28 23 Andrei Tatarnikov
29 36 Andrei Tatarnikov
<pre><code>reg GPR[32, word]
30 1 Alexander Kamkin
mem M[2 ** 20, byte]
31 23 Andrei Tatarnikov
var carry[1, bit]
32 39 Andrei Tatarnikov
let PC = "GPR[15]"</code></pre>
33 23 Andrei Tatarnikov
34 1 Alexander Kamkin
As stated above, an instruction set is described as a tree of primitive operations. There two kinds of primitives: _operations_ and _addressing modes_. Operations describe parts of instructions responsible for specific tasks and can be used as leaf and root nodes. Addressing modes are aimed to customize operations (for example, they encapsulate rules for accessing microprocessor resources). They can only be used as leaf nodes. For example, here are simplified examples of operation and addressing mode specifications:
35
36 38 Andrei Tatarnikov
<pre><code>mode REG(i: nibble) = R[i]
37 1 Alexander Kamkin
syntax = format("R%d", i)
38 41 Andrei Tatarnikov
image  = format("01%4b", i)</code></pre>
39 39 Andrei Tatarnikov
40 41 Andrei Tatarnikov
<pre><code>op Add()
41 33 Andrei Tatarnikov
syntax = "add"
42 32 Andrei Tatarnikov
image  = "00"
43 39 Andrei Tatarnikov
action = { DEST = SRC1 + SRC2; }</code></pre>
44 32 Andrei Tatarnikov
45 46 Andrei Tatarnikov
Operations and addressing modes have three standard attributes: _syntax_, _image_ and _action_. The first two specify textual and binary syntax. The third describes semantics of the primitive. In addition, addressing modes have a return expression that enables them to be used as variables in various expressions. Attributes can be used by parent primitives referring to a given primitive to describe more complex abstractions.
46 43 Andrei Tatarnikov
47 48 Andrei Tatarnikov
Primitives are arranged into a tree using production rules. There are two kinds of production rules: _AND rules_ and _OR rules_. AND rules specify parent-child relationships where a child primitive is described as a parameter of its parent. Here is an example of an AND rule:
48 1 Alexander Kamkin
49 48 Andrei Tatarnikov
<pre><code>op arithmetical_instruction(act: Add, op1: OPRND, op2: OPRND)</code></pre>
50 47 Andrei Tatarnikov
51 18 Andrei Tatarnikov
h2. Overview of Sim-nML