- 4.1 Набор значений
- 4.2 Сети(провода) и переменные
- 4.2.1 Сети
- 4.2.2 Объявления переменных
- 4.3 Векторы
- 4.3.1 Объявление векторов
- 4.3.2 Доступность векторной сети
- 4.4 Сильные стороны
- 4.4.1 Сила заряда
- 4.4.2 Сила источника
- 4.5 Неявные декларации
- 4.6 Типы сетей
- 4.6.1 wire и tri сети
- 4.6.2 Wire сети
- 4.6.3 Trireg провода
- 4.6.3.1 Емкостные сети
- 4.6.3.2 Идеальное емкостное состояние и распад заряда
- 4.6.4 Сетки Tri0 и Tri1
- 4.6.5 Неразрешенные сети
- 4.6.6 Сети питания
- 4.7 Regs
- 4.8 Integer, real, time и realtime
- 4.8.1 Операторы и вещественные числа
- 4.8.2 Конверсия
- 4.9 Массивы
- 4.9.1 Wire массивы
- 4.9.2 Reg и переменные массивы
- 4.9.3 Память
- 4.9.3.1 Примеры массивов
- 4.10 Параметры
- 4.10.1 Параметры модуля
- 4.10.2 Локальные параметры (localparam)
- 4.10.3 Специальные параметры
- 4.11 Именные пространства

