SystemVerilog: различия между версиями

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
[непроверенная версия][отпатрулированная версия]
Содержимое удалено Содержимое добавлено
Нет описания правки
Метки: с мобильного устройства из мобильной версии через расширенный мобильный режим
 
(не показано 6 промежуточных версий 6 участников)
Строка 8: Строка 8:
|designer =
|designer =
|extension = .sv
|extension = .sv
|latest_release_version = IEEE 1800-2009
|latest_release_version = IEEE 1800-2023
|latest_release_date = 2009-12-18
|latest_release_date = 2024-02-28
|latest_preview_version =
|latest_preview_version =
|latest_preview_date =
|latest_preview_date =
Строка 22: Строка 22:
'''SystemVerilog''' — [[Язык описания аппаратуры|язык описания и верификации аппаратуры]], являющийся расширением языка [[Verilog]].
'''SystemVerilog''' — [[Язык описания аппаратуры|язык описания и верификации аппаратуры]], являющийся расширением языка [[Verilog]].


SystemVerilog был создан на базе языков Superlog (Accellera, 2002). Значительная часть функциональности, связанной с верификацией была взята из языка [[OpenVera]] ([[Synopsys]]).<ref>Rich, D. «The evolution of SystemVerilog» IEEE Design and Test of Computers, July/August 2003</ref> В 2005 SystemVerilog был принят как стандарт [[IEEE]] 1800—2005.<ref>[http://www.eetimes.com/news/design/showArticle.jhtml;?articleID=173601060 IEEE approves SystemVerilog, revision of Verilog]</ref>
SystemVerilog был создан на базе языков Superlog (Accellera, 2002). Значительная часть функциональности, связанной с верификацией была взята из языка [[OpenVera]] ([[Synopsys]]).<ref>Rich, D. «The evolution of SystemVerilog» IEEE Design and Test of Computers, July/August 2003</ref> В 2005 SystemVerilog был принят как стандарт [[IEEE]] 1800—2005.<ref>{{Cite web |url=http://www.eetimes.com/news/design/showArticle.jhtml;?articleID=173601060 |title=IEEE approves SystemVerilog, revision of Verilog |accessdate=2013-01-26 |archiveurl=https://web.archive.org/web/20070929095929/http://www.eetimes.com/news/design/showArticle.jhtml;?articleID=173601060 |archivedate=2007-09-29 |deadlink=yes }}</ref>


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


SystemVerilog может применяться для описания [[Уровень регистровых передач|RTL]] как расширение языка [[Verilog|Verilog-2005]]. Для верификации используется [[Объектно-ориентированное программирование|объектно-ориентированная модель программирования]].
SystemVerilog может применяться для описания [[Уровень регистровых передач|RTL]] как расширение языка [[Verilog|Verilog-2005]]. Для верификации используется [[Объектно-ориентированное программирование|объектно-ориентированная модель программирования]].
Строка 71: Строка 71:


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


Блок ''always_comb'' позволяет моделировать [[Комбинационная логика|комбинационную логику]]. Список чувствительности блока содержит все переменные используемые внутри блока.
Блок ''always_comb'' позволяет моделировать [[Комбинационная логика|комбинационную логику]]. Список чувствительности блока содержит все переменные используемые внутри блока.
Строка 87: Строка 87:
</source>
</source>


Одноступенчатые триггеры описываются с помощью ''always_latch'' блоков:
Одноступенчатые триггеры со статическим управлением (защёлки) описываются с помощью ''always_latch'' блоков:
<source lang="verilog">
<source lang="verilog">
always_latch
always_latch
Строка 94: Строка 94:


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


<source lang="verilog">
<source lang="verilog">

Текущая версия от 23:19, 5 ноября 2024

SystemVerilog
Класс языка структурная (дизайн); объектно-ориентированная (верификация)
Появился в 2002
Автор Институт инженеров электротехники и электроники
Расширение файлов .sv
Выпуск IEEE 1800-2023 (2024-02-28)
Система типов статическая, 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. Дата обращения: 26 января 2013. Архивировано из оригинала 29 сентября 2007 года.

Литература

[править | править код]