STA series --- 3.Standard cell library(PART-I)

序:

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

Standard cell library

本章节主要介绍library cell中的时序信息,这个cell可以是standard cell, an IO buffer, or a complex IP such as a USB core. 库单元的描述不仅仅包括时序信息,还有面积和功能等属性。这些虽然和时序无关,但是和综合阶段有关。本章节主要介绍时序和power相关的计算。

先放一个和本章节关系不大的standard cell 命名规则图:在这里插入图片描述

1. Pin capacitance

在library中,cell的input和output pin都会指定电容。一般呢,只有输入电容,输出电容很小为0,忽略掉。电容的描述方式有以下三种形式:单独的一个电容/ rise,fall 电容/ 电容range三种情况如下图左侧所示。下图右侧为真实的library中的cap的定义。可以看到,输入电容有正常的一个和rise/fall这两个分类。输出Z端之后max_cap/min_cap 电容的constraint,并没有输出电容定义(cell输出电容由三部分组成,所有load的输入电容+线电容+该cell本身的输出电容,该cell本身的输出电容非常的小)。
在这里插入图片描述


2. Timing Modeling

在STA series — 2.STA basic concept(PART-I)第3条中讲过关于timing delay的计算,一般是从输入越过阈值点(一般为Vdd的50%)到输出越过阈值点的时间差。timing arc的delay主要有两个影响因素output load cap和input transition。越大的load cap会导致越大的delay。通常情况下,input trans的增加会导致delay的增加,但是也存在特殊的情况,如the input threshold (used for measuring delay) is significantly different from the internal switching point of the cell,这种情况,该cell的delay和input transition不呈线性关系,从而导致,大的input trans可能产生小的delay,尤其是当load很小的时候。输出端的slew主要取决于输出的电容(output trans time increase with output load)。
因此即使是一个大的input trans,当输出cell和load合适,输出trans time可以变小如下图左侧所示。而对于小的input trans,由于cell type和load的原因,output trans也可能很大。
在这里插入图片描述

2.1 Linear Timing Model

线性delay model是很简单的timing model,delay值和output trans与input trans和output load cap呈线性关系:

  • Delay = D0+D1t_input_tran+ D2C_output_load,其中D0,D1,D2是常数。
    在亚微米以上的工艺节点,这种线性delay 模型是适用的,但是随着工艺节点的不断提高,在亚微米以下,这种模型就很不准确了。

2.2 Non-Linear Timing Model

目前工艺库都是查找表的形式表征delay值,较先进的工艺库,用的是current source based advanced timing models,如CCS/CSM等。不过本小节介绍最基础的查找表timing model(table models),又叫做NLDM(non-liner delay model)。NLDM下,delay值的获取是通过input trans和output load cap这两个变量,利用library中的查找表得到。NLDM是二维格式的表格,通过插值法进行delay的获取,如下图左侧inverter cell所示:
在这里插入图片描述

library中一般对delay的描述都是针对ouput pin。如上所示描述了输出端的rise/fall delay 模型,以及要求的最大的trans。index1和index2 分别表示input trans和output load cap的值,对应3*3查找表中的行索引和列索引。索引的类型和表查找索引的顺序在查找表模板 delay_template_3x3 中描述,如上图右侧上所示。索引值(例如 1000)是虚拟占位符,它们被 cell_fall 和 cell_rise 延迟表中的实际索引值覆盖。指定索引值的另一种方法是在模板定义中指定索引值,而不是在 cell_rise 和 cell_fall 表中指定它们,如上图右下所示。除此之外,table model也可以三维的,比如一个flip-flop有两个互补的输出Q/QN,详细会在后面章节描述。
NLDM models除了对delay进行描述,还对output transition time进行描述(啥用呢??)。描述方法和delay的描述方法非常类似,只不过把cell_rise/cell_fall 切换成了rise_transition/fall_transition。其他不变,依然是input trans和output load cap为两个参数索引。因此NDLM models里面包含的table有rise/fall delay, rise/fall transiton 四类。

  • 以上图所示的示例为例子,如果input fall trans为0.3ns,output load 为0.16pf,通过查找表可以得到rise 的delay(input的fall对应output的rise)值为0.1018ns。

