relacionado con el tema testing, en mi proyecto de HRMCPU, yo hice un sistema para lanzar pruebas unitarias (de instrucciones) y probarlas tanto en simulaciones, como contra el hw real. os cuento como parentesis, por si os puede interesar (aunque no tengo claro si es parecido a eso o no, y perdonad por el off-topic si lo es).
en mi caso, cuando hage el make, genero el bitstream que incluye un programa (rom). En el circuito ya tengo tambien una UART, para poder enviar y recibir datos para que la CPU ejecute el programa y procese esos datos. (esta CPU exotica procesa datos en una FIFO de entrada y los deja en una fifo de salida. ambas FIFOs estan conectadas a UART RX/TX respectivamente).
Lo que he hecho, es un sistema de testing, basado en carpetas, cada carpeta es un test, contiene un programa (que se asembla durante el test), un conjunto de datos de input (los genere de manera aleatoria), y un conjunto de datos esperados.
El test "echo" por ejemplo, seria:
El programa que queremos probar es:
init:
INBOX
OUTBOX
JUMP init
por ejemplo si el input (fichero
test00.in) es:
01
02
la salida esperada (fichero test00.out) es tambien:
01
02
Al ejecutar el test, mi script ensambla el programa, genera la rom, genera el bitstream (con la rom embebida en bram), programa la FPGA y le envia el input por Serial, y recupera la salida. Despues compara ambas. Si esta bien, pasa al sigiente conjunto de input/output esperado (y cuando los acabe, al siguiente test/programa).
Los tests que tengo no son unitarios como tal creo (no soy un experto de testing ni desarrollo), son varios programitas que pruebas varias instrucciones, pero lo cierto que el valor que me ha aportado tener eso ha sido ENORME!!
Como decia, puedo lanzar tests "software" : solo se lanza por simulacion con iverilog, y genera waveforms gtkwave, son los que mas uso, de hecho son los que lanzo en "integracion continua" (en Travis-CI). . Esa modalidad de test hw tambien es muy util y la uso cuando los tests sw pasan. (si fallan los tests sw me centro en encontrar primero donde puede estar ese fallo en la simulacion).
Como apunte, al final cuando ejecutaba los tests hw, se perdia mucho tiempo en mi caso, por 2 cosa:
- Para cada rom (programa) diferente resintetizaba todo el bitstream.: Para eso encontre que se puede cambiar solo la rom dentro del bitstream (con icebram)
- Para probar otro input/output diferente, reprogramaba la FPGA lo que tardaba mucho. Al final consegui una manera para ver que era el mismo bitstream y no reflashearlo, y solo reseteo la FPGA (lo que es mucho mas rapido, con
iceprog -t )