如何通过DPI-C传递包含动态数组的SystemVerilog结构?

时间:2019-04-12 13:49:03

标签: struct verilog dynamic-arrays

这是该问题的最小工作示例:

下面的示例可以很好地编译(使用Cadence Incisive / Xcelium)如果我注释掉 import "DPI-C"语句和对print_object(s);的调用。

因此证明了带有动态数组的结构是合法的SystemVerilog语法。

但是,如果我尝试通过DPI-C传递相同的结构,则会收到错误消息:

  

xmvlog:* E,UNUSAG(tb.sv,10 | 62):形式参数中未打包的struct数据类型中不受支持的元素。

program top;

  typedef struct {
    int scalar_int;
    int dyn_arr_int[];
  } my_struct_s;

  import "DPI-C" function void print_object(input my_struct_s s);
  // Cannot pass a dynamic-array containing struct via DPI-C.

  //   import "DPI-C" function void print_object(input my_struct_s s);
  //                                                               |
  // xmvlog: *E,UNUSAG (tb.sv,10|62): unsupported element in unpacked struct datatype in formal argument.

  initial begin
    my_struct_s s;

    s.scalar_int = 100;
    s.dyn_arr_int = '{25, 35, 45};

    $display("Value of the struct printed from SV: %p", s);
    print_object(s);

    $finish;
  end

endprogram : top

所以问题是:

是否有解决方法,将带有动态数组的结构传递到C端?有没有办法将带有“指针”的结构传递给那些动态数组?还是其他方式?

一种解决方法是传递带有“最大”大小的静态数组的结构,并传递一个标量整数,该标量整数存储该静态数组的子集实际数据的长度。但这是一个非常丑陋的解决方法,需要SystemVerilog中的开销来计算长度并填充该静态数组,并且与仅传递动态数组相比,效率可能也较低。

0 个答案:

没有答案