En este repo estoy aprendiendo Verilog e intentando armar un CPU single-cycle muy básico basado en la ISA de OrgaSmall.
- Icarus Verilog: simulador
- cocotb: testbench en python
- Yosys: síntesis
- GTKWave: visualizador de wavefiles
./scripts/setup: Buildea un container de Docker con todas las herramientas instaladas../scripts/shell: Abre un shell adentro del container conpwdmontado en/workspace.
./src/hdl/<module>.sv: Módulos en SystemVerilog../src/tests/test_<module>.py: Testbench para<module>../src/build/<module>/: Output de la simulación. El archivo interesante esdump.vcdque contiene el wavefile.
Para testear un módulo en particular:
make <module>Para testear todos los módulos:
makeEl testbench programs ensambla y ejecuta programas en el CPU simulado (make programs). En la carpeta src/tests/programs se encuentran algunos programas de ejemplo, y en src/tests/test_programs.py se puede ver cómo ensamblar los programas, ejecutarlos, y luego verificar el estado correcto del CPU.
Se podría extender esto para poder ejecutar programas arbitrarios "fuera" del entorno de testing. Técnicamente hablando igual se ejecuta dentro del entorno de testing, ya que usamos cocotb para orchestrar la simulación del CPU con iverilog, pero podríamos no hacer ningún assert, ocultar el output de cocotb, y al finalizar la ejecución imprimir un dump de los registros y memoria.
- Si quiero hacer un cpu single-cycle necesito si o si 2 memorias separadas (programa y datos), o una memoria dual port (2 lecturas simultáneas)?
- Se debería cargar la sección
.texten la memoria de instrucciones y la sección.dataen la memoria de datos? Sino las instrucciones nunca pueden acceder a datos definidos conDWen el programa. - Mantener el clock entre distintos test cases.
- Compartir configs como
WORD_SIZEy los opcodes entre verilog y python (DRY). - Tipos usados para los parámetros limitan las opciones de configuración?
- Mejorar el display de errores cuando se hace
makede todos los módulos (el output es muy largo, quizás debería frenar el make si falla algún módulo). - Para respetar la ISA de OrgaSmall el PC debería incrementar de a 2.
- El ensamblador interpreta al revés los operandos de
STR. Funciona así:STR RX, Mcon el efectoMem[M] <- RX. - El ensamblador no interpreta los
[](no hay que ponerlos).