Cómo funciona la simulación de VHDL

Kmila es un simulador de VHDL real, escrito desde cero en .NET 9. No traduce tu diseño a otra herramienta ni depende de una FPGA: interpreta el lenguaje y reproduce, tick a tick, cómo se comportarían las señales de un circuito digital en el tiempo. Esta página explica el modelo de ejecución que hay detrás del botón Run.

Las cuatro etapas del motor

Del texto a la forma de onda, el diseño atraviesa cuatro etapas. Cada una toma la salida de la anterior y la refina hasta obtener un modelo ejecutable.

flowchart LR
    A["1. Análisis<br/>(parsing)"] --> B["2. Elaboración<br/>(elaboration)"]
    B --> C["3. Simulación<br/>(delta cycles)"]
    C --> D["4. Salida<br/>(VCD / CSV / ondas)"]

1. Análisis (parsing)

El tokenizador lee el VHDL, elimina comentarios y clasifica cada elemento (palabras clave, identificadores, operadores, literales). El parser valida esa secuencia contra la gramática de VHDL y construye un árbol de sintaxis abstracta (AST): entidades, arquitecturas, paquetes, procesos y sentencias quedan representados como objetos en memoria. Si el código tiene un error, aquí se reporta con línea, columna y contexto.

2. Elaboración (elaboration)

El AST todavía no es ejecutable. En la elaboración se resuelven las entidades y arquitecturas, se instancian los componentes (port map / generic map), se enlazan los paquetes y las librerías IEEE (std_logic_1164, numeric_std, math_real) y se calcula el tamaño real de cada señal y vector. El resultado es un modelo jerárquico que el planificador puede recorrer.

3. Simulación (delta cycles)

Aquí vive el corazón del motor: un planificador dirigido por eventos que avanza el tiempo en ticks discretos y, dentro de cada instante de tiempo, en ciclos delta. Lo detallamos en las secciones siguientes.

4. Salida (output)

Cada transición de señal se registra en un historial (SignalHistory) que se convierte en formas de onda interactivas y se exporta a VCD (compatible con GTKWave), CSV o texto. En paralelo, un paso de síntesis independiente puede convertir el comportamiento en una netlist estructural para la vista de esquemático.

Simulación dirigida por eventos

Un circuito no se ejecuta línea por línea como un programa imperativo. VHDL describe hardware que reacciona a eventos: cuando una señal cambia de valor, los procesos que la observan se vuelven a evaluar. Kmila implementa exactamente ese modelo.

  • El tiempo avanza en ticks discretos. La fuente de tiempo (TimeMachine) define una resolución de 10 ns por tick (NS_PER_TICK = 10).
  • Los relojes se modelan como señales que alternan su estado según su frecuencia (en MHz) al ritmo de los ticks.
  • Un proceso solo se reactiva cuando cambia una señal de su lista de sensibilidad.

Ciclos delta: el tiempo dentro del tiempo

El punto más sutil de la simulación de VHDL es que varias señales pueden cambiar «al mismo tiempo». Para resolverlo de forma determinista, VHDL introduce el ciclo delta: un paso infinitesimal que no consume tiempo simulado.

El planificador de Kmila usa un enfoque en dos fases dentro de cada instante:

  1. Evaluación. Todos los procesos activos calculan sus asignaciones, pero los nuevos valores aún no se aplican; quedan programados.
  2. Actualización. Se aplican todos los valores programados a la vez. Si alguna señal cambió, los procesos sensibles a ella se marcan para un nuevo ciclo delta.

Se repiten estos ciclos delta hasta que ningún valor cambia (el circuito se estabiliza); solo entonces el reloj avanza al siguiente tick. Un bucle combinacional que nunca se estabiliza se detiene con un límite máximo de ciclos delta, evitando que la simulación se cuelgue.

Señales frente a variables

Esta distinción es la base del comportamiento correcto de un diseño:

Aspecto Señal (signal) Variable (variable)
Actualización Diferida: al final del ciclo delta Inmediata: en cuanto se ejecuta la asignación
Operador <= :=
Ámbito Arquitectura o proceso Solo dentro de un proceso/subprograma
Modela Cables y registros Almacenamiento temporal de cálculo

Que las señales se actualicen de forma diferida es precisamente lo que hace posible el modelo de ciclos delta y lo que permite describir registros con rising_edge(clk).

Atributos de señal

Durante la simulación, Kmila rastrea los atributos que dependen del historial de cada señal: 'event (¿cambió en este delta?), 'last_value (valor anterior), 'stable y 'active. Sobre 'event se construyen las detecciones de flanco rising_edge y falling_edge, la forma idiomática de describir lógica secuencial síncrona.

De la simulación a la forma de onda

Todo lo que ocurre durante la simulación se guarda como una secuencia de transiciones (tick, señal, valor). Ese historial alimenta:

  • Formas de onda interactivas, con buses expandibles bit a bit y cursor de valores.
  • Exportación a VCD, que puedes abrir en GTKWave, o a CSV para análisis externo.
  • El runtime visual, donde los puertos se enlazan a LEDs, botones y displays.

Como el motor implementa el modelo real de VHDL, sus resultados se pueden verificar contra un simulador de referencia. Kmila lo hace de forma sistemática: consulta la metodología del benchmark para ver cómo se compara caso por caso contra GHDL.

Siguientes pasos