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

第一讲

翻译标准穆子得意
胡说层次加菲犯难标准内容与逻辑层次

今天我在人生的道路上迷路了…

——旗木卡卡西

有句电影台词说得好:“成功是一个相关名词,他会给你带来很多不相关的亲戚。”

据坊间传闻,Verilog 语言是目前数字逻辑设计领域引用最广的语言,可谓是相当成功。一日,贫道心血来潮,查了一下亚马逊网站上的“Verilog”这个关键词。妈妈呀,吓死宝宝了,有 282 本之多。对于这样一个相当专业化的领域而言,这几乎是天文数字了。

所谓“人艰不拆”,这里不打算对很多书做什么品鉴(再说,某家也没那么多钱买那么多书来看。缺钱是绝症,对于我而言)。我只是想正本清源,从标准开始给列位介绍Verilog语言。借你一双慧眼,拨开一切的迷雾,让大家看个清清楚楚、明明白白。

一、信达雅语言标准

有一句每个华人都耳熟能详的话:“贫僧自东土大唐而来,前往西天拜佛求经,路过宝地,想在此借宿一宿,不知主人家可否方便。”这句话的主人乃三藏大法师玄奘是也。当年,高僧经历九九八十一难,自西方乐土取得如来真经,然后回归中原以翻译为乐,超度了吾国万民,也算是一件功业。我穆老道虽然不敢自诩是三藏再现、唐僧重生,也曾经发宏愿要译一译Verilog的IEEE标准来泽被后世。

闲话少说,书归正传。

关于Verilog语言的官方标准的全称是《IEEE Std 1364-2001:IEEE Standard Verilog® Hardware Description Language》,里面的“Std”是标准(Standard)的缩写,带圈圈的大R(®)是REGISTER的缩写,用在商标上是指注册商标的意思。其完整的翻译就是:《电气和电子工程师协会标准1364-2001年(发布):IEEE硬件描述语言Verilog®标准》。

然后贫道发现在没有免费劳力使用的前提下,全部翻译这本标准无异于天方夜谭。很多时候不是不会,而是一个人的精力有限,实在不适合翻译大部头的东西。不过贫道多多少少还是做了一点点工作的,这里免费送给大家。下面是文档中的1.4节标准内容的翻译稿,供大家雅正。

“全部内容与附录在此罗列以资参考。本文档共包括27个条款及8个附录。

全部条款及附录A、B、E、F和G是本标准的实质性内容。

附录C、D和H仅供信息参考。

条款1 总论:本条款描述本标准内的约定及其内容。

条款2 词汇规则:本条款描述用于Verilog HDL源文件内的词汇规则及其含义。其中论述如何例化和翻译这些词汇规则。

条款3 数据类型:本条款描述电路网络与变量数据类型。本条款也描述了包含长数字的参数数据类型、对于电路网络的驱动及改变强度的数值。

条款4 表达式:本条款描述用于表达式的运算符与操作数。

条款5 调度原则:本条款描述Verilog HDL的调度原则。

条款6 赋值:本条款比较了Verilog HDL里的两种主要赋值,即连续性赋值(译者注:英文原文为“continuous assignment”,是指给电路网络赋值,与阻塞/非阻塞性赋值无关)和过程性赋值(译者注:英文原文为“procedural assignment”,是指给变量赋值,包含下文书会重点推介的阻塞/非阻塞性赋值)的主要区别。本条款还描述了连续性赋值如何将值赋予电路网络。

条款7 门与开关级模型:本条款描述门与开关级原语及逻辑强度模型。

条款8 用户自定义原语(User-Defined Primitives,UDP):本条款描述Verilog HDL中的原语定义及如何将这些原语引入Verilog HDL模型。

条款9 行为模型:本条款描述过程性赋值、过程性连续赋值及行为语言表述。

条款10 任务和函数:本条款描述过程和函数,它们可以在行为模型内部的不止一处被调用。其描述了任务如何像子程序一样被调用及函数怎样去定义新的操作符。

条款11 命名块与任务的禁止:本条款描述如何禁止一个任务及一个特别命名的语句块的执行。

条款12 继承结构:本条款描述如何继承产生Verilog HDL及在模块中声明的参数的重载。其中描述了如何利用条件与多分枝参数实体。

