数字IC后端培训教程之数字后端项目典型项目案例解析

数字IC后端低功耗设计实现案例分享(3个power domain,2个voltage domain)

Q1: 电路如下图,clk是一个很慢的时钟test_clk(属于DFT的),DFF1与and 形成一个clock gating check。跑pr 发现,时钟树综合CTS阶段(Clock Tree Syntheis)会给and的B pin 和DFF1的CK pin插如很多cdb cell 用来balance ,我实在想不出来有什么好balance的,因为时钟很慢,setup 是没有问题的。

在这里插入图片描述
测试1:and 的B pin 设置ignore。结果:and 不插cdb,时钟latency做短了,但是DFF1的CK 换上插很多cdb。这可以满足我目前的需求了。

测试2:DFF1的CK pin 设置ignore,我怀疑是DFF1的latency 比较长,于是被迫造成and 被拉长。

结果:DFF1的CK pin确实不插cdb了,但是and 的B 还是插了很多cdb,完全想不明白与谁balance。

问题:innovus 长clock tree 时候,把and 不当做sink 点,不会balance的啊?sink 点应该是DFF和icg啊,为什么这里and的B 插入那么多cdb做balance啊?

从你的两种测试结果上看,这个clk一定还有第三路clock分支,如我画出来的。其实都是被这路clock path balance的。

1)AND与门B pin设置ignore pin,仅仅是与门的B到Y这段timing arc断了,但是A pin还是会穿过与门再到后面寄存器的。

2)DFF1这颗寄存器的输出端如果没有定义任何时钟,默认情况工具做tree会自动生成clock_gen这样的skew group。如果不想自己生成这样的skew group,可以设置如下变量为false。

这个变量设置成false后,clk长时钟树只能长到DFF1的CLK pin。但这样处理后,and输出到后面寄存器CLK的这段tree就漏做了!

set_ccopt_property extract_clock_generator_skew_groups false

在这里插入图片描述
所以建议先把时钟结构画完整,否则是不太有利于后续的时钟树质量分析。

在这里插入图片描述
在这里插入图片描述
复杂时钟设计时钟树综合(clock tree synthesis)常见20个典型案例

Q2: 请教一个问题,工具提示我找不到legal location 给这两个spare cell,但是select出来的结果又显示这里位置非常合理 row 正确、没有放反、没有overlap。请问还可能是什么原因呢?

在这里插入图片描述
在这里插入图片描述
报这个警告仅仅告诉你corase placement后这颗cell在做refinePlace摆放到row时发现在以当前这个点为中心点,半径为128row高度的范围内都没找到合适的位置,即corase placement和refinePlace之间的一致性不太好。但工具仍然会在超出128row高度距离外给这颗cell找到一个位置摆放它的,摆放好后这颗cell肯定也是legal的,不会有overlap啥的。

数字IC后端实现时钟树综合系列教程 | Clock Tree,Clock Skew Group之间的区别和联系
在这里插入图片描述
在这里插入图片描述
另外建议在PR Flow和Timing ECO阶段把spare cell fixed住,不要随意参与refinePlace过程。

在这里插入图片描述

Q3:星主,请问一下,我跑完pr之后,reg2out的最长路径上插了将近20个buf和inv,这条路径逻辑只有四层,pr后密度60%,没有拥塞问题,路径长度1500左右,并且没有绕线,这种情况要如何去优化减少reg2out跑pr插入过多的单元?谢谢。

reg2out这个group path的effort设置成low,并且把output delay调整到比较合适的值,使得setup violation不要太大。

你这个路径上插了20个buffer,我猜测不是工具为了修max transition加入的,因为1500um的距离最多也就是插个几颗就够了。所以这里大部分buffer可能是hold buffer。

你看看这些buffer的名字是否带有PHC的关键词? 这条接口相关的timing path一定要找设计确认是否属于同步接口?只有同步接口才需要优化时序。

由于Innovus默认会开启useful skew flow,所以对于接口相关的路径切记不要开启useful skew,否则很容易有大量的hold violation。

在这里插入图片描述

Q4:我的模块与交接的一个模块,有高速接口检查,现在是发现我送给那个模块的时钟树做长了,请问这些路径我怎么单拎出来做短呢?

根据这些告诉接口去抓对应的寄存器,然后做tree的时候设置一个正值insertion delay。当然对于频率要求高的,我们还得把这些寄存器摆放到这个接口io port附近。

咱们训练营项目分享的这个案例跟你的情况类似。我们解决的方法就是把controller摆放至靠近phy,并且把模块内部controller这部分的clock tree尽量做短。

在这里插入图片描述
Q5: 老师,我在挪cell的时候不小心把IP的位置动了,然后发现IP的宽度和之前不一样了,这里会是什么原因呢?

这是一个非常典型的EDA工具bug,容易出现在Innovus 2018,2019版本中。

小编在7年前就遇到过这个bug,当时花了很多时间来debug解决掉的。

做过咱们社区IC后端训练营项目的同学都知道,我们在将PrimeTime DMSA返回来的timing eco脚本读入innovus前,会开启batchMode,这个模式可以批量处理脚本命令(ecoAddRepeater和ecoChangeCell)。

