老书的一般开头都是:“道德三皇五帝,功名夏禹商周……”的。这本是科技书,自然不好说神话了。我们的故事是这样开始的:按照大爆炸理论,电子产生于宇宙产生的0.01秒之后,此后经历了大约137亿年的沧海桑田,终于有了现在的世界。之所以,这里要专门提到电子,是因为这个小小的基本粒子是我辈电子类的工程师可以混饭吃的物质基础。
人类对于电磁波的利用的历史,相对于宇宙的历史,那可谓是白马过隙,是极短暂的一个瞬间。从电子管算起,经历晶体管和集成电路,到现在也不过几十年时间。数字电子技术,作为对自然世界的一种抽象,出现绝不早于第二次世界大战。但是,绝不要小看我们的前辈,戏文唱得好“(我诸葛)怎比得前世的先生”,虽然诞生的时间短,但是电子技术却是长久地和深远地改变了人类的生活。可以说现在大多数人已经很难在没有电子设备的环境里面生活了。
1.武林大佬ASIC
可以说,在20世纪70年代、PLD(Programmable Logic Device,可编程逻辑设备)出现之前,所有数字电路的设计都是ASIC(Application-Specific Integrated Circuit,专用集成电路)的天下。除了利用RAM(Random Access Memory,随机存取存储器)做LUT (Look Up Table,查找表)的几个江湖败类,偏安于黑暗的角落之外,A派颇有“一统江湖,千秋万代”的趋势。这个时代的集成电路都具有以下几个特点:面向特定用户的需求,品种多、批量少,要求设计和生产周期短,它作为集成电路技术与特定用户的整机或系统技术紧密结合的产物,与通用集成电路相比具有体积更小、重量更轻、功耗更低、可靠性提高、性能提高、保密性增强、成本降低等优点。
由于不同芯片制造商的工艺的区别,ASIC的设计需要根据自己选择的制造商的特点进行设计。为了简化问题、减少矛盾,90 年代随着逻辑综合工具的出现,ASIC 设计被人为地划分为前端和后端。前端 ASIC 工程师负责数字逻辑设计,而不用操心制造的麻烦。后端 ASIC 工程师只管布线和工艺,不去管逻辑是否正确。这两种工程师以门级网表(neilist)为界,井水不犯河水,可谓分工明确,其乐融融的一派祥和气象。在工程实践中,大伙儿都遵守下面的江湖规矩。
首先,一组大虾需要规范新的 ASIC 的所有需求,完成需求说明。之后,称之为架构工程师的大师出马,进行系统结构设计。
下面的头领们用HDL(Hardware Description Language,硬件描述语言)来完成这些功能。这个过程,用高层的RTL(Register-Transfer Level,寄存器传输级)模型表现。
再下面的喽啰们,开始做仿真工作进行逻辑仿真、集成验证和系统评估,来论证步骤2里面的设计没有问题。
利用综合工具把RTL级设计转化为被称为标准单元低层结构。这种结构使用了制造商预定制的产品特征库,使得逻辑设计与厂家工艺相联系,被叫做门级网表。
这些门级网表被交付到后端的巨侠,完成布局布线的艰巨使命,生成 ASIC 最终设计的交付文件。
布局布线的输出被制造成“光模”(用于激光刻蚀的模具),交给半导体芯片厂家。进行最终布局,对应设计到芯片里面的电容、电阻和连接。对于数字芯片,厂家会给出每个部分(包括单元和连接线)的时延信息,用于时序仿真。这个步骤,还可以确定芯片的工作温度、功率和电流等电器指标。
看看啊,这是多么和谐的景象啊。(对了,闲扯一句,谁知道现在 A 派的当家的是谁?注意了,听清了:非Intel莫属。不服气的去看看人家的年报表。)
2.后起之秀PLD
所谓“分久必合,合久必分”。正当A君临天下之时,却出现了PLD这个“明教教主”来踢场子。
随着芯片集成度的提高,PLD经历了PAL(Programmable Array Logical,可编程阵列逻辑)/GAL(Generic Array Logic,通用阵列逻辑)、CPLD(Complex PLD,复杂可编程逻辑设备)和FPGA(Field Programmable Gate Array,现场可编程门阵列)几代当家的苦心经营,终于成为了数字电路领域可以与 ASIC 分庭抗礼的一大门派。可谓“数字江湖,A(SIC)派一统,设计天下,莫敢不从,P(LD)教不出,谁与争锋”。
下面贫僧感觉有必要,向列位分别介绍一下下P教各位当家的丰功伟业。但是,由于事迹太多,只能简单唠唠。下面介绍主要根据“维基百科”的具体内容改写,出家人不打诳语。详细内容,请参考具体的专著。
图1.1 PAL样图(MMI公司PAL16R6CN)
大当家的:PAL/GAL久不现于江湖,所以资料也大多散失。据传,此人最先现身一个叫做“Monolithic 记忆体公司(Monolithic Memories,Inc.,MMI)”;但是,也有些江湖包打听不同意这个说法。《兵器谱》记载,大当家是基于CMOS的。其拿手招式,即程序设计方法,颇为神秘,主要有:Data I/O 公司的ABEL、Logical Devices 公司的 CUPL,以及MMI公司的PALASM。这些现在已鲜有人懂得了。图1.1是贫僧遍寻网络,找到的PAL的不多的身影之一,供大家瞻仰。
二当家名叫 CPLD,目前依然在行走江湖,正是所谓的“老骥伏枥,志在千里。将军暮年,壮心不已”。根据《江湖月刊》里面的专访:“……主要是由可编程逻辑宏单元(MC,Macro Cell)围绕中心的可编程互连矩阵单元组成。其中,MC结构较复杂,并具有复杂的I/O单元互连结构,可由用户根据需要生成特定的电路结构,完成一定的功能。由于CPLD内部采用固定长度的金属线进行各逻辑块的互连,所以设计的逻辑电路具有时间可预测性,避免了分段式互连结构时序不完全预测的缺点。它具有编程灵活、集成度高、设计开发周期短、适用范围宽、开发工具先进、设计制造成本低、对设计者的硬件经验要求低、标准产品无须测试、保密性强、价格大众化等特点,可实现较大规模的电路设计,因此,被广泛应用于产品的原型设计和产品生产(一般在10 000件以下)之中。几乎所有应用中小规模通用数字集成电路的场合均可应用CPLD器件。CPLD器件已成为电子产品不可缺少的组成部分,它的设计和应用成为电子工程师必备的一种技能。”不乏溢美之词,这是记者们写的了。他们的水平,你懂的。附送《月刊》里面的二当家写真如图1.2所示。
说起三当家的 FPGA,那可就了不得了,江湖人称的“百变神君”就是他了。介绍他的资料,用句上海话说:“不要太多”,用成语说是“汗牛充栋”。《武林时报》的总结可以说是经典:“FPGA采用了逻辑单元阵列(Logic Cell Array,LCA)这样一个概念,内部包括可配置逻辑模块(Configurable Logic Block,CLB)、输入输出模块(Input Output Block,IOB)和内部连线(Interconnect)三个部分。现场可编程门阵列是可编程器件,与传统逻辑电路和门阵列(如PAL,GAL及CPLD器件)相比,FPGA具有不同的结构。FPGA利用小型查找表(16×1 RAM)来实现组合逻辑,每个查找表连接到一个D触发器的输入端,触发器再来驱动其他逻辑电路或驱动 I/O,由此构成了既可实现组合逻辑功能又可实现时序逻辑功能的基本逻辑单元模块,这些模块间,利用金属连线互相连接或连接到 I/O 模块。FPGA 的逻辑是通过向内部静态存储单元加载编程数据来实现的,存储在存储器单元中的值决定了逻辑单元的逻辑功能以及各模块之间或模块与 I/O 间的连接方式,并最终决定了FPGA所能实现的功能,FPGA允许无限次的编程……”现在的说法是:“不知道FPGA,都不好意思说自己是做电子的”。图1.3是三当家照片一张,也请在座诸位惠存,回家膜拜去。
图1.2 CLPD样图(Altera公司MAX系列)
图1.3 FPGA样图(Xilinx公司VIRTEX V5)
列位啊,各种PLD不仅长相类似,他们的设计流程也类似。这里以FPGA为例做简单介绍。这里面的介绍是掐头去尾的,没讲前面与 ASIC 设计一致的“需求分析”、“结构设计”部分,也未提后面的PCB调试和验证。
按照设计流程,我们上面定义了系统的输入输出,下来来掰扯掰扯模块行为。首先,我们需要把输入的文档变成真正硬件描述语言需要的图,可以是原理图、时序图或者状态机图。有的看官要说了:竟然没有流程图,这个可以有啊?答曰:这个可以有,但是真心不建议有,具体原因我们会在后面一讲里面介绍。下面,我们照图 1.4 说话,用硬件描述语言实现系统/模块的行为模型。接着,经过前仿真(行为仿真)、实现、布局布线和后仿真(时序仿真),我们就打完收工了(妈妈咪啊,一堆名词啊。如果您不是专门的设计工程师,可能有些晕。不过没关系,这些绝对不会影响您接下来的理解。因为,这里不是讲如何做工作的,而是关注于步骤一,如何画图的。接下来的步骤都是经验,只要做过一次就驾轻就熟了)。
图1.4 FPGA设计流程
多说一句,对应于 ASIC 的七步设计,实际上是“一个也不能少”的。最后在后端乃至工厂合作完成的步骤,这里是软件环境帮你做了。
图1.4是一个描述,下面是可以采用的对应软件。(对于这个图,请求您不要和我较真。如果非说为什么用Modelsim,而不用VCS啊,我无话可说,真的没有拿Mentor的广告费。当然,如果M公司愿意资助本书,我自当笑纳。)图里面,多了一个简单时序仿真,此乃 Synpilify 一个功能,可能模拟处理时延,叫我们更早验证设计。(又有广告嫌疑啊。)以上内容,可以在FPGA厂家的集成环境,例如Xilinx的ISE或者Altera的Quatus II。(这次说全点,这叫避嫌。)
不是贫僧啰嗦,这里再次强调一下时序仿真的重要。贫僧在做讲座的时候,就有很多热心的朋友交流。其中,很多问题都是因为只做了行为仿真,而没有做时序仿真造成的。这里举一个例子,在行为仿真中,做一个 128 位乘 128 位的乘法,所需的时间是多少?有经验的孩儿们一定毫不犹豫地大声回答说“0”。别多想,贫僧又不是英语考试的考官,用不着故意难为人。恭喜,你们答对了,不过没糖吃。实际系统中,这是不可能的,为什么以后再说。所以,如果直接写这种乘法器在程序里面,在后期的时序仿真里面,你极有可能发现你的设计“老母鸡变鸭”了。不做时序仿真的做法,用俗话来说就是“心急吃不了热豆腐”。贫僧劝告大家“再忙也要时序仿真”。这种不做时序仿真造成恶果的例子,贫僧见得多了,希望大家不要再犯。否则,找贫僧帮忙解决问题之前,先行自己掌嘴五十下。贫僧也不希望,以后有不打不长记性的。
3.武林之外的世界
闲言少叙,言归正传。
估计大多数客官应该是数字逻辑设计工程师,我就看人下菜碟,“买一送一”介绍下我们职位的输入和输出,还有如何从输入走到输出。装点严肃(方丈就在身旁),这就叫数字逻辑系统的设计流程。
为了叫我们干活以获得剩余价值,资本家们会雇用一些系统架构工程师和算法工程师的家伙来写文档给我们输入(他们也是打工的,说家伙有点不厚道。但是,“本是同根生,相煎何太急”,这帮子人写的文档也太多了点,太快了点)。这些输入一般叫做《算法说明书》和《系统架构说明书》。
《算法说明书》里面,洋洋洒洒充满了各种各样的数学公式、计算流程。这些东西一般来源于各种仿真的结果,主要理论来源是大伙儿在本科和研究生时候学习的专业课。(当然,目前业界也不乏“拍脑袋”和“掉书袋”的杰作。这是《论一个工程师的修养》里面讨论的问题,按下不表。)如果你足够幸运遇到好的算法工程师,那么你还能看到算法的结构图。这些都告诉我们,我们该把什么量做什么运算,以及什么时候运算。这些《算法说明书》可以直接用于实现吗?当然不能了,没看到下面的系统架构工程师开始叫了“大哥,给我们留碗饭吃吧。”本书会介绍从系统结构到实现的故事,所以后面多的是如何改造《算法说明书》的例子。诸位稍安勿躁,书已经付过钱了,不像讲座那样要等。书到用时方恨少,请把此书架上存。待需要时候,列位慢慢观赏好了。
《系统架构说明书》的作者,显然和我们更有共同语言,因为他们大多数是我们的老前辈。如上所说,这些模块的划分是从算法来的,更符合数字逻辑系统的特点。在这些资料里面,会有系统有哪些模块、模块如何设置、模块何时启动、模块之间的接口定义,以及模块的时钟频率等。这是本书将会介绍的内容之一,各位慢慢瞧好。按道理,还应该有各个模块的规模要求。但是,这个太难了,大多数系统架构师又得叫“臣妾,我做不到啊”。说做得到的工程师,大多也属于“没有金刚钻,专揽瓷器活”的人物,“可信哉?不可信!”(嘘,低调,低调。贫僧嘴贱,又得罪人了)。
那么,我们又如何说服老板:“我们努力地干活了,您花的薪水绝对不亏”呢?如果您是在FPGA上实现的,那么您需要利用软件生成可以在FPGA上运行的二进制文件,叫二进制文件欢快地跑起来。如果你的目标是ASIC,那么我们不叫ASIC工程师,而是ASIC前端工程师。(有前端肯定还有后端了。他们的区别在前面已经介绍了,属于“小孩没娘,说来话长”。我就不多赘述了,省得您说我话唠。也不能叫编辑骂我:为了钱,故意多写字。)ASIC前端工程师输出的是所谓网表文件,里面是门级电路的连接和约束关系。这个给后端的兄弟来布局布线,后面还有加工的孩儿们研究工艺、加工什么的。(ASIC就是麻烦,没办法,谁叫人家速度快、功耗低和后期价格便宜呢?)
啰嗦一句,上面是理想公司的职责分工。对于一些公司或者项目,不排除有人身兼多职的可能。
上面的说法有点点抽象,鄙人在此用一个简单的例子说明一下。对于求1 000 个8比特无符号数求平均数的问题,不同工程师的表达是有区别的。
算法工程师给的是: 。如果做算法的师傅们负责,还有如图1.5所示类似的一个算法图。无论如何,你是看不到这些数据的时间关系和时序要求的。
系统架构工程师给我的输出,看起来就亲切多了,如图 1.6 所示。这里面,输入数据被设计成串行输入的了,而且提示了采用累加器。看起来顺眼多了吧。
图1.5 求平均数的算法图
图1.6 求平均数的架构图
如果,他们再负责点,会去找算法工程师商量:“兄弟,别1 000个了,换成1 024个成不?给个面子呗!”为什么不要1 000却喜欢1 024呢?这是因为1 024是2的幂,可以用移位代替除法。这样可以大量减少设计的面积,同时提高时钟的速度。下面,我们就开始按照1 024设计。
下来是我们的活了。数字逻辑设计工程师需要把图1.6转化为图1.7的样子。之后,就是前面介绍的设计流程了,编码、功能验证……书不重表。
图1.7 求平均数的原理图
多说一句,如果你负责而架构师不负责,那么1 024的事情就要请您去协商解决了。大家都不负责呢?那么就老板多掏钱呗。“羊毛出在羊身上”,大伙的年终奖就是这样被许许多多的“事不关己不开口”拉低的。这些“负责/不负责”的事情,在这里不多讨论,详见《一个工程师的自我修养》。
4.帮派选择手册
花开两朵,各表一枝。
“你到我身边,带着微笑,带来了我的烦恼”,痛苦的原因往往不是没的选择,而是选择太多。话说工程界里面总是充满着各种争论,例如:到底是多用DSP呢,还是ASIC?该用 ASIC 呢,还是 FPGA?很多时候,这些争论会流于门派之争,到底没有结果。十几年前,就听过某 FPGA 厂家的市场人员呐喊:“ASIC 必死”。可是,直到现在,各个ASIC公司好像还活得不错。
贫僧也不多说,学学孔圣人,谁也不得罪,给个中庸的说法。
具体到一个产品里面,到底是采用 FPGA 还是 ASIC,这个问题是多方面确定的。简单说,如果产品出货量小、时间紧、生命周期短,那么FPGA比较适合;反之就建议ASIC。但是,也不是完全绝对的,就像很难说少林和武当哪个更牛一样。幸好,这不是大多数普通工程师需要考虑的问题。我们就不详细讨论了,把这个恼人的问题留给高薪(实际上,也没大家想象得高;但是,阿 Q 说:你总比我富)的架构师和产品经理们去头疼好了。
我不会讨论什么商业模式啊,FPGA 公司可持续发展啊,这些无聊的内容,省得被你们转发五百次。各位看看本讲的内容,也应该明白了,以后的内容肯定是为类似ASIC的方法定制的。(哗啦啦,走了一半的人。开口饭难吃啊。为了某家明天的嚼谷,请列位准我做一个小小的广告:“这个讲座也适合做算法的人员来这里潜伏,所谓“知己知彼,百战不殆”、“不入虎穴,焉得虎子”的道理。听了我的讲座,就不会出现下文书里所讲的‘被除3’的尴尬了。”)
这正是:“定制编程风云际,数字江湖计谋奇;专用电路欲乱眼,多种特性价格低。逻辑编程万人迷,三个当家大能力。拨云驱雾细端详,选择器件靠分析。”