17. Задачи временной шкалы, управления, PLA и стохастического анализа Verilog

Содержание

17.3 Системные задачи временной шкалы Verilog

Следующие системные задачи отображают и устанавливают информацию о шкале времени:

  1. $printtimescale
  2. $timeformat

Обсуждение временных шкал и единиц времени Verilog см. в разделе 19.8.

17.3.1 $printtimescale

$printtimescale — это системная задача, которая выводит единицу времени и точность для конкретного модуля. Синтаксис системной задачи показан в Синтаксисе 17-9.

printtimescale_task ::= $printtimescale [ ( hierarchical_identifier ) ] ;
Синтаксис 17-9 — Синтаксис $printtimescale

Эта системная задача может быть указана с аргументом или без него.

  • Если аргумент не указан, $printtimescale отображает единицу времени и точность модуля, который является текущей областью видимости.
  • Если указан аргумент, $printtimescale отображает единицу времени и точность переданного ему модуля.

Информация о шкале времени должна быть представлена в следующем формате: «Time scale of (module_name) is unit / precision».

Например:
`timescale 1 ms / 1 us module a_dat; initial $printtimescale(b_dat.c1); endmodule `timescale 10 fs / 1 fs module b_dat; c_dat c1 (); endmodule `timescale 1 ns / 1 ns module c_dat; . . . endmodule

В этом примере модуль a_dat вызывает системную задачу $printtimescale для отображения информации о шкале времени другого модуля c_dat, который является экземпляром модуля b_dat.

Информация о c_dat должна отображаться в следующем формате: «Time scale of (b_dat.c1) is 1ns / 1ns».

17.3.2 $timeformat

Системная задача $timeformat выполняет следующие две функции:

  • Он определяет, как спецификация формата %t сообщает информацию о времени для группы системных задач: $write, $display, $strobe, $monitor, $fwrite, $fdisplay, $fstrobe и $fmonitor.
  • Указывает единицу времени для задержек, введенных интерактивно.

Синтаксис для системной задачи $timeformat показан в Синтаксисе 17-10.

timeformat_task ::= $timeformat [ ( units_number , precision_number , suffix_string , minimum_field_width ) ] ;
Синтаксис 17-10 — Синтаксис для $timeformat

Аргумент номер единицы времени(units_number) должен быть целым числом в диапазоне от 0 до -15. Этот аргумент представляет единицу времени, как показано в Таблице 17-10.

Таблица 17-10 — $timeformat аргументы units_number
Значение аргументаЕдиница времениЗначение аргументаЕдиница времени
01 s-810 ns
-1100 ms-91 ns
-210 ms-10100 ps
-31 ms-1110 ps
-4100 us-121 ps
-510 us-13100 fs
-61 us-1410 fs
-7100 ns-151 fs

ПРИМЕЧАНИЕ: Хотя s, ms, ns, ps и fs являются обычными символами единиц СИ для секунды, миллисекунды, наносекунды, пикосекунды и фемтосекунды, из-за отсутствия греческой буквы m (mu) в наборах кодирующих символов, «us» представляет символ единицы СИ для микросекунды, правильно ms.

Системная задача $timeformat выполняет следующие две операции:

  • Он устанавливает единицу времени для всех последующих задержек, введенных интерактивно.
  • Он устанавливает единицу времени, точность, суффиксную строку и минимальную ширину поля для всех форматов %t, указанных во всех последующих модулях в описании источника, пока не будет вызвана другая системная задача $timeformat.

Аргументы системной задачи $timeformat по умолчанию приведены в таблице 17-11.

Например:

Таблица 17-11 — Значение аргументов по умолчанию системной функции $timeformat
АргументЗначение по умолчанию
units_numberНаименьший аргумент точности времени из всех директив компилятора `*timescale в описании исходного текста
precision_number0
suffix_stringсуффиксная строка
minimum_field_width20
В следующем примере показано использование %t с системной задачей $timeformat для указания единой единицы времени, точности времени и формата для информации о времени.
`timescale 1 ms / 1 ns module cntrl; initial $timeformat(-9, 5, " ns", 10); endmodule `timescale 1 fs / 1 fs module a1_dat; reg in1; integer file; buf #10000000 (o1,in1); initial begin file = $fopen("a1.dat"); #00000000 $fmonitor(file,"%m: %t in1=%d o1=%h", $realtime,in1,o1); #10000000 in1 = 0; #10000000 in1 = 1; end endmodule `timescale 1 ps / 1 ps module a2_dat; reg in2; integer file2; buf #10000 (o2,in2); initial begin file2=$fopen("a2.dat"); #00000 $fmonitor(file2,"%m: %t in2=%d o2=%h",$realtime,in2,o2); #10000 in2 = 0; #10000 in2 = 1; end endmodule

