2026年了,FPGA工程师用Vivado跑仿真,仿真波形和实际板卡现象对不上,通常是什么原因?排查步骤有哪些?

开放8 回答 61 浏览

最近在调一个UART收发模块,ModelSim仿真波形完全正确,但下载到板子上就是收不到数据。用ILA抓信号发现rx引脚电平有变化,但内部逻辑就是没反应。怀疑是约束没写对或者跨时钟域问题,但仿真里明明都是好的。想问问大家,仿真和实测不一致一般从哪些方向排查?是先查管脚约束还是先查时钟?有没有系统的排查思路?

分享:

8 个回答

  • 嵌入式入门生

    先别急着怀疑跨时钟域,你这个描述里有个很典型的信号:ILA能看到 rx 引脚电平在动,但内部逻辑没反应。这一下就把范围缩到管脚到逻辑之间的链路上了。第一步查 XDC 里有没有给 rx 做管脚约束,特别是电平标准,常见坑是板子上的 LVCMOS33 但你约束成 LVCMOS25,或者干脆没约束让 Vivado 自己猜,猜错电平内部接收器可能根本不翻转。第二步看有没有加输入延迟约束,尤其当你的 UART 是外部晶振分频出来的,时钟相位和 rx 数据到达时间没对齐,仿真里时钟是理想的,板上时钟有抖动和偏斜,采样沿正好落在数据跳变上就会丢。我建议排查顺序是:先 ILA 看 rx 信号进没进 FPGA 的输入缓冲,再查 IBUF 输出有没有波形,最后看采样时钟沿对不对。如果你 ILA 抓的是引脚级信号,那大概率是约束问题,如果抓的是内部信号,那再看串口配置和时钟域。还有个隐藏坑,复位信号在仿真里默认高有效,板上可能低有效,或者复位释放时间和时钟没对齐,导致状态机卡在初始态。你先在 ILA 里把复位信号也拉出来看看,很多时候不是逻辑错,是复位根本没释放。追问一下:你 ILA 抓的是 rx 引脚还是 IBUF 之后的信号?这个决定了下一步往哪查。

  • 嵌入式系统初学者

    你这问题我太熟了,当年调 SPI 也栽过一模一样的跟头。核心认知要扭转过来:仿真验证的是逻辑功能,板卡验证的是物理实现,两者之间隔着一层真实世界的非理想性。你 ModelSim 里波形全对,只能说明你的 RTL 在理想时钟、理想电平、零延迟下逻辑正确,但从来没验证过约束是否完整、IO 是否匹配、时钟是否干净。UART 这种低速协议最容易出问题的地方恰恰不是逻辑,而是管脚和时序约束。我建议的排查主线是:先确认约束文件完整性。打开综合后的 report_timing 和 report_io,看 rx 信号有没有被正确分配到物理引脚,有没有报出 unconstrained 警告。很多工程图省事只写了管脚位置不写电平标准,Vivado 会默认按 bank 电压来,但板子上的上拉或端接电阻可能让实际电平和默认不一致,结果就是外部信号来了但内部采样不到。下一步是时钟。你的 UART 是独立晶振还是系统时钟分频?如果是从 100MHz 系统时钟分频出 115200 波特率,那么分频后的时钟和 rx 数据沿的关系在布局布线后可能和仿真差很多,因为时钟路径延迟和数据路径延迟不同,导致采样点偏移。这时需要加 set_input_delay 约束来告诉工具数据相对时钟的到达窗口,否则工具会按最坏情况优化,实际采样可能正好打在数据变化上。另外跨时钟域确实要查,但 UART 一般只有一个时钟域,除非你用了两个时钟。最后建议用 ILA 触发一个简单的条件,比如 rx 下降沿,然后看从 IBUF 输出到内部寄存器的每一级信号,逐级比对。你会发现仿真和实测的差异往往不是逻辑分支错误,而是某个信号在板上被毛刺打穿或者时序余量不足。系统化做法是:先查约束合法性,再查时钟关系,最后查复位。如果前两步都没问题,那就用 ILA 增加采样深度,对比数据帧的起始位位置,你会发现采样沿偏了半个位宽,那就要调整输入延迟约束或者改采样时钟相位。

  • Verilog小白2024

    仿真对板卡错,八成是约束没写全或者电平不匹配。先查 XDC 里 rx 的电平标准和管脚位置,再看输入延迟约束,ILA 能看到引脚有变化但内部没反应,基本就是输入缓冲或采样沿的问题。复位和跨时钟域一般不是首因,你先把 ILA 改成抓 IBUF 输出,一眼就能定位。

  • FPGA探索者

    仿真和板卡对不上,九成问题出在约束而不是逻辑。你ModelSim里波形全对,只能说明RTL在理想时钟、零延迟下功能正确,但物理世界有电平、有抖动、有延迟,这些仿真里根本不体现。你ILA能看到rx引脚电平在动,但内部逻辑没反应,这个现象其实很关键:信号已经进到FPGA内部了,说明管脚位置约束大概率没错,问题集中在电平标准和采样沿上。先别碰跨时钟域,UART这种低速协议,复位和CDC一般不会是首因。第一步查XDC里rx的电平标准,常见坑是板子上是LVCMOS33但你写成LVCMOS25,或者干脆没写让Vivado按bank默认走,板子上有端接电阻时实际电平可能和默认不一致,接收器不翻转,ILA看到引脚有电平但IBUF输出可能一直无效。第二步加输入延迟约束,尤其当你的UART时钟是从外部晶振分频来的,数据到达时间和采样时钟沿没对齐,仿真里时钟理想所以永远采在中间,板上时钟有相位偏斜,采样沿正好落在数据跳变沿上就丢。排查顺序建议:先用ILA抓IBUF输出,对比rx引脚级信号,如果引脚有变化但IBUF输出没有,那就是电平标准问题;如果IBUF输出有变化但后续逻辑没反应,那就是采样沿问题,去调输入延迟或改用时钟下降沿采样试试。另外提一句,复位信号也要查,UART模块的复位在仿真里往往是异步复位同步释放,但板上复位芯片上电时序和仿真激励不一样,如果复位释放太晚,模块可能一直处于复位状态,你ILA只看了rx没看复位,容易漏。总之先查约束,再查采样沿,最后才是CDC,这个顺序能覆盖大部分情况。你现在的ILA抓的是引脚级还是IBUF输出?这个信息很关键。

  • Verilog练习生

    先把仿真里的时钟沿和真实板卡的采样时刻对齐想清楚。UART收数据,仿真里你用的是理想时钟,数据变化沿和采样沿永远差半个周期,所以怎么采都对。但板上时钟有抖动,rx数据到达时间受走线和外部器件影响,如果输入延迟没约束,Vivado综合时可能把采样寄存器布局到离引脚很远的地方,布线延迟一大,采样沿就偏离了。你ILA看到引脚有电平变化但内部没反应,大概率是采样沿采到了跳变沿上。解决办法很简单:在XDC里给rx加set_input_delay,范围取数据位宽的一半左右,然后重新跑综合,看时序报告里setup和hold有没有违例。如果违例,就调整延迟值或改采样沿。先别管CDC。

  • 程序员01

    查一下rx的电平标准,别让Vivado猜。ILA能看到引脚动说明管脚位置没问题,大概率是bank电压或端接电阻导致内部接收器没翻转。加个set_input_delay再试试,不行就换下降沿采样,UART这种低速协议采样沿偏一点也丢数据。

  • HDL小白

    仿真对板卡错,我以前调SPI也遇到一模一样的情况。说实话,你这个问题里最可疑的不是跨时钟域,而是约束没写全。UART这种低速协议,逻辑上几乎不可能出错,仿真都过了,说明RTL没问题。重点看两点:一是rx的电平标准,二是输入延迟。你ILA能抓到引脚变化,说明管脚位置是对的,那问题就出在电平标准或者采样沿上。建议先加输入延迟约束,把rx的data_arrival_time设成波特率周期的一半,再跑综合看时序报告。如果还不行,就检查板子上rx有没有上拉或下拉电阻,有时候外部电阻会把电平拉偏,导致IBUF不翻转。另外,你ModelSim里复位是怎么给的?如果仿真里复位是高有效,板上却是低有效,整个模块可能一直在复位状态,但ILA只看了rx没看复位,容易漏掉。我建议你把ILA改成抓内部复位信号和IBUF输出,一次性对比,比单抓引脚高效得多。

  • Data新手

    一句话:先查电平标准,再查输入延迟,最后才轮到跨时钟域。你ILA看到引脚有变化但内部没反应,基本就是IBUF没翻转,查XDC的LVCMOS电平,别让Vivado自己猜。

登录后可在本页底部提交回答

提问者

芯片学徒查看主页
浏览「其他」

描述场景与已尝试方案,更容易获得有效解答

相关问题

同分类

提问建议

  • 标题写清核心疑问,避免「求助」「请问」等空泛用语
  • 正文补充环境、版本、报错信息或截图
  • 先搜索本站是否已有相近问题,减少重复提问
  • 若与课程相关,请标明课时或章节便于讲师定位