4.1 Набор значений
Набор значений Verilog HDL состоит из четырех основных значений:
0 — представляет собой логический ноль, или ложное состояние
1 — представляет логическую единицу, или истинное состояние
x — представляет неизвестное логическое значение
z — представляет собой высокоимпедансное состояние
Значения 0 и 1 являются логическими дополнениями друг друга.
Когда значение z присутствует на входе строба или встречается в выражении, эффект обычно такой же, как и от значения x. Заметным исключением являются примитивы на основе металлооксидных полупроводников (МОП), которые могут пропускать значение z.
Почти все типы данных в Verilog HDL хранят все четыре основных значения. Исключение составляют тип event (см. 9.7.3), который не имеет хранилища, и тип real (см. 4.8). Все биты векторов могут быть независимо установлены в одно из четырех базовых значений.
Язык включает информацию о силе в дополнение к основной информации о значении для чистых переменных. Подробно это описано в разделе 7.
4.2 Сети(провода) и переменные
Существуют две основные группы типов данных: переменные и сети. Эти две группы различаются по способу присвоения и хранения значений. Они также представляют различные аппаратные структуры.
4.2.1 Сети
Типы данных сети(провода) могут представлять физические связи между структурными объектами, такими как вентили. Сеть не должна хранить значение (за исключением сети trireg). Вместо этого ее значение определяется значениями ее элементов источников, таких как непрерывное присваивание или вентиля. Если к сети не подключен источник, то ее значение должно быть высокоимпедансным (z), если только сеть не является trireg, в этом случае она будет иметь ранее управляемое значение. Повторное объявление имени, уже объявленного при объявлении сети, параметра или переменной, является ошибкой (см. 4.11).
Синтаксис объявление сетей приведен в разделе Синтаксис 4-1.
net_declaration ::=
net_type [ signed ]
[ delay3 ] list_of_net_identifiers ;
| net_type [ drive_strength ] [ signed ]
[ delay3 ] list_of_net_decl_assignments ;
| net_type [ vectored | scalared ] [ signed ]
range [ delay3 ] list_of_net_identifiers ;
| net_type [ drive_strength ] [ vectored | scalared ] [ signed ]
range [ delay3 ] list_of_net_decl_assignments ;
| trireg [ charge_strength ] [ signed ]
[ delay3 ] list_of_net_identifiers ;
| trireg [ drive_strength ] [ signed ]
[ delay3 ] list_of_net_decl_assignments ;
| trireg [ charge_strength ] [ vectored | scalared ] [ signed ]
range [ delay3 ] list_of_net_identifiers ;
| trireg [ drive_strength ] [ vectored | scalared ] [ signed ]
range [ delay3 ] list_of_net_decl_assignments ;
net_type ::=
supply0 | supply1
| tri | triand | trior | tri0 | tri1 | uwire | wire | wand | wor
drive_strength ::=
( strength0 , strength1 )
| ( strength1 , strength0 )
| ( strength0 , highz1 )
| ( strength1 , highz0 )
| ( highz0 , strength1 )
| ( highz1 , strength0 )
strength0 ::= supply0 | strong0 | pull0 | weak0
strength1 ::= supply1 | strong1 | pull1 | weak1
charge_strength ::= ( small ) | ( medium ) | ( large )
delay3 ::=
# delay_value
| # ( mintypmax_expression [ , mintypmax_expression [ , mintypmax_expression ] ] )
delay2 ::=
# delay_value
| # ( mintypmax_expression [ , mintypmax_expression ] )
delay_value ::=
unsigned_number
| real_number
| identifier
list_of_net_decl_assignments ::=
net_decl_assignment { , net_decl_assignment }
list_of_net_identifiers ::=
net_identifier { dimension }
{ , net_identifier { dimension } }
net_decl_assignment ::=
net_identifier = expression
dimension ::=
[ dimension_constant_expression : dimension_constant_expression ]
range ::=
[ msb_constant_expression : lsb_constant_expression ]
Первые две формы объявления сетей описаны в этом разделе. Третья форма, называемая назначением сети, описана в разделе 6.
Значением инициализации по умолчанию для сети должно быть значение z. Сети с источниками должны принимать выходное значение своих источников. Исключением является сеть trireg. Сеть trireg по умолчанию принимает значение x, с силой, указанной в объявлении сети (small, medium или large).
4.2.2 Объявления переменных
Переменная — это абстракция элемента хранения данных. Переменная должна хранить значение от одного присваивания до другого. Оператор присваивания в процедуре действует как trireg, который изменяет значение в элементе хранения данных. Значением инициализации для типов данных reg, time и integer должно быть неизвестное значение x. Значением инициализации по умолчанию для типов данных real и realtime variable должно быть 0.0. Если используется присвоение объявления переменной (см. 6.2.1), переменная должна принять это значение, как если бы присвоение происходило в блокирующем присвоении в initial конструкции. Повторное объявление имени, уже объявленного сетью, параметром или объявлением переменной, является незаконным.
В предыдущих версиях настоящего стандарта термин «регистр» использовался для охвата регистров reg, integer, time, real, и realtime, но этот термин больше не используется в качестве типа данных Verilog.
Перевод Официального Стандарта Verilog HDL
Синтаксис объявления переменных приведен в Синтаксисе 4-2.
integer_declaration ::=
integer list_of_variable_identifiers ;
real_declaration ::=
real list_of_real_identifiers ;
realtime_declaration ::=
realtime list_of_real_identifiers ;
reg_declaration ::=
reg [ signed ] [ range ] list_of_variable_identifiers ;
time_declaration ::=
time list_of_variable_identifiers ;
real_type ::=
real_identifier { dimension }
| real_identifier = constant_expression
variable_type ::=
variable_identifier { dimension }
| variable_identifier = constant_expression
list_of_real_identifiers ::=
real_type { , real_type }
list_of_variable_identifiers ::=
variable_type { , variable_type }
dimension ::=
[ dimension_constant_expression : dimension_constant_expression ]
range ::=
[ msb_constant_expression : lsb_constant_expression ]
Если набор сетей или переменных имеет одинаковые характеристики, они могут быть объявлены в одном объявлении.
Сетям и переменным можно присваивать отрицательные значения, но только integer, real, realtime, и знаковые переменные reg и сетки должны сохранять значение знака. Временные и беззнаковые переменные и беззнаковые сети должны рассматривать присвоенное им значение как беззнаковое присвоенное им значение как беззнаковое. См. раздел 5.1.6 для описания того, как знаковые и беззнаковые сети и переменные обрабатываются некоторыми операторами Verilog.
Перевод Официального Стандарта Verilog HDL
4.3 Векторы
Объявление net или reg без спецификации диапазона считается шириной в 1 бит и называется скаляр. Многоразрядные типы данных net и reg должны быть объявлены с указанием диапазона, который называется вектором.
4.3.1 Объявление векторов
Спецификация диапазона задает адреса отдельных битов в многобитовой wire или reg. Старший бит, заданный константным выражением msb, является левым значением в диапазоне, а младший бит, заданный константным выражением lsb, является правым значением в диапазоне.
И постоянное выражение msb, и постоянное выражение lsb должны быть постоянными целочисленными выражениями. Константные выражения msb и lsb могут быть любыми целыми значениями — положительными, отрицательными или нулевыми. Значение lsb может быть больше, равно или меньше значения msb.
Векторные сети и регистры должны подчиняться законам арифметики по модулю 2 до степени n, где n — количество битов в векторе. Векторные сетки и регистры должны рассматриваться как величины без знака, если только wire или reg не объявлены как знаковые или не подключены к порту, который объявлен как знаковый (см. 12.2.3).
wand w; // скалярная сеть типа "wand"
tri [15:0] busa; // 16-битная шина с тремя состояниями
trireg (small) storeit; // узел хранения заряда силы small
reg a; // скалярный reg
reg [3:0] v; // 4-битный вектор reg, состоящий из (от наибольшего до наименьшее значение) v[3], v[2], v[1] и v[0]
reg signed [3:0] signed_reg; // 4-битный вектор в диапазоне от -8 до 7
reg [-1:4] b; // 6-битный вектор reg
wire w1, w2; // объявляет два провода
reg [4:0] x, y, z; // объявляет три 5-битных регистра
Реализации могут устанавливать ограничение на максимальную длину вектора, но ограничение должно быть не менее 65536 (2^16 ) бит.
Реализации не обязаны обнаруживать переполнение целочисленных операций.
4.3.2 Доступность векторной сети
Vectored и scalared являются необязательными рекомендательными ключевыми словами, которые должны использоваться в объявлении векторной wire или reg. Если эти ключевые слова реализованы, определенные операции над векторами могут быть ограничены. Если используется ключевое слово vectored, то битовые и частичные выборки, а также спецификации силы могут быть запрещены, и PLI может считать объект нерасширенным. Если используется ключевое слово scalared, то битовые и частичные выделения объекта разрешены, и PLI будет считать объект расширенным.
tri1 scalared [63:0] bus64; // шина, которая будет расширена
tri2 vectored [31:0] data; // шина, которая может быть или не быть расширенной
4.4 Сильные стороны
В сетевой декларации можно указать два типа прочности следующим образом:
- Сила заряда должна использоваться только при декларировании сети типа trireg.
- Сила источника должна использоваться только при размещении непрерывного назначения на сетку в том же объявлении, которое объявляет сетку.
В объявлениях вентиля также может быть указана сила источника. Более подробную информацию о вентилях и о силе привода см. в разделе 7.
4.4.1 Сила заряда
Спецификация силы заряда должна использоваться только с сетками trireg. Для моделирования хранения заряда должна использоваться сетка trireg. Сила заряда должна определять относительный размер емкости, обозначаемой одним из следующих ключевых слов:
- small(маленький)
- medium(средний)
- large(большой)
По умолчанию сила заряда сети trireg должна быть medium.
Сетка trireg может моделировать узел хранения заряда, заряд которого убывает со временем. Время моделирования спада заряда должно быть указано в спецификации задержки для сети trireg (см. 7.14.2).
trireg a; // trireg сеть средней силы заряда
trireg (large) #(0,0,50) cap1; // trireg сеть с значением силы large
// с временем распада заряда 50 единиц времени
trireg (small) signed [3:0] cap2; // знаковый 4-битный вектор trireg из
// сила заряда небольшая
4.4.2 Сила источника
Спецификация силы источника позволяет помещать непрерывное присваивание в сеть в том же операторе, который объявляет эту сеть. Подробнее см. разделе 6. Свойства силы сети подробно описаны в разделе 7.
4.5 Неявные декларации
Для явного объявления сеток и переменных должен использоваться синтаксис, показанный в 4.2. При отсутствии явного объявления неявная сеть типа wire по умолчанию должна приниматься в следующих обстоятельствах:
- Если в объявлении выражения порта используется идентификатор, то предполагается неявная сеть типа wire по умолчанию с шириной вектора, указанной в объявлении выражения порта. Обсуждение деклараций выражения порта см. в разделе 12.3.3.
- Если идентификатор используется в списке выводов экземпляра примитива или экземпляра модуля, и этот идентификатор не был объявлен ранее в области видимости, в которой появляется экземпляр, или в любой области видимости, на объявления которой можно непосредственно ссылаться из области видимости, в которой появляется экземпляр (см. 12.7), то предполагается неявная скалярная сеть описанная в директиве default_nettype.
- Если идентификатор появляется в левой части непрерывного оператора присваивания, и этот идентификатор не был объявлен ранее в области видимости, где появляется непрерывный оператор присваивания, или в любой области видимости, на объявления которой можно непосредственно ссылаться из области видимости, где появляется непрерывный оператор присваивания (см. 12.7), то предполагается неявная скалярная сеть типа директивы default_nettype. Обсуждение непрерывных операторов присваивания см. в разделе 6.1.2.
Неявное объявление сети принадлежит области видимости, в которой появляется ссылка на сеть. Например, если неявная сеть объявлена ссылкой в блоке generate, то сеть неявно объявлена только в этом блоке generate. Последующие ссылки на сеть вне блока generate или в другом блоке generate в том же модуле либо будут незаконными, либо создадут еще одно неявное объявление другой сети (в зависимости от того, удовлетворяет ли ссылка вышеуказанным критериям). Информацию о блоках generate см. в разделе 12.4.
См. раздел 19.2 для обсуждения контроля типа для неявно объявленных сетей с помощью `default_nettype директива компилятора.
4.6 Типы сетей
Существует несколько различных типов сетей, как показано в таблице 4-1.
Сеть | Сеть | Сеть | Сеть |
---|---|---|---|
wire | tri | tri0 | supply0 |
wand | triand | tri1 | supply1 |
wor | trior | trireg | uwire |
4.6.1 wire и tri сети
Сети типа wire и tri соединяют элементы. Типы сетей wire и tri должны быть идентичны по синтаксису и функциям. Lва имени предусмотрены для того, чтобы имя сети могло указывать на назначение сети в данной модели. Wire сеть может использоваться для сетей, которые управляются одним вентилем или непрерывным назначением. Тип tri сеть может использоваться, когда сетка управляется несколькими источниками.
Логические коллизии от нескольких источников одинаковой силы на wire или в tri сети приводят к х (неизвестным) значениям.
Таблица 4-2 — это таблица истинности для решения проблемы нескольких источников в wire и tri сетях. Она предполагает равную силу для обоих источников. Обсуждение моделирования логической силы см. в разделе 7.9.
wire/tri | 0 | 1 | x | z |
---|---|---|---|---|
0 | 0 | x | x | 0 |
1 | x | 1 | x | 1 |
x | x | x | x | x |
z | 0 | 1 | x | z |
4.6.2 Wire сети
Wire сети бывают типа wor, wand, trior и triand и используются для моделирования проводных логических конфигураций. Проводные сети используют различные таблицы истинности для разрешения конфликтов, возникающих, когда несколько источников управляют одной сетью.
Сетки wor и trior должны создавать wire or конфигурации таким образом, чтобы при значении 1 любого из источников результирующее значение сети было 1. Сетки wand и triand должны создавать wire and конфигурации таким образом, чтобы при значении 0 любого источников значение сети было 0.
Сети типы wor и trior должны быть идентичны по синтаксису и функциональности. Типы сетей wand и triand должны быть идентичны по синтаксису и функциональности. В Таблица 4-3 и Таблица 4-4 приведены таблицы истинности для проводных сетей, предполагая равную силу для обоих источников. Обсуждение моделирования логической силы см. в разделе 7.9.
wand/triand | 0 | 1 | x | z |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
1 | 0 | 1 | x | 1 |
x | 0 | x | x | x |
z | 0 | 1 | x | z |
wor/trior | 0 | 1 | x | z |
---|---|---|---|---|
0 | 0 | 1 | x | 0 |
1 | 1 | 1 | 1 | 1 |
x | x | 1 | x | x |
z | 0 | 1 | x | z |
4.6.3 Trireg провода
Сеть trireg хранит значение и используется для моделирования узлов хранения заряда. Сеть trireg может находиться в одном из двух состояний:
Управляемое состояние — когда по крайней мере один источник trireg сети имеет значение 1, 0 или x, разрешенное значение распространяется в trireg сеть и является управляемым значением trireg сети.
Емкостное состояние — Когда все источники сети trireg находятся в высокоимпедансном значении (z), сеть trireg сохраняет свое последнее управляемое значение. Высокоимпедансное значение не распространяется от источника к сети trireg.
Сила значения на trireg сети в емкостном состоянии может быть малой(small), средней(medium) или большой(large), в зависимости от размера, указанного в декларации trireg сети. Сила значения на trireg сети в управляемом состоянии может быть питающей(supply), сильной(strong), тянущей(pull) или слабой(weak), в зависимости от силы источника.
Например:
На рисунке 4-1 показана схема, включающая trireg сеть среднего(medium) размера, ее источника и результаты моделирования.

Время симуляции | wire a | wire b | wire c | trireg d |
---|---|---|---|---|
0 | 1 | 1 | strong 1 | strong 1 |
10 | 0 | 1 | HiZ | medium 1 |
1) В момент времени моделирования 0 провод a и провод b имеют значение 1. Значение 1 с strong силой передается от вентеля and через nmos-переключатели, соединенные друг с другом проводом c, в trireg сеть d.
2) В момент времени моделирования 10 провод a изменяет значение на 0, отсоединяя провод c от вентиля and. Когда wire c больше не подключен к вентилю and, значение провода c меняется на HiZ. Значение провода b остается равным 1, поэтому провод c остается подключенным к trireg сети d через переключатель nmos2. Значение HiZ не передается с wire c на trireg сеть d. Вместо этого trireg сеть d переходит в емкостное состояние, сохраняя свое последнее управляемое значение 1. Она сохраняет 1 со средней(medium) силой.
4.6.3.1 Емкостные сети
Емкостная сеть — это соединение между двумя или более trireg сетями. В емкостной сети, trireg сети которой находятся в емкостном состоянии, логические и силовые значения могут распространяться между trireg сетями.
Например:
На рисунке 4-2 показана емкостная сеть, в которой логическое значение одних trireg сетей изменяет логическое значение других trireg сетей равного или меньшего размера.

На рисунке 4-2 емкостная сила сети trireg_la large, trireg_me1 и trireg_me2 являются medium, а trireg_sm — small. Моделирование сообщает о следующей последовательности событий:
1) В момент времени моделирования 0 провод a и провод b имеют значение 1. Провод c передает значение 1 в trireg_la и trireg_sm; провод d передает значение 1 в trireg_me1 и trireg_me2.
2) В момент времени моделирования 10 значение провода b меняется на 0, отсоединяя trireg_sm и trireg_me2 от их источников. Эти сети trireg переходят в емкостное состояние и сохраняют значение 1, свое последнее управляемое значение.
3) В момент времени моделирования 20 провод c передает значение 0 в trireg_la.
4) В момент времени моделирования 30 провод d передает значение 0 в trireg_me1.
5) В момент времени моделирования 40, значение провода a меняется на 0, отсоединяя trireg_la и trireg_me1 от своих источников. Эти сети trireg переходят в емкостное состояние и сохраняют значение 0.
6) В момент времени моделирования 50 значение провода b меняется на 1. Это изменение значения в проводе b соединяет trireg_sm с trireg_la. Эти trireg-сетки имеют разные размеры и хранят разные значения. Это соединение заставляет меньшую trireg-сеть хранить значение большей trireg-сети, trireg_sm теперь хранит значение 0. Это изменение значения в проводе b также соединяет trireg_me1 с trireg_me2. Эти trireg-сетки имеют одинаковый размер и хранят разные значения. Это соединение заставляет и trireg_me1, и trireg_me2 изменить значение на x.
В емкостной сети сила заряда распространяется от большей trireg сети к меньшей trireg сети. На рисунке 4-3 показана емкостная сеть и результаты ее моделирования.

Время симуляции | wire a | wire b | wire c | trireg_la | trireg_sm |
---|---|---|---|---|---|
0 | strong 1 | 1 | 1 | strong 1 | strong 1 |
10 | strong 1 | 0 | 1 | large 1 | large 1 |
20 | strong 1 | 0 | 0 | large 1 | small 1 |
30 | strong 1 | 0 | 1 | large 1 | large 1 |
40 | strong 1 | 0 | 0 | large 1 | small 1 |
На рисунке 4-3 емкостная сила trireg_la large, а емкостная сила trireg_sm составляет medium. Моделирование дает следующие результаты:
1) В момент времени моделирования 0, значения проводов a, b и c равны 1, и провод a приводит в движение strong ток 1 в trireg_la и trireg_sm.
2) В момент времени моделирования 10 значение провода b меняется на 0, отсоединяя trireg_la и trireg_sm от провода a. Сети trireg_la и trireg_sm переходят в емкостное состояние. Обе сети trireg разделяют large заряд сети trireg_la, поскольку они остаются соединенными через tranif1_2.
3) В момент времени моделирования 20 значение провода c меняется на 0, отсоединяя trireg_sm от trireg_la. trireg_sm больше не разделяет large заряд trireg_la и теперь хранит small заряд.
4) В момент времени моделирования 30 значение провода c меняется на 1, соединяя две трирег сетки. Теперь эти трирег сетки имеют одинаковый заряд.
5) В момент времени моделирования 40 значение провода c снова меняется на 0, отсоединяя trireg_sm от trireg_la. И снова trireg_sm больше не разделяет large заряд trireg_la и теперь хранит small заряд.
4.6.3.2 Идеальное емкостное состояние и распад заряда
Сеть trireg может сохранять свое значение неопределенно долго, или ее заряд может уменьшаться со временем. Время имитации распада заряда задается в спецификации задержки сети trireg. См. раздел 7.14.2 для объяснения распада заряда.
4.6.4 Сетки Tri0 и Tri1
Сетки tri0 и tri1 моделируют сетки с резистивными устройствами pulldown и resistive pullup. Сеть tri0 эквивалентна проволочной сети с непрерывным 0 значением силы pull. Сеть tri1 эквивалентна проволочной сети с непрерывным значением силы pull 1.
Когда сетью tri0 не управляет ни один источник, ее значение равно 0 при силовом pull. Когда сетка tri1 не управляется ни одним источником, ее значение равно 1 с pull силы. Когда в сети tri0 или tri1 есть источники, они объединяются со значением силы pull, неявно управляемой сетью, чтобы определить значение сети. Обсуждение моделирования логической силы см. в разделе 7.9.
Таблица 4-5 и Таблица 4-6 — это таблицы истинности для моделирования нескольких источников силы strong на сетях tri0 и tri1. Результирующее значение в сети имеет силу strong, если только оба источника не равны z, в этом случае сеть имеет силу pull.
tri0 | 0 | 1 | x | z |
---|---|---|---|---|
0 | 0 | x | x | 0 |
1 | x | 1 | x | 1 |
x | x | x | x | x |
z | 0 | 1 | x | 0 |
tri1 | 0 | 1 | x | z |
---|---|---|---|---|
0 | 0 | x | x | 0 |
1 | x | 1 | x | 1 |
x | x | x | x | x |
z | 0 | 1 | x | 1 |
4.6.5 Неразрешенные сети
Сеть uwire — это неразрешенный или не имеющий источника провод, который используется для моделирования сетей, допускающих только один источник. Тип uwire может быть использован для обеспечения этого ограничения. Ошибкой будет подключение любого бита сети uwire к более чем одному источнику. Ошибкой будет подключение сети uwire к двунаправленной порту проходного переключателя.
Правило подключения к порту в пункте 12.3.9.3 гарантирует, что реализация обеспечивает соблюдение этого ограничения во всей иерархии сетей или выдает предупреждение, если это не так.
4.6.6 Сети питания
Сети supply0 и supply1 могут быть использованы для моделирования источников питания в схеме. Эти сетки должны иметь силу supply.
4.7 Regs
Присвоение reg выполняется процедурными назначением (см. 6.2 и 9.2). Поскольку reg сохраняет значение между назначениями, его можно использовать для моделирования аппаратных регистров. Можно моделировать чувствительные к фронтам(например, flip-flop) и чувствительные к уровню (например, reset-set и прозрачные защелки) элементы хранения. Reg не обязательно должен представлять аппаратный элемент хранения, поскольку он также может быть использован для представления комбинаторной логики.
4.8 Integer, real, time и realtime
Помимо моделирования аппаратуры, существуют и другие применения переменных в HDL-модели. Хотя переменные reg могут использоваться для общих целей, таких как подсчет количества раз, когда определенная сеть меняет значение, типы данных целочисленных и временных переменных предусмотрены для удобства и для того, чтобы сделать описание более самодокументируемым.
Синтаксис для объявления переменных integer, time, real и realtime приведен в Синтаксисе 4-3 (из Синтаксиса 4-2).
integer_declaration ::=
integer list_of_variable_identifiers ;
real_declaration ::=
real list_of_real_identifiers ;
realtime_declaration ::=
realtime list_of_real_identifiers ;
time_declaration ::=
time list_of_variable_identifiers ;
real_type ::=
real_identifier { dimension }
| real_identifier = constant_expression
variable_type ::=
variable_identifier { dimension }
| variable_identifier = constant_expression
list_of_real_identifiers ::=
real_type { , real_type }
list_of_variable_identifiers ::=
variable_type { , variable_type }
dimension ::= (From A.2.5)
[ dimension_constant_expression : dimension_constant_expression ]
Синтаксис списка переменных reg определен в разделе 4.2.2.
integer — это переменная общего назначения, используемая для манипулирования величинами, которые не считаются аппаратными регистрами.
Переменная time используется для хранения и манипулирования временными величинами моделирования в ситуациях, когда требуется проверка времени, а также в целях диагностики и отладки. Этот тип данных обычно используется в сочетании с системной функцией $time (см. 17.7.1).
integer и time переменным присваиваются значения таким же образом, как и переменной reg. Для запуска изменения их значений должны использоваться процедурные назначения.
time переменные должны вести себя так же, как reg, состоящий по крайней мере из 64 бит, причем младшим значащим битом является бит 0. Они должны быть беззнаковыми величинами, и над ними должна выполняться беззнаковая арифметика. Напротив, integer переменные должны рассматриваться как знаковые reg, у которых младший значащий бит равен нулю. Арифметические операции, выполняемые над integer переменными, должны давать двухкомпонентные результаты.
Разрешается битовая и частичная выборка векторных reg, integer и time переменных (см. 5.2). Реализации могут ограничивать максимальный размер integer переменных, но он должен быть не менее 32 бит.
Verilog HDL поддерживает константы вещественных чисел и типы данных вещественных переменных в дополнение к типам данных целочисленных и временных переменных. За исключением следующих ограничений, переменные, объявленные как real, могут использоваться в тех же местах, где используются целочисленные и временные переменные:
— Не все операторы Verilog HDL можно использовать со значениями вещественных чисел. Списки допустимых и недопустимых операторов для вещественных чисел и вещественных переменных см. в Таблицах 5-2 и 5-3.
— Вещественные переменные не должны использовать диапазон в объявлении.
— Вещественные переменные по умолчанию должны иметь начальное значение ноль.
Декларации realtime должны рассматриваться как синонимы real деклараций и могут использоваться как взаимозаменяемые.
integer a; // целое значение
time last_chng; // Временное значение
real float; // переменная для хранения вещественного значения
realtime rtime ; // переменная для хранения времени как реального значения
4.8.1 Операторы и вещественные числа
Результатом использования логических или реляционных операторов над вещественными числами и вещественными переменными является однобитное скалярное значение. Не все операторы Verilog HDL можно использовать в выражениях с вещественными числами и вещественными переменными. В таблице 5-2 перечислены допустимые операторы для использования с вещественными числами и вещественными переменными. Константы вещественных чисел и вещественные переменные также запрещены в следующих случаях:
— Дескрипторы фронтов (posedge, negedge), применяемые к вещественным переменным
— Ссылки на переменные, объявленные как real, с битовой или частичной выборкой
— Выражения индексов вещественных чисел ссылок векторов с битовой или частичной выборкой
4.8.2 Конверсия
Вещественные числа должны преобразовываться в целые числа путем округления вещественного числа до ближайшего целого числа, а не путем его усечения. Неявное преобразование должно происходить, когда вещественное число присваивается целому числу. Если дробная часть вещественного числа равна ровно 0,5, она округляется от нуля.
Неявное преобразование происходит, когда выражение присваивается вещественному значению. Отдельные биты, которые в сети или переменной имеют значение x или z, при преобразовании считаются нулевыми.
Обсуждение системных задач, выполняющих явное преобразование, см. в разделе 17.8.
4.9 Массивы
В объявлении массива для сети или переменной объявляется тип элемента, который является либо скалярным, либо векторным (см. 4.3). Например:
Декларация | Тип элемента |
---|---|
reg x[11:0]; | Скалярный reg |
wire [0:7] y [5:0]; | Векторный wire шириной 8 бит, индексируемый от 0 до 7 |
reg [31:0] x [127:0]; | 32-битный широкополосный reg |
Размер массива не влияет на размер элемента.
Перевод Официального Стандарта Verilog HDL
Массивы могут использоваться для группировки элементов объявленного типа в многомерные объекты. Массивы должны быть объявлены путем объявления диапазона (диапазонов) адресов элементов после объявленного идентификатора. Каждое измерение должно быть представлено диапазоном адресов. См. 4.2.1 и 4.2.2 для объявлений сетей и переменных. Выражения, задающие индексы массива, должны быть константными целочисленными выражениями. Значение константного выражения может быть положительным целым числом, отрицательным целым числом или нулем.
Один оператор объявления может быть использован для объявления как массивов, так и элементов объявленного типа данных. Эта возможность делает удобным объявление и массивов, и элементов, соответствующих ширине вектора элементов, в одном и том же операторе объявления.
Элементу можно присвоить значение в одном присваивании, но полные или частичные размеры массива — нет. Также полные или частичные размеры массива не могут быть использованы для присвоения значения выражению. Чтобы присвоить значение элементу массива, необходимо указать индекс для каждого измерения. Индекс может быть выражением. Эта опция обеспечивает механизм обращения к различным элементам массива в зависимости от значения других переменных и сетей в схеме. Например, для индексации памяти с произвольным доступом (RAM) можно использовать reg счетчика программы.
Реализации могут ограничивать максимальный размер массива, но они должны допускать не менее 16 777 216 (2²⁴) элементов.
4.9.1 Wire массивы
Элементы wire массивов можно использовать так же, как скалярные или векторные сети. Они полезны для подключения к портам экземпляров модулей внутри конструкций генерации циклов (см. 12.4.1).
4.9.2 Reg и переменные массивы
Должны быть возможны массивы для всех типов переменных (reg, integer, time, real, realtime).
4.9.3 Память
Одномерный массив с элементами типа reg также называется памятью. Такая память может использоваться для моделирования памяти только для чтения (ПЗУ), памяти с произвольным доступом (ОЗУ) и reg-файлов. Каждый reg в массиве называется элементом или словом и адресуется одним индексом массива.
За одно присваивание можно присвоить значение n-битному reg, но полной памяти — нет. Чтобы присвоить значение слову памяти, необходимо указать индекс. Индекс может быть выражением. Эта опция обеспечивает механизм обращения к различным словам памяти в зависимости от значения других переменных и сетей в схеме. Например, счетчик программы reg может быть использован для индексации в ОЗУ.
4.9.3.1 Примеры массивов
4.9.3.1.1 Объявления массивов
reg [7:0] mema[0:255]; // объявляет память mema из 256 8-бит
// регистров. Индексированного от 0 до 255
reg arrayb[7:0][0:255]; // объявление двухразрядного массива
// с одним битом в регистре
wire w_array[7:0][5:0]; // объявление массива проводов
integer inta[1:64]; // массив из 64 целочисленных значений
time chng_hist[1:1000] // массив из 1000 временных значений
integer t_index;
4.9.3.1.2 Присвоение элементам массива
mema = 0; // Неправильный синтаксис - попытка записи во весь массив
arrayb[1] = 0; // Неправильный синтаксис - попытка записи в элементы
// [1][0]..[1][255]
arrayb[1][12:31] = 0; // Неправильный синтаксис - попытка записи в элементы
// [1][12]..[1][31]
mema[1] = 0; // Присваивает 0 второму элементу
arrayb[1][0] = 0; // Присваивает 0 биту, на который ссылаются индексы
// [1][0]
inta[4] = 33559; // Присвоить десятичное число целому числу в массиве
chng_hist[t_index] = $time; // Присвоить текущее время моделирования в
// элемент, адресуемый целочисленным индексом
4.9.3.1.3 Различия в памяти
reg [1:n] rega; // n-битный регистр - это не то же самое. reg
reg mema [1:n]; // как память из n 1-битных регистров
4.10 Параметры
Параметры Verilog HDL не принадлежат ни к группе переменных, ни к группе проводов. Параметры не являются переменными. Они являются константами. Существует два типа параметров: параметры модуля и задающие параметры. Недопустимо повторно объявлять имя, уже объявленное в объявлении провода, параметра или переменной.
Оба типа параметров принимают спецификацию диапазона. По умолчанию parameter и specparam должны быть настолько широкими, насколько это необходимо для содержания значения константы, за исключением случаев, когда присутствует спецификация диапазона.
4.10.1 Параметры модуля
Синтаксис объявления параметров модуля приведен в Синтаксисе 4-4.
local_parameter_declaration ::=
localparam [ signed ] [ range ] list_of_param_assignments
| localparam parameter_type list_of_param_assignments
parameter_declaration ::=
parameter [ signed ] [ range ] list_of_param_assignments
| parameter parameter_type list_of_param_assignments
parameter_type ::=
integer | real | realtime | time
list_of_param_assignments ::=
param_assignment { , param_assignment }
param_assignment ::=
parameter_identifier = constant_mintypmax_expression
range ::=
[ msb_constant_expression : lsb_constant_expression ]
List_of_param_assignments должен представлять собой список назначений, разделенных запятыми, где правая часть назначения должна быть константным выражением, то есть выражением, содержащим только константные числа и ранее определенные параметры (см. пункт 5).
List_of_param_assignments может появляться в модуле как набор элементов модуля (module_items) или в объявлении модуля в списке module_parameter_port_list (см. 12.1). Если в module_parameter_port_list появляются какие-либо назначения параметров, то все назначения параметров, которые появляются в модуле, становятся локальными параметрами и не могут быть переопределены ни одним методом.
Параметры представляют собой константы. Следовательно, изменение их значения во время выполнения запрещено. Однако, параметры модуля могут быть изменены во время компиляции, чтобы иметь значения, отличные от тех, что указаны в назначении объявления. Это позволяет настраивать экземпляры модуля. Параметр может быть изменен с помощью оператора defparam или в операторе экземпляра модуля. Обычно параметры используются для задания задержек и ширины переменных. Подробнее о назначении значений параметров см. в разделе 12.2.
Параметр модуля может иметь спецификацию типа и спецификацию диапазона. Тип и диапазон параметров модуля должны соответствовать следующим правилам:
— Объявление параметра без указания типа или диапазона должно по умолчанию соответствовать типу и диапазону конечного значения, присвоенного параметру, после применения любых переопределений значения.
— Параметр со спецификацией диапазона, но без спецификации типа, должен быть диапазоном объявления параметра и должен быть без знака. На знак и диапазон не влияют переопределения значений.
— Параметр со спецификацией типа, но без спецификации диапазона, должен иметь указанный тип. Знаковый параметр должен по умолчанию соответствовать диапазону конечного значения, присвоенного параметру, после применения любых переопределений значения.
— Параметр со знаковой спецификацией типа и спецификацией диапазона должен быть знаковым и должен быть диапазоном своего объявления. На знак и диапазон не влияют переопределения значений.
— Параметр без спецификации диапазона и с знаковой спецификацией типа или без спецификации типа должен иметь подразумеваемый диапазон с lsb, равным 0, и msb, равным на единицу меньше, чем размер конечного значения, присвоенного параметру.
— Параметр без спецификации диапазона, с знаковой спецификацией типа или без спецификации типа, и для которого окончательное значение, присвоенное ему, не имеет размера, должен иметь подразумеваемый диапазон с lsb, равным 0, и msb, равным зависящему от реализации значению, по крайней мере, 31.
Правила преобразования между вещественными и целочисленными значениями, описанные в 4.8.2, применяются и к параметрам. Выделение битов и частей параметров, которые не имеют типа real, должно быть разрешено (см. 5.2).
parameter msb = 7; // определяет msb как parameter постоянным значением 7
parameter e = 25, f = 9; // объявленеие двух числовых констант
parameter r = 5.7; // объявление r как вещественный параметр
parameter byte_size = 8,
byte_mask = byte_size - 1;
parameter average_delay = (r + f) / 2;
parameter signed [3:0] mux_selector = 0;
parameter real r1 = 3.5e17;
parameter p1 = 13'h7e;
parameter [31:0] dec_const = 1'b1; // значение преобразуется в 32-ух битное
parameter newconst = 3'h4; // подразумеваемый диапазон [2:0] параметр
parameter newconst = 4; // подразумеваемый диапазон не менее [31:0]
4.10.2 Локальные параметры (localparam)
Локальные параметры Verilog HDL идентичны параметрам, за исключением того, что они не могут быть непосредственно изменены с помощью операторов defparam (см. 12.2.1) или присвоения значения параметра экземпляра модуля (см. 12.2.2). Локальным параметрам могут быть присвоены константные выражения, содержащие параметры, которые могут быть изменены с помощью операторов defparam или присвоения значения параметра экземпляра модуля. Разрешается битовая и частичная выборка локальных параметров, которые не относятся к типу real (см. 5.2). Синтаксис объявления локальных параметров приведен в Синтаксисе 4-4.
4.10.3 Специальные параметры
Синтаксис для объявления специальных параметров показан в Синтаксисе 4-5.
specparam_declaration ::=
specparam [ range ] list_of_specparam_assignments ;
list_of_specparam_assignments ::= (From A.2.3)
specparam_assignment { , specparam_assignment }
specparam_assignment ::=
specparam_identifier = constant_mintypmax_expression
| pulse_control_specparam
pulse_control_specparam ::=
PATHPULSE$ = ( reject_limit_value [ , error_limit_value ] )
| PATHPULSE$specify_input_terminal_descriptor$specify_output_terminal_descriptor
= ( reject_limit_value [ , error_limit_value ] )
error_limit_value ::=
limit_value
reject_limit_value ::=
limit_value
limit_value ::=
constant_mintypmax_expression
range ::=
[ msb_constant_expression : lsb_constant_expression ]
Ключевое слово specparam объявляет специальный тип параметра, который предназначен только для предоставления значений синхронизации и задержки, но может появляться в любом выражении, которое не присваивается параметру и не является частью спецификации диапазона объявления. Специальные параметры (также называемые specparam) разрешается как внутри блока specify (см. пункт 14), так и в основном теле модуля.
Параметр specify, объявленный вне блока specify, должен быть объявлен до того, как на него будет сделана ссылка. Значение, присвоенное специальному параметру, может быть любым константным выражением. Специальный параметр может быть использован как часть константного выражения для последующего объявления специального параметра. В отличие от параметра модуля, специальный параметр нельзя изменить, но его можно изменить с помощью аннотации SDF (см. п. 16).
Специальные параметры и параметры модуля не являются взаимозаменяемыми. Кроме того, параметрам модуля не должно присваиваться константное выражение, включающее любые параметры specify. В таблице 4-8 приведены различия между двумя типами объявления параметров.
Specparams (специальный параметр) | parameter (параметр модуля) |
---|---|
Используйте ключевое слово specparam | Использовать parameter ключевого слова |
Должны быть объявлены внутри модуля или определяющего блока | Должны быть объявлены вне определенных блоков |
Может использоваться только внутри модуля или блока specify | Не может использоваться внутри определенных блоков |
Могут быть назначены specparams и параметры | Не может быть назначен specparams |
Использование аннотации SDF для переопределения значений | Используйте defparam или передачу значения параметра в объявлении экземпляра для переопределения значений |
Параметр specify может иметь спецификацию диапазона. Диапазон уточняющих параметров должен соответствовать следующим правилам:
— Объявление specparam без спецификации диапазона должно по умолчанию соответствовать диапазону конечного значения, присвоенного параметру, после применения любых переопределений значения.
— Specparam со спецификацией диапазона должен быть диапазоном объявления параметра. На диапазон не должны влиять переопределения значений.
specify
specparam tRise_clk_q = 150, tFall_clk_q = 200;
specparam tRise_control = 40, tFall_control = 50;
endspecify
Строки между ключевыми словами specify и endspecify объявляют четыре параметра specify. Первая строка объявляет параметры specify tRise_clk_q и tFall_clk_q со значениями 150 и 200, соответственно. Вторая строка объявляет параметры specify tRise_control и tFall_control со значениями 40 и 50, соответственно.
module RAM16GEN ( output [7:0] DOUT,
input [7:0] DIN,
input [5:0] ADR,
input WE, CE);
specparam dhold = 1.0;
specparam ddly = 1.0;
parameter width = 1;
parameter regsize = dhold + 1.0; // Ошибка - невозможное присвоение
// specparams к parameters
endmodule
4.11 Именные пространства
В Verilog HDL существует несколько пространств имен; два из них являются глобальными, а остальные — локальными. Глобальные пространства имен — это определения и текстовые макросы. Пространство имен определений объединяет все определения модулей (см. 12.1) и примитивов (см. 8.1). После использования имени для определения модуля или примитива, это имя не должно быть использовано для объявления другого модуля или примитива.
Пространство имен текстовых макросов является глобальным. Поскольку имена текстовых макросов вводятся и используются с ведущей строкой ` символ, они остаются однозначными с любым другим пространством имен (см. 19.3). Имена текстовых макросов определяются в линейном порядке появления в наборе входных файлов, составляющих описание расчетной единицы. Последующие определения одного и того же имени отменяют предыдущие определения для остатка входных файлов.
Локальными пространствами имен являются блок, module, generate блок, порт, specify блок и атрибут. Если имя определено в пространстве имен блока, module, порта, блока generate или блока specify, оно не должно быть определено в этом пространстве повторно (с тем же или другим типом). Как описано в пункте 3.8, переопределение имен в пространстве имен атрибутов разрешено.
Перевод Официального Стандарта Verilog HDL
Пространство имен блоков представлено конструкциями именованных блоков (см. 9.8), функций (см. 10.4) и задач (см. 10.2). Оно объединяет определения именованных блоков, функций(function), задач(task), параметров, именованных событий и тип объявления переменной (см. 4.2.2). Тип объявления переменной включает объявления reg, integer, time, real и realtime.
Пространство имен модуля вводится конструкциями module и primitive. Оно объединяет определение function, task, именованных блоков, экземпляров модуля, блоков generate, параметров, именованных событий, genvars, сетевого типа объявления и типа объявления переменной. К проводному(сетевому) типу объявления относятся wire, wor, wand, tri, trior, triand, tri0, tri1, trireg, uwire, supply0 и supply1 (см. 4.6).
Пространство имен блоков generate вводится конструкциями generate (см. 12.4). Оно унифицирует определение функций, задач, именованных блоков, экземпляров модулей, блоков generate, локальных параметров, именованных событий, genvars, типа объявления проводов и типа объявления переменной.
Пространство имен порта вводится конструкциями module, primitive, function и task. Оно предоставляет возможность структурно определять соединения между двумя объектами, находящимися в двух разных пространствах имен. Соединение может быть однонаправленным (input или output) или двунаправленным (inout). Пространство имен портов перекрывает пространства имен модулей и блоков. По сути, пространство имен порта определяет тип соединения между именами в разных пространствах имен. Тип объявления порта включает input, output и inout (см. 12.3). Имя порта, введенное в пространстве имен порта, может быть повторно введено в пространство имен модуля путем объявления переменной или провода с тем же именем, что и имя порта.
Пространство имен блока specify вводится конструкцией specify (см. 14.2).
Пространство имен атрибутов окружено конструкциями (* и *), прикрепленными к элементу языка (см. 3.8). Имя атрибута может быть определено и использовано только в пространстве имен атрибутов. Любой другой тип имени не может быть определен в этом пространстве имен.