芯片设计如何进阶

乐活   2024-10-17 10:58   北京  

——————————————————————————————

版权声明:

本文作者:烓围玮未。主要从事ISP/MIPI/SOC/车规芯片设计/SOC架构设计

首发于知乎专栏:芯片设计进阶之路

微信公众号:芯片设计进阶之路(x_chip)

转发必须授权,同时保留这段声明,盗版必究!

——————————————————————————————

在刚开始工作的时候,就一直在思考和寻找,作为一个芯片设计师,改如何通过选择和学习,能够一步步的成为一名资深的设计师或者架构师,或者成为一个设计的负责人呢?当时也没有找到合适的文章来具体描述,应该怎么做才能一步步的进阶升级。后来在面试中,平时交流中,或者知乎别人的付费咨询中,也一次次的提到这个问题。有没有一条芯片设计的进阶之路呢?

当然,这是一个很难的问题,因为每个人的情况和喜好都不同,实际中很多时候都是身不由己,所以也没有什么标准答案。但是我还是希望结合我这十几年的工作经验,从IP设计,到SOC 子系统负责人,到架构师的工作历程,能够给刚入行或者入行不久的一些芯片设计人员一些参考。

为了防止不必要的误解,先申明一下:完全是一家之言,如果你觉得不对,那一定你是对的。另外,这篇文章主要是给刚入行的一些芯片设计师作为参考,大牛们会心一笑就好了,或者在留言给出更好的建议也很欢迎。

那么下面我们开始。

芯片设计师的分级

首先,我个人喜欢那种很明确的升级体系,就像游戏里面的打怪升级一样,能够很明确自己所处的等级,以及下一步努力的方向。所以我个人给芯片设计师做了一个分级,完全非正式,暂且称为“芯片设计的W分级”吧:

等级1(Level1):基础级;

等级2(Level2):模块级;

等级3(Level3):子系统级;

等级4(Level4):芯片级;

等级5(Level5):系统级;

等级1(Level 1):基础级

基础级,是芯片设计师职业路径的起点。在这个阶段,你通常是一名刚入职的初级工程师或者正在通过教育和培训来打基础的学员。

以下是基础级芯片设计师需要掌握的技能和知识:

掌握程度说明:了解->熟悉->精通->专家

每个等级要求见下文

技能分类

技能详细描述

要求

补充说明和建议

电路基础知识

  • 电路理论:理解基本的电路原理,包括直流和交流电路、模拟信号和数字逻辑。

  • 电子元件:熟悉常用的电子元件,如电阻、电容、电感、二极管、晶体管等。

  • 数字逻辑:掌握基本的数字逻辑概念,包括逻辑门、触发器、计数器和寄存器。

  • 微电子基础:了解半导体物理和CMOS技术的基础知识。

熟悉

精通更好

对EE专业也就是科班出身的同学来说可能读书时代就完成了;对于非科班的,需要在平时慢慢补充这些知识,这个是基础的基础

编程和脚本

  • 硬件描述语言:熟悉至少一种硬件描述语言,如Verilog或VHDL,SV。

  • 脚本语言:了解至少一种编程语言,如Perl,Python,TCL,这有助于编写测试代码和自动化脚本。

精通

这是吃饭的技术,一定要精通,推荐使用verilog或者SV; VHDL在公司用的比较少;

可以买一本书或者Verilog的规范放在手边随时查看;

脚本学一个就行了,其他的都类似的,建议学python。可以学一下正则表达式,这个是所有工具都会用到的,受益无穷。

项目入门

  • 时钟和复位:熟悉时钟和复位的基本知识,异步时钟,同步复位异步释放等;

  • 基本模块:多级同步,同步FIFO,异步FIFO,SRAM读写等

  • 计算机体系基础:现代计算机的结构和基本构成要了解,基本的I2C这些需要了解

熟悉

这是做项目的入门知识,并且贯穿整个职业生涯,必须静噪掌握,然后在后面的项目中逐渐精通。复位可以看一下我之前的文章,理解了基本就差不多了。

异步FIFO一定要掌握,从原理到能够从0写一个100%没有bug的异步fifo是优秀的初级工程师的基本要求。

