FPGA仿真环境搭建与使用技巧(II)

作者:warren Huang,来源:FPGA FAE技术分享选集

作为FPGA工程师,在仿真的过程中大概率都踩过这些坑。为了复现一个罕见边界场景,改RTL代码再重仿真,半小时就没了;仿真跑了数小时,发现激励不是自己想要的,只能从头再来;不同版本\不同工具的波形文件互不兼容,反复导出数据折腾半天。

今天就给大家分享几个仿真硬核技巧,不用修改 RTL 代码、不用重复跑仿真,实时调整激励、断点续跑、跨平台复用波形,直接把你的仿真效率拉满。

一、Force 强拉:实时修改激励,仿真中途随心控

Force 命令是仿真验证里的 “万能改值神器”,核心优势就是无需修改代码、无需重新编译、仿真运行中实时生效,既能定向构造极端场景,也能临时调整激励,大幅节省仿真调试时间。

我们虽然通过在RTL代码中插入force—release语法去构造定向激励,也可以通过三方仿真软件例如VCS的-debug_access+reverse反方向编译的方式重新注入激励。但实际仿真场景中,最常用的方法是仿真到某个阶段,使用force命令,不用修改RTL代码,不用重新仿真,实时修改仿真激励,极大节省仿真时间。

它的核心适用场景覆盖了绝大多数调试需求:

a. 给寄存器 / 线网在指定时间强制赋值,固定为常数值

b. 临时修改时钟的频率、占空比,无需改动时钟生成逻辑

c. 让多位宽信号按指定周期、指定时长在两个数值间循环跳变

d. 强制赋值后,可指定时间恢复原信号状态,也可永久锁定数值

下面我们分两大主流仿真工具,拆解 Force 的实战用法和避坑要点。

1、Modelsim/Questasim的Force命令GUI 操作方法:

举例1:生成50%占空比、50ns周期的时钟,300ns后停止跳变,回归原波形

1. 选中目标信号(支持顶层 /子模块任意信号),右键选择【Clock】

2. 在弹窗中设置:偏移时间、占空比、周期、停止时间、高低电平值

3. 点击确认,自动生成 Force 命令并生效

自动生成的标准命令示例:

force -freeze   sim:/tb/my_path/name1 1 0, 0 {25000 ps} -r 50000 -can 300000

举例2:固定信号电平,强制锁定数值

需要在仿真的某个时间点,把信号强制改成固定值,且不受其他逻辑驱动影响,用这个方法最合适。

1.选中目标信号,右键选择【Force】

2.Kind选项选择【Freeze】,填入目标数值、生效延迟时间、可选的取消时间

3.点击确认,立即生效

2、Vivado Xsim Force命令实战用法

Vivado的Xsim仿真器中,Force 相关操作通过add_force命令实现,GUI 操作同样便捷,核心注意点:时间参数默认是相对偏移时间(相对于当前设置的时间点),而非Modelsim的绝对仿真时间。

举例1:生成指定宽度的复位/脉冲信号

需求:当前仿真时间是630ns,需要通过XSIM GUI控制复位信号ext_reset,在 631ns强制拉高,650ns拉低,生成19ns的高电平脉冲。

GUI操作:右键信号→选择【Force Constant】,填入对应参数

·Force value:1

·Starting after time offset:1ns  (相对于630ns偏移)

· Cancel after time offset:20ns (相对于630ns偏移)

对应TCL 命令:

tcl

# 施加Force
add_force {/my_path /ext_reset} -radix hex {0 1ns} -cancel_after 20

# 清除Force
remove_forces {/my_path/ext_reset}

举例2:临时修改信号值,指定时间后恢复

需求:当前仿真时间是25ns,让 4bit位宽的信号 tx_sof [3:0],在 26ns跳转为16进制D,40ns恢复原值。

操作要点:当前仿真时间为 25ns,设置起始偏移1ns(25+1=26ns),取消偏移 15ns(25+15=40ns)。

举例3:永久锁定信号值,不自动恢复

需求:当前仿真时间50ns,让 tx_sof [3:0]立即跳转为16进制B,后续一直保持该值,不自动恢复。

操作要点:起始偏移设为 0ns,不填写Cancel after参数,即可永久锁定。

举例4:生成自定义占空比的双值跳变信号

需求:当前仿真时间150ns,tx_sof [3:0]从150ns开始,在 6 和 C 之间循环跳转,6保持40ns,C保持60ns;450ns时停止并恢复原状态。

