Внутренние регистры (блоки ФИФО) 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Внутренние регистры (блоки ФИФО)



Язык PPDL

Руководство разработчика

 

Версия 1.0

 

ООО «РЕДА-Софт» 2005 – 2012. Все права защищены.


 

Содержание

Содержание. 2

1.  Условные обозначения. 5

2.  Используемые термины и аббревиатуры.. 6

Аббривеатуры.. 6

Термины языка PPDL.. 6

Ассемблерное имя. 6

Внутренние регистры (блоки ФИФО) 6

3.  Конструкции языка PPDL.. 6

1.1   Ключевые слова языка PPDL.. 6

1.2   Комментарии. 7

1.3   Константы.. 7

1.4   Имена. 8

1.5   Разделители. 8

1.1   Специальные символы ассемблера. 8

1.2   Директива препроцессора #define. 8

1.1   Директива препроцессора #include. 9

1.1   Директива препроцессора #ifdef. 9

4.  Описание элементов процессора на языке PPDL.. 9

1.2   Декларация архитекуры процессора. 9

Формат. 9

Аргументы.. 10

Примечание. 10

1.3   Описание регистров. 10

Формат. 10

Аргументы.. 10

Примеры.. 10

1.4   Описание блоков FIFO.. 11

Формат. 11

Аргументы.. 11

Примеры.. 11

1.5   Описание флагов. 11

Формат: 11

Аргументы: 11

Примеры.. 11

1.6   Описание шины памяти. 12

Формат. 12

Аргументы.. 12

Пример. 12

5.  Описание поведенческой модели процессора. 12

1.1   Операторы и операнды для описания поведения инструкций, массивов аргументов и функций 12

Арифметические и логические операции. 12

Операторы условного выполнения. 12

Операторы преобразования типов данных и преобразование к знаковому числу. 13

Оператор цикла for 13

Оператор ожидания следующего такта: wait 13

Оператор выбора switch/case. 13

Операторы обращения к битам и операторы объединения выражений. 14

Оператор конкатенации подвыражений. 14

Операторы блокировки и разблокировки регистров и FIFO.. 15

Wait - ожидание следующего такта. 15

Оператор idx – индекс списка или аргумента инструкции. 15

1.2   Конвейер. 16

Формат. 16

Аргументы.. 16

Описание. 16

Пример. 16

1.3   Набор инструкций. 16

Формат. 16

Аргументы.. 16

Описание. 16

1.4   Функции. 16

1.5   Массив аргументов инструкции. 16

Формат. 16

Аргументы.. 17

Пример. 17

1.6   Описание инструкций. 17

Формат. 17

Аргументы.. 17

Формат кода команды.. 18

Формат шаблона команды ассемблера. 19

Пример. 19

1.7   Функция Operate. 21

Формат. 21

Описание. 21

Функции доступные в Operate. 21

Пример. 21

1.8   Функция RESET. 22

Пример: 22

6.  Параметры вызова генератора симулятора ppdl.exe. 23

1.9   Генерация симулятора процессора. 23

1.10     Генерация ассемблера. 23

1.1   Генерация дизассемблера. 23

1.2   Генерация XML файла описания архитектуры.. 23

7.  Интерфейс симулятора. 24

1.3   tDProcCfg* GetCfg() 24

1.4   void getmem(void *mem,int busnum,int addr,int size_in_words); 24

1.5   void setmem(void *mem,int busnum,int addr,int size_in_words); 25

1.6   int DisAssembly(char *str,int busnum,int addr,int size); 25

1.7   int set_bp(unsigned long addr); 25

Возвращаемое значение. 25

1.8   int clear_bp(unsigned long addr) 25

Возвращаемое значение. 25

1.9   int start(); 25

Возвращаемое значение. 25

1.10     int stop(); 25

Возвращаемое значение. 25

1.11     int isRun() 26

1.12     int setreg(int rnum,int anum,unsigned long val) 26

1.13     unsigned long getreg(int nrnum,int anum) 26

1.14     unsigned long getcount() 26

1.15     void reset() 26

8.  Дополнительные функции симулятора, генерируемые автоматически. 27

1.16     void ISET_NAME_decode(unsigned long ocode) 27

Описание. 27

Аргументы.. 27

1.17     void ISETNAME_exec_PIPENAME() 27

Аргументы.. 27

Описание. 27

1.18     void operate() 27

