«Работать добросовестно — значит: работать, повышая свою квалификацию, проявляя инициативу в совершенствовании продукции, технологий, организации работ, оказывая не предусмотренную должностными инструкциями помощь другим сотрудникам (включая и руководителей) в общей им всем работе.

OS-VVM (Диплом)/Описание тестовой программы

Материал из Wiki
Перейти к: навигация, поиск
Проект Диплом

Литература

Coverage Cookbook (en)

OVM методология

* OS-VVM *

Содержание

Архитектура тестбенча

Рисунок 1 — Архитектура тестбенча (edit)


Описание процедур/функций

Driver

Драйвер преобразует последовательность бит, передаваемых ему командой в огибающую.
Интерфейс:

  • Входы
    • data_size  : in natural - размер передаваемых данных;
    • data  : in bit_vector - входной сигнал;
  • Сигналы
    • signal output  : out std_logic - выходной сигнал (огибающая);

Responder

Респондер преобразует выходной сигнал DUT в последовательность бит. Запускается при получении стартового бита ответа.
Интерфейс:

  • Входы
  • Выходы
    • out_data  : out std_logic_vector(1 to 164) - выходная информация респондера;
    • bit_num  : out integer - количество бит, полученных респондером;
  • Сигналы
    • signal tdata_mod : in std_logic - сигнал из DUT;

Pause

Pause — ждет ответ DUT и считает периоды. Если по истечению MaxWaitTime сигнал не пришел, выходит из процедуры

Интерфейс:

  • Входы
    • MaxWaitTime : out natural — в периодах clk
  • Выходы
    • clk_num : out natural - количество периодов. Возвращает 0, если нет ответа после MaxWaitTime-циклов
  • Сигналы
    • signal tdata_mod : in std_logic - сигнал из DUT;

Reset

Reset останавливает clock генератор на указанное время.

Интерфейс:

  • Входы
    • wait_time : in time - время сброса(при 0 - бесконечно);
  • Выходы
  • Сигналы
    • signal stop : out bit - сигнал остановки clock генератора;

Команды

REQWUP

REQA — запрос карты

WUPA — запрос всех карт

  • Подаёт соответствующую команду на драйвер (если Mode = 0, то REQA(0х26), если Mode = 1, то WUPA(0х52))
  • Контролирует паузу между запросом и ответом
  • Принимает ответ и сравнивает его с ожидаемым ответом
  • Выдаёт ошибку, если
    • Пауза не соответствует спецификации (Error=1)
    • Ошибка в данных ответа (Error=2)
    • Если нет ошибки, Error=0

Интерфейс:

  • Входы
    • Mode : in bit; -- 0 = REQA 1 = WUPA
  • Выходы
    • Error : out bit (0..2).
  • Сигналы
    • signal tdata_mod : in std_logic - сигнал, идущий с выхода DUT;
    • signal CoilModulation : out std_logic - огибающая;

Anticollision

Anticollision — Антиколлизия и select 1/2 каскадного уровня

  • Подаёт соответствующую команду на драйвер (вычисляет код команды, добавляет 0x88 для 1 уровня, добавляет BCC и CRC)
  • Контролирует паузу между запросом и ответом
  • Принимает ответ и сравнивает его с ожидаемым ответом (используя UID)
  • Выдаёт ошибку, если
    • Пауза не соответствует спецификации (Error=1)
    • Ошибка в данных ответа (Error=2)
    • Если нет ошибки, Error=0

Интерфейс:

  • Входы
    • Level : in bit — каскадный уровень 1/2 (0=0х93, 1=0х95)
    • Arg  : in natural - аргумент (0х20-0х67)
    • UID  : in integer_vector(6 downto 0) — UID (7 байт, 6-MSB, 0-LSB)
  • Выходы
    • Error : out bit (true = ошибка, false= всё Ок).
  • Сигналы
    • signal tdata_mod : in std_logic - сигнал, идущий с выхода DUT;
    • signal CoilModulation : out std_logic - огибающая;

READ