GUI 操作:右键信号→选择【Force Clock】,填入对应参数

·Leading edge value:6

·Trailing edge value:C

·Duty cycle:40%(对应第一个值的占比)

·Period:100ns

·Starting after time offset:150ns

·Cancel after time offset:300ns(150ns 开始,持续 300ns 到 450ns)

二、Checkpoint 仿真还原点:告别重复仿真,断点续跑超省心
长时仿真最头疼的,就是软件意外关闭、电脑重启,导致数小时甚至数天的仿真成果白费,Checkpoint就是专门解决这个问题的 “仿真存档神器”。

核心价值
·仿真过程中随时保存还原点,退出软件、重启电脑都不影响

·重新打开软件后,可直接从还原点继续仿真,无需从头开始跑

·支持从还原点继续统计代码覆盖率,无需重复仿真

一步到位的使用步骤
1.仿真过程中,在Transcript 窗口输入保存命令,生成还原点文件:

tcl

checkpoint my_save.dat
2.关闭仿真软件,甚至重启电脑都不受影响

3.重新打开软件,先cd到工程路径,再输入还原命令,直接加载还原点:

tcl

# 切换到工程路径
cd 你的工程文件路径
# 加载还原点,恢复仿真状态
vsim -restore my_save.dat
4.加载完成后,直接继续run仿真即可,和之前的仿真状态完全一致。

三、波形跨平台兼容:解决版本不兼容、跨工具查看难题
仿真波形的兼容性问题,是很多工程师的日常痛点:

1、不同版本的Modelsim生成的.wlf 文件互不兼容,高版本保存的波形,低版本直接打不开。例如不同版本的modelsim 保存的.wlf是不兼容的,用其它版本打不开,会直接打不开或报版本过低的错误。例如modelsim-SE10.6及其以下版本去打开questasim2020.1的wlf会报版本过低的警告。

2、vivado保存的波形打开不方便,ILA的波形保存不方便观察(ILA导出csv是比较方便的write_hw_ila_data -force -csv_file test.csv),如果想用questasim等观察,这时候导出vcd格式,然后vcd2wlf。

这里给大家分享一套通用的波形跨平台、跨版本兼容方案,核心是通过通用的 VCD 格式做中转,实现全平台、全工具的波形复用。

全流程操作步骤
步骤 1:导出通用 VCD 波形文件
VCD 是业界通用的波形格式,几乎所有仿真工具、调试工具都支持,是跨平台转换的核心。

分两种场景导出:

场景 A:仿真前规划好,直接导出指定模块的 VCD
在仿真启动后、run 仿真之前,输入以下命令:

# 1. 创建并打开vcd文件

vcd file my_wave.vcd

# 2. 添加需要抓取的信号,支持通配符

vcd add /tb_top/* # 抓取testbench顶层所有信号

vcd add /tb_top/dut/* # 抓取dut模块所有信号

# 3. 运行仿真

run 1000ns

# 4. 结束仿真,自动生成vcd文件

quit –sim
场景 B:仿真已经跑完,从现有 wlf 文件转 VCD
如果仿真已经结束,有现成的.wlf 波形文件,直接用转换命令即可:

tcl

wlf2vcd -o my_wave.vcd vsim.wlf
执行后,工程目录下会直接生成 my_wave.vcd 文件。

补充:Vivado ILA抓取的波形,也可以先导出 csv分析,核心命令:write_hw_ila_data -force -csv_file ila_wave.csv ,也可以导出vcd文件分析。

步骤 2:VCD转WLF,实现跨平台查看
把生成的 my_wave.vcd 文件拷贝到目标平台/目标软件环境,执行转换命令,生成对应环境可打开的 wlf 文件:

tcl

# 切换到vcd文件所在路径
cd /path_to_your_vcd_file
# 执行转换,vcd转wlf
vcd2wlf my_wave.vcd my_wave_out.wlf
步骤 3:一键打开波形,复用配置
1.首次打开,执行命令打开波形文件:

tcl

vsim -view my_wave_out.wlf
2.在波形窗口添加需要查看的信号,调整好格式后,保存为 wave.do 脚本

3.后续再次打开,直接执行一条命令,即可打开波形并加载之前的配置:

tcl

vsim -view xx.wlf -do wave.do

熟练掌握这几个技巧,能帮你省去大量重复编译、重复仿真、折腾波形文件的时间,把更多精力放在场景验证和问题定位上。

如果您在仿真环境搭建方面有问题,欢迎联系:

simonyang@comtech.cn

charlesxu@comtech.cn