条款13 设计内容配置:本条款描述如何配置设计的内容。

条款14 特定块:本条款描述如何特例化一个模块的输入、输出端口的时序关系。

条款15 时序检查:本条款描述如何对使用特定块的信号检验其是否满足时序要求。

条款16 采用标准时延格式(Standard Delay Format,SDF)后声明:本条款描述SDF结构中的符号与定义。

条款17 系统任务与函数:本条款描述系统任务与函数。

条款18 值可变堆(Value Chang Dump,VCD)文件:本条款描述与VCD有关的系统任务及该文件格式。

条款19 编译指令:本条款描述编译指令。

条款20-PLI(编程语言接口,Programming Language Interface)概览:本条款描述C语言处理接口标准及Verilog HDL侧的处理机制。

条款21-PLI 任务/函数(TF,Task/Function)和接入(access,ACC)机制:本条款描述提供用户连接PLI TF和接入Verilog软件工具的界面机制。

条款22-ACC 路径的使用:本条款描述一般化的ACC路径,包括如何和为什么要使用(该路径)。

条款23-ACC 路径定义:本条款描述特定化的ACC路径,解释其函数、符号和用途。

条款24-TF 路径的使用:本条款概览TF路径的操作类型。

条款25-TF 路径定义:本条款描述特定化的TF路径,解释其函数、符号和用途。

条款26-VPI(Verilog编程接口,Verilog Programming Interface)的使用:本条款概览VPI路径的操作类型。

条款27-VPI 路径定义:本条款描述VPI路径。

附录A 形式符号定义:本规范性目录描述Verilog HDL语言的BNF(Backus-Naur Form,巴科斯范式)格式定义。

附录B 关键词列表:本规范性附录给出了Verilog HDL关键词列表。

附录 C 系统任务与函数:本信息性附录描述了经常使用但不是标准的一部分的系统任务与函数。

附录D 编译指令:本信息性附录描述了经常使用但不是标准的一部分的编译指令。

附录E-acc_user.h :本规范性附录给出了acc_user.h的内容列表。

附录F-veriuser.h :本规范性附录给出了veriuser.h的内容列表。

附录G-vpi_user.h :本规范性附录给出了vpi_user.h的内容列表。

附录H 引用:本信息性附录给出了从属IEEE标准的引用。”

通过以上内容可以“管中窥豹”,给大家一个对该标准的整体感觉。说实话,很多内容即使是做过多年设计的工程师也未必清楚。例如,老道我就仅仅敢说了解前19章的内容。至于精通嘛,也不过十之一二。但是没关系,对于设计尤其是RTL级(寄存器转换级电路,Register Transfer Level。这是本书的书胆,后文书会详细介绍),做FPGA/ASIC前端设计足够了。

前文书说过了,Verilog在设计之初就想既支持设计又支持仿真。仿真也着实是一个比数字逻辑电路设计还要繁杂的事情,因此标准里大多是在讲仿真的那些事。真正留给设计者的文字并不占多数。没办法,古语说:“人在屋檐下,怎敢不低头。”人家都说自己是IEEE的专家,您老就成了吧。斗不过的,不如将就。

即使是和设计有关的内容,语言设计者也试图包含各种设计门类:从三极管到上层的逻辑概念,因此有一个设计语言的层次概念。下面,大家热烈欢迎加菲老和尚来给大家介绍这方面的内容。

二、说层次系统划分

老衲独白:

“妖道独自等上台,标准传译独自来?内容翻完成劈柴,活该!老衲幕后乐翻天,脚底抹油去数钱。点名叫我把眼现,晃点?”

苦啊,又被牛鼻子算计了。这个有关Verilog语言的逻辑层次问题,属于爹不亲娘不爱的内容,没什么干货,听得也是昏昏欲睡。杨修说了:“鸡肋,食之无味,弃之可惜!”

从度娘(百度)到谷哥(歌)遍寻网络,都是这么一段论述:

“……Verilog 是一种用于数字逻辑电路设计的语言,而数字逻辑电路对于我们学电子的人来说并不陌生,也十分形象,它无非是对应着各种逻辑门结构,并用这些简单的逻辑门结构构成五花八门的数字电路,然后实现我们需要的功能。然而,Verilog是一种硬件编程语言,它既是一种结构描述的语言,也是一种行为描述的语言,也就是说,对于同一功能的物理电路,我们既可以用Verilog中提供的数字电路中较为形象的门级结构来描述电路,也可以用更为抽象的一些语句来描述电路,于是乎,我们根据抽象的程度不同,对不同的描述方式进行划分,得到以下几种不同抽象级别的描述方式,其中,从上至下,离真相越来越近,也就是说,最形象的是开关级,其次是门级,以此类推,最抽象的是系统级。

系统级(System Level):用高级语言结构实现设计模块的外部性能的模型。

算法级(Algorithm Level):用高级语言结构实现设计算法的模型。

RTL级(Register Transfer Level):描述数据在寄存器之间流动和如何处理这些数据的模型。

门级(Gate Level):描述逻辑门及逻辑门之间连接的模型。

开关级(Switch Level):描述器件中三极管和存储节点及它们之间连接的模型。

换言之,不同级别的抽象,也就是说,在不同抽象层次上用Verilog语言来描述一个物理电路,若从行为和功能的角度来描述某一电路,则为行为级描述,系统级、算法级和RTL级属于行为级描述方式;若从电路的结构来描述某一电路,则为结构级描述,门级和开关级属于结构级描述方式。在实际应用中,我们要根据需求对每个Verilog模型进行设计,选用不同抽象级别的描述,才能使我们的设计事半功倍。下面我们就来说说结构级描述和行为级描述。”

老衲也曾经试图考据过这段话的源头,结果无疾而终。天下文章一大抄,抄来抄去就找不到来源出自于哪里了,悲哀之二也。有人问了:“那么,悲哀之一是什么?”那当然是命令老僧讲这段劳什子啊,明知故问?你是猴子派来捣乱的?

上面的文字虽然来源不详,但是其基本意思似乎还是对的,最少说明了理解这些层次有着“一览众山小”的奥妙,众施主不可不查者也。其中能看到的问题就是对于每个层次的描述略显不足,不能让读者清晰地划分具体问题应该属于哪个层次。现在,老衲就在别人画的蛇上面添上几条足,摆摆龙门阵,供大家一笑。

最上的两层,系统级和算法级属于验证的范畴,用于测试设计的数字逻辑系统的性能和是否达到功能的要求。两者的共同特点是“高级语言结构实现”这八个字。什么是高级语言呢?就是C语言那样的程序设计语言了。这两个层次的区别也是有的:系统级是“实现外部特性”,类似于测试理论里的“黑盒”;算法级则是“算法模型”,类似于测试理论里的“白盒”。

复习一下黑盒和白盒很有必要:黑盒测试把程序看作一个不能打开的黑盒子,在完全不考虑程序内部结构和内部特性的情况下,针对“软件界面”(对于数字逻辑系统而言,对应芯片管脚)和”软件功能”进行测试,只检查功能是否符合需求,规格说明书是否能正常使用。白盒测试是对软件的过程性细节做细致的检查,这种方法是把测试对象看作一个打开的盒子,允许测试人员利用程序内部的逻辑结构及有关信息,设计或选择测试用例,对程序的所有逻辑路径进行测试,通过在不同点检查程序状态,确定实际状态是否与预期的状态一致。

对于数字逻辑系统而言,系统级还有一个作用,就是模拟外部芯片参与验证。

最下的两层,开关级和门级属于电路的范畴,用于设计的基本电路实现。开关级是最基本的物理器件的连接,到了三极管的程度。有位老兄说了:“再下面不是还有PN结什么的吗?”这个完全属于制造领域了,Verilog的手还没有伸这么长。门级属于用门电路来连接电路。《数字电子技术》里有很多采用三极管实现门电路及采用门电路实现进一步“复杂”逻辑的例子,大家可以找一本书来参考。

RTL级处于不上不下的境遇,它既是常用的进行数字逻辑设计的级别,也有工程师用它来进行一些简单的验证工作。对于设计工作而言,RTL基本相当于《数字电子技术》实验里最常用的小规模集成电路的水平,设计起来既有灵活性,也不会过于烦琐。对于验证方面来说,RTL对于单位模块的测试不失为一种很有效的手段。这一层基本也就到了综合软件的IQ(智力商数,Intelligence Quotient)极限,再向上的层次,综合软件看来就是上古天书一卷(无法综合)了。综上所述,RTL将会成为本书的书胆(主角)被重点介绍。

