System verilog 如何在c中处理SystemVerilog特定类型,反之亦然?

System verilog 如何在c中处理SystemVerilog特定类型,反之亦然?,system-verilog,System Verilog,正如我所知,在systemverilog中,没有字符类型和字符串。 SystemVerilog特定类型,包括压缩类型(数组、结构、联合)、2状态或4状态,这些类型在C中没有自然对应关系 如果我们在c中使用字符或字符串,如何在c中处理SystemVerilog特定类型,反之亦然 SV字符串输入(到C)是一个常量字符*。SVstringoutput或inout(来自C)是const char** 正如您可能想象的那样,4状态类型更为复杂: SV TYPE - C TYPE

正如我所知,在systemverilog中,没有字符类型和字符串。 SystemVerilog特定类型,包括压缩类型(数组、结构、联合)、2状态或4状态,这些类型在C中没有自然对应关系


如果我们在c中使用字符或字符串,如何在c中处理SystemVerilog特定类型,反之亦然

SV
字符串
输入(到C)是一个
常量字符*
。SV
string
output或inout(来自C)是
const char**

正如您可能想象的那样,4状态类型更为复杂:

              SV TYPE - C TYPE
                logic - svLogic
packed array of logic - svLogicVecVal *
       unpacked array - svOpenArrayHandle
svLogic
svlogicval
svOpenArrayHandle
svdpi.h
中的类型
svLogic
无符号字符的typedef
,它可以采用
sv_0
sv_1
sv_x
sv_z
中定义的宏值
svLogicVecVal
是一个
struct
,有两个字段:
aval
bval
aval
bval
是32位
int
s(标准格式)。(在IUS中,
aval
bval
称为
a
b

使用
svOpenArrayHandle
传递未打包的数组要复杂得多

我不知道如何传递
struct
s或
union
s,甚至不知道是否可能。(虽然要将这样的东西传递给C,我想你可以做一点流式转换,但那会很麻烦)。

我对“DPI-C”用户的建议是,除非你需要访问4状态值,否则要保持你的参数C兼容。这意味着跨语言边界仅使用
int
s、
byte
s(char)、int/bytes的解包数组/结构或字符串(char*)

Modelsim/Questa有一个开关
-dpiheader filename
,您应该在编译为DPI-C例程生成正确C参数类型的代码时使用它。您的C代码应该包含此文件,以确保您的C代码与所需原型匹配。这样,如果编译器没有错误,就会出现编译器错误,而不是访问垃圾或损坏数据