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
のそれに対応するビット位置を占めます。
Verilog 値 |
aVal ビット値 |
bVal ビット値 |
---|---|---|
0 | 0 | 0 |
1 | 1 | 0 |
X | 1 | 1 |
Z | 0 | 1 |
2 ステートの SystemVerilog ビット値の場合、aVal
ビットはビット値を保持し、対応する bVal
ビットは未使用です。AMD では、xsi_put_value の 2 ステート値を形成するときは、bVal
を 0 にすることをお勧めします。
Verilog ベクターは、C/C++ では Verilog ベクターの右インデックスが aVal/bVal
ビット位置 0 にマップされ、左インデックスが aVal/bVal
ビット位置 <vector size> - 1 にマップされます。
aVal/bVal ビット位置 | <vector size> ~ 31 | <vector size> - 1 | <vector size> - 2 | ... | 1 | 0 |
インデックス
(left > right) |
未使用 | left | left - 1 | ... | right + 1 | right |
インデックス
(left < right) |
未使用 | left | left + 1 | ... | right - 1 | right |
次の表に、次の Verilog ベクターと等価の Verilog および C/C++ を示します。
wire [7:4] w = 4'bXX01;
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];
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];