Verilog传奇:从电路出发的HDL代码设计(txt+pdf+epub+mobi电子书下载)

作者:吴涛

出版社:电子工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Verilog传奇:从电路出发的HDL代码设计

Verilog传奇:从电路出发的HDL代码设计试读:

引子

[1]

自打老僧加菲说书《IP 核芯志》之后,不知又经历了几度劫数。[2]正所谓“沧海桑田”,世间已经不知出了几多自称“茄菲”、“力口菲”和“加菲新”的说书之人了。连虚无镇里、小木庵对面都盖起了一座长春观,号称是全真嫡传,至于其真伪无人考据。一、缘起核芯志

话头回到老和尚那里,加菲本以为自己功德圆满,退归本寺后面勤练“秋风功”非止一日。说书的收入渐渐变薄,似乎在提醒着什么。奈何这个比丘忒是愚钝,竟然茫然不觉。只气得雷音寺的斗战胜佛抓耳挠腮:“……我愚蠢的弟弟啊……”。于是大神趁着净坛使者下凡的机会,捎话给老和尚叫他重新出山、渡人渡己。神仙喜欢玄虚,因此采用了托梦的方法。期间自有一番盛况,不需细讲。加菲得到神谕曰:“前者汝说核芯志,百喻经中三重楼。欲得学业大圆满,明日门前问黄冠。”[3]

老僧到藏经阁借得《百喻经》,翻到《三重楼喻》一看,上面写道:“往昔之世,有富愚人,痴无所知。到余富家,见三重楼,高广严丽,轩敞疏朗,心生渴仰,即作是念:我有财钱,不灭于彼,云何顷来而不造作如是之楼?即唤木匠而问其曰:‘解作彼家端正舍不?’木匠答言:‘是我所作。’即便语言:‘今可为我造楼如彼。’

是时,木匠即便经地垒墼作楼。愚人见其垒墼作舍,犹怀疑惑,不能了知,而问之言:‘欲作何等?’木匠答言:‘作三重屋。’愚人复言:‘我不欲作下二重之屋,先可为我作最上屋。’木匠答言:‘无有是事!何有不作最下重屋,而得造彼第二之屋?不造第二,云何得造第三重屋?’愚人固言:‘我今不用下二重屋,必可为我作最上者。’时人闻已,便生怪笑,咸作此言:‘何有不造下第一屋而得上者?’

譬如世尊四辈弟子,不能精勤修敬三宝,懒惰懈怠,欲求道果,而作是言:‘我今不用余下三果,唯求得彼阿罗汉果。’亦为时人之[4]所嗤笑,如彼愚者,等无有异。”

加菲思忖道:“这不就是空中楼阁的典故吗?老衲明白了:我佛慈悲,是感觉我的《IP核芯志》(简称《核芯志》)过于高深,不适合入门之人。好吧,这就等待明天的机缘,与之合作讲解简单入门的知识者也。”

花开两朵,各表一枝。

且说小木庵降神事件发生的前几天,在沿着忘情川通往子虚镇的小路上,来了一位骑驴的老道。但见这位道长身材修长、鼻直口方、目若朗星,身穿蓝色的道袍,虽然已经显得有些年头了,但是却还干净贴身。最引人注目的地方是他身后背了一把一尺长的小宝剑。一般宝剑应该是三尺到四尺的样子,这位老道的佩剑却不到寻常之剑的一半长度。俗话说“一寸长一寸强,一寸短一寸险”,可见此人不仅是武林高手,更是高手中的高手。

当然,上面都是行家看到的门道,普通群众自然不知。就在这些“不知”的情况下,道长在长春观前下了驴子,走上台阶进入观中。[5]至于如何通报、如何挂单等俗事流程,就不一一细说了。据传此人是观中主持师傅降阶而迎的,是武当山来的高手,道号穆子。

几日无事,无非来往辩经论道,说些《道德》和《南华》。直到降神的次日,穆子道长心血来潮,信步走到了小木庵与长春观之间的大路之上。道长想起当年加菲和尚说书的盛况,不禁吟诗一首:“世人都晓核心好,唯有语言忘记了。巧妙结构何所在,面条一堆变C了!”

道士本是无心之语,却引起了一段说书界的佳话。

正所谓“说者无心,听者有意”,这边一个胖大比丘面有愠色。此僧非是他人,正是按照神谕来寻有缘之人的加菲和尚。老僧正欲发作,又想起神谕上面的话:“黄冠,黄冠莫非就印了此人?”

于是他上前合十,答言道:“善哉善哉,老衲这厢有礼了!刚才闻得仙长之言,似乎对在下的《核芯志》颇有不满啊?”“非也非也,《核芯志》是一本好书,是教导众人如何打通任督二脉的不二之选。只是实践缺了基本功的教导,施主们没有了正规语言运用的培训。《核芯志》也就成了镜花水月了。”

加菲寻思这正和神谕的前两句,于是问道:“仙长的意思是需要讲一讲Verilog吗?”“然!”“仙长不嫌弃,我俩合说一场如何?”“那自然好!这回书就叫《Verilog传奇》吧!”“明日仙长可有空闲,到我寮房一同筹划?”“甚佳,不见不散!”二、穆加九章书

穆子道长也未料到师傅交给他的任务如此简单就能做到,甚是欣喜若狂。一夜无话,待到第二天天明,即往老加的住处去了。穆子与加菲经过一番讨论,得到了九章的说书结构。据后院小沙弥偷来的草稿显示,书的主要内容是下面这样的。

第一章,用来介绍Verilog语言的基本知识,包括发展历史、设计流程、时序分析、芯片结构和可综合性等。这里的重点是帮大家建立Verilog语言与其他学科之间的联系。另外,还需要帮助大家掌握设计数字逻辑系统需要考量的有关内容。

