SystemVerilog - SystemVerilog

SystemVerilog
SystemVerilog logo.png
Логотип SystemVerilog
Парадигма Структурированный (дизайн)
Объектно-ориентированный (проверка)
Разработано Synopsys , позже IEEE
Впервые появился 2002 ; 19 лет назад ( 2002 )
Стабильный выпуск
IEEE 1800-2017 / 22 февраля 2018 г . ; 3 года назад ( 22.02.2018 )
Печатная дисциплина Статичный , слабый
Расширения имени файла .sv, .svh
Под влиянием
Дизайн: Verilog , VHDL , C ++ , Проверка: OpenVera , Java

SystemVerilog , стандартизированный как IEEE 1800 , представляет собой язык описания и проверки оборудования, используемый для моделирования, проектирования , моделирования , тестирования и реализации электронных систем. SystemVerilog основан на Verilog и некоторых расширениях, а с 2008 года Verilog теперь является частью того же стандарта IEEE . Он обычно используется в индустрии проектирования полупроводников и электроники как эволюция Verilog.

История

SystemVerilog начал свою деятельность с того, что в 2002 году Accellera подарила язык Superlog начинающей компании Co-Design Automation. Основная часть функций проверки основана на языке OpenVera, предоставленном Synopsys . В 2005 году SystemVerilog был принят в качестве стандарта IEEE 1800-2005. В 2009 году стандарт был объединен с базовым стандартом Verilog (IEEE 1364-2005), в результате чего был создан стандарт IEEE 1800-2009. Текущая версия - стандарт IEEE 1800-2017.

Набор функций SystemVerilog можно разделить на две отдельные роли:

  1. SystemVerilog для проектирования уровня передачи регистров (RTL) является расширением Verilog-2005 ; все функции этого языка доступны в SystemVerilog. Следовательно, Verilog - это подмножество SystemVerilog.
  2. SystemVerilog для проверки использует обширные методы объектно-ориентированного программирования и более тесно связан с Java, чем с Verilog. Эти конструкции обычно не синтезируются.

В оставшейся части статьи обсуждаются возможности SystemVerilog, отсутствующие в Verilog-2005 .

Особенности дизайна

Срок службы данных

В SystemVerilog указано два типа времени жизни данных: статический и автоматический . Автоматические переменные создаются в тот момент, когда выполнение программы попадает в область видимости переменной. Статические переменные создаются в начале выполнения программы и сохраняют одно и то же значение в течение всего жизненного цикла программы, если только не присвоено новое значение во время выполнения.

Любая переменная, объявленная внутри задачи или функции без указания типа, будет считаться автоматической. Чтобы указать, что переменная является статической, поместите ключевое слово " static" в объявлении перед типом, например " ". Ключевое слово " " используется таким же образом. static int x;automatic

Новые типы данных

Расширенные типы переменных добавляют новые возможности к типу "reg" Verilog:

logic [31:0] my_var;

Verilog-1995 и -2001 ограничивают переменные reg поведенческими операторами, такими как код RTL . SystemVerilog расширяет тип reg, так что он может управляться одним драйвером, таким как вентиль или модуль. SystemVerilog называет этот тип «логикой», чтобы напомнить пользователям, что он имеет эту дополнительную возможность и не является аппаратным регистром. Имена «логика» и «рег» взаимозаменяемы. Сигнал с более чем одним драйвером (например, буфер с тремя состояниями для ввода / вывода общего назначения ) должен быть объявлен сетевым типом, таким как «провод», чтобы SystemVerilog мог разрешить окончательное значение.

Многомерные упакованные массивы унифицируют и расширяют понятие Verilog о «регистрах» и «памяти»:

logic [1:0][2:0] my_pack[32];

Классический Verilog позволял объявлять только одно измерение слева от имени переменной. SystemVerilog допускает любое количество таких «упакованных» размеров. Переменная типа упакованного массива отображает 1: 1 на целочисленную арифметическую величину. В приведенном выше примере каждый элемент my_packможет использоваться в выражениях как шестибитовое целое число. Размеры справа от названия (в данном случае 32) называются «неупакованными» размерами. Как и в Verilog-2001 , допускается любое количество размеров без упаковки.

