- Описание UVM
- Особенности UVM
- 1. Модульность и масштабируемость
- 2. Повторное использование кода
- 3. Встроенные проверки (scoreboards)
- 4. Поддержка объектно-ориентированного программирования (ООП)
- 5. Встроенные механизмы управления тестовыми сценариями
- Ключевые компоненты UVM
- 1. uvm_test — тестовый компонент
- 2. uvm_env — среда
- 3. uvm_agent — агент
- 4. uvm_driver — драйвер
- 5. uvm_monitor — монитор
- 6. uvm_scoreboard — таблица результатов
- 7. uvm_sequence и uvm_sequencer — последовательность и генератор последовательностей
- 8. uvm_config_db — база данных конфигураций
- 9. uvm_factory — фабрика объектов
- 10. uvm_analysis_port — анализирующий порт
- 11. uvm_report_server — сервер отчетности
- 12. uvm_reg — регистровая модель
- 13. uvm_object — базовый объект
- Реализация верификации с использованием UVM
- 1. Определение требований к верификации
- 2. Создание тестовой спецификации
- 3. Разработка тестовой среды (Testbench)
- 4. Настройка конфигурации и параметризации тестов
- 5. Разработка тестов и последовательностей стимулов
- 6. Реализация Scoreboard и сбор покрытия (coverage)
- 7. Запуск тестов и отладка
- 8. Анализ и генерация отчетов
- 9. Завершение верификации и приемка
- Пример использования UVM
- 1. Определение требований к верификации
- 2. Создание тестовой спецификации
- 3. Разработка тестовой среды (Testbench)
- 4. Настройка конфигурации и параметризация тестов
- 5. Разработка тестов и последовательностей стимулов
- 6. Реализация Scoreboard и сбор покрытия
- 7. Запуск тестов и отладка
- 8. Анализ и генерация отчетов
- 9. Завершение верификации и приемка
- Объяснение примера
- 1. Определение требований к верификации
- 2. Создание тестовой спецификации
- 3. Разработка тестовой среды (Testbench)
- 4. Настройка конфигурации и параметризация тестов
- 5. Разработка тестов и последовательностей стимулов
- 6. Реализация Scoreboard и сбор покрытия
- 7. Запуск тестов и отладка
- 8. Анализ и генерация отчетов
- 9. Завершение верификации и приемка
- Заключение
- Часто задаваемые вопросы (FAQ)
Универсальная методология верификации (UVM, Universal Verification Methodology) — это стандарт для создания тестовых сред, используемых для верификации сложных цифровых систем на аппаратном уровне. Он разработан для использования с языком описания аппаратуры SystemVerilog и предоставляет удобные инструменты для создания, конфигурирования и управления сложными тестовыми средами, что упрощает процесс верификации.
Описание UVM
UVM является библиотекой, предоставляющей готовый набор классов, компонентов и методов для создания гибкой и модульной среды верификации. Это особенно полезно для проверки работоспособности больших и сложных цифровых систем, таких как процессоры, контроллеры и другие аппаратные блоки. UVM основан на объектно-ориентированном подходе, что позволяет строить тестовые системы, которые могут быть повторно использованы в различных проектах, уменьшая объем работы и снижая вероятность ошибок.
Основные цели UVM:
- Упрощение процесса создания модульной тестовой среды.
- Стандартизация верификационных подходов для повышения совместимости между различными проектами и командами.
- Повышение эффективности и уменьшение временных затрат на верификацию путем создания легко адаптируемых компонентов.
Особенности UVM
UVM предоставляет широкий спектр функционала и обладает несколькими важными особенностями, которые делают его мощным инструментом для верификации.
1. Модульность и масштабируемость
UVM построен на модульной архитектуре, что означает, что его компоненты могут быть легко настроены и адаптированы под нужды конкретного проекта. Это упрощает работу с большими системами и позволяет добавлять новые компоненты по мере роста проекта.
2. Повторное использование кода
UVM поддерживает концепцию повторного использования кода. Компоненты верификационной среды, такие как драйверы, мониторы и тесты, могут быть использованы в других проектах без значительных изменений. Это сокращает время разработки и обеспечивает надежность, так как проверенные компоненты не требуют дополнительной отладки.
3. Встроенные проверки (scoreboards)
UVM включает в себя концепцию scoreboard, которая позволяет отслеживать корректность работы системы путем сравнения ожидаемых и реальных результатов. Это делает процесс отладки более удобным и точным.
4. Поддержка объектно-ориентированного программирования (ООП)
UVM поддерживает ООП, что делает его удобным для создания сложных структур и иерархий. В частности, использование наследования и полиморфизма упрощает настройку и настройку тестовой среды.
5. Встроенные механизмы управления тестовыми сценариями
UVM предоставляет несколько методов для управления выполнением тестов, включая генерацию стимулов и управление последовательностями. Это дает гибкость в создании различных сценариев тестирования, которые помогают лучше понять поведение тестируемого объекта (DUT, Design Under Test).
Ключевые компоненты UVM
1. uvm_test — тестовый компонент
uvm_test — основной компонент, представляющий собой входную точку для запуска верификации. В тесте описывается пользовательская логика и стратегии тестирования, а также настраивается необходимая среда. В UVM-тесте инициализируются и запускаются все остальные компоненты, включая последовательности стимулов.
2. uvm_env — среда
uvm_env (UVM Environment) — это контейнер для организации тестовой среды. Этот компонент объединяет различные подсистемы, такие как агенты agent и scoreboard, также другие компоненты. Он отвечает за сбор всех элементов и их настройку для конкретного теста. Среда позволяет отделить тестовую логику от компонентов и облегчает повторное использование.
3. uvm_agent — агент
Агент (uvm_agent) обычно выполняет функции драйвера, секвенсора и монитора для одного интерфейса. Агент может работать в двух режимах:
- Active agent — генерирует стимулы и отправляет их на тестируемый блок (DUT).
- Passive agent — просто наблюдает за сигналами и передает данные в scoreboard для анализа.
4. uvm_driver — драйвер
uvm_driver — компонент, отвечающий за отправку транзакций(инициируют запросы на новые транзакции через UVMSeqItemPullPort) на тестируемый дизайн (DUT). Драйвер принимает транзакции от последовательности (sequence) и преобразует их в сигналы, соответствующие интерфейсу DUT. Драйвер управляет процессом генерации стимулов и взаимодействием с реальными входами DUT, чтобы обеспечить правильный поток данных.
5. uvm_monitor — монитор
uvm_monitor отвечает за сбор данных с интерфейса DUT без активного вмешательства. Монитор получает сигналы от DUT, конвертирует их в транзакции и передает дальше, например, в scoreboard или uvm_analysis_port. Это компонент пассивного контроля, который не взаимодействует с DUT напрямую, а только «снимает» с него данные.
6. uvm_scoreboard — таблица результатов
uvm_scoreboard используется для проверки корректности данных, переданных через интерфейсы DUT. Scoreboard сравнивает фактические результаты работы DUT с ожидаемыми. Он получает транзакции от мониторов и проводит сравнение или анализ на соответствие ожидаемым значениям. Это один из ключевых компонентов для выявления ошибок в дизайне.
7. uvm_sequence и uvm_sequencer — последовательность и генератор последовательностей
- uvm_sequence — это компонент для описания последовательности стимулов, отправляемых на DUT. Последовательности позволяют создать набор транзакций для тестирования DUT с различными наборами данных и условий.
- uvm_sequencer — генератор, координирующий отправку транзакций от последовательности к драйверу. Он управляет потоком транзакций и передает их драйверу, который отправляет данные на DUT. С помощью sequencer можно гибко управлять процессом тестирования, организуя различные сценарии.
8. uvm_config_db — база данных конфигураций
uvm_config_db — это механизм для хранения и передачи параметров между компонентами UVM. С помощью uvm_config_db можно передавать настройки и параметры в драйверы, мониторы, агенты и другие компоненты, что делает конфигурацию тестов более гибкой и удобной для изменения без переписывания кода.
9. uvm_factory — фабрика объектов
uvm_factory предоставляет возможность создания объектов UVM динамически. Это особенно полезно для гибкого создания компонентов и их подстановки в тестах, так как позволяет заменять компоненты на альтернативные реализации или параметры. Благодаря фабрике можно легко адаптировать среду для новых тестов, изменяя поведение среды.
10. uvm_analysis_port — анализирующий порт
uvm_analysis_port используется для передачи данных между компонентами, такими как мониторы и scoreboard. Этот порт организует одностороннюю передачу данных, что особенно полезно для мониторинга и анализа данных. Мониторы используют uvm_analysis_port для передачи транзакций в scoreboard, где данные проверяются на корректность.
11. uvm_report_server — сервер отчетности
uvm_report_server обрабатывает, управляет выводом сообщений и отчетов, что помогает отслеживать ход теста и анализировать результаты. Он позволяет выводить различные типы сообщений (например, ошибки, предупреждения, информационные сообщения) и управлять уровнем детализации отчетов.
12. uvm_reg — регистровая модель
uvm_reg — это компонент для работы с регистровой моделью DUT, а также представляет собой набор полей, доступных как единое целое. Это полезно для верификации дизайнов, содержащих сложные регистровые структуры.
13. uvm_object — базовый объект
uvm_object — это базовый класс, от которого наследуются все объекты в UVM. Он предоставляет базовые функции, такие как copy() и compare(), которые делают объекты UVM гибкими и удобными для передачи и сравнения данных. Классы uvm_transaction и uvm_report_object UVM наследуются от uvm_object.
Реализация верификации с использованием UVM
Реализация верификации с использованием Universal Verification Methodology (UVM) проходит через несколько ключевых этапов. Каждый этап структурирован, чтобы обеспечить полное и систематическое тестирование устройства (DUT — Design Under Test) и выявление потенциальных ошибок. Рассмотрим основные этапы:
1. Определение требований к верификации
Перед началом верификации необходимо четко определить цели и задачи тестирования. Этот этап включает анализ функциональных требований DUT и составление плана верификации. Определяются ключевые функции, которые должны быть проверены, а также условия, в которых будет работать DUT. Целью является формулировка полного набора проверок, которые необходимы для обеспечения корректности и надежности дизайна.
2. Создание тестовой спецификации
На основе требований к верификации составляется тестовая спецификация. Это документ, в котором описываются сценарии тестирования, ожидаемые результаты, основные тестовые случаи и любые специфические условия, при которых нужно проверить DUT. В тестовой спецификации также указываются предполагаемые покрытия (coverage) и метрики верификации, которые будут использованы для оценки качества тестирования.
3. Разработка тестовой среды (Testbench)
Этот этап включает создание модульной и гибкой тестовой среды, которая будет взаимодействовать с DUT. В UVM тестовая среда состоит из множества компонентов, таких как драйверы, мониторы, агенты, регистровая модель, scoreboard, и другие. Эти компоненты объединяются для создания среды, способной подавать на DUT различные стимулы и проверять его отклик.
Основные компоненты тестовой среды:
- Драйверы и мониторы для работы с интерфейсами DUT.
- Агенты для объединения драйверов и мониторов.
- Scoreboard для сравнения фактических и ожидаемых данных.
- Регистровая модель для работы с внутренними регистрами DUT.
4. Настройка конфигурации и параметризации тестов
На этом этапе осуществляется настройка параметров тестовой среды и компонентов для работы с конкретным DUT. В UVM используется конфигурационная база данных uvm_config_db, которая позволяет передавать настройки в различные компоненты тестовой среды. Такая настройка обеспечивает гибкость тестов и позволяет адаптировать один и тот же код для работы с разными условиями и параметрами DUT.
5. Разработка тестов и последовательностей стимулов
В UVM для тестирования используются последовательности (sequence), которые определяют набор стимулов для DUT. Создание этих последовательностей — важный этап, так как последовательности управляют подачей транзакций в драйверы и задают сценарии тестирования. Последовательности разрабатываются таким образом, чтобы покрыть все функциональные возможности DUT.
Каждый тест может включать несколько последовательностей, моделирующих различные сценарии, такие как проверка на границах, стресс-тестирование, проверка на допустимые и недопустимые значения и т.д.
6. Реализация Scoreboard и сбор покрытия (coverage)
Scoreboard используется для проверки корректности работы DUT. Он сравнивает фактические результаты с ожидаемыми и определяет, прошел ли тест успешно. На этом этапе также организуется сбор покрытия (coverage) для оценки полноты тестирования. Покрытие можно настроить на уровне транзакций, сигналов и состояний DUT.
Покрытие помогает обнаружить функциональные части DUT, которые не были протестированы. Высокий уровень покрытия указывает на качественное тестирование, но для полной верификации важно учесть и нетривиальные сценарии.
7. Запуск тестов и отладка
Запуск тестов — один из самых значительных этапов, требующий внимательного анализа результатов. На этом этапе тесты запускаются в симуляторе, и инженеры анализируют логи и отчеты, выявляя возможные ошибки. Особое внимание уделяется анализу сообщений из Scoreboard, журналам от драйверов и мониторов, а также проверке покрытий. Любые несоответствия требуют дальнейшей отладки и устранения ошибок.
8. Анализ и генерация отчетов
После выполнения всех тестов и достижения высокого уровня покрытия проводится итоговый анализ. Это включает оценку всех пройденных тестов, успешности покрытия и уровня соответствия требованиям спецификации. На основе собранных данных генерируется отчет, где отражены выявленные ошибки, информация о прохождении тестов и покрытиях, а также возможные рекомендации по улучшению дизайна или тестов.
9. Завершение верификации и приемка
Финальный этап включает подтверждение завершения всех тестов и соответствия дизайна всем функциональным требованиям. Если все тесты успешно пройдены, покрытие соответствует требуемым значениям, а обнаруженные ошибки устранены, верификация считается завершенной. DUT готов к следующему этапу разработки или к производству.
Пример использования UVM
Для демонстрации процесса верификации на основе UVM представим простой пример тестирования 4-битного сумматора (Adder) на базе SystemVerilog и UVM. Цель верификации — проверить корректную работу сумматора при различных входных значениях и сценариях. Рассмотрим основные этапы разработки тестовой среды, последовательностей стимулов, Scoreboard и других компонентов UVM.
1. Определение требований к верификации
Наш DUT — это 4-битный сумматор, который принимает на вход два 4-битных числа и производит 4-битный результат (и бит переноса). Требования к верификации включают:
- Проверку работы сумматора на корректных значениях.
- Проверку поведения при переполнении (когда сумма больше 4 бит).
- Проверку, что при подаче входных данных результат соответствует ожидаемому значению.
2. Создание тестовой спецификации
Тестовая спецификация описывает базовые тестовые сценарии:
- Сложение двух чисел в диапазоне 0–15.
- Проверка на переполнение.
- Негативные тесты для проверки стабильности схемы при подаче на вход максимальных значений.
3. Разработка тестовой среды (Testbench)
Основные компоненты нашей UVM-тестовой среды:
- Драйвер (Driver): подает транзакции (входные данные) на вход DUT.
- Монитор (Monitor): наблюдает за выходными сигналами и записывает результаты.
- Агент (Agent): объединяет драйвер и монитор.
- Scoreboard: сравнивает полученные значения с ожидаемыми.
class adder_driver extends uvm_driver#(adder_transaction);
`uvm_component_utils(adder_driver)
virtual adder_if vif;
function new(string name = "adder_driver", uvm_component parent = null);
super.new(name, parent);
endfunction
virtual task run_phase(uvm_phase phase);
forever begin
adder_transaction tr;
seq_item_port.get_next_item(tr);
vif.a = tr.a;
vif.b = tr.b;
#10; // Пауза для моделирования задержки
seq_item_port.item_done();
end
endtask
endclass
4. Настройка конфигурации и параметризация тестов
// Пример настройки
uvm_config_db#(virtual adder_if)::set(this, "*", "vif", vif);
5. Разработка тестов и последовательностей стимулов
class adder_sequence extends uvm_sequence#(adder_transaction);
`uvm_object_utils(adder_sequence)
function new(string name = "adder_sequence");
super.new(name);
endfunction
virtual task body();
adder_transaction tr;
foreach (int i, j in 0:15) begin
tr = adder_transaction::type_id::create("tr");
tr.a = i;
tr.b = j;
start_item(tr);
finish_item(tr);
end
endtask
endclass
6. Реализация Scoreboard и сбор покрытия
class adder_scoreboard extends uvm_scoreboard;
`uvm_component_utils(adder_scoreboard)
function void write(adder_transaction tr);
int expected_sum = tr.a + tr.b;
if (tr.result !== expected_sum) begin
`uvm_error("Scoreboard", $sformatf("Error: %0d + %0d != %0d", tr.a, tr.b, tr.result));
end
endfunction
endclass
7. Запуск тестов и отладка
class adder_test extends uvm_test;
`uvm_component_utils(adder_test)
function new(string name = "adder_test", uvm_component parent = null);
super.new(name, parent);
endfunction
virtual task run_phase(uvm_phase phase);
adder_sequence seq;
uvm_config_db#(adder_sequence)::set(this, "*", "seq", seq);
seq.start(env.agent.sequencer);
endtask
endclass
8. Анализ и генерация отчетов
После выполнения всех тестов проверяем покрытие всех возможных сценариев. При необходимости вносим коррективы в тесты и последовательно обновляем среду для улучшения покрытия.
9. Завершение верификации и приемка
Когда все тесты успешно завершены, а покрытие достигнуто, делается вывод о корректности работы сумматора.
Объяснение примера
Давайте разберем приведенный пример, чтобы понять, как каждый этап и компонент UVM помогает верифицировать работу 4-битного сумматора. Это пошаговое объяснение охватывает основные аспекты каждого фрагмента кода, чтобы показать, как они взаимодействуют в полной системе UVM-верификации.
1. Определение требований к верификации
На этом этапе описываются цели и задачи верификации, которые нужно достичь. Для нашего простого сумматора основные требования включают проверку корректного сложения двух чисел от 0 до 15, а также обработку переполнения (результат больше, чем 4-битное число может вместить). Эти требования задают направление для разработки тестов и проверки условий.
2. Создание тестовой спецификации
В тестовой спецификации выделяются сценарии, которые необходимо реализовать. Например:
- Тесты для обычных случаев сложения.
- Тесты для переполнения при сложении чисел, результат которых превышает 4-битный диапазон.
Эта спецификация позволяет четко обозначить, какие проверки нужно выполнить, и облегчает планирование тестов.
3. Разработка тестовой среды (Testbench)
В UVM тестовая среда состоит из компонентов, которые организованы в иерархическую структуру. Компоненты включают драйвер, монитор, агент и Scoreboard.
- Драйвер (Driver): Драйвер получает данные от последовательности (adder_sequence) и отправляет их на вход сумматора (DUT). Это позволяет моделировать поведение тестовой среды, подавая различные значения на входы.
forever begin
adder_transaction tr;
seq_item_port.get_next_item(tr); // Получаем следующую транзакцию
vif.a = tr.a;
vif.b = tr.b;
#10; // Моделирование задержки
seq_item_port.item_done();
end
Здесь seq_item_port.get_next_item(tr) и seq_item_port.item_done() позволяют драйверу синхронизироваться с последовательностью стимулов.
- Монитор (Monitor): Монитор отслеживает выходные значения DUT и передает их в Scoreboard для дальнейшего анализа. Это помогает собирать информацию о поведении DUT, не влияя на процесс тестирования.
- Агент (Agent): Агент объединяет драйвер и монитор, создавая среду для взаимодействия с DUT. Он принимает на себя организацию передачи данных между этими компонентами, упрощая их использование.
- Scoreboard: Этот компонент сравнивает выходные значения DUT с ожидаемыми. В нашем случае Scoreboard проверяет, совпадают ли результаты сложения с ожидаемыми значениями.
if (tr.result !== expected_sum) begin
`uvm_error("Scoreboard", $sformatf("Error: %0d + %0d != %0d", tr.a, tr.b, tr.result));
end
Здесь проверка производится путем сравнения tr.result с expected_sum. Если они не равны, Scoreboard выдает ошибку, что помогает отладить работу DUT.
4. Настройка конфигурации и параметризация тестов
uvm_config_db#(virtual adder_if)::set(this, "*", "vif", vif);
Это настраивает виртуальный интерфейс vif, связывая его с драйвером, чтобы драйвер мог управлять входными данными для DUT.
5. Разработка тестов и последовательностей стимулов
foreach (int i, j in 0:15) begin
tr = adder_transaction::type_id::create("tr");
tr.a = i;
tr.b = j;
start_item(tr);
finish_item(tr);
end
Здесь цикл foreach генерирует комбинации значений a и b, чтобы протестировать все возможные пары. Это важно для достижения полного покрытия всех возможных входных значений.
6. Реализация Scoreboard и сбор покрытия
Scoreboard сравнивает полученные результаты с ожидаемыми значениями. Это позволяет автоматически проверять, что все тестовые сценарии отработали корректно.
7. Запуск тестов и отладка
adder_sequence seq;
uvm_config_db#(adder_sequence)::set(this, "*", "seq", seq);
seq.start(env.agent.sequencer);
Это код запускает тестовую последовательность на нашем sequencer, который передает данные драйверу.
8. Анализ и генерация отчетов
После запуска всех тестов UVM собирает данные о покрытии и сравнивает их с целью. Отчет о покрытии помогает убедиться, что каждый сценарий был учтен, и можно выявить пробелы в покрытии, если они есть.
9. Завершение верификации и приемка
На завершающем этапе анализируется результат выполнения тестов, и если все проверки успешны, делается вывод о готовности DUT к дальнейшему использованию.
Заключение
UVM — мощный инструмент для создания сложных тестовых сред, ориентированных на верификацию аппаратных проектов. Благодаря модульной архитектуре и встроенным функциям управления тестами UVM упрощает процесс верификации, делая его более эффективным. В этой статье мы рассмотрели основные аспекты UVM, его особенности и функции, а также привели пример использования UVM на практике. Внедрение UVM в рабочий процесс поможет упростить задачи тестирования и сократить время на разработку.
Часто задаваемые вопросы (FAQ)
1. Что такое UVM и для чего он нужен?
UVM — это стандарт для создания среды верификации, используемой для тестирования цифровых проектов. Он позволяет эффективно проверять сложные системы, такие как процессоры и контроллеры.
2. Каковы основные компоненты UVM?
К основным компонентам UVM относятся драйверы, мониторы, scoreboards и генераторы тестов.
3. Можно ли использовать UVM с другими языками?
UVM разработан для языка SystemVerilog и не совместим с другими языками напрямую. Однако его можно адаптировать под другие среды.
4. Что такое scoreboard в UVM?
Scoreboard — компонент, который сравнивает реальные и ожидаемые данные, помогая выявить ошибки.
5. Какова роль драйвера в UVM?
Драйвер в UVM отвечает за генерацию стимулов и управление данными, передаваемыми в DUT.
UVM представляет собой универсальный и гибкий инструмент для создания среды верификации, который значительно упрощает процесс тестирования сложных цифровых проектов.