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 值的每个四态位都占据 aVal
中的一个位元位置以及 bVal
中的对应位元位置。
Verilog 值 |
aVal 位值 |
bVal 位值 |
---|---|---|
0 | 0 | 0 |
1 | 1 | 0 |
X | 1 | 1 |
Z | 0 | 1 |
对于二态 SystemVerilog 位值,aVal
位用于保存位值,对应 bVal
位则不使用。AMD 建议您在为 xsi_put_value 组合二态值时,将 bVal
置零。
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 |
含超过 32 个元素的 Verilog 矢量的 C/C++ 表示法是 s_xsi_vlog_logicval
阵列,其中,Verilog 矢量最右侧的 32 个位映射到 C/C++ 阵列的元素 0。该 Verilog 矢量的后 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 阵列映射到 s_xsi_vlog_logicval
或 s_xsi_vlog_logicval
阵列的各个位的方式与在将 Verilog 阵列映射到 C/C++ 之前先将其以按行为主的顺序来平铺是相同的。
例如,二维阵列
reg [7:0] mem[0:1];
的处理方式与映射到 C/C++ 之前先复制到矢量相同:
reg [15:0] vec;
vec[7:0] = mem[1];
vec[8:15] = mem[0];