这是该问题的最小工作示例:
下面的示例可以很好地编译(使用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中的开销来计算长度并填充该静态数组,并且与仅传递动态数组相比,效率可能也较低。