Powrót do strony głównej

Co-symulacja Icarus Verilog i NGSpice: porównanie architektur

Artykuł analizuje dwie architektury mostka dla co-symulacji Icarus Verilog i NGSpice. Omówiono fundamentalne ograniczenia każdego podejścia oraz zalecenia dotyczące zastosowania w rzeczywistych projektach. Narzędzie jest już używane do weryfikacji mieszanych schematów.

Jak działa mostek między Icarus Verilog i NGSpice dla co-symulacji?
Advertisement 728x90

# Kosymulacja obwodów cyfrowych i analogowych: dwa podejścia do mostu Icarus Verilog i NGSpice

Nowoczesne systemy elektroniczne wymagają integracji komponentów cyfrowych i analogowych, co czyni modelowanie mieszane krytycznie ważnym. Aby rozwiązać to zadanie, zaimplementowaliśmy most między Icarus Verilog a NGSpice, rozwijając dwie architektury. Każda z nich ma fundamentalne ograniczenia, ale już teraz pozwala na rozwiązywanie rzeczywistych problemów — od SAR ADC po modulatory sigma-delta.

Podstawy modelowania mieszanego: zdarzenia kontra ciągłość

Obwody cyfrowe modeluje się zdarzeniowo: symulator aktywuje się tylko przy zmianach sygnałów (fronty zegara, przełączanie przerzutników). Tak działają Icarus Verilog i inne symulatory cyfrowe — między zdarzeniami system „śpi”, co zapewnia wysoką wydajność. Obwody analogowe wymagają modelowania ciągłego: silniki SPICE (NGSpice, Spectre) dzielą czas na małe kroki, rozwiązując równania różniczkowe dla każdego interwału. Ten sposób jest dokładny, ale zasobożerny, zwłaszcza przy stromych frontach lub pętlach sprzężenia zwrotnego.

Kluczowy problem kosymulacji to uzgodnienie zasadniczo różnych paradygmatów. Symulator cyfrowy operuje dyskretnymi zdarzeniami, podczas gdy analogowy wymaga płynnego strumienia czasu. Przy próbie połączenia SAR ADC (gdzie analogowy komparator współdziała z logiką cyfrową) pojawia się dylemat: jak przekazywać dane między silnikami bez utraty krytycznych zdarzeń?

Google AdInline article slot

Architektura mostu: wspólne zasady

Obie implementacje wykorzystują te same technologie:

  • VPI (Verilog Procedural Interface) do interakcji z Icarus
  • Dynamiczną bibliotekę libngspice.so
  • Mechanizm strumieniowy z semaforami
  • Osobny wątek wykonania NGSpice

Centralnym elementem jest zadanie systemowe $spice_sync(), wywoływane na frontach sygnału zegarowego. Wykonuje ono pełny cykl wymiany: przekazanie wartości cyfrowych do SPICE za pomocą komend alter, zapytanie o napięcia analogowe i aktualizację zmiennych real w Verilog. Dzięki temu można wyświetlać sygnały analogowe w GTKWave na wspólnej osi czasu z cyfrowymi.

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

Mechanizm expose_analog_N automatycznie synchronizuje zmienne analogowe, czyniąc je dostępnymi dla logiki cyfrowej. Do modelowania frontów i opóźnień używa się obiektów opakowujących po obu stronach mostu.

Google AdInline article slot

Klasyczne podejście: synchroniczne sondowanie

W tej implementacji Verilog inicjuje wymianę przy każdym wywołaniu $spice_sync(). Symulator zapisuje bieżący czas, blokuje się na semaforze, przekazując sterowanie NGSpice, który modeluje do wskazanego momentu i zwraca dane.

Zalety:

  • Pełna deterministyczność
  • Przewidywalna wydajność
  • Prostota implementacji (około 2000 linii kodu)

Krytyczne ograniczenia:

Google AdInline article slot
  • Pełna niewidoczność zdarzeń analogowych między frontami zegara. Na przykład, jeśli komparator przełącza się w 5,2 ns, a następny front zegara jest w 10,0 ns, logika cyfrowa wykryje zmianę dopiero po 4,8 ns, co uniemożliwia działanie pętli sprzężenia zwrotnego w SAR ADC lub przetwornicach DC-DC.
  • Wymuszane nadpróbkowanie: aby przechwycić szybkie zdarzenia, trzeba sztucznie zwiększać częstotliwość sygnału zegarowego (np. do 500 MHz), co obniża wydajność.

To podejście nadaje się tylko do zadań, w których zdarzenia analogowe występują synchronicznie z frontami zegara lub przy użyciu wysokoczęstotliwościowego zegara do synchronizacji.

