DocsTech
/
ICARUS VERILOG
/

~ cd 16. движки

Icarus Verilog разрабатывает проект, затем отправляет его на обработку генераторам кода (движок). Новые генераторы кода могут быть добавлены внешними пакетами, но это те генераторы кода, которые поставляются в комплекте с Icarus Verilog. Выбор генератора кода осуществляется с помощью флага командной строки «-t».

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
В этом примере код находится в файле hello_world.v:
...
Копировать
module top;
    initial $display("Hello World!");
endmodule
Полученный файл top.vvp будет содержать что-то похожее на:
...
Копировать
#! /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 напрямую:
...
Копировать
%  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
Полученный stub.txt будет содержать:
...
Копировать
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. Вызов

Чтобы перевести программу на языке Verilog в VHDL, вызовите программу «iverilog» с флагом -tvhdl:
...
Копировать
% iverilog -tvhdl -o my_design.vhd my_design.v

Сгенерированный VHDL будет помещен в один файл (по умолчанию a.out), даже если Verilog разбросан по нескольким файлам.

16.4.2. Флаги

16.4.3. Ограничения

Существует несколько случаев, когда поведение транслированного VHDL отличается от исходного Verilog:

16.4.4. Конструкции, которые не поддерживаются

Следующие конструкции Verilog не могут быть переведены на VHDL:

16.4.5. Другие ограничения

16.5. Генератор кода Verilog ’95 (-tvlog95)

Icarus Verilog содержит генератор кода для создания 1995-совместимого Verilog из входного нетлиста Verilog. Это позволяет Icarus Verilog функционировать как транслятор Verilog > 1995 в Verilog 1995. Основной целью проекта было преобразование @*, аргументов в стиле ANSI и других конструкций к тому, что разрешено в 1995 Verilog.

16.5.1. Инвокация

Чтобы перевести программу на Verilog в Verilog, совместимый с 1995 годом, вызовите программу «iverilog» с флагом -tvlog95:
...
Копировать
% iverilog -tvlog95 -o my_design_95.v my_design.v

Сгенерированный Verilog будет помещен в один файл (по умолчанию a.out), даже если входной Verilog разбросан по нескольким файлам.

16.5.2. Флаги генератора

16.5.3. Конструкции, которые не могут быть преобразованы в Verilog, совместимый с 1995 годом

Следующие конструкции Verilog не могут быть переведены в 1995-совместимый Verilog:

Расширения Icarus, которые не могут быть переведены:

16.5.4. Известные проблемы и ограничения

Некоторые вещи просто не доделаны и должны генерировать соответствующее предупреждение. Вот список основных моментов, на которые еще нужно обратить внимание.

16.6. Генератор кода PCB (-tpcb)

Генератор целевого кода PCB разработан для того, чтобы позволить пользователю ввести нетлист в формате Verilog, а затем сгенерировать входные файлы для программы GNU PCB layout.

16.6.1. Вызов

Генератор целевого кода PCB вызывается с помощью флага -tpcb в команде iverilog. Выходной файл по умолчанию, «a.out», содержит сгенерированный файл .PCB. Для явного задания имени выходного файла используйте флаг «-o». Выходной файл по умолчанию содержит только элементы. Чтобы сгенерировать файл «netlist», добавьте флаг командной строки «-pnetlist=».

В целом, этот пример генерирует файлы foo.net и foo.pcb из исходного файла foo.v:
...
Копировать
% iverilog -tpcb –o foo.pcb -pnetlist=foo.net foo.v

16.6.2. Флаги

16.6.3. Краткое описание атрибутов

Атрибуты присоединяются к различным конструкциям с помощью синтаксиса атрибутов Verilog «(* *)».

16.6.4. Сводка параметров

Внутри модулей генератор кода PCB использует определенные параметры для управления деталями. Параметры могут иметь значения по умолчанию и могут быть переопределены с помощью обычного синтаксиса переопределения параметров Verilog. Параметры имеют предпочтительные типы.

16.7. Генератор кода ПЛИС (-tfpga)

16.7.1. Предупреждение

В настоящее время этот генератор кода не входит в состав Icarus Verilog.

Генератор кода FPGA поддерживает различные устройства FPGA, записывая XNF или EDIF в зависимости от цели. Вы можете выбрать архитектуру устройства и подробное название детали. Архитектура используется для выбора библиотечных примитивов, а подробное имя детали записывается в сгенерированный файл для использования последующими инструментами.

