Авторское право 2000—2019 года Стивена Уильямса
ICARUS Verilog предназначен для компиляции всех конструкций языка Verilog HDL, как это описано в стандарте IEEE-1364. Конечно, он ещё не достиг этой цели полностью. В настоящее время система поддерживает смесь структурных и поведенческих конструкций. Для получения информации о текущем состоянии Icarus Verilog посетите его домашнюю страницу по адресу https://steveicarus.github.io/iverilog/.
ICARUS Verilog не направлен на то, чтобы быть традиционным симулятором, а является компилятором, который генерирует код для использования в бэкендовых инструментах.
Для получения инструкций по запуску Icarus Verilog обратитесь к странице справки команды
iverilog
.
Если вы начинаете с исходников, процесс сборки спроектирован так, чтобы быть максимально простым. Человек, имеющий базовое понимание целевой системы и компиляции C/C++, сможет собрать распределённые исходники с минимальными усилиями. Нужды программиста не требуются, но могут пригодиться в случае возникновения проблем.
Если вы собираете на Windows, обратитесь к файлу mingw.txt.
Вы можете использовать следующую команду:
apt install -y autoconf gperf make gcc g++ bison flex
Для компиляции Icarus Verilog из исходников на UNIX-подобной системе вам потребуется следующее программное обеспечение:
GNU Make Файлы Makefile используют некоторые расширения GNU, поэтому базовый POSIX make не будет работать. На большинстве Linux систем обычно уже установлен удовлетворительный make. На BSD-основанных системах (например, NetBSD, FreeBSD) GNU make обычно доступен как программа gmake.
ISO C++ компилятор Программы ivl и ivlpp написаны на C++ и используют шаблоны и часть стандартной библиотеки C++. Компиляторы egcs и недавние версии GCC с соответствующей библиотекой libstdc++ известны своей совместимостью. MSVC++ 5 и 6 точно не подходят.
bison и flex Примечание для macOS: bison 2.3, распространяемый вместе с MacOS, включая Catalina, генерирует сломанный код, но версии bison 3+ работают корректно. Мы рекомендуем использовать версии bison и flex от проекта Fink (finkproject.org), а также версии от brew.
gperf 3.0 или более поздняя версия Лексический анализатор не распознает ключевые слова напрямую, а вместо этого сначала выполняет поиск символов и затем использует хеш-таблицу для получения правильного лексического кода. Программа gperf генерирует эту таблицу поиска.
Проблемы с этим программным обеспечением являются наиболее частыми причинами трудностей. Обратитесь к часто задаваемым вопросам Icarus Verilog.
readline 4.2 или более поздняя версия На Linux системах это обычно означает readline-devel rpm. Во всяком случае, необходимы заголовочные файлы readline.
termcap Библиотека readline, в свою очередь, использует termcap.
Если вы собираетесь из git, вам также потребуется программное обеспечение для генерации скриптов configure.
autoconf 2.53 или более поздняя версия Это генерирует скрипты configure из configure.ac. Версии 2.53 и более поздние известны своей совместимостью, autoconf 2.13 известен тем, что не работает.
Распакуйте tar-ball, выполните cd
в директорию verilog-#########
, и скомпилируйте исходники с помощью следующих команд:
./configure
make
Если вы собираете из git, вам следует выполнить следующую команду перед компиляцией исходников. Она создаст файл "configure", который автоматически создаётся при распаковке tarball.
sh autoconf.sh
./configure
make
Обычно эта команда автоматически определяет всё, что ей требуется знать. Она обычно работает довольно хорошо. Есть несколько флагов к скрипту configure, которые изменяют его поведение:
--prefix=<root>
По умолчанию это /usr/local, что приводит к тому, что набор инструментов компилируется для установки в /usr/local/bin,
/usr/local/share/ivl и т.д.
Я рекомендую использовать --prefix=/usr при конфигурации для предварительно скомпилированных двоичных файлов. На системах Solaris часто используется --prefix=/opt. Вы можете конфигурировать для неразрешенного установки с --prefix=$HOME.
``` --enable-suffix
--enable-suffix=<ваш-суффикс>
--disable-suffix
Включение/выключение изменения имен установленных файлов путём добавления суффикса строки, чтобы эта версия или установка могла существовать параллельно с другими версиями. Это переименовывает установленные команды (iverilog, iverilog-vpi, vvp) и установленные библиотечные файлы и каталоги включений таким образом, чтобы установки с одинаковым префиксом, но различными суффиксами гарантированно не мешали друг другу.
--host=<host-type>
Компиляция iverilog для другой платформы. Можно использовать:
x64_64-w64-mingw32 для создания 64-битных исполняемых файлов Windows
i686-w64-mingw32 для создания 32-битных исполняемых файлов Windows
Оба варианта требуют установки необходимых пакетов mingw-w64.
Чтобы выполнить простое тестирование до установки, выполните
make check
Команды, выводимые этим запуском, помогут вам запустить Icarus Verilog на своих собственных исходниках Verilog до того, как пакет будет установлен root.
Теперь установите файлы в подходящее место. (Файлы makefiles по умолчанию устанавливаются в /usr/local, если вы не указали другой префикс с помощью флага --prefix=<path>
к команде configure.) Вам может потребоваться выполнить это как root, чтобы получить доступ к каталогам установки.
make install
Сгенерированные файлы makefiles также содержат цель uninstall. Это должно удалить все файлы, созданные командой make install
.
Этот инструмент включает в себя парсер, который читает Verilog (с дополнениями) и генерирует внутренний сетлист. Сетлист передается через различные этапы обработки, которые трансформируют дизайн в более оптимальные/практические формы, после чего передаются в генератор кода для окончательного выхода. Этапы обработки и генератор кода выбираются посредством командной строки.
Существует отдельная программа ivlpp
, которая выполняет предварительную обработку. Эта программа реализует директивы `include
и `define
, производя эквивалентный выход без этих директив. Выход представляет собой единственный файл с директивами номеров строк, так что фактический компилятор видит только единственный входной файл. Подробнее см. ivlpp/ivlpp.txt
.
Компилятор Verilog начинает работу с парсинга файла исходного кода Verilog. Выход парсера — это список объектов типа Module в "pform". Pform (см. pform.h
) в основном представляет прямое отражение шага компиляции. Может присутствовать ссылки на неопределенные объекты, и пока неясно, какой модуль является корневым.
Человек может просмотреть человекочитаемую версию окончательного pform, используя флаг -P <path>
к подкоманде ivl
. Это заставляет ivl записывать pform в файл, названный <path>
. (Примечание: этот шаг обычно не выполняется, кроме случаев отладки подкоманды ivl
.)
Этот этап принимает pform и генерирует сетлист. Драйвер выбирает (по запросу пользователя или случайно) корневой модуль для элаборации, разрешает ссылки и расширяет инстанции, чтобы сформировать сетлист дизайна. (См. netlist.txt.) Окончательные семантические проверки выполняются во время элаборации, а также выполняются некоторые простые оптимизации. Сетлист включает все поведенческие описания, а также ворты и провода.
Функция elaborate()
выполняет элаборацию.
Человек может просмотреть человекочитаемую версию окончательного, элаборированного и оптимизированного сетлиста, используя флаг -N <path>
к компилятору. Если элаборация завершена успешно, окончательный сетлист (то есть после оптимизации, но до генерации кода) будет записан в файл, названный <path>
.
Элаборация выполняется в два этапа: области и параметры сначала, затем структурные и поведенческие части.
Этот проход просматривает pform в поисках областей и параметров. Создается дерево объектов NetScope и помещается в объект Design, с корневым модулем представленным корневым объектом NetScope. Файл elab_scope.cc
содержит основную часть кода для обработки этого этапа.
Хвост поведения elaborate_scope (после того, как pform был просмотрен) включает просмотры дерева NetScope для поиска defparam назначений, собранных во время элаборации областей. Это когда применяются defparam замены к параметрам.
После того, как области и параметры были созданы и дерево NetScope полностью сформировано, элаборация снова просматривает pform, теперь генерируя структурный и поведенческий сетлист. Параметры элаборированы и оценены, так что все константы генерации кода теперь известны локально, так что сетлист можно сгенерировать просто просматривая pform.
Это коллекция шагов обработки, выполняющих оптимизации, которые не зависят от целевой технологии. Примерами некоторых полезных преобразований являются:
Фактические функции, выполняемые в этих шагах, указываются на командной строке программы ивл
при помощи флагов -F
(см. ниже).
Этот этап использует сетевые списки дизайна для запуска генератора кода (см. файл target.h
). Может потребоваться трансформация дизайна для его приведения к нужному виду для технологии.
Метод emit()
класса Design
выполняет этот шаг. Он проходит через элементы дизайна, вызывая необходимые функции цели для генерации реального выходного кода.
Пользователь выбирает генератор кода цели с помощью флага -t
на командной строке.
ВНИМАНИЕ: Синтаксис атрибута
$
будет скоро устареть в пользу стандарта атрибутов Verilog-2001, который более чистый и стандартизирован.Парсер принимает, как расширение к Verilog, модульный элемент$attribute$.
Синтаксис элемента$attribute$
следующий:
$attribute (<идентификатор>, <ключ>, <значение>);
Ключевое слово $attribute$
выглядит как вызов системной задачи. Отличие здесь заключается в том, что параметры более ограничены по сравнению с параметрами системной задачи. <идентификатор>
должен быть идентификатором. Это будет объект, которому требуется атрибут. <ключ>
и <значение>
— это строки, а не выражения, которые предоставляют ключ и значение атрибута соответственно.
Атрибуты представлены парами [<ключ> <значение>]
и используются для передачи информации между различными шагами обработки. Смотрите документацию для конкретного шага обработки для получения списка подходящих атрибутов.
Атрибуты также могут применяться к типам шины. Когда это делается, атрибут применяется ко всем экземплярам примитива. Синтаксис для заявления атрибута тот же, за исключением того, что <идентификатор>
указывает на примитив ранее в единице компиляции, а заявление находится в глобальной области вместо внутри модуля. Точка с запятой не является частью типа атрибута.
Обратите внимание, что атрибуты также иногда используются для связи между шагами обработки. Шаги обработки, осведомленные о других, могут помещать атрибуты на объекты сетевых списков для передачи информации последующим шагам.
Icarus Verilog также принимает синтаксис атрибутов Verilog 2001. Они имеют ту же общую семантику, что и синтаксис $attribute$,
но они прикрепляются к объектам по положению, а не по имени. Также, ключ — это идентификатор Verilog, а не строка.
iverilog
Предпочтительный способ запуска компилятора — использование команды iverilog
. Эта программа запускает препроцессор (ivlpp
) и компилятор (ivl
) с правильными параметрами командной строки для выполнения работы в удобном виде. Смотрите страницу справки iverilog
для деталей использования.
Пример: Компиляция "hello.vl"
// ------------------------ hello.vl ----------------------------
module main();
initial
begin
$display("Привет, мир!");
$finish;
end
endmodule
// --------------------------------------------------------------
Убедитесь, что iverilog
есть в вашем пути поиска, и библиотека vpi доступна.
Чтобы скомпилировать программу:
iverilog hello.vl
(Вышеупомянутое предполагает, что /usr/local/include
и /usr/local/lib
являются частями пути поиска компилятора, что обычно так и есть для gcc
.)
Чтобы запустить сгенерированную программу:
./a.out
Вы можете использовать флаг -o
для указания выходного файла, созданного компилятором. Смотрите страницу справки iverilog
.
Icarus Verilog находится в разработке — поэтому он пока поддерживает лишь часть (растущую) функциональности Verilog. Ниже дано описание некоторых неподдерживаемых функций Verilog. Этот список не исчерпывающий и не учитывает ошибки в компиляторе. Посмотрите страницу проекта Icarus Verilog для текущего состояния поддержки Verilog, особенно базу данных отчетов об ошибках.
Системные функции поддерживаются, но возвращаемое значение немного сложнее. Смотрите СИСТЕМИНФО ТАБЛИЦЫ ФАЙЛОВ в справке iverilog
.
Блоки specify
парсятся, но игнорируются в общем случае.
trireg
не поддерживается. tri0
и tri1
поддерживаются.
Примитивы tran
, то есть tran
, tranif1
, tranif0
, rtran
, rtranif1
, и rtranif0
не поддерживаются.
Делая проводников, формы wire #N foo;
не работают. Другие контексты, в которых задержки поддерживаются, работают правильно, включая форму V2001 wire #5 foo = bar;
.
Управление событиями внутри неблокирующих назначений не поддерживаются. Например: a <= @(posedge clk) b;
.
Аргументы макросов не поддерживаются. Макросы #define
поддерживаются, но они не могут принимать аргументы.
Icarus Verilog включает некоторые возможности, которые не являются частью стандарта IEEE1364, но имеют хорошо определённое значение, и также иногда даёт расширенное (но нестандартное) значение некоторым функциям языка, которые определены. Посмотрите документацию "extensions.txt" для более подробной информации.
`$is_signed(<выражение>)$
Эта система функция возвращает 1, если выражение является знаковым, или 0 в противном случае. Это主要用于编译器回归测试。
$sizeof(<表达式>)
, $bits(<表达式>)
系统函数 $bits
返回其参数表达式的位数。如果该参数没有自定义大小,则此函数的结果未定义。
$sizeof
函数已弃用,推荐使用 $bits
,这两个函数具有相同的功能,但后者包含在SystemVerilog定义中。
$simtime
系统函数 $simtime
以64位值的形式返回仿真时间,不按局部作用域的时间单位进行缩放。这与 $time
和 $stime
函数不同,它们返回的是缩放后的时间。这个函数是为了编译器和运行时的回归测试而添加的,也可以被应用程序用来获取仿真时间。
请注意,仿真时间可能会因设计中的多个 timescale
而变得复杂。通常无法预测仿真的精度会是多少。
$mti_random()
, $mti_dist_uniform
这些函数类似于IEEE1364标准的 $random
函数,但是它们使用梅森扭发生算法(Mersenne Twister)。这是一个优秀的随机数生成器,但它不会产生与标准化 $random
相同的序列。
某些系统函数有明确的含义,因此可以在编译时而不是通过VPI代码来评估。这样做意味着VPI不能覆盖以这种方式处理的函数定义。另一方面,这样可以使它们可综合,并允许更激进的常量传播。以下系统函数以这种方式处理:
这些系统函数在VPI模块中的实现将被忽略。
Icarus Verilog 对从库加载的预处理模块进行了预处理,但这仅限于那些通过-y机制加载的库文件。然而,在编译期间定义的宏只有那些由文件本身或命令行或命令文件定义的才会生效。
具体来说,非库源文件中定义的宏不会被记住当库模块加载时。这是有意为之的。否则,根据库加载顺序的不同,编译结果可能有所不同,而这太不可预测了。
据说一些商业编译器确实允许宏定义跨越库模块。这真是奇怪的现象。
标准Verilog不允许在%t格式化字符串中的宽度字段。例如,这是非法的:
$display("Time is %0t", $time);
标准Verilog依赖于$timeformat来完全指定格式。Icarus Verilog позволяет программистам указывать ширину полей. В Icarus Verilog, работа %t
формата полностью совпадает со стандартным Verilog. Однако, если программист выбирает минимальную ширину (например, %5t
), то Icarus Verilog будет использовать указанную минимальную ширину вместо значения $timeformat
.
В VPI стандартным методом для перебора объектов vpiScope внутри другого объекта vpiScope является использование итератора vpiInternalScope. Icarus Verilog добавляет поддержку итератора vpiScope для перебора всех объектов внутри текущего диапазона. Это очень полезно для ситуаций, где требуется перебор всех объектов без явной итерации всех вложенных типов.
Комбинированная логика часто моделируется с помощью блока always. Однако, если входы комбинированного блока инициализируются в начальных заявлениях, это может привести к конфликтам. Icarus Verilog немного модифицировал расписание времени 0, чтобы обеспечить выполнение всегда-блоков ANYEDGE чувствительности до других потоков. Это вызывает выполнение комбинированных блоков always при инициализации значений в списке чувствительности начального потока.
Icarus Verilog поддерживает расширенную синтаксическую конструкцию для явного указания типа для проводов и регистров. Поддерживаются типы, такие как логический, булевый и вещественный. Это значит, что logic
и bool
стали новыми ключевыми словами. Примеры использования:
wire real foo = 1.0;
reg logic bar, bat;
Эта возможность можно отключить с помощью флага -g2
в iverilog
, и снова включить с помощью флага -g2x
.
Кроме случаев, когда это указано явно, Icarus Verilog, ivl и ivlpp являются Copyright Stephen Williams. Примечательные уведомления содержатся в начале каждого файла. Однако, мне уже давно помогали с исправлениями, консультациями по Verilog и особенно тестированием многие люди. В группе тестировщиков, в частности, включены более широкие круги людей, заинтересованных в GPL версии Verilog для Linux.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )