您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > VerilogHDL及Modelsim仿真范益波
VerilogHDL及Modelsim仿真范益波Acknowledgment•Thisslidesisrevisedfrom“VerilogHDL基础语法入门”by夏宇闻Outline•Verilog简介•简单的VerilogHDL模块•Verilog语法要点•Verilog的逻辑值和数据类型•存储器及有限状态机建模•可综合风格的Verilog什么是verilog•Verilog是一种硬件设计语言(HardwareDescriptionLanguage,HDL)•主要用于数字逻辑电路设计•跟VHDL类似Verilog与C语言的关系•VerilogHDL作为一种高级的硬件描述编程语言,有着类似C语言的风格。其中有许多语句如:if语句、case语句等和C语言中的对应语句十分相似。如果读者已经掌握C语言编程的基础,那么学习VerilogHDL并不困难,我们只要对VerilogHDL某些语句的特殊方面着重理解,并加强上机练习就能很好地掌握它,利用它的强大功能来设计复杂的数字逻辑电路。•但是注意:Verilog是硬件设计语言,跟软件设计有本质区别Verilog具有不同的抽象级别•系统级(system):用高级语言结构实现设计模块的外部性能的模型。•算法级(algorithmic):用高级语言结构实现设计算法的模型。•RTL级(RegisterTransferLevel):描述数据在寄存器之间流动和如何处理这些数据的模型。•可综合•相对高层的描述•门级(gate-level):描述逻辑门以及逻辑门之间的连接的模型。模块的抽象及数字电路的基本设计流程技术指标:用文字表示用算法表示用高级行为的Verilog模块表示RTL/功能级:用可综合的Verilog模块表示门级/结构级:用实例引用的Verilog模块表示版图布局/物理级:用几何形状来表示RTLdesign逻辑综合综合前仿真综合后仿真布局布线Verilog的层次性架构•一个复杂电路的完整VerilogHDL模型是由若个VerilogHDL模块构成的,每一个模块又可以由若干个子模块构成。–利用VerilogHDL语言结构所提供的这种功能就可以构造一个模块间的清晰层次结构来描述极其复杂的大型设计。•VerilogHDL行为描述语言作为一种结构化和过程性的语言,其语法结构非常适合于算法级和RTL级的模型设计。Outline•Verilog简介•简单的VerilogHDL模块•Verilog语法要点•Verilog的逻辑值和数据类型•存储器及有限状态机建模•可综合风格的Verilog举例1例[2.1.1]:moduleadder(count,sum,a,b,cin);input[2:0]a,b;//声明输出信号equalinputcin;//声明输入信号outputcount;output[2:0]sum;assign{count,sum}=a+b+cin;endmodule这个例子描述了一个三位的加法器。从例子中可以看出整个VerilogHDL程序是嵌套在module和endmodule声明语句里的。举例2例[2.1.2]:modulecompare(equal,a,b);outputequal;input[1:0]a,b;assignequal=(a==b)?1:0;/*如果两个输入信号相等,输出为1。否则为0*/endmodule这个程序描述了一个比较器.在这个程序中,/*........*/和//.........表示注释部分,注释只是为了方便程序员理解程序,对编译是不起作用的。举例3例[2.1.3]:moduletrist1(out,in,enable);outputout;inputin,enable;mytritri_inst(out,in,enable);endmodulemodulemytri(out,in,enable);outputout;inputin,enable;assignout=enable?In:'bz;endmodule上述程序例子通过另一种方法描述了一个三态门。在这个例子中存在着两个模块:模块trist1调用模块mytri的实例元件。通过这种结构性模块构造可构成特大型模块。简单举例后的小结•整个VerilogHDL程序是嵌套在module和endmodule声明语句里的。•每个模块要进行端口定义,并说明输入输出口,然后对模块的功能进行行为逻辑描述。•VerilogHDL程序是由模块构成的。模块是可以进行层次嵌套的。•除了endmodule(及后面会学到的initial,end等)语句外,每个语句和数据定义的最后必须有分号•可以用/*.....*/和//...对VerilogHDL程序的任何部分作注释。模块的测试:基本概念被测模块激励和控制信号输出响应和验证测试模块的常见形式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;//引用多路器实例mux2m(out,a,b,sel);//加入激励信号initialbegina=0;b=1;sel=0;#10b=0;#10b=1;sel=1;#10a=1;#10$stop;endendmodule虽然有时在设计中会包含时钟,但时钟通常用在测试模块中。简单的对称方波时钟:建立时钟regclk;alwaysbegin#period/2clk=0;#period/2clk=1;end仿真工具简介•Mentor公司的ModleSim–Learnfromthe‘help’manualofthesoftware–Learnfromsometeachingbooks•Cadence的NC-Verilog•Synopsys的VCSOutline•Verilog简介•简单的VerilogHDL模块•Verilog语法要点•Verilog的逻辑值和数据类型•存储器及有限状态机建模•可综合风格的VerilogVerilog与C的主要不同点•Verilog有许多语法规则与C语言一致,但与C语言有根本的区别:–并行性–块的含义:initial块和always块–两种赋值语句:阻塞赋值“=”非阻塞赋值“〈=”整数和实常数整数可以标明位数也可以不标明位数,表示方法:《位数》‘《基数》《值》其中《位数》表明该数用二进制的几位来表示《基数》可以是二(b)、八(O)、十(d)或十六(h)进制《数值》可以是所选基数的任何合法的值包括不定值x位和高阻值z。如:64‘hff018’b1101_0001‘h83a实常数可以用十进制表示也可以用科学浮点数表示,如:32e-4(表示0.0032)4.1E3(表示4100)标识符•所谓标识别符就是用户为程序描述中的Verilog对象所起的名字。•标识符必须以英语字母(a-z,A-Z)起头,或者用下横线符(_)起头。其中可以包含数字、$符和下横线符。•标识符最长可以达到1023个字符。•模块名、端口名和实例名都是标识符。•Verilog语言是大小写敏感的,因此sel和SEL是两个不同的标识符。合法和非法标识符举例•合法的:–shift_reg_a–busa_index–bus263•非法的:–34net//不能用数字开头–a*b_net//不能含有非字母符号*–n@263//不能含有非字母符号@$标识符‘$’符号表示Verilog的系统任务和函数常用的系统任务和函数有下面几种:1)$time//找到当前的仿真时间2)$display,$monitor//显示和监视信号值的变化3)$stop//暂停仿真4)$finish//结束仿真-------------------------------------------------------例:initial$monitor($time,,”a=%b,b=%b”,a,b);//每当a或b值变化时该系统任务都显示当前的仿真时刻并分别用二进制和十六进制显示信号a和b的值特殊符号“#”特殊符号“#”常用来表示延迟:在过程赋值语句时表示延迟。例:initialbegin#10rst=1;#50rst=0;end在门级实例引用时表示延迟。例:not#1not1(nsel,sel);and#2and2(a1,a,nsel);编译引导语句编译引导语句用主键盘左上角小写键“`”起头用于指导仿真编译器在编译时采取一些特殊处理编译引导语句一直保持有效,直到被取消或重写`resetall编译引导语句把所有设置的编译引导恢复到缺省状态常用的编译引导有:a)`defineb)`includec)`timescale……..编译引导语句:`define使用`define编译引导能提供简单的文本替代功能`define宏名宏文本在编译时会用宏文本来替代源代码中的宏名。合理地使用`define可以提高程序的可读性举例说明:`defineon1’b1`defineoff1’b0`defineand_delay#3在程序中可以用有含义的文字来表示没有意思的数码提高了程序的可读性,在程序中可以用`on,`off,`and_delay分别表示1,0,和#3。编译引导语句:`include使用`include编译引导,在编译时能把其指定的整个文件包括进来一起处理举例说明:`include“global.v”`include“parts/counter.v”`include“../../library/mux.v”合理地使用`include可以使程序简洁、清晰、条理清楚、易于查错。编译引导语句:`timescale`timescale用于说明程序中的时间单位和仿真精度举例说明:`timescale1ns/100ps`timescale语句必须放在模块边界前面举例说明:`timescale1ns/100psmoduleMUX2_1(out,a,b,sel);……not#1not1(nsel,sel);and#2and1(a1,a,nsel);……endmodule尽可能地使精度与时间单位接近,只要满足设计的实际需要就行。举例说明:在上例中所有的时间单位都是1ns的整数倍Outline•Verilog简介•简单的VerilogHDL模块•Verilog语法要点•Verilog的逻辑值和数据类型•存储器及有限状态机建模•可综合风格的VerilogVerilog的四种逻辑值0、低、伪、逻辑低、地、VSS、负插入01XZ0bufbufbufbufif11、高、真、逻辑高、电源、VDD、正插入X、不确定:逻辑冲突无法确定其逻辑值HiZ、高阻抗、三态、无驱动源Verilog主要的数据类型Nets表示器件之间的物理连接,称为网络连接类型;一般用wire来表示Register表示抽象的储存单元,称为寄存器/变量类型;一般用reg来表示Parameter表示运行时的常数,称为参数类型如何选择正确的数据类型?输入口(input)可以由寄存器或网络连接驱动,但它本身只能驱动网络连接。输出口(output)可以由寄存器或网络连接驱动,但它本身只能驱动网络连接。输入/输出口(inout)只可以由网络连接驱动,但它本身只能驱动网络连接。如果信号变量是在过程块(initial块或always块)中被赋值的,必须
本文标题:VerilogHDL及Modelsim仿真范益波
链接地址:https://www.777doc.com/doc-4399032 .html