ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

如何在 ModelSim 中保存指定时间段仿真波形:TaoToken 配置 wlf 文件与复现验证

如何在 ModelSim 中保存指定时间段仿真波形:TaoToken 配置 wlf 文件与复现验证 1. ModelSim 波形保存的真实痛点仿真跑完波形没了如果你用 ModelSim 跑过一个稍微大点的 testbench大概率经历过这种崩溃仿真跑了四十分钟波形窗口里信号密密麻麻你刚把 cursor 拖到出问题的那段时间准备截图或者记下关键值结果手一抖关了窗口或者第二天重新打开 ModelSim发现昨天的波形全没了只能从头再跑一遍。更难受的是有些仿真带随机激励重跑一次波形还不一定长得一样问题复现都成问题。这个场景的核心需求其实就两个第一把指定时间段的仿真波形存下来不是整段几十万纳秒全存而是只存你关心的那几百纳秒第二下次打开 ModelSim 能直接加载回放不用重新编译、不用重新仿真。ModelSim 本身提供了 wlfWave Log Format文件机制来干这件事但官方文档写得比较散网上很多教程只讲了「保存」没讲「怎么只保存两个 cursor 之间的时间段」也没讲「保存完怎么验证真的能复现」。这篇就围绕 ModelSim 的 wlf 文件把指定时间段波形保存、do 脚本骨架、回放验证这一整套流程拆开讲清楚。适合正在用 ModelSim 做 RTL 仿真验证的 FPGA/IC 方向同学尤其是那些仿真时间长、需要反复回看特定时间窗口的人。下面提到的配置和脚本都可以直接复制到你的工程里改。2. TaoToken 前置把模型对话和接入文档放在手边在动手配 wlf 之前先说一个能明显提升排障效率的前置动作。ModelSim 的 do 脚本命令、wlf 文件格式、cursor 操作这些细节官方手册查起来慢遇到报错时如果有个能直接问的入口会省很多时间。我平时会把 TaoToken 的模型对话页面开着遇到wlf打不开、dataset命令报错这类问题直接把报错信息贴进去问比翻 PDF 快。TaoToken 的入口按用途分几个模型对话排障、问命令用法https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite接入文档do 脚本、API 相关配置参考https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewriteAPI Keys如果你要把仿真流程接到自动化脚本里https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite控制台https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewriteAPI 地址是 https://taotoken.net/api 注意这个不带 UTM 参数配置脚本里填这个就行。官网首页在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 需要看整体功能可以从这里进。这里要强调一点TaoToken 是辅助你查命令、问报错、生成 do 脚本骨架的工具它不替代 ModelSim 本身。波形保存和回放的核心操作还是在 ModelSim 里完成TaoToken 帮你把「命令怎么写」「报错什么意思」这类问题快速解决掉。3. 可复制配置wlf 保存 指定时间段导出3.1 先理解 wlf 和 dataset 的关系ModelSim 里波形数据存在 wlf 文件里仿真运行时默认会往vsim.wlf写。但默认这个文件是整段仿真都记而且关掉就没了。要保存指定时间段思路是仿真跑完后用 cursor 标出起止时间然后用dataset相关命令把这段导出成独立的 wlf 文件。关键命令是dataset save它能把当前 dataset 的波形存成 wlf。但dataset save默认存的是整个 dataset要限定时间段需要配合 cursor 和wave export或者用dataset save的窗口参数。实际更稳的做法是用write wave或者直接操作 wlf 的保存范围。3.2 手动操作两个 cursor 锁定时间段先讲图形界面手动做法这是最直观的第一步仿真跑完后在 Wave 窗口左下角找到那个绿色加号点两次会出现cursor1和cursor2两行。第二步拖动 cursor1 到你关心时间段的起点cursor2 拖到终点。比如你要看 998000ns 到 999000ns 这段就把两个 cursor 分别拖到这两个位置。拖的时候注意看 cursor 行后面的数值确认时间点对。第三步点 cursor 前面的小锁图标把两个 cursor 锁定防止误拖。第四步在 cursor2 那一行的时间数值上右键选Filter Waveform...弹出的窗口里选择从 cursor1 到 cursor2 的范围然后指定保存路径和文件名。文件名一定要手动加.wlf后缀不加的话后面导入时 ModelSim 识别不了还得改后缀。路径建议全英文中文路径实测打不开。3.3 do 脚本骨架自动化保存指定时间段手动操作适合偶尔用如果你要反复保存不同时间段写个 do 脚本更省事。下面这个骨架可以直接改# save_wave_window.do # 用法在 ModelSim transcript 里执行 do save_wave_window.do # 假设仿真已经跑完dataset 名字是 sim # 设置要保存的时间窗口单位 ns set t_start 998000 set t_end 999000 set out_file D:/sim_wave/window_998000_999000.wlf # 在当前 dataset 上添加两个 cursor # cursor 操作通过 wave cursor 命令 wave cursor add -time $t_start wave cursor add -time $t_end # 用 dataset save 保存配合 -window 参数限定范围 # 注意不同 ModelSim 版本参数名可能略有差异 dataset save sim $out_file -window $t_start $t_end # 如果上面的 -window 不支持用下面这种先导出再存的方式 # write wave -window $t_start $t_end $out_file echo 波形已保存到 $out_file这里有个坑要提醒dataset save的-window参数不是所有版本都支持Questasim 和较新的 ModelSim 版本支持得比较好老版本可能报unknown option。如果报错就改用write wave命令或者先用 cursor 选中范围再dataset save不带 window 参数让它存当前选中范围。3.4 参数对照表参数/命令作用注意事项wave cursor add -time在指定时间加 cursor时间单位跟仿真精度一致dataset save保存 dataset 到 wlf不带 window 存整段-window t1 t2限定保存时间段版本支持差异大write wave导出波形到文件格式支持需确认文件名.wlf后缀必须手动加不加导入识别不了保存路径全英文中文路径打不开4. 验证请求与成功结果回放确认波形真的在保存完不是就结束了必须验证下次能加载。验证步骤重新打开 ModelSim不要重新编译工程直接File - Open选择你保存的 wlf 文件。打开后左侧栏会出现可加入的模块和信号列表。把需要的信号拖到 Wave 窗口检查时间轴范围是不是你保存的那段比如 998000ns 到 999000ns。如果打开后左侧栏是空的或者信号加进去波形是平的说明保存时范围没选对或者 wlf 文件损坏。这时候回到保存步骤确认 cursor 位置和保存范围。一个更自动化的验证方式是在 do 脚本里加回放检查# verify_wave.do # 打开保存的 wlf 并检查信号是否存在 set wlf_file D:/sim_wave/window_998000_999000.wlf # 打开 wlf 作为 dataset dataset open $wlf_file saved_wave # 切换到该 dataset dataset active saved_wave # 添加信号到 wave add wave -dataset saved_wave /tb_top/clk add wave -dataset saved_wave /tb_top/data_out # 检查时间范围 echo 当前 dataset 时间范围 dataset info saved_wave # 如果能看到信号且时间范围正确说明保存成功执行后 transcript 里会打印 dataset 信息确认时间范围和你保存的一致就说明回放验证通过。5. 本篇常见错排查5.1 wlf 文件打不开提示格式错误最常见原因是文件名没加.wlf后缀。ModelSim 保存时如果你只写了window_998000它可能存成别的格式或者存成 wlf 但没后缀导入时识别不了。解决方法是保存时手动写全window_998000.wlf如果已经存错了直接改文件名加后缀再试。5.2 中文路径导致打开失败实测中文路径下 wlf 文件打不开报错可能是cannot open file或者直接没反应。把保存路径改成全英文比如D:/sim_wave/这种不要用桌面或者带中文的目录。5.3 dataset save 报 unknown option -window这是版本差异。老版本 ModelSim 不支持-window参数。替代方案先用wave cursor选中范围然后用write wave导出或者升级到支持该参数的版本。如果不想升级就用图形界面的Filter Waveform手动存。5.4 保存后波形是空的或者只有一部分信号检查保存时是不是只选中了部分信号。dataset save默认存当前 dataset 的所有信号但如果你在 Wave 窗口里只加了部分信号保存的可能只是这些。要存全量确保保存前所有需要的信号都在 Wave 里或者用add wave -r /*把所有信号加进来再存。5.5 回放时时间轴不对如果打开 wlf 后时间轴从 0 开始而不是你保存的起始时间说明保存时没限定范围存了整段。回到保存步骤确认 cursor 范围和-window参数正确传入。6. 语义一致 CTA按你的场景选入口如果你现在正在配 wlf 保存、写 do 脚本遇到命令报错或者参数不确定直接去模型对话页面贴报错问https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite如果你要把这套波形保存流程接到自动化回归脚本里需要 API 接入先拿 API Keyshttps://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite如果你长期做编码和 Agent 相关的仿真流程自动化Coding Plan 入口在https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite最后补一个实用技巧保存 wlf 时把时间段写进文件名比如window_998000_999000.wlf下次找的时候一眼就知道是哪段。do 脚本里把t_start和t_end做成参数用do save_wave_window.do 998000 999000这种方式调用比每次改脚本方便。
返回列表