~ cd 16. движки
Icarus Verilog разрабатывает проект, затем отправляет его на обработку генераторам кода (движок). Новые генераторы кода могут быть добавлены внешними пакетами, но это те генераторы кода, которые поставляются в комплекте с Icarus Verilog. Выбор генератора кода осуществляется с помощью флага командной строки «-t».
- Генератор кодов vvp (-tvvp)
- Генератор кода stub (-tstub)
- Генератор кода null (-tnull)
- Генератор кода VHDL (-tvhdl)
- Генератор кода Verilog ’95 (-tvlog95)
- Генератор кода PCB (-tpcb)
- Генератор кода FPGA (-tfpga)
- Генератор кода PAL (-tpal)
- Анализатор кода sizer (-tvvp)
- Генератор кода Verilog (-tverilog)
- Генератор кода BLIF (-tblif)
16.1. Генератор кода vvp (-tvvp)
Цель vvp генерирует код для времени выполнения «vvp». Это наиболее часто используемый движок для Icarus Verilog, поскольку она является основным движком моделирования.
% iverilog -o top.vvp -s top hello_world.v
% iverilog -o top.vvp -tvvp -s top hello_world.v
module top;
initial $display("Hello World!");
endmodule
#! /usr/local/bin/vvp
:ivl_version "13.0 (devel)" "(s20221226-119-g8cb2e1a05-dirty)";
:ivl_delay_selection "TYPICAL";
:vpi_time_precision + 0;
:vpi_module "/usr/local/lib/ivl/system.vpi";
:vpi_module "/usr/local/lib/ivl/vhdl_sys.vpi";
:vpi_module "/usr/local/lib/ivl/vhdl_textio.vpi";
:vpi_module "/usr/local/lib/ivl/v2005_math.vpi";
:vpi_module "/usr/local/lib/ivl/va_math.vpi";
S_0x563c3c5d1540 .scope module, "top" "top" 2 1;
.timescale 0 0;
.scope S_0x563c3c5d1540;
T_0 ;
%vpi_call 2 2 "$display", "Hello World!" {0 0 0};
%end;
.thread T_0;
# The file index is used to find the file name in the following table.
:file_names 3;
"N/A";
"<interactive>";
"hello_world.v";
Первая строка содержит shebang. Если этот файл выполняется, то shebang указывает оболочке использовать vvp для выполнения этого файла.
% ./top.vvp
% vvp top.vvp
Далее следуют несколько директив. Первая из них, :ivl_version, указывает, в какой версии iverilog был создан этот файл. Далее идет выбор задержки со значениями «min:typical:max» и точность времени, которую мы специально не задавали, поэтому используется значение по умолчанию. Следующие строки указывают vvp, какие модули VPI загружать и в каком порядке. Следующие строки указывают vvp, какие модули VPI загружать и в каком порядке. Далее создается новая область видимости с помощью директивы .scope и устанавливается шкала времени с помощью .timescale. Создается поток T_0, содержащий две инструкции: %vpi_call выполняет VPI-функцию $display с указанными аргументами, а %end завершает симуляцию.
16.1.1. Опкоды
Различные доступные опкоды можно посмотреть в разделе Опкоды.
16.2. Генератор кода заглушки (-tstub)
Генератор кода заглушки — это отладочный инструмент для самого компилятора Icarus Verilog. Он выводит текстовый дамп разработанного проекта при передаче его в генераторы кода.
% iverilog -o stub.txt -tstub -s top input.v
module top;
initial $display("Hello World!");
endmodule
root module = top
scope: top (0 parameters, 0 signals, 0 logic) module top time units = 1e0
time precision = 1e0
end scope top
# There are 0 constants detected
initial
Call $display(1 parameters); /* hello_world.v:2 */
<string="Hello World!", width=96, type=bool>
16.3. Генератор нулевого кода (-tnull)
Цель null не генерирует никакого кода. Вызов этого генератора кода не приводит к генерации кода.
16.4. Генератор кода VHDL (-tvhdl)
Icarus Verilog содержит генератор кода для эмуляции VHDL из нетлиста Verilog. Это позволяет Icarus Verilog функционировать как транслятор Verilog в VHDL.
16.4.1. Вызов
% iverilog -tvhdl -o my_design.vhd my_design.v
Сгенерированный VHDL будет помещен в один файл (по умолчанию a.out), даже если Verilog разбросан по нескольким файлам.
16.4.2. Флаги
- -pdebug=1
Выводить сообщения о ходе работы, когда генератор кода посещает каждую часть конструкции. - -pdepth=N
Выводить сущности VHDL только для модулей, найденных на глубине < N в иерархии. При значении N=0, установленном по умолчанию, выводятся все сущности. Например, -pdepth=1 выводит только сущность верхнего уровня.
16.4.3. Ограничения
Существует несколько случаев, когда поведение транслированного VHDL отличается от исходного Verilog:
- Результат деления на ноль равен x в Verilog, но вызывает исключение в VHDL.
- Аналогично, результат чтения за конец массива в Verilog равен x, тогда как в VHDL возникает исключение.
- Любой сигнал, который управляется двумя или более процессами, будет иметь значение ‘U’. Это результат работы функции разрешения сигналов в пакете std_logic_1164.
16.4.4. Конструкции, которые не поддерживаются
Следующие конструкции Verilog не могут быть переведены на VHDL:
- fork и join
- force и release
- disable
- переменные с вещественными значениями
- переключатели(switches)
- иерархическое разыменование
16.4.5. Другие ограничения
- Тестовые выражения в операторах case должны быть постоянными.
- Перевод параметра в соответствующее родовое объявление VHDL. Вместо этого используется значение параметра по умолчанию.
16.5. Генератор кода Verilog ’95 (-tvlog95)
Icarus Verilog содержит генератор кода для создания 1995-совместимого Verilog из входного нетлиста Verilog. Это позволяет Icarus Verilog функционировать как транслятор Verilog > 1995 в Verilog 1995. Основной целью проекта было преобразование @*, аргументов в стиле ANSI и других конструкций к тому, что разрешено в 1995 Verilog.
16.5.1. Инвокация
% iverilog -tvlog95 -o my_design_95.v my_design.v
Сгенерированный Verilog будет помещен в один файл (по умолчанию a.out), даже если входной Verilog разбросан по нескольким файлам.
16.5.2. Флаги генератора
- -pspacing=N
Устанавливает интервал между отступами (по умолчанию 2). - -pallowsigned=1
Разрешить эмиссию различных знаковых конструкций в качестве расширения 1995 Verilog (по умолчанию выключено). - -pfileline=1
Выдавать информацию об исходном файле и строке в качестве комментария для каждой сгенерированной строки (по умолчанию выключено).
16.5.3. Конструкции, которые не могут быть преобразованы в Verilog, совместимый с 1995 годом
Следующие конструкции Verilog не могут быть переведены в 1995-совместимый Verilog:
- Автоматические задачи или функции.
- Оператор возведения в степень (). Выражения вида (2N)**<переменная> (где N — константа) могут быть преобразованы в сдвиг.
- Некоторые конструкции System Verilog (например, конечные блоки, операторы ++/— и т. д.). Переменные с двумя состояниями преобразуются в переменные с четырьмя состояниями.
Расширения Icarus, которые не могут быть переведены:
- Целочисленные константы более 32 бит.
- Сети(провода) с вещественными значениями.
- Вещественные модули.
- Большинство конструкций Verilog-A.
16.5.4. Известные проблемы и ограничения
Некоторые вещи просто не доделаны и должны генерировать соответствующее предупреждение. Вот список основных моментов, на которые еще нужно обратить внимание.
- Осталось несколько проблем с портами экземпляра модулей (pr1723367 и partselsynth).
- Порты inout не конвертируются (tran-VP).
- Выбор переменной из ненулевого вектора в непрерывном присваивании не преобразуется.
- Нет поддержки перевода повторения нуля в непрерывном присваивании. В настоящее время он просто отменен.
- Подтягивающее устройство, подключенное к селекту сигнала, переводится неправильно (это может быть исправлено).
- Селекты частей с индексом L-значения и постоянной неопределенной базой в непрерывном присваивании не переводятся.
- Массивы логических вентилей не совпадают с массивами входов, а имя экземпляра не всегда совпадает.
- Поддержка знаковости не генерирует вызовы функций $signed() или $unsigned() в выражении непрерывного присваивания.
- Специальные случаи силовых операторов не преобразуются в непрерывном присваивании.
- В настоящее время знаковая константа, которая устанавливает MSB в беззнаковом контексте, будет отображаться как отрицательное значение (например, бит = 1 преобразуется в бит = -1).
16.6. Генератор кода PCB (-tpcb)
Генератор целевого кода PCB разработан для того, чтобы позволить пользователю ввести нетлист в формате Verilog, а затем сгенерировать входные файлы для программы GNU PCB layout.
16.6.1. Вызов
Генератор целевого кода PCB вызывается с помощью флага -tpcb в команде iverilog. Выходной файл по умолчанию, «a.out», содержит сгенерированный файл .PCB. Для явного задания имени выходного файла используйте флаг «-o». Выходной файл по умолчанию содержит только элементы. Чтобы сгенерировать файл «netlist», добавьте флаг командной строки «-pnetlist=».
% iverilog -tpcb –o foo.pcb -pnetlist=foo.net foo.v
16.6.2. Флаги
- -o <путь>
Установить путь к выходному файлу (pcb) - -pnetlist=path
Записать файл нетлиста по указанному пути.
16.6.3. Краткое описание атрибутов
Атрибуты присоединяются к различным конструкциям с помощью синтаксиса атрибутов Verilog «(* *)».
- ivl_black_box
Прикрепляется к объявлению модуля или экземпляру модуля и указывает, что модуль является «черным ящиком». Генератор кода создаст элемент для экземпляров черного ящика.
16.6.4. Сводка параметров
Внутри модулей генератор кода PCB использует определенные параметры для управления деталями. Параметры могут иметь значения по умолчанию и могут быть переопределены с помощью обычного синтаксиса переопределения параметров Verilog. Параметры имеют предпочтительные типы.
- description (string, default=””)
«description» — это текстовая строка, описывающая «черный ящик». Эта строка записывается в поле описания элемента PCB. - value (string, default=””)
«value» — это текстовая строка, которая описывает некоторое значение для черного ящика. Как и описание, генератор кода не интерпретирует это значение, а только записывает его в соответствующее поле элемента PCB.
16.7. Генератор кода ПЛИС (-tfpga)
16.7.1. Предупреждение
В настоящее время этот генератор кода не входит в состав Icarus Verilog.
Генератор кода FPGA поддерживает различные устройства FPGA, записывая XNF или EDIF в зависимости от цели. Вы можете выбрать архитектуру устройства и подробное название детали. Архитектура используется для выбора библиотечных примитивов, а подробное имя детали записывается в сгенерированный файл для использования последующими инструментами.
16.7.2. Вызов Движка FPGA
iverilog -parch=virtex -ppart=v50-pq240-6 -tfpga foo.vl
В этом примере выбрана архитектура Virtex, а номер детали указан как v50-pq240-6. Выходные данные записываются в файл a.out, если только не указан другой выходной файл с помощью флага -o.
Ниже приведен список типов архитектур, которые поддерживает данный генератор кода.
- arch=lpm
Это независимый от устройства формат, в котором затворы представляют собой типы устройств, определенные спецификацией LPM 2 1 0. Некоторые внутренние инструменты могут принимать этот формат, или пользователи могут писать интерфейсные библиотеки для подключения этих нетлистов к рассматриваемому устройству. - arch=generic-edif (устаревший)
Это общий код EDIF. Он не обязательно работает, потому что внешняя библиотека недоступна генератору кода. Однако, он генерирует вентили общего стиля, которые библиотека переносимости может при желании сопоставить с целевыми вентилями. - arch=generic-xnf (устаревший)
Если выбрано это значение, то на выходе получается XNF-файл, подходящий практически для любого типа устройств. Устройства, которые он выдает, являются общими устройствами из унифицированной библиотеки. Некоторые устройства являются макросами, и вам может потребоваться дополнительное разрешение сгенерированного XNF, чтобы получить рабочий код для вашей детали. - arch=virtex
Если выбрано это значение, то выходные данные будут отформатированы как файл EDIF 200, подходящий для устройств класса Virtex. Предполагается, что вы знаете, что ориентируетесь на деталь Virtex, поэтому можете генерировать примитивы вместо использования внешних макросов. Он включает внутреннюю библиотеку VIRTEX и должен работать правильно для любой детали Virtex. - arch=virtex2
Если выбрано это значение, то на выходе получается EDIF 2 0 0, подходящий для устройств Virtex-II и Virtex-II Pro. Он использует библиотеку VIRTEX2, но очень похож на целевой формат Virtex.
16.7.3. Корневые порты XNF
ПРИМЕЧАНИЕ: По мере перехода деталей на формат EDIF поддержка XNF будет постепенно прекращена. Текущие средства реализации Xilinx принимают файлы в формате EDIF даже для старых деталей, а средства реализации, не относящиеся к Xilinx, не принимают ничего другого.
Когда выходным форматом является XNF, генератор кода будет генерировать записи «SIG» для сигналов, являющихся портами корневого модуля. Имя объявляется как внешний вывод, который этот макрос делает доступным.
module main(out, in);
output out;
input [2:0] in;
[...]
endmodule
SIG, main/out, PIN=out
SIG, main/in<2>, PIN=in2
SIG, main/in<1>, PIN=in1
SIG, main/in<0>, PIN=in0
16.7.4. Корневые порты EDIF
Формат EDIF более четко определяет интерфейс в EDIF-файле. Генератор кода использует этот контроль для создания явного определения интерфейса в проекте. (Это не то же самое, что PADS детали). Сгенерированная секция интерфейса EDIF содержит определения портов, включая соответствующие метки направления.
С помощью функции (rename …) s-exp в EDIF можно присвоить именам портов произвольный текст. Поэтому генератор кода EDIF не прибегает к очеловечиванию, которое необходимо для XNF-цели. В качестве имени порта используется базовое имя сигнала, являющегося входом или выходом, с соблюдением регистра.
module main(out, in);
output out;
input [2:0] in;
[...]
endmodule
out OUTPUT
in[0] INPUT
in[1] INPUT
in[2] INPUT
Целевые инструменты, включая инструменты Xilinx Foundation, понимают символы [] в имени и собирают сигналы в соответствующую шину при представлении вектора пользователю.
16.7.5. Назначение областей FT (PADS) И пины(PINS)
module main( (* PAD = "P10" *) output out,
(* PAD = "P20,P21,P22" *) input [2:0] in);
[...]
endmodule
В этом примере порт out назначен на вывод 10, а порт in — на выводы 20-22. Если архитектура поддерживает это, то номер вывода 0 означает, что инструменты back end выбирают вывод. Формат номера вывода зависит от семейства архитектуры, для которого он предназначен, например, устройства семейства Xilinx используют имя, связанное с атрибутом «LOC».
ПРИМЕЧАНИЕ: Если порт модуля назначен на вывод (и, следовательно, присоединен к PAD), то он не подключен к порту EDIF-файла. Это связано с тем, что PAD (и, возможно, IBUF или OBUF) станет дополнительным источником порта. Ошибка.
16.7.6. Специальные устройства
Генератор кода поддерживает атрибут «cellref», прикрепленный к логическим устройствам, чтобы вызвать генерацию определенных типов устройств вместо обычного устройства, которое может сгенерировать генератор кода. Например, чтобы получить тактовый буфер из Verilog buf:
buf my_gbuf(out, in); $attribute(my_buf, «cellref», «GBUF:O,I»);
<тип ячейки>:<имя контакта>,...
Тип ячейки — это имя используемой части библиотеки. Имена выводов — это имена типов в библиотеке, в том порядке, в котором подключены выводы логического устройства.
16.7.7. КОМПИЛЯЦИЯ С ПОМОЩЬЮ XILINX FOUNDATION
% iverilog -parch=virtex -o foo.edf foo.vl
% edif2ngd foo.edf foo.ngo
% ngdbuild -p v50-pq240 foo.ngo foo.ngd
% map -o map.ncd foo.ngd
% par -w map.ncd foo.ncd
16.8. Генератор кодов PAL (-tpal)
16.8.1. Предупреждение
Этот генератор кода в настоящее время не включен в Icarus Verilog.
Цель PAL генерирует вывод JEDEC для программируемых логических массивов.
16.9. Анализатор кода sizer (-tsizer)
Цель sizer не генерирует никакого кода. Вместо этого она выводит статистику о коде Verilog.
Важно синтезировать код Verilog перед вызовом sizer. Это можно сделать с помощью флага -S, передаваемого в iverilog. Обратите внимание, что поведенческий код не может быть синтезирован и при передаче его в sizer будет выдано предупреждение.
% iverilog -o sizer.txt -tsizer -S -s top input.v
module top (
input clock,
input reset,
output blink
);
reg out;
always @(posedge clock) begin
if (reset) begin
out = 1'b0;
end else begin
out <= !out;
end
end
assign blink = out;
endmodule
**** module/scope: top
Flip-Flops : 1
Logic Gates : 3
MUX[2]: 1 slices
LOG[13]: 1 unaccounted
LOG[14]: 1 unaccounted
**** TOTALS
Flip-Flops : 1
Logic Gates : 3
MUX[2]: 1 slices
LOG[13]: 1 unaccounted
LOG[14]: 1 unaccounted
LOG[14]: 1 неучтенный
16.10. Генератор кода Verilog (-tverilog)
Предупреждение
В настоящее время этот генератор кода не входит в состав Icarus Verilog.
16.11. Генератор кода BLIF (-tblif)
Генератор BLIF-кода поддерживает эмиссию дизайна в файл формата blif, принятого в:
ABC: A System for Sequential Synthesis and Verification.
Этот пакет содержит инструменты, иногда используемые разработчиками ASIC. Эта цель blif генерирует файл .blif, который система ABC может прочитать int с помощью команды «read_blif».
16.11.1. Использование
% iverilog -tblif -o <path>.blif <source files>...
Исходными файлами могут быть Verilog, SystemVerilog, VHDL, все, что поддерживает Icarus Verilog, при условии, что они прошли этап элаборации до ограниченного подмножества, которое поддерживает генератор кода. Другими словами, файлы должны быть структурными.
Корневой модуль разработанного проекта становится моделью. Этот модуль может объявлен экземпляром подмодули и так далее по конструкции, завершая его. Выходная модель сплющивается, так что она не вызывает никаких подсхем. Битовые векторы распаиваются на портах модели и внутри нее. Это необходимо, поскольку blif в частности и ABC в целом обрабатывают биты, а не векторы.
16.11.2. ОГРАНИЧЕНИЯ
В настоящее время поддерживаются только явные логические вентили и непрерывные присваивания.
Проект должен содержать только один корневой модуль. Имя этого корневого модуля становится именем модели blif в записи «.model».