Tanto wire como reg permiten modelar nodos combinacionales, si bien deben utilizarse distintos tipos de asignaciones en cada caso, p.ej. si queremos construir un sumador de 8 bits:
module sum (
input [7:0] sum1, sum2, // por defecto, los puertos son wire
output [7:0] res
);
assign res = sum1 + sum2;
endmodule // sum
Un circuito equivalente al anterior se obtendría con la siguiente descripión:
module sum (
input [7:0] sum1, sum2,
output reg [7:0] res // ahora es un registro
);
always @(sum1 or sum2)
begin
res = sum1 + sum2; // esto no se puede hacer con wire
end
endmodule // sum
Observaciones
+
, *
).Continuando con el ejemplo del sumador anterior, podríamos introducir un parámetro para determinar el ancho de palabra de datos con el que opera, y un nuevo puerto que permita seleccionar la operación a realizar con los datos y ampliar su funcionalidad a sumador/restador:
module sum
#(parameter no_bits = 8)
(
input sel_op,
input [no_bits-1:0] sum1, sum2,
output reg [no_bits-1:0] res
);
always @(sel_op or sum1 or sum2) begin
if (sel_op)
res = sum1 + sum2; // asignación procedural
else
res = sum1 - sum2; // asignación procedural
end
endmodule // sum