Перечислимые типы данных (enums) позволяют присвоить числовым величинам осмысленные имена. Переменные, объявленные как перечислимые, не могут быть присвоены переменным другого перечислимого типа без приведения . Это не относится к параметрам, которые были предпочтительным методом реализации для перечисляемых величин в Verilog-2005:

typedef enum logic [2:0] {
   RED, GREEN, BLUE, CYAN, MAGENTA, YELLOW
} color_t;

color_t   my_color = GREEN;
initial $display("The color is %s", my_color.name());

Как показано выше, разработчик может указать базовый арифметический тип ( logic [2:0]в данном случае), который используется для представления значения перечисления. Здесь могут использоваться мета-значения X и Z, возможно, для представления незаконных состояний. Встроенная функция name()возвращает строку ASCII для текущего перечисляемого значения, что полезно при проверке и тестировании.

Новые целые типы : SystemVerilog определяет byte, shortint, intи , longintкак два государства подписали интегральные типы , имеющие 8, 16, 32 и 64 бита соответственно. bitТип переменной ширины типа два состояния , который работает так же, как logic. Типы с двумя состояниями лишены мета значений X и Z классического Verilog; работа с этими типами может привести к более быстрому моделированию.

Структуры и объединения работают таккак ониделают в языке программирования Си . Усовершенствования SystemVerilog включают упакованный атрибут иатрибут tagged . taggedАтрибут позволяет отслеживать время выполнения которых пользователь (ей) из союза используемых в настоящее время. packedАтрибута приводит к томуструктуре или объединениячтобы быть отображены 1: 1 на упакованный массив бит. Содержимоеstructтипов данных занимает непрерывный блок памяти без пропусков, аналогично битовым полям в C и C ++:

typedef struct packed {
    bit [10:0]  expo;
    bit         sign;
    bit [51:0]  mant;
} FP;

FP     zero = 64'b0;

Как показано в этом примере, SystemVerilog также поддерживает определения типов , как в C и C ++.

Процедурные блоки

SystemVerilog представляет три новых процедурных блока, предназначенных для моделирования оборудования : always_comb(для моделирования комбинационной логики ), always_ff(для триггеров ) и always_latch(для защелок ). В то время как Verilog использовал один универсальный alwaysблок для моделирования различных типов структур оборудования, каждый из новых блоков SystemVerilog предназначен для моделирования определенного типа оборудования путем наложения семантических ограничений, чтобы гарантировать, что оборудование, описываемое блоками, соответствует предполагаемому использованию модель. Компилятор HDL или программа проверки могут предпринять дополнительные шаги, чтобы гарантировать, что происходит только предполагаемый тип поведения.

always_combБлок модели комбинационной логики . Симулятор делает вывод, что список чувствительности состоит из всех переменных из содержащихся в нем операторов:

always_comb begin
    tmp = b * b - 4 * a * c;
    no_root = (tmp < 0);
end

An always_latchблочные модели уровня чувствительные защелок. Опять же, список чувствительности выводится из кода:

always_latch
    if (en) q <= d;

always_ffБлок модели синхронной логики (особенно чувствительный к фронту последовательной логики ):

always_ff @(posedge clk)
    count <= count + 1;

Инструменты автоматизации электронного проектирования (EDA) могут проверить замысел проекта, проверив, что модель оборудования не нарушает семантику использования блоков. Например, новые блоки ограничивают назначение переменной, разрешая только один источник, тогда как alwaysблок Verilog разрешает назначение из нескольких процедурных источников.

Интерфейсы

Для небольших проектов порт Verilog компактно описывает связь модуля с окружающей средой. Но основные блоки в большой иерархии проектов обычно имеют количество портов, исчисляемое тысячами. SystemVerilog вводит концепцию интерфейсов как для уменьшения избыточности объявлений имен портов между подключенными модулями, так и для группирования и абстрактных связанных сигналов в объявленном пользователем пакете. Дополнительным понятием является модпорт, показывающий направление логических связей.

Пример:

interface intf;
  logic a;
  logic b;
  modport in (input a, output b);
  modport out (input b, output a); 
endinterface

module top;
  intf i ();
  u_a m1 (.i1(i.in));
  u_b m2 (.i2(i.out));
endmodule

module u_a (intf.in i1);
endmodule

module u_b (intf.out i2);
endmodule

Особенности проверки

