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

相关阅读

静态时序分析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,一经查实,立即删除!

相关文章

深度Q网络(Deep Q-Network, DQN)

深度Q网络(Deep Q-Network, DQN)是一种结合了深度学习和强化学习的方法,用于解决序列决策问题。它是一种端到端的学习方法,可以直接从原始输入(如像素)中学习如何映射到动作值(即策略),而不需要任何手工特征工程。DQN最初由DeepMind在2015年提出,并在多款Atari 2600游…

代码随想录算法训练营day40|343. 整数拆分、96.不同的二叉搜索树

343. 整数拆分 代码随想录 视频讲解:动态规划,本题关键在于理解递推公式!| LeetCode:343. 整数拆分_哔哩哔哩_bilibili 1.确定dp[i]的含义:正整数i拆分得到的最大乘积 2.确定递推公式:dp[i] max(dp[i], …

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。 下载插件…

经典算法之桶排序

桶排序(Bucket Sort)是一种将待排序数据分到几个有序的桶里,每个桶里的数据再分别排序的排序算法。桶排序适用于数据分布均匀且范围有限的场景。 概念 桶排序的工作原理是将输入数据分布到有限数量的桶里。每个桶再个别排序(有可能使用其他排序算法)。桶排序不需要比较数…

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

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

什么是抖音小店商品卡?商品卡流量怎么做?一篇文章解答清楚!

大家好,我是电商糖果 抖音小店商品卡这个词还是2023年才开始出现的,这对很多不太了解小店的朋友来说,确实是一个新名词。 去年3月份抖音推出了“商品卡免佣”,就是因为这个政策,让商品卡在互联网掀起讨论度。 而今年…

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

🌈 博客个人主页: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扩展卡的输出控制不了。经排查出发现轴卡在初始化时只连接了…

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

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

ROS篇——Debian12通过源码安装ros-noetic

一、先配置sources.list Debian篇——Debian12的sources.list文件配置 二、基本环境部署安装(安装时提示找不到的库,需要修改一下版本 ,安装你能找得到的版本) sudo apt-get install git sudo apt-get install cmake sudo apt-g…

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 &…

2024-3-7-网络编程小项目

ser.c #include <myhead.h> #define SER_IP "10.168.1.111" //服务器IP #define SER_PORT 8888 //服务器端口号 struct User {char username[20];struct sockaddr_in cin; }; int main(int argc, const char *argv[]) {struct User ur[1024];//1、创建…

Hi3861编译问题:SDK路径过长

Hi3861编译问题&#xff1a; 这个因为路径过程&#xff0c;把sdk直接放到根目录下就可以编译过了。 也遇到过海思其他平台在vscode下编译路径过长导致编译失败。 [DevTools] D:\DevEcoProjects\hi3861_hdu_iot_application\src>hb build [OHOS INFO] ohos_build_compiler: …

LV15 day5 字符设备驱动读写操作实现

一、读操作实现 ssize_t xxx_read(struct file *filp, char __user *pbuf, size_t count, loff_t *ppos); 完成功能&#xff1a;读取设备产生的数据 参数&#xff1a; filp&#xff1a;指向open产生的struct file类型的对象&#xff0c;表示本次read对应的那次open pbuf&#…