Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Языки VHDL и VERILOG в проектировании цифровой аппаратуры
.pdf
Приложение 2 291
10.2. Функции function
Синтаксис
function [тип или размер] имя_функции;
//VERILOG-2000 для рекурсивных функций используют ключ automatic èìÿ;
Обьявление входных параметров
Обьявление локальных параметров
Последовательный оператор или группа
endfunction
Функция возвращает значение, присвоенное ее имени.
Имеет как минимум один входной параметр (input) и не имеет output, inout.
Тело функции не содержит операторов ожидания (#, @, wait) и параллельных.
[тип или размер] — необязательный параметр, тип-integer или real.
По умолчанию размер возвращаемого значения — 1 бит.
Пример
function [7:0] GetByte; //Заголовок, размер результата 8 бит
input [63:0] Word;
input [3:0] ByteNum;
integer Bit;
reg [7:0] temp; begin
for (Bit=0; Bit<=7; Bit=Bit+1)
temp[Bit] = Word[((ByteNum-1)*8)+Bit];
GetByte = temp;
end
endfunction
this_byte = GetByte(data,4); //Вызов функции
Системные функции:
$time — возвращает текущее модельное время;
$random — возвращает случайное число.
11. Параллельные операторы и блоки
Название, синтаксис Пример
1. Блок always (процесс)
always @(a or b)begin À:
x= a[2:0]+b+1;y<=#(V) x;
end
2. Блок initial (Однократный Процесс)
initial begin
x= 1; b=0 ;
end
3. Oператор непрерывного присваивания соединению (цепь)
Явный: wire [2:0] w; assign w=a&b;
assign#(задержка)
имя=выражение;
Неявный:
подвид (сила) размер wire w1= ~m[1];//неявный
#(задержка) имя= wire (strong0)[7:0]w2= c+d-r;//неявный
выражение; //в шину c сильным нулем

292 Приложение 2
4. Оператор конкретизации модуля-компонента
k1 M1 (.x1(y1),.p(e2));
k1 M2 (y2,e5);//позиционное соответствие
у2 n2 #(4,6)(c1,c3,v4);//передаются
//параметры4и6
5. Оператор конкретизации примитива
and #(4,5) (y1,x1,x2);
xor #7 (y3,y1,x4,x5,x7);
6. Системный оператор мониторинга событий
$monitor(" текст с элементами форматирования ", список_сигналов);
Срабатывает печать при событии в любом сигнале из списка
7. Операторы ветвей группы fork (см. выше)
12. Модуль проекта
12.1. Стиль описания VERILOG-95
Структура модуля
Заголовок
module <имя> (<список_портов>); // список_портов может быть пустым
Описания портов
<описание направленности и размера портов>;
<описание выходных портов вида переменная>;
Описания внутренних обьектов // может отсутствовать
<описание внутренних соединений и переменных> ;
<описание процедур и функций>
Тело модуля
<описания параллельных процессов >
<блок specify> // может отсутствовать
endmodule
Пример заголовка модуля:
module M1(clk,rst_n,D,bus,Q);
input clk,rst_n; // 1 битовые входы вида соединение
input [7:0]D; // 8 разрядный вход вида соединение
inout [7:0] bus; // двунаправленный вида соединение
output signed [7:0] Q; reg[7:0] Q; // выход Q имеет вид переменная
12.2. Còèëü VERILOG-2000 (ANSI-C)
module èìÿ
#(oбъявление_параметров)
(обьявления_портов);
тело-модуля
endmodule

Приложение 2 293
B частности VERILOG-2000 позволяет совместить описания направления
портов, их вида и размера (стиль ANSI-C).
Пример заголовка модуля:
module M1(input clk,input rst_n,input [7:0] D,
inout [7:0 ] bus, output reg signed [7:0]Q );
Пример описания внутренних соединений, переменных и функции:
wire A,B,C; //1 битовые внутренние соединения-сигналы
reg [1:0] R1,R2; //внутренние двухразрядные переменные-reg
integer I; //целая переменная 32 разряда
reg [7:0] mem[0:4095]; //массив 4096 *8
function [8:0] F1; //обьявлена функция F1
input x1;input [7:0]x2;reg [8:0]r1;
begin r1=x2+x1;F1=r1;end
endfunction //F1
13. Конкретизация — вызов экземпляров модулей
13.1. VERILOG-95
Синтаксис
Вызов с позиционным соответствием сигнал-порт
имя_модуля имя_конкретизации диапазон (список_сигналов);
Вызов с поименованным соответствием (ключевым) сигнал-порт
имя_модуля имя_конкретизации диапазон_конкретизаций (.имя_порта(сигнал),
(.имя_порта(сигнал), ...);
Поименованное (ключевое) переопределение параметров модуля
defparam ïóòü имя параметра = значение;
Позиционное переопределение параметров модуля
имя_модуля #(список значений) имя_конкретизации (список_сигналов);
13.2. VERILOG-2000
VERILOG-2000 допускает более удобную форму поименованной (ключевой)
передачи параметров настройки.
Синтаксис:
имя_модуля #(.имя параметра(значение),...) имя_конкретизации (список_сигналов)
Пример: Ì2 #(.TDEL(15)) K1 (A, ,S_TMP);
Неиспользованные порты обозначаются запятыми в позиционном сопоставлении.
диапазон_конкретизаций — [ лев_индекс :прав_индекс ] — необязательный
аргумент, который указывает количество конкретизаций, каждая из которых сое
диняется с определенным разрядом.
-

294 Приложение 2
Пример: vv [7:0] (Y, x1, x2);
Пример
module reg5 (q, d, clock);
output [4:0] q;input [4:0] d;input clock;
dff c1 (q[0], , d[0], clock);
//позиционное соответствие порт-сигнал
dff c2 (.clk(clock),.q(q[1]),.data(d[1]));
//поименованное соответствие порт-сигнал
dff c3 (q[2], ,d[2], clock);
defparam c3.del = 3.2;
//явное переопределение параметров
dff #(4) c4 (q[3], , d[3], clock);
//позиционное переопределение параметров
dff #(.del(6)) c5 (q[4], d[5], clock);
//явное переопределение параметров в стиле VERILOG-2000
endmodule
module dff (q, q_n, data, clk);
output q, q_n;input data, clk;parameter del=1;
always @(posedge clk) q<=#1 data;q_n<=#1 ~data;
endmodule
14. Системные операторы и функции
Их имя начинается со знака $. Системный оператор реализует одно из встроенных системных действий — например вывод. Пользователь может расширять
список системных операторов, используя механизм интерфейса PLI. Некоторые
из cистемныx операторов приведены ниже.
14.1. Форматируемый ввод-вывод
Коды форматов
%b
%o
%d
%h
%e
%f
%t
0 перед форматом означает отбрасывание нулей слева
Двоичный формат
Восьмеричный
Десятичный
Шестнадцатиричный
Экспоненциальный
Форма с точкой
Время
%s
%m
\t
\n
\"
\\
%%
Символьный
Составное имя
Табуляция
Новая строка
Печатать кавычки
Обратная косая
Печатать процент
Печать с новой строки.
$display("текст с символами форматирования", аргумент, аргумент, ... );
а также операторы $displayb,$displayc,$displayh.
Печать не с новой строки.
$write("текст с символами форматирования ", аргумент, аргумент, ... );

Приложение 2 295
а также операторы $writeb,$writec,$writeh.
Печать после окончания переходных процессов
$strobe("текст с символами форматирования ", аргумент, аргумент, ... );
Работает как $display, но только после окончания всех событий на данном интервале времени.
а также операторы $strobeb,$strobec,$strobeh.
Мониторинг событий в сигналах
$monitor("текст с символами форматирования ", аргумент, аргумент, ... );
Отражает процесс отслеживания событий и печати значений сигналов
а также операторы $monitorb,$monitorc,$monitorh.
14.2. Работа с файлами
Открытие файла
переменная = $fopen("имя_файла");
переменная = $fopen("имя_файла",òèï);
Закрытие файла
$fclose(переменная);
Переменная обьявляется как integer и является многоканальным дескриптором с установкой одного бита для каждого файла.
Действия с нестандартными файлами
$fmonitor(переменная, "текст_с_символами_форматирования",сигнал,сигнал, ... );
$fdisplay(переменная, "текст_с_символами_форматирования",сигнал,сигнал, ... );
$fwrite(переменная, "текст_с_символами_форматирования",сигнал,сигнал, ... );
$fstrobe(переменная, "текст_с_символами_форматирования",сигнал,сигнал, ... );
Чтение файлов в массив
$readmemb("имя_файла", массив, начальный_адрес, конечный);
//чтение двоичных кодов
$readmemh("имя_файла", массив, начальный_адрес, конечный);
// чтение шестнадцатиричных кодов
Останов
$finish; //конец моделировния
$stop; //приостановка моделирования-можно его продолжить,
// нажав клавишу ВВОД
Прочие системные процедуры и функции:
$fmonitor, $stime, $realtime, $timeformat, $print
Новые системные функции и процедуры VERILOG-2000

296 Приложение 2
$ferror, $fgetc, $fgets, $fflush, $fread, $fscanf, $fseek, $fsscanf, $ftel,$rewind, $sformat, $swrite, $swriteb, $swriteh, $swriteo, $ungetc.
Cистемные функции и процедуры контроля временных соотношений сигналов см. в следующем разделе.
15. Блок спецификаций временных соотношений-specify
(несинтезабельная конструкция)
Синтаксис
specify
объявление спецпараметров
контроль временных параметров
простые задержки путей контакт-контакт
задержки путей зависящие от фронтов
задержки путей зависящие от состояний
endspecify
15.1. Обьявление спецпараметров
specparam имя_параметра = значение, ...;
Используются для задания задержек и других параметров.
Значение может быть строкой, целым, вещественным, временем.
VERILOG-2000 допускает также описатель localparam для обьявления внут-
ренних констант.
local param имя_параметра = значение, ...;
15.2. Средства проверки временных соотношений
Контроль времени Системный оператор
предустановки $setup
удержания $hold
и того и другого $setuphold
разброса $skew
восстановления $recovery
периода $period
длительности $width
Синтаксис
$setup(проверяемый_сигнал, проверяющий, время_предустановки, фиксатор);
$hold(проверяющий, проверяемый_сигнал, время_предустановки, фиксатор);
$setuphold(проверяющий, проверяемый_сигнал,
время_предустановки, время_удержания, фиксатор);
$skew(проверяющий, проверяемый_сигнал, время_разброса, фиксатор);
$recovery(проверяемый_сигнал, проверяющий, время, фиксатор);
$period(проверяемый_сигнал, время, фиксатор);
$width(проверяемый_сигнал, предел_длительности, порог, фиксатор);

Используемые сокращения 297
Контролирующие системные операторы можно употреблять только в блоке
specify.
Проверяемый и проверяющий сигналы должны быть портами модуля (прове-
ряющий — обычно тактовый сигнал).
Предел_длительности и порог — временные параметры
Фиксатор (необязательный параметр) — переменная, используемая как флаг
возникновения нарушений.
15.3. Задержки путей распространения сигналов
Задержка простого пути (простая_задержка):
(имя_входного_порта полярность:оперция_пути выходной_портt) = (задержка);
Задержка пути, зависящая от фронтов сигналов (событийная_задержка):
(событие входной_порт операция_пути(выходной_порт полярность:источник))
= (задержка);
событие(необязательный параметр) — posedge или negedge. Если оно не указа-
но, предполагается любой перепад.
источник(необязательный параметр).
Задержка, зависящая от состояния схемы:
if (первое_условие) простая_задержка | событийная_задержка
if (следующее_условие) простая_задержка | событийная_задержка
ifnone простая_задержка
В условии могут использоваться только имена входов модуля.
Для вектора следует использовать только его младший разряд.
Для различных задержек того же самого пути необходимо задавать разные
условия или события.
ifnone (необязательно).
полярность (необязательное) + или -, указывает будет ли инвертирован вход-
ной сигнал.
Операция_пути
*> означает полная_связь
=> означает параллельная_связь.
полная_связь — любой разряд входного сигнала может иметь отдельный путь
к любому разряду выхода.
параллельная_связь — разряд в разряд (0 - 0,1-1,...).
Задержка может состоять из 1, 2, 3, 6 или 12 значений времен переключения.
Время переключения может быть одним числом или тройкой — min:typ:max .
Число задержек Пояснения
1 Одна задержка для всех переключений выхода
2 Разные задержи фронта и среза выхода
3 Задержки фронта, среза, переключения
6 Задержки фронта, среза, 0->Z, Z->1, 1->Z, Z->0
12
Задержки фронта, среза, 0->Z, Z->1, 1->Z, Z->0, 0->X, X->1,
1->X, X->0, X->Z, Z->X

298 Содержание
Примеры Пояснения
(a => b) = 1.8;
(a -*> b) = 2:3:4;
specparam t1 = 3:4:6,
t2 = 2:3:4;
(a => y) = (t1,t2);
(a *> y1,y2) = (2,3,4,3,4,3);
(posedge clk => (qb -: d)) = (2.6, 1.8); Задержка фронта и среза зависит от фронтов
if (rst && pst) (posedge clk=>(q +: d))=2; Задержа зависит от состояния и фронтов
Параллельная связь с одинаковыми задержками
переключения 1->0 и 0->1
Полная связь с разбросом задержек min:typ:max
b принимает инверсное значение a
Разные задержки с разбросом для фронта и среза
6 разных задержек: фронта, среза, 0->Z, Z->1,
1->Z, Z->0
16. Синтезабельные конструкции
Список этих конструкции для разных систем синтеза может несколько отли-
чаться.
В новых разработках систем предполагается поддержка нововведений стан-
дарта VERILOG-2000 (эти строки таблицы обозначены звездочкой).
Конструкция Пояснения
Обьявление модуля *
Обьявление портов input output inout *
Соединения типа wire wand wor supply0
supply1
Переменные типа reg, integer Длина integer 32 bits
Параметры
Конкретизация модуля
Встроенные Примитивы
and nand or nor
xor buf not
bufif1 bufif0
notif1 notif0
Непрерывное присваивание assign Явная и неявная формы
Непрерывное процедурное присваива-
íèå assign
Функции-function
Процедуры-task
Блоки always
Группы begin--end
Только целые. Может не поддерживаться переопределение параметров;
* параметры с указанным размером
* рекурсивные со статически ограниченным чис
лом рекурсий
Обязаны иметь список чувствительности, * допол
нительно использует ограничители @* и ,
-
-

Содержание 299
Конструкция Пояснения
Оператор disable
Последовательные операторы
присваивания = <=
Операторы
if if-else
case casex casez
Öèêë for
Циклы while forever
Операции
&~&|~|^^~~^
==!=<><==>
!&&||
<< >> {} {{}} ? :
+-*/
Работа с разрядами и полями векторов
ЗначенияXиZвоспринимаются в смысле только
как безразличные
В теле цикла должен быть оператор задержки на
такт @(posedge clk) или @(negedge clk))
Не поддерживаются операции === и!==,авнекоторых системах также || и &&
*-VERILOG_2000 — дополнительно <<< >>>
и**
В левой части присваиваний границы полей векторов могут быть только константами *
17. Директивы компиляции
(перечислены только основные)
В основном это директивы препроцессора ,который обрабатывает текст модели перед компиляцией,частично это директивы управления процессом моделирования.
Их имена начинаются с символа обратной кавычи (`)—неcледует путать
его с обычной кавычкой ( ' ). Это не операторы — не надо ставить после них символ ;. Область их действя не ограничивается границами модулей, а простирается
до другой директивы, отменяющей данную.
Директива отмены директив
`reset_all
Отменяет все предыдущие директивы — восстанавливает значения директив
по умолчанию.
Директива масштаба модельного времени
`timescale единица времени / точность задания
единица времени может иметь значения: 1 10 или 100.
единица измеряется в: s — секундах, ms — милисекундах и т. д.(us, ns, ps, fs ).
Пример: `timescale 1 ns / 100 ps — задана единица модельного времени -1 наносекунда с точностью одна десятая.
Директива описания макроса
`define имя_макроса строка
`define имя_макроса(аргумент) строка (аргумент)

300 Содержание
строка замещает имя макроса после препроцессорной обработки макровызова.
строка-строка текста завершающегося символом конца строки.
имя_макроса в месте его вызова начинается с символа обратной кавычки.
Комментарий не входит в состав строки.
Примеры:
`define ONE 1 //обозначение 1
a<= `ONE; // после препроцессора будет a<=1;
`define NOR(dval) nor #(dval)
`NOR(3) or1 (y,a,b);/ /после получим nor #3 or1(y,a,b)
`NOR(3:4:5) or2 (o,c,d);
Директива отмены макроопределения
`undef имя_макроса
Пример:
`undef ONE
Директива включения файла
`include "имя_файла"
Вставляет в данное место текст другого Verilog-файла. Имя файла может
включать путь в каталогах системы.
Директива условной компиляции
`ifdef имя_макроса
строки VERILOG-кода
`else
строки VERILOG-кода
`endif
После препроцессорной обработки остается только одна из альтернативных
групп строк
Пример:
Если было объявление 'define RTL, останется wirey=a|b;
`ifdef RTL
wirey=a|b;
`else
or (y,a,b);
`endif
Директива задания типа умалчиваемого соединения default
(по умолчанию это тип wire)
`default_тип_соединения тип_соединения
Пример: `default_wand wor
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