工具使用

  • Linux环境:熟悉Linux环境和命令。

  • EDA工具:能够使用基本的电子设计自动化(EDA)工具进行电路设计和仿真。VCS/VERIDI必须熟悉;

  • 版本控制:了解版本控制系统,如Git,这对于团队协作和项目跟踪至关重要。git/svn;

熟悉

Linux可以买一本经典的书学习一下基本命令和使用;

EDA工具先要学会自己使用VCS能建一个小环境,来验证自己写的RTL,至少能验证没有语法错误吧。

版本控制可以跟着公司使用什么就用什么,也可以提前学习GIT,现在GIT使用的比较多。

软技能

  • 沟通能力:能够与团队成员有效沟通,理解项目需求。

  • 文档能力:能够把自己工作和设计,通过文档或者PPT完整的展现出来。

  • 做事方式:靠谱的做事,事情闭环,汇报得体。

了解

团队沟通是最重要的工作技能,一定要刻意的学习一些;

文档是工作的呈现;

做事是一个长期习惯;

软技巧其实决定着你职场的高度,这里先不展开。

关于掌握程度的说明如下:

了解 (Awareness)

  • 知识水平:知道技术的存在和基本概念,可能在课堂上或通过阅读简要了解过。

  • 应用能力:能够理解技术的基本原理,但缺乏深入的实践经验。

  • 实践经验:可能没有或很少有使用该技术的经验,对于复杂应用可能需要指导。

  • 达成途径:阅读相关书籍或文章,参加入门课程或研讨会。

熟悉 (Familiar)

  • 知识水平:对技术有更深入的理解,了解其工作原理和常见用途。

  • 应用能力:能够在监督下应用技术解决简单的问题。

  • 实践经验:有使用该技术的直接经验,能够处理一些基本的故障和问题。

  • 达成途径:参与项目工作,使用技术解决实际问题,阅读技术文档。

精通 (Proficient)

  • 知识水平:全面理解技术的所有方面,包括其优势、局限性和最佳实践。

  • 应用能力:能够独立使用技术解决复杂问题,并能够优化和改进工作流程。

  • 实践经验:有丰富的实践经验,能够设计和实施技术解决方案。

  • 达成途径:指导他人,进行技术演示,编写高级教程或文档。

专家 (Expert)

  • 知识水平:对该技术有深入的理解和广泛的知识,包括最新的研究成果和行业趋势。

  • 应用能力:能够创新地使用技术解决极其复杂的问题,并能够进行技术领导和战略规划。

  • 实践经验:在该技术领域有长期的工作经验,可能是该领域的领导者或意见领袖。

  • 达成途径:进行高级研究,发表专业论文,制定行业标准,提供专业咨询

在基础级阶段,重点是打好坚实的基础,掌握必要的理论知识和实践技能,为后续的职业发展奠定基础。随着经验的积累和技能的提升,你可以逐渐承担更复杂的任务,并迈向下一个等级。

这个阶段根据自己的专业和基础,有些人可能一年就能完成,有些人可能需要好几年。而且阶段的划分可能不是你能决定的,可能你还没打好基础就被赶鸭子上架的去参加项目。很多公司其实没有培养新人的机制,直接派任务给你,可能导致你非常不适用,很多时候别人说话都听不懂,这样会深深的怀疑自己。有的同学工作三年了,有时候也会发现,他们聊的东西我居然一点概念都没有,深受打击。

为什么会这样呢,这就是基础阶段没有积累完成。公司不允许,自己基础差,这些都有可能。所以基础阶段最重要的是快速入门,先把需要掌握的集中突破,先把这个行业的基础知识和“行话”内化了,你就不会有这种感觉。比如提到复位,基本默认是异步复位同步释放,如果你还在纠结为什么要这么做,是没有人有耐心给你慢慢解释的,因为这是很多人的“常识”,所以快速入门,把通常的做法变成自己的常识才是变成成熟工程师的必经之路。

另外就是很多人被项目推着走,没有时间和精力去补基础,怎么办呢?我都建议也是带我的第一个老大的建议:每天至少花一个小时,不做项目的事情,而是提升自己。项目在忙也要先把这个时间提前预留出来,不然你永远是做了项目啥都没落下。有意识刻意的学习才能事半功倍。

