Tcl语言:SDC约束命令create_generated_clock详解(上)

news2024/12/23 9:54:30

相关阅读

Tcl语言icon-default.png?t=N7T8https://blog.csdn.net/weixin_45791458/category_12488978.html?spm=1001.2014.3001.5482


        有时候,复杂的设计需要多个时钟来完成相应的操作,当设计中有多个时钟存在时,它们需要相互协作或各司其职。有几种时钟可能由其他时钟而派生或者说生成,在定义这些时钟时需要使用创建生成时钟命令create_generated_clock。这类时钟可能是时钟分频器,时钟倍频器和时钟门控。

时钟分频器

        时钟分频器产生一个比原始时钟频率更低(周期更长)的时钟信号。典型的时钟分频器是由多个T触发器串联构成的异步计数器。异步计数器的电路如图1所示,产生的时钟波形如图2所示。对于该电路,如果输入的时钟周期是10ns,则在clk_1的时钟周期是20ns,clk_2的时钟周期是40ns。

图1  异步计数器

图2 分频器电路时钟波形

时钟倍频器

        时钟倍频器是一种通过增加时钟频率来获得更快时钟速度的电路。这种技术通常用于微处理器和内部总线,并配合内部高速缓存以提高处理器的吞吐量。图3给出了一个简单的时钟倍频器电路,电路利用延迟的时钟和原时钟异或产生更高的时钟频率,延迟可以使用反相器或缓冲器得到,产生的时钟波形如图4所示。在一般情况下,通过PLL锁相环实现时钟倍频。

图3 简单的时钟倍频器

图4 倍频器电路时钟波形

时钟门控

        自20世纪90年代中期以来,时钟门控成为了一种非常流行的减少功耗的技术。当触发器或寄存器因时钟触发而翻转时,会产生一定的动态功耗。然而,某些情况下,部分电路在特定时间无需工作,此时禁用这些电路的时钟可以减少不必要的功耗,这称为时钟门控。图5给出了门控时钟的一个简单实现,更复杂的实现可以参考以往的文章。

 图5 门控时钟

创建生成时钟指令的BNF范式

        SDC指令中用于创建生成时钟的命令是create_generated_clock。该指令的BNF为:

create_generated_clock
    [-name clock_name]
    [-add]
    [-master_clock clock]
    [-divide_by divide_factor | -multiply_by multiply_factor]
    [-duty_cycle percent]
    [-invert]
    [-preinvert]
    [-edges edge_list]
    [-edge_shift edge_shift_list]
    [-combinational]
    [-comment comment_string]
    source_objects
    -source master_pin

标识生成时钟源

        就像create_clock指令一样,创建一个生成时钟同样需要它的时钟源对象,简单来说就是生成时钟生成的位置,源对象可以是一个端口(port)或者是一个引脚(pin)。一个生成时钟可能有多个时钟源,当然一个时钟源上也可能有多个生成时钟。

指定生成时钟的源引脚

        指定生成时钟的源引脚可以使用-source选项。这个选项指明生成时钟是由哪个引脚或端口上的时钟派生的,这个原时钟被称为master clock(注意,这里不一定要原时钟的源对象是该引脚或端口,只需要master clock时钟能传播至该引脚或端口即可)。例如,在图1中,可以定义两个生成时钟,生成时钟源对象分别为clk_1和clk_2,源引脚则定义为clk,或者也可以是clk_1_reg/CK(如果已在clk定义了时钟,则会传播至clk_1_reg/CK)。

        在这里需要搞清楚,生成时钟源对象和生成时钟源引脚的区别,生成时钟源对象指的是生成时钟定义在哪个位置,而生成时钟源引脚指明了哪个是获得生成时钟的原时钟。

        如果一个引脚或端口上有多个时钟传播至此,则无法推断出生成时钟属于哪个master clock,需要显式指明。这可以使用-master_clock选项实现,只需指定参数为master_clock的名字即可。在创建了生成时钟后,开发工具将基于master_clock的属性派生生成时钟的属性(如波形、周期等)。

        在这里有必要说明一下,定义生成时钟的必要性。有人可能会认为,根据master_clock定义生成时钟是不必要的,可以让开发工具自行推断出最后生成的时钟而不去单独创建。但这是错误的,比如对于图1的分频器,如果只在clk处定义了时钟,开发工具不会认为clk_1和clk_2处生成的是时钟信号,因为所有时钟信号在传播到触发器的时钟端后即终止传播,如图6的时钟树报告所示,故不能用clk_1和clk_2信号去触发后面的触发器,这导致了后面的触发器是无约束的。此时可以在clk_1和clk_2上定义生成时钟,来约束分频时钟控制的触发器。

