STA series --- 4.Interconnect Parasitics(PART-I)

序:

本篇内容,基于阅读J. Bhasker • Rakesh Chadha著作《Static Timing Analysis for Nanometer Designs》后进行的总结以及自己的观点和感想,如有不正确的地方,还请指点。读者有微电子基础将更好理解内容。(图片内容绝大部分直接引用书中)
从这一章节开始,决定不按照教程内容顺序去捋,自己总结一下,挑比较重点的记录。

Interconnect Parasitics

在实际的芯片制造过程中,虽然晶体管目前来说只有一层,但是嘞,动辄上百万,上千万的晶体管数量,使得金属管之间的金属连线不得不在三维立体垂直方向进发。M0~M12层的金属来实现所有晶体管之间的互联,不同的金属层因为功能需求会用不同的金属材料,以及不同的工艺沉积方法。此处增加一些工艺知识,待补充

4.1 RLC for interconnect

RLC,电阻电感电容,有金属连线就会有电阻,即便是超低电阻率。互联电阻可以理解为两个cell之间的金属连线的电阻,其实就是一个cell的输出到一个cell的输入。在工艺的角度就是某段via加上某段金属走线。互联电容包括了对地电容和寄生电容。电感效应通常在芯片设计中可以忽略不计,仅在芯片的封装和板机设计中考虑。
实际的金属走线,用RC互联建模来等效。可以简化为T模型和Π模型,如下图所示。

在这里插入图片描述

4.2 Wireload Models

老生常谈,在PR之前,没有实际的走线时候,预估timing用线负载模型进行评估。通过对走线的长度对电阻电容进行评估。线负载模型和面积关系密切,因为一般认为面积越大,那么电容也就越大。因此会根据芯片block的大小,使用不同的线负载模型确定寄生效应的大小。
如下图左侧所示为一个线负载模型的库文件描述。通过cell扇出的大小评估走线的长度。wlm_conservative指的是线负载模型类型,和面积大小相关。resistance 5.0, capacitance:1.1 分别指单位电容和电阻的值。area指单位长度的面积。slope指的是当扇出大小超出一维查找表时的外推斜率值。fanout_length指定相应扇出以及估测length。由此可以计算得到电容和电阻。外推的计算方法如下图右侧所示。

在这里插入图片描述

4.2.1 Interconnect Trees

当把cell之间的互连线的电容电阻值计算完之后,就需要考虑实际的金属线的网络拓扑结构。比如一个cell的fanout有4个,那么这四个fanout是离得这个cell都很近或者是都很远,还是两个近两个远。近到多近,近到可以忽略电阻。因此,在确定了线负载模型的使用后,还需要确定互联金属线的拓扑结构去进行更加精确的评估。如下图所示,从左侧到右侧3种不同的拓扑结构依次对应best,balanced,worst情况。best,最左侧的假定fanout与cell离得很近,电阻可以忽略。worst,最右侧的情况假定离得都很远,每一个都要经过一个很大的电阻。

在这里插入图片描述

4.2.2 Specifying Wireload Models

线负载模型的指定方式:
set_wire_load_model “wlm_cons/wlm_conservative/wlm_aggressive” -library “lib_stdcell”
不同的block之间也是由net连接的,如果这条net两端用的线负载模型不同,那它应该遵从哪个呢???有三种指定方式:
set_wire_load_mode top/enclosed/segmented,这三种不同的情况根据下图分别进行解释如下。如下图所示,一个B1的top层包含了B2 hier层,B2包含了B3/B4 hier 层。分别对不同的block进行线负载模型类型的定义。B1 wlm_cons, B2 wlm_light, B3 wlm_aggr, B4 wlm_typ,1为B3与B2之间的net,2为B3和B4之间的net,4为B2与B4之间的net

在这里插入图片描述

  • top
    这个时候,所有sub block的线负载模型沿用最顶层的线负载模型,因此序号1/2/3/4均为wlm_cons 类型
  • enclosed
    此时的B3和B4之间的net,1/2/4均为wlm_light, 3在B2里,对应也是wlm_light。这种主要针对于边界处的net,使用高层hier对应的线负载模型。换句话说,如果某个网络能完全包含在某个最小的block种,就用这个block对应的线负载模型。
  • segmented
    此时B3和B4之间的net分为3段,1对应wlm_aggr, 4 对应wlm_typ, 2和3对应wlm_light。可以理解为net由最小定义blk的线负载模型决定。此时所有的net会分段,某个block包含的所有的net段,都用其对应的线负载模型。
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值