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

相关阅读

静态时序分析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 第三条非典型的时序路径(最大路径) 

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

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

         

 

 

        

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Git误操作补救错失:恢复误删的本地分支、将某个提交从一个分支复制到另一个分支

一、恢复误删的本地分支 作为一枚强迫症,没用的分支总是喜欢及时删删删删掉删掉统统删掉,结果今天发现有些分支还是应该保留。 比如,①前段时间切了个分支用来专门做图表,但因为需求还没有最终确定,已经上线了测试服而…

计网《一》|互联网结构发展史|标准化工作|互联网组成|性能指标|计算机网络体系结构

计网《一》| 概述 计算机网络在信息时代的作用什么是互联网呢?互联网有什么用呢?为什么互联网能为用户提供许多服务 互联网基础结构发展的三个阶段第一个阶段:第二阶段:第三个阶段: 互联网标准化的工作互联网的组成边缘…

Observer 模式

文章目录 💡问题引入💡概念💡例子💡总结 💡问题引入 假设有一个在线商店系统,用户可以订阅商品的库存通知。当某个商品的库存数量发生变化时,系统会自动发送通知给所有订阅了该商品的用户。设计…

Android 13 WMS-动画流程

动画的类型如下 IntDef(flag true, prefix { "ANIMATION_TYPE_" }, value {ANIMATION_TYPE_NONE,ANIMATION_TYPE_APP_TRANSITION,ANIMATION_TYPE_SCREEN_ROTATION,ANIMATION_TYPE_DIMMER,ANIMATION_TYPE_RECENTS,ANIMATION_TYPE_WINDOW_ANIMATION,ANIMATION_TYPE_…

CentOS7.9基于Apache2.4+Php7.4+Mysql8.0架构部署Zabbix6.0LTS 亲测验证完美通过方案

前言: Zabbix 由 Alexei Vladishev 创建,目前由 Zabbix SIA 主导开发和支持。 Zabbix 是一个企业级的开源分布式监控解决方案。 Zabbix 是一款监控网络的众多参数以及服务器、虚拟机、应用程序、服务、数据库、网站、云等的健康和完整性的软件。 Zabbix 使用灵活的通知机制,…

云计算项目八:Harbor

部署企业私有镜像仓库Harbor 私有镜像仓库有许多优点: 节省网络带宽,针对于每个镜像不用每个人都去中央仓库上面去下载,只需要从私有仓库中下载即可提供镜像资源利用,针对于公司内部使用的镜像,推送到本地私有仓库中…

华硕AMD主板开启TPM2.0支持

目录 配置问题设置开启 Firmware TPM开启 Security Device Support保存设置 检查 配置 主板:TUF Gaming B550m-e Wifi   BIOS: 3402 问题 今天更新Win11,告诉我不支持 TPM 2.0,导致更新失败。   网上搜这个问题,基本只提供了…

selenium中ChromeDriver配置,一把过,并且教你伪装

最近正值毕业季,我之前不是写了个问卷星代码嘛,昨晚上有人凌晨1点加我,问我相关内容。 由于我之前C盘重装了一下,导致我很多东西空有其表,实际不能用,借此机会,向大家编写ChromeDriver配置&…

江苏某机场多座智慧公厕上线,黑科技满满打造标杆性机场智慧卫生间

在现代社会,智慧科技正在各个领域中得到广泛应用,机场也不例外。智慧机场是信息化程度、建设标准、功能要求最高的领域,智慧卫生间的建设要求同样是业界的最高标准。智慧公厕源头厂家广州中期科技有限公司,已经建设了浙江某机场、…

SICP解读指南:深度阅读 “计算机领域三巨头” 之一(文末送书)

🌈个人主页:聆风吟_ 🔥系列专栏:Linux实践室、网络奇遇记 🔖少年有梦不应止于心动,更要付诸行动。 文章目录 📋前言一. 书籍介绍1.1 SICP侧重点1.2 SICP章节介绍 二. 书籍推荐2.1 书籍介绍2.2 推…

边缘计算基础知识

目录 边缘计算简介任务卸载简介边缘存储系统 边缘计算简介 边缘计算是指利用靠近数据生成的网络边缘侧的设备(如移动设备、基站、边缘服务器、边缘云等)的计算能力和存储能力,使得数据和任务能够就近得到处理和执行。 一个典型的边缘计算系…

java集合(泛型数据结构)

1.泛型 1.1泛型概述 泛型的介绍 泛型是JDK5中引入的特性&#xff0c;它提供了编译时类型安全检测机制 泛型的好处 把运行时期的问题提前到了编译期间 避免了强制类型转换 泛型的定义格式 <类型>: 指定一种类型的格式.尖括号里面可以任意书写,一般只写一个字母.例如: …

这可能是最全的Web测试各个测试点,有这一篇就够了

前言 什么是Web测试&#xff1f; Web测试测试Web或Web应用程序的潜在错误。它是在上线前对基于网络的应用程序进行完整的测试。 Web测试检查 功能测试 易用性测试 接口测试 性能测试 安全测试 兼容性测试 1、功能测试 测试网页中的所有链接、数据库连接、网页中用于提交或从…

通过Dockerfile创建镜像

通过Dockerfile创建镜像 Docker 提供了一种更便捷的方式&#xff0c;叫作 Dockerfile docker build命令用于根据给定的Dockerfile构建Docker镜像。 docker build语法&#xff1a; # docker build [OPTIONS] <PATH | URL | -> 1. 常用选项说明--build-arg&#xff0c;设置…

数据结构:顺序表的奥秘

&#x1f389;个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名乐于分享在学习道路上收获的大二在校生&#x1f43b;‍❄个人主页&#x1f389;&#xff1a;GOTXX &#x1f43c;个人WeChat&#xff1a;ILXOXVJE&#x1f43c;本文由GOTXX原创&#xff0c;首发CSDN&a…

医药行业五大难题深度剖析:CRM解决方案助力突围

医疗行业关系着民生、经济乃至战备&#xff0c;是国民经济的重要组成部分。虽然近20年来我国医疗行业年均增长率维持在15%之上&#xff0c;但行业发展仍存在诸多问题。引进CRM管理系统可能是一个行之有效的解决方法。文中将为您整理医疗行业目前的五大挑战&#xff0c;以及CRM如…

跟无神学AI之Tensorflow笔记搭建网络八股

虽然Pytorch在论文中使用较多&#xff0c;但是像Alphafold在蛋白质结构预测的模型&#xff0c;仍然是用Tensorflow写成&#xff0c;遂近期在学其中的语法。 本系列来自慕课北大软微曹健老师的Tensorflow笔记&#xff0c;摘选其中重要部分。 1.导包 2.定义训练集测试集和数据…

专题1 - 双指针 - leetcode 15. 三数之和 - 中等难度

leetcode 15. 三数之和 - 点击直达 leetcode 15. 三数之和 中等难度 双指针1. 题目详情1. 原题链接2. 基础框架 2. 解题思路1. 题目分析2. 算法原理3. 时间复杂度 3. 代码实现4. 知识与收获 leetcode 15. 三数之和 中等难度 双指针 1. 题目详情 给你一个整数数组 nums &#…

代码第二十四天-寻找旋转排序数组中的最小值Ⅱ

寻找旋转排序数组中的最小值Ⅱ 题目要求 解题思路 二分法 当遇到两个left、right两个位置值相同时候&#xff0c;可以选择将 right right-1 代码 class Solution:def findMin(self, nums: List[int]) -> int:left,right0,len(nums)-1while left<right:mid(leftright…

Python编程作业五:面向对象编程

目录 一、类的定义和方法 二、图书管理系统 一、类的定义和方法 定义一个学生类&#xff08;Student&#xff09;&#xff0c;包括学号(id)、姓名(name)、出生日期(birthday)和分数(score)4个属性&#xff0c;其中出生日期是私有属性&#xff0c;不能被外界直接访问。该类应具…