静态时序分析:典型与非典型时序路径的约束详解(一)

相关阅读

静态时序分析icon-default.png?t=N7T8https://blog.csdn.net/weixin_45791458/category_12567571.html?spm=1001.2014.3001.5482


        时序路径是静态时序分析中的一个重要概念,了解时序路径能帮助设计者更好地编写SDC脚本,本文旨在详细介绍时序路径相关内容。

        首先给出时序路径的定义:时序路径是由时序弧构成的数据路径,静态时序分析会分别对每条有约束的时序路径进行时序检查(例如建立时间检查、保持时间检查、移除时间检查、恢复时间检查等)。

        时序路径可以是典型的,也可以是非典型的;时序路径可以是有约束的,也可以是未约束的。

典型的时序路径

        典型时序路径的起点是输入端口(包括输入输出双向端口)或触发器的时钟引脚;典型时序路径的终点是输出端口(包括输入输出双向端口)或触发器的数据引脚(包括复位引脚)。

        下面将举例进行说明,图1是一个简单电路的示意图,它由两个D触发器组成。

图1 一个简单的例子

        按照上面的定义,此时一共存在五条典型的时序路径,分别是:

  1. 输入端口data_in到触发器t_reg的数据引脚D。
  2. 触发器t_reg的时钟引脚CK到触发器data_out_reg的数据引脚D。
  3. 触发器data_out_reg的时钟引脚CK到输出端口data_out。
  4. 输入端口rst_n到触发器t_reg的复位引脚RN。
  5. 输入端口rst_n到触发器data_out_reg的复位引脚RN。 

        可以使用下面的report_timing命令,分别给出这五条时序路径的时序报告(仅给出最大路径max时序报告),如图1到图5所示。

report_timing -from [get_port data_in] -to [get_pin t_reg/D]

图1 第一条时序路径的时序报告

report_timing -from [get_pin t_reg/CK] -to [get_pin data_out_reg/D]

图2 第二条时序路径的时序报告

report_timing -from [get_pin data_out_reg/CK] -to [get_port data_out]

图3 第三条时序路径的时序报告

        下面两条终点是异步复位信号的时序路径在使用report_timing命令报告前,需要先设置DC中的环境变量,因为默认情况下,DC会将触发器时钟引脚CK到复位引脚RN的时序弧中断。

enable_recovery_removal_arcs            默认值false
timing_disable_recovery_removal_checks  默认值true/*它们永远保持相斥,可以将enable_recovery_removal_arcs设置为true,也可以将
timing_disable_recovery_removal_checks设置为fasle,DC会自动设置另一个变量。*/set enable_recovery_removal_arcs           true
set timing_disable_recovery_removal_checks false //两者取一即可
report_timing -from [get_port rst_n] -to [get_pin t_reg/RN]

 

图4 第四条时序路径的时序报告 

report_timing -from [get_port rst_n] -to [get_pin data_out_reg/RN]

图5 第五条时序路径的时序报告

        从图1到图5中的Startpoint和Endpoint可以清晰地看出时序路径的起点和终点,图中并未将触发器的时钟引脚、数据(复位)引脚直接写作起点和终点,而是将整个触发器作为起点和终点,并且括号内还说明了触发器的类型,这代表触发器拥有从时钟引脚到数据输入/输出端的时序弧。在后面的非典型时序路径中,我们会看到数据(复位)引脚直接写作终点的情况,这反而是少见的。

        从图中我们可以看到,这些时序路径都属于none路径组,这是因为它们未约束的。下面我们使用命令约束这几条时序路径,如图6到图10所示。

create_clock -period 10 [get_port clk_1]
create_clock -period 15 [get_port clk_2]    
create_clock -period 8  -name clk_v         //创建虚拟时钟,为了约束复位端口set_input_delay 0.5 -clock [get_clock clk_1] [get_port data_in]  //输入延迟约束
set_input_delay 0.5 -clock [get_clock clk_1] [get_port data_in]  //输入延迟约束
set_input_delay 0.5 -clock [get_clock clk_v] [get_port rst_n]    //输入延迟约束set_output_delay 0.5 -clock [get_clock clk_2] [get_port data_out] //输出延迟约束
report_timing -from [get_port data_in] -to [get_pin t_reg/D]

图6 第一条时序路径的时序报告(建立时间)

report_timing -from [get_pin t_reg/CK] -to [get_pin data_out_reg/D]

图7 第二条时序路径的时序报告(建立时间)

