nabbla (nabbla1) wrote,
nabbla
nabbla1

Categories:

Обновлённая таблица команд QuatCore

Раньше я рисовал таблицу команд тупо в Excel'е или вообще в тетрадке у себя. Затем вбивал соответствие между именем команды и её кодом в файл конфигурации транслятора. Решил что-то подправить - вносишь изменения в код на верилоге ("аппаратная часть" процессора), а также в таблицу и в файл конфигурации.

Сейчас, чтобы транслятор мог обнаружить всевозможные "враждебные маршруты", Hazard'ы, когда половинки команд конфликтуют между собой, понадобилось сообщить ему гораздо больше информации о командах, чем просто пары "имя - код команды". Нет худа без добра - теперь транслятор самостоятельно может построить таблицы команд, сейчас он сохраняет её в HTML-файл. Нечто такое:

SrcAddr


Адрес +0 +1 +2 +3 +4 +5 +6 +7
00
0

1

2

3

4

5

6

7
08
8

9

10

11

12

13

14

15
10
16

17

18

19

20

21

22

23
18
24

25

26

27

28

29

30

31
20
32

33

34

35

36

37

38

39
28
40

41

42

43

44

45

46

47
30
48

49

50

51

52

53

54

55
38
56

57

58

59

60

61

62

63
40
-64

-63

-62

-61

-60

-59

-58

-57
48
-56

-55

-54

-53

-52

-51

-50

-49
50
-48

-47

-46

-45

-44

-43

-42

-41
58
-40

-39

-38

-37

-36

-35

-34

-33
60
-32

-31

-30

-29

-28

-27

-26

-25
68
-24

-23

-22

-21

-20

-19

-18

-17
70
-16

-15

-14

-13

-12

-11

-10

-9
78
-8

-7

-6

-5

-4

-3

-2

-1
80
Acc

Acc

UAC

C

Acc

Acc

UAC

C
88
Acc

Acc

UAC

C

Acc

Acc

UAC

C
90
IN

IN

IN

IN

IN

IN

IN

IN
98
[ER++]

[ER++]

[ER++]

[ER++]

[ER++]

[ER++]

[ER++]

[ER++]
A0
i

j

k

Inv

i

j

k

Inv
A8
i

j

k

Inv

i

j

k

Inv
B0
CALL0

CALL1

CALL2

CALL3

CALL4

CALL5

CALL6

CALL7
B8
CALL8

CALL9

CALLA

CALLB

CALLC

CALLD

CALLE

CALLF
C0
[X+1]

[X+2i+1]

[X+2j+1]

[X+4j+1]

[X+i]

[X+3i]

[X+2j+i]

[X+4j+i]
C8
[X+k]

[X+2i+k]

[X+2j+k]

[X+4j+k]

[X+i^j]

X

[X+2j+i^j]

[X+4j+i^j]
D0
[Y+1]

[Y+2i+1]

[Y+2j+1]

[Y+Treug[j]+1]

[Y+i]

[Y+3i]

[Y+2j+i]

[Y+Treug[j]+i]
D8
[Y+k]

[Y+2i+k]

[Y+2j+k]

[Y+Treug[j]+k]

[Y+i^j]

Y

[Y+2j+i^j]

[Y+Treug[j]+i^j]
E0
[Z+1]

[Z+2i+1]

[Z+2j+1]

[Z+4j+1]

[Z+i]

[Z+3i]

[Z+2j+i]

[Z+4j+i]
E8
[Z+k]

[Z+2i+k]

[Z+2j+k]

[Z+4j+k]

[Z+i^j]

Z

[Z+2j+i^j]

[Z+4j+i^j]
F0
[SP+1]

[SP+2i+1]

[SP+2j+1]

[SP++]

[SP+i]

[SP+3i]

[SP+2j+i]

[i-1+SP++]
F8
[SP+k]

[SP+2i+k]

[SP+2j+k]

[--SP+k]

[SP]

SP

[SP+2j]

[--SP]


Далее ещё таблица DestAddr.

DestAddr


Адрес +0 +1 +2 +3 +4 +5 +6 +7
00
OUT

OUT

OUT

OUT

OUT

OUT

OUT

OUT
08
OUT

OUT

OUT

OUT

OUT

OUT

OUT

OUT
10
OUT

OUT

OUT

OUT

OUT

OUT

OUT

OUT
18
OUT

OUT

OUT

OUT

OUT

OUT

OUT

OUT
20
SIO

SIO

SIO

SIO

SIO

SIO

SIO

SIO
28
SIO

SIO

SIO

SIO

SIO

SIO

SIO

SIO
30
SIO

SIO

SIO

SIO

SIO

SIO

SIO

SIO
38
SIO

SIO

SIO

SIO

SIO

SIO

SIO

SIO
40
ERL

ERL

ERL

ERL

ERL

ERL

ERL

ERL
48
ERL

ERL

ERL

ERL

ERL

ERL

ERL

ERL
50
ERH

ERH

ERH

ERH

ERH

ERH

ERH

ERH
58
ERH

ERH

ERH

ERH

ERH

ERH

ERH

ERH
60
[ER++]

[ER++]

[ER++]

[ER++]

[ER++]

[ER++]

[ER++]

[ER++]
68
[ER++]

[ER++]

[ER++]

[ER++]

[ER++]

[ER++]

[ER++]

[ER++]
70
[ER++]

[ER++]

[ER++]

[ER++]

[ER++]

[ER++]

[ER++]

[ER++]
78
[ER++]

