这一篇在干嘛?

仿真通过了,上板却不对——这时候你需要”透视”芯片内部。ChipWatcher 是 TD 软件内置的在线逻辑分析工具,相当于把一块逻辑分析仪做进了 FPGA 里:把想看的信号接进探针(Probe),设置好触发条件,下载 bit 文件后就能在软件里实时抓内部波形。本文是 08 · 在线调试工具 分类的主笔记,覆盖 SWUG111 手册全部内容:四种探针插入方式、Net View/Instance View 配置、Watch 界面触发采样、上电触发与离线调试。

ChipWatcher 是什么

四种插入方式怎么选

方式一:源码例化 ChipWatcher IP

方式二与方式三:Mark Debug 标记

方式四:Optimize Gate 后插入网表信号

ChipWatcher 全局设置

下载与波形观测:Watch 界面

触发条件设置与采样实战

进阶:上电触发与离线调试

ChipWatcher 是什么:芯片里的”逻辑分析仪”

写 Verilog 时你可以随时加 $display 看仿真波形,但综合后这些代码就没了,上板之后芯片内部信号完全是黑盒。传统办法是把内部信号引到管脚上用示波器看——但引脚数量有限,而且引线本身还会影响时序。

ChipWatcher 的思路是:在芯片内部借用空闲的 RAM 和逻辑资源,搭一个微型逻辑分析仪。待测信号经过探针(Probe)接入,满足触发条件时把波形存进片内 RAM,再通过 JTAG 回传到 TD 软件的波形窗口显示。整个过程不需要任何外部设备。

它有几个关键能力:

  • 同时观察多个信号:一个 ChipWatcher IP 最多 256 个探针,位宽单个最大 1024 bit。
  • 支持多个时钟域:不同时钟的信号自动分配到不同的 ChipWatcher Instance,每个 Instance 独立设置采样深度、触发条件、触发位置。
  • 监测对象灵活:既能监测源代码里的信号(寄存器级),也能监测综合优化后的网表信号。
  • 最多支持 64 个 ChipWatcher IP

ChipWatcher 工作流程图:源码插探针 → Flow 编译 → 下载 bit → 触发采样 → 波形观测

常见坑:时序未收敛时上板抓波形,采集到的数据可能不准确。也就是说 ChipWatcher 抓出来的波形前提是"设计本身时序是过的",它是调试功能问题的工具,不是调试时序问题的工具。

四种插入方式怎么选

ChipWatcher 支持四种把信号接入监测的方式,对应设计流程的不同阶段:

方式操作阶段特点适合场景
例化 ChipWatcher IP写源码时手动接探针,参数完全可控明确知道要测什么,长期保留观测点
源码 Mark Debug 命令写源码时在信号定义处加注释标记,零硬件改动源码级快速标记
Read Design 后界面 Mark Debug编译中途不改源码,界面勾选,可一键批量临时加测点,不想动代码
Optimize Gate 后插入编译后段直接选网表信号,能看到优化后的真实连线排查被优化/重命名的信号

四个方向的编译节奏是相通的:前三种方式标记完信号后,Flow 都可以从 Read Design 一路跑到 Generate Bitstream,中途无需干预;第四种需要在 Optimize Gate 停下来加信号再继续。编译完成后打开 Watch 界面下载、观测即可。

常见坑:和 IO Logic Model 相接的输入/输出 Port 不能被 Mark Debug,否则 IO Logic 无法 Mapping,Opt Gate 阶段直接报错。测输入管脚信号时,先在内部打一拍再测打拍后的信号。

方式一:源码例化 ChipWatcher IP

生成 IP

打开工程后,菜单栏 Tools -> IP Catalog,在 Debug 分类下找到 ChipWatcher。双击弹出 Setup Exporting Options 窗口,自定义 IP 保存路径和 IP Name(默认生成 ip_cwc)。

确认后进入 IP 设置界面,先配置 General Options

