STA series --- 5 .Delay Calculation

序:

本篇内容,基于阅读J. Bhasker • Rakesh Chadha著作《Static Timing Analysis for Nanometer Designs》后进行的总结以及自己的观点和感想,如有不正确的地方,还请指点。读者有微电子基础将更好理解内容。(图片内容绝大部分直接引用书中)

时序分析中的时序,就是时间长度相关的check,时间长度则取决于path的时间长度,path的时间长度取决于path上的每个cell、net的时间长度,而信号通过cell、net的时间长度即cell delay和net delay。本章讲介绍关于delay计算的输入内容和计算方式。

5.1 Overview

5.1.1 Delay Calculation Basics

通常电路中包含组合逻辑和时序逻辑如下图所示:
在这里插入图片描述
库中会描述每一个pin的输入电容值,那这样每一个net都会有相应的电容负载,即这个net的所有负载电容的加和。例如上图中的UAND1的负载电容则为UNOR2一个输入端的电容和O1的输出电容的总和。之前章节有过说明,单元库中,cell的delay值是一个二维查找表的格式,其中由输入trans和输出cap决定。因此可以根据相应的trans和cap去决定每一个cell的delay值。另外输出的trans也是和delay类似,由输入trans和输出cap决定的二维查找表格式。

5.1.2 Delay Calculation with Interconnect

PR之前,使用线负载模型估算寄生参数,对于工艺节点非常不先进的情况下(0.65um以上),通常互连线电阻可以忽略,那这个时候可以用上面的计算cell delay的方式去计算net delay值。但是如果对于较为先进的工艺节点,电阻不可忽略,那NLDM模型仅仅用input trans和output cap来评估delay是不准确的。PR后,金属互连线,真实的map成为了RC互联的形式,而lib中的NLDM模型,没有办法直接去使用,而是要把真实的RC值等效为“有效电容”的形式,进行计算delay。

5.2 Cell Delay using Effective Capacitance

什么是所谓的有效电容?可以理解为等效电容。如下图5-4所示,(a)为最真实的RC network,在计算图上与门的load时候,需要考虑所有的cap和resistance,可以看到此RC网络可以等效为π模型如(b)所示。此时虽然精简到了π模型,但是依然有电阻的存在,那对于NLDM模型的查找表依然不能使用,那就继续优化,把(b)的π模型等效为(c)的单一电容模型。
Alt 在这里插入图片描述

一顿操作猛如虎,那是如何等效的呢?看图5-5,(a)(b)©三者对应了充放电模型,可以看到这三种形式其实重放电类型是类似的,那总能找到一个有效电容,是的其充放电波形和actual load是相似的。具体的如何找到的这里就不作继续的讨论。其实在最新的工艺节点,CCS模型已经引入到其中,这个有效解决了NLDM模型的不精确带来的问题了。感兴趣可以自己研究。
自获得了有效电容之后,就可以通过NLDM模型进行cell 和net的delay 计算

5.3 Different Slew Thresholds

现在的项目里面,基本上不会出现,同一个design,不同的cell用不同的slew thresholds的情况,都是用的同一套库,即便用的不同的库,cell的slew thresholds也基本都一致。此处不做详细研究,有兴趣可以自行看书。

5.4 Different voltages

跨电压的情况,在现在的design里面倒是用到的非常多。最常见的cell例子就是level shifter。现在design的设计非常注重low power,因此各种节省功耗的方式都会存在,就会存在design中不同模块用电压不同,那接口处就需要用lvl来处理,防止出现功能问题。(低压到高压,如果不用lvl,可能导致驱动不足,后级cell无法开启,影响功能;高压到低压,如果不用lvl,会导致后级cell的timing model不够准确,影响STA效果)。如下图所示为高压到低压的lvl shifter示意图,同一个cell在不同的电压下,slew自然是不同的。
在这里插入图片描述

5.5 path delay

path的delay ,取决于是path上面的cell和net的delay值

5.5.1 combinational path delay

下图所示为组合逻辑的path路径,那从N0到N3的delay值的计算,取决于这个path上经过的cell和net的delay之和,因为cell都存在上升和下降的情况,因此,所有的cell delay和net delay计算时候,都需要考虑是否是上升沿或者下降沿,不同的转换状态,delay值也是不同的。在STA中,对于gba mode去报timing时候,可能会按照某个cell最差的情况去选取上升或者下降沿,但是用pba mode(signoff mode)去报的话,就会看你真实的timing arc是什么样。比如N0如果是上升,那UINVa必然是下降,UINVb必然是上升,由此推及所有。得到两种delay计算:

● Tfall = Tn0rise + Tafall + Tn1fall + Tbrise + Tn2rise + Tcfall + Tn3fall
● Trise = Tn0fall + Tarise + Tn1rise + Tbfall + Tn2fall + Tcrise + Tn3rise

在这里插入图片描述

5.5.2 sequential path delay

下图是design设计中STA check最常见的一种path ,DFF到DFF的路径。其delay计算方式同理:

在这里插入图片描述
UFF0 数据上升情况下到UFF1的数据路径延迟:

● Tck2qrise + Tn1rise + Tafall + Tn2fall + Tbfall + Tn3fall

输入PCLK对应上升沿的(launch)时钟路径延迟为:

● Tn4rise + T5rise + Tn5arise

输入PCLK对应上升沿的(capture)时钟路径延迟为:

● Tn4rise + T5rise + Tn5brise + T6rise + Tn6rise

此处的数据路径延迟,并未加入DFF的library hold/setup time。并不是一个完备的数据路径。详细的数据路径参考setup、hold time check介绍内容。

5.5.3 Multiple Paths

如下图所示,实际的电路中,从UFF0到UFF4的数据路径可能不止一条,可能走上面的一条长的路径,也可能走下面一条短的路径,不同路径对应不同的timing arc ,在STA阶段,对于setup check,一般会针对长路径去卡,如果最长路径就满足了setup check , 那最短路径自然满足。同理,对于hold check,一般针对最短路径去卡。
在这里插入图片描述

5.6 Slack Calculation

slack是指要求的时间和数据真正到达时间的差距,如果在要求时间,数据还未到,那就是负值,如果在要求时间内,数据已经到达,那slack就是非负值。如下图所示为setup 检查,一个周期为10ns ,数据要求在7ns时刻准备好,实际上在1ns的时刻就到达了,那么这个setup check的slack为7-1=6ns。如果在8ns时刻到达了,那setup slack就是7-8=-1ns。
在这里插入图片描述

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用USART通信实现STM32与GY-53-L1测距模块进行通信的示例代码: ``` #include "stm32f10x.h" #include <stdio.h> // 定义USART相关的GPIO口 #define USARTx USART1 #define USARTx_CLK RCC_APB2Periph_USART1 #define USARTx_TX_PIN GPIO_Pin_9 #define USARTx_TX_GPIO_PORT GPIOA #define USARTx_TX_GPIO_CLK RCC_APB2Periph_GPIOA #define USARTx_RX_PIN GPIO_Pin_10 #define USARTx_RX_GPIO_PORT GPIOA #define USARTx_RX_GPIO_CLK RCC_APB2Periph_GPIOA // 定义USART接收缓冲区大小 #define USART_RX_BUF_SIZE 100 // 定义发送和接收状态 #define USART_SENDING 0 #define USART_RECEIVING 1 // 定义USART接收缓冲区 uint8_t USART_RX_BUF[USART_RX_BUF_SIZE]; uint16_t USART_RX_STA = 0; uint8_t USART_RX_STATUS = USART_RECEIVING; // USART初始化函数 void USART_Config(void) { USART_InitTypeDef USART_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(USARTx_CLK | USARTx_TX_GPIO_CLK | USARTx_RX_GPIO_CLK, ENABLE); // 配置USARTx_TX的GPIO口 GPIO_InitStructure.GPIO_Pin = USARTx_TX_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(USARTx_TX_GPIO_PORT, &GPIO_InitStructure); // 配置USARTx_RX的GPIO口 GPIO_InitStructure.GPIO_Pin = USARTx_RX_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(USARTx_RX_GPIO_PORT, &GPIO_InitStructure); USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USARTx, &USART_InitStructure); USART_Cmd(USARTx, ENABLE); } // USART发送一个字节 void USART_SendByte(USART_TypeDef *USARTx, uint8_t byte) { while (USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET); USART_SendData(USARTx, byte); } // USART发送字符串 void USART_SendString(USART_TypeDef *USARTx, char *str) { while (*str) { USART_SendByte(USARTx, *str++); } } // USART接收中断处理函数 void USART1_IRQHandler(void) { uint8_t ch; if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { ch = USART_ReceiveData(USART1); // 如果接收到换行符,则表示一行数据接收完成 if (ch == '\n' || ch == '\r') { USART_RX_BUF[USART_RX_STA++] = ch; USART_RX_STATUS = USART_SENDING; } else { USART_RX_BUF[USART_RX_STA++] = ch; if (USART_RX_STA >= USART_RX_BUF_SIZE) { USART_RX_STATUS = USART_SENDING; } else { USART_RX_STATUS = USART_RECEIVING; } } } } int main(void) { uint32_t distance; USART_Config(); // 使能接收中断 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); while (1) { // 发送获取距离命令 USART_SendString(USART1, "AT+DIST?\r\n"); // 等待接收到距离数据 while (USART_RX_STATUS == USART_RECEIVING); // 解析距离数据 sscanf((const char *)USART_RX_BUF, "+DIST:%ldmm", &distance); printf("Distance: %ldmm\r\n", distance); // 清空接收缓冲区和状态 USART_RX_STA = 0; USART_RX_STATUS = USART_RECEIVING; // 延时一段时间 Delay(1000); } } ``` 在上述代码中,使用USART1与GY-53-L1测距模块进行通信,通过发送"AT+DIST?"命令获取距离数据。当接收到一行数据时,会将数据存储到USART_RX_BUF缓冲区中,直到接收到换行符或缓冲区已满。然后从缓冲区中解析出距离数据,并打印到串口终端上。最后清空接收缓冲区和状态,并延时一段时间再次发送命令。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值