Metodología y resultados del benchmark

Un simulador solo es útil si se puede confiar en él. Por eso el motor de Kmila se verifica de forma sistemática y automática contra GHDL, el simulador de VHDL de código abierto que sirve de referencia en la industria y la academia. El resultado actual: 148 de 148 casos producen resultados idénticos, sin una sola discrepancia.

Qué es SimulatorBench

SimulatorBench es el banco de pruebas de precisión de Kmila. Para cada caso ejecuta el mismo problema en los dos simuladores y compara sus salidas muestra a muestra:

flowchart LR
    Spec["Especificación<br/>del problema"] --> Ref["reference/<br/>(VHDL + testbench<br/>de fuente pública)"]
    Spec --> Kmila["kmila.vhdl<br/>(implementación<br/>independiente)"]
    Ref --> GHDL["GHDL"]
    Kmila --> Engine["Motor de Kmila"]
    GHDL --> Golden["golden.vcd"]
    Engine --> Out["kmila.vcd"]
    Golden --> Diff["diff por puerto"]
    Out --> Diff
    Diff --> Result["PASS / FAIL"]
  • golden.vcd — la salida de GHDL, tomada como referencia dorada.
  • kmila.vcd — la salida del motor de Kmila para el mismo estímulo.
  • diff.json — la comparación de ambas trazas.

Cómo se compara

La comparación está diseñada para ser justa y significativa:

  • Solo puertos declarados. El banco compara únicamente los puertos out e inout declarados del diseño. Las señales internas y los relojes autogenerados se ignoran, porque son detalles de implementación, no comportamiento observable.
  • Estímulo idéntico. Cada caso define un problema con sus puertos, su estímulo y su duración. Si un caso no puede reducirse a una tabla de estímulos (t, puerto, valor), se marca con un skipReason explícito en lugar de fabricar un testbench sustituto.
  • Muestra a muestra. No se compara un resumen: se contrastan los valores de cada puerto a lo largo de miles de muestras de señal.

La restricción de honestidad

El aspecto más importante de la metodología es cómo se escriben los casos. Los archivos de referencia provienen de fuentes públicas y se registra su origen (sourceUrl) y su licencia. La implementación propia de Kmila (kmila.vhdl) se escribe a partir de la especificación del problema, nunca leyendo el VHDL de referencia.

Esto evita que las dos implementaciones «se parezcan» por copia y hace que la coincidencia de sus salidas sea una señal real de equivalencia del motor, no un artefacto del método.

Resultados y evolución

El corpus ha crecido junto con la cobertura del motor. A lo largo de la vida del banco se han corregido alrededor de 26 errores acumulados del simulador gracias a estas comparaciones.

Fecha Casos Resultado
2026-06-24 119 / 119 100 %, 0 omitidos
2026-07-28 136 / 136 100 %, 0 omitidos
2026-08-03 148 / 148 100 %, 0 omitidos

Los casos más recientes ejercitan construcciones exigentes: cadenas de alias concurrentes multi-salto, acceso a elementos de arreglos constantes por índice dinámico y literal, agregados con asociación por nombre, resolución de ramas case, expansión de (others => '0') en la construcción de la señal y dentro de ramas de reset con reloj, la regla de ancho de unsigned * unsigned de numeric_std, escrituras con lado izquierdo indexado dentro de procesos, instanciación directa de entidades, y el inlining correcto de cuerpos de función y procedimiento con variables locales y retorno anticipado.

Cómo reproducirlo

El banco es una herramienta de línea de comandos que verifica que tanto GHDL como la API de Kmila estén disponibles, descubre los casos y los ejecuta:

dotnet run -- verify   # comprueba que GHDL y la API de Kmila responden
dotnet run -- list     # lista los casos descubiertos
dotnet run -- run      # ejecuta todo el corpus

Cómo leer el resultado

148/148 significa que, en cada caso del corpus, la salida de Kmila coincide con la de GHDL en todos los puertos observables y en todas las muestras. Es una medida de equivalencia de comportamiento sobre el corpus, no una afirmación de que Kmila implemente todo el estándar VHDL: la cobertura crece a medida que se añaden casos. Para saber qué construcciones soporta el motor, consulta Características soportadas.