Спец курс (Верификация цифровых схем)/Практические задания 3 — различия между версиями
Материал из Wiki
Vidokq (обсуждение | вклад) |
ANA (обсуждение | вклад) м |
||
| Строка 2: | Строка 2: | ||
= Общие для всех вариантов шаги лаб 3 = | = Общие для всех вариантов шаги лаб 3 = | ||
== Шаг 1. Создание интерфейса == | == Шаг 1. Создание интерфейса == | ||
| − | # Объявить интерфейс который содержит тактовый сигнал clk, сигнал сброса rst, и сигнал test. | + | # Объявить интерфейс, который содержит тактовый сигнал clk, сигнал сброса rst, и сигнал test. |
# Создать модуль и в нем инстанциировать интерфейс | # Создать модуль и в нем инстанциировать интерфейс | ||
| − | # Объявить переменную типа reg по имени | + | # Объявить переменную типа reg по имени clk_i, rst_i. |
| − | # В initial блоке создать генератор тактового сигнала и сброса используя переменные clk_i,rst_i; | + | # В initial блоке создать генератор тактового сигнала и сброса используя, переменные clk_i, rst_i; |
# Подключить сигналы clk_i, rst_i к интерфейсу. | # Подключить сигналы clk_i, rst_i к интерфейсу. | ||
| − | == Шаг 2. Создание класса конвертации транзакции | + | == Шаг 2. Создание класса конвертации транзакции и воздействия на проводном интерфейсе == |
# Создать класс с названием driver_t. | # Создать класс с названием driver_t. | ||
# В классе объявить переменную типа virtual interface. | # В классе объявить переменную типа virtual interface. | ||
# Объявить event get_next_item_e; | # Объявить event get_next_item_e; | ||
| − | # Реализовать virtual task mrun_phase в этом классе.(должен содержать бесконечный цикл, который ожидает события get_next_item_e). После получения события класс должен ожидать события posedge на сигнале clk(на интерфейсе), после брать значения из объекта транзакции (test) назначать на сигнал интерфейса (test). | + | # Реализовать virtual task mrun_phase в этом классе.(должен содержать бесконечный цикл, который ожидает события get_next_item_e). После получения события класс должен ожидать события posedge на сигнале clk (на интерфейсе), после брать значения из объекта транзакции (test) назначать на сигнал интерфейса (test). |
== Шаг 3. Запуск и проверка конвертации == | == Шаг 3. Запуск и проверка конвертации == | ||
| − | # Создать объект в модуле, | + | # Создать объект в модуле, объявленном в предыдущем задании. |
| − | # Передать указатель на интерфейс в | + | # Передать указатель на интерфейс в объект driver |
# Запустить task mrun_phase | # Запустить task mrun_phase | ||
| − | # Создать в модуле класс транзакции содержащий поле rand test, передать указатель на транзакцию в класс driver. | + | # Создать в модуле класс транзакции, содержащий поле rand test, передать указатель на транзакцию в класс driver. |
# Вызвать триггер для события get_next_item_e. | # Вызвать триггер для события get_next_item_e. | ||
# Повторить генерацию транзакций 10 раз со случайным интервалом от 1 до 10 us. | # Повторить генерацию транзакций 10 раз со случайным интервалом от 1 до 10 us. | ||
| − | == Шаг 4. Создание класса получения транзакции с проводного интерфейса == | + | == Шаг 4. Создание класса, получения транзакции с проводного интерфейса == |
# Создать класс с названием monitor_t. | # Создать класс с названием monitor_t. | ||
# В классе объявить переменную типа virtual interface. | # В классе объявить переменную типа virtual interface. | ||
| − | # Реализовать virtual task mrun_phase в этом классе. Должен содержать бесконечный цикл. После получения события класс должен ожидать события posedge на сигнале clk(на интерфейсе), после брать значение сигнала test из интерфейса помещать его в транзакцию и печатать транзакцию в консоль. | + | # Реализовать virtual task mrun_phase в этом классе. Должен содержать бесконечный цикл. После получения события класс должен ожидать события posedge на сигнале clk (на интерфейсе), после брать значение сигнала test из интерфейса, помещать его в транзакцию и печатать транзакцию в консоль. |
== Шаг 5. Запуск монитора == | == Шаг 5. Запуск монитора == | ||
| Строка 34: | Строка 34: | ||
== Шаг 6. класс Agent == | == Шаг 6. класс Agent == | ||
# Создать класс Agent_t | # Создать класс Agent_t | ||
| − | # В классе должны создаваться объекты monitor , driver. | + | # В классе должны создаваться объекты monitor, driver. |
| − | # В классе реализовать virtual task mrun_phase в котором запускаются task mrun_phase из классов monitor,driver. | + | # В классе реализовать virtual task mrun_phase, в котором запускаются task mrun_phase из классов monitor,driver. |
# В классе объявить переменную virtual interface, cссылка на интерфейс должна пробрасываться в драйвер и монитор | # В классе объявить переменную virtual interface, cссылка на интерфейс должна пробрасываться в драйвер и монитор | ||
# Создать класс Agent в топ модуле | # Создать класс Agent в топ модуле | ||
| Строка 42: | Строка 42: | ||
== Шаг 7. Наследуемся от UVM == | == Шаг 7. Наследуемся от UVM == | ||
| − | # Создать класс my_driver_t наследуемый от uvm_driver | + | # Создать класс my_driver_t, наследуемый от uvm_driver |
# Функционал класса driver_t перенести в my_driver_t | # Функционал класса driver_t перенести в my_driver_t | ||
| − | # Создать класс my_monitor_t наследуемый от uvm_monitor | + | # Создать класс my_monitor_t, наследуемый от uvm_monitor |
# Функционал класса monitor_t перенести в my_monitor_t | # Функционал класса monitor_t перенести в my_monitor_t | ||
| − | # Создать класс my_agent_t наследуемый от uvm_agent | + | # Создать класс my_agent_t, наследуемый от uvm_agent |
# Функционал класса agent_t перенести в my_agent_t | # Функционал класса agent_t перенести в my_agent_t | ||
Версия 01:46, 11 ноября 2018
Лекции ВЦС
Лекции
Практические задания
|
Тесты
Табель успеваемости
Экзамен
Доп. материалы
Общие для всех вариантов шаги лаб 3
Шаг 1. Создание интерфейса
- Объявить интерфейс, который содержит тактовый сигнал clk, сигнал сброса rst, и сигнал test.
- Создать модуль и в нем инстанциировать интерфейс
- Объявить переменную типа reg по имени clk_i, rst_i.
- В initial блоке создать генератор тактового сигнала и сброса используя, переменные clk_i, rst_i;
- Подключить сигналы clk_i, rst_i к интерфейсу.
Шаг 2. Создание класса конвертации транзакции и воздействия на проводном интерфейсе
- Создать класс с названием driver_t.
- В классе объявить переменную типа virtual interface.
- Объявить event get_next_item_e;
- Реализовать virtual task mrun_phase в этом классе.(должен содержать бесконечный цикл, который ожидает события get_next_item_e). После получения события класс должен ожидать события posedge на сигнале clk (на интерфейсе), после брать значения из объекта транзакции (test) назначать на сигнал интерфейса (test).
Шаг 3. Запуск и проверка конвертации
- Создать объект в модуле, объявленном в предыдущем задании.
- Передать указатель на интерфейс в объект driver
- Запустить task mrun_phase
- Создать в модуле класс транзакции, содержащий поле rand test, передать указатель на транзакцию в класс driver.
- Вызвать триггер для события get_next_item_e.
- Повторить генерацию транзакций 10 раз со случайным интервалом от 1 до 10 us.
Шаг 4. Создание класса, получения транзакции с проводного интерфейса
- Создать класс с названием monitor_t.
- В классе объявить переменную типа virtual interface.
- Реализовать virtual task mrun_phase в этом классе. Должен содержать бесконечный цикл. После получения события класс должен ожидать события posedge на сигнале clk (на интерфейсе), после брать значение сигнала test из интерфейса, помещать его в транзакцию и печатать транзакцию в консоль.
Шаг 5. Запуск монитора
- Создать класс монитора в топ модуле
- Передать в класс ссылку на интерфейс
- Запустить в топ модуле task run_phase
Шаг 6. класс Agent
- Создать класс Agent_t
- В классе должны создаваться объекты monitor, driver.
- В классе реализовать virtual task mrun_phase, в котором запускаются task mrun_phase из классов monitor,driver.
- В классе объявить переменную virtual interface, cссылка на интерфейс должна пробрасываться в драйвер и монитор
- Создать класс Agent в топ модуле
- Передать в класс ссылку на интерфейс
- Запустить в топ модуле task mrun_phase: в результате в логе должна наблюдаться печать транзакций
Шаг 7. Наследуемся от 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
Шаг 8. Сиквенс
Шаг 9. Сиквенсер
Как выбрать вариант
Для задания 1 варианты выбираются согласно табелю успеваемости.
Например: если вариант 3.2 - это значит что необходимо разработать транзакцию SPI без использования UVM макросов.
Спецификации
- APB
- UART
- SPI
Задание
- По спецификации интерфейса (*) блока разработать транзакцию, позволяющую описать все доступные операции на заданном интерфейсе:
- с использованием UVM макросов.
- без использования UVM макросов.
- Создать пакет, реализующий весь функционал агента (сиквенсер, драйвер, монитор) из существующих файлов описания всех составных блоков и скомпилировать его. (Можно использовать файлы из проекта https://www.edaplayground.com/x/3ru7)
- Реализовать объект конфигурации агента, который содержит методы настройки в три режима: по умолчанию активный ведущий, пассивный, активный ведомый режимы
Дополнительно
- Реализовать фазу сброса в драйвере
- Реализовать фазу, предшествующую фазе сброса
- Подменить драйвер в агенте, из окружения в фазе создания компонент
- Создать домен фазы выполнения для агента и подключить агент к этому домену