е является языком аппаратных средств верификации (СПО) , которая предназначена для реализации очень гибкие и многоразовые проверки testbenches .
Парадигма | Аспектно-ориентированный |
---|---|
Разработано | Йоав Холландер |
Впервые появился | 1992 г. |
Стабильный выпуск | IEEE 1647-2016 / 6 января 2017 г . |
Расширения имени файла | .e |
Веб-сайт | TWiki @ eda.org |
История
e был впервые разработан в 1992 году в Израиле Йоавом Холландером для его программного обеспечения Specman . В 1995 году он основал компанию InSpec (позже переименованную в Verisity ) для коммерциализации программного обеспечения. Продукт был представлен на конференции по автоматизации проектирования в 1996 году . [1] С тех пор Verisity была приобретена компанией Cadence Design Systems .
Функции
Основные особенности e :
- Генерация случайных и ограниченных случайных стимулов
- Определение и сбор показателей функционального покрытия
- Темпоральный язык, который можно использовать для написания утверждений
- Аспектно-ориентированный язык программирования с возможностью отражения
- Язык не зависит от DUT в том смысле, что вы можете использовать один тестовый стенд e для проверки модели SystemC / C ++, модели RTL, модели уровня ворот или даже DUT, находящегося в блоке аппаратного ускорения (с использованием UVM Acceleration for e Methodology)
- Может создавать многоразовый код, особенно когда тестовая среда написана в соответствии с универсальной методологией проверки (UVM).
- Ранее известная как методология электронного повторного использования ( e RM)
- Библиотеку UVM e и документацию можно скачать здесь: UVM World
Особенности языка
В языке e используется подход аспектно-ориентированного программирования (АОП), который является расширением подхода объектно-ориентированного программирования для конкретного удовлетворения потребностей, необходимых для функциональной проверки. АОП - это ключевая функция, позволяющая пользователям легко добавлять дополнительные функции к существующему коду неинвазивным способом. Это позволяет легко повторно использовать и поддерживать код, что является огромным преимуществом в мире аппаратного обеспечения, где конструкции постоянно дорабатываются для удовлетворения требований рынка на протяжении всего жизненного цикла проекта. АОП также легко решает сквозные проблемы (функции, которые затрагивают различные разделы кода), позволяя пользователям расширять либо отдельные, либо все экземпляры конкретной структуры для добавления функциональности. Пользователи могут расширить несколько структур, чтобы добавить функциональные возможности, связанные с определенной функцией, и при желании объединить расширения в один файл, обеспечивая более организованное разбиение файлов.
Комментарии
Исполняемый код e заключен в маркеры сегментов кода <'и'>:
Пример
Все, что находится за пределами маркеров, является комментарием.<'extend sys { // Это комментарий в стиле Verilog - Это комментарий в стиле VHDL post_generate () также { out ("... а все остальное в маркерах является исполняемым кодом."); };};'>
Классы
e также имеет два вида классов:
- Динамические классы помечаются ключевым словом struct. Структуры используются для создания данных, которые существуют только временно и могут быть очищены сборщиком мусора.
- Статические классы помечаются ключевым словом unit. Единицы используются для создания постоянной структуры тестового стенда.
Класс может содержать поля, методы, порты и ограничения. Поля могут быть целочисленными, действительными, перечисляемыми, строковыми и даже сложными объектами. Сегмент кода показывает блок под названием "environment_u", экземпляр которого создается в корне e "sys". Этот класс environment_u содержит список из 5 объектов packet_s, а этот класс packet_s содержит два поля и метод.
Пример
<'// Это динамический класс с двумя полямиstruct packet_s { field0: uint (биты: 32); // Это поле называется 'field0' и является // Целое число без знака шириной 32 бита. поле1: байт; // Это поле называется 'field1' и является байтом. // Этот метод вызывается после создания объекта packet_s post_generate () также { вне (поле0); // Выводим значение поля 'field0' };};// Это статический класс со списком из пяти структур пакетовunit environment_u { my_pkt [5]: список пакетов;};// sys является корнем для каждой среды e и создает экземпляр объекта test_envextend sys { test_env: environment_u - это экземпляр;};'>
Рандомизация
В e каждое поле по умолчанию рандомизировано. Рандомизацию полей можно контролировать с помощью жестких ограничений, мягких ограничений или даже полностью отключить. Мягкие ограничения используются в качестве ограничений по умолчанию и могут быть автоматически отменены тестовым слоем в случае возникновения конфликта. В противном случае он ведет себя как обычное ограничение.
Пример
<'struct my_pkt_s { destination_address: uint (биты: 48); // это поле рандомизировано и не ограничено. data_payload: список байтов; ! parity_field: uint (биты: 32); // '!' предотвращает рандомизацию parity_field. сохраните soft data_payload.size () в [64..1500]; // мягкое ограничение, используемое для рандомизации по умолчанию сохранить data_payload.size () не в [128..256]; // это жесткое ограничение};'>
Утверждения
e поддерживает утверждения с временными выражениями. Временное выражение используется на том же синтаксическом уровне, что и поля и методы, и поэтому является декларативным по своей природе. Временное выражение описывает синхронизированное поведение.
Пример
<'unit temporal_example_u { событие а; // объявляем событие 'а' событие b; // объявляем событие 'b' событие c; // объявление события 'c' // Это утверждение предполагает, что следующий цикл после события a // было обнаружено, что происходит событие b, за которым следует событие c. ожидать @a => {@b; @c}};'>
Покрытие
e поддерживает покрытие, которое сгруппировано в соответствии с выбранным событием, и эти группы внутренне структурированы с элементами. Предметы могут быть простыми или сложными, например перечеркнутыми или переходными.
Пример
unit cover_example_u { событие cov_event_e; // сбор покрытия будет привязан к этому событию cover cov_event_e is { элемент a: uint (биты: 4); // этот элемент имеет 16 сегментов от 0 до 15 пункт b: bool; // у этого элемента два сегмента: ИСТИНА и ЛОЖЬ крестиком а, б; // этот элемент содержит матрицу перекрестного умножения a и b транс б; // этот элемент является производным от элемента b и имеет четыре сегмента // переход каждой комбинации ИСТИНА - ЛОЖЬ };};
Обмен сообщениями и отчетность
Обмен сообщениями внутри e может осуществляться различными способами.
Пример
unit message_example_u { example_message_method () - это { out ("Это безусловное, неформатированное выходное сообщение."); outf ("Это безусловное форматированное выходное сообщение, отображаемое в HEX% x", 15); print "Это безусловное сообщение."; message (LOW, "Это условное сообщение, обычно привязанное к регистратору сообщений.", "Вы также можете объединять такие строки и даже добавлять такие объекты, как", я, "в этом выходе". ); messagef (LOW, "Этот условный вывод отформатирован% x.", 15); };};
Взаимодействие с другими языками
Е испытательный стенд, вероятно, будет работать с RTL или высокоуровневой модели. Имея это в виду, e может взаимодействовать с VHDL , Verilog , C , C ++ и SystemVerilog .
Пример подключения e <-> Verilog
// Этот код находится в файле Verilog tb_top.v module testbench_top ; reg a_clk ; всегда # 5 a_clk = ~ a_clk ; начальное начало a_clk = 0 ; конец конечного модуля
Этот код находится в файле signal_map.e<'unit signal_map_u { // Определяем порт с именем 'a_clk_p' a_clk_p: в простом_порте бита - экземпляр; // Устанавливаем свойство порта hdl_path так, чтобы оно указывало на сигнал 'a_clk' в тестовой среде верхнего уровня сохранить a_clk_p.hdl_path () == "~ / testbench_top / a_clk";};'>
Поддержка аспектно-ориентированного программирования в e
Процесс функциональной проверки требует повышения уровня абстракции любого тестируемого проекта (DUT) за пределы уровня RTL. Эта необходимость требует языка, способного инкапсулировать данные и модели, который легко доступен в объектно-ориентированных языках. Для решения этой проблемы был разработан , чтобы быть е объектно-ориентированный язык , и на вершине , которая была дополнена механизмами аспектно-ориентированные , которые способствуют не только пишущих очень гибкие и многоразовые testbenches, но и помогает проверке инженеров, позволяя в патч обнаружил RTL ошибки без необходимости переписывать или касаться какой-либо из уже существующей базы кода.
Аспектно-ориентированное программирование на е позволяет инженерам по верификации структурировать свою тестовую среду по аспектам. Следовательно, объект - это сумма всех его аспектов, которые могут быть распределены по нескольким файлам. Следующие разделы иллюстрируют основные аспектно-ориентированные механизмы в e.
Механизм подтипа
Создание подтипов - яркий пример того, чего не могут достичь объектно-ориентированные языки без аспектно-ориентированных функций. Подтипирование позволяет инженеру по верификации добавлять функциональные возможности к уже определенному / реализованному классу, не производя его от базового класса. В следующем коде показана исходная реализация базового класса и способы ее расширения. После того, как расширение имело место, все объекты базового класса также содержат расширения. Ограничения, указанные в двух разных подтипах, обычно вызывают противоречие, однако оба подтипа обрабатываются отдельно, и, таким образом, каждый подтип дает разные вычисления ограничений.
Пример механизма подтипа
subtyping_example.e<'// Это определение типа перечисления используется для объявления подтипов ODD и EVENвведите ctrl_field_type_t: [НЕЧЕТНО, ЧЕТНО];unit base_ex_u { // Subtype_field - это определяющее поле, в котором применяется расчет subtype_field: ctrl_field_type_t; data_word: uint (биты: 32); parity_bit: бит; // Подтип типа ODD когда ODD'subtype_field base_ex_u { // Это простое ограничение, которое выполняет XOR индексного бита 0 для data_word и увеличивает это значение на единицу сохранить parity_bit == (data_word [0: 0] ^ data_word [0: 0] + 1); }; // Подтип ЧЕТНОГО типа когда EVEN'subtype_field base_ex_u { // Это ограничение такое же, как и выше, но приращение не выполняется сохранить parity_bit == (data_word [0: 0] ^ data_word [0: 0]); };};'>
Расширяющие методы
Исходное определение юнита дано в file1.e. Аспектно-ориентированный механизм, используемый в этом примере, показывает, как выполнять код до и после уже реализованного метода.
Пример расширения метода
Этот код находится в file1.e<'unit aop_example_u { meth_ext () - это { out ("Это оригинальная реализация метода."); };};'>
Этот код находится в file2.e<'extension aop_example_u { meth_ext () - первая { out ("Это расширение метода выполняется до реализации исходного метода."); }; meth_ext () также { out ("Это расширение метода выполняется после реализации исходного метода."); };};'>
Рекомендации
- The e Hardware Verification Language , Сасан Иман и Сунита Джоши, Springer, 28 мая 2004 г.
- Аспектно-ориентированное программирование с помощью языка электронной проверки , Дэвид Робинсон, 2007 г.
Источники
- Электронный языковой блог (Team Specman)
- http://www.eda.org/twiki/bin/view.cgi/P1647/WebHome IEEE 1647
- http://www.deepchip.com/items/0488-05.html (хорошие отзывы пользователей об их опыте работы с языком e)
- http://www.cadence.com/products/functional_ver/specman_elite/index.aspx
- http://www.us.design-reuse.com/articles/article5646.html
- Яник Бержерон: Написание тестовых стендов: функциональная проверка моделей HDL , второе издание, Kluwer Academic Publishers, 2003, ISBN 1-4020-7401-8
- https://web.archive.org/web/20070405162901/http://amiq.ro/eparser.html
- http://www.thinkverification.com/
- http://www.dvteclipse.com/help.html?documentation/e/index.html