«…лишь недалекие люди боятся конкуренции, а люди подлинного творчества ценят общение с каждым талантом…» А. Бек, Талант.

Спец курс (Верификация цифровых схем)/Практические задания 3 — различия между версиями

Материал из Wiki
Перейти к: навигация, поиск
(Спецификация APB интерфейса)
Строка 12: Строка 12:
 
# В классе объявить переменную типа virtual interface.
 
# В классе объявить переменную типа virtual interface.
 
# Объявить event get_next_item_e;
 
# Объявить event get_next_item_e;
# Реализовать task run_phase в этом классе.(должен содержать бесконечный цикл, который ожидает события get_next_item_e). После получения события класс должен ожидать события posedge  на сигнале clk(на интерфейсе), после брать значения из объекта транзакции и печатать их в консоль.
+
# Реализовать virtual task mrun_phase в этом классе.(должен содержать бесконечный цикл, который ожидает события get_next_item_e). После получения события класс должен ожидать события posedge  на сигнале clk(на интерфейсе), после брать значения из объекта транзакции (test) назначать  на сигнал интерфейса (test).
  
== Шаг 3. Запуск конвертации ==
+
== Шаг 3. Запуск и проверка конвертации ==
 
# Создать объект в модуле, объявленом в предыдущем задании.
 
# Создать объект в модуле, объявленом в предыдущем задании.
 
# Передать указатель на интерфейс в обьект driver   
 
# Передать указатель на интерфейс в обьект driver   
# Запустить task run_phase
+
# Запустить task mrun_phase
# Создать в модуле класс транзакции из лаб2, передать указатель на транзакцию в класс driver.
+
# Создать в модуле класс транзакции содержащий поле rand test, передать указатель на транзакцию в класс driver.
 
# Вызвать триггер для события get_next_item_e.
 
# Вызвать триггер для события get_next_item_e.
 
# Повторить генерацию транзакций 10 раз со случайным интервалом от 1 до 10 us.
 
# Повторить генерацию транзакций 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. Сиквенсер ==
  
 
= Как выбрать вариант =
 
= Как выбрать вариант =

Версия 18:31, 30 октября 2018

Лекции ВЦС

Лекции

Практические задания
Тесты

Табель успеваемости

Экзамен

Доп. материалы

Содержание

Общие для всех вариантов шаги лаб 3

Шаг 1. Создание интерфейса

  1. Объявить интерфейс который содержит тактовый сигнал clk, сигнал сброса rst, и сигнал test.
  2. Создать модуль и в нем инстанциировать интерфейс
  3. Объявить переменную типа reg по имени clk_i, rst_i.
  4. В initial блоке создать генератор тактового сигнала и сброса используя переменные clk_i,rst_i;
  5. Подключить сигналы clk_i, rst_i к интерфейсу.

Шаг 2. Создание класса конвертации транзакции в воздействия на проводном интерфейсе

  1. Создать класс с названием driver_t.
  2. В классе объявить переменную типа virtual interface.
  3. Объявить event get_next_item_e;
  4. Реализовать virtual task mrun_phase в этом классе.(должен содержать бесконечный цикл, который ожидает события get_next_item_e). После получения события класс должен ожидать события posedge на сигнале clk(на интерфейсе), после брать значения из объекта транзакции (test) назначать на сигнал интерфейса (test).

Шаг 3. Запуск и проверка конвертации

  1. Создать объект в модуле, объявленом в предыдущем задании.
  2. Передать указатель на интерфейс в обьект driver
  3. Запустить task mrun_phase
  4. Создать в модуле класс транзакции содержащий поле rand test, передать указатель на транзакцию в класс driver.
  5. Вызвать триггер для события get_next_item_e.
  6. Повторить генерацию транзакций 10 раз со случайным интервалом от 1 до 10 us.

Шаг 4. Создание класса получения транзакции с проводного интерфейса

  1. Создать класс с названием monitor_t.
  2. В классе объявить переменную типа virtual interface.
  3. Реализовать virtual task mrun_phase в этом классе. Должен содержать бесконечный цикл. После получения события класс должен ожидать события posedge на сигнале clk(на интерфейсе), после брать значение сигнала test из интерфейса помещать его в транзакцию и печатать транзакцию в консоль.

Шаг 5. Запуск монитора

  1. Создать класс монитора в топ модуле
  2. Передать в класс ссылку на интерфейс
  3. Запустить в топ модуле task run_phase

Шаг 6. класс Agent

  1. Создать класс Agent_t
  2. В классе должны создаваться объекты monitor , driver.
  3. В классе реализовать virtual task mrun_phase в котором запускаются task mrun_phase из классов monitor,driver.
  4. В классе объявить переменную virtual interface, cссылка на интерфейс должна пробрасываться в драйвер и монитор
  5. Создать класс Agent в топ модуле
  6. Передать в класс ссылку на интерфейс
  7. Запустить в топ модуле task mrun_phase: в результате в логе должна наблюдаться печать транзакций

Шаг 7. Наследуемся от UVM

  1. Создать класс my_driver_t наследуемый от uvm_driver
  2. Функционал класса driver_t перенести в my_driver_t
  3. Создать класс my_monitor_t наследуемый от uvm_monitor
  4. Функционал класса monitor_t перенести в my_monitor_t
  5. Создать класс my_agent_t наследуемый от uvm_agent
  6. Функционал класса agent_t перенести в my_agent_t

Шаг 8. Сиквенс

Шаг 9. Сиквенсер

Как выбрать вариант

Bombilla amarilla - yellow Edison lamp.pngДля задания 1 варианты выбираются согласно табелю успеваемости.

Например: если вариант 3.2 - это значит что необходимо разработать транзакцию SPI без использования UVM макросов.

Спецификации

  1. APB
  2. UART
  3. SPI

Задание

  1. По спецификации интерфейса (*) блока разработать транзакцию, позволяющую описать все доступные операции на заданном интерфейсе:
    1. с использованием UVM макросов.
    2. без использования UVM макросов.
  2. Создать пакет, реализующий весь функционал агента (сиквенсер, драйвер, монитор) из существующих файлов описания всех составных блоков и скомпилировать его. (Можно использовать файлы из проекта https://www.edaplayground.com/x/3ru7)
  3. Реализовать объект конфигурации агента, который содержит методы настройки в три режима: по умолчанию активный ведущий, пассивный, активный ведомый режимы

Дополнительно

  1. Реализовать фазу сброса в драйвере
  2. Реализовать фазу, предшествующую фазе сброса
  3. Подменить драйвер в агенте, из окружения в фазе создания компонент
  4. Создать домен фазы выполнения для агента и подключить агент к этому домену

Спецификация APB интерфейса

  • IHI0024C_amba_apb_protocol_spec.pdf

Спецификация CSR интерфейса

Спецификация UART интерфейса

Спецификация SPI интерфейса