Vivado シミュレータの Verilog データ形式 - 2022.1 日本語

Vivado Design Suite ユーザー ガイド: ロジック シミュレーション (UG900)

Document ID
UG900
Release Date
2022-04-21
Version
2022.1 日本語

Verilog ロジック データは、xsi.h で定義されている次の構造体を使用した C/C++ でエンコードされています。

typedef struct t_xsi_vlog_logicval {
    XSI_UINT32 aVal;
    XSI_UINT32 bVal;
} s_xsi_vlog_logicval, *p_xsi_vlog_logicval;

Verilog 値の各 4 ステート ビットは、aVal の 1 ビット位置および bVal のそれに対応するビット位置を占めます。

表 1. Verilog 値マッピング
Verilog 値 aVal ビット値 bVal ビット値
0 0 0
1 1 0
X 1 1
Z 0 1

2 ステートの SystemVerilog ビット値の場合、aVal ビットはビット値を保持し、対応する bVal ビットは未使用です。ザイリンクスでは、xsi_put_value の 2 ステート値を形成するときは、bVal を 0 にすることをお勧めします。

Verilog ベクターは、C/C++ では Verilog ベクターの右インデックスが aVal/bVal ビット位置 0 にマップされ、左インデックスが aVal/bVal ビット位置 <vector size> - 1 にマップされます。

表 2. Verilog ベクター
aVal/bVal ビット位置 <vector size> ~ 31 <vector size> - 1 <vector size> - 2 ... 1 0

インデックス

wire [left:right] vec

(left > right)

未使用 left left - 1 ... right + 1 right

インデックス

wire [left:right] vec

(left < right)

未使用 left left + 1 ... right - 1 right

次の表に、次の Verilog ベクターと等価の Verilog および C/C++ を示します。

wire [7:4] w = 4'bXX01;
表 3. Verilog ベクターと等価の Verilog および C/C++
Verilog ビット インデックス       7 6 5 4
Verilog ビット値       X X 0 1
C/C++ ビット位置 31 ... 4 3 2 1 0
aVal ビット値 未使用 ... 未使用 1 1 0 1
bVal ビット値 未使用 ... 未使用 1 1 0 0

33 個以上の要素がある Verilog ベクターの C/C++ 表現は s_xsi_vlog_logicval の配列で、Verilog ベクターの右から 32 ビットが C/C++ 配列の要素 0 に、次の 32 ビットが C/C++ 配列の要素 1 に、というようにマップされます。次の表に、Verilog ベクターのマップ例を示します。

wire [2:69] vec;

これは、次の C/C++ 配列にマップされます。

s_xsi_vlog_logicval val[3];
表 4. Verilog インデックス範囲
Verilog インデックス範囲 C/C++ の配列要素
vec[38:69] val[0]
vec[6:37] val[1]
vec[2:5] val[3]

つまり、vec[2]val[3] ビット位置 3 にマップされ、vec[69]val[0] ビット位置 0 にマップされます。

多次元 Verilog 配列は、Verilog 配列が C/C++ へのマップ前に行優先順でフラット化されるように、s_xsi_vlog_logicval または s_xsi_vlog_logicval 配列のビットにマップされます。

たとえば、次の 2 次元配列があるとします。

reg [7:0] mem[0:1];

C/C++ にマップする前にベクターにコピーされたように扱われます。

reg [15:0] vec;
vec[7:0] = mem[1];
vec[8:15] = mem[0];