静态时序分析:SDC约束命令set_case_analysis详解

2024-03-03 07:52

本文主要是介绍静态时序分析:SDC约束命令set_case_analysis详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

相关阅读

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


目录

指定值

指定端口/引脚列表

简单使用


        set_case_analysis命令用于对电路进行特定模式的设定,例如对于一个工作在正常模式下的芯片,其扫描触发器的测试引脚应该设定为0;对于一个时钟选择器的选择引脚,在特定模式工作时应该为确定值。这个命令很有用,因为它可以帮助减少很多不必要的时序路径分析。

        set_case_analysis指令的BNF范式(有关BNF范式,可以参考以往文章)为:

set_case_analysisvalue port_or_pin_list//注:该命令的port_or_pin_list参数一定要放在value参数后

        该命令可以指定端口或引脚处是恒定的1或0,或者端口或引脚处仅允许上升沿或下降沿。

指定值

        参数value指定了端口或引脚处的确定值或转换方向。对于确定值,它可以是1、0、one或zero。对于转换方向,它可以是rising、falling、rise或fall。

指定端口/引脚列表

        指定一个端口/引脚列表,包含端口对象或引脚对象,如果有多于一个对象,需要使用引号或大括号包围。

简单使用

        首先我们可以解决静态时序分析:SDC约束命令create_clock详解一文中出现的时序路径混乱问题,原文的图7如本文图1所示,首先在输入端口clk_1和clk_2定义两个时钟。

create_clock -period 10 [get_port clk_1]
create_clock -period 15 [get_port clk_2]

图1 有两个时钟驱动的电路单元

        对于上面的电路,本意是b_reg触发器和c_reg触发器同时受时钟clk_1或时钟clk_2之一触发,但如果不使用set_case_analysis命令,在使用report_timing命令后会出现时钟clk_2和时钟clk_1之间的时序分析报告,如图2、图3所示,我们真正需要的是图4的时序报告。

图2 发射时钟是clk_2,捕获时钟时clk_1

图3 发射时钟是clk_2,捕获时钟时clk_1

图4 发射时钟是clk_2,捕获时钟是clk_2

        下面我们使用set_case_analysis命令,固定选择端sel的信号为0,时序分析结果如图5和图6所示。

set_case_analysis 0 [get_port sel]

图5 发射时钟和捕获时钟都是clk_2

图6 发射时钟和捕获时钟都是clk_2

        下面我们使用set_case_analysis命令,固定选择端sel的信号为1,时序分析结果如图7和图8所示。 

set_case_analysis 1 [get_port sel]

图7 发射时钟和捕获时钟都是clk_1

图8 发射时钟和捕获时钟都是clk_1

        set_case_analysis命令还会导致设定的值沿着时序路径向后传播,从而打断某些时序路径(使这些路径不能出现信号翻转),例如对于图9所示的电路图。

图9 一个简单的例子

        首先在输入端口clk定义一个时钟。

create_clock -period 10 [get_port clk]

         此时如果直接使用report_timing命令,则t_reg和data_out_reg之间的时序路径会正常报告,如图10所示。

图9 两个触发器间的时序报告

        现在我们使用set_case_analysis命令固定使能信号enable为0,这就使得与门U4的输出固定为0,无法翻转,因此t_reg和data_out_reg之间的时序路径被打断了,如图10所示。

图10 两个触发器间的时序路径被打断了

      这就相当于编写Verilog代码时,直接将与门的一个输出引脚固定为0,这也会打断时序路径(假设电路没有被逻辑优化),如图11所示的电路图。

图11 编写代码时指定引脚值为0

        在图11中,我们设法使得某些器件不被优化掉,并构造了一个奇怪的电路图。此时在逻辑上讲,与门的输出是一个固定值0,此时使用report_timing命令无法看到t_reg和data_out_reg之间的时序路径,如图12所示。

图12 两个触发器间的时序路径被打断了

        但是我们再来看一下图13所示的电路图(假设电路没有被逻辑优化),可以看出与门U2的输出是一个固定值0,但是此时使用report_timing命令可以看到t_reg和data_out_reg之间的时序路径,如图14所示。这代表了,即使DC会考虑某些情况下电路的逻辑情况,但不是所有。

图13 与门U2的输出引脚值为0

