私が知っているように、systemverilogでは、char型と文字列はありません。 Cで自然な対応がない、パックドタイプ(配列、構造体、共用体)、2状態または4状態を含むSystemVerilog固有の型。SystemVerilog固有の型をC言語で扱うにはどうしたらいいですか?
cでcharまたはstringを使用する場合は、処理方法SystemVerilog固有の型はCで、その逆も可能です。
私が知っているように、systemverilogでは、char型と文字列はありません。 Cで自然な対応がない、パックドタイプ(配列、構造体、共用体)、2状態または4状態を含むSystemVerilog固有の型。SystemVerilog固有の型をC言語で扱うにはどうしたらいいですか?
cでcharまたはstringを使用する場合は、処理方法SystemVerilog固有の型はCで、その逆も可能です。
入力(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
はaval
とbval
の2つのフィールドを持つstruct
です。 aval
およびbval
は、32ビットのint
(標準形式)です。 (IUSは、aval
とbval
がa
とb
と呼ばれる。)
svOpenArrayHandle
を使用してアンパック配列を渡すは、はるかに複雑です。
struct
またはunion
を渡す方法がわかりません。 (Cにそのようなことを渡すことはできますが、あなたはビットストリームのキャストを行うことができますが、それは乱雑になるでしょう)。
「DPI-C」をお使いの方には、4状態値にアクセスする必要がない限り、引数をC互換にすることをお勧めします。これは、int
、byte
(char)、ints/bytesのアンパックされた配列/構造体、または文字列(char *)のみを使用することを意味します。
Modelsim/Questaにはスイッチ-dpiheader filename
があります。これは、DPI-Cルーチン用の適切なCの引数型を生成するコードをコンパイルする際に使用する必要があります。あなたのCコードは、あなたのCコードが必要なプロトタイプと一致することを確認するためにこのファイルをインクルードすべきです。ガベージにアクセスするか、データを破損するのではなく、そうしないとコンパイラエラーが発生します。
確かにお勧めですが、私は言ったでしょう。 –