Оптимизации АЛУ
Apr. 8th, 2019 12:37 pmПосле переписывания дорогих команд сборки, разборки и сдвига в многотактный вид и исправления нормализации вправо инвертированных мантисс (прибавлять младший бит инверсии можно по ходу нормализации, и в окончательном суммировании РМРу участвовать больше не нужно) всё стало гораздо компактнее:
Коммит будет сегодня вечером.
There are 31 levels of combinational cells
2-input LUTs: 309
3-input LUTs: 231
4-input LUTs: 228
5-input LUTs: 375
6-input LUTs: 726
Total LUT area: 1869
State : 204
(FF) : 204
CARRY4 : 132
DSP : 6
Коммит будет сегодня вечером.
no subject
Date: 2019-04-08 07:54 pm (UTC)Вот твои старые оценки для микро-БЭСМ, для сравнения:
с микрокодом в логике: 15771 LUT, 5166 FF;
с микрокодом в блочной памяти: 9904 LUT, 10 BRAM.
Но это всё вместе, не только АУ.
no subject
Date: 2019-04-08 08:27 pm (UTC)А если реализовать сложение, умножение и деление с помощью двухрядного кода (желательно, предварительно поняв, как именно работало деление без сравнения абсолютных значений мантисс),
то CARRY4 и DSP пропадут, и останутся считаные сотни LUTs.
no subject
Я когда увидел конструции в pack/unpack и умножение как $signed * $signed только и изумился: "А что так можно было?!! 😂 😂". Но для RTL модели ведь можно, верно?
А дальше уже когда к железу "как в БЭСМ6" ближе спускаться, можно и убрать.
Я потому скрипт для сложения и сделал, пытаясь разобраться с тем как это было в самой БЭСМ реализовано (хотя и не точно).
Но вот с умножением получился пока затык, читаю книги с теорией и практикой реализации 2's compl умножителей в железе, вижу что в БЭСМ6 алгоритм Бута, но он какой-то модифицированный. Сам алгоритм придумали в 1951 году, поэтому "наши" о нём 100% знали, но улучшили.
Вот нашел, что есть еще один интересный вариант реализации умножения когда пропускаются повторяющиеся биты в множителе.
Постараюсь сделать python скрипт.
no subject
Date: 2019-04-09 06:23 am (UTC)В БЭСМ-6 хитрость: умножение на 2 разряда делается за полтакта благодаря тому, что есть защелки по обоим фронтам тактового сигнала, поэтому произведение двигается вправо на 4 разряда за такт (в формулах АУ это видно). Но нам спешить особо некуда, можно и по 2 разряда за такт.
Кстати, сейчас флаг sticky правильно отражает необходимость округления для сложения, и сравнение rmr с нулем в STATE_ROUND нужно только для умножения. Когда умножение будет делаться пошагово, можно будет устанавливать sticky по ходу дела.
В скрипте для сложения есть ошибка: округление нужно делать, если в процессе нормализации вправо РМР когда-либо был ненулевым, даже если в конце концов все единицы из него уехали.
no subject
Date: 2019-04-08 11:47 pm (UTC)Механизм прерываний может быть, например, такой: при возбуждении любого прерывания формируется слово: 15-1рр: М20, 30-16рр - адрес возврата, 47-42рр - режимы, 48р - признак правой команды, остальное - для маски прерываний. С этим словом выполняется как бы ЗП (М17).
ВЫПР, соответственно, будет работать как бы как МОД + РЖ + еще кое-что. Магазинность аналогична МОД.
no subject
Date: 2019-04-09 05:41 am (UTC)Не хотелось бы при прерывании трогать стек пользователя, и вообще ходить в память. Мы как-то уже обсуждали на Гитхабе: https://github.com/besm6/mesm6/issues/3#issuecomment-475087151
Есть идея ввести для режима прерываний/экстракодов отдельный набор регистров K[1]...K[15]. В режиме пользователя (после ВЫПР) возможны обращения только к M[1]...M[15]. При переключении в режим прерываний обращения идут к регистрам K[1]...K[15]. Из режима прерываний можно читать-писать регистры пользователя командами ITA/ATI, обращаясь к ним как к регистрам K[17]...K[31].
Преимущества:
Обработчики прерывания имеют отдельный стек, задаваемый регистром K[15].
Не надо упрятывать регистры в стеке. Ускоряется обработка прерываний. Достаточно упрятать сумматор и РМР.
Не нужны дополнительные регистры для сохранения информации о прерывании. Например, прерванный счётчик команд PC прячется в K[1], регистр режимов пользователя - в K[2], исполнительный адрес экстракода - в K[3].
no subject
Date: 2019-04-09 06:11 am (UTC)no subject
Date: 2019-04-09 06:16 am (UTC)Что делать с текущим К1 при вызове вложенного экстракода?
Можно сделать Экстракоды так чтобы они всегда выталкивали полный текущий PC_next по адресу [K15--], а команда ВЫПР возвращалась на [++K15]. При необходимости, программное выталкивание К2, К3 прописать в "соглашении о программных вызовах".
no subject
Date: 2019-04-09 07:05 am (UTC)Напомню, что стек в БЭСМ-6 растёт в сторону увеличения адресов, и 15-й регистр указывает на первую свободную ячейку стека. Поэтому push - это присваивание mem[M15++], а pop - это чтение из mem[--M15].
no subject
Date: 2019-04-10 04:57 am (UTC)no subject
Date: 2019-04-10 01:45 pm (UTC)Есть мысль, чтобы процессор ходил в память через арбитр как в БЭСМ6, что позволит реализовать подсистемы блочного ввода/вывода с SD-карты, Ethernet (через шилд от ардуины), UART (протокол похожий на SLIP). Обращение к регистрам ввода/вывода сделать через команду УВВ (033), запрет/разрешение прерываний по маске через РЕГ 002.
no subject
Date: 2019-04-10 04:55 am (UTC)