Vivado综合后仿真:2D数组端口扁平化后的测试适配问题
适配Vivado综合后仿真中2D数组端口展平的测试调整方案
Vivado综合后仿真时,多维数组端口会被展平为单维或独立端口,针对这类变化,可通过以下方式调整测试用例,尤其是$fscanf赋值环节:
1. 先确认网表端口的实际形态
首先查看综合生成的网表文件(.v/.sv格式),明确展平后端口的准确名称和位宽:
- 你给出的示例中,原端口
reg signed [12:0] mac_ofdIsymbol_tqs [1:0];,网表通常会将其拆分为两个独立单维端口,命名可能是mac_ofdIsymbol_tqs_0和mac_ofdIsymbol_tqs_1(也可能保留括号格式,但网表一般会用合法标识符,括号会被替换为下划线),每个端口位宽都是12:0。
2. 修改DUT例化与$fscanf赋值逻辑
方式一:直接适配展平后的端口
如果测试用例无需兼容前仿真,可直接调整变量定义和例化映射:
// 定义对应展平端口的变量 reg signed [12:0] tq0, tq1; // 从文件读取数据到变量 $fscanf(test_fd, "%d %d", tq0, tq1); // 例化DUT时映射到展平后的端口 dut u_dut ( .mac_ofdIsymbol_tqs_0(tq0), .mac_ofdIsymbol_tqs_1(tq1), // 其他端口映射 );
方式二:保留原2D数组变量,仅调整例化映射
如果想保留原测试逻辑中的2D数组,只需在例化时将数组元素分别映射到展平端口:
// 保留原2D数组定义 reg signed [12:0] mac_ofdIsymbol_tqs [1:0]; // 原有的$fscanf赋值逻辑不变 $fscanf(test_fd, "%d %d", mac_ofdIsymbol_tqs[0], mac_ofdIsymbol_tqs[1]); // 例化时拆分映射 dut u_dut ( .mac_ofdIsymbol_tqs_0(mac_ofdIsymbol_tqs[0]), .mac_ofdIsymbol_tqs_1(mac_ofdIsymbol_tqs[1]), // 其他端口映射 );
3. 兼容前/后仿真的宏定义方案
为了让测试用例同时支持前仿真(原2D端口)和后仿真(展平端口),可通过宏切换逻辑:
`ifdef POST_SIM // 后仿真分支:适配展平端口 reg signed [12:0] tq0, tq1; $fscanf(test_fd, "%d %d", tq0, tq1); dut u_dut ( .mac_ofdIsymbol_tqs_0(tq0), .mac_ofdIsymbol_tqs_1(tq1), // 其他端口 ); `else // 前仿真分支:使用原2D端口 reg signed [12:0] mac_ofdIsymbol_tqs [1:0]; $fscanf(test_fd, "%d %d", mac_ofdIsymbol_tqs[0], mac_ofdIsymbol_tqs[1]); dut u_dut ( .mac_ofdIsymbol_tqs(mac_ofdIsymbol_tqs), // 其他端口 ); `endif
在Vivado后仿真时,添加POST_SIM宏定义即可自动适配。
4. 特殊情况:展平为单一大位宽端口
若网表将2D数组展平为一个连续的大位宽端口(比如mac_ofdIsymbol_tqs[25:0],高13位对应索引1的元素,低13位对应索引0),可通过数组拼接适配:
reg signed [12:0] mac_ofdIsymbol_tqs [1:0]; $fscanf(test_fd, "%d %d", mac_ofdIsymbol_tqs[0], mac_ofdIsymbol_tqs[1]); // 拼接为大位宽变量 reg signed [25:0] flattened_tqs = {mac_ofdIsymbol_tqs[1], mac_ofdIsymbol_tqs[0]}; dut u_dut ( .mac_ofdIsymbol_tqs(flattened_tqs), // 其他端口 );
注意:需确认网表中展平后的位序,避免赋值顺序错误。
关键注意事项
- 必须以实际网表的端口定义为准,不同综合设置可能导致命名规则差异;
- 原端口为
signed类型时,展平后的端口变量也要保持符号属性,避免符号扩展错误。
内容的提问来源于stack exchange,提问作者Farah Bayomi
相关产品推荐
相关产品推荐

