~ cd 2.3. создание скриптов
На предыдущей странице мы рассмотрели сценарий синтеза, выполняя каждую команду в интерактивной оболочке Yosys. На этой странице мы расскажем о формате файла сценария и о том, как можно создавать собственные сценарии синтеза.
Файлы сценариев Yosys обычно имеют расширение.ys и содержат набор команд для последовательного выполнения.
Это те же команды, которые мы использовали на предыдущей странице, например read_verilog и hierarchy .
2.3.1. Обход сценариев
Как и в интерактивной оболочке, каждая команда состоит из имени команды и необязательного списка аргументов, разделенных пробелами. Команды завершаются символом новой строки, а все, что находится после хэш-знака #, является комментарием (т. е. игнорируется).
Также можно завершать команды точкой с запятой ;. Это особенно полезно в сочетании с параметрами командной строки -p <команда>, где <команда> может быть строкой с несколькими командами разделенные точкой с запятой. Встроенные комментарии можно также делать с помощью двоеточия :, где конец комментария — это точка с запятой ; или новая строка.
$ yosys -p "read_verilog fifo.v; :this is a comment; prep"
Внимание: Пробел после точки с запятой необходим для правильного обхода. Например, log a;log b; отобразит a;log b, а не a и b, как можно было бы ожидать.
Еще один специальный символ, который можно использовать в скриптах Yosys, — это bang! Все, что следует после bang, будет выполнено как команда оболочки. Она может быть завершена только с новой строки. Любые точки с запятой, хэши и другие специальные символы будут переданы оболочке. Если из оболочки возвращается код ошибки, он будет поднят Yosys. exec обеспечивает более гибкий способ выполнения команд, позволяя записывать вывод в журнал и контролировать время генерации ошибок.
2.3.2. Стартовый скрипт синтеза
Все изображения и консольный вывод, используемые в Synthesis starter, были сгенерированы Yosys с помощью файлов скриптов Yosys, найденных в docs/source/code_examples/fifo. Если вы еще этого не сделали, давайте посмотрим на некоторые из этих файлов сценариев.
echo on
hierarchy -top addr_gen
select -module addr_gen
select -list
select t:*
select -list
select -set new_cells %
select -clear
show -format dot -prefix addr_gen_show addr_gen
show -format dot -prefix new_cells_show -notitle @new_cells
show -color maroon3 @new_cells -color cornflowerblue p:* -notitle -format dot -prefix addr_gen_hier
# ========================================================
proc -noopt
select -set new_cells t:$mux t:*dff
show -color maroon3 @new_cells -notitle -format dot -prefix addr_gen_proc
# ========================================================
opt_expr; clean
select -set new_cells t:$eq
show -color cornflowerblue @new_cells -notitle -format dot -prefix addr_gen_clean
# ========================================================
Первая команда, echo on, использует echo для включения командного эха. Именно так мы сгенерировали листинг кода для вывода hierarchy -top addr_gen. Включение командного эха печатает строку yosys> hierarchy -top addr_gen, в результате чего вывод выглядит так же, как в интерактивном терминале. hierarchy -top addr_gen — это, конечно, команда, которую мы демонстрировали, включая текст вывода и изображение схемы дизайна после ее выполнения.
Мы вкратце коснулись темы выбора(select), когда она была затронута в synth_ice40 , но теперь давайте рассмотрим ее подробнее.
2.3.2.1. Selections вступление
yosys> select -module addr_gen
yosys [addr_gen]> select -list
addr_gen
addr_gen$1\addr[7:0]
addr_gen$add$fifo.v:19$3_Y
addr_gen$eq$fifo.v:16$2_Y
addr_gen$0\addr[7:0]
addr_gen/addr
addr_gen/rst
addr_gen/clk
addr_gen/en
addr_gen$add$fifo.v:19$3
addr_gen$eq$fifo.v:16$2
addr_gen$proc$fifo.v:0$4
addr_gen$proc$fifo.v:12$1
yosys [addr_gen]> select t:*
yosys [addr_gen]*> select -list
addr_gen$add$fifo.v:19$3
addr_gen$eq$fifo.v:16$2
yosys [addr_gen]*> select -set new_cells %
yosys [addr_gen]*> select -clear
Когда мы вызываем select -module addr_gen, мы меняем текущий активный выбор со всей конструкции на только модуль addr_gen. Обратите внимание, как при этом меняется yosys в начале каждой команды на yosys [addr_gen]? Это указывает на то, что все команды, которые мы запустим в этот момент, будут работать только с модулем addr_gen. Когда мы затем вызываем select -list, мы получаем список всех объектов в модуле addr_gen, включая сам модуль, а также все провода, входы, выходы, процессы и ячейки.
Далее мы выполним еще одно выделение, select t:*. Часть t: означает, что мы подбираем тип ячейки, а * — что угодно. Для этого (очень простого) выбора мы пытаемся найти все ячейки,
независимо от их типа. Активное выделение теперь отображается как [addr_gen]*, что указывает на некоторую подвыборку модуля addr_gen. Это дает нам ячейки $add и $eq, которые мы хотим выделить для модуля addr_gen после изображения иерархии.
С помощью команды select -set мы можем присвоить имя выделению. В нашем случае мы используем имя new_cells и указываем, что нужно использовать текущую выборку, обозначенную символом %. Затем мы можем использовать эту именованную выборку, обращаясь к ней как к @new_cells, что мы увидим позже. Затем мы очищаем выделение, чтобы получилось следующее
команды могут работать с полной конструкцией. Хотя мы разделили эту команду для данного документа, мы могли бы сделать то же самое в одной строке, вызвав select -set new_cells addr_gen/t:*. Если мы знаем, что в нашем проекте есть только один модуль, мы можем даже пропустить часть addr_gen/. Заглянув дальше в код fifo.ys, мы можем увидеть это с помощью команды select -set new_cells t:$mux t:*dff. В этой команде мы также видим, что выборка не должна ограничиваться одним заявлением.
Многие команды также поддерживают дополнительный аргумент [selection], который можно использовать для переопределения выбранных в данный момент объектов. Например, мы можем вызвать команду clean addr_gen, чтобы команда clean работала только с модулем addr_gen.
Отображение схем
Хотя команда select очень полезна, иногда ничто не сравнится с возможностью увидеть конструкцию своими глазами. Именно здесь на помощь приходит команда show. Рассмотрим основы команды show.
Примечание: Команда show требует рабочей установки GraphViz и xdot для отображения реальных схем.
yosys> show -format dot -prefix addr_gen_show addr_gen
4. Generating Graphviz representation of design.
Writing dot description to `addr_gen_show.dot'.
Dumping module addr_gen to page 1.
Перевод:
yosys> show -format dot -prefix addr_gen_show addr_gen
4. Генерация представления конструкции в Graphviz.
Запись описания dot в `addr_gen_show.dot'.
Выгрузка модуля addr_gen на страницу 1.