图6 时钟树报告

生成时钟命名

        和普通的时钟一样,每一个生成时钟对象的创建都会给生成时钟命名,使用-name选项可以指定一个生成时钟名,当没有使用选项指定时,默认使用生成时钟源名作为生成时钟名。在有些情况下,-name选项是必须的,比如当使用了-add选项时,关于这点,将在后面进行介绍。

设定生成时钟特性

        设定生成时钟的特性可利用以下三个选项当中的一个:

  1. -edges——选项的参数一个列表,指明了生成时钟的边沿是如何与master_clock的边沿对齐的。列表中的第一个数表示生成时钟的第一个上升沿对应master clock的第几个沿(master clock沿编号是从左到右,不包括0ns时默认的下降沿,从1开始依次增加的),第二个数表示生成时钟的下一个下降沿对应master clock的第几个沿,第三个数表示生成时钟的第二个上升沿对应master clock的第几个沿。列表中需要至少有三个数表示一个完整的周期(上升沿-下降沿-上升沿)。
  2. -divide by——选项的参数是一个除法因子,表示分频倍数,周期通过这个因子翻倍。
  3. -multiply_by——选项的参数是一个乘法因子,表示倍频倍数,周期要除以这个因子。

        需要注意的是,尽管时钟是通过周期来定义的,但divide by和multiply_by是针对频率而言的。

        总的来说,任何使用-divide_by或multiply_by选项来表示的生成时钟,也可以使用-edges来表示,反之则未必正确。参考图1,假设在clk处定义时钟,在clk_1和clk_2上定义生成时钟。

create_clock -period 10 -waveform {10 15} [get_port clk]

create_generated_clock -source [get_port clk] 
    -divide_by 2 [get_port clk_1]
create_generated_clock -source [get_port clk] 
    -divide_by 4 [get_port clk_2]

#下面的形式也可以,即其中一种生成时钟的master_clock是另一个生成时钟
create_generated_clock -source [get_port clk] 
    -divide_by 2 [get_port clk_1]
create_generated_clock -source [get_port clk_1] 
    -divide_by 2 [get_port clk_2]

#使用-edges也可以
create_generated_clock -source [get_port clk] 
    -edges {1 3 5} [get_port clk_1]
create_generated_clock -source [get_port clk]
    -edges {1 5 9} [get_port clk_2]

create_generated_clock -source [get_port clk] 
    -edges {1 3 5} [get_port clk_1]
create_generated_clock -source [get_port clk_1]
    -edges {1 3 5} [get_port clk_2]

        假设使用第一种方法创建了生成时钟,可以使用report_clock报告设计中的各个时钟的情况,如图7所示,可以看到使用-divide_by生成的时钟的第一个上升沿与master clock的第一个上升沿是对齐的,如果使用-edges则没有此要求,生成的时钟的第一个上升沿可以与master clock的任何一个沿对齐。

图7 时钟报告

        如果生成的时钟需要取反,可以利用-invert选项完成该项功能,如下所示。但需要注意的是,这个选项可能会翻转t=0ns时的下降沿,也可能在翻转后的首个上升沿前添加其他沿,比如当你翻转一个waveform是{5 10},周期为10的时钟或翻转一个waveform是{11 12},周期为10的时钟时。

create_generated_clock -source [get_port clk] 
    -divide_by 2  -invert -name clk_n

         对于使用-divide by的生成时钟,除了周期有相应改变外,其他性质有什么变化呢?前面其实已经谈到了一个,使用-divide by分频得到的生成时钟的第一个上升沿与master clock的第一个上升沿对齐。对于其他上升下降沿,Design Compiler的处理方式是将周期平均分给所有的上下脉冲,也就是说,无法保证占空比与分频前一致,具体如下例所示。

