Как я делал лучшие арифметические ядра и сделал лучший селектор (демультиплексор)

С чего все началось

Я прочитал статью о позиционном кодировании (one-hot), которое работает быстрее для конечных автоматов.

Я сделал генераторы всех базовых арифметических и логических команд для любой разрядности, но оказалось, что я получу преимущество только если буду использовать логические элементы с транзисторами, спроектированные на другой уровень FO(Fan Out, не FO-4).

Но получил самый быстрый способ реализовать любую 2-4-битную функцию. (последовательный сумматор, работающий так же быстро, как сумматор с опережением переноса). Так что я создал селектор :)

Декодеры адресов DRAM/SSD и что о них можно прочитать

Ну, это разочаровывает. Вся информация о дешифраторах адресов памяти выглядит так:

  1. Ссылка 1

    (Демультиплексор NOR с N транзисторами на строку на N бит адреса, FanOut - M/2, где M - количество линий)

  2. Ссылка 2

    (Демультиплексор NAND с N транзисторами на строку на N бит адреса, FanOut - M/2, где M - количество линий)

  3. Ссылка 3

    (Что называется Еще хуже, "мы сделали предекодинг и уменьшили нагрузку до 64 затворов на линию")

Типичный демультиплексор (декодер адреса) (вариант для 2-х бит, не 4 и не 8 :) )
Типичный демультиплексор (декодер адреса) (вариант для 2-х бит, не 4 и не 8 :) )

И все в таком духе.

По сути, более 4–10 затворов на одной линии — плохая практика. Затворы ячеек DRAM, "Висящие в воздухе" и затворы транзисторов, подключенных к питанию\земле очень сильно различаются по уровню емкостной нагрузки на линию (в общем, при переходе от FO-4 к FO-64 задержку нужно увеличить в 16 раз, или уже 16 задержек FO-4 и это только на 256 линий (не 65536)). Так же следует учесть что некоторые транзисторы могут просто не поддерживать высокие емкостные нагрузки (из-за дополнительно выделяемого тепла при переходных процессах).

Поэтому я ограничился двумя транзисторами на строку для любой разрядности адреса.

Как?

Все просто: бинарное дерево с разветвлением 4 или 16, где каждый селектор включает только один селектор после себя и транслирует оставшийся адрес к нему.

Но прежде всего нам нужно преобразовать наш бинарный адрес в One-hot(унарную позиционную) кодировку.

После этого мы просто пишем дерево селекторов.

Почему это сработало?

Вместо энкодеров строк NOR и NAND мы получаем постоянный коэффициент ветвления (4 или 16) и низкую емкостную нагрузку.

Также мы получаем низкую логическую глубину в селекторе.

И в результате мы получаем возмутительно высокую скорость (сравнимую со скоростью сумматора со сквозным переносом с той же разрядностью). И низкое энергопотребление (около 40 переключений транзисторов для 16 бит)

Кроме того, мы получаем только 1–2 транзистора на строку для любой разрядности адреса (!).

Как я могу сравнить это с тем что есть?

Задержка в 13 FO-4 для 16-тибитного селектора(65536 линий), или меньше чем в ucdavis 16 FO-4 (256 линий).

Это около 20 ps на 7 nm для 16 bit (65k lanes) или около 40 ps для селектора строк и столбцов (32-битное адресное пространство). Или более 5 ГГц. Плюс переходные процессы в линиях и так далее.

В любом случае, это намного быстрее, чем селекторы NOR/NAND, и потребляет меньше энергии (переключение около 40 транзисторов; чтобы получить 1 Вт, нужно переключать около 5 миллионов транзисторов на частоте 1 ГГц на 32 nm).

Добавил сравнение с самым быстрым селектором 8-bit из ucdavis. В случае с равной скоростью получаю на 20% меньшую площадь, что само по себе различимый результат.

Забавный пример — на хранение результата сложения может уйти больше энергии, чем на сложение. Вот почему каждый институт из топ-50 имеет свою собственную исследовательскую программу топологической сортировки и маппинга операций для FPGA). (С «выдающимися результатами, которые лучше, чем у любого ОБОРУДОВАНИЯ СЕГОДНЯ», конечно). И почти полное отсутствие арифметических блоков «AddMulJmpe» на частоте 1–2 ГГц. (За исключением MantiCore(ethz) и некоторых команд ARM, но, согласно публикациям, это скорее Волшебство (также известное как дерево шин 8 Тбит/с), чем парадигма Compute More Store Less)