Следующие функции проверки обычно не синтезируются, то есть они не могут быть реализованы аппаратно на основе кода HDL. Вместо этого они помогают создавать расширяемые и гибкие испытательные стенды .

Новые типы данных

Тип stringданных представляет собой текстовую строку переменной длины . Например:

string s1 = "Hello";
string s2 = "world";
string p = ".?!";
string s3 = {s1, ", ", s2, p[2]}; // string concatenation
$display("[%d] %s", s3.len(), s3); // simulation will print: "[13] Hello, world!"

В дополнение к статическому массиву, используемому в дизайне, SystemVerilog предлагает динамические массивы , ассоциативные массивы и очереди :

int cmdline_elements; // # elements for dynamic array
int da[];             // dynamic array
int ai[int];          // associative array, indexed by int
int as[string];       // associative array, indexed by string
int qa[$];            // queue, indexed as an array, or by built-in methods

initial begin
    cmdline_elements = 16;
    da = new[ cmdline_elements ]; // Allocate array with 16 elements
end

Динамический массив работает так же, как неупакованный массив, но предлагает то преимущество, что он динамически выделяется во время выполнения (как показано выше). В то время как размер упакованного массива должен быть известен во время компиляции (из константы или выражения констант), динамический массив size может быть инициализирован из другой переменной времени выполнения, что позволяет изменять размер и размер массива произвольно по мере необходимости.

Ассоциативный массив можно рассматривать как двоичное дерево поиска с указанным пользователем типом ключа и типом данных . Ключ подразумевает порядок ; элементы ассоциативного массива можно считывать в лексикографическом порядке. Наконец, очередь обеспечивает большую часть функциональности типа deque C ++ STL : элементы можно эффективно добавлять и удалять с любого конца. Эти примитивы позволяют создавать сложные структуры данных, необходимые для табло большого проекта.

Классы

SystemVerilog предоставляет объектно-ориентированную модель программирования .

В SystemVerilog классы поддерживают модель одиночного наследования , но могут реализовывать функциональные возможности, аналогичные множественному наследованию, за счет использования так называемых «интерфейсных классов» (идентичных по концепции interfaceфункции Java). Классы могут быть параметризованы по типу , обеспечивая базовую функцию шаблонов C ++ . Однако специализация шаблонов и шаблоны функций не поддерживаются.

Возможности полиморфизма SystemVerilog аналогичны функциям C ++: программист может специально написать virtualфункцию, чтобы производный класс мог контролировать эту функцию. См. Дополнительную информацию в виртуальной функции .

Инкапсуляция и скрытие данных осуществляется с помощью localи protectedключевые слова, которые должны быть применены к любому элементу , который должен быть скрыт. По умолчанию все свойства класса являются общедоступными .

Экземпляры классов динамически создаются с помощью newключевого слова. Конструктор обозначается function newможет быть определен. SystemVerilog имеет автоматическую сборку мусора , поэтому нет языковых средств для явного уничтожения экземпляров, созданных оператором new .

Пример:

virtual class Memory;
    virtual function bit [31:0] read(bit [31:0] addr); endfunction
    virtual function void write(bit [31:0] addr, bit [31:0] data); endfunction
endclass

class SRAM #(parameter AWIDTH=10) extends Memory;
    bit [31:0] mem [1<<AWIDTH];

    virtual function bit [31:0] read(bit [31:0] addr);
        return mem[addr];
    endfunction

    virtual function void write(bit [31:0] addr, bit [31:0] data);
        mem[addr] = data;
    endfunction
endclass

Ограниченная случайная генерация

Целочисленные величины, определенные либо в определении класса, либо как отдельные переменные в некоторой лексической области видимости, могут иметь случайные значения на основе набора ограничений. Эта функция полезна для создания случайных сценариев для проверки .

В определениях класса, randи randcмодификаторы сигнал переменных, которые должны пройти рандомизации. randcопределяет рандомизацию на основе перестановок , при которой переменная принимает все возможные значения один раз, прежде чем какое-либо значение будет повторено. Переменные без модификаторов не рандомизируются.

