Jump to content
    

Смешанная (аналогово-цифровая) симуляция интегральной схемотехники при помощи бриджа между Icarus Verilog и NGSpice

Смешанная (аналогово-цифровая) симуляция интегральной схемотехники при помощи бриджа между Icarus Verilog и NGSpice: две разных реализации архитектуры.

При разработке аналогово-цифровой схемотехники (например микросхемы состоящей из нескольких ЦАП или АЦП и цифрового интерфейса) возникает потребность верифицировать работу цифрового интерфейса совместно с аналоговой схемой.
Аналоговая часть как всегда выполнена в схематике SPICE а цифровая скорее всего на verilog.
Симуляторы аналогвой и цифровой части устроены сильно поразному и работают сильно поразному, а хочется совместить два в одном чтобы отлаживать работу схематики своего чипа целиком.

Конечно финальную верификацию мы проведем в громоздких неповоротливых симуляторах коммерческих кадов или в импортозаместительных кадах (которые по заданию Минпромторга у нас в РФ делаются из OpenRoad). Но хочется иметь подрукой легковесное средство без тормозной проверки лицензий при запуске и необходимости платить за его использование (в конце концов мы можем арендовать небольшое количество рабочих мест коммерческого  CAD на небольшое время и только для финализации проекта). А все время разработки все инженеры могут иметь под рукой свободную версию ПО И это вполне возможно уже сейчас!



Что такое событийная и непрерывная симуляция?

В мире симуляции электронных систем существуют два принципиально разных подхода.

Событийная симуляция (event‑driven) используется для цифровых схем. Логические элементы меняют своё состояние только в моменты, когда на их входах происходят изменения – фронты тактового сигнала, переключения триггеров, задержки вентилей. Между этими событиями ничего не происходит, симулятор «спит» и не тратит ресурсы. Именно так работают Icarus Verilog, Modelsim, VCS и другие цифровые симуляторы. Это быстро и эффективно, потому что цифровые сигналы имеют лишь два (или несколько дискретных) состояния.

Непрерывная симуляция (или псевдонепрерывная) используется для аналоговых схем. Ток через транзистор, напряжение на конденсаторе, фаза генератора – всё это меняется плавно по законам дифференциальных уравнений. Симулятор (SPICE, NGSpice, Spectre) разбивает время на очень маленькие шаги, решает системы уравнений на каждом шаге и выдаёт результаты в виде кривых. Точность требует мельчайших шагов, особенно при резких фронтах или обратных связях. Это медленно, но другого способа получить «почти как в жизни» аналоговое поведение пока нет.

Проблема смешанного моделирования

Порой возникает задача совместной симуляции (ко‑симуляции) взаимодействующих аналоговой и цифровой систем. Представьте, что вы разрабатываете SAR ADC. Аналоговая часть – компаратор, ЦАП на конденсаторах, входной буфер – требует SPICE‑моделирования с точностью до микровольт и пикосекунд. Цифровая часть – управляющая логика, калибровка, интерфейс – прекрасно считается в Icarus Verilog. Как заставить их работать вместе?

Можно использовать готовые коммерческие решатели (Cadence, Synopsys), но они стоят дорого и не всегда доступны. А можно написать свой мост – VPI‑модуль, который свяжет Icarus и NGSpice через общую память и семафоры. Именно этим я и занялся.

Эту задачу можно решить, запрягши два разных симулятора в одну упряжку, управляя ими попеременно и обмениваясь данными между ними. Вот мы взяли пару таких стандартных симуляторов – Icarus Verilog и NGSpice – и сделали управляемый мост.

В процессе родилось две реализации:

  • «Классическая» – простая, синхронная, где Verilog явно запрашивает аналоговые данные ("digital oversampling").

  • «Альтернативная» – с упреждающим анализом (lookahead) и инжекцией событий из SPICE в Verilog.

Казалось бы, вторая – эволюция первой. Но на деле у каждой оказались фундаментальные архитектурные недостатки, которые невозможно исправить косметическими патчами.