无论你有没有读过基础级,在入职后,你经过短暂的过渡后,都必须进入下一级,模块级,开始负责具体的模块。而落下的基础,只能靠你自己慢慢补充,或者永远不补充,然后就会被下一级一直困住。

等级2(Level 2):模块级

不管是IP设计,还是SOC设计,现代的芯片设计都是分工合作,一旦参加项目,你都必须负责某个模块甚至是某个模块的一部分。

既然有分工,当然活有“好坏”,不可能每个人都能分到想要做的部分,特别是核心和关键模块需要有经验或者靠谱的人,或者有关系的人。这是正常情况。

如果是IP设计,比如ISP这个IP设计是你们主要的项目,那么像DNS, 去马赛克,HDR这些就是核心模块,一定是分给有经验的。刚入职的可能就只能分一些BLC这些小模块,甚至是小模块的一部分。

如果是SOC设计,那么CPU, DDR, 总线就是核心模块,还有AI处理部分的NPU这些都是核心模块。根据SOC性质的不同,比如安防,车载这些方向,多媒体ISP这些也是核心模块。

分到核心模块的一定要珍惜,没分到的也别抱怨,信任是慢慢建立的。你需要先把小事做好,让领导者觉得你靠谱,值得把核心模块交给你。

这个阶段的技能要求其实是再继续巩固基础知识的基础上,偏向于做事方式。由于IP设计和SOC设计差别比较大,下面分开来说。

IP设计技能要求:

技能分类

技能详细描述

要求

补充说明和建议

文档能力

  • 文档编写:能够清楚明白的把你需要设计的模块描述清楚:模块划分,功能描述,时序设计

精通

做IP设计的,在进行编写RTL之前一定要写一个设计文档的初稿,再开始进行RTL coding,然后在coding过程中去完善设计文档。

特别注意的是时序是设计出来的,不是看波形凑出来的。

做IP设计的,我认为设计文档编写能力比编程能力更重要,想清楚了,RTL就不会出大的偏差,请一定要重视。

编程能力

  • 编程能力:编程能力其实不太好量化,除了能够写出复杂的模块和优秀的PPA的模块,我认为可以分解一下:

    • 模块拆分。把大的模块拆分成合适的模块是一直能力。

    • 编程习惯。良好优美的编写习惯和代码风格其实是最重要的能力,公司都编码规则一定要follow,这是无数人总结的经验。有时间再去探究;

    • 优化和debug能力。这个其实是建立在扎实的基础,对模块的数学和分析解决问题的基础上的,如果不知道怎么培养,先把文档写清楚就是最快的方式。

    • 借鉴的能力。很多优秀公司,比如S家的代码写的最好,A家就差一点,其他小公司就更差了,所以尽量去找S/A家的源码研究学习一下,借鉴过来。

精通

提醒一下,借鉴不是抄,你要是能在项目上找一个一模一样的模块直接来用也是你的能力,但是基本不可能,每个项目需求是不一样的。

IP设计的精髓其实就是拆分,把复杂的IP拆分为一个简单的模块,然后用基本逻辑和FIFO,SRAM实现。

编程习惯一定要养成,这不仅仅是项目考虑,也是别人从代码就能看出你靠不靠谱的考虑。

优化和debug就慢慢积累经验吧。先把自己的东西完全搞明白想明白是基础。

项目知识

  • 项目整体:对项目要有大概了解,了解需求才能把自己的事情做好。

  • 基本模块:基础总线APB/AHB肯定会用到,可能会用到AXI,ACE等复杂总线。然后不同项目用到的基础单元不同;

  • 后端基本库:至少要了解一下工艺,后端使用的库,为综合做准备。

熟悉

这是做项目的入门知识,并且贯穿整个职业生涯,必须静噪掌握,然后在后面的项目中逐渐精通。复位可以看一下我之前的文章,理解了基本就差不多了。

异步FIFO一定要掌握,从原理到能够从0写一个100%没有bug的异步fifo是优秀的初级工程师的基本要求。

