WikiSort.ru - Программирование

ПОИСК ПО САЙТУ | о проекте
SystemVerilog
Класс языка структурная (дизайн); объектно-ориентированная (верификация)
Появился в 2002
Автор Институт инженеров электротехники и электроники
Расширение файлов .sv
Выпуск IEEE 1800-2009 (2009-12-18)
Система типов статическая, weak
Испытал влияние Verilog, Vera

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

SystemVerilog был создан на базе языков Superlog (Accellera, 2002). Значительная часть функциональности, связанной с верификацией была взята из языка OpenVera (Synopsys).[1] В 2005 SystemVerilog был принят как стандарт IEEE 1800—2005.[2]

В 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[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!"

Примечания

  1. Rich, D. «The evolution of SystemVerilog» IEEE Design and Test of Computers, July/August 2003
  2. IEEE approves SystemVerilog, revision of Verilog

Литература

Ссылки

Данная страница на сайте WikiSort.ru содержит текст со страницы сайта "Википедия".

Если Вы хотите её отредактировать, то можете сделать это на странице редактирования в Википедии.

Если сделанные Вами правки не будут кем-нибудь удалены, то через несколько дней они появятся на сайте WikiSort.ru .




Текст в блоке "Читать" взят с сайта "Википедия" и доступен по лицензии Creative Commons Attribution-ShareAlike; в отдельных случаях могут действовать дополнительные условия.

Другой контент может иметь иную лицензию. Перед использованием материалов сайта WikiSort.ru внимательно изучите правила лицензирования конкретных элементов наполнения сайта.

2019-2024
WikiSort.ru - проект по пересортировке и дополнению контента Википедии