Спец курс (Верификация цифровых схем)/Практические задания 3
Материал из Wiki
				
								
				
				
																
				
				
								
				Лекции ВЦС
Лекции
Практические задания
  | 
Тесты
Табель успеваемости
Экзамен
Доп. материалы
Общие для всех вариантов шаги лаб 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.0 Агент
- Добавить регистрацию класса в фабрике с помощью макроса
 - В классе агента объявить указатели на драйвер и монитор
 -   Перенести создание объектов драйвера и монитора в build_phase агента из топ модуля
- не забудьте поменять второй параметр конструктора (uvm_root::get() -> this);
 - при создании используйте new() или create()
 
 
Шаг 3. Соединить драйвер и сиквенсер
- В классе агента в методе connect_phase соединить встроенные в драйвер и сиквенсер порты seq_item_port и seq_item_export
 
Шаг 4. Сиквенс
- Создать класс наследуемый от uvm_sequence
 -  Реализовать метод класса body ()
- объявить указатель на транзакцию tr
 - создать транзакцию tr
 - вызывать метод класса start_item(tr);
 - вызвать tr.randomize() для объекта транзакции;
 - вызвать метод класса finish_item();
 
 - повторить перечисленные выше действия 10 раз;
 
Шаг 5. Заменить вывод сообщений на UVM INFO макросы
Шаг 6. Соединить интерфейс , драйвер , монитор
-  В топ модуле после создания интерфейса реализовать initial begin end
- В блоке begin end вызвать метод помещающий интерфейс в базу конфигурации
 - uvm_config_db#(virtual interface):: set (null, "*", "vif", vif);
 
 -  В дравере и мониторе в build_phase таск добавить вызов метода получающего указатель на интерфейс из базы конфигурации
- uvm_config_db#(virtual interface):: set (this, "", "vif", vif);
 
 
Шаг 7. Тест/Окружение
- Создать класс наследуемый от uvm_test с именем my_uvm_test
 - Реализовать метод build_phase этого класса
- Создание объекта агента
 - Создание объекта сиквенсы
 
 - Реализовать run_phase теста : 
- Поднять объект управления (raise_objection)
 - Запустить сиквенс на сиквенсере использую метод start()
 - Снять объект управления (drop_objection)
 
 
Шаг 8. Запустить тест на выполнение
-  В топ модуле после создания интерфейса реализовать initial begin end
- В блоке begin end вызвать метод run_test ("my_uvm_test"); my_uvm_test - имя, которые вы дали классу теста.
 
 
Как выбрать вариант
Для задания 1 варианты выбираются согласно   табелю успеваемости.
Например: если вариант 3.2 - это значит что необходимо разработать транзакцию SPI без использования UVM макросов.
Спецификации
- APB
 - UART
 - SPI
 
Задание
-  По спецификации интерфейса (*) блока разработать транзакцию, позволяющую описать все доступные операции на заданном интерфейсе:
- с использованием UVM макросов.
 - без использования UVM макросов.
 
 - Создать пакет, реализующий весь функционал агента (сиквенсер, драйвер, монитор) из существующих файлов описания всех составных блоков и скомпилировать его. (Можно использовать файлы из проекта https://www.edaplayground.com/x/3ru7)
 - Реализовать объект конфигурации агента, который содержит методы настройки в три режима: по умолчанию активный ведущий, пассивный, активный ведомый режимы
 
Дополнительно
- Реализовать фазу сброса в драйвере
 - Реализовать фазу, предшествующую фазе сброса
 - Подменить драйвер в агенте, из окружения в фазе создания компонент
 - Создать домен фазы выполнения для агента и подключить агент к этому домену