Описание. 27

 

 


 

Условные обозначения

Жирным текстом обозначены ключевые слова языка PPDL, а также операторы языка.

Курсивом обозначены необязательные параметры конструкций PPDL, а также (при описании функций интерфейса симулятора) аргументы функций.


 

2. Используемые термины и аббревиатуры

Аббривеатуры

expr. – (expression) арифметическое или логическое выражение  

cond. – (condition) условие

 

Термины языка PPDL

Ассемблерное имя

Ассемблерное имя - имя ресурса для программирования операций с ним на языке ассемблера.

Внутренние регистры (блоки ФИФО)

Внутренние регистры (или блоки ФИФО) - это регистры процессора, которые используются для хранения внутренней информации о состоянии процессора и недоступные для программирования. При описании таких регистров в PPDL их ассемблерное имя должно быть пропущено, а значения этих регистров не будут отображаться в отладчике.

 

Конструкции языка PPDL

 

Язык PPDL представляет собой простой язык для разработки микропроцессоров, позволяющий из единого описания генерировать симулятор, ассемблер (декодер мнемоник инструкций), дизассемблер и интерфейс для подключения к отладчику nm-gdb.

 

Ключевые слова языка PPDL

В таблице 1 приведен список зарезервированных ключевых слов, предназначенных для описания компонентов языка PPDL.

 

Ключевое слово Предназначение идентификатора
Device Определение нового ядра процессора
Reg Декларация регистра процессора
RegFifo Декларация ФИФО-блока
Flag Декларация флага процессора
MemSpace Декларация шины памяти (адресного пространства)
ArgList Декларация списка (множества) значений аргументов
ISET Декларация набора инструкций
INST Декларация инструкции
PIPE Декларация конвейера
Operate Определение функции управления потоком
Var Декларация переменной
Mutable Признак регистра или переменной: регистр (переменная) имеет дополнительный бит – флаг блокировки
NULL Обозначение недопустимой кодировки в аргументе инструкции в списке аргументов
Func Идентификатор функции
intN(int1,int2,…int128) Типы данных или возвращаемого значения функции
float, double Типы данных переменных с плавающей точкой
for Оператор цикла
if, else Операторы условного выполнения
switch, case Операторы выбора 
while Оператор цикла по условию (повторять, пока условие выполняется)
break Оператор
return  
RESET Функция начальной инициализации процессора. Выполняется при сбросе (подачи сигнала reset) на вход процессора
assembler Операции над аргументами (проверка или преобразование), выполняемые ассемблером после парсинга определенной инструкции
disasm Операции над аргументами (проверка или преобразование), выполняемые дизассемблером после распознавания инструкции, но перед генерации мнемоники инструкции.

 

       Не допускается использовать ключевые слова в качестве имен переменным, регистрам, функциям, аргументам и пр. При задании ключевого слова в качестве имени будет выдана ошибка «Unexpected token XXX».

 

Комментарии

В PPDL как и в языке С предусмотрено два типа комментариев, однострочные и много-строчные. Однострочные компиляторы начинаются символами «//» и заканчиваются концом «конец строки». Многострочные комментарии начинаются символами “/*” и заканчиваются символами «*/»

 

Пример:

       a+b; // это пример однострочного комментария

       /* пример многострочного

                   комментария */

 

Константы

Константы в PPDL могут задаваться в десятичном, шестнадцатеричном и или двоичном виде. Десятичные константы задаются последовательностью символов от «0» до «9». Пример: 2345

 

Шестнадцатеричные константы задаются последовательностью символов от «0» до «9», от «A» до «F» или от «a» до «f» с префиксом «0x». Пример: -0xAF34

 

Двоичные константы задаются последовательностью символов «0» и «1» с префиксом «0b». Пример – 0b1001

 

Имена

Доступ к ресурсам процессора (регистрам, шинам памяти, аргументам) в PPDL осуществляется по их именам. Имя ресурса должно начинаться с одной из букв латинского алфавита или символа подчеркивания и может содержать:

  1. Буквы латинского алфавита, как заглавные, так и строчные,
  2. Цифры
  3. Символ подчеркивания “_”

 

Разделители

Разделителями в PPDL являются:

  1. Символ пробела
  2. Символ табуляции
  3. Символ перехода на новую строчку  

 

Формат

DEVICE ProcessorName

{

processor description

}

 

Аргументы