Вызов show с параметром -format dot указывает, что мы хотим вывести файл .dot, а не открывать его для отображения. Параметр -prefix addr_gen_show указывает, что мы хотим, чтобы файл назывался addr_gen_show . Помните, что мы делаем это в fifo.ys, потому что нам нужно сохранить изображение для отображения в документации, которую вы читаете. Но если вы хотите просто отображать изображения локально, можете пропустить эти 2 параметра. Параметр –format внутренне вызывает программу командной строки dot из GraphViz для преобразования в форматы, отличные от .dot. Подробнее о доступных форматах читайте в документации по выводу GraphViz.
Примечание: Если вы используете версию Yosys на базе POSIX (например, для Mac или Linux), xdot будет открыт в фоновом режиме, и Yosys можно будет продолжать использовать. Если он все еще открыт, последующие вызовы show будут использовать тот же экземпляр xdot.
Addr_gen в конце сообщает, что нам нужен только модуль addr_gen, точно так же, как когда мы вызывали select -module addr_gen в Selections intro. Последний параметр не обязательно должен быть именем модуля, это может быть любая допустимая строка выбора. Помните, как мы присвоили имя select и назвали его new_cells? В выводе select -list мы увидели, что он содержит две ячейки, $add и $eq. Мы можем вызвать show для этой выборки так же легко:
Мы могли бы получить тот же результат с помощью show -notitle t:$add t:$eq, если бы у нас не было именованного выбора. Добавив флаг -notitle, мы также можем избавиться от заголовка addr_gen, который был добавлен автоматически. Последние два изображения были добавлены для этого введения. Следующее изображение — первое, которое мы видели в Synthesis starter: на нем показан весь модуль addr_gen, а также выделены @new_cells и два блока PROC. Чтобы добиться такого выделения, мы используем опцию -color:

Рис. 2.19: Вызов show -color maroon3 @new_cells -color cornflowerblue p:* -notitle