脚本和工具

  • EDA工具:VCS/VERIDI这些需要更加熟悉,从看波形到debug都离不开;还需要学习DC综合工具。

  • 版本控制:GIT/SVN的使用要熟练。项目的版本控制流程要完全掌握,可以自己搞个文档记录一下常用命令和流程。

  • 脚本:从0开始搭一个简单的VCS 非SVM的仿真环境是写RTL和debug的基本要求。你至少要保证你给出的模块没有语法错误,基本功能能跑吧。

  • SDC: 这个阶段需要接触SDC了,进行数字综合了。这是新手和老手的分界点。RTL其实是软件,RTL+SDC才是硬件。

  • 时序分析:需要能分析和解决时序问题。

熟悉

工具和脚本的学习,建议先系统整体的学习一下,然后在项目中提高。

SDC建议找个课程系统学习一下,S家就有系统课程,不过很贵。网上也有。最好以S家文档为基础。

软技能

  • 沟通能力:和设计的沟通,和架构的沟通和DV的沟通,做完一个项目可以总结一下;

  • 汇报能力:能够把自己工作和设计,通过文档或者PPT完整的展现出来,让别人清楚听明白,让领导知道自己的贡献。

  • 项目流程:IP设计验证流程要熟悉和总结,做了一次必须成为熟手。

了解

沟通是工作展开的基础;

汇报是升职的基础;

SoC设计技能要求:如果是自研模块,请按照IP设计能力要求,下面特指购买IP的集成工作。

技能分类

技能详细描述

要求

补充说明和建议

阅读能力

  • 文档编写:购买的IP模块,需要把IP文档都通读理解,然后再去编写集成设计文档。

精通

首先重点通读一次,把重点要标注出来

文档能力

  • 文档编写:主要是时钟频率,和外部接口连接等等。要按照项目的规范文档尽可能写明白。

精通

在进行编写RTL之前一定要写一个集成文档的初稿,再开始进行RTL coding,然后在coding过程中去完善设计文档。

这个阶段需要充分和上层的负责人员沟通,确保时钟频率复位等不出错。

专业能力

  • 专业能力:专业能力就是对应的专业知识。比如ISP你必须知道图像,GPU你必须知道图形处理,PCIE/DDR你要了解协议。这些专业知识才是IP的内核,而不是把代码集成就完事了。

精通

每负责一个IP就能搞懂一个方向,以IP的专业知识为抓手,发散出去,才能进阶到下一个阶段。不然,你做再多项目都是重复没有成长的工作。

项目知识

  • 项目整体:对项目要有大概了解,了解需求才能把自己的事情做好。

  • 基本模块:基础总线APB/AHB/AXI一定要很熟悉,经常翻阅协议。SRAM这些基本模块要有一定了解。

  • SoC设计流程:SoC的流程要了解,lint、cdc,综合流程需要会用。

  • 后端基本库:至少要了解一下工艺,后端使用的库,为综合做准备。

熟悉

SoC项目的流程到每个阶段的工具使用,这些都是有比较明确的规定。写代码的时间其实比较少,流程反而比较重要,一定要注意总结和记录。

脚本和工具

  • EDA工具:VCS/VERIDI这些需要更加熟悉,从看波形到debug都离不开;还需要学习DC综合工具,spyglass等工具。

  • 版本控制:GIT/SVN的使用要熟练。项目的版本控制流程要完全掌握,可以自己搞个文档记录一下常用命令和流程。

  • 脚本:从0开始搭一个简单的VCS 非SVM的仿真环境是写RTL和debug的基本要求。你至少要保证你给出的模块没有语法错误,基本功能能跑吧。

  • SDC: 这个阶段需要接触SDC了,进行数字综合了。这是新手和老手的分界点。RTL其实是软件,RTL+SDC才是硬件。

  • 时序分析:需要能分析和解决时序问题。

熟悉

工具和脚本的学习,建议先系统整体的学习一下,然后在项目中提高。

SDC建议找个课程系统学习一下,S家就有系统课程,不过很贵。网上也有。最好以S家文档为基础。

软技能

  • 沟通能力:和设计的沟通,和架构的沟通和DV的沟通,做完一个项目可以总结一下;

  • 汇报能力:能够把自己工作和设计,通过文档或者PPT完整的展现出来,让别人清楚听明白,让领导知道自己的贡献。

