这一篇在干嘛?
仿真通过了,上板却不对——这时候你需要”透视”芯片内部。ChipWatcher 是 TD 软件内置的在线逻辑分析工具,相当于把一块逻辑分析仪做进了 FPGA 里:把想看的信号接进探针(Probe),设置好触发条件,下载 bit 文件后就能在软件里实时抓内部波形。本文是 08 · 在线调试工具 分类的主笔记,覆盖 SWUG111 手册全部内容:四种探针插入方式、Net View/Instance View 配置、Watch 界面触发采样、上电触发与离线调试。
ChipWatcher 是什么:芯片里的”逻辑分析仪”
写 Verilog 时你可以随时加 $display 看仿真波形,但综合后这些代码就没了,上板之后芯片内部信号完全是黑盒。传统办法是把内部信号引到管脚上用示波器看——但引脚数量有限,而且引线本身还会影响时序。
ChipWatcher 的思路是:在芯片内部借用空闲的 RAM 和逻辑资源,搭一个微型逻辑分析仪。待测信号经过探针(Probe)接入,满足触发条件时把波形存进片内 RAM,再通过 JTAG 回传到 TD 软件的波形窗口显示。整个过程不需要任何外部设备。
它有几个关键能力:
- 同时观察多个信号:一个 ChipWatcher IP 最多 256 个探针,位宽单个最大 1024 bit。
- 支持多个时钟域:不同时钟的信号自动分配到不同的 ChipWatcher Instance,每个 Instance 独立设置采样深度、触发条件、触发位置。
- 监测对象灵活:既能监测源代码里的信号(寄存器级),也能监测综合优化后的网表信号。
- 最多支持 64 个 ChipWatcher IP。

常见坑:时序未收敛时上板抓波形,采集到的数据可能不准确。也就是说 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 的级数是叠加关系。

切到 Probe 页面设置每个探针(界面分 8 页共 256 个探针位,实际可用数量由 Number of Probes 决定):
- Probe Width:探针位宽,1~1024,默认 1。
- Data Enable:数据采集使能。勾上才能看波形;不勾省 RAM。
- Trigger Enable:触发使能。勾上才能当触发条件;不勾省逻辑资源。

例化到源码
点 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_DEBUGreg 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。

主界面按工程层级显示各模块(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 三个区域。

菜单栏
- 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 窗口:右键 Rename(自定义名,IP 例化的除外)、Enable、Disable。Disable 整个 Instance 后其所有信号不被监测且资源被释放。
- 信号列表窗口:右键 Sort Bus、Move to Instance(把信号挪到别的 Instance,等效于换时钟域)、Find / Expand / Collapse。
- 参数设置窗口:每个 Instance 独立设置——Clock(建议用自动识别的驱动时钟)、Sample Depth(128
64K,默认 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 主界面:上半部分是下载窗口,下半部分是波形观察窗口。

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 后自动按预设条件触发采样,四步完成:
- 在 ChipWatcher 设置界面给目标 Instance 勾选 Power On Trigger(IP 方式和 Gate 后插入方式都要勾;勾选后 Watch 按钮点亮)。
- 点 Watch 进入 Watch 界面,给该 Instance 添加信号、设好触发条件(如 lock 信号 rising edge),保存并关闭 Watch 界面。未勾 Power On Trigger 的 Instance 在此模式下置灰不可操作。
- Flow 继续跑完 Phy Opt 生成 bit 文件。
- 打开 Watch 界面执行下载,bit 加载完成后自动触发,直接查看上电后的波形。
离线调试
离线调试 = 不开工程上板看波形,适合把调试任务交给产线或同事。流程:
- 导出:Flow 完成后,ChipWatcher 设置界面点 Export,导出
compiled.bit、compiled.cwc、compiled.data三个文件。.bit 和 .cwc 是必需的;.data 是波形配置文件(非必需,需在 Watch 里保存过波形配置才有),有上电触发或已保存触发条件时必须带上。多个 Run 时导出的是当前 Active Run 的文件。 - 导入:不打开工程直接开 ChipWatcher 界面,弹窗中选择 .cwc 文件导入(.bit 必须和 .cwc 在同一文件夹,否则点 Watch 会报 bit 文件不存在)。导入后所有设置为只读。
- 观测:点 Watch 进入 Watch 界面,正常下载和观测,操作与在线调试一致。
通关标准:
- 用任意一种方式(推荐 Mark Debug)把 2 个以上不同时钟域的信号加进监测列表并完成一次完整编译。
- 在 Watch 界面设置”单 bit 上升沿 + Bus 等于某值 + Basic AND”的触发条件,用 Single Trigger 抓到波形,并完成一次 Find Value 定位。
- 走通一遍上电触发或离线调试(Export → 换环境导入 → Watch 观测)。
自测:ChipWatcher 的采样深度设得越大越好吗?
不是。采样深度(128
65536)决定一次触发能存多少个采样点,深度越大消耗的片内 RAM 越多,可能挤占设计本身的 BRAM 需求。应按”需要观察多长的波形窗口”来选择,比如定位一个 128 拍内的问题用 1281024 就够了。
自测:插入 ChipWatcher 后出现时序违例告警,有哪些手段补救?
① 增大 Input Pipe Stages / Output Pipe Stages(各最大 6 级,可叠加)给探针路径打拍;② 减少 Probe 个数、降低 Probe 位宽;③ 降低触发时钟频率。注意打拍只对参与数据采样的 Probe 有效,纯触发条件的 Probe 打 Output 拍无效。
自测:为什么有的信号在 Net View 里显示 No Trigger Clock?不处理会怎样?
输入管脚、常数信号、含常数的 Bus 等没有时钟驱动的信号无法自动推导触发时钟。不手动 Set Clock 的话,该信号不会被接入任何 ChipWatcher Instance,不会出现在波形观测列表,也就无法监测。
自测:源码里写的 MARK_DEBUG 标记,在 Mark Debug 界面 Unmark 之后源码会变吗?
不会。界面 Unmark 只去掉编译层的监测(“昆虫”图标由蓝变灰表示仍带源码标记),源码内容不变。想恢复监测只需再执行 Mark Debug;而 Clear Up ChipWatcher 和 Unmark Debug ALL 也都不会改动源码。
自测:离线调试时点击 Watch 报"bit 文件不存在",最可能的原因是什么?
导出的 .bit 和 .cwc 文件没有放在同一个文件夹下。离线调试要求两者同目录,导入时选 .cwc,软件会自动在同路径找 .bit。