第二章,除了介绍IEEE有关Verilog语言的标准体系及非RTL级的设计之外,还重点说明了常量、变量及结构化模块的内容,是学习Verilog语言的基础。

第三、四章,分别介绍了用assign和always定义的组合逻辑电路的描述方法。其中包含各种运算符操作的写法,以及条件、多选的描述。最后,以多路选择器为例,说明了如何分析一个组合逻辑电路系统。

第五章,介绍了时序逻辑电路系统的Verilog语言描述方法,包括D触发器及D触发器链的写法。本章还介绍了如何拆分组合电路以适应系统操作时间要求的概念。在此基础上,介绍了三种系统速度与面积平衡的方法:并行化设计、流水线设计与时分复用设计。

第六章,结合工程实践,介绍了经常遇到的若干问题,其中包括复位系统设计、可变移位操作、有限状态机设计、多时钟系统处理及循环操作的处理。

第七章,介绍了与IP核设计有关的灵活编程问题。其中涉及任务与函数的写法、利用宏定义方法改变系统参数、利用参数方法改变系统参数及生成块方法改变系统结构。最后综合运用这几种方法,给出了一个简单的IP核——数字分频系统——设计的例子。

第八章,说明了Verilog语言中不可综合的部分。其一为仿真所需的数据类型、复杂运算和并行块设计;其二包含预编译命令;其三为系统任务与函数。本章还介绍了测试向量的概念及其编写方法,以及Verilog语言与其他语言接口的问题。

第九章,以“直接数字式频率合成器”系统为例,综合前面各章介绍的知识,采用了ROM查找表、折线法和CORDIC算法分别进行了实现。本章不仅希望读者学会如何综合使用Verilog语言,还进一步介绍了部分算法与算法定点化的知识。

以上是后院小沙弥偷出的后世研究穆-加联盟的第一手资料。该资料虽然珍贵,但是难免有缺失,不过也够后世考据者管中窥豹之用了。

据后人研究,本书适合的读者有如下几种。

希望学习Verilog语言的学习者,尤其是在校学生。在本书之前的有关书籍均按照程序语言之体系写作。对于Verilog这种以电路为基础的语言来说,它们会造成某种程度的误解。本书创“电路门”之先河,以电路带语言,便于读者理解。

ASIC前端/FPGA工程师:此类施主的动手能力极强,但是也有很多未建立电路与语言的联系,颇有C style的风格。从此后,“逻辑派”和“语法党”皈依“电路门”者,众。

希望了解具体实现的算法工程师:此类施主有着很好的理论知识,但是因为没有亲手做过与数字逻辑有关的设计,所以经常被某些人(这些人的居心属于主观问题,贫僧不做评论)忽悠。听了二老说的书,您就有了据理力争的本钱。

计算机硬件设计工程师:看完本书,所有忧愁都将消失。数字加速器是啥?如何做?书里都有答案。三、阅读有顺序

数月后,子虚镇的壶友茶社门口高挂告示“穆子加菲连口,电路语言开讲”,下面有一行小字“每晚六点,茶金三文”。据当时《子虚晚报》记载,这场书一共说了九九八十一天,期间还有很多曲折,但观书中慢慢看来。

后世的研究者发现,这两位讲本书颇得汉印的精髓:“疏可跑马,密不插针。”换句话说,本书的顺序虽然符合一般读者认识进步的逻辑,但是绝对不建议读者平均用力阅读。最好的建议之一来源于《如何读<Verilog传奇>》的结论。

本书的内容与其他资料相比,在正文里缺少了如何使用FPGA开发环境与仿真软件的内容。这部分知识在附录C给出了资料的链接。对于不熟悉这些软件使用的读者而言,需要自行下载有关环境与资料,按照里面的材料练习,做到熟练掌握软件的使用。接下来建议采用以下步骤阅读本书。

首先,粗读/跳读第一章到第二章的第二讲,了解基本概念。本书的基本假设是读者都掌握了《数字电子技术》这一门基础课。对于第一章中提到的读者感觉陌生的内容,需要重新复习数字电子技术的内容。

其次,详细阅读第二章第三讲开始到第五章的内容,掌握基本语法。这部分是Verilog语言的基础,掌握这些内容基本就可以完成设计工作了。

接着,阅读第六、七章的内容。这些是进阶内容,需要提高的读者应该特别注意。

接下来到了第八章,这些是做测试和验证的内容。如果读者以设计为主,则略读第一讲到第四讲即可,重点掌握如何自己编写测试向量。对于以测试和验证为主的读者,这一章的介绍是不够的,需要另外的资料作为补充。

第九章是一个复杂的例子,重点是阅读作者的思想、设计过程及代码风格。

最后的几个附录属于索引部分,可读可不读。

