• No results found

La simulación detallada de un procesador síncrono, lejos de ser sencilla, se puede simplificar en cierta medida aprovechando la propia naturaleza síncrona del pro- cesador. La utilización de una señal de reloj global en el circuito implica que todos los componentes del sistema síncrono computan una vez por cada ciclo de reloj. Por tanto, siguiendo esta idea, el simulador puede implementar un bucle princi- pal donde la funcionalidad de cada una de las etapas del procesador se ejecute de manera secuencial una vez por cada iteración.

Este mecanismo es el empleado por la mayoría de los simuladores de sistemas síncronos. Sirva como ejemplo sim-outorder, parte del conocido SimpleScalar [ALE02]. En la Figura 4.1 se muestra un extracto del bucle principal de este simulador, donde se aprecia cómo se invoca secuencialmente a las funciones que modelan cada una de las etapas (commit, writeback, issue, dispatch, fetch), jus- to en el orden inverso al recorrido por las instrucciones. Si el simulador siguiese el mismo orden que las instrucciones la información que se envía de una etapa a la siguiente debería esperar al fin del bucle para su actualización, porque po- dría sobreescribir los datos anteriores. Sin embargo, con el enfoque de ejecución de funciones a la inversa se evita ese problema. Como se aprecia en la figura,

90 4.2. Modelado de un procesador superescalar asíncrono

/* main simulator loop, NOTE: the pipe stages are traverse

in reverse order to eliminate this/next state synchronization and relaxation problems */

for (;;) { ...

/* commit entries from RUU/LSQ to architected register file */ ruu_commit();

...

/* service result completions, also readies dependent ops */ ruu_writeback();

...

/* decode and dispatch new operations */ ruu_dispatch();

...

/* issue operations ready to execute from a previous cycle */ /* <== drains ready queue <-- ready ops commence execution */ ruu_issue();

...

/* call instruction fetch unit if it is not blocked */ if (!ruu_fetch_issue_delay) ruu_fetch();

else ruu_fetch_issue_delay--; ... /* go to next cycle */ sim_cycle++; ... } // for

Figura 4.1: Extracto del bucle principal en sim-outorder, simulador arqui- tectónico de SimpleScalar. Las etapas modeladas (marcadas en rojo) se simulan en orden inverso a la ejecución real.

4. Simulación arquitectónica de sistemas asíncronos 91 al final del bucle se pasa a simular el siguiente ciclo incrementando el contador denominado sim_cycle.

Un procesador asíncrono, por el contrario, no se rige por una señal global de reloj, sino que transmite datos entre sus componentes utilizando un protocolo de comunicación determinado. De este modo, cada componente del procesador trabaja de manera independiente. Al no existir un control centralizado, no se puede garantizar que cada componente del sistema ejecute tantas veces como lo hacen el resto. Más aún, el tiempo de cómputo de cada etapa puede ser distinto en función de los datos de entrada que reciba y, por lo tanto, distinto a la latencia de otros componentes del procesador. Una consecuencia directa de este hecho es la posibilidad de que una etapa finalice el cómputo de un dato e intente transmitir el resultado a otra etapa que no esté preparada para recibirlo. Si el receptor estuviera procesando una entrada previa, el dato a transmitir debería esperar, lo que significa que la etapa emisora tendría que retrasar la entrega de su salida. Por tanto, los instantes de tiempo en que cada componente del procesador inicia o finaliza un cómputo son desconocidos a priori y dependen tanto de los datos de entrada como del estado actual del sistema. Esta indeterminación en la tem- porización sumada a la variación en el tiempo de cómputo de cada etapa, hace que la simulación de un procesador asíncrono no se pueda tratar de una manera análoga a la de su equivalente síncrono.

En resumen, la simulación de un procesador asíncrono debe modelar correcta- mente la ejecución concurrente de los componentes del sistema, así como la co- municación que ocurre entre ellos. Por tanto, el simulador debe considerar los siguientes aspectos principales:

La temporización de cada elemento del procesador debe ser correctamente gestionada por el simulador. Los instantes de inicio y fin de cómputo deben ser determinados correctamente. En otras palabras, el simulador debe cal- cular dinámicamente las intervenciones de cada uno de los componentes del procesador a lo largo de la ejecución de las simulaciones teniendo en cuenta el estado del sistema.

92 4.2. Modelado de un procesador superescalar asíncrono modelada teniendo en consideración la ejecución concurrente de los compo- nentes del circuito.

La simulación debe respetar la ley de causa-efecto, de manera que una ope- ración sólo empezará cuando haya terminado la operación que la provocó. Debido a su especial naturaleza, los simuladores de procesadores síncronos no tienen en cuenta ninguno de estos aspectos, por lo que se hace necesaria la crea- ción de un nuevo simulador que cumpla con estos requisitos. En ese sentido, se propone un modelo para la simulación de un procesador superescalar asíncrono de 64 bits donde se desacopla el modelado de la funcionalidad del modelado de la temporización. En otras palabras, se distingue por un lado la ejecución de instrucciones en la microarquitectura y, por otro lado, se controlan los instantes de tiempo en que cada uno de sus componentes actúa. Esta separación permite definir distintos tipos de temporización para una misma microarquitectura, lo cual amplía significativamente las aplicaciones del simulador. Más adelante, en el apartado 4.4, se profundiza en los detalles de implementación.

Related documents