静态时序分析Static Timing Analysis1——STA概述、标准工艺库、时钟、IO约束的建立

news2024/11/22 20:16:34

文章目录

  • 前言
  • 一、静态时序分析概述
    • 1、时序路径分类
    • 2、STA和动态仿真比较
    • 3、PVT
    • 4、不同时钟域
    • 5、建立时间、保持时间
    • 6、恢复时间、移除时间
  • 二、标准工艺库
    • 1、标准单元延时模型
    • 2、slew derate
  • 三、STA约束的建立
    • 1、时钟约束
      • 1.1 时钟定义
      • 1.2 时钟不确定性
      • 1.3 时钟延时
      • 1.4 生成时钟
    • 2、输入输出路径
      • 2.1 输入延时
      • 2.2 输出延时
      • 2.3 输入输出延时同时存在
    • 3、时序路径分组
    • 4、外部属性建模
    • 5、设计规则检查DRC
    • 6、虚拟时钟
    • 7、完善时序分析
  • 自测题


前言

2023.4.10 天气晴
2023.4.11


在这里插入图片描述

STA存在在逻辑综合后的每个步骤,非常重要,且STA只针对同步电路,异步电路的时序无法分析。

一、静态时序分析概述

概念:遍历电路存在的所有时序路径(测试覆盖率基本达到100%),根据给定工作条件(PVT)下的时序库.lib文件计算信号在这些路径上的传播延时检查信号的建立和保持时间是否满足约束要求,根据最大路径延时和最小路径延时找出违背时序约束的错误。

本质满足每个寄存器的建立时间和保持时间
关键路径:时序路径中最长的一条,决定系统的最快工作速度

1、时序路径分类

内部会划分为不同的时序路径,去分析每条路径的建立时间和保持时间
两种时序起点:clock pininput port
两种时序终点:data input pinoutput port

路径分类:

  • 输入端口到内部寄存器 pin2reg(input-D)
  • 内部寄存器之间 reg2reg(clk-D)
  • 内部寄存器到输出端口 reg2pin(clk-output)
  • 输入端口到输出端口之间 pin2pin(input-output)

前三类要确保数据信号在时钟锁存沿的建立时间和保持时间内是稳定不变的。
最后一个路径的信号传输通常不通过时钟,一般直接约束pin2pin的延时范围
在这里插入图片描述

2、STA和动态仿真比较

  • STA:不需要输入激励就可以穷尽所有路径,且运行速度快,占用内存较少。不仅对芯片的时序进行检查,同时根据时序结构来进行优化设计。
  • 动态仿真:需要输入激励,难以穷尽所有可能,覆盖率难以达到100%,且运行速度较慢,占用内存较多。
  • 动态仿真和STA是互补的关系,有些没有验证到的功能点,需要STA来保证触发器都能正确进行采样。假设动态仿真验证到了所有功能点,就不需要进行STA了(触发器都确保已经正常工作)

在这里插入图片描述

3、PVT

PVTProcess工艺、Voltage电压、Temperature温度
三种模式:Typical(平均值)、Fast、Slow(晶体管驱动电流是最小值)
五种情况:TT、FF、SS、FS、SF(第一个代表NMOS,第二个代表PMOS)

分析建立时间:高温+低压+工艺慢速(延时最大)ss
分析保持时间:低温+高压+工艺快速(最好情况)ff

在这里插入图片描述

4、不同时钟域

大多数SOC都是全局异步、局部同步,STA只对同步电路进行分析。

告诉分析器不去分析这些异步的路径,即伪路径约束
在这里插入图片描述

set_false_path -from [get_clocks USBCLK] -to [get_clocks MEMCLK]

在这里插入图片描述

5、建立时间、保持时间

  • 建立时间Tsu (set up time):时钟上升沿来临之前,数据保持稳定的时间,使得触发器能够锁存住数据
  • 保持时间Th (hold time):时钟上升沿来临之后,数据保持稳定的时间
  • 输出延迟时间Tco (clock output delay):clk触发到输出信号有效之间的最大延迟时间
    在这里插入图片描述
    判断violation:看实际的数据的建立时间和保持时间要大于clk的Tsu和Th

6、恢复时间、移除时间

主要针对控制信号来说:

  • Trecovery(恢复时间):控制信号在下一个时钟沿到来之前,变无效的最小时间长度

  • Tremoval(移除时间):在“有效时钟沿”之后变无效的最小时间长度

  • Tmet:亚稳态振荡时间

  • 当异步复位信号的撤销时间在Trecovery(恢复时间)和Tremoval(移除时间)之间时,输出结果就会出现亚稳态,造成复位失败

  • 释放沿必须在时钟沿前面提前recovery time释放,或者在时钟沿后removal time之后释放