如此通读完全文之后,建议读者再回过头来好好研究第一章的第二讲到第五讲的内容,并联系自己的工程实践,相信必有所斩获。[1]劫数,又称劫波或劫簸,简称“劫”,是印度教及佛教宇宙观术语,意思是一段对人类来说极长的时间。对于佛教中劫的概念,其算法不尽相同,有分为小劫、中劫、大劫3种的,算法如下:“自寿自十岁,百年增一至八万四千岁为止,然后再百年减一至十岁为止,如是一增一减,为一小劫,二十小劫为一中劫,经成、住、坏、空,四中劫为一大劫,即一世界成毁的时间。——《大智度论》”即一小劫可换算为1679万8000年;20小劫为一中劫,即3亿3596万年;4中劫为一大劫,即13亿4384万年。也有以佛与辟支佛出世与否来计算的,分为大劫和中劫两种,小劫同中劫。这种算法的劫没有固定长度,但80中劫即等于一大劫,若按以上算法推度,此一大劫为268亿7680万年。[2]沧海桑田,意思是大海变成农田;农田变成大海,比喻世事变化很大。语出:晋·葛洪《神仙传·麻姑》:“麻姑自说云;接侍以来;已见东海三为桑田。”[3]《百喻经》,佛教经文,全称为《百句譬喻经》,是天竺高僧僧伽斯那撰写,南朝萧齐天空三藏法师求那毗地翻译。全经由近百个寓言小故事集结而成。这些小故事通俗易懂,生动活泼,反映了佛教的基本思想。每篇经文都由“喻”和“法”两部分组成。“喻”是一个简短的寓言,“法”是寓言所蕴含的教诫。寓言中描述了诸多幽默可笑之事,极具讽刺性,生动形象颇具可读性。[4]译文:过去有一个富愚人,不通事理。他到别的富人家去,见及一座三层楼,高畅广大,端严华丽,轩阁清敞疏朗,心内很是羡仰,想道:我的钱财并不亚于他,为何从前不造一座这样的楼屋呢?随即唤来木匠,问道:“你会造那家一般的好看楼屋吗?”木匠答道:“那就是我造的。”富愚人即便说道:“如今可替我造一幢那样的楼屋。”于是,木匠就开始丈量地面,砌垒砖坯,造起楼屋来。愚人见他垒坯砌砖,造作楼舍,心内怀着疑惑,不甚明白,便问道:“你想做什么?”木匠答道:“做三层楼。”愚人道:“我不想做下面二层,先可为我做最上层。”木匠道:“哪有这等事!哪有不做最下层屋,而能造那第二层的?不造第二层,怎能造第三层。”愚人固执地说:“我如今不要下二层屋,定要替我造最上层。”当时的人听了,都不免笑他,异口同声地说:“哪有不造下面第一层而造二层、三层的?”就譬如佛的四众弟子,有些不能精勤地修持、恭敬佛法僧三宝,懒惰懈怠,却想求得道果,说:“我如今不要须陀洹、斯陀含、阿那含这三果,唯求修得阿罗汉最上果。”也被当时的人所嗤笑,与那愚人一模一样。[5]佛教名词:指行脚僧到寺院投宿;单指僧堂里的名单;行脚僧把自己的衣挂在名单之下,故称挂单。

鸣谢

首先,鸣谢“纪若尘”居士,帮助洒家细心归纳了 FPGA/ASIC 开发的有关资源问题,也就是本书的附录C。

此外,还要感谢 QQ 群“《IP 核芯志》书友会”里的大善人们慧眼识珠,在准备本书时给了我们不少建议。

其他

她用回收器吸回了目标球,然后一个接一个地慢慢将它们扔出去。安德向它们射击,但一个也没打中。“很好,”她(佩查)说,“你没有养成坏习惯”。“我也没有养成好习惯。”他(安德)说。“我会帮你做到的。”——《安德的游戏·火蜥蜴战队》

忍者学校篇

虽然会有各种各样不愉快的事,会有各种各样令人迷茫的事,但我还是好不容易让一个人认可了我,不过光是这样就已经花了我好多的工夫。想要得到大家的认可,取得火影这个厉害的头衔,那是绝对没有任何捷径的。——漩涡鸣人第1章基础知识本章提要

本章在介绍Verilog语言的发展历史之后,重点介绍了数字逻辑系统设计时需要注意的几个问题。其中包括严格的设计流程、严谨的时序分析、基于FPGA结构的设计及Verilog语言的可综合性。这些是系统设计的关键,需要读者认真把握。

有诗赞曰:“远看石塔黑乎乎,上面细来下面粗。有朝一日翻过来,下面细来上面粗。”

老衲上台一鞠躬。蒙列位看官赏脸,贫僧又上台了,想死各位了!上面的名诗供大家一笑。为什么笑呢,这是一个好问题。如果给大家三分钟,想想答案,估计台下的臭鸡蛋就要扔上来了吧?除非大罗金仙、佛祖释迦和太上三清,估计没人能把“下面细来上面粗”的宝塔立起来。这个说法虽然和佛经(见《百喻经·三重楼喻》)里的“空中楼阁”不可同日而语,但是也算有的一拼。这个道理虽然浅显——没有好的基础,其他东西都是白搭,但是老衲在数年的经历中却也见到了不少类似之人。

别不服气,待某家问几个问题(尊长们摸着自己的良心答上一答):

可综合性知道的有多少?对于一条语句是否可综合,哪个研究过?

拿到任务,不仔细设计,直接编码的有没有?

……

很多喜欢动手的人看书,都是跳过第一章的,感觉讲的都是废话(对于一些书或许可以,甚至整本不看,老夫也不反对)。但是对于本书,吾不得不提醒大家,不看是你的损失。进而,没看第一章的人,尽管你看了后面的内容也会做出一些代码来,但是以后出去别说认识老衲,更别吹牛是老夫带出来的(丢不起那个人)。就是这么狂妄,有本事来打我!“我本楚狂人,凤歌笑孔丘。”圣人俺都不怕,还能怕你?大不了学习高祖于鸿门之举,“尿遁·脚底抹油之术”去也。“嗯啍,妖孽加菲休得猖狂,穆某家到了!”

老穆出现,真神出窍,小僧退避三舍……“(韵白)开场诗一首:设计不验证,接收不发射,教学收徒不二做!某家姓穆入凡尘,地球人氏。今日听说这里妖孽横行,特来掺和是也。”“和尚,你给我回来(拉),这戏还要往下唱呢!”

加:“(看来溜不掉了,姑且应付这个老道一番)在下不知上仙来临,唐突了。不晓得大神来临有何贵干啊?”

穆:“看你在这里不知天高地厚地说Verilog语言,不禁嘴痒了……”

