Спец курс (Языки верификации аппаратуры)/Практические задания 2
Материал из Wiki
Лекции ЯВА
Лекции
Практические задания
Тесты
Табель успеваемости
Экзамен
Доп. материалы
Содержание |
Часть 1
Требования к оформлению ч1
- Записать ограничения на рандомизацию параметров транзакции в соответствии с требованиями спецификации.
- Создать очередь транзакций и заполнить ее случайными объектами разных классов (базового и производных).
- В цикле вызвать функцию вывода для каждого объекта.
- Продемонстрировать работу функций encode, decode, копирования и сравнения.
Варианты
- Вариант 1.
- Транзакция содержит поля data, addr, strob, mode
- Ширина данных 32 бита (data)
- Ширина адреса 32 бита (addr)
- Для поля Addr используется побайтовая адресация
- Ширина строба 4 бита (strob), каждый строб отвечает за один байт в data
- Поле mode имеет четыре значения Чтение, Запись, Ожидание, Ошибка (кодирование выбрать самостоятельно)
- Поле strob имеет только непрерывное заполнение единицами, т.е. значения 0000, 1010, 1101 и др. недопустимы
- Поле data принимает значения 0101….01 и 1010….10 с вероятностью 10% каждое, выпадение остальных значений равновероятно
- Поле addr меньше переменной max_addr и больше min_addr
- В режиме чтения адрес должен быть выровнен на 2
- Если значение поля mode равно Запись, то addr выровнен на 4
- В классе транзакции объявить 2 виртуальные функции: void decode() и void encode()
- Описать класс транзакицй-запросов, который наследуется от описанного ранее класса. Поле mode в таком классе всегда принимает значение Запись. Транзакция-запрос должна включать следующие поля:
- user_id - 8-битное беззнаковое целое число
- start - 4-битное беззнаковое целое число
- end - 4-битное беззнаковое целое число
- ctx_id - 16-битное беззнаковое целое число
- Данные поля должны вычисляться на основе поля data базового класса следующим образом {user_id, start, end, ctx_id} = data
- Описать класс транзакицй-ответов, который наследуется от описанного ранее базового класса. mode всегда равен Чтение для такой транзакции. Транзакция-ответ должна включать следующие поля:
- user_id - 8-битное беззнаковое целое число
- status - 8-битное беззнаковое целое число
- ctx_id - 16-битное беззнаковое целое число
- Данные поля должны вычисляться на основе поля data базового класса следующим образом {user_id, status, ctx_id} = data
- Переопределить в классах-наследниках функцию encode так, чтобы она заполняла поле data базового класса на основе значений производного класса (user_id, start и др.)
- Переопределить в классах-наследниках функцию decode так, чтобы она заполняла поля класса-наследника исходя из значения поля data базового класса
- Реализовать виртуальные функции копирования, сравнения и вывода для базового класса и переопределить их в классе-наследнике. В функциях класса-наследника вызывать соответствующие функции базового класса
- Вариант 2.
- Транзакция содержит поля data, addr, strob, mode, status
- Ширина данных 128 бита (data)
- Ширина адреса 32 бита (addr)
- Ширина строба (strob) равна числу байт в шине данных
- Поле mode имеет четыре значения Чтение, Запись, Ожидание, Ошибка
- Поле strob имеет только непрерывное заполнение единицами, т.е. значения 0000, 1010, 1101 и др. недопустимы
- Поле data принимает значения 0101….01 и 1010….10 с вероятностью 10%
- Поле data принимает максимальное и минимальное значения с вероятностью 1%
- Поле addr меньше переменной max_user_addr и меньше максимально возможного MAX_BUS_ADDR
- addr должен иметь значения адресующие только по 8 байт, если значение поля mode равно Чтение
- Заполнение 1 поля strob должно начинаться с бита, номер которого равен значению младших 3-разрядов адреса.
- Поле статус всегда равно OK, если mode равен Запись, иначе UNDEF
- В классе транзакции объявить 2 виртуальные функции: void decode() и void encode()
- Описать класс транзакицй-запросов, который наследуется от описанного ранее класса. Поле mode в таком классе всегда принимает значение Запись. Транзакция-запрос должна включать следующие поля:
- opcode - 8-битное беззнаковое целое число
- r0 - 4-битное беззнаковое целое число
- r1 - 4-битное беззнаковое целое число
- ctx_id - 16-битное беззнаковое целое число
- Данные поля должны вычисляться на основе поля data базового класса следующим образом {opcode, r0, r1, ctx_id} = data[127:96]
- Описать класс транзакицй-ответов, который наследуется от описанного ранее базового класса. mode всегда равен Чтение для такой транзакции. Транзакция-ответ должна включать следующие поля:
- result - 14-битное беззнаковое целое число
- status - 2-битное беззнаковое целое число
- ctx_id - 16-битное беззнаковое целое число
- Данные поля должны вычисляться на основе поля data базового класса следующим образом {result , status , ctx_id} = data[127:96]
- Для транзакций-запросов и ответов поле addr всегда должно быть кратно 16 и strob равняться всем единицам.
- Переопределить в классах-наследниках функцию encode так, чтобы она заполняла поле data базового класса на основе значений производного класса (result , status и др.)
- Переопределить в классах-наследниках функцию decode так, чтобы она заполняла поля класса-наследника исходя из значения поля data базового класса
- Реализовать виртуальные функции копирования, сравнения и вывода для базового класса и переопределить их в классе-наследнике. В функциях класса-наследника вызывать соответствующие функции базового класса
- Вариант 3.
- Транзакция содержит поля data, addr, strob, mode, status, delay_en, write_delay, read_delay
- Ширина данных 64 бита (data)
- Ширина адреса 32 бита(addr)
- Ширина строба (strob) равна числу байт в шине данных
- Поле mode имеет четыре значения Чтение, Запись, Ожидание, Ошибка
- Поле strob имеет только непрерывное заполнение единицами
- Поле data принимает значения 0101….01 и 1010….10 с вероятностью 5%
- Поле data принимает максимальное и минимальное значения с вероятностью 1%
- Поля с именем *delay принимают целые значения большие или равные 0
- Если значение поля delay_en равно 0, то переменные write_delay, read_dealy равны 0.
- Значение поля write_delay меньше 10, если dealy_en равен 1
- Значение поля read_delay меньше 200, если dealy_en равен 1
- В классе транзакции объявить 2 виртуальные функции: void decode() и void encode()
- Описать класс транзакицй-координат, который наследуется от описанного ранее класса. Поле mode в таком классе всегда принимает значение Запись. Транзакция-координата должна включать следующие поля:
- x - 32-битное беззнаковое целое число
- y - 32-битное беззнаковое целое число
- Данные поля должны вычисляться на основе поля data базового класса следующим образом: все четные биты data образуют число x, все нечетные образуют число y.
- Переопределить в классе-наследнике функцию encode так, чтобы она заполняла поле data базового класса на основе значений производного класса (x, y)
- Переопределить в классе-наследнике функцию decode так, чтобы она заполняла поля класса-наследника исходя из значения поля data базового класса
- Реализовать виртуальные функции копирования, сравнения и вывода для базового класса и переопределить их в классе-наследнике. В функциях класса-наследника вызывать соответствующие функции базового класса
- Вариант 4.
- Транзакция содержит поля data, addr, strob, mode
- Ширина данных 32 бита, поле data - очередь из N данных
- Ширина адреса 32 бита, поле addr - очередь из N адресов
- Ширина строба равна числу байт в шине данных, strob - очередь из N стробов
- Число элементов в очередях адреса, данных и стробов должно совпадать и должно быть не более 16.
- Поле mode имеет два значения Чтение, Запись
- Поле strob имеет только непрерывное заполнение единицами, с учетом очереди слов (т.е. Множество единиц в словах составленных друг за другом не должны перемешиваться 0, другими словами все стробы со 2-го и до предпоследнего всегда равны всем 1, если 1-й и последний стробы больше 0)
- Поле data принимает значения 0101….01 и 1010….10 с вероятностью 25%
- Поле data принимает максимальное и минимальное значения с вероятностью 6%
- В классе транзакции объявить 2 виртуальные функции: void decode() и void encode()
- Описать класс транзакицй-запросов, который наследуется от описанного ранее класса. Поле mode в таком классе всегда принимает значение Запись. Размеры очередей всегда больше нуля и меньше либо равны 16. Транзакция-запрос должна включать следующие поля:
- user_id - 8-битное беззнаковое целое число
- key - 4-битное беззнаковое целое число
- len - 4-битное беззнаковое целое число, равное размеру очереди (значение 0 соответствует размеру 1, а значение 15 - размеру 16)
- ctx_id - 16-битное беззнаковое целое число
- Данные поля должны вычисляться на основе поля data базового класса следующим образом {user_id, key, len, ctx_id} = data[0] (первый элемент очереди данных)
- addr[0] всегда кратен 4
- strb[0] всегда 4'hF
- Описать класс транзакицй-ответов, который наследуется от описанного ранее базового класса. mode всегда равен Чтение для такой транзакции. Размер очередей всегда равен 1. Транзакция-ответ должна включать следующие поля:
- user_id - 8-битное без знаковое целое число
- status - 8-битное без знаковое целое число
- ctx_id - 16-битное без знаковое целое число
- Данные поля должны вычисляться на основе поля data базового класса следующим образом {user_id, status, ctx_id} = data[0]
- Переопределить в классах-наследниках функцию encode так, чтобы она заполняла поле data базового класса на основе значений производного класса (user_id, status и др.)
- Переопределить в классах-наследниках функцию decode так, чтобы она заполняла поля класса-наследника исходя из значения поля data базового класса
- Реализовать виртуальные функции копирования, сравнения и вывода для базового класса и переопределить их в классе-наследнике. В функциях класса-наследника вызывать соответствующие функции базового класса
Часть 2
Требования к оформлению ч2
2. Задать группу покрытия для сбора функционального покрытия в соответствии с требованиями плана верификации (В конце моделирования вывести процент покрытия ковер-группы).
Варианты ч2
- Вариант 1. Группа покрытия должна содержать точки покрытия для data и addr. Каждая точка покрытия должна проверять, что соответствующая переменная принимала минимальное и максимальное значение. Также она должна проверять, что значения попадали в разные диапазоны допустимых значений. Проверить, что всевозможные комбинации data и addr выпадали при рандомизации.
- Вариант 2. Группа покрытия должна содержать точку покрытия, в которой покрываются последовательности событий: Проверить что было чтение по адресу 0,1,2,3,4,F после записи по этим же адресам, по-очереди по каждому адресу.
- Вариант 3. Сделать ковер-группу, которая проверяет, что все размеры очереди в режиме чтения и записи транзакции из Спецификации 4 были проверены в тесте.