Спец курс (Верификация цифровых схем)/Практические задания 3 — различия между версиями
Материал из Wiki
Vidokq (обсуждение | вклад) (→Шаг 9. Сиквенсер) |
Vidokq (обсуждение | вклад) |
||
Строка 1: | Строка 1: | ||
{{ВЦС_TOC}} | {{ВЦС_TOC}} | ||
= Общие для всех вариантов шаги лаб 3 = | = Общие для всех вариантов шаги лаб 3 = | ||
+ | |||
== Шаг 0. Создание класса транзакции == | == Шаг 0. Создание класса транзакции == | ||
# Создать описание класса seq_item. | # Создать описание класса seq_item. | ||
# Класс должен содержать битовое поле data | # Класс должен содержать битовое поле data | ||
+ | |||
== Шаг 1. Создание интерфейса == | == Шаг 1. Создание интерфейса == | ||
# Объявить интерфейс, который содержит тактовый сигнал clk, сигнал сброса rst, и сигнал data. | # Объявить интерфейс, который содержит тактовый сигнал clk, сигнал сброса rst, и сигнал data. | ||
Строка 48: | Строка 50: | ||
# Запустить в топ модуле task mrun_phase: в результате в логе должна наблюдаться печать транзакций | # Запустить в топ модуле task mrun_phase: в результате в логе должна наблюдаться печать транзакций | ||
− | == Шаг | + | = Общие для всех вариантов шаги лаб 3 при переходе к UVM = |
+ | |||
+ | == Шаг 1. Наследуемся от UVM == | ||
# Создать класс my_driver_t, наследуемый от uvm_driver | # Создать класс my_driver_t, наследуемый от uvm_driver | ||
# Функционал класса driver_t перенести в my_driver_t | # Функционал класса driver_t перенести в my_driver_t | ||
Строка 58: | Строка 62: | ||
## Переопределить конструктор | ## Переопределить конструктор | ||
## Поменять конструктор в точке вызова | ## Поменять конструктор в точке вызова | ||
+ | ### при вызове конструктора вторым параметром можно доставлять uvm_root::get() | ||
## Добавить макросы регистрации класса | ## Добавить макросы регистрации класса | ||
+ | ## В каждом описанном классе добавить описание 2 функций | ||
+ | ### function void build_phase (uvm_phase phase) | ||
+ | ### function void connect_phase (uvm_phase phase) | ||
+ | ## В каждом описанном классе добавить описание 1 дополнительного таска | ||
+ | ### task run_phase (uvm_phase phase) | ||
− | == Шаг | + | == Шаг 2. Сиквенсер == |
# Создать класс наследуемый от uvm_sequencer | # Создать класс наследуемый от uvm_sequencer | ||
− | == Шаг | + | |
+ | == Шаг 3. Соединить драйвер и сиквенсер == | ||
# Создать класс наследуемый от uvm_sequencer | # Создать класс наследуемый от uvm_sequencer | ||
− | == Шаг | + | |
+ | == Шаг 4. Сиквенс == | ||
# Создать класс наследуемый от uvm_sequence | # Создать класс наследуемый от uvm_sequence | ||
# Реализовать метод класса body | # Реализовать метод класса body | ||
Строка 73: | Строка 85: | ||
# повторить перечисленные выше действия 10 раз; | # повторить перечисленные выше действия 10 раз; | ||
− | == Шаг | + | == Шаг 5. Тест/Окружение == |
#Создать класс наследуемый от uvm_test с именем my_uvm_test | #Создать класс наследуемый от uvm_test с именем my_uvm_test | ||
− | #Реализовать | + | #Реализовать метод build_phase этого класса |
##Создание объекта агента | ##Создание объекта агента | ||
##Создание объекта сиквенсы | ##Создание объекта сиквенсы | ||
− | #Реализовать run_phase теста | + | #Реализовать run_phase теста : |
− | ## | + | ## Поднять объект управления (raise_objection) |
+ | ## Запустить сиквенс на сиквенсере использую метод start() | ||
+ | ## Снять объект управления (drop_objection) | ||
+ | |||
+ | == Шаг 6. Заменить вывод сообщений на UVM INFO макросы == | ||
+ | |||
= Как выбрать вариант = | = Как выбрать вариант = |
Версия 16:41, 8 октября 2019
Лекции ВЦС
Лекции
Практические задания
|
Тесты
Табель успеваемости
Экзамен
Доп. материалы
Общие для всех вариантов шаги лаб 3
Шаг 0. Создание класса транзакции
- Создать описание класса seq_item.
- Класс должен содержать битовое поле data
Шаг 1. Создание интерфейса
- Объявить интерфейс, который содержит тактовый сигнал clk, сигнал сброса rst, и сигнал data.
- Создать модуль и в нем инстанциировать интерфейс
- Объявить переменную типа reg по имени clk_i, rst_i.
- В initial блоке создать генератор тактового сигнала и сброса используя, переменные clk_i, rst_i;
- Подключить сигналы clk_i, rst_i к интерфейсу.
Шаг 2. Создание класса конвертации транзакции и воздействия на проводном интерфейсе
- Создать класс с названием driver_t.
- В классе объявить переменную типа virtual interface vif.
- Объявить переменную типа seq_item item1;
- Объявить event get_next_item_e;
- Реализовать virtual task mrun_phase в этом классе.
- Таск должен содержать бесконечный цикл, который ожидает события get_next_item_e.
- После получения события класс должен ожидать события posedge на сигнале clk (на интерфейсе)
- После брать значения из объекта транзакции item1.data и назначать на сигнал интерфейса vif.data
Шаг 3. Запуск и проверка конвертации
- Создать объект в модуле, объявленном в предыдущем задании.
- Передать указатель на интерфейс в объект driver
- Запустить task mrun_phase
- Создать в модуле класс транзакции, содержащий поле rand data, передать указатель на транзакцию в класс driver.
- Вызвать триггер для события get_next_item_e.
- Повторить генерацию транзакций 10 раз со случайным интервалом от 1 до 10 us.
Шаг 4. Создание класса, получения транзакции с проводного интерфейса
- Создать класс с названием monitor_t.
- В классе объявить переменную типа virtual interface.
- Реализовать virtual task mrun_phase в этом классе. Должен содержать бесконечный цикл. После получения события класс должен ожидать события posedge на сигнале clk (на интерфейсе), после брать значение сигнала test из интерфейса, помещать его в транзакцию и печатать транзакцию в консоль.
Шаг 5. Запуск монитора
- Создать класс монитора в топ модуле
- Передать в класс ссылку на интерфейс
- Запустить в топ модуле task mrun_phase
Шаг 6. класс Agent
- Создать класс Agent_t
- В классе должны создаваться объекты monitor, driver.
- В классе реализовать virtual task mrun_phase, в котором запускаются task mrun_phase из классов monitor,driver.
- В классе объявить переменную virtual interface, cссылка на интерфейс должна пробрасываться в драйвер и монитор
- Создать класс Agent в топ модуле
- Передать в класс ссылку на интерфейс
- Запустить в топ модуле task mrun_phase: в результате в логе должна наблюдаться печать транзакций
Общие для всех вариантов шаги лаб 3 при переходе к UVM
Шаг 1. Наследуемся от UVM
- Создать класс my_driver_t, наследуемый от uvm_driver
- Функционал класса driver_t перенести в my_driver_t
- Создать класс my_monitor_t, наследуемый от uvm_monitor
- Функционал класса monitor_t перенести в my_monitor_t
- Создать класс my_agent_t, наследуемый от uvm_agent
- Функционал класса agent_t перенести в my_agent_t
- В каждом из описанных шагов дополнительно
- Переопределить конструктор
- Поменять конструктор в точке вызова
- при вызове конструктора вторым параметром можно доставлять uvm_root::get()
- Добавить макросы регистрации класса
- В каждом описанном классе добавить описание 2 функций
- function void build_phase (uvm_phase phase)
- function void connect_phase (uvm_phase phase)
- В каждом описанном классе добавить описание 1 дополнительного таска
- task run_phase (uvm_phase phase)
Шаг 2. Сиквенсер
- Создать класс наследуемый от uvm_sequencer
Шаг 3. Соединить драйвер и сиквенсер
- Создать класс наследуемый от uvm_sequencer
Шаг 4. Сиквенс
- Создать класс наследуемый от uvm_sequence
- Реализовать метод класса body
- создать транзакцию tr
- вызывать метод класса start_item(tr);
- вызвать tr.randomize() для объекта транзакции;
- вызвать метод класса finish_item();
- повторить перечисленные выше действия 10 раз;
Шаг 5. Тест/Окружение
- Создать класс наследуемый от uvm_test с именем my_uvm_test
- Реализовать метод build_phase этого класса
- Создание объекта агента
- Создание объекта сиквенсы
- Реализовать run_phase теста :
- Поднять объект управления (raise_objection)
- Запустить сиквенс на сиквенсере использую метод start()
- Снять объект управления (drop_objection)
Шаг 6. Заменить вывод сообщений на UVM INFO макросы
Как выбрать вариант
Для задания 1 варианты выбираются согласно табелю успеваемости.
Например: если вариант 3.2 - это значит что необходимо разработать транзакцию SPI без использования UVM макросов.
Спецификации
- APB
- UART
- SPI
Задание
- По спецификации интерфейса (*) блока разработать транзакцию, позволяющую описать все доступные операции на заданном интерфейсе:
- с использованием UVM макросов.
- без использования UVM макросов.
- Создать пакет, реализующий весь функционал агента (сиквенсер, драйвер, монитор) из существующих файлов описания всех составных блоков и скомпилировать его. (Можно использовать файлы из проекта https://www.edaplayground.com/x/3ru7)
- Реализовать объект конфигурации агента, который содержит методы настройки в три режима: по умолчанию активный ведущий, пассивный, активный ведомый режимы
Дополнительно
- Реализовать фазу сброса в драйвере
- Реализовать фазу, предшествующую фазе сброса
- Подменить драйвер в агенте, из окружения в фазе создания компонент
- Создать домен фазы выполнения для агента и подключить агент к этому домену