Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

литература / kondratenko_yu_p_mokhor_v_v_sidorenko_s_a_verilog_hdl_dlya_m

.pdf
Скачиваний:
0
Добавлен:
13.05.2026
Размер:
8.49 Mб
Скачать

36

Verilog-HDL для моделирования и синтеза цифровых электронных схем

2.7. Системные функции

Для эффективной работы разработчиков при отладке и тестировании созданных проектов зачастую необходимо включать в программный код операторы, обеспечивающие обмен информацией с пользователем, управление процессом моделирования (например, его остановкой) и т.п. Средства, позволяющие решать указанные задачи, называются в языке Verilog системными функциями (system tasks). Идентификаторывсех системных функцийначинаютсясознака«$», например:

$display $write $monitoron

В данной главе ограничимся рассмотрением только нескольких основных системных функций, наиболее часто встречающихся в

Verilog-проектах.

Учебное§ 2. Элементыпособиеязыка Verilog

37

Функция $display позволяет выводить в процессе моделирования информацию в стандартное устройство вывода. В среде Active-HDL вывод осуществляется в окно консоли.

Синтаксис функции $display приведен ниже:

$display(Список_Вывода);

Список_Вывода может включать строки, сигналы или выражения. Использование функции $display очень похоже на использование оператора printf в языке Си. Строки, стоящие в списке вывода, могут содержать управляющие символы, начинающиеся со знака процента «%». Управляющие символы непосредственно на экран не выводятся, хотя при этом изменяют определенным образом формат выводимой строки. Полный список управляющих символов системной функции $display и их функциональное назначение приведены в табл. 2.1.

Таблица 2.1

 

Управляющие символы системной функции $display

Управляющий

Функциональное описание

 

символ

 

1%d или %D Отобразить значение в десятичной форме

2%b или %B Отобразить значение в двоичной форме

3 %s или %S

Отобразить строку

4%h или %H Отобразить значение в шестнадцатеричной форме

5%c или %C Отобразить ASCII-символ

6%m или %M Отобразить иерархическое имя (не требует аргументов)

7%v или %V Отобразить уровень приоритета сигнала

8%o или %O Отобразить значение в восьмеричном формате

9%t или %T Отобразить значение во временном формате

10%e или %E Отобразить действительное число в формате с плавающей запятой (например, 1.063е-5)

11%f или %F Отобразить действительное число в формате с фиксированной запятой (например, 103.452)

12%g или %G Отобразить действительное число в том из форматов, который даст более короткую запись

Аргументы для управляющих символов берутся в списке вывода, следующем за строкой по порядку появления. Например, чтобы вывес-

38

Verilog-HDL для моделирования и синтеза цифровых электронных схем

ти значение сигнала А в двоичной форме в сочетании с поясняющим текстом «А = », следуетзаписатьфункцию$display такимобразом:

$display ("A = %b", A);//Вывод на печать значения сигнала А //в двоичном формате

В рассматриваемом примере в первой строке Списка_Вывода при помощи знака %b задана позиция для вывода значения сигнала А и его формат (двоичный), а идентификатор сигнала А помещен в список вывода следующим элементом. В этом случае следует говорить, что в строке присутствует один управляющий знак %b, а сигнал А является его параметром (аргументом).

Количество управляющих знаков в строке может быть произвольным. При этом параметры в списке вывода должны следовать в том же порядке, что и управляющие сигналы в строке. Например, если в текущий момент времени сигнал А = 8'hF0 и сигнал B = 8'h7A, то приведенная ниже системная функция

$display ("Сигнал А = %h; Сигнал B = %h.", A, B);

выведет на экран следующую строку:

Сигнал А = F0; Сигнал B = 7A.

Если возникает необходимость в выводе на экран знака «%», то необходимо задавать его в строках парой символов « %% ». В противном случае знак процента и следующий за ним символ будут восприняты компилятором как управляющий символ, что, скорее всего, приведет к ошибке компиляции. Например, команда

$display("Выполнено 50%."); //Неправильно

вызовет ошибку, так как компилятор воспримет пару знаков «%.» как недопустимый управляющий символ. К необходимому результату «Выполнено 50%.» приведет команда

Учебное§ 2. Элементыпособиеязыка Verilog

39

$display ("Выполнено 50%%."); //Правильно

Все допустимые в строках специальные символы ASCII-кода (такие как /n – перенос строки, /t – табуляция и т.п.) могут также использоваться в функциях $display с корректным выводом на экран.

Для определения и вывода на экран текущего значения модельного времени удобно применять системную функцию $time. Пример ее использования приведен ниже:

$display ("Время %d, А = %b; B = %b.", $time, A, B);

В результате выполнения данной команды может появиться, например, такая строка:

Время 2152, А = 11001001; B = 00xx1001.

Кроме функции $display, зачастую используются также специальные функции для отслеживания состояния сигнала во время модели-

рования – $monitor, $monitoron и $monitoroff.

Команда

$monitor (Список_Вывода);

включает режим отслеживания сигналов. При этом Список_Вывода формируется так же, как и для функции $display. Отличие функции $monitor состоит в том, что ее Список_Вывода выводится не один раз при выполнении команды, а всякий раз при изменении одного из сигналов, входящих в список.

Команды $monitoroff и $monitoron предназначены для временного приостановления и возобновления процесса отслеживания сигналов соответственно.

Рекомендуется установка в список вывода функции $time для повышения читаемости полученных таблиц значения сигналов.

40

Verilog-HDL для моделирования и синтеза цифровых электронных схем

Для управления имитационным моделированием используются системные функции $stop и $finish, первая из которых временно приостанавливает процесс моделирования, а вторая – прекращает моделирование полностью.

