Сдам Сам

ПОЛЕЗНОЕ


КАТЕГОРИИ







Б.4. Описания (definitions) модулей





Цифровые устройства целиком, а также их отдельные блоки представляются в языке Verilog в виде модулей. Описание модуля должно содержать:

- ключевое слово module и следующее за ним имя модуля;

- объявление параметров (не обязательно);

- объявления входных, выходных и, при наличии, двунаправленных портов (заключаются в пару общих круглых скобок);

- тело модуля (операторы языка, описывающие логику функционирования модуля);

- ключевое слово endmodule.

Тело модуля, в свою очередь, может содержать следующие составные части:

- объявления внутренних переменных модуля – соединительных линий (тип wire и др.) и переменных с памятью (типы reg, integer, time, real) (см. раздел Б.5);

- объявления параметров (для параметризированных модулей) (раздел Б.5);

- объявления (установку) экземпляров модулей нижнего уровня, применяемых в данном модуле в качестве компонент (раздел Б.6);

- объявления (установку) экземпляров примитивов (подраздел Б.6);

- операторы непрерывного присваивания (раздел Б.7);

- описание функций (functions) разработчика (подраздел Б.10).

Составные части модуля могут располагаться в любом порядке, но объявления портов, переменных и параметров должны предшествовать их употреблению.

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

- поведенческим описанием или RTL-описанием (Register Transfer Level – уровень регистровых передач), формируемым с помощью операторов непрерывного присваивания и/или процедурных операторов;

- структурным описанием в виде набора установленных и подключенных экземпляров модулей нижнего уровня и экземпляров примитивов;

- комбинацией поведенческого и структурного описаний.

 

Б.4.1. Объявления портов

Порты (внешние выводы модуля) могут быть объявлены одним из двух способов.

1. Комбинированный способ (введен в стандарте Verilog 2001):

 

input [reg] [signed] [7:0] name_01, name02, …;

 

где:

- input – направленность порта (input – входной, output – выходной, inout – двунаправленный);

- reg – необязательный элемент, обозначающий принадлежность порта к определенному типу данных (тип real – не допустим);

- signed – необязательный элемент, обозначающий возможность появления на этом порту отрицательных данных и необходимость их правильной обработки (в дополнительном коде);

- [N:0] – элемент, обозначающий для много-разрядных портов их разрядность и порядок следования номеров разрядов;

- name_01, name02 – имена объявляемых портов одинаковой направленности, одного и того же типа и разрядности.

2. Старый способ:

 

input [signed] [7:0] name_01, name02, …;

reg [7:0] name02;

 

Таким образом, в старом способе тип порта, если он отличен от типа wire, являющегося типом по умолчанию, должен был обозначаться в отдельном объявлении.

Разрядность порта обозначается в порядке: старший значащий бит – младший значащий бит. Если разрядность не указана, то порт считается одноразрядным. Номера битов, входящие в обозначение разрядности могут быть литеральными константами, именованными константами или выражениями, состоящими из констант. Нумерация разрядов может быть прямой (старший значащий бит соответствует большему номеру) – little-endian convention) или обратной – big-endian convention. Максимальная разрядность портов в отдельных реализациях компиляторов может быть ограничена, но не должна быть ниже 256 бит.

Для подключения к портам данных требуемого типа необходимо применять следующие правила (табл. Б.5).

 

Таблица Б.5. Правила подключения переменных к портам

Уровень употребления модуля Входные порты (input) Выходные порты (output) Двунаправленные порты (inout)
Объявление экземпляра модуля нижнего уровня (внешние, по отношению к экземпляру модуля переменные, подключаемые к его портам) Выражения из переменных, переменные типа цепь (wire), переменные с памятью (reg, integer), исключая переменные типа real Только переменные типа цепь (wire) Только переменные типа цепь (wire)
Описание модуля верхнего уровня (внутренние переменные модуля, подключаемые к его собственным портам) Только переменные типа цепь (wire) Переменные типа цепь (wire), переменные с памятью (reg, integer), исключая переменные типа real Только переменные типа цепь (wire)

 