加:“(嘴……痒,以为自己是欧阳锋的香肠嘴呢?)您老不是‘(教学收徒)不二做’吗,似乎鄙人和您老没有交集啊?”

穆:“我来此,一非教学,二非收徒。”

加:“那……”

穆:“专来和你抬杠!”

好戏开始了。第一讲 加和尚说技术发展 穆金仙谈语言演变Verilog语言发展及其主要特点

凡具有生命者,都不断地在超越自己。——《查拉图斯特拉如是说》

有诗赞曰:“数电课程要试验,芯片之间细线连。公司产品需强健,厂里加工几层板。芯片内里乾坤显,设计需要有语言。验证需求齐发展,描述演进成自然。”

无论愿意与否,技术发展的洪峰总是在外部需求不停驱动和内部“懒癌”压迫这两股表面水流的带领下,下方裹挟着各种利益的暗潮,带动着工程师们不断前进。电子工程师又是对这种动力感受最深的一批人,所谓“活到老,学到老”正被这些绰号为“码农”和“挨踢”的人们身体力行。上面的诗则是一个电子工程师从学生到资深所需的必然历程之一。一、电子工程师之路

在本科时期,很多学生主要靠在面包板(见图1.1)上插线做完数电试验,了解诸如74LS138(3-8译码器)之流的小/中等规模集成电路的性能。如果足够幸运,还可能用多种集成电路搭建一个电子表之类的小型应用。当然,面包上的设计根本达不到商用的要求,随便移动一下,系统基本就不复存在了。图1.1 面包板(承蒙网友人兽提供)

真正的电子产品必须使用印制电路板(见图1.2)。把所有器件焊接到印制电路板上也是大家实习的一部分。把所有的电阻、电容和芯片焊好也是一件本领(当然器件的连接是设计出来的,不能乱来)。设计印制电路板时,干得最多的就是查各种集成电路的数据手册,看各个管脚的功能,抄参考设计。在这个阶段,工程师们接触到了大规模集成电路,乃至超大规模集成电路。图1.2 印制电路板

采用现成的集成电路芯片,十年前的电子工程师都是这样干的。

世事难料,客户总是不满足的,产品更新换代之快使得这种应用和集成方式完全不能满足要求。有了需求,自然不乏利益驱动的“聪明的脑袋”,“可编程逻辑/芯片”应运而生。同时,电子产品的价格如瀑布般下降,利用专用集成电路来降低成本也成为必然。

与此同时,芯片/系统的规模也在飞跃式扩大,大到了很难用图形化描述的情况。现在随便找一个芯片,如果把它画成不用放大镜就能看的原理图,平排起来估计整个台湾岛都嫌小。

实际上最初的集成电路开发和板子开发没什么两样,都是原理图到版图(对应于印制电路板)的过程。但是很快系统的规模不适合这样做了,即使是得了“懒癌”晚期的工程师也不得不重新想办法来完成工作。这时,有人想到了用语言描述电路。

如此种种说法,使得幸运的电子工程师可以直接设计自己的片上系统,但是这些设计也必须依赖硬件描述语言来完成。

慢慢地,慢慢地,春天没来,我们的书进入正题了。

以下信息来自百度,但是经过了作者部分改写:“硬件描述语言(Hardware Description Language,HDL。多说一句,以后再回答入门问题“HDL是什么”时,别再写什么“硬件语言”了。描述也是很重要的,说明了这个语言的特征)是电子系统硬件行为描述、结构描述、数据流描述的语言。利用这种语言,数字电路系统的设计可以从顶层到底层(从抽象到具体)逐层描述自己的设计思想,用一系列分层次的模块来表示极其复杂的数字系统。然后,利用电子设计自动化(Electronics Design Automatic,EDA)工具,逐层进行仿真验证,再把其中需要变为实际电路的模块组合,经过自动综合工具转换到门级电路网表。接下来,再用专用集成电路 ASIC 或现场可编程门阵列 FPGA 自动布局布线工具,把网表转换为要实现的具体电路布线结构。

现在主流的硬件描述语言有VHDL语言和Verilog语言两种。VHDL和Verilog作为IEEE的工业标准硬件描述语言,得到了众多EDA公司的支持,在电子工程领域已成为事实上的通用硬件描述语言。

VHDL(Very-High-Speed Integrated Circuit Hardware Description Language)诞生于1982年。1987年年底,VHDL被IEEE(Institute of Electrical and Electronics Engineers,电气和电子工程师协会)和美国国防部确认为标准硬件描述语言。自 IEEE-1076(简称87版)之后,各EDA公司相继推出了自己的VHDL设计环境,或宣布自己的设计工具可以和VHDL接口。1993年,IEEE对VHDL进行了修订,从更高的抽象层次和系统描述能力上扩展了VHDL的内容,公布了新版本的VHDL,即IEEE标准的1076-1993版本,简称93版。

Verilog这个词的来源待考,该语言是本书的唯一主角。后面大家会听这个词听到耳朵眼生出老茧的,因此不必急于在这里介绍,穆道长自然会在后文书中细细道来。二、Verilog语言的编年史

任何新生事物都不是凭空出现的。所谓“灵根育孕源流出 心性修持大道生”的“天生石猴”,在工程界即使不能说是没有的,也极其罕见。早期的Verilog语言是以一种高级语言(在这里就是C语言了,鄙人一向不喜欢故弄玄虚)为基础,加上一些特殊的约定而产生的,目的是为了实现寄存器转换级电路(Register Transfer Level,RTL)仿真,用以验证设计的正确性,而不必像在传统的手工设计过程中那样,必须等到完成样机后才能进行实测和调试。后来,工程师不断赋予这个语言新的功能,如直接参与硬件架构的设计等,使得其应用逐渐广泛。

