11 Sumador de Punto Flotante en VHDL: Diseño y Análisis de

Anuncio
SUMADOR DE PUNTO FLOTANTE EN VHDL: DISEÑO Y ANÁLISIS DE
ALTERNATIVAS DE OPTIMIZACIÓN
Ignacio E. Sardi, Bruno L. Uberti, Fernando G. Tinetti, Antonio A. Quijano
Centro de Investigación y Desarrollo en Microelectrónica (CIDEM)
Instituto Tecnológico de Buenos Aires (ITBA)
Buenos Aires
Argentina
[email protected]
sistema para luego detallar cada uno de los bloques que
componen el diseño final. Desde el inicio mismo, el
énfasis está puesto en la reducción de tiempo de
operación para el circuito (sumador). El trabajo que aquí
se presenta tiende al diseño de un ASIC, pero no llega
hasta la obtención del prototipo físico. Para una primera
aproximación de la síntesis y optimización mediante las
herramientas de CAD, se ha adoptado provisoriamente
una tecnología CMOS (SXLIB [13]) y la librería y kit de
diseño incluidos en Alliance. Pero será parte de una
etapa futura elegir una tecnología definitiva.
Más que proveer un nuevo sumador de punto
flotante se muestra un diseño que es fácil y rápido
gracias a VHDL y mediante las herramientas de síntesis
también es fácil y rápida la optimización. El sumador se
toma más como ejemplo que como aplicación final y la
idea no es proveer el mejor o más rápido sino algunas
alternativas de optimización de tiempo. En el presente
artículo no sería tampoco posible agregar más detalles
del uso de Alliance debido a las limitaciones de
extensión establecidas. En principio, tanto Alliance
como otros entornos de CAD tales como Cadence se
componen de múltiples herramientas usualmente
independientes, cada una de ellas enfocada a realizar una
tarea específica dentro del ciclo/proceso de diseño.
En la siguiente sección, se describe la
arquitectura completa del circuito. En la sección 3 se
detallan algunos aspectos relevantes de los bloques que
componen el sumador en punto flotante. La sección 4
muestra la síntesis preliminar o sin optimizar del diseño
en función de tiempo de operación y área de silicio
necesaria. Luego, en la sección 5 se dan los detalles
relevantes de la optimización utilizando las herramientas
de CAD. La sección 6 comenta las alternativas de
optimización de tiempo a nivel de rediseño en VHDL.
Finalmente, la sección 7 detalla las conclusiones y las
alternativas de trabajo futuro.
RESUMEN
En este trabajo se presenta el diseño de un sumador de
números representados en punto flotante siguiendo la
norma IEEE. Además de definir una solución de
hardware aplicando los principios de paralelización de
operaciones establecidos por los pipelines, se analizan
las alternativas de optimización de tiempo de operación
utilizando herramientas de síntesis de hardware a partir
del lenguaje VHDL. Las alternativas se evalúan en
función de la optimización de tiempo de operación y de
las variaciones de área de silicio estimadas por las
herramientas de síntesis. Finalmente, se presenta una
posible evolución hacia el cambio del diseño a nivel de
VHDL del circuito y su impacto en la optimización de
tiempo.
1. INTRODUCCION
La utilización del lenguaje VHDL [1] es aceptada desde
hace mucho tiempo para la utilización en el diseño,
simulación e implementación de hardware [2]. Sin
embargo, sigue siendo un problema a resolver la
optimización de distintos aspectos de los circuitos
diseñados a la hora de su implementación real. En este
contexto las herramientas de CAD (Computer Aided
Design) como Alliance [3] [4] [5] [6] [7] y Cadence [8]
son de gran utilidad no solamente para el ciclo completo
de desarrollo y verificación de hardware sino también
para el análisis de alternativas de optimización.
En este artículo se presenta un ejemplo
completo de la utilización combinada de VHDL y
herramientas de CAD para el diseño, verificación y
optimización de un circuito en particular. Más
específicamente, se propone resolver en hardware la
suma de números reales cuya representación sigue los
lineamientos de la norma IEEE para números de
precisión simple [9] [10] [11] [12]. El proceso de diseño
comenzará por la descripción de comportamiento del
1
normalizarla y luego se le suma el eventual acarreo
producido en el punto 7.
11. Redondear el número según lo indicado en la norma
IEEE 754.
2. DESCRIPCION DE LA ARQUITECTURA
Dado que el énfasis está puesto en la velocidad de
operación del circuito, se propuso realizar el mismo en
una serie de etapas (pipelined architecture) [14] aunque
en principio implica la utilización de mayor área de
silicio para su fabricación. Esto a su vez incrementa el
costo total del circuito a expensas de su mejor
rendimiento.
Los números de entrada del sumador se
consideran representados siguiendo los lineamientos de
la norma IEEE 754 de precisión simple. Aunque el
sumador opera con el cero, no se consideran, sin
embargo, las definiciones de NaN (Not a Number), y el
resto de los números con representación no normalizada.
Resumiendo, se manejan todos los números
normalizados más el cero de la definición de la norma
IEEE.
Si se consideran las entradas al sumador A y B
como A = (-1)X 1.a 2P y B = (-1)Y 1.b 2Q , donde X e Y
son los signos (1 bit), a y b son las fracciones (23 bits), y
P y Q los exponentes (8 bits), se puede calcular la suma
C = A + B = c 2R en los pasos:
1. Agregar el bit implícito de la fracción junto con los
bits de guarda a las mantisas a y b, obteniendo las
fracciones con las que se operará a’ y b’.
2. Calcular R = máx(P, Q), determinar la diferencia
T =⏐P - Q⏐, y determinar el mayor de los números
de entrada: Z (=0 si A < B; =1 en caso contrario).
3. Determinar el signo del resultado y la operación
binaria a realizar. El signo del resultado está
determinado por Z (el signo de la suma de los dos
números será el signo del número mayor). Para
determinar la operación binaria (suma o resta)
bastará con comparar los signos de los respectivos
números: X e Y.
4. Detectar los casos especiales en que debe manejarse
el cero: ambos números de entrada son cero o son
iguales y la operación a realizar es la resta.
5. Seleccionar la fracción (a’ o b’) que corresponde al
número menor.
6. Desplazar a la derecha la fracción asociada con el
número menor T lugares (bits) para igualar los
exponentes antes de sumar las fracciones.
7. Sumar las fracciones para producir la fracción de la
suma no normalizada c’. La operación puede dar un
bit de acarreo que se traduce en un incremento del
exponente del resultado, resultado conocido como
desborde de mantisa.
8. Determinar la cantidad u de ceros iniciales en la
fracción c’.
9. Desplazar c’ a la izquierda u lugares para producir
la fracción normalizada c”.
10. Modificar el exponente resultado restando los u
lugares que se desplazó la fracción para
Cada uno de estos pasos puede realizarse de distintas
maneras y la Figura 1 muestra esquemáticamente los
bloques funcionales que resuelven cada una de estas
tareas. Además, también se muestra cómo se agrupan los
bloques funcionales en un pipeline de cuatro etapas.
X
Y
A = (-1) X 1.a 2 P ; B = (-1) Y 1.b 2 Q
Q
a'
P
b'
ETAPA 1
PASOS 1 a 6
COM PARADOR
DETECTOR
DE CERO
X
Y
SELECTOR DE
FRACCION
Z
SIGNO
all_zero
R
Fracción
mín(A, B)
Otra Fracción
AddC
DESPLAZADOR
A DERECHA
T
SignOut
ETAPA 2
PASO 7
SUMADOR
SignOut
R
all_zero
Carry
c’
flip-flop
CONTADOR
DE CEROS
ETAPA 3
PASOS 8 y 9
c’
Clear
SignOut
DESPLAZADOR
A IZQUIERDA
R
c"
ETAPA 4
PASOS 10 y 11
RESTADOR
SignOut
Exponente
REDONDEO
DE FRACCION
Fracción
Figura 1: Sumador en Cuatro Etapas
3. DESCRIPCION DE LOS BLOQUES
En esta sección se describe el pipeline completo, con
todos los bloques funcionales que aparecen en la Figura
1. Esta descripción se lleva a cabo con las partes de
código más importante de VDHL y en algunos casos se
2
agregan esquemas gráficos para aclarar la descripción en
VHDL. De hecho, se puede notar que hacer la
descripción en VHDL provee una manera casi inmediata
de implementación, dado que se pueden utilizar sobre
este código las herramientas de síntesis que proveen los
entornos de CAD para circuitos integrados.
(SignOut). En la Figura 3 se puede observar la
simplicidad de la descripción de este bloque en VHDL.
La salida SignOut se propaga a través de todo el
pipeline hasta llegar a la última etapa, estableciendo de
esta manera el signo de la operación. La salida AddC se
utiliza en la siguiente etapa para saber si se suman o
restan las fracciones.
3.1. Etapa 1
3.1.3. Bloque Detector de Cero
Este bloque se encarga de detectar si el resultado puede
Quizás esta es la etapa que contiene mayor cantidad de
bloques funcionales y por lo tanto su descripción será la
más extensa de las cuatro propuestas.
architecture ARCH_sign_comp of sign_comp is
begin
3.1.1. Bloque de Comparación
Este bloque es el encargado de ubicar en el rango
adecuado los dos operandos, para poder realizar la suma
dentro del mismo rango, es decir bajo el mismo
exponente. Recibe como entradas a los exponentes y
fracciones de los correspondientes números a ser
sumados y tiene como salidas a R=máx(P,Q), T=⏐P-Q⏐
y Z. La Figura 2 muestra el comportamiento del bloque
en VHDL.
SignOut <= x when sel = '1' else y;
AddC <= '1' when x = y else '0';
end ARCH_sign_comp;
Figura 3: Bloque Signo.
dar cero. Para ello verifica que las entradas sean ambas
cero o iguales y de signo contrario. Las entradas de este
bloque son los dos operandos: A y B. En la Figura 4 se
muestra el diagrama esquemático de este bloque.
-- ## Celda Comparador ##
architecture ARCH_comparador of comparador is
a' P
signal dif_exp_aux: std_logic_vector(7 downto 0);
b'
A = ( - 1) X 1.a 2 P; B = ( - 1) Y 1.b 2 Q
Q
a’ b’
X Y
P
Q
begin
¿= 0?
out = 1
si a & P
=0
Z <= '0' when p < q else
'1' when p > q else
'0' when a < b else
'1';
¿= 0?
out = 1
si b & Q
=0
¿X ≠Y?
out = 1
si X ≠Y
¿a=b?
out = 1
si a=b
¿P=Q?
ou t = 1
si P=Q
dif_exp_aux <= (p – q) when z = '1' else (q - p);
R <= p when z = '1' else q;
T <= dif_exp_aux when (dif_exp_aux<32) else X"FF";
AND
AND
end ARCH_comparador;
=1 si A=( - B)
=1 si A=B=0
Figura 2: Bloque Comparador.
La señal R contiene el exponente en el cual se
realizará la operación, la señal T indica al bloque de
desplazamiento cuánto tiene que mover al dato para
poner en el rango adecuado una de las dos fracciones. La
señal Z se utiliza en el selector para indicar cuál de los
exponentes de los operandos se debe seleccionar, y en
caso de igualdad de exponentes selecciona la fracción
mayor. Esta última señal se utiliza además en dos
bloques externos, el bloque que se encarga de computar
el signo y el bloque selector de fracciones.
OR
all_zero = 0 si A=( - B) o A = B = 0
Figura 4: Esquema del Detector de Cero.
En la Figura 5 se muestra la implementación en
VHDL, donde se puede notar también la versatilidad del
lenguaje en cuanto a la creación y utilización de señales
intermedias o auxiliares. Estas señales intermedias son
utilizadas en este caso para la generación del valor
correcto para la señal de salida de este bloque, que es
única: all_zero.
3.1.2. Bloque de Signo
Las entradas que posee este bloque son los signos de los
operandos X e Y, y la señal Z que indica cuál de los dos
números (A o B) es el mayor (Z = 1 si A > B). Tiene
como salidas el tipo de operación a realizar con las
fracciones (AddC) y el signo de la operación de suma
3.1.4. Bloque Selector de Fracción
Este bloque funciona como si fuesen dos multiplexores
3
que se encargan de dirigir el flujo de datos de cada una
de las fracciones. Se utiliza la información que está
pipeline. Dentro de los circuitos combinacionales se
tienen dos tipos distintos de desplazadores, uno lineal
[15] y otro logarítmico [16]. El primero es más lento que
el logarítmico debido a la cantidad de compuertas en
paralelo que tiene conectadas pero su diseño y ruteo en
layout es más sencillo. Un posible esquema de
implementación del desplazador logarítmico se muestra
en la Figura 7, donde cada bloque representa un
multiplexor que es manejado por un bit de selección.
Architecture ARCH_zero_verif of zero_verification is
Signal
signal
signal
signal
signal
signal
a_info
: std_logic_vector(30 downto 0);
b_info
: std_logic_vector(30 downto 0);
zero_a
: std_logic;
zero_b
: std_logic;
eq_inputs
: std_logic;
all_inputs_zero : std_logic;
begin
-- creación de un solo vector para facilitar la
comp.
a_info
a_info
b_info
b_info
(22
(30
(22
(30
downto
downto
downto
downto
a
0
0) <= a;
23) <= p;
0) <= b;
23) <= q;
Shift
zero_a <= '1' when a_info=("000"&X"0000000") else
'0';
zero_b <= '1' when b_info=("000"&X"0000000") else
'0';
eq_inputs <= '1' when ((x/=y)and(a=b)and(q=p))else
'0';
all_inputs_zero <= '1' when (zero_a='1' and
zero_b='1') else '0';
all_zero <= '0' when (all_inputs_zero or eq_inputs)
else '1';
a
a
a ...
1
0
1
0
1
0
1
0
1
0
1
0
1
0
1
0
1
0
1
0
1
0
1
0
0
Shift
end ARCH_zero_verif;
0
Figura 5: Bloque Detector de Cero.
Shift
contenida en la señal “sel” que, de hecho, es la señal Z
producida en el bloque Comparador. Por la salida
denominada “mux_out1” saldrá la fracción que
corresponda al menor de los dos números. Por la otra
salida, “mux_out2” saldrá la fracción que corresponda al
número mayor. En la Figura 6 se muestra el código
VHDL que describe este bloque, donde además se puede
notar una vez más el poder de descripción de este
lenguaje.
Figura 7: Esquema del Desplazador.
La Figura 8 muestra de manera reducida (no
están las líneas de código que son similares a las
-- ## Celda Multiplexor ##
architecture ARCH_sft_der of sft_der is
architecture ARCH_multiplexor of multiplexor is
signal
signal
...
signal
signal
begin
mux_out1 <= a when sel = '0' else b;
mux_out2 <= b when sel = '0' else a;
stg1_a : std_logic_vector (30 downto 0);
stg1_b : std_logic_vector (30 downto 0);
stg5_a : std_logic_vector (30 downto 0);
stg5_b : std_logic_vector (30 downto 0);
begin
end ARCH_multiplexor;
-- etapa 1 del desplazador logarítmico
stg1_a <= fraction;
stg1_b(30) <= '0';
stg1_b(29 downto 0) <= fraction(30 downto 1);
stg2_a <= stg1_a when shft(0) = '0' else stg1_b;
Figura 6: Bloque Selector de Fracción.
3.1.5. Bloque Desplazador a Derecha
Este bloque debe ser rápido para no retrasar al pipeline,
es por ello que se optó por realizarlo en forma
combinacional y no con registros. Al utilizar registros se
necesitarían, en el peor de los casos, 31 pulsos de reloj
para poder desplazar a la fracción e igualar los
exponentes (debido a los bits de guarda junto con los
restantes bits de la fracción). Se tendría, por
consiguiente, una demora sustancial en esta etapa del
-- etapa2 2 a 4 del desplazador logarítmico
-- son similares ...
-- etapa 5 del desplazador logarítmico
stg5_b(30 downto 15) <= X"0000";
stg5_b(14 downto 0) <= stg5_a(30 downto 16);
fr_out <= stg5_a when shft(4) = '0' else stg5_b;
end ARCH_sft_der;
Figura 8: Bloque Desplazador a Derecha.
4
incluidas) la descripción en VHDL del bloque de
desplazamiento.
Nuevamente se dio prioridad al aumento en la
velocidad de operación (reducción de tiempo), por lo
que el desplazador implementado fue el logarítmico.
Este circuito combinacional consta de una serie de
etapas (5 en total) para poder desplazar a la entrada en
32 veces (25 ya que es logarítmico en base 2). La
primera etapa desplaza en 1, las segunda en 2, la tercera
en 4, la cuarta en 8 y la quinta en 16. Tomando
combinaciones de éstas se puede desplazar al dato de 0 a
31.
El gráfico de la Figura 10 muestra de manera
esquemática la operación de este bloque e indica cómo
es tenido en cuenta el caso de desborde de mantisa,
operando con una señal interna de carry para indicar el
desborde y poniendo el resultado de la operación en el
rango correcto. En el caso de ocurrir desborde, una señal
es enviada al restador de exponentes, ubicada en la
última etapa del pipeline, para indicarle que tiene que
ajustar el exponente por el desborde producido en la
operación parcial.
AddC
Bit extra
de carry
0
Bit extra
de carry
0
F_1
F_2
3.2. Etapa 2: Bloque de Suma o Resta de Fracciones
Frac_1
En esta etapa se resuelve efectivamente la operación
binaria a realizar. De hecho, además de la operación
binaria (que puede ser de suma o resta) se debe
calcular/generar la señal de carry o borrow de la
operación. Este bloque es de vital importancia ya que es
uno de los que más puede demorar al pipeline dado que
la propagación del carry es notoria para la suma o resta
de dos números de 31 bits. Por este motivo se eligió un
sumador (o restador) con carry look-ahead para acelerar
el cálculo del carry. Como contrapartida, lo que se
pierde es área de silicio ya que este tipo de sumador
ocupa más espacio. En el código de VHDL que se
observa en la Figura 9 no se puede determinar la manera
en que está implementado.
SUMA
RESTA
Frac_1 + Frac_2
Frac_1 - Frac_2
SELECTOR
Frac_1+Frac_2 si AddC=1
Frac_1-Frac_2 si AddC=0
A1
A2
architecture ARCH_frac_adder of frac_adder is
signal adder1
signal adder2
signal res_add
Frac_2
: std_logic_vector (31 downto 0);
: std_logic_vector (31 downto 0);
: std_logic_vector (31 downto 0);
SELECTOR
carry
c' = A2 si carry = 0
c’ = A1 si carry = 1
begin
adder1(31) <= '0';
adder1(30 downto 0) <= a;
adder2(31) <= '0';
adder2(30 downto 0) <= b;
res_add <= (adder1 + adder2) when AddC = '1' else
(adder1 - adder2);
carry <= res_add(31);
c’ <= res_add(30 downto 0) when carry = '0' else
res_add(31 downto 1);
Figura 10: Esquema del Sumador.
3.3. Etapa 3
Dentro de esta etapa, se tienen dos alternativas en cuanto
al resultado de la operación: se debe producir un cero a
la salida o se debe trabajar sobre el resultado binario de
la operación para producir el formato de punto flotante
tal como lo establece la norma. Producir un cero es
sencillo, pero para dar formato a la salida distinta de
cero se deben realizar varias operaciones que se
describen en los bloques a continuación.
end ARCH_frac_adder;
Figura 9: Bloque Sumador.
El entorno de diseño Alliance provee la
facilidad de especificar esto como una opción de una de
las herramientas de compilación/síntesis de código. En el
caso de trabajar con otro entorno de diseño, se podría
especificar directamente en VHDL el circuito
combinacional que corresponde. Este bloque opera con
una señal externa que se calcula en la unidad que
computa el signo de la operación, AddC, que le indica si
debe realizar una operación de suma o resta.
3.3.1. Bloque Contador de Ceros
Se basa en un circuito combinacional que determina la
cantidad u de ceros que hay al principio de la fracción.
Esta salida (u) es utilizada luego para desplazar la
fracción a izquierda. Su implementación es similar a la
5
de un priority encoder [17], o sea que este bloque recibe
como entrada un conjunto de 31 bits dentro de los cuales
se encuentra la fracción junto con los bits de guarda y se
fija en donde aparece el primer 1 lógico desde el bit más
significativo hasta el menos significativo codificando
dicha posición en forma binaria y dando este valor como
resultado del bloque. La Figura 11 muestra de manera
reducida (para no repetir líneas de código similares) la
descripción en VHDL del bloque que cuenta los ceros al
principio de la fracción de entrada.
velocidad produce un gasto mayor en área de silicio.
architecture ARCH_exp_sub of exp_sub is
signal carry_vector : std_logic_vector
(7 downto 0) := X"00";
begin
carry_vector(0) <= carry;
exponente <= r - u + carry_vector;
end ARCH_exp_sub;
Figura 12: Bloque de Recálculo de Exponente.
3.3.2. Bloque Desplazador a Izquierda
Este bloque fue implementado igual que el desplazador a
derecha (en cuanto a la cantidad logarítmica de pasos de
desplazamiento). La única diferencia reside en que este
desplazamiento del dato de entrada a izquierda agrega,
además, ceros a la derecha.
3.4.2. Bloque de Redondeo de Fracción
Este bloque lleva a cabo la operación de redondeo según
indica la norma IEEE 754 [18]. Básicamente trabaja
sobre los los bits adicionales llamados bits de guarda.
Para realizar el redondeo se debe tomar la decisión de
sumar un bit al bit menos significativo de la mantisa del
resultado en caso que corresponda. La Figura 13 muestra
el código VHDL que describe este bloque.
architecture Arch_ZeroCounter of ZeroCounter is
signal zerovector : bit_vector(30 downto 0) :=
"000" & X"0000000";
begin
-- round_block
u <= X"1F" when (Mantisa(30 downto 0) =
zerovector(30 downto 0)) else
X"1E" when (Mantisa(30 downto 1) =
zerovector(30 downto 1)) else
…
X"02" when (Mantisa(30 downto 29) =
zerovector(30 downto 29)) else
X"01" when Mantisa(30) = zerovector(30) else
X"00";
end Arch_ZeroCounter;
architecture Arch_round_block of round_block is
begin
fraccion <= (c’’ + X"00000080") when
(c’’(6 downto 0) > "1000000")
else
c’’ when (c’’(6 downto 0) < "1000000")
else
c’’ when (fraction_N(7) = '0')
else
c’’ + X"00000080";
end Arch_round_block;
Figura 11: Bloque Contador de Ceros.
3.4. Etapa 4
Figura 13: Bloque de Redondeo de Fracción.
En esta etapa se realizan los últimos ajustes para
producir la salida correcta de la operación realizada en el
formato correcto. Dado que ya se han producido los
datos necesarios en los pasos anteriores, se opera por
separado sobre el exponente y sobre la mantisa del
resultado.
También en este bloque se puede apreciar la
potencia de expresión del lenguaje VHDL, en particular
con la posibilidad de dar distintas alternativas para la
asignación de los valores posibles de una señal.
4. SÍNTESIS DEL CIRCUITO
3.4.1. Bloque de Recálculo de Exponente
Este bloque realiza el ajuste del exponente una
vez que la fracción ya está normalizada. Recibe las
señales R, U y carry, y entrega como salida el exponente
normalizado del resultado. La señal R proviene del
comparador de la etapa 1, y la señal u del bloque que se
encarga de contar los ceros al principio del resultado de
la suma, las dos señales se restan para dar el exponente
correcto. Además, si ocurrió desborde de mantisa, la
señal carry indica que se debe ajustar nuevamente el
exponente. La Figura 12 muestra el código VHDL
correspondiente. Este bloque puede ser implementado
con carry look-ahead si se quiere ganar en velocidad,
pero esto va a depender de cómo sean las velocidades de
las otras etapas del pipeline, ya que usualmente más
Una vez finalizada la descripción del sumador, se
verifica su correcto funcionamiento vía simulación
lógica; luego, se sintetiza cada uno de los bloques que lo
componen para su posterior optimización. Aquí
normalmente surgen dos posturas bien definidas que
definen la relación costo – beneficio: el consumo de
“área” de silicio y tiempo de propagación (ejecución) de
cada bloque.
Para la etapa de síntesis se utilizan las
herramientas de CAD, en este caso las provistas por
Alliance. Para la optimización, este entorno utiliza un
algoritmo que construye una red lógica equivalente,
minimizando las expresiones (ecuaciones) en cada nodo
de la red. El resultado arrojado da una menor
6
profundidad de la red lógica. Luego para la función
lógica de cada nodo de la red, trata de encontrar en la
biblioteca que contiene la tecnología utilizada, un
conjunto de celdas que produce la misma ecuación
lógica de dicho nodo. Este proceso habitualmente es
llamado “standard cell mapping”. Por último, realiza el
cálculo del camino crítico, el reconexionado de las
compuertas para disminuir el “delay” y la capacidad,
agregando buffers entre ellas si fuere necesario. También
realiza el cálculo del área. Dentro de los diferentes
etapas para minimizar el tiempo de propagación o el área
de silicio, el algoritmo permite ajustar en forma
porcentual cuál de estos dos parámetros se requiere
optimizar en mayor medida.
En la Tabla 1 se muestra un resumen de los
tiempos de propagación de cada bloque con el área de
silicio ocupada.
Etapa
Bloque
Tipo Tiempo
(ps)
bloques que pertenecen al camino crítico de propagación
de las señales. Sin embargo, la asociación de los bloques
de hardware a cada etapa de un pipeline no
necesariamente puede ser hecha por las herramientas de
síntesis, dado que en este caso, debería ser posible
especificar que se trata de un pipeline (algo que no es
posible, por ejemplo, en VHDL de manera explícita). De
alguna manera, la información de más “alto nivel” que
proporcionan las herramientas de síntesis es la
identificación de los bloques de hardware que
pertenecen al camino crítico de propagación de las
señales. Esta información de camino crítico se utiliza en
la Tabla 1 para calcular el tiempo total de operación de
cada etapa. Específicamente, el tiempo de cada etapa
estará dado por la suma de los tiempos de propagación
de los bloques del camino crítico dentro de la etapa. Esto
se diferencia del área necesaria para implementar cada
etapa, que será la suma de las áreas de todos los bloques
que pertenecen a la etapa.
Una vez que se tiene la información de síntesis
agrupada por etapas y con los tiempos de cada etapa
dados por los bloques del camino crítico, se puede
calcular el tiempo de operación del pipeline. En el caso
de la información de la Tabla 1, el tiempo está
determinado por la Etapa 2, que es la de mayor tiempo
de propagación: 11681 ps.
En vez de sintetizar y optimizar todo el circuito,
que es modo default de operación, también es posible
realizar síntesis y optimización local, manteniendo la
estructura de la descripción inicial (se mantienen la
mayoría de las señales intermedias). Esta forma de
optimización local es ideal para circuitos grandes como
pueden ser los sumadores y comparadores en este caso.
En la tabla anterior los resultados mostrados no tuvieron
en cuenta esta opción ya que el default del CAD es la
optimización global en la que se remueven la mayoría de
las señales intermedias de manera que las salidas se
expresan en términos de las entradas o de registros
internos.
Area
(λ2)
Etapa 1
Signo
506
4500
Comparador*
CLA1
5982 576500
2
Comparador
RCA
16947 303500
Detector de Cero
1923 136500
Selector de Frac.*
643 157750
Desplazador a Der.* 2366 306250
Registros*
882 565750
Total E1
CLA
9873 1747250
Etapa 2
Sumador*
CLA
10799 837000
Sumador
RCA
18228 471000
Registros*
882 325500
Total E2
CLA
11681 1162500
Etapa 3
Contador de Ceros*
2404 155750
Desplazador a Izq.*
2655 337750
Flip Flop Neg.
882
7750
Registros*
882 379750
Total E3
5941 881000
Etapa 4
Restador*
CLA
4855 383250
Restador
RCA
5047 543000
Redondeo de Frac.
RCA
2698 217250
Registros*
882 310000
Total E4
CLA
5737 910500
ps: picosegundo (10-12 seg).
* Camino Crítico
1
2
CLA: Carry LookAhead.
RCA: Ripple Carry Adder.
5. OPTIMIZACION DE SÍNTESIS
En una implementación del estilo pipeline es necesario,
en lo posible, que los tiempos de cada una de las etapas
sean similares. Analizando los datos de la Tabla 1, sería
necesario mejorar las Etapas 1 y 2 para acercarlas a los
tiempos de las Etapas 3 y 4. Para esto se puede hacer uso
de las herramientas de optimización y síntesis que se
mencionaron anteriormente, con la utilización de los
parámetros del algoritmo en forma “local” a estas etapas
(1 y 2), variando el costo de optimización entre área y
delay (en forma porcentual).
En el caso de la Etapa 1, se tienen varios
bloques a optimizar. Para evitar una cantidad muy
grande de posibilidades de optimización y de tiempo de
ejecución de las herramientas, se decidió optimizar el
Tabla 1: Tiempo y Area sin Optimizaciones de Síntesis.
La optimización realizada en este caso fue un
50% en área y un 50% en delay de todo el cirtuito. Esto
significa que las herramientas de optimización intentan
el mejor balance entre el área ocupada y el tiempo de
propagación de las señales en todo el pipeline. Este es el
modo de operación estándar (o default) a menos que se
indique explícitamente lo contrario.
Se debe notar que las herramientas de síntesis
de los entornos de CAD para circuitos integrados
proporcionan toda la información que aparece en la
Tabla 1 en cuanto a los bloques: el tiempo de
propagación de cada bloque, área de silicio estimada y
7
bloque dentro de esta etapa que tiene más de la mitad del
tiempo de operación total: el comparador. En el caso de
la Etapa 2 no hay posibilidades de elección, se debe
mejorar el sumador.
Se analizará primero el sumador de la Etapa 2
por ser el bloque de mayor tiempo absoluto de todo el
pipeline. La Figura 14 muestra gráficamente los
resultados de varias alternativas de optimización para el
bloque Sumador. Estas alternativas son paramétricas
para las herramientas de Alliance utilizadas para la
síntesis. Sobre el eje x se muestra el tiempo de operación
de cada alternativa, comenzando por el tiempo inicial de
la Tabla 1, es decir 10799 ps. Además, para cada una de
las alternativas de optimización se da una estimación de
la variación (aumento) del área de silicio ocupada en
forma porcentual respecto del total sobre el eje y. En el
caso del tiempo inicial no se tiene ninguna variación,
pero el mejor tiempo de operación del circuito obtenido
por optimización, 5801 ps, implica un aumento
aproximado de 16% del total del área del pipeline.
tiempos. En particular, optimizando solamente al bloque
sumador, la Etapa 1 pasaría a ser la de mayor tiempo de
todo el pipeline. Dado que se ha obtenido una mejora
más que significativa para la Etapa 2 se aplicarán las
opciones de optimización al bloque Comparador de la
Etapa 1 para mejorar su tiempo de operación.
La Figura 15 muestra gráficamente los
resultados de varias alternativas de optimización para el
bloque Comparador. A diferencia de lo que sucede en el
bloque Sumador, las opciones de optimización sobre el
bloque Comparador no son muy consistentes en cuanto a
la relación tiempo-área. Sin embargo, de notarse que las
variaciones de área son muy pequeñas: en el rango de
-0.2% a +0.3%. Esto significa que se puede optimizar el
tiempo de propagación casi con la misma área de silicio
(se debe recordar una vez más el carácter heurístico de
los algoritmos utilizados para la síntesis).
Comparador
3.0
Aumento de Area Total (%)
Sumador
20
Aumento de Area Total (%)
18
16
14
12
10
8
6
2.5
2.0
1.5
1.0
0.5
0.0
-0.5
5982
4
2
0
10799 9625
9270 9040 6329
T iempo (ps)
6064
5948
5473 5410 5408
T iempo (ps)
5106
4964
Figura 15: Optimización en Síntesis: Comparador.
5801
Otra de las características del bloque
Comparador que es esencialmente distinta del bloque
Sumador es que la optimización de tiempo es mucho
menor: poco más de 1000 ps, que representa una
ganancia de aproximadamente 17%. Sin embargo, desde
el punto de vista del área ocupada, esta ganancia del
17% se obtiene casi al mismo costo que el pipeline
original, dado que solamente se necesita poco más de
0.1% más de área total.
En resumen, aplicando las optimizaciones a los
dos bloques, Sumador y Comparador, se estaría en la
situación que describe la Tabla 2 en cuanto a tiempos de
operación de cada etapa. La mejora de los tiempos de
propagación de las etapas más lentas lleva a mejorar
significativamente el tiempo de operación del pipeline.
Una vez aplicadas las optimizaciones que se han
detallado y con los tiempos de las etapas que se
muestran en la Tabla 2, el tiempo de operación de todo
el pipeline está determinado por la Etapa 1: 8855 ps. En
Figura 14: Optimización en Síntesis: Sumador.
En general, se puede observar que a mayor
optimización de tiempo se tiene mayor área ocupada. La
excepción está dada en los dos últimos valores de
optimización: aunque el tiempo de operación se reduce
de 6064 ps a 5801 ps el área ocupada también se reduce.
Esto da una idea de las características heurísticas de los
algoritmos de optimización y su combinación con los
algoritmos (también heurísticos) de ubicación de celdas
y ruteo de señales. Por otro lado, aunque el área total del
circuito aumenta, la ganancia en tiempo total de
operación del pipeline puede ser de casi 5000 ps
(10799-5801 = 4988 ps). Evidentemente en este bloque
en particular la ganancia de tiempo es cercana al 50%
(utilizando solamente 16% más de área), pero no se
conoce aún la ganancia exacta de todo el pipeline porque
se deben tener en cuenta todas las etapas y su relación de
8
términos de mejora porcentual, la ganancia ha sido
significativa: de 11681 ps a 8855 ps, es decir un poco
más del 24% de mejora. Y esto utilizando poco más de
16% de área para todo el circuito.
Etapa
Etapa
Etapa
Etapa
Etapa
Tiempo (ps)
1
2
3
4
8855
6683
5941
5737
50% del tiempo de propagación no puede ser
optimizado más de manera significativa.
Sin embargo, es de esperar que haya alguna forma de
mejorar los tiempos de operación del pipeline dado que
la Etapa 1 tiene un tiempo bastante mayor de operación
que el resto de las etapas.
Una posible solución, que es bastante inmediata
en el contexto de los pipelines: subdividir la etapa mayor
para obtener dos etapas nuevas, ambas de menor tiempo.
En este caso, la información de la Tabla 1 respecto de
los bloques que pertenecen al camino crítico puede ser
de gran ayuda: el bloque de comparación se incluye en la
nueva Etapa 1 y el resto de los bloques se consideran
parte de la nueva Etapa 2. Las demás etapas solamente
se renumeran.
El rediseño del pipeline, aunque elegante, tiene
costos asociados. Como mínimo en términos de área, se
deben agregar los registros intermedios entre las nuevas
Etapas 1 y 2. Sin embargo, la ganancia en tiempo por el
rediseño es importante: la nueva Etapa 1 tendría tiempo
de operación de 4964 ps (Comparador con su
correspondiente optimización en síntesis) más 882 ps de
los nuevos flip flops. En total: 5886 ps, valor muy
similar al de las últimas dos etapas. La nueva Etapa 2 no
tendría un impacto significativo en los tiempos de
propagación, ya que sumaría: 643 ps (Selector de
Fracción) más 2366 ps (Desplazador a Derecha) más
882 ps (Registros) lo cual implica, en total, 3891 ps.
Ahora el tiempo de operación del pipeline estaría
determinado por la nueva Etapa 3 (que contiene el
Sumador) y sería de 6683 ps (Tabla 2). Se debe notar
que la mayoría del trabajo realizado en la optimización
de síntesis sigue siendo útil: los tiempos que se
obtuvieron antes (los detallados en la sección anterior,
en este caso) se reutilizan y no es necesario recalcular
nuevos. Es de esperar que esto se mantenga siempre y
cuando el rediseño mantenga la mayoría de los bloques
funcionales como en este caso.
Otro de los costos asociados al rediseño
(subdividiendo una etapa en dos nuevas) que no es tan
inmediato: ahora el tiempo de llenado y de vaciado del
pipeline no es el mismo, dado que se tiene una etapa
más. Por lo tanto sería mayor, por ejemplo, el costo de
que el pipeline entre “en régimen” y se obtengan los
primeros resultados. Es importante que a nivel de
rediseño en VHDL, el costo es mínimo por la potencia
misma del lenguaje de descripción.
Area (λ2)
1161250
3512250
881000
910500
Tabla 2: Tiempo y Área Con Optimizaciones de Síntesis.
Otro resultado de interés que está relacionado
con el área de silicio utilizada es la cantidad de
transistores que posee el core. El CAD de diseño posee
herramientas para extraer el mapa de transistores del
circuito total y de cada bloque por separado. La cantidad
utilizada fue alrededor de 24000 y en la Figura 16 se
muestra el ASIC del sumador de punto flotante.
Figura 16: ASIC del Sumador.
6. OPTIMIZACION POR REDISEÑO
Aunque la mejora obtenida en cuanto a optimización
desde los resultados de síntesis de la Tabla 1 ha sido
significativa, aún quedan posibilidades de optimización.
Lo inmediato sería seguir aplicando alternativas de
optimización disponibles en las herramientas de síntesis
como se ha mostrado en la sección anterior. Sin
embargo, es de esperar que estas optimizaciones no
aporten muchas mejoras significativas porque:
• La Etapa 1 es la que ahora (Tabla 2) determina el
tiempo de operación del pipeline.
• La Etapa 1 ya ha sido parcialmente optimizada. En
particular, el bloque de la Etapa 1 que tiene más del
7. CONCLUSIONES Y TRABAJO FUTURO
Se ha presentado un sumador de números representados
en punto flotante siguiendo la norma definida por IEEE.
La potencia de VHDL permite una rápida especificación
y simulación del circuito, con lo cual se puede pensar
más rápidamente en la optimización del mismo. Las
optimizaciones hechas a nivel de las herramientas de
9
[4] Kai-shing Lam, Frederic Ak, “Alliance Tutorial, Part 2
Logic Synthesis”, Pierre & Marie Curie University, France, pp.
14-18, 2004. Included in the Alliance distribution available at:
http://www-asim.lip6.fr/pub/alliance/distribution/latest/
síntesis pueden ser muy útiles. En el caso de este artículo
se obtiene una mejora de más de 24% de tiempo de
operación con poco más de 16% más de área de silicio
necesaria para la implementación.
Aunque son útiles y necesarias, las
herramientas de síntesis y optimización tienen un límite.
En el caso presentado, si se necesita optimizar mucho
más del 24% de tiempo de operación se debe recurrir
necesariamente al rediseño del circuito o de partes del
mismo. Nuevamente la potencia de VHDL simplifica en
gran medida esta tarea. Por otro lado, las herramientas
incluidas en los CAD para circuitos integrados no
necesariamente proveen los resultados en la forma
necesaria para una correcta evaluación. En el caso del
sumador, el entorno de CAD no identifica más que
bloques de hardware y por lo tanto debe reorganizarse la
salida de las herramientas para identificar claramente las
etapas del pipeline en cuanto a bloques que contienen y
cuáles bloques dentro de cada etapa son importantes en
cuanto a su pertenencia al camino crítico de propagación
de las señales.
En términos de la continuidad de las tareas de
diseño, el paso inmediato sería la definición de un
sumador que cumple la norma IEEE de punto flotante de
simple y doble precisión. Esto implica, por ejemplo,
incluir el manejo de NaN y números no normalizados.
En cuanto a la implementación se debería elegir una
tecnología definitiva, y esto puede significar un posible
cambio a otra herramienta de CAD como Cadence.
Desde el punto de vista de las alternativas de mejorar los
tiempos de diseño, es importante considerar la
paralelización de la simulación de código VHDL. Esto
permitiría definir un conjunto de casos de pruebas mayor
y por lo tanto aumentaría también la confiabilidad del
diseño en VHDL. Otra de las tareas que ha demostrado
que consume mucho tiempo es la de optimización vía las
herramientas de síntesis. En particular, las heurísticas
consumen mucho tiempo de ejecución, principalmente
sobre los bloques de hardware más complejos. Sin
embargo, en este caso se estarían modificando las
herramientas mismas del CAD.
[5] Kai-shing Lam, Frederic Ak, “Alliance Tutorial, Part 3
Place and Route”, Pierre & Marie Curie University, France, pp.
2-7, 2004. Included in the Alliance distribution available at:
http://www-asim.lip6.fr/pub/alliance/distribution/latest/
[6] Greiner A., F. Pêcheux, “ALLIANCE . A Complete Set of
CAD Tools for Teaching VLSI Design”, Proceedings of the
Third Eurochip Workshop on VLSI Design Training, pp. 23037, Grenoble, France, Sept. 1992.
[7] Équipe Architecture des Systèmes et Micro-Électronique,
Alliance: A Complete CAD System for VLSI Design, LIP 6,
Université Pierre et Marie Courie, France.
http://www-asim.lip6.fr/pub/alliance/distribution/latest/
[8] Virginia Polytechnic Institute and State University,
“Cadence tutorial for VLSI Design”, January 25, 2003.
http://www.ee.vt.edu/~ha/cadtools/cadence/cadence.html
[9] ANSI/IEEE Std 754-1985, “IEEE Standard for Binary
Floating-Point Arithmetic”, The Institute of Electrical and
Electrionics Engineers, pp. 3-13, 1985.
[10] Seidel P-M., Even G., “On the Design of Fast IEEE
Floating Point Adders”, 15th IEEE Symposium on Computer
Arithmetic, p. 184, June 11 - 13, 2001, Vail, Colorado.
[11] Koren I., Computer Arithmetic Algorithms, 2nd. Edition,
A. K. Peters, Natik, MA, 2002, ISBN 1-56881-160-8.
[12] Jain S. A., Low Power Single-Precision IEEE Floating
Point Unit, Master of Engineering, MIT, May 2003.
[13]
SXLIB
Standard
Cell
Library
Description.
http://www.vlsitechnology.org/html/sx_description.html
[14] Kai Hwang, Advanced Computer Architecture:
Parallelism, Scalability, Programmability. McGraw-Hill
Science/Engineering/Math, Dec. 1992, ISBN: 0070316228
[15] Neil Weste, Kamran Eshraghian, Principles of CMOS
VLSI Design, Addison-Wesley Publishing Company, USA,
1985.
8. REFERENCIAS
[1] IEEE Standard VHDL Language Reference Manual, Std.
1076-1993, IEEE, NY, 1993.
[16] Jan M. Rabaey, Anantha Chandrakasan, and Borivoje
Nikolic, Digital Integrated Circuits - A Design Perspective,
Second Edition, Prentice Hall, ©2003, ISBN 0-13-090996-3.
[2] J. Bhasker, A VHDL Primer, Prentice Hall PTR, Upper
Saddle River NJ 07458, 1995.
[17] John F. Wakerly, Diseño Digital Principios y Practicas,
Prentice Hall Hispanoamericana, 53500 Naucalpan de Juárez –
México, 1992.
[3] Kai-shing Lam, Frederic Ak, “Alliance Tutorial, Part 1
VHDL Modeling and Simulation”, Pierre & Marie Curie
University, France, pp. 2-16, 2004. Alliance distribution:
http://www-asim.lip6.fr/pub/alliance/distribution/latest
[18] William Stallings, Organización y Arquitectura de
Computadores, Prentice Hall, Madrid, 1997.
10
Descargar