Ejemplos

Tipos de datos Verilog

Ejemplos

wire vs reg

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

  • Una variable tipo reg se trata como un número no negativo (sin signo en operaciones aritméticas (+*).
  • Si cualquiera de los bits del operando aritmético es X o Z,entonces el resultado es X.

parameter, if

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

Cable (wire) Entero (integer)