Вы находитесь на странице: 1из 7

8.

Поведенческие модели в Verilog


Поведенческие модели – это модели высокого уровня, которые описывают алгоритм
фунционирования устройства без детализации на логические вентили или пути передач
данных. Строятся на базе операторов : initial, always.
Процедурные операторы назначения сигнала используются в конструкциях initial и alway,
и применяются применяются для для присвоения присвоения значений значений
переменным переменным класса register: reg, integer, real, realtime и time.
Управление задержкой (delay control), использует использует символ символ #;
Управление событием (event control), использует символ @ ; 
Управление значением (level-sensitive timing control), использует оператор wait.  
Событие – это изменение значения регистра или цепи. Существует четыре типа 
событийного управления порядком выполнения операторов:
➢обычное событийное управление (regular event control), 
➢именное событийное управление (named event control),
➢событийное управление по ИЛИ (event OR OR control)
➢с использованием оператора цикла repeat.
9. Управление процессом выполнения операторов в Verilog (условный оператор,
операторы выбора, циклы).
С лк ///////////////////////
Операторы: 
➢IF 
➢Case (case, casez, cazex)
➢Циклы 
• for 
• while 
• repeat
• forever 
/////////////////
С инета//////////////////
Условный оператор предназначен для организации ветвящихся структур в поведенческих
блоках (always и initial). Его синтаксис представлен ниже:
if Логическое_Выражение
begin
// Блок_операторов_1
End
Else
Begin
// Блок_операторов_2
End
Если Логическое_Выражение равно «ИСТИНА», то выполняется
Блок_операторов_1, в противном случае – выполняется Блок_операторов_2. Следует
помнить, что в языке Verilog, подобно языку Си, логическое значение «ИСТИНА»
соответствует 1, а логическое значение «ЛОЖЬ» соответствует 0. Таким образом,
существует возможность в записи условного оператора вместо логических выражений
использовать арифметические выражения. В этом случае Блок_операторов_2
выполняется, если результатом вычисления арифметического выражения будет 0, при
любом другом результате вычисления арифметического выражения (не обязательно 1)
будет выполняться Блок_операторов_1.
Синтаксис оператора выбора case в языке Verilog представлен ниже

При выполнении оператора выбора case производится сравнение Выражения с


Альтернативами в порядке их следования. Для первой встретившейся Альтернативы,
включающей значение, совпадающее со значением Выражения, выполняется
соответствующий оператор или блок операторов, а последующие альтернативы при этом
игнорируются. Если Выражение не входит ни в одну из Альтернатив, то выполняется
Оператор_по_умолчанию.
Цикл «пока» в языке Verilog описывается ключевым словом while. Синтаксис цикла
«пока» представлен ниже:

Пример использования цикла while:

В данном примере тело цикла является сложным оператором, состоящим из двух


