忍者要沉着冷静、仔细判断。打破忍者世界规则与铁律的人,我们都叫他废物。
——旗木卡卡西
有诗赞曰:
“彼时需求未讲完,娇客代码已成片。编码规则全不管,开发流程亦枉然。三月之后哭丧脸,自己程序陌路见。最笑经理曾夸叹,效率第一为状元。”
一个工程项目,刨除市场等环节,对于工程师团队而言,自需求始到产品交付终,期间林林总总的事务与形形色色的人物真是一言难尽。却说老衲最怕的队友,是不是“猪一般的”存而不论,就是所谓上面诗中提到的快码手。这类人的具体表现在诗中已经说得很清楚了,此处不重叙。按照道理,这是一个开始唠叨“CMM(Capability Maturity Model for Software,软件成熟度模型,俗称“藏猫猫”)”、“大V(和微博无关,请勿对号入座)瀑布开发流程”和“文档控制”这些内容的时机,奈何这些实在和本书的内容强烈不相关,贫僧只好忍痛割爱了。
在ASIC及/或FPGA的开发过程中,也要符合很多规范,这是毋庸置疑的,这正是“没有规矩,不成方圆”说的道理。更有甚者,这两个应该属于硬件的范畴,其调试(debug)的难度更高,系统测试的代价也更大。麻匪的师爷都知道“酒要一口一口地喝,路要一步一步地走……步子迈大了,容易扯着蛋!”。不要告诉我有工程师不晓得,会遭雷劈的……
“轰隆隆!”
“哎呀,不用这样印证老衲的话吧!……你个道人,没事玩什么天罡五雷功,我又不是人妖!”
经常有客官把FPGA设计与ASIC前端设计两个工作搞混,这其中当然有种种历史原因,但是也不乏有些人的居心叵测。当然,这个话题也不宜展开,客官做到瞎子吃饺子——心中有数即可,老衲只能念叨“做人要厚道”、“人坚不拆”。本讲要介绍开发流程,如果混在一起聊不是不可以,但是容易让初学者混淆,算是有意无意的误导。为了明确,在经过穆老仙首肯之后,决定采用“花开两朵,各表一枝”的描述方式。
闲言少叙,言归正传。书接前文,上面已经聊到了所谓“ASIC前端设计”这个概念。其实呢,既有“前端”,想必也有“后端”了?
“叮!答对了!”
ASIC前端设计(也称逻辑设计)和后端设计(也称物理设计)在理论上没有统一严格的界限,但是在业界一般以网表文件为界限区分。涉及与工艺有关的设计就是后端设计。数字前端以设计架构为起点,以生成可以布局布线的网表为终点;是用设计的电路实现想法。数字后端以布局布线为起点,以生成可以送交投片进行流片的GDS2文件为终点;是将设计的电路制造出来,在工艺上实现想法。
说到这里,贫僧认为很有必要给大家讲一讲网表文件。
网表文件,小名“.ngc 文件”,曾用名“连接表”,洋文名“netlist”。在电子设计领域,和“网表”重名的人极多,不加区别后果很严重。特此声明,本书里所说的“网表”均指与数字逻辑/芯片/FPGA 领域有关的特别上忍。“网表”的家庭关系为:母“逻辑设计”(一般是Verilog/VHDL设计代码),父“综合器”,属于“门级”一族的精英。捎带说一句,这两位老人经过“设计流程”的介绍相亲,绝对属于明媒正娶。网表的作用类似于“日向一族”的分家,用来保证其母(宗家)“逻辑设计”的安全。
在电子设计自动化中,网表是指用基础的逻辑门来描述数字电路连接情况的描述方式。由于逻辑门阵列有着连线表一样的排列外观,因此称之为“网表”。网表通常传递了电路连接方面的信息,如模块的实例、线网及相关属性。如果需要包含更多的高抽象层次的逻辑信息,通常会使用硬件描述语言,如Verilog/VHDL或其他的专用语言来进行描述、验证和仿真。高抽象层次(如寄存器传输级)的硬件描述可以通过逻辑综合转换为低抽象层次(逻辑门级)的电路连线网表,这一步骤目前可以使用综合器完成,这可以大大降低设计人员处理超大规模集成电路的烦琐程度。后端工程上利用上述网表,可以制造具体的专用集成电路或其他电路。
一句话总结:网表是门级表示,具有更加强大的防御。
回到正题,接着说说ASIC设计流程这件事。列位已经知道了,ASIC设计分为前后两端,两者的国界是网表文件。
前端工程师的工作是从市场的需求开始的,到输出网表结束。
(1)规格制定:芯片规格,也像其他工程项目一样,是客户通过市场部门向芯片团队提出的设计要求,包括芯片需要达到的具体功能和性能方面的要求。
(2)概要与详细设计:根据客户提出的规格要求,拿出设计解决方案和具体实现架构,划分模块功能并且定义明确的模块间接口。
(3)编码:使用硬件描述语言(Verilog/VHDL)将模块功能通过代码来描述实现,也就是将实际的硬件电路功能通过HDL语言描述出来,形成RTL(寄存器传输级)代码。
(4)仿真验证:检验编码设计的正确性,检验的标准就是(1)中制定的规格。看设计是否精确地满足了规格中的所有要求。规格是设计正确与否的黄金标准,一切违反、不符合规格要求的,都需要重新修改设计和编码。设计和仿真验证是反复迭代的过程,直到验证结果显示完全符合规格要求为止。
(5)逻辑综合:仿真验证通过,进行逻辑综合。逻辑综合的结果就是把设计实现的HDL代码翻译成门级网表。综合需要设定约束条件,就是你希望综合出来的电路在面积、时序等目标参数上达到的标准。逻辑综合需要基于特定的综合库,不同的库中,门电路基本标准单元(standard cell)的面积、时序参数是不一样的。选用的综合库不一样,综合出来的电路在时序、面积上是有差异的。
① STA(Static Timing Analysis,静态时序分析):这也属于验证范畴,它主要是在时序上对电路进行验证,检查电路是否存在建立时间(setup time)和保持时间(hold time)的违例(violation)。这是数字电路的基础知识,当一个寄存器出现这两个时序违例时,是没有办法正确采样数据和输出数据的,因此只以寄存器为基础的数字芯片功能容易出现问题。
② 形式验证:从功能上对综合后的网表进行验证。常用的就是等价性检查(Equivalence Check)方法,以功能验证后的HDL设计为参考,对比综合后的网表功能,看它们是否在功能上存在等价性。这样做是为了保证在逻辑综合过程中没有改变原先HDL描述的电路功能。
前端设计的流程就到这里,从设计程度上来讲,前端设计的结果就是得到了芯片的门级网表电路。
集成电路后端设计流程如下。
(1)MOS 管设计的任务:根据门电路技术指标确定 MOS 管的具体参数(包括跨导、门限电压、电源电压、最大电路、输入/输出特性等),确定具体参数后,还需要进一步算出满足参数设计要求的 MOS 管几何参数和工艺参数(包括宽长比、栅极宽度、漏极和源极面积、金属连线宽度等)。
(2)布局布线设计:根据逻辑电路结构,完成版图电路设计,即通过连接网络把MOS 管连接起来,形成所需要的逻辑电路,在这一过程中,还需要完成设计规则检查(Design Rules Check,DRC)、电气规则检查(Electronic Rules Check,ERC),以及版图与电路原理图对照检查(Layout Vs Schematic,LVS)。当所设计的版图完全通过上述三项检查后,就可以对电路的参数进行抽取,并形成 Spice 文件了(真正交给集成电路生产厂商)。
(3)验证:所抽取的参数和Spice网表能够通过Spice仿真满足设计指标要求,则完成了整个集成电路后端设计。
图1.6是一个统一的ASIC设计的鸟瞰图,请诸位参考。前端工程师的工作更加偏重于逻辑与行为,后端工程师的任务则倾向具体物理器件。在不同公司或不同项目中,上述流程和命名可能有所差别,这也在所难免。但是基本的任务与步骤却是不能省略的,这就是“忍者世界的规则与铁律”。
虽然ASIC工程师被分为前端和后端两类,而且似乎两者的工作还是“铁路警察——各管一段”的。但是,往大里说有“精诚团结”的训诫,往小了去大家也不希望成天加班返工,因此前后端必要的合作不仅仅是必需的。在实际项目开发过程中,设计不可能一帆风顺的,往往存在各种返工。后端不是什么垃圾设计都可以兜住的。如果实在无法完成设计,会打回前端重做(真的到了这个时候,老板绝对不会给前端部门好脸色看的。俗话说:“和气生财,和气生财!”)。排除需求变更的原因之外,最常见的原因就是前期设计的时序太紧张。因此,前端部分的时序分析应该说是非常关键的一个步骤,需要加倍认真和细致。这里适合采纳卡卡西的后半句名言“不懂得珍惜同伴的人,则是废物中的废物”;换句时髦的网络用语,就是“不要做猪一般的队友”。
图1.6 ASIC设计流程
前面已经提到过ASIC前端和FPGA设计的工作是有区别的。从大面上看上去,FPGA设计工程师似乎更加勤劳,好像会做完 ASIC 前端与后端的所有工作。其实这只是表面现象,实质还是ASIC前端牛一些,具体原因待某家先介绍了FPGA设计的活计再来详谈。这就是孙子曰的:“知己知彼,百战不殆。”
故事的开头是一样的,都从市场部门的产品需求开始说起;但是,最后的结果却是完全不同的,FPGA的输出是可以供FPGA初始化时应用的二进制文件。FPGA的设计流程就是利用EDA开发软件和编程工具对FPGA芯片进行开发的过程。典型FPGA的开发流程一般如图1.7所示,包括功能定义与器件选型、代码/原理图设计、行为仿真、综合、综合后仿真、布局布线、时序仿真、板级仿真及芯片编程与调试等主要步骤。实际开发中具体厂商的集成环境和第三方工具的使用方法将会放到本书的最后一部分,结合实际开发的例子进行介绍。这叫作“耗子拉木锨——大头在后头”。
在FPGA设计项目开始之前,必须根据需求对应系统完成功能的定义和模块的划分。还需要根据这些需求评估系统的复杂度,对工作速度和器件本身的资源、成本及连线的可布性等方面进行权衡,选择合适的设计方案和合适的器件类型。
这个过程一般都采用自顶向下的设计方法,即把系统分成若干个基本单元,然后再把每个基本单元划分为下一层次的基本单元。如此这般,这般如此,颠颠倒倒,倒倒颠颠,一直做下去,直到被分解为全部是基本元件为止(幸好还不至于“子子孙孙无穷尽也”)。
与ASIC设计不同的是,一般FPGA厂商提供了一些常用IP核(IP core)供设计者采用。由于厂商具有对FPGA内部结构更为了解的天然优势,所以这些设计的效率要优于一般开发者的设计。但是是否应该大量采用这种核,而使设计者尽量退化为连线工具的问题,却是“仁者见仁,智者见智”的事情。本着“技术中立”的原则,不讨论FPGA厂家背后的商业利益,老衲只说一句:“如果这个FPGA是为将来贵公司的ASIC做前期验证的话,还是尽量少用为妙”。至于其他嘛,这里就不多说了,列位客官们看着办。买的没有卖的精,南无阿弥陀佛!
图1.7 FPGA的开发流程
代码/原理图设计是将所设计的系统或电路以开发软件能够理解的某种形式表达出来,并输入给 EDA工具的过程。常用的方法有硬件描述语言(HDL)和原理图输入方式。
原理图输入方式是一种最直接、最符合传统硬件工程师习惯的描述方式,在可编程芯片发展的早期应用得比较广泛。它将所需的器件从元件库中调出来,进行连接,画出原理图。这种方法虽然直观并易于仿真,但效率很低,且不易维护,不利于模块构造和重用。其更主要的缺点是可移植性差,当芯片升级后,所有的原理图都需要做一定的改动。
目前,在实际开发中应用最广的就是 HDL 代码的方法,利用文本描述设计,它可以分为老式HDL和现代HDL。老式HDL有ABEL、CUR等,支持逻辑方程、真值表和状态机等表达方式,主要用于简单的小型设计。现在这些语言基本已经绝迹了,符合“优胜劣汰,适者生存”的道理。而在中大型工程中,主要使用现代HDL,其主流语言是Verilog语言和VHDL语言。这两者都具有利于自顶向下设计,便于模块的划分与移植,可移植性好,具有很强的逻辑描述和仿真功能,而且输入效率很高。除了 IEEE 标准语言外,还有厂商自己的语言。
也可以采用HDL为主,原理图为辅的混合设计方式,以发挥两者的各自特色。
行为仿真(也称为前仿真)是指在编译之前对用户所设计的电路进行逻辑功能验证,此时的仿真没有延迟信息,仅对初步的功能进行检测。
仿真前,要先利用波形编辑器和 HDL 等建立波形文件和测试向量(即将所关心的输入信号组合成序列;Test Vector,TV,注意不是电视机),仿真结果将会生成报告文件和输出信号波形,从中便可以观察各个节点信号的变化。如果发现错误,则返回设计修改代码。
所谓综合就是将较高级抽象层次的描述转化成较低层次的描述。综合根据目标与要求优化所生成的逻辑连接,使层次设计平面化,供FPGA布局布线软件进行实现。
综合(Synthesis)是指将设计输入编译成由与门、或门、非门、RAM、触发器等基本逻辑单元组成的逻辑连接网表,而并非真实的FPGA内部电路。真实具体的门级电路需要利用FPGA制造商的布局布线功能,根据综合后生成的标准门级结构网表来产生。为了能转换成标准的门级结构网表,HDL 程序的编写必须符合特定综合器所要求的风格。由于门级结构、RTL 级的 HDL 程序的综合是很成熟的技术,所以所有的综合器都可以支持到这一级别的综合。
综合后仿真检查综合结果是否和原设计一致。仿真时,把综合生成的标准延时文件反标注到综合仿真模型中去,可估计门延时带来的影响。但这一步骤不能估计线延时,因此和布线后的实际情况还有一定的差距,并不十分准确。
目前的综合工具较为成熟,一般可以省略这一步,但如果在布局布线后发现电路结构和设计意图不符,则需要回溯到综合后仿真来确认问题之所在。在行为仿真中介绍的软件工具一般都支持综合后仿真。
布局布线利用实现工具把逻辑映射到目标器件结构的资源中。这一步骤需要在满足给定条件(如时序约束)的前提下,获得逻辑的最佳布局,并且选择逻辑与输入/输出功能连接的布线通道进行连线,并产生相应文件(如配置文件与相关报告)。该过程达成了将综合生成的逻辑网表配置到具体的FPGA芯片上的战略目标。
布局布线是FPGA设计过程中最重要的过程。布局将逻辑网表中的硬件原语和底层单元合理地配置到芯片内部的固有硬件结构上,并且往往需要在速度最优和面积最优之间做出选择。布线根据布局的拓扑结构,利用芯片内部的各种连线资源,合理正确地连接各个元件。
目前,FPGA 的结构一般都非常复杂,特别是在有时序约束条件时,需要利用时序驱动的引擎进行布局布线。布线结束后,软件工具会自动生成报告,提供有关设计中各部分资源的使用情况。
由于只有FPGA芯片生产商对芯片结构最为了解,所以布局布线必须选择芯片开发商提供的工具。
时序仿真(也称为后仿真)是指将布局布线的延时信息反标注到设计网表中来检测有无时序违规(即不满足时序约束条件或器件固有的时序规则,如建立时间、保持时间等)现象。
时序仿真包含的延迟信息最全,也最精确,能较好地反映芯片的实际工作情况。由于不同芯片的内部延时不一样,不同的布局布线方案也会给延时带来不同的影响,因此在布局布线后,通过对系统和各个模块进行时序仿真,分析其时序关系,估计系统性能,以及检查和消除竞争冒险是非常有必要的。在行为仿真中介绍的软件工具一般都支持综合后的时序仿真。
系统工具即使针对同一个设计,针对不同芯片和/或管脚安排的布局布线也不同,这个比较容易理解。即使针对同样的芯片和管脚安排不同的布局布线的结果也是不尽相同的。因此,如果一个设计被应用到不同的FPGA芯片上或者重新安排了管脚,则需要分别对芯片各自进行时序仿真工作;如果重新进行了布局布线,也必须重新通过时序仿真。
板级仿真主要应用于高速电路设计中,对高速系统的信号完整性、电磁干扰等特征进行分析。一般都采用第三方工具进行仿真和验证,此时FPGA仅仅被视为PCB上的一个元件。这个工作一般由PCB工程师完成,FPGA设计者仅需要提供他们所需的模型文件。
设计的最后一步就是芯片编程与调试。芯片编程是指产生使用的数据文件(二进制文件,Bitstream Generation),然后将编程数据下载到FPGA芯片中。芯片编程需要满足一定的条件,如编程电压、编程时序和编程算法等。
逻辑分析仪(Logic Analyzer,LA)是FPGA设计中真实PCB调试的主要调试仪表,但需要在FPGA输出端及PCB上引出一定量的测试管脚,而且LA的价格相对较高。目前,主流的 FPGA 芯片生产商都提供了所谓的内嵌逻辑分析仪(如 Xilinx ISE 中的ChipScope、Altera Quartus II中的SignalTap II及SignalProbe)来解决上述成本问题,但是它们需要占用芯片一定的逻辑资源。
最后引用穆老仙的一句名言:“只仿真、不上(PCB)板的设计,都是耍流氓!”(穆:“阿嚏!这个贼秃,居然造谣,我转发你500次,叫汝吃不了兜着走!”)
正文说完,现在是“非维基却解密”时间,重点回答“为什么实质还是 ASIC 前端(相对于FPGA设计)牛一些”这个问题。首先,存在一个规模上的问题,无论如何,FPGA 设计的工程规模还是比 ASIC 的规模小得多。规模越大,设计难度越大。其次,从流程上来看,虽然FPGA工程师完成了ASIC前端与后端两个人的工作,但是实际上,FPGA 对应的“后端”主要依赖厂商的工具,和 ASIC 的后端不可同日而语。这一点很多人都不清楚。最后,FPGA 是“半定制化”的芯片,比不得 ASIC 这种芯片,需要操心的内容少得多。例如,在FPGA中产生的时序问题,大多数都是由于组合逻辑太大引起的,查起来相对怀疑点集中(性急的听众朋友可能会问“什么是组合逻辑?什么是时序?”,大家不必着急,后文自有介绍。而且还不是简介,是听到你要吐的啰唆)。说了这么多,估计还是会有人不服,没事,穆老是那种“请印度人吃火锅——专治各种不服”的主儿。
这正是:
“芯片阵列思路炫,数字电路为本源。龙生九子事妙玄,两者设计用心专。专用分为前后端,网表文件相互传。现场门阵责任全,需求结果板上见。”