您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > Java > Verilog语言编程基础.
VerilogHDL语言编程基础大连XXX网络技术有限公司2HDL语言简介Verilog中的模块(Module)Verilog语言中常用语句Verilog语言中阻塞和非阻塞赋值Verilog语言中常见的错误Verilog的语言要素Verilog语言的4大法宝3HDL语言简介HDL:硬件描述语言(HardwareDescriptionLanguage)目前通用的HDL语言有VHDL和Verilog两种。目前多数FPGA厂商都有自己的逻辑综合工具,或者采用第三方的设计综合工具来支持自己的器件开发。这是由于HDL完成的设计具有可移植、易维护、好理解的性能。4HDL语言简介VHDL语言最初于1981年由美国国防部(DOD)为解决所有电子产品存档而提出了一种统一标准语言,1987年成为IEEE1076'87标准.1993年后,形成IEEE1164,以解决可综合VHDL描述在不同EDA厂商之间的移植问题,及ASIC/FPGA的门级库描述问题。Verilog语言最早由Gateway设计自动化公司于1981年提出,并提供相应的Verilog仿真器。1985年,仿真器增强版Verilog-XL推出。Cadence公司于1989年收购Gateway公司,并于1990年把Verilog语言推向市场,而保留了Verilog-XL的所有权。1995年,Verilog成为IEEE1364标准。5HDL语言简介VHDL\Verilog比较:两种语言均可有效地描述RTL级(寄存器传输级),但在行为/系统级,Verilog需要PLI的支持,门级以下级Verilog则有较大优势。对于两种语言来说,没有一种语言能描述的功能而另一种不能实现的。考虑到目前大多数的ASIC厂家支持Verilog网表,我们今后将主要推行使用VerilogHDL。6Verilog语言中常用语句Verilog语言中阻塞和非阻塞赋值Verilog语言中常见的错误Verilog的语言要素Verilog语言的4大法宝Verilog中的模块(Module)7Verilog中的模块•模块是Verilog的基本描述单位,用于描述某个设计的功能或结构及其与其他模块通信的外部端口。•整个逻辑设计就是通过模块之间的例化(instantiation)来构成一个整体的。•逻辑设计的思想体现了自顶向下的设计方法系统级的顶层模块模块A模块C模块B模块A1模块C2模块C1模块A28模块间的例化方法•要求:–每个文件只包含一个模块。–模块名和文件名保持一致。模块名实例名端口信号映射关系9模块的基本语法结构modulemodule_name(port_list);Declarations:reg,wire,parameter,input,output,inout,function,task,...Statements:InitialstatementAlwaysstatementModuleinstantiationGateinstantiationUDPinstantiationContinuousassignmentendmodule模块的结构需按上面的顺序进行,声明区用来对信号方向、信号数据类型、函数、任务、参数等进行描述。语句区用来对功能进行描述如:器件调用(Moduleinstantiation)等。10Verilog语言中常用语句Verilog语言中阻塞和非阻塞赋值Verilog语言中常见的错误Verilog语言的4大法宝Verilog的语言要素11标识符注释格式系统任务和函数编译指令值集合数据类型参数Verilog的语言要素12Verilog的语言要素-标识符•标识符(identifier)用于定义模块名、端口名、信号名等。•VerilogHDL中的标识符(identifier)可以是任意一组字母、数字、$符号和_(下划线)符号的组合,但标识符的第一个字符必须是字母或者下划线。另外,标识符是区分大小写敏感的。以下是标识符的几个例子:•VerilogHDL定义了一系列保留字,叫做关键词,附录A列出了语言中的所有保留字。注意只有小写的关键词才是保留字。例如,标识符always(这是个关键词)与标识符ALWAYS(非关键词)是不同的。13Verilog的语言要素-注释•两种注释的方式:–以“/*”符号开始,“*/”结束,在两个符号之间的语句都是注释语句,因此可扩展到多行。如:•/*statement1,•statement2,•.....•statementn*/•以上n个语句都是注释语句。–是以//开头的语句,它表示以//开始到本行结束都属于注释语句。14Verilog的语言要素-格式•自由的书写格式:–VerilogHDL的书写格式是自由的,即一条语句可多行书写;一行可写多个语句。白空(新行、制表符、空格)没有特殊意义。•如:•inputA;inputB;与•inputA;•inputB;–功能是一样的,但是这方面公司有严格的书写规范。15Verilog的语言要素-系统任务•以$字符开始的标识符表示系统任务。•任务提供了一种封装行为的机制。这种机制可在设计的不同部分被调用。任务可以返回0个或多个值。•函数在0时刻执行,即不允许延迟。•$display(Hi,youhavereachedLTtoday);•/*$display系统任务在新的一行中显示。*/•$time•//该系统任务返回当前的模拟时间。16Verilog的语言要素-编译指令•以`(反引号)开始的某些标识符是编译器指令。•在Verilog语言编译时,特定的编译器指令在整个编译过程中有效(编译过程可跨越多个文件),直到遇到其它的不同编译程序指令。•完整的标准编译器指令如下:•`define,`undef•`ifdef,`else,`endif•`default_nettype•`include•`resetall•`timescale•`unconnected_drive,`nounconnected_drive•`celldefine,`endcelldefine17Verilog的语言要素-值集合•四种基本的值类型:0:逻辑0或“假”;1:逻辑1或“真”;X:未知值;Z:高阻。注意这四种值的解释都内置于语言中。如一个为z的值总是意味着高阻抗,一个为0的值通常是指逻辑0。18Verilog的语言要素-数据类型•两种数据类型:线网类型(nettype)和寄存器类型(regtype)。–线网类型代表的是物理连接线,因此它不存贮逻辑值。必须由器件所驱动。assign赋值语句必须用线网类型。•定义:wirea;•assignA=B^C;•当一个wire类型的信号没有被驱动时,缺省值为Z(高阻)。–信号没有定义数据类型时,缺省为wire类型。–寄存器类型通常用于对存储单元的描述,如D型触发器、ROM等。存储器类型的信号当在某种触发机制下分配了一个值,在分配下一个值之时保留原值。但必须注意的是,reg类型的变量,不一定是存储单元。–注意在always,initial语句中必须用reg类型的变量。定义:•reg[msb:lsb]reg1,reg2,...regN;19Verilog的语言要素-参数•参数是一个常量。参数经常用于定义时延和变量的宽度。使用参数说明的参数只被赋值一次。参数说明形式如下:•下面为具体实例:–parameterLINELENGTH=132;–parameterALL_X_S=16'bx;20Verilog的语言要素-常量•三种常量:整型、实型、字符串型。–整型数可以按如下两种方式书写:–1)简单的十进制数格式–32十进制数32–2)基数格式:[size]'basevalue–size定义以位计的常量的位长;base为o或O(表示八进制),b或B(表示二进制),d或D(表示十进制),h或H(表示十六进制)之一;value是基于base的值的数字序列。值x和z以及十六进制中的a到f不区分大小写。如:–3'b1011h'6–字符串是双引号内的字符序列。字符串不能分成多行书写。如:–INTERNALERROR–REACHED-HERE21Verilog的语言要素-运算符•算术运算符–加法(二元运算符):“+”;–减法(二元运算符):“-”;–乘法(二元运算符):“*”;•关系运算符有:(大于)(小于)=(不小于)=(不大于)==(逻辑相等)!=(逻辑不等)22Verilog的语言要素-运算符•按位逻辑运算符•条件运算符–cond_expr?expr1:expr2•连接运算符–连接操作:将小表达式合并形成大表达式或者说总线的操作。形式如下:–{expr1,expr2,...,exprN}–例如:–wire[7:0]Dbus;–assignDbus[7:4]={Dbus[0],Dbus[1],Dbus[2],Dbus[3]};23Verilog语言中阻塞和非阻塞赋值Verilog语言中常见的错误Verilog语言的4大法宝Verilog语言中常用语句24Verilog其它常用语句•If语句25使用IF语句的注意事项•当比较向量时,verilog将对位数小的向量做0扩展以使它们的长度相匹配,它的自动扩展为隐式的。建议采用显示扩展。•每一个If都应有一个else和它相对应,防止产生latch;•if语句的嵌套时,应注意每个If条件的优先级;•建议采用于if(variable==1),不要采用If(variable),以增强程序的可读性。26Verilog其它常用语句•Case语句27使用Case语句的注意事项•所有的Case应该有一个defaultcase,以免生成不必要的锁存器。允许空语句:Default:;•避免使用casex。28IF语句与CASE语句的比较•case语句通常综合成一级多路复用器,而if-then-else则综合成优先编码的串接的多个多路复用器。•case语句仿真要比条件赋值语句快,因为优先编码器的结构仅在信号的到达有先后时使用。•if语句有优先级,case语句没有。29IF语句与CASE语句的比较•两者综合实现后结果:If语句case语句30同步复位和异步复位区别在这里31Verilog中不能被综合的语句initialwaitrepeatwhileforevernamedeventsfork/joindeassignforce/releaseproceduralassignmentsoperators:caseequalityandinequality===!==另外for语句虽然可以综合,但也不建议使用32Verilog语言中阻塞和非阻塞赋值Verilog语言中常见的错误Verilog语言的4大法宝33Verilog语言的4大法宝•Wire----数据类型:Verilog结构化元件间的物理连线。•Reg----数据类型:寄存器类型•Assign----连续赋值语句•Always----Always语句只要条件满足始终重复执行CombLogicDQQSETCLRDQQSETCLRDQQSETCLRDQQSETCLRDQQSETCLRExternalInput34连续赋值语句assign•连续赋值语句的执行是:只要右边表达式任一个变量有变化,表达式立即被计算,计算的结果立即赋给左边信号。•连续赋值语句之间是并行语句,因此与位置顺序无关。35过程赋值语句Always•VerilogHDL有两种过程赋值语句:initial和always语句,实现行为建模。这两种语句之间的执行是并行的,即语句的执行与位置顺序无关。这两种语句通常与语句块(begin....end)相结合,则语句块中的执行是按顺序执行的。•initial语句只执行一次,即在设计被开始模拟执行时开始(0时刻)。通常只用在对设计进行仿真的测试文件中,用于对一些信号进行初始化和产生特定的信号波形。•always语句与initial语句相反,是被重复执行,执行机制是通过对一个称为敏感变量表的事件驱动来实现的36Verilog语言的4大法宝
本文标题:Verilog语言编程基础.
链接地址:https://www.777doc.com/doc-2866161 .html