Jump to content

    
oleg679976

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

Recommended Posts

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

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites
8 часов назад, andrew_b сказал:

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

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

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

Share this post


Link to post
Share on other sites

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

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. 

Share this post


Link to post
Share on other sites
37 минут назад, RobFPGA сказал:

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

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


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

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

 

Удачи!  Rob. 

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

1 hour ago, oleg679976 said:

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

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

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

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

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

Удачи! Rob.

Share this post


Link to post
Share on other sites
11.01.2021 в 17:18, RobFPGA сказал:

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

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

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

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

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

Удачи! Rob.

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

Share this post


Link to post
Share on other sites

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

1 minute ago, oleg679976 said:

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

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

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

Удачи! Rob.  

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.