参数含义范围 / 默认值
Number of Probes探针个数1~256,默认 1
Sample Data Depth采样数据深度128~65536,默认 1024;深度越大耗 RAM 越多
Input Pipe Stages探针输入寄存器打拍级数0~6,默认 0
Output Pipe Stages数据进 RAM 前寄存器打拍级数0~6,默认 0

两个 Pipe Stages 是时序急救药:如果插入 ChipWatcher 后时序不收敛,增大打拍级数可以优化时序,代价是多用寄存器。注意 Output Pipe Stages 只对”作为数据采样信号”的 Probe 有效(纯触发条件时打拍无效),且与 Input Pipe Stages 的级数是叠加关系。

IP 设置界面 General Options:探针数、采样深度、打拍级数

切到 Probe 页面设置每个探针(界面分 8 页共 256 个探针位,实际可用数量由 Number of Probes 决定):

  • Probe Width:探针位宽,1~1024,默认 1。
  • Data Enable:数据采集使能。勾上才能看波形;不勾省 RAM。
  • Trigger Enable:触发使能。勾上才能当触发条件;不勾省逻辑资源。

IP 设置界面 Probe 页:位宽、采集使能、触发使能

例化到源码

点 OK 后 IP 生成完毕。在顶层模块里例化,把待测信号接到对应 Probe 端口,例如:

ip_cwc u_cwc (
    .clk      (sys_clk),      // 采样触发时钟
    .probe0   (clk_div_cnt),  // 待测信号 0
    .probe1   (led_data)      // 待测信号 1
);

保存后直接跑 Flow(Read Design → Generate Bitstream),跑完即可打开 Watch 界面下载观测。例化的 ChipWatcher IP 的 Instance 不能被重命名,除上电触发外的参数也不能再修改——所有设置都在生成 IP 时定死了。

方式二与方式三:Mark Debug 标记

Mark Debug 方式不用手动接探针:给信号打上标记后,软件自动识别该信号的驱动时钟源作为触发时钟,并按时钟分配到相应 ChipWatcher Instance 的探针上。

方式二:源码加 Mark Debug 命令

只能在信号定义处标记,命令不区分大小写。Verilog 对信号 test 有以下等价写法:

(* MARK_DEBUG = "TRUE" *) reg test;
reg test; // synthesis MARK_DEBUG = TRUE
reg test; // synthesis MARK_DEBUG = 1
reg test; // synthesis MARK_DEBUG
reg test; /* synthesis MARK_DEBUG = TRUE */
reg test; /* synthesis MARK_DEBUG = 1 */
reg test; /* synthesis MARK_DEBUG */

推荐使用第一种属性写法;注释式写法必须放在被标注信号后面才能精准定位。VHDL 的写法用 attribute:

signal test : std_logic;
attribute MARK_DEBUG : BOOLEAN;
attribute MARK_DEBUG of test : signal is TRUE;

加完标记保存,直接跑 Flow 到 Generate Bitstream。软件自动按驱动时钟把信号分到不同 Instance,均为默认配置:采样深度 1024、勾选 Data Enable 和 Trigger Enable、不勾 Power On Trigger、两级 Pipe Stage 都是 0。要改配置,可在 Opt Gate 后打开 ChipWatcher 界面改(见下文方式四)。

方式三:Read Design 后在界面标记

这是最灵活的方式:不改一行源码,Flow 跑完 Read Design 后停下来,在界面上勾选要测的信号。

打开 ChipWatcher 有三个入口:工具栏上的 ChipWatcher 图标;双击 Hierarchy 里的 ChipWatcher;菜单 Tools -> Debug Tools -> ChipWatcher

Mark Debug 主界面:按层级显示各模块信号

主界面按工程层级显示各模块(module)的 Nets 和子模块,常用操作:

  • 工具栏 Filter:按 Instance name / Net name 过滤,支持模糊匹配、大小写、全词、正则表达式;勾选 Hierarchy 会向下搜索所有子模块(全局查找)。
  • Expand ALL / Collapse ALL:展开/折叠全部信号树。
  • 右键 Mark Debug:选中一个或多个信号(Shift/Ctrl 多选)打标记;选中整个 module 则把模块内信号全部标记。被标记的信号前出现蓝色”昆虫”图标。
  • 右键 Unmark Debug / Unmark Debug ALL:去标记。界面加的标记去除后”昆虫”图标消失;源码加的标记去除后变灰色”昆虫”图标(源码本身不变)。
  • Clear:清除界面上所有 Mark Debug/Unmark Debug 操作记录,但不影响源码里写的标记。
  • 右键 Find Net In Instance:选定模块后直接打开 Filter 窗口,Instance name 已自动填好,只输 Net name 即可。

