Encontré que básicamente hay cuatro opciones:
- Incluya la CPU (NIOS-II) en la simulación.
- Utilice un diseño de CPU de "núcleo abierto" existente.
- Utilice un "modelo funcional de bus" (BFM).
- Crear mi propia CPU simulable y una interfaz de bus maestro.
Terminé usando la opción 4.
El problema con la opción 1 es que la CPU completa es compleja y simula lentamente. En los chips que tienen CPU "hard core", un modelo de simulación puede no estar disponible en absoluto. La ventaja es que le permite usar las mismas herramientas de software para escribir sus pruebas que se usarán para el código de la aplicación.
La opción 2 soluciona el problema de no poder simular la CPU de la aplicación y, a menudo, tiene la ventaja de contar con herramientas de software de alto nivel, pero muchas de ellas son complejas (lentas) de simular, y con frecuencia tienen características arquitectónicas puede ser difícil trabajar alrededor Pueden o no venir con la interfaz de bus que necesita.
El problema con la opción 3 es que debe especificar explícitamente la actividad del bus ciclo por ciclo, sin capacidad para reaccionar a los datos que obtiene o cambiar el flujo de la prueba. La ventaja es que simula muy rápidamente.
En mi caso, realmente necesitaba ejecutar algoritmos que pudieran hacer un bucle y derivarse, por lo que se eliminó un BFM. Además, esto estaba en un chip Xilinx Zynq, por lo que la simulación de la CPU real estaba fuera de discusión. Consideré varios núcleos de CPU de "código abierto", pero parecían ser demasiado complejos para mis necesidades. Entonces, creé una CPU muy simple que tiene una ruta de datos de 32 bits y creé un módulo maestro de bus AXI (en mi caso) complementario para ello. Era algo que quería intentar hacer de todos modos por otras razones. Escribí mis pruebas utilizando un ensamblador que ya estaba usando para otros núcleos de CPU "blandos" personalizados.
Resulta que la CPU también es sintetizable, por lo que podría usarla la próxima vez que necesite una CPU que también pueda incrustar en un diseño. Y escribir un módulo maestro de bus diferente para, digamos, Avalon-MM no sería un gran problema. Arquitectónicamente, la CPU es similar a la minicomputadora PDP-11 y al microprocesador MSP430. Me aseguré de que tenga características básicas que faciliten la implementación de lenguajes de alto nivel, es decir, se podría escribir un back-end de GCC para ello.