Выход долота с интерфейсами / структурами SystemVerilog - PullRequest
0 голосов
/ 08 ноября 2018

Я обнаружил, что при генерации выходных данных Verilog из структуры долота вся «структура», определенная в структуре долота, теряется в интерфейсе.

Это проблематично для создания экземпляра этой работы в более крупных проектах SystemVerilog.

Существуют ли в Chisel расширения или функции для лучшей поддержки? Например, автоматическое преобразование буровых «Bundle» объектов в порты structVerilog «struct».

Или создание перечислений SV, когда код долота пишется с использованием класса Enum.

1 Ответ

0 голосов
/ 08 ноября 2018

В настоящее время нет. Тем не менее, оба предложения звучат как очень хорошие кандидаты для обсуждения для будущего внедрения в Chisel / FIRRTL.

SystemVerilog Struct Generation

Большая часть кода Чизеля, созданного в Verilog / SystemVerilog, будет использовать некоторую интерфейсную оболочку, которая занимается преобразованием необходимых имен сигналов, которые инстанциатор хочет использовать, в имена, дружественные к Чизелю. В качестве одного из примеров этого см. AcceleratorWrapper. Это создает конкретный ускоритель и делает соединения с именами Verilog, которых ожидает экземпляр. В настоящее время вы не можете сделать это с помощью структур SystemVerilog, но вы можете сделать то же самое с помощью оболочки SystemVerilog, которая отображает структуры SystemVerilog на детерминированные имена долот. Это тот же тип проблемы / решения, с которым сталкивается / решает большинство людей при интеграции внешнего IP в свой проект.

Клуджес в сторону, то, о чем ты говоришь, возможно в будущем ...

Необходимо некоторое объяснение, почему это сложно:

Долото конвертируется в FIRRTL. FIRRTL затем понижается до сокращенного поднабора FIRRTL, называемого «низким» FIRRTL. Низкая FIRRTL затем отображается на Verilog. Часть этого процесса понижения выравнивает все пакеты, используя уникально определенные имена (обычно a.b.c понижается до a_b_c, но будет унифицирован, если возникнет конфликт пространства имен из-за понижения). Verilog не поддерживает структуры, поэтому это должно произойти. Кроме того, и что более важно, некоторые оптимизации происходят на уровне Low FIRRTL, такие как постоянное распространение и устранение мертвого кода, которые легче писать и обрабатывать там.

Однако SystemVerilog или другой язык, на который ориентирован бэкэнд FIRRTL, который поддерживает неплоские типы, выигрывает от использования функций этого языка для получения более удобочитаемого вывода. Существует два основных подхода к исправлению этого:

  1. Пониженные типы сохраняют информацию о том, как они были изначально созданы с помощью аннотаций, а эмиттер SystemVerilog восстанавливает их. Это кажется не элегантным из-за понижения, а затем не опускания.

  2. В эмиттере SystemVerilog используется другая последовательность преобразований FIRRTL, которая не полностью переходит к Low FIRRTL. Это потребовало бы переписывания некоторых оптимизирующих преобразований, работающих на Low FIRRTL, для работы на более высоких формах. Это послушно, но сложно.

Если вам нужна дополнительная информация о том, какие проходы выполняются на каждом этапе компиляции, взгляните на LoweringCompilers.scala

Перечисляемые типы

То, что вы упоминаете для Enum, запланировано для бэкэнда Verilog. Идея здесь состояла в том, чтобы Enum s испускали аннотации, описывающие, что они есть. Затем излучатель Verilog будет генерировать localparam с. Предварительная работа для генерации аннотации была добавлена ​​как часть StrongEnum (chisel3#885 / chisel3#892), но часть аннотаций пришлось позднее отменить. Решение этой проблемы активно разрабатывается. Последующий PR для FIRRTL увеличит излучатель Verilog, чтобы использовать их. Итак, ищите это в будущем.

О взносах и пропаганде

Для вопросов, подобных этому, с (в настоящее время) отрицательными ответами, не стесняйтесь подавать проблему в соответствующее хранилище Chisel3 или FIRRTL. И даже лучше, чем RFC с последующей реализацией.

...