但是也正是由于Verilog语言出身时的阶级成分问题,使得它没有严格地区别是否可以在电路里实现,从而给初学者带来了不便(这是后话,鄙人也“草蛇伏线,灰延千里”一回)。

Verilog语言的早期历史,也许没有读者会关心,但是为了本书的完整性和系统性,现将Verilog语言的编年史摘录如下。

• 1981年,Gateway Automation(简称 GDA,非正规汉语翻译为“门路”自动化——此公司有深谙中华文化的感觉)硬件描述语言公司成立。

• 1983年,该公司的Philip Moorby首创了Verilog HDL,Moorby后来成为Verilog HDL-XL的主要设计者和Cadence公司的第一合伙人。

• 1984—1985年,Moorby设计出第一个关于Verilog HDL的仿真器。

• 1986年,Moorby对Verilog HDL的发展又做出另一个巨大的贡献,提出了用于快速门级仿真的XL算法。

• 随着Verilog HDL-XL的成功,Verilog HDL语言得到迅速发展。

• 1987年,Synonsys公司开始使用Verilog HDL行为语言作为综合工具的输入。

• 1989年,Cadence公司收购了Gateway公司,Verilog HDL成为Cadence公司的私有财产(公司不是木叶,老板亦非纲手啊。小公司被收购是老板的节日,但是对于一般员工呢?)。

• 1990年年初,Cadence公司把Verilog HDL和Verilog HDL-XL分开,并公开发布了Verilog HDL。随后成立的OV(I Open Verilog HDL International,开放Verilog HDL国际)组织负责Verilog HDL的发展,OVI由Verilog HDL的使用和CAE供应商组成,制定标准。

• 1993年,几乎所有 ASIC 厂商都开始支持 Verilog HDL,并且认为Verilog HDL-XL是最好的仿真器。同时,OVI推出2.0版本的Verilog HDL规范,IEEE接收将OVI的Verilog HDL 2.0作为IEEE标准的提案。

• 1995年12月,IEEE制定了Verilog HDL的标准IEEE 1364 – 1995,即通常所说的Verilog-95。

至此,Verilog大陆的“五军大战”结束,世界终于一统。

设计人员在使用这个版本的Verilog的过程中,发现了一些可改进之处。为了解决用户在使用此版本 Verilog 过程中反映出的问题,Verilog 进行了修正和扩展,这部分内容后来再次被提交给电气电子工程师学会。这个扩展后的版本后来成为电气电子工程师学会IEEE 1364-2001标准,即通常所说的Verilog-2001。Verilog-2001语言是对Verilog-95的一个重大改进版本,它具备一些新的实用功能,如敏感列表、多维数组、生成语句块、命名端口连接等。目前,Verilog-2001是Verilog语言的最主流版本,被大多数商业电子设计自动化软件包支持。

2005年,Verilog再次进行了更新,即电气电子工程师学会IEEE 1364-2005标准。该版本只是对上一版本的细微修正。这个版本还包括了一个相对独立的新部分,即Verilog-AMS。这个扩展使得传统的Verilog可以对集成的模拟和混合信号系统进行建模。容易与电气电子工程师学会1364-2005标准混淆的是加强硬件验证语言特性的SystemVerilog(电气电子工程师学会IEEE 1800-2005标准),它是Verilog-2005的一个超集,它是硬件描述语言、硬件验证语言(针对验证的需求,特别加强了面向对象特性)的一个集成。

2009年,所谓“分久必合”,IEEE 1364-2005和IEEE 1800-2005两个部分合并为IEEE 1800-2009标准,成为一个新的、统一的 SystemVerilog 硬件验证语言特性(Hard ware Description and Verification Language,HDVL)。

在此特别声明:因为在技术上超前和滞后都会出现问题(这是技术管理学上的话题,这里不展开讨论),所以本书介绍的是Verilog-2001这个版本的语言。三、Verilog语言的结构特点

前面介绍了Verilog语言的历史,算是“谈古”;接下来会介绍Verilog语言的结构特点,这是“论今”。

在概念设计过程中,设计人员总是将复杂的功能划分为简单的功能,模块是提供每个简单功能的基本结构。设计人员可以采取“自顶向下”的思路,将复杂的功能模块划分为低层次的模块。这一步通常由系统级的总设计师完成,而低层次的模块则由下一级的设计人员完成。自顶向下的设计方式有利于系统级别的层次划分和管理,并提高了效率、降低了成本。在实际代码编写过程中,会采用“自下向上”的工作流程,也就是先从前面划分好的最下层模块开始写作代码及完成相应的单元测试,逐次连线打包和测试,直至完成最高层模块及其测试。这个“自顶向下”再“自下向上”的过程是项目管理研究的范畴,这里不再探讨。

Verilog语言被设计用来描述复杂的硬件电路。由于“自顶向下,不断细化”的项目管理模式的普遍采用,使用Verilog描述硬件的基本设计单元是模块(module)。构建简单的子电路,然后通过子电路的连接形成较为复杂的上层电路,最终达到系统的设计需求。实际的子电路元件,Verilog语言能够提供输入、输出端口,既可以实例调用其他模块,也可以被其他模块实例调用。模块中可以包括组合逻辑部分、过程时序部分。

一个模块如图1.3所示,它一般用方框表示,但是也有例外。图中,方框内的名字为模块名,指向模块的带箭头线表示输入信号,由模块向外的带箭头线表示模块的输出信号。输入信号和输出信号上面一般标记信号的名称。例如,图1.3中就是一个具有三个输入信号(“输入11”、“输入12”和“输入13”)和两个输出信号(“输出11”和“输出12”)的模块,该模块被命名为“模块1”。图1.3 模块的图例

