1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/zhouxs1023-iverilog

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Система компиляции ICARUS Verilog

Авторское право 2000—2019 года Стивена Уильямса

Содержание

  1. Что такое ICARUS Verilog?
  2. Компиляция/Установка Icarus Verilog из исходников
  3. Как работает Icarus Verilog
  4. Запуск iverilog
  5. Неподдерживаемые конструкции
  6. Нестандартные конструкции или поведение
  7. Кредиты

Что такое ICARUS Verilog?

ICARUS Verilog предназначен для компиляции всех конструкций языка Verilog HDL, как это описано в стандарте IEEE-1364. Конечно, он ещё не достиг этой цели полностью. В настоящее время система поддерживает смесь структурных и поведенческих конструкций. Для получения информации о текущем состоянии Icarus Verilog посетите его домашнюю страницу по адресу https://steveicarus.github.io/iverilog/.

ICARUS Verilog не направлен на то, чтобы быть традиционным симулятором, а является компилятором, который генерирует код для использования в бэкендовых инструментах.

Для получения инструкций по запуску Icarus Verilog обратитесь к странице справки команды iverilog.

Компиляция/Установка Icarus Verilog из исходников

Если вы начинаете с исходников, процесс сборки спроектирован так, чтобы быть максимально простым. Человек, имеющий базовое понимание целевой системы и компиляции 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

Компиляция из GitHub

Если вы собираете из 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.

Как работает Icarus Verilog

Этот инструмент включает в себя парсер, который читает 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不能覆盖以这种方式处理的函数定义。另一方面,这样可以使它们可综合,并允许更激进的常量传播。以下系统函数以这种方式处理:

  • `$bits$
  • `$signed$
  • `$sizeof$
  • `$unsigned$

这些系统函数在VPI模块中的实现将被忽略。

预处理器库模块

Icarus Verilog 对从库加载的预处理模块进行了预处理,但这仅限于那些通过-y机制加载的库文件。然而,在编译期间定义的宏只有那些由文件本身或命令行或命令文件定义的才会生效。

具体来说,非库源文件中定义的宏不会被记住当库模块加载时。这是有意为之的。否则,根据库加载顺序的不同,编译结果可能有所不同,而这太不可预测了。

据说一些商业编译器确实允许宏定义跨越库模块。这真是奇怪的现象。

时间格式中的宽度字段

标准Verilog不允许在%t格式化字符串中的宽度字段。例如,这是非法的:

	$display("Time is %0t", $time);

标准Verilog依赖于$timeformat来完全指定格式。Icarus Verilog позволяет программистам указывать ширину полей. В Icarus Verilog, работа %t формата полностью совпадает со стандартным Verilog. Однако, если программист выбирает минимальную ширину (например, %5t), то Icarus Verilog будет использовать указанную минимальную ширину вместо значения $timeformat.

Итератор vpiScope для объектов vpiScope

В VPI стандартным методом для перебора объектов vpiScope внутри другого объекта vpiScope является использование итератора vpiInternalScope. Icarus Verilog добавляет поддержку итератора vpiScope для перебора всех объектов внутри текущего диапазона. Это очень полезно для ситуаций, где требуется перебор всех объектов без явной итерации всех вложенных типов.

Решение проблем времени 0

Комбинированная логика часто моделируется с помощью блока 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 )

Вы можете оставить комментарий после Вход в систему

Введение

Icarus Verilog предназначен компилировать весь Verilog HDL, как описано в стандарте IEEE-1364. Конечно, он ещё не полностью соответствует стандарту. В настоящее время он обрабатывает сочетание структурных и поведенческих конструкций. Чтобы получить представление о текущем состоянии Icarus Verilog, посетите его домашнюю страницу по адресу <http:/... Развернуть Свернуть
GPL-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/zhouxs1023-iverilog.git
git@api.gitlife.ru:oschina-mirror/zhouxs1023-iverilog.git
oschina-mirror
zhouxs1023-iverilog
zhouxs1023-iverilog
master