VerilogHDL基础语法入门第一部分课程简介目的:简单介绍VerilogHDL语言和仿真工具介绍讲课计划介绍如何不断地学习新的有关知识讲座中关于VerilogHDL的主要内容讲课内容主要包括:Verilog的应用Verilog语言的组成部件结构级的建模与仿真行为级的建模与仿真延迟参数的表示Verilog的测试平台:怎样产生激励信号和控制信号输出响应的产生、记录和验证任务和函数用户定义的元器件(primitives)可综合风格的Verilog建模讲座中关于Verilog仿真工具的主要内容讲课内容主要包括:如何对所做的设计进行编译和仿真如何使用元器件库如何用Verilog-XL命令行界面调试代码如何用图形用户界面(GUI)延迟的计算和标记仿真性能建模循环多次仿真目的:了解用HDL语言设计数字逻辑的优点了解Verilog主要应用领域了解Verilog的发展历史了解电路系统的不同层次的Verilog抽象第二部分:Verilog的应用VerilogHDL是一种用于数字逻辑电路设计的语言:-用VerilogHDL描述的电路设计就是该电路的VerilogHDL模型。-VerilogHDL既是一种行为描述的语言也是一种结构描述的语言。这也就是说,既可以用电路的功能描述也可以用元器件和它们之间的连接来建立所设计电路的VerilogHDL模型。Verilog模型可以是实际电路的不同级别的抽象。这些抽象的级别和它们对应的模型类型共有以下五种:Verilog的应用Verilog的应用•系统级(system):用高级语言结构实现设计模块的外部性能的模•算法级(algorithmic):用高级语言结构实现设计算法的模型。•RTL级(RegisterTransferLevel):描述数据在寄存器之间流动和如何处理这些数据的模型。•门级(gate-level):描述逻辑门以及逻辑门之间的连接的模型。•开关级(switch-level):描述器件中三极管和储存节点以及它们之间连接的模型。Verilog的应用一个复杂电路的完整VerilogHDL模型是由若个VerilogHDL模块构成的,每一个模块又可以由若干个子模块构成。利用VerilogHDL语言结构所提供的这种功能就可以构造一个模块间的清晰层次结构来描述极其复杂的大型设计。VerilogHDL行为描述语言作为一种结构化和过程性的语言,其语法结构非常适合于算法级和RTL级的模型设计。这种行为描述语言具有以下八项功能:Verilog的应用•可描述顺序执行或并行执行的程序结构。•用延迟表达式或事件表达式来明确地控制过程的启动时间。•通过命名的事件来触发其它过程里的激活行为或停止行为。•提供了条件、if-else、case、循环程序结构。•提供了可带参数且非零延续时间的任务(task)程序结构。•提供了可定义新的操作符的函数结构(function)。Verilog的应用提供了用于建立表达式的算术运算符、逻辑运算符、位运算符。VerilogHDL语言作为一种结构化的语言也非常适合于门级和开关级的模型设计。VerilogHDL的构造性语句可以精确地建立信号的模型。这是因为在VerilogHDL中,提供了延迟和输出强度的原语来建立精确程度很高的信号模型。信号值可以有不同的的强度,可以通过设定宽范围的模糊值来降低不确定条件的影响。Verilog的应用VerilogHDL作为一种高级的硬件描述编程语言,有着类似C语言的风格。其中有许多语句如:if语句、case语句等和C语言中的对应语句十分相似。如果读者已经掌握C语言编程的基础,那么学习VerilogHDL并不困难,我们只要对VerilogHDL某些语句的特殊方面着重理解,并加强上机练习就能很好地掌握它,利用它的强大功能来设计复杂的数字逻辑电路。下面我们将对VerilogHDL中的基本语法逐一加以介绍。模块的抽象技术指标:用文字表示用算法表示用高级行为的Verilog模块表示RTL/功能级:用可综合的Verilog模块表示门级/结构级:用实例引用的Verilog模块表示版图布局/物理级:用几何形状来表示行为综合逻辑综合综合前仿真综合后仿真布局布线第三部分.简单的VerilogHDL模块目的:通过简单的例子了解Verilog模块的基本构成了解Verilog模块的层次结构和行为模块了解Verilog模块的测试简单的VerilogHDL模块下面先介绍几个简单的VerilogHDL程序,然后从中分析VerilogHDL程序的特性。例[2.1.1]:moduleadder(count,sum,a,b,cin);input[2:0]a,b;inputcin;outputcount;output[2:0]sum;assign{count,sum}=a+b+cin;endmodule这个例子描述了一个三位的加法器。从例子中可以看出整个VerilogHDL程序是嵌套在module和endmodule声明语句里的。简单的VerilogHDL模块例[2.1.2]:modulecompare(equal,a,b);outputequal;//声明输出信号equalinput[1:0]a,b;//声明输入信号a,bassignequal=(a==b)?1:0;/*如果两个输入信号相等,输出为1。否则为0*/endmodule这个程序描述了一个比较器.在这个程序中,/*........*/和//.........表示注释部分,注释只是为了方便程序员理解程序,对编译是不起作用的。简单的VerilogHDL模块例[2.1.3]:moduletrist2(out,in,enable);outputout;inputin,enable;bufif1mybuf(out,in,enable);endmodule这个程序描述了一个三态驱动器。程序通过调用一个实例元件bufif1来实现其功能。简单的VerilogHDL模块例[2.1.4]:moduletrist1(out,in,enable);outputout;inputin,enable;mytritri_inst(out,in,enable);endmodulemodulemytri(out,in,enable);outputout;inputin,enable;assignout=enable?In:'bz;endmodule简单的VerilogHDL模块上述程序例子通过另一种方法描述了一个三态门。在这个例子中存在着两个模块:模块trist1调用模块mytri的实例元件tri_inst。模块trist1是上层模块。模块mytri则被称为子模块。通过这种结构性模块构造可构成特大型模块。简单的VerilogHDL模块通过上面的例子可以看到:•VerilogHDL程序是由模块构成的。模块是可以进行层次嵌套的。正因为如此,才可以将大型的数字电路设计分割成不同的小模块来实现特定的功能,最后通过顶层模块调用子模块来实现整体功能。•每个模块要进行端口定义,并说明输入输出口,然后对模块的功能进行行为逻辑描述。•VerilogHDL程序的书写格式自由,一行可以写几个语句,一个语句也可以分写多行。•除了endmodule语句外,每个语句和数据定义的最后必须有分号•可以用/*.....*/和//...对VerilogHDL程序的任何部分作注释。一个好的,有使用价值的源程序都应当加上必要的注释,以增强程序的可读性和可维护性。模块的结构Verilog的基本设计单元是“模块”(block)。一个模块是由两部分组成的:一)描述接口;二)描述逻辑功能,即定义输入是如何影响输出的。下面举例说明:moduleblock(a,b,c,d);inputa,b;outputc,d;assignc=a|b;assignd=a&b;endmoduleabcd模块的结构从上面的例子可以看出:-Verilog模块结构完全嵌在module和endmodule声明语句之间;-每个Verilog程序包括四个主要部分:端口定义、I/O说明、内部信号声明、功能定义。模块的测试如何检查上述例子其功能是否正确?需要有测试激励信号输入到被测模块需要记录被测模块的输出信号需要把用功能和行为描述的Verilog模块转换为门级电路互连的电路结构(综合)。需要对已经转换为门级电路结构的逻辑进行测试(门级电路仿真)。需要对布局布线后的电路结构进行测试。(布局布线后仿真)。模块的测试被测模块激励和控制信号输出响应和验证模块的测试测试模块常见的形式:modulet;reg…;//被测模块输入/输出变量类型定义wire…;//被测模块输入/输出变量类型定义initialbegin…;…;…;end……//产生测试信号always#delaybegin…;end……//产生测试信号Testedmdm(.in1(ina),.in2(inb),.out1(outa),.out2(outb));//被测模块的实例引用initialbegin….;….;….end//记录输出和响应endmodule模块的测试测试模块中常用的过程块:initialalways所有的过程块都在0时刻同时启动;它们是并行的,在模块中不分前后。initial块只执行一次。always块只要符合触发条件可以循环执行。模块的测试如何描述激励信号:modulet;rega,b,sel;wireout;//引用多路器实例mux2_m(out,a,b,sel);//加入激励信号initialbegina=0;b=1;sel=0;#10b=0;#10b=1;sel=1;#10a=1;#10$stop;end模块的测试如何观察被测模块的响应:在initial块中,用系统任务$time和$monitor$time返回当前的仿真时刻$monitor只要在其变量列表中有某一个或某几个变量值发生变化,便在仿真单位时间结束时显示其变量列表中所有变量的值。例:initialbegin$monitor($time,,“out=%ba=%bsel=%b”,out,a,b,sel);end模块的测试如何把被测模块的输出变化记录到数据库文件中?(文件格式为VCD,大多数的波形显示工具都能读取该格式)可用以下七个系统任务:1)$dumpfile(“file.dump”);//打开记录数据变化的数据文件2)$dumpvars();//选择需要记录的变量3)$dumpflush;//把记录在数据文件中的资料转送到硬盘保存4)$dumpoff;//停止记录数据变化5)$dumpon;//重新开始记录数据变化6)$dumplimit(file_size);//规定数据文件的大小(字节)7)$dumpall;//记录所有指定信号的变化值到数据文件中模块的测试如何把被测模块的响应变化记录到数据库文件中?举例说明:$dumpvars;//记录各层次模块中所有信号的变化$dumpvars(1,top);//只记录模块top中所有信号的变化$dumpvars(2,top.u1);//记录top模块中实例u1和它以下一层子模块所有信号的变化$dumpvars(0,top.u2,top.u1.u13.q);//记录top模块中实例u2和它本层所有信号的变化,还有top.u1.u13.q信号的变化。$dumpvars(3,top.u2,top.u1);//记录top模块中u2和u1所有信号的变化(包括其两层以下子模块的信号变化)。模块的测试如何把被测模块的响应变化记录到数据库文件中?举例说明:下面的Verilog代码段可以代替测试文件中的系统任务$monitorinitialbegin$dumpfile(“vlog.dump”);$dumpvars(0,top);end语法详细讲解第四部分.Verilog语法要点目标:理解Verilog语言的一些重要规定.学会认识一些有关的重要语言符号.掌握Verilog中如何规定时间单位语法详细讲解Verilog