上述的简单例子,刚好在查找表中能找到具体的值,但是实际的input trans和load cap往往在index中找不到对应的值。这个时候就需要用到插值的方法去获取delay值。比如如果反相器的input fall trans值为0.15,load cap值为1.16,那么delay 通过插值法进行获取如下所示:
在这里插入图片描述

2.3 Threshold Specifications and Slew Derating

前面内容有提到,trans time的计算,(2.STA basic concept(PART-I)第4条)一般都有一个上下的阈值去卡,如较老的工艺一般都是Vdd的10%到90%去计算trans时间,这个值的选取标准则是波形的线性部分。先进工艺下,波形线性部分变短,变到了30%~70%之间。而这个时候的操作就有点稍微搞不懂了: 如测量值为30%-70%阈值去卡,然后扩充到库里面为10%-90%,这时候就有一个slew_derate值,0.5。意思为库里面实际标定的值*0.5为实际的测量tran的值。而真正的delay的计算方式也是库里的trans time * slew derate。既然如此,为什么不直接在库里面标定30%-70%的值呢,计算delay也不需要再乘以0.5??????没有搞明白呀
仔细想了一下,应该是这么理解的吧:传统的k 库的方式中,把trans time的计算都是按照Vdd 10%-90%的方法,而先进的工艺也保留了这种写入方式。但是呢,先进工艺中tran的实际计算是按照30%-70%的值去计算的,因此会有一个0.5的slew derate值。(有待考证)
而当slew derate没有定义时候,默认为1.

2.4 Timing Models - Combinational cells

考虑一个而输入与门(and),此时有两个输入一个输出,而输入端均为正单边的类型,那么输入的rise就对应输入的rise。此时就对应四种timing arcs,A上升对应Z上升,A下降对应Z下降,B上升对应Z上升,B下降对应Z下降。那么对应的NLDM就会有四个关于timing delay计算的描述,也会有四个关于output trans的描述(这个哪里用到的呢)。同理,与非门为输入端口负单边类型,那么一个而输入的与非门,依然有四类timing arcs,但分别是A上升对应Z下降,A下降对应Z上升,B上升对应Z下降,B下降对应Z上升。

在这里插入图片描述
考虑到上面提到的组合逻辑,实际中不仅仅是二输入一个输出,可能有多输入多输出的情况,如上图右侧所示。对于这一类的逻辑,其实库里面的定义都是通用的,总的timing delay和output trans 表的个数为输入个数*输出个数,如上图右侧三输入二输出,则有6个delay time的查找表。而具体是正单边还是负的单边,还要看具体的逻辑。

2.5 Timing Models - Sequential Cells

除了组合逻辑单元,就是时序逻辑单元了。timing check大多数的path是集中在时序cell之间的check,因此这一块很是重要。下图左侧为一个DFF单元存在的timing arcs:

  • 同步输入信号D/SI/SE,存在CK到输入信号的rise/fall的setup/hold check,在timing path中对应library setup/hold time值
  • 异步输入信号CDN/(SDN),存在CK到输入信号的recovery/removal check,在timing path中对应recovery/removal time值
  • 同步输入信号Q/QN ,存在CK到输出端的propagation delay arc(rise/fall),在timing path中,直接表现为DFF cell的delay值

在这里插入图片描述
如上图右侧所示,所有的同步timing arcs都是相对于时钟的有效沿的check。recovery可以对标setup,removal可以对标hold。异步信号还需要做min pulse check(两个相邻的上沿或者下沿之间的宽度需要大于一个最小的值,否则可能会出现获取数据错误)。


3. Synchronous Checks and asynchronous checks

3.1 synchronous checks

