我正在参加「掘金·启航计划」
写在前面
本篇介绍了Verilog模块的不同抽象级别。同一个物理电路也可以用不同级别的Verilog来描述。简要介绍了Verilog的行为描述建模,有关仿真的细节,还请读者前往FPGA专栏了解。
笔者才疏学浅,本篇如有缺点和疏漏在所难免,恳请广大读者批评指正。
概述
Verilog模型可以是实际电路中不同级别的抽象。所谓不同的抽象级别,实际上是指同一个物理电路,可以在不同层次上用Verilog语言来描述它。如果只从行为和功能的角度来描述某一电路模块,就称为行为模块;如果从电路结构的角度来描述该电路模块,就称为结构模块。抽象的级别和它们对应的模块类型常可以分为以下5种,即Verilog语法支持数字电路系统的5种不同的描述方法:
- 系统级(system)
- 算法级(algorithmic)
- RTL级(Register-Transfer-Level)
- 门级(gate-level)
- 开关级(switch-level)
系统级、算法级和RTL级是属于行为级的,门级是属于结构级的。对于数字系统设计工程师而言,熟练地掌握门级、RTL级、算法级、系统级是非常重要的。而对于电路的基本部件(如与或非门、缓冲器、驱动器等)库的设计者而言,则需要掌握用户自定义原语元件(UDP)和开关级的描述。
一个复杂电路的完整Verilog模型是由若干个Verilog模块构成的,每一个模块又可以由若干个子模块构成。这些模块可以分别用不同抽象级别的Verilog模块描述,在一个模块中也可以有多种级别的描述。利用Verilog语言提供的这种结构,就可以用这种清晰层次结构来描述及其复杂的大型设计。
门级结构描述
一个逻辑电路是由许多逻辑门和开关所组成,因此用基本逻辑门的模型来描述逻辑电路是最直观的。Verilog提供了一些描述门类型的关键字,可以用于门级结构建模。
与非门、或门和反向器及其说明方法
Verilog中有关门类型的关键字共有26个,本篇只介绍最基本的8个。有关其它地门类型关键字,读者可以自行查阅学习。下面列出了8个基本的门类型关键字和它们所代表门的类型:
- and:与门
- nand:与非门
- nor:或非门
- or:或门
- xor:异或门
- xnor:异或非门
- buf:缓冲器
- not:非门
门声明的格式为:(门的类型)【(驱动能力)(延时)】(门实例)
门的类型是门声明语句所必须的,它可以是Verilog语法规定的26种门类型中的任意一种。驱动能力和延时是可选项,可根据不同的情况选不同的值或不选。
下面用一个具体的例子来说明门类型的引用:
RTL代码:
RTL视图:
该例说明在模块中使用了一个名为nd1的与非门(nand),输出为data、clock和clear,输出为a,输出与输入的延时为10个单位时间。Verilog语法支持的基本逻辑部件其行为是由该基本逻辑部件的原语提供的。Verilog编译或解释器能正确地处理有关原语部件的语法现象。
用门级结构描述D触发器
该例是用Verilog语言描述D型主从触发器,通过这个例子,可以学习门级结构建模的基本方法。
RTL代码
RTL视图
在这个Verilog结构描述的模块中,d_trig定义了模块名,设计上层模块时可以用模块名调用这个模块;module、input、wire、output、endmodule等都是关键字;nand表示与非门。#10表示10个单位的延迟。
由已知设计成的模块构成更高一层的模块
如果已经编制了一个模块,可以在另外的模块中引用这个模块。只需在前面写上已编的模块名,紧跟着写上引用的实例名,按顺序写上实例的端口名即可,也可以用已编模块的端口名按对应的原则逐一填入。
下面列举一个例子,引用上一小节D触发器带大家深入理解
4位寄存器
用D触发器组成带清零端的4位寄存器
RTL代码
RTL视图
该4位寄存器的结构描述中,hardreg定义了模块名,引用了4次上一小节的D触发器模块,在代码中后面括号中的参数是各个部件的输入、输出信号。
显而易见,通过Verilog语言中的模块实例引用,可以构成任何复杂的电路。这种以结构方式所建立的Verilog模型不仅是可以仿真的,而且也是可以综合的,其本质是表示电路的具体结构。也可以说,这种Verilog文件也是一种结构网表。这就是以电路结构为基础建模的基本思路。
Verilog的行为描述建模
使用比较抽象的Verilog描述方法来建立模型_4位寄存器
该例与上文所介绍的4位寄存器的功能是完全一致的,实际上它们是同一物理电路的两种不同的表示方法。如果有一种工具能把该例自动地转换为上一个4位寄存器例子的格式,再细化为由4个D触发器组成的结构,这样就把比较抽象的行为描述具体化为门级电路的描述。而门级描述表示的是电路结构,它是电路布线的依据。
RTL代码
RTL视图
设计的目的就是产生行为和功能准确的电路结构。电路结构看起来相当复杂,难以理解,而行为的描述比较直观。我们可以用比较直观的行为描述来开始设计过程,通过Verilog语言的仿真测试验证其正确后,就完成了第一步设计工作。然后用一种工具把行为模块自动转化为门级结构,再次经过Verilog语言的仿真测试验证其正确后,便完成了前端的逻辑设计。接下去可以进行后端制造的准备工作,这样做大大提高了设计的效率和准确性。这就是用Verilog语言设计复杂逻辑电路的基本思路。这种能把行为级的Verilog模块自动转换为门级结构的工具叫综合器。
仅用于产生仿真测试信号的Verilog行为描述建模
为了对已设计的模块进行检验往往需要产生一系列信号,输入到已设计的模块,并检查已设计模块的输出,看它们是否符合设计要求。这就要求编写测试模块,也称做测试文件(test_bench),常用带.tf扩展名的文件来描述测试模块,也可以用.v扩展名的文件来描述测试模块。
下面的Verilog行为描述用于产生测试信号,以验证电路功能。其输出的仿真信号共有两个,分别是时钟信号clk和复位信号reset。初始状态时,clk置为低电平,reset为高电平。reset信号输出一个复位信号之后,维持在高电平。这一功能可利用下面的语句来表示:
以后每隔5个时间单位,时钟就翻转一次,这一功能可利用下面的语句来表示:
该语句描述模块产生的时钟周期为10个时间单位。
Verilog建模在Top-Down设计中的作用和行为建模的可综合性问题
Verilog行为描述建模不仅可用于产生仿真测试信号对已设计的模块进行检测,也常常用于复杂数字逻辑系统的顶层设计,也就是通过行为建模把一个复杂的系统分解成可操作的若干个模块,每个模块之间的逻辑关系通过行为模块的仿真加以验证。虽然这些子系统在设计的这一阶段还不都是电路逻辑,也未必能用综合器把它们直接转换成电路逻辑,但还是能把一个大的系统合理地分解为若干个较小的子系统。然后,每个子系统再用可综合风格的Verilog模块(门级结构、RTL级、算法级或系统级模块)或电路图输入的模块加以描述。当然这种描述可以分很多个层次来进行,但最终的目的是要设计出具体的电路来。所以,在任何系统的设计过程中接近底层的模块往往都是门级结构或RTL级的Verilog模块,或电路图输出的模块。
逻辑综合就其实质而言是设计流程中的一个阶段,在这一阶段中将较高级抽象层次的描述自动地转换成较低层次描述。就现在达到的水平而言,所谓逻辑综合就是通过综合器把HDL程序转换成标准的门级结构网表,而并非真实具体的门级电路。而真实具体的电路还需利用ASIC和FPGA制造厂商的布局布线工具,根据综合后生成的标准的门级结构网表来产生。为了能转换成标注的门级机构网表,HDL程序的编写必须符合特定综合器所要求的风格。