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

相关阅读

静态时序分析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.rhkb.cn/news/271209.html

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

相关文章

【重制版】WSDM 2024 2023时空时序论文总结

🌟【紧跟前沿】“时空探索之旅”与你一起探索时空奥秘!🚀 欢迎大家关注时空探索之旅 WSDM 2024于2024年3月4日-3月8日在墨西哥梅里达(Mrida, Mxico)正在举行。目前官网已经放出了所有被录用论文的表单(链接…

实现消息队列(Kafka、ActiveMQ、RabbitMQ和RocketMQ)高可用

概述 单机没有高可用可言,高可用都对集群来说的 要保证消息队列系统(如Kafka、ActiveMQ、RabbitMQ和RocketMQ)的高可用性,可以采取以下一些通用的措施: 集群部署:将消息队列系统部署为集群,包…

uniapp和vue项目配置多语言,实现前端切换语言

在uniapp中配置多语言功能,实现前端切换语言,可以按照以下步骤进行: 1. 创建语言包 首先,创建一个名为 lang 的目录,并在该目录下为每种支持的语言创建对应的JSON或JS文件。例如: lang/en.js&#xff08…

【Linux】深入理解cd命令

🍎个人博客:个人主页 🏆个人专栏:Linux ⛳️ 功不唐捐,玉汝于成 目录 前言 正文 基本用法: 相对路径和绝对路径: 特殊符号和快捷方式: 符号链接: 自动补全&…

重装系统后正版office如何安装

前言 重装系统后,正版office如何安装 登录官网 https://www.microsoft.com 下载office https://account.microsoft.com/services

培训机构新助力:教务管理工教务管理新境界:完善流程,高效运营触手可及具

随着科技的不断进步,教育领域正迎来一场革命性的变革。乔拓云教育系统,作为这场变革的引领者,正以其卓越的功能和高效的解决方案,为培训机构带来前所未有的教务管理新篇章。 一、高效排课,让教务管理更轻松 乔拓云教育…

蓝桥杯(3.7)

P1102 A-B 数对 import java.util.Scanner; public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt();int c sc.nextInt();int[] res new int[n1];for(int i1;i<n;i)res[i] sc.nextInt();int sum 0;for(i…

Redis基础入门

目录 目录 一、认识Redis Redis特征&#xff1a; 二、Redis数据结构介绍 三、Redis的命令 1.Redis通用命令 2.关于String类型的命令 3.关于Hash类型的命令 4.关于List类型的常用命令 5.关于Set类型的常用命令 6.关于SortSet类型的常用命令 四、Redis中的层级关系的key 五…

【RabbitMQ】WorkQueue

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;MQ ⛺️稳中求进&#xff0c;晒太阳 Work Queues Work queues任务模型&#xff0c;简单来说就是让多个消费者绑定到一个队列&#xff0c;共同消费队列中的消息 当消息处理比较耗时的时候&…

【开课】云贝教育2024年3月9日-PostgreSQL中级工程师PGCE认证培训开课啦!

课程介绍 根据学员建议和市场需求,规划和设计了《PostgreSQL CE 认证课程》,本课程以内部原理、实践实战为主&#xff0c;理论与实践相结合。课程包含PG 简介、安装使用、服务管理、体系结构等基础知识。同时结合一线实战案例&#xff0c; 面向 PG 数据库的日常维护管理、服务和…

力扣114. 二叉树展开为链表

Problem: 114. 二叉树展开为链表 文章目录 题目描述思路复杂度Code 题目描述 思路 思路1&#xff1a;借助额外空间 借助一个队列将二叉树先序遍历的节点存入&#xff0c;再取出连接成一个链表 思路2&#xff1a;后序遍历处理 后序遍历&#xff0c;先将左子树拉伸为一个链表&am…

支小蜜校园防欺凌系统如何有效应对学生霸凌?

学生霸凌不仅直接伤害到被霸凌者的身心健康&#xff0c;也对整个校园的和谐氛围构成了威胁。为了应对这一问题&#xff0c;校园防欺凌系统应运而生&#xff0c;成为维护校园安全、保护学生权益的重要工具。那么当校园防欺凌系统面对学生霸凌时&#xff0c;该如何有效应对呢&…

3. springboot中集成部署vue3

1. vue3构建 构建命令 npm run build&#xff0c; 构建的结果在disc目录&#xff1a; 2. springboot集成 2.1 拷贝vue3构建结果到springboot resources/static目录 2.2 springboot pom依赖 添加thymeleaf依赖 <dependency><groupId>org.springframework.boot</…

onnx模型优化利器onnxoptimizer、onnxsim

ONNX性能优化和调试技巧 - 知乎ONNX模型是一种跨平台、跨框架的模型表示格式,允许用户在不同的深度学习框架之间共享模型和数据,从而加速模型开发和部署。然而,在实际应用中,我们通常需要对ONNX模型进行性能优化和调试,以确保其在不同硬件和…https://zhuanlan.zhihu.com/…

golang中go build 后读取配置文件

golang打包后读取配置文件 在用go写代码的时候&#xff0c;为了好用经常使用go build 打包&#xff0c;如果我们用到了配置文件&#xff0c;就总是导致不能找到文件所在位置了出现bug&#xff0c;所以以下代码就解决了这个问题。 核心代码&#xff1a; file, err : exec.Look…

蓝桥杯刷题(一)

一、 import os import sys def dps(s):dp [0] * len(s)dp[0] ord(s[0]) - 96if len(s) 1:return dp[-1]dp[1] max(ord(s[0]) - 96, ord(s[1]) - 96)for i in range(2, len(s)):dp[i] max(dp[i - 1], dp[i - 2] (ord(s[i])) - 96)return dp[-1] s input() print(dps(s))…

Java定时调度

在Java应用程序中&#xff0c;定时调度是一项重要的任务。它允许你安排代码执行的时间&#xff0c;以便在将来的某个时刻自动执行任务。Java提供了多种方式来实现定时调度&#xff0c;其中最常用的是Java的Timer和ScheduledExecutorService。 在本教程中&#xff0c;我们将学习…

高效实用|ChatGPT指令/提示词/prompt/AI指令大全,进阶版

大家好&#xff0c;我是淘小白~ 《高效实用|ChatGPT指令/提示词/prompt/AI指令大全&#xff0c;基础版》整理完了&#xff0c;下面来看下进阶版的吧&#xff01; 如果对你有用记得点赞、关注、收藏哦~ 划走可能找不着了哦~~ 进阶版指令可用于复杂任务和场景&#xff0c;以及…

千帆AppBuilder使用指南-组件中心

应用中心 百度智能云千帆AppBuilder&#xff08;以下简称为AppBuilder&#xff09;应用中心&#xff0c;提供了大量可以立即体验的应用示例&#xff0c;开发者可以在这里搜索感兴趣的应用进行使用。 官方应用&#xff1a;AppBuilder官方提供的应用&#xff0c;可以立即体验应用…

前端运算符比较与计算中的类型转换,运算规则

题目&#xff1a; 下面表达式的值分别都是什么&#xff08;类型转换&#xff09; 0 0 0 2 true 2 false false false false 0 false undefined false null null undefined\t\r\n 0JS中的原始类型有哪些 原始值类型就是 存储的都是值&#xff0c;没有函数可以调用的。…