24年5.12流片复盘

news/2024/9/25 17:21:29

非常值得纪念的一天,因为去年这个时候流片delay,今年顺利流出去了,这是一个大的进步,但是还是要做复盘。

首先是进度整体上的复盘。这次流片从一月初开始进行规划,到五月初投片,总共花费五个月时间,五个月内,按照最初的时间规划,一月是把规划基本都做完,给项目参与人员一段上手熟悉任务的时间,二月份开始推研发进度,三、四、五月份是紧锣密鼓的推进项目进度,前端一个月,后端一个月,最后一周多时间做merge和signoff。

对比规划,从实际情况来看,一月份总体规划上没有太大的问题,要设计的macro的基本方案和soc的方案都做完了,虽然还没写spec做详细的设计,但大方向已经没问题,各个方向的人也领了任务开始初步弄了。到了二月初,负责RTL开发,SystemC和UVM的都差不多上道了,虽然整体工程还没搭建起来,但工作算是开始进行了。

二月份,由于过年是在这段时间,加上年后我去了趟美国,二月份我自己这边实际上没推动多少进度,到了月底,RTL,SystemC和UVM各自有一些进展,RTL那边算是比较超过预期的,基本的SoC已经成功搭建起来开始run了,SystemC也有个可以跑的东西了,UVM仍然还在弄一些简单的demo,还没有按照设想的那样跑通自动化测试的流程。二月底我从美国回来之后,开始介入到各个人的工作中去,首先肯定是工程整体上把框架给建立起来,用CMake,Makefile和Shell搭建了第一版的all_in_one工程,可以使用shell脚本来启动包括RTL编译,RTL仿真,SystemC编译,SystemC执行,驱动软件编译的功能。这是最初步的版本,后来完善后的all_in_one工程的shell脚本包括了不同版本的RTL编译和仿真,RTL综合,SystemC编译可执行文件和执行,以及编译到动态链接库,UVM编译,UVM仿真,软件驱动编译等功能。搭建了这个工程后开始推进展迟缓的UVM那边的进度,以及安排RTL和SystemC负责的人开始挂载外设。

三月份是比较繁忙的一个月,按照规划需要把前端的部分全部完成,帮助UVM那边用DPI把多线程的问题调通了之后,我开始负责自己弄的macro那边的RTL和SystemC模型开发的部分,RTL的进度是比较快的,基本上按时完成了RTL上的开发,开始上FPGA进行调试,中间一些功能测试上碰到一些bug,前后总共消耗了大概两周的时间,UVM那边则是到了三月下旬终于搭建起了能够把RTL和SystemC模型放在一起自动比较trace的功能。我自己macro的部分在去上海开会时完成了RTL参考模型的代码,并交给模拟那边开始做原理图,在月底时弄完了SystemC的代码。整个macro的原理图部分delay了大概一周,在四月初完成了。

四月份同样繁忙,综合进度比预期慢了一周多一些,一方面是FPGA的调试debug比想象中的时间要久,本来以为一周可以结束,最后全功能pass实际上花了两周。然后我做综合时memory compiler上踩坑,一直在用ARM的memory compiler,后面发现原来是用MC2的,浪费了几天时间。UVM开始发挥作用,帮助SystemC模型和RTL发现一些暗坑,只不过由于整体进入后端了,除去特别严重的bug之外,代码基本上没有再做返工。macro原理图完成后开始进入后端,此时因为还没有进行仿真,macro还是有不少问题的。对macro做混仿debug的工作大概持续到了3月下旬,过程中发现的bug就反馈到原理图,已经验证好的模块立刻开始做后端。最后整个macro在五月一时刚好完成,比预期慢了一周。好在由于用了lef的方式去做,merge的时间被节省下来了,所以相当于是flow的改进刚好弥补了这一周的进度delay。数字后端的推进速度也比想象的慢,预期上对于我的小设计能一周左右出结果,但因为最后是三个人在一起做的,所以都是花了一个月的时间,到了五月初才把最终的gds给出来,比预期delay了一周多。四月底时还交了一版GDS去dry run,影响了一些进度。