class eth_frame;
    rand bit [47:0] dest;
    rand bit [47:0] src;
    rand bit [15:0] f_type;
    rand byte       payload[];
    bit [31:0]      fcs;
    rand bit [31:0] fcs_corrupt;

    constraint basic {
        payload.size inside {[46:1500]};
    }

    constraint good_fr {
        fcs_corrupt == 0;
    }
endclass

В этом примере fcsполе не рандомизировано; на практике он будет вычисляться с помощью генератора CRC и fcs_corruptполя, используемого для его повреждения, чтобы ввести ошибки FCS. Два показанных ограничения применимы к соответствующим кадрам Ethernet . Ограничения могут быть включены выборочно; эта функция потребуется в приведенном выше примере для создания поврежденных кадров. Ограничения могут быть произвольно сложными, включая взаимосвязь между переменными, последствиями и итерациями. Решатель ограничений SystemVerilog требуется для поиска решения, если оно существует, но не дает никаких гарантий относительно времени, которое потребуется для этого, поскольку в целом это NP-сложная проблема ( логическая выполнимость ).

Методы рандомизации

В каждом классе SystemVerilog есть 3 предопределенных метода рандомизации: pre_randomize, randomize и post_randomize. Метод randomize вызывается пользователем для рандомизации переменных класса. Метод pre_randomize вызывается методом randomize перед рандомизацией, а метод post_randomize вызывается методом randomize после рандомизации.

class eth_frame;
    rand bit [47:0] dest;
    rand bit [47:0] src;
    rand bit [15:0] f_type;
    rand byte       payload[];
    bit [31:0]      fcs;
    rand bit        corrupted_frame;

    constraint basic {
        payload.size inside {[46:1500]};
    }
    
    function void post_randomize()
      this.calculate_fcs(); // update the fcs field according to the randomized frame
      if (corrupted_frame)  // if this frame should be corrupted 
        this.corrupt_fcs(); // corrupt the fcs
    endfunction
endclass

Контроль ограничений

Методы constraint_mode () и random_mode () используются для управления рандомизацией. constraint_mode () используется для включения и выключения определенного ограничения, а random_mode используется для включения или выключения рандомизации конкретной переменной. Приведенный ниже код описывает и процедурно тестирует фрейм Ethernet :

class eth_frame;
    rand bit [47:0] dest;
    rand bit [47:0] src;
    rand bit [15:0] f_type;
    rand byte       payload[];
    bit [31:0]      fcs;
    rand bit        corrupted_frame;

    constraint basic {
        payload.size inside {[46:1500]};
    }
   
    constraint one_src_cst {
        src == 48'h1f00
    }

    constraint dist_to_fcs {
        fcs dist {0:/30,[1:2500]:/50};  // 30, and 50 are the weights (30/80 or  50/80, in this example) 
    }

endclass
.
.
.
eth_frame my_frame;

my_frame.one_src_cst.constraint_mode(0); // the constraint one_src_cst will not be taken into account
my_frame.f_type.random_mode(0);        // the f_type variable will not be randomized for this frame instance.
my_frame.randomize();

Утверждения

Утверждения полезны для проверки свойств проекта, которые проявляются после достижения определенного условия или состояния. SystemVerilog имеет собственный язык спецификации утверждений, аналогичный языку спецификации свойств . Подмножество языковых конструкций SystemVerilog, обслуживающих утверждения, обычно называется SystemVerilog Assertion или SVA.

Утверждения SystemVerilog построены на основе последовательностей и свойств . Свойства - это надмножество последовательностей; любая последовательность может использоваться, как если бы она была свойством, хотя обычно это бесполезно.

Последовательности состоят из логических выражений, дополненных временными операторами . Самый простой темпоральный оператор - это ##оператор, выполняющий конкатенацию:

sequence S1;
    @(posedge clk) req ##1 gnt;
endsequence

Эта последовательность совпадает, если gntсигнал переходит в высокий уровень через один тактовый цикл req. Обратите внимание, что все операции последовательности синхронны с часами.

Другие последовательные операторы включают операторы повторения, а также различные соединения. Эти операторы позволяют проектировщику выражать сложные отношения между компонентами дизайна.

Утверждение работает, постоянно пытаясь оценить последовательность или свойство. Утверждение не выполняется, если свойство терпит неудачу. Приведенная выше последовательность не сработает, если reqбудет низкий уровень. Чтобы точно выразить требование, gntследующее reqза свойством, требуется:

