# Ko-simulace digitálních a analogových obvodů: dva přístupy k mostu Icarus Verilog a NGSpice
Moderní elektronické systémy vyžadují integraci digitálních a analogových komponent, což činí smíšené modelování klíčovým. Pro řešení této úlohy jsme implementovali most mezi Icarus Verilog a NGSpice a vyvinuli dvě architektury. Každá z nich má zásadní omezení, ale již nyní umožňuje řešit reálné úkoly od SAR ADC po sigma-delta modulátory.
Základy smíšeného modelování: události versus kontinuita
Digitální obvody se modelují událostně: simulátor se aktivuje pouze při změnách signálů (přechody taktu, přepínání flip-flopů). Tak fungují Icarus Verilog a další digitální simulátory – mezi událostmi systém „spí“, což zajišťuje vysoký výkon. Analogové obvody vyžadují kontinuální modelování: SPICE enginy (NGSpice, Spectre) dělí čas na malé kroky a řeší diferenciální rovnice pro každý interval. Tento přístup je přesný, ale náročný na zdroje, zejména při ostrých přechodech nebo zpětné vazbě.
Klíčovým problémem ko-simulace je sladění zásadně odlišných paradigm. Digitální simulátor pracuje s diskrétními událostmi, zatímco analogový potřebuje plynulý časový tok. Při pokusu o sjednocení SAR ADC (kde analogový komparátor interaguje s digitální logikou) vzniká dilema: jak předávat data mezi enginy bez ztráty kritických událostí?
Architektura mostu: společné principy
Obě implementace využívají stejné technologie:
- VPI (Verilog Procedural Interface) pro interakci s Icarus
- Dynamickou knihovnu libngspice.so
- Proudový mechanismus se semafory
- Samostatný výkonný proud pro NGSpice
Centrálním prvkem je systémová úloha $spice_sync(), která se volá při přechodech taktového signálu. Provádí celý cyklus výměny: přenos digitálních hodnot do SPICE příkazy alter, dotaz analogových napětí a aktualizaci real proměnných v Verilogu. To umožňuje zobrazovat analogové signály v GTKWave na společné časové ose s digitálními.
always @(posedge clk_fast) begin
$spice_sync();
if (tb.Vcmp > vref_th) begin
// Reakce na událost
...
end
end
Mechanismus expose_analog_N automaticky synchronizuje analogové proměnné a činí je dostupnými pro digitální logiku. Pro modelování přechodů a zpoždění se používají obalové objekty na obou stranách mostu.
Klasický přístup: synchronní polling
V této implementaci Verilog iniciuje výměnu při každém volání $spice_sync(). Simulátor zaznamená aktuální čas, zablokuje se na semaforu, předá řízení NGSpice, který simuluje do uvedeného okamžiku a vrátí data.
Výhody:
- Plná determinovanost
- Předvídatelný výkon
- Jednoduchost implementace (asi 2000 řádků kódu)
Kritická omezení:
- Plná neviditelnost analogových událostí mezi taktovými přechody. Například pokud se komparátor přepne v 5,2 ns a další takt je v 10,0 ns, digitální logika změnu zjistí až po 4,8 ns, což znemožňuje fungování zpětné vazby v SAR ADC nebo DC-DC měničích.
- Nutné přehnané převzorkování: pro zachycení rychlých událostí je třeba uměle zvyšovat frekvenci taktu (např. na 500 MHz), což snižuje výkon.
Tento přístup je životaschopný jen pro úlohy, kde analogové události probíhají synchronně s taktovými přechody, nebo při použití vysokofrekvenčního taktu pro synchronizaci.
Alternativní přístup: lookahead analýza
Pro překonání omezení klasické metody byl implementován lookahead mechanismus. NGSpice dostane právo „vybíhat dopředu“ na daný interval a sleduje analogové události pomocí konfigurovatelných senzorů. Příklad pravidla v mixed_bridge.cfg:
analog_event_0 = threshold outp rising 1.2 | time_var=tb.analog_event_time id_var=tb.analog_event_id
Při splnění podmínky SPICE zastaví a iniciuje událost v Verilogu přes callback cbAfterDelay.
Výhody:
- Možnost detekce asynchronních analogových událostí
- Flexibilita konfigurace (prahové hodnoty, délky, energetické podmínky)
- Snížení zátěže při řídkých taktech
Zásadní nevýhody:
- Ztráta událostí mezi kroky SPICE kvůli diskrétnosti časové integrace
- Porušení kauzality: příkazy
alter(změna digitálních signálů) se aplikují až v další fázi modelování, což je kritické pro DAC - Omezení na jednu událost za analytické okno
- Nedeterminovanost kvůli heuristikám volby délky lookahead intervalu
- Složitost implementace (3500+ řádků kódu + parser konfigurace)
Klíčové rozdíly ve srovnání
Hlavní kompromisy mezi architekturami se projevují v pěti aspektech:
- Detekce událostí: Klasická metoda úplně přehlíží události mezi takty, alternativní je částečně zachytí, ale s rizikem ztrát
- Kauzalita: V klasickém přístupu je vazba DAC→analog správná, v alternativním mohou nastat časové nesoulady
- Výkon: Synchronní metoda poskytuje stabilní rychlost, lookahead analýza se může prudce zpomalit při krátkých intervalech
- Determinovanost: Pouze klasická implementace zaručuje reprodukovatelnost výsledků
- Složitost integrace: Alternativní přístup vyžaduje jemné ladění heuristik a analýzu časových charakteristik obvodu
Co je důležité: klíčové závěry
- Ideální řešení neexistuje: Obě architektury mají neodstranitelné omezení kvůli zásadním rozdílům v modelovacích paradigmatech
- Výběr závisí na úloze: Pro sigma-delta modulátory s řídkými impulsy je vhodná alternativní metoda, pro SAR ADC s přísnými časovými požadavky klasická s přehnaným převzorkováním
- Reálná použitelnost: Nástroj se již používá pro verifikaci digitální logiky v analogovém prostředí a počítání impulsů
- Vizualizace: Obě implementace zajišťují společné zobrazení signálů v GTKWave a gnuplot na jediné časové ose
- Perspektivy: Integrace fronty událostí a použití
cbNextSimTimemohou omezení částečně zmírnit
Praktická implementace a příklad použití
Prozkoumejme použití mostu pro sigma-delta modulátor. Analogová část generuje krátké impulsy, které má digitální čítač spočítat. V klasickém přístupu stačí volat $spice_sync() s frekvencí převyšující délku impulsů. Příklad Verilog kódu:
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
V alternativní implementaci lze snížit frekvenci synchronizace pomocí pravidel detekce impulsů přes analog_event. Vyžaduje však pečlivé nastavení lookahead parametrů pro prevenci ztrát.
Pro spuštění je nutná shared verze NGSpice (kompilace s --with-ngshared). Konfigurace mostu se zadává v mixed_bridge.cfg, kde se definují body synchronizace a pravidla detekce událostí. Obě implementace jsou volně dostupné, ale vyžadují testování pro konkrétní úlohu.
Perspektivní směry vývoje zahrnují implementaci fronty událostí místo jediného příznaku, integraci maxstep do konfigurace mostu a použití cbNextSimTime pro přesnější řízení času. Plnohodnotné řešení je možné jen při přidání událostního API do NGSpice.
— Editorial Team
Zatím žádné komentáře.