模块之间的连接如图1.4所示,如果模块的输出为另一个模块的输入,则在图中会合并两条连线(也就是说,用一个从第一个模块指向第二个模块的带箭头线来表示)。例如,图1.4中“模块1”的两个输出连接到了“模块2”的两个输入上。没有在模块之间连接的信号,则表示该信号是外部信号,如“模块2”的输入21信号。图1.4 模块之间的连接

多个模块可以打包为一个上层的模块,如图1.5所示。图中把图1.4里的两个模块打包成为一个上层模块:“模块3”。生成的上层模块的输入和输出一定包含低层模块之间未连接的信号,但是也可以包括低层模块之间的连接信号。图1.5 模块打包为上层模块

这些模块设计、模块连接及模块打包具体如何完成,后文自有交待。

设计人员可以使用一个顶层模块,通过实例调用上面这个模块的方式来进行测试。这个顶层模块常被称为“测试平台(Testbench)”。为了最大程度地对电路的逻辑进行功能验证,测试代码需要尽可能多地覆盖系统所涉及的语句、分支、条件、路径、触发、状态机状态,验证人员需要在测试平台里创建足够多的输入激励,并连接到被测模块的输入端,然后检测其输出端的表现是否符合预期(诸如SystemVerilog的硬件验证语言能够提供针对验证专门优化的数据结构,以随机测试的方式进行验证,这对于高度复杂的集成电路设计验证可以起到关键作用)。实例调用模块时,需要将端口的连接情况按照这个模块声明时的顺序排列。

在这个测试平台模块里,设计人员可以设定仿真时的输入信号及信号监视程序,然后观察仿真时的输出情况是否符合要求,这样就可以了解设计是否达到了预期。

上面所述的情况是测试平台顶层模块的测试变量直接连接了所设计的功能模块上。测试平台还可以是另一种形式,即测试平台并不直接连接所设计的功能模块,而是在这个测试平台之下,将激励模块和功能模块以相同的抽象级别通过线网相互连接。这两种形式的测试平台都可以完成对功能模块的测试。大型的电路系统正是利用各个层次不同模块之间的连接、调用来实现复杂的功能的。四、破解入门八大恨“下挂面不加酱油——有言(盐)在先”,在下是十分反感对比 Verilog 语言和 C 语言,因此本书中除了这一节,再无这种类比也。这一节也是不得已而为之,谁叫有“特殊国情”呢?

一方面,通过前面的历史介绍,大家已经知道了 Verilog 语言是从程序语言 C 这根藤上嫁接而来的,这就导致了这两种语言“貌合神离”的特点。另一方面,Verilog同时兼顾了电路实现、功能/时序仿真的多重身份,局外人搞不清它的真实身份也在所难免。如上林林总总的历史原因,最终导致了所谓“入门八大恨”:“一、恨循环竟然不可用;

二、恨写代码永远像C;

三、恨关键词不可综合;

四、恨综合器总是报错;

五、恨有器件不听指挥;

六、恨资源完全不够使;

七、恨功能时序出差异;

八、恨仿真对板上坏事。”

本书中自然会教导大家一一化解这八大恨,这就是本书的重点了。无量寿佛,上天有好生之德,老道在此只先剧透一下(给那个滑头和尚留个难题,呵呵……)。此后是针对中“C语言”之毒的人士的,如果可以“脱离C语言,不中程序毒”此类读者就可以回避了。

闲话一句:完全没有程序语言基础的人,在学习Verilog语言时反而不会先入为主,倒是干净。这就像逍遥子给虚竹传功时先要化去他的少林功夫,反而费事,其道理是一样的。“一、恨循环竟然不可用”:这是一个可综合性的问题。抽象地说,就是Verilog语言里并不是每条语句都可以在真实电路里实现。具体到这个问题,就是在语言中的“forever”、“repeat”、“for”和“while”(具体语法规则和应用请自行直奔有关内容或附录)里,只有“for”可以在电路里使用。甚至,这个“for”循环也“有通C嫌疑,不建议使用”。而且,“for”的使用方法也和一般“C语言”里的用法大相径庭。这里卖一个关子,欲知详情,且听下文分解。“二、恨写代码永远像 C”:这是一个“习惯成自然”的问题。想来十个有这种问题的贵人,倒是有十一个是先学习 C 语言,后接触 Verilog 语言的。对于编程规则里“每一个 always 里,写一个寄存器”(见后文)的规则,开始会有很多开发者感到不习惯,但是“吐着吐着就习惯了”,说书人不害人。这个规则在将来会给你带来好处的。“三、恨关键词不可综合”:这是“第一恨”的倍化版,还是一个“可综合性”的残毒。随着使用Verilog语言的次数上升,总有好事之徒希望把所有关键词都用一用,这是好事情。可是,结果却发现了一个问题:很多关键词是不可综合的。这个在绝顶高手看来不是问题的问题,也会使很多人郁闷很长时间。没关系,俗话说“泄底就怕老乡”,鄙人真正用过的关键词也不超过词表的1/3(保密啊!别说是贫道说的)。“四、恨综合器总是报错”:这是一个“唯逻辑主义”的问题,也和可综合性搭边。前面已经提到过,代码是需要具体映射到电路里去的。电路由具体器件组成。如果器件只有三个端子,你非要接入四个信号,综合器(综合器是什么?请见下一讲中间,FPGA设计流程里关于“综合”的介绍)会郁闷的。有时,这个问题可以用多个器件并联来解决;可是,有时综合器会报错。这个问题的终极奥义是:了解电路与器件,了解FPGA结构,最终做到先原理(图)后代码。“五、恨有器件不听指挥”:这是“唯逻辑主义”的另一种表现形式。一句话,“人在江湖混,总归要出来还的”。或者说,“谁叫综合器/仿真器郁闷,综合器/仿真器就叫谁好看”。小道奉劝诸位,随便找一本《数字电路》教材放在手边,没事看看,你会受益良多。“六、恨资源完全不够使”:这可能是系统设计的问题,解药是扫地僧的那本《IP核芯志》(吴涛.北京:电子工业出版社,2015年9月)。但是,据吾观察很多时间,这还是程序语言代码习惯(就是老和尚常说的“C style”)惹的祸。破解这个问题有一个偏方:多看综合器输出的电路原理图。实际上,每次代码综合之后,综合器都会不厌其烦地输出一个原理图。对于这些图,很多人不够重视,实际上多看看它们没错。“七、恨功能时序出差异”:这是一个深入了解器件时序要求及组合逻辑具体结构的问题。能感受到此恨的人,距离高手的距离已经不远了,这也是可喜可贺的(遇到这个问题的人至少是守规矩,按部就班地走的。很多时候,不走捷径,方为捷径)。下文书里会讲到功能仿真与时序仿真的问题,因此这个问题的详细解释留到下一讲完成。“八、恨仿真对板上坏事”:这就是“步子太大,导致扯蛋”的情况了。在FPGA的开发实践中,很多人喜欢直接跳过时序仿真,而去下载FPGA看结果。结果正常则自然是皆大欢喜,结果不正确可就欲哭无泪了。对于很多简单系统,如大多数书里的例子,直接上印制电路板调试,似乎小日子过得更加甜蜜:呼呼呼地通过,这叫一个爽。岂不知,这个“黄连夹心巧克力——苦头在后面”。待到人们都忘却了还有时序仿真这个步骤时,一般也是复杂的设计需求到来的时刻了。这时就是“喝凉水都塞牙”,“调啥,啥不成;吃嘛,嘛不香”了。再啰唆一句:时序仿真可以看到里里外外全部信号,这样找问题相对简单;板子上能测量的信号十分有限,故障定位比较麻烦。不理解?这样说吧,有核磁共振(对应时序仿真)你不用,非要用悬丝号脉(对应印制电路板调试),这个某家也不能非得拦着你。最后送你一副对联(撇清与极少数人的关系):“贵人坚持如此,您老自求多福”,横批:“别说认识我”。

