定义时钟

从最早的芯片规格定义分解出系统所需要的时钟和频率,以及各个模块需要的时钟和频率。SoC的时钟一般是由PLL产生,然后经过时钟生成电路和分配网络,最终给具体的功能模块使用。一般地,第三方IP供应商都会提供比较成熟的SDC,SoC集成时需稍作修改。对于自研的IP和SoC顶层,设计人员在提供RTL的同时,也需提供一份时钟结构图,一方面是方便撰写SDC,另一方面对后端PnR有针对性的进行CTS也非常有帮助。

时钟结构图分不同的层次,或抽象或具体,看具体的需要了,下面是一颗MCU全局时钟分布的结构图,大家有个认识就可以:

基于详细的时钟结构图,定义时钟的命令有两个:create_clock和create_generated_clock

其中,create_clock命令比较简单易懂,格式如下:

create_clock [-name clock_name] \-period period_value \[-waveform edge_list] \[-add] \[source_objects]

create_generated_clock命令解析

create_generated_clock命令格式如下,主要是定义generated clock和master clock的关系:

create_generated_clock [-name clock_name] \-source master_pin \[-master_clock clock] \[-edge edge_list] \[-edge_shift shift_list] \[-divide_by factor] \[-multiply_by factor] \[-duty_cycle percent] \[-combinational][-invert] \[-add] \source_objects

create_generated_clock 需要指定源时钟(master clock)的master_pin,在CTS时,默认会去balance这两个时钟(即generated clock 和 master clock),让skew尽可能小。而且在计算generated clock的clock latency时,会把从master clock pin 到generated clock pin之间的delay也考虑在内。在工具中report_timing的时候,通过选项-path_type full_clock_expanded可以将master clock的部分也展开。
report_timing -path_type full_clock
report_timing -path_type full_clock_expanded
需要注意:在使用create_generated_clock时,需要保证电路结构和命令的效果是一致的,否则工具在report_timing时会报错,比如下面的错误(UITE-461),这时就要仔细检查分频电路结构了。

Error: Generated clock 'CLKdiv2 with source pin Udiv/Q' 'rise_edge' is not satisfiable; zero
source latency will be used. (UITE-461)Error: Generated clock 'CLKdiv2 with source pin Udiv/Q' 'fall_edge' is not satisfiable; zero
source latency will be used. (UITE-461)

简单2分频

先看一个简单的2分频的实际的例子,命令和效果图如下:

create_clock -name SYSCLK \-period 2 \[get_ports SYSCLK]create_generated_clock -name DIVIDE \-source [get_ports SYSCLK] \-divide_by 2 \[get_pins FF1/Q]


考虑了edge/edge_shift的3分频实例

下面是3分频的实例,-edge选项中{3 5 9}分别表示SYSCLK的第3、5、9个时钟沿(clock edge),也分别对应DIV3B的一个完整时钟周期(上升、下降、上升)的时钟沿时间点。而-edge_shift选项{2.2 2.2 2.2}表示将DIV3B每个时钟沿都往后延迟2.2ns,命令和效果图如下:

create_clock -name SYSCLK \-period 2.2 \[get_ports SYSCLK]create_generated_clock -name DIV3B \-source [get_ports SYSCLK]  \-edges { 3 5 9 } \[get_pins U3/Q]create_generated_clock -name DIV3C \-source [get_ports SYSCLK]  \-edges { 3 5 9 } \-edge_shift {2.2 2.2 2.2} \[get_pins U4/QN]


考虑invert/preinvert的实例

create_generated_clock使用-invert/-preinvert选项都表明generated clock与master clock相位相反,但这两个选项的区别是:

preinvert : Creates a generated clock based on the inverted sense of the master clock.

invert : Creates an inverted generated clock based on the non-inverted sense of the master clock.

命令和效果图如下:

create_generated_clock -name gclk_pos \
-source [get_pins FF1/CLK]  \
-divide_by 2 \
[get_pins FF1/Q]create_generated_clock -name gclk_neg \
-source [get_pins FF1/CLK] \
-divide_by 2 \
-preinvert \
[get_pins FF1/Q]create_generated_clock -name glk_inv \
-source [get_pins FF1/CLK] \
-divide_by 2 \
-invert \
[get_pins FF1/Q]


