oleg679976 0 Posted January 3 · Report post Добрый день, коллеги! Начал изучать SV по материалам с данного сайта http://simhard.com/wiki/index.php/Спец_курс_(Верификация_цифровых_схем)/Практические_задания_(Лекция_1). Для закрепления естественно проделываю практические задачи. Пришел сюда, так как ни google, ни chipverify, ни testbench.in не помогли мне найти ответ. Сейчас выполняю задание: "Создать тип данных структура, содержащую 4 различных поля. Поля должны иметь тип целочисленный, строковый, бит-вектор. Создать две переменные полученного типа. Проинвертировать все битовые поля в первой переменной. Значение всех полей первой и второй переменных типа структуры вывести в консоль. Формат вывода: VAR1 FIELD1: <value> VAR1 FIELD2: <value> ... VAR2 FIELD1: <value> VAR2 FIELD1: <value> ..." Не могу никак понять как проинвертировать структуру? Исходя их формулировки задания есть ощущения, что это должно делать в одно действие, но простое инвертирование, как в Verilog дает ошибку, с другой стороны смущает, что типы данных в структуре абсолютно разные и инвертировать string, как-то странно. Код симулирую на EDAPLAYGROUND в Aldec Riviera Pro 2020.04: // Code your testbench here // or browse Examples module task_2; typedef struct {integer field1; string field2; bit [10:0] field3; logic [10:0] field4;} my_struct; /*my_struct var1, var2; var1 = '{36, "453", 234, 434}; var2 = var1;*/ my_struct var1 = '{36, "453", 234, 434}; //my_struct var2 = ~var1; //my_struct var2 = !var1; my_struct var2 = var1; initial begin $display("var1 field1: %p", var1.field1); $display("var1 field2: %p", var1.field2); $display("var1 field3: %p", var1.field3); $display("var1 field4: %p", var1.field4); $display("var2 field1: %p", var2.field1); $display("var2 field2: %p", var2.field2); $display("var2 field3: %p", var2.field3); $display("var2 field4: %p", var2.field4); end endmodule Также вопрос по декларации и инициализации структуры. Данный код выдает ошибку: /*my_struct var1, var2; var1 = '{36, "453", 234, 434}; var2 = var1;*/ Так нельзя задавать? Просто на сайте chipverify задается так, или дело в операторе initial? Quote Ответить с цитированием Share this post Link to post Share on other sites
andrew_b 0 Posted January 3 · Report post В задании же написано: 34 минуты назад, oleg679976 сказал: Проинвертировать все битовые поля в первой переменной. Надо сделать логическую инверсию тех полей, которые не строковые и не целые. Quote Ответить с цитированием Share this post Link to post Share on other sites
oleg679976 0 Posted January 3 · Report post 8 часов назад, andrew_b сказал: В задании же написано: Надо сделать логическую инверсию тех полей, которые не строковые и не целые. my_struct var2 = '{36, "453", !234, !434}; Так получается? Я другого способа не вижу, может подскажете чего. Quote Ответить с цитированием Share this post Link to post Share on other sites
RobFPGA 0 Posted January 3 · Report post Приветствую! 9 hours ago, oleg679976 said: Сейчас выполняю задание: "Создать тип данных структура, содержащую 4 различных поля. Поля должны иметь тип целочисленный, строковый, бит-вектор. Создать две переменные полученного типа. Проинвертировать все битовые поля в первой переменной. Значение всех полей первой и второй переменных типа структуры вывести в консоль. Вам же в задании не сказано инвертировать все поля разом? Ну так и инвертируйте поэлементно! Зачем себе жизнь усложнять var1 = '{36, "453", 234, 434}; initial begin var1.field1 = ~var1.field1; var1.field3 = ~var1.field3; var1.field4 = ~var1.field4; ... Удачи! Rob. Quote Ответить с цитированием Share this post Link to post Share on other sites
oleg679976 0 Posted January 3 · Report post 37 минут назад, RobFPGA сказал: Приветствую! Вам же в задании не сказано инвертировать все поля разом? Ну так и инвертируйте поэлементно! Зачем себе жизнь усложнять var1 = '{36, "453", 234, 434}; initial begin var1.field1 = ~var1.field1; var1.field3 = ~var1.field3; var1.field4 = ~var1.field4; ... Удачи! Rob. Спасибо, понял! Quote Ответить с цитированием Share this post Link to post Share on other sites
oleg679976 0 Posted January 11 · Report post Коллеги, может кто-нибудь объяснит про инициализацию массива словами из строковой переменной? Задание звучит так: "Объявить строковую переменную mystr. По умолчанию переменная должна быть инициализирована строкой содержащей больше 30 символов. Заполнить строку используя функцию $value$plusargs("MYSTR=%s",mystr) Строка может содержать любое количество символов пробела, разделяющие строку на слова, слов более одного. Создать массив строковых переменных и заполнить их словами из исходной переменной. Размер строки может изменяться в ходе проверки задания и передаваться через +MYSTR параметр. В конце и начале строки могут быть доп пробелы. Слова могут быть разделены множеством пробелов. В консоль вывести содержимое строки в формате: MYSTR=<строка> В консоль вывести содержимое массива в формате MYSTR[1]=<строка> MYSTR[2]=<строка>" У меня два вопроса: 1) Если необходимо задать использовать слова из строки, то получается нужно каким-то образом организовать сортировку слов и пробелов? Выделить слова из строки, класть в переменные слова, а потом из них рандомом инициализировать? 2) Есть какой-нибудь метод инициализации массивов? Посмотрел на вышеупомянутых сайтах, ничего такого не увидел, только через цикл. Пока набросал такой код, в нем просто рандомно инициализировал: // Code your testbench here // or browse Examples module task4; string mystr; integer myarray [0:9] = '{1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; initial begin if ($value$plusargs("STRING=%s", mystr)) $display("GOT STRING"); foreach (myarray) begin $display("Array element %d: %d", i, myarray); //fork #1 myarray = $random % 14539876; #1 $display("Array element %d: %d", i, myarray); //join end end initial $monitor("%t Array %p", $time, myarray); endmodule Quote Ответить с цитированием Share this post Link to post Share on other sites
RobFPGA 0 Posted January 11 · Report post Приветствую! 1 hour ago, oleg679976 said: Задание звучит так: "Объявить строковую переменную mystr. По умолчанию переменная должна быть инициализирована строкой содержащей больше 30 символов. ... Опять вы себе жизнь усложняете Где в задании сказано что инициализировать mystr по умолчанию надо рандомными словами? То есть объявление string mystr = "bla bla bla и еще 18 символов!" как раз укладывается в условие задачи Если же хочется заполнят рандомными словами тогда да - придется в цикле сначала генерировать эти слова а уж затем склеивать их в строку. Ну и получив строку через $value$plusargs (или взяв то что задали по умолчанию) придется парсить выделяя слова в пробелах. По умолчанию массивы инициализируются константами через = `{....}. Удачи! Rob. Quote Ответить с цитированием Share this post Link to post Share on other sites
oleg679976 0 Posted January 13 · Report post 11.01.2021 в 17:18, RobFPGA сказал: Приветствую! Опять вы себе жизнь усложняете Где в задании сказано что инициализировать mystr по умолчанию надо рандомными словами? То есть объявление string mystr = "bla bla bla и еще 18 символов!" как раз укладывается в условие задачи Если же хочется заполнят рандомными словами тогда да - придется в цикле сначала генерировать эти слова а уж затем склеивать их в строку. Ну и получив строку через $value$plusargs (или взяв то что задали по умолчанию) придется парсить выделяя слова в пробелах. По умолчанию массивы инициализируются константами через = `{....}. Удачи! Rob. Спасибо за ответ! Правда в задании указано: "Создать массив строковых переменных и заполнить их словами из исходной переменной. ", поэтому и задал вопрос) Что-то нет настроения заморачиваться с парсерами, учитывая сколько всего еще предстоит изучать. Quote Ответить с цитированием Share this post Link to post Share on other sites
RobFPGA 0 Posted January 13 · Report post Приветствую! 1 minute ago, oleg679976 said: Спасибо за ответ! Правда в задании указано: "Создать массив строковых переменных и заполнить их словами из исходной переменной. ", поэтому и задал вопрос) Что-то нет настроения заморачиваться с парсерами, учитывая сколько всего еще предстоит изучать. Это понятно, лень матушку надо лелеять и баловать Но увы - массив строковых переменных словами из одной исходной строки без парсера (даже простейшего) не заполнить. Так что "Пилите Шура, пилите ..." (... строку на слова) Удачи! Rob. Quote Ответить с цитированием Share this post Link to post Share on other sites