[ER++]

[ER++]

[ER++]

[ER++]

[ER++]

[ER++]

[ER++]
80
Acc

PM

ADD

SUB

ABS

ABSPM

ABSA

ABSS
88
ZACC

NOP

C

C

DIV2

CDIV2PM

DIV2A

DIV2S
90
MUL

FMPM

FMA

FMS

MULSU

SUFMPM

SUFMA

SUFMS
98
MULU

UFMPM

UFMA

UFMS

SQRD2

SQRPMD2

SQRAD2

SQRSD2
A0
i

j

k

Inv

i++

j++

k++

ijk
A8
iLOOP

jLOOP

kLOOP

Jik

iLoopUp

jLoopUp

kLoopUp

JNik
B0
JMP

JMP

JMP

JMP

JMP

JMP

JMP

JMP
B8
JL

JL

JO

JO

JGE

JGE

JNO

JNO
C0
[X+1]

[X+2i+1]

[X+2j+1]

[X+4j+1]

[X+i]

[X+3i]

[X+2j+i]

[X+4j+i]
C8
[X+k]

[X+2i+k]

[X+2j+k]

[X+4j+k]

[X+i^j]

X

[X+2j+i^j]

[X+4j+i^j]
D0
[Y+1]

[Y+2i+1]

[Y+2j+1]

[Y+Treug[j]+1]

[Y+i]

[Y+3i]

[Y+2j+i]

[Y+Treug[j]+i]
D8
[Y+k]

[Y+2i+k]

[Y+2j+k]

[Y+Treug[j]+k]

[Y+i^j]

Y

[Y+2j+i^j]

[Y+Treug[j]+i^j]
E0
[Z+1]

[Z+2i+1]

[Z+2j+1]

[Z+4j+1]

[Z+i]

[Z+3i]

[Z+2j+i]

[Z+4j+i]
E8
[Z+k]

[Z+2i+k]

[Z+2j+k]

[Z+4j+k]

[Z+i^j]

Z

[Z+2j+i^j]

[Z+4j+i^j]
F0
[SP+1]

[SP+2i+1]

[SP+2j+1]

[SP++]

[SP+i]

[SP+3i]

[SP+2j+i]

[i-1+SP++]
F8
[SP+k]

[SP+2i+k]

[SP+2j+k]

[--SP+k]

[SP]

SP

[SP+2j]

[--SP]


Адреса многих команд декодируются не целиком, некоторые биты игнорируются, тогда можно дать разные адреса и получить один и тот же результат. Сейчас для каждой команды я указываю не только её код, но ещё и маску, указывающую, на какие биты реагирует процессор. И транслятор автоматически заполняет все ячейки в таблице, которые, пропущенные через эту маску, дают тот же код команды. Такие ячейки здесь выделены серым.

Транслятор проверяет "накладки", когда несколько команд (с учётом маски) занимают один и тот же код, и наоборот, скажет, какие коды вдруг оказались незадействованными.

Это позволило довольно быстро заполнить таблицы целиком, все 256 значений и для SrcAddr, и для DestAddr.

Наконец-то разобрался, что делают "недокументированные" команды из QuatCorePC. Я назвал их iLoopUp, jLoopUp, kLoopUp.
"Обычная" команда iLOOP проверяет условие i>0, и если оно выполнено, уменьшает i на единицу и осуществляет переход по относительному адресу. iLoopUp проверяет условие i<31, и если оно выполнено, увеличивает i на единицу и осуществляет переход по относительному адресу. В общем-то, мне такое вполне может пригодиться! Бывает же, что итерации надо выполнять в определённом порядке, строго "сверху вниз", а где-то "снизу вверх" - так происходит, если мы делаем какие-нибудь матричные преобразования "на месте", где результат одних вычислений сразу же используется в последующих. Правильно задав базовые регистры X,Y,Z, мы вполне сможем организовать цикл на сколько надо итераций, с ростом i,j,k.

В итоге получается довольно приятная картина. Адреса SrcAddr заняты весьма плотненько, уникальных команд здесь 217 штук :) DestAddr местами упакован очень плотно - имеем 32 вполне себе законных команды для АЛУ и 64 команды для модуля памяти. Да, часть этих команд вряд ли будет использована, поскольку тоже получились в результате "декартова умножения" функций. Мы решили, что два бита адреса управляют мультиплексором базового адреса, ещё два - первым индексным мультиплексором, и ещё два - вторым - вот и получили (22)3 = 64 разных команды разной степени полезности, но где-то половина наверняка будет применена, тоже неплохо!
Первая половина адресного пространства DestAddr почти пустует - всего 5 команд на 128 адресов, и это при "полном фарше", когда у нас и внешняя статическая память подключена, и целый зоопарк периферии. Не знаю, может быть, мы могли бы чуть упростить декодирование, если бы отдали побольше адресного пространства в АЛУ, модуль памяти и счётчик инструкций. Но, думаю, особой разницы нет - в конце концов, речь об ОДНОМ БИТЕ.

При желании можно даже организовать гиперссылки с каждой команды из таблицы на её описание - и будет у меня наконец-то приличная документация.

Далее, я хочу, чтобы эта таблица ещё раскрашивалась в разные цвета после трансляции конкретной программы - нам бы показали, какие команды вообще фигурируют в коде? Ожидаю увидеть довольно разрозненные "прорехи", которые не позволят упростить декодирование ни на бит :)
Tags: ПЛИС, программки, работа, странные девайсы
Subscribe

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 0 comments