ARTICLE DETAIL

资讯详情

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

Vivado Schematic实战:从RTL分析到布局布线的FPGA调试技巧

Vivado Schematic实战:从RTL分析到布局布线的FPGA调试技巧 做FPGA调试这些年我养成了一个习惯遇到问题先不急着改代码而是先在Vivado里打开Schematic把当前的逻辑连接看一遍。仿真波形能告诉我“现象是什么”而Schematic能告诉我“逻辑为什么会是这样”。尤其是用Vivado 2019.1做工程的时候从RTL分析到布局布线每个阶段其实都有一份对应的Schematic视图但很多朋友只把它当成看连线的小工具甚至只是截图发群里问问题。其实这张图用好了是定位设计问题的利器比盲改代码再仿真验证高效太多。这篇东西我分成几个部分来聊先理清Vivado里的Schematic到底有几种、分别该什么时候看再讲2019.1版本里的具体打开方式和界面上的一些坑然后结合RTL综合、布局布线两个阶段说说我是怎么用它一步步排查问题的最后整理一份常见问题速查表。内容偏实战新手能跟着操作老手也可以对照看看有没有漏掉的习惯。1. 先搞清楚一件事Vivado里的Schematic其实有“三张图”很多人打开Vivado之后点到一个Schematic窗口就以为所有阶段的Schematic长得都一样。这是个很大的误区。Vivado的Schematic视图不是一个静态的东西它会随着设计的进展分阶段呈现不同内容。我在带新人的时候常说一句话“你在RTL阶段看到的是逻辑图在综合后看到的是元器件图在布局布线后看到的是带物理信息的工程图。”这三张图各自解决不同问题搞混了反而容易把自己绕晕。1.1 RTL Schematic代码还没变成电路之前的“蓝图”RTL Schematic是在Elaborated Design阶段看到的设计结构。这个阶段Vivado把Verilog/VHDL代码翻译成由加法器、比较器、多路选择器、寄存器和模块端口组成的逻辑结构视图但还没映射到FPGA内部的LUT和FF资源。这一层视图最适合做什么检查RTL逻辑本身有没有低级错误。比如某个使能信号是不是真的接到了该接的寄存器上总线位宽是否和预期一致模块例化的时候端口映射是否对应正确。因为这里还不涉及底层硬件原语图上看到的内容和你的代码逻辑基本是“一一对应”的定位问题非常直观。我见过不少同学在仿真波形里看到某个信号不对回代码里倒查半天查不出来其实打开RTL Schematic顺着信号线一追马上就能发现是模块例化时两个信号接反了。这种问题在波形里不好看但在图纸上一目了然。1.2 Synthesized Schematic真正映射到硬件原语的视图综合完成、打开Synthesized Design之后再看Schematic画风就变了。原来那些加法器、比较器会被映射成LUT6、FDRE、CARRY47系列或CARRY8UltraScale、BUFG、IBUF、OBUF一类的底层原语。这一层视图的价值在于检查综合结果是否符合预期。举个例子你在RTL里写了一个if (a b) c 1b1;的综合结果是用了两个LUT输入还是一个LUT某个寄存器为什么被优化掉了某个信号为什么综合后变成了常量0这些问题在Synth Schematic里都能找到答案。我在工程中通常用这一层视图来做“综合结果体检”重点看三点一是逻辑层级数量是不是异常高二是是否有意料之外的常量驱动三是是否存在不必要的信号被keep保留导致资源浪费。看过之后再去做时序收敛心里会有底得多。1.3 Implementation Schematic布局布线后的最终形态布局布线完成之后在Implemented Design视图里打开的Schematic是含有物理信息的最终版本。这个阶段每个LUT、FF都有了实际的SLICE位置走线也有了大致的物理分布概念。这层视图最大的用途是配合时序报告使用。比如时序报告中提示某条路径不满足约束你可以在Schematic里把这条路径高亮出来看它经过了哪些逻辑单元、跨越了多远的物理距离、中间是否存在不合理的LUT串联。很多时候光看报告数字不知道问题出在哪但一在图纸上看到路径绕了一个大弯或者某个LUT扇出大到夸张问题原因基本就浮出水面了。理解这三种Schematic的区别后续所有操作才有意义。下面我以2019.1为例把各个阶段打开Schematic的具体路径和操作技巧逐步说清楚。2. 2019.1版里打开Schematic的几种实际姿势Vivado 2019.1的整体界面和现在很多版本差别不算大但菜单相对旧一些有些入口在新版本里改了位置所以用老版本的朋友还是得按老版本的逻辑来。这里我把三个阶段打开Schematic的完整路径都列出来照着操作就行。2.1 RTL分析阶段的打开方式这一步的前提是工程已经完成综合之前的“综合设置”步骤但还没跑综合。在Vivado 2019.1的左侧Flow Navigator中找到RTL Analysis这一栏展开后点击Open Elaborated Design。Vivado会先做一遍elaboration也就是把RTL翻译成初始的逻辑结构。等设计打开之后点击顶部菜单栏的View → Schematic或者直接点工具栏上那个像与非门符号的图标。这里有个小提示elaboration过程如果报错Schematic是打不开的。也就是说RTL阶段能打开Schematic本身就说明语法和模块例化层级基本通过了。如果你的设计里有多个顶层模块可以在Sources窗口里选中某个模块鼠标右键选择“View Schematic”这样可以直接看到该模块内部的RTL视图而不必从顶层往下翻好几层。这个技巧在模块化设计里特别实用。打开之后我通常先把工具栏上的“Fit to Screen”点一下让整张图缩放到合适大小然后用鼠标滚轮缩放用右键拖动平移画面。如果觉得密密麻麻看不清可以把不需要的模块折叠起来鼠标选中对应模块右键选“Collapse Module”或者类似功能图上会折叠成一个方框需要时再展开。2.2 综合完成之后的Schematic如果你的工程已经综合过了那么在Flow Navigator里点开Synthesis下的Run Synthesis等综合跑完选择Open Synthesized Design。设计打开后同样走View → Schematic菜单就能看到综合后的Schematic。在这个阶段看Schematic往往能看到RTL阶段看不到的东西最典型的就是IBUF/OBUF、BUFG这些IO和时钟缓冲器。如果设计里用了IP核你会发现IP核变成了一个黑盒模块里面不再展开详细逻辑。这个阶段我建议大家多关注Properties面板——选中任意一个LUT或FDREProperties面板里会列出它的具体类型、位宽、引脚连接等信息。比如选中一个LUT6能看到它的初始值INIT这个值直接反映LUT实现了什么逻辑功能。2.3 布局布线完成之后的Schematic布局布线完成后打开Implemented Design再通过View → Schematic进入视图。这个阶段看到的内容最接近芯片内部的物理实现。需要注意的一点是这里Schematic窗口呈现的依然是逻辑连接而不是真正的芯片内部走线路径但它已经包含了单元在SLICE上的大致位置信息。如果要配合查看物理走线可以切换到Device视图用“Floorplanning”或者“Implementation”布局模式查看。Schematic和Device视图之间可以联动在Schematic里选中一个LUT或FF右键选择“Select in Device”就能在Device视图中高亮同一单元这对判断布局是否合理非常有帮助。比如某个路径时序不满足在Device视图中一看发现两个逻辑单元相隔特别远就知道需要加约束或调整布局策略。2.4 管好你的Schematic窗口几个让效率翻倍的操作习惯Schematic窗口默认打开后可能布局混乱尤其是顶层例化很多模块的时候一堆方框连在一起新手上手容易懵。我用2019.1这几年整理了一套自己的操作习惯能让看图效率翻倍。先说缩放平移。鼠标滚轮是缩放按住滚轮或者右键拖动是平移双击对象可以跳转到该对象并打开相关属性面板。如果你只想盯着某一段逻辑看可以用鼠标左键框选一块区域然后点工具栏的放大图标放大到选区。想要回到全局就再点一次Fit to Screen。这一套操作练熟了在图纸里跳转速度非常快。再说保存。想把Schematic分享给同事或者截图记录问题不要用系统截图工具直接截那样分辨率不够细节看不清。正确做法是File → Export → Export Schematic Image可以设置保存路径和分辨率导出的图片清晰很多发到群里别人一眼就能看清信号名和器件型号。还有一个隐藏技巧在Schematic窗口里直接按CtrlF可以弹出对象查找框输入网络名或单元名比如某个顶层端口名或者某个寄存器的实例名它会自动定位并高亮。这个功能在工程规模大了以后非常有用不然在图上肉眼找一根信号线能找半天。3. 用Schematic快速定位RTL层设计问题一套屡试不爽的实战方法我自己做过一段时间复杂IP验证总结下来RTL阶段的Schematic在定位逻辑连接问题方面特别能打。很多在波形里看起来千奇百怪的bug本质上都是连接错了、位宽错了或者信号被优化掉了。下面这几个方法是我日常使用频率最高的几乎每次都有效。3.1 从输出端口倒着追信号是最常用的定位思路打个比方你写的模块像一个复杂的管道系统Schematic就是把每一根管道画出来的图纸。当某个输出端口的信号不对时从该端口出发沿着连接线反向追踪比从输入端顺着代码逻辑分析要快得多。操作上很简单在打开RTL Schematic后找到顶层输出端口对应的线点击选中它然后顺着连线往前一级一级看。如果中间经过了多路选择器或组合逻辑可以双击对应的MUX或逻辑门查看它的数据输入和控制输入分别来自哪里。很多时候只要追到某一级看到控制端接的是一个constant信号问题就暴露了。我举个例子。之前做一个控制模块仿真阶段明明看到输出信号有正确翻转但上板之后怎么测都是固定电平。后来打开RTL Schematic顺着输出往回追发现输出端前面那级MUX的sel信号被连到了一个始终为0的寄存器输出上。回代码一看例化时端口映射少写了一位导致选择信号接到了常数。这种问题如果光看代码确实很容易忽略但图纸上非常显眼。3.2 信号“不见了”怎么办常量优化和综合剪刀手在RTL Schematic阶段你还能看到所有RTL中定义的信号但如果跑到综合后的Schematic里发现某个信号消失了就说明它在综合阶段被优化掉了。这种情况非常常见尤其是你写的逻辑里某个中间信号只被用了一次且结果是一个常量综合工具就会很自然地把它合并掉。遇到这类情况不要慌先用Schematic来确认到底发生了什么。在综合后的Schematic中找到相关逻辑的LUT或触发器看看它的输入引脚来自于常量0还是常量1。如果是说明你的逻辑确实被化简成了常量。这时候就要问自己这个常量是否符合设计预期如果符合那没问题如果不符合说明逻辑写错了需要改代码。如果你希望某个信号即使在综合后也保留下来方便调试可以在RTL里给信号加上综合属性比如(* KEEP TRUE *)或者用(* MARK_DEBUG TRUE *)把它标记为调试信号。加完属性之后重新综合再打开Schematic就能看到这个信号的存在了。顺便说一句用MARK_DEBUG标记的信号就算没有重新布局布线也能在硬件管理器里被ILA抓到调试价值很高。3.3 总线位宽不匹配和连接错位这类图里最容易抓总线位宽不匹配是初学Verilog最常踩的坑之一。[7:0]连到[3:0]或者两个总线之间接反了高低位仿真波形可能只看得出数据异常不一定能立刻定位到哪里出了问题。但在RTL Schematic里总线用粗线条表示每条信号线上会标注位宽信息。鼠标悬停在线条上Properties面板里会直接显示信号的完整定义比如data_out[7:0]。如果发现一根总线后面接着一个位宽不匹配的模块图上通常能直接看到多余的位悬空或者被截断。这个时候右键点击这根线选择Filter → Selected Net可以只显示和它相连的逻辑把碍眼的无关模块都隐藏起来视野瞬间干净很多。我还遇到过一种低级错误两个等宽的总线因为上下顺序写反导致高四位和低四位交叉接错。这种问题在波形上表现为“隔一段时间数据错一次”不太好定位。但在Schematic里每个端口旁边都标了位号顺着位号一对立刻就能发现[7:4]接到了对方的[3:0]上。所以我的习惯是凡是涉及总线的模块连接综合之前一定要打开RTL Schematic核对一遍端口位序这个小动作能省下后面大量的仿真调试时间。4. 综合后与布局布线阶段用Schematic查深层次问题的思路RTL阶段的Schematic帮你找的是“代码连接”的问题而综合后和布局布线后的Schematic帮你解决的是“电路实现”的问题。这两个阶段的问题往往更隐蔽但处理好了效果也最直观。4.1 从LUT和FF的映射看综合结果是否“长对”了综合后的Schematic里所有组合逻辑都已经映射成LUT。点开任何一个LUTProperties里能看到它是LUT1、LUT2还是LUT6。如果你的设计里大量使用了LUT2、LUT3这种只用了少量输入的LUT说明逻辑利用率不高反过来如果某一段逻辑级联了特别多层LUT查找表深度过深说明这一段的组合逻辑延时可能很大容易成为时序瓶颈。具体怎么判断“长对了”拿一个2选1多路选择器说RTL里写assign y s ? a : b;综合后Schematic里应该看到一个LUT3三个输入分别是a、b、s或者直接用专用MUX实现。如果看到的是LUT6甚至更多再追一下其他输入连接的是什么很可能会有意外发现——比如一个你根本没打算用的信号也被综合进去了。另外综合后的Schematic会保留寄存器的同步复位和时钟使能端口。如果看到某个FDRE的复位端口连着一个常量1那等于这个触发器一直处于复位状态输出永远是复位值。这种错误在波形里表现为“某信号一直不变”真因却是复位逻辑写反了。在Schematic里一眼就能看到复位引脚上的红色/高亮标记。4.2 用Schematic配合时序报告高亮关键路径布局布线之后如果时序报告里出现setup timing violation很多人第一反应是去看路径报告里的逻辑深度和数据延时但光看文本很难对问题有直观感受。我的习惯是同步打开Implementation Schematic然后在时序报告里选中那条违规路径右键选择“Highlight Path”或者类似选项不同版本菜单名称略有不同2019.1中一般是通过右键或者路径窗口里的跳转功能Schematic里就会高亮显示出这条路径经过的所有逻辑单元。高亮之后重点看两件事第一路径经过的LUT层数多不多。如果一条路径上串了七八个LUT即使扇出不大延时也会很高这时候优化RTL的层级结构是重点。第二看高亮路径经过的逻辑单元在Device视图中的物理位置。如果起点和终点相距很远绕了一圈又回来大概率是布局不合理可以考虑加Pblock约束或者调整相关逻辑的位置让布局更紧凑。对了时序报告里还有一个数值值得关注就是路径的“Slack”。如果Slack是负的直接在Schematic高亮路径能直观看到是哪一段逻辑吃掉了大部分时间。很多新手朋友看到负的Slack就急着改代码其实先打开Schematic和Device视图看一眼物理布局往往能省下很多无谓的折腾。4.3 提前发现扇出过大和布局布线拥塞问题扇出fanout是布局布线阶段一个非常关键的指标。某一根信号线如果扇出特别大比如一个寄存器的输出接到了几百个FF的时钟使能端口它的驱动能力就会成为瓶颈导致信号翻转时间变长进而影响时序。在综合后的Schematic里选中一个网络Properties面板里会显示对应的扇出数量。超过一定阈值比如几百就要留意了。更极端的情况是布局布线后的拥塞。当时序报告里出现局部congestion相关警告我会在Device视图里打开“Implementation”布局查看是否有某个区域特别密集的红块。然后在Schematic里找到对应区域的逻辑看看是什么原因导致逻辑挤成一团。常见原因包括某个模块的寄存器被过多地复用到其他模块、MUX逻辑过于集中、或者某个IP核占用了大量资源。定位到根因后通常可以通过综合选项、布局选项或代码重构来分散逻辑。5. 高频问题速查表与排障心得平时做技术支持的时候经常被问到一些Schematic相关的问题。我把出现频率最高的几个整理成了一张速查表配合对应的检查方法方便大家遇到类似问题直接对照着查。问题现象可能原因Schematic检查点解决思路信号在综合后被优化掉信号为常量或被冗余化简综合后Schematic中找不到该信号相关LUT输入接常量加KEEP或MARK_DEBUG属性确认是否为预期优化输出一直为固定值复位逻辑错误或输出连接常量追踪输出端口前级逻辑查看复位引脚连接检查复位极性、复位宏逻辑总线数据串位端口位序映射接反总线连线上悬停查看位号映射核对例化端口的位宽顺序组合逻辑延时过大LUT级联过深时序报告中高亮路径观察Schematic中LUT个数拆分组合逻辑、插入流水寄存器信号扇出过大单信号驱动负载过多选中网络查看Properties中扇出数量复制信号、使用全局缓冲或重新设计寄存器扇出布局布线拥塞局部逻辑过于密集Device视图观察拥塞区域Schematic定位逻辑来源分散逻辑、约束Pblock、调整综合选项表格里列的这几种情况几乎涵盖了我在实际工程中遇到的大部分Schematic相关排查场景。再补充几个独家的小心得第一不管哪个阶段打开Schematic之后先看一眼窗口左下角或者工具栏上标注的“Elaborated”、“Synthesized”还是“Implemented”。人最容易犯的错误就是在综合后的视图里找RTL阶段的信号或者反过来。认清楚视图类型再开始排查不要凭感觉猜。第二排查问题时如果一时看不出端倪可以把图纸上的显示选项调一下。工具栏里通常有一个颜色/高亮设置可以把高亮路径、选中对象、不同颜色的PAD和逻辑分开显示图形的可读性会好很多。观察整张图重点看有没有颜色明显不同于周围的对象那些通常就是异常节点。第三综合之后的Schematic和布局布线之后的Schematic两者并不总是一致的。如果布局布线之后Schematic中新增了某些缓冲器比如BUFG、BUFH那是工具为了优化时钟和关键信号自动插入的属于正常现象不用过度解读。写在最后我个人的习惯是一个FPGA工程做到后面打开Schematic看图的时间几乎和写代码的时间一样多。不是因为代码不熟而是因为图能让我快速进入“电路思维”而不是一直停留在“代码思维”。代码是线性的文字电路是并行的结构这两种思维模式之间Schematic就是那座桥。如果你用的是Vivado 2019.1看完这篇文章建议立刻打开一个旧工程分别在这三个阶段打开Schematic对着实际的图和我说的方法过一遍。不用刻意背操作步骤多用几次自然就熟。顺便说一句很多朋友为了看最新功能去追新版本Vivado但2019.1这个版本在Schematic视图方面其实已经足够成熟把它的功能吃透日常调试完全够用。
返回列表