В этой статье я разберу обе реализации, их компромиссы и покажу, почему идеального open‑source решения для смешанного моделирования пока не существует.
Спойлер: несмотря на все недостатки, инструмент уже сейчас вполне пригоден для реальных задач – от формальной верификации цифровых блоков в обвязке с аналоговыми IP до подсчёта импульсов сигма‑дельта ADC.


GTKWave и gnuplot — аналоговые и цифровые сигналы на одной оси

Рис. 1 — GTKWave (цифровые + аналоговые) и встроенный gnuplot NGSpice. Совмещённые временные шкалы, те же сигналы.

Как устроен мост: общая архитектура

Обе реализации базируются на одном и том же наборе технологий: VPI (Verilog Procedural Interface) Icarus, libngspice.so, пайповые семафоры, отдельный поток NGSpice. Схема работы (упрощённо):

Icarus (главный поток)          NGSpice (поток)
       |                              |
  $spice_sync()  (или $get_...)       |
       |                              |
   state.target = t_now               |
       |                              |
   wait(analog_done) <----------------+ post(analog_done)
       |                              |
   обновить real-переменные           |
   применить alter (DAC)              |
       |                              |
   post(digital_done) -------------> wait(digital_done)
       |                              |
   вернуть управление                 |
       |                              | (продолжает моделирование)

 

Проблема в том, что SPICE выдаёт результаты только в моменты своего внутреннего временного шага. А Verilog живёт событиями, которые могут быть в любые моменты времени.

Важное упрощение для тестбенча: $spice_sync()

В обеих реализациях присутствует системная задача $spice_sync(). Её вызов (например, по каждому фронту быстрого тактового сигнала) выполняет полный цикл обмена: передаёт текущие цифровые значения в SPICE (через alter), запрашивает свежие аналоговые напряжения, обновляет real-переменные в Verilog. При этом не нужно вызывать $get_analog_voltage() для каждого сигнала вручную.

always @(posedge clk_fast) begin
    $spice_sync();   // синхронизация и обновление всех expose-переменных
    if (tb.Vcmp > vref_th) begin
        // digital reaction on event
         ...
    end
end

Благодаря expose_analog_N, real-переменные автоматически обновляются и видны в GTKWave на одной временной оси с цифровыми сигналами.

Моделирование задержек и фронтов

Часто в смешанных схемах важны не только статические уровни, но и время установления цифрового сигнала и скорость нарастания аналогового фронта. В обеих реализациях это легко моделируется с помощью «обёрточных» объектов на стороне Verilog и SPICE.

Классическая реализация: синхронный опрос

Каждый раз, когда Verilog нужны свежие аналоговые данные, мост узнаёт текущее время Icarus, блокируется на семафоре, SPICE считает до этого времени и возвращает значения.

Плюсы: простота, детерминизм, предсказуемая производительность.
Минусы (главный недостаток): аналоговые события, произошедшие между тактами Verilog, полностью игнорируются. Пример: компаратор переключается в момент 5.2 нс, а следующий положительный фронт тактового сигнала — в 10.0 нс. Verilog узнает об этом только в 10 нс, что ломает логику обратной связи в SAR ADC, DC-DC преобразователях. Приходится оверсэмплить обмен данными между двумя симуляторами повшая частоту срабатывания системной задачи clk_fast.

Альтернативная реализация: упреждающий анализ (lookahead)

Идея: разрешить SPICE бежать вперёд на небольшой интервал, следить за аналоговыми триггерами (пороги, окна, длительности, пики) и, если что-то произошло, остановиться и вызвать Verilog раньше. В конфиг‑файле mixed_bridge.cfg появляются строки вида:

analog_event_0 = threshold outp rising 1.2  | time_var=tb.analog_event_time  id_var=tb.analog_event_id
analog_event_1 = duration outp above 0.8 for 10ns energy 1e-12

