Операторы Verilog: основная арифметика и управление для синтеза
Данные, которые нельзя обработать, бесполезны — в цифровых схемах и компьютерных системах всегда нужны вычисления. Разберём операторы Verilog, позволяющие инструментам синтеза реализовывать соответствующие аппаратные элементы.
Арифметические операторы
Если второй операнд деления или модуля равен нулю — результат X. Если любой операнд возведения в степень — real, результат тоже real. Результат 1, если второй операнд степени равен 0 (a0).
| Оператор | Описание |
|---|---|
a + b | a плюс b |
a - b | a минус b |
a * b | a умножить на b |
a / b | a разделить на b |
a % b | a по модулю b |
a ** b | a в степени b |
module des; reg [7:0] data1, data2;
initial begin
data1 = 45; data2 = 9;
$display ("Add + = %d", data1 + data2);
$display ("Sub - = %d", data1 - data2);
$display ("Mul * = %d", data1 * data2);
$display ("Div / = %d", data1 / data2);
$display ("Mod %% = %d", data1 % data2);
$display ("Pow ** = %d", data2 ** 2);
end endmodule
Simulation Log: Add=54, Sub=36, Mul=149, Div=5, Mod=0, Pow=81.
Операторы отношения (Relational)
Выражение с оператором отношения даёт 1, если истинно, 0 — если ложно. Если операнд X или Z — результат X. Приоритет ниже арифметических, все операторы отношения имеют одинаковый приоритет.
| Оператор | Описание |
|---|---|
a < b | a меньше b |
a > b | a больше b |
a <= b | a меньше или равно b |
a >= b | a больше или равно b |
module des; reg [7:0] data1, data2;
initial begin
data1 = 45; data2 = 9; $display ("data1 >= data2 : %0d", data1 >= data2);
data1 = 45; data2 = 45; $display ("data1 <= data2 : %0d", data1 <= data2);
data1 = 9; data2 = 8; $display ("data1 > data2 : %0d", data1 > data2);
data1 = 22; data2 = 22; $display ("data1 < data2 : %0d", data1 < data2);
end endmodule
Simulation Log: 1, 1, 1, 0.
Операторы равенства (Equality)
Приоритет одинаков, ниже реляционных. Результат 1 — истина, 0 — ложь. Если операнд логического равенства (==) или неравенства (!=) — X или Z, результат X. Операторы case-equality (===) и case-inequality (!==) учитывают X и Z и всегда дают известное значение.
| Оператор | Описание |
|---|---|
a === b | a равно b, включая x и z |
a !== b | a не равно b, включая x и z |
a == b | a равно b, результат может быть неизвестным |
a != b | a не равно b, результат может быть неизвестным |
module des; reg [7:0] data1, data2;
initial begin
data1 = 45; data2 = 9; $display ("45 === 9 : %0d", data1 === data2);
data1 = 'b101x; data2 = 'b1011; $display ("101x === 1011 : %0d", data1 === data2);
data1 = 'b101x; data2 = 'b101x; $display ("101x === 101x : %0d", data1 === data2);
data1 = 'b101z; data2 = 'b1z00; $display ("101z !== 1z00 : %0d", data1 !== data2);
data1 = 39; data2 = 39; $display ("39 == 39 : %0d", data1 == data2);
data1 = 14; data2 = 14; $display ("14 != 14 : %0d", data1 != data2);
end endmodule
Simulation Log: 0, 0, 1, 1, 1, 0.
Логические операторы (Logical)
Результат && — 1, если оба операнда истинны/ненулевые. || — 1, если хотя бы один истинный/ненулевой. Если операнд X — результат X. Логическое отрицание ! превращает ненулевое в 0, нулевое в 1, X остаётся X.
| Оператор | Описание |
|---|---|
a && b | истина, если a И b истинны |
a || b | истина, если a ИЛИ b истинны |
!a | преобразует ненулевое в 0 и наоборот |
module des; reg [7:0] data1, data2;
initial begin
data1 = 45; data2 = 9; $display ("45 && 9 : %0d", data1 && data2);
data1 = 0; data2 = 4; $display ("0 && 4 : %0d", data1 && data2);
data1 = 'dx; data2 = 3; $display ("x && 3 : %0d", data1 && data2);
data1 = 'b101z; data2 = 5; $display ("Z && 5 : %0d", data1 && data2);
data1 = 45; data2 = 9; $display ("45 || 9 : %0d", data1 || data2);
data1 = 0; data2 = 4; $display ("0 || 4 : %0d", data1 || data2);
data1 = 'dx; data2 = 3; $display ("x || 3 : %0d", data1 || data2);
data1 = 'b101z; data2 = 5; $display ("Z || 5 : %0d", data1 || data2);
data1 = 4; $display ("!4 : %0d", !data1);
data1 = 0; $display ("!0 : %0d", !data1);
end endmodule
Simulation Log: 1,0,x,1, 1,1,1,1, 0,1.
Побитовые операторы (Bitwise)
Комбинируют бит одного операнда с соответствующим битом другого для вычисления бита результата. Таблицы истинности для & и | с учетом 0,1,x,z приведены в таблицах.
module des; reg data1[4]; reg data2[4]; int i,j;
initial begin
data1[0]=0; data2[0]=0; data1[1]=1; data2[1]=1;
data1[2]='x; data2[2]='x; data1[3]='z; data2[3]='z;
for(i=0;i<4;i+=1) for(j=0;j<4;j+=1)
$display ("data1(%0d) & data2(%0d) = %0d", data1[i], data2[j], data1[i] & data2[j]);
end endmodule
Simulation Log показывает все 16 комбинаций для &.
Операторы сдвига (Shift)
Два вида: логические (<<, >>) и арифметические (<<<, >>).
module des; reg [7:0] data; int i;
initial begin
data = 8'h1; $display ("Original = %d (%b)", data, data);
for(i=0;i<8;i+=1) $display ("data << %0d = %b", i, data << i);
data = 8'h80; $display ("Original = %d (%b)", data, data);
for(i=0;i<8;i+=1) $display ("data >> %0d = %b", i, data >> i);
data = 8'h1; $display ("data >> 1 = %b", data >> 1);
end endmodule
Simulation Log: сдвиги влево 1→128, вправо 128→1, последний сдвиг 1>>1 = 0.
Verilog
- Операторы C# — исчерпывающее руководство по операторам в C#
- Освоение Verilog: полное руководство по проектированию цифровых схем
- Освоение конкатенации в Verilog: практическое руководство
- Понимание назначений в Verilog: типы, синтаксис и лучшие практики
- Блокирующие и неблокирующие назначения в Verilog: ключевые различия
- Мастерство функций в Verilog для эффективного RTL дизайна
- Понимание задач (Tasks) в Verilog: отличия от функций, синтаксис и применение
- Генератор тактового сигнала в Verilog: проектирование и реализация
- Мастерство математических функций Verilog для эффективного аппаратного дизайна
- Мастерство $timeformat в Verilog: точность и контроль отображения времени