按照上面的说明,老衲绘制了联络图,如图2.1所示。

图2.1 Verilog逻辑层次及其与工程阶段的关系

三、逻辑标准相联系

如果说协议的硬性规定是条条经线,则逻辑上的层次就可以说是根根纬线,它们交织在一起就能纺出数字逻辑设计的美丽绸缎。文艺的小清新至此打住,“风流总被雨打风吹去”。老衲也曾网上遍寻织女一名,以完成上面的构想,奈何“寻寻觅觅,冷冷清清,凄凄惨惨戚戚”,说普通话就是“臣妾找不到啊!”

这两个知识不能联络起来,就成了顺德的特产——两张皮(双皮奶)了。这和佛家济世救人、普度众生的理念相去甚远。老衲只好赶鸭子上架,在这里也冒充一次乔太守(“乔太守乱点鸳鸯谱”,故事见冯梦龙先生的《醒世恒言》第八卷),帮大家梳理梳理。按照标准的顺序,老僧帮大家往下捋,捋出一个虎虎生风的锦绣天地。

第1部分(道士翻译的“条款”无论怎么感觉都是百度翻译的水准,不喜欢,这里采用部分的说法)是内容介绍,和逻辑上的层次没啥关系,大家当作没看到。

第2部分到第4部分,加上第6部分,是最基本的概念,讲常数什么的,是基础,各个层都需要。

第5部分孤悬海外,是讲仿真器如何运行的,和逻辑上的层次也没啥关系。

第7部分一看名字就知道了,介绍了门级和开关级的知识。

第8部分是算法级和系统级用的,可以规范外部芯片的接口行为。

第9部分看似是RTL级的内容,但是仔细一瞧却又不是,白纸黑字写的是“行为”。这两者的关系可以参考百度的答案:“行为级描述是级别比较高的描述方式,有点像Bash语言或SQL语言。RTL级是寄存器级,还比较低级。RTL级和行为级最大的区别是可综合性。一般的综合软件都支持RTL级,行为级目前支持得不好,实用中还很少使用。因此,如果是做芯片开发,都是用RTL级语言描述的,不能使用不可综合语句。但是在写测试模块时,可大量使用行为级描述语言,这样会很方便。”也就是说,RTL 级是行为模型里的一个可以综合的子集。

第10部分到第13部分是设计中小的细节的内容,部分属于RTL级。

第14部分到第16部分是有关电路中处理时延和布线时延的描述问题,用于所谓的时序检查和时序仿真。凡是和验证有关的皆有可能,姑且认为属于RTL级到系统级。

第17部分到第19部分是仿真软件用的,属于算法级或系统级。

第20部分到第27部分是介绍验证模块如何被外部的高级语言调用的,自然也属于算法级或系统级。

以上是粗略的划分,欢迎商榷。

为了使初学者容易入门,老衲特地设计了一个Verilog语言学习用表,见表2.1,推荐给读者。表中的斜体字是推荐学习者填写的内容。

表2.1 Verilog语言学习用表

从头来看,下面聊聊为什么很多人会觉得Verilog很难,难到了初学者感觉是老虎吃天——无从下口呢?这是和Verilog的贪心不足密切相关的。从工程方法学的角度上说,设计和验证是完全不同的两个行当,很少有人能够做到“昆乱不挡”。然而,在 Verilog标准里,确实体现了完全的五味杂糅,人为地造成了混乱,这就是所谓“困难”的源头。

分清上文书里唠叨的很多的可综合性并不是一件简单的事情。从后面你可以发现,很多关键词或语句很可能是在一定条件下可综合的。这种问题带来了进一步的混乱。私下透露一点实情,真正设计里能够灵活使用百分之二十的语句,一般就足够了。

老僧定言:坚持填此表者,必有大成就焉!

这正是:

“语法讨论乱纷纷,标准便是指路灯。细看二十七卷本,任尔东南西北风。欲要鸟瞰登高峰,逻辑层次仔细分。黄冠传译目录誊,比丘传薪满场冷。” TlE0TOIcL4d64zuCxDtOxvTqIbIC3mjxahyXs7wBSDu9J4Oo9RFQnla8XR983d3y

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