由于前面的delay,最后的工作就比较紧了,实际上最后顶层大图加总体DRC,LVS clean大概消耗了四天左右,挺要命的,好在顺利signoff了。

最后对整体的得失做做反思吧,首先是做得好的方面,SoC整个研发过程中借用开源节省时间这个之前也说过了,此外一个比较重要的事情是把macro做了IP化,自己写了LIB,抽了LEF,让数模两边的进度得到了一些并行,所以两边虽然各自delay了一周,但是因为merge基本上没怎么花时间,所以最后总的进度还是赶上了,此外在整体规划时尽可能的将大部分工作放到数字flow里面去弄,并在顶层的模拟模块直接复用以前做好的模拟IP,也节省了一些时间,相比去年,模块和顶层的工作量都少了很多,后面会考虑进一步延续这个思路,把目前的LDO+PLL的Analog模块做一个IP,IO也放到自动化的flow里面。也可以看看ADPLL的设计,看看能不能直接做一个可综合的PLL的IP放进来,LDO变成片外的稳压。此外TSMC28的大部分问题我们已经很熟悉了,这次没有踩什么PDK上的坑。此外今年基本上处理了除了数字后端以外的全部flow,数字模拟的前端,数字综合,模拟的后端,包括merge,dummy,DRC,LVS等很多都是在我这边搞定的,也是验证了我的观点,在紧要关头,最靠谱的永远是自己。

做的坏的方面,还是老毛病,对进度的把控不够严格,造成了大概一周的delay,有些delay是项目成员身上的,而是我自己这边直接造成的,不过这里的delay其实反过来看,不一定是执行端上的问题,在做规划的时候把一些问题给想象的太简单了,以为一周能搞定,实际上碰到一些麻烦的bug就是得用两周,这也是说明项目管理不是一个简单的纯静态过程,定好几个ddl就可以不管了,过程中需要不停的动态考虑每个环节的时间,哪个能加速,也说明在进行项目规划时就得留好一到两周的余量(但这个余量不能放到明面上来讲)。然后是整体上flow是还是留了不少手动的部分,在最后导致了一阵慌乱,以后可以考虑进一步简化过程,这个上面也分析过了,不表。最后还是对新flow不熟悉踩坑浪费的时间,比如第一次做LEF,返修了几次才给出来能用的,还有memory compiler上的踩坑,也是花了一段时间才熟悉清楚,浪费了综合的宝贵时间,并且由于不熟悉memory compiler出的SRAM的时序,反过来导致原来在理想SRAM模型上跑通的设计又得回头debug,其实可以更早的把理想SRAM模型换到compier SRAM模型上。

总结:进一步优化flow,提升效率,整理好可复用的结构,明年可以以此为基础做进一步迭代,将SRAM Compiler设计加入仿真的flow提前,并把后仿的时间做进规划里。进一步提升能力,今年争取自己能上去做数字后端 ,今年外包确实做的太慢了,硬是把后仿的时间挤没了,甚至还导致差点来不及signoff。

工程文件树:

.
├── all_in_one.sh
├── hw
│   ├── fpga
│   └── tapeout
├── README.md
├── sc
│   ├── build_exe
│   ├── build_so
│   ├── CMakeLists.txt
│   ├── doc
│   ├── Dockerfile
│   ├── inc
│   ├── LICENSE
│   ├── log.txt
│   ├── README.md
│   ├── run.sh
│   ├── spdlog
│   ├── src
│   ├── tests
│   └── user_guide.md
├── sw
│   ├── project
│   └── toolchain
└── uvm├── prj├── tb└── work

all_in_one.sh脚本:

#!/bin/bash#define using kde or gnome
use_gnome=0if [ ! -n "$1" ]; thenecho "please input parameters, use './all_in_one.sh help' to see valid parameters"
fiif [ "$1" == "help" ]; thenecho "use './all_in_one.sh sw' to build software driver"echo "use './all_in_one.sh sc so' to compile shared library of systemc simulator for uvm running"echo "use './all_in_one.sh sc exe' to compile systemc simulator executable file for running simulator"echo "use './all_in_one.sh sc log' to run systemc simulator and save result to log, should be used after sc exe"echo "use './all_in_one.sh sc' to run systemc simulator and print result in terminal, should be used after sc exe"echo "use './all_in_one.sh hw fpga' to compile and run the fpga rtl code under soc testbench for peripheral function testing"echo "use './all_in_one.sh hw tapeout' to compile and run the tapeout rtl code under soc testbench for peripheral function testing"echo "use './all_in_one.sh hw xxxx jtag' to compile and run the rtl code under jtag testbench and start jtag debugger, xxxx should be fpga or tapeout"echo "use './all_in_one.sh hw xxxx sim' to show rtl simulation waveform in verdi, should be used after hw fpga or hw tapeout, xxxx should be fpga or tapeout"echo "use './all_in_one.sh hw tapeout syn' to run dc synthesis"echo "use './all_in_one.sh uvm com xxxx' to compile uvm verification platform, xxxx should be fpga or tapeout, should be used after sc so"echo "use './all_in_one.sh uvm sim [CASE]' to start uvm verification platform, [CASE] should be uvm case name, currently is my_case0"
elif [ "$1" == "sw" ]; thencd ./sw/project./build.shcd ../..
elif [ "$1" == "sc" ]; thenif [ "$2" == "so" ]; thencd ./sc./run.sh socd ..elif [ "$2" == "exe" ]; thencd ./sc./run.sh execd ..   elif [ "$2" == "log" ]; thencd ./sc./run.sh run > log.txtcd ..elif [ ! -n "$2" ]; thencd ./sc./run.sh runcd ..elseecho "invalid second parameter"fi
elif [ "$1" == "hw" ]; thenif [ "$2" == "tapeout" ]; thenif [ "$3" == "jtag"  ]; thenif [ ${use_gnome} == 1 ]; thengnome-terminal -- bash -c "cd ./sw/toolchain/openocd; sleep 10; pwd; ./jtag_tcp_gnome.sh; exec bash;"elsekonsole --noclose -e /bin/bash -c "cd ./sw/toolchain/openocd; sleep 10; pwd; ./jtag_tcp_kde.sh; exec bash;" &ficd ./hw/tapeout/prjmake vcs_jtagcd ../../..elif [ "$3" == "sim" ]; thencd ./hw/tapeout/prjmake verdi_soccd ../../..elif [ "$3" == "syn" ]; thencd ./hw/tapeout/prjmake dccd ../../..elif [ ! -n "$3" ]; thencd ./hw/tapeout/prjmake vcs_soccd ../../..elseecho "invalid third parameter"fielif [ "$2" == "fpga" ]; thenif [ "$3" == "jtag"  ]; thenif [ ${use_gnome} == 1 ]; thengnome-terminal -- bash -c "cd ./sw/toolchain/openocd; sleep 10; pwd; ./jtag_tcp_gnome.sh; exec bash;"elsekonsole --noclose -e /bin/bash -c "cd ./sw/toolchain/openocd; sleep 10; pwd; ./jtag_tcp_kde.sh; exec bash;" &ficd ./hw/fpga/prjmake vcs_jtagcd ../../..elif [ "$3" == "sim" ]; thencd ./hw/fpga/prjmake verdi_soccd ../../..elif [ ! -n "$3" ]; thencd ./hw/fpga/prjmake vcs_soccd ../../..elseecho "invalid third parameter"fielif [ ! -n "$2" ]; thenecho "please give second parameter, fpga or tapeout"elseecho "invalid second parameter"fi
elif [ "$1" == "uvm" ]; thenif [ "$2" == "com" ]; thenif [ "$3" == "fpga" ]; thencd ./uvm/prjmake vcs_com_fpgacd ../../..elif [ "$3" == "tapeout" ]; thencd ./uvm/prjmake vcs_com_tapeoutcd ../../..elif [ ! -n "$3" ]; thenecho "please give second parameter, fpga or tapeout"elseecho "invalid third parameter"fielif [ "$2" == "sim" ]; thencd ./uvm/prjif [ -z "$3" ]; thenecho "Usage: $0 uvm sim [CASE]"exit 1fiCASE=$3make vcs_sim CASE=$CASEcd ../../..elif [ ! -n "$2" ]; thenecho "please give second parameter, com or sim"elseecho "invalid second parameter"fi
elseecho "invalid parameter, please use ./all_in_one.sh help to see valid parameters"
fi