ProcessorName – название процессора. Генератор симулятора в случае успешной компиляции, производит C++ класс с именем ProcessorName.

processor description – тело описания процессора. Все элементы процессора должны быть описаны в теле процессора.

Примечание

В настоящее время поддерживается возможность описания только одного процессора в файле.

 

 

Описание регистров

Формат

       Reg Name [Array_size], bit_size, “ Assembly_name ” [mutable];

или

       Reg type Name [Array_size], “ Assembly_name ” [mutable];

 

Аргументы

 

Name – имя регистра.

 

Array_size – размер массива регистров. Если декларируется только один регистр, параметр Array_size можно опустить.

 

Bit_size – размер регистра в битах

Type – тип регистра, допустимо задавать типы double, float. intN, где N – целой в диапазоне от 1 до 64 включительно (например int1, int4, int64). Type является аналогом bit_size, в декларации можно задавать либо type и перед именем регистра, либо Bit _ size и после имени регистра через запятую.

 

Assembly_name – ассемблерное имя регистра. Если регистр внутренний, то данный параметр можно опустить. Для массива регистров в ассемблерном имени должен присутствовать символ $ для обозначения индекса регистра в массиве.

 

Например, если регистр описан следующим образом, Reg r[15],32,"r[$]" ассемблерное имя регистра будет, например, r[0],r[1],r[2] и т.д.

 

mutable – опциональное ключевое слово, говорящее компилятору о том, что у регистра или у каждого элемента регистрового массива появляется бит блокировки доступа. С помощью данного бита имеется возможность останавливать работу конвейера в случае, если регистр заблокирован. Для блокировки регистра предусмотрены операторы lock или llink (см. главу «»). Для разблокировки предусмотрен оператор unlock.    

 

 

Примеры

Reg r[16],32,"r[$]"; // массив из шестнадцати 32-х битных регистров

Reg gr[16],32,"gr$" mutable; // массив из шестнадцати 32-х битных регистров, доступ к каждому регистру может быть заблокирован

Reg FR,16,"FR";   // 16-и битный регистр флагов

Reg IR[3],32;         // внутренний массив из трех 32-х битных регистров

Reg T1,32;        // внутренний 32-х битный регистр

Описание блоков FIFO

Формат

       RegFifo Name [fifo_size], bit_size, “ Assembly_name ”;

       RegFifo type Name [fifo_size], “ Assembly_name ”;

 

Аргументы

 

Name – имя регистра.

 

fifo_size – количество элементов блока FIFO.

bit_size – размер элемента блока FIFO

type – тип элемента блока FIFO, допустимо задавать типы double, float. intN, где N – целой в диапазоне от 1 до 64 включительно (например int1, int4, int64). Type является аналогом bit_size, в декларации можно задавать либо type и перед именем регистра, либо Bit _ size и после имени регистра через запятую.

 

Assembly_name – ассемблерное имя FIFO. Если FIFO внутренний, то данный параметр можно опустить.

Примеры

 

Описание флагов

Флагом в PPDL является именованный бит регистра процессора.

Формат:

       Flag Name, Reg[bit_of_reg];

 

Аргументы:

 

Name – имя флага в симуляторе

 

Reg – имя регистра флагов

 

bit_of_reg – номер бита в регистре флагов

Примеры

 

Flag O,FR[0];    // Overflow

Flag N,FR[1];    // Negative

Flag Z,FR[2];    // Zero flag

Flag C,FR[3];       // carry from 15 to 16 bits

 

Описание шины памяти

Операции обращения к памяти процессора осуществляются через шины памяти. При описании модели в целом шины могу быть соединены с блоками памяти или мультиплексорами, разделяющими запросы к памяти по разным блокам.

Формат

       MemSpace Name, AddrSize, DataSize;

 

Аргументы

       Name – имя шины

       AddrSize – размер шины адреса

       DataSize – размер шины данных

Пример

MemSpace data,32,32; // data memory space

 

Оператор цикла for

for (begin; end_condition; increment)

{

for_body;

}

Где:

       Begin – начальная инициализация

       end_condition – условие продолжение цикла

       increment – изменение счетчиков по окончании каждой итерации цикла

 

Поведение оператора for в ppdl полностью аналогично поведению for в языках C/С++.  

Оператор выбора switch/case

       Конструкция switch/case предназначена для выбора

 

switch(exp)