Переменные типа real не могут быть напрямую подключены к портам. При подключении к входным портам данные типа real должны быть преобразованы к формату 64-разрядного вектора с помощью системной задачи $realtobits. При передаче данных с выходного порта в переменную типа real они должны быть переведены из формата 64-разрядного вектора в тип real с помощью системной задачи $bitstoreal.

Разрядность порта, дополнительно объявленного как переменная, должна совпадать с разрядностью переменной. (Некоторые программные пакеты при несовпадении этих данных используют разрядность переменной, не генерируя сообщения об ошибке).

Направленность порта должна быть объявлена до того как будет объявлен его тип. Ниже приведены примеры объявления портов (табл. Б.6).

 

Таблица Б.6. Примеры объявления портов

Объявления портов Примечание
input a,b,sel; три скалярных (1-битных) входных порта
input signed [15:0] a,b; два 16-битных входных порта для данных со знаком с прямой нумерацией разрядов
output signed [31:0] result 32-битный выходной порт для данных со знаком с прямой нумерацией разрядов
output reg signed [32:1] sum; 32-битный выходной порт типа reg для данных со знаком с прямой нумерацией разрядов, начинающейся с 1
inout [0:15] data_bus; обратная нумерация разрядов
input [15:12] addr; номера старшего и младшего разрядов могут быть любыми целыми числами
parameter WORD = 32; input [WORD-1: 0] addr; номера разрядов могут быть представлены константами и выражениями, составленными из констант
parameter SIZE = 4096; input [log2(SIZE)-1: 0] addr; в выражениях для номеров разрядов могут использоваться функции от констант

 

 

Б.5. Объявления переменных

В языке Verilog существуют два класса данных.

1. Данные типа цепь (net data types), предназначенные для электрического соединения выводов компонент проекта:

- данные типа цепь отображают логические значения и уровни воздействия (strength level) источников сигналов, подключенных к цепи, и не имеют собственных значений;

- данные типа цепь снабжены механизмами разрешения, которые определяют конечные значения на них, когда к ним подключены несколько источников.

2. Данные типа "переменные с памятью" (variables data types), используемые для временного хранения данных.

- этим переменным могут быть присвоены значения только внутрипроцедурных операторов initial и always, внутри задач и функций;

- они могут только хранить логические значения, не отражая уровня воздействия источника;

- они не инициализируются автоматически в начале моделирования и содержат логическое значение X до тех пор, пока им не будет присвоено иное.

Основные правила для корректного выбора класса переменных приведены в табл. Б.7.

 

Таблица Б.7. Основные правила корректного выбора класса переменных

Если сигнал поступает с выхода модуля, выхода примитива или является результатом непрерывного присваивания, Используйте данные типа цепь
Если сигнал приобретает значение в процедурных операторах initial или always Используйте данные типа "переменные с памятью"

 

 

Б.5.1. Данные типа цепь

Данные типа цепь предназначены для соединения отдельных структурных компонент проекта.

Они должны использоваться в следующих случаях:

- сигнал принимается с выхода экземпляра модуля или примитива;

- при подключении к входному или двунаправленному порту модуля, в котором переменная объявляется;

- переменная расположена в левой части оператора непрерывного присваивания.

Объявление переменой типа цепь может содержать следующие элементы.