操作完点 Save(界面有改动时才可点)保存,继续跑 Flow 到 Generate Bitstream 即可。

常见坑:已在源码接入 ChipWatcher IP 的信号、源码已加 Mark Debug 标记的信号,不能在 Mark Debug 界面重复标记。另外界面标记属于编译数据库里的"临时"改动,源码重新编译后会丢失,需要重新勾选。

方式四:Optimize Gate 后插入网表信号

前三种方式测的都是源码信号,但综合器可能重命名、合并甚至优化掉你的信号。Optimize Gate 后插入方式让你直接从网表里挑信号观测——看到的就是芯片里真实存在的连线。

操作节奏:Flow 跑完 Optimize Gate(或跑过了一部分 Phy Opt 时,在 Flow Runs 窗口右键 phy(active) -> Reset Runs 回退)并 Open Run 后,打开 ChipWatcher 界面。界面分菜单栏、Net View、Instance View 三个区域。

ChipWatcher 设置主界面:菜单栏 + Net View + Instance View

菜单栏

  • Save:保存设置,有改动才可点(快捷键 Ctrl + S)。
  • Watch:启动 Watch 界面做下载和波形监测;Flow 生成 bit 后或勾了 Power On Trigger 时才可点。工程存在时序违例时图标带黄色叹号,此时抓的数据可能失真或触发失败。
  • Export:导出离线调试文件(.bit / .cwc / .data),详见文末离线调试一节。

Net View 页面:选信号

Net View 是监测信号总列表,同时显示已接入 IP 的信号(“锁”图标)和 Mark Debug 信号(“昆虫”图标)。工具栏提供 Find(Ctrl + F 查找)、Add Nodes(”+“号添加网表信号,支持模糊搜索、多选、Select All 全加)、Delete Selected Nodes(删除所选,带锁/带虫的不可删)、Expand all / Collapse all、Filter(按时钟名、Instance 名、使能状态过滤)。

信号列表分 Probed(可监测列表)和 Unmarked(被 Unmark 的源码标记信号)两页。Probed 页五栏:Name、Data Enable、Trigger Enable、Trigger Clock、Instance。常用右键功能:

  • Set Clock:更改触发时钟。软件会自动推导每个信号的驱动时钟作为触发时钟,个别无时钟驱动的信号(输入管脚、常数信号等)会显示 No Trigger Clock,必须手动 Set Clock,否则不会被接入任何 Instance、无法监测。
  • Enable / Disable:暂时不想监测又不想删的信号,Disable 置灰释放监测,Enable 恢复。
  • Sort Bus:Bus 内 bit 排序,Ascending(a→z 低位到高位)/ Descending(z→a 高位到低位,默认)。
  • View In Instance View:跳转到该信号所在的 Instance(双击 Instance 栏等效)。
  • Delete:仅支持删除 Optimize Gate 后添加的网表信号。

Instance View 页面:调参数

信号按触发时钟自动分配到不同 ChipWatcher Instance(同一时钟下信号超过 256 个探针上限会自动加一个 Instance)。Instance View 以 Instance 为单位分三块:Instance 窗口、监测信号列表窗口、参数设置窗口。

Instance View 页面:Instance 管理、信号列表与参数设置

  • Instance 窗口:右键 Rename(自定义名,IP 例化的除外)、Enable、Disable。Disable 整个 Instance 后其所有信号不被监测且资源被释放。
  • 信号列表窗口:右键 Sort Bus、Move to Instance(把信号挪到别的 Instance,等效于换时钟域)、Find / Expand / Collapse。
  • 参数设置窗口:每个 Instance 独立设置——Clock(建议用自动识别的驱动时钟)、Sample Depth(12864K,默认 1K)、Power On Trigger(上电触发,默认不勾)、Input Pipe Stages 与 Output Pipe Stages(06,时序不收敛时增大)。