了解

沟通是工作展开的基础;

汇报是升职的基础;

芯片设计其实分为IP设计和SoC设计两个方向。IP设计偏重于RTL设计能力,SoC设计对某个方向的专业知识和流程的熟悉。这也是俩个职业选择方向,也可以互相转换。IP设计优点是编码比较多,能够不断锻炼自己的编程能力。SoC设计需要了解的知识面比较广,可以了解芯片生产的整个流程,容易扩展眼界。好的IP设计人员到后期一定是需要了解更多的SoC的知识,而好的SoC设计一定需要了解到IP内部。

模块级这个阶段是一个非常重要的阶段,也是比较难渡过的阶段,很多人可能一直困在这个阶段,只能一直负责一个模块,而不能做一些非常核心的工作。

如果你有机会负责核心模块,那么恭喜你,你可能比别人更容易进入下一阶段。如果你只是负责非核心的模块,也不用担心,精通于一个方面,也能做的很好。

这个阶段你可以选择深耕一个方面,比如一直做ISP/GPU/NPU;也可以做多方面的尝试,然后往系统方向发展。无论怎么选择,我都建议是,你至少在一个方面必须成为专家,然后在去做其他的。很多时候我们不是了解得不够多,而是不够深。而且很多方面是相通的,比如多媒体,你了解了ISP,再去学习GPU/Codec这些就很容易;比如高速接口,你学习了PCIE再去学习DDR就非常容易。

如果你对一个模块的了解达到了专家级,甚至不用达到专家级别。你就很容易去负责一个子系统了。比如你说设计GPU的,如果去做SoC,那么负责GPU子系统就很容易了。因为核心是模块后面的算法和专业知识,而不是这个模块的实现形式。

等级3(Level 3):子系统级

这个阶段需要掌握的技能其实和模块级是比较重合的,只是你需要更深入的了解和更广泛的专业知识。

技能分类

技能详细描述

要求

补充说明和建议

阅读能力

  • 文档编写:购买的IP模块,需要把IP文档都通读理解,然后再去编写集成设计文档。

精通

首先重点通读一次,把重点要标注出来

文档能力

  • 文档编写:主要是时钟频率,和外部接口连接等等。要按照项目的规范文档尽可能写明白。

精通

在进行编写RTL之前一定要写一个集成文档的初稿,再开始进行RTL coding,然后在coding过程中去完善设计文档。

这个阶段你自己就必须去设计子系统的架构,然后和内部模块负责人进行沟通。

专业能力

  • 子系统架构: 理解子系统的架构,包括处理器、存储器、外设接口等,并能够设计子系统的框架。

  • 系统集成: 能够将不同的模块和IP核集成为子系统,并确保它们之间的兼容性和协同工作。

  • 专业知识:内部模块了解到越多越好。

  • 总线知识:APB/AHB/AXI达到精通级别

  • 低功耗技术:对低功耗技术和UPF要熟悉

精通

这个阶段系统方案是一个重点,比如低功耗技术,Harden的划分等等。这个在子系统的架构设计就必须考虑,并且不断优化和演进。

项目知识

  • 项目整体:对项目要有完整了解,非常了解子系统的需求才能把自己的事情做好。

  • 基本模块:基本模块,sram都要比较熟悉。

  • SoC设计流程:SoC的流程要熟悉,lint、cdc,综合流程需要会用。

  • 后端基本库:后端流程和支持都要掌握,包括综合和时序分析等。

熟悉

子系统的负责人对流程是直接负责的,这个阶段复杂的事情会比较多,责任也比较大。所以一定要能达到你指导别人的程度。

脚本和工具

  • 工具和脚本:熟悉是基本要求,越了解工作越顺利。

熟悉

SDC和CDC是重点。

软技能

  • 沟通能力:和设计的沟通,和架构的沟通和DV的沟通,还有和子系统内部模块负责人沟通;

  • 汇报能力:能够把自己工作和设计,通过文档或者PPT完整的展现出来,让别人清楚听明白,让领导知道自己的贡献。

  • 团队领导: 能够在团队中担任领导角色,指导其他设计师,并协调跨部门的工作。

  • 项目管理: 具备项目管理能力,能够规划项目时间表,跟踪进度,并确保按时交付。

