2005-3-1apjiang@ime.pku.edu.cn1第二部分硬件描述语言Verilog2005-3-1apjiang@ime.pku.edu.cn2为什么要采用硬件描述语言(HDL)•随着设计复杂性的提高,无法再用硬件直接实现需要的功能,利用HDL可以提高描述的抽象层次•易于通过EDA工具完成工艺无关的设计,有利于保证设计正确性和对设计进行管理•便于对设计进行管理、归档和重用•易于对设计进行修改,以探索不同的设计可能性•便于提高设计的效率2005-3-1apjiang@ime.pku.edu.cn3硬件描述语言(HDL)的特点•采用高级程序设计语言的结构,但与一般软件程序设计语言有差别,它是针对硬件系统与部件设计的。–在不同的抽象层次上描述电路的功能和连接关系,可以描述电路的结构–除了描述功能之外还描述时序关系–并行性:同时进行多个任务–时间:具有描述延迟等时间概念的能力2005-3-1apjiang@ime.pku.edu.cn4常见的两种硬件描述语言•VHDL:VHSIC(veryhigh-speedIC)hardwaredescriptionlanguage,得到美国军方支持,1987年成为IEEE标准,1993年进行修订。类似ADA语言。•Verilog:由民间发展起来,1995年成为IEEE标准,2001年进行了修订。类似C语言。2005-3-1apjiang@ime.pku.edu.cn5Verilog语言的功能•可以描述数字电子系统•可以完成不同抽象层次的描述•除了描述器件的功能外还可以建立比较完整的模拟环境来验证设计的正确性,也就是说设计和模拟都可以用Verilog完成。•用于测试•用于设计文档管理2005-3-1apjiang@ime.pku.edu.cn6Verilog语言的用途•ASIC和FPGA设计人员可以用来编写用于综合的代码•可以对系统建模,完成系统高层级仿真•编写用于各级设计仿真的测试环境•描述基本单元或更高级的部件2005-3-1apjiang@ime.pku.edu.cn7Verilog在不同设计层次上的作用(1)•行为级–描述系统中数据在不同模块之间的传输–描述必要的操作•寄存器传输级(RTL)–描述系统中的数据流和功能模块之间和内部的控制信号–按照定义的时钟周期建立模型2005-3-1apjiang@ime.pku.edu.cn8Verilog在不同设计层次上的作用(2)•门级(结构)–描述底层单元之间的连接,可以更精确地描述系统的行为–在进行综合时使用特定工艺库完成RTL到门级的映射2005-3-1apjiang@ime.pku.edu.cn9Verilog发展历史(1)•1985年,GatewayDesignAutomation公司为其仿真器产品开发了Verilog语言。•1989年,Cadence收购Gateway公司,并继续推广该语言和仿真器。•1990年,组织了OVI(OpenVerilogInternational)•1993年,IEEE开始了Verilog的标准化工作2005-3-1apjiang@ime.pku.edu.cn10Verilog发展历史(1)•1995年公布了IEEE1364-1995Verilog标准•2001年公布了IEEE1364-2001Verilog标准,对IEEE1364-1995进行了修订2005-3-1apjiang@ime.pku.edu.cn11Verilog举例(1)modulemuxtwo(out,a,b,sel);inputa,b,sel;//输入端口说明outputout;//输出端口说明regout;always@(seloraorb)if(!sel)out=a;elseout=b;endmodule2005-3-1apjiang@ime.pku.edu.cn12Verilog举例(2)moduletwomux(out,a,b,sl);inputa,b,sl;outputout;notu1(nsl,sl);and#1u2(sela,a,nsl);and#1u3(selb,b,sl);or#2u4(out,sela,selb);endmodule2005-3-1apjiang@ime.pku.edu.cn13Verilog举例(3)`timescale1ns/1nsmodulecounter;regclock;//declareregdatatypefortheclockintegercount;//declareintegerdatatypeforthecountinitial//initializethings-thisexecutesonceatstartbeginclock=0;count=0;//initializesignals#340$finish;//finishafter340timeticksend/*analwaysstatementtogeneratetheclock,onlyonestatementfollowsthealwayssowedon'tneedabeginandanend*/2005-3-1apjiang@ime.pku.edu.cn14Verilog举例(3续1)always#10clock=~clock;//delayissettohalftheclockcycle/*analwaysstatementtodothecounting,runsatthesametime(concurrently)astheotheralwaysstatement*/alwaysbegin//waithereuntiltheclockgoesfrom1to0@(negedgeclock);//nowhandlethecountingif(count==7)count=0;2005-3-1apjiang@ime.pku.edu.cn15Verilog举例(3续2)elsecount=count+1;$display(time=,$time,count=,count);endendmodule2005-3-1apjiang@ime.pku.edu.cn16例3的结果time=20count=1time=40count=2(...12linesomitted...)time=300count=7time=320count=02005-3-1apjiang@ime.pku.edu.cn17VerilogHDL结构框图module端口参数模块调用过程块连续赋值函数原语或UDP实体化事件参数覆盖specifyinputoutputinoutnetvariablewiretritri1supply0triandtriorwandwortriregregintegerrealtimerealtimeinitialalways任务tri0supply1赋值条件循环等待块任务调用禁止disable延迟控制事件触发assigndeassignforcerelease阻塞非阻塞ifcaseforwhilerepeatforever顺序块并行块系统任务调用2005-3-1apjiang@ime.pku.edu.cn18Verilog语言基础2005-3-1apjiang@ime.pku.edu.cn19标识符(identifier)•标识符是用户提供的一个描述目标的名称•最长1023个字符•标识符是大小写敏感的,所有的关键词是小写的•BNF表示identifier::=simple_identifier|escaped_identifiersimple_identifier::=[a-zA-Z_][a-zA-Z0-9_$]escaped_identifier::=\{Any_ASCII_character_except_white_space}white_spacewhite_space::=space|tab|newline2005-3-1apjiang@ime.pku.edu.cn20转义标识符•转义标识符必须以反斜线开头,以空白字符结尾•转义标识符中可以包含任何可打印字符•对转义标识符的支持可能因工具不同而异2005-3-1apjiang@ime.pku.edu.cn21简单标识符举例•合法的标识符shift_reg_abusa_index_bus3•不合法的标识符34neta*b_netn@2382005-3-1apjiang@ime.pku.edu.cn22转义标识符举例\~#@sel\busa+index\{A,B}最后必须用空白符(包括空格、制表符Tab和换行符)结束。2005-3-1apjiang@ime.pku.edu.cn23Verilog逻辑值•Verilog内采用四值逻辑,即0,1,x,z。•0表示0,低电平,假,逻辑低,地等•1表示1,高电平,真,逻辑高,电源等•x表示未被初始化的逻辑或未知逻辑值(无法确定的逻辑)。•z表示高阻状态,没有驱动的线等。2005-3-1apjiang@ime.pku.edu.cn24数字的表示(1)•整数的表示width'radixvalue–width指明占用的二进制长度(可选),如果不指明占用的长度和实现相关,通常可能是一个字长–radix指明采用的基数(进制)•十进制decimal(dorD)•十六进制hex(horH)•八进制octal(oorO)•二进制binary(borB)–value是在相应基数下的值2005-3-1apjiang@ime.pku.edu.cn25数字的表示(2)•整数的表示举例5’O424’D98’haB-6’b100_X1z10’D-20//错误(2+4)’b011000//错误2005-3-1apjiang@ime.pku.edu.cn26数字的表示(3)•实数的表示–十进制表示10.2123.456-34.5–科学计数法表示23_5.1e2//23510.0-6.2E6//-6200000.03E-2//0.032005-3-1apjiang@ime.pku.edu.cn27字符串•使用双引号括起来的多个字符•不能跨行•其中可使用反斜线(\)对特殊字符进行转义•举例“MESSAGE\n”“Finished\\”2005-3-1apjiang@ime.pku.edu.cn28Verilog数据类型•Verilog中的数据类型有两大类,即线网(nets)和变量(variables),表示数据的存储和传输元件。•线网:表示器件之间的物理连接,不保存数据值,由驱动元件决定起信号值•变量:表示抽象存储元件•线网和变量的定义中可以带有范围,形成向量。当定义时没有指定范围时认为宽度是1的标量。2005-3-1apjiang@ime.pku.edu.cn29线网的种类•线网需要被持续地驱动,驱动它的可以是门、模块或逻辑等•默认的初试值是z•种类wire,tri:标准的互连线,功能上相同supply1,supply0:电源和地wor,trior:通过线或连接的多个驱动wand,triand:通过线与连接的多个驱动trireg:有电容保存的线网tri1,tri0:在不驱动时上拉或下拉的线网2005-3-1apjiang@ime.pku.edu.cn30不同类型线网对逻辑冲突的处理2005-3-1apjiang@ime.pku.edu.cn31线网的说明net_type[range][delay]net_name[,net_name]*net_type是线网的类型range是用[MSB:LSB]格式描述的向量范围,一位的是标量,多位的是向量delay定义与该线网相关的延迟net_name是线网的名称,一次可以定义多个线网,中间用逗号分开2005-3-1apjiang@ime.pku.edu.cn32变量类型•保存原有的值直到赋予新的值•种类reg:数据保存元件的抽象,向量可以表示无符号整数,初值是xinteger:有符号32位整