#定义了一个复杂的时钟波形
create_clock -period 20 -waveform { 2 5 12 15} [get_port clk]

#根据这个时钟使用-divide_by创建分频时钟,结果如图8所示
create_generated_clock -source [get_port clk] -divide_by 2 [get_port clk_0]

图8 上升沿对齐,周期在上下脉冲间均分

         对于使用-multiply_by的生成时钟,无法保证倍频得到的生成时钟的第一个上升沿与master clock的第一个上升沿对齐。Design Compiler的处理方式是将所有沿的出现时间除以倍频因子,这样能保证所有脉冲占空比与之前相同,具体如下例所示。

#定义了一个复杂的时钟波形
create_clock -period 20 -waveform { 2 5 12 15} [get_port clk]

#根据这个时钟使用-multiply_by创建分频时钟,结果如图9所示
create_generated_clock -source [get_port clk] -multiply_by 2 [get_port clk_0]

图9 倍频之后的waveform相当于之前的waveform除以倍频因子

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1182213.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Centos7部署Python3环境

一、安装Python3 ###查看是否安装Python3 Centos 7 默认安装了python 2.7.5. 因为一些命令要用它比如yum 它使用的是python2.7.5 使用 python -V 命令查看一下是否安装Python 然后使用命令 which python 查看一下Python可执行文件的位置 Python指向的是Python2.7 安装依赖 y…

漏刻有时百度地图API实战开发(1)华为手机无法使用addEventListener click 的兼容解决方案

现象 漏刻有时项目开发中的调用了百度地图API,在PC端、IOS和安卓机型测试都没有问题。但是使用华为手机部分型号时,前端在监听点击事件的时候是使用 map.addEventListener(click,function(){...}),无法触发。或 原理 通过监听touchstart和…

CentOS7安装部署StarRocks