16.7.2. Вызов Движка FPGA

Генератор кода вызывается с флагом -tfpga в iverilog. Он понимает параметры part= и arch=, которые могут быть установлены с помощью флага -p в iverilog:
...
Копировать
iverilog -parch=virtex -ppart=v50-pq240-6 -tfpga foo.vl

В этом примере выбрана архитектура Virtex, а номер детали указан как v50-pq240-6. Выходные данные записываются в файл a.out, если только не указан другой выходной файл с помощью флага -o.

Ниже приведен список типов архитектур, которые поддерживает данный генератор кода.

16.7.3. Корневые порты XNF

ПРИМЕЧАНИЕ: По мере перехода деталей на формат EDIF поддержка XNF будет постепенно прекращена. Текущие средства реализации Xilinx принимают файлы в формате EDIF даже для старых деталей, а средства реализации, не относящиеся к Xilinx, не принимают ничего другого.

Когда выходным форматом является XNF, генератор кода будет генерировать записи «SIG» для сигналов, являющихся портами корневого модуля. Имя объявляется как внешний вывод, который этот макрос делает доступным.

Имя, присвоенное контакту макроса, генерируется из базового имени сигнала. Если сигнал имеет ширину в один бит, то имя пина будет точно соответствовать имени порта модуля. Если порт является вектором, то номер пина задается как вектор. Например, модуль:
...
Копировать
module main(out, in);
    output out;
    input [2:0] in;
    [...]
endmodule
приводит к этим SIG, записям:
...
Копировать
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-цели. В качестве имени порта используется базовое имя сигнала, являющегося входом или выходом, с соблюдением регистра.

Однако, поскольку порты являются однобитовыми, имя векторов включает строку «[0]», где число — это номер бита. Например, модуль:
...
Копировать
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)

Порты корневого модуля могут быть назначены на конкретные выводы или на общую колодку. Если у сигнала (который является портом) есть атрибут PAD, то значение этого атрибута представляет собой список мест, по одному на каждый бит сигнала, который определяет пин для каждого бита сигнала. Например:
...
Копировать
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»);
Атрибут «cellref» указывает генератору кода использовать заданную ячейку. Синтаксис значения следующий:
...
Копировать
<тип ячейки>:<имя контакта>,...

Тип ячейки — это имя используемой части библиотеки. Имена выводов — это имена типов в библиотеке, в том порядке, в котором подключены выводы логического устройства.

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
Полученный файл sizer.txt будет содержать:
...
Копировать
**** 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. Использование

Этот генератор кода предназначен для обработки структурного исходного кода Verilog. Чтобы преобразовать проект в формат blif, используйте эту команду:
...
Копировать
% iverilog -tblif -o <path>.blif  <source files>...

Исходными файлами могут быть Verilog, SystemVerilog, VHDL, все, что поддерживает Icarus Verilog, при условии, что они прошли этап элаборации до ограниченного подмножества, которое поддерживает генератор кода. Другими словами, файлы должны быть структурными.

Корневой модуль разработанного проекта становится моделью. Этот модуль может объявлен экземпляром подмодули и так далее по конструкции, завершая его. Выходная модель сплющивается, так что она не вызывает никаких подсхем. Битовые векторы распаиваются на портах модели и внутри нее. Это необходимо, поскольку blif в частности и ABC в целом обрабатывают биты, а не векторы.

16.11.2. ОГРАНИЧЕНИЯ

В настоящее время поддерживаются только явные логические вентили и непрерывные присваивания.

Проект должен содержать только один корневой модуль. Имя этого корневого модуля становится именем модели blif в записи «.model».

Главная
Курсы
Вебинары
1. Руководство по установке Icarus Verilog
2. Начало работы с Icarus Verilog
3. Симуляция с помощью Icarus Verilog
4. Флаги командной строки iverilog
5. Формат командного файла
6. Атрибуты
7. IVLPP — препроцессор IVL
8. Флаги командной строки VVP
9. Интерактивный режим VVP
10. VVP как библиотека
11. Флаги командной строки vhdlpp
12. Icarus Verilog с GTKWave
13. Использование VPI
14. Расширения Icarus Verilog
15. Особенности симулятора
16. Движки
Закрыть