Часть УУ работает
2019-03-12 11:06МЭСМ-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
Я добавил в фазу decode автоматическое приращение счётчика команд (PC), теперь некоторые команды выполняются за один такт (vtm, utm, mtj. j+m).
Описание микроархитектуры по мере разработки постепенно образуется на странице: https://github.com/besm6/mesm6/wiki/Microarchitecture

no subject
Date: 2019-03-12 18:52 (UTC)Не так просто. Регистр C может быть установлен командами UTC, WTC в любом режиме - при этом c_active присваивается 1, и командой ATI 16 в режиме супервизора; и сбрасывается в 0 всеми командами, отличными от UTC, WTC, при начале выполнения которых c_active был равен 1.
no subject
Date: 2019-03-12 19:44 (UTC)Команды UTC и WTC заканчиваются микрокомандой decode с установленным битом c_active, поэтому после них регистр С задействуется. Остальные команды заканчиваются decode без признака c_active, и регистр С не влияет на следующий Vaddr.
ATI в режиме супервизора нетрудно будет добавить. Вообще есть идея сделать отдельный набор регистров для обработчика прерываний, включая стек. Сохранять совместимость с БЭСМ не требуется.
no subject
Date: 2019-03-12 20:30 (UTC)no subject
Date: 2019-03-12 20:49 (UTC)no subject
Date: 2019-03-14 03:14 (UTC)no subject
Date: 2019-03-14 04:07 (UTC)no subject
Date: 2019-03-14 18:31 (UTC)no subject
Date: 2019-03-15 02:19 (UTC)AVX будет делаться в УУ путем условного выбора A-X или X-A в зависимости от знака операнда, и подаче 0 в качестве мантиссы операнда, и порядка сумматора в качестве порядка операнда, тогда нормализовывать вправо будет нечего.
no subject
Date: 2019-03-15 03:09 (UTC)А я пока запутался с ITA. Похоже, придётся переделать мультиплексор адресов для M[i] и M[j]. С нынешним ничего не получается.
no subject
Date: 2019-03-15 05:15 (UTC)no subject
Date: 2019-03-15 05:16 (UTC)no subject
Date: 2019-03-15 05:23 (UTC)Доделаю ITA, и после этого наверное совсем уж больших изменений не ожидается. Регистр режимов добавится и группы операций.
no subject
Date: 2019-03-15 07:03 (UTC)А настоящая нормализация вправо бывает после выполнения операции только на 1 разряд.
Т. к. представление мантиссы - без скрытого бита, просто в дополнительном коде, то диапазон значений мантиссы - от -1 до 1-2-40. Поэтому, например, при изменении знака числа -1 (представленного как -1*20, 4020 0000 0000 0000) сначала получается псевдопредставление 1*20, которое нормализуется на 1 разряд вправо, и выходит 0.5*21 (4050 0000 0000 0000).
no subject
Date: 2019-03-15 07:20 (UTC)Еще такой вопрос по общему алгоритму выполнения операций в АЛУ MESM6 с плавающими числами. Возможно я забегаю вперед.
Будет примерно как в IEEE754? То есть я имею ввиду порядок действий конечного автомата:
1. Защелкивание аргументов
2. Распаковка (порядки / мантиссы на регистры)
3. Отработка спец. случаев (сложение/умножение на 0, деление на 0, возможно еще что-то)
4. Выравнивание порядков
5. Отработка выхода порядков за пределы
6. Выполнение операций с мантиссой
7. Нормализация
8. Округление (регистр Y /РМР )
9. Упаковка
10. Выдача на выходной регистр АСС и РМР (Y)
no subject
Date: 2019-03-15 17:53 (UTC)Умножение я надеюсь делать с помощью аппаратного умножителя, поэтому распознавание нуля много тактов не сэкономит.
В остальном всё практически так и есть (кроме упаковки, которая тривиальна).
Оригинальный алгоритм деления я не буду пытаться воспроизводить, скопирую из эмулятора.
no subject
Date: 2019-03-18 07:34 (UTC)no subject
Date: 2019-03-18 16:15 (UTC)Идея немного похожа на микрокод микро-бэсм:
На входе файл
; 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 вокруг секвенсера микрокода.
no subject
Date: 2019-03-18 19:30 (UTC)Попробуй для примера переписать ARX в двухтактном виде.
no subject
Date: 2019-03-18 19:34 (UTC)Когда всё заработает, можно будет подумать насчёт оптимизации.
no subject
Date: 2019-03-18 19:56 (UTC)Ограничение на 32 бита смотрится странно. Интел уже двенадцать лет не выпускает 32-битные процессоры.
А зачем переписывать генератор микрокода? Проще конвертировать выход имеющегося генератора.
no subject
Date: 2019-03-18 20:08 (UTC)Кстати, AAX и AOX обнуляют Y, а AEX делает Y := ACC. :) Тесты это не проверяют?
no subject
Date: 2019-03-18 21:01 (UTC)Трудность с UZA и U1A: они тоже должны ставить Y := ACC, но поскольку они выполняются в УУ, они не могут влиять на регистр Y, который находится в АУ. Может быть придётся специальный сигнал тащить в АУ для этого.
no subject
Date: 2019-03-18 21:10 (UTC)no subject
Date: 2019-03-18 21:43 (UTC)Переписал: https://github.com/besm6/mesm6/commit/439921d93bd9d618ebb5ade64b38186c0e81d503
no subject
Date: 2019-03-18 22:09 (UTC)Но тогда придется тащить какой-то сигнал, указывающий, как делать YTA.