stringtranslate.com

СистемаVerilog

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 можно разделить на две отдельные роли:

  1. SystemVerilog для проектирования уровня передачи регистров (RTL) является расширением Verilog-2005 ; все функции этого языка доступны в SystemVerilog. Таким образом, Verilog является подмножеством SystemVerilog.
  2. SystemVerilog для проверки использует обширные методы объектно-ориентированного программирования и более тесно связан с Java , чем Verilog. Эти конструкции, как правило, не поддаются синтезу.

В оставшейся части статьи обсуждаются возможности SystemVerilog, отсутствующие в Verilog-2005 .

Срок службы данных

В SystemVerilog указано два типа срока жизни данных: статический и автоматический . Автоматические переменные создаются в тот момент, когда выполнение программы попадает в область действия переменной. Статические переменные создаются в начале выполнения программы и сохраняют одно и то же значение в течение всего срока службы программы, если во время выполнения ей не будет присвоено новое значение.

Любая переменная, объявленная внутри задачи или функции без указания типа, будет считаться автоматической. Чтобы указать, что переменная является статической, поместите ключевое словоstatic " " в объявлении перед типом, например, " ". Ключевое слово " " используется таким же образом.static int x;automatic

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

Расширенные типы переменных добавляют новые возможности к типу Verilog «reg»:

логика [ 31 : 0 ] my_var ;  

Verilog-1995 и -2001 ограничивают переменные reg поведенческими операторами, такими как код RTL . SystemVerilog расширяет тип reg, чтобы он мог управляться одним драйвером, например шлюзом или модулем. SystemVerilog называет этот тип «логическим», чтобы напомнить пользователям, что он имеет эту дополнительную возможность и не является аппаратным регистром. Имена «логика» и «рег» взаимозаменяемы. Сигналу с более чем одним драйвером (например, буфером с тремя состояниями для ввода/вывода общего назначения ) необходимо объявить сетевой тип, например «проводной», чтобы SystemVerilog мог разрешить окончательное значение.

Многомерные упакованные массивы унифицируют и расширяют понятия Verilog о «регистрах» и «памяти»:

логика [ 1 : 0 ][ 2 : 0 ] my_pack [ 32 ];  

Классический Verilog допускал объявление только одного измерения слева от имени переменной. SystemVerilog допускает любое количество таких «упакованных» измерений. Переменная типа упакованного массива отображает 1:1 на целочисленную арифметическую величину. В приведенном выше примере каждый элемент my_packможет использоваться в выражениях как шестибитное целое число. Размеры справа от названия (в данном случае 32) называются «неупакованными» размерами. Как и в Verilog-2001 , допускается любое количество распакованных измерений.

Перечислимые типы данных (enums) позволяют присваивать числовым величинам осмысленные имена. Переменные, объявленные как перечислимые, не могут быть присвоены переменным другого перечислимого типа без приведения . Это не относится к параметрам, которые были предпочтительным методом реализации перечислимых величин в Verilog-2005:

typedef enum log [ 2 : 0 ] { КРАСНЫЙ , ЗЕЛЕНЫЙ , СИНИЙ , ГОЛУБОЙ , ПУРПУРНЫЙ , ЖЕЛТЫЙ } color_t ;           color_t my_color = ЗЕЛЕНЫЙ ; начальный $ display ( "Цвет %s" , my_color.name ( )) ;     

Как показано выше, разработчик может указать базовый арифметический тип ( logic [2:0]в данном случае), который используется для представления значения перечисления. Здесь можно использовать метазначения X и Z, возможно, для обозначения недопустимых состояний. Встроенная функция name()возвращает строку ASCII для текущего перечислимого значения, что полезно при проверке и тестировании.

Новые целочисленные типы : SystemVerilog определяет byte, и как целочисленные типы со знаком с двумя состояниями, имеющие 8, 16, 32 и 64 бита соответственно. Тип — это тип с двумя состояниями переменной ширины, который работает во многом аналогично . В типах с двумя состояниями отсутствуют метазначения X и Z классического Verilog; работа с этими типами может привести к более быстрому моделированию.shortintintlongintbitlogic

Структуры и объединения работают так же, как вязыке программирования C. Улучшения SystemVerilog включают упакованный атрибут и тегированный атрибут. Атрибутtaggedпозволяет во время выполнения отслеживать, какие члены объединения используются в данный момент. Атрибутpackedприводит к отображению структуры или объединения 1:1 на упакованный массив битов. Содержимоеstructтипов данных занимает непрерывный блок памяти без пробелов, аналогично битовым полям в C и C++:

typedef struct упаковано { бит [ 10 : 0 ] expo ; битовый знак ; бит [ 51 : 0 ] мант ; } ФП ;            FP ноль = 64'b0 ;   

Как показано в этом примере, SystemVerilog также поддерживает typedefs , как в 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 if ( en ) q <= d ;     

Блок always_ffмоделирует синхронную логику (особенно последовательную логику , чувствительную к фронту ):

Always_ff @( posege clk ) count <= count + 1 ;       

Инструменты автоматизации электронного проектирования (EDA) могут проверить цель проекта, проверив, что модель оборудования не нарушает семантику использования блоков. Например, новые блоки ограничивают назначение переменной, разрешая только один источник, тогда как alwaysблок Verilog допускает назначение из нескольких процедурных источников.

Интерфейсы

Для небольших проектов порт Verilog компактно описывает связь модуля с окружающей средой. Но основные блоки в большой иерархии проектов обычно имеют количество портов, исчисляемое тысячами. SystemVerilog представляет концепцию интерфейсов , позволяющую как уменьшить избыточность объявлений имен портов между подключенными модулями, так и группировать и абстрагировать связанные сигналы в объявленный пользователем пакет. Дополнительным понятием является modport, показывающий направление логических соединений.

Пример:

интерфейс intf ; логика а ; логика б ; modport in ( вход a , выход b ); выход modport ( вход b , выход a ); конечный интерфейс                  модуль сверху ; int я (); u_a m1 (. i1 ( i . in )); u_b m2 (. i2 ( i . out )); конечный модуль          модуль u_a ( intf . in i1 ); конечный модуль   модуль u_b ( intf . out i2 ); конечный модуль   

Возможности проверки

Следующие функции проверки обычно не являются синтезируемыми, то есть их нельзя реализовать аппаратно на основе HDL-кода. Вместо этого они помогают создавать расширяемые и гибкие испытательные стенды .

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

Тип данных представляет собой текстовую строкуstring переменной длины . Например:

строка s1 = «Привет» ; строка s2 = «мир» ; строка p = ".?!" ; строка s3 = { s1 , ", " , s2 , p [ 2 ]}; // конкатенация строк $ display ( "[%d] %s" , s3.len ( ) , s3 ); // симуляция напечатает: "[13] Привет, мир!"                   

Помимо статического массива, используемого при проектировании, SystemVerilog предлагает динамические массивы , ассоциативные массивы и очереди :

int cmdline_elements ; // # элементы динамического массива int da []; // динамический массив int ai [ int ]; // ассоциативный массив, индексированный int int as [ string ]; // ассоциативный массив, индексированный строкой int qa [$]; // очередь, индексируемая как массив или встроенными методами          начальное начало cmdline_elements = 16 ; да = новый [ cmdline_elements ]; // Выделяем массив из 16 элементов end          

Динамический массив работает во многом аналогично распакованному массиву, но имеет то преимущество, что его динамически распределяют во время выполнения (как показано выше). В то время как размер упакованного массива должен быть известен во время компиляции (из константы или выражения констант), динамический массив size может быть инициализирован из другой переменной времени выполнения, что позволяет произвольно изменять размер и размер массива по мере необходимости.

Ассоциативный массив можно рассматривать как двоичное дерево поиска с определяемым пользователем типом ключа и типом данных . Ключ подразумевает порядок ; элементы ассоциативного массива можно считывать в лексикографическом порядке. Наконец, очередь обеспечивает большую часть функциональности типа deque C++ STL : элементы можно эффективно добавлять и удалять с любого конца. Эти примитивы позволяют создавать сложные структуры данных, необходимые для табло большого проекта.

Классы

SystemVerilog предоставляет модель объектно-ориентированного программирования .

В SystemVerilog классы поддерживают модель с одним наследованием , но могут реализовывать функциональность, аналогичную множественному наследованию, за счет использования так называемых «классов интерфейса» (идентичных по концепции функциям interfaceJava). Классы можно параметризовать по типу , обеспечивая базовую функцию шаблонов C++ . Однако специализация шаблонов и шаблоны функций не поддерживаются.

Возможности полиморфизма SystemVerilog аналогичны функциям C++: программист может специально написать функцию, virtualчтобы производный класс получил контроль над этой функцией. Дополнительную информацию см. в виртуальной функции .

Инкапсуляция и сокрытие данных выполняются с помощью ключевых слов localи protected, которые необходимо применять к любому элементу, который необходимо скрыть. По умолчанию все свойства класса являются общедоступными .

Экземпляры классов создаются динамически с помощью newключевого слова. Можно определить конструктор , обозначаемый . function newSystemVerilog имеет автоматическую сборку мусора , поэтому в языке нет средств для явного уничтожения экземпляров, созданных оператором new .

Пример:

виртуальный класс Память ; чтение бита виртуальной функции [ 31 : 0 ] ( бит [ 31 : 0 ] адрес ); конечная функция виртуальной функции void write ( бит [ 31 : 0 ] адрес , бит [ 31 : 0 ] данные ); конечный класс функции                    класс SRAM #( параметр AWIDTH = 10 ) расширяет память ; бит [ 31 : 0 ] mem [ 1 << AWIDTH ];          чтение бита виртуальной функции [ 31 : 0 ] ( бит [ 31 : 0 ] адрес ); вернуть память [ адрес ]; конечная функция          виртуальная функция void write ( бит [ 31 : 0 ] адрес , бит [ 31 : 0 ] данные ); мем [ адрес ] = данные ; конечный класс функции            

Ограниченная случайная генерация

Целочисленным величинам, определенным либо в определении класса, либо как отдельные переменные в некоторой лексической области, можно присваивать случайные значения на основе набора ограничений. Эта функция полезна для создания случайных сценариев для проверки .

В определениях классов модификаторы randи randcсигнализируют о переменных, которые должны подвергнуться рандомизации. randcопределяет рандомизацию на основе перестановок , при которой переменная принимает все возможные значения один раз, прежде чем какое-либо значение будет повторено. Переменные без модификаторов не являются рандомизированными.

класс eth_frame ; rand бит [ 47 : 0 ] dest ; rand бит [ 47 : 0 ] источник ; rand бит [ 15 : 0 ] f_type ; rand байт полезной нагрузки []; бит [ 31 : 0 ] fcs ; rand бит [ 31 : 0 ] fcs_corrupt ;                        ограничение базовое { полезная нагрузка . размер внутри {[ 46 : 1500 ]}; }       ограничение Good_fr { fcs_corrupt == 0 ; } конечный класс      

В этом примере fcsполе не рандомизировано; на практике оно будет вычисляться с помощью генератора CRC, а fcs_corruptполе будет использоваться для его искажения с целью внесения ошибок FCS. Два показанных ограничения применимы к соответствующим кадрам Ethernet . Ограничения могут быть включены выборочно; эта функция потребуется в приведенном выше примере для создания поврежденных кадров. Ограничения могут быть сколь угодно сложными, включая взаимосвязи между переменными, последствиями и итерациями. Решатель ограничений SystemVerilog необходим для поиска решения, если оно существует, но не дает никаких гарантий относительно времени, которое ему потребуется для этого, поскольку это, как правило, NP -сложная проблема ( логическая выполнимость ).

Методы рандомизации

В каждом классе SystemVerilog есть 3 предопределенных метода рандомизации: pre_randomize,randomize и post_randomize. Метод рандомизации вызывается пользователем для рандомизации переменных класса. Метод pre_randomize вызывается методом рандомизации перед рандомизацией, а метод post_randomize вызывается методом рандомизации после рандомизации.

класс eth_frame ; rand бит [ 47 : 0 ] dest ; rand бит [ 47 : 0 ] источник ; rand бит [ 15 : 0 ] f_type ; rand байт полезной нагрузки []; бит [ 31 : 0 ] fcs ; рандом бит поврежденный_фрейм ;                       ограничение базовое { полезная нагрузка . размер внутри {[ 46 : 1500 ]}; } Функция void post_randomize () this . вычислить_fcs (); // обновляем поле fcs в соответствии со случайным кадром if ( corrupted_frame ) // если этот кадр должен быть поврежден this . коррумпированный_fcs (); // повреждаем конечный класс конечной функции fcs                  

Контроль ограничений

Методы ограничения_mode() и random_mode() используются для управления рандомизацией. ограничительный_режим() используется для включения и выключения определенного ограничения, а случайный_режим используется для включения или выключения рандомизации определенной переменной. Код ниже описывает и процедурно тестирует кадр Ethernet :

