Арифметические операторы
- Бинарные: +, −, *, /, % (оператор модуля)
- Унарные: +, − (Используются для указания знака)
- При целочисленном делении отбрасывается дробная часть
- При получении модуля знак наследуется от первого операнда
- Если хотя бы один из битовых операндов x, результат будет x
- Регистровый тип данных используется как беззнаковый (отрицательные числа хранятся в двоичном дополнительном коде)
Пример
Verilog Code:
module arithmetic_operators(); initial begin $display (" 5 + 10 = %d", 5 + 10); $display (" 5 - 10 = %d", 5 - 10); $display (" 10 - 5 = %d", 10 - 5); $display (" 10 * 5 = %d", 10 * 5); $display (" 10 / 5 = %d", 10 / 5); $display (" 10 / -5 = %d", 10 / -5); $display (" 10 %s 3 = %d","%", 10 % 3); $display (" +5 = %d", +5); $display (" -5 = %d", -5); #10 $finish; end endmodule
Code:
<span style="color: black; font-size: small;"> 5 + 10 = 15 5 - 10 = -5 10 - 5 = 5 10 * 5 = 50 10 / 5 = 2 10 / -5 = -2 10 % 3 = 1 +5 = 5 -5 = -5</span>
Операторы отношений
Оператор |
Описание |
a<b |
a меньше b |
a>b |
a больше b |
a<=b |
a меньше или равно b |
a>=b |
a больше или равно b |
- Результат скалярного типа (пример a<b)
- 0 если отношение ложно (если a больше b)
- 1 если отношение истинно (если a меньше или равно b)
- x если любой из операндов имеет бит x (если a или b содержат x)
Примечание: При значении x или z, результат теста ложный (0)
Пример
Verilog Code:
module relational_operators(); initial begin $display (" 5 <= 10 = %b", (5 <= 10)); $display (" 5 >= 10 = %b", (5 >= 10)); $display (" 1'bx <= 10 = %b", (1'bx <= 10)); $display (" 1'bz <= 10 = %b", (1'bz <= 10)); #10 $finish; end endmodule
Code:
<span style="color: black; font-size: small;"> 5 <= 10 = 1 5 >= 10 = 0 1'bx <= 10 = x 1'bz <= 10 = x</span>
Операторы равенства
Есть два типа операторов равенства: Case и логическое.
Оператор |
Описание |
a===b |
a равно b, включая x и z (Case равенство) |
a!==b |
a не равно b, включая x и z (Case неравенство) |
a==b |
a равно b, результат может быть неизвестным (логическое равенство) |
a!=b |
a не равно b, результат может быть неизвестным (логическое неравенство) |
- Операнды сравниваются бит за битом, в неравных по размеру операндах больший заполняется нулями
- Результат 0 (ложный) или 1 (истинный)
- Для операторов == и != результат окажется x, если хотя бы один из операндов содержит x или z
- Для операторов === и !== operators биты x и z подлежат сравнению и должны совпадать с результатом для получения значения истины
Примечание: Результат может быть только 0 или 1.
Пример
Verilog Code:
module equality_operators(); initial begin // Case равенство $display (" 4'bx001 === 4'bx001 = %b", (4'bx001 === 4'bx001)); $display (" 4'bx0x1 === 4'bx001 = %b", (4'bx0x1 === 4'bx001)); $display (" 4'bz0x1 === 4'bz0x1 = %b", (4'bz0x1 === 4'bz0x1)); $display (" 4'bz0x1 === 4'bz001 = %b", (4'bz0x1 === 4'bz001)); // Case неравенство $display (" 4'bx0x1 !== 4'bx001 = %b", (4'bx0x1 ! == 4'bx001)); $display (" 4'bz0x1 !== 4'bz001 = %b", (4'bz0x1 ! == 4'bz001)); // Логическое равенство $display (" 5 == 10 = %b", (5 == 10)); $display (" 5 == 5 = %b", (5 == 5)); // Логическое неравенство $display (" 5 != 5 = %b", (5 ! = 5)); $display (" 5 != 6 = %b", (5 ! = 6)); #10 $finish; end endmodule
Code:
<span style="color: black; font-size: small;"> 4'bx001 === 4'bx001 = 1 4'bx0x1 === 4'bx001 = 0 4'bz0x1 === 4'bz0x1 = 1 4'bz0x1 === 4'bz001 = 0 4'bx0x1 !== 4'bx001 = 1 4'bz0x1 !== 4'bz001 = 1 5 == 10 = 0 5 == 5 = 1 5 != 5 = 0 5 != 6 = 1</span>
Логические операторы
Оператор |
Описание |
! |
логическое отрицание НЕ |
&& |
логическое И |
|| |
логическое ИЛИ |
- Выражения, связанные && и || вычисляются слева направо
- Вычисления прекращаются, как только выясняется результат
- Результат имеет скалярный тип:
- 0 если отношение ложное
- 1 если отношение истинное
- x если любой из операторов имеет неизвестные (x) биты
Пример
Verilog Code:
module logical_operators(); initial begin // Логическое И $display ("1'b1 && 1'b1 = %b", (1'b1 && 1'b1)); $display ("1'b1 && 1'b0 = %b", (1'b1 && 1'b0)); $display ("1'b1 && 1'bx = %b", (1'b1 && 1'bx)); // Логическое ИЛИ $display ("1'b1 || 1'b0 = %b", (1'b1 || 1'b0)); $display ("1'b0 || 1'b0 = %b", (1'b0 || 1'b0)); $display ("1'b0 || 1'bx = %b", (1'b0 || 1'bx)); // Логическое НЕ $display ("! 1'b1 = %b", ( ! 1'b1)); $display ("! 1'b0 = %b", ( ! 1'b0)); #10 $finish; end endmodule
Code:
<span style="color: black; font-size: small;"> 1'b1 && 1'b1 = 1 1'b1 && 1'b0 = 0 1'b1 && 1'bx = x 1'b1 || 1'b0 = 1 1'b0 || 1'b0 = 0 1'b0 || 1'bx = x ! 1'b1 = 0 ! 1'b0 = 1</span>
Битовые операторы
Битовые операторы выполняют операции над каждым битом в двух операндах. Операции выполняются поразрядно. Если один из операторов оказывается короче другого, то он расширяется в битах до большего операнда и новые биты заполняются нулями.
Оператор |
Описание |
~ |
побитовое отрицание НЕ |
& |
побитовое И |
| |
побитовое ИЛИ |
^ |
исключающее ИЛИ |
^~ или ~^ |
- Вычисления включают неизвестнтые биты следующим образом:
- ~x = x
- 0&x = 0
- 1&x = x&x = x
- 1|x = 1
- 0|x = x|x = x
- 0^x = 1^x = x^x = x
- 0^~x = 1^~x = x^~x = x
- Если операнды имеют неравную длину, то короткий операнд заполняется нулями в старших битовых позициях.
Пример
Verilog Code:
module bitwise_operators(); initial begin // Побитовое отрицание $display (" ~4'b0001 = %b", (~4'b0001)); $display (" ~4'bx001 = %b", (~4'bx001)); $display (" ~4'bz001 = %b", (~4'bz001)); // Побитовое И $display (" 4'b0001 & 4'b1001 = %b", (4'b0001 & 4'b1001)); $display (" 4'b1001 & 4'bx001 = %b", (4'b1001 & 4'bx001)); $display (" 4'b1001 & 4'bz001 = %b", (4'b1001 & 4'bz001)); // Побитовое ИЛИ $display (" 4'b0001 | 4'b1001 = %b", (4'b0001 | 4'b1001)); $display (" 4'b0001 | 4'bx001 = %b", (4'b0001 | 4'bx001)); $display (" 4'b0001 | 4'bz001 = %b", (4'b0001 | 4'bz001)); // Побитовое исключающее ИЛИ $display (" 4'b0001 ^ 4'b1001 = %b", (4'b0001 ^ 4'b1001)); $display (" 4'b0001 ^ 4'bx001 = %b", (4'b0001 ^ 4'bx001)); $display (" 4'b0001 ^ 4'bz001 = %b", (4'b0001 ^ 4'bz001)); // Побитовое исключающее ИЛИ-НЕ $display (" 4'b0001 ~^ 4'b1001 = %b", (4'b0001 ~^ 4'b1001)); $display (" 4'b0001 ~^ 4'bx001 = %b", (4'b0001 ~^ 4'bx001)); $display (" 4'b0001 ~^ 4'bz001 = %b", (4'b0001 ~^ 4'bz001)); #10 $finish; end endmodule
Code:
<span style="color: black; font-size: small;"> ~4'b0001 = 1110 ~4'bx001 = x110 ~4'bz001 = x110 4'b0001 & 4'b1001 = 0001 4'b1001 & 4'bx001 = x001 4'b1001 & 4'bz001 = x001 4'b0001 | 4'b1001 = 1001 4'b0001 | 4'bx001 = x001 4'b0001 | 4'bz001 = x001 4'b0001 ^ 4'b1001 = 1000 4'b0001 ^ 4'bx001 = x000 4'b0001 ^ 4'bz001 = x000 4'b0001 ~^ 4'b1001 = 0111 4'b0001 ~^ 4'bx001 = x111 4'b0001 ~^ 4'bz001 = x111</span>