Где я могу посмотреть результаты?

Как и в случае с методом глобальной оптимизации, который лучше, чем в Matlab, результаты синтеза можно посмотреть здесь.

Результаты включает в себя синтез на 130 nm, обзор характеристик для различных параметров синтеза, а так же общие сводки с результатами.

Использованные материалы

1) MantiCore - ethz

2) Изображение - https://www.elprocus.com/different-types-of-demultiplexers/

3) Синтез - OpenLane

@ValeriyPus
09.05.2023 13:59 UTC
Первоисточник

Комментарии

@maximw
09.05.2023 10:47 UTC
+4

Уровень сложности средний. Это для хардкорных железячников средний уровень?

@ValeriyPus
11.05.2023 05:55 UTC
+1

Увы, большинство задач в исследованиях и разработке электроники:

  1. написать прототип на verilog

  2. провести синтез, оценить результат

    Если результат устроил:

  3. сделать генератор с параметрами (на python или любом другом языке), который пишет это на verilog.

В сравнении с самыми быстрыми селекторами я получил на 20% меньшую площадь.

Да, это немного уровень PhD :)

@akostrikov
18.05.2023 11:10 UTC
0

Это возмутительно лучший средний уровень для самых лучших 16-тибитных железячников.

@punzik
11.05.2023 19:26 UTC
0

Чёт я ничего не понял.

Но прежде всего нам нужно преобразовать наш бинарный адрес в One-hot(унарную позиционную) кодировку.

Но не в этом ли смысл декодера?

Вообще, неплохо было бы поподробней рассказать про всё это. Более обстоятельно, а не в стиле поста в телеге.

PS: кажется я понял, о чём текст. О ветвлении того самого сигнала DATA на схеме "типичного демультиплексора"?

@ValeriyPus
12.05.2023 08:28 UTC
-1

Но не в этом ли смысл декодера?

Почитайте презентацию (3) ucdavis. Последние 5-6 слайдов.

PS: кажется я понял, о чём текст. О ветвлении того самого сигнала DATA на схеме "типичного демультиплексора"?

Нет. Есть множество демультиплексоров, я сделал лучший (лучше чем у Пиндосов в Калифорнии).

12.05.2023 09:21 UTC
0

А чем первый вариант (12 бит) отличается от версии с преселектором?

12.05.2023 11:08 UTC
0

И чем остальные варианты отличаются от demultiplexer tree? Из кода сложно понять, вы бы схему нарисовали.

12.05.2023 11:31 UTC
0

Распарсил код. Похоже вы изобрели demux tree

12.05.2023 11:45 UTC
0

Похоже, только:

1) Биты адреса не изменяются после этапа начальной декодировки. И вообще с такой системой счисления у меня нет декодировки :)

2) везде и всюду постоянный коэффициент ветвления (а не FO-256 для последних бит адреса)

3) как следствие предыдущего пункта - малое потребление энергии

4) Работает так же быстро как и быстрейшие демультиплексоры из ucdavis

5) Имеет на 20% меньшую площадь

Вот сравнения различных типов между собой

https://github.com/ValeriyAndreevichPushkarev/Selector_8bit/

Дерево демультиплесоров демультиплесирует на каждом шаге. Там кстати получится больше 2-х транзисторов на линию и скорее всего даже больше задержка

12.05.2023 12:59 UTC
0

А вы фанаут после синтеза проверяли? Что-то мне подсказывает, что будет то же самое во всех вариантах (и как в обычном demux tree).

13.05.2023 02:18 UTC
0

Нет, Demux tree скорее просто похоже. (потому что дерево, и демультиплексор)

Тем более демультиплесирование идет на каждом шаге DemuxTree

13.05.2023 05:20 UTC
0

Нет, один демультиплексор 4 бита в 16 линий это скорее всего16 масок на эти самые 4-хбитные значения (потому что задержка играет важную роль).

или примерно 4 транзистора на 1 вывод (линию).

У меня 2 транзистора на линию с той же задержкой (4 FO-4).