
面板上 Run Trigger 点下去状态栏一直挂着 Waiting for Trigger波形窗口一片空白或者反过来系统跑得好好的你低着头点了一遍又一遍停止触发器、运行触发器手都点酸了。这两个场景几乎覆盖了 Vivado ILA 使用中绝大多数让人抓狂的时刻。这篇内容就围绕**运行触发器Run Trigger、停止触发器Stop Trigger、自动重新触发Auto Retrigger**这三个按钮和选项展开把它们背后的状态机、采样窗口、触发条件讲透顺便把抓不到信号采样频率到底有没有上限触发位置该填多少这些经常被问到的问题一次说清楚。适合刚上手 Vivado 的 FPGA 工程师也适合已经会点按钮、但每次抓波形都靠运气的朋友。1. 先搞清 ILA 的三段式状态机从武装到上传很多人把 ILA 当成示波器来理解这个比喻只对了一半。示波器是你按下单次触发它把屏幕上的波形冻住而 ILA 是一个跑在你 FPGA 内部、挂在 JTAG 后面、靠 BRAM 存数据的采集器。你点的每一个按钮实际改的都是这个采集器内部状态机的迁移条件。搞不清状态机按钮就会变成玄学。1.1 一个 ILA 核内部其实只有四件事在做把 ILA IP 拆开看它内部逻辑非常朴素总共四件事采样用你在 IP 配置里指定的采样时钟clk把 probe 上挂的信号每一拍打进来写进 BRAM 组成的环形缓冲区。比较触发比较器拿着当前这一拍的 probe 值和你设置的触发条件做逐位比较条件成立就拉一个内部标志。冻结标志拉起来之后按触发位置Trigger Position继续采若干拍填满当前窗口然后停止写入进入 Full 状态。上传通过 JTAG 把 BRAM 里的数据读到主机端转成波形窗口里的那一片图形。注意一个关键顺序采样是持续的比较是持续的只有写入被冻结。也就是说在你还没触发之前ILA 已经在不停地往环形缓冲里写数据了只不过这些数据会被后面的新数据覆盖掉你永远看不到——直到触发发生写指针停下那段被保留下来的历史才成为你能看到的波形。这就是 pre-trigger 数据的来源也是 ILA 比逻辑仿真更好用的核心原因它能让你看到触发之前发生了什么。1.2 采样时钟、采样深度和存储窗口的三方关系这三个参数是捆绑在一起的任何一个改动都会影响另外两个的观感。采样时钟来自你把哪根时钟网线接到了 ILA 的 clk 端口。它不是软件里设定的而是你设计里真实存在的时钟。采样深度Window Data Depth是每个窗口存多少个采样点。两者的乘积关系决定了你能看到多长的时间跨度时间跨度 采样深度 / 采样时钟频率举个直白的例子采样深度 2048采样时钟 100MHz那你一次能看到的波形长度就是 2048 ÷ 100MHz ≈ 20.48μs。如果换成 50MHz 的采样时钟同样深度就能看到 40.96μs代价是时间分辨率下降一半——50MHz 采样意味着两个采样点之间隔了 20ns任何比 20ns 窄的毛刺你都抓不到。这里有个新手最容易忽略的点采样深度不是免费的。ILA 的存储用的是 FPGA 内部的 BRAM占用大致是深度 × probe 总位宽。你挂 64 位 probe深度给 8192那就是接近 512Kb 的 BRAM在中小器件上直接能把 BRAM 用掉一大半接着综合就开始报时序或者资源不够。所以深度这个数通常是够用就行而不是越大越好。1.3 触发条件成立那一瞬间发生了什么触发条件不是你点按钮那一刻才生效的而是从 ILA 被武装之后就一直在比较。比较器拿到的是当前采样拍的数据逐位和触发值比对。假设触发位置设成 1024深度 2048。那么在触发成立的那一拍环形缓冲里已经存着触发点之前 1024 个采样点的数据触发之后ILA 还会继续采 1024 拍然后停下来。最终上传到你面前的是一段触发点前后各一半的波形。这个机制直接决定了一个实操结论只要触发条件成立的瞬间被观测的信号已经处于异常状态那么触发点之前的那段数据里就藏着你最想看的前因。触发位置这个参数的价值就在这里后面第 5 节会专门算这笔账。2. 运行触发器与停止触发器改的是控制器不是采集器搞清状态机之后回过头看这两个按钮就很简单了。它们不改变 ILA 的采集参数只负责推动状态机往前走或者往回退。2.1 运行触发器本质上是一次重新武装大多数人的直觉是点运行触发器 开始采样。这个理解会让你踩坑。在 ILA 空闲状态下它确实不往 BRAM 里写有效数据点下运行触发器之后状态切到 Waiting for Trigger采集和比较同时开始跑。但关键在于如果在你按下按钮的那一刻触发条件已经成立ILA 会立刻触发并开始冻结。这时候你上传上来的波形很可能几乎全是触发点之后的数据pre-trigger 部分少得可怜你会觉得自己抓到了但没抓到想看的东西。正确的操作顺序应该反过来先让被测系统进入触发条件不成立的稳定状态比如把复位按住、把业务数据流停掉。在硬件管理器中点运行触发器确认状态栏变成 Waiting for Trigger。再释放复位或者让系统跑起来。等触发发生上传数据。在调试复位释放之后的头几拍发生了什么这种问题时这个顺序是必须的否则你永远抓不到复位释放前后那段。另外还有一个按钮经常被忽略立即触发Trigger Immediate。它不理会你设置的触发条件直接命令 ILA 用当前缓冲里的数据完成一次捕获。它的用途是我想看看现在总线在干什么先随便抓一段看看。当你怀疑自己的触发条件根本没写对、导致永远不触发时先点一次立即触发能抓到波形就说明采样时钟和 probe 是通的问题一定出在触发条件上。这个动作是排查的第一步比盯着 Waiting for Trigger 发呆有用得多。2.2 停止触发器停掉的到底是什么停止触发器的行为要分两种情况看很多人混淆了。第一种状态是 Waiting for Trigger 的时候按停止。这时候 ILA 只是被解除武装回到 Idle缓冲里没有有效数据。这个操作是无损的你随时可以再点运行触发器重新武装。第二种状态是 Triggered / Full / Uploading 的时候按停止。这就是强行中断了。如果是正在上传数据中途停止会导致波形窗口里的数据不完整甚至出现一段莫名其妙的空白或者错位你会以为是信号出了问题其实是上传被打断了。所以一个很实在的经验波形正在往主机端传的时候别手贱去点停止触发器等状态回到 Idle 或者更新完波形再动。还有一个容易被混淆的命令是复位Reset。停止触发器只是中止当前这次采集而复位会把 ILA 内部的触发状态、计数器、多窗口计数全部清零等于把 ILA 恢复成刚配置完的状态。在 Auto Retrigger 打开、又反复触发很多次的情况下如果感觉自己设置的触发条件不生效了复位一次比重连 JTAG 快得多。2.3 按钮灰掉、点不动的时候怎么办运行触发器和停止触发器变成灰色是新手高频提问。常见原因就这几个硬件服务器没连上Hardware Manager 里看不到 target 或者 device按钮自然是灰的。ILA dashboard 没打开需要双击 hardware device 下面列出的 hw_ila把 dashboard 面板打开按钮才会激活。器件信息过期重新综合、重新生成比特流之后probe 的名字和位宽可能变了需要刷新器件Refresh Device否则 probe 列表和实际硬件对不上。ILA 处于 Busy 状态正在上传或者正在等待触发按钮会有短暂不可用等一下就好。这类问题基本都是连接层面的跟触发逻辑无关。判断方法很简单状态栏能不能显示 Idle / Waiting for Trigger 这一类状态字。只要状态字在动说明连接是好的按钮灰掉只是时序问题。3. 自动重新触发单次抓取和连续盯守的分水岭自动重新触发这个勾选框是 ILA 从手动拍照变成监控录像机的关键开关。它的字面意思是自动重新触发但真正要理解的是它改变了什么、没改变什么。3.1 自动重新触发的准确语义勾上自动重新触发之后ILA 完成一次捕获、数据上传完之后会自动回到 Waiting for Trigger 状态重新武装不需要你再点运行触发器。触发条件、触发位置、采样深度这些参数一个都没变唯一变的是捕获完成后要不要自动重新武装。不勾选的时候一次捕获完成后 ILA 停在 Idle你想再抓一次必须手动点运行触发器。抓一次看一次、改一次参数再抓一次的场景用不勾选更清爽因为波形不会在你还在分析的时候被刷掉。在 ILA IP 的配置界面里还有一个采集模式Capture Mode的选项通常有 Always 和 Basic 两档Basic 对应抓一次就停Always 对应持续采集、抓完自动重新武装。运行时面板上的自动重新触发勾选框就是对这个行为的开关。不同 Vivado 版本里这两个地方的命名和位置略有差异有的版本把它们合并成一个勾选框有的版本分成两处具体以你打开的那个 dashboard 为准但语义是同一个决定捕获结束后是停住还是继续等下一次。3.2 什么场景必须打开它三类场景打开自动重新触发基本是对的抓偶发故障。一个上电后跑十几分钟才出现一次的异常你不可能一直坐在屏幕前。打开自动重新触发让 ILA 自己蹲着触发一次就更新一次波形你干别的去回来看最新那一段就行。需要最近一次的证据。有些问题是系统卡死了卡死前最后一笔交易是什么。打开自动重新触发波形永远是最近一次触发的样子正好对上。配合脚本做批量抓取。用 Tcl 循环或者 wait_on_hw_ila 配合自动捕获写脚本连续抓几十次导出 CSV比手动点一百遍靠谱得多这部分第 6 节会给出可直接抄的代码。3.3 打开后最容易踩的三个坑第一个坑是波形被覆盖。自动重新触发意味着每触发一次上一次的数据就没了。如果你抓到一个很关键的现象第一反应应该是导出而不是继续盯着看。导出成 CSV 或者 VCD 之后再慢慢分析别指望它替你保存历史。第二个坑是上传带宽被打满看起来像卡死。JTAG 的传输速率是有限的一次几千采样点、几十位宽的数据传过来要几百毫秒甚至更久。如果你的触发条件很容易满足比如触发条件里全是无关位等价于每拍都成立ILA 会一直处在触发—上传—再触发的循环里波形窗口一直在刷新状态字一直在跳你会误以为设备挂了。这时候要么把触发条件收严要么先把自动重新触发关掉。第三个坑是多窗口模式下的数据错乱感。开了多个窗口Window之后自动重新触发会让窗口之间不断重新填充波形面板上的窗口切换会显得很乱。抓周期性信号的时候建议先关掉自动重新触发坐下来把一次捕获的多个窗口看完。4. 按了运行触发器却没有反应一条从时钟到触发条件的排查链路ila 抓信号没有反应这个问题在各类社区里被问烂了但答案其实集中得可怕。下面按我实际排查的顺序展开照着这个链路走一遍九成的情况能定位。4.1 第一步永远是看状态字和确认采样时钟在跑打开 ILA dashboard先看状态栏。几个常见状态的含义状态含义下一步Idle未武装或已完成捕获未重新武装点运行触发器Waiting for Trigger已武装采样中等条件成立检查触发条件Triggered / Full已触发缓冲填满准备上传等上传完成Uploading正在往主机端传数据别点停止如果状态一直停在 Waiting for Trigger说明采样在跑但触发条件从来没成立过问题在触发条件。如果状态连 Idle 都进不去、波形窗口的采样时钟那一栏显示异常那问题在采样时钟本身。采样时钟最容易出问题的地方有三个。其一是时钟源没起来比如你接的是 MMCM 输出的时钟而 MMCM 的 locked 信号还没拉高这时候时钟是停的ILA 内部逻辑一拍都不动界面会一直显示等待。其二是时钟被门控了设计里用 BUFGCE 或者类似的时钟使能逻辑在上电初期的某段时间把时钟关掉了那段窗口里 ILA 完全瞎掉。其三是复位期间时钟被停这跟第二条是同一类问题。验证方法非常土但非常有效把一个自由运行的计数器接到 probe 上触发条件设一个它必然会走到的值比如计数器等于某个数。如果这样都抓不到那百分之百是采样时钟的问题跟你的触发逻辑无关。4.2 触发条件为什么可能永远不成立确认时钟没问题之后逐条检查触发设置进制填错。触发值默认是十六进制你要是按十进制填了个 100实际是比较 0x100永远等不到。这个错误比重比你想象的高。无关位dont care设置不对。触发设置里每一位有三态0、1、X。设成 X 的位表示这一位不参与比较。如果你把所有位都设成 X那条件是恒成立的一武装就触发反过来如果你把本该是 X 的位设成了 0而信号实际是 1那条件永远不成立。检查方法是把触发条件里的具体位和波形上实际的值对一遍。值触发用在了脉冲信号上。值触发是信号等于这个值就成立如果信号大部分时间都停在这个值上你一武装它立刻就触发了。脉冲类信号应该用边沿触发上升沿/下降沿/双边沿。被观察的信号在捕获期间一直是常量。比如你挂了复位信号想看它什么时候释放结果复位在整个过程中都没释放那条件自然不成立。这种时候用边沿触发比用值触发靠谱。组合逻辑毛刺导致比较器抓到中间态。跨时钟域或者多路组合逻辑汇聚的信号接到 probe 上会有采样抖动。这类信号建议先在设计里同步打两拍再挂 probe。4.3 采样频率到底有没有上限vivado 中 ila 的采样频率是不是有范围限制这个问题的准确答案是软件里没有给你一个频率范围去选边界完全由时序决定。ILA 的采样时钟就是你的设计时钟它自己是一个真实的逻辑电路有建立时间和保持时间要求。probe 从设计里引出来走一段额外的布线进 ILA 内部还要过比较器逻辑这些都会让这条路径变长。所以你能用的最高采样频率本质上取决于这个时钟域在你的器件、你的布线下能不能收敛。给几个经验值参考100MHz 到 200MHz 在绝大多数器件和设计里都没问题300MHz 以上就要看器件速度等级和 probe 的数量probe 越多、位宽越大布线越难越容易违例500MHz 以上基本要靠流水线和精心的引脚规划了。有个很实用的配置项可以救急输入流水级数Input Pipe Stages。在 ILA IP 配置里把这个值从 0 调到 1 或 2ILA 会在 probe 输入侧插入寄存器把长路径切断时序明显改善。代价是采样数据会延迟一到两拍也就是你看到的波形整体往后平移做精确的时序对齐时要注意这个偏移量。我一般在高频调试时把流水级设成 1 或者 2中低频调试保持 0保证采样点和设计里的信号严格对齐。还有一个容易忽略的约束采样时钟和被观测信号必须是同步的。你挂上去的信号如果来自另一个时钟域而采样时钟比它慢那你会丢拍采样时钟比它快你会采到大量的重复值。跨时钟域的信号要么在设计里同步之后再挂 probe要么就接受观测结果里存在采样不确定性这个事实。4.4 probe 接错、被优化掉、位宽不匹配最后一类问题出在 probe 本身。综合器会把它认为没用的信号优化掉你明明在代码里写了一个中间变量综合后它消失了ILA 里挂不上或者挂上之后永远是 0。对付这种情况有两个办法在信号声明前加属性(* keep true *)或者给信号加MARK_DEBUG属性明确告诉工具这个信号要保留给我调试用。位宽不匹配也是高频问题。你挂了一个 8 位的 probe触发条件里填了一个 16 位的值工具会把高位截断或者补零结果就是条件永远凑不上。检查方法是看 probe 列表里显示的位宽和你在触发设置里填的值长度对齐。还有一个隐蔽的坑重新综合之后 probe 的名字或者层级变了。你之前配好的触发条件绑定在旧的 probe 路径上重新生成比特流下载之后条件还在但指向的信号变了或者不存在了。这种情况刷新器件之后重新配一遍触发条件就行别怀疑人生。5. 触发位置、采样深度与多窗口决定你看到的是前因还是后果这三个参数决定了波形窗口里那片数据的构图。理解它们你就能主动决定自己看到的是异常的成因还是异常的后果。5.1 触发位置这笔账到底怎么算触发位置Trigger Position的单位是采样点个数范围从 0 到采样深度。它的含义是最终的波形窗口里触发点前面保留多少个采样点。设成 0触发点在窗口最前面你看到的几乎全是触发之后的数据。适合我要看这个事件发生之后系统怎么反应。设成采样深度触发点在窗口最后面你看到的全是触发之前的数据。适合我要知道为什么会触发。设成中间值前后各一半。这是默认值也是最通用的。换成时间来看假设采样时钟 100MHz一个采样点就是 10ns。如果你希望看到触发前 5μs 的历史数据那触发位置就该设成 5μs ÷ 10ns 500 个采样点。实操里有个反直觉的地方很多人以为触发位置越大越好能看的历史越多。但触发位置增大意味着触发之后的可用空间变小异常发生之后系统恢复正常的那段过程你就看不全了。所以我一般按问题类型来定——排查为什么会这样触发位置往大调排查这样之后会怎样触发位置往小调。举个例子总线协议调试里抓一个错误响应。如果我想知道是哪个请求导致的错误触发位置就要设得大一些把错误响应之前的请求流全都包进来如果我想知道错误响应之后主设备是怎么处理的触发位置就要设小把响应之后的重试、超时、复位流程包进来。两个方向的波形很可能需要抓两次。5.2 采样深度和 BRAM 成本的换算表采样深度不是一个可以随便拉满的参数它直接吃 BRAM。下面这张表是我在几个中等规模器件上实测的粗算给你一个数量级的感觉采样深度100MHz 下的时间跨度64 位 probe 的 BRAM 粗估适用场景1024约 10.2μs约 2 个 36Kb BRAM看单笔交易的细节2048约 20.5μs约 4 个 36Kb BRAM通用调试4096约 41μs约 8 个 36Kb BRAM看一段完整的协议交互8192约 82μs约 16 个 36Kb BRAM长流程状态机、偶发问题16384约 164μs约 32 个 36Kb BRAM谨慎使用中小器件容易爆这张表最想传达的信息是想看更长时间正确做法是加深深度而不是去超频采样时钟。把采样时钟从 100MHz 提到 200MHz时间跨度反而缩了一半同时还带来时序收敛的风险得不偿失。只有在需要抓窄毛刺的时候提高采样时钟才是对的选择。5.3 多窗口模式和采集模式的搭配窗口数量Number of Windows是个很好用但经常被忽略的功能。设成 N 之后ILA 会为你保留 N 段独立的波形窗口每次触发填一段。它最典型的用法是抓周期性信号。比如一条总线上每 50μs 完成一笔交易你想看连续 4 笔交易的差异。把窗口数设成 4深度设成 2048那么 4 次触发各填一段你可以在波形面板上前后翻看这 4 段对比它们的时序差异。代价是 BRAM 消耗要乘以窗口数。4 个窗口、每个 2048 深、64 位 probeBRAM 占用就是前面表格里 2048 那一行的 4 倍。所以在中小器件上多窗口和深度这两个参数要一起权衡不能都想拉满。采集模式方面抓周期性信号的时候我通常会把自动重新触发关掉因为多窗口模式下自动重新武装会让窗口内容不断被覆盖前后对比根本做不了。等 4 个窗口全部填满、波形稳定下来之后再慢慢分析这样才靠谱。6. 用 Tcl 把重复抓取变成脚本比点按钮稳得多手动点按钮抓一次两次还行当你要抓二十次做统计、或者要抓一个半夜才会出现的偶发问题时脚本就是唯一的选择。Vivado 的硬件管理器所有操作都有对应的 Tcl 命令控制属性也基本都能通过set_property改。6.1 常用 CONTROL 属性速查下面这几个属性是最常用的可以在 Tcl Console 里直接敲属性作用常见取值CONTROL.DATA_DEPTH每个窗口的采样深度1024 / 2048 / 4096 / 8192CONTROL.TRIGGER_POSITION触发点前保留的采样点数0 到深度之间的整数CONTROL.NUMBER_OF_WINDOWS窗口数量1 / 2 / 4 / 8CONTROL.AUTO_RETRIGGER捕获完成后是否自动重新武装0 / 1CONTROL.CAPTURE_MODE采集模式ALWAYS / BASICTRIGGER_COMPARE_VALUE某个 probe 的触发比较值形如 eq1b1 的二进制表达式触发条件在 Tcl 里是用二进制模式字符串配的比如eq1b1表示等于 1eq8bxxxxxxxx表示这一位不关心。多位宽的时候X 的个数要和 probe 的位宽对上少一个多一个都会报错。这个字符串格式刚上手会觉得别扭写两次就习惯了。6.2 一段可以直接抄的自动抓取脚本下面这段是我平时用的模板逻辑是连接、刷新、配参数、设触发条件、循环抓 N 次并导出 CSV。# 连接硬件 open_hw_manager connect_hw_server -url localhost:3121 open_hw_target current_hw_device [lindex [get_hw_devices] 0] refresh_hw_device -update_hw_probes false [current_hw_device] # 拿到 ILA 句柄 set ila [get_hw_ilas -of_objects [current_hw_device] hw_ila_1] # 配置采集参数 set_property CONTROL.DATA_DEPTH 4096 $ila set_property CONTROL.NUMBER_OF_WINDOWS 1 $ila set_property CONTROL.TRIGGER_POSITION 3072 $ila set_property CONTROL.AUTO_RETRIGGER 0 $ila # 配置触发条件某个 probe 等于 1其余位不关心 set_property TRIGGER_COMPARE_VALUE eq1b1 \ [get_hw_probes trigger_flag -of_objects $ila]参数配好之后循环抓取的部分是这样for {set i 0} {$i 10} {incr i} { reset_hw_ila $ila run_hw_ila $ila # 最多等 60 秒超时说明这段时间内没触发 if {[wait_on_hw_ila -timeout 60 $ila] ! 1} { puts 第 $i 次等待超时跳过 stop_hw_ila $ila continue } upload_hw_ila_data $ila set csv cap_$i.csv write_hw_ila_data -csv_file $csv -force [current_hw_ila_data] puts 已导出 $csv } stop_hw_ila $ila这段脚本有几个实际写起来才会注意到的细节。wait_on_hw_ila的返回值要判断否则一次超时之后后面的逻辑会乱掉。reset_hw_ila放在循环开始处可以清掉上一轮的触发计数避免多窗口模式下窗口序号串掉。导出格式除了-csv_file还支持-vcd_fileVCD 可以直接喂给波形工具做离线分析数据量大但更通用。6.3 Advanced Trigger 能解决脚本解决不了的问题如果你的触发条件是A 事件发生之后 100 个周期内 B 事件发生或者同一个错误连续出现 3 次才触发基础触发器的单行条件就不够用了。这时候需要在 ILA IP 配置里使能高级触发Advanced Trigger它把触发设置变成一个状态机编辑器最多可以画十几个状态每个状态里放一组条件状态之间按条件跳转。高级触发里最有价值的是计数器。抓偶发问题的时候可以把触发条件设成错误标志连续拉高 3 次就能过滤掉单次的抖动噪声只抓真正的连续异常。这在协议调试里非常实用因为很多时候单次错误是正常的重传连续多次才是真故障。配置高级触发之后前面那段 Tcl 脚本里用 TRIGGER_COMPARE_VALUE 设条件的做法就要改改成通过状态机的表项来配置。这部分改起来相对麻烦我的建议是触发条件的逻辑在图形界面里配好、验证过再考虑脚本化不要一上来就手写状态机配置。7. 几个真实场景下的参数取舍光讲参数有点干结合几个实际调试场景说一下我会怎么配。7.1 抓偶发故障自动重新触发加长深度场景是系统跑几分钟才出一次异常异常信号是个单拍的脉冲。我的配置是采样深度 8192尽量长触发位置设在接近末端比如 7000 左右把大量前因包进来触发条件用边沿触发而不是值触发然后打开自动重新触发人就离开去干别的。这里有个细节用边沿触发而不是值触发。因为异常信号是脉冲值触发会在脉冲维持的每一拍都成立容易造成触发位置漂移边沿触发只在跳变那一拍成立触发点非常干净。回来之后先看波形窗口确认抓到了再导出。如果抓了很多次波形一直在被覆盖也没关系因为你要的是有没有出现过只要有波形就说明问题复现了立刻导出留存。7.2 抓周期性总线多窗口加班后触发场景是一条总线每几十微秒走一笔交易你想看连续几笔之间的差异。我的配置是窗口数设成 4深度设成 2048触发位置设得很小比如 128因为我要看的是交易开始之后的数据。自动重新触发关掉让 4 个窗口稳定填满。触发条件用一个交易的起始标志配合边沿触发。填满之后在波形面板上切换窗口对比 4 笔交易的时间参数很容易看出某一笔的延迟异常。这种对比用单窗口做不了必须多窗口。7.3 抓上电或复位后的一次性事件这类场景的特点是事件只发生一次抓不到就得重新上电。操作顺序很重要先点运行触发器让 ILA 进入 Waiting for Trigger然后再释放复位或者触发上电流程。触发位置要设得很小甚至设成 0因为你关心的是事件发生之后的行为。自动重新触发必须关掉采集模式用单次。这里还有个隐蔽的坑如果复位信号同时被接到了 ILA 的采样时钟来源上比如复位期间时钟被门控那 ILA 在复位期间是不工作的复位释放之后才开始采样你会丢掉最早的那几拍。遇到这种情况要给 ILA 单独提供一个自由运行的时钟而不是复用会被复位影响的时钟。最后分享一个小习惯每次开始一轮新的调试之前我都会先把 ILA 参数和触发条件用 Tcl 写进一个脚本文件不管是图形界面点的还是脚本设的都在文件里留一份记录。FPGA 调试最怕的就是上次明明抓到了这次一样的配置就是抓不到有了脚本文件至少能排除掉参数不一致这个变量。