Vivado 仿真器 Verilog 数据格式 - 2023.2 简体中文

Vivado Design Suite 用户指南: 逻辑仿真 (UG900)

Document ID
UG900
Release Date
2023-10-18
Version
2023.2 简体中文

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 中的对应位元位置。

表 1. Verilog 值映射
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。

表 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

含超过 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];
表 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 阵列映射到 s_xsi_vlog_logicvals_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];