Содержимое файла a1.dat выглядит следующим образом:

​ a1_dat: 0.00000 ns in1= x o1=x
​ a1_dat: 10.00000 ns in1= 0 o1=x
​ a1_dat: 20.00000 ns in1= 1 o1=0
​ a1_dat: 30.00000 ns in1= 1 o1=1

Содержимое файла a2.dat выглядит следующим образом:

a2_dat: 0.00000 ns in2=x o2=x
​ a2_dat: 10.00000 ns in2=0 o2=x
​ a2_dat: 20.00000 ns in2=1 o2=0
​ a2_dat: 30.00000 ns in2=1 o2=1

В этом примере время событий, записанных в файлы системной задачей $fmonitor в модулях a1_dat и a2_dat представлены как кратные 1 ns — несмотря на то, что единицами времени для этих модулей являются 1 fs и 1 ps, соответственно — потому что первый аргумент системной задачи $timeformat равен -9, а спецификация формата %t включена в аргументы $fmonitor. Эта информация о времени сообщается после имен модулей с пятью дробными цифрами, за которыми следует строка символов ns через пробел, достаточно широком для 10 символов ASCII.

17.4 Cистемные задачи управления моделированием

Существуют две задачи моделирования системы управления:

  1. $finish
  2. $stop

17.4.1 $finish

$finish — это системная задача, которая заставляет симулятор завершить работу и передать управление обратно операционной системе хоста. Если для этой задачи задано выражение, то его значение (0, 1 или 2) определяет диагностические сообщения, которые выводятся перед выдачей подсказки (см. таблицу 17-12). Если аргумент не указан, то по умолчанию принимается значение 1.

Синтаксис 17-11 показывает синтаксис для системной задачи $finish.

finish_task ::= $finish [ ( n ) ] ;
Синтаксис 17-11 — Синтаксис $finish
Таблица 17-12 — Диагностика для $finish
Значение аргументаДиагностическое сообщение
0Ничего не выводит
1Выводит времени и места моделирования
2Выводит время моделирования, местоположения и статистики о памяти и времени центрального процессора (ЦП), используемых при моделировании

17.4.2 $stop

$stop — это системная задача, которая приводит к приостановке моделирования. Имеет принимает необязательный аргумент выражения (0, 1 или 2), который определяет тип выводимого диагностического сообщения. Количество выводимых диагностических сообщений увеличивается с ростом значения необязательного аргумента, передаваемого в $stop.

Синтаксис для системной задачи $stop показан в Синтаксисе 17-12.

stop_task ::= $stop [ ( n ) ] ;
Синтаксис 17-12-Синтаксис для $stop

17.5 Системная задачи моделирования программируемых логических схем (PLA)

Моделирование устройств PLA обеспечивается в Verilog HDL группой системных задач. В этом подразделе описывается синтаксис и использование этих системных задач, а также форматы файла персонализации логического массива. Синтаксис системной задачи моделирования PLA показан в Синтаксисе 17-13.

pla_system_task ::= $array_type$logic$format ( memory_identifier , input_terms , output_terms ) ; array_type ::= sync | async logic ::= and | or | nand | nor format ::= array | plane memory_identifier ::= identifier input_terms ::= expression output_terms ::= variable_lvalue
Синтаксис 17-13 — Синтаксис для системой задачи моделирования PLA

Входные термины могут быть соединениями или переменными, в то время как выходные термины должны быть только переменными. Синтаксис PLA позволяет решать системные задачи, как показано в таблице 17-13.

Таблица 17-13 Задачи системы моделирования PLA
Тип PLAТип PLAТип PLAТип PLA
$async$and$array$sync$and$array$async$and$plane$sync$and$plane
$async$nand$array$sync$nand$array$async$nand$plane$sync$nand$plane
$async$or$array$sync$or$array$async$or$plane$sync$or$plane
$async$nor$array$sync$nor$array$async$nor$plane$sync$nor$plane

17.5.1 Типы массивов

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

Для синхронной и асинхронной форм выводы обновляются без задержки. Например:

Пример асинхронного системного вызова выглядит следующим образом:
wire a1, a2, a3, a4, a5, a6, a7; reg b1, b2, b3; wire [1:7] awire; reg [1:3] breg; $async$and$array(mem,{a1,a2,a3,a4,a5,a6,a7},{b1,b2,b3}); // or $async$and$array(mem,awire, breg);
Пример вызова синхронной системной задачи выглядит следующим образом:
$sync$or$plane(mem,{a1,a2,a3,a4,a5,a6,a7}, {b1,b2,b3});

