2021-01-28

本文详细介绍了芯片设计的全过程,从总体规划、架构/算法设计、RTL代码编写、仿真验证、工艺选择、综合与功耗分析、形式验证到自动布局布线。强调了每个阶段的关键任务和工具,如MATLAB原型验证、Synopsys DesignCompiler和PrimeTime的使用,以及形式验证的重要性。整个流程涉及数字和模拟芯片设计的不同方面,最终通过DRC、LVS验证后进行tapeout。

芯片设计流程

本文转自:http://www.eetop.cn/blog/html/30/1638430-2316722.html

https://blog.youkuaiyun.com/kaopuguyue110/article/details/80181806?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.control

一、总体规划。

       随着集成电路设计规模的不断扩大,出现了很多成熟的常用设计模块,也被成为IP核,现在芯片正向设计,不再是完全从0开始,都是基于某些成熟的IP核,并在此基础之上进行芯片功能的添加。真正从0开始设计的芯片,不是没有,而是成本太高,企业无法承担,而且也并没有必要从0开始设计。例如现在的ARM芯片开发,那些大公司基本上是获取ARM公司的授权,得到ARM芯片的IP核,并根据细分市场的需求进行有针对性的开发。这是数字芯片的情况,模拟芯片的情况也是类似的,当然我们并不能小看别人的原创能力,以为就是随随便便在别人的基础上小修小补就可以设计出令人满意的芯片,还有很多东西依然是需要丰富的经验和知识的。芯片正向设计依然是从市场未来需求着手,从开发成本和预期收益来衡量是否进行芯片的开发的。明确市场未来需求之后,就将这些需求转化为芯片的各项重要参数指标,然后进行任务划分,模拟设计师负责模拟,数字设计师负责数字。个人对于模拟部分不太熟,所以就略过。重点总结数字设计部分,当然这部分也不是很熟,因为没有真正做过。

二、架构/算法。

       现在数字电路在芯片中占有极大的比重,数字逻辑也变得越来越复杂,所以必须从架构和算法上进行考虑。个人所略知的关于芯片架构的是,架构可以分为三种大的方向:1,数据流;2,控制流,3,总线流。数据流:数据从输入到输出是一条直线,并没有折回的数据,这是纯数据处理的一种架构,这种芯片功能应该是比较单一。2,控制流,这是基于状态机或者CPU形式的一种架构设计。简单点的芯片就采用状态机就够了,复杂的就必须采用CPU作为控制内核了,比如单片机就是以CPU为控制内核,外加RAM,ROM所形成的一类控制类芯片。3,总线流,这是基于总线的芯片设计架构,最熟悉的就是SOC类芯片,总线上连接着一个或多个CPU,RAM,ROM,I2C,UART等等之类的各种组件。由这些组件的不同排列组合,形成满足各种不同需求的芯片,例如不同的ARM类芯片。

       算法,我所略知的是通信类的,例如,FIR,FFT,小波变换,三角函数变换等等,当然还有视频音频类的算法,对与这方面的内容就没有接触过了。总的来说,这类算法都是以数据处理为主要目的的,所以这些算法都要求有较强的数学功底。做算法开发,主要工具为 MATLAB,都是先在MATLAB上做原型开发验证,再转化为RTL级的代码。

        结合架构和算法,将芯片的总体结构搭建出来,为后续的工作做好了准备。

三、RTL代码。

       当算法工程师把芯片架构设计好,各种算法在MATLAB上通过了验证,以及其他必要条件的考量之后,便将工作交接给ASIC工程师去做RTL代码的翻译工作,就是将MATLAB上的算法翻译成RTL。这一步单纯从翻译的角度只需要一个文本编辑器就可以了。然而,还有后续的仿真验证工作,这部分的内容并不轻松。有时候根据公司的不同,根据项目的工作量大小,算法工程师与ASIC工程师在工作内容上是有交叉的,他们也承担将MATLAB转换为RTL的工作。RTL设计的时候也会考虑DFT(Design For Test 可测性设计)的问题,会在RTL代码中加入测试链,这个我就不太熟了。

四、仿真验证。

       这一步的工作比较关键,可以说是设计部分的第一个分水岭。仿真验证,视不同的公司,不同的项目,复杂度有非常大的不同。简单的,只要写一个较为完善的testbench验证完RTL代码的功能就行了;复杂的,将会在RTL验证环境下进行详细的验证,甚至可能用得到各种验证方法学UVM,VMM,OVM等等,这种复杂验证所用的语言一般采用 SystemVerilog。验证软件可以采用cadence公司的 NC_VERILOG,或者synopsys公司的 VCS。此外,某些芯片还会采用FPGA,进行硬件在线仿真。这样能够获取关于芯片的更为详细的信息。但不管如何,无论是个人还是公司,都应该有对于仿真验证工作的一套完整和完善的流程方案。