如果不开启这个batchMode,EDA工具每执行一条命令就需要做一次refinePlace,做一次RC抽取,报告一次时序!

setEcoMode -batchMode true -updateTiming false -refinePlace false

而且我们直播课也强调过这个batchMode模式仅局限于执行插buffer,换cell驱动的场景,其他情况必须把这个batchMode关闭即设置成false,否则就容易出现这个同学遇到的问题。

下图所示为做Timing ECO之前的子模块和顶层的部分示意图。此时子模块/IP的大小还是正常的,边上也包围着2um左右的placement halo,halo边上也加好了endcap cell(Boundary cell)。

在这里插入图片描述
但是当这位同学做完Timing ECO后发现子模块/IP已经和现有的标准单元,endcap cell overlap了!第一次遇到这种情况肯定就不淡定了,不知道的还真以为自己挪过这个子模块/IP了。

而且牛逼的地方是当你想把这个子模块/IP调整恢复到原来位置的时候,发现回不去了,怎么调整都无法回到过去了。原因是EDA工具已经把这个子模块/IP的lef改了!

因此,batchMode开启要慎重。执行ecoAddRepeater和ecoChangeCell后必须执行下面的命令。

setEcoMode -reset

在这里插入图片描述

Q6:请教星主和各位前辈,现在我有一个多power domain的设计。TOP下有模块A,A的子模块为B,B的子模块为C,C中包含一些memory。对于这种设计来说,在floorplan的时候,PD之间有没有比较建议的规划方式?

Case1: Power Domain形状尽量规则

通常情况power domain的形状(子模块单独harden模块)要尽量规则,特别是timing和routing都不太好做的设计。下图左侧存在大量拐角及窄channel都是一个不好floorplan的表现。右侧所示的模块切分相对更好,但这种L型的形状在模块直角转弯处也非常容易有timing和routing问题。

top floorplan 模块partition原则
Case2: 避免Macro或Blockage放置在Power Domain中间区域

这个就是我们一直提倡的摆放Macro的方法或原则——Macro尽量摆放在模块或Power Domain的边界处。所以在做模块或Power Domain切分时需要考虑好内部Macro的情况,特别是那种宽度或高度个别大的Macro。

low power design block partition原则及方法
Case3: 避免thin channel的PD

在这里插入图片描述
Case4: Power Domain边界处尽量不要摆放Default PD的Memory

当PD1接口信号要往左下角出来和Default PD进行交互时,PD1边界处的Macro会挡住标准单元的摆放和阻挡接口信号线的routing。

在这里插入图片描述
而且我们知道PD1接口出来的信号还需要插isolation cell,如果这类isolation cell被摆放至图中的黄色区域,肯定会有max transition violation。不巧的是这类信号对应的net还必须设置dont touch。

【思考题】下图所示一个低功耗设计实现案例。我们在PR实现时应该如何避免这类timing path在PD1中插buffer? 如何避免工具把这类相关net的routing跨在PD1上?

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025 Data Whale x PyTorch 安装学习笔记(Windows 版)

