17. Системные задачи и функции

Описание системных задач отображения
Содержание

В этом пункте описываются системные задачи и функции, которые считаются частью 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
Синтаксис 17-1-Синтаксис для системных задач $display и $write

Это основные системные задачи для вывода информации на экран. Эти два набора задач идентичны, за исключением того, что $display автоматически добавляет символ новой строки в конец своего вывода, в то время как задача $write этого не делает.

$display — системная задача, которая отображает свои аргументы в том же порядке, в котором они появляются в списке аргументов. Каждый аргумент может быть строкой в кавычках, выражением, возвращающим значение, или нулевым аргументом.

Содержимое строковых аргументов выводится буквально, за исключением случаев, когда вставляются определенные управляющие последовательности для отображения специальных символов или для задания формата отображения последующего выражения.

Эскейп-последовательности вставляются в строку тремя способами:

  • Специальный символ \ указывает, что следующий за ним символ является литеральным или непечатаемым символом (см. таблицу 17-1).
  • Специальный символ % указывает, что следующий символ должен интерпретироваться как спецификация формата, которая устанавливает формат отображения для последующего аргумента выражения (см. таблицу 17-2). Для каждого символа % (кроме %m и %%), который появляется в строке, после строки должен быть указан соответствующий аргумент выражения.
  • Строка специальных символов %% указывает на отображение символа знака процента % (см. таблицу 17-1).

Любой нулевой аргумент выводит на экран один символ пробела. (Нулевой аргумент характеризуется двумя соседними запятыми в списке аргументов).

Задача $display, вызываемая без аргументов, просто печатает символ новой строки. Задача $write, вызванная без аргументов, вообще ничего не печатает.

17.1.1.1 Последовательности экранирования для специальных символов

Последовательности, приведенные в таблице 17-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.

Таблица 17-2 — Последовательности экранирования для спецификаций формата
АргументОписание
%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 дробными цифрами.

Таблица 17-3-Спецификации форматов для вещественных чисел
АргументОписание
%e или %EОтображение ‘real’ в экспоненциальном формате
%f или %FОтображение ‘real’ в десятичном формате
%g или %GОтображать ‘real’ в экспоненциальном или десятичном формате, какой из форматов дает более короткий печатный вывод

Спецификации уровня сигнала сети, иерархического имени и формата строки описаны в пунктах 17.1.1.517.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.

Таблица 17-4 — Логический компонент значения формата силы
АргументОписание
0Для значения логического 0
1Для значения логической 1
XДля неизвестного значения
ZДля высокоимпедансного значения
LДля логического 0 или высокоимпедансного значения
HДля логической 1 или высокоимпедансного значения

Первые два символа — символы силы — представляют собой либо двухбуквенную мнемонику, либо пару десятичных цифр. Обычно для обозначения информации о силе используется мнемоника. Однако, в менее типичных случаях для обозначения диапазона уровней силы может использоваться пара десятичных цифр. В таблице 17-5 показаны мнемоники, используемые для обозначения различных уровней силы.

Имеется четыре движущих силы и три силы накопления заряда. Движущие силы связаны с выходами затворов и выходами непрерывного присвоения. Силы накопления заряда связаны с сетью типа trireg. (О моделировании сил см. пункт 7).

Для логических значений 0 и 1 используется мнемоника, когда в сигнале нет диапазона силы. В противном случае логическому значению предшествуют две десятичные цифры, которые указывают на максимальный и минимальный уровни силы.

Таблица 17-5 — Мнемоники для уровней силы
МнемоникаНазвание силыУровень силы
SuИсточник питания7
StСильный драйв6
PuПодтягиваемый источник5
LaБольшой конденсатор4
WeСлабый источник3
MeСредний конденсатор2
SmМалый конденсатор1
HiВысокий импеданс0

Для неизвестного значения используется мнемоника, когда оба компонента силы 0 и 1 находятся на одном уровне силы. В противном случае неизвестному значению X предшествуют две десятичные цифры, которые указывают на уровни силы 0 и 1 соответственно.

Напряжение высокого импеданса не может иметь известное логическое значение. Единственное логическое значение, допустимое для этого уровня, это Z.

Для значений L и H всегда используется мнемоника для обозначения уровня силы. Например:
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

Таблица 17-6 — Описание форматов силы
АргументОписание
St1Сильный источник со значением 1
Pu0Подтягиваемый источник со значением 0
HiZВысокоимпедансное состояние
Me0A 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
Синтаксис 17-2 — Синтаксис для системных задач $strobe

$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
Синтаксис 17-3 — Синтаксис для системных задач $monitor

$monitor — системная задача, которая предоставляет возможность отслеживать и отображать значения любых переменных или выражений, указанных в качестве аргументов задачи. Аргументы для этой задачи задаются точно так же, как и для системной задачи $display, включая использование управляющих последовательностей для специальных символов и спецификаций формата (см. 17.1.1).

Когда задача $monitor вызывается с одним или несколькими аргументами, симулятор устанавливает механизм, при котором каждый раз, когда переменная или выражение в списке аргументов меняет значение — за исключением $time,

$stime или $realtime — весь список аргументов выводится на экран в конце временного шага, как если бы об этом сообщила задача $display. Если два или более аргументов изменяют значение одновременно, то выдается только одно отображение, показывающее новые значения.

В каждый момент времени может быть активен только один список отображения $monitor. Однако, новое задание $monitor с новым списком отображения может быть выдано любое количество раз во время моделирования.

Задачи $monitoron и $monitoroff управляют флагом монитора, который включает и выключает мониторинг. Используйте $monitoroff для выключения флага и отключения мониторинга. Системная задача $monitoron может быть использована для включения флага, чтобы мониторинг был включен и последний вызов $monitor мог возобновить его отображение. Вызов $monitoron должен выводить сообщение на экран сразу после его вызова, независимо от того, произошло ли изменение значения. Это используется для установления начальных значений в начале сеанса мониторинга. По умолчанию флаг монитора включается в начале моделирования.