据我所知,在systemverilog中,没有char类型和字符串。 SystemVerilog特定的类型,包括打包类型(数组,结构,联合),2状态或4状态,在C中没有自然对应。
如果我们在c中使用char或string,如何处理c中的SystemVerilog特定类型,反之亦然?
答案 0 :(得分:2)
我对" DPI-C"的建议用户是指除非您需要访问4状态值,否则请保持您的参数与C兼容。这意味着在语言边界中仅使用int
s,byte
s(char),ints / bytes的解压缩数组/结构或字符串(char *)。
Modelsim / Questa有一个开关-dpiheader filename
,你应该在编译代码时使用它来为DPI-C例程生成适当的C参数类型。您的C代码应该包含此文件以确保您的C代码与所需的原型匹配。这样,如果他们没有编译器错误,而不是访问垃圾或破坏数据。
答案 1 :(得分:1)
SV string
输入(到C)是const char *
。 SV string
输出或inout(来自C)是const char **
。
正如您可能想象的那样,4状态类型更复杂:
SV TYPE - C TYPE
logic - svLogic
packed array of logic - svLogicVecVal *
unpacked array - svOpenArrayHandle
svLogic
,svLogicVecVal
和svOpenArrayHandle
是svdpi.h
中的类型。 svLogic
是unsigned char
的typedef,可以取值sv_0
,sv_1
,sv_x
和sv_z
,它们是在中定义的宏svdpi.h
。 svLogicVecVal
是一个struct
,其中包含两个字段:aval
和bval
。 aval
和bval
是32位int
s(规范形式)。 (在IUS中,aval
和bval
被称为a
和b
。)
使用svOpenArrayHandle
传递解压缩的数组要复杂得多。
我不知道如何通过struct
或union
或即使有可能。 (虽然把这样的事情传递给C,我猜你可以做点流演员,但那会很混乱)。