Realizan operaciones aritméticas:
+ (suma)
- (resta)
* (multiplicación)
/ (división)
% (resto/módulo)
donde + y - pueden ser operadores unarios (-z) o binarios (x - y)
Ejemplo
parameter n = 4;
reg [3:0] a, c, f, g, count;
f = a + c;
g = c - n;
count = (count + 1) % 16; // puede contar de 0 a 15
Comparan dos operandos y devuelven un único bit 1 o 0.
Se sintetizan como comparadores.
Los valores de wire y reg se consideran positivos, p.ej. (-3'b001)==3'b111 y
(-3d001)>3d110 mientras que los enteros se consideran números con signo, p.ej. -1<6.
< (menor que)
> (mayor que)
<= (menor o igual que)
>= (mayor o igual que)
== (igual a)
!= (no igual a)
Ejemplo
if (x == y) e = 1; /* equivalente: e = (x == y); */
else e = 0;
// Comparar en complemento a 2 a>b
reg [3:0] a, b;
if (a[3] == b[3]) a[2:0] > b[2:0];
else b[3];
Comparan bit a bit dos operandos.
Notación idéntica a operadores reductores (unarios).
~ (NOT bitwise)
& (AND bitwise)
| (OR bitwise)
^ (XOR bitwise)
^~, ~^ (XNOR bitwise)
Ejemplo
module and2 (
input [1:0] a, b,
output [1:0] c
);
assign c = a & b;
endmodule //and2

Operan de forma similar a los bitwise sólo para operandos de un solo bit, y devuelven un solo bit 1 ó 0.
Pueden trabajar con expresiones, números enteros o grupos de bits y tratan todos los valores distintos de cero como 1.
Normalmente se utilizan en sentencias condicionales (if ... else) ya que funcionan con expresiones.
! (NOT lógico)
&& (AND lógico)
|| (OR lógico)
== (igualdad lógica)
!= (desigualdad lógica)
=== (igualdad case)
!== (desigualdad case)
En === y !== se tienen en cuenta bits con valores x o z para la
comparación bitwise, en cambio cuando aparecen == y != el resultado
de la comparación es siempre x y estos últimos son sintetizables por
contra de los primeros.
Ejemplo
wire [7:0] x,y,z; // variables multibit
reg a;
...
if ((x==y)&&(z)) a=1; // a = 1 si x igual que y, y z no es cero
else a = !x; // a = 0 si x es algo distinto a cero
Operan sobre todos los bits de un vector y devuelven un valor de un solo bit.
Son la versión unaria (un solo argumento) de los operadores bitwise anteriores.
& (AND reductor)
| (OR reductor)
^ (XOR reductor)
~& (NAND reductor)
~| (NOR reductor)
~^, ^~ (XNOR reductor)
Ejemplo
module chk_zero (
input [2:0] a,
output z
);
assign z = ~|a; // NOR reductor
endmodule //chk_zero

Desplazan el primer operando el número de bits especificado por el segundo operando.
Las posiciones sobrantes se rellenan con ceros, tanto en desplazamentos a derecha como a izquierda (no hay extensión de signo).
<< (desplazamiento a izquierda)
>> (desplazamiento a derecha)
Ejemplo
assign c = a << 2; /* c = a deplazado a la izquierda 2 bits;
las posiciones vacantes se rellenan con 0’s */
Similar al utilizado en C/C++. Se evalúa una de la las dos expresiones basadas en una condición (operador ternario).
Se sintetiza a base de multiplexores.
Sintaxis
conditional_expression ? true_expression : false_expression
Ejemplo
assign a = (inc == 2) ? a+1 : a-1; */ se incrementa o decrementa a si el valor de inc coincide */
assign a = (g) ? x : y;

Combina dos o más operandos para formar un vector mayor.
{ } (concatenación)
Ejemplos
wire [1:0] a, b; wire [2:0] x; wire [3:0] y;
assign x = {1’b0, a}; // x[2]=0, x[1]=a[1], x[0]=a[0]
assign y = {a, b}; /* y[3]=a[1], y[2]=a[0], y[1]=b[1], y[0]=b[0] */
assign foo = { a[4:3], 1’b0, c[1:0] };
assign foo = { a[4], a[3], 1’b0, c[1], c[0] }; // equivalente a la anterior
assign {cout, sum} = a + b + cin; // concatenación de un resultado
Hace múltiples copias de un item.
{n{item}} (n réplicas de item)
Ejemplos
wire [1:0] a, b; wire [4:0] x, y;
assign x = {2{1’b0}, a}; // equivalente a x = {0,0,a}
assign y = {2{a}, 3{b}}; // equivalente a y = {a,a,b,b,b}
wire [3:0] z = {4{1’b1}}; // equivalente a z = 4’b1111
Se debe evitar realizar repeticiones nulas ya que ocasionan errores en algunos sintetizadores, p.ej.
parameter n=5, m=5;
assign x = {(n-m){a}}
La siguiente tabla muestra la precedencia de los operadores de mayor a menor.
Los operadores del mismo nivel evalúan de izquierda a derecha.
Se recomienda utilizar paréntesis para definir el orden de precedencia y mejorar la legibilidad del código.
| Operador | Descripción |
|---|---|
[ ] |
selección de bits ó parte |
( ) |
paréntesis |
!,~ |
NOT lógico y bit-wise |
&,|,~&,~|,^,~^,^~ |
reducción AND, OR, NAND, NOR, XOR, XNOR |
+,- |
(unario) signo positivo o negativo |
{ } |
concatenación |
{{ }} |
repetición |
*,/,% |
(binario) multiplicación, división y resto (no siempre sintetizable) |
+,- |
(binario) suma y resta |
<<,>> |
desplazamientos a izquierda y derecha |
<,>,<=,>= |
comparaciones |
==,!= |
igualdad y desigualdad |
& |
AND bit-wise |
^,^~,~^ |
XOR bit-wise, XNOR bit-wise |
| |
OR bit-wise |
&& |
AND lógico |
|| |
OR lógico |
? : |
(ternario) condicional |
Otras consideraciones importantes:
4'hc > 10 (TRUE)
8'd12 && 9'h1 (TRUE)
8'h0 || 0 (FALSE)
!8'h6 (FALSE)
~4'b0111 (4'b1000)
2'b01 & 2'b11 (2'b01)
4'h8 | 4'h1 (4'h9)
&16'h324d (1'b0)
|16'h1 (1'b1)
8'hfe << 3 (8'hf0)