上面总结了一些新入门者容易遇到的问题,讲这些的目的不是想嘲笑谁。贫道总说:“谁都是打那里过来的,笑话别人就是嘲笑自己。”这些内容仅仅是帮大家把所有的脏坑、净坑、梅花坑都标记出来,这叫作“前人落坑,后人为鉴”。如果哪位遇到上面的烦心事,无妨看看此前的文字,希望能起到指点迷津的疗效。

最后,希望读者们最终到达两大境界:“第一层:眼里代码心中电路;第二层:原理图至逻辑单元”。这两大境界的具体表现是很难用语言表达的,需要施主们自己体会,反正能做到的绝对有“华山论剑”的资格了。真正理解这二层奥义,就好比学武功,打通任督二脉;也恰如习忍术,完成仙法修行;此中滋味,妙不可言。

这正是:“程序语言虽本源,代码化身面包板。模块功能描述完,信号出入互相连。电路测试包含全,可综合性成关键。八恨解毒建概念,二层境界亦等闲。”第二讲 守规并非实际迂腐 按部方为真正捷径ASIC与FPGA的开发流程

忍者要沉着冷静、仔细判断。打破忍者世界规则与铁律的人,我们都叫他废物。——旗木卡卡西

有诗赞曰:“彼时需求未讲完,娇客代码已成片。编码规则全不管,开发流程亦枉然。三月之后哭丧脸,自己程序陌路见。最笑经理曾夸叹,效率第一为状元。”

一个工程项目,刨除市场等环节,对于工程师团队而言,自需求始到产品交付终,期间林林总总的事务与形形色色的人物真是一言难尽。却说老衲最怕的队友,是不是“猪一般的”存而不论,就是所谓上面诗中提到的快码手。这类人的具体表现在诗中已经说得很清楚了,此处不重叙。按照道理,这是一个开始唠叨“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所示,包括功能定义与器件选型、代码/原理图设计、行为仿真、综合、综合后仿真、布局布线、时序仿真、板级仿真及芯片编程与调试等主要步骤。实际开发中具体厂商的集成环境和第三方工具的使用方法将会放到本书的最后一部分,结合实际开发的例子进行介绍。这叫作“耗子拉木锨——大头在后头”。1.功能定义与器件选型

在FPGA设计项目开始之前,必须根据需求对应系统完成功能的定义和模块的划分。还需要根据这些需求评估系统的复杂度,对工作速度和器件本身的资源、成本及连线的可布性等方面进行权衡,选择合适的设计方案和合适的器件类型。

这个过程一般都采用自顶向下的设计方法,即把系统分成若干个基本单元,然后再把每个基本单元划分为下一层次的基本单元。如此这般,这般如此,颠颠倒倒,倒倒颠颠,一直做下去,直到被分解为全部是基本元件为止(幸好还不至于“子子孙孙无穷尽也”)。

与ASIC设计不同的是,一般FPGA厂商提供了一些常用IP核(IP core)供设计者采用。由于厂商具有对FPGA内部结构更为了解的天然优势,所以这些设计的效率要优于一般开发者的设计。但是是否应该大量采用这种核,而使设计者尽量退化为连线工具的问题,却是“仁者见仁,智者见智”的事情。本着“技术中立”的原则,不讨论FPGA厂家背后的商业利益,老衲只说一句:“如果这个FPGA是为将来贵公司的ASIC做前期验证的话,还是尽量少用为妙”。至于其他嘛,这里就不多说了,列位客官们看着办。买的没有卖的精,南无阿弥陀佛!图1.7 FPGA的开发流程2.代码/原理图设计

代码/原理图设计是将所设计的系统或电路以开发软件能够理解的某种形式表达出来,并输入给 EDA工具的过程。常用的方法有硬件描述语言(HDL)和原理图输入方式。

