- 18.2. Формат файла VCD с четырьмя состояниями
- 18.2.1. Структура файла VCD с четырьмя состояниями
- 18.2.2. Форматы значений переменных
- 18.2.3. Описание команд с ключевыми словами
- 18.2.3.1. $comment
- 18.2.3.2. $date
- 18.2.3.3. $enddefinitions
- 18.2.3.4. $scope
- 18.2.3.5. $timescale
- 18.2.3.6. $upscope
- 18.2.3.7. $var
- 18.2.3.8. $version
- 18.2.3.9. $dumpall
- 18.2.3.10. $dumpoff
- 18.2.3.11. $dumpon
- 18.2.3.12. $dumpvars
- 18.2.4. Пример формата файла VCD с четырьмя состояниями
- 18.3. Создание расширенного файла VCD
- 18.3.1. Указание имени файла дампа и портов для дампа ($dumpports)
- 18.3.2. Остановка и возобновление дампа ($dumpportsoff/$dumpportson)
- 18.3.3. Генерация контрольной точки ($dumpportsall)
- 18.3.4. Ограничение размера файла дампа ($dumpportslimit)
- 18.3.5. Чтение файла дампа во время моделирования ($dumpportsflush)
- 18.3.6. Описание команд с ключевыми словами
- 18.3.6.1. $vcdclose
- 18.3.6.2. Общие правила для расширенных задач системы VCD
- 18.4. Формат расширенного файла VCD
- 18.4.1. Синтаксис расширенного файла VCD
- 18.4.2. Расширенная информация об узле VCD
- 18.4.3. Изменения значений
- 18.4.3.1. Символы состояний
- 18.4.3.2. Источники
- 18.4.3.3. Пример расширенного формата файла VCD
Статья 1 — Ссылка на общее представление файлов VCD и системных команд Verilog.
18.2. Формат файла VCD с четырьмя состояниями
Дамп файл структурирован в свободном формате. Пробелы и табуляция используется для разделения команд также, чтобы файл легко читался текстовым редактором.
18.2.1. Структура файла VCD с четырьмя состояниями
Синтаксис файла VCD с четырьмя состояниями приведен в Синтаксисе 18-8.
value_change_dump_definitions ::=
{ declaration_command }{ simulation_command }
declaration_command ::=
declaration_keyword
[ command_text ]
$end
simulation_command ::=
simulation_keyword { value_change } $end
| $comment [ comment_text ] $end
| simulation_time
| value_change
declaration_keyword ::=
$comment | $date | $enddefinitions | $scope | $timescale | $upscope
| $var | $version
simulation_keyword ::=
$dumpall | $dumpoff | $dumpon | $dumpvars
simulation_time ::=
# decimal_number
value_change ::=
scalar_value_change
| vector_value_change
scalar_value_change ::=
value identifier_code
value ::=
0 | 1 | x | X | z | Z
vector_value_change ::=
b binary_number identifier_code
| B binary_number identifier_code
| r real_number identifier_code
| R real_number identifier_code
identifier_code ::=
{ ASCII character }
Файл VCD начинается с заголовочной информации, содержащей дату, номер версии симулятора, используемого для моделирования, и используемую шкалу времени. Далее в файле содержатся определения области действия и типа переменных, которые сбрасываются, а затем фактические изменения значений на каждом приращении времени моделирования. Перечисляются только те переменные, значение которых изменяется во время приращения времени.
Время моделирования, записанное в файле VCD, является абсолютным значением времени моделирования для последующих изменений значений переменных.
Изменения значений для вещественных переменных задаются вещественными числами. Изменения значений для всех других переменных задаются в двоичном формате значениями 0, 1, x или z. Информация о силе источника и память не сбрасываются.
Вещественное число выводится с помощью формата %.16g printf(). Это сохраняет точность числа, выводя все 53 бита мантиссы 64-битного числа двойной точности IEEE 754. Прикладные программы могут считывать вещественное число с помощью формата %g в scanf().
Дампер изменения значений генерирует коды идентификаторов символов для представления переменных. Код идентификатора — это код, состоящий из печатаемых символов, которые находятся в наборе символов ASCII от ! до ~ (десятичные 33 — 126).
Формат VCD не поддерживает механизм дампа части вектора. Например, биты с 8 по 15 ([8:15]) 16-битного вектора не могут быть сброшены в файл VCD. Вместо этого необходимо сбросить весь вектор ([0:15]). Кроме того, выражения, такие как a + b, не могут быть записаны в файл VCD.
Данные в файле VCD чувствительны к регистру.
18.2.2. Форматы значений переменных
Переменные могут быть скалярами или векторами. Для каждого типа используется свой формат дампа. Дампы изменений значений скалярных переменных не должны иметь пробелов между значением и кодом идентификатора.
Дампы изменений значений векторов не должны иметь пробелов между базовой буквой и цифрами значения, но они должны иметь один пробел между цифрами значения и кодом идентификатора.
Формат вывода для каждого значения — правостороннее выравнивание. Векторные значения отображаются в максимально короткой форме: избыточные битовые значения, возникающие в результате расширения значений влево для заполнения определенного размера вектора, устраняются.
Правила расширения векторных значений влево приведены в таблице 18.1.
Таблица 18.1 Правила расширения значений вектора влево
Когда значение | VCD расширяется влево с |
---|---|
1 | 0 |
0 | 0 |
Z | Z |
X | X |
В таблице 18.2 показано, как VCD может сократить значения.
Таблица 18.2 Как VCD может сократить значения
Двоичное значение | Расширяется для заполнения 4-битного регистра как | Появляется в файле VCD как |
---|---|---|
10 | 0010 | b10 |
X10 | XX10 | bX10 |
ZX0 | ZZX0 | bZX0 |
0X10 | 0X10 | b0X10 |
События выгружаются в том же формате, что и скаляры. например, 1*%. Однако для событий значение (1 в данном примере) не имеет значения. Значение имеет только код идентификатора (*% в данном примере). Он появляется в файле VCD как маркер, указывающий на то, что событие было вызвано во время временного шага.
1*@ No space between the value 1 and the identifier code *@
b1100x01z (k No space between the b and 1100x01z,
but a space between b1100x01z and (k
/*
Перевод: 1*@Нет пробела между значением 1 и кодом идентификатора *@
b1100x01z (kНет пробела между b и 1100x01z,
но пробел между b1100x01z и (k
*/
18.2.3. Описание команд с ключевыми словами
Общая информация в файле VCD представлена в виде серии разделов, окруженных ключевыми словами. Команды ключевых слов обеспечивают возможность вставки информации в файл VCD. Команды ключевых слов могут быть вставлены либо дампером, либо вручную.
В этом подпункте рассматриваются команды с ключевыми словами, приведенные в таблице 18.3.
Таблица 18.3 Команды ключевых слов
Ключевые слова декларации | Ключевые слова моделирования | Ключевые слова моделирования |
---|---|---|
$comment | $timescale | $dumpall |
$date | $upscope | $dumpoff |
$enddefinitions | $var | $dumpon |
$scope | $version | $dumpvars |
18.2.3.1. $comment
Секция $comment предоставляет возможность вставить комментарий в файл VCD. Синтаксис секции приведен в Синтаксисе 18-9.
vcd_declaration_comment ::=
$comment comment_text $end
$comment This is a single-line comment $end
$comment This is a
multiple-line comment
$end
18.2.3.2. $date
В разделе $date указывается дата создания файла VCD. Синтаксис раздела приведен в Синтаксис 18.10.
vcd_declaration_date ::=
$date date_text $end
$date
June 25, 1989 09:24:35
$end
18.2.3.3. $enddefinitions
Раздел $enddefinitions отмечает конец информации заголовка и определений. Синтаксис этого раздела приведен в Синтаксисе 18.11.
vcd_declaration_enddefinitions ::=
$enddefinitions $end
18.2.3.4. $scope
Секция $scope определяет область видимости переменных, выводимых в дамп. Синтаксис этого раздела приведен в Синтаксисе 18.12.
vcd_declaration_scope ::=
$scope scope_type scope_identifier $end
scope_type ::=
begin
| fork
| function
| module
| task
Тип диапазона указывает на один из следующих диапазонов:
1) module — Модуль верхнего уровня и экземпляры модуля
2) task — Задачи
3) function — Функции
4) begin — Именованные последовательные блоки
5) fork — Именованные параллельные блоки
$scope
module top
$end
18.2.3.5. $timescale
Ключевое слово $timescale указывает, какая шкала времени была использована для моделирования. Синтаксис ключевого слова приведен в Синтаксис 18.13.
vcd_declaration_timescale ::=
$timescale time_number time_unit $end
time_number ::=
1 | 10 | 100
time_unit ::=
s | ms | us | ns | ps | fs
$timescale 10 ns $end
18.2.3.6. $upscope
Секция $upscope указывает на изменение области видимости на следующий более высокий уровень в иерархии проектирования. Синтаксис секции приведен в Синтаксисе 18.14.
vcd_declaration_upscope ::=
$upscope $end
18.2.3.7. $var
Секция $var печатает имена и коды идентификаторов переменных, выводимых в дамп. Синтаксис этого раздела приведен в Синтаксис 18.15.
vcd_declaration_vars ::=
$var var_type size identifier_code reference $end
var_type ::=
event | integer | parameter | real | realtime | reg | supply0 | supply1 | time
| tri | triand | trior | trireg | tri0 | tri1 | wand | wire | wor
size ::=
decimal_number
reference ::=
identifier
| identifier [ bit_select_index ]
| identifier [ msb_index : lsb_index ]
index ::=
decimal_number
Размер определяет, сколько бит содержится в переменной.
Код идентификатора задает имя переменной, используя печатаемые символы ASCII, как описано ранее.
1) Индекс msb указывает на наиболее значимый индекс. Индекс lsb указывает на наименее значимый индекс.
2) Более одного ссылочного имени может быть сопоставлено с одним и тем же кодом идентификатора. Например, net10 и net15 могут быть взаимосвязаны в схеме и, следовательно, иметь один и тот же код идентификатора.
3) Отдельные биты векторных сеток могут быть сброшены по отдельности.
4) Идентификатор — это имя переменной, которая выбрасывается в модель.
В секции $var сеть типа uwire должна иметь переменный тип wire.
$var
integer 32 (2 index
$end
18.2.3.8. $version
Секция $version указывает, какая версия программы записи VCD была использована для создания VCD-файла и $dumpfile системная задача, используемая для создания файла. Если для задания имени файла в $dumpfile использовалась переменная или выражение, то в строке $version появится неоцененный литерал переменной или выражения. Синтаксис раздела $version приведен в Синтаксисе 18.16.
vcd_declaration_version ::=
$version version_text system_task $end
$version
VERILOG-SIMULATOR 1.0a
$dumpfile("dump1.dump")
$end
18.2.3.9. $dumpall
Ключевое слово $dumpall задает текущие значения всех переменных, выводимых в дамп. Синтаксис ключевого слова приведен в разделе Синтаксис 18.17.
vcd_simulation_dumpall ::=
$dumpall { value_changes } $end
$dumpall 1*@ x*# 0*$ bx (k $end
18.2.3.10. $dumpoff
Ключевое слово $dumpoff указывает на все переменные, сброшенные со значениями X. Синтаксис этого ключевого слова приведен в Синтаксис 18.18.
vcd_simulation_dumpoff ::=
$dumpoff { value_changes } $end
$dumpoff x*@ x*# x*$ bx (k $end
18.2.3.11. $dumpon
Ключевое слово $dumpon указывает на возобновление сброса в файл и перечисляет текущие значения всех переменных, сброшенных в дамп. Синтаксис ключевого слова приведен в Синтаксисе 18.19.
vcd_simulation_dumpon ::=
$dumpon { value_changes } $end
$dumpon x*@ 0*# x*$ b1 (k $end
18.2.3.12. $dumpvars
В разделе, начинающемся с ключевого слова $dumpvars, перечисляются начальные значения всех переменных, выводимых в дамп. Синтаксис ключевого слова приведен в Синтаксис 18.20.
vcd_simulation_dumpvars ::=
$dumpvars { value_changes } $end
$dumpvars x*@ z*$ b0 (k $end
18.2.4. Пример формата файла VCD с четырьмя состояниями
$date June 26, 1989 10:05:41
$end
$version VERILOG-SIMULATOR 1.0a
$end
$timescale 1 ns
$end
$scope module top $end
$scope module m1 $end
$var trireg 1 *@ net1 $end
$var trireg 1 *# net2 $end
$var trireg 1 *$ net3 $end
$upscope $end
$scope task t1 $end
$var reg 32 (k accumulator[31:0] $end
$var integer 32 {2 index $end
$upscope $end
$upscope $end
$enddefinitions $end
$comment
$dumpvars was executed at time '#500'.
All initial values are dumped at this time.
$end
#500
$dumpvars
x*@
x*#
x*$
bx (k
bx {2
$end
#505
0*@
1*#
1*$
b10zx1110x11100 (k
b1111000101z01x {2
#510
0*$
#520
1*$
#530
0*$
bz (k
#535
$dumpall 0*@ 1*# 0*$
bz (k
b1111000101z01x {2
$end
#540
1*$
#1000
$dumpoff
x*@
x*#
x*$
bx (k
bx {2
$end
#2000
$dumpon
z*@
1*#
0*$
b0 (k
bx {2
$end
#2010
1*$
18.3. Создание расширенного файла VCD
Шаги, связанные с созданием расширенного файла VCD, перечислены ниже и показаны на рисунке 18.2.
1) Вставьте расширенные системные задачи VCD в исходный файл Verilog для определения имени файла дампа и указания переменных для дампа.
2) Запустите симуляцию.

Правила и синтаксис файла VCD с четырьмя состояниями применяются к расширенному файлу VCD, если в данном подпункте не указано иное.
18.3.1. Указание имени файла дампа и портов для дампа ($dumpports)
Задача $dumpports используется для указания имени VCD-файла и портов для дампа. Синтаксис задачи приведен в Синтаксисе 18.21.
dumpports_task ::=
$dumpports ( scope_list , file_pathname ) ;
scope_list ::=
module_identifier { , module_identfier }
file_pathname ::=
literal_string
| variable
| expression
Аргументы являются необязательными и определяются следующим образом:
- scope_list — Один или несколько идентификаторов модулей. Допускаются только модули (не переменные). Если указано более одного идентификатора модуля, они должны быть разделены запятой. Допускаются имена путей к модулям с использованием иерархического разделителя точка. Буквальные строки не допускаются для идентификатора модуля. Если значение scope_list не указано, то областью видимости будет модуль, из которого вызывается $dumpports.
- file_pathname — Может быть именем пути в двойных кавычках (литеральная строка), переменной типа reg или выражением, обозначающим файл, который должен содержать информацию VCD порта. Если имя файла не указано, файл будет записан в текущий рабочий каталог с именем dumpports.vcd. Если такой файл уже существует, он будет перезаписан. Все проверки на запись файла должны быть выполнены симулятором (например, права на запись, правильное имя пути) и выданы соответствующие ошибки или предупреждения.
Следующие правила применяются к использованию системной задачи $dumpports:
- Все порты в модели с момента вызова $dumpports считаются первичными выводами ввода/вывода и должны быть включены в файл VCD. Однако любые порты, существующие в экземплярах ниже scope_list, в дамп не попадают.
- Если для задачи не указаны аргументы, допускается использование $dumpports; и $dumpports();. В обоих случаях используются значения по умолчанию для аргументов.
- Если первый аргумент равен нулю, то перед указанием второго аргумента в списке аргументов ставится запятая.
- Каждая область видимости, указанная в scope_list, должна быть уникальной. Если указано несколько обращений к $dumpports, значения scope_list в этих обращениях также должны быть уникальными.
- Задача $dumpports может использоваться в исходном коде, который также содержит задачу $dumpvars.
- Когда выполняется $dumpports, соответствующий дамп изменений значений должен начаться в конце текущей единицы времени моделирования.
- Задача $dumpports может быть вызвана несколько раз по всей модели, но выполнение всех задач $dumpports должны быть в одно и то же время моделирования. Указание одного и того же имени file_pathname несколько раз не допускается.
18.3.2. Остановка и возобновление дампа ($dumpportsoff/$dumpportson)
Системные задачи $dumpportsoff и $dumpportson позволяют управлять периодом моделирования для сброса значений портов. Синтаксис этих системных задач приведен в Синтаксисе 18.22.
dumpportsoff_task ::=
$dumpportsoff ( file_pathname ) ;
dumpportson_task ::=
$dumpportson ( file_pathname ) ;
file_pathname ::=
literal_string
| variable
| expression
Аргумент file_pathname может быть именем пути в двойных кавычках (литеральная строка), переменной типа reg или выражением, обозначающим имя файла, указанное в системной задаче $dumpports.
При выполнении задачи $dumpportsoff в файле file_pathname создается контрольная точка, в которую сбрасывается значение X для каждого указанного порта. Начиная с этого момента моделирования значения портов больше не сбрасываются. Если имена файлов не указаны, то все дампы в файлы, открытые вызовами $dumpports, приостанавливаются.
Когда выполняется задание $dumpportson, все порты, указанные связанным вызовом $dumpports, должны иметь свои значения в дампе. Эта системная задача обычно используется для возобновления дампа после выполнения команды $dumpportsoff. Если имена файлов не указаны, то дампинг будет возобновлен для всех файлов, указанных вызовами $dumpports, если сброс в эти файлы был остановлен.
Если $dumpportson выполняется, когда дамп портов уже сбрасывается в file_pathname, системная задача игнорируется. Если $dumpportsoff выполняется, когда дамп портов уже приостановлен для file_pathname, системная задача игнорируется.
18.3.3. Генерация контрольной точки ($dumpportsall)
Системная задача $dumpportsall создает контрольную точку в файле VCD, которая показывает значение всех выбранных портов в данный момент моделирования, независимо от того, изменились ли значения портов с последнего временного шага. Синтаксис этой системной задачи приведен в Синтаксисе 18.23.
dumpportsall_task ::=
$dumpportsall ( file_pathname ) ;
file_pathname ::=
literal_string
| variable
| expression
Аргумент file_pathname может быть именем пути в двойных кавычках (литеральная строка), переменной типа reg или выражением, обозначающим имя файла, указанное в системной задаче $dumpports.
Если имя файла не указано, то контрольная точка возникает для всех файлов, открытых вызовами $dumpports.
18.3.4. Ограничение размера файла дампа ($dumpportslimit)
Системная задача $dumpportslimit позволяет контролировать размер файла VCD. Синтаксис этой системной задачи приведен в Синтаксис 18.24.
dumpportslimit_task ::=
$dumpportslimit ( filesize , file_pathname ) ;
file_size ::=
integer
file_pathname ::=
literal_string
| variable
| expression
Аргумент filesize является обязательным и определяет максимальный размер в байтах для связанного с ним file_pathname файла. При достижении этого размера файла дамп останавливается, а в file_pathname файла вставляется комментарий, указывающий на достижение предела размера.
Аргумент file_pathname может быть именем пути в двойных кавычках (литеральная строка), переменной типа reg или выражением, обозначающим имя файла, указанное в системной задаче $dumpports.
Если имя файла не указано, ограничение на размер файла применяется ко всем файлам, открытым для дампа в результате вызова функции $dumpports.
18.3.5. Чтение файла дампа во время моделирования ($dumpportsflush)
Для повышения производительности симуляторы часто буферизируют вывод VCD и записывают в файл через определенные промежутки времени, а не построчно. Системная задача $dumpportsflush записывает все значения портов в связанный файл, очищая буфер VCD симулятора.
Синтаксис для этой системной задачи приведен в Синтаксисе 18-25.
dumpportsflush_task ::=
$dumpportsflush ( file_pathname ) ;
file_pathname ::=
literal_string
| variable
| expression
Аргумент file_pathname может быть именем пути в двойных кавычках (литеральная строка), переменной типа reg или выражением, обозначающим имя файла, указанное в системной задаче $dumpports.
Если имя файла не указано, буферы VCD должны быть очищены для всех файлов, открытых вызовами функции $dumpports.
18.3.6. Описание команд с ключевыми словами
Общая информация в расширенном файле VCD представлена в виде серии разделов, окруженных ключевыми словами. Команды ключевых слов предоставляют средства для вставки информации в расширенный файл VCD. Команды ключевых слов могут быть вставлены либо дампером, либо вручную. Расширенный VCD предоставляет одну дополнительную команду ключевых слов по сравнению с VCD с четырьмя состояниями.
18.3.6.1. $vcdclose
Ключевое слово $vcdclose указывает время окончания моделирования в момент закрытия расширенного файла VCD. Это позволяет точно записать время окончания симуляции, независимо от состояния изменения сигнала, чтобы помочь синтаксическим анализаторам, которым требуется эта информация. Синтаксис ключевого слова приведен в Синтаксисе 18-26.
vcdclose_task ::=
$vcdclose final_simulation_time $end
$vcdclose #13000 $end
18.3.6.2. Общие правила для расширенных задач системы VCD
Для каждой расширенной задачи системы VCD действуют следующие правила:
- Если указано имя файла, которое не совпадает с именем файла, указанным в вызове $dumpports, задача управления игнорируется.
- Если для задач, имеющих только необязательные аргументы, не указаны аргументы, можно использовать имя системной задачи без аргументов или указать имя, за которым следует (), например, $dumpportsflush или $dumpportsflush(). В обоих случаях будут выполнены действия по умолчанию для аргументов.
18.4. Формат расширенного файла VCD
Формат расширенного файла VCD похож на формат файла VCD с четырьмя состояниями, поскольку он также структурирован в свободном формате. Пробелы, пропуски и табуляции используется для разделения команд и для того, чтобы файл был легко читаем текстовым редактором.
18.4.1. Синтаксис расширенного файла VCD
Синтаксис расширенного файла VCD приведен в Синтаксисе 18-27. Имя конструкции VCD с четырьмя состояниями, совпадающее с расширенной конструкцией VCD, считается эквивалентным, за исключением случаев, когда ему предшествует символ *.
value_change_dump_definitions ::={declaration_command} {simulation_command}
declaration_command ::= declaration_keyword [command_text] $end
simulation_command ::= (Not in the Annex A BNF)
simulation_keyword { value_change } $end
| $comment [comment_text] $end
| simulation_time
| value_change
* declaration_keyword ::=
$comment | $date | $enddefinitions | $scope | $timescale | $upscope | $var
| $vcdclose | $version
command_text ::=
comment_text | close_text | date_section | scope_section | timescale_section
| var_section | version_section
* simulation_keyword ::= $dumpports | $dumpportsoff | $dumpportson |
$dumpportsall
simulation_time ::= #decimal_number
value_change ::= value identifier_code
value ::= pport_value 0_strength_component 1_strength_component
port_value ::= input_value | output_value | unknown_direction_value
input_value ::= D | U | N | Z | d | u
output_value ::= L | H | X | T | l | h
unknown_direction_value ::= 0 | 1 | ? | F | A | a | B | b | C | c | f
strength_component ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7
* identifier_code ::= <{integer}
comment_text ::= {ASCII_character}
close_text ::= final_simulation_time
date_section ::= date_text
date_text :: = day month date time year
scope_section ::= scope_type scope_identifier
* scope_type ::= module
timescale_section ::= number time_unit
number ::= 1 | 10 | 100
time_unit ::= fs | ps | ns | us | ms | s
var_section ::= var_type size identifier_code reference
* var_type ::= port
* size ::= 1 | vector_index
vector_index ::= [ msb_index : lsb_index ]
index ::= decimal_number
* reference ::= port_identifier
identifier ::= {printable_ASCII_character}
version_section ::= version_text
* version_text ::= version_identifier {dumpports_command}
dumpports_command ::=
$dumpports (scope_identifier , string_literal
| variable
| expression )
Расширенный файл VCD начинается с заголовочной информации, содержащей дату, номер версии симулятора, используемого для моделирования, и используемую шкалу времени. Далее в файле содержатся определения области действия портов, по которым производится дамп, а затем фактические изменения значений на каждом шаге времени моделирования. Перечисляются только те порты, значение которых изменяется во время приращения времени.
Время моделирования, записанное в расширенном файле VCD, является абсолютным значением времени моделирования для последующих изменений значений портов.
Изменения значений для всех портов задаются в двоичном формате значениями 0, 1, x или z и включают информацию о силе.
Вещественное число выводится с помощью формата %.16g printf(). Это сохраняет точность числа, выводя все 53 бита мантиссы 64-битного числа двойной точности IEEE 754. Прикладные программы могут считывать вещественное число с помощью формата %g в scanf().
Расширенный формат VCD не поддерживает механизм дампа части вектора. Например, биты с 8 по 15 ([8:15]) 16-битного вектора не могут быть сброшены в файл VCD; вместо этого необходимо сбросить весь вектор ([0:15]). Кроме того, выражения, такие как a + b, не могут быть записаны в файл VCD.
Данные в расширенном файле VCD чувствительны к регистру.
18.4.2. Расширенная информация об узле VCD
На раздел информации об узле (также называемый разделом определений переменных) влияют задачи $dumpports, как показывает синтаксис 18.28.
$var var_type size < identifier_code reference $end
var_type ::=
port
size ::=
1
| vector_index
vector_index ::=
[msb_index : lsb_index]
index ::= decimal_number
identifier_code ::= integer
reference ::= port_identifier
Конструкция определяются следующим образом:
- var_type — порт ключевого слова. Никакое другое ключевое слово не допускается.
- size — Десятичное число, указывающее количество битов в порту. Если порт однобитный, значение равно 1. Если порт представляет собой шину, печатается фактический индекс. msb указывает на наиболее значимый индекс; lsb — на наименее значимый индекс.
- identifier_code — Целое число, которому предшествует <, которое начинается с нуля и увеличивается на единицу для каждого порта в порядке, указанном в объявлении модуля.
- reference — индификатор, указывающий на имя порта.
module test_device(count_out, carry, data, reset)
output count_out, carry ;
input [0:3] data;
input reset;
. . .
initial
begin
$dumpports(testbench.DUT, "testoutput.vcd");
. . .
end
Этот пример создает следующую информацию об узле в файле VCD:
$scope module testbench.DUT $end
$var port 1 <0 count_out $end
$var port 1 <1 carry $end
$var port [0:3] <2 data $end
$var port 1 <3 reset $end
$upscope $end
Если vector_index встречается в объявлении порта, это будет индекс, который будет сброшен. Если vector_index отсутствует в объявлении порта, то будет сброшен vector_index в объявлении net или reg, соответствующем имени порта. Если vector_index не найден, порт считается скалярным (шириной 1 бит).
module addbit ({A, b}, ci, sum, co);
input A, b, ci;
output sum, co;
. . .
$scope module addbit $end
$var port 1 <0 A $end
$var port 1 <1 b $end
$var port 1 <2 ci $end
$enddefinitions $end
18.4.3. Изменения значений
Как показывает синтаксис 18.29, секция изменения значений в файле VCD также подвержена влиянию $dumpports.
pport_value 0_strength_component 1_strength_component identifier_code
Конструкты определяются следующим образом:
- p — Ключевой символ, указывающий на порт. Между p и значением port_value нет пробела.
- port_value — Символ состояния (описан ниже).
- 0_strength_component — Один из восьми компонентов Verilog strengths, который указывает на специфику strength0 для порта.
- 1_strength_component — Один из восьми компонентов Verilog strengths, который указывает на специфику strength1 для порта.
Значения силы в Verilog следующие (добавьте к ключевому слову 0 или 1 в зависимости от компонента силы):
- 0 — highz
- 1 — small
- 2 — medium
- 3 — weak
- 4 — large
- 5 — pull
- 6 — strong
- 7 — supply
- identifier_code — целое число, которому предшествует символ <, как определено в конструкции $var для порта.
18.4.3.1. Символы состояний
Ниже перечислены входные значения от испытательного устройства, выходные значения тестируемого устройства (DUT) и состояния, представляющие неизвестное направление:
ВХОД (ИСПЫТАТЕЛЬНОЕ УСТРОЙСТВА):
- D — низкий
- U — высокий
- N — неизвестно
- Z — трехгосударственный
- d — низкий (два или более источников активны)
- u — высокий (два или более источников активны)
ВЫХОД (DUT):
- L — низкий
- H — высокий
- X — неизвестно (не беспокоить)
- T — трехгосударственный
- l — низкий (два или более драйверов активны)
- h — высокий (активны два или более драйвера)
НЕЗНАЧИТЕЛЬНАЯ ДИРЕКЦИЯ:
- 0 — низкий (и вход, и выход активны при значении 0)
- 1 — высокий (и вход, и выход активны при значении 1)
- ? — неизвестно
- F — трехпозиционный (вход и выход не соединены)
- A — неизвестно (вход 0 и выход 1)
- a — неизвестный (вход 0 и выход X)
- B — неизвестно (вход 1 и выход 0)
- b — неизвестный (вход 1 и выход X)
- C — неизвестный (вход X и выход 0)
- c — неизвестный (вход X и выход 1)
- f — неизвестно (вход и выход трехпозиционные)
18.4.3.2. Источники
Источники рассматриваются только с точки зрения примитивов, непрерывных назначений и процедурных непрерывных назначений. Значение 0/1 означает, что при значении 0/1 активны и вход, и выход. 0 и 1 являются конфликтными состояниями. К конфликтам применяются следующие правила:
- Если и вход, и выход управляют одним и тем же значением с одинаковым диапазоном силы, то это конфликт. Разрешенное значение равно 0/1, а сила — более сильная из двух.
- Если на вход подается сильная сила (диапазон), а на выход — слабая сила (диапазон), то разрешенное значение равно d/u, а сила — это сила входа.
- Если на вход подается слабая сила (диапазон), а на выход — сильная сила (диапазон), то разрешенное значение будет l/h, а сила — это сила выхода.
Диапазон следующий:
- Запас прочности от 7 до 5 (большой): сильная прочность
- Сила 4 к 1: слабая сила
18.4.3.3. Пример расширенного формата файла VCD
module adder(data0, data1, data2, data3, carry, as, rdn, reset,
test, write);
inout data0, data1, data2, data3;
output carry;
input as, rdn, reset, test, write;
. . .
$scope module testbench.adder_instance $end
$var port 1 <0 data0 $end
$var port 1 <1 data1 $end
$var port 1 <2 data2 $end
$var port 1 <3 data3 $end
$var port 1 <4 carry $end
$var port 1 <5 as $end
$var port 1 <6 rdn $end
$var port 1 <7 reset $end
$var port 1 <8 test $end
$var port 1 <9 write $end
$upscope $end
$enddefinitions $end
#0
$dumpports
pX 6 6 <0
pX 6 6 <1
pX 6 6 <2
pX 6 6 <3
pX 6 6 <4
pN 6 6 <5
pN 6 6 <6
pU 0 6 <7
pD 6 0 <8
pN 6 6 <9
$end
#180
pH 0 6 <4
#200000
pD 6 0 <5
pU 0 6 <6
pD 6 0 <9
#200500
pf 0 0 <0
pf 0 0 <1
pf 0 0 <2
pf 0 0 <3