Volver al inicio

Cosimulación de Icarus Verilog y NGSpice: comparación de arquitecturas

El artículo analiza dos arquitecturas de puentes para cosimulación de Icarus Verilog y NGSpice. Se consideran las limitaciones fundamentales de cada enfoque y recomendaciones para aplicación en proyectos reales. La herramienta ya se usa para verificación de circuitos mixtos.

¿Cómo funciona el puente entre Icarus Verilog y NGSpice para cosimulación?
Advertisement 728x90

# Co-simulación de circuitos digitales y analógicos: Dos enfoques para el puente entre Icarus Verilog y NGSpice

Los sistemas electrónicos modernos requieren la integración de componentes digitales y analógicos, lo que hace que la simulación de señales mixtas sea crítica. Para abordar este desafío, implementamos un puente entre Icarus Verilog y NGSpice desarrollando dos arquitecturas. Cada una tiene limitaciones fundamentales, pero ya permiten resolver tareas del mundo real, desde ADC de SAR hasta moduladores sigma-delta.

Fundamentos de la Simulación de Señales Mixtas: Eventos vs. Continuidad

Los circuitos digitales se modelan mediante eventos: el simulador solo se activa ante cambios de señal (flancos de reloj, conmutaciones de flip-flops). Así funcionan Icarus Verilog y otros simuladores digitales: el sistema "duerme" entre eventos, garantizando un alto rendimiento. Los circuitos analógicos requieren un modelado continuo: los motores SPICE (NGSpice, Spectre) dividen el tiempo en pasos pequeños, resolviendo ecuaciones diferenciales para cada intervalo. Este enfoque es preciso pero consume muchos recursos, especialmente con flancos pronunciados o bucles de retroalimentación.

El desafío clave en la co-simulación es reconciliar estos paradigmas fundamentalmente diferentes. El simulador digital maneja eventos discretos, mientras que el analógico necesita un flujo temporal suave. Al combinar un ADC de SAR (donde un comparador analógico interactúa con lógica digital), surge un dilema: ¿cómo pasar datos entre motores sin perder eventos críticos?

Google AdInline article slot

Arquitectura del Puente: Principios Comunes

Ambas implementaciones usan las mismas tecnologías principales:

  • VPI (Verilog Procedural Interface) para interactuar con Icarus
  • La biblioteca dinámica libngspice.so
  • Un mecanismo de streaming con semáforos
  • Un hilo de ejecución separado para NGSpice

El elemento central es la tarea del sistema $spice_sync(), llamada en los flancos de señal de reloj. Realiza un ciclo completo de intercambio: pasa valores digitales a SPICE mediante comandos alter, consulta voltajes analógicos y actualiza variables reales en Verilog. Esto permite mostrar señales analógicas en GTKWave en la misma línea temporal que las digitales.

always @(posedge clk_fast) begin
    $spice_sync();
    if (tb.Vcmp > vref_th) begin
        // Reaction to event
        ...
    end
end

El mecanismo expose_analog_N sincroniza automáticamente variables analógicas, haciéndolas accesibles para la lógica digital. Objetos wrapper en ambos lados del puente manejan flancos y retardos.

Google AdInline article slot

Enfoque Clásico: Sondeo Sincrónico

En esta implementación, Verilog inicia el intercambio en cada llamada a $spice_sync(). El simulador registra el tiempo actual, bloquea en un semáforo, pasa el control a NGSpice, que simula hasta ese punto y devuelve los datos.

Ventajas:

  • Determinismo total
  • Rendimiento predecible
  • Implementación simple (unas 2000 líneas de código)

Limitaciones Críticas:

Google AdInline article slot
  • Invisibilidad completa de eventos analógicos entre flancos de reloj. Por ejemplo, si un comparador conmuta a los 5,2 ns y el siguiente reloj está a los 10,0 ns, la lógica digital no detectará el cambio durante 4,8 ns, haciendo imposibles bucles de retroalimentación en ADC de SAR o convertidores DC-DC.
  • Sobremuestreo forzado: para capturar eventos rápidos, hay que aumentar artificialmente la frecuencia del reloj (p. ej., a 500 MHz), lo que perjudica el rendimiento.

Este enfoque solo funciona para tareas donde los eventos analógicos coinciden con flancos de reloj o con un reloj de alta frecuencia para sincronización.

Enfoque Alternativo: Análisis de Anticipo

