ARTICLE DETAIL

资讯详情

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

Vivado IP Integrator中Generate Output Products与HDL Wrapper的顺序及避坑指南

Vivado IP Integrator中Generate Output Products与HDL Wrapper的顺序及避坑指南 第一次用Vivado的IP Integrator流程时我在Design Sources窗口里对着右键菜单发呆了好一阵。Block Design画完了连线也检查过了Validate Design顺利通过然后问题卡在了一个特别基础的地方右键列表里躺着Create HDL Wrapper和Generate Output Products到底先点哪个我当时随手先点了Generate Output Products又回来Create HDL Wrapper结果后面综合时还是遇到一堆莫名其妙的报错。后来翻了UG994、UG896这些手册又自己在工程里反复试了几次才把这两个命令背后的逻辑彻底理顺。这篇就专门把它们掰开揉碎讲清楚顺便把新手最容易踩的坑一次性排掉。1. 先别急着点搞清楚这两个命令到底在扮演什么角色很多人把这两个命令当成“二选一”的流程实际完全不是。它们一个管的是Block Design的内部资源一个管的是Block Design的外壳封装职责不同、生成的文件不同甚至触发的底层逻辑都不一样。1.1 字面含义和底层操作Generate Output Products字面意思是“生成输出产物”。在Vivado里你往Block Design里拖进来的每一个IP核本身只是一个配置文件.xci描述了这个IP的参数、端口和功能。但这个IP要能被综合、仿真光有配置文件是不够的它还需要一份网表比如综合后的.dcp、仿真模型、约束文件、示例设计等这些东西统称为Output Products。对Block Design执行Generate Output Products时Vivado会遍历BD里的所有IP把每个IP缺的产物一次性补齐。在Tcl Console里这个操作对应的核心命令是generate_target all [get_files design_1.bd]Create HDL Wrapper字面意思是“创建HDL包装文件”。它做的事情是把整个Block Design当成一个黑盒生成一份HDL文件这个文件里例化了一个design_1的模块并把BD的对内对外端口全部引出来。这个包装文件是后续综合、实现时的顶层入口。换句话说没有这份wrapper综合工具根本不知道这个Block Design该如何纳入整个工程。对应Tcl命令是create_hdl_wrapper -files [get_files design_1.bd]1.2 为什么它们总是挨在一起如果你打开Vivado的Flow Navigator或者直接在BD文件上右键会发现这两个命令都被归类在“IP Integrator”相关的菜单组下面。原因很简单一个Block Design从“画完图”到“能跑综合”必须同时满足两个条件——它内部的IP要有完整的产物它整个BD要有一个可综合的顶层封装。这两个条件正好对应上面两个命令所以Vivado把它们放在同一个层级不是为了让你二选一而是告诉你“这俩都别漏”。我见过不少新手在这里的理解是“Generate Output Products”是给IP用的“Create HDL Wrapper”是给BD用的所以如果BD里全是自己写的RTL就不用管第一个了。这个理解也有偏差——BD不管里面挂了多少个自己写的模块只要它作为一个整体要参与综合仿真output products仍然是需要生成的只是这个时候它生成的主要是仿真模型和例化模板相关的内容而不光是IP核的网表。2. Create HDL Wrapper 到底包了层什么先来重点看Create HDL Wrapper因为很多人的第一个坑就出在这里弹出来的对话框上。2.1 对话框里两个选项怎么选执行Create HDL Wrapper时Vivado会弹出对话框提供两个选项选项含义适用场景Let Vivado manage wrapper and auto-updateVivado自动管理wrapperBlock Design有修改时wrapper自动同步更新绝大多数场景强烈推荐Copy as standalone file生成一份独立的wrapper副本后续BD变化不会同步到这个文件你想手动改顶层逻辑、在wrapper里加自定义信号时的备选新手在这里最容易犯的错误就是选第二个“独立文件”模式然后后面BD里调整了一个端口wrapper输出还是老版本综合时端口不匹配直接报错想半天不知道问题出在哪。我个人建议是除非你明确知道自己在干什么否则一律选第一个。自动管理的wrapper在BD改动后Sources窗口里会刷新状态Vivado会自动更新这个文件你基本不用管它。如果确实需要在顶层做点文章更好的方式不是去改自动wrapper而是再往上包一层顶层文件把自动wrapper例化进去把自定义逻辑写在自己的顶层里。2.2 wrapper里面到底长什么样生成出来的design_1_wrapper.v大概是这个样子module design_1_wrapper (clk_0, reset_0, led_tri_o); input clk_0; input reset_0; output [7:0] led_tri_o; design_1 design_1_i (.clk_0(clk_0), .led_tri_o(led_tri_o), .reset_0(reset_0)); endmodule看到没有它做的事情极其简单把BD的端口例化出来而已。这个文件没有业务逻辑没有IP核细节它的存在是因为Vivado综合时需要一个确定的顶层而Block Design本身不是一个能被直接综合的RTL文件。你可以把BD想象成一块已经焊好元件的电路板wrapper就是把这块板子的对外排针定义出来方便你把它插到更大的系统里。2.3 生成之后还要做什么Create HDL Wrapper之后Design Sources里会多出一个design_1_wrapper.v文件同时Vivado通常会自动把它识别为顶层Top Module。但这不是绝对的尤其是工程里还有其他HDL文件时偶尔需要手动右键这个wrapper文件选择“Set as Top”来确认。这一步很多人会漏漏掉之后综合时经常报“Top module design_1_wrapper cannot be found”或类似错误实际上文件在只是没有被指定为顶层。3. Generating Output Products 生成的是一整套家底接下来看Generate Output Products。它不像Create HDL Wrapper那样只生成一个文件它生成的是一整套工程文件树涵盖综合、仿真、实现等多个阶段。3.1 一次生成多个目录对BD执行Generate Output Products之后你切到“IP Sources”标签页会看到类似这样的目录结构design_1 - Instantiation Template - Simulation - behavioral - structural - ... - Synthesis - ... - Implementation - ... - Constraints - ...这里面的每一类都有实际用途。Simulation目录下是各个IP的仿真模型比如Xilinx官方IP的functional simulation模型没有这些模型行为仿真时会找不到模块定义。Synthesis目录下是综合用的dcp网表或综合指导文件Implementation目录下则是布局布线阶段的辅助文件。Constraints目录通常是BD内部IP生成的约束文件片段它们会在综合/实现阶段被自动合入。所以Generate Output Products做的是“查漏补缺”把BD里每个IP在后续各阶段需要的家底全部生成出来。如果某个IP是out-of-date状态就相当于它的家底不全后面综合或者仿真一定会出问题。3.2 out-of-date状态到底怎么理解你修改了IP参数、修改了Block Design的连线、或者更换了器件型号之后Sources窗口里对应文件旁边可能会冒出一个黄色感叹号这就是out-of-date标记。它的含义是当前工程里已有的output products和IP当前配置不一致需要重新生成。这种状态在Vivado的细节里体现得特别清楚综合时如果检测到out-of-date的IP会弹窗问你要不要先Generate Output Products你要是点了Cancel它可能硬着头皮继续但后面报的错往往让你怀疑人生。所以与其等工具来问不如自己主动在修改IP后养成重新Generate Output Products的习惯。3.3 可选生成哪个阶段Vivado在Generate Output Products时可以选择生成范围。不是每次都生成全部比如你只想先跑跑功能仿真可以只勾Simulation相关的选项但实际工程里我建议直接选“Generate Output Products”默认的“All”即可全套生成也就几分钟到十几分钟的事缺了某一个又要回头补更浪费时间。4. 正确顺序是什么我验证过的推荐流程回到标题的问题到底该先用哪个我的结论先放在这里严格来说这两个操作没有强依赖关系先执行哪个一般都能跑通但从减少报错和避免版本滞后的角度我推荐先Generate Output Products再Create HDL Wrapper。4.1 为什么推荐这个顺序主要有三个理由。第一Generate Output Products会重新确认BD内部各IP的最新状态并输出对应的端口信息。此时再Create HDL Wrapperwrapper拿到的端口列表是最新的不会出现“wrapper端口和BD内部实际端口不一致”的隐患。第二从逻辑上说wrapper是BD的“外壳”外壳应该等“内芯”全部就位后再封。虽然这个类比并不严格但按这个顺序操作心态上更不容易乱。第三我实际试过反过来——先Create HDL Wrapper再Generate Output Products。在Vivado 2020.1和2021.2上都能正常跑通但偶尔会在Sources窗口里看到wrapper的状态短暂变成out-of-date需要手动refresh。这说明Vivado对顺序其实是宽容的但宽容不代表没坑既然先生成output products更稳就没必要去赌那偶尔的抽风。4.2 从新建工程到出Bit的完整操作顺序我整理了一份自己一直在用的流程可以按这个顺序操作基本不会出问题新建工程选择器件型号。在IP Integrator里Create Block Design给BD命名。在BD画布中添加IP核配置参数完成端口连接。执行Validate Design快捷键CtrlShiftV确认没有连接错误和协议错误。右键BD文件选择Generate Output Products弹出窗口里选All点Generate。右键BD文件选择Create HDL Wrapper选择Let Vivado manage wrapper and auto-update。检查Design Sources里design_1_wrapper.v是否自动设为顶层如果不是右键Set as Top。再右键wrapper文件或者BD文件看一眼是否还有out-of-date标记如果有重新Generate Output Products一次。添加约束文件xdc或者双击BD里的约束文件确认引脚约束生效。Run Synthesis综合完成后查看时序报告。Run Implementation然后Generate Bitstream。这套流程我自己用了很久也带过几个同事按这个走基本没在“先Generate还是先Wrapper”这个问题上翻过车。4.3 纯Tcl脚本操作方式如果你不想一直在GUI里点来点去或者想把这套流程写进自动化脚本对应的Tcl命令顺序是# 1. 对BD生成所有输出 generate_target all [get_files design_1.bd] # 2. 创建HDL wrapper自动管理 create_hdl_wrapper -files [get_files design_1.bd] # 3. 刷新工程状态 refresh_design # 4. 将wrapper设置为顶层如果工程还没指定 set_property top design_1_wrapper [current_fileset] # 5. 检查IP状态 report_ip_status这里注意get_files后面的路径取决于你的BD文件名如果你的BD叫system.bd就把design_1.bd换成system.bd。脚本里set_property top那一步视需要填写如果你在工程里已经手动指定过顶层可以跳过。5. 顺序错了会怎样报错与排查链路这一节我想多花点篇幅把最常见的几个错误现场整理出来。因为只有知道报错长什么样排查时才能一眼定位。5.1 只Generate Output Products没Create HDL Wrapper如果你画完BDGenerate Output Products也做了但忘了Create HDL Wrapper直接Run Synthesis大概率会看到类似这样的错误ERROR: [Synth 8-3913] could not find module design_1意思很直白综合工具在整个工程里找不到design_1这个模块。BD本身是图形化的不是直接的HDL源文件没有wrapper把它包成一个可综合模块综合器自然不知道它在哪里。这时候的解决方案不是去改BD而是回到Design Sources右键BD执行Create HDL Wrapper。5.2 只Create HDL Wrapper没Generate Output Products这个顺序下综合时可能不会立刻报“找不到模块”但Vivado会检测到IP状态out-of-date弹窗提示The following IPs are out-of-date: design_1 Generate Output Products?如果你点了No后续综合或仿真时可能报ERROR: [IP_Flow 19-3155] IP design_1/... is out of date. Please re-generate the output products.这种情况最烦人因为错误总是晚一步才出现。有时候综合能过但跑到Implementation又炸。排查思路也很简单看到报错先回Sources窗口看有没有黄色感叹号有就先Generate Output Products。5.3 两个都做了但wrapper没有设为Top这种情况最隐蔽。因为Sources窗口里能看到wrapper文件BD文件也在工程结构看上去很正常但Run Synthesis时可能报ERROR: [Vivado 12-1188] No top module found for synthesis或者ERROR: [Synth 8-6014] Unused input error: clk_0 is not used in the top module.第一种报错说明顶层没指定右键wrapper文件Set as Top即可。第二种报错有时候是因为Vivado选错了顶层把BD内部某个子模块当成顶层了这时候也要手动指定wrapper为顶层。我遇到过一次比较极端的工程里有旧的top文件残留Vivado默认选了那个旧文件综合时一堆端口不匹配的报错排查半天才反应过来顶层指向错了。所以这一步养成右键确认的习惯比CTRLS保存工程还重要。5.4 选了“Copy as standalone file”后的端口不匹配选了独立副本模式后如果后续BD里新增了GPIO、删除了某个接口、改了位宽wrapper不会自动同步。综合时会报类似ERROR: [Synth 8-3331] design_1_wrapper has unexpected port led_tri_o in instance design_1_i这种错光看报错会以为是BD端口问题其实根源就是wrapper过期了。解决办法是删除旧的wrapper重新Create HDL Wrapper或者改回自动管理模式。5.5 误把Generate Output Products理解成“只针对BD本身的IP”有时候BD里的IP是从其他工程复制过来的或者用了第三方的IP核Generate Output Products生成的产物可能不完整。Vivado会提示某些IP需要到原工程里去生成或者在IP License不满足的情况下直接失败。这时候别硬刚先在IP Catalog里确认该IP在当前工程可用再看看是不是缺少License别shou先怀疑顺序。6. 容易忽略的细节与我的使用习惯说到最后分享一些我在实际项目中积累下来的细节这些不一定写在官方文档里但对提升使用体验很有帮助。6.1 修改BD后的“强迫症”操作顺序现在每次改完Block Design我的肌肉记忆是CtrlShiftV验证设计右键Generate Output Products再检查wrapper状态。如果wrapper是自动管理很多时候不需要重新创建但最好看一眼Sources窗口有没有刷新。如果wrapper出现在out-of-date标记下就在wrapper上再跑一次Generate Output Products不要忽略那个黄色感叹号。6.2 关于“仿真时找不到IP模型”的坑很多人综合能过但一跑Behavioral Simulation就报类似ERROR: [VRFC 10-820] cannot find module design_1这通常不是顺序问题而是Generate Output Products时没有生成Simulation阶段的产物。解决方式就是重新Generate Output Products并确认Simulation相关选项被勾选。如果你之前只勾了Synthesis仿真模型确实不会生成这个和顺序无关但容易被误判成“是不是该先Create HDL Wrapper”。6.3 版本管理时output products要不要入库如果你的工程用Git管理我建议不要把自动生成的output products和wrapper都提交进去。它们属于派生文件只要BD源文件和xci在任何一台机器上都可以通过Generate Output Products和Create HDL Wrapper重新生成。提交进去反而会造成大量diff而且不同Vivado版本生成的产物还不一样合并起来极其痛苦。我只保留.bd文件、.xci文件和wrapper源文件如果自动模式 wrapper其实也可以重新生成但为了版本可读性可以保留其他产物统统交给工具本地生成。6.4 不同Vivado版本的菜单差异Vivado 2019之后的版本右键BD菜单里这两个命令一直在。但更早的版本里Generate Output Products可能藏在Tools菜单里或者需要先选中BD再在底部的Tcl Console里输入命令。如果你用的是旧版本或者版本很新菜单位置变了不要慌认准命令名就行。原理都一样generate_target负责内部产物create_hdl_wrapper负责外壳。6.5 一个建议的排查顺序模板遇到任何和BD相关的综合仿真报错我的排查顺序基本固定看IP Status有没有out-of-date。看Design Sources里有没有wrapperwrapper是否是最新状态。确认wrapper是不是顶层绿色三角形图标或Top标识。看Tcl Console里的警告信息尤其是IP_Flow开头的警告。最后才去翻具体报错。按这个顺序90%的BD相关报错都能在五分钟内定位。剩下的10%一般是License、器件型号不匹配或者IP版本兼容性问题那就不是顺序能解决的了。最后再分享个实用习惯在工程刚开始创建BD时就先把wrapper创建好选择自动管理模式然后再开始加IP连线。这样每次Validate Design之后wrapper都保持最新你只需要关心Generate Output Products一个变量。顺序固定下来之后你会发现这两个命令其实一点都不可怕可怕的是每次点的时候都没想清楚它们到底在干嘛。
返回列表