sdc时钟约束与综合经验总结
这次的SoC做了多时钟域处理,因此也比之前的约束起来会更复杂一些,把目前的一些小经验给总结一下。
首先描述一下这次的时钟域处理情况,对AXI总线上做了400MHz的时钟约束,AHB是二分频到200MHz,APB再二分频到100MHz,这是三路同步时钟,400MHz的时钟由PLL直接产生给到内部,200MHz和100MHz时钟是依次派生的时钟关系。此外还有一路单独的JTAG时钟,与上述时钟为异步关系。
因此这里涉及到的两个问题就是:1. 怎么约束派生时钟的关系,2. 怎么定义时钟间的异步关系。
先解决第一个问题,都知道派生时钟用create_generated_clock命令去做,但这里的问题就是怎么和RTL代码结合起来,将时钟约束到哪个pin上。一个新手的常见误区是会去写一个计数器分频的模块,产生好分频后的时钟后,直接将时钟约束到模块的port上。我最早也是这么做的,然后就被后端怼了,这里的问题就是往往工具会在模块内部连接到port的路径上加buffer,因此内部产生的分频时钟传播到port上之后实际上就带有了buffer引入的延迟,导致产生相位差,破坏同步时钟的关系。合理的设置方法应该是在RTL中直接例化DFF,然后将产生的分频信号约束到DFF的Q端上,同理在FPGA上,如果不使用IP的话,那么就直接调用Vivado的DFF原语,然后进行约束。
第二个问题,异步关系怎么处理?这个情境下前三个时钟都是同步时钟,最后一个时钟和前三个时钟都是异步关系,如果只有两个异步时钟的话,相互设置set_flase_path就完事了,但现在这样就比较麻烦,所以最好的办法是直接使用set_clock_groups -asynchronous的方式来完成,简单明了。有个debug的小点是,为了便捷,这边用变量的方式声明的clock name,但是到命令里面去调用的时候发现类似于set_clock_groups -asynchronous -group [get_clocks {$clk1_name $clk2_name $clk3_name}] -group [get_clocks $clk4_name]这种写法是不识别的,最后发现还是得老老实实声明一个list变量来处理。
最后直接放一下对应的RTL代码和sdc:
assign clk_400 = clk;
wire clk_200_inv;
wire clk_100_inv;
// clock divide register 0
assign clk_200_inv = ~clk_200;
DFCNQD0BWP7D5T20P96CPD u_div_reg0(.D(clk_200_inv), .CP(clk), .CDN(rst_n), .Q(clk_200));
// clock divide register 1
assign clk_100_inv = ~clk_100;
DFCNQD0BWP7D5T20P96CPD u_div_reg1(.D(clk_100_inv), .CP(clk_200), .CDN(rst_n), .Q(clk_100));
# Definition of Clock
set Tclk1 2.5 ; #400MHz
set Tclk2 5 ; #200MHz // generated clock
set Tclk3 10 ; #100MHz // generated clock
set Tclk4 1000 ; #1MHz
set clk1_name "clk_400"
set clk2_name "clk_200"
set clk3_name "clk_100"
set clk4_name "clk_jtag"
set unc_perc 0.05
create_clock -name $clk1_name -period $Tclk1 [get_ports clk]
set_clock_uncertainty -setup [expr $Tclk1 * $unc_perc] [get_clocks $clk1_name]
create_generated_clock -name $clk2_name -source [get_pins u_clk_rst_gen/u_div_reg0/CP] -divide_by 2 [get_pins u_clk_rst_gen/u_div_reg0/Q] -master_clock $clk1_name
create_generated_clock -name $clk3_name -source [get_pins u_clk_rst_gen/u_div_reg1/CP] -divide_by 2 [get_pins u_clk_rst_gen/u_div_reg1/Q] -master_clock $clk2_name
create_clock -name $clk4_name -period $Tclk4 [get_ports jtag_tck]
set_clock_uncertainty -setup [expr $Tclk4 * $unc_perc] [get_clocks $clk4_name]
set_clock_transition 0.4 [all_clocks]
set clk_list1 [list $clk1_name $clk2_name $clk3_name]
set clk_list2 [list $clk4_name]
set_clock_groups -asynchronous -group [get_clocks $clk_list1] -group [get_clocks $clk_list2]
当然这里也可以直接使用set_clock_groups -asynchronous -group [get_clocks "$clk1_name $clk2_name $clk3_name"] -group [get_clocks $clk4_name]的方式。
后续发现会报告一个hold time的违例:
Point Incr Path
--------------------------------------------------------------------------
clock clk_200 (rise edge) 0.00 0.00
u_clk_rst_gen/u_div_reg0/Q (DFCNQD0BWP7D5T20P96CPD) 0.00 # 0.00 r
u_clk_rst_gen/I_0/ZN (INVRTND0BWP7D5T20P96CPD) 0.07 # 0.07 f
u_clk_rst_gen/u_div_reg0/D (DFCNQD0BWP7D5T20P96CPD) 0.00 0.07 f
data arrival time 0.07
clock clk_400 (rise edge) 0.00 0.00
clock network delay (ideal) 0.00 0.00
u_clk_rst_gen/u_div_reg0/CP (DFCNQD0BWP7D5T20P96CPD)
0.00 0.00 r
library hold time 0.12 0.12
data required time 0.12
--------------------------------------------------------------------------
data required time 0.12
data arrival time -0.07
--------------------------------------------------------------------------
slack (VIOLATED) -0.05
从这里的时序计算来看,从u_div_reg0的Q端传播到u_div_reg0的D端,这里总共只需要0.07ns,但对于D触发起来说,hold time需要0.12ns,因此这里无法满足hold的时序要求,造成了违例,解决方案其实也很简单,就是在Q到D之间查入buffer就行,这样手工fix一下:
// clock divide register 0
assign clk_200_inv = ~clk_200;
// insert buff to fix hold timing violation
wire clk_200_inv_bf0;
wire clk_200_inv_bf1;
wire clk_200_inv_bf2;
BUFFD0BWP7D5T20P96CPD u_buff_0(.I(clk_200_inv), .Z(clk_200_inv_bf0));
BUFFD0BWP7D5T20P96CPD u_buff_1(.I(clk_200_inv_bf0), .Z(clk_200_inv_bf1));
BUFFD0BWP7D5T20P96CPD u_buff_2(.I(clk_200_inv_bf1), .Z(clk_200_inv_bf2));
DFCNQD0BWP7D5T20P96CPD u_div_reg0(.D(clk_200_inv_bf2), .CP(clk), .CDN(rst_n), .Q(clk_200));
就修复好了(当然这里其实也可以后端插buffer修复)。
sdc时钟约束与综合经验总结的更多相关文章
- 每天进步一点点------时序分析基础与时钟约束实例(四)IO口时序(Input Delay /output Delay)
1.1 概述 在高速系统中FPGA时序约束不止包括内部时钟约束,还应包括完整的IO时序约束和时序例外约束才能实现PCB板级的时序收敛.因此,FPGA时序约束中IO口时序约束也是一个重点.只有约束正确 ...
- 关于vivado----xdc文件时钟约束的初识
关于vivado----xdc文件时钟约束的初识 1.Primary Clocks(主时钟) 然而,对于比较复杂的时钟: 2.某个模块采用的主时钟(比如说GT) 3.时钟分频 4.复杂一点的时钟描述 ...
- 综合经验:IO读写错误必然导致程序崩溃
仿佛是忽然间产生的问题,每次程序退出时候,必然崩溃,花了整整一天才找到原因,就是对数据库的IO读写错误.主要是因为析构函数调用了Disconnect函数,内容如下: void SFTPTool::Di ...
- 利用Synplify Pro 加时钟约束的问题
可以改名称为"design.ucf"加成新约束. 在使用Xilinx ISE进行综合时,可以与Synplify Pro软件配合,实现较高的综合性能.但是,有时会出现如下问题: “E ...
- FPGA综合的约束
近日发现,有些逻辑电路的综合时间约束和布局布线约束相差太大时,难以布通.此时,应该选择尽量接近的时钟约束.
- 数字设计中的时钟与约束(gate)
转载:https://www.cnblogs.com/IClearner/p/6440488.html 最近做完了synopsys的DC workshop,涉及到时钟的建模/约束,这里就来聊聊数字中的 ...
- 【转载】如何在FPGA设计环境中添加加时序约束
转自:http://bbs.ednchina.com/BLOG_ARTICLE_198929.HTM 如何在FPGA设计环境中加时序约束 在给FPGA做逻辑综合和布局布线时,需要在工具中设定时序 ...
- Tcl与Design Compiler (三)——DC综合的流程
本文属于原创手打(有参考文献),如果有错,欢迎留言更正:此外,转载请标明出处 http://www.cnblogs.com/IClearner/ ,作者:IC_learner 1.基本流程概述 首先 ...
- Tcl与Design Compiler (七)——环境、设计规则和面积约束
本文属于原创手打(有参考文献),如果有错,欢迎留言更正:此外,转载请标明出处 http://www.cnblogs.com/IClearner/ ,作者:IC_learner 本文的主要内容是讲解( ...
- Xilinx约束学习笔记(一)—— 约束方法学
<Xilinx约束学习笔记>为自己阅读 Xilinx 官方 UG903 文档后的学习笔记,大多数为翻译得来,方便大家学习. 1 约束方法学 1.1 组织约束文件 Xilinx 建议将时序约 ...
随机推荐
- 转载的 linux 下的搜狗拼音问题
转载自http://blog.csdn.net/jilijelon/article/details/53759965 炎热的夏日 拼音问题搞的我很烦躁 之前一段时间正常使用的搜狗输入法突然无法输出中 ...
- Codigger应用商店(Store):连接开发者与用户的功能平台
Codigger应用商店(Store)作为Codigger生态中的重要组成部分,承担着连接开发者与用户的桥梁作用.它构建了一套从开发创作到发布推广,再到价值变现的完整流程,为生态内的各方提供了协同互动 ...
- API自动化测试平台,RestCloud效率提升60%
RestCloud API自动化测试平台,可以对API进行编排实现复杂的测试场景.实现对API的自动化测试,并根据测试结果输出测试报告,全面提升API的测试效率:平台基于Web界面构建,同比使用pos ...
- SciTech-Mathmatics-BigDataAIML: PCA(Principle Component Analysis)主成分分析 的 数学原理 + 应用示例
SciTech-Mathmatics-BigDataAIML: PCA(Principle Component Analysis)主成分分析 参考链接 How to Calculate Princip ...
- jsonb 为什么会影响 System.Text.Json
我在将一个属性映射到 jsonb 类型时遇到这样一个问题 -- 我有一个抽象基类 BaseClass 和一个派生类 DerivedClass: [JsonDerivedType(typeof(Deri ...
- 基础篇:6.6)形位公差-基准 Datum
本章目标:了解形位公差基准及运用. 1.前言 基准是形位公差专有的东西,是公差标注的一个重要的升级. 没错,以前的线性公差是没有基准的,因为线性公差代表的是两个特征之间的距离.原因在于,没有基准的符号 ...
- shellcode分离加载实现CS免杀上线
基于XOR加密的Shellcode加载器项目,通过内存解密执行实现基础免杀,包含C++加载器和Python加密脚本,可绕过常规静态检测. 项目地址 https://github.com/tzyyyyy ...
- tomcat部署vue
https://www.cnblogs.com/lixianfu5005/p/9967147.html
- 文件服务(SMB)共享详解
三种共享类型: 微软的CIFS文件共享协议,可以让windows机器在网上邻居之间共享文件,也即是windows-windows之间的文件共享: NFS文件共享协议,可以让远程共享的共享目录挂载在本地 ...
- Adobe DNG Converter 16.0.1 将RAW文件转换成DNG文件(Win&Mac)
Adobe DNG Converter 让您能够从支持的相机中将特定相机的原始文件轻松地转换为更加通用的 DNG 原始文件.DNG Converter 的另一个优势在于其后向兼容性. Adobe DN ...