17.5.2 Логические типы массивов

Логические массивы моделируются с помощью логических вентилей and, or, nand и nor. Это относится ко всем типам и форматам массивов.

Например:

Пример вызова системной задачи nor plane выглядит следующим образом:
$async$nor$plane(mem,{a1,a2,a3,a4,a5,a6,a7},{b1,b2,b3});
Пример вызова системной задачи nand-plane выглядит следующим образом:
$sync$nand$plane(mem,{a1,a2,a3,a4,a5,a6,a7}, {b1,b2,b3});

17.5.3 Объявление и загрузка логических массивов

Логический массив объявляется как массив регистров, ширина которого равна количеству входных портов, а глубина — количеству выходных портов.

Индивидуальные данные логической матрицы обычно загружаются в память из текстового файла данных с помощью системных задач $readmemb или $readmemh. В качестве альтернативы, данные могут быть записаны непосредственно в память с помощью процедурных операторов присваивания. PLA могут быть изменены динамически в любое время во время моделирования простым изменением содержимого памяти. Новая индетификация будет отражена на выходах логической матрицы при следующей оценке.

Например:

В следующем примере показан логический массив с n входными портами и m выходными портами:
reg [1:n] mem[1:m];

Как показано в примерах в 17.5, входные порты PLA, выходные порты и память должны быть указаны в порядке возрастания.

17.5.4 Форматы логических массивов

Два отдельных формата поддерживаются Verilog HDL и различаются использованием системного вызова массива array или системного вызова массива plane. Системный вызов массива позволяет использовать 1 или 0 в памяти, которая была объявлена. 1 означает принимать входное значение, а 0 — не принимать входное значение.

Системный вызов массива plane соответствует формату Калифорнийского университета в Беркли(University of California at Berkele) для Espresso . Каждый бит данных, хранящихся в массиве, имеет следующее значение:

0 — Дополненное входное значение.

1 — Истинное входное значение.

x — «наихудший случай» входного значения.

z — Не заботиться; входное значение не имеет разницы.

? — То же, что и z.

Например:

Пример 1 Следующий пример иллюстрирует массив с логическими уравнениями:
b1 = a1 & a2 b2 = a3 & a4 & a5 b3 = a5 & a6 & a7

PLA выглядит следующим образом:

1100000 in mem[1]
0011100 in mem[2]
0000111 in mem[3]

Модуль для PLA выглядит следующим образом:
module async_array(a1,a2,a3,a4,a5,a6,a7,b1,b2,b3); input a1, a2, a3, a4, a5, a6, a7 ; output b1, b2, b3; // объявление памяти для массива reg [1:7] mem[1:3]; reg b1, b2, b3; initial begin // устанавливаем массив из файла array.dat $readmemb("array.dat", mem); // установите асинхронный логический массив с входными // и выходные портами, выраженные в виде конкатенаций $async$and$array(mem,{a1,a2,a3,a4,a5,a6,a7},{b1,b2,b3}); end endmodule

Где файл array.dat содержит двоичные данные для личности PLA:

1100000
0011100
0000111

Синхронная версия этого примера имеет следующее конструкцию:
module sync_array(a1,a2,a3,a4,a5,a6,a7,b1,b2,b3,clk); input a1, a2, a3, a4, a5, a6, a7, clk; output b1, b2, b3; reg [1:7] mem[1:3]; // объявление памяти reg b1, b2, b3; initial begin $readmemb("array.dat", mem); // устанавливаем синхронный логический массив для оценки // при появлении положительного фронта на тактовом сигнале forever @(posedge clk) $async$and$array(mem,{a1,a2,a3,a4,a5,a6,a7},{b1,b2,b3}); end endmodule
Пример 2 — Далее следует пример использования задач формата plane. Сначала показана логическая функция этого PLA, затем персонализация PLA в новом формате, описание на языке Verilog HDL с использованием системной задачи $async$and$plane, и, наконец, результат выполнения моделирования. Логическая функция PLA выглядит следующим образом:
b[1] = a[1] & ~a[2]; b[2] = a[3]; b[3] = ~a[1] & ~a[3]; b[4] = 1;

PLA выглядит следующим образом:

3’b10?
3’b??1
3’b0?0
3’b???