{

       case const1:

exp1;

exp2;

break;

 

       case const2:

exp1;

exp2;

break;

           

case constN:

exp1;

exp2;

break;

 

       default:

exp1;

exp2;

break;

 

}

 

 

Конвейер

Формат

       PIPE {stage1,stage2};

Аргументы

stage1, stage2 – перечисление символьных названий ступеней конвейера

 

Описание

Конвейер инструкций предназначен для описания потактового разбиения инструкций. Разделяют два типа конвейера – конвейер инструкций и конвейер непосредственно процессора.

 

 Пример

       PIPE {pa,pb};

Данный конвейер состоит из ступеней: pa и pb.

 

 

Набор инструкций

Формат

ISET Name

{

   // описание конвейера

PIPE …

// описание набора инструкций

INST …

}

Аргументы

       Name – название набора инструкций.

Описание

       Описание процессора в PPDL может содержать один или несколько наборов инструкций. Каждый набор инструкций имеет свое уникальное имя (Name). Внутри блока описания инструкций описываются инструкции, их ассемблерное представление, бинарный код и семантика, а также конвейер инструкций. При генерации программного симулятора  

Функции

 

Формат

       ArgList Name, “assembly_template”,{arg1, arg2, arg3 };

       ArgList Name, { “arg1”, “ arg2”,” arg3” };

 

Аргументы

       Name – имя аргумента

       “ assembly _ template ” – шаблон аргумента для представления в ассемблере. Данный параметр опускается, если список аргументов составляют ассемблерные конструкции (имена в кавычках). Кроме того, при описании шаблона можно использовать зарезервированное выражение “$a”, которое означает ассемблерное имя объекта. В этом случае каждый элемент списка должен иметь ассемблерное имя.

       arg 1, arg 2 – список аргументов. Элементы списка могут быть двух типов: регистры или ассемблерные имена (в кавычках).

 

Пример

// список из младших регистров массива r[8]

// в ассемблере элемент списка RL будет выглядеть как: rl_r[idx]

ArgList RL,"rl_$a",{r[0],r[1],r[2],r[3]};

 

 

// список аргументов - математических логических или сдвиговых операций

ArgList arithm,{"ADD","SUB","OR","XOR","AND","NOT","RSH","LSH","MUL"};

 

Описание инструкций

Формат

INST Assembly_template,(OpCode_Descr)

disasm

{

disasm_directives;

}

assembler

{

assembler_directives;

}

 

{

 

Decode_instruction_functionality

stage1:

Instruction_functionality_stage1

stage2:    

Instruction_functionality_stage2

}

Аргументы

Assembly_template - шаблон представления инструкции в ассемблере

 

OpCode_Descr – описание формата кода команды, см главу «Формат кода команды»

 

disasm – описание операций над аргументами (полями инструкции), на этапе дизассемблирования инструкции. Например, если имеется конструкция:

INST " $GRk = $GRi R>> $shift_arg;",(32, int3 Grk=gr,int5 shift_arg,…)

disasm

{

shift_arg = (shift_arg*(0 - 1)) & 31;

}

…то в функции дизассемблировании при нахождении кода, соответствующего инструкции «$GRk = $GRi R>> $shift_arg» перед генерации строки ассемблерной мнемоники аргумент shift_arg будет умножен на 0-1 по модулю 31.

 

Assembler – описание операций над аргументами (полями инструкции), на этапе ассемблирования инструкции. После того как текстовой представление инструкции распознано и сформирован образ инструкции в бинарном виде в поле assembler_directives можно задать операции модификации значений полей инструкций, например задать что значение старших 2-x битов поля X кода инструкции равны младшим битам поля Y:

assembler { X = (X&0x0F)|((Y&3)<<4); }

 

 

stage1,stage2 – имена ступеней конвейера исполнения инструкций.

 

 

Instruction_functionality_stageX – поведенческое описание команды на ступени конвейера stageX

 

Decode_instruction_functionality – поведенческое описание команды на этапе декодирования.

 

 

Формат кода команды

Код команды инструкции можно записать в одном из вариантов:

(Inst_size,

arg_size_1, argval_1 [ = List_or_iset],

arg_size_2, argval_2 [ = List_or_iset]

...

arg_size_N, argval_N RELOC_TYPE)

или

