本人实测Vivado 2024.1,踩过网表导入后综合卡死、时序全是红字的坑,新手跟着一步步操作,就能轻松避开这类常见问题

发布于 更新于
2,686
详情介绍
智行者IC社区持续更新技术干货、实操教程、案例分享与常见问题解答,为学习者提供实用的学习参考资料。

网表导入后综合报错怎么解决

迈入第一步,开启Vivado工程,在Flow Navigator面板里,点击PROJECT MANAGER下的Settings。在弹出窗口的左侧部位,去选中Synthesis,在右侧之处,寻找到More Options,在文本框以内,手动键入-mode out_of_context,此参数会强制综合工具仅仅处理网表逻辑,不会自动去绑定器件引脚以及时钟资源,按OK进行保存。

【新手避坑】:这儿存在一个出现频率较高的报错: [Synth 8 – 439]模块‘xxx’未被找到。出错原因不是你将网表文件放置错误,而是鉴于Vivado默认综合模式会试着再解析顶层模块的RTL文件,然而在网表模式下顶层模块原本是没有RTL源码的。解决方案为:在Settings当中,去确认顶层模块名,即Top Module,你所书写的要与网表内部模块名全然一致,大小写是敏感的,一个字符都不能有差别,不能差一个字符,标点符号不能差哦。

第二步,返回到Flow Navigator那儿,点击Add Sources,接着选择Add or create design sources,随后点击Next。在弹出的文件添加窗口当中点击Add Files,寻觅到你的.edf或者.ngc网表文件,选中之后确认。留意着,要是网表倚赖若干文件,诸如一顶层网表与多个子模块网表这种,那就统统一股脑儿加进去,可别遗漏。而后点击Finish。

许多人在导入网表之后,点击运行综合,进度条行进到一半,直接弹出关键警告: [综合8 – 555],称找不到某个实例化的子模块,这是因为仅添加了顶层网表,然而顶层网表里例化调用的子模块网表却未被导入。处理方式为:返回到Add Sources步骤,将所有与之相关的.edf文件进行添加,还有.ngc文件也要添加,甚至.dcp文件同样添加到项目里,接着在Sources窗口,对着网表文件点击右键,选择Set As Top来强制去指定顶层。

前行的第三步,在Sources窗口里,将Hierarchy展开,去确认网表文件是否被识别成为灰色带有锁状的图标模样,而这种情况则代表着其呈现的是黑盒状态。随后,对该文件实施右键操作,从中选择Set as Top这一选项。紧接着,在Flow Navigator处,点击Synthesis下的Run Synthesis。当综合全部完成之后,将Synthesized Design打开,在Timing菜单的下方点击Report Timing Summary,进而对关键路径的时序余量加以确认。

【新手避坑】进行综合后,打开Report Timing Summary,发觉一堆路径的Slack全是负几百皮秒,呈现一片红色。这一般是网表里所自带的时钟约束与工程的约束产生了冲突。该有的做法是:在Synthesis Settings里将-mode out_of_context参数应用起来,如此这种综合工具便不会去理会顶层时钟树,而仅是留存你手动在XDC里所添加的约束。另外,建议把时钟周期设定为10ns(100MHz)作为参照标准,这个数值对绝大多数中等规模网表而言通用性是最为优良的,既能够抑制时序违例情况的出现,又不至于因过于严格以至于使得综合工具进行暴力优化进而增加面积。

网表导入不进去的原因排查

在此存在两种实操的方案,依据场景来选择,方案其一为,运用add_files命令直接施行导入。打开Tcl控制台,输入add_files,内容为{./path/to/your_netlist.edf},接着输入set_property,其参数为used_in_synthesis false,针对的是通过get_files获取的your_netlist.edf,随后再输入set_property,参数是used_in_implementation true,同样是针对通过get_files获取的your_netlist.edf。这组指令强行使得网表仅被应用于实现阶段,并不介入综合,适宜网表自身便是后端优化完毕的情况。

先是方案二,要在 Flow Navigator 当中找到 IP Catalog 来操作;随后在这个已找到的 IP Catalog 上,需右键点击空白之处,并选择 New IP Location 这一项;接着要把网表文件处理,将其包成一个自定义的 IP 核;最后,要在 Block Design 里面对这个已经被处理好的自定义 IP 核进行例化操作。此方案的取舍逻辑为:方案一适用于单文件、不与其他逻辑作交互的纯网表;方案二适用于网表需与AXI总线、DDR控制器等IP进行互联的复杂情况,尽管步骤多了一步,然而后续连线却省去诸多麻烦。

新手要避开的坑当中,最让人头疼的那种完整报错呈现为,处于Implementation阶段进行跑路操作的时候,会弹出一个窗口,上面显示[Place 30 – 574] Poor placement for routing between an IO pin and an IO buffer,其产生的原因在于,你所导入的网表里将一个顶层I/O进行了例化,然而工程却并未给这个I/O分配物理管脚。解决流程:先将Synthesized Design里的I/O Ports窗口打开,接着,把报错的端口名找寻出来;然后,通过右键选择Create Constraint,输入类似set_property PACKAGE_PIN AB12 [get_ports {xxx}]这样的物理管脚号;随后,输入set_property IOSTANDARD LVCMOS33 [get_ports {xxx}];最终,把约束文件进行保存,再运行Implementation。

有这么一招,是关于网表导入的,它可不是那种在任何情况下都一概适用的。如果你所使用的网表,是由Vivado早期版本,像是在2018.3之前生成出来的,然后要是直接把它导入到2024.1这个版本中,就会出现报不兼容错误的情况。在这种时候呢,就需要开启虚拟机去安装旧版本,接着重新导出.edf文件,又或者是运用Tcl命令read_edif,并且配合file_format参数指定旧版格式。另外要是网表自身处于加密状态(像是第三方IP供应商所给予的FLEXlm加密形式),那么那套流程根本无法通行,必须联系供应商索要解密文件,或者运用他们所提供的DC编译脚本再生成没有加密的网表。

常见问题(FAQ)

网表导入后综合报错说模块未找到,怎么排查?
常见原因是顶层模块名与网表内部模块名不一致,软件对大小写敏感;在综合设置里核对顶层模块名,必须与网表内部完全一致。
综合跑到一半提示找不到某个实例化的子模块怎么办?
一般是只添加了顶层网表,漏掉了子模块网表;把相关的网表文件甚至设计检查点文件一并加入项目,再在源文件窗口对网表右键指定为顶层。
综合后时序报告里时序余量全是负几百皮秒、一片红,怎么处理?
通常是网表自带的时钟约束与工程约束冲突,可在综合设置里启用脱离上下文的综合模式参数,让工具不再理会顶层时钟树、只保留手动添加的约束,并把时钟周期设为 10ns 作为参照。
0 / 600
0 讨论
热门最新
总结
暂无总结
嗨,下午好!
学硬件设计・来智行者 IC 社区
相关文章