Programación en Verilog/Introducción

Introducción Elementos básicos del lenguaje →


Introducción

editar

Verilog es un lenguaje de descripción hardware (HDL: Hardware Description Language) utilizado para describir sistemas digitales, tales como procesadores, memorias o elementos más simples como son los flip-flops. Esto significa que un lenguaje de este tipo puede utilizarse para describir cualquier hardware (digital) a cualquier nivel. Estos sistemas se pueden describir de las dos siguientes formas:

  • Nivel estructural: Se utilizan elementos previamente creados, por el propio desarrollador o por terceros, donde cada elemento se interconecta con otro. Es decir, se conectan varios bloques cuya funcionalidad es pequeña para que comunicándolos entre si realicen una tarea mayor.
  • Nivel de comportamiento: El diseñador describe la transferancia de información entre registros.

Estos dos niveles de descripción pueden mezclarse, dando diseños mixtos. Aunque existen multitud de lenguajes HDL, tan sólo en la actualidad se utilizan dos de ellos: Verilog y VHDL, los cuales son estándares de la IEEE.

Verilog nació en 1985 como un lenguaje propietario, pero en 1990 dicho lenguaje se convirtió de dominio público, permitiendo a las empresas hacer uso del mismo, con el fin de aumentar la difusión del lenguaje.

Niveles de abstracción

editar

Verilog soporta el diseño de un circuito a diferentes niveles de abstracción, de los cuales caben destacar tres de ellos: nivel de puerta, nivel RTL y nivel de comportamiento.

Nivel de puerta

editar

Corresponde a una descripción a bajo nivel, también se denomina modelo estructural. El diseño es descrito mediante primitivas lógicas (AND, OR, ...), conexiones y añadiendo distintas propiedades de tiempo. Estas señales pueden tomar los valores '0', '1', 'X' o 'Z' (siendo 'X' el estado indefinido y 'Z' el de alta impedancia). A continuación, se muestra un ejemplo de este tipo de nivel.


  module mux(f, a, b, sel);
  input   a, b, sel;
  output  f;

  and   #5  g1(f1, a, nsel);
            g2(f2, b, sel);
  or    #5  g3(f, f1, f2);
  not       g4(nsel, sel);
  endmodule

Nivel RTL

editar

También denominado nivel de transferencia de registro. Los diseños descritos en este nivel especifican las características de un circuito mediante operaciones y transferencia de datos. Los circuitos diseñados en este nivel tienen la propiedad de ser sintetizables, por tanto, todo código sintetizable es código RTL. A continuación se muestra un ejemplo de este tipo de nivel.


  module flipflop(d, clk, q, q_bar);
  input   d, clk;
  output  q, q_bar;
  reg     q, q_bar;

  always@(posedge clk)
  begin
    q     <= #1 d;
    q_bar <= #1 !d;
  end
  endmodule

Nivel de comportamiento

editar

La principal característica de este nivel es su total independencia de la estructura del diseño. En este nivel, el diseñador define el comportamiento del circuito, definiéndonos mediante algoritmos en paralelo. Cada uno de los algoritmos están formados por un conjunto de instrucciones que se ejecutan de forma secuencial. En ocasiones es posible utilizar código no sintetizable con el fin de realizar los denominados testbenches. Seguidamente se muestra un ejemplo de este nivel.


  module (clk, A, B, C, D);
  input   clk, A, B;
  output  C, D;
  reg     C;

  always@(C)
  begin
    D <= C + 10;
  end

  always@(posedge clk)
  begin
    C <= A + B;
  end
  endmodule


Introducción Elementos básicos del lenguaje →