Verificación de CPU suave

18

Actualmente estoy diseñando una CPU simple en VHDL con Xilinx ISE e ISIM. La parte del diseño va muy bien, pero parece que no puedo encontrar una manera de hacer la verificación de manera consistente.

Ahora mismo tengo un banco de pruebas VHDL que actualizo para probar la función en la que estoy trabajando en cualquier momento en particular. Esto es muy ad-hoc, y no me ayuda a capturar regresiones y no se puede usar para verificar el cumplimiento con el conjunto de especificaciones / instrucciones.

He pensado en desarrollar un conjunto de pruebas extenso, pero el problema es que el estado potencial de una parte de propósito general como CPU es enorme en comparación con los componentes menos genéricos.

Estoy buscando un método que me permita realizar el diseño y las pruebas de una manera más controlada. Algún tipo de "hardware TDD" si lo desea. ¿Existe tal cosa? ¿Se puede aplicar con relativa facilidad a partes de propósito general como una CPU?

    
pregunta drxzcl

1 respuesta

16

Todo el problema de la verificación de la CPU es muy grande y difícil. Hay personas que hacen una carrera solo con esto. Solo te daré la descripción ...

  1. Escriba un programa de lenguaje ensamblador que pruebe cada instrucción y cada pequeño detalle de cada instrucción. Por ejemplo, al probar la instrucción ADD, puede probarlo con números que sean positivos, negativos y uno de cada uno (dos veces). Luego probaría la bandera de acarreo, la bandera de cero, etc. Otras características especiales de la CPU (como la predicción de rama, etc.) tendrían su propia parte especial de esta prueba.

  2. Escriba, usando C / C ++ o algo así, un modelo de su CPU. Esta es tu CPU virtual. Esta es también su "CPU dorada", lo que significa que esta es la CPU con la que se compara todo lo demás. Idealmente, la persona que escribió la VHDL es NO la misma persona que escribe el modelo C / C ++.

  3. Escriba / cree un sistema donde pueda ejecutar el modelo C / C ++ y el modelo VHDL lado a lado, y compare los resultados ciclo por ciclo. Ejecute su programa de ensamblaje desde el Paso 1 y asegúrese de que los dos modelos coincidan.

  4. Ejecute sus dos modelos en "instrucciones" aleatorias. Básicamente, rellene "ram" con datos aleatorios y ejecute esos datos aleatorios como si fueran instrucciones reales. Ejecute los mismos datos aleatorios en los modelos VHDL y C / C ++ y compare los resultados. Este modelo de C / C ++ se ejecutaría en algunas estaciones de trabajo y / o servidores (no en la nueva CPU).

  5. Configure una máquina, o varias máquinas, para repetir el paso 4 esencialmente para siempre. Incluso si su CPU está "terminada" y ha estado en producción durante un año o más, seguirá ejecutando esta prueba.

  6. Repita estos pasos cada vez que haya más cosas para simular. Por ejemplo, lo ejecutaría en el VHDL posterior a la ruta con el tiempo cuando esté disponible.

No hay garantía de que la comparación de las versiones VHDL y C / C ++ detecte todos los errores, pero realmente no hay una mejor manera. Y probar la CPU en instrucciones aleatorias lleva tiempo, pero eso también es muy útil. La única alternativa real a esto es contratar a mucha gente que simplemente escriba código todo el día para probar diferentes partes de la CPU, y las compañías más grandes hacen esto, pero también hacen cosas de datos aleatorios.

Para una sola persona que escribe un código VHDL, por lo general es solo el paso # 1 que se realiza. Pero si va a vender la CPU, al menos algunos de los otros pasos deberían realizarse (y, en realidad, debería hacerlos todos).

    
respondido por el user3624

Lea otras preguntas en las etiquetas