- 17.3 Системные задачи временной шкалы Verilog
- 17.3.1 $printtimescale
- 17.3.2 $timeformat
- 17.4 Cистемные задачи управления моделированием
- 17.4.1 $finish
- 17.4.2 $stop
- 17.5 Системная задачи моделирования программируемых логических схем (PLA)
- 17.5.1 Типы массивов
- 17.5.2 Логические типы массивов
- 17.5.3 Объявление и загрузка логических массивов
- 17.5.4 Форматы логических массивов
- 17.6 Задачи стохастического анализа
- 17.6.1 $q_initialize
- 17.6.2 $q_add
- 17.6.3 $q_remove
- 17.6.4 $q_full
- 17.6.5 $q_exam
- 17.6.6 Коды состояния
17.3 Системные задачи временной шкалы Verilog
Следующие системные задачи отображают и устанавливают информацию о шкале времени:
- $printtimescale
- $timeformat
Обсуждение временных шкал и единиц времени Verilog см. в разделе 19.8.
17.3.1 $printtimescale
$printtimescale — это системная задача, которая выводит единицу времени и точность для конкретного модуля. Синтаксис системной задачи показан в Синтаксисе 17-9.
printtimescale_task ::=
$printtimescale [ ( hierarchical_identifier ) ] ;
Эта системная задача может быть указана с аргументом или без него.
- Если аргумент не указан, $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 ) ] ;
Аргумент номер единицы времени(units_number) должен быть целым числом в диапазоне от 0 до -15. Этот аргумент представляет единицу времени, как показано в Таблице 17-10.
Значение аргумента | Единица времени | Значение аргумента | Единица времени |
---|---|---|---|
0 | 1 s | -8 | 10 ns |
-1 | 100 ms | -9 | 1 ns |
-2 | 10 ms | -10 | 100 ps |
-3 | 1 ms | -11 | 10 ps |
-4 | 100 us | -12 | 1 ps |
-5 | 10 us | -13 | 100 fs |
-6 | 1 us | -14 | 10 fs |
-7 | 100 ns | -15 | 1 fs |
ПРИМЕЧАНИЕ: Хотя s, ms, ns, ps и fs являются обычными символами единиц СИ для секунды, миллисекунды, наносекунды, пикосекунды и фемтосекунды, из-за отсутствия греческой буквы m (mu) в наборах кодирующих символов, «us» представляет символ единицы СИ для микросекунды, правильно ms.
Системная задача $timeformat выполняет следующие две операции:
- Он устанавливает единицу времени для всех последующих задержек, введенных интерактивно.
- Он устанавливает единицу времени, точность, суффиксную строку и минимальную ширину поля для всех форматов %t, указанных во всех последующих модулях в описании источника, пока не будет вызвана другая системная задача $timeformat.
Аргументы системной задачи $timeformat по умолчанию приведены в таблице 17-11.
Например:
Аргумент | Значение по умолчанию |
---|---|
units_number | Наименьший аргумент точности времени из всех директив компилятора `*timescale в описании исходного текста |
precision_number | 0 |
suffix_string | суффиксная строка |
minimum_field_width | 20 |
`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истемные задачи управления моделированием
Существуют две задачи моделирования системы управления:
- $finish
- $stop
17.4.1 $finish
$finish — это системная задача, которая заставляет симулятор завершить работу и передать управление обратно операционной системе хоста. Если для этой задачи задано выражение, то его значение (0, 1 или 2) определяет диагностические сообщения, которые выводятся перед выдачей подсказки (см. таблицу 17-12). Если аргумент не указан, то по умолчанию принимается значение 1.
Синтаксис 17-11 показывает синтаксис для системной задачи $finish.
finish_task ::=
$finish [ ( n ) ] ;
Значение аргумента | Диагностическое сообщение |
---|---|
0 | Ничего не выводит |
1 | Выводит времени и места моделирования |
2 | Выводит время моделирования, местоположения и статистики о памяти и времени центрального процессора (ЦП), используемых при моделировании |
17.4.2 $stop
$stop — это системная задача, которая приводит к приостановке моделирования. Имеет принимает необязательный аргумент выражения (0, 1 или 2), который определяет тип выводимого диагностического сообщения. Количество выводимых диагностических сообщений увеличивается с ростом значения необязательного аргумента, передаваемого в $stop.
Синтаксис для системной задачи $stop показан в Синтаксисе 17-12.
stop_task ::=
$stop [ ( n ) ] ;
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
Входные термины могут быть соединениями или переменными, в то время как выходные термины должны быть только переменными. Синтаксис PLA позволяет решать системные задачи, как показано в таблице 17-13.
Тип 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. Это относится ко всем типам и форматам массивов.
Например:
$async$nor$plane(mem,{a1,a2,a3,a4,a5,a6,a7},{b1,b2,b3});
$sync$nand$plane(mem,{a1,a2,a3,a4,a5,a6,a7}, {b1,b2,b3});
17.5.3 Объявление и загрузка логических массивов
Логический массив объявляется как массив регистров, ширина которого равна количеству входных портов, а глубина — количеству выходных портов.
Индивидуальные данные логической матрицы обычно загружаются в память из текстового файла данных с помощью системных задач $readmemb или $readmemh. В качестве альтернативы, данные могут быть записаны непосредственно в память с помощью процедурных операторов присваивания. PLA могут быть изменены динамически в любое время во время моделирования простым изменением содержимого памяти. Новая индетификация будет отражена на выходах логической матрицы при следующей оценке.
Например:
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.
Например:
b1 = a1 & a2
b2 = a3 & a4 & a5
b3 = a5 & a6 & a7
PLA выглядит следующим образом:
1100000 in mem[1]
0011100 in mem[2]
0000111 in mem[3]
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
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???
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.
значение 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.
Значение, запрашиваемое в q_stat_code | Информация, полученная от q_stat_value |
---|---|
1 | Текущая длина очереди |
2 | Среднее время между интервалами |
3 | Максимальная длина очереди |
4 | Самое короткое время ожидания |
5 | Наибольшее время ожидания для заданий, все еще находящихся в очереди |
6 | Среднее время ожидания в очереди |
17.6.6 Коды состояния
Все задачи и функции управления очередью возвращают код состояния выхода. Значения кода состояния и соответствующая информация описаны в таблице 17-16.
Значения кода состояния | Описание |
---|---|
0 | OK |
1 | Очередь переполнена, невозможно добавить |
2 | Неопределенный q_id |
3 | Очередь пуста, невозможно удалить |
4 | Неподдерживаемый тип очереди, невозможно создать очередь |
5 | Указанная длина <= 0, невозможно создать очередь |
6 | Дубликат q_id, невозможно создать очередь |
7 | Недостаточно памяти, невозможно создать очередь |