READ - чтение

  • Подаёт соответствующую команду на драйвер (подаёт код команды 0x30, адрес и вычисляет CRC)
  • Контролирует паузу между запросом и ответом
  • Принимает ответ и сравнивает его с ожидаемым ответом (используя эталонную модель карточки)
  • Выдаёт ошибку (Error=0..3), если
    • 0 – нет ошибки
    • 1 – Пауза не соответствует спецификации
    • 2 – Ошибка в данных ответа
    • 3 – выдала NAK
    • 4 – нет ответа
    • 10 – другое

Интерфейс:

  • Входы
    • Arg  : in natural - адрес (0-15)
  • Выходы
    • Error : out natural (0..3).
  • Сигналы
    • signal tdata_mod : in std_logic - сигнал, идущий с выхода DUT;
    • signal CoilModulation : out std_logic - огибающая;

HALT

HALT — перевод в состояние ожидания

  • Подаёт соответствующую команду на драйвер ('50' '00' + CRC)
  • Контролирует паузу между запросом и ответом. Если ответа нет, то команда выполнилась успешно.
  • Принимает ответ и сравнивает его с ожидаемым ответом (NACK либо ACK(нет ответа))
  • Выдаёт ошибку (Error=0..3), если
    • 0 — всё Ок (ответа не было)
    • 1 — получен NACK
    • 2 — Пауза не соответствует спецификации
    • 3 — Ошибка в данных ответа (в NACK)

Интерфейс:

  • Входы
  • Выходы
    • Error : out natural (0..3).
  • Сигналы
    • signal tdata_mod : in std_logic - сигнал, идущий с выхода DUT;
    • signal CoilModulation : out std_logic - огибающая;

WRITE

WRITE — запись

  • Подаёт соответствующую команду на драйвер (подаёт команду (0xA2), данные, вычисляет четность, добавляет CRC)
  • Контролирует паузу между запросом и ответом
  • Принимает ответ и сравнивает его с ожидаемым ответом (используя Data)
  • Выдаёт ошибку (Error=0..3), если
    • 0 — всё ок
    • 1 — выдала NAK
    • 2 — Пауза не соответствует спецификации
    • 3 — Ошибка в данных ответа

Интерфейс:

  • Входы
    • Addr  : in natural - адрес (0-15)
    • Data  : in integer_vector(3 downto 0) — 4 байта
  • Выходы
    • Error : out natural (0..3).
  • Сигналы
    • signal tdata_mod : in std_logic - сигнал, идущий с выхода DUT;
    • signal CoilModulation : out std_logic - огибающая;

Bombilla amarilla - yellow Edison lamp.png Подумать как задавать ошибки в командах

COMPATIBILITY WRITE

COMPATIBILITY WRITE — совместимая запись

  • Подаёт первую часть команды на драйвер (вычисляет код команды, добавляет CRC)
  • Контролирует паузу между запросом и ответом
  • Подаёт вторую часть команды на драйвер (вычисляет код команды, добавляет CRC)
  • Контролирует паузу между запросом и ответом
  • Принимает ответ и сравнивает его с ожидаемым ответом (используя UID)
  • Выдаёт ошибку (Error=true), если
    • Пауза не соответствует спецификации
    • Ошибка в данных ответа

Интерфейс:

  • Входы
    • Arg  : in natural - адрес (0-15)
    • Data  : in integer_vector(4 downto 1) — 4 байта
  • Выходы
    • Error : out boolean (true = ошибка, false= всё Ок).
  • Сигналы
    • signal tdata_mod : in std_logic - сигнал, идущий с выхода DUT;
    • signal CoilModulation : out std_logic - огибающая;

Эталонная модель метки

Реализуется с помощью защищённого типа EEPROMGoldenModelPType и глобальной общей (shared) переменной EEPROMGoldenModel.

Тип EEPROMGoldenModelPType включает:

Данные:

  • массив данных Memory