图14 两个触发器间的时序报告

        如果此时在编写Verilog代码时又将enable信号固定为1(假设电路没有被逻辑优化),则时序路径又会被打断,如图15所示。

图15 编写代码时指定引脚值为0

         这代表着,如果在写Verilog时固定了某个电路中某个引脚或端口的信号值,则这个确定值也会沿着时序路径传播,并可能打断路径,但推荐使用set_case_analysis命令来完成这一目标。

        最后要注意的是,确定值的传播会在到达时序路径终点而停止,并不会继续传播下去,比如图15中的data_out_reg到输出端口的时序路径并不会因为与门U2的输出为确定值0而被打断。

这篇关于静态时序分析:SDC约束命令set_case_analysis详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

python中列表应用和扩展性实用详解

《python中列表应用和扩展性实用详解》文章介绍了Python列表的核心特性:有序数据集合,用[]定义,元素类型可不同,支持迭代、循环、切片,可执行增删改查、排序、推导式及嵌套操作,是常用的数据处理... 目录1、列表定义2、格式3、列表是可迭代对象4、列表的常见操作总结1、列表定义是处理一组有序项目的

python使用try函数详解

《python使用try函数详解》Pythontry语句用于异常处理,支持捕获特定/多种异常、else/final子句确保资源释放,结合with语句自动清理,可自定义异常及嵌套结构,灵活应对错误场景... 目录try 函数的基本语法捕获特定异常捕获多个异常使用 else 子句使用 finally 子句捕获所

C++11范围for初始化列表auto decltype详解

《C++11范围for初始化列表autodecltype详解》C++11引入auto类型推导、decltype类型推断、统一列表初始化、范围for循环及智能指针,提升代码简洁性、类型安全与资源管理效... 目录C++11新特性1. 自动类型推导auto1.1 基本语法2. decltype3. 列表初始化3

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

SQL Server 中的 WITH (NOLOCK) 示例详解

《SQLServer中的WITH(NOLOCK)示例详解》SQLServer中的WITH(NOLOCK)是一种表提示,等同于READUNCOMMITTED隔离级别,允许查询在不获取共享锁的情... 目录SQL Server 中的 WITH (NOLOCK) 详解一、WITH (NOLOCK) 的本质二、工作

springboot自定义注解RateLimiter限流注解技术文档详解

《springboot自定义注解RateLimiter限流注解技术文档详解》文章介绍了限流技术的概念、作用及实现方式,通过SpringAOP拦截方法、缓存存储计数器,结合注解、枚举、异常类等核心组件,... 目录什么是限流系统架构核心组件详解1. 限流注解 (@RateLimiter)2. 限流类型枚举 (

Java Thread中join方法使用举例详解

《JavaThread中join方法使用举例详解》JavaThread中join()方法主要是让调用改方法的thread完成run方法里面的东西后,在执行join()方法后面的代码,这篇文章主要介绍... 目录前言1.join()方法的定义和作用2.join()方法的三个重载版本3.join()方法的工作原

Spring AI使用tool Calling和MCP的示例详解

《SpringAI使用toolCalling和MCP的示例详解》SpringAI1.0.0.M6引入ToolCalling与MCP协议,提升AI与工具交互的扩展性与标准化,支持信息检索、行动执行等... 目录深入探索 Spring AI聊天接口示例Function CallingMCPSTDIOSSE结束语

Linux系统之lvcreate命令使用解读

《Linux系统之lvcreate命令使用解读》lvcreate是LVM中创建逻辑卷的核心命令,支持线性、条带化、RAID、镜像、快照、瘦池和缓存池等多种类型,实现灵活存储资源管理,需注意空间分配、R... 目录lvcreate命令详解一、命令概述二、语法格式三、核心功能四、选项详解五、使用示例1. 创建逻

C语言进阶(预处理命令详解)

《C语言进阶(预处理命令详解)》文章讲解了宏定义规范、头文件包含方式及条件编译应用,强调带参宏需加括号避免计算错误,头文件应声明函数原型以便主函数调用,条件编译通过宏定义控制代码编译,适用于测试与模块... 目录1.宏定义1.1不带参宏1.2带参宏2.头文件的包含2.1头文件中的内容2.2工程结构3.条件编