net_type [signed] [N:0] [#(delay)] net_name1 [array], net_name02,...;

где:

‑ net_type – ключевое слово, обозначающее тип переменной (см. табл. Б.8); наиболее широко употребляемыми являются переменные wire;

- signed – необязательный элемент, обозначает, что данные интерпретируются как данные со знаком (в дополнительном коде);

- [N: 0] – необязательный элемент, обозначающий для много-разрядных линий (шин) их разрядность и порядок следования номеров разрядов;

- #(delay) - необязательный элемент, обозначающий величину задержки в единицах времени, формируемую цепью;

- net_name1, net_name02 - имена объявляемых переменных одного и того же типа и разрядности;

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

 

Таблица Б.8. Переменные типа цепь

wire простая соединительная линия; КМОП механизм определения значений
wor соединительная линия монтажного ИЛИ; ЭСЛ механизм определения значений
wand соединительная линия монтажного И; механизм определения значений типа открытый коллектор
supply0 константа логического нуля (высший уровень воздействия - supply strength)
supply1 константа логической единицы (высший уровень воздействия - supply strength)
tri0 подтягивание к нулю, если третье состояние
tri1 подтягивание к единице, если третье состояние
tri аналогична wire
trior аналогична wor
triand аналогична wand
trireg удерживает последнее значение, если третье состояние (capacitance strength)

 

 

В табл. Б.9. приведены примеры объявления переменных типа цепь.

 

Таблица Б.9. Примеры объявления переменных типа цепь

Объявления переменных Примечание
wire a, b, c; три скалярные (1-разрядные) простые цепи
tri1 [7:0] data_bus; 8-разрядная шина, подтягивающая значение к 1, если в третьем состоянии
wire signed [1:8] result; 8-разрядная шина для данных со знаком
wire [7:0] Q [0:15][0:256]; 2-мерный массив 8-разрядных шин
wire # (2.4,1.8) carry; цепь с задержкой 2,4 единиц времени по переднему фронту и 1,8 единиц по заднему фронту
wire [0:15] sum = a + b; 16-разрядная шина с оператором непрерывного присваивания

 

Б.5.2. Данные типа "переменные с памятью"

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

- эти переменные могут хранить только логические значения, они не могу хранить уровни воздействия;

- эти переменные должны применяться для сигналов, которые находятся в левой части операторов процедурного присваивания;

- эти переменные назывались "registers" в старых версиях стандарта языка.

Ниже приведены существующие типы переменных с памятью (табл. Б.10) и примеры объявления таких переменных (табл. Б.11).

 

Таблица Б.10. Типы переменных с памятью

reg переменная любой явно объявленной разрядности (по умолчанию 1-разрядная); без знака, если явно не указана как signed
integer 32-разрядная переменная со знаком
time 64-разрядная переменная без знака
real действительная переменная двойной точности (double-precision)
realtime аналог real

 

Таблица Б.11. Примеры объявления переменных с памятью

Объявления переменных Примечание
reg a,b,c; три скалярные (1-разрядные) переменные
reg signed [7:0] d1,d2; две 8-разрядные переменные со знаком
reg [7:0] Q [0:3] [0:15]; 2-мерный массив 8-разрядных шин
integer i, j; две целые переменные со знаком
real r1, r2; две действительные переменные двойной точности
reg clock = 0, reset = 1; две одноразрядные переменные с инициализирующими значениями

 

 

Б.5.3. Другие типы данных

Среди других типов данных особое значение имеет так называемая константа реального времени parameter. Эта константа может хранить данные типа integer, real, time, realtime или строку символов и может быть переопределена в любом экземпляре модуля, в котором она объявлена. Это позволяет настраивать отдельные параметры устройства, например разрядность данных, в каждом экземпляре индивидуально под требуемые задачи. Объявления констант типа parameter аналогично объявлениям других переменных. Примеры приведены в табл. Б.12.

 

 

Таблица Б.12. Примеры объявления констант parameter

Объявления переменных Примечание
parameter [2:0] s1=3'b001, s2=3'b010, s3=3'b100; три 3-разрядные константы
parameter integer period=10; константа типа integer

 

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

 







Что вызывает тренды на фондовых и товарных рынках Объяснение теории грузового поезда Первые 17 лет моих рыночных исследований сводились к попыткам вычис­лить, когда этот...

ЧТО И КАК ПИСАЛИ О МОДЕ В ЖУРНАЛАХ НАЧАЛА XX ВЕКА Первый номер журнала «Аполлон» за 1909 г. начинался, по сути, с программного заявления редакции журнала...

Что способствует осуществлению желаний? Стопроцентная, непоколебимая уверенность в своем...

ЧТО ТАКОЕ УВЕРЕННОЕ ПОВЕДЕНИЕ В МЕЖЛИЧНОСТНЫХ ОТНОШЕНИЯХ? Исторически существует три основных модели различий, существующих между...





Не нашли то, что искали? Воспользуйтесь поиском гугл на сайте:


©2015- 2024 zdamsam.ru Размещенные материалы защищены законодательством РФ.