(Inst_size,

Type_1 argval_1[ = List_or_iset],

Type_2 argval_2 [ = List_or_iset],

...

Type_N argval_N [ = List_or_iset])

 

 

Inst_size – размер инструкции

arg_size_N - размер N- го аргумента в битах

argval_N – значение N-го аргумента.

Type_N – тип аргумента (вместо размера аргумента в битах). Допустимы только целочисленные типы int1 – intN.

 

Аргумент arg_val может быть представлен в одном из следующих форматов:

  1. В виде целочисленной константы, представленной в десятичном, шестнадцатеричном или двоичном виде
  2. В виде имени. В таком случае при описании семантики команды это имя можно использовать в качестве аргумента операции. В ассемблере данная конструкция будет представлена как численный аргумент команды
  3. В формате “name = list”, где name это имя аргумента инструкции (по аналогии с п.2) а list это название списка аргументов или массива регистров. В ассемблере данная конструкция будет представлена как ассемблерное имя одного из аргументов списка или в виде элемента массива регистров.
  4. В формате “name= iset”, где iset – имя ранее определенного набора инструкций. В ассемблере конструкция $name будет представлена как вложенная ассемблерная инструкция. На этапе декодирования, бинарный код, соответствующий полю name будет декодирован как вложенная инструкция. Такая вложенная инструкция декодируется в процессе декодирования основной инструкции и затем исполняется параллельно с основной. Это дает возможность строить иерархию наборов инструкций и организовывать «длинное» слово команды, которое (слово) включает в себя несколько параллельно исполняющихся инструкций.

 

Если аргумент arg_val представляется в виде целочисленной константы, то допустимо дополнительная спецификации типа релокации метки. Тип релокации метки определяет, как рассчитывать значение константы относительно адреса метки. В PPDL предусмотрено два типа релокации – абсолютная, при которой в код инструкции вставляется абсолютный адрес метки, и релокация относительно счетчика команд. Абсолютная релокация задается по умолчанию. Для задания относительной релокации используется ключевое слово RELOC_PC. Например, при описании аргумента

int32 branch_addr RELOC_PC

 

Адрес метки будет записан как смещение относительно адреса инструкции.

 

Пример описания формата инструкции

INST "ADD $1,$2,$3",

(32,

4,0,4,src1=r,4,src2=r,4,dst=r,4,0,12,0)

Функция Operate

Формат

       Operate

       {

       stage1:

                // operation routine

       stage2:

                   // operation routine

       }

Описание

Процедура Operate вызывается на каждый такт работы процессора. В ней описывается цикл загрузки и выполнения инструкций, а также обработчики прерываний.

 

Функции доступные в Operate

Помимо стандартных арифметических, логических операций, операций условного перехода и чтения\записи в память, в функции Operate доступен следующий набор вызовов для управления процессом декодирования и исполнения команд:

 

ISET_NAME.decode(inst) – функция декодирования инструкции из набора ISET_NAME. Здесь inst – это код инструкции. Функция decode возвращает размер декодированной команды в битах, или 0 если входное значение не может быть декодированно как команда.

 

ISET_NAME.iset_stage() - функция запускает ступень iset_stage конвейера набора инструкций ISET_NAME на исполнение. В случае, если на предыдущем такте инструкция не была декодирована, iset_stage не выполняет ни каких операций.

 

Пример

Operate

{

// первая ступень конвейера

ax:

// чтение кода команды

IR[0]= data[pc];

// инкрементация счетчика команду

       pc = pc+4;

// вторая ступень конвейера

bx:

   // декодирование инструкции

   liset.decode(IR[0]);

// исполнение ступени pa инструкции

   liset.pa;

   // третья ступень конвейера

dx:

   // исполнение ступени pb инстркукции

   liset.pb;

}

 

Функция RESET

Функция RESET вызывается при аппаратном сбросе процессора, то есть подачи внешнего сигнала RESET.

В функции RESET инициализируются регистры, переменные флаги и пр.

 

Пример:

RESET

{

pc = 0;

// инициализация адресных регистров

ar[0] = 0;

ar[1] = 0;

// регистры общего назначения

gr[0] = 0;

gr[1] = 0;

// регистры статуса

pswr = 0;

 

// инициализация ФИФО блоков

afifo.reset;

wfifo.reset;

IR.reset;

for (i = 0; i < 32; i = i + 1)

   vreg[i].reset;

}

 

Генерация ассемблера