report_timing -from [get_pin data_out_reg/CK] -to [get_port data_out]

图8 第三条时序路径的时序报告(建立时间)

report_timing -from [get_port rst_n] -to [get_pin t_reg/RN]

图9 第四条时序路径的时序报告(恢复时间)

report_timing -from [get_port rst_n] -to [get_pin data_out_reg/RN]

图10 第五条时序路径的时序报告(恢复时间)

        从图6到图9中可以看出,时序路径起点和终点的括号内的clock信息表示端口、触发器(引脚)已经被时钟约束了,一般而言(指典型时序路径)只有起点和终点都被时钟约束了,才代表这条时序路径才可以进行时序分析(还有一个条件:该路径不能被设置为伪路径),此时每条时序路径属于一个时序组,从图6到图9中可以看出其按照约束其终点的时钟分组,即时序路径1、4属于时序组clk_1,时序路径2、3、5属于时序组clk_2。

非典型的时序路径

        非典型时序路径只有在使用几条特定的约束命令后可能出现,包括set_disable_timing命令、set_min_delay命令和set_max_delay命令,这些命令会导致时序路径分割,一般情况不会遇见。

        非典型路径的起点可以是端口和任意单元的引脚,只要能保证有相应的时序弧。下面将举例进行说明,图11是一个简单电路的示意图,它和图1很相似,只多了一个反相器,因此也拥有相似的五条时序路径。

图11 另一个简单的例子

        还是使用相同的命令,为设计添加约束。

create_clock -period 10 [get_port clk_1]
create_clock -period 15 [get_port clk_2]    
create_clock -period 8  -name clk_v         //创建虚拟时钟,为了约束复位端口set_input_delay 0.5 -clock [get_clock clk_1] [get_port data_in]  //输入延迟约束
set_input_delay 0.5 -clock [get_clock clk_1] [get_port data_in]  //输入延迟约束
set_input_delay 0.5 -clock [get_clock clk_v] [get_port rst_n]    //输入延迟约束set_output_delay 0.5 -clock [get_clock clk_2] [get_port data_out] //输出延迟约束

        随后我们使用set_max_delay命令,指定从触发器t_reg的时钟引脚CK到反相器INV的输入引脚A的最大延迟。这会导致路径分割,原本从触发器t_reg的时钟引脚CK到触发器data_out_reg的数据引脚D的时序路径被分割为两条:一条从触发器t_reg的时钟引脚CK到反相器INV的输入引脚A;另一条从反相器INV的输入引脚A到触发器data_out_reg的数据引脚D,如图12和图13所示。

set_max_delay 0.5 -from [get_pin t_reg/CK] -to [get_pin INV/A]
report_timing -from [get_pin t_reg/CK] -to [get_pin INV/A]

图12 第一条非典型的时序路径(最大延迟)

report_timing -from [get_pin INV/A] -to [get_pin data_out_reg/D]

图13 第二条非典型的时序路径

        尽管已经提前介绍,但这两份时序报告仍可能会让人产生很多疑惑,下面详细说明。图12中时序路径的终点和图13中时序路径的起点分别是反相器的输入、输出引脚,这是时序分割所带来的,括号内的internal path也说明了着这是一个内部的起、终点,它们没有被时钟约束。

        第一条时序路径即使终点没有时钟约束,但依旧进行了最大延迟的时序分析,这是因为第一条时序路径就是set_max_delay命令所指定的路径,这种终点没有时钟约束的时序路径被归为时序组default。另外要注意的是,可以为第一条时序路径的终点添加输出延迟约束(无论是否关联时钟),如关联了时钟,则时序组会变成关联时钟组,图14和图15分别展示了这两种情况。

set_output_delay 0.01 [get_pin INV/A]  //输出延迟约束(无关联时钟)
report_timing -from [get_pin t_reg/CK] -to [get_pin INV/A]

图12 第一条非典型的时序路径(输出延迟约束(无关联时钟))

set_output_delay 0.02 -clock [get_clock clk_2] [get_pin INV/A] //输出延迟约束(有关联时钟)
report_timing -from [get_pin t_reg/CK] -to [get_pin INV/A]

图13 第一条非典型的时序路径(输出延迟约束(有关联时钟))

        第二条时序路径的起点没有时钟约束,但无法进行时序分析,因为第二条时序路径不是set_max_delay命令所指定的路径,即使终点已经被时钟约束,此时要为第二条时序路径的起点添加有关联时钟的输入延迟约束。

