Всем привет!

Хочу поделиться своим опытом использования Python на этапах прототипирования RTL-модулей и последующей верификации. Как RTL-инженер, я часто создаю модели на Python для быстрой проверки логики и алгоритмов будущего RTL. Это подход уменьшает вероятность последующих правок в логике RTL в случае если алгоритм не подходит. Однако при переходе к тестированию на SystemVerilog всегда возникала проблема с переиспользованием написанной Python модели устройства: нужно было писать обвязку на C и использовать DPI-C интерфейсы, чтобы интегрировать Python-код модели в верификационную среду. Это занимало время и было неудобно.

Недавно я открыл для себя библиотеку PyStim (Bind Python & SystemVerilog), которая кардинально упростила процесс. PyStim позволяет напрямую вызывать Python-методы и работать с Python-объектами из среды SystemVerilog без необходимости писать обвязку на C или использовать DPI-C. Это значительно снизило трудозатраты и ускорило адаптацию уже готового Python-кода в тестбенче.

Простой пример использования PyStim

Предположим, у нас есть простой счётчик на Python:

#counter.py
class Counter:
    def __init__(self, initial=0):
        self.value = initial

    def increment(self):
        self.value += 1
        return self.value

Теперь посмотрим, как мы можем использовать этот класс в SystemVerilog с помощью PyStim:

import pystim_pkg::*;

module simple_calc();

  typedef pystim_pkg::pystim py;
 
  initial begin
    // Инициализация Python-среды
    pystim_pkg::initialize_interpreter();

    begin
      py_object result; 
      begin
        // import Counter from counter
        automatic py_object Counter = py_module::import_("counter").attr("Counter");
        // Создание Python-объекта, cnt = Counter(0)
        automatic py_object cnt = Counter.call(py::int_(0));

        // Вызов метода increment из Python без обвязки на C
        repeat(5)begin
          result = cnt.attr("increment").call();
          $display("Cnt: %0d", result.cast_int().get_value());
        end
      end
    end

    // Завершение работы с PyStim
    pystim_pkg::finalize_interpreter();
  end

endmodule

Результат в консоли:

# Cnt: 1
# Cnt: 2
# Cnt: 3
# Cnt: 4
# Cnt: 5

Заключение

PyStim отлично показал себя в реальных проектах, где нужно быстро перейти от Python-прототипа к полноценной верификации RTL-дизайна. Он позволяет:

  • Использовать существующий Python-код без переделки

  • Избавиться от написания DPI-C обвязки

  • Быстро интегрировать и тестировать RTL

Если вы работаете с Python-моделями и верификацией RTL, рекомендую попробовать PyStim — сэкономите кучу времени и нервов.

Если у кого-то уже есть опыт с этой библиотекой — буду рад обсудить в комментариях!

Комментарии (6)


  1. KeisN13
    22.05.2025 04:21

    По примеру предыдущей статьи в хабе FPGA зашел в песочницу и нашел там это. Выдал автору инвайт.

    Когда уже хабр пересмотрит этот идиотский подход или хотя бы начнет оповещать о публикациях в песочнице по подписанному хабу, штобы пользователи знали што кто-то ожидает приглашения или хотя бы сделает поиск поп песочнице?


  1. aax
    22.05.2025 04:21

    Автор не пояснил, в чем по его мнению, преимущества предложенной им методики, чем просто симуляция HDL кода написанного на Verilog/SystemVerilog посредством связки Icarus Verilog + GTKWave(то и другое свободное ПО).

    В Школе синтеза цифровых схем, например, таким способом тестировали достаточно сложные проекты написанные на SystemVerilog.


    1. r6l-025
      22.05.2025 04:21

      Вот вы пишете на sv свое ядро для FFT (к примеру, или фильтр, или демодулятор...). Для его проверки надо создать сигнал, надо создать референсную модель для сверки. Можно, конечно, все это сделать руками на sv, поискать готовые ядра которые использовать как референс и т.п. Но в то же время можно все это сгенерить на py в несколько строк, а выхлоп вашего ядра загнать обратно в py скрипт и там все сравнить с рисованием красивых картинок, отчета в CI и т.п.


  1. HepoH
    22.05.2025 04:21

    На бумаге звучит любопытно, но для полноты примера ещё стоило бы описать процесс сборки и запуска моделирования.


  1. triller599
    22.05.2025 04:21

    А есть ли преимущества по сравнению с тем же CocoTB? Было бы неплохо сравнить)


    1. anky783 Автор
      22.05.2025 04:21

      Это библиотека противоположность cocotb.

      В PyStim, System verilog управляет моделированием, в cocotb симуляция контролируется через python. Pystim встраивает интерпретатор Python непосредственно в SystemVerilog. Эта интеграция поддерживает стандартный подход моделирования SystemVerilog, обеспечивая взаимодействие с кодом Python, как если python классы были классами SystemVerilog.