Tcl语言:SDC约束命令create_clock详解

2023-11-05 02:28

本文主要是介绍Tcl语言:SDC约束命令create_clock详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

相关阅读

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


        在一个设计中创建一个时钟对象的SDC命令是create_clock。该指令的BNF范式(有关BNF范式,可以参考以往文章)为:

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

定义时钟周期

        -period选项用于定义时钟对象的周期,周期的单位由工艺库给出。下面的所有实例,默认是以纳秒(ns)为单位,且时钟周期的值必须有意义即大于0。虽然有set_units命令可以用来指定单位,但它不应该被主动使用,因为指定的单位不能与工艺库冲突。

标识时钟源

        在创建一个时钟对象时,需要指定它的时钟源对象,简单来说就是时钟对象生成的位置。源对象可以是,一个端口(port)或者是一个引脚(pin)。例如,对于图1,源对象可以是端口clk,与门U4的输出引脚Y,甚至U4的输入引脚B。

        一个时钟对象可能有多个时钟源,当然一个时钟源上也可能有多个时钟。对于图1,假设驱动电路的时钟信号的周期是10ns。则该时钟对象的创建方式可以是:

#使用端口作为时钟源
create_clock -period 10 [get_port clk]#使用输出引脚作为时钟源
create_clock -period 10 [get_port U4/Y]#使用输入引脚作为时钟源
create_clock -period 10 [get_port U4/B]

 图1 第一个例子 

命名时钟

        每一个时钟对象的创建都会给时钟命名,使用-name选项可以指定一个时钟名,当没有使用选项指定时,默认使用时钟源名作为时钟名。对于前面的例子,时钟名分别是clk、U4/Y、U4/B。在SDC中,时钟对象的名字至关重要,因为所有依赖于此时钟对象的SDC命令可以通过名字引用它,而无需使用其他信息。在有些情况下,-name选项是必须的,比如当使用了-add选项时,关于这点,将在后面进行介绍。

指定波形

        只指定时钟周期不足以完全描述一个时钟信号的特征,-waveform选项用于指定波形的形状。该选项的参数是一个正实数列表,依次表示出现时钟信号的第一个上升沿、下降沿、上升沿......出现的时间。例如,对于图2的波形,在t=5ns时出现上升沿,在t=10ns时出现下降沿。因此创建这个对象使用的命令是:

#假设在端口clk上创建时钟
create_clock -period 10 -waveform {5 10} [get_port clk]
#第二个上升沿出现在t=15ns时

图2 第二个例子

        需要注意的是waveform列表中的数有一些限制:列表中的时间必须递增、时间个数必须是偶数个,即只能按一对上下沿给出 、跨度(即第一个和最后一个时间的差)必须小于时钟周期,例如下面给出了几个不合法的waveform格式。

create_clock -period 10 -waveform {5 6 7} [get_port clk]
create_clock -period 10 -waveform {5 4 3 2} [get_port clk]
create_clock -period 10 -waveform {5 4 16 18} [get_port clk]

         类似的,在图3中,上升沿出现在t=0ns时,下降沿出现在t=7ns时,使用的命令为:

create_clock -period 10 -waveform {0 7} [get_port clk]

图3 第三个例子

        如果不指定-waveform选项,则时钟默认占空比50%,且在t=0时上升,在t=period/2 ns处下降。如下面的命令创建的时钟波形如图4所示。

create_clock -period 10  [get_port clk]#等价于下面的命令
create_clock -period 10 -waveform {0 5} [get_port clk]

图4 第四个例子 

        现在考虑如图5所示的波形,注意到当t=0ns时,目标波形的初值即为1,而默认的初值为0,这还不是最重要的,最重要的是4ns时的下降沿无法描述,因为必须从第一个上升沿开始指定,对于这种情况,我们只能使用如下命令,描述出第一个上升沿后的波形,具体如图6所示。

create_clock -period 10 -waveform {5 14} [get_port clk]

图5 第五个例子

图6 第六个例子 

        在一些应用中,比如像脉冲消隐,需要在触发器后指定的时间范围内删除数据,为了减少射频干扰。这时需要模拟复杂的波形,它可以使用有两个以上边沿的waveform列表来实现。考虑图7所示的周期为10ns的复杂时钟,它在一个周期中有两个脉冲,第一个脉冲在t=3ns时出现上升沿,在t=5ns时出现下降沿,第二个脉冲在t=8ns时出现上升沿,在t=9ns时出现下降沿,使用下面的命令创建该时钟:

create_clock -period 10 -waveform {3 5 8 9} [get_port clk]

图7 第七个例子 

同源多时钟

        许多设计需要在一个时钟源指定多个时钟(注意区分这和一个时钟有多个时钟源的差别),从而满足多I/O速度协议的需求。考虑图8所示的电路单元。

        假设通过一个多路选择器从两个时钟中选择一个驱动,而这两个时钟特征不同,为了模拟这种情况,设计者可能需要在相同的设计源对象中创建时钟。这可以使用以下的命令:

#在同一个源对象上定义时钟,需要使用-add选项并主动命名,否则后定义的时钟会覆盖之前定义时钟
create_clock -name clk1 -period 10 [get_pin U4/Y]
create_clock -name clk2 -period 10 [get_pin U4/Y] -add#这种在两个端口定义时钟的方式也可以,因为时钟信号可以穿过组合逻辑传播
create_clock -name clk1 -period 10 [get_port clk1]
create_clock -name clk2 -period 10 [get_port clk2] 

