大家好,我是IC修真院的Andy老师,今天我们一起来学习ASIC数字前端设计课程,在讲课程之前,我们首先来看一些基本的知识点。
那目前来看无论是ASIC设计还是SOC的设计,基本的都是TOP down。首先,我们会有需求分析,就是说你要为谁做一个的产品,有了这个需求以后,会先一步的细化,我们的芯片的规格是什么样子,把我们的spec定义出来,定义出来以后会把这个spec进一步的break down,比如说到一些子系统的模块的一些spec,然后,就可以交给数字设计工程师们,也就是我们这些设计人员,开始我们的rtl coding,那在这个过程中,设计人员和验证人员要共同的协作。
验证人员负责功能的验证,当然,也可以有设计人员进行初步的验证,那验证的依据,验证的标准都是来自于我们的spec,也就是我们的vo,我们的verification objective,也是来自于我们的spec,那关于验证,我们在后续的课程中,会进行了深入的讲解,以及练习。
那我们把coding完成以后,就是synthesis,所谓synthesis,就是把你写的代码,把你的一种表述转换成另一种的表述,比如说转化成lab里面的cells。那综合完成以后,就给到所谓的后端,进行所谓的布局布线,那在这个当中,会有很多的验证分析,你的timing是不是满足。这块目前是比较经典的一个设计流程,同学们应该已经都比较清楚了。
那从数字设计来讲,我们要具备的一些基本知识,可能需要以下的内容,就是说如果是从低往高里看,可能你要对这个晶体管,transistor,有一些了解。那更往上的,比如说有transistor搭建而成的基本的数字单元电路,像latch、加法器,这些都要了解。然后,再往上就是从具体到抽象一层,我们这个时候可能是便于开展大规模的设计。我们是用verilog的描述,那在集成电路的早期,比如说90年代,使用其他形式来进行ASIC的设计,但那个时候的效率跟现在我们用verilog,在做描述和在做综合这条路上,在效率上是不可同日而语了,但并不是说这条路是不可行的,只是说从效率上来讲,可能会偏低一些。
那有了这些基本点以后,我们要熟悉目前的开发,一般都是在UNIX或者linux这个环境里边,我们对EDA的库要有基本的掌握。
比如说,你的编译,modelsim,VCS,ICVEILOG不同厂家的,不同公司的,功能基本都差不多,但是,我们要有所掌握和有所了解,另外,设计的时候,从一些基本的单元设计起来以后,到一个顶层的时候,如果你的系统里边有一些复杂的模块,有些IP在里边,所谓的IP就是说,它是一些软核,那可能我们上面还会有一些这个互联,比如说,是不是有一些network on chip,连接到一块儿去,那你需要对这些基本的协议,基本模块的功能有一些了解。这是我们要了解的一个内容,就是说,不能因为我是做数字前端设计的。我就仅仅集中在这个verilog上面,verilog是要掌握,但是对底层也是需要掌握,比如说,后来要做ECO,ECO分析,有一些分析它需要精确到晶体管的时候,如果你具备了这方面的知识,那你的理解,定位,和其他人相比就更具有优势。尽管不是说是针对analog,analog这是毫无疑问的,所以我们要对这个transistor,对他这些曲线要很了解,但是对数字的设计,我希望同学们也要对这些有深入的了解。
另外,我们今天讲的课程的叫ASIC数字前端设计。什么是ASIC,Application Spicecific Integrated Circuit,对吧,现在大型的一个asic实际上跟soc并没有显著的差异性,AISC可能有时候,是非常专用的,那他在宏观上的理解,会比SOC可能规模上要小一点,流程上要简单一点,一会儿我们对比讲解一下。
这就是所谓的通用芯片,那另外就是我们现在都很熟悉的SOC的概念,在90年代2000年的时候,慢慢的随着工艺线条的减小,已经能把许多的模块,包括的analog的集成到一起去,把一个系统,原来可能是在一个PCB的level,那我做的SOC上面。那如果一个soc放不下,可能用几个SOC,然后把这几个soc再封装到一个package里边,IP的形式。那在这个大型的SOC设计当中,存在一个design的问题。不是说是你需要不需要的问题,是必须的。如果在一个大型的SOC或者说是一个非常复杂的ASIC电路里边,你如果里面有CPU,那工作就需要有软件的参与,那我们定义的时候,哪些东西需要有硬件来完成,哪些东西需要有软件来完成,这个在项目的初期,一定要有一个规划,有一个取舍,硬件实现有它的优点与缺点,软件实现有它的优点与缺点,那怎么去做这个折中,这是在我们的项目开始的时候要进行考虑的。
另外就是刚才也提到的design spec,这是非常非常重要的,那在一些非常成熟的企业公司里边会专门的架构师。他们一般是比较有经验的,会负责收集我们要开发的产品的各种规格。写成文档性的东西或者是图或者是表,或者是兼而有之,我们一起把它deliver出来,那这个spec是非常非常重要的。它不但作为我们设计人员的一个参考,也可以做为我们架构师今后的发现,哪个地方定义的不合格,有问题,也是依据这个进行修改。
软件人员也可以拿这个,作为一个参考,验证人员也可以拿这个参考,所以说design spec是非常重要的。我们经常会听到spec,就是说如果我们的ASIC规模非常之大,或者说是一个复杂的SOC,可以想象一下,如果上面有DSP,有MCU,甚至有CPU,还有很多其他的像DMA,很多的master,很多的slave,那这地方互联的时候,那就是一个问题了。我们一方面要考虑复杂度,另一方面要考虑它的效率,那现在比较成熟的就是所谓的片上互联NOC,NOC可能现在有很多种。
另外就是前面提到了spec,早期的spec,一般会出自于我们的所谓的架构工程师,有同学经常会听到这个,有的公司叫CONNCECT,有的公司叫architecture,涵盖的业务范围可能不太一致,但是基本都是负责这个方向,甚至有的公司叫system engineer,我们一般包含RTL coding的,设计的叫DE,验证的一般就叫VE,现在业界比较流行的就是uvm,以前的SV进化到现在的UVM。所谓的前端后端基本是以综合的那个点为界,在综合之前,那前端主要是负责功能实现,后端的主要是实现物理,进行流片。
另外,在ASIC设计当中,随着规模的增大,文件数量的增多,版本的迭代,代码的修改,我们需要有一个版本的控制,所谓的version control,那现在国内用的非常多的SVN。那一定要有一个版本的控制,大家基于共同的一个库来开发我们复杂的SOC。没有版本的控制很容易就出错了,最后可能拿到的文件不是你想要的,那就前功尽弃了,
所谓的ASIC,我们不要局限于一个概念,是没有任何意义的,那我们有的ASIC当中,有一个简单的MCU或者是有一个简单的CPU,那实际上它是可以去进行编程的,是有灵活性的。
另外就是刚才讲到的,ASIC设计呢,我们可以借鉴一下经典的SOC,最早的时候设计的几个经典的技术,一个是所谓的深亚微米,现在已经是肯定是达到了,还有一个IP,并不是说,只有在SOC的设计当中才会用到IP,无论是hard IP,soft IP,还是firm core,在我们的ASIC设计当中,现在也大量的启用IP,为什么?因为他已经经过验证了,它的功能基本OK的,只是实现的时候,随着我的TECHNOLOGY的工艺不同,可以进行不同综合的映射,他并不是说是SOC专有的。那大型的SOC当中,它的hardware software code design这是必须得,是不可避免的。这是由于SOC的复杂性所决定的,那我们开始设计的时候,最早的时候software没有东西,因为hardware也没有做出来,没有依托他写一些IP,那可能是拿一些C,SYSTE C,写出来的一些类似于behavior的东西,那有了这个东西以后,软件的人员可以在早期的时候开始他的SOFTWARE代码的开发,那这样子就是可以把一个原来是一个串行的工作,现在转化成一个并行的工作,大大地提高了我们的工作效率。
因为很多时候我们IC设计人员,一定要纠正一个错误的偏见,就是认为软件不重要,软件实际上是非常重要的。那我们作为一个IC designer,我们认为自己很重要,那是没错的,因为没有这个东西,那就无从谈起。但是,将来真正的到costumer那边去,他接触到的实际上是你的软件,所以说软件非常之重要,它直接影响到用户的感受,OK,这个地方,就是说对比经典的SOC设计,是有很多地方是有相同之处的。
需求分析,我们做一个产品的时候一定要问自己,我为谁做一个什么样的产品?无论是谁都是要解决这么一个问题。马斯克他做的这个飞机,他解决一个什么问题?那就是人类移民到火星去,那苹果做的这个产品,他当时解决什么问题,就是你的PC你的lapTOP太大了不方便,我能不能把所有的功能,集中的一块儿去,然后iPhone就面世了,那我们做IC的时候也是在规定的时间,有限的人力和物力的前提条件下来开发的。我们不是去做一个预言,做预言是另外一个概念,那如果说你要做一个产品出来的话,一定是由上市时间压力的,跟需求的,你错过了这个时间段,尽管做出来了,但是获得的收益可能就大幅的下降了,所以说在做一个东西的时候,首先它是新鲜的,还是说我要取代已有的,比如说我原来有一个东西,一直是从国外买的,那现在他不卖给我了,我要为这一个产品做一个替代的产品,那一定是有时间,人力,物力的限制。
那正规的大型的公司里面做一个产品的时候。一般都会有市场部,他会到市场上去进行分析,分析有什么样的需求,未来3到5年的,趋势是什么样子的?这个趋势一定要迎合我们的工艺,发展的趋势和节点,面向未来,还要看我们的竞争对手在做什么样的东西,我做出来以后有没有竞争力,有没有卖点?那这当中就可以体现出我就要跟他做的不一样。就是差异性,创新性,有前瞻性,那典型的例子就是苹果的这个IPhone,乔布斯当时确实是很具有前瞻性,这么一个产品当时还具有轰动性,后来大家做出了这个东西以后都去follow,那就是说我们做这个东西的时候,一般会有两种情况,一个是全新的产品,原来没有reference design,你做出来的这个东西就是一个pilot PROJECT。无论是你的架构,你的想法,你的实现,他都是全新的。
那这个时候可以想象一下,因为没有reference design,前人没有做过,所以说你这个难度非常大的,开发的周期也可能会非常长,风险也是非常高的,一旦失败那可能真的失败了,但是一旦成功那就不得了,IC行业一定是这个样子的,如果回过头来看看很多经典的公司的成长经历都是这样子的。
我们举一个intel例子,Intel原来也是这样子,他本来是做memory,做着做着被日本的公司逼得几乎要破产了,但是他另辟新径,去做一个小的MCU,转了方向,转变的观念,后来这个东西卖的很好,以前是给计算器上calculator用的,做出来以后,他处于垄断性的,只是近几年,随着AMD的崛起,他没有把它给打压下去,所以现在的处境也不太妙,那还有一些产品我们在做的时候是这样子的,就是说我已经有些reference design了。随着性能的提高,比如说我原来是这个16位的,现在要求提高了,要做成32位,甚至是做成64位。我的性能要提高。那这些是属于你的fature的改动。你有一个reference design,起码你的架构里边有一个MCU,他只是原来是16位的,performance不够,可能我的时钟频率也不够高,那现在市场上需求一个性能更高的,那我们经过充分的计算以后发现只要是把这个提高到32位去,时钟在再提高一倍,就满足了客户的需求了,那这个时候相对来说,你的难度是低的,风险也是低的。
OK,也就是说,尤其是ASIC里边,一定是有一个需求分析在里边的,那需求分析完了以后大家会说要啥要啥。
需求分析完了以后,要出什么的东西,出你的文档,把需求,展望,这些东西都列出来,性能指标是一个什么的东西,甚至是跟competitor这边的,你的这个性能指标是什么样子都列出来,形成文档性的东西,那出了这个spec以后,他尽管不够明晰,但是它可以作为我们架构师,以他为基础进一步的去进行细化。我们设计人员也可以拿到这个spec,知道接下来要做一个什么东西,可能是MCU要从16位扩到32位去,那我这个NOC是不是要做相应的改动,因为我原来也是16位的。
设计人员就可以在早期的时候进行思索,我的CLOCK又提升了,从200M可能要到500M去,那做PL的同事就得到消息了,原来他要这样子做,那就可以提前准备一下。我做CLOCK的同时要早期的准备一下,就是这个spec一定要早期形成,给到我们后面的人员。
需求分析完了以后,就是我们的架构师要早期建立参与了,那功能架构的定义实际上就是说我们前面有需求了,我们架构师的工作方向就确定了!他可能不是一些技术控,他不太懂技术,他就是说,人家要有个什么样的东西?又能够跟谁家的相比?它里面列了一些需求。那架构师是要把这些东西进一步的break down,甚至是形成详细的条条写到我们的spec里面去,将一个原来模糊的大的功能框图,我进一步的把它BREAKDOWN细化。你可以形成一些图表,也可以一些详细的description,一些描述,甚至把这些条条分章分节列出来,这就是我们所谓的产品的spec,一般来讲,里边的图是少不了的,里面的表是少不了的,有了这个大的spec。实际上还可以进行细化,一个大的章节,针对每一个系统有一个细化,像系统的SPECIFICATIONPK,甚至是子系统的,以及模块的。比方说这个地方给大家一个例子:我一开始的时候,也不清楚,它里面可能要去从外边接收一些什么样的东西进来,进来我处理完以后,再给输出去,可能就是个这东西,从这个大体的描述上,我们知道里面就是要有一个MCU或者一个CPU,它能够把外面的接收进来,进来的是什么?是一些声音?是什么声音?这可能是需要进行处理的,然后,要把这个东西处理完,在转出去。那就需要有MCU,他会有一些创新的通讯,像UART,以及我们对外采样的这个ADC、甚至反馈的DAC,
那这个图大家看一下非常的粗,为什么,要举个例子来讲,你拿到这个图是没法去开始coding的,你的ADC,你的performance是几个channel,没有说清楚。你的memory也没有写清楚。Io port的详细情况也没有写清楚。但是没有关系,我们有了这个图以后,我们可以逐步的细化,比如说,对汽车上的某一个应用的,那我们就可以把它细化。
那这个图跟上面相比起来,他就细节上就更多了,比如说,我的ADC有很详细的,我需要是10 bit的。我需要这个flash多少?我的SRAM是多少呢?这些都给你列出来。这就是在前期,从客户需求那边到架构师在慢慢的把这个功能进行细化。
那在细化的时候还有一些选型!我这个MCU选什么样子的,我是选择ARM的比较简单的,还是选择RASC_V,还是说用简单得这个8051,这都是你需要进一步的去细化的。
功能模块的划分你的power、security、clock、reset、interrupt。这些都需要逐渐的细化出来。一共有多少个CLOCK,reset是采用什么样子的,那这个时候就可以慢慢细化出来了。如果是有多个MASTER进行互联的时候,那我就牵扯到这个偏差互联的结构,那我采用什么样的形式?这个时候也可以慢慢的细化。
接口是AXI,有DDR,可能需要AXI了,还是说简单的AHP就可以了,甚至说有一些,我就去访问配置,选择APB了,那更复杂的还有一些是OCP的?随着细化出来以后,你就知道这个SPI是需要四线的,还是2线的,URAT的波特率是多少,我的performance是需要什么样子,就可以写到我们的spec里面去,以及我们的这个port的引脚。将来出pin的是出多少个,你是要在这个国内的某个线上,还是到国外的,那你的工艺是什么,工艺定下来了,那你的电压,频率,功耗,你是用在什么样的场合?如果你说你打游戏的,这个可能要求不高,但如果你是嵌入式的话,那可能对这个功耗,温度,可靠性的要求就不一样了,那设计规划形成以后呢,我们可以进一步的break down。
接下来是比较详细的功能的划分了,刚才我提到了的功能的划分,主要是强调的是软硬件功能划分,在一些比较小型的ASIC当中,实事求是的讲这个可能不是一个重点。
但是,在一个大型的ASIC以及SOC当中,确确实实可能是一个重点,尤其是一些pilot project!就说我一开始写一些C MODULE。另外就是我借助FPGA,先把这些东西先搭出来,RTL那边你继续走,FPGA同步开发,那是不是让软件底层的开发可以在FPGA上同步进行,所有的工作都是一个软硬协同了一个问题,主要是一个效率,一定不能等到我按部就班spec,从市场上拿到需求定spec,划分,交给designer,开始去做。做完了以后产品回来了,再去开发软件,那时候太晚了,too late。
那就是说软件跟硬件的拿捏是非常重要的,你做成硬件,好处在哪里,速度快,performance高一些。但是,你的开发周期更长,关键是你的灵活性差,容错率低,你说要验证的呀,但是我们知道验证不是万能的。
IC设计是有复杂性的,大家可以想象一下,咱们不说现在的这个五纳米七纳米,大家可以想象一下成千上万的管子在上面,你的逻辑有一个地方出错了,你做成硬件的,一旦没有补救措施,可能就因为这一个BUG。这整个产品就fail了。需要严谨再严谨。光个人的严谨是不够的,还需要有有成熟的flow,我们照着这个flow去看一遍,知道是这个思路,我们在产品定义的时候,要把这些东西想清楚,开发的时候要严谨,不能说产品开发初期的时候,举个例子来讲,我现在要做一个很高清的电视的芯片,我作为一个32K的,我要用到IP,PCIE的这个性能要到多少,HDMI的性能要到多少,但是,现在市场上就没有这些IP对不对,你说你自己去研发吗?那来不及?这就不切实际了。那我们做了前期的,如果是切合实际,开发中,我们一定要慎之又慎,验证的时候,把VO定义清楚,严格的按照流程。你的spec lass,认认真真地分析一下CDC,RDC认认真真的看一下。这是设计阶段出来以后,你就没有办法了,那就是说你在前期的时候,你要把DFT的东西要做进去。出来以后,他能够帮你把这些里边有defactor的地方,给你筛选掉。这些都做过了,去跑功能,那一旦fail了,我有没有手段能够定位到是在哪一个模块里面出问题了,这就是所谓的DEBUG AND trans。这也是在我们项目开发的初期,架构师定义的时候,需要考虑的。千万不能说不需要,我都是跑软件,软件去看就OK了。对一个大型的SOC,这是非常不切实际的。
回过头来再说一下,就是说我们做这个东西的时候,刚才我也讲到了,你不要做的不切实际,你有多大的能量,你做多大的事儿。不要不切实际的去定义性能指标,对不对,他一定不是一个一维的空间,你说我有坚强的毅力,我爬过喜马拉雅山,很好。做IC不是光有毅力的,我细心,我非常细心,也不是光有细心就可以做到的。
我们在这ASIC设计当中的一些小的asic,我们完全可以借鉴很多大型的ASIC当中的一些开发经验,开发技术,因为你说现在的大型ASIC不比soc复杂度低。那我们很多技术可以互相来借鉴来用,另外,就EDA tooling的重要性,现在IC design里边,说实话,你人多你加班不解决根本性的问题,EDA tooling是非常关键的。但是,这几乎都是垄断性的所以说,希望同学们的在这方面也多多的努力。这个呢,就是我如何是从一个soc最后把内部的东西呢定义出来,这个东西我们就是skip了。
这个地方讲一个例子,就是说DMA,我们知道在很多系统里面有DMA,那DMA这个东西跟我们设计的初期功能划分的时候,我们就要考虑CPU能力足够强不?这些东西在早期的时候一定要定义清楚,不要说一开始有问题到后来发现报错,特别CPU那儿,data来不及处理,那这就出问题了。
另外呢,一个比较典型的例子,比如说像这个DVFS,那在一些这嵌入式的应用当中,像手机会经常会用到这个DVFS,因为动态的跳动。
比如说,手机,我一会儿黑屏了,把他踹到口袋里边,那这个时候,他是实际是没有关机的。这个时候因为你只是从battery进行供电的,这是他唯一的power的来源,我要想方设法地去降低功耗,那我们知道这个功耗,除了静态功耗,动态功耗,那他跟工作频率,工作电压是有很大的相关性。那么,这个时候他不怎么工作,他可能只是跟基站间歇性的去交换一些信息,那么这时候,我可不可以把频率降下来,原来是两个G,现在不需要了,可不可以降到200M。随之电压是不是也可以降下来?这些省下来的都是功耗,那就意味着你的电池的寿命更长。
比如待机,我用的这家整天下来我八个小时不充电,但人家那个是十六个小时不充电,那这个卖点,这个芯片的竞争力是不是就很强了。那这个DVFS呢,做的时候也要想清楚,我是通过硬件来做,从状态机,有一个去监测这个monitor的这个workload的?发现workload低了以后呢,把频率降下来个,把电压降下来,这个workload来了以后,把这个电压起来,频率再升起来,还是说通过软件的方式来做,那么放一个小的MCU它去monitor去workload,他负责调整。