set_input_delay 0.1 -clock [get_clock clk_2] [get_pin INV/A] //输入延迟约束(有关联时钟)
report_timing -from [get_pin INV/A] -to [get_pin data_out_reg/D]

图14 第二条非典型的时序路径(输出延迟约束(有关联时钟))

        下面来看最后一个例子巩固一下,非典型时序路径的相关知识。还是以图11为例,为了方便重绘为图15。

图15 另一个简单的例子

        这次我们使用set_max_delay命令,指定从反相器INV的输入引脚A到反相器INV的输出引脚Y的最大延迟。路径分割后,原本从触发器t_reg的时钟引脚CK到触发器data_out_reg的数据引脚D的时序路径被分割为三条:一条从触发器t_reg的时钟引脚CK到反相器INV的输入引脚A;一条从反相器INV的输入引脚A到反相器INV的输出引脚Y;一条从反相器INV的输出引脚Y到触发器data_out_reg的数据引脚D。如图16、图17和图18所示。

set_max_delay 0.5 -from [get_pin INV/A] -to [get_pin INV/Y]
report_timing -from [get_pin t_reg/CK] -to [get_pin INV/A]

图16 第一条非典型的时序路径

report_timing -from [get_pin INV/A] -to [get_pin INV/Y]

图17 第二条非典型的时序路径(最大路径)

 

report_timing -from [get_pin INV/Y] -to [get_pin data_out_reg/D]

图18 第三条非典型的时序路径(最大路径) 

        可上一个例子一样,可以为第一条非典型的时序路径的终点添加有关联时钟的输出延迟约束。可以为第二条非典型的时序路径的起点添加有(无)关联时钟的输入延迟约束、终点添加有(无)关联时钟的输出延迟约束。可以为第三条非典型的时序路径的起点添加有关联时钟的输入延迟约束。

        因为篇幅问题,本文的第一部分到此结束,后面随缘更。

         

 

 

        

 

 

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

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

相关文章

Unity角色动画变成半跪\半蹲\下沉 的问题

导入的人物动画发生如图形态 解决方法:找到动画模型,Rig - AnimationType 改为Humanoid ,然后Apply一下

高效加载大文件(pandas+dask)

一、仅用pd加载大文件(iterator、chunksize) 要使用Pandas进行高效加载超大文件,我们通常会利用其内置的分块(chunk)处理功能。不过,请注意,Pandas本身并不支持多线程读取文件;它更倾向于单线程中进行块处理…

千云GPS平台 -在k8s上部署Mysql

构建xtrabackup docker build -t registry.cn-zhangjiakou.aliyuncs.com/qy566/xtrabackup:8.0.34 --rm .部署进度 你可以通过运行以下命令查看启动进度: kubectl get pods -l app=mysql -n mysql-db --watch 测试mysql 发送客户端请求写入数据kubectl run mysql-client --…

解决cs不能生成Linux木马的问题

要解决的问题:众所周知,msf上面的shell或者是其他的shell想反弹给cs默认情况下是只支持windows的,因为cs的监听模块默认没有linux的,但是有些主机就是用linux搭建的,这可怎么办呢。就要用到一个插件CrossC2。 下载插件…

实操keepalived(高可用)+Nginx(四层代理+七层代理),实现高可用、负载均衡以及动静分离

一 vrrp技术 VRRP 相关术语 VRRP能够在不改变组网的情况下,将多台路由器虚拟成一个虚拟路由器,i通过配置虚拟路由器的IP地址为默认网关,实现网关的备份。 协议版本: VRRPv2 (常用) 和VRRPv3:0 VRRPv2仅适用于IPv4网络,VRRPv3适用…

[项目设计] 从零实现的高并发内存池(五)

🌈 博客个人主页:Chris在Coding 🎥 本文所属专栏:[高并发内存池] ❤️ 前置学习专栏:[Linux学习] ⏰ 我们仍在旅途 ​ 目录 8 使用定长内存池脱离new 9. 释放对象时不传大小 10.性能优化 10.1…

[LeetCode][239]【学习日记】滑动窗口最大值——O(n)单调队列

题目 239. 滑动窗口最大值 难度:困难相关标签相关企业提示 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回滑动窗口中的最大值。 示例 1…

雷赛控制卡的扩展IO连接

雷赛控制卡的扩展IO点无法控制问题处理 现象 因设备的上IO点较多,所以使用了多个雷赛32点位的IO扩展卡。上位机程序在控制输出IO时发现主模块IO和第一个扩展IO的输出可以控制。但第二个IO扩展卡和第三个IO扩展卡的输出控制不了。经排查出发现轴卡在初始化时只连接了…

