vak: (Default)
[personal profile] vak
МЭСМ-6 уже проходит несколько тестов: работают команды uj, vtm, utm, mtj, vzm, v1m, j+m, vjm, vlm, utc, wtc.

Я добавил в фазу decode автоматическое приращение счётчика команд (PC), теперь некоторые команды выполняются за один такт (vtm, utm, mtj. j+m).

Описание микроархитектуры по мере разработки постепенно образуется на странице: https://github.com/besm6/mesm6/wiki/Microarchitecture
Page 1 of 3 << [1] [2] [3] >>

Date: 2019-03-12 18:52 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Команды UTC и WTC устанавливают значение регистра C, после остальных команд он сбрасывается в 0.

Не так просто. Регистр C может быть установлен командами UTC, WTC в любом режиме - при этом c_active присваивается 1, и командой ATI 16 в режиме супервизора; и сбрасывается в 0 всеми командами, отличными от UTC, WTC, при начале выполнения которых c_active был равен 1.

Date: 2019-03-12 20:30 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Я к тому, что если c_active установлен не был, то и C сбрасываться в 0 не должен.

Date: 2019-03-14 04:07 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Всё же UTC 0(0) - это абсолютный НОП, а другие две - условный НОП: только если C == 0.

Date: 2019-03-15 02:19 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
A+X, A-X, X-A, AMX вышли (в отдельной реализации) в общей сложности около 480 LUT, 185 FF, 104 full adders. Я сначала локально у себя протестирую.

AVX будет делаться в УУ путем условного выбора A-X или X-A в зависимости от знака операнда, и подаче 0 в качестве мантиссы операнда, и порядка сумматора в качестве порядка операнда, тогда нормализовывать вправо будет нечего.

Date: 2019-03-15 05:15 (UTC)
x86128: (Default)
From: [personal profile] x86128
Ух, параллельно пробую это всё нарисовать в Logisim-evolution. Там, конечно, глобальные изменения будут болезненно вноситься, но пока есть запал продолжать.

Date: 2019-03-15 05:16 (UTC)
x86128: (Default)
From: [personal profile] x86128
Если не трудно, можно пример чисел (выражения) когда необходима нормализация вправо.

Date: 2019-03-15 07:03 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Возможно, я неудачно выразился. Сдвиг мантиссы вправо перед выполнением операции - это, строго говоря, не нормализация, а выравнивание порядков.

А настоящая нормализация вправо бывает после выполнения операции только на 1 разряд.
Т. к. представление мантиссы - без скрытого бита, просто в дополнительном коде, то диапазон значений мантиссы - от -1 до 1-2-40. Поэтому, например, при изменении знака числа -1 (представленного как -1*20, 4020 0000 0000 0000) сначала получается псевдопредставление 1*20, которое нормализуется на 1 разряд вправо, и выходит 0.5*21 (4050 0000 0000 0000).

Date: 2019-03-15 07:20 (UTC)
x86128: (Default)
From: [personal profile] x86128
Теперь понятно. Спасибо за развернутый ответ.

Еще такой вопрос по общему алгоритму выполнения операций в АЛУ MESM6 с плавающими числами. Возможно я забегаю вперед.
Будет примерно как в IEEE754? То есть я имею ввиду порядок действий конечного автомата:
1. Защелкивание аргументов
2. Распаковка (порядки / мантиссы на регистры)
3. Отработка спец. случаев (сложение/умножение на 0, деление на 0, возможно еще что-то)
4. Выравнивание порядков
5. Отработка выхода порядков за пределы
6. Выполнение операций с мантиссой
7. Нормализация
8. Округление (регистр Y /РМР )
9. Упаковка
10. Выдача на выходной регистр АСС и РМР (Y)

Date: 2019-03-15 17:53 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Благодаря тому, что распаковка тривиальна (разве что размножить знаковые биты), распаковка и защелкивание объединены. Специальные случаи пока не отрабатываются. Для сложения, строго говоря, и не должны, поскольку результат сложения не-нуля с нулём при имеющемся алгоритме зависит от соотношения порядков нуля и ненулевого операнда.

Умножение я надеюсь делать с помощью аппаратного умножителя, поэтому распознавание нуля много тактов не сэкономит.

В остальном всё практически так и есть (кроме упаковки, которая тривиальна).

Оригинальный алгоритм деления я не буду пытаться воспроизводить, скопирую из эмулятора.

Date: 2019-03-18 16:15 (UTC)
x86128: (Default)
From: [personal profile] x86128
Наваял альфа-версию компилятора микрокода для logisim версии МЭСМ-6. На языке Crystal (можно довольно легко переделать на python). В logisim есть ограничение на максимальную ширину регистра, памяти и т.д. в 32-бита (поэтому придется немного мудрить и отходить от исходного варианта на SystemVerilog). Падает от любого синтаксического чиха, поэтому пока причесываю.
Идея немного похожа на микрокод микро-бэсм:
На входе файл

; uop field definitions
field imm 9
; src selector for write input of M registers
field sel_md 3 pc acc reg reg_plus1 reg_minus1 va ua
; write M flag
field w_m 1

; microcode word layout
uword imm sel_md w_m

vector reset
op w_m

opcode xta 0
op sel_md acc imm 10
op imm 511
op w_m
op imm 5

opcode uj 67
op imm 123 w_m


Получается такой выхлоп

Lines processed: 21
Fields:
{"imm", Field(@name="imm", @sz=9, @selectors={})}
{"sel_md", Field(@name="sel_md", @sz=3, @selectors={"pc" => 0, "acc" => 1, "reg" => 2, "reg_plus1" => 3, "reg_minus1" => 4, "va" => 5, "ua" => 6})}
{"w_m", Field(@name="w_m", @sz=1, @selectors={})}
UWord layout: {"imm" => 0, "sel_md" => 9, "w_m" => 12}
UWord size: 13 bits
Vectors:
{"reset", 0}
{"xta", 1}
{"uj", 5}
Jump table 16:
0: 0
1: 0
2: 0
3: 5
4: 0
5: 0
...
Jump table 64:
0: 1
1: 0
2: 0
3: 0
4: 0
5: 0
6: 0
...
ROM:
1000000000000
0001000001010
0000111111111
1000000000000
0000000000101
1000001111011
0000000000000
0000000000000
0000000000000
0000000000000
0000000000000


Далее хочу начать рисовать провода :) в logisim вокруг секвенсера микрокода.

Date: 2019-03-18 19:30 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Для простоты, значит, между операциями будет пустой такт? Ладно. :)

Попробуй для примера переписать ARX в двухтактном виде.
Edited Date: 2019-03-18 19:34 (UTC)

Date: 2019-03-18 20:08 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
ОК, тогда я сделаю state machine, как мне удобно.

Кстати, AAX и AOX обнуляют Y, а AEX делает Y := ACC. :) Тесты это не проверяют?

Date: 2019-03-18 22:09 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Не придется. С точки зрения АУ это будет просто AEX 0, а раз режимы живут в УУ, то сохранение текущего режима (в отличие от настоящего AEX, устанавливающего логическую группу) не требует никаких дополнительных сигналов в АУ.
Но тогда придется тащить какой-то сигнал, указывающий, как делать YTA.
Edited Date: 2019-03-18 22:49 (UTC)
Page 1 of 3 << [1] [2] [3] >>