ОБЭРИУ
- 1 year ago
- 0
- 0
SystemVerilog — язык описания и верификации аппаратуры , являющийся расширением языка Verilog .
SystemVerilog был создан на базе языков Superlog (Accellera, 2002). Значительная часть функциональности, связанной с верификацией была взята из языка ( Synopsys ). В 2005 SystemVerilog был принят как стандарт IEEE 1800—2005.
В 2009 стандарт 1800—2005 был объединен с стандартом языка Verilog (IEEE 1364—2005), и была принята актуальная версия SystemVerilog — стандарт IEEE 1800—2009.
SystemVerilog может применяться для описания RTL как расширение языка Verilog-2005 . Для верификации используется объектно-ориентированная модель программирования .
SystemVerilog поддерживает все типы данных имеющиеся в Verilog и добавляет много новых типов данных.
Целочисленные типы данных . SystemVerilog предоставляет новые типы данных:
Эти типы данных принимают два состояния: 0 и 1. В отличие от соответствующих Verilog типов (например reg или integer ) они не могут принимать значения 'X' и 'Z', что позволяет ускорить симуляцию.
Многомерный упакованный массив является расширением и обобщением памяти в Verilog:
logic [1:0][2:0] my_pack[32];
Перечисляемый тип позволяет задать числовым константам имена, например:
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[2]}; // конкатенация строк
$display("[%d] %s", s3.len(), s3); // Будет напечатано: "[13] Hello, world!"