一、Anaconda 的安装与基本操作 1. 安装 Anaconda/miniconda 官方链接:Anaconda | Individual Edition 根据系统版本选择合适的安装包下载并安装。 2. 检验安装 打开 “开始” 菜单,找到 “Anaconda Prompt”(一般在 Anaconda3 文件夹…

mac OS上docker安装zookeeper

拉取镜像:$ docker pull zookeeper:3.5.7 3.5.7: Pulling from library/zookeeper 3.5.7: Pulling from library/zookeeper 3.5.7: Pulling from library/zookeeper no matching manifest for linux/arm64/v8 in the manifest list entries报错:由于时M3…

设备通过4G网卡接入EasyCVR视频融合平台,出现无法播放的问题排查和解决

EasyCVR视频融合平台作为支持多协议接入、多设备集中管理的综合性视频解决方案,可实现各类终端设备的视频流汇聚与实时播放。近期收到用户反馈,在EasyCVR平台接入设备后出现视频流无法播放的情况。为帮助更多用户快速排查同类问题,现将具体处…

板凳-------Mysql cookbook学习 (十二--------3)

第二章 抽象数据类型和python类 2.5类定义实例: 学校人事管理系统中的类 import datetimeclass PersonValueError(ValueError):"""自定义异常类"""passclass PersonTypeError(TypeError):"""自定义异常类""…

css flex 布局中 flex-direction为column,如何让子元素的宽度根据内容自动变化

在 display: flex 且 flex-direction: column 的布局中,默认情况下子元素会占满容器的宽度。要让子元素的宽度根据内容自适应,而不是自动拉伸填满父容器,你可以这样处理:✅ 解决方案一:设置子元素 align-self: start 或…

性能优化实践:Modbus 在高并发场景下的吞吐量提升(二)

四、Modbus 吞吐量提升实战策略4.1 优化网络配置选择合适的网络硬件是提升 Modbus 通信性能的基础。在工业现场,应优先选用高性能的工业级交换机和路由器。工业级交换机具备更好的抗干扰能力和稳定性,其背板带宽和包转发率更高,能够满足高并发…

上传ipa到appstore的几种工具

无论是用原生开发也好,使用uniapp或flutter开发也好,最好打包好的APP是需要上架appstore的。而在app store connect上架的时候,需要上传ipa文件到app store的构建版本上。因此,需要上传工具。下面分析下几种上传工具的优缺点&…

数控调压BUCK电路 —— 基于TPS56637(TI)

0 前言 本文基于 TI 的 TPS56637 实现一个支持调压的 BUCK 电路,包含从零开始详细的 原理解析、原理图、PCB 及 实测数据 本文属于《DIY迷你数控电源》系列,本系列我们一起实现一个简单的迷你数控电源 我是 LNY,一个在对嵌入式的所有都感兴…

prometheus UI 和node_exporter节点图形化Grafana

prometheus UI 和node_exporter节点图形化Grafana 先简单的安装一下 进行时间的同步操作安装Prometheus之前必须要先安装ntp时间同步,因为prometheus server对系统时间的准确性要求很高,必须保证本机时间实时同步。# 用crontab进行定时的时间的同步 yum …

RabbitMQ—TTL、死信队列、延迟队列

上篇文章: RabbitMQ—消息可靠性保证https://blog.csdn.net/sniper_fandc/article/details/149311576?fromshareblogdetail&sharetypeblogdetail&sharerId149311576&sharereferPC&sharesourcesniper_fandc&sharefromfrom_link 目录 1 TTL …

LVS 集群技术详解与实战部署

目录 引言 一、实验环境准备 二、理论基础:集群与 LVS 核心原理 2.1 集群与分布式 2.2 LVS 核心原理 LVS 的 4 种工作模式 LVS 调度算法 三、LVS 部署工具:ipvsadm 命令详解 四、实战案例:LVS 部署详解 案例 1:NAT 模式…

前端vue3获取excel二进制流在页面展示

excel二进制流在页面展示安装xlsx在页面中定义一个div来展示html数据定义二进制流请求接口拿到数据并展示安装xlsx npm install xlsx import * as XLSX from xlsx;在页面中定义一个div来展示html数据 <div class"file-input" id"file-input" v-html&qu…

android 信息验证动画效果

layout_check_pro <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:id"id/parent"android:layout_width"wrap_content"android:layout_…

【iOS】继承链

文章目录前言什么是继承链OC中的根类关于NSProxy关键作用1.方法查找与动态绑定2. 消息转发3. **类型判断与多态**继承链的底层实现元类的继承链总结前言 在objective-c中&#xff0c;继承链是类与类之间通过父类&#xff08;Superclass&#xff09;关系形成的一层层继承结构&am…

论文阅读:Instruct BLIP (2023.5)

文章目录InstructBLIP&#xff1a;迈向通用视觉语言模型的指令微调研究总结一、研究背景与目标二、核心方法数据构建与划分模型架构训练策略三、实验结果零样本性能消融实验下游任务微调定性分析可视化结果展示四、结论与贡献InstructBLIP&#xff1a;迈向通用视觉语言模型的指…

Elasticsearch+Logstash+Filebeat+Kibana部署【7.1.1版本】

目录 一、准备阶段 二、实验阶段 1.配置kibana主机 2.配置elasticsearch主机 3.配置logstash主机 4.配置/etc/filebeat/filebeat.yml 三、验证 1.开启Filebeat 2.在logstash查看 3.浏览器访问kibana 一、准备阶段 1.准备四台主机kibana、es、logstash、filebeat 2.在…

Vue开发前端报错:‘vue-cli-service‘ 不是内部或外部命令解决方案

1.Bug: 最近调试一个现有的Vue前端代码&#xff0c;发现如下错误&#xff1a; vue-cli-service’ 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文件。 2.Bug原因&#xff1a; 导入的工程缺少依赖包&#xff1a;即缺少node_modules文件夹 3.解决方案&#xff1…

AI生态,钉钉再「出招」

如果说之前钉钉的AI生态加持更多的围绕资源和商业的底层助力&#xff0c;那么如今这种加持则是向更深层次进化&#xff0c;即真正的AI模型训练能力加持&#xff0c;为垂类大模型创业者提供全方位的助力&#xff0c;提高创业成功率和模型产品商业化确定性。作者|皮爷出品|产业家…

XSS GAME靶场

要求用户不参与&#xff0c;触发alert(1337) 目录 Ma Spaghet! Jefff Ugandan Knuckles Ricardo Milos Ah Thats Hawt Ligma Mafia Ok, Boomer Exmaple 1 - Create Example 2 - Overwrite Example 3 - Overwrite2 toString Ma Spaghet! <h2 id"spaghet&qu…

Unity学习笔记(五)——3DRPG游戏(2)

添加更多的敌人 编辑EnemyController&#xff0c;解决报错导致敌人无法注册观察者模式&#xff0c;从而无法执行敌人庆祝动画 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.AI; public enum EnemyStatus { GUARD,PATROL…