
VerilogHDL-详解.docx
36页VerilogHDL Verilog HDL分类: 电子工程 属性: 技术 Verilog HDL是一种硬件描述语言(HDL:Hardware Description Language),以文本形式来描述数字系统硬件的结构和行为的语言,用它可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能 Verilog HDL和VHDL是世界上最流行的两种硬件描述语言,都是在20世纪80年代中期开发出来的前者由Gateway Design Automation公司(该公司于1989年被Cadence公司收购)开发两种HDL均为IEEE标准 发展历史 参见:SystemVerilog Verilogs是由Gateway设计自动化公司的工程师于1983年末创立的当时Gateway设计自动化公司还叫做自动集成设计系统(Automated Integrated Design Systems),1985年公司将名字改成了前者该公司的菲尔·莫比(Phil Moorby)完成了Verilog的主要设计工作1990年,Gateway设计自动化被Cadence公司收购。
1990年代初,开放Verilog国际(Open Verilog International, OVI)组织(即现在的Accellera)成立,Verilog面向公有领域开放1992年,该组织寻求将Verilog纳入电气电子工程师学会标准 最终,Verilog成为了电气电子工程师学会1364-1995标准,即通常所说的Verilog-95 设计人员在使用这个版本的Verilog的过程中发现了一些可改进之处为了解决用户在使用此版本Verilog过程中反映的问题,Verilog进行了修正和扩展,这部分内容后来再次被提交给电气电子工程师学会这个扩展后的版本后来成为了电气电子工程师学会1364-2001标准,即通常所说的Verilog-2001Verilog-2001是对Verilog-95的一个重大改进版本,它具备一些新的实用功能,例如敏感列表、多维数组、生成语句块、命名端口连接等目前,Verilog-2001是Verilog的最主流版本,被大多数商业电子设计自动化软件包支持 2005年,Verilog再次进行了更新,即电气电子工程师学会1364-2005标准该版本只是对上一版本的细微修正。
这个版本还包括了一个相对独立的新部分,即Verilog-AMS这个扩展使得传统的Verilog可以对集成的模拟和混合信号系统进行建模容易与电气电子工程师学会1364-2005标准混淆的是加强硬件验证语言特性的SystemVerilog(电气电子工程师学会1800-2005标准),它是Verilog-2005的一个超集,它是硬件描述语言、硬件验证语言(针对验证的需求,特别加强了面向对象特性)的一个集成 2009年,IEEE 1364-2005和IEEE 1800-2005两个部分合并为IEEE 1800-2009,成为了一个新的、统一的SystemVerilog硬件描述验证语言(hardware description and verification language, HDVL) 以模块为基础的设计 描述复杂的硬件电路,设计人员总是将复杂的功能划分为简单的功能,模块是提供每个简单功能的基本结构设计人员可以采取“自顶向下”的思路,将复杂的功能模块划分为低层次的模块这一步通常是由系统级的总设计师完成,而低层次的模块则由下一级的设计人员完成自顶向下的设计方式有利于系统级别层次划分和管理,并提高了效率、降低了成本。
自底向上”方式是“自顶向下”方式的逆过程 使用Verilog描述硬件的基本设计单元是模块(module)构建复杂的电子电路,主要是通过模块的相互连接调用来实现的模块被包含在关键字module、endmodule之内实际的电路元件Verilog中的模块类似C语言中的函数,它能够提供输入、输出端口,可以实例调用其他模块,也可以被其他模块实例调用模块中可以包括组合逻辑部分、过程时序部分例如,四选一的多路选择器,就可以用模块进行描述它具有两个位选输入信号、四个数据输入,一个输出端,在Verilog中可以表示为: module mux (out, select, in0, in1, in2, in3);output out;input [1:0] select;input in0, in1, in2, in3;//具体的寄存器传输级代码endmodule 设计人员可以使用一个顶层模块,通过实例调用上面这个模块的方式来进行测试这个顶层模块常被称为“测试平台(Testbench)”为了最大程度地对电路的逻辑进行功能验证,测试代码需要尽可能多地覆盖系统所涉及的语句、分支、条件、路径、触发、状态机状态,验证人员需要在测试平台里创建足够多的输入激励,并连接到被测模块的输入端,然后检测其输出端的表现是否符合预期(诸如SystemVerilog的硬件验证语言能够提供针对验证专门优化的数据结构,以随机测试的方式进行验证,这对于高度复杂的集成电路设计验证可以起到关键作用)。
实例调用模块时,需要将端口的连接情况按照这个模块声明时的顺序排列这个顶层模块由于不需要再被外界调用,因此没有输入输出端口: module tester;reg [1:0] SELECT;reg IN0, IN1, IN2, IN3;wire OUT;mux my_mux (OUT, SELECT, IN0, IN1, IN2, IN3); //实例调用mux模块,这个实例被命名为my_muxinitial //需要仿真的激励代码 begin endendmodule 在这个测试平台模块里,设计人员可以设定仿真时的输入信号以及信号监视程序,然后观察仿真时的输出情况是否符合要求,这样就可以了解设计是否达到了预期 示例中的对模块进行实例引用时,按照原模块声明时的顺序罗列了输入变量除此之外,还可以使用或者采用命名端口连接的方式使用这种方式,端口的排列顺序可以与原模块声明时不同,甚至可以不连接某些端口: mux my_mux (.out(OUT), .select(SELECT), .in0(IN0), .in1(IN1), .in2(IN2), .in3(IN3));//使用命名端口连接,括号外面是模块声明时的端口,括号内是实际的端口连接//括号外相当于C语言的形式参数,括号内相当于实际参数endmodule 上面所述的情况是,测试平台顶层模块的测试变量直接连接了所设计的功能模块。
测试平台还可以是另一种形式,即测试平台并不直接连接所设计的功能模块,而是在这个测试平台之下,将激励模块和功能模块以相同的抽象级别,通过线网相互连接这两种形式的测试平台都可以完成对功能模块的测试大型的电路系统,正是由各个层次不同模块之间的连接、调用,来实现复杂的功能的 语言要素 Verilog的设计初衷是成为一种基本语法与C语言相近的硬件描述语言这是因为C语言在Verilog设计之初,已经在许多领域得到广泛应用,C语言的许多语言要素已经被许多人习惯一种与C语言相似的硬件描述语言,可以让电路设计人员更容易学习和接受不过,Verilog与C语言还是存在许多差别另外,作为一种与普通计算机编程语言不同的硬件描述语言,它还具有一些独特的语言要素,例如向量形式的线网和寄存器、过程中的非阻塞赋值等总的来说,具备C语言的设计人员将能够很快掌握Verilog硬件描述语言 基本规范 空白符 空白符是指代码中的空格(对应的转义标识符为\b)、制表符(\t)和换行(\n)如果这些空白符出现在字符串里,那么它们不可忽略除此之外,代码中的其他空白符在编译的时候都将会被视为分隔标识符,即使用2个空格或者1个空格并无影响。
不过,在代码中使用合适的空格,可以让上下行代码的外观一致(例如使赋值运算符位于同一个竖直列),从而提高代码的可读性 注释 为了方便代码的修改或其他人的阅读,设计人员通常会在代码中加入注释与C语言一样,有两种方式书写注释第一种为多行注释,即注释从/*开始,直到*/才结束;另一种为单行注释,注释从//开始,从这里到这一行末尾的内容会被系统识别为注释 某些电子设计自动化工具,会识别出代码中以特殊格式书写、含有某些预先约定关键词的注释,并从这些注释所提取有用的信息这些注释不是供人阅读,而是向第三方工具提供有关设计项目的额外信息例如,某些逻辑综合工具可以从注释中读取综合的约束信息 大小写敏感性 Verilog是一种大小写敏感的硬件描述语言其中,它的所有系统关键字都是小写的 标识符及保留字 Verilog代码中用来定义语言结构名称的字符称为标识符,包括变量名、端口名、模块名等等标识符可以由字母、数字、下划线以及美元符($)来表示但是标识符的第一个字符只能是字母、数字或者下划线,不能为美元符,这是因为以美元符开始的标识符和系统任务的保留字冲突 和其他许多编程语言类似,Verilog也有许多保留字(或称为关键字),用户定义的标识符不能够和保留字相同。
Verilog的保留字均为小写变量类型中的wire、reg、integer等、表示过程的initial、always等,以及所有其他的系统任务、编译指令,都是关键字可以查阅官方文献以完整的关键字的列表 转义标识符 转义标识符(又称转义字符),是由\开始,以空白符结束的一种特殊编程语言结构这种结构可以用来表示那些容易与系统语言结构相同的内容(例如"在系统中被用来表示字符串,如果字符串本身的内容包含一个与之形式相同的双引号,那么就必须使用转义标识符)下面列出了常用的几种转义标识符除此之外,在反斜线之后也可以加上字符的ASCII,这种转义标识符相当于一个字符常用的转义标识符有\n(换行)、\t(制表位)、\b(空格)、\\(反斜杠)和\"(英文的双引号)等 数据类型 四值逻辑 逻辑值及其解释 0:逻辑低电平,条件为假 1:逻辑高电平,条件为真 z:高阻态,浮动 x:未知逻辑电平 信号强度(从强到弱)及其属性 supply:驱动 strong:驱动 pull:驱动 large:存储 weak:驱动 medium:存储 small:存储 highz:高阻态 上面列出了Verilog采用的具有八种信号强度的四值逻辑(four-valued logic),数字电路中的信号可以用逻辑值、信号强度加以描述。
当系统遇到信号之间的竞争时,需要考虑各组信号的状态和强度如果驱动统一线网的信号强度不同,则输出结果是信号强度高的值;如果两个强度相同的信号之间连接到同一个线网,将会发生竞争,结果为不确定值x 线网与寄存器 Verilog所用到的所有变量都属于两个基本的类型:线网类型和寄存器类型[2] 线网与我们实际使用的电线类似,它的数值一般只能通过连续赋值(continuous assignment),由赋值符右侧连接的驱动源决定线网在初始化之前的值为x(trireg类型的线网是一个例外,它相当于能够储存电荷的电容器)如果未连接驱动源,则该线网变量的当前数值为z,即高阻态线网类型的变量有以下几种:wire、tri、wor、trior、wand、triand、tri0、tri1、supply0、supply1、trireg,其中wire作为一般的电路连线使用最为普遍,而其他几种用于构建总线,即多个驱动源连接到一条线网的情况,或搭建电源、接地等当进行模块的端。