Para superar las limitaciones del método clásico, implementamos un mecanismo de anticipo. NGSpice recibe permiso para "avanzar" un intervalo establecido, rastreando eventos analógicos mediante sensores configurables. Ejemplo de regla en mixed_bridge.cfg:

analog_event_0 = threshold outp rising 1.2 | time_var=tb.analog_event_time id_var=tb.analog_event_id

Cuando se activa la condición, SPICE pausa y genera un evento en Verilog mediante el callback cbAfterDelay.

Ventajas:

  • Capacidad para detectar eventos analógicos asincrónicos
  • Flexibilidad configurable (umbrales, duraciones, condiciones de energía)
  • Carga reducida con relojes poco frecuentes

Desventajas Fundamentales:

  • Eventos perdidos entre pasos de SPICE debido a la integración temporal discreta
  • Violaciones de causalidad: los comandos alter (cambios de señal digital) se aplican solo en la siguiente fase de simulación, lo que es crítico para DAC
  • Límite de un evento por ventana de análisis
  • No determinismo por heurísticas en la elección de la longitud del intervalo de anticipo
  • Complejidad de implementación (más de 3500 líneas de código + analizador de configuración)

Diferencias Clave Comparadas

Los principales compromisos entre arquitecturas se manifiestan en cinco aspectos:

  • Detección de Eventos: El método clásico pierde completamente los eventos entre relojes, el alternativo los captura parcialmente pero arriesga pérdidas
  • Causalidad: En el enfoque clásico, el enlace DAC→analógico es correcto; en el alternativo, son posibles desajustes temporales
  • Rendimiento: El método sincrónico ofrece velocidad estable; el de anticipo puede ralentizarse drásticamente con intervalos cortos
  • Determinismo: Solo la implementación clásica garantiza resultados reproducibles
  • Complejidad de Integración: El alternativo requiere ajuste fino de heurísticas y análisis de temporización del circuito

Lecciones Principales

  • No Hay Solución Perfecta: Ambas arquitecturas tienen limitaciones inherentes debido a diferencias fundamentales en los paradigmas de modelado
  • La Elección Depende de la Tarea: El método alternativo se adapta a moduladores sigma-delta con pulsos raros; el clásico con sobremuestreo encaja en ADC de SAR con temporización estricta
  • Aplicabilidad en el Mundo Real: La herramienta ya se usa para verificar lógica digital en entornos analógicos y conteo de pulsos
  • Visualización: Ambas soportan visualización combinada de señales en GTKWave y gnuplot en una línea temporal unificada
  • Perspectivas: Integrar una cola de eventos y usar cbNextSimTime podría mitigar limitaciones

Implementación Práctica y Ejemplo de Uso

Considera usar el puente para un modulador sigma-delta. La parte analógica genera pulsos cortos que un contador digital debe sumar. En el enfoque clásico, solo llama a $spice_sync() a una frecuencia superior a la duración del pulso. Ejemplo de código Verilog:

module DSMCounter(
    input i_clk,
    input i_rst,
    input i_Qbar,
    output reg[31:0] o_cntQbar,
    output reg o_ready
);
parameter CNT_CLK = 22;
reg [31:0] cnt;
reg [31:0] cntQbar;

always @(posedge i_clk) begin
    if(i_rst) begin
        cnt <= 0;
        cntQbar <= 0;
        o_cntQbar <= 0;
        o_ready <= 0;
    end else begin
        o_ready <= 0;
        if(i_Qbar == 1) begin
            cntQbar <= cntQbar + 1;
        end
        if(cnt == CNT_CLK-1) begin
            o_cntQbar <= cntQbar;
            o_ready <= 1;
            cnt <= 0;
            cntQbar <= 0;
        end else begin
            cnt <= cnt + 1;
        end
    end
end
endmodule

En la implementación alternativa, puedes reducir la frecuencia de sincronización usando reglas de detección de pulsos mediante analog_event. Sin embargo, esto requiere un ajuste cuidadoso de los parámetros de anticipo para evitar pérdidas.

Para ejecutar, necesitas la compilación compartida de NGSpice (--with-ngshared). La configuración del puente se establece mediante mixed_bridge.cfg, definiendo puntos de sincronización y reglas de detección de eventos. Ambas implementaciones son de código abierto, pero necesitan pruebas para tu tarea específica.

Las direcciones futuras incluyen implementar una cola de eventos en lugar de una sola bandera, integrar maxstep en la configuración del puente y usar cbNextSimTime para un control temporal preciso. Una solución completa requiere agregar una API de eventos a NGSpice.

— Editorial Team

Advertisement 728x90

Leer después