Vivado工程时序违背

2023-12-26 11:40
文章标签 工程 时序 vivado 违背

本文主要是介绍Vivado工程时序违背,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        此篇博客在于记录vivado中报时序出错,尝试找方法改善、消除此问题。下面就工程中遇到的情况进行总结(持续更新):昨晚网上找到"vivado时序问题分析"(链接:https://wenku.baidu.com/view/e31e471a783e0912a2162ab3.html)文档,提及造成时序问题的成因有:1)约束不完整-70%;2)路径过长-20%;3)逻辑过深-5%;4)不正确的过约束-5%。解决方法对应分别是:1)约束主时钟;跨时钟域的约束;2)Pipeline设计;3)修改逻辑;使用Pipeline;4)删除过约束部分。看完后只留下一个概念:绝大多数时序约束问题都是由于约束不完整。

        1.xdc约束问题

        注:手头有两个工程,一份是当时开发PCIe工程(时序正常),另一份是加上工程其他功能模块的工程(时序违背)。

                                                                           图1:PCIe工程时序报告(setup_time)

                                                                            图2:完整工程时序报告(setup_time)

        想彻底消除那个失败的节点,对比两个工程PCIe部分的工程代码,发现两者的pipe_clock模块不一样,后者的pipe_clock模块被我整理过了,为了对比是否是我整理出的问题,我把前者的pipe_clock模块加载到后者的工程,发现这份完整工程中还是会报两个时序违背的路径(一条内联时钟路径+一条互联时钟路径,见下图3,4),因为pclk_sel是通过异步复位分别产生125M和250M的时钟,所以网表元素为异步复位D触发器。

                                                                         图3:内联时钟路径(250M-250M)报错

                                                                       图4:互联时钟路径(125M-250M)报错

        找到了是哪一个路径出问题,我找到相应模块下的信号,既然模块没改错那就去改xdc,对比发现两版工程的xdc关于内联/互联时钟的xdc约束,当时PCIe逻辑处理时钟已经降到62.5M了,以为250M时钟没用的所以并未在意。图5是PCIe工程,时序正常,xdc对pipe_clock模块进行绝对路径下的时钟约束;图6是完整工程,时序违背,xdc是当时直接拷贝PCIe工程,但是因为当时已经把加了顶层模块而且例化名进行了规范化所以这部分xdc实际是识别不出的;图7是完整工程,时序正常,xdc按照现在工程中pipe_clock模块的绝对路径约束125M、250M和跨时钟处理。

                                                                            图5:PCIe工程xdc约束(时序正常)

                                                                            图6:完整工程xdc约束(时序违背)

                                                                             图7:完整工程xdc约束(时序正常)

        问题说到底还是文中最开始提及的,约束不正确导致了时序违背。

---------------------------------------------------分----割----线------------------------------------------------------------

/*Ver. 2.0 补充了关于refclk_ibuf的问题*/

        补充关于参考时钟缓冲器refclk_ibuf的通道约束问题。在解决完setup/hold time时序违背后,工程在实现后会报严重警告“[Common 17-55] 'set_property' expects at least one object.[.xdc:line 109]”而第109行是对下边代码的约束,具体约束如下:“set_property LOC IBUFDS_GTE2_X0Y3 [get_cells refclk_ibuf]”。 

IBUFDS_GTE2 refclk_ibuf (.O(sys_clk), .ODIV2(), .I(sys_clk_PCIe_p), .CEB(1'b0), .IB(sys_clk_PCIe_n));

        我一开始猜测是通道约错了,为此对比了KC705(见Reference2),ZC706以及现在工程开发所使用的AC7103,这三个平台下PCIe例程的xdc,下面对比一下三块开发板对refclk_ibuf的通道约束:

        1.KC705—INST "refclk_ibuf" LOC = IBUFDS_GTE2_X0Y3;

        2.ZC706—set_property LOC IBUFDS_GTE2_X0Y6 [get_cells refclk_ibuf];

        3.AC7103—set_property LOC IBUFDS_GTE2_X0Y2 [get_cells refclk_ibuf](开发板自带的PCIe例程xdc).

        现在的完整版工程关于参考时钟的约束是"X0Y3",我以为是约束问题,那就模仿开发板自带的例程,将通道约束改为" X0Y2",满心期待的跑一遍工程,结果发现还是报一样的严重警告,今天早上问了黑金技术人员,一直含含糊糊没能給出一个合理的解释,果然如导师所言,靠他人不如自己来得靠谱。

        跑完综合后我们打开Flooplaning,先找到PCIe金手指部分的约束,因为我们只用了lane_x1模式,所以金手指中只有lane0以及差分时钟(参考时钟)那块进行通道约束了,整体截图见下图8。

                                                                           图8 PCIe金手指约束(只用了一条lane)

        放大refclk_ibuf、sys_clk_p/n通道约束那块,发现,即便工程xdc中对refclk_ibuf的约束是"X0Y2",但是图示中显示refclk_ibuf cell的Site是" X0Y3",那说明应该保持原来的" X0Y3"约束,具体约束Floorplaning见下图9:

                                                                              图9 refclk_ibuf、sys_clk_p/n通道约束

        改回" X0Y3"可还是会报错,这时我打开PCIe IP核的约束文件,发现对cell约束时有个例化绝对路径,如PCIe IP核的xdc对pcie_block进行约束时,其约束代码如下:

    set_property LOC PCIE_X0Y0 [get_cells inst/pcie_top_i/pcie_7x_i/pcie_block_i]

        仔细看图9中最上边红色框框中对refclk_ibuf cell的描述是"U_xilinx_pcie_2_1_ep_7x/refclk_ibuf",那么基本断定是我约束时没有加上绝对路径的缘故,,因为原先PCIe工程是refclk_ibuf就在工程的顶层,不存在找不到这个cell,而后面与其他模块合并后的完整版工程,需要加上对pcie这块的顶层例化路径(即U_xilinx_pcie_2_1_ep_7x)才能找到該cell。下边重新对refclk_ibuf进行通道约束,将原来的"set_property LOC IBUFDS_GTE2_X0Y3 [get_cells refclk_ibuf]"改为"set_property LOC IBUFDS_GTE2_X0Y3 [get_cells U_xilinx_pcie_2_1_ep_7x/refclk_ibuf]",警告消失。

        还有一个问题就是为什么AC7103自带的开发板会把该信号约成"X0Y2",那是因为黑金技术人员引用了Xilinx官方对A701开发板的约束,而黑金只是用了a7芯片开发出来的AC7103板子,其参考时钟通道约束是"X0Y3"而不应该照搬AC701的约束"X0Y2"(见Reference3)。

       总结:"set_property LOC IBUFDS_GTE2_X0Y2 [get_cells refclk_ibuf]"这块约束有问题,Xilinx 官方的AC701对refclk_buf确实是X0Y2,但是AC7103只使用了a7的芯片,其通道约束是X0Y3。黑金在开发AC7103 PCIe例程时xdc照搬了Xilinx关于AC701平台PCIe开发的部分xdc。其中部分引脚是有问题的,这个问题和lane通道约束也一样,不能完全参考AC701,Xilinx官方A7(含Xilinx a7芯片和A701开发板)生成的IP核xdc关于高速通道lane0-lane3的约束是按顺序来的X0Y4/X0Y5/X0Y6/X0Y7;而黑金AC7103通道约束lane0-lane3是X0Y5/X0Y4/X0Y6/X0Y7,其中两个通道顺序出问题导致主机检测不到板卡。

/*End for Ver. 2.0 2018-7-16 17:03:51*/

Reference:

1.https://wenku.baidu.com/view/e31e471a783e0912a2162ab3.html;

2.https://blog.csdn.net/ssbls/article/details/55272114;

3.https://www.xilinx.com/support/answers/52487.html;

这篇关于Vivado工程时序违背的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/539274

相关文章

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

Jenkins构建Maven聚合工程,指定构建子模块

一、设置单独编译构建子模块 配置: 1、Root POM指向父pom.xml 2、Goals and options指定构建模块的参数: mvn -pl project1/project1-son -am clean package 单独构建project1-son项目以及它所依赖的其它项目。 说明: mvn clean package -pl 父级模块名/子模块名 -am参数

二、Maven工程的创建--JavaSEJavaEE

1、idea创建Maven JavaSE工程:  2、idea创建Maven JavaEE工程:   (1)手动创建 (2)插件方式创建 在idea里安装插件JBLJavaToWeb; 选择需要生成的项目文件后,右击: 项目的webapp文件夹出现小蓝点,代表成功。

三、Maven工程的构建

首先,创建和构建是两个概念。 构建是指将源代码、依赖库和资源文件等转换为可执行或可部署的应用程序的过程。 在这个过程中包括编译源代码、链接依赖库、打包和部署等多个步骤。 项目构建是软件开发过程中至关重要的一部分,它能够大大提高软件开发效率,使得开发人员更加专注于应用程序的开发和维护,而不必关心应用程序的构建细节。 同时,项目构建还能将多人写的代码聚合,并能够自动化项目的构建和部署,

我在高职教STM32——准备HAL库工程模板(1)

新学期开学在即,又要给学生上 STM32 嵌入式课程了。这课上了多年了,一直用的都是标准库来开发,已经驾轻就熟了。人就是这样,有了自己熟悉的舒适圈,就很难做出改变,老师上课也是如此,排斥新课和不熟悉的内容。显然,STM32 的开发,HAL 库已是主流,自己其实也在使用,只不过更换库就意味着教学内容有很大变化,自己也就迟迟没有迈出调整这一步。现在,是时候做出变化了,笔者计划保持教学项

java工程的导入jar包

由于现在学习java web,java工程导入jar包都忘记了。 在此想记录一下:工程项目名:右击 -- Build Path --add External Archives 点击会弹出一个框 ,选择你要导入的jar路径就可以了。

【MyBatis学习14】MyBatis的逆向工程生成代码

1. 什么是逆向工程 mybatis的一个主要的特点就是需要程序员自己编写sql,那么如果表太多的话,难免会很麻烦,所以mybatis官方提供了一个逆向工程,可以针对单表自动生成mybatis执行所需要的代码(包括mapper.xml、mapper.java、po..)。一般在开发中,常用的逆向工程方式是通过数据库的表生成代码。 2. 使用逆向工程 使用mybatis的逆向工程,需要导入逆向

maven-聚合工程

聚合工程: 聚合工程里可以分为顶级项目(顶级工程、父工程)与子工程,这两者的关系其实就是父子继承的关系,子工程在maven里称之为模块(module),模块之间是平级,是可以相互依赖的。子模块可以使用顶级工程里所有的资源(依赖),子模块之间如果要使用资源,必须构建依赖(构建关系)一个顶级工程是可以由多个不同的子工程共同组合而成。

图特征工程实践指南:从节点中心性到全局拓扑的多尺度特征提取

图结构在多个领域中扮演着重要角色,它能有效地模拟实体间的连接关系,通过从图中提取有意义的特征,可以获得宝贵的信息提升机器学习算法的性能。 本文将介绍如何利用NetworkX在不同层面(节点、边和整体图)提取重要的图特征。 本文将以NetworkX库中提供的Zachary网络作为示例。这个广为人知的数据集代表了一个大学空手道俱乐部的社交网络,是理解图特征提取的理想起点。 我们先定义一些辅助函数

Springboot工程配置https访问

背景 因为前端工程使用nginx配置了https访问,在https直接请求我们Springboot后端的http接口会报错。那么我们就需要配置使得我们后端的springboot服务支持https访问。 证书生成 在配置springboot工程https之前,我们需要生成自签名证书以及Spring Boot通常使用的PKCS#12格式的密钥库。 生成自签名证书 openssl req -x