同一点定义多个generated clock

在实际电路中比较常见的情况是,不同的场景下使用不同频率的时钟来驱动电路,如下图所示,同一个时钟,与经过二分频,四分频后的时钟经过MUX输出给电路使用。


这种情况下,需要在UMUX输出点定义三个时钟CLKbypass/CLKdiv2/CLKdiv4,而且这三个时钟在物理上是不能共存的(physically_exclusive),可以考虑使用以下命令来定义时钟:
create_clock -period 10 CLK

create_generated_clock -name CLKbypass \-source [get_ports CLK] \-master CLK \-divide_by 1 \-combinational \-add \UMUX/Ycreate_generated_clock -name CLKdiv2 \-source FFdiv2/CK \-master CLK \-divide_by 2 \-add \UMUX/Ycreate_generated_clock -name CLKdiv4 \-source FFdiv4/CK \-master CLK \-divide_by 4 \-add \UMUX/Yset_clock_groups -physically_exclusive \-group {CLKbypass} \-group {CLKdiv2} \-group {CLKdiv4}

注意,这种方式定义时钟看似合理,但是容易造成问题,因为在CLK和UMUX/Y之间有三条不同的路径,延迟大小不同,所以在计算timing时,在launch path和capture path上选择的路径会不同,带来悲观的影响,如下图所示,也有可能在计算min_pulse_width时造成假的违例。

在Solvnet上给出了更恰当的处理方式,具体命令如下:

create parent clock

create_clock -period 10 CLK

create divide-by-2, divide-by-4 generated clocks

create_generated_clock -name CLKdiv2 -divide_by 2 FFdiv2/Q -source FFdiv2/CK
create_generated_clock -name CLKdiv4 -divide_by 4 FFdiv4/Q -source FFdiv4/CK

create “MUXed” versions of all clocks arriving at MUX

create_generated_clock -name CLK_mux -combinational UMUX/A -source UMUX/A
create_generated_clock -name CLKdiv2_mux -combinational UMUX/B -source UMUX/B
create_generated_clock -name CLKdiv4_mux -combinational UMUX/C -source UMUX/C

create divide-by-3 versions of all clocks arriving at FFdiv3

create_generated_clock -name CLK_mux_div3
-divide_by 3 FFdiv3/Q -source FFdiv3/CK -master CLK_mux -add
create_generated_clock -name CLKdiv2_mux_div3
-divide_by 3 FFdiv3/Q -source FFdiv3/CK -master CLKdiv2_mux -add
create_generated_clock -name CLKdiv4_mux_div3
-divide_by 3 FFdiv3/Q -source FFdiv3/CK -master CLKdiv4_mux -add

apply physical exclusivity to all clock families (generated clocks included)

which are exclusive due to statically switched MUX

set_clock_groups -physically_exclusive
-group {CLK_mux CLK_mux_div3}
-group {CLKdiv2_mux CLKdiv2_mux_div3}
-group {CLKdiv4_mux CLKdiv4_mux_div3}

版权声明:本文为graymount原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/graymount/article/details/106066710

