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

序:

本篇内容,基于阅读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相关的计算。太长了,再分一小节吧。

7. Power Dissipation Modeling

单元库包含和power相关的信息;其中主要为动态功耗和静态功耗。

7.1 Active power

包含switch power和internal power。switch power指的是cell在打开关断时候的充放电所消耗的功耗,开关功耗和单元类型无关,而是取决于输出负载电容,开关频率和工作电压。internal power是指在开关有一个状态转向另一个状态时候,可能会导致P管和N管同时导通,从而引来的功耗。内部功耗取决于工作电压,开关频率,单元的类型,因此该值会包含在库单元中。
如下图所示的晶体管级别的反相器。对动态功耗进行了描述。
在这里插入图片描述
internal switching powers内部开关电源在单元库中描述为internal power。 这是当单元的输入或输出有活动时单元内的功耗。 对于组合逻辑单元,输入引脚转换会导致输出切换,从而产生内部开关电源。 只要输入切换(在输入处有上升或下降转换),反相器单元就会消耗功率。 内部电源在库中描述如下图左侧所示:描述了单元从A到Z1的功耗。示例中的二维表格分别对应A上的input trans和Z上的output cap。虽然该表包括输出电容,但表中的值仅对应于内部开关,不包括输出电容的贡献(??????这个有点费解啊)。 这些值代表每个开关转换(上升或下降)单元中消耗的内部功耗。 这些单位源自库中的其他单位(通常电压以伏特 (V) 为单位,电容以皮法 (pF) 为单位,这映射到以皮焦 (pJ) 为单位的能量)。 因此,库中的内部功率实际上指定了每次转换消耗的内部能量。除了内部开关功率外,还有关于电源引脚,接地引脚的描述。当单元可以掉电时候,还描述了掉电条件。

在这里插入图片描述
就像timing arcs一样,power也可以分开对rise和fall power进行描述。另外power也可以是state-dependent的,比如xor cell。对于组合逻辑单元,internal switching power都是基于输入输出引脚对的,但是可能存在有两个输出的Q/QN的DFF,对于这类触发器,CLK>Q的trans也会导致CLK>QN的trans,因此再库里的描述,为三维表格的形式,三个维度分别是input trans,Q的output cap和QN端的output cap,如下所示:

在这里插入图片描述
另外,即便输出状态没有发生改变,也是可以消耗功耗的,比如一个DFF,当时钟引脚发生切换,但并不是有效沿的切换时,会导致触发器内部的反相器发生功耗的消耗,但这并不导致输出发生改变。这种功耗为输入引脚功耗(input pin power),在库种的描述如下:表示CLK 切换时候的功耗消耗。

在这里插入图片描述
此处应该有疑问,前面提到了有CLK>Q的功耗,此处又提到了CLK的单独的功耗。那这种时什么关系呢?? 其实没有太大关系,因为CLK pin的输入功耗,对应的时Q端不变的情况,而CLK>Q对应的时输出切换的情况。这两者属于互斥的状态吧。

7.2 leakage power

前面提到的active power,是当CLK变化或者输出变化时候消耗的功耗,也就是电路在动的情况下发生的功耗。那电路在不动的时候呢?有电但是不做任何操作的时候,也是有功耗的消耗的,这个功耗叫做漏电功耗,leakage power。漏电功耗主要有两个来源:亚阈值漏电流和栅极隧穿电流。较老的工艺下,leakage可能可以忽略,但是先进工艺下,leakage已经非常大了。
亚阈值电流主要是源漏端的扩散电流,搞的阈值电压,可以有效降低亚阈值电流,但是高阈值会导致速度变慢,不满足performance的需求,因此会存在trade-off。High Vt单元的漏电流较小,但是速度较慢,low Vt漏电较大,但是速度快。无论Vt高低,对于栅极氧化层隧穿带来的影响都差不多。除了Vt,单元的strength也是漏电和速度之间的折中。MOS器件的亚阈值电流与温度有非常强的非线性特性,大多数工艺中,随着器件温度从25到125度的变化,亚阈值电流可能会增加10到20倍。栅极氧化物隧穿不受温度或者阈值电压的影响。到了65nm或者更高节点的工艺下,栅极氧化层隧穿漏电已经可以和亚阈值电流同数量级。高温下,亚阈值电流仍然是漏电流的主要部分。库中的leakage指定如下图左侧所示,cell_leakage_power为单元的漏电功耗,单位为nw。此外还看到不同状态时的leakage power。如当I为真时,leakage power为0.23nw。当I为假时,leakage power为1.17。默认值cell_leakage_power,为二者的平均值。

在这里插入图片描述

8. Other Attributes in Cell Library

除了时序信息外,库中的单元描述还指定了单元面积,功能和时序弧的SDF条件。
单元面积: area: 2.35,指定了单元的面积为2.35,一般单位为um^2,可以代表实际的硅面积,也可是面积的相对测量值。pin(Z) { function: “IN1&IN2” …} 指定了一个两输入与门单元输出Z的逻辑功能。SDF条件属性支持SDF(Standard Delay Format)文件的生成以及在反标(backannotation)过程中的条件匹配。就像when在state-dependent模型中对于timing分析的描述,对于SDF annotation,通过sdf_cond来对state-dependent 的timing使用进行描述。如上图右侧所示。

9. Characterization and Operating Conditions

库单元中还会指定库的特征和工作条件。如下所示库的头文件:工作条件nom_process/temperature/voltage指定了对库进行表征的工艺/温度/电压,也制定了使用该库中单元的条件。如果特征和工作条件不同,则需要对延迟计算过程中获得的时序值进行derate处理,可以通过使用库中指定的降额系数(k-系数)来实现。在用于表征的条件之外的条件下使用降额获得时序值会导致时序计算的不准确。 仅当在感兴趣的条件下表征库不可行时才采用降额程序。
工艺变量是不可量化的变量,就数字特征和验证而言,它可以为slow/typical/fast其中之一。库的表征是很耗时的,针对不同process corner对库进行表征可能需要数周的时间???(现在不是了吧)工艺的k-系数可以用于完成特征库工艺到目标库工艺的延迟降额。但是因为降额为引入不准确性,因此很少采用。总之,指定不同工艺变量值(例如1.0)的唯一功能就是在少数情况下允许跨工艺条件进行降额处理。

在这里插入图片描述
库中对于attribute单位的描述如上图右侧所示,电压v,时间ns,电容pf,电流mA,电阻Kohm,面积um^2等等。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值