~ cd 14. расширения icarus verilog
Icarus Verilog поддерживает некоторые расширения базового стандарта IEEE 1364. Некоторые из них взяты из расширенных вариантов языка, таких как SystemVerilog, а некоторые являются выражением внутреннего поведения Icarus Verilog, доступного в качестве вспомогательного средства отладки.
14.1. Расширенные типы данных Verilog
Эта функция включается флагом генерации «-gxtypes» и выключается флагом генерации «-gno-xtypes». По умолчанию она включена.
В Icarus Verilog добавлена поддержка расширенных типов данных. Синтаксис расширенных типов основан на предложении компании Cadence Design Systems, первоначально как обновление стандарта IEEE 1364. В настоящее время Icarus Verilog принимает только новые примитивные типы из этого предложения.
SystemVerilog обеспечивает ту же функциональность, используя несколько иной синтаксис. Это расширение поддерживается для обратной совместимости.
- Типы
Расширенные типы данных отделяют понятие сети/переменной от типа данных. И сети, и переменные могут быть объявлены с любым типом данных. Доступны следующие примитивные типы:- logic — привычные 0, 1, x и z, опционально с силой.
- bool — ограничено только 0 и 1
- real — 64-битные вещественные значения.
Сетки с типом logic могут иметь несколько источников с силой, и значение разрешается обычным способом. В логические сети могут передаваться только логические значения, поэтому значения bool, передаваемые в логические сети, неявно преобразуются в логические.
Сетки любого другого типа не могут иметь несколько источников. Компилятор должен обнаружить множественные источники и сообщить об ошибке.
- Декларации
Объявление сети расширяется для включения типа провода, с синтаксисом:
wire <type> <wire-assignment-list>... ;
wire real foo = 1.0;
tri logic bus[31:0];
wire bool addr[23:0];
... и так далее.
Объявление переменных происходит аналогично. Ключевое слово «reg» используется для указания, что это переменная. Переменные могут иметь те же типы данных, что и сети.
- Порты
Порты модулей и задач в стандартном Verilog ограничены логическими типами. Данное расширение снимает это ограничение, позволяя любому из перечисленных типов проходить через порт в соответствии с непрерывным присваиванием, которая передает тип переменной. - Выражения
Выражения в лице вещественных значений рассматриваются в базовом стандарте Verilog.
Тип bool поддерживает те же операторы, что и тип logic, с очевидными отличиями, обусловленными ограниченностью области.
Операторы сравнения (не case) возвращают логику, если любой из их операндов является логикой. Если оба являются bool или real (включая смесь bool и real), то результатом будет bool. Это связано с тем, что сравнение bool и real всегда возвращает в точности true или false.
Сравнение случаев возвращает bool. Это отличается от базового Verilog, который, строго говоря, возвращает логику, но только значения 0 или 1.
Арифметические операторы возвращают real, если один из их операндов является real, в противном случае они возвращают logic, если один из их операндов является logic. Если оба операнда являются bool, они возвращают bool.