网表导入总报错?教你三步搞定配置

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

我测过Vivado 2024.1版本,遇到过“网表导入之后综合出现报错”以及“端口不相匹配”这两个具有代表性的坑。

第一步 检查网表文件完整性与版本匹配

打开Vivado工程后,先别急着直接添加网表文件。走进 Project Manager,接着进入 Add Sources,而后挑选 Add or create design sources,在呈现的弹窗内点击 Add Files,进而寻觅到你所有的.edf 或者.ngc 网表文件。请留意,务必要去确认网表文件的生成工具版本,与当前工程版本之间相差不能超过一个主版本号。举例来说,要是用Vivado 2023.2生成的网表,放置到2024.1当中大概率是能够兼容的,假若用ISE 14.7生成的,若直接导入必然会出现兼容性报错。

常见出现的报错呈现为“ERROR: [Synth 8-439] Module not found”。其核心的原因在于,网表文件当中所引用的底层模块,在当下这个工程里头是缺失状态。解决这一问题的办法为:返回到源文件所在的目录,去检查网表文件是不是附带了配套的.stp或者.dcp约束文件,要是没有的话,那就需要手动去补全所有被引用的子模块网表。

第二步 正确设置网表文件属性与顶层模块

网表被添加完成之后,用鼠标右键点击那个文件,从中选择Set as Top,要保证顶层模块所指向的是与网表相对应的实体名称。随后,对 Sources 窗口下方的网表文件执行双击操作,在General 选项卡里,要留意 Library 字段不可为空,其默认状态是“work”,然而要是你所使用的是第三方仿真库,那就必须经由手动方式使之变更为对应的库名,像是“unisim”或者“simprims”。同时在Properties 里面勾选 Used in Synthesis 以及 Used in Simulation,不然的话,在后续进行布局布线时就会直接跳过这个文件。

这里最让人觉得坑的是,顶层模块的名称并不对应,报错“Port ‘clk’ not found in module”,往往,是由于网表内部所定义的端口名,和你工程顶层声明的名字,是不一样的,建议,用read_edif命令,在Tcl控制台当中查看网表端口列表,方法就是: read_edif ./your_design.edf,然后,对照进行修正。

第三步 综合选项调整与关键参数配置

步入 Project Settings,前往 Synthesis 项下的 Options,寻觅 -flatten_hierarchy,把这种关键参数从 默认呈现的 rebuilt 变更为 full。其原因在于,网表自身已然是扁平化的架构,要是采用rebuilt模式, Vivado会试图再度优化层级,导致网表内部的逻辑被错误地重新排列,进而引发时序违规。变更为full之后,工具会直接维持网表原本的结构,布线更为精准。

一种高频且完整的报错呈现为“CRITICAL WARNING: [Netlist 29 – 345] Unresolved hierarchical reference”。存在一步到位的解决流程,先是在Tcl栏输入report_property [get_files *.edf],以此来查看文件属性,进而确认IS_NETLIST是否为1。如果并非如此,以手工方式设置,将 set_property IS_NETLIST 1 应用于 [get_files ./your_design.edf]。之后,核查是否存在缺失的 .xdc 约束文件,鉴于网表一般并不包括时序约束,故而你得单独添加。最终,再度运行 reset_run synth_1 并开启综合。

两种实操方案对比

方案A:直接把网表导入进去,并且采用默认的设置。它的优点在于操作速度快,适用于原型验证的阶段。它的缺点在于碰到复杂的IP核时,容易因为库路径不对劲而导致综合失败。方案B:先借助create_ip把网表封装成IP核,然后再添加到工程里。它的优点是兼容性良好,方便进行复用,适合正式量产的项目。它的缺点是增添了IP配置的环节,耗时大概多10分钟。所以,要是项目紧急而且网表简单,就选择方案A;要是网表结构复杂或者需要长期维护,优先采用方案B。

这套方法,适用于多数由Synplify或Vivado生成的网表,然而,如果你所使用的是第三方FPGA工具,像是Lattice Diamond,那么导入流程便会存在差异,这是由于工具对于网表格式的支持有所不同。关于替代方案,那就是:把网表转换为Verilog仿真模型,紧接着直接在工程里实例化调用,借此规避工具兼容性问题。

常见问题(FAQ)

导入网表后综合报模块未找到,是什么原因?
通常是网表引用的底层模块在当前工程里缺失。回到源文件目录检查是否附带配套的约束文件,没有就手动补全被引用的子模块网表。
网表里端口名和工程顶层对不上怎么查?
在Tcl控制台用read_edif命令读取网表文件,就能查看它的端口列表,再对照顶层声明修正。
为什么要把层级展开选项从rebuilt改成full?
网表本身已是扁平结构,若用rebuilt模式工具会重新优化层级、错误重排内部逻辑并引发时序违规,改成full后工具直接维持网表原结构,布线更精准。
0 / 600
0 讨论
热门最新
总结
暂无总结
嗨,下午好!
学硬件设计・来智行者 IC 社区
相关文章