设置完 Save。若存在没设触发时钟的信号,保存会弹 CRITICAL 提示,按提示 Set Clock、Disable 或删除即可。之后继续跑 Flow 到 Generate Bitstream。

常见坑:编译前要确认 Hierarchy 下的 ChipWatcher 处于 黑色字体(Enable 状态),灰色则插桩无效,编译出的 bit 里根本没有调试逻辑。

ChipWatcher 全局设置

在 Hierarchy 里右键 ChipWatcher 有三个全局操作:

操作效果
Enable ChipWatcher使能(默认状态),ChipWatcher 黑色字体,可正常编译插桩
Disable ChipWatcher失效,灰色字体;Opt Gate 后插入的调试逻辑不生成、资源释放(源码 IP 和 Mark Debug 插入的除外);打开界面会弹 Warning
Clear Up ChipWatcher清除界面加的所有 Mark Debug 标记、Opt Gate 后加的所有信号和配置;源码 IP 和源码 Mark Debug 不受影响

注意:Disable 或 Clear Up 之后 Flow 编译状态不会自动变化,要重新走一遍 Opt Phy 之后的编译,改动才生效。工程暂时不用调试又想保留信号记录时,用 Disable 释放资源是好办法。

下载与波形观测:Watch 界面

编译完成 Generate Bitstream 后,打开 ChipWatcher 界面点上方 Watch 按钮,进入 Watch 主界面:上半部分是下载窗口,下半部分是波形观察窗口。

Watch 主界面:上为 bit 下载窗口,下为波形观测窗口

bit 文件下载

下载窗口默认打开(关了可通过菜单 View 勾选 Jtag Configuration 找回)。连好硬件平台后点下载按钮开始下载,底部进度条到 100% 即成功。窗口参数:Device(自动识别器件,没显示就查硬件连接)、Bit File(自动识别不可改)、Download Speed(默认 6Mbps 可调)、Current Device(级联下载选芯片)。

务必保证下载进芯片的 bit 就是当前含 ChipWatcher 的版本,否则无法触发并报错。

波形窗口布局与工具栏

波形窗口含标题区、工具栏、数据波形观察区、触发条件设置区。标题区按 Instance 分页,点页签切换时钟域,”+“号下拉可隐藏/显示对应页。工具栏重点按钮:

按钮作用
Instant Trigger忽略触发条件,立即采样刷波形
Single Trigger按触发条件采样一次
Continue Trigger连续触发采样,直到点 Stop
Stop停止触发
Add Signals / Delete向观察列表添加/删除信号
Previous/Next edge把黄色 Value bar 跳到上/下一个跳变沿
Add/Delete time bar、Previous/Next time bar灰色时间标记线的增删跳转
Show edge statistic bar一对测量 bar,统计区间内单 bit 信号上升/下降沿个数
Clear Graphs / Fit for View清除波形 / 波形最大化显示

观察区默认是空的:右键 Add Signals(或点工具栏同按钮)从信号库勾选信号加入。信号库里只有勾了 Data Enable 的探针信号;支持同一信号多次添加、Group/Ungroup 组合、Rename、Set Bus/Group Radix(BIN/HEX/Signed DEC/Unsigned DEC/OCT)、Find Value(按值查找并统计出现次数)、拖拽排序。

触发条件设置与采样实战

触发条件设置区左窗是全局触发设置,右窗是触发信号列表(右键或工具栏 Add Triggers 从库中添加,库里只有勾了 Trigger Enable 的信号)。

触发条件设置区:窗口数、采样深度、触发位置、逻辑运算

