首页
学习
活动
专区
圈层
工具
发布
50 篇文章
1
资源利用率报告中的LUT和LUTRAM有什么区别
2
xilinx verilog语法技巧(三)--RAM的初始化
3
为什么推荐使用XPM?
4
Block RAM的基本结构
5
为什么要用XPM_MEMORY
6
Vivado中用于时钟操作的几个Tcl命令
7
影响FPGA时序的进位链(Carry Chain), 你用对了么??
8
动态时钟相位
9
动态时钟频率
10
如何缩短Vivado运行时间
11
你的FPGA设计有这些缺陷吗
12
report_utilization远比你想象的强大
13
vivado如何快速找到schematic中的object
14
FPGA中的CLOCK REGION和SLR是什么含义
15
FPGA中的BEL, SITE, TILE是什么含义
16
如何快速查找目标cell
17
都是pin,有什么区别
18
都是net,有什么区别
19
一张图看懂cell, pin, net, port
20
如何快速找到组合逻辑生成的时钟
21
【Vivado那些事】Vivado下头文件使用注意事项
22
Pblock可以这么画
23
关于Pblock的8个必知问题
24
常用的跟Pblock相关的Tcl命令
25
【Vivado】那些事儿-汇总篇
26
【Vivado那些事】Xilinx FPGA普通IO能不能直接接入PLL作为时钟输入
27
Storage Elements
28
D触发器都有哪几种类型?对应什么样的代码?
29
Xilinx 7系列FPGA逻辑单元理解
30
Vivado下查看芯片资源
31
对RAM初始化怎么做
32
干货:Vivado 直接修改RAM初始化文件,避免重新综合、实现的方法
33
借助Elaborated Design优化RTL代码
34
一张图理解什么是好的设计层次
35
9个关于SSI芯片的必知问题
36
Vivado 2018.3 report_qor_suggestions怎么用
37
Vivado 2019.1新特性(5):更新的report_qor_suggestions
38
Xilinx的高质量时钟输出ODDR原语【随路时钟】【全局时钟网络】【ZC706输出时钟】【ZYNQ】
39
FPGA中BEL Site Tile FSR SLR分别指什么?
40
跟I/O相关的几个命令
41
Vivado Non-Project模式
42
FPGA中降低时钟skew的几种方法
43
FPGA时序优化之Reduce MUXF Mapping
44
什么是Forwarded Clock?
45
几个常见问题
46
如何让同一层次的模块在布局时更紧凑一些
47
什么情况下要用OOC综合方式
48
Vivado 2019.1新特性(2):report_ram_utilization
49
URAM和BRAM有什么区别
50
write_first/read_first/no_change什么区别
清单首页FPGA文章详情

FPGA中降低时钟skew的几种方法

本文参考自高亚军老师的《AMD FPGA设计优化宝典》

首先哪些因此会导致时钟skew过大呢?

  1. 不合理的时钟结构
  2. 时钟同时驱动I/O资源和Slice资源
  3. 时钟跨die

在时序报告中,会显示出clock path skew,如果时钟偏移超过0.5ns,就需要额外关注了。

img_v3_028t_b69c5ae2-70d4-4115-8dba-f17176b1b27g

书中列举了几个优化skew的方法:

  1. 移除时钟路径上多余的时钟buffer,如果出现了级联时钟Buffer,势必会导致时钟路径上的延迟增大。
  2. 移除时钟路径上的组合逻辑,一旦时钟路径上出现了组合逻辑,就意味着时钟布线采用了“常规布线资源+专用布线资源”的组合形式,从而显著增大了时钟延迟且时钟skew无法预测。同时,相比于专用时钟布线资源,常规布线资源对噪声更加敏感,这会使时钟质量下降。
  3. 输入时钟从clock capable的管脚输入,否则还是会出现“常规布线资源+专用布线资源”的组合形式。
  4. 如果设计中出现并行的MMCM/PLL时,应合理设置CLOCK_DEDICATED_ROUTE的值。

image-20240312225134442

如果BUFGCE和两个MMCM位于同列相邻的时钟区域,那么应为约束为SAME_CMT_COLUMN或BACKBONE,同时将MMCM的位置固定下来:

代码语言:javascript
复制
# FOR UltraScale/UltraScale+
set_property CLOCK_DEDICATED_ROUTE SAME_CMT_COLUMN [get_nets -of [get_pins BUFG_inst/O]] 
# FOR 7 series
set_property CLOCK_DEDICATED_ROUTE BACKBONE [get_nets -of [get_pins BUFG_inst/O]] 
set_property LOC MMCM3_ADV_X1Y2 [get_cells MMCM3_ADV_inst_0]
set_property LOC MMCM3_ADV_X1Y0 [get_cells MMCM3_ADV_inst_1]

image-20240312225611134

如果BUFGCE和两个MMCM位于不同列但相邻的时钟区域,那么应该设为ANY_CMT_COLUMN和FALSE。

代码语言:javascript
复制
# FOR UltraScale/UltraScale+
set_property CLOCK_DEDICATED_ROUTE ANY_CMT_COLUMN [get_nets -of [get_pins BUFG_inst/O]] 
# FOR 7 series
set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets -of [get_pins BUFG_inst/O]] 
set_property LOC MMCM3_ADV_X1Y2 [get_cells MMCM3_ADV_inst_0]
set_property LOC MMCM3_ADV_X1Y0 [get_cells MMCM3_ADV_inst_1]

image-20240312225704903

  1. 对于7系列FPGA,避免使用BUFIO/BUFR/BUFH来驱动分散在不同时钟域内的逻辑。要评估设计中区域时钟缓冲器负载的个数,以保证这些负载可以被放置在一个时钟区域内。
  2. 对于UltraScale/UltraScale+和Versal的FPGA,避免使用MMCM/PLL对来自BUFG_GT的输出时钟执行简单的分频,可以使用BUFGCE_DIV、MBUFG这些带有分频功能的时钟BUFFER来代替。
  3. 对于UltraScale/UltraScale+和Versal的FPGA,对关键的同步跨时钟域路径添加CLOCK_DELAY_GROUP约束。什么是同步跨时钟域路径呢,比如MMCM输出的两个同步时钟。
  4. 对于UltraScale/UltraScale+的FPGA,修改时钟根节点的位置。Vivado在布局阶段会自动给每个时钟分配根节点的位置,以获取最佳的时序性能。通常情况下,时钟根节点位于其驱动负载的中心位置,如果不是,可以使用USER_CLOCK_ROOT调整。
  5. 避免关键路径穿越SLR或输入输出列。
  6. 对于UltraScale/UltraScale+的FPGA,使用CLOCK_LOW_FANOUT属性使时钟网线驱动的负载位于同一个时钟区域内。
下一篇
举报
领券