Для генерации кода ассемблера (декодера инструкции) для встраивания в утилиту gnu assembler необходимо вызвать компилятор PPDL со следующими параметрами командной строки:

ppdl.exe dev_name.hdl – a out_file_name

 

Параметры:

dev_name.hdl – имя файла, содержащего PPDL-описание процессора

out_file_name – имя выходного файла (без расширения), содержащего набор функций для декодирования инструкций ассемблера

 

Генерация дизассемблера

Для генерации кода ассемблера (декодера инструкции) для встраивания в утилиту gnu assembler необходимо вызвать компилятор PPDL со следующими параметрами командной строки:

ppdl.exe dev_name.hdl – d out_file_name

 

Параметры:

dev_name.hdl – имя файла, содержащего PPDL-описание процессора

out_file_name – имя выходных файлов (out_file_name.h и out_file_name.cpp), содержащих описание С++ класс для описания дизассемблера.

 

       В сгенерированном дизассемблере следует использовать функцию:

char* disasm(char *bin,int& size);.

 

       Данная функция принимает на вход указатель на бинарный код команды и возвращает ассемблерную мнемонику команды и размер декодированной бинарной команды (в байтах) в переменную size.

Интерфейс симулятора

 

Любой симулятор, генерируемый программой ppdl – это класс, унаследованный от стандартного класса tDevice. Класс tDevice имеет стандартный интерфейс, предоставляющий отладчику возможность управлять процессом выполнения программного кода на процессоре. В данной главе приведены некоторые функции класса tDevice, использующиеся для работы с отладчиком.

 

1.3 tDProcCfg* GetCfg()

Функция возвращает указатель на структуру процессора tDProcCfg. Данная структура содержит информацию об архитектуре процессора. Список элементов данной структуры приведен в таблице:

Название описание
int nreg; Количество внешних регистров процессора
const tDRegister *regs Массив описания регистров
int nbuses Количество шин памяти процессора
сonst tDMemBus *bus Массив структур tDMemBus, описывающие параметры шины
int nflags Количество флагов процессора
tDFlag *flags Массив структур tDFlag описывающих параметры флагов

 

 

В следующей таблице приведены элементы структуры tDRegister

Название Описание
const char *name Ассемблерное имя регистра
int type Тип регистра
int arrsize Размер массива регистра (0, если определен не массив регистров)

 

 

В следующей таблице приведены элементы структуры tDMemBus

Название Описание
const char *name Имя шины
int asize Размер шины адреса в битах
int dsize Размер шины данных в битах

 

В следующей таблице приведены элементы структуры tDProcFlag

Название Описание
char   *name Имя флага
const tDRegister* regnum Указатель на регистр, который содержит данный флаг
int    bit Номер бита в регистре

 

 

1.4 void getmem(void *mem,int busnum,int addr,int size_in_words);

Функция копирует size _ in _ words слов из памяти процессора, подключенной к шине busnum по адресу addr в массив mem.

 

1.5 void setmem(void *mem,int busnum,int addr,int size_in_words);

Функция копирует size _ in _ words слов из массива mem в память процессора, подключенной к шине busnum по адресу addr

 

 

1.6 int DisAssembly(char *str,int busnum,int addr,int size);

 

Функция копирует в строку str дизассемблированный код подпрограммы по адресу addr памяти на шине busnum размером size слов в формате:  адрес инструкция шестнадцатеричный код команды.

 

 

1.7 int set_bp(unsigned long addr);

Функция устанавливает точку останова по адресу addr.

 

Возвращаемое значение

1 – если точка останова была поставлена

0 – в случае ошибки

 

1.8 int clear_bp(unsigned long addr)

Функция удаляет точку останова по адресу addr.

Возвращаемое значение

1 – если точка останова была успешно удалена

0 – в случае ошибки

 

1.9 int start();

Функция запускает симулятор на исполнение

Возвращаемое значение

1 – если симулятор был запущен на исполнение

0 – в случае ошибки

 

1.10int stop();

Функция останавливает работу симулятора

Возвращаемое значение

1 – если симулятор был успешно остановлен

0 – в случае ошибки

 

Int isRun()

Функция возвращает ненулевое значение, если симулятор запущен на исполнение, 0 в противном случае

 

Unsigned long getcount()

Функция возвращает значение счетчика тактов. Иными словами функция возвращает, сколько выполнено тактов процессора, с момента его (процессора) запуска.

 

 