variable Memory : integer_vector(0 to 16*4-1) := InitMemory("vhd/xeeprom.map");
  • TestMode : boolean := false; -- Тестовый режим работы метки
  • Флаги битов защиты
   variable BL1510 : boolean := false;  -- Lock bits L15-L10 lock bit
   variable BL0904 : boolean := false;  -- Lock bits L09-L0 lock bit
   variable BLOTP  : boolean := false;  -- Lock bit LOTP lock bit
  • Регистр хранения битов защиты (Должен иницилизироваться только по командам запроса ATQA WUPA
   variable LockRegister : std_logic_vector(15 downto 0) := InitLockBits;

Внутренние (скрытые) фунцкии

  • процедура InitMemory (FileName) — инициализация массива Memory из файла FileName
    function InitMemory (constant filename : string) return integer_vector
  • Функция инициализации битов защиты от записи
   impure function InitLockBits return std_logic_vector is

Методы:

  • функция CmdREQA — Переводит метку из состояния IDLE в READY1. Из других состояний возвращает метку в IDLE
   impure function CmdREQA return integer_vector;
  • функция CmdWUPA — Переводит метку из состояния IDLE, HALT в READY1. Из других состояний возвращает метку в IDLE
   impure function CmdWUPA return integer_vector;
  • процедура CmdWrite (Addr : 0..15 ; Data : 4 bytes) — запись в массив Memory, начиная с адреса Addr
  impure function CmdWrite (
   Addr : natural;
   Data : integer_vector(0 to 3))
   return std_logic_vector;
  • функция CmdRead (Addr : 0..15 ) return 4 bytes; — возвращает 4 байта данных, начиная с адреса Addr
   function CmdRead (Addr : natural) return integer_vector;
  • функция Read — возвращает содержимое памяти с адреса Addr1 по Addr2
   impure function Read (Addr1, Addr2 : natural) return integer_vector;
  • функция GetUID — возвращает 10 байт UID метки
   impure function GetUID return integer_vector;
  • Bombilla amarilla - yellow Edison lamp.png + дополнительные функции чтения

Автоматизация запуска тестов

Описание

Для каждого теста задаются следующие параметры:

  • в папке tb/ файл конфигурации для тесбенча djin22_tb(tb2) (в котором задаётся имя архитектуры блока tb_TestBlock соответствующее данному тесту). Формат файла djin22_tb2_<имя_архитектуры_для_tb_TestBlock>_cfg.vhd
  • в папке tb/ файл djin22_tb2_<имя_архитектуры_для_tb_TestBlock>_cfg.map, в котором перечислены в отдельной строке имена файлов прошивки памяти (eeprom*.map), с которыми нужно запустить данный тест. При отсутствии файла djin22_tb2_<имя_архитектуры_для_tb_TestBlock>_cfg.map, то тест запускается с map-файлом по умолчанию (tb/maps/xeeprom_Rnd1.map). Файлы прошивок должны находиться в папке tb/maps/.

Запуск прогона тестов

vsim -do vsim/run_all.do -c

Параметр означает запуск в консольном режиме. Скрипт запуска сначала проверяет наличие файла tb/tests.list и при его наличии читает из него список тестов, которые должен выполнить. Если tb/tests.list нет, то на моделирование запускаются все конфигурации находящиеся в папке tb/ (выбираются все файлы по формату tb/*_cfg.vhd)


При запуске теста должно выполняться:

  • моделирование (run -all)
  • сбор покрытия
  • по завершении моделирования, должна проводиться проверка контрольного сигнала ([examine djin22_tb/TestStatus]) и в консоль (лог) выдаваться сообщение о успешном или ошибочном прохождении теста.
  • сохранять базу UCDB по покрытию
  • сохранять логи (транскрипт)

Программа регрессионного прогона всех тестов должна:

  • скомпилировать исходники модели, тестбенча и всех тестов
  • По списку всех тестов по очереди запускать моделирование каждого теста с заданным списком параметров (например, map файлом)
  • В зависимости от заданного параметра (IGNORE_FAILS) останавливать выполнение следующего теста или продолжать проверку следующих тестов, если текущий тест выполнился с ошибкой.
  • после выполнения всех тестов должна собирать общую базу по покрытию, включая тестовый план, и формировать отчет по покрытию

NEW