SystemVerilog

Материал из Википедии — свободной энциклопедии
Это старая версия этой страницы, сохранённая Andreas Kaufmann (обсуждение | вклад) в 18:04, 26 января 2013. Она может серьёзно отличаться от текущей версии.
Перейти к навигации Перейти к поиску

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

Расширения для описания аппаратуры

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

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

Литература

Ссылки