Спец курс (Верификация цифровых схем)/Практические задания (Лекция 1)
Материал из Wiki
Лекции ВЦС
Лекции
Практические задания
|
Тесты
Табель успеваемости
Экзамен
Доп. материалы
Правила оформления
- Задания выполнять в одном файле с названием : vds_lab1__<firstname_lastname>.v
- Для каждого задания должен быть реализован отдельный модуль : module task__<number> ();
- Для запуска каждого отдельного модуля использовать параметр симулятора : -top <top_module_name>
- Файл с лабораторной должен содержать заголовок в виде комментария : //// -> Фамилия Имя Отчество
- Перед выводом результатов выполнения всегда добавлять сообщение вида : START_TASK__<number>
- После того как работа модуля завершилась выводить сообщение вида : END_TASK__<number>
- СМ. доп правила оформления для каждого задания отдельно
Задания
- Вывести в консоль значения переменной int var; в десятичном, двоичном, шестнадцатиричном и строковом форматах. Переменную передать в модуль используя функцию $value$plusargs("VAR=%d",var); значение переменной по умолчанию 5;
- Вывод переменной в различных форматах осуществлять в порядке указанном в задании, каждый вывод в отдельной строке, в каждой строке вывода должны быть сообщения об выводимом формате:
- HEX: x01,
- DEC: 'd98
- Вывод переменной в различных форматах осуществлять в порядке указанном в задании, каждый вывод в отдельной строке, в каждой строке вывода должны быть сообщения об выводимом формате:
- Создать тип данных структура, содержащую 4 различных поля. Поля должны иметь тип целочисленный, строковый, бит-вектор. Создать две переменные полученного типа. Проинвертировать все битовые поля в первой переменной. Значение всех полей первой и второй переменных типа структуры вывести в консоль.
- Формат вывода:
- VAR1 FIELD1: <value>
- VAR1 FIELD2: <value>
- ...
- VAR2 FIELD1: <value>
- VAR2 FIELD2: <value>
- ...
- Формат вывода:
- Объявить и заполнить строковую переменную. Вывести на экран первый и последний элемент строки. Длинна строки должна быть больше 10 символов.
- Формат вывода:
- String = "<your string>"
- First symbol = '*'
- Last symbol = '*'
- Формат вывода:
- Объявить строковую переменную mystr. По умолчанию переменная должна быть инициализирована строкой содержащей больше 30 символов. Заполнить строку используя функцию $value$plusargs("MYSTR=%s",mystr) Строка может содержать любое количество символов пробела, разделяющие строку на слова, слов более одного. Создать массив строковых переменных и заполнить их словами из исходной переменной. Размер строки может изменяться в ходе проверки задания и передаваться через +MYSTR параметр. В конце и начале строки могут быть доп пробелы. Слова могут быть разделены множеством пробелов.
- В консоль вывести содержимое строки в формате:
- MYSTR=<строка>
- В консоль вывести содержимое массива в формате
- MYSTR[1]=<строка>
- MYSTR[2]=<строка>
- ...
- В консоль вывести содержимое строки в формате:
- Создать 2-х мерный неупакованный массив целочисленных переменных размера 10 на 10, заполнить случайными значениями в диапазоне от 2 до 23 и после отсортировать элементы в порядке возрастания в каждой строке массива.
- Вывести исходный массив в консоль каждый элемент занимает 2 позиции. Например:
- А1:
- 2 3 4 21 20 17 12 12 2
- ...
- 2 3 4 2 6 7 2 2 3
- Вывести сортированный массив в консоль каждый элемент занимает 2 позиции. Например:
- А2:
- 2 2 3 4 12 12 17 20 21
- ...
- 2 2 2 2 3 3 4 6 7
- Вывести исходный массив в консоль каждый элемент занимает 2 позиции. Например:
- Создать упакованный массив данных, в который поместить сортированные значения из предыдущего задания и вывести в консоль все элементы друг за другом без пробелов.
- Формат вывода :
- PACK_ARRAY: <121231223345345345>
- Формат вывода :
- Создать динамический массив байт размером 10000 Б. Создать еще один динамический массив целых чисел подходящего размера и поместить в него значения первого. Заполнять нужно по порядку все байты массива без пропусков. Второй массив не должен занимать более 10000 Б.
- Первый массив заполнять цифрами 0,1,2......255,0,1,2....255,0....
- После заполнения массива, вывести в консоль значения элементов 0,1,2,3,4,5,6,7,252,253,254,255,2551,2552,2553,2554 в hex формате, 2 hex символа на одно значение.
- Формат вывода :
- A1[<номер элемента>]=<hex значение>
- После заполнения второго массива, вывести значения элементов 0,1,63,631 в консоль в hex формате, 8 hex символов на одно значение.
- Формат вывода :
- A2[<номер элемента>]=<hex значение>
- Создать ассоциативный массив из 1024 элементов, каждый элемент которого представляет собой динамический массив(переменных типа int) размером 1024 бит + номер. Номер определяется так, добавляем в ассоциативный массив первый элемент номер равен 1, второй 2, и т.д. Значения элементов в динамическом массиве заполнить случайными значениями.
- Вывести в консоль случайным образом 5 элементов из ассоциативного массива. Элементы массива выводить в bit формате.
- Формат вывода случайного элемента:
- AA[<ключ по которому обратились в массив>]=<значение в этом элементе >
- Создать очередь, каждый элемент которой представляет собой структуру данных из 2-го задания. Заполнить очередь 10 значениями. Вывести в консоль значения очереди. После удалить первые 3 элемента из очереди и вывести значения полей элементов в консоль. Для вывода очередей в консоль использовать $display("Q2:", <имя очереди>);
- Формат вывода первой очереди :
- Q1: <содержимое очереди>
- Формат вывода очереди после удаления:
- Q2: <содержимое очереди>
- Формат вывода первой очереди :
- Объявить класс A_ARRAY_T, содержащий 3 переменные A, minAi, maxAi. Класс параметризован (ex: paramter N=1) количеством элементов в массиве. A статический массив целых чисел размера N, minAi - минимальное значение, maxAi - максимальное значение в массиве, создать методы класса возвращающие максимальное и минимальное значение в массиве. Создать функцию printa() для вывода значений всех переменных класса в консоль, функция должна быть виртуальной. Создать объект класса A_ARRAY_T aat, массив должен содержать 10 случайных значений. Вывести значения переменных в консоль используя созданную функцию.
- Функция выводит значения в формате :
- AI={<1 элемент>,<2 элемент>,<3 элемент>,....<10 элемент>}
- minAI=AI[<номер>]=<значение>
- maxAI=AI[<номер>]=<значение>
- Функция выводит значения в формате :
- Объявить класс B_ARRAY_T, наследуемый от класса в предыдущем задании и переопределить функцию вывода значений всех переменных printa(). Добавить к существующему выводу, вывод сообщения об разработчике класса (ФИО латиницей). Создать объект класса B_ARRAY_T bbt, массив должен содержать 10 случайных значений. Вывести значения переменных в консоль используя переопределённую функцию.
- Функция выводит значения в формате :
- FIO: и после обязательно 3 слова разделенных пробелами (ex FIO: Zaitsay Viktor Sergeevich )
- ___AI={<1 элемент>,<2 элемент>,<3 элемент>,....<10 элемент>}
- minAI=AI[<номер>]=<значение>
- maxAI=AI[<номер>]=<значение>
- Функция выводит значения в формате :
- Объявить пакет ARRAY_PKG, который будет содержать объявления классов из двух предыдущих заданий. Объявить еще один класс С_ARRAY_T вне пакета в модуле, наследуемый от B_ARRAY_T класса описанного в пакете ARRAY_PKG.Для расширения области видимости использовать импорт пакета ARRAY_PKG в модуле. В наследуемом классе переопределить еще раз метод вывода сообщений printa(), убрав вывод информации о разработчике. Создать объект класса C_ARRAY_T cct, массив должен содержать 20 случайных значений. Вывести значения переменных в консоль используя созданную функцию.
- Функция выводит значения в формате, как у класса A_ARRAY_T.
- Объявить класс, содержащий задачу, выводящую значения переменной типа int i1 : 10, 20, 30, ... и т.д. с периодичностью 10 us симуляционного времени. Объявить еще одну задачу, которая выводит значения переменной типа stirng i2 : "100us", "200us", "300us" ... с периодичностью 100 us. Объявить третью задачу, которая выводит сообщение "Start check processing..." после того как в первая задача выведет в консоль 300us, и выводит сообщение "End check processing..." после того как вторая задача выводит сообщение "500us". Запустить три задачи в параллель одновременно. Провести моделирование 5 ms. Первая и вторая задачи управляют переменной и делают только печать сообщения, никакими дополнительными флагами они не управляют.
- В логе симуляции обязательно должны быть сообщения Start..., End ...
- Описать генератор тактового сигнала используя оператор цикла while. Добавить регистр enable , значение по умолчанию равно 0. Если его значение равно 1 то генератор работает если 0 то не работает. Задать период тактового сигнала используя переменную int peri. Значение переменной по умолчанию равно 20. Период тактового сигнала по умолчанию 20 us; Запустить генератор, подождать 200us записать в сигнал enable 1, подождать 100us, записать в сигнал enable 0. Значение регистра тактового сигнала CLK по умолчанию равно 0. Каждый раз когда меняется значение регистра CLK нужно выводить в консоль его значение.
- Формат сообщения CLK: 0
- Формат сообщения CLK: 1
- Объявить два ассоциативных массива произвольными данными. Реализовать функцию чтения значений из файла readf("./file1.txt") и заполнения этими данными массива. Один массив заполняется из файла file1.txt, второй массив из файла file2.txt. Реализовать функцию сравнения этих массивов. Размер массивов может быть разный. Ключи могут использоваться разные. Массивы и результат сравнения вывести в консоль.
- Формат файла с массивами
- <key> <value>
- ha1 123
- ha2 121212
- .....
- Формат сообщения
- HA1 :
- ha1 123
- ha2 121212
- .....
- HA2 :
- ha1 123
- ha2 121212
- .....
- HA1&HA2 is EQUEAL
- HA1&HA2 is not EQUEAL
- Формат файла с массивами
- Создать очередь целых чисел myqueue, значения чисел случайные в диапазоне от 34 до 88. Размер очереди qsize задается через вызов функции $value$plusargs("QSIZE=%d",qsize). Значение qsize по умолчанию 10. Реализовать функции поиска максимального smax(myqueue) и минимального smax(myqueue) элементов. Содержимое очереди вывести в консоль. Вывести максимальный и минимальный элемент.
- Формат вывода очереди:
- Q : 33 34 67 87 88 ..... 81
- MAX : 81
- MIN : 33
- Формат вывода очереди:
- Создать очередь myqueue массивов фиксированной длины, каждый из которых содержит два элемента. Элементы будут задавать нижнюю и верхнюю границы диапазона значений. Значения верхней и нижней границы задаются случайным образом в диапазоне от 10 до 99. Размер очереди qsize задается через вызов функции $value$plusargs("QSIZE=%d",qsize). Значение qsize по умолчанию 10. Реализовать функцию поиска scross(myqueue) в очереди пересекающихся диапазонов. Функция должна уметь печатать в консоль пару пересекающихся диапазонов. Вывести в консоль все элементы очереди(оспоьзовать дополнительную функцию или реализовать вывод без функции, формат вывода см ниже). Вызвать функцию scross(myqueue), которая выведет пары пересекающихся диапазонов.
- Формат вывода очереди :
- Q[ 0] = 10 99
- Q[ 1] = 14 12 -- обратите внимание что первое значение должно быть не больше второго
- ...
- Q[12] = 10 10
- Формат вывода пересекающихся диапазонов :
- Q[ 0] cross Q[ 1]
- Q[ 1] cross Q[12]
- ...
- Формат вывода очереди :
- Реализовать базовый класс А с полем data (динамический массив переменных типа int) и наследуемый от него класс B. Размер массива asize задается через вызов функции $value$plusargs("ASIZE=%d",asize). Значение asize по умолчанию 10. Значения элементов поля data задаются случайным образом в диапазоне от 0 до 1. Реализовать класс С, содержащий функцию function int csum(A la), для подсчета суммы элементов массива data в объекте. Входной параметр функции объект типа класса A. В модуле создать объект класса A a=new(); создать объект класса B b =new(); создать объект класса C c=new(). Вызвать функцию csum из объекта c, два раза. Первый раз передав в качестве аргумента объект b, затем объект a.
- Формат вывода печатаем массив А, массив В
- MA = 0 0 0 0 1 1 1 0 1 ....
- MB = 0 1 1 0 1 0 1 0 1 ....
- Печатаем результат функции подсчета суммы элементов c.csum(a),c.csum(b)
- SA = 5
- SB = 3
- Формат вывода печатаем массив А, массив В
- Реализовать интерфейс, параметризуемый двумя значениями: ширина адреса ADDR_WIDTH и ширина данных DATA_WIDTH. Значения параметров по умолчанию ADDR_WIDTH=3, DATA_WIDTH=7. В интерефейсе добавить initial блок в котором вывести в консоль значения параметров и иерархический путь к интерфейсу (использовать $display("%m")). Инстанциировать два интерфейса interface_1 с параметрами #(37,99) и interface_2 без параметров в модуле.
- Формат вывода
- ADDR_WIDTH : 37
- DATA_WIDTH : 99
- task__18.interface_1
- ADDR_WIDTH : 3
- DATA_WIDTH : 4
- task__18.interface_2
- Формат вывода
- Объявить переменную класса A_ARRAY_T aat, B_ARRAY_T bbt (из предыдущих заданий). Создать объект bbt. Затем указатель bbt присвоить переменной aat. Вызвать функцию printa используя переменную aat (aat.printa()). Пояснить результат вывода(Напечатать в консоль почему результат вывода соответствует классу bbt, несмотря на то что функция printa вызвана из класса att).
- Формат вывода пояснения: NOTE: "<текст пояснения на английском>"
- Кавычки обязательны
- Вывести в консоль литерал '47' в десятичном, двоичном, шестнадцатиричном и строковом форматах.
- Вывод литерала в разных форматах осуществлять в порядке указанном в задании, каждый вывод в отдельной строке, в каждой строке вывода должны быть сообщения о формате:
- HEX: x01,
- DEC: 'd98
- Вывод литерала в разных форматах осуществлять в порядке указанном в задании, каждый вывод в отдельной строке, в каждой строке вывода должны быть сообщения о формате:
- Объявить и заполнить строковую переменную mystr. Добавить возможность инициализации переменной через командную строку используя $value$plusargs("MYSTR=%s",mystr). Вывести на экран 5 случайных символов из этой строки. Длинна строки должна быть больше 10 символов.
- Формат вывода:
- String = "<your string>"
- S[3 ] = '*'
- S[10] = '*'
- S[x ] = '*'
- ....
- Формат вывода:
- Объявить строковую переменную mystr. По умолчанию переменная должна быть инициализирована строкой содержащей больше 30 символов. Заполнить строку используя функцию $value$plusargs("MYSTR=%s",mystr). Объявить еще одну переменную diver типа byte. Значение переменной по умолчанию ' '. Реализовать возможность передачи значения в эту переменную через командную строку $value$plusargs("DIVIDER=%s",divider). Строка mystr может содержать любое количество символов divider, разделяющие строку mystr на слова, слов более одного. Создать массив строковых переменных и заполнить их словами из исходной переменной. Размер строки может изменяться в ходе проверки задания и передаваться через +MYSTR параметр. Символ разделителя также может передаваться разный.
- В консоль вывести содержимое строки в формате:
- MYSTR=<строка>
- В консоль вывести содержимое массива в формате
- MYSTR[1]=<строка>
- MYSTR[2]=<строка>
- ...
- В консоль вывести содержимое строки в формате:
- Создать динамический массив байт размером N Байт. Число байт получать из аргумента командной строки используя функцию $value$plusargs("ASIZE=%d",N); значение N по умолчанию 400. Создать еще один динамический массив целых чисел подходящего размера и поместить в него значения первого. Заполнять нужно по порядку все байты массива без пропусков. Второй массив не должен занимать более N Байт.
- Первый массив заполнять цифрами 0,1,2......255,0,1,2....255,0....
- После заполнения массива, вывести в консоль значения элементов 0,1,2,3,4,5,6,7,252,253,254,255,2551,2552,2553,2554 в hex формате, 2 hex символа на одно значение.
- Формат вывода :
- A1[<номер элемента>]=<hex значение>
- После заполнения второго массива, вывести значения элементов 0,1,63,631 в консоль в hex формате, 8 hex символов на одно значение.
- Формат вывода :
- A2[<номер элемента>]=<hex значение>