property req_gnt;
    @(posedge clk) req |=> gnt;
endproperty

assert_req_gnt: assert property (req_gnt) else $error("req not followed by gnt.");

В этом примере показан оператор импликации|=> . Предложение слева от импликации называется антецедентом, а предложение справа - консеквентом . Оценка импликации начинается с повторных попыток оценить антецедент. Когда антецедент успешен , предпринимается попытка получить консеквент, и успех утверждения зависит от успеха консеквента. В этом примере консеквент не будет предприниматься до тех пор, пока не станет reqвысоким, после чего свойство потерпит неудачу, если gntне будет высоким на следующих часах.

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

Покрытие

Покрытие применительно к языкам проверки оборудования относится к сбору статистики на основе событий выборки в рамках моделирования. Покрытие используется для определения того, когда тестируемое устройство (ИУ) подвергалось воздействию достаточного количества стимулов, что с высокой степенью уверенности в том, что ИУ функционирует правильно. Обратите внимание, что это отличается от покрытия кода, которое определяет код проекта, чтобы гарантировать выполнение всех строк кода в проекте. Функциональное покрытие гарантирует, что все желаемые угловые и краевые случаи в пространстве дизайна были изучены .

Группа покрытия SystemVerilog создает базу данных «ячеек», в которых хранится гистограмма значений связанной переменной. Также может быть определено перекрестное покрытие, которое создает гистограмму, представляющую декартово произведение нескольких переменных.

A выборки управляет событие , когда образец берется. Выборки событие может быть событием Verilog, вход или выход из блока кода, или вызов sampleметода группы покрытия. Требуется осторожность, чтобы гарантировать, что данные отбираются только тогда, когда они значимы.

Например:

class eth_frame;
   // Definitions as above
   covergroup cov;
      coverpoint dest {
          bins bcast[1] = {48'hFFFFFFFFFFFF};
          bins ucast[1] = default;
      }
      coverpoint f_type {
          bins length[16] = { [0:1535] };
          bins typed[16] = { [1536:32767] };
          bins other[1] = default;
      }
      psize: coverpoint payload.size {
          bins size[] = { 46, [47:63], 64, [65:511], [512:1023], [1024:1499], 1500 };
      }

      sz_x_t: cross f_type, psize;
   endgroup
endclass

В этом примере инженера по верификации интересует распределение широковещательных и одноадресных кадров, поле size / f_type и размер полезной нагрузки. Диапазоны точки покрытия размера полезной нагрузки отражают интересные угловые случаи, включая кадры минимального и максимального размера.

Синхронизация

Сложная тестовая среда состоит из повторно используемых компонентов проверки, которые должны взаимодействовать друг с другом. Примитив Verilog « событие » позволял различным блокам процедурных операторов запускать друг друга, но обеспечение синхронизации потоков оставалось на усмотрение программиста (умного). SystemVerilog предлагает два примитива специально для межпотоковой синхронизации: почтовый ящик и семафор . Почтовый ящик смоделирован как очередь сообщений FIFO . Необязательно, FIFO , может быть типа параметрироваться так , что только объекты указанного типа могут быть переданы через него. Обычно объекты представляют собой экземпляры класса, представляющие транзакции : элементарные операции (например, отправку кадра), которые выполняются компонентами проверки. Семафор моделируется как счетный семафор .

Общие улучшения классического Verilog

В дополнение к новым функциям, описанным выше, SystemVerilog повышает удобство использования существующих языковых функций Verilog. Ниже приведены некоторые из этих улучшений:

Помимо этого, SystemVerilog обеспечивает удобный интерфейс с иностранными языками (например, C / C ++) с помощью SystemVerilog DPI (интерфейс прямого программирования).

Программное обеспечение для проверки и синтеза

При проверке проекта SystemVerilog широко используется в индустрии проектирования микросхем. Три крупнейших поставщика EDA ( Cadence Design Systems , Mentor Graphics , Synopsys ) включили SystemVerilog в свои многоязычные симуляторы HDL . Хотя ни один симулятор пока не может претендовать на поддержку всего SystemVerilog LRM , что затрудняет взаимодействие тестовых стендов , предпринимаются усилия по продвижению совместимости между поставщиками. В 2008 году Cadence и Mentor выпустили Open Verification Methodology, библиотеку классов и среду использования с открытым исходным кодом для облегчения разработки повторно используемых тестовых стендов и готовых верификационных IP-адресов. Synopsys, которая была первой, кто опубликовал библиотеку классов SystemVerilog (VMM), впоследствии отреагировала, открыв свой собственный VMM для широкой публики. Многие сторонние поставщики объявили или уже выпустили проверочный IP-адрес SystemVerilog.

В роли синтеза проекта (преобразование описания проекта оборудования в список соединений ) внедрение SystemVerilog было медленным. Многие команды разработчиков используют потоки проектирования, в которых задействовано несколько инструментов от разных поставщиков. Большинство проектных групп не могут перейти на SystemVerilog RTL-дизайн, пока весь их набор интерфейсных инструментов ( линтеры , формальная проверка и автоматические генераторы структуры тестирования ) не будет поддерживать подмножество общего языка.

Смотрите также

Рекомендации

  • 1800-2005 - Стандарт IEEE для системной верификации - унифицированный язык проектирования, спецификации и проверки аппаратного обеспечения . 2005. DOI : 10,1109 / IEEESTD.2005.97972 . ISBN 978-0-7381-4810-6.
  • 1800-2009 - Стандарт IEEE для SystemVerilog - унифицированный язык проектирования, спецификации и проверки аппаратного обеспечения . 2009. DOI : 10,1109 / IEEESTD.2009.5354441 . ISBN 978-0-7381-6130-3.
  • 1800-2012 - Стандарт IEEE для SystemVerilog - унифицированный язык проектирования, спецификации и проверки оборудования . 2013. DOI : 10,1109 / IEEESTD.2013.6469140 . ISBN 978-0-7381-8110-3.
  • 1800-2017 - Стандарт IEEE для SystemVerilog - унифицированный язык проектирования, спецификации и проверки оборудования . 2017. DOI : 10,1109 / IEEESTD.2018.8299595 . ISBN 978-1-5044-4509-2.
  • МакГрат, Дилан (2005-11-09). «IEEE одобряет SystemVerilog, версию Verilog» . EE Times . Проверено 31 января 2007 .
  • Пунит Кумар (2005-11-09). «Учебное пособие по системе Verilog» .
  • Гопи Кришна (2005-11-09). «Учебники по SystemVerilog, SVA, SV DPI» .
  • HDVL. "Дополнительные ссылки на SystemVerilog" .
  • Спир, Крис, «SystemVerilog для проверки», Спрингер, Нью-Йорк, штат Нью-Йорк. ISBN  0-387-76529-8
  • Стюарт Сазерленд, Саймон Дэвидманн, Питер Флейк, «SystemVerilog для дизайна, второе издание: руководство по использованию SystemVerilog для проектирования и моделирования оборудования», Спрингер, Нью-Йорк, штат Нью-Йорк. ISBN  0-387-33399-1
  • Бен Коэн, Сринивасан Венкатараманан, Аджита Кумари и Лиза Пайпер [1] Справочник утверждений SystemVerilog, 4-е издание, 2016 г. - http://SystemVerilog.us
  • Бен Коэн Сринивасан Венкатараманан и Аджита Кумари [2] Прагматический подход к принятию VMM, - http://SystemVerilog.us
  • Эрик Селигман и Том Шуберт [3] Формальная проверка: необходимый инструментарий для проектирования современных СБИС, 24 июля 2015 г.,

Внешние ссылки

Справочник по стандарту IEEE

Самые последние стандартные документы SystemVerilog доступны бесплатно в IEEExplore .

Учебники
Разработка стандартов
Расширения языка
  • Verilog AUTOs - система мета-комментариев с открытым исходным кодом для упрощения поддержки кода Verilog
Онлайн-инструменты
  • EDA Playground - запуск SystemVerilog из веб-браузера (бесплатная онлайн-среда IDE)
  • SVeN - SystemVerilog BNF Navigator (в соответствии с IEEE 1800-2012)
Прочие инструменты
  • SVUnit - фреймворк модульного тестирования для разработчиков, пишущих код в SystemVerilog. Проверяйте модули, классы и интерфейсы SystemVerilog изолированно.
  • sv2v - конвертер с открытым исходным кодом из SystemVerilog в Verilog