上面有简单提到了同步检查,其实就是和时钟有效沿同步的检查。两个寄存器之间传输数据,要想保证数据能够正常的传输过去,就需要进行setup time和hold time的check。如下图所示为同步的两级DFF。setup time check,指的是如下UFF0在第一个时钟沿发出数据,在第二个时钟沿到达UFF1之前,数据需要传输到D端,从而保证UFF1在时钟沿来到时候正确采到UFF0传输来的数据。hold time check,指的是,在第二个时钟沿的时候,UFF0第一个时钟沿的数据已经传输到了D端,那么在UFF1捕获了这个数据后,D端的这个数据还要保持一定的时间,而不被UFF0的第二个时钟沿传来的新数据覆盖掉。这个时间为保持时间。一般都以时钟的上升沿为有效沿。
在这里插入图片描述
如下图所示为库里对setup/hold time的描述。timing_type 指定DFF的触发类型。如下为相对于DFF的CK端的上升沿触发,在输入引脚D上的建立时间和保持时间相应的值。举例说明,加入D trans time为0.4ns,CK trans time为0.84ns,那么上升沿的setup time为0.112ns,上升沿的hold time为-0489ns.
在这里插入图片描述

3.2 negative setup time or hold time

通常情况下,2.5章节图所示,建立时间和保持时间均为正值。表示在时钟有效沿来之前,数据需要稳定ready的时间(setup),时钟有效沿之后,数据需要保持的时间(hold)。但是在3.1中对于hold time 库的描述中可以看到,hold time为负值。这种情况对应于如下图左侧所示的情况。即在时钟沿改变之前,数据就可以改变了。这种情况对应于数据从寄存器的引脚到内部锁存路径要长于时钟路径。负的hold time表示,即使在时钟有效沿之前改变,数据路径加上寄存器到内部锁存的路径,减去这个负的hold time,这个时间也比clock 路径的时间长,满足hold check。setup是同理,如下图右侧所示。从图种可以看到,无论是负的hold time还是负的setup time,另一个time总是cover这个负值。这是因为数据在路径上存在的时间总是正值,因此setup+hold time永远大于0,不存在二者均为负值的情况。
在这里插入图片描述
对于触发器,在扫描数据(scan data)输入引脚上设置一个负的保持时间,可以给予时钟偏斜(clock skew)一定的灵活性,并且可以消除当扫描模式(scan mode)下保持时间发生违例时插buffer的需求。

3.3 asynchronous checks

异步引脚,如异步清零和异步置位信号,可以优先于DFF的任何同步行为。当异步信号有效时,输出就由异步信号控制而不是由数据输入的时钟锁存控制。当异步信号无效的时候,时钟有效沿开始锁存数据。异步的recovery time指的是在下一个有效时钟沿之前,异步信号被置无效后的最短稳定时间。异步的removal time指的是有效时钟沿后异步信号有效最少的保持时间,在这个时间之后异步信号才能被置无效。
最小脉冲检查,指的是两个相邻的时钟上升沿或者下降沿之间的脉冲宽度,必须要大于一定的值才算满足min pulse check。因为如果脉冲宽度过小,时钟可能不能正确的锁存到数据。同步引脚,异步引脚,高脉冲,低脉冲均可以指定min pulse check。
在这里插入图片描述
上图所示为library中对CDN pin关于min pulse check和recovery check相关的描述。min pulse check为低脉冲检查,CDN为低电平有效(高脉冲宽度无限制),和input trans有关。recovery check 和CK pin有关,由data trans和clk trans决定,因为recovery和removal是针对CND被置无效的检查,CND为高时无效,因此为recovery_rising。

3.4 Propagation Delay

DFF的传播延迟是从时钟的有效沿到输出端的时间。这个timing arc是一个非单边的,因为Q端的上升和下降并不取决于CK端,而是取决于D端,只是在变化时间上会受到CK端的影响。如下图所示为一个负沿触发的DFF的propagation delay arcs。如之前描述,cell delay值取决于input trans和output cap,不过cell_rise 对应的input trans为fall edge input trans(CKN端的)。因为CKN为负沿有效的。同理cell_fall对应着rise input trans。
在这里插入图片描述

  • 6
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
以下是使用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缓冲区中,直到接收到换行符或缓冲区已满。然后从缓冲区中解析出距离数据,并打印到串口终端上。最后清空接收缓冲区和状态,并延时一段时间再次发送命令。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值