SystemVerilog — язык описания и верификации аппаратуры, являющийся расширением языка Verilog.

SystemVerilog был создан на базе языков Superlog (Accellera, 2002). Значительная часть функциональности, связанной с верификацией была взята из языка OpenVera (Synopsys).Rich, D. «The evolution of SystemVerilog» IEEE Design and Test of Computers, July/August 2003 В 2005 SystemVerilog был принят как стандарт IEEE 1800—2005.

В 2009 стандарт 1800—2005 был объединен с стандартом языка Verilog (IEEE 1364—2005), и была принята версия SystemVerilog — стандарт IEEE 1800—2009.

SystemVerilog может применяться для описания RTL как расширение языка Verilog-2005. Для верификации используется объектно-ориентированная модель программирования.

Конструкции для описания аппаратуры

Новые типы данных SystemVerilog поддерживает все типы данных имеющиеся в Verilog и добавляет много новых типов данных.

Целочисленные типы данных. SystemVerilog предоставляет новые типы данных: bit (1 бит) byte (8 бит) shortint (16 бит) int (32 бит) longint (64 бит) Эти типы данных принимают два состояния: 0 и 1. В отличие от соответствующих Verilog типов (например reg или integer) они не могут принимать значения 'X' и 'Z', что позволяет ускорить симуляцию.

Многомерный упакованный массив является расширением и обобщением памяти в Verilog: logic [1:0][2:0] my_pack;

Перечисляемый тип позволяет задать числовым константам имена, например: 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] используется как базовый тип.

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

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

FP zero = 64'b0; Атрибут tagged позволяет контроль того, какой член объединения используется в каждый момент при исполнение программы.

Процесс-блоки Verilog предоставляет always процесс-блок, который в зависимости от контекста может описывать разные типы аппаратуры. Для того, чтобы описать тип аппаратуры в явном виде, SystemVerilog добавляет 3 новых процесс-блока: always_comb, always_ff, и always_latch.

Блок always_comb позволяет моделировать комбинационную логику. Список чувствительности блока содержит все переменные используемые внутри блока. always_comb begin tmp = b * b - 4 * a * c; no_root = (tmp < 0); end

Блок always_ff позволяет описывать синхронную последовательностную логику, например триггеры: always_ff @(posedge clk) q <= reset ? 0 : d;

Одноступенчатые триггеры со статическим управлением (защёлки) описываются с помощью always_latch блоков: always_latch if (enable) q <= d;

Интерфейсы Для небольших систем внешние связи модуля компактно описываются с помощью Verilog портов. Однако крупные блоки внутри большой системы обычно содержат несколько тысяч портов. SystemVerilog предоставляет механизм интерфейсов (interface) для того, чтобы сгруппировать порты, а также чтобы избежать дублирования при определении портов. Кроме этого, интерфейсы могут содержать конструкцию modport, которая специфицирует направление соединений. Например:

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

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

module u_a (intf.in i1); assign x = i1.a; assign y = i1.b; endmodule

module u_b (intf.out i2); assign i2.a = 1; assign i2.b = 0; endmodule

Конструкции для верификации Следующие конструкции не являются синтезируемыми. Они используются для реализации тестового окружения, утверждений в тестируемом коде, а также для проверки покрытия кода.

Типы данных для верификации Тип string может использоваться для обработки строк переменной длины, например: string s1 = "Hello"; string s2 = "world"; string p = ".?!"; string s3 = {s1, ", ", s2, p}; // конкатенация строк $display("[%d] %s", s3.len(), s3); // Будет напечатано: " Hello, world!"

Примечания

Литература 1800-2009 IEEE Standard for System Verilog-Unified Hardware Design, Specification, and Verification Language

Ссылки SystemVerilog.ru Курс лабораторных работ по Verilog. Лабораторные работы по Verilog. Язык SystemVerilog. Проектирование СБИС и систем, А.Пеженков, Д.Радченко, Электроника НТБ. Выпуск #4/2006. SystemVerilog и улучшение отладки проектов, Иосиф Каршенбойм, «Компоненты и технологии», #1/2010.

Категория:САПР Категория:Стандарты IEEE Категория:Языки проектирования Категория:Языки описания аппаратуры