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

Сраный верилог

.pdf
Скачиваний:
53
Добавлен:
01.04.2022
Размер:
4.18 Mб
Скачать

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 не приведет к появлению ошибок.

- 3 -

Синтез структурных моделей цифровых устройств

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

Данная глава посвящена подробному рассмотрению процессов формирования структурных моделей цифровых электронных устройств на основе языка описания оборудования Verilog.

3.1.Структурная декомпозиция проектов в Verilog

Основной структурной единицей устройства, программно описанного языком Verilog, является модуль (module).

Все модули в Verilog-программе являются независимыми объектами уровня проекта. Это значит, что модуль не может включать описание других модулей, но может содержать ссылки на другие модули как на свои структурные компоненты.

При разработке Verilog-программ в среде Active-HDL [23] существует возможность помещать модули в отдельные файлы проекта и объединять несколько модулей в одном файле. Для упрощения процесса проектирования авторами рекомендуется использование первого подхода, представляющегося более удобным с точки зрения простоты использования.

Синтаксис описания модуля приведен ниже:

Учебное§ 3. Синтезпособиеструктурных моделей цифровых устройств

45

//Заголовок модуля

module Имя_Модуля ( Интерфейс_модуля );

//Описание интерфейса

. . .

//Внутренняя реализация модуля:

//– объявления сигналов, шин и других объектов данных;

. . .

//– включения других (подчиненных) модулей;

. . .

//– функциональное описание устройства, заданное поведенческими

//(алгоритмическими) конструкциями или операторами, описывающими //движение потоков данных;

. . .

// – подпрограммы (сценарии и функции)

. . .

endmodule //Конец модуля

где:

module – зарезервированное слово, открывающее описание модуля;

endmodule – ключевое слово, завершающее описание текущего модуля;

Имя_модуля – идентификатор, позволяющий обращаться к описываемому элементу из других частей программы. Идентификатор должен быть сформирован в соответствии с рассмотренными в разделе 2.5 правилами;

Интерфейс_модуля простой перечень сигналов ввода/вывода без указания их направления и типа передаваемой информации. Эти сигналы должны быть определены во внутренней реализации модуля. На первом этапе (при создании структуры устройства) достаточно указать только направление сигналов при помощи ключевых слов input, output или inout, которые, соответственно, определяют входные, выходные и двунаправленные порты. Тип информации, передаваемой сигналами, может быть описан на более поздних этапах процесса проектирования;

46

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

Внутренняя_реализация – это структура модуля либо операторы языка Verilog, описывающие его поведение. Внутренняя реализация модуля может содержать: объявления сигналов, шин и других объектов данных; включения подчиненных модулей; функциональное описание устройства в виде поведенческих конструкций или операторов, описывающих движение потоков данных; подпрограммы – сценарии или функции. Следует отметить, что модуль может быть откомпилирован без Внутрен-

ней_реализации.

В качестве примера описания модуля и его интерфейса рассмотрим проект полного однобитного сумматора, интерфейсная модель которого показана на рис. 3.1.

Carry_In S

X1 Carry_Out

X2

Full_Adder

Рис. 3.1. Интерфейсная модель полного сумматора Full_Adder

// Заголовок модуля:

module Full_Adder ( Carry_In, Carry_Out, S, X1, X2 );

// Модуль Full_Adder с интерфейсом из 5 сигналов

input Carry_In ; // Сигнал Carry_In является входным wire Carry_In ; // Carry_In – это однобитная линия связи,

//управляемая драйвером (при отключении

//источника не сохраняет значение)

input X1 ; wire X1 ; input X2 ; wire X2 ;

Учебное§ 3. Синтезпособиеструктурных моделей цифровых устройств

47

output Carry_Out ;// Сигнал Carry_Out является выходным wire Carry_Out ;

output S ; wire S ;

. . .

// Внутренняя реализация модуля

. . .

endmodule //Конец модуля

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

Все порты, входящие в список интерфейса, должны быть описаны внутри модуля с пользованием одного из операторов input, output или inout. При этом порты в дальнейшем будут интерпретироваться, соответственно, как входные, выходные или двунаправленные, например:

module Port_Demo ( A, Data01, Data02, Level );

// Порт А интерпретируется как входной: input A;

//Порты Data01, Data02 интерпретируются как выходные output Data01, Data02;

//Порт Level интерпретируется как двунаправленный:

inout Level;

// Внутренняя реализация модуля

. . .

endmodule

По умолчанию типы сигналов для всех портов в программе интер-