Alternatywne podejście: analiza z wyprzedzeniem

Aby pokonać ograniczenia klasycznej metody, zaimplementowano mechanizm lookahead. NGSpice otrzymuje prawo do „wybiegania w przód" na zadany interwał, śledząc zdarzenia analogowe za pomocą konfigurowalnych sensorów. Przykład reguły w mixed_bridge.cfg:

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

Po spełnieniu warunku SPICE zatrzymuje się i inicjuje zdarzenie w Verilog za pomocą callback cbAfterDelay.

Zalety:

  • Możliwość wykrywania asynchronicznych zdarzeń analogowych
  • Elastyczność konfiguracji (progi, czasy trwania, warunki energetyczne)
  • Zmniejszenie obciążenia przy rzadkich sygnałach zegarowych

Fundamentalne wady:

  • Pomijanie zdarzeń między krokami SPICE z powodu dyskretności integracji czasowej
  • Naruszenie przyczynowości: komendy alter (zmiana sygnałów cyfrowych) są stosowane dopiero w następnej fazie modelowania, co jest krytyczne dla DAC
  • Ograniczenie do jednego zdarzenia na okno analizy
  • Niedeterministyczność wynikająca z heurystyk wyboru długości interwału lookahead
  • Złożoność implementacji (ponad 3500 linii kodu + parser konfiguracji)

Kluczowe różnice w porównaniu

Główne kompromisy między architekturami ujawniają się w pięciu aspektach:

  • Wykrywanie zdarzeń: Klasyczna metoda całkowicie pomija zdarzenia między taktami, alternatywna — częściowo je chwyta, ale z ryzykiem pominięć
  • Przyczynowość: W klasycznym podejściu połączenie DAC→analog jest poprawne, w alternatywnym mogą wystąpić rozbieżności czasowe
  • Wydajność: Metoda synchroniczna daje stabilną prędkość, analiza z wyprzedzeniem może gwałtownie zwalniać przy krótkich interwałach lookahead
  • Deterministyczność: Tylko klasyczna implementacja gwarantuje powtarzalność wyników
  • Złożoność integracji: Alternatywne podejście wymaga precyzyjnego dostrojenia heurystyk i analizy charakterystyk czasowych obwodu

Co ważne: kluczowe wnioski

  • Idealistycznego rozwiązania nie ma: Obie architektury mają nieusuwalne ograniczenia wynikające z fundamentalnych różnic w paradygmatach modelowania
  • Wybór zależy od zadania: Do modulatorów sigma-delta z rzadkimi impulsami nadaje się metoda alternatywna, do SAR ADC z sztywnymi wymaganiami czasowymi — klasyczna z nadpróbkowaniem
  • Rzeczywista użyteczność: Narzędzie jest już używane do weryfikacji logiki cyfrowej w środowisku analogowym i liczenia impulsów
  • Wizualizacja: Obie implementacje umożliwiają połączone wyświetlanie sygnałów w GTKWave i gnuplot na jednej osi czasu
  • Perspektywy: Integracja kolejki zdarzeń i użycie cbNextSimTime mogą częściowo złagodzić ograniczenia

Praktyczna implementacja i przykład użycia

Rozważmy zastosowanie mostu do modulatora sigma-delta. Część analogowa generuje krótkie impulsy, które musi policzyć cyfrowy licznik. W klasycznym podejściu wystarczy wywoływać $spice_sync() z częstotliwością przewyższającą długość impulsów. Przykład kodu 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

W implementacji alternatywnej można obniżyć częstotliwość synchronizacji, używając reguł wykrywania impulsów przez analog_event. Wymaga to jednak starannego dostrojenia parametrów lookahead, aby uniknąć pominięć.

Do uruchomienia potrzebna jest wersja shared NGSpice (kompilacja z --with-ngshared). Konfiguracja mostu definiowana jest w pliku mixed_bridge.cfg, gdzie określa się punkty synchronizacji i reguły wykrywania zdarzeń. Obie implementacje są dostępne otwarcie, ale wymagają testów pod konkretne zadanie.

Perspektywiczne kierunki rozwoju obejmują realizację kolejki zdarzeń zamiast pojedynczej flagi, integrację maxstep w konfigurację mostu oraz użycie cbNextSimTime do precyzyjniejszego sterowania czasem. Pełne rozwiązanie możliwe jest tylko po dodaniu zdarzeniowego API do NGSpice.

— Editorial Team

Advertisement 728x90

Czytaj dalej