класс eth_frame ; rand бит [ 47 : 0 ] dest ; rand бит [ 47 : 0 ] источник ; rand бит [ 15 : 0 ] f_type ; rand байт полезной нагрузки []; бит [ 31 : 0 ] fcs ; рандом бит поврежденный_фрейм ;                       ограничение базовое { полезная нагрузка . размер внутри {[ 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 ; мой_фрейм . one_src_cst . режим ограничения ( 0 ); // ограничение one_src_cst не будет учитываться my_frame . f_type . случайный_режим ( 0 ); // переменная f_type не будет рандомизирована для этого экземпляра кадра. мой_фрейм . рандомизировать ();  

Утверждения

Утверждения полезны для проверки свойств проекта, которые проявляются после достижения определенного условия или состояния. SystemVerilog имеет собственный язык спецификации утверждений, аналогичный языку спецификации свойств . Подмножество языковых конструкций SystemVerilog, обслуживающее утверждения, обычно называется SystemVerilog Assertion или SVA. [6]

Утверждения SystemVerilog строятся на основе последовательностей и свойств . Свойства представляют собой надмножество последовательностей; любую последовательность можно использовать, как если бы она была свойством, хотя обычно это бесполезно.

Последовательности состоят из логических выражений, дополненных временными операторами . Самый простой временной оператор — это ##оператор, выполняющий конкатенацию: [ необходимы пояснения ]

последовательность S1 ; @( posege clk ) req ## 1 gnt ; конечная последовательность      

Эта последовательность соответствует, если gntсигнал становится высоким через один такт после reqперехода на высокий уровень. Обратите внимание, что все операции последовательности синхронны с часами.

Другие последовательные операторы включают операторы повторения, а также различные союзы. Эти операторы позволяют дизайнеру выражать сложные отношения между компонентами проекта.

Утверждение работает, постоянно пытаясь оценить последовательность или свойство. Утверждение терпит неудачу, если свойство терпит неудачу. Приведенная выше последовательность завершится неудачей всякий раз, когда reqзначение будет низким. Чтобы точно выразить требование, которое gntследует за reqсвойством, необходимо:

свойство req_gnt ; @( posege clk ) req |=> gnt ; конечная собственность      Assert_req_gnt: свойство утверждения ( req_gnt ) else $ error ( «req не сопровождается gnt.» );     

В этом примере показан оператор импликации|=> . Предложение слева от импликации называется антецедентом , а предложение справа — консеквентом . Оценка импликации начинается с повторных попыток оценить антецедент. Когда антецедент успешен , предпринимается попытка получить консеквент, и успех утверждения зависит от успеха консеквента. В этом примере консеквент не будет предприниматься до тех пор, пока не reqдостигнет высокого уровня, после чего свойство завершится сбоем, если gntне будет высоким на следующих тактовых импульсах.

Помимо утверждений, SystemVerilog поддерживает предположения и охват свойств. Предположение устанавливает условие, которое инструмент формального логического доказательства должен считать истинным . Утверждение определяет свойство, истинность которого должна быть доказана. При моделировании как утверждения , так и предположения проверяются с помощью тестовых стимулов. Покрытие свойств позволяет инженеру по верификации убедиться, что утверждения точно контролируют проект. [ нечеткий ]

Покрытие

Покрытие применительно к языкам проверки оборудования означает сбор статистики на основе событий выборки в рамках моделирования. Покрытие используется для определения того, когда тестируемое устройство (DUT) подверглось воздействию достаточного разнообразия стимулов, при котором существует высокая уверенность в том, что DUT работает правильно. Обратите внимание, что это отличается от покрытия кода , которое инструментирует код проекта, чтобы гарантировать, что все строки кода в проекте были выполнены. Функциональный охват гарантирует, что все необходимые угловые и краевые случаи в пространстве проекта будут изучены .

Группа покрытия SystemVerilog создает базу данных «ячейок», в которой хранится гистограмма значений связанной переменной. Также можно определить перекрестное покрытие, при котором создается гистограмма, представляющая декартово произведение нескольких переменных.

Событие отбора проб определяет, когда берется проба. Событием выборки может быть событие Verilog, вход или выход блока кода или вызов метода sampleгруппы покрытия. Необходимо внимательно следить за тем, чтобы данные отбирались только тогда, когда они имеют смысл.

Например:

класс eth_frame ; // Определения, приведенные выше, Covergroup cov ; точка покрытия dest { bins bcast [ 1 ] = { 48'hFFFFFFFFFFFF }; bins ucast [ 1 ] = по умолчанию ; } Coverpoint f_type { длина контейнеров [ 16 ] = { [ 0 : 1535 ] }; бункеры набрали [ 16 ] = { [ 1536 : 32767 ] }; другие контейнеры [ 1 ] = по умолчанию ; } psize: полезная нагрузка точки прикрытия . размер { размер ячейки [] = { 46 , [ 47 : 63 ], 64 , [ 65 : 511 ], [ 512 : 1023 ], [ 1024 : 1499 ], 1500 }; }                                                      sz_x_t: крест f_type , psize ; конечный класс конечной группы    

В этом примере инженера по верификации интересует распределение широковещательных и одноадресных кадров, поле size/f_type и размер полезной нагрузки. Диапазоны в точке закрытия размера полезной нагрузки отражают интересные угловые случаи, включая кадры минимального и максимального размера.

Синхронизация

Сложная тестовая среда состоит из повторно используемых компонентов проверки, которые должны взаимодействовать друг с другом. Примитив « события » Verilog позволял различным блокам процедурных операторов запускать друг друга, но обеспечение синхронизации потоков зависело от (умного) использования программиста. SystemVerilog предлагает два примитива специально для межпоточной синхронизации: почтовый ящик и семафор . Почтовый ящик моделируется как очередь сообщений FIFO . При желании FIFO можно параметризовать по типу , чтобы через него можно было передавать только объекты указанного типа . Обычно объекты представляют собой экземпляры классов , представляющие транзакции : элементарные операции (например, отправка кадра), которые выполняются компонентами проверки. Семафор моделируется как счетный семафор .

Общие улучшения классического Verilog

В дополнение к вышеперечисленным новым функциям SystemVerilog повышает удобство использования существующих языковых функций Verilog. Ниже приведены некоторые из этих улучшений:

Помимо этого, SystemVerilog обеспечивает удобный интерфейс для иностранных языков (например, C/C++) с помощью SystemVerilog DPI (интерфейс прямого программирования).

Программное обеспечение для проверки и синтеза

SystemVerilog широко используется в сфере проектирования микросхем для проверки проекта. Три крупнейших поставщика EDA ( Cadence Design Systems , Mentor Graphics , Synopsys ) включили SystemVerilog в свои многоязычные HDL-симуляторы . Хотя ни один симулятор пока не может претендовать на поддержку всего Справочного руководства по языку SystemVerilog, что затрудняет взаимодействие тестовых стендов , предпринимаются усилия по обеспечению совместимости между поставщиками. [ когда? ] В 2008 году Cadence и Mentor выпустили методологию открытой проверки, библиотеку классов и структуру использования с открытым исходным кодом, чтобы облегчить разработку многоразовых тестовых стендов и стандартных проверочных IP. Компания Synopsys, которая первой опубликовала библиотеку классов SystemVerilog (VMM), впоследствии отреагировала на это открытием своей собственной VMM для широкой публики. Многие сторонние поставщики объявили или уже выпустили проверочный IP-адрес SystemVerilog.

В роли синтеза проекта (преобразование описания проекта аппаратного обеспечения в список соединений ) внедрение SystemVerilog происходит медленно. Многие команды дизайнеров используют процессы проектирования, включающие несколько инструментов от разных поставщиков. Большинство проектных групп не могут перейти на RTL-проектирование SystemVerilog до тех пор, пока весь их набор интерфейсных инструментов ( линтеры , формальная проверка и автоматические генераторы тестовых структур ) не будет поддерживать общее языковое подмножество. [ нужно обновить? ]

Смотрите также

Рекомендации

  1. ^ Рич, Д. «Эволюция SystemVerilog» IEEE Design and Test of Computers, июль/август 2003 г.
  2. ^ IEEE одобряет SystemVerilog, версию Verilog
  3. ^ IEEE 1800-2012, IEEE , 2012 г.
  4. ^ IEEE 1800-2017, IEEE , 2017 г.
  5. ^ IEEE 1800-2023, Утвержденный IEEE проект стандарта для SystemVerilog — унифицированный язык проектирования, спецификации и проверки оборудования, IEEE , 2023
  6. ^ Утверждение SystemVerilog: Введение

Внешние ссылки

Справочник стандартов IEEE
Учебники
Разработка стандартов
Языковые расширения
Онлайн-инструменты
Другие инструменты
  1. ^ Программа IEEE GET, IEEE