System verilog 有没有办法将SystemVerilog分配模式强制转换为压缩结构?

System verilog 有没有办法将SystemVerilog分配模式强制转换为压缩结构?,system-verilog,System Verilog,根据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;"

根据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 **

如果通常不可能,有没有专门针对压缩结构类型的方法可以做到这一点?

您不能做相反的事情。SystemVerilog被设计为一种编译语言,在运行时没有可用的解析器。您必须在SystemVerilog或C smart中创建一个解析器,以解码您希望读入的赋值模式

另一个选项是将赋值模式文件转换为可以与其他代码一起编译的代码

另一个基于您的评论的选项 您可以使用位流或流运算符将位字符串解析为
结构。结构不需要打包,它只需要由固定大小的整数值组成

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

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; 
   ...

似乎%p是作为编译时解决方案添加的,因为生成可能包含在后续编译中的赋值语句非常简单。然而,对于较大的设计,与在运行时进行解析相比,重新编译的成本非常大。我希望有一些标准的系统调用来实现这一点,但我可能忽略了这一点。如果没有这一点,下一个最好的选择是,如果有开源VPI代码可以做到这一点(不一定将数据存储为分配模式,但任何人类可读/易于编辑的格式,如JSON/YAML/XML),则system verilog不是脚本语言。您不能生成可由它在同一编译路径中解释的代码。正如您所提到的,您可以使用vpi,或者在平面verilog中执行类似的操作,检查文件读/写功能:$fopen/read/write。您可能应该研究一下
$readmem
函数。我希望避免在SystemVerilog中编写自定义解析逻辑。如果需要,我会将数据存储为二进制数据,然后使用外部脚本将其转换为可编辑的可读结构,并使用脚本将其反向转换回二进制数据。对于打包结构,这更容易做到,这是我的预期用例。在这种情况下,在system verilog中没有解决问题的方法,正如您在问题中所描述的那样。