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

В Verilog поведенческие модели содержат процедурные операторы,

которые управляют симуляцией и манипулируют переменными типов


данных.
Эти утверждения содержатся в процедурах. Каждая из процедур имеет
связанный с ней поток действий.
Во время симуляции поведенческой модели все потоки, определяемые
всегда (always) и начальными (initial) операторами, начинаются вместе в
нулевой (zero) момент симуляции.
Начальные (initial) операторы выполняются один раз, а операторы
always выполняются повторно.
Пример
Переменные регистра a и b инициализируются двоичными 1 и 0
соответственно в нулевой момент моделирования.
Исходный (initial) оператор завершается и больше не выполняется во время
этого прогона симуляции. Этот начальный оператор содержит блок
операторов begin-end. В этом блоке типа begin-end сначала инициализируется
a, затем b.
module behave;
reg [1:0]a,b;

initial
begin
a = 'b1;
b = 'b0;
end

always
begin
#50 a = ~a;
end

always
begin
#100 b = ~b;
end
End module
Процедурные присваивания
Процедурные присваивания предназначены для обновления целых
(integer), регистров (reg), времени (time) и переменных памяти (memory).
Между процедурным присвоением и непрерывным присвоением есть
существенная разница, например:
1. Непрерывные назначения управляют сетевыми переменными (например,
wire), оцениваются и обновляются всякий раз, когда входной операнд
изменяет значение.
Процедурные присваивания обновляют значение регистровых переменных
под управлением окружающих их процедурных конструкций потока.
2. Правая часть процедурного присваивания может быть любым
выражением, результатом которого является значение. Однако частичные
выборки в правой части должны иметь постоянные индексы. В левой части
указывается переменная, которая получает назначение из правой части.
Левая часть процедурного назначения может принимать одну из следующих
форм:

Регистровая, целая, действительная или временная переменная: присвоение


ссылки на имя одного из этих типов данных.
Выбор бита регистровой, целочисленной, вещественной или временной
переменной: присвоение одному биту, при котором остальные биты остаются
нетронутыми.
Частичный выбор регистровой, целочисленной, вещественной или временной
переменной: частичный выбор двух или более смежных битов, при котором
остальные биты остаются нетронутыми. Для формы выбора части допустимы
только константные выражения.
Элемент памяти: одно слово памяти. Выбор битов и выбор частей
недопустимы для ссылок на элементы памяти.
Конкатенация любого из вышеперечисленных: может быть указана
конкатенация любой из предыдущих четырех форм, которая эффективно
разделяет результат выражения правой части, а затем присваивает части
раздела по порядку различным частям конкатенации.
Задержка в присваивании
В отложенном присваивании проходит Δt единиц времени, прежде чем
оператор будет выполнен, и будет выполнено левостороннее присваивание.
При задержке внутри присвоения правая сторона оценивается немедленно,
но существует задержка Δt, прежде чем результат будет помещен в
переменную.
Если другая процедура изменяет правый сигнал в течение Δt, это не
влияет на выход. Инструменты синтеза не поддерживают задержки.

Блокирующее присваивание
Блокирующий оператор процедурного присваивания должен быть выполнен
до выполнения операторов, следующих за ним в последовательном блоке.
Оператор не препятствует выполнению операторов, следующих за ним в
параллельном блоке.
Синтаксис
<lvalue> = <timing_control> <expression>

Неблокирующее процедурное назначение используется для планирования


назначений без блокировки процедурного потока.

Мы можем использовать неблокирующий процедурный оператор всякий раз,


когда мы хотим сделать несколько назначений регистров в течение одного и
того же временного шага независимо от порядка или зависимости друг от
друга.
<Утверждение>
::= if ( <Выражение>) < Утверждение_или_ноль>
||= if ( < Выражение > ) < Утверждение_или_ноль >
else < Утверждение_или_ноль >
< Утверждение_или_ноль >
::= < Утверждение>
||= ;

Вычисляется <Выражение>. Если оно истинно (ненулевое известное


значение), то выполняется первый оператор. Если оно ложно (нулевое
значение или значение x или z), то первый оператор не выполняется.
Если имеется оператор else и <Выражение> ложно, выполняется оператор
else.
Поскольку числовое значение выражения if проверяется на нулевое значение,
возможны определенные сокращения.

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