文章目录 CentOS7安装部署StarRocks一、前言1.简介2.环境 二、正文1.StarRocks基础1)架构图2)通讯端口 2.部署服务器3.安装基础环境1)安装JDK 112)修改机器名3)安装GCC4)关闭交换分区(swap&…

基于级联广义积分器(CGI)的谐波信号提取MATLAB仿真

微❤关注“电气仔推送”获得资料(专享优惠) 此方法可用于信号检测、虚拟阻抗合成、锁相环等方面。 在现有的信号提取方法中,众多学者采用了SOGI法、LPF法以及正交信号发生器等方法。当输入信号中不存在直流分量,只有谐波分量时&…

C盘清理指南(一) 内存小的本质原因

相信大家看到日益爆满的C盘一定会很头疼,博主也不例外。C盘之于电脑,犹如心脏之于人类一般重要,合理地清理C盘是工作中必不可少的技能。由于全篇篇幅较长,所以这部分会分为好几期哦,大家敬请期待! 当我们发…

V90 EPOS模型下位置控制(完整SCL源代码)

V90EPOS模式下点动控制详细应用介绍和控制源代码,请查看下面文章链接: V90伺服EPOS模式点动控制(详细介绍+完整SCL代码)-CSDN博客文章浏览阅读29次。V90伺服驱动器采用西门子标准报文111加FB284(SINA_POS)详细的报文组态和功能块请参考下面文章链接:博途1200/1500PLC V90 P…

使用 Gorm 进行事务和错误处理

在 GORM 中管理事务和错误的全面指南,以确保可靠的数据库操作 在数据库管理的世界中,确保数据完整性至关重要。GORM,强大的 Go 对象关系映射库,为开发人员提供了维护数据一致性和优雅处理错误的必要工具。本文将作为您全面的指南…

告别传统笔记,8款笔记软件让读书笔记更精彩!

阅读,它打开了一个全新的世界给我们。对于那些热爱阅读的人们来说,没有什么比把手中的一本书翻到最后一页更满足的了。为了更好地理解书籍的内容,或是以后能快速查阅书中的重点内容,很多人习惯于边阅读边做读书笔记。 如果你正在…

【源码】医学影像PACS实现三维影像后处理等功能

医学影像诊断技术近年来取得了快速发展,包括高性能的影像检查设备的临床应用和数字信息技术的图像显示、存储、传输、处理、识别,这些技术使得计算机辅助检测和诊断成为可能,同时人工智能影像诊断也进入了人们的视野。这些技术进步提高了疾病…

王道考研--》顺序表课后习题C语言代码实现(冲刺)

考研是许多计算机科学专业学生追求高学历、寻求更好就业前景的途径。在考研过程中,数据结构是一个非常重要的科目,而代码实现题更是其中的难点之一。在这篇文章中,我们将探讨如何通过实现数据结构代码问题来提升考研成绩。无论您是否有编程经…

C#中LINQtoSQL只能在.NetFramework下使用,不能在.net 的默认安装下使用

目录 一、在net7.0下无法实现LINQtoSQL 1.VS上建立数据库连接 2.VS上创建LINQtoSQL 二、在.NetFramework4.8下成功实现LINQtoSQL 1.VS上建立数据库连接 2.VS上创建LINQtoSQL 三、结论 四、理由 本文是个人观点,因为我百般努力在.net7.0下无法实现LINQtoSQL的…

vr地铁消防虚拟逃生自救系统降低财产及人员伤害

无论是在公共场所还是在家中,火灾都是一种常见的突发事件。这往往会严重影响到人们的财产和生命安全。因此,如何预防火灾和安全逃生就成为了非常重要的话题。这款VR模拟火灾疏散逃生系统,帮助人们了解火灾逃生的技巧以及正确的应对方法。 以传…

【仙逆】尸阴宗秘密揭露,王林差点被夺舍,修仙恐怖消息曝光

Hello,小伙伴们,我是小郑继续为大家深度解析国漫资讯。 深度爆料,《仙逆》国漫第九话最新剧情,尸阴宗表面上令人敬畏,但背后却隐藏着不为人知的秘密。这个宗门暗地里为受伤或死亡的强大修真者提供夺舍容器,帮助他们获…

基础课24——开放域QA问答

早期的对话机器人通常采用基于规则的开放问答系统。这种系统依赖于专家系统的语义模板,即根据预先定义的模板来匹配和回答问题。这种方法的优点是准确性相对较高,因为它是基于人类专家的知识和经验来设计的。然而,这种系统的可扩展性和灵活性…

Linux程序的地址空间

Linux程序的地址空间 📟作者主页:慢热的陕西人 🌴专栏链接:Linux 📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言 本博客主要内容深刻理解了什么程序或者进程的地址…

2000-2021年全国各省市城乡平均受教育年限数据(分城镇和农村)

2000-2021年全国各省市城乡平均受教育年限数据(分城镇和农村) 1、时间:2000-2021年 2、范围:全国及31省 3、来源:人口与就业统计年鉴 4、指标包括:城乡平均受教育年限 、6岁以上总人口 未上过学、…

【手把手教你】训练YOLOv8分割模型

1.下载文件 在github上下载YOLOV8模型的文件,搜索yolov8,star最多这个就是 2. 准备环境 环境要求python>3.8,PyTorch>1.8,自行安装ptyorch环境即可 2. 制作数据集 制作数据集,需要使用labelme这个包&#…

跨境电商,用指纹浏览器还是VPS?有何区别?

目前做跨境电商的小伙伴基本都是选择vps或者指纹浏览器来防关联。不过随着指纹浏览器的普及,越来越多人选择使用指纹浏览器,还没了解过指纹浏览器的小伙伴可能还在犹豫,vps和指纹浏览器到底哪个更好呢? Vps就是一个虚拟服务器&…

超级英雄云计算的技术之旅

超级英雄云计算的技术之旅 超级英雄云计算的技术之旅摘要引言可变参数:Java的超级工具可变参数的用途1. 编写通用工具方法2. 构建日志记录工具3. 构建数据验证工具 云计算在智能家居中的应用1. 远程控制智能设备2. 数据分析和智能决策3. 安全和隐私4. 智能家居应用开…

视频监控管理平台EasyCVR定制算法如何操作?包含哪些?

视频监控平台EasyCVR能在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理,在视频监控播放上,TSINGSEE青犀视频安防监控汇聚平台可支持1、4、9、16个画面窗口播放,可同时播放多路视频流,也能支持视…