图8 有两个时钟驱动的电路单元 

        在同一个对象源定义多个时钟,可以让这两个时钟都参与进综合与静态时序分析中,如图9所示的报告中就包含了两个时序组。可以使用report_transitive_fanout -clock_tree -nosplit 命令报告设计中的时钟树情况,如图10所示。

图9 两个时钟时序报告

图10 报告时钟树情况

        但是需要注意的是,如果不是将两个时钟定义在一个源对象上,而是将一个时钟定义在另一个时钟的传播路径上,则这个时钟会覆盖另一个时钟,例如使用如下的命令后得到的时钟树如图11所示,可以看到clk1和clk2两个时钟源并没有传播至寄存器的时钟端。

create_clock -name clk1 -period 10 [get_port clk1]
create_clock -name clk2 -period 10 [get_port clk2] 
#覆盖时钟clk1和clk2,因为clk3所处的源对象在clk1和clk2的传播路径中
create_clock -name clk3 -period 20 [get_pin U4/Y]

图11 多个时钟的覆盖 

注释时钟

        从SDC1.9开始,包含create_clock在内的一些SDC命令增加了一个新的选项,-comment选项用一个字符串作为属性,用于显示时钟信号的文档信息,以帮助理解、复用、增强SDC的可移植性,并不影响综合与时序。例如:

create_clock -period 10 -name clk [get_port clk]\-comment "Clock for USB block generated by PLL"

虚拟时钟

        到目前为止,我们谈到的所有时钟信号都是有源对象的,换句话说,都是有时钟定义点的。然而在某些情况下,用户需要约束电路单元中的一些端口和引脚,这些端口和引脚在设计内并没有发射时钟与之对应,为了描述这些片外的时钟,设计者需要用到虚拟时钟的概念。虚拟时钟是指物理上不存在的时钟,没有定义时钟源,如下所示。

create_clock -period 10 -name v_clk -waveform {0 5}

这篇关于Tcl语言:SDC约束命令create_clock详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

Spring @RequestMapping 注解及使用技巧详解

《Spring@RequestMapping注解及使用技巧详解》@RequestMapping是SpringMVC中定义请求映射规则的核心注解,用于将HTTP请求映射到Controller处理方法... 目录一、核心作用二、关键参数说明三、快捷组合注解四、动态路径参数(@PathVariable)五、匹配请

Java -jar命令如何运行外部依赖JAR包

《Java-jar命令如何运行外部依赖JAR包》在Java应用部署中,java-jar命令是启动可执行JAR包的标准方式,但当应用需要依赖外部JAR文件时,直接使用java-jar会面临类加载困... 目录引言:外部依赖JAR的必要性一、问题本质:类加载机制的限制1. Java -jar的默认行为2. 类加

git stash命令基本用法详解

《gitstash命令基本用法详解》gitstash是Git中一个非常有用的命令,它可以临时保存当前工作区的修改,让你可以切换到其他分支或者处理其他任务,而不需要提交这些还未完成的修改,这篇文章主要... 目录一、基本用法1. 保存当前修改(包括暂存区和工作区的内容)2. 查看保存了哪些 stash3. 恢

java String.join()方法实例详解

《javaString.join()方法实例详解》String.join()是Java提供的一个实用方法,用于将多个字符串按照指定的分隔符连接成一个字符串,这一方法是Java8中引入的,极大地简化了... 目录bVARxMJava String.join() 方法详解1. 方法定义2. 基本用法2.1 拼接

Java中的record使用详解

《Java中的record使用详解》record是Java14引入的一种新语法(在Java16中成为正式功能),用于定义不可变的数据类,这篇文章给大家介绍Java中的record相关知识,感兴趣的朋友... 目录1. 什么是 record?2. 基本语法3. record 的核心特性4. 使用场景5. 自定

MyBatis编写嵌套子查询的动态SQL实践详解

《MyBatis编写嵌套子查询的动态SQL实践详解》在Java生态中,MyBatis作为一款优秀的ORM框架,广泛应用于数据库操作,本文将深入探讨如何在MyBatis中编写嵌套子查询的动态SQL,并结... 目录一、Myhttp://www.chinasem.cnBATis动态SQL的核心优势1. 灵活性与可

Python struct.unpack() 用法及常见错误详解

《Pythonstruct.unpack()用法及常见错误详解》struct.unpack()是Python中用于将二进制数据(字节序列)解析为Python数据类型的函数,通常与struct.pa... 目录一、函数语法二、格式字符串详解三、使用示例示例 1:解析整数和浮点数示例 2:解析字符串示例 3:解

java -jar命令运行 jar包时运行外部依赖jar包的场景分析

《java-jar命令运行jar包时运行外部依赖jar包的场景分析》:本文主要介绍java-jar命令运行jar包时运行外部依赖jar包的场景分析,本文给大家介绍的非常详细,对大家的学习或工作... 目录Java -jar命令运行 jar包时如何运行外部依赖jar包场景:解决:方法一、启动参数添加: -Xb

C/C++ chrono简单使用场景示例详解

《C/C++chrono简单使用场景示例详解》:本文主要介绍C/C++chrono简单使用场景示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友... 目录chrono使用场景举例1 输出格式化字符串chrono使用场景China编程举例1 输出格式化字符串示

MySQL 表的内外连接案例详解

《MySQL表的内外连接案例详解》本文给大家介绍MySQL表的内外连接,结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录表的内外连接(重点)内连接外连接表的内外连接(重点)内连接内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选,我