DocsTech
/
VERILOG HDL
/

~ cd 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

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

Информация о шкале времени должна быть представлена в следующем формате: «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 выполняет следующие две функции:

Синтаксис для системной задачи $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 выполняет следующие две операции:

Аргументы системной задачи $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Недостаточно памяти, невозможно создать очередь
Главная
Курсы
Вебинары
3. Лексические правила(Синтаксис) Verilog HDL
4. Типы данных Verilog HDL
5. Выражения и Операторы Verilog HDL
6. Назначения (Assignments) в Verilog HDL
7. Моделирование на уровне вентилей и переключателей в Verilog HDL
8. Примитивы, объявляемые пользователем (UDP) Verilog HDL
9. Процедурные назначения. Поведенческое моделирование в Verilog HDL.
9. If, case for, while и repeat Verilog HDL
9. Initial, always, задержки, блоки Verilog HDL
10. Задачи(task) и функции (function) в Verilog HDL
11. Семантика планирования. Стек (stack) в Verilog HDL
12. Модули(module). Переопределение параметров(defparam).
12. Порты. Иерархические имена в Verilog HDL
12. Generate блоки Verilog HDL
12. Иерархические имена Verilog HDL
13. Конфигурирование содержимого конструкции
13. Использование библиотек. Конфигурирование содержимого конструкции в Verilog HDL
14. Specify блоки в Verilog HDL
15. Setup, hold, setuphold и recovery в Verilog HDL
15. Skew, period, width и nochange Verilog HDL
15. Проверка синхронизации сигналов в Verilog HDL
16. Бэканнотирование с использованием стандартного формата задержки (SDF) в Verilog HDL
17. Системные задачи и функции
17.2 Файлы. Запись и чтение файлов Verilog
17. Задачи временной шкалы, управления, PLA и стохастического анализа Verilog
$time, $stime и $realtime Verilog
17.8. Функции преобразования Verilog
17.9. Функции распределения вероятностей Verilog
17.10. Ввод командной строки. 17.11. Математические функции
18. Дамп файлы изменения значений (VCD)
18. Формат файла VCD расширенные и четырьмя состояниями
19. Директивы компилятора Verilog HDL
20. Обзор интерфейса языка программирования (PLI) Verilog
28. Зашифрованные оболочки
Закрыть