Следует отметить, что такие развитые приложения для разработки Verilog-проектов, как пакет Active-HDL, обладают гораздо более удобными средствами отладки по сравнению с теми, которые определены в стандарте языка Verilog. К их числу относятся, например, представляемые в графической и табличной форме временные диаграммы, стимуляторы, средства управления процессами моделирования и т.п. (полное описание перечисленных средств отладки и моделирования приведено в Приложении А).

В связи с этим в среде Active-HDL такие системные функции, как $monitor, $monitoron, $monitoroff, $stop и $finish, используются на-

много реже, нежели в случае применения более простых (свободно распространяемых) компиляторов языка Verilog.

40

Verilog-HDL для моделирования и синтеза цифровых электронных схем

2.8. Директивы компилятора

Последним из рассматриваемых в данной главе элементов языка являются директивы компилятора.

Все директивы компилятора начинаются со знака «обратный штрих» ( ` ). Директивы предназначены для управления такими параметрами компиляции и моделирования, как, например, разрядность целых чисел по умолчанию, длина шага моделирования и т.п.

Полный список директив компилятора приведен ниже:

`celldefine module_declaration

`endcelldefine

`default_nettype net_type_identifier `define macro_name macro_text

`define macro_name(list_of_arguments) macro_text `undef macro_name

`ifdef macro_name group_of_lines `else group_of_lines

`endif

Учебное§ 2. Элементыпособиеязыка Verilog

41

`include "filename"

`resetall

`timescale time_unit / time_precision

`unconnected_drive module_declaration

`nounconnected_drive

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

Для примера рассмотрим одну из наиболее широко используемых директив в Verilog-программах – директиву `include, предназначенную для включения в текущий файл исходных текстов на языке Verilog из других файлов.

Синтаксис директивы:

`include имя_включаемого_файла;

Предположим, например, что во внешнем файле modules.v размещены описания модулей CLK_Generator и Shift_Reg. Детальное описание процедуры использования модулей приведено в главе 3. В дальнейшем сформируем главный модуль, использующий вышеперечисленные подчиненные модули и подключающий их с помощью дирек-

тивы `include:

//Заголовок (начало) главного модуля: module Include_Demo ( CLK, X, Y );

//Раздел описаний главного модуля:

input [7:0] X ;// Х – входной порт устройства Include_Demo wire [7:0] X ;// сигнал типа "цепь"

output CLK ; // CLK – выходной порт устройства Include_Demo wire CLK ; // сигнал типа "цепь"

output [7:0] Y ;// Y – выходной порт устройства Include_Demo reg [7:0] Y ; // сигнал типа "регистр"

reg push;

// push – внутренний сигнал устройства

 

// Include_Demo типа "регистр"

. . .

 

42 Verilog-HDL для моделирования и синтеза цифровых электронных схем

//Основной текст Verilog-программы

. . .

//Включение подчиненных модулей, не описанных выше в текущем файле

CLK_Generator

Inst00 (CLK);

Shift_Reg

Inst01 (CLK, push, X, Y);

endmodule

//Конец главного модуля Include_Demo

//Директива включения файла modules.v

//(файл в текущем каталоге)

includè modules.v

Применение в программе директивы включения файла `include аналогично непосредственному копированию в эту программу исходного текста, размещенного во включаемом файле. Использование директивы `include (в противовес прямому копированию исходного текста) обладает тем преимуществом, что при изменении часто используемых фрагментов проекта нет необходимости исправлять все программы, куда эти фрагменты входят, так как такие программы ссылаются на один общий источник с помощью директивы `include.

Следует отметить, что пользователи программного пакета ActiveHDL [23] для включения модулей могут обходиться без применения директивы `include. Средства управления проектом и оптимизированный компилятор в указанном пакете позволяют использовать модули, входящие в текущий проект, непосредственно, без указания их физического местоположения на диске. Таким образом, если при работе в пакете Active-HDL оба модуля из перечисленного примера находятся в текущем проекте, то удаление строки с директивой `include не приведет к появлению ошибок.

42

Verilog-HDL для моделирования и синтеза цифровых электронных схем

2.9. Задачи и упражнения

1.Запишите следующие числовые константы в соответствии с правилами языка Verilog, используя при этом минимально возможное число разрядов:

§Учебное2. Элементыпособиеязыка Verilog

 

43

а)

в десятичной форме:

 

 

128

 

123,45 0,000466

21

б)

в шестнадцатеричной форме:

 

F3A0

E000

12

 

в)

в двоичной форме:

 

 

10010

00101011

1010111

 

2.Среди нижеперечисленных примеров определите идентификаторы, которые не соответствуют правилам их формирования в языке Verilog:

Sig_#N

Sig_N

\C:\\Cads

Decoder_1

Сигнал_1

\Сигнал @#

FFT

Ack

_Decoder_1

Not-Ack

\wire

\2FFT

 

data$

trior

3.Объявите при помощи языка Verilog сигналы следующих типов:

а)

однобитный сигнал без фиксации значения после отключения

 

драйвера;

б)

четырехбитный сигнал с фиксацией значения после отключе-

 

ния драйвера;

в)

10 однобитных сигналов с фиксацией значений;

г)

1024 восьмибитных сигнала без фиксации значений.

4.С использованием системной функции $display напишите команду для вывода на экран значений сигналов Data_In и Data_Out, а также текущего модельного времени в следующем формате:

Время: 75; Сигнал Data_In = 1x0; Сигнал Data_Out = 010;

5.Преобразуйте команду из предыдущего задания таким образом, чтобы указанная строка всегда выводилась на экран при изменении значения сигнала Data_In.