Парадигма | Структурированный (дизайн) Объектно-ориентированный (верификация) |
---|---|
Разработано | Синопсис , позже IEEE |
Впервые появился | 2002 ( 2002 ) |
Стабильный релиз | IEEE 1800-2023 / 16 декабря 2023 г. ( 2023-12-16 ) |
Дисциплина набора текста | Статичный , слабый |
Расширения имени файла | .sv, .svh |
Под влиянием | |
Проектирование: Verilog , VHDL , C++ , проверка: OpenVera, Java |
SystemVerilog , стандартизированный как IEEE 1800 , — это язык описания и верификации оборудования, используемый для моделирования, проектирования , симуляции , тестирования и внедрения электронных систем. SystemVerilog основан на Verilog и некоторых расширениях, и с 2008 года Verilog теперь является частью того же стандарта IEEE . Он широко используется в полупроводниковой и электронной промышленности как эволюция Verilog.
SystemVerilog начался с передачи языка Superlog компании Accellera в дар в 2002 году стартапом Co-Design Automation. [1] Основная часть функциональности проверки основана на языке OpenVera, подаренном Synopsys . В 2005 году SystemVerilog был принят в качестве стандарта IEEE 1800-2005. [2] В 2009 году стандарт был объединен с базовым стандартом Verilog (IEEE 1364-2005), создав стандарт IEEE 1800-2009.
Стандарт SystemVerilog впоследствии обновлялся в 2012, [3] 2017, [4] и последний раз в декабре 2023 года. [5]
Набор функций SystemVerilog можно разделить на две отдельные роли:
В оставшейся части статьи обсуждаются функции SystemVerilog, отсутствующие в Verilog-2005 .
В SystemVerilog определены два типа времени жизни данных: статическое и автоматическое . Автоматические переменные создаются в тот момент, когда выполнение программы попадает в область действия переменной. Статические переменные создаются в начале выполнения программы и сохраняют одно и то же значение в течение всего срока жизни программы, если только во время выполнения им не будет присвоено новое значение.
Любая переменная, объявленная внутри задачи или функции без указания типа, будет считаться автоматической. Чтобы указать, что переменная является статической, поместите ключевое словоstatic
" " в объявление перед типом, например, " ". Ключевое слово " " используется таким же образом.static int x;
automatic
Расширенные типы переменных добавляют новые возможности к типу «reg» Verilog:
логика [ 31 : 0 ] my_var ;
Verilog-1995 и -2001 ограничивают переменные reg поведенческими утверждениями, такими как RTL code . SystemVerilog расширяет тип reg, чтобы он мог управляться одним драйвером, таким как gate или module. SystemVerilog называет этот тип «logic», чтобы напомнить пользователям, что у него есть эта дополнительная возможность и что он не является аппаратным регистром. Названия «logic» и «reg» взаимозаменяемы. Сигнал с более чем одним драйвером (например, буфер с тремя состояниями для ввода/вывода общего назначения ) должен быть объявлен как сетевой тип, такой как «wire», чтобы SystemVerilog мог разрешить окончательное значение.
Многомерные упакованные массивы объединяют и расширяют понятия «регистров» и «памяти» в Verilog:
логика [ 1 : 0 ][ 2 : 0 ] my_pack [ 32 ];
Классический Verilog разрешал объявлять только одно измерение слева от имени переменной. SystemVerilog допускает любое количество таких «упакованных» измерений. Переменная типа упакованного массива отображается 1:1 на целочисленную арифметическую величину. В приведенном выше примере каждый элемент my_pack
может использоваться в выражениях как шестибитное целое число. Измерения справа от имени (в данном случае 32) называются «распакованными» измерениями. Как и в Verilog-2001 , разрешено любое количество распакованных измерений.
Перечислимые типы данных (enums
) позволяют присваивать числовым величинам осмысленные имена. Переменные, объявленные как имеющие перечислимый тип, не могут быть назначены переменным другого перечислимого типа без приведения . Это не относится к параметрам, которые были предпочтительным методом реализации для перечислимых величин в Verilog-2005:
typedef enum logic [ 2 : 0 ] { КРАСНЫЙ , ЗЕЛЕНЫЙ , СИНИЙ , ГОЛУБОЙ , ПУРПУРНЫЙ , ЖЕЛТЫЙ } color_t ; color_t my_color = GREEN ; начальный $ display ( "Цвет %s" , my_color.name ( ) );
Как показано выше, разработчик может указать базовый арифметический тип ( logic [2:0]
в данном случае), который используется для представления значения перечисления. Здесь могут использоваться метазначения X и Z, возможно, для представления недопустимых состояний. Встроенная функция name()
возвращает строку ASCII для текущего значения перечисления, что полезно при проверке и тестировании.
Новые целочисленные типы : SystemVerilog определяет byte
, shortint
, int
и longint
как двухуровневые знаковые целочисленные типы, имеющие 8, 16, 32 и 64 бита соответственно. Тип bit
— это двухуровневый тип переменной ширины, который работает во многом как logic
. Двухуровневые типы не имеют метазначений X и Z классического Verilog; работа с этими типами может привести к более быстрому моделированию.
Структуры и объединения работают во многом так же, как и в языке программирования C. Улучшения SystemVerilog включают в себя упакованный атрибут и атрибут tagged .tagged
Атрибут позволяет отслеживать во время выполнения, какие члены объединения используются в данный момент. Атрибутpacked
заставляет структуру или объединение отображаться 1:1 на упакованный массив битов. Содержимоеstruct
типов данных занимает непрерывный блок памяти без пробелов, аналогично битовым полям в C и C++:
typedef struct packed { bit [ 10 : 0 ] expo ; bit sign ; bit [ 51 : 0 ] mant ; } FP ; FP ноль = 64'b0 ;
Как показано в этом примере, SystemVerilog также поддерживает typedef , как в C и C++.
SystemVerilog вводит три новых процедурных блока, предназначенных для моделирования оборудования : always_comb
(для моделирования комбинационной логики ), always_ff
(для триггеров ) и always_latch
(для защелок ). В то время как Verilog использовал один always
блок общего назначения для моделирования различных типов аппаратных структур, каждый из новых блоков SystemVerilog предназначен для моделирования определенного типа оборудования путем наложения семантических ограничений, чтобы гарантировать, что оборудование, описанное блоками, соответствует предполагаемому использованию модели. HDL-компилятор или программа проверки могут предпринять дополнительные шаги, чтобы гарантировать, что происходит только предполагаемый тип поведения.
Блок always_comb
моделирует комбинационную логику . Симулятор выводит список чувствительности, чтобы все переменные были из содержащихся операторов:
always_comb начало tmp = b * b - 4 * a * c ; no_root = ( tmp < 0 ); конец
Блок always_latch
моделирует защелки , чувствительные к уровню . Опять же, список чувствительности выводится из кода:
always_latch если ( ru ) q <= d ;
Блок always_ff
моделирует синхронную логику (особенно чувствительную к фронту последовательную логику ):
always_ff @( posedge clk ) количество <= количество + 1 ;
Инструменты автоматизации электронного проектирования (EDA) могут проверить намерение проекта, проверяя, что аппаратная модель не нарушает семантику использования блоков. Например, новые блоки ограничивают назначение переменной, допуская только один источник, тогда как always
блок Verilog допускал назначение из нескольких процедурных источников.
Для небольших проектов порт Verilog компактно описывает связь модуля с окружающей средой. Но основные блоки в большой иерархии проектов обычно обладают количеством портов в тысячи. SystemVerilog вводит концепцию интерфейсов , чтобы уменьшить избыточность объявлений имен портов между подключенными модулями, а также группировать и абстрагировать связанные сигналы в объявленный пользователем пакет. Дополнительной концепцией является modport , который показывает направление логических соединений.
Пример:
интерфейс intf ; логика a ; логика b ; modport in ( вход a , выход b ); modport out ( вход b , выход a ); endinterface модуль top ; intf i (); u_a m1 (. i1 ( i . in )); u_b m2 (. i2 ( i . out )); endmodule модуль u_a ( intf . in i1 ); конец модуля модуль u_b ( intf . out i2 ); конец модуля
Следующие функции проверки обычно не синтезируются, то есть их нельзя реализовать в оборудовании на основе кода HDL. Вместо этого они помогают в создании расширяемых, гибких тестовых стендов .
Тип данных представляет собой текстовую строкуstring
переменной длины . Например:
string s1 = "Hello" ; string s2 = "world" ; string p = ".?!" ; string s3 = { s1 , ", " , s2 , p [ 2 ]}; // конкатенация строк $ display ( "[%d] %s" , s3 . len (), s3 ); // симуляция выведет: "[13] Hello, world!"
Помимо статического массива, используемого при проектировании, SystemVerilog предлагает динамические массивы , ассоциативные массивы и очереди :
int cmdline_elements ; // # элементы для динамического массива int da []; // динамический массив int ai [ int ]; // ассоциативный массив, индексированный int int as [ string ]; // ассоциативный массив, индексированный строкой int qa [$]; // очередь, индексированная как массив или встроенными методами initial begin cmdline_elements = 16 ; da = new [ cmdline_elements ]; // Выделяем массив из 16 элементов end
Динамический массив во многом похож на неупакованный массив, но имеет то преимущество, что он динамически выделяется во время выполнения (как показано выше). В то время как размер упакованного массива должен быть известен во время компиляции (из константы или выражения констант), размер динамического массива может быть инициализирован из другой переменной времени выполнения, что позволяет произвольно изменять размер массива по мере необходимости.
Ассоциативный массив можно рассматривать как бинарное дерево поиска с указанным пользователем типом ключа и типом данных . Ключ подразумевает упорядочение ; элементы ассоциативного массива могут быть считаны в лексикографическом порядке. Наконец, очередь обеспечивает большую часть функциональности типа deque C++ STL : элементы могут быть эффективно добавлены и удалены с любого конца. Эти примитивы позволяют создавать сложные структуры данных, необходимые для табло большого проекта.
SystemVerilog предоставляет модель объектно-ориентированного программирования .
В SystemVerilog классы поддерживают модель одиночного наследования , но могут реализовывать функциональность, похожую на множественное наследование, посредством использования так называемых «классов интерфейсов» (идентичных по концепции функции interface
Java). Классы могут быть параметризованы по типу , предоставляя базовую функцию шаблонов C++ . Однако специализация шаблонов и шаблоны функций не поддерживаются.
Возможности полиморфизма SystemVerilog аналогичны возможностям C++: программист может специально написать функцию virtual
, чтобы производный класс получил контроль над функцией. Для получения дополнительной информации см. virtual function .
Инкапсуляция и сокрытие данных осуществляется с помощью ключевых слов local
и protected
, которые должны применяться к любому элементу, который должен быть скрыт. По умолчанию все свойства класса являются публичными .
Экземпляры класса динамически создаются с помощью new
ключевого слова. Можно определить конструктор , обозначенный как . SystemVerilog имеет автоматическую сборку мусора , поэтому в языке нет возможности явно уничтожать экземпляры, созданные оператором new .function new
Пример:
виртуальный класс Память ; виртуальная функция бит [ 31 : 0 ] чтение ( бит [ 31 : 0 ] адрес ); конечная функция виртуальная функция void запись ( бит [ 31 : 0 ] адрес , бит [ 31 : 0 ] данные ); конечная функция конецкласс класс SRAM #( параметр AWIDTH = 10 ) расширяет память ; бит [ 31 : 0 ] mem [ 1 << AWIDTH ]; виртуальная функция бит [ 31 : 0 ] чтение ( бит [ 31 : 0 ] адрес ); возврат памяти [ адрес ]; конечная функция виртуальная функция void write ( bit [ 31 : 0 ] addr , bit [ 31 : 0 ] data ); mem [ addr ] = data ; endfunction endclass
Целочисленным величинам, определенным либо в определении класса, либо как автономным переменным в некоторой лексической области, могут быть назначены случайные значения на основе набора ограничений. Эта функция полезна для создания рандомизированных сценариев для проверки .
В определениях классов модификаторы rand
и randc
сигнализируют о переменных, которые должны подвергнуться рандомизации. randc
определяет рандомизацию на основе перестановки , где переменная примет все возможные значения один раз, прежде чем какое-либо значение будет повторено. Переменные без модификаторов не рандомизируются.
class eth_frame ; rand bit [ 47 : 0 ] dest ; rand bit [ 47 : 0 ] src ; rand bit [ 15 : 0 ] f_type ; rand byte payload []; bit [ 31 : 0 ] fcs ; rand bit [ 31 : 0 ] fcs_corrupt ; ограничение basic { полезная нагрузка . размер внутри {[ 46 : 1500 ]}; } ограничение good_fr { fcs_corrupt == 0 ; } endclass
В этом примере fcs
поле не рандомизировано; на практике оно будет вычисляться с помощью генератора CRC, а fcs_corrupt
поле будет использоваться для его повреждения с целью внедрения ошибок FCS. Два показанных ограничения применимы к соответствующим кадрам Ethernet . Ограничения могут быть выборочно включены; эта функция потребуется в примере выше для генерации поврежденных кадров. Ограничения могут быть произвольно сложными, включая взаимосвязи между переменными, импликациями и итерациями. Решатель ограничений SystemVerilog должен найти решение, если оно существует, но не дает никаких гарантий относительно времени, которое потребуется для этого, поскольку это, в общем случае, NP-трудная задача ( булева выполнимость ).
В каждом классе SystemVerilog есть 3 предопределенных метода для рандомизации: pre_randomize, randomize и post_randomize. Метод randomize вызывается пользователем для рандомизации переменных класса. Метод pre_randomize вызывается методом randomize перед рандомизацией, а метод post_randomize вызывается методом randomize после рандомизации.
class eth_frame ; rand bit [ 47 : 0 ] dest ; rand bit [ 47 : 0 ] src ; rand bit [ 15 : 0 ] f_type ; rand byte payload []; bit [ 31 : 0 ] fcs ; rand bit damaged_frame ; constraint basic { payload . size inside {[ 46 : 1500 ]}; } function void post_randomize () this . calculate_fcs (); // обновить поле fcs в соответствии с рандомизированным кадром if ( corrupted_frame ) // если этот кадр должен быть поврежден this . corrupt_fcs (); // повредить fcs endfunction endclass
Методы constraint_mode() и random_mode() используются для управления рандомизацией. constraint_mode() используется для включения и выключения определенного ограничения, а random_mode используется для включения или выключения рандомизации определенной переменной. Приведенный ниже код описывает и процедурно тестирует кадр Ethernet :
class eth_frame ; rand bit [ 47 : 0 ] dest ; rand bit [ 47 : 0 ] src ; rand bit [ 15 : 0 ] f_type ; rand byte payload []; bit [ 31 : 0 ] fcs ; rand bit damaged_frame ; ограничение basic { полезная нагрузка . размер внутри {[ 46 : 1500 ]}; } ограничение one_src_cst { src == 48'h1f00 } ограничение dist_to_fcs { fcs dist { 0 :/ 30 ,[ 1 : 2500 ] :/ 50 }; // 30 и 50 — это веса (в этом примере 30/80 или 50/80) } конецкласса . . . eth_frame my_frame ; my_frame.one_src_cst.constriction_mode ( 0 ); // ограничение one_src_cst не будет учитываться my_frame.f_type.random_mode( 0 ) ; // переменная f_type не будет рандомизирована для этого экземпляра кадра . my_frame.randomize ( ) ;
Утверждения полезны для проверки свойств проекта, которые проявляются после достижения определенного условия или состояния. SystemVerilog имеет свой собственный язык спецификации утверждений, похожий на Property Specification Language . Подмножество языковых конструкций SystemVerilog, которое обслуживает утверждения, обычно называется SystemVerilog Assertion или SVA. [6]
Утверждения SystemVerilog строятся из последовательностей и свойств . Свойства являются надмножеством последовательностей; любая последовательность может использоваться так, как если бы она была свойством, хотя это обычно не полезно.
Последовательности состоят из булевых выражений, дополненных временными операторами . Простейшим временным оператором является ##
оператор, который выполняет конкатенацию: [ необходимо разъяснение ]
последовательность S1 ; @( posedge clk ) req ## 1 gnt ; конец последовательности
Эта последовательность совпадает, если gnt
сигнал становится высоким один тактовый цикл после того, как req
становится высоким. Обратите внимание, что все операции последовательности синхронизированы с часами.
Другие последовательные операторы включают операторы повторения, а также различные союзы. Эти операторы позволяют дизайнеру выражать сложные отношения между компонентами дизайна.
Утверждение работает, постоянно пытаясь оценить последовательность или свойство. Утверждение терпит неудачу, если свойство терпит неудачу. Последовательность выше терпит неудачу, когда req
является низкой. Для точного выражения требования, которое gnt
следует за req
свойством, требуется:
свойство req_gnt ; @( posedge clk ) req |=> gnt ; endproperty assert_req_gnt: свойство assert ( req_gnt ) else $ error ( "за req не следует gnt." );
В этом примере показан оператор импликации|=>
. Предложение слева от импликации называется антецедентом , а предложение справа называется консеквентом . Оценка импликации начинается с повторных попыток оценить антецедент. Когда антецедент успешен , предпринимается попытка консеквента, и успех утверждения зависит от успеха консеквента. В этом примере попытка консеквента не будет предпринята, пока req
не станет высоким, после чего свойство не будет выполнено, если gnt
не будет высоким на следующих часах.
В дополнение к утверждениям SystemVerilog поддерживает предположения и покрытие свойств. Предположение устанавливает условие, которое формальный логический инструмент доказательства должен считать истинным . Утверждение определяет свойство, истинность которого должна быть доказана. В моделировании как утверждения, так и предположения проверяются с помощью тестовых стимулов. Покрытие свойств позволяет инженеру по проверке убедиться, что утверждения точно контролируют проект. [ неопределенно ]
Покрытие , применяемое к языкам верификации оборудования, относится к сбору статистики на основе выборочных событий в рамках моделирования. Покрытие используется для определения того, когда тестируемое устройство (DUT) подвергалось достаточному разнообразию стимулов, чтобы была высокая уверенность в том, что DUT функционирует правильно. Обратите внимание, что это отличается от покрытия кода , которое инструментирует код проекта, чтобы гарантировать, что все строки кода в проекте были выполнены. Функциональное покрытие гарантирует, что все желаемые угловые и граничные случаи в пространстве проекта были исследованы .
Группа покрытия SystemVerilog создает базу данных "корзин", в которых хранится гистограмма значений связанной переменной. Также можно определить перекрестное покрытие, которое создает гистограмму, представляющую декартово произведение нескольких переменных.
Событие выборки контролирует, когда берется выборка. Событие выборки может быть событием Verilog, входом или выходом из блока кода или вызовом метода sample
группы покрытия. Необходимо быть внимательным, чтобы гарантировать, что выборка данных выполняется только тогда, когда она имеет смысл.
Например:
class eth_frame ; // Определения как выше covergroup cov ; coverpoint dest { bins bcast [ 1 ] = { 48'hFFFFFFFFFFFF }; bins ucast [ 1 ] = default ; } coverpoint f_type { bins length [ 16 ] = { [ 0 : 1535 ] }; bins typed [ 16 ] = { [ 1536 : 32767 ] }; bins other [ 1 ] = default ; } psize: coverpoint payload . size { bins size [] = { 46 , [ 47 : 63 ], 64 , [ 65 : 511 ], [ 512 : 1023 ], [ 1024 : 1499 ], 1500 }; } sz_x_t: кросс f_type , psize ; конечная группа конечный класс
В этом примере инженер по проверке интересуется распределением широковещательных и одноадресных кадров, полем size/f_type и размером полезной нагрузки. Диапазоны в точке покрытия размера полезной нагрузки отражают интересные угловые случаи, включая минимальный и максимальный размер кадров.
Сложная тестовая среда состоит из повторно используемых компонентов проверки, которые должны взаимодействовать друг с другом. Примитив Verilog ' event ' позволял различным блокам процедурных операторов запускать друг друга, но принудительное выполнение синхронизации потоков зависело от (умного) использования программиста. SystemVerilog предлагает два примитива специально для межпоточной синхронизации: mailbox и semaphore . Почтовый ящик моделируется как очередь сообщений FIFO . При желании FIFO может быть параметризован типом , так что через него могут проходить только объекты указанного типа . Обычно объекты являются экземплярами классов, представляющими транзакции : элементарные операции (например, отправка кадра), которые выполняются компонентами проверки. Семафор моделируется как подсчитывающий семафор .
В дополнение к новым функциям, указанным выше, SystemVerilog повышает удобство использования существующих языковых функций Verilog. Ниже приведены некоторые из этих улучшений:
x++
, ++x
, x--
, --x
) поддерживаются в SystemVerilog, как и другие составные операторы присваивания ( x += a
, x -= a
, x *= a
, x /= a
, x %= a
, x <<= a
, x >>= a
, x &= a
, x ^= a
, x |= a
), как в C, и потомки .Помимо этого, SystemVerilog обеспечивает удобный интерфейс с иностранными языками (например, C/C++) с помощью SystemVerilog DPI (интерфейс прямого программирования).
SystemVerilog широко используется в качестве инструмента проверки дизайна в индустрии проектирования микросхем. Три крупнейших поставщика EDA ( Cadence Design Systems , Mentor Graphics , Synopsys ) включили SystemVerilog в свои симуляторы HDL на разных языках . Хотя ни один симулятор пока не может заявить о поддержке всего справочного руководства по языку SystemVerilog , что делает взаимодействие тестовых стендов сложной задачей, предпринимаются усилия по продвижению совместимости между поставщиками. [ когда? ] В 2008 году Cadence и Mentor выпустили Open Verification Methodology, библиотеку классов с открытым исходным кодом и фреймворк использования для упрощения разработки повторно используемых тестовых стендов и готовых IP-проверок. Synopsys, которая первой опубликовала библиотеку классов SystemVerilog (VMM), впоследствии отреагировала открытием своей собственной VMM для широкой публики. Многие сторонние поставщики объявили или уже выпустили IP-проверку SystemVerilog.
В роли синтеза дизайна (преобразование описания аппаратного дизайна в список цепей-ворот ) внедрение SystemVerilog происходило медленно. Многие проектные группы используют потоки дизайна, включающие несколько инструментов от разных поставщиков. Большинство проектных групп не могут перейти на RTL-дизайн SystemVerilog, пока весь их набор инструментов front-end ( линтеры , формальная верификация и генераторы автоматизированных тестовых структур ) не будет поддерживать общее подмножество языка. [ нужно обновление? ]