Оптимизации АЛУ
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 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 по ходу дела.
В скрипте для сложения есть ошибка: округление нужно делать, если в процессе нормализации вправо РМР когда-либо был ненулевым, даже если в конце концов все единицы из него уехали.