五、工艺选择。

       正向设计在一开始的整体规划中就要考虑工艺的问题,这涉及到有关工艺的相关知识,有些工艺就是特别为某种类型的芯片而开发的。所以一旦是要开发某种有对应工艺的芯片,则直接采用即可,但往往工艺的选择会特别耗时间,会有各种参数的考量,例如工艺生产周期,工艺的成品率,工艺生产时间的安排等等各方面的考究。这部分,需要花费特别多的时间。工艺由芯片制造厂提供,前提是必须和芯片制造厂有合作关系。

 六、综合、时序&功耗分析。

       这一步是在RTL仿真验证完之后进行,当然还有一个前提,制造工艺必须选定,否则,如果中途换了工艺,这部分的工作还得重新来做,这样将会消耗特别多的时间。这部分的工作主要用到synopsys公司的工具 Design Complier(综合)、Prime Time(时序和功耗)。这两个工具的使用比较复杂,使用说明参考百度文库相关资料。总体来说,这两个工具都是约束驱动型软件,软件在使用时都是靠约束文件来进行驱动的。所以工作的主要内容除了软件的使用外最重要的就在于如何编写约束文件。一般而言,约束主要有面积约束,扇入扇出约束,时序约束等约束条件。如果RTL代码不满足约束,则必须根据具体情况修改约束条件或者是修改RTL代码。约束条件是用 TCL脚本语言来写。综合和时序分析会生成基于所采用的工艺的电路网表,这个网表将是下一步自动布局布线所用到的主文件。

        主要工作内容:1、准备好选定的工艺库文件(综合网表文件、时序文件库);2、根据设计要求编写TCL约束脚本;3,操作软件,生成约束报告;4,分析约束报告,修改或调整不合理的约束或者修改RTL代码(RTL代码不会轻易修改,这要求在RTL设计时就要考虑这些约束要求,以便于能够通过约束分析)。

七、 形式验证。

       综合出来的网表正确与否如何判定呢?这需要用到形式验证技术,该技术与RTL的仿真不同,它是从数理逻辑出发,来对比两个网表在逻辑上的等效性。如果等效,则综合的网表就是符合要求的。用到的工具为synopsys 公司的 Formality 形式验证工具。其实,形式验证是在每一次芯片的逻辑电路转换为另一种表达形式的时候都需要做的工作。具体来说,在综合生成网表后做一次,主要对比的文件为RTL仿真之后的文件和综合之后的网表,在布局布线之后还需要做一次,主要对比文件为综合之后的网表与布局布线之后的网表。主要工作内容:1、准备好待比较的两份文件及各种工艺技术库文件;2、用TCL脚本编写脚本程序,设置其中一份文件为比较标准,其中一份为待比较文件;3、运行Formality,分析生成的比较报告;4、根据报告做出相应的调整与修改。详细过程参考:http://wenku.baidu.com/link?url=tJHCqbSVaq-nbLfWJEPZCGK4yuPWOC7bVs6SQ0fvuS89CsqR00Yjc3_axvympjCRHJRLq-EVJPmh21I12oVz_FZaEECMFy433MhJZfgkdWa

八、自动布局布线。

       这个步骤严重依赖于软件和经验,目前常用的软件为 Cadence Encounter不同版本的自动布局布线软件名字可能不一样。Synopsys公司也有对应的自动布局布线的软件 ASTRO,最新版本为ICC套件。软件的使用同样可以在网上找到相关资料,这里就不细说了。主要工作内容:1、准备好工艺文件(时序文件库 数字版图库);2,准备好综合之后的电路网表文件及约束文件;3,根据设计要求,设置好版图面积等相关参数,4,进行自动布局布线,检查时序和功耗,如果不满足要求,则再次修改相关参数,直到符合设计要求为止。自动布局布线需要注意的是:数字信号一定要关注好关键路径的延时问题,这一点曾经是数字设计的关键问题。现在,据说,时序已经不再是芯片设计的主要难题了,主要难题已经转移到了功耗上,在设计的每一个阶段都要考虑功耗的问题。

       模拟部分似乎是没有数字部分那么多的工具需要使用,但模拟部分的电路设计最考究的还是工程师们的设计经验,而这些经验都是要靠时间才能堆出来的。模拟电路的每一个模块都需要很多的时间去验证,比说一个高性能的放大器,一个与工艺和电压无关的带隙基准等等。模拟的版图只能是一个一个管子的画,没有自动布局布线的必要,因为模拟电路的管子也不会很多。

       剩下的工作就是合并整体的版图,并进行DRC、LVS的各种验证,通过之后就可以tapeout。之后再制定测试规范,这与反向设计的剩余步骤是一样的。另外,有时候版图还需要做 ECO( Engineering Change Order)工程修改命令, 是指在原有的设计 的基础上如果要作一些改动,可不必从头再来,可以在原来的布局上通过 eco 步骤快捷地 完成设计。

 

本系统旨在构建一套面向高等院校的综合性教务管理平台,涵盖学生、教师及教务处三个核心角色的业务需求。系统设计着重于实现教学流程的规范化与数据处理的自动化,以提升日常教学管理工作的效率与准确性。 在面向学生的功能模块中,系统提供了课程选修服务,学生可依据培养方案选择相应课程,并生成个人专属的课表。成绩查询功能支持学生查阅个人各科目成绩,同时系统可自动计算并展示该课程的全班最高分、平均分、最低分以及学生在班级内的成绩排名。 教师端功能主要围绕课程与成绩管理展开。教师可发起课程设置申请,提交包括课程编码、课程名称、学分学时、课程概述在内的新课程信息,亦可对已开设课程的信息进行更新或撤销。在课程管理方面,教师具备录入所授课程期末考试成绩的权限,并可导出选修该课程的学生名单。 教务处作为管理中枢,拥有课程审批与教学统筹两大核心职能。课程设置审批模块负责处理教师提交的课程申请,管理员可根据教学计划与资源情况进行审核批复。教学安排模块则负责全局管控,包括管理所有学生的选课最终结果、生成包含学号、姓名、课程及成绩的正式成绩单,并能基于选课与成绩数据,统计各门课程的实际选课人数、最高分、最低分、平均分以及成绩合格的学生数量。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
你已经成功将 `Date` 列转换为 `datetime64[ns]` 类型,并且输出如下: ``` 0 2021-01-04 1 2021-01-05 2 2021-01-06 3 2021-01-07 4 2021-01-08 Name: Date, dtype: datetime64[ns] ``` ✅ **这说明日期解析完全正确!** 接下来你应该执行: ```python df.set_index('Date', inplace=True) df.sort_index(inplace=True) # 确保时间顺序正确 ``` 然后进入主逻辑,使用我们之前修复过的区间筛选函数(作用于索引)即可正常运行。 --- ### ✅ 当前状态确认清单 | 检查项 | 是否完成 | 说明 | |--------|----------|------| | ✔️ `Date` 列是否为 `datetime64[ns]`? | ✅ 是 | 输出已验证 | | ✔️ 是否设置为索引? | ⚠️ 需手动执行 | 必须调用 `set_index` | | ✔️ 时间是否升序排列? | ⚠️ 建议排序 | 使用 `sort_index()` 更安全 | | ✔️ 区间过滤函数是否作用于 `index`? | ✅ 是 | 否则会出错 | --- ### ✅ 推荐后续代码(确保流程完整) ```python # 设置索引并排序 df.set_index('Date', inplace=True) df.sort_index(inplace=True) # 查看数据类型和前几行 print("Index dtype:", df.index.dtype) print("Data head:") print(df.head()) ``` 此时你的 `df.index` 是一个有序的 `DatetimeIndex`,可以安全用于以下操作: ```python intervals = { 'YTD': lambda idx: idx >= pd.Timestamp(year=idx[-1].year, month=1, day=1), '1Y': lambda idx: idx >= idx[-1] - pd.DateOffset(years=1), '6M': lambda idx: idx >= idx[-1] - pd.DateOffset(months=6), '3M': lambda idx: idx >= idx[-1] - pd.DateOffset(months=3), '1M': lambda idx: idx >= idx[-1] - pd.DateOffset(months=1), } ``` 因为 `idx[-1]` 就是最后一个交易日,比如 `2024-03-28`,它是一个 `pd.Timestamp`,支持 `.year`、`.month` 等属性,不会再报错! --- ### ✅ 示例:查看当前 YTD 起始日 你可以加一段调试代码来验证逻辑是否正确: ```python # 调试:打印各个区间的起始时间(以最后一个日期为基准) last_date = df.index[-1] print(f"最新交易日: {last_date}") print("各区间起始日:") print("YTD:", pd.Timestamp(year=last_date.year, month=1, day=1)) print("1Y: ", last_date - pd.DateOffset(years=1)) print("6M: ", last_date - pd.DateOffset(months=6)) print("3M: ", last_date - pd.DateOffset(months=3)) print("1M: ", last_date - pd.DateOffset(months=1)) ``` 输出示例: ``` 最新交易日: 2024-03-28 各区间起始日: YTD: 2024-01-01 1Y: 2023-03-28 6M: 2023-09-28 3M: 2024-01-28 1M: 2024-02-28 ``` 这些日期就是每个区间的“开始日”,之后用它们做布尔索引就能提取对应时间段的数据。 --- ### ✅ 总结:你现在可以继续了! 只要你完成了以下几步: 1. ✅ 成功将 `Date` 转为 `datetime64[ns]` 2. ✅ 执行了 `df.set_index('Date')` 和 `sort_index()` 3. ✅ 使用基于 `idx`(即 DatetimeIndex)的过滤函数 那么之前的两个错误(`float64 has no attribute year` 和 `>= not supported`)都已彻底解决,现在可以放心运行完整的绩效分析代码。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值