全局参数:

  • Number of windows:触发窗口个数,默认 1,最大到 Sample Depth。设多个窗口时按条件多次触发采样,一屏分多窗显示。
  • Window of depth:每窗采样深度,最大为 Sample Depth / Number of windows。
  • Trigger Position in window:触发位置,0 ~ Sample Depth-1。设为最大值即”触发前”模式——抓触发发生前的波形,对排查”出错前的最后几拍”极其有用。
  • Trigger Condition:多条件逻辑运算,Basic AND(全满足才触发)/ Basic OR(满足任一即触发)。

单 bit 信号触发条件下拉可选:don’t care / high / low / rising edge / falling edge / edge(默认 don’t care)。Bus 信号用 Operators 栏设比较运算(==、!=、<、>、>=、<=,或选 edge 对 Bus 内每个 bit 单独设上下沿),Trigger Condition 栏填比较值(格式跟 Radix 一致,如 20u 表示无符号 20);不关心的 bit 取消 Mask Enable 勾选。一个触发信号都不加 = 所有条件 don’t care,等效立即触发。

手册给的完整示例:单 bit 信号 ode5 设 rising edge,Bus 信号 row_cnt== 200,窗口数 1、采样深度 1024、触发位置 127、Basic AND——点 Single Trigger 后波形区出现结果:红色竖线 Trigger bar 是触发点,信号旁 Value 显示的是黄色 Value bar 所在位置的值。窗口状态栏 Status 依次显示 Idle → Wait for trigger → Reading data → Finished。

抓到波形后还可做后处理:Set Bus/Group Radix 换进制显示、Find Value 定位特定数值、Group 把相关信号打包、拖拽调整顺序、沿统计工具数脉冲个数、File -> Export Wave Data 把采样数据导出成 .csv(Sample 列为采样点、Trigger 列 1 表示触发点,其余为探针值),方便离线分析。

常见坑:触发条件永远等不到时,先确认三件事——芯片里的 bit 是不是最新编译的版本、触发信号是不是勾了 Trigger Enable、驱动该信号的时钟是否真的在跑。连续触发模式会一直覆盖采样,点 Stop 才停。

进阶:上电触发与离线调试

上电触发(Power On Trigger)

问题发生在上电瞬间怎么办?普通触发要等你在软件里点按钮,而信号可能一闪而过。上电触发让芯片加载 bit 后自动按预设条件触发采样,四步完成:

  1. 在 ChipWatcher 设置界面给目标 Instance 勾选 Power On Trigger(IP 方式和 Gate 后插入方式都要勾;勾选后 Watch 按钮点亮)。
  2. 点 Watch 进入 Watch 界面,给该 Instance 添加信号、设好触发条件(如 lock 信号 rising edge),保存并关闭 Watch 界面。未勾 Power On Trigger 的 Instance 在此模式下置灰不可操作。
  3. Flow 继续跑完 Phy Opt 生成 bit 文件。
  4. 打开 Watch 界面执行下载,bit 加载完成后自动触发,直接查看上电后的波形。

离线调试

离线调试 = 不开工程上板看波形,适合把调试任务交给产线或同事。流程:

  1. 导出:Flow 完成后,ChipWatcher 设置界面点 Export,导出 compiled.bitcompiled.cwccompiled.data 三个文件。.bit 和 .cwc 是必需的;.data 是波形配置文件(非必需,需在 Watch 里保存过波形配置才有),有上电触发或已保存触发条件时必须带上。多个 Run 时导出的是当前 Active Run 的文件。
  2. 导入:不打开工程直接开 ChipWatcher 界面,弹窗中选择 .cwc 文件导入(.bit 必须和 .cwc 在同一文件夹,否则点 Watch 会报 bit 文件不存在)。导入后所有设置为只读。
  3. 观测:点 Watch 进入 Watch 界面,正常下载和观测,操作与在线调试一致。

通关标准:

  • 用任意一种方式(推荐 Mark Debug)把 2 个以上不同时钟域的信号加进监测列表并完成一次完整编译。
  • 在 Watch 界面设置”单 bit 上升沿 + Bus 等于某值 + Basic AND”的触发条件,用 Single Trigger 抓到波形,并完成一次 Find Value 定位。
  • 走通一遍上电触发或离线调试(Export → 换环境导入 → Watch 观测)。