Chisel: как реализовать эффективный мультиплексор one-hot?

У меня есть таблица, где каждая строка таблицы содержит состояние (регистры). Есть логика, которая выбирает одну конкретную строку. Только одна строка получает сигнал «выбрано». Затем осуществляется доступ к состоянию из выбранной строки. Либо часть состояния подключается как выход к IO модуля, либо часть IO используется как вход для обновления состояния.

Если бы я реализовал это с помощью схемы, я бы использовал шлюзы. Выбранный сигнал включит один набор шлюзов, которые подключат регистры строки к шине. Затем шина будет подключена к пучку ввода-вывода. Это быстрая, небольшая площадь и низкое энергопотребление.

В Chisel есть простой способ реализовать это. Он кодирует выбранную строку как двоичное число, а затем применяет это число к выбранному входу традиционного мультиплексора. К сожалению, для таблицы с 20–50 строками и состоянием из сотен бит такая реализация может быть довольно медленной и расточительной по площади и энергии.

Вопрос состоит из двух частей: 1) Есть ли способ указать автобусы в Chisel, чтобы у вас были пропускные пункты или традиционные водители с тремя штатами, которые все свешивались с автобуса?

2) Если это не так, есть ли в Chisel быстрый, небольшой по площади и низкоэнергетический способ сделать это?

Спасибо


person seanhalle    schedule 19.12.2016    source источник


Ответы (1)


1) Chisel не полностью поддерживает двунаправленные провода, но через экспериментальный аналоговый тип (см. пример), вы можете хотя бы прошить шину через свой код Chisel между черными ящиками Verilog.

2) Вы пробовали Mux1H в chisel3.util? По сути, он излучает сумму произведений входов и соответствующих им битов выбора. Я не уверен, как это соотносится с предлагаемой вами реализацией. Я хотел бы увидеть сравнение QOR. Если этой конструкции недостаточно и вы не можете точно выразить то, что хотите, в chisel, вы можете использовать параметризовал BlackBox для реализации вашего однократного мультиплексора и создания его экземпляров по своему усмотрению.

person Jack Koenig    schedule 03.05.2017
comment
Спасибо за ссылку. Это на самом деле поднимает для нас постоянный и критический момент. Мы не изощренные программисты. Но люди, внедряющие Rocket и разработчики Chisel, есть. Уровень сложности в практике кодирования программного обеспечения намного превышает наши навыки. Обучение, необходимое для понимания реализации Mux1H, нетривиально. - person seanhalle; 05.05.2017
comment
Эта непроницаемость кода Chisel была постоянным препятствием. С одной стороны, базовый Chisel намного производительнее, чем Verilog. На выполнение работ в Chisel уходит от месяца до двух месяцев. Около 60% людей, которых мы наняли, уволились, потому что не смогли добраться до этого момента. Но уровень, представленный Mux1H и все чаще кодом Rocket, я оцениваю примерно от 6 месяцев до года, чтобы освоиться с такой практикой кодирования. Это реальная проблема для нас, когда мы делаем коммерческий продукт, нанимая обычных разработчиков Verilog. - person seanhalle; 05.05.2017
comment
Приступаем к содержанию ответа .. Спасибо за подсказку по поводу Analog. В пункте 1) я не совсем понял упоминание о черных ящиках Verilog. А насчет двунаправленности я не понимал. Автобус вообще-то однонаправленный. Просто у него есть несколько источников, которые могут управлять одним и тем же проводом. Например, драйвер с тремя состояниями является однонаправленным. Кроме того, логика, которая помещает значения в шину и получает от шины, - все это Chisel. Никакие черные ящики Verilog не задействованы. - person seanhalle; 05.05.2017
comment
В пункте 2) я подозреваю, что Mux1H - это то, что я упомянул как прямой способ реализации 1 hot - дерева мультиплексоров. Такой подход довольно масштабный и энергоемкий. Суть вопроса в том, чтобы найти альтернативу, которая имеет меньше ворот и потребляет меньше энергии. Стандартная шина будет одной из таких цепей. Есть ли способ для Chisel распечатать изображение узлов, которые он генерирует? Например, визуализация узлов FIRRTL и того, как они соединяются друг с другом? Это действительно помогло бы решить проблему непрозрачности кода, если бы мы могли видеть, что код производит. - person seanhalle; 05.05.2017
comment
Обновление - проверил упомянутое аналоговое долото, еще раз спасибо за указатель. Оказывается, аналоговая штука связана с подключением аналоговых блоков, у которых есть аналоговые порты ... понял, спасибо. Хотя непонятно, как это применимо .. вопрос в том, как эффективно реализовать one-hot в Chisel .. использование черных ящиков означает реализацию на другом языке .. Вопрос в том, о возможностях Chisel, которые позволяют эффективно реализовать на языке Chisel. - person seanhalle; 05.05.2017
comment
Похоже, что Chisel не поддерживает водителей с тремя штатами и автобусы. Это позволяет только реализовать их на других языках, таких как Verilog, а затем связать их через BlackBox. Основная проблема с этим - моделирование и проверка. Мы все еще используем Chisel 2, потому что мы работаем с LowRISC, который еще не обновлен. (См. Комментарий выше, почему. Кодовая база июля 2016 года была намного более доступной, чем кодовая база марта 2017 года). Симулятор для Chisel 2 не включает поведение черных ящиков .. - person seanhalle; 05.05.2017