在这里插入图片描述

二、标准工艺库

lib、db(打不开)格式,内容是相同的

下面包含名称、单位、PVT参数等内容
在这里插入图片描述
在这里插入图片描述

1、标准单元延时模型

  • 线性模型:D = D0 + D1 * S + D2 * C,其中D0D1D2为常数,S为输入转换时间,C为输出负载电容
  • 非线性模型:大多数情况都是非线性的,一般通过查找表呈现出来

(下面描述的是INP1引脚到OUT引脚的上升沿和下降沿延时)

在这里插入图片描述

如果延时值不在查找表里面,可以通过高斯消元法得到
在这里插入图片描述

2、slew derate

压摆值(slew)基于的是在库中指定的测量阈值点,大多数上一代的库(0.25um或更旧的库)都使用10%和90%作为压摆(或称过渡时间)的测量阈值点。

压摆阈值点的选择对应的是波形的线性部分。
压摆测量阈值点为30%和70%且压摆降额系数为0.5,等效于测量阈值点为10%和90%。

通俗的说,就是判断波形翻转的电平阈值,转换时间的阈值是多少。
在这里插入图片描述

这个库原本表征的是0-100%,但实际使用测出来的是20-80%
在这里插入图片描述

三、STA约束的建立

包括时钟、IO以及一些特殊的约束指令,这些最终都会写到SDC的脚本里面。
在这里插入图片描述

1、时钟约束

1.1 时钟定义

  • 时钟源Clock source,可以是设计的端口,也可以是设计内部某个单元的引脚(通常是时钟生成逻辑的一部分)(很重要,用来确定路径)
  • 周期Period,时钟的周期
  • 占空比Duty,高电平在整个周期中的比例。
  • 翻转时间Edge Times上升沿和下降沿翻转时间
create_clock -name SYSCLK -period 20 -waveform {0 5} [get_ports SCLK]  //时钟名字SYCLK,周期20ns,0是上升沿,5是下降沿,时钟端口SCLK

在这里插入图片描述

1.2 时钟不确定性

时钟不确定性来源于:时钟偏移时钟抖动时钟延时

对setup和hold time添加时钟不确定性的约束,使得时序约束更加严格,使得输入数据应该到达更早,时钟沿后应该保持更久的时间。

set_clock_uncertainty -setup 0.2 [get_clocks CLK_CONFIG]
set_clock_uncertainty -hold 0.05 [get_clocks CLK_CONFIG]

set_clock_uncertainty -from SYS_CLK -to CFC_CLK -setup 0.1

在这里插入图片描述

在这里插入图片描述

1.3 时钟延时

时钟源延时 + 时钟网络延时

  • 时钟树建立之后,源延迟仍然保留;
  • 时钟树建立之前,网络延迟的声明是一个估计值,在时钟树生成之后,就会使用实际的网络延迟,定义的网络延迟就失效。(时钟树综合使得时钟网络延时值更加准确)
set_clock_latency 0.8 [get_clocks CLK_CONFIG]   //时钟网络延时
set_clock_latency 1.9 -source [get_clocks CLK_CONFIG]  //时钟源延时
set_clock_latency 1.9 -source -min [get_clocks CLK_CONFIG]   //时钟源延时,最大值和最小值,用来去分析建立时间和保持时间
set_clock_latency 1.9 -source -max [get_clocks CLK_CONFIG]

在这里插入图片描述

1.4 生成时钟

由主时钟分频或者倍频得到的新时钟,就是生成时钟

  • 生成时钟的定义很有必要,需要告诉分析器,在分频(倍频)逻辑的输出端时钟的周期已经改变,并且时钟的周期也需要声明。
  • 生成时钟和主时钟是相同相位的,是同步时钟
  • 生成时钟也可以定义为主时钟,但是这样就是两个时钟域了,不利于静态时序分析。
create_clock -name CLKP 10 [get_pins UPLL0/CLKOUT]

create_generated_clock -name CLKPDIV2 -source UPLL0/CLKOUT -divide_by 2 [get_pins UFF0/Q]   //生成的时钟要指定source,2表示生成时钟是源时钟周期的两倍

在这里插入图片描述

生成时钟的source latency:定义为主时钟定义点到生成时钟定义点之间的延时
寄存器clk端的时钟延时:主时钟的source latency + 生成时钟的source latency + 生成时钟的network latency
在这里插入图片描述