Void reset()

Функция сбрасывает счетчик тактов процессора и инициализирует регистры в соответствии с описанием функции reset в PPDL.


 

Описание

Функция декодирует инструкцию opcode в соответствии с описанием набора инструкций ISET_NAME

 

Аргументы

ISET_NAME – имя набора инструкций

 

 

1.17void ISETNAME_exec_PIPENAME()

Аргументы

ISET_NAME – имя набора инструкций

PIPENAME – имя ступени конвейера

Описание

Функция выполняет ступень PIPENAME для текущей инструкции из набора ISET_NAME.

Void operate()

Описание

Функция эмулирует выполнение одной инструкции процессора начиная от чтения кода команды из памяти и до выполнения последней ступени конвейера. Данная функция генерируется в соответствии с описанием функции Operate на языке PPDL.

 

Язык PPDL

Руководство разработчика

 

Версия 1.0

 

ООО «РЕДА-Софт» 2005 – 2012. Все права защищены.


 

Содержание

Содержание. 2

1.  Условные обозначения. 5

2.  Используемые термины и аббревиатуры.. 6

Аббривеатуры.. 6

Термины языка PPDL.. 6

Ассемблерное имя. 6

Внутренние регистры (блоки ФИФО) 6

3.  Конструкции языка PPDL.. 6

1.1   Ключевые слова языка PPDL.. 6

1.2   Комментарии. 7

1.3   Константы.. 7

1.4   Имена. 8

1.5   Разделители. 8

1.1   Специальные символы ассемблера. 8

1.2   Директива препроцессора #define. 8

1.1   Директива препроцессора #include. 9

1.1   Директива препроцессора #ifdef. 9

4.  Описание элементов процессора на языке PPDL.. 9

1.2   Декларация архитекуры процессора. 9

Формат. 9

Аргументы.. 10

Примечание. 10

1.3   Описание регистров. 10

Формат. 10

Аргументы.. 10

Примеры.. 10

1.4   Описание блоков FIFO.. 11

Формат. 11

Аргументы.. 11

Примеры.. 11

1.5   Описание флагов. 11

Формат: 11

Аргументы: 11

Примеры.. 11

1.6   Описание шины памяти. 12

Формат. 12

Аргументы.. 12

Пример. 12

5.  Описание поведенческой модели процессора. 12

1.1   Операторы и операнды для описания поведения инструкций, массивов аргументов и функций 12

Арифметические и логические операции. 12

Операторы условного выполнения. 12

Операторы преобразования типов данных и преобразование к знаковому числу. 13

Оператор цикла for 13

Оператор ожидания следующего такта: wait 13

Оператор выбора switch/case. 13

Операторы обращения к битам и операторы объединения выражений. 14

Оператор конкатенации подвыражений. 14

Операторы блокировки и разблокировки регистров и FIFO.. 15

Wait - ожидание следующего такта. 15

Оператор idx – индекс списка или аргумента инструкции. 15

1.2   Конвейер. 16

Формат. 16

Аргументы.. 16

Описание. 16

Пример. 16

1.3   Набор инструкций. 16

Формат. 16

Аргументы.. 16

Описание. 16

1.4   Функции. 16

1.5   Массив аргументов инструкции. 16

Формат. 16

Аргументы.. 17

Пример. 17

1.6   Описание инструкций. 17

Формат. 17

Аргументы.. 17

Формат кода команды.. 18

Формат шаблона команды ассемблера. 19

Пример. 19

1.7   Функция Operate. 21

Формат. 21

Описание. 21

Функции доступные в Operate. 21

Пример. 21

1.8   Функция RESET. 22

Пример: 22

6.  Параметры вызова генератора симулятора ppdl.exe. 23

1.9   Генерация симулятора процессора. 23

1.10     Генерация ассемблера. 23

1.1   Генерация дизассемблера. 23

1.2   Генерация XML файла описания архитектуры.. 23

7.  Интерфейс симулятора. 24

1.3   tDProcCfg* GetCfg() 24

1.4   void getmem(void *mem,int busnum,int addr,int size_in_words); 24

1.5   void setmem(void *mem,int busnum,int addr,int size_in_words); 25

1.6   int DisAssembly(char *str,int busnum,int addr,int size); 25

1.7   int set_bp(unsigned long addr); 25

Возвращаемое значение. 25