了解

子系统负责人事实上是这个方向的负责人,必须对内部一切负责。

也是对外接口,负责和软件,fpga,后端人员对接。

一般需要5年以上才能负责一个子系统,当然也有能力很强或者机遇很好的2~3年就开始负责子系统。这个阶段你需要掌握的了解到知识就非常多,需要处理的事情也非常多。不仅仅是对技术的考验也是对做人做事的考验。

这个阶段也会挡住很多人,可能很多工作了十年二十年的人都会一直处于这个阶段。同时,这也是对人提升比较大的阶段,你可以充分了解整个芯片流程,项目管理流程,了解整个芯片的各方面的知识。但是还是那句话,请先在一个方向成为专家。

如果你是负责DDR/CPU/总线,那么恭喜你,你比较容易进入下一个阶段。如果不是,你可能需要额外花时间或者找机会去了解和负责DDR/CPU/总线才能进入下一个芯片级。这是因为,DDR/CPU/总线就构成了一个芯片的最小系统,所有其他的子系统只是这个最小系统的延伸。

等级4(Level 4):芯片级

达到芯片级需要一点点运气和机会。你可能是一个芯片设计负责人或者是一个架构师。这个阶段你已经是芯片的某个方面的专家,而且对DDR/CPU/总线都非常了解,还了解了芯片设计各个方面的知识。总之,你需要全都懂一些,然后在某些方面特别懂。

如果是架构师,你可以说某些方面的架构师,比如CPU架构师,多媒体架构师,这些都要求相对低一点。如果是整个芯片架构师,那么比芯片负责人要求更高。架构师主要专注技术,同时沟通协调能力非常重要。

如果是芯片负责人,那么你必须指导你所有的组员,至少能够和他讨论,解决问题。同时主要考验管理能力。个人理解是技术+管理的双面人才。

这个阶段不是只靠学习能达到的,需要靠项目的磨练,通过负责整个项目,协调整个团队来达成。

如果一定要找一下方法,只能说技术上抓住DDR/CPU/总线,项目上学习团队管理和沟通,时刻做准备,等待机会了。

等级5(Level 5):系统级

系统级一般对应芯片的整个领导者,CTO或者总架构师。甚至可能一个公司都没有这种人。这个阶段需要对产业,对行业有很深的理解,同时结合自己技术和经验,从顶层设计芯片需求,架构这些。我也没达到这个级别,所以我只是见过,也不能给出太多的经验。但是我感觉,做到极致都需要从美学和哲学寻找答案,结合对技术的理解,做出顶层设计。这个级别直接决定芯片的成败。

芯片学习的另外两条线

通过芯片分级,可能你已经知道自己要怎么进阶了。另外还能从芯片学习的两条主线来寻找自己的短板和进阶目标:

  1. 芯片设计的各个阶段:从需求,架构到芯片TO;

  2. 芯片使用的各个阶段:从上电到正常运行,到各个场景的使用。

这些阶段都能提炼出需要学习和了解到内容,在迷茫的时候,不妨多了解。

这篇文章是结合个人经历和思考,对芯片设计进行一个分级,目的是能让有些刚入行和身在局中的迷茫者能有一点点启发,如果你能找到努力和进阶的方向,那就有意义了。时间仓促,没有好好完善。

戏作一篇,希望大家不要过度解读。如果有补充,大家也可以留言一起完善。

后记

技术很重要,技术背后的思想更重要!

技术背后的某些思想就是你解决以后问题的钥匙。我的文章可能一篇中知识点不太多,但是力求让你能深入理解,为你进阶打下基础。如果有一点点收获,也算是我对中国芯片行业的一点点贡献吧。

赠人玫瑰,手有余香。如果你有所收获,麻烦花一秒时间帮我点个赞和在看吧,谢谢!

知乎专栏:芯片设计进阶之路

微信公众号:芯片设计进阶之路 x_chip

——————————————————————————————



芯时代青年
专心数字前端全流程,芯时代有为青年的自我修养
 最新文章