Плюсы: SPICE может инициировать событие, точность в идеальных условиях, гибкость.
Недостатки (фундаментальные):

  • Sentinel-ы проверяются только на шагах SPICE — возможен пропуск события между шагами.

  • Эвристика длины окна может провалиться (слишком мало — опоздание, слишком много — падение производительности).

  • Нарушение причинности для ЦАП: alter-команда выполнится только в следующей фазе A, после того как SPICE уже проскочил момент события.

  • Только одно событие за окно.

  • Недетерминизм из-за эвристик.

gwave — аналоговый вьювер

 

Рис. 2 — gwave: просмотр аналоговых сигналов Sigma Delta модулятора (те же vbuck, vbucki, Qbar, что и в GTKWave).

Сравнительная таблица

 

Характеристика

Классическая

Альтернативная

Обнаружение аналоговых событий между тактами

Нет

⚠️ Частично (с пропусками)

Инжекция событий из SPICE в Verilog

Невозможно

Да (через cbAfterDelay)

Производительность

Предсказуемая

⚠️ Может взлететь (но maxstep помогает)

Детерминизм

Полный

⚠️ Зависит от эвристик

Причинность DAC→аналог

Корректна

Нарушается во время фазы B

Поддержка множественных событий

Нет

Только одно за окно

Сложность кода

~2000 строк

~3500 строк + грамматика конфига

JavaElectric EDA — смешанная схема и SPICE нетлист

 

Рис. 3 — JavaElectric EDA: принципиальная схема смешанного устройства (Sigma Delta modulator ADC + цифровой счётчик) и фрагмент SPICE нетлиста с описанием аналоговых событий.

Несмотря на всё: это уже работает и приносит пользу

Пример: сигма-дельта модулятор с цифровым счётчиком импульсов. Аналоговая часть выдаёт короткие импульсы с переменным (в следствии изименения входного сигналя) шагом. Цифровой счётчик должен считать каждый импульс, даже если он приходит в произвольный момент между фронтами тактового сигнала. Классическая реализация с вызовом $spice_sync() по каждому фронту быстрого такта (например, 500 МГц) вполне способна задетектировать импульс, если его длительность больше периода такта. Альтернативная реализация позволяет ещё точнее фиксировать момент прихода импульса и может работать с более редкими вызовами $spice_sync(), экономя ресурсы.

В обоих случаях разработчик получает возможность наблюдать аналоговые сигналы в GTKWave на одной временной оси с цифровыми сигналами, моделировать задержки и фронты через обёрточные объекты, проводить формальную верификацию цифровой логики в связке с реальными аналоговыми IP.

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;
reg [31:0] cntTotal;

always @(posedge i_clk) begin
    if(i_rst) begin
        cnt <= 0;
        cntQbar <= 0;
        o_cntQbar <= 0;
        o_ready <= 0;
        cntTotal <= 0;
    end else begin
        o_ready <= 0;
        cntTotal <= cntTotal + 1;
        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

Рис. 4 — цифровая часть: счётчик импульсов на Verilog (модуль DSMCounter), интегрируемый в смешанную симуляцию через VPI мост.

 

Что дальше? Перспективы улучшения

Я планирую добавить диагностику недостоверных результатов, реализовать очередь событий вместо одного флага, исследовать cbNextSimTime в Icarus, интегрировать ограничение maxstep прямо в конфиг моста. Возможно, когда-нибудь NGSpice обзаведётся полноценным событийным API, и тогда мост можно будет переписать «правильно».

P.S. Где взять код? Обе реализации лежат в открытом доступе (https://github.com/cyberflex/MixFighter) : классическая — IcarusNGSpice/, альтернативная — IcarusNGSpice.alternative/. Конфигурация через mixed_bridge.cfg. Для компиляции нужна shared-библиотека NGSpice (./configure --with-ngshared). Используйте на свой страх и риск, но, как показала практика, для многих задач его уже достаточно.

Если у вас есть идеи, как обойти описанные ограничения при текущих возможностях API симуляторов — Welcome to "issues". Успешных симуляций!

Теги:

 

 

 

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...