Есть ли способ привести шаблон назначения SystemVerilog в упакованную структуру? - PullRequest
0 голосов
/ 24 января 2020

Согласно System Verilog LRM «Формат шаблона назначения», структура данных может быть напечатана в строку следующим образом:

module top;
 typedef enum {ON, OFF} switch_e;
 typedef struct {switch_e sw; string s;} pair_t;
 pair_t va[int] = '{10:'{OFF, "switch10"}, 20:'{ON, "switch20"}};
 initial begin
  $display("va[int] = %p;",va);
  $display("va[int] = %0p;",va);
  $display("va[10].s = %p;", va[10].s);
 end
endmodule : top

This example may print:
va[int] = '{10:'{sw:OFF, s:"switch10"}, 20:'{sw:ON, s:"switch20"}} ;
va[int] = '{10:'{OFF, "switch10"}, 20:'{ON, "switch20"}} ;
va[10].s = "switch10";

Есть ли способ сделать обратное? То, что я хотел бы сделать, это взять строку шаблона назначения в качестве плюса или строки, прочитанной из файла, и назначить ее переменной во время выполнения, например:

string assign_pattern = "'{10:'{sw:OFF, s:"switch10"}, 20:'{sw:ON, s:"switch20"}}";
$cast(va, assign_pattern); // ** This doesn't work **

Если это вообще невозможно , есть ли способ сделать это специально для типов упакованных структур?

Ответы [ 2 ]

1 голос
/ 24 января 2020

Вы не можете сделать обратное. SystemVerilog был спроектирован как скомпилированный язык - во время выполнения нет парсера. Вам придется создать синтаксический анализатор в SystemVerilog или достаточно умный C, чтобы декодировать шаблоны назначения, которые вы ожидаете прочитать.

Другой вариант - преобразование файла шаблонов назначения в код, который можно скомпилировать с помощью остальная часть вашего кода.

Еще один вариант, основанный на ваших комментариях

Вы можете использовать оператор потока битов или потоковый оператор для анализа битовой строки в struct , Структура не должна быть упакована, она должна быть составлена ​​из целочисленных значений фиксированного размера.

module top;
  typedef enum bit [1:0] {ON, OFF, INBETWEEN} switch_e;
  typedef struct {switch_e sw; bit [8*8:1] s; bit [5:0] value;} trio_s; // 72 bits
  typedef bit [71:0] uint72_t;

  trio_s v,x;
  uint72_t l;
  initial begin
    x = '{sw:OFF, s:"switch10", value:'h0a};
    l = uint72_t'(x);
    $displayh(l);
    v = trio_s'(l);
    $displayh("v = %p",v);
    $display("v.s = %s",v.s);
  end
endmodule

Это отображает

# 5cddda5d18da0c4c0a
# v = '{sw:OFF, s:8320234785195176240, value:10}
# v.s = switch10
0 голосов
/ 24 января 2020

pair_t va[int] = '{10:'{OFF, "switch10"}, 20:'{ON, "switch20"}};

совпадает с

pair_t va[int] 
initial begin 
  va[10].sw = OFF;
  va[10].s = "switch10";
  ..

Сказав это, вы можете написать свой собственный синтаксический анализатор строки + arg (или строк), который будет присваивать значения массиву поля в задаче. Это единственная возможность. Например:

 string indx = "1";
 string sw = "off";
 initial begin
   int i = indx.atoi();
   va[i].sw = sw == "off" ? OFF : ON; 
   ...
...