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
outeinoutdeclarados 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 unskipReasonexplí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.