Programación en Verilog/Introducción
Introducción
editarVerilog 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
editarVerilog 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
editarCorresponde 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
editarTambié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
editarLa 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