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

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

Материал из Wiki

Перейти к: навигация, поиск

Правила оформления

  1. Задания выполнять в одном файле с названием  : vds_lab1__<firstname_lastname>.v
  2. Для каждого задания должен быть реализован отдельный модуль  : module task__<number> ();
  3. Для запуска каждого отдельного модуля использовать параметр симулятора : -top <top_module_name>
  4. Файл с лабораторной должен содержать заголовок в виде комментария  : //// -> Фамилия Имя Отчество
  5. Перед выводом результатов выполнения всегда добавлять сообщение вида  : START_TASK__<number>
  6. После того как работа модуля завершилась выводить сообщение вида  : END_TASK__<number>
  7. СМ. доп правила оформления для каждого задания отдельно

Задания

  1. Вывести в консоль значения переменной int var; в десятичном, двоичном, шестнадцатиричном и строковом форматах. Переменную передать в модуль используя функцию $value$plusargs("VAR=%d",var); значение переменной по умолчанию 5;
    • Вывод переменной в различных форматах осуществлять в порядке указанном в задании, каждый вывод в отдельной строке, в каждой строке вывода должны быть сообщения об выводимом формате:
      HEX: x01,
      DEC: 'd98
  2. Создать тип данных структура, содержащую 4 различных поля. Поля должны иметь тип целочисленный, строковый, бит-вектор. Создать две переменные полученного типа. Проинвертировать все битовые поля в первой переменной. Значение всех полей первой и второй переменных типа структуры вывести в консоль.
    • Формат вывода:
      VAR1 FIELD1: <value>
      VAR1 FIELD2: <value>
      ...
      VAR2 FIELD1: <value>
      VAR2 FIELD2: <value>
      ...
  3. Объявить и заполнить строковую переменную. Вывести на экран первый и последний элемент строки. Длинна строки должна быть больше 10 символов.
    • Формат вывода:
      String = "<your string>"
      First symbol = '*'
      Last symbol = '*'
  4. Объявить строковую переменную mystr. По умолчанию переменная должна быть инициализирована строкой содержащей больше 30 символов. Заполнить строку используя функцию $value$plusargs("MYSTR=%s",mystr) Строка может содержать любое количество символов пробела, разделяющие строку на слова, слов более одного. Создать массив строковых переменных и заполнить их словами из исходной переменной. Размер строки может изменяться в ходе проверки задания и передаваться через +MYSTR параметр. В конце и начале строки могут быть доп пробелы. Слова могут быть разделены множеством пробелов.
    • В консоль вывести содержимое строки в формате:
      MYSTR=<строка>
    • В консоль вывести содержимое массива в формате
      MYSTR[1]=<строка>
      MYSTR[2]=<строка>
      ...
  5. Создать 2-х мерный неупакованный массив целочисленных переменных размера 10 на 10, заполнить случайными значениями в диапазоне от 2 до 23 и после отсортировать элементы в порядке возрастания в каждой строке массива.
    1. Вывести исходный массив в консоль каждый элемент занимает 2 позиции. Например:
      А1:
      2 3 4 21 20 17 12 12 2
      ...
      2 3 4 2 6 7 2 2 3
    2. Вывести сортированный массив в консоль каждый элемент занимает 2 позиции. Например:
      А2:
      2 2 3 4 12 12 17 20 21
      ...
      2 2 2 2 3 3 4 6 7
  6. Создать упакованный массив данных, в который поместить сортированные значения из предыдущего задания и вывести в консоль все элементы друг за другом без пробелов.
    • Формат вывода :
      PACK_ARRAY: <121231223345345345>
  7. Создать динамический массив байт размером 10000 Б. Создать еще один динамический массив целых чисел подходящего размера и поместить в него значения первого. Заполнять нужно по порядку все байты массива без пропусков. Второй массив не должен занимать более 10000 Б.
    1. Первый массив заполнять цифрами 0,1,2......255,0,1,2....255,0....
    2. После заполнения массива, вывести в консоль значения элементов 0,1,2,3,4,5,6,7,252,253,254,255,2551,2552,2553,2554 в hex формате, 2 hex символа на одно значение.
    • Формат вывода :
      A1[<номер элемента>]=<hex значение>
    1. После заполнения второго массива, вывести значения элементов 0,1,63,631 в консоль в hex формате, 8 hex символов на одно значение.
    • Формат вывода :
      A2[<номер элемента>]=<hex значение>
  8. Создать ассоциативный массив из 1024 элементов, каждый элемент которого представляет собой динамический массив(переменных типа int) размером 1024 бит + номер. Номер определяется так, добавляем в ассоциативный массив первый элемент номер равен 1, второй 2, и т.д. Значения элементов в динамическом массиве заполнить случайными значениями.
    1. Вывести в консоль случайным образом 5 элементов из ассоциативного массива. Элементы массива выводить в bit формате.
    • Формат вывода случайного элемента:
      AA[<ключ по которому обратились в массив>]=<значение в этом элементе >
  9. Создать очередь, каждый элемент которой представляет собой структуру данных из 2-го задания. Заполнить очередь 10 значениями. Вывести в консоль значения очереди. После удалить первые 3 элемента из очереди и вывести значения полей элементов в консоль. Для вывода очередей в консоль использовать $display("Q2:", <имя очереди>);
    • Формат вывода первой очереди :
      Q1: <содержимое очереди>
    • Формат вывода очереди после удаления:
      Q2: <содержимое очереди>
  10. Объявить класс 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[<номер>]=<значение>
  11. Объявить класс 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[<номер>]=<значение>
  12. Объявить пакет ARRAY_PKG, который будет содержать объявления классов из двух предыдущих заданий. Объявить еще один класс С_ARRAY_T вне пакета в модуле, наследуемый от B_ARRAY_T класса описанного в пакете ARRAY_PKG.Для расширения области видимости использовать импорт пакета ARRAY_PKG в модуле. В наследуемом классе переопределить еще раз метод вывода сообщений printa(), убрав вывод информации о разработчике. Создать объект класса C_ARRAY_T cct, массив должен содержать 20 случайных значений. Вывести значения переменных в консоль используя созданную функцию.
    • Функция выводит значения в формате, как у класса A_ARRAY_T.
  13. Объявить класс, содержащий задачу, выводящую значения переменной типа 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 ...
  14. Описать генератор тактового сигнала используя оператор цикла while. Добавить регистр enable , значение по умолчанию равно 0. Если его значение равно 1 то генератор работает если 0 то не работает. Задать период тактового сигнала используя переменную int peri. Значение переменной по умолчанию равно 20. Период тактового сигнала по умолчанию 20 us; Запустить генератор, подождать 200us записать в сигнал enable 1, подождать 100us, записать в сигнал enable 0. Значение регистра тактового сигнала CLK по умолчанию равно 0. Каждый раз когда меняется значение регистра CLK нужно выводить в консоль его значение.
    • Формат сообщения CLK: 0
    • Формат сообщения CLK: 1
  15. Объявить два ассоциативных массива произвольными данными. Реализовать функцию чтения значений из файла 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
  16. Создать очередь целых чисел 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
  17. Создать очередь 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]
      ...
  18. Реализовать базовый класс А с полем 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
  19. Реализовать интерфейс, параметризуемый двумя значениями: ширина адреса 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
  20. Объявить переменную класса A_ARRAY_T aat, B_ARRAY_T bbt (из предыдущих заданий). Создать объект bbt. Затем указатель bbt присвоить переменной aat. Вызвать функцию printa используя переменную aat (aat.printa()). Пояснить результат вывода(Напечатать в консоль почему результат вывода соответствует классу bbt, несмотря на то что функция printa вызвана из класса att).
    1. Формат вывода пояснения: NOTE: "<текст пояснения на английском>"
    2. Кавычки обязательны
  21. Вывести в консоль литерал '47' в десятичном, двоичном, шестнадцатиричном и строковом форматах.
    • Вывод литерала в разных форматах осуществлять в порядке указанном в задании, каждый вывод в отдельной строке, в каждой строке вывода должны быть сообщения о формате:
      HEX: x01,
      DEC: 'd98
  22. Объявить и заполнить строковую переменную mystr. Добавить возможность инициализации переменной через командную строку используя $value$plusargs("MYSTR=%s",mystr). Вывести на экран 5 случайных символов из этой строки. Длинна строки должна быть больше 10 символов.
    • Формат вывода:
      String = "<your string>"
      S[3 ] = '*'
      S[10] = '*'
      S[x ] = '*'
      ....
  23. Объявить строковую переменную mystr. По умолчанию переменная должна быть инициализирована строкой содержащей больше 30 символов. Заполнить строку используя функцию $value$plusargs("MYSTR=%s",mystr). Объявить еще одну переменную diver типа byte. Значение переменной по умолчанию ' '. Реализовать возможность передачи значения в эту переменную через командную строку $value$plusargs("DIVIDER=%s",divider). Строка mystr может содержать любое количество символов divider, разделяющие строку mystr на слова, слов более одного. Создать массив строковых переменных и заполнить их словами из исходной переменной. Размер строки может изменяться в ходе проверки задания и передаваться через +MYSTR параметр. Символ разделителя также может передаваться разный.
    • В консоль вывести содержимое строки в формате:
      MYSTR=<строка>
    • В консоль вывести содержимое массива в формате
      MYSTR[1]=<строка>
      MYSTR[2]=<строка>
      ...
  24. Создать динамический массив байт размером N Байт. Число байт получать из аргумента командной строки используя функцию $value$plusargs("ASIZE=%d",N); значение N по умолчанию 400. Создать еще один динамический массив целых чисел подходящего размера и поместить в него значения первого. Заполнять нужно по порядку все байты массива без пропусков. Второй массив не должен занимать более N Байт.
    1. Первый массив заполнять цифрами 0,1,2......255,0,1,2....255,0....
    2. После заполнения массива, вывести в консоль значения элементов 0,1,2,3,4,5,6,7,252,253,254,255,2551,2552,2553,2554 в hex формате, 2 hex символа на одно значение.
    • Формат вывода :
      A1[<номер элемента>]=<hex значение>
    1. После заполнения второго массива, вывести значения элементов 0,1,63,631 в консоль в hex формате, 8 hex символов на одно значение.
    • Формат вывода :
      A2[<номер элемента>]=<hex значение>