原理图输入方式是一种最直接、最符合传统硬件工程师习惯的描述方式,在可编程芯片发展的早期应用得比较广泛。它将所需的器件从元件库中调出来,进行连接,画出原理图。这种方法虽然直观并易于仿真,但效率很低,且不易维护,不利于模块构造和重用。其更主要的缺点是可移植性差,当芯片升级后,所有的原理图都需要做一定的改动。

目前,在实际开发中应用最广的就是 HDL 代码的方法,利用文本描述设计,它可以分为老式HDL和现代HDL。老式HDL有ABEL、CUR等,支持逻辑方程、真值表和状态机等表达方式,主要用于简单的小型设计。现在这些语言基本已经绝迹了,符合“优胜劣汰,适者生存”的道理。而在中大型工程中,主要使用现代HDL,其主流语言是Verilog语言和VHDL语言。这两者都具有利于自顶向下设计,便于模块的划分与移植,可移植性好,具有很强的逻辑描述和仿真功能,而且输入效率很高。除了 IEEE 标准语言外,还有厂商自己的语言。

也可以采用HDL为主,原理图为辅的混合设计方式,以发挥两者的各自特色。3.行为仿真

行为仿真(也称为前仿真)是指在编译之前对用户所设计的电路进行逻辑功能验证,此时的仿真没有延迟信息,仅对初步的功能进行检测。

仿真前,要先利用波形编辑器和 HDL 等建立波形文件和测试向量(即将所关心的输入信号组合成序列;Test Vector,TV,注意不是电视机),仿真结果将会生成报告文件和输出信号波形,从中便可以观察各个节点信号的变化。如果发现错误,则返回设计修改代码。4.综合

所谓综合就是将较高级抽象层次的描述转化成较低层次的描述。综合根据目标与要求优化所生成的逻辑连接,使层次设计平面化,供FPGA布局布线软件进行实现。

综合(Synthesis)是指将设计输入编译成由与门、或门、非门、RAM、触发器等基本逻辑单元组成的逻辑连接网表,而并非真实的FPGA内部电路。真实具体的门级电路需要利用FPGA制造商的布局布线功能,根据综合后生成的标准门级结构网表来产生。为了能转换成标准的门级结构网表,HDL 程序的编写必须符合特定综合器所要求的风格。由于门级结构、RTL 级的 HDL 程序的综合是很成熟的技术,所以所有的综合器都可以支持到这一级别的综合。5.综合后仿真

综合后仿真检查综合结果是否和原设计一致。仿真时,把综合生成的标准延时文件反标注到综合仿真模型中去,可估计门延时带来的影响。但这一步骤不能估计线延时,因此和布线后的实际情况还有一定的差距,并不十分准确。

目前的综合工具较为成熟,一般可以省略这一步,但如果在布局布线后发现电路结构和设计意图不符,则需要回溯到综合后仿真来确认问题之所在。在行为仿真中介绍的软件工具一般都支持综合后仿真。6.布局布线

布局布线利用实现工具把逻辑映射到目标器件结构的资源中。这一步骤需要在满足给定条件(如时序约束)的前提下,获得逻辑的最佳布局,并且选择逻辑与输入/输出功能连接的布线通道进行连线,并产生相应文件(如配置文件与相关报告)。该过程达成了将综合生成的逻辑网表配置到具体的FPGA芯片上的战略目标。

布局布线是FPGA设计过程中最重要的过程。布局将逻辑网表中的硬件原语和底层单元合理地配置到芯片内部的固有硬件结构上,并且往往需要在速度最优和面积最优之间做出选择。布线根据布局的拓扑结构,利用芯片内部的各种连线资源,合理正确地连接各个元件。

目前,FPGA 的结构一般都非常复杂,特别是在有时序约束条件时,需要利用时序驱动的引擎进行布局布线。布线结束后,软件工具会自动生成报告,提供有关设计中各部分资源的使用情况。

由于只有FPGA芯片生产商对芯片结构最为了解,所以布局布线必须选择芯片开发商提供的工具。7.时序仿真

时序仿真(也称为后仿真)是指将布局布线的延时信息反标注到设计网表中来检测有无时序违规(即不满足时序约束条件或器件固有的时序规则,如建立时间、保持时间等)现象。

时序仿真包含的延迟信息最全,也最精确,能较好地反映芯片的实际工作情况。由于不同芯片的内部延时不一样,不同的布局布线方案也会给延时带来不同的影响,因此在布局布线后,通过对系统和各个模块进行时序仿真,分析其时序关系,估计系统性能,以及检查和消除竞争冒险是非常有必要的。在行为仿真中介绍的软件工具一般都支持综合后的时序仿真。

系统工具即使针对同一个设计,针对不同芯片和/或管脚安排的布局布线也不同,这个比较容易理解。即使针对同样的芯片和管脚安排不同的布局布线的结果也是不尽相同的。因此,如果一个设计被应用到不同的FPGA芯片上或者重新安排了管脚,则需要分别对芯片各自进行时序仿真工作;如果重新进行了布局布线,也必须重新通过时序仿真。8.板级仿真

板级仿真主要应用于高速电路设计中,对高速系统的信号完整性、电磁干扰等特征进行分析。一般都采用第三方工具进行仿真和验证,此时FPGA仅仅被视为PCB上的一个元件。这个工作一般由PCB工程师完成,FPGA设计者仅需要提供他们所需的模型文件。

试读结束[说明:试读内容隐藏了图片]

下载完整电子书

若在网站上没有找合适的书籍,可联系网站客服获取,各类电子版图书资料皆有。

客服微信:xzh432

登入/注册
卧槽~你还有脸回来
没有账号? 忘记密码?