1.8   int clear_bp(unsigned long addr) 25

Возвращаемое значение. 25

1.9   int start(); 25

Возвращаемое значение. 25

1.10     int stop(); 25

Возвращаемое значение. 25

1.11     int isRun() 26

1.12     int setreg(int rnum,int anum,unsigned long val) 26

1.13     unsigned long getreg(int nrnum,int anum) 26

1.14     unsigned long getcount() 26

1.15     void reset() 26

8.  Дополнительные функции симулятора, генерируемые автоматически. 27

1.16     void ISET_NAME_decode(unsigned long ocode) 27

Описание. 27

Аргументы.. 27

1.17     void ISETNAME_exec_PIPENAME() 27

Аргументы.. 27

Описание. 27

1.18     void operate() 27

Описание. 27

 

 


 

Условные обозначения

Жирным текстом обозначены ключевые слова языка PPDL, а также операторы языка.

Курсивом обозначены необязательные параметры конструкций PPDL, а также (при описании функций интерфейса симулятора) аргументы функций.


 

2. Используемые термины и аббревиатуры

Аббривеатуры

expr. – (expression) арифметическое или логическое выражение  

cond. – (condition) условие

 

Термины языка PPDL

Ассемблерное имя

Ассемблерное имя - имя ресурса для программирования операций с ним на языке ассемблера.

Внутренние регистры (блоки ФИФО)

Внутренние регистры (или блоки ФИФО) - это регистры процессора, которые используются для хранения внутренней информации о состоянии процессора и недоступные для программирования. При описании таких регистров в PPDL их ассемблерное имя должно быть пропущено, а значения этих регистров не будут отображаться в отладчике.

 

Конструкции языка PPDL

 

Язык PPDL представляет собой простой язык для разработки микропроцессоров, позволяющий из единого описания генерировать симулятор, ассемблер (декодер мнемоник инструкций), дизассемблер и интерфейс для подключения к отладчику nm-gdb.

 

Ключевые слова языка PPDL

В таблице 1 приведен список зарезервированных ключевых слов, предназначенных для описания компонентов языка PPDL.

 

Ключевое слово Предназначение идентификатора
Device Определение нового ядра процессора
Reg Декларация регистра процессора
RegFifo Декларация ФИФО-блока
Flag Декларация флага процессора
MemSpace Декларация шины памяти (адресного пространства)
ArgList Декларация списка (множества) значений аргументов
ISET Декларация набора инструкций
INST Декларация инструкции
PIPE Декларация конвейера
Operate Определение функции управления потоком
Var Декларация переменной
Mutable Признак регистра или переменной: регистр (переменная) имеет дополнительный бит – флаг блокировки
NULL Обозначение недопустимой кодировки в аргументе инструкции в списке аргументов
Func Идентификатор функции
intN(int1,int2,…int128) Типы данных или возвращаемого значения функции
float, double Типы данных переменных с плавающей точкой
for Оператор цикла
if, else Операторы условного выполнения
switch, case Операторы выбора 
while Оператор цикла по условию (повторять, пока условие выполняется)
break Оператор
return  
RESET Функция начальной инициализации процессора. Выполняется при сбросе (подачи сигнала reset) на вход процессора
assembler Операции над аргументами (проверка или преобразование), выполняемые ассемблером после парсинга определенной инструкции
disasm Операции над аргументами (проверка или преобразование), выполняемые дизассемблером после распознавания инструкции, но перед генерации мнемоники инструкции.

 

       Не допускается использовать ключевые слова в качестве имен переменным, регистрам, функциям, аргументам и пр. При задании ключевого слова в качестве имени будет выдана ошибка «Unexpected token XXX».

 

Комментарии

В PPDL как и в языке С предусмотрено два типа комментариев, однострочные и много-строчные. Однострочные компиляторы начинаются символами «//» и заканчиваются концом «конец строки». Многострочные комментарии начинаются символами “/*” и заканчиваются символами «*/»

 

Пример:

       a+b; // это пример однострочного комментария

       /* пример многострочного

                   комментария */

 

Константы

Константы в PPDL могут задаваться в десятичном, шестнадцатеричном и или двоичном виде. Десятичные константы задаются последовательностью символов от «0» до «9». Пример: 2345

 



Поделиться:


Последнее изменение этой страницы: 2021-07-18; просмотров: 75; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.221.41.214 (0.445 с.)