Estoy trabajando en una CPU MIPS para un FPGA, este es principalmente un proyecto personal para entender los FPGA.
Tengo una implementación de CPU de tubería de 5 etapas que funciona correctamente cuando se ejecuta en iSim, sin embargo, cuando la ejecuto directamente en el hardware (Spartan 6) obtengo un resultado diferente.
El programa de prueba que tengo es simple:
load 0x128 into reg[1]
nop*
load 0x160 into reg[2]
nop*
add reg[1] to reg[2]
assert "finished" flag
cuando ejecuto esto en iSim, obtengo el resultado correcto en reg [2] (0x288), sin embargo, cuando ejecuto el programa en el FPGA obtengo el resultado 0x3b0 - parece que la instrucción final está ejecutando múltiples momentos
Las instrucciones nop
están presentes para forzar una falla de caché durante la ejecución, y esto es lo que causa el problema, sin el resultado es correcto.
Lo que creo que está sucediendo es que afirmo un indicador de "bloqueo" en el borde positivo del ciclo del reloj, y otra cosa que se ejecuta en el borde positivo se basa en la presencia / ausencia de este indicador. iSim por casualidad se ejecuta correctamente (debido al orden arbitrario en el que ejecuta la simulación de bloques siempre), sin embargo, el FPGA falla ya que el cambio de bloqueo no está disponible hasta el borde negativo.
Ya he rastreado mi implementación de verilog para encontrar dónde está, y todavía estoy buscando. Mi pregunta es: ¿cómo puedo obligar a iSim a exponer este error?