литература / kondratenko_yu_p_mokhor_v_v_sidorenko_s_a_verilog_hdl_dlya_m
.pdf- 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
По умолчанию типы сигналов для всех портов в программе интер-
48 Verilog-HDL для моделирования и синтеза цифровых электронных схем
претируются как цепи wire. При необходимости тип сигнала можно изменить, с учетом того, что для входных и двунаправленных портов могут использоваться только сигналы-цепи (wire и им подобные), а в качестве выходных портов можно использовать также и регистры (reg, integer и т.п.).
Директива компилятора `default_nettype позволяет изменять тип порта, выбираемый по умолчанию, например, после выполнения команды:
`default_nettype trior;
все порты в дальнейшем будут интерпретироваться по умолчанию как цепи типа trior.
48 |
Verilog-HDL для моделирования и синтеза цифровых электронных схем |
3.2. Оператор включения модуля
Оператор описания модуля, рассмотренный в предыдущем разделе, позволяет описывать интерфейсную модель устройства и, соответственно, определять способ его подключения как структурного компонента в устройства более высокого иерархического уровня. Построение структурных иерархических моделей, в свою очередь, осуществляется на основе оператора включения модуля, рассмотренного ниже.
3.2.1. Синтаксис оператора включения модуля
Оператор включения модуля предназначен для формирования сложных иерархических структур компонентов устройства в проекте.
Синтаксис оператора включения модуля:
Имя_Включаемого_Модуля Имя_Включения( Интерфейс );
Здесь Имя_Включения – обязательный параметр, представляющий собой уникальный идентификатор для данного включения; Интерфейс
– список сигналов модуля верхнего уровня, присоединяемых к входам и выходам включаемого подчиненного модуля. При этом подключение
Учебное§ 3. Синтезпособиеструктурных моделей цифровых устройств |
49 |
осуществляется в порядке следования сигналов, например:
//Включаемый модуль: |
|
module Delay ( X1, X2 ); |
|
input X1; |
// X1 – входной порт модуля |
output X2; |
// X2 – выходной порт модуля |
wire X1, X2; |
|
// . . . Текст модуля |
|
endmodule |
|
//Модуль верхнего уровня: |
|
module Main ( a, b ); |
|
input a; |
// a – входной порт модуля |
output b; |
// b – выходной порт модуля |
wire a, b;
// Включение модуля нижнего уровня Delay под именем INST00: Delay INST00 ( a, b ); //*
// . . . Текст модуля endmodule
В приведенном выше фрагменте кода описывается два модуля – Delay и Main, причем первый из них является структурным компонентом второго. В строке программы, отмеченной знаком //*, осуществляется включение модуля Delay в модуль Main, при этом сигнал a модуля Main подключается к входному порту X1 модуля Delay, а сигнал b – к выходному порту X2, соответственно.
Существует также другая форма записи интерфейса в операторе включения, которая предполагает явное указание соответствия между подключаемыми сигналами и портами включаемого модуля. В этом случае синтаксис оператора включения модуля следует записать таким образом:
МодульВключение ( .порт1(сигнал1), .порт2(сигнал2) );
где порт1, порт2 – идентификаторы портов включаемого модуля; сигнал1, сигнал2 – идентификаторы подключаемых сигналов модуля верхнего уровня.
50 |
Verilog-HDL для моделирования и синтеза цифровых электронных схем |
Предыдущая программа, записанная с использованием явного указания соответствия сигналов в операторе включения модуля, приведена ниже:
//Включаемый модуль: |
|
module Delay ( X1, X2 ); |
|
input X1; |
// X1 – входной порт модуля |
output X2; |
// X2 – выходной порт модуля |
wire X1, X2; |
|
// . . . Текст модуля |
|
endmodule |
|
//Модуль верхнего уровня: |
|
module Main ( a, b ); |
|
input a; |
// a – входной порт модуля |
output b; |
// b – выходной порт модуля |
wire a, b;
// Включение модуля нижнего уровня Delay под именем INST00: Delay INST00 ( .X1(a), .X2(b) );
endmodule
При использовании операторов включения модуля необходимо следить за возможным образованием циклических включений. Пример такого включения приведен ниже:
// Циклическое включение модулей module XMod (a,b) ;
input a; output b; wire a,b;
YMod mod01 (a,b); //Включение модуля YMod endmodule
module YMod (c,d); input c;
output d; wire c,d;
XMod mod02(c,d); //Включение модуля XMod endmodule
4 Засоби VHDL для моделювання реальних об’єктів |
51 |
|
§Учебное3. Синтезструктурныхпособие |
моделей цифровых устройств |
|
Как видно из вышеприведенного примера, модуль XMod является частью модуля YMod, а, в свою очередь, модуль YMod является частью модуля XMod. Представить такую схему в виде конечной структуры для реализации определенной задачи невозможно, однако средства компиляции популярных программных пакетов, реализующих Verilog, не распознают подобную ошибку. Обычно эта ошибка выявляется только перед началом моделирования, когда производится компоновка отдельных структурных частей устройства.
3.2.2.Согласование типов портов и их направлений при включении модулей
Для корректности согласования типов и направлений портов включаемого модуля с внутренними сигналами модуля верхнего уровня следует руководствоваться следующими общими правилами:
•для выходных портов подчиненного модуля: внутренний сигнал включаемого модуля может иметь тип «цепь» или «регистр», а внешний сигнал обязательно должен иметь тип «цепь»;
•для входных портов подчиненного модуля: внутренний сигнал включаемого модуля обязательно должен иметь тип «цепь», а внешний сигнал может иметь тип «цепь» или «регистр»;
•для двунаправленных портов подчиненного модуля и внешний, и внутренний сигналы должны соответствовать типу «цепь».
Рис. 3.2 иллюстрирует применение данных правил.
Внешний модуль
Входной Включаемый (подчиненный) модуль
порт
цепь/регистр цепь |
цепь/регистр цепь |
|
цепь |
Выходной |
|
|
порт |
|
цепь |
|
|
|
|
Двунаправленный |
|
|
порт |
|
|
Рис. 3.2. Правила согласования типов и направлений внутренних и внешних сигналов при включении модулей
52 |
Verilog-HDL для моделирования и синтеза цифровых электронных схем |
3.2.3. Создание настраиваемых модулей
Часто при написании программ возникает необходимость в использовании в различных частях проекта аналогичных по функциям модулей, отличающихся, однако, временем задержки, разрядностью входных и выходных сигналов или другими подобными характеристиками. Создание отдельных модулей для каждого такого случая приведет к неоправданному многократному повторению фрагментов кода. Так, например, модуль «8-битный регистр» будет отличаться от модуля «16-битныйрегистр» толькооператорами, описывающими типыпортов.
Избежать неэффективных решений такого рода позволяет применение определяемых внутри модуля констант – параметров (parameter), дающих возможность изменения различных аспектов функционирования при использовании модулей в различных включениях как структурного элемента проекта.
В качестве примера рассмотрим разработку универсального параллельного регистра с входами синхронизации и разрешения на запись [25]. Разрядность регистра и время его срабатывания являются настраиваемыми параметрами:
`timescale 10 ns / 1ps //Параметры модельного времени:
//- шаг моделирования – 1 ps
//- шаг дискретности модельного
//времени – 10 ns
module Reg (X_In, CLK, WE, X_Out);
input X_In; input CLK; input WE; output X_Out;
//Настраиваемый параметр – разрядность регистра parameter n = 5;
//Настраиваемый параметр – время срабатывания регистра
parameter Setting_Time = 9; // = 9 ´ 10 ns = 90 ns
wire [n:0] X_In; // Разрядностьзаданаспомощьюпараметраn
