Vamos a ver la generación de estímulos habituales necesarios en nuestros bancos de pruebas realizados con Verilog.
Generación de reloj
Nuestra primera opción es mediante un always
1 2 3 4 5 6 7 8 9 10 11 12 13 |
`timescale 1 ns / 100 ps; reg clk; parameter periodo = 10; // Periodo = 10ns always begin #(periodo/2); clk = 1’b0; #(periodo/2); clk = 1’b1; end |
Como puede observarse es fácil hacer este estímulo configurable con tan solo el cambio del valor del parámetro denominado «periodo».
Otra alternativa interesante es mediante un «initial» combinado con un «forever»
1 2 3 |
initial begin clk = 1'b0; forever #(periodo/2) clk = !clk; end |
Generación de reset
Para la generación del reset, la recomendación básica es:
Si nos centramos en el reset asíncrono, es muy importante tener en cuenta que la consideración aportada se refiere a:
» cómo le llegan esas señales a los flip-flops de mi diseño», con lo cual queremos decir que es muy posible que nuestros estímulos a nivel de puerto estén muy separados (por ejemplo medio ciclo) y sin embargo esas mismas señales, después de pasar por los árboles de distribución de la señal de reloj y de la señal de reset asíncrono, dichas señales sean percibidas por los flipflops prácticamente coincidentes y por tanto generando problemas de «removal» y de «recovery».
Veamos en el siguiente video como realizar esta generación del reset:
Generación de estímulo síncrono básico
Para empezar deberíamos considerar dos condicionantes fundamentales:
- El estímulo debe de ser adecuado para el funcionamiento del banco de pruebas para una simulación funcional (RTL) en la cual no hay retardos , y para una simulación Gate Level con retardos.
- Para una simulación RTL el mayor riesgo es una condición de carrera en el momento del flanco activo de reloj. Eso se produce cuando el estímulo cambia en el mismo instante y se desconoce por tanto que va a ser procesado en primer lugar por el simulador:
- Bien en primer lugar el cambio del estímulo y luego el cambio de reloj
- O bien primero el cambio de reloj y luego en segundo lugar el cambio del estímulo
- El problema a evitar en las simulaciones temporales es que esos estímulos , al llegar a los flipflops que los procesan (estamos hablando de los destinos de esos paths ), no respetemos los márgenes de activación y de retención .
- Para una simulación RTL el mayor riesgo es una condición de carrera en el momento del flanco activo de reloj. Eso se produce cuando el estímulo cambia en el mismo instante y se desconoce por tanto que va a ser procesado en primer lugar por el simulador:
Vamos a ver con el siguiente vídeo, como podemos acometer de forma rápida y sencilla unos estímulos síncronos que nos eviten problemas de temporización en simulaciones Gate Level o problemas de carrera en simulaciones funcionales.
Generación avanzada de estímulos
El término avanzado es muy sufrido y puede significar muchas cosas. Puesto que estamos hablando de simulación de diseños y no de su hermano mayor (verificación de diseños) , nos vamos a conformar en considerar avanzado una generación de estímulos que:
- Está encapsulada en tasks
- Que dichos tasks puedan ser fácilmente empaquetados para su reuso posterior
- Que dichos tasks no presenten problemas de llamadas reeentrantes paralelas
- y finalmente que dichos tasks no tenga que modificarlos para reusarlos
Para ver estos aspectos vamos a visualizar le siguiente vídeo