校园小情书微信小程序,社区小程序前后端开源,校园表白墙交友小程序

功能 表白墙卖舍友步数旅行步数排行榜情侣脸漫画脸个人主页私信站内消息今日话题评论点赞收藏 效果图

2024年腾讯云学生服务器优惠活动「云+校园」政策解读

2024年腾讯云学生服务器优惠活动「云校园」,学生服务器优惠价格:轻量应用服务器2核2G学生价30元3个月、58元6个月、112元一年,轻量应用服务器4核8G配置191.1元3个月、352.8元6个月、646.8元一年,CVM云服务器2核4G配置842.4元一年&…

几何工具的使用

Geometry - Creation 创建几何 CogCreateCircleTool:创建圆CogCreateEllipseTool:创建椭圆CogCreateLineBisectPointsTool:带有两个点的平行线CogCreateLineParallelTool:在某一点创建某条线的平行线CogCreateLinePerpendicularTool:在某一点创建某条线…

LT6813/ADBMS1818底层驱动---均衡控制

1、LT6813采用内部均衡的原理 2、平衡控制结构体 根据数据库中读取的控制值设置平衡。要为单元设置平衡,必须将相应的位写入配置寄存器中。LTC 驱动程序仅执行数据库中 BMS 写入的数据。 参数 ltc_stateLTC 状态机的状态pSpi接口指向 SPI 配置的指针pTxBuff &…

数据结构(八)——初识单链表

😀前言 单链表是数据结构中最基本的一种链表结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。单链表具有灵活性和动态性,可以根据需要插入、删除和查找元素,适用于各种场景和问题的解决。 在本篇文章…

day7-网络编程

1>基于UDP的网络聊天室 Ser.c #include <myhead.h> #define SER_IP "10.211.55.9" // 服务器IP #define SER_PORT 9999struct user {char usrName[20];struct sockaddr_in cin; }; int main(int argc, char const *argv[]) {// 1.创建用于监听的套接字int…

MyBatis-Flex学习总结

写在前面的话 MyBatis-Flex 是一个优雅的 MyBatis 增强框架&#xff0c;它非常轻量、同时拥有极高的性能与灵活性。我们可以轻松的使用 Mybaits-Flex 链接任何数据库&#xff0c;其内置的 QueryWrapper 帮助我们极大的减少了 SQL 编写的工作的同时&#xff0c;减少出错的可能性…

鸿蒙开发岗成春招最大黑马,“金三银四”应届生如何突围?

一年一度春招时间到&#xff0c;技术岗位已成为众多人才竞相追求的“职业高地”&#xff0c;也是未来职业发展的重要方向之一。鸿蒙人才在春招市场上成为“香饽饽”&#xff0c;与往年不同的是&#xff0c;许多应届生放弃考公执念向程序员进攻&#xff0c;这一现象背后蕴含着深…

腾讯云服务器和阿里云服务器价格测评_2024年费用大PK

2024年阿里云服务器和腾讯云服务器价格战已经打响&#xff0c;阿里云服务器优惠61元一年起&#xff0c;腾讯云服务器61元一年&#xff0c;2核2G3M、2核4G、4核8G、4核16G、8核16G、16核32G、16核64G等配置价格对比&#xff0c;阿腾云atengyun.com整理阿里云和腾讯云服务器详细配…

day52(vueJS)json-server模拟数据

json-server介绍&#xff1a;&#xff1a;&#xff1a;JSON Server 是一个用于快速搭建 REST API 的工具&#xff0c;它可以帮助我们在开发过程中快速模拟 一个后端 API 服务器&#xff0c;方便前端开发人员进行接口调试和开发。使用 JSON Server&#xff0c;你可以通过创建一个…

第三百八十七回

文章目录 1. 概念介绍2. 使用方法3. 示例代码 我们在上一章回中介绍了DateRangePickerDialog Widget相关的内容,本章回中将介绍Radio Widget.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在这里说的Radio Widget是指单选按钮&#xff0c;没有选中时是圆形…

代码随想录算法训练营第二天|977、有序数组的平方

977. 有序数组的平方 已解答 简单 相关标签 相关企业 给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排序。 示例 1&#xff1a; 输入&#xff1a;nums [-4,-1,0,3,10] 输出&#xff1a;[0,1,9,16,…