时钟定义篇 - 附CREATE_GENERATED_CLOCK花式定义方法相关推荐

  1. python变量定义必须赋值_Python3单行定义多个变量或赋值方法

    Python3单行定义多个变量或赋值方法 你甚至可以在一行内将多个值赋值给多个变量 >>> a , b = 45, 54 >>> a 45 >>> ...

  2. Android 自己定义View须要重写ondraw()等方法

    Android  自己定义View须要重写ondraw()等方法.这篇博客给大家说说自己定义View的写法,须要我们继承View,然后重写一些 方法,方法多多,看你须要什么方法 首先写一个自己定义的V ...

  3. python 定义函数方法,python中函数如何定义?python函数的调用方法介绍

    本篇文章给大家带来的内容是关于python中函数如何定义?python函数的调用方法介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 1. 函数的概念,函数是将具有独立功能的代码块 ...

  4. C++/C++11中用于定义类型别名的两种方法:typedef和using

    类型别名(type alias)是一个名字,它是某种类型的同义词.使用类型别名有很多好处,它让复杂的类型名字变得简单明了.易于理解和使用,还有助于程序员清楚地知道使用该类型的真实目的.在C++中,任何 ...

  5. SpringBoot入门篇之properties中定义user.name失效解决

    在properties中定义了user.name却取出了错误的value 配置文件如下: 映射实体如下: 测试时结果却输出了 User{name='HP', age=78, id=4988353466 ...

  6. 定义一个 圆形 Circle类 , 定义其中的长度length属性,定义一个求面积getArea()的方法。 并编写一个测试类,进行长度的赋值和展示,并调用求面积方法展示面积值。

    定义一个 圆形 Circle类 , 定义其中的长度length属性,定义一个求面积getArea()的方法. 并编写一个测试类,进行长度的赋值和展示,并调用求面积方法展示面积值. public cla ...

  7. php重定义地址栏url,thinkphp框架实现路由重定义简化url访问地址的方法分析

    本文实例讲述了thinkphp框架实现路由重定义简化url访问地址的方法.分享给大家供大家参考,具体如下: 如果按照正常访问的话,则需要输入一长串的url地址,这样会显得十分冗长,我可以可以通过对路由 ...

  8. 利用接口做参数,写个计算器,能完成加减乘除运算。 (1)定义一个接口Compute含有一个方法int computer(int n, int m)。 (2)设计四个类分

    代码 /*第二题:利用接口做参数,写个计算器,能完成加减乘除运算.(1)定义一个接口Compute含有一个方法int computer(int n, int m).(2)设计四个类分别实现此接口,完成 ...

  9. java里创建一个长方形类_定义一个长方形类,定义 求周长和面积的方法实例

    /* 定义一个长方形类,定义 求周长和面积的方法, 然后定义一个测试了Test2,进行测试. 长方形的类: 成员变量: 长,宽 成员方法: 求周长:(长+宽)*2; 求面积:长*宽 注意: impor ...

最新文章

  1. Jmeter脚本 GUI和非GUI启动方式
  2. 分布式架构:并发重复请求和幂等场景技术实现总结
  3. opencl track资料整理
  4. python代码 程序员编程艺术 2.1
  5. go语言int类型转化成string类型的方式
  6. 深入理解Java内存模型(七)——总结
  7. 自定义控件android.r,Android控件架构与自定义控件
  8. keil4内嵌汇编_keil C中嵌入汇编程序的方法
  9. Django module学习之模板
  10. 无线传感网1-简单介绍
  11. CodeForces - 1513B AND Sequences
  12. 简述 IntentFilter(意图过滤器)
  13. Java的一些基础问题
  14. 黑客松Demo: Kata 的下一代镜像系统
  15. kodi奈飞固件_在Ubuntu,Debian和Kodi上,如何安装Netflix
  16. Mac/Linux查看内网ip与访问公网的ip地址
  17. sprintboot验证码kaptcha 自定义图片样式
  18. 原相机怎么设置水印_原来手机拍照也可以添加文字、水印、超实用,我怎么没有早点发现...
  19. 支付系统设计包含:账户,对账,风控...!史上最全的!--转
  20. firefox 下载文件时处理此文件的方法

热门文章

  1. linux命令-管理用户
  2. 考研日记--8.11 你懒散的时间是被白白浪费掉的
  3. SecureCRT SecureFX中文乱码修改问题
  4. C# 实现医学影像 DICOM 工作站(2):Dicom影像导入和工作列表
  5. web上渐进使用jQuery Mobile中animate相关CSS
  6. 影响LoRa网络传输距离的关键因素是什么?
  7. LDD6410 开发板完全开发手册1——LDD6410硬软件特性
  8. AMPIRE 128X64驱动程序
  9. upload-labs通关(Pass-01~Pass-05)
  10. 长春长生们究竟卖到了哪里去?