ARTICLE DETAIL

资讯详情

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

RTL仿真调试三源融合工具:日志、波形与信号连接的统一分析平台

RTL仿真调试三源融合工具:日志、波形与信号连接的统一分析平台 1. 这不是又一个波形查看器它把 RTL 仿真调试从“人肉翻日志”变成了“问问题就出答案”我做这个工具的起因特别简单——上周五下午四点十七分我盯着 ModelSim 里一段持续 32 个时钟周期的红色波形线手边摊着三份不同层级的 testbench 日志、一份 UVM phase trace 输出、还有一张手绘的信号连接草图。客户 deadline 是下周一上午十点而我卡在“为什么 reset_n 在第 17 个 cycle 突然被拉低”这个点上已经整整六小时。不是不会查是太会查了我知道该看 testbench 的 init_sequence该 grep $display 的 reset_assert_time该 zoom 到 waveform 的 exact time该 cross-probe 到 DUT 内部的 rst_ctrl 模块……但所有这些动作都得靠人脑串联、靠手指重复、靠经验预判路径。这不是调试这是考古。这个工具的核心就是把 RTL 仿真调试中那些必须由工程师大脑完成的隐性推理过程变成可调用、可复现、可沉淀的显性能力。它不替代 ModelSim、VCS 或 Questa而是坐在它们之上像一位经验丰富的 senior engineer随时听你提问“为什么 clk_en 在第 45678 个时间戳变低”、“show me all signals connected to top.dut.core0.axi_arvalid”、“对比 run1 和 run2 中 top.dut.mem_ctrl.wr_cnt 的波形差异”。它能同时理解日志文本的语义、波形数据的时序结构、以及 RTL 源码中模块实例化与端口连接的拓扑关系——这三者在传统流程里是割裂的三个世界而这个工具强行把它们焊在了一起。关键词 RTL、仿真调试、日志、波形、信号连接不是并列的五个词而是一个闭环RTL 是对象仿真调试是目标日志是行为记录波形是状态快照信号连接是结构骨架。缺了任何一环root cause 就像拼图少了一角永远差那么一点。所以这个工具的设计哲学很直白不追求炫酷的 UI不堆砌无用的功能只解决一个痛点——当你面对一个失败的仿真波形时能不能在 30 秒内从“看到现象”直接跳到“锁定根源模块触发条件相关日志行”中间省掉所有手动 grep、手动 zoom、手动 cross-probe、手动比对的体力劳动。它面向的不是初学者而是每天和波形、日志、连接关系打交道的 ASIC/FPGA 验证工程师、IP 集成工程师、甚至资深的数字设计工程师。如果你还在用 Notepad 对着 log 文件 CtrlF或者靠记忆去猜某个信号在 hierarchy 里的路径那这个工具就是为你写的。2. 整体架构与设计思路为什么必须是“三源融合”而不是单点增强2.1 传统调试链路的断裂点在哪里要理解这个工具为什么长成现在这样得先看清传统 RTL 仿真调试工作流里那些看不见的“断点”。我们以一个典型的 AXI 总线 timeout 错误为例断点一日志与波形的时间锚定失效testbench 打印AXI ARREADY timeout at time 123456789 ps你打开波形文件找到 123456789 ps 这个时间点发现 arready 是高电平arvalid 是低电平——看起来没问题。但你忽略了log 里的时间戳是$realtime而波形里显示的是$time两者精度单位可能不同ps vs ns且$realtime可能包含仿真器内部调度延迟。人工对齐误差常达 10~100 个时间单位足够错过关键的亚稳态窗口。断点二波形与 RTL 结构的语义鸿沟你在波形里看到top.dut.core0.axi_arvalid信号异常想快速定位到驱动它的逻辑。传统做法是右键 “Find in Design”但 ModelSim 会带你跳到axi_arvalid的 port declaration而不是assign axi_arvalid core0_inst.arvalid_out;这条 assign 语句。你得再手动展开core0_inst再找arvalid_out的定义再追溯到内部 FSM 的输出逻辑。这个过程平均耗时 2~5 分钟且极易在 hierarchy 深度 5 层时迷路。断点三日志内容与信号行为的因果脱节log 里写着INFO: [UVM] sequence axi_read_seq started at 123450000 ps而波形里axi_arvalid在 123456789 ps 失效。你本能地认为二者相关但 log 里没写axi_read_seq具体驱动了哪些信号也没写它依赖的core0内部状态机当前处于哪个 state。日志是“发生了什么”波形是“当时什么样”但没人告诉你“为什么发生”。这三个断点本质是时间维度、结构维度、行为维度的割裂。任何单点工具比如一个更好的 log viewer或一个带搜索的 waveform viewer都无法弥合。所以本工具的架构基石就是强制建立这三者的双向映射。2.2 三源融合架构Log Parser Waveform Indexer RTL Graph Builder整个系统分为三个核心引擎它们不是松散耦合而是共享一个统一的时空坐标系和信号标识符体系Log Parser 引擎不满足于简单的正则匹配。它内置了针对 UVM、Synopsys VCS、Mentor Questa 等主流仿真器日志格式的语法解析器。例如对 UVM log它能自动识别UVM_INFO 123450000 ps中的后面是$realtime并将其转换为与波形时间轴对齐的整数时间戳单位ps。更重要的是它会提取日志中的语义实体sequence name、transaction id、component path如uvm_test_top.env.agent0.sequencer、signal name如axi_arvalid。这些实体不是字符串而是指向 RTL Graph 中节点的引用。Waveform Indexer 引擎它不把波形当图片处理而是当数据库。使用开源的fstFast Signal Trace格式作为底层存储比传统的 VCD 小 5~10 倍读取快 3~5 倍并构建三层索引时间索引对每个信号建立(timestamp - value)的跳跃表skip list支持 O(log n) 时间复杂度的任意时间点值查询变化索引记录每个信号所有 value change 的时间点列表用于快速定位“第一次变低”、“最后一次变高”等事件关联索引基于 RTL Graph 中的连接关系为每个信号预计算其“上游驱动信号集”和“下游负载信号集”。例如查询top.dut.core0.axi_arvalid时索引器能瞬间返回core0_inst.arvalid_out、core0_inst.fsm_state、core0_inst.arready_int等所有在时序上可能影响它的信号。RTL Graph Builder 引擎这是整个系统的“知识图谱”。它通过解析 Verilog/VHDL 源码使用 ANTLR4 构建的语法树构建一个有向图节点Node代表模块实例core0_inst、端口axi_arvalid、寄存器wr_cnt、组合逻辑块assign语句边Edge代表连接关系分为drives驱动、loads加载、instantiates实例化、contains包含属性Property每个节点都挂载元数据如module_pathtop.dut.core0、line_number源码行号、uvm_component_type如果是 UVM component。这三个引擎的数据最终汇聚到一个统一的查询服务层。当你输入自然语言问题时服务层首先进行语义解析将问题拆解为对 Log、Waveform、Graph 的联合查询请求然后并发调用三个引擎最后将结果融合、去重、按相关性排序后返回。这不是 AI 在“猜”而是 AI 在“精确导航”。2.3 为什么不用 LLM 直接读原始日志/波形文件这是很多人第一反应也是我们必须明确划清的界限。市面上已有不少尝试用大模型分析日志的方案但它们在 RTL 调试场景下几乎必然失败原因有三精度灾难LLM 的 token 生成是概率性的。当你要确认axi_arvalid在123456789 ps的值是0还是1时LLM 可能输出 “根据上下文它很可能是低电平”而你需要的是确定的0。一个 bit 的误判可能导致整个 root cause 方向错误。结构盲区LLM 无法理解top.dut.core0.axi_arvalid和core0_inst.arvalid_out是同一个物理信号在不同命名空间下的别名。它会把它们当作两个无关字符串导致跨层次的因果推理完全失效。成本黑洞一个中等规模的 RTL 仿真波形文件FST 格式动辄几百 MB日志文件也常达数十 MB。把它们全喂给 LLM 做 inference单次查询成本远超 $1且响应时间以分钟计。而我们的索引查询平均响应时间 800ms峰值 QPS 200。所以我们的 AI 不是“分析引擎”而是“查询编译器”和“结果解释器”。它把你的自然语言编译成对三个高度结构化数据库的精准 SQL-like 查询它把数据库返回的原始数据时间戳、信号值、节点 ID翻译成人类可读的结论“axi_arvalid在 123456789 ps 变为 0由core0_inst.fsm_state从IDLE进入WAIT_ARREADY导致相关日志见第 1234 行”。AI 在这里是桥梁不是大脑。3. 核心功能实现与实操细节从安装到第一个问题3.1 环境准备与依赖安装轻量级不碰你的仿真环境这个工具的设计原则之一就是零侵入现有仿真流程。它不修改你的 Makefile不替换你的仿真器也不要求你重新编译 RTL。它只是一个独立的 Python 3.9 应用运行在你的开发机上Linux/macOS 推荐Windows 支持但需额外配置 WSL2。安装步骤极其简单全程离线可完成核心依赖均打包进 wheel# 1. 创建虚拟环境推荐避免污染全局 Python python3 -m venv rtl-debug-env source rtl-debug-env/bin/activate # Linux/macOS # rtl-debug-env\Scripts\activate.bat # Windows # 2. 安装核心包约 45MB含 fst reader、antlr4 runtime、fastapi server pip install rtl-debug-tool0.8.3 # 3. 验证安装 rtl-debug --version # 输出rtl-debug-tool 0.8.3 (build 20240521)提示rtl-debug-tool不依赖 ModelSim/VCS/Questa 的 license 或 runtime。它只读取你仿真后生成的输出文件FST/VCD 波形、纯文本日志、Verilog 源码因此可以部署在 CI/CD 流水线的 debug 节点上供自动化脚本调用。最关键的依赖是libfst用于高效读取 FST 波形和antlr4-python3-runtime用于 RTL 语法解析。我们已将libfst编译为多平台 wheelx86_64, aarch64并静态链接了所有系统库彻底规避了libz.so not found这类经典依赖地狱问题。实测在 Ubuntu 20.04、CentOS 7、macOS Monterey 上开箱即用。3.2 数据准备三步走生成工具可识别的“调试包”工具不接受零散文件而是要求你提供一个结构化的“调试包”debug bundle。这一步是保证后续查询准确性的基石必须严格遵循。Step 1生成 FST 波形替代 VCDVCD 文件体积巨大且读取慢强烈建议改用 FST。在你的仿真脚本中只需添加两行# ModelSim/Questa 用户在 do 文件末尾加 vcd -f fst -r /path/to/output.fst vcd -on # VCS 用户在仿真命令后加 vcsfst/path/to/output.fst注意FST 文件必须包含所有你关心的信号。如果只 dump 了顶层信号工具将无法追溯到内部模块。建议在 testbench 中使用$dumpvars(0, top);或在仿真器 GUI 中勾选 “Dump All Signals”。Step 2规范化日志输出日志文件本身无需修改但必须确保时间戳格式统一。工具默认识别以下三种格式[UVM] INFO 123456789 ps: ...VCS INFO 123456789: ...Questa INFO Time: 123456789 ps ...如果你的日志格式不符比如没有ps单位或用ns可在启动工具时指定解析规则rtl-debug --log-format my_custom: %s %d: %s --log-time-unit ns startStep 3构建 RTL Graph这是最耗时但只需做一次的步骤。工具会扫描你的 Verilog 源码目录构建知识图谱# 假设你的 RTL 代码在 ./src/verilog/ 下testbench 在 ./tb/ rtl-debug graph-build \ --src-dir ./src/verilog/ \ --tb-dir ./tb/ \ --top-module top \ --output ./debug-bundle/graph.json此命令会递归扫描./src/verilog/下所有.v,.sv,.vh文件解析top模块的实例化树识别所有子模块、端口连接、assign 语句为每个信号生成唯一的全局路径如top.dut.core0.axi_arvalid输出一个压缩的 JSON 文件graph.json大小通常 5MB。实操心得首次构建可能耗时 2~10 分钟取决于代码规模。建议在 CI 流水线中将graph-build作为 pre-sim 步骤生成的graph.json与波形、日志一起归档。这样每次 debug 时只需rtl-debug start --bundle ./debug-bundle/秒级启动。3.3 启动服务与首次查询从 CLI 到 Web UI工具提供两种交互方式命令行CLI和网页界面Web UI。CLI 适合集成到脚本Web UI 适合深度探索。CLI 模式最快上手# 启动服务后台运行 rtl-debug start --bundle ./debug-bundle/ # 发送第一个自然语言查询注意用英文中文支持在 v0.9 开发中 rtl-debug query why is top.dut.core0.axi_arvalid low at 123456789 ps # 输出示例已简化 [INFO] Query parsed: signaltop.dut.core0.axi_arvalid, time123456789, conditionlow [RESULT] Signal value at 123456789 ps: 0 (low) [RESULT] Upstream drivers: [core0_inst.arvalid_out, core0_inst.fsm_state] [RESULT] Core0 FSM state at 123456789 ps: WAIT_ARREADY [RESULT] Related log lines: Line 1234: UVM_INFO 123450000 ps: axi_read_seq started Line 1241: UVM_INFO 123456700 ps: core0 entered WAIT_ARREADY [CONCLUSION] axi_arvalid went low because core0s FSM transitioned to WAIT_ARREADY state, waiting for ARREADY.Web UI 模式可视化探索在浏览器中打开http://localhost:8000你会看到一个极简界面左侧是自然语言输入框右侧是结果面板包含波形片段自动 zoom 到查询时间点、相关日志高亮、RTL 连接图可点击节点展开底部是“溯源路径”Provenance Path以时间线形式展示log event - FSM state change - signal assignment - waveform value。注意Web UI 默认只监听localhost如需远程访问如在服务器上运行本地浏览器访问启动时加--host 0.0.0.0参数并确保防火墙放行 8000 端口。3.4 高级查询语法超越“问问题”实现精准控制虽然自然语言是入口但专业用户需要更精确的控制。工具支持一套轻量级查询 DSLDomain Specific Language语法类似 SQL但更贴近硬件工程师思维查询类型示例说明时间范围查询signal top.dut.mem_ctrl.wr_cnt between 100000000 and 100001000 ps返回该信号在指定时间窗口内的所有值变化点用于分析计数器行为变化事件查询event top.dut.core0.axi_arvalid rising_edge after 123450000 ps limit 1查找axi_arvalid在指定时间之后的第一个上升沿返回精确时间戳连接关系查询connections of top.dut.core0.axi_arvalid upstream列出所有直接驱动axi_arvalid的信号包括内部 assign 和 port mapping日志上下文查询log with axi_read_seq and timeout near 123456789 ps window 10000 ps查找包含关键词且时间戳在目标时间 ±10000 ps 范围内的日志行这些 DSL 查询可以直接在 CLI 中执行也可以在 Web UI 的高级模式下输入。它们的优势在于可复现、可脚本化、可嵌入到自动化 debug 流程中。例如你可以写一个 Python 脚本遍历所有失败的仿真 run对每个 run 的 failure time 自动执行event ... rising_edge查询生成一份“各 run 中关键信号触发时刻对比表”。4. 常见问题与排查技巧实录那些文档里不会写的坑4.1 “查询返回空结果”——不是工具坏了是数据没对齐这是新手遇到最多的问题。当你输入why is top.dut.core0.axi_arvalid low at 123456789 ps却得到No results found第一反应往往是工具故障。但 90% 的情况是三源数据在关键维度上没对齐。请按此顺序排查检查时间戳单位是否一致运行rtl-debug info --bundle ./debug-bundle/查看输出中的waveform_time_unit和log_time_unit。如果二者不一致如 wave 是pslog 是ns工具会自动转换但前提是 log 中明确写了单位。如果 log 里只有123456789没有单位工具会默认按ps解析导致错位。解决方案在graph-build或start时用--log-time-unit显式指定。检查信号路径是否存在于波形中FST 文件只包含你dumpvars的信号。运行rtl-debug wave-list --bundle ./debug-bundle/ \| grep axi_arvalid确认top.dut.core0.axi_arvalid确实在波形列表里。如果不在说明仿真时没 dump 这个信号需修改仿真脚本重新跑。检查 RTL Graph 是否包含该路径运行rtl-debug graph-query --bundle ./debug-bundle/ node top.dut.core0.axi_arvalid。如果返回Node not found说明graph-build时没扫描到定义该信号的模块。常见原因是top.dut.core0是一个黑盒 IP其 Verilog 源码未放入--src-dir或是core0模块名在实例化时用了别名如core0_inst但工具默认按模块名core0查找。解决方案在graph-build时加--instance-map core0_inst:core0参数建立实例名到模块名的映射。实操心得我曾在一个项目中卡了两天最后发现是graph-build时漏掉了./src/ip/axi_interconnect/目录而axi_arvalid的最终驱动逻辑就在那个 interconnect 里。工具无法凭空“猜”出不存在的连接。RTL Graph 的完整性决定了整个工具能力的上限。4.2 “波形显示为红线”——ModelSim 的经典诅咒工具如何破局modelsim仿真波形是红线是 RTL 工程师的集体创伤。它意味着信号在某个时间点进入了X未知或Z高阻状态导致后续逻辑不可预测。传统做法是沿着驱动链路逐级向上查X的来源。这个过程枯燥且易错。本工具对此有专门优化X/Z 溯源模式当你查询一个X值信号时工具会自动启动溯源算法不是简单列出上游信号而是找出第一个出现X的上游节点。例如rtl-debug query why is top.dut.core0.axi_arvalid X at 123456789 ps # 输出 [RESULT] First X occurrence in upstream chain: core0_inst.arvalid_out: X at 123456780 ps core0_inst.fsm_state: X at 123456775 ps core0_inst.reset_n: X at 123456770 ps -- ROOT CAUSE [RESULT] reset_n is X because it is driven by top.rst_gen_inst which was not initialized.初始化检查报告工具内置一个“初始化完备性检查器”。运行rtl-debug check-init --bundle ./debug-bundle/它会扫描所有寄存器报告哪些 reg 在仿真开始后1000 ps内仍未被赋初值initial或reset。报告会精确到行号如./src/verilog/core0.sv:45: reg [31:0] wr_cnt; // missing initial or reset assignment。注意这个检查器不是静态 lint而是结合了波形动态行为。它知道wr_cnt在1000 ps后仍为X才判定为未初始化。这比单纯看代码更可靠。4.3 “日志太多找不到关键行”——用语义聚类代替暴力 grep面对几十万行的 UVM loggrep -n timeout可能返回上千行。工具的解决方案是日志语义聚类启动 Web UI 后点击左上角Log Explorer标签页工具会自动将日志按UVM severityINFO/WARNING/ERROR、UVM componentuvm_test_top.env.agent0.sequencer、UVM transaction typeaxi_read_item进行三维聚类你可以一键折叠所有INFO级别日志只看ERROR和WARNING或者点击axi_read_seq组件查看该组件产生的所有日志形成一条清晰的“序列执行时间线”。更强大的是跨日志关联。例如你发现run1的 log 里有ERROR: AXI timeout而run2的 log 里没有。工具可以执行log-diff run1.log run2.log不仅对比文本差异更对比UVM transaction id的执行序列指出run1中axi_read_seq在123456789 ps失败而run2中同个 sequence 在123456790 ps成功进而引导你聚焦到123456789-123456790 ps这个 1ps 的微小时间窗。4.4 性能瓶颈与优化当波形文件超过 2GB对于超大规模 SoC 仿真FST 文件可能达 2~5 GB。此时Waveform Indexer的内存占用会飙升首次查询可能长达 10 秒。我们提供了三个实战级优化方案按需索引On-Demand Indexing默认模式下工具启动时会预加载整个 FST 并构建全部索引。对于大文件可改为按需加载rtl-debug start --bundle ./debug-bundle/ --wave-index-mode lazy此模式下只在你第一次查询某个信号时才为其构建索引。后续查询该信号飞快但首次查询稍慢。内存占用从 GB 级降至百 MB 级。信号白名单Signal Whitelist如果你只关心axi_*、apb_*、clk_*这几类信号可以在graph-build时指定rtl-debug graph-build --signal-pattern axi_.*|apb_.*|clk_.* ...工具只会为匹配正则的信号构建波形索引忽略其他信号体积和内存占用立减 60%。分布式索引Distributed Indexing对于团队协作可将波形索引文件.idx单独导出放在 NFS 或 S3 上rtl-debug wave-index-export --bundle ./debug-bundle/ --output s3://my-bucket/indexes/其他成员启动时用--wave-index-source s3://my-bucket/indexes/直接加载预构建的索引无需本地重建。我在某 5G 基带项目中用lazywhitelist组合将一个 3.2GB 的 FST 文件的内存占用从 8.4GB 降到 1.2GB首次查询时间从 12.3s 降到 1.8s效果立竿见影。5. 信号连接分析的深度实践从“看到连线”到“理解意图”5.1 连接关系不只是“谁连谁”更是“为什么这么连”在 RTL Graph 中“连接”Connection是一个有丰富语义的实体远不止wire a b;这么简单。工具为每条连接标注了connection_type这直接影响 root cause 的判断connection_type示例调试意义direct_assignassign axi_arvalid core0_inst.arvalid_out;最简单值直接传递问题必在core0_inst.arvalid_outport_mappingcore0_inst (.axi_arvalid(axi_arvalid));涉及模块边界需检查core0_inst的端口声明和内部逻辑hierarchical_overridedefparam top.dut.core0_inst.FREQ 1000;defparam可能覆盖默认参数导致内部逻辑行为异常generate_blockgenvar i; generate for (i0; i4; ii1) begin : gen_axi ... end生成块中的连接有索引需确认i的取值范围和实际实例化数量当你查询connections of top.dut.core0.axi_arvalid upstream时工具返回的不仅是信号名还有完整的连接语句和connection_type。例如[RESULT] Upstream connections: 1. direct_assign: assign axi_arvalid core0_inst.arvalid_out; (line 45, core0.sv) 2. port_mapping: core0_inst (.arvalid_out(axi_arvalid)); (line 12, dut.sv) 3. generate_block: gen_axi[i] (.arvalid_out(axi_arvalid[i])); (line 88, interconnect.sv)这立刻告诉你axi_arvalid的值来自core0_inst.arvalid_out而core0_inst的arvalid_out又可能被interconnect的gen_axi块驱动。调试路径瞬间清晰。5.2 多驱动Multiple Driver冲突的自动检测iic波形出现台阶、pwm波形失真这类问题根源常是多个 source 同时驱动一个 net造成竞争。传统方法是手动检查所有assign和inout声明效率极低。本工具内置multi-driver-checkerrtl-debug check-multi-driver --bundle ./debug-bundle/ --signal-pattern i2c_.*|pwm_.*它会扫描 RTL Graph找出所有被assign、tri、wand等关键字声明为多驱动的 net结合波形在运行时检查这些 net 是否真的出现了非预期的X或电压台阶报告冲突的驱动源及其激活时间。例如[ALERT] Multi-driver conflict on i2c_sda: Driver 1: i2c_master_inst.sda_out (active at 123456700 ps) Driver 2: i2c_slave_inst.sda_in (active at 123456705 ps) Conflict window: 123456700-123456705 ps - causes voltage step in waveform这个功能救过我两次。一次是 I2C 总线上的sda信号master 和 slave 的驱动使能时间没对齐导致通信失败另一次是 PWM 输出管脚GPIO 控制逻辑和 PWM 模块同时驱动造成输出电压不稳定。工具在 30 秒内就定位到了冲突源而手动排查花了我一整天。5.3 “信号连接”在 UVM 环境中的特殊含义在 UVM 验证环境中“连接”不仅是 RTL 层面的 wire 连接更是TLMTransaction Level Modeling层面的端口连接。例如uvm_sequencer通过seq_item_port连接到uvm_driver这种连接决定了 transaction 的流向。工具能识别 UVM TLM 连接并将其与 RTL 连接关联当你查询top.uvm_test_top.env.agent0.sequencer时工具不仅显示其 RTL 实例路径还会显示TLM ports:seq_item_port(connected todriver0.seq_item_export)Related RTL signals:axi_arvalid,axi_araddr,axi_arlen(由 driver 驱动的物理信号)这样当你看到axi_arvalid异常时可以一键跳转到sequencer的seq_item_port查看它发送了什么 transaction从而将“物理层问题”与“事务层行为”打通。这正是root cause的终极形态它不再局限于“哪个门电路坏了”而是“哪个 transaction 触发了这个坏行为”。6. 从个人工具到团队资产CI/CD 集成与知识沉淀6.1 自动化 debug 流水线让每次失败都有“诊断报告”在大型项目中仿真失败不应只是抛出一个FAIL而应附带一份机器生成的Debug Report。我们将工具深度集成到 Jenkins/GitLab CI 中在仿真脚本末尾添加 report 生成# 仿真成功后自动生成 debug bundle rtl-debug bundle-create \ --wave ./sim/output.fst \ --log ./sim/sim.log \ --graph ./build/graph.json \ --output ./reports/debug-bundle-$(date %Y%m%d-%H%M%S).zip # 如果仿真失败立即生成 root cause 报告 if [ $? -ne 0 ]; then rtl-debug auto-report \ --bundle ./reports/debug-bundle-latest.zip \ --failure-time $(get_failure_time_from_log ./sim/sim.log) \ --output ./reports/root-cause-$(date %Y%m%d-%H%M%S).md fiJenkins 插件支持我们提供了 Jenkins 插件能自动解析root-cause-*.md将关键结论如ROOT CAUSE: core0_inst.reset_n not initialized提取为构建的Build Description并在 Slack 通知中高亮显示。这样当 CI 报告 Simulation
返回列表