下图是两个时钟逻辑相与生成一个新的时钟,可以看到新的时钟和源时钟之间没有太多的关系,此时建议定义一个新的时钟。
在这里插入图片描述

create_clock -name SYS_CLK -period 4 -waveform {0 2} [get_pins UFFSYS/Q]
create_clock -name CORE_CLK -period 12 -waveform {0 4} [get_pins UFFCORE/Q]
create_clock -name MAIN_CLK -period 12 -waveform {0 2} [get_pins UAND2/Z]

2、输入输出路径

2.1 输入延时

这里描述的是INP1端口的输入延时,Tclk2q+Tc1(时钟沿有效到数据送到输入端口的时间
起点是CLKA,终点是输入端口INP1

set Tclk2q 0.9
set Tc1 0.6
set_input_delay -clock CLKA -max [expr Tclk2q + Tc1] [get_ports INP1]  //指定时钟域,这里变量的引用是否需要加$,视频里面没有加

在这里插入图片描述

也可以定义输入延时的最大值和最小值

create_clock -period 15 -waveform {5 12} [get_ports CLKP]
set_input_delay -clock CLKP -max 6.7 [get_ports INPA]   //第一个时钟沿有效到DUA输入端口的时间,clk2q+Comb
set_input_delay -clock CLKP -min 3.0 [get_ports INPA]

在这里插入图片描述

2.2 输出延时

输出延时指输出端口到下一个寄存器的D端,Tc2+Tsu(输出数据送到下一个寄存器D端的时间

set Tc2 3.9
set Tsetup 1.1
set_output_delay -clock CLKQ -max [expr Tc2 + Tsetup] [get_ports OUTB]

在这里插入图片描述

也可以定义输出延时的最大值和最小值

create_clock -period 20 -waveform {0 15} [get_ports CLKQ]
set_output_delay -clock CLKP -max 7.4 [get_ports OUTC]  
set_output_delay -clock CLKP -min 0.4 [get_ports OUTC]

在这里插入图片描述

2.3 输入输出延时同时存在

create_clock -period 100 -waveform {5 55} [get_ports MCLK]
set_input_delay 25 -max -clock MCLK [get_ports DATAIN]
set_input_delay 5 -min -clock MCLK [get_ports DATAIN]
set_output_delay 20 -max -clock MCLK [get_ports DATAOUT]
set_output_delay -5 -min -clock MCLK [get_ports DATAOUT]

在这里插入图片描述

3、时序路径分组

看每条时序路径的终点位于哪个时钟组,路径终点位于同一个时钟域的是同一个组。
在这里插入图片描述

4、外部属性建模

对输入转换时间和输出负载电容进一步约束,使得更贴近实际情况

输入端口:

  • set_drive:给输入端口设定驱动阻抗值
  • set_driving_cell:同第一种
  • set_input_transition:直接指定输入端口的转换时间,以上三种任意选一种即可

在这里插入图片描述

set_drive 100 UCLK   //指定输入引脚的驱动电阻,值越小,驱动能力越强。设置为0的话表示驱动能力无穷大,是不存在的
set_drive -rise 3 [all_inputs]
set_drive -fall 3 [all_inputs]  //也可以上升沿下降沿单独设置

set_driving_cell -lib_cell INV3 -library slow [get_ports INPB] //可以从库slow里面取出一个cell,把它设定为输入驱动单元

set_input_transition 0.85 [get_ports INPC]  //直接设置转换时间,感觉更简单,上面那些还需要去进行计算

输出端口:

  • set_load:指定输出负载电容,默认值为0
set_load 5 [get_ports OUTX]  //设置为5pF
set_load -pin_load 0.007 [get_ports{shift_write[31]}]  //在输出端口添加一个7fF的负载电容

5、设计规则检查DRC

检查所有端口是否满足要求,前两个用于STA,后两个主要用于综合的时候约束

  • set_max_transition
  • set_max_capacitance
  • set_max_fanout
  • set_max_area
set_max_transition 0.6 IOBANK
set_max_capacitance 0.5 [current_design]

6、虚拟时钟

虚拟时钟存在但是不和设计中的端口和引脚相连接。
它在STA分析中用作参考,以指定相对于时钟的输入和输出延迟。
下图就是添加了CLK_SAD和CLK_CFG两个虚拟时钟
在这里插入图片描述

create_clock -name VIRTUAL_CLK_SAD -period 10 -waveform {2 8} //虚拟时钟不和引脚/端口相连,所以没有定义
create_clock -name VIRTUAL_CLK_CFG -period 8 -waveform {0 4}  
create_clock -period 10 [get_ports CLK_CORE]  //真实的时钟定义要写端口,不指定waveform就是50%
 
set_input_delay -clock VIRTUAL_CLK_SAD -max 2.7 [get_ports ROW_IN]
set_output_delay -clock VIRTUAL_CLK_CFG -max 4.5 [get_ports STATE_O]

在这里插入图片描述

7、完善时序分析

  • set_case_analysis:声明单元引脚上的固定值,或者输入端口的固定值;
    假如设计里面有多个时钟,一个信号控制时钟的切换,可以分别设置时钟,这样会使得STA的遍历更加简单,占用的CPU更少
  • set_disable_timing:断开单元时序弧;
  • set_false_path:STA不需要进行分析检查的路径,伪路径约束
  • set_multicycle_path:声明可能耗费超过一个周期的路径。

在这里插入图片描述

set_case_analysis 1 UCORE/UMAX0/CLK_SEL[0]

在这里插入图片描述

set_disable_timing -from S -to Z [get_cells UMUXO]   //认为这条没有时序,不需要进行分析,减小PT的运行时间

在这里插入图片描述

set_false_path -from [get_clocks USBCLK]-to [get_clocks MEMCLK]  //从USBCLK到MEMCLK的路径都不进行分析,该指令也用来排除一些不可能发生的时序路径,需要具体分析

在这里插入图片描述

//输入到输出有多周期路径,如果在一个clk的时候去检查,肯定不对,可以设置在第三个周期的时候去检查
create_clock -name CLKM -period 10 [get _ports CLKM]
set_multicycle_path 3 -setup -from [get_pins UFFO/Q]-to [get_pins UFF1/D]

自测题

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

2023年4月的编程语言排行榜,有你中意的开发语言吗?

编程世界变幻莫测,编程语言也是层出不穷,每隔一段时间就有新的风口出现。2023年的风口非人工智能莫属,人工智能领域中不可获取的编程语言就是Python,作为在算法、数据方面有独特优势的编程语言,从去年开始就展现了它不…

Linux03——文件系统及结构、命令

目录 一、前言 二、文件目录 三、文件系统 四、文件目录命令 五、系统信息命令 六、通讯网络命令 七、磁盘类命令 八、进程管理命令 一、前言 Linux特点是开放性遵循OSI国际标准;多用户每个用户有各自权限;多任务;GUI和系统调用界面&…

Java每日一练(20230411)

目录 1. 同构字符串 🌟 2. 随机字符串 🌟 3. 交错字符串 🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 同构字符串 给定两个…

京东技术专家首推:Spring微服务架构设计,GitHub星标128K

前言 本书提供了实现大型响应式微服务的实用方法和指导原则,并通过示例全面 讲解如何构建微服务。本书深入介绍了Spring Boot、Spring Cloud、 Docker、Mesos和Marathon,还会教授如何用Spring Boot部署自治服务,而 无须使用重量级应用服务器…

SAP开发环境ABAP的搭建(客户端和服务器),Developer Key和AccessKey的绕过方法

目录 一.前言 二.客户端GUI安装 1.下载好SAP GUI 750 2.解压后找到SAPGUISetup.exe 3.安装 4.安装完整教程 三.服务端搭建 1.安装VmWare虚拟机 2.下载虚拟机镜像 3.打开虚拟机 4.调整内存大小 5.启动虚拟机 四.创建程序 1.创建包 2.创建程序 3.Developer Key和A…

C语言——变参函数

一、定义 一般函数的参数列表是固定的,所以在调用时传入的实参的个数和格式必须和实参匹配;在函数式中,不需要关心实参,直接调用形参即可。 变参函数,就是参数的个数及类型都不确定的函数,常见变参函数如pr…

jenkins的slave节点构建java失败

背景: 主节点构建没问题的,为了缓解压力增加了个从节点,但是发现同个应用分配到从节点构建时报错,主节点构建就正常。但是我的从节点是把主节点克隆过去的, 理论环境配置java——maven啥都是一模一样才是。不理解。 …

Markdown基础语法:快速入门指南

什么是Markdown Markdown是一种轻量级的标记语言,它的目标是让文本内容更加易读、易写和易于转换成HTML等格式。Markdown语法简单、直观,适合用于写作、博客、笔记、文档等场景。Markdown最初由John Gruber和Aaron Swartz于2004年创建,现在已…

从手动实现web开发到借助IDEA实现web开发的具体流程分析,详细介绍webapp的目录结构和web站点的欢迎页面的设置

使用Tomcat手动实现WEB开发 实现静态的web应用(没有java小程序) 第一步:找到CATALINA_HOME\webapps目录(Tomcat服务器要求所有的web应用都要放到webapps目录下, 这样它才能找到你的web应用) 第二步:在CATALINA_HOME\webapps目录下新建一个oa的子目录(…

闭环控制里的采样周期和执行周期

运动控制对系统的实时性要求都非常高。所以大家可以看到运动控制总线的刷新周期越来越快,越来越短。今天我们讨论下实时性不高的总线会带来哪些问题和挑战,以及这种大延时总线如何解决实时性问题,运动控制实时性问题还可以参看下面的文章博客: 随动控制之跟随给定和跟随反…

Python一行命令搭建HTTP服务器并外网访问【内网穿透】

文章目录1.前言2.本地http服务器搭建2.1.Python的安装和设置2.2.Python服务器设置和测试3.cpolar的安装和注册3.1 Cpolar云端设置3.2 Cpolar本地设置4.公网访问测试5.结语转载自远程内网穿透的文章:【Python】快速简单搭建HTTP服务器并公网访问「cpolar内网穿透」 1…

20从零开始学Java之牛闪闪的for循环是怎么用的?

作者:孙玉昌,昵称【一一哥】,另外【壹壹哥】也是我哦 千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 在前面的文章中,壹哥给大家讲解了顺序结构、分支结构,接下来我们就来学习Java…

面试篇-Java输入输出三兄弟大比拼:IO、NIO、AIO对比分析

1、Java I/O发展史 Java IO(Input/Output)是Java语言中用于读写数据的API,它提供了一系列类和接口,用于读取和写入各种类型的数据。下面是Java IO发展史的简要介绍: JDK 1.0(1996年&#…

Android进阶宝典—事件冲突的解决方法

相信伙伴们在日常的开发工作中,一定会遇到事件冲突的问题,e.g. 一个页面当手指滑动的时候,会翻到下一页;点击的时候,需要响应页面中的元素点击事件,这个时候如果没有处理滑动事件,可能遇到的问题…

c++的多态

目录 1、多态 1.1多态的构成条件 1.2多态的好处 2、虚函数 2.1虚函数重写 2.2虚函数的默认参数 2.3纯虚函数重写 2.4抽象类 2.5虚析构,纯虚析构重写 3、重载、覆盖(重写)、隐藏(重定义)的对比 ​编辑 多态是c面向对象三大特性之一 程序调用函数时&#…

人人都是数据分析师-数据分析之数据图表可视化(下)

当前的BI报表、运营同学的汇报报告中数据图表大多为 表格、折线图、柱状图和饼图,但是实际上还有很多具有代表性的可视化图表,因此将对常见的可视化图表进行介绍,希望这些图表可视化方法能够更好的提供数据的可用性。 人人都是数据分析师-数…

QT网络通信-服务器(一)

目录 1、简介 2 、TCP通信流程 3、基于TCP通信所需要的类 4、QT端设计 4.1项目建立 4.2 TCP网络程序设计 4.2.1 QT界面设计 4.2.2 UI布局 4.2.3 控件重命名 5、widget.h 6、widget.c 1、简介 网络有TCP和UDP。本文主要通过QT完成TCP网络设计,通过ESP8266与单片…

JavaEE简单实例——一些基本操作

在配置类中配置页面解析器 之前我们使用页面解析器是在XML配置文件中使用的,但是当我们试用了纯注解式的整合之后,我们没有了配置文件,要如何去将之前我们在配置文件中编写的前端控制器,以及静态资源的释放这些功能配置添加到项目…

二叉排序树(二叉查找树)基本操作_20230417

二叉排序树(二叉查找树)基本操作_20230417 前言 二叉排序树首先是一颗二叉树,它不同于常规二叉树的地方在于,如果左子树不为空,那么左子树上所有结点的值都不大于根节点的值,如果右子树不为空&#xff0c…

从GPT-4、文心一言再到Copilot,AIGC卷出新赛道?

业内人都知道,上一周是戏剧性的,每一天,都是颠覆各个行业,不断 AI 化的新闻。 OpenAI发布GPT-4、百度发布文心一言、微软发布Microsoft 365 Copilot 三重buff叠加,打工人的命运可以说是跌宕起伏,命途多舛了…