购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

第一讲

加和尚说技术发展
穆金仙谈语言演变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看结果。结果正常则自然是皆大欢喜,结果不正确可就欲哭无泪了。对于很多简单系统,如大多数书里的例子,直接上印制电路板调试,似乎小日子过得更加甜蜜:呼呼呼地通过,这叫一个爽。岂不知,这个“黄连夹心巧克力——苦头在后面”。待到人们都忘却了还有时序仿真这个步骤时,一般也是复杂的设计需求到来的时刻了。这时就是“喝凉水都塞牙”,“调啥,啥不成;吃嘛,嘛不香”了。再啰唆一句:时序仿真可以看到里里外外全部信号,这样找问题相对简单;板子上能测量的信号十分有限,故障定位比较麻烦。不理解?这样说吧,有核磁共振(对应时序仿真)你不用,非要用悬丝号脉(对应印制电路板调试),这个某家也不能非得拦着你。最后送你一副对联(撇清与极少数人的关系):“贵人坚持如此,您老自求多福”,横批:“别说认识我”。

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

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

这正是:

“程序语言虽本源,代码化身面包板。模块功能描述完,信号出入互相连。电路测试包含全,可综合性成关键。八恨解毒建概念,二层境界亦等闲。” AtlIFS7SshFxJC98Kbag61L38NgiOSzZ9ixxyRZZiYnlmst2lge9+/E7ltNU1kIZ

点击中间区域
呼出菜单
上一章
目录
下一章
×