простых операторов ($display(”i = %d”, i) и i = i + 1), заключенных в операторные скобки
begin … end. Условие выхода помещается в круглых скобках сразу после ключевого слова
while. По окончании рассматриваемого фрагмента программы сигнал i получит значение
10. Т.е. тело цикла будет выполняться, пока выполняется условие. Если условие
становится ложным, то выполнение цикла, прекращается.
10. Блокирующие и неблокирующие операторы, внутриоператорный контроль.
(http://sensi.org/~svo/verilog/assignments/ очень полезный сайт)

Неблокирующее присваивание

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


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

Блокирующее присваивание

Блокирующее присваивание, заклеймленное некорыми как «медленное», в


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

always @(posedge clk) begin


    x = x + 1;
    y = y + 1;
end
и

always @(posedge clk) begin


    x <= x + 1;
    y <= y + 1;
end
дадут один и тот же результат. Оба выражения выполнятся одновременно, в обоих
случаях «время выполнения» будет равно времени записи в соответствующий регистр
значения на его входе. Пока выражения не зависят друг от друга, никакой разницы между
блокирующими и неблокирующими присваиваниями нет.

В то же время, следующая запись являет собой что-то новое:

always @(posedge clk) begin


    x = x + 1;
    y = x;
end
Здесь x увеличится на 1, а y примет значение x + 1. Чтобы записать это выражение
неблокирующими присваиваниями, потребовалась бы такая запись:

always @(posedge clk) begin


    x <= x + 1;
    y <= x + 1;
end
Цепочку блокирующих присваиваний можно рассматривать как одно большое
выражение. Еще пример:

y <= 3*((input_value >> 4) + center_offset);


или:

y = input_value >> 4;
y = y + center_offset;
y = 3 * y;
Эти две записи эквивалентны. Но вторую запись нельзя понимать как последовательную
цепочку вычислений. Это верно лишь в том смысле, что всё выражение действительно
выстраивается в схему, в которой сначала отрезаются 4 младших разряда, результат и
второй операнд идут на вход сумматора, а выход сумматора отдается умножителю на три.
Так это представляется в электрической схеме и человек для удобства нарисует эту схему
слева направо и читать он ее будет последовательно. Но в получившейся схеме все это
выражение выполняется непрерывно, так же как и в предыдущей записи с
неблокирующим присваиванием. Запись результата в регистр, как и следовало ожидать,
происходит по фронту тактового импульса.

11.   Операторы assign/deassign и force/release


12. Реализация подпрограмм в Verilog. Задачи и функции.
(https://docs.google.com/document/d/14w8UdSupoIr_m8x6Ax5t1gwHzcOoDjW22T3tvhB_
GYE/edit) лк, там примеры, синтаксис
Как и в любом другом языке программирования подпрограммы позволяют разбивать
большой код на отдельные фрагменты. Verilog располагает двумя типами подпрограмм:
задачи (task) и функции (function). Основная цель функции – сформировать значение,
которое может быть использовано в выражении. Она всегда возвращает одно значение и
должна иметь хотя бы один входной аргумент. В задаче допускается генерирование
значений нескольких выходных переменных или вообще ни одного, она может не иметь
и входных аргументов. Задачи допускают применение задержек, временного и
событийного управления, функции – нет, поэтому в функциях не должно быть операторов,
начинающихся с символов #, @ или wait. Для декларации аргументов в  подпрограммах
используются такие же ключевые слова, как и для описания портов модулей.
Параметр identifier описывает имя функции или задачи. Для функции – это также имя возвращае
значения, для которого параметром range_of_type задается тип и размер. Если последний пропущен,
умолчанию функция возвращает однобитовое значение типа reg. Можно также присвоить возвращае
значению тип: integer, real, realtime или time. Аргументы задач, объявленные как inout и out,
использоваться только в процедурных операторах и должны быть: переменной регистрового класса
integer, real, realtime  или time), памятью, конкатенацией регистров переменных памяти, элементом
диапазоном регистрового вектора.
Входые аргументы функции могут быть описаны одним из двух способов. В первом случае после и
функции ставится точка с запятой. После этого следует описание одного или нескольких входных п
(старый стиль). Во втором случае описание входов записывается в круглых скобках, через запятую
имени функции (новый стиль). Пример определяет функцию getbyte, с использованием первого (ли
6.1 а)) или второго (листинг 6.1 б)) способа описания входных параметров. Аналогичным обр
определяются входные параметры и для зада, что иллюстрируется листингом на примере задачи my
которая имеет пять аргументов: два входных, два выходных и один двунаправленный.

13.  Библиотека PLI. Структура и область применения.


(https://docs.google.com/document/d/1uQnzDZz2frk6FhxLi1r-q42yXntcKZJ6wVe-
aIWGnRk/edit) лк
Программный интерфейс PLI (рис. 8.1) используется для:
– создания дополнительных системных задач и функций: задач мониторинга, генерации т
отладки фрагментов программы;
– построения различных программных приложений таких как трансляторы, анализ време
параметров;
– получения информации о проекте: иерархия, связи;
– специальных и пользовательских форм управления выводом информации;
– создания подпрограмм, формирующих тестовые последовательности;
– создания любого основанного на Verilog программного приложения.
PLI позволяет пользователю читать и модифицировать структуры внутренних данных, получать д
к среде моделирования.
Проектировщик пишет собственную пользовательскую системную задачу, применяя
подпрограммы. Она подключается к программе моделирования, которая обрабатывает ссылку на за
зная место расположения соответствующей функции на языке Си.
Для иллюстрации механизма использования PLI представлен пример создания элемента
пользовательской системной задачи $welcome_task и функции $my_function. При вызове данная з
выводит сообщение “You are welcome!". 

14. Синтез цифровых схем на основе языков описания аппаратуры.


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

Типичные этапы выполнения процесса синтеза изображена на рис

 общие принципы выполнения синтеза:


1. HDL -модель должна быть представлена на RTL-уровне. Поведение устройства описывается  с точностью до такта
синхросигнала. В общем случае, любая конструкция, которая моделирует работу устройства на каждом такте функционирования
RTL-схемы, может быть синтезирована. 
2. Не допускается использование конструкций, включающих временные параметры. 
3. Не допускается применения механизмов инициализации средствами HDL-языка, только с помощью внешних входов,
например, сброса и установки. 
4. Рекомендуется явно указывать размер (разрядность) данных. 
Самое главное, при написании кода очень важно, чтобы проектировщик представлял, из каких аппаратных элементов будет
состоять его проект, как он будет реализован в аппаратуре. Под аппаратными элементами подразумевается стандартный набор
компонентов: триггеры, регистры, сумматоры, вентили, мультиплексоры, дешифраторы.
Синтезируемые конструкции в Verilog

Вам также может понравиться