Перейти к содержанию
    

Инвертирование структуры в SytemVerilog

Добрый день, коллеги! Начал изучать 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?

image.thumb.png.d5cc005ad22b20ca0d5e23d95be34b93.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В задании же написано:

34 минуты назад, oleg679976 сказал:

Проинвертировать все битовые поля в первой переменной.

Надо сделать логическую инверсию тех полей, которые не строковые и не целые.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 часов назад, andrew_b сказал:

В задании же написано:

Надо сделать логическую инверсию тех полей, которые не строковые и не целые.

my_struct var2 = '{36, "453", !234, !434};
Так получается? Я другого способа не вижу, может подскажете чего.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Приветствую!

9 hours ago, oleg679976 said:

Сейчас выполняю задание: "Создать тип данных структура, содержащую 4 различных поля. Поля должны иметь тип целочисленный, строковый, бит-вектор. Создать две переменные полученного типа. Проинвертировать все битовые поля в первой переменной. Значение всех полей первой и второй переменных типа структуры вывести в консоль.

Вам же в задании не сказано  инвертировать  все поля разом? Ну  так и  инвертируйте  поэлементно! Зачем себе жизнь  усложнять :biggrin:

var1 = '{36, "453", 234, 434};

initial begin 
  var1.field1 = ~var1.field1;
  var1.field3 = ~var1.field3;
  var1.field4 = ~var1.field4;
...
  

 

Удачи!  Rob. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

37 минут назад, RobFPGA сказал:

Приветствую!

Вам же в задании не сказано  инвертировать  все поля разом? Ну  так и  инвертируйте  поэлементно! Зачем себе жизнь  усложнять :biggrin:


var1 = '{36, "453", 234, 434};

initial begin 
  var1.field1 = ~var1.field1;
  var1.field3 = ~var1.field3;
  var1.field4 = ~var1.field4;
...
  

 

Удачи!  Rob. 

Спасибо, понял!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Коллеги, может кто-нибудь объяснит про инициализацию массива словами из строковой переменной?

Задание звучит так: "Объявить строковую переменную 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Приветствую!

1 hour ago, oleg679976 said:

Задание звучит так: "Объявить строковую переменную mystr. По умолчанию переменная должна быть инициализирована строкой содержащей больше 30 символов. ...

Опять вы себе жизнь  усложняете :yes3:  Где  в задании сказано  что инициализировать mystr по умолчанию надо рандомными словами?  
То есть  объявление  string mystr = "bla bla bla и еще 18 символов!"  как раз укладывается в условие задачи :wink2:

Если же  хочется  заполнят  рандомными  словами тогда да - придется в цикле сначала генерировать эти слова а уж затем склеивать их в строку.     

Ну и получив строку через $value$plusargs (или взяв то что задали по умолчанию) придется парсить  выделяя  слова в пробелах.   

По умолчанию массивы инициализируются  константами  через   = `{....}.  

Удачи! Rob.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11.01.2021 в 17:18, RobFPGA сказал:

Приветствую!

Опять вы себе жизнь  усложняете :yes3:  Где  в задании сказано  что инициализировать mystr по умолчанию надо рандомными словами?  
То есть  объявление  string mystr = "bla bla bla и еще 18 символов!"  как раз укладывается в условие задачи :wink2:

Если же  хочется  заполнят  рандомными  словами тогда да - придется в цикле сначала генерировать эти слова а уж затем склеивать их в строку.     

Ну и получив строку через $value$plusargs (или взяв то что задали по умолчанию) придется парсить  выделяя  слова в пробелах.   

По умолчанию массивы инициализируются  константами  через   = `{....}.  

Удачи! Rob.

Спасибо за ответ! Правда в задании указано: "Создать массив строковых переменных и заполнить их словами из исходной переменной. ", поэтому и задал вопрос) Что-то нет настроения заморачиваться с парсерами, учитывая сколько всего еще предстоит изучать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Приветствую!

1 minute ago, oleg679976 said:

Спасибо за ответ! Правда в задании указано: "Создать массив строковых переменных и заполнить их словами из исходной переменной. ", поэтому и задал вопрос) Что-то нет настроения заморачиваться с парсерами, учитывая сколько всего еще предстоит изучать.

Это понятно,  лень матушку надо лелеять и  баловать  :biggrin:

Но  увы - массив строковых переменных словами из одной исходной строки без парсера (даже  простейшего) не заполнить.  Так что "Пилите Шура, пилите ..." (... строку на слова) :moil:

Удачи! Rob.  

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...