Описание Verilog HDL с использованием системной задачи $async$and$plane выглядит следующим образом:
module pla; `define rows 4 `define cols 3 reg [1:`cols] a, mem[1:`rows]; reg [1:`rows] b; initial begin // Системный вызов PLA $async$and$plane(mem,a[1:3],b[1:4]); mem[1] = 3'b10?; mem[2] = 3'b??1; mem[3] = 3'b0?0; mem[4] = 3'b???; #10 a = 3'b111; #10 $displayb(a, " -> ", b); #10 a = 3'b000; #10 $displayb(a, " -> ", b); #10 a = 3'bxxx; #10 $displayb(a, " -> ", b); #10 a = 3'b101; #10 $displayb(a, " -> ", b); end endmodule

На выходе получаем следующее:

111 -> 0101
000 -> 0011

xxx -> xxx1
101 -> 1101

17.6 Задачи стохастического анализа

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

Далее следует набор задач и функций, которые создают очереди и управляют ими:
$q_initialize (q_id, q_type, max_length, status) ; $q_add (q_id, job_id, inform_id, status) ; $q_remove (q_id, job_id, inform_id, status) ; $q_full (q_id, status) $q_exam (q_id, q_stat_code, q_stat_value, status) ;

17.6.1 $q_initialize

$q_initialize — это системная задача, которая создает новые очереди. Аргумент q_id — это целочисленный вход, который должен однозначно идентифицировать новую очередь. Аргумент q_type — это целочисленный вход, который определяет тип очереди, как показано в таблице 17-14.

Таблица 17-14 — Типы очередей значения $q_type
значение q_typeТип очереди
1Первый вошедший, первый вышедший
2Последний вошел, первый вышел

Аргумент max_length представляет собой целочисленное значение, которое определяет максимальное количество записей, допустимых в очереди. Успех или неудача создания очереди возвращается в виде целочисленного значения в status. Условия ошибки и соответствующие значения status описаны в таблице 17-16 (в разделе 17.6.6).

17.6.2 $q_add

$q_add — системная задача, которая помещает запись в очередь. Аргумент q_id — это целочисленный вход, который указывает, в какую очередь добавить запись. Аргумент job_id — это целочисленное значение, идентифицирующее задание.

Аргумент inform_id — это целочисленный входной параметр, который ассоциируется с записью очереди. Его значение определяется пользователем. Например, аргумент inform_id может представлять время выполнения записи в модели процессора. Код состояния сообщает об успехе операции или об ошибках, как описано в таблице 17-16.

17.6.3 $q_remove

$q_remove — системная задача, которая получает и удаляет запись из очереди. Аргумент q_id — это целочисленный вход, который указывает, из какой очереди нужно удалить запись. Аргумент job_id — это целочисленный выход, который идентифицирует удаляемую запись. Аргумент inform_id — это целочисленный вывод, который менеджер очередей сохранил во время выполнения задачи $q_add. Его значение определяется пользователем. Код состояния сообщает об успешном выполнении операции или об ошибках, как описано в таблице 17-16.

17.6.4 $q_full

$q_full — системная функция, которая проверяет, есть ли место для еще одной записи в очереди. Она возвращает 0, если очередь не заполнена, и 1, если очередь заполнена. Код состояния сообщает об успехе операции или об ошибке, как описано в таблице 17-16.

17.6.5 $q_exam

$q_exam — системная задача, которая предоставляет статистическую информацию об активности в очереди q_id. Она возвращает значение в q_stat_value в зависимости от информации, запрошенной в q_stat_code. Значения q_stat_code и соответствующая информация, возвращаемая в q_stat_value, описаны в таблице 17-15. Код состояния сообщает об успехе операции или об ошибках, как описано в таблице 17-16.

Таблица 17-15 — Значения аргументов для системной задачи $q_exam
Значение, запрашиваемое в q_stat_codeИнформация, полученная от q_stat_value
1Текущая длина очереди
2Среднее время между интервалами
3Максимальная длина очереди
4Самое короткое время ожидания
5Наибольшее время ожидания для заданий, все еще находящихся в очереди
6Среднее время ожидания в очереди

17.6.6 Коды состояния

Все задачи и функции управления очередью возвращают код состояния выхода. Значения кода состояния и соответствующая информация описаны в таблице 17-16.

Таблица 17-16 Значения кодов состояния
Значения кода состоянияОписание
0OK
1Очередь переполнена, невозможно добавить
2Неопределенный q_id
3Очередь пуста, невозможно удалить
4Неподдерживаемый тип очереди, невозможно создать очередь
5Указанная длина <= 0, невозможно создать очередь
6Дубликат q_id, невозможно создать очередь
7Недостаточно памяти, невозможно создать очередь