- 17.1 Отображение системных задач $display
- 17.1.1 Задачи отображения и записи
- 17.1.1.1 Последовательности экранирования для специальных символов
- 17.1.1.2 Спецификации формата
- 17.1.1.3 Размер отображаемых данных
- 17.1.1.4 Неизвестные и высокоимпедансные значения
- 17.1.1.5 Формат силы
- 17.1.1.6 Формат иерархических имен
- 17.1.1.7 Формат строки
- 17.1.2 Cтробированный мониторинг $strobe
- 17.1.3 Непрерывный мониторинг $monitor
В этом пункте описываются системные задачи и функции, которые считаются частью Verilog HDL. Эти системные задачи и функции разделены на десять категорий следующим образом:
1) Задачи отображения (17.1)
2) Задачи файлового ввода-вывода (17.2)
3) Временные задачи (17.3)
4) Задачи стохастического анализа (17.6)
5) Функции времени моделирования (17.7)
6) Функции преобразования (17.8)
7) Вероятностные функции распределения (17.9)
8) Ввод командной строки (17.10)
9) Математические функции (17.11)
Эти полезные задачи и функции обеспечивают некоторые широко полезные возможности. Поведение этих задач и функций описано в пунктах 17.1-17.11. Дополнительные задачи для дампа изменения значений (VCD) описаны в пункте 18.
17.1 Отображение системных задач $display
Группа системных задач отображения делится на три категории: задачи отображения и записи, задачи стробированного мониторинга и задачи непрерывного мониторинга.
17.1.1 Задачи отображения и записи
Синтаксис системных задач $display и $write показан в Синтаксисе 17-1.
display_tasks ::=
display_task_name [ ( list_of_arguments ) ] ;
display_task_name ::=
$display | $displayb | $displayo | $displayh
| $write | $writeb | $writeo | $writeh
Это основные системные задачи для вывода информации на экран. Эти два набора задач идентичны, за исключением того, что $display автоматически добавляет символ новой строки в конец своего вывода, в то время как задача $write этого не делает.
$display — системная задача, которая отображает свои аргументы в том же порядке, в котором они появляются в списке аргументов. Каждый аргумент может быть строкой в кавычках, выражением, возвращающим значение, или нулевым аргументом.
Содержимое строковых аргументов выводится буквально, за исключением случаев, когда вставляются определенные управляющие последовательности для отображения специальных символов или для задания формата отображения последующего выражения.
Эскейп-последовательности вставляются в строку тремя способами:
- Специальный символ \ указывает, что следующий за ним символ является литеральным или непечатаемым символом (см. таблицу 17-1).
- Специальный символ % указывает, что следующий символ должен интерпретироваться как спецификация формата, которая устанавливает формат отображения для последующего аргумента выражения (см. таблицу 17-2). Для каждого символа % (кроме %m и %%), который появляется в строке, после строки должен быть указан соответствующий аргумент выражения.
- Строка специальных символов %% указывает на отображение символа знака процента % (см. таблицу 17-1).
Любой нулевой аргумент выводит на экран один символ пробела. (Нулевой аргумент характеризуется двумя соседними запятыми в списке аргументов).
Задача $display, вызываемая без аргументов, просто печатает символ новой строки. Задача $write, вызванная без аргументов, вообще ничего не печатает.
17.1.1.1 Последовательности экранирования для специальных символов
Последовательности, приведенные в таблице 17-1, при включении в строковый аргумент вызывают отображение специальных символов.
Аргумент | Описание |
---|---|
\n | Символ новой строки |
\t | Символ табуляции |
\ | Символ \ |
\» | Символ « |
\ddd | Символ, заданный 1-3 восьмеричными цифрами (0 =< d =< 7). Если используется менее трех символов, то следующий символ не должен быть восьмеричной цифрой. Реализации могут выдать ошибку, если представленный символ больше \377. |
%% | Символ % |
module disp;
initial begin
$display("\\\t\\\n\"\123");
end
endmodule
\ \
"S
17.1.1.2 Спецификации формата
В таблице 17-2 показаны управляющие последовательности, используемые для спецификации формата. Каждая управляющая последовательность, включенная в строковый аргумент, задает формат отображения для последующего выражения. Для каждого символа % (кроме %m и %%), который появляется в строке, в списке аргументов за строкой должно следовать соответствующее выражение. Значение выражения заменяет спецификацию формата при отображении строки.
Любой аргумент выражения, не имеющий соответствующей спецификации формата, отображается с использованием десятичного формата по умолчанию в $display и $write, двоичного формата в $displayb и $writeb, восьмеричного формата в $displayo и $writeo и шестнадцатеричного формата в $displayh и $writeh.
Аргумент | Описание |
---|---|
%h или %H | Отображение в шестнадцатеричном формате |
%d или %D | Отображение в десятичном формате |
%o или %O | Отображение в восьмеричном формате |
%b или %B | Отображение в двоичном формате |
%c или %C | Отображение в формате символов ASCII |
%l или %L | Отображение информации о привязке библиотеки |
%v или %V | Отображение уровня чистого сигнала |
%m или %M | Отображение иерархического имени |
%s или %S | Отображение в виде строки |
%t или %T | Отображение в формате текущего времени |
%u или %U | Неформатированные данные 2 значения |
%z или %Z | Неформатированные данные 4значения |
Спецификация форматирования %l (или %L) определена для отображения информации о библиотеке конкретного модуля. Эта информация должна отображаться как «library.cell«, соответствующая имени библиотеки, из которой был извлечен текущий экземпляр модуля, и имени ячейки текущего экземпляра модуля. Информацию о библиотеках и конфигурировании конструкций см. в п. 13 и п. 13(продолжение).
Спецификация форматирования %u (или %U) определена для записи данных без форматирования (двоичные значения). Приложение должно передать двоичное представление 2 значений указанных данных в выходной поток. Эта управляющая последовательность может быть использована с любой из существующих задач системы отображения, хотя предпочтительнее использовать $fwrite. Любые неизвестные или высокоимпедансные биты в источнике должны рассматриваться как нулевые. Этот спецификатор форматирования предназначен для поддержки передачи данных во внешние программы, не имеющие понятия о x и z. Приложениям, требующим сохранения x и z, рекомендуется использовать спецификацию формата ввода-вывода %z.
Данные должны быть записаны в файл в собственном формате endian базовой системы (т.е. в том же порядке endian, что и при использовании PLI и системного вызова Write (2) языка C). Данные должны быть записаны в единицах по 32 бита, причем слово, содержащее LSB, записывается первым.
ПРИМЕЧАНИЕ — Для POSIX-приложений может потребоваться открыть файлы для неформатированного ввода-вывода со спецификаторами wb, wb+ или w+b, чтобы избежать того, что системная реализация ввода-вывода изменит шаблоны в неформатированном потоке, которые соответствуют специальным символам.
Спецификация форматирования %z (или %Z) определена для записи данных без форматирования (двоичные значения). Приложение должно передать в выходной поток двоичное представление 4-х значений указанных данных. Эта управляющая последовательность может быть использована с любой из существующих задач системы отображения, хотя предпочтительнее использовать \$fwrite. Этот спецификатор форматирования предназначен для поддержки передачи данных во внешние программы и из них, которые распознают и поддерживают концепцию x и z. Приложениям, которые не требуют сохранения x и z, рекомендуется использовать спецификацию формата ввода-вывода %u.
Данные должны быть записаны в файл в собственном формате endian базовой системы. Т.е. в том же порядке endian, как если бы использовался PLI, данные находились в структуре s_vpi_vecval, а для записи структуры на диск использовался системный вызов write(2) языка С. Данные должны быть записаны в единицах по 32 бита, причем структура, содержащая LSB, записывается первой.
ПРИМЕЧАНИЕ — Для POSIX-приложений может потребоваться открыть файлы для неформатированного ввода-вывода со спецификаторами wb, wb+ или w+b, чтобы избежать того, что системная реализация ввода-вывода изменит шаблоны в неформатированном потоке, которые соответствуют специальным символам.
Спецификации формата в таблице 17-3 используются с вещественными числами и обладают всеми возможностями форматирования, доступными в языке Си. Например, спецификация формата %10.3g задает минимальную ширину поля 10 с 3 дробными цифрами.
Аргумент | Описание |
---|---|
%e или %E | Отображение ‘real’ в экспоненциальном формате |
%f или %F | Отображение ‘real’ в десятичном формате |
%g или %G | Отображать ‘real’ в экспоненциальном или десятичном формате, какой из форматов дает более короткий печатный вывод |
Спецификации уровня сигнала сети, иерархического имени и формата строки описаны в пунктах 17.1.1.5—17.1.1.7.
Спецификация формата %t работает вместе с системной задачей $timeformat для задания единой единицы времени, точности времени и формата для представления информации о времени из различных модулей, использующих различные единицы времени и точности. Задача $timeformat описана в разделе 17.3.2.
module disp;
reg [31:0] rval;
pulldown (pd);
initial begin
rval = 101;
$display("rval = %h hex %d decimal",rval,rval);
$display("rval = %o octal\nrval = %b bin",rval,rval);
$display("rval has %c ascii character value",rval);
$display("pd strength value is %v",pd);
$display("current scope is %m");
$display("%s is ascii value for 101",101);
$display("simulation time is %t", $time);
end
endmodule
rval = 00000065 hex 101 decimal
rval = 00000000145 octal
rval = 00000000000000000000000001100101 bin
rval has e ascii character value
pd strength value is StX
current scope is disp
e is ascii value for 101
simulation time is 0
17.1.1.3 Размер отображаемых данных
Для аргументов выражения размер значений, записываемых в выходной файл (или терминал), определяется автоматически.
Например, результату 12-битного выражения будет выделено три символа при отображении в шестнадцатеричном формате и четыре символа при отображении в десятичном формате, поскольку наибольшее возможное значение для выражения — FFF (шестнадцатеричное) и 4095 (десятичное).
При отображении десятичных значений ведущие нули подавляются и заменяются пробелами. В других радиусах ведущие нули отображаются всегда.
$display("d=%0h a=%0h", data, addr);
module printval;
reg [11:0] r1;
initial begin
r1 = 10;
$display( "Printing with maximum size - :%d: :%h:", r1,r1 );
$display( "Printing with minimum size - :%0d: :%0h:", r1,r1 );
end
endmodule
«Printing with maximum size — : 10: :00a:
«Printing with maximum size — :10: :a:
В этом примере выводится результат 12-битного выражения. Первый вызов $display использует стандартный синтаксис спецификатора формата и выдает результаты, требующие четыре и три колонки для десятичного и шестнадцатеричного счисления, соответственно. Второй вызов $display использует форму %0 синтаксиса спецификатора формата и выдает результаты, требующие два столбца и один столбец соответственно.
17.1.1.4 Неизвестные и высокоимпедансные значения
Когда результат выражения содержит неизвестное или высокоимпедансное значение, для отображения этого значения применяются определенные правила.
В десятичном формате (%d) правила следующие:
- Если все биты имеют неизвестное значение, отображается один символ x в нижнем регистре.
- Если все биты находятся в высокоимпедансном значении, отображается один символ z в нижнем регистре.
- Если некоторые, но не все биты находятся в неизвестном значении, отображается символ X в верхнем регистре.
- Если некоторые, но не все биты находятся в высокоимпедансном значении, отображается символ Z в верхнем регистре, если только некоторые биты не находятся в неизвестном значении, в этом случае отображается символ X в верхнем регистре.
- Десятичные цифры всегда отображаются с правым выравниванием в поле фиксированной ширины.
В шестнадцатеричном (%h) и восьмеричном (%o) форматах правила следующие:
- Каждая группа из 4 битов представлена как одна шестнадцатеричная цифра. Каждая группа из 3 битов представлена как одна восьмеричная цифра.
- Если все биты в группе имеют неизвестное значение, для этого разряда отображается строчная буква x.
- Если все биты в группе находятся в высокоимпедансном состоянии, то для этого разряда печатается строчная буква z.
- Если некоторые, но не все биты в группе неизвестны, для этой цифры отображается заглавный X.
- Если некоторые, но не все биты в группе находятся в высокоимпедансном состоянии, то для этого разряда отображается заглавная буква Z, если только некоторые биты не находятся в неизвестном значении, в этом случае для этого разряда отображается заглавная буква X.
В двоичном формате (%b) каждый бит печатается отдельно с использованием символов 0, 1, x и z. Например:
// Объявление Результат
$display("%d", 1'bx); //x
$display("%h", 14'bx01010); //xxXa
$display("%h %o", 12'b001xxx101x01,
12'b001xxx101x01); //XXX 1x5X
17.1.1.5 Формат силы
Спецификация формата %v используется для отображения силы скалярных сеток. Для каждой спецификации %v, которая появляется в строке, соответствующая скалярная ссылка должна следовать за строкой в списке аргументов.
Сила скалярной сети сообщается в трехсимвольном формате. Первые два символа указывают силу. Третий символ указывает текущее логическое значение скалярной сети и может быть любым из значений, приведенных в Таблице 17-4.
Аргумент | Описание |
---|---|
0 | Для значения логического 0 |
1 | Для значения логической 1 |
X | Для неизвестного значения |
Z | Для высокоимпедансного значения |
L | Для логического 0 или высокоимпедансного значения |
H | Для логической 1 или высокоимпедансного значения |
Первые два символа — символы силы — представляют собой либо двухбуквенную мнемонику, либо пару десятичных цифр. Обычно для обозначения информации о силе используется мнемоника. Однако, в менее типичных случаях для обозначения диапазона уровней силы может использоваться пара десятичных цифр. В таблице 17-5 показаны мнемоники, используемые для обозначения различных уровней силы.
Имеется четыре движущих силы и три силы накопления заряда. Движущие силы связаны с выходами затворов и выходами непрерывного присвоения. Силы накопления заряда связаны с сетью типа trireg. (О моделировании сил см. пункт 7).
Для логических значений 0 и 1 используется мнемоника, когда в сигнале нет диапазона силы. В противном случае логическому значению предшествуют две десятичные цифры, которые указывают на максимальный и минимальный уровни силы.
Мнемоника | Название силы | Уровень силы |
---|---|---|
Su | Источник питания | 7 |
St | Сильный драйв | 6 |
Pu | Подтягиваемый источник | 5 |
La | Большой конденсатор | 4 |
We | Слабый источник | 3 |
Me | Средний конденсатор | 2 |
Sm | Малый конденсатор | 1 |
Hi | Высокий импеданс | 0 |
Для неизвестного значения используется мнемоника, когда оба компонента силы 0 и 1 находятся на одном уровне силы. В противном случае неизвестному значению X предшествуют две десятичные цифры, которые указывают на уровни силы 0 и 1 соответственно.
Напряжение высокого импеданса не может иметь известное логическое значение. Единственное логическое значение, допустимое для этого уровня, это Z.
always
#15 $display($time,,"group=%b signals=%v %v %v",{s1,s2,s3},s1,s2,s3);
В примере ниже показан вывод, который может получиться в результате такого вызова, а в таблице 17-6 объясняются различные форматы силы, которые появляются в выводе.
0 группа=111 сигналы=St1 Pu1 St1
15 группа=011 сигналы=Pu0 Pu1 St1
30 group=0xz signals=520 PuH HiZ
45 группа=0хх сигналы=Pu0 65X StX
60 группа=000 сигналы=Me0 St0 St0
Аргумент | Описание |
---|---|
St1 | Сильный источник со значением 1 |
Pu0 | Подтягиваемый источник со значением 0 |
HiZ | Высокоимпедансное состояние |
Me0 | A 0 накопитель заряда средней силы конденсатора |
StX | Сильный источник с неизвестным значением |
PuH | Подтягиваемый источник со значением 1 или высокоимпедансное значение |
65X | Неизвестная величина с сильной движущей компонентой 0 и подтягивающим источником равным 1 |
520 | Значение 0 с диапазоном возможной силы от подтягивающего источника до среднего конденсатора |
17.1.1.6 Формат иерархических имен
Спецификатор формата %m не принимает аргумента. Вместо этого он заставляет задачу отображения вывести иерархическое имя модуля, задачи, функции или именованного блока, который вызывает системную задачу, содержащую спецификатор формата. Это полезно, когда существует много экземпляров модуля, вызывающего системную задачу. Одно из очевидных применений — сообщения проверки времени в модуле флип-флопа или защелки. Спецификатор формата %m должен точно указать экземпляр модуля, ответственный за генерацию сообщения проверки времени.
17.1.1.7 Формат строки
Спецификатор формата %s используется для печати ASCII-кодов в виде символов. Для каждого спецификатора %s, который появляется в строке, в списке аргументов за строкой должен следовать соответствующий аргумент. Аргумент интерпретируется как последовательность 8-битных шестнадцатеричных ASCII-кодов, каждый из которых представляет один символ. Если аргумент является переменной, его значение должно быть выровнено по правому краю так, чтобы крайний правый бит значения был младшим битом последнего символа в строке. В конце строки не требуется символ завершения или значение, и ведущие нули никогда не печатаются.
17.1.2 Cтробированный мониторинг $strobe
Синтаксис для системной задачи $strobe показан в Синтаксисе 17-2.
strobe_tasks ::=
strobe_task_name [ ( list_of_arguments ) ] ;
strobe_task_name ::=
$strobe | $strobeb | $strobeo | $strobeh
$strobe — системная задача, которая обеспечивает возможность отображения данных моделирования в выбранное время. Это время — конец текущего времени симуляции, когда все события симуляции произошли за это время, непосредственно перед переходом времени симуляции. Аргументы для этой задачи задаются точно так же, как и для системной задачи $display, включая использование управляющих последовательностей для специальных символов и спецификаций формата (см. 17.1.1).
forever @(negedge clock)
$strobe ("At time %d, data is %h",$time,data);
В этом примере $strobe записывает информацию о времени и данных на стандартный выход и в файл журнала при каждом отрицательном фронте тактового сигнала. Это действие должно происходить непосредственно перед продвижением времени моделирования и после того, как произошли все другие события в это время, чтобы записанные данные были уверены, что это правильные данные для этого времени моделирования.
17.1.3 Непрерывный мониторинг $monitor
Синтаксис для системной задачи $monitor показан в Синтаксисе 17-3.
monitor_tasks ::=
monitor_task_name [ ( list_of_arguments ) ] ;
| $monitoron ;
| $monitoroff ;
monitor_task_name ::=
$monitor | $monitorb | $monitoro | $monitorh
$monitor — системная задача, которая предоставляет возможность отслеживать и отображать значения любых переменных или выражений, указанных в качестве аргументов задачи. Аргументы для этой задачи задаются точно так же, как и для системной задачи $display, включая использование управляющих последовательностей для специальных символов и спецификаций формата (см. 17.1.1).
Когда задача $monitor вызывается с одним или несколькими аргументами, симулятор устанавливает механизм, при котором каждый раз, когда переменная или выражение в списке аргументов меняет значение — за исключением $time,
$stime или $realtime — весь список аргументов выводится на экран в конце временного шага, как если бы об этом сообщила задача $display. Если два или более аргументов изменяют значение одновременно, то выдается только одно отображение, показывающее новые значения.
В каждый момент времени может быть активен только один список отображения $monitor. Однако, новое задание $monitor с новым списком отображения может быть выдано любое количество раз во время моделирования.
Задачи $monitoron и $monitoroff управляют флагом монитора, который включает и выключает мониторинг. Используйте $monitoroff для выключения флага и отключения мониторинга. Системная задача $monitoron может быть использована для включения флага, чтобы мониторинг был включен и последний вызов $monitor мог возобновить его отображение. Вызов $monitoron должен выводить сообщение на экран сразу после его вызова, независимо от того, произошло ли изменение значения. Это используется для установления начальных значений в начале сеанса мониторинга. По умолчанию флаг монитора включается в начале моделирования.