进度表:

image

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

kettle从入门到精通 第五十九课 ETL之kettle 邮件发送多个附件,使用正则轻松解决

问题场景: 一个朋友说他用kettle将生成好的多个文件(a.xls和b.xls,文件在data目录下)发送给客户,但是data目录下还有其他的文件,他如果指定data目录发送会把 data目录下面的所有文件都作为附件进行发送,显然不符合要求,所以他当时的临时解决方法是创建个临时目录,里面…

VSCode养宠物

安装扩展vscode-pets https://marketplace.visualstudio.com/items?itemName=tonybaloney.vscode-pets 安装好后点击右下角的小松鼠图标选择一个宠物 选择一个颜色 起一个名字 回车 如果想要删除 ctrl + shift + p Pet Coding: Remove pet

抽丝剥茧:详述一次DevServer Proxy配置无效问题的细致排查过程

事情的起因是这样的,在一个已上线的项目中,其中一个包含登录和获取菜单的接口因响应时间较长,后端让我尝试未经服务转发的另一域名下的新接口,旧接口允许跨域请求,但新接口不允许本地访问(只允许发布测试/生产的域名访问)。 问题 那么问题来了,本地环境该如何成功访问到…

QT: Expression:c = -1 c = 255

报错内容分析错误 注意看报错位置位于isctype.cpp文件的Line:36我们打开isctype.cpp,其36行内容如下 extern "C" int __cdecl _chvalidator(int const c, int const mask) {_ASSERTE(c >= -1 && c <= 255);return _chvalidator_l(nullptr, c, mask); …

Pyqt6Pyside6 信号与槽详解

信号与槽 对于可视化编程,需要将界面上的控件有机结合起来,实现控件功能的联动和交互操作。比如点击按钮,实现某项功能。对按钮功能的定义,是通过信号(signal)与槽(slot)机制实现的。信号与槽是PySide6编程的基础,也是Qt的一大创新,有了信号与槽的编程机制,在PySide6中处…

minio依赖报错

引入minio-sdk后启动报错 现象一 1缺失kotlin.collections.ArraysKt.copyInto([B[BIII)[B解决方法 提升kotlin-stdin依赖 <dependency><groupId>org.jetbrains.kotlin</groupId><artifactId>kotlin-stdlib</artifactId><version>1.3.70<…

黄河流域挑战赛WEB部分-gxngxngxn

黄河流域公安院校挑战赛WEB部分-gxngxngxn myfavorPython pickle反序列话,开启debug,用报错 import os import pickle import base64 class A():def __reduce__(self):return (exec,("raise Exception(__import__(os).popen(cat flag.txt).read())",))a = A() b = …

新版FLASK下python内存马的研究

新版FLASK下python内存马的研究 风起 2月中旬的某一天,跟@Ic4_F1ame无聊时聊起了出题的事。当时是打算出道python题目(菜🐕的我之前只会出php的)。两个卑微web🐕一起讨论出题,于是就有了下面的聊天,也是罪恶的开始(bushi):内存马初体验 当时正好看到一篇关于flask如何打…