当前位置:文档之家› 1、VerilogHDL设计流程

1、VerilogHDL设计流程

1、Verilog HDL 设计流程:1、文本编辑:文件保存为.v的文件;2、功能仿真:将.v文件调入HDL仿真软件,逻辑功能是否正确(前仿真);3、逻辑综合:将源文件调入逻辑综合软件进行综合,把语言综合成最简的布尔表达式,生成.edf的EDA工业标准文件;矚慫润厲钐瘗睞枥庑赖。

4、布局布线;5、时序仿真:验证电路的时序(后仿真)。

2、Verilog 程序包括四部分:1、端口定义2、I/O口说明3、内部信号声明4、功能定义3、逻辑功能定义:三种方法在模块中产生逻辑:(1)用assign 声明语句;如assign a = b & c;(描述组合逻辑)(2)用实例元件;如and #2 u1(q,a,b);(3)用always块;如(既可描述组合逻辑也可描述时序逻辑)always @ (posedge clk or posedge clr)beginif(clr) q <= 0;else if(en) q <= d;end4、网络类型变量两种:wire triWire型变量:用来表示单个门驱动或连续赋值语句驱动的网络类型数据。

Tri 型变量:用来表示多驱动器驱动的网络型数据。

线网类型两种:wire triTri 主要用于定义三态的线网;Wire型:代表的是物理连接,不存储逻辑值,要由器件驱动,通常用assign进行赋值Wire类型的信号没被驱动,缺省值为Z(高阻);信号没有定义数据类型时,缺省为wire 类型。

(缺省==默认)聞創沟燴鐺險爱氇谴净。

Reg型:默认初始值为x,通常用always模块内的指定信号,常代表触发器;always模块内被赋值的每一个信号都必须定义为reg型。

(寄存器类型)Verilog HDL 有5种寄存器类型:reg、integer、time、real、realtime5、运算符号所带操作数单目运算符:可带一个操作数,操作数放在运算符右边双目运算符:可带两个操作数,操作数放在运算符两边三目运算符:可带3个操作数,用三目运算符分隔开6、底层模块的调用:底层模块(被测试模块)可由测试模块调用如:(位置关联方式) :AND_G2 AND_G2(A,B,F);第一个AND_G2 为底层模块名,第二个为实例名,(A,B,F)为参数定义。

语法结构为:底层模块名实例名参数定义参数定义重要;A,B,F 相应的在底层模块也有A,B,F参数顺序也要注意,与测试模块一一对应,不一定要同名。

(名称关联方式):AND_G2 AND_G2(.A(Cin),.B(Sum),.F(S1));排列顺序不重要。

在模块实例化语句中,允许端口出现悬空,可将端口表达式表示为空白来指定悬空端口。

7、测试模块(testbench)模块的定义和调用(实例化)类似于软件中函数的定义和调用,但二者有本质的区别:软件的函数调用只是对同一段程序的使用,不管调用多少次,这个函数在程序中只有这么一段;模块的定义和调用是硬件的实现,每一次调用(实例化)都将产生实现这个模块功能的一组电路。

若调用两次NAND模块,就在AND模块中产生两块实实在在的NAND电路。

残骛楼諍锩瀨濟溆塹籟。

8、监测功能,仿真可显示变量的值;$monitor如:$monitor("Time=%0d a=%b b=%b out1=%b out2=%b",$time,a,b,out1,out2);酽锕极額閉镇桧猪訣锥。

仿真显示:# Time=0 a=0 b=0 out1=1 out2=0# Time=1 a=1 b=0 out1=1 out2=0# Time=2 a=1 b=1 out1=0 out2=1# Time=3 a=0 b=1 out1=1 out2=09、在Verilog HDL程序中,语句空格没有任何意义。

只有出现在字符串中的空格才有意义;在Verilog HDL程序中,区分大小写,sum与SUM代表的意义不同。

彈贸摄尔霁毙攬砖卤庑。

10、预处理指令`define 、`undef、`ifdef、`else、`endif、`include、`timescale謀荞抟箧飆鐸怼类蒋薔。

(1)`define 与C中#define功能相同,`undef 取消前面`define 指令所作的定义;厦礴恳蹒骈時盡继價骚。

(2)`ifdef、`else、`endif 与if-else结构类似,条件编译;`ifdef WINDOWSparameter WORD_SIZE = 16`elseparameter WORD_SIZE = 12`endif(3)`include 用于嵌入“内嵌文件”的内容`include "../../halfadder.v" //双引号是要内嵌的文件的路径和文件名module adder;........endmodule(4)`timescale 编译器指令定义时延单位和时延精度在Vreilog HDL中,所有时延都用单位时间表示,格式为:`timescale time_unit/time_precision 时延单位/时延精度条件语句if 使用注意事项:(1)条件表达式需用括号括起来;(2)if-if-else....else与if搭配问题,else与最近的一个if搭配;(3)if-if语句,要使用块语句begin...end:(4)具有优先级,排在前面某个分支的条件满足就会执行那个分支,然后跳出整个if结构。

if(CLK)beginif(Reset)Q = 0;else Q = D;end(4)锁存器:若无缺省语句,则将产生一个锁存器if(T)Q = D;Case语句条件表达式、分支表达式case()............default: ......end case注意:case的缺省项(default: ......)必须写,以防止产生锁存器;While语句While (表达式) 语句或While(表达式) begin 多余语句end如:对reg1 8位二进制数中值为1 的位进行计数;beginreg[7:0] regtempcount = 0;regtemp = reg1;while(regtemp)beginif(regtemp[0]) count = count + 1; //若第一位为1进行count计数茕桢广鳓鯡选块网羈泪。

regtemp = regtemp >> 1; //右移运算endendfor语句一般形式:for (表达式1;表达式2;表达式3)11、结构说明语句Verilog HDL 语言中过程模块从属于4种结构说明语句:initial、always、task、function 说明语句(1)、intitial只执行一次,always语句则不断重复执行,initial用于对各变量的初始化。

每个initial 和always 说明语句在仿真开始时同时进行。

鹅娅尽損鹌惨歷茏鴛賴。

initialbegin语句1;语句2;......语句n;end(2)、always 声明格式如下:always<时序控制><语句>always需与一定的时序控制结和才有用;always 时序控制可以是:沿触发、电平触发、单个信号、多个信号(or)(3)、task 定义任务(4)、function 定义函数可简化程序的结构,编写大型模块。

注意task 与function 的不同点;?13、V erilog HDL 系统功能调用:以字符"$"开头的标识符(1)任务型的功能调用,系统任务(2)函数型的功能调用,系统函数标准输出任务:$display、$write $display("d=%0h a=%0h",data,addr);籟丛妈羥为贍偾蛏练淨。

仿真控制任务:$monitor $monitoron///$monitoroff 控制$monitor 的启动与停止預頌圣鉉儐歲龈讶骅籴。

时间系统度量函数:$time、$realtime 得到当前的仿真时间文件管理任务:$fopen 打开文件<file_handle>= $fopen("file_name");file_name为被打开的文件名及其路径14、事件控制(1)边沿触发事件:@@ event procedural_statement ;event 为边沿事件@(posede Clock) Curr_State = Next_State; /在CLK的上升沿执行赋值语句渗釤呛俨匀谔鱉调硯錦。

(2)电平敏感事件:waitwait (Condition) procedural_statement ;Condition为电平敏感事件铙誅卧泻噦圣骋贶頂廡。

15、initial语句和always语句,所有过程语句都必须封装成语句块(只有一条语句除外)(1)顺序语句块(begin-end) 按书写顺序依次执行(2)并行语句块(fork-join) 块中语句并行执行(与书写顺序无关)语句块可有一个标识符作为其名称,带有名称的语句块可以在其内部声明局部寄存器变量,而且带名称的语句块可被引用。

擁締凤袜备訊顎轮烂蔷。

16、过程性赋值两种:阻塞(=)、非阻塞(<=)(1)只出现在initlial语句和always语句内;(2)过程性赋值只能给寄存器变量赋值;(3)赋值表达式的右端可以是任何表达式。

阻塞(=)在执行时,处于其后的其他赋值语句都不能执行;对同一个变量做连续阻塞赋值,其值由最后一个赋值语句决定。

贓熱俣阃歲匱阊邺镓騷。

非阻塞(<=)只能用于给寄存器赋值,处于其后的其他赋值语句可以执行。

在执行过程中有一个微小的时间间隔。

17、过程连续性赋值assign-deassign(赋值-重新赋值)用于对寄存器赋值;force-release(强制-释放)对寄存器与线网都能赋值。

18、Verilog HDL 两种建模方法:行为建模、结构建模行为建模:数据流行为建模(assign)assign只能用于对线网类型赋值;(连续赋值语句)顺序行为建模(initial语句、always语句)驱动寄存器;(过程赋值语句)不同点连续赋值过程赋值assign 有无坛摶乡囂忏蒌鍥铃氈淚。

符号= = 或<=蜡變黲癟報伥铉锚鈰赘。

位置不在always、initial出现在always或initial出现買鲷鴯譖昙膚遙闫撷凄。

执行条件与等号右端操作数的值发生变化有关与周围其他语句有关用途驱动线网驱动寄存器綾镝鯛駕櫬鹕踪韦辚糴。

结构建模:内置基元实例化语句,模块实例化语句,UDP实例化语句19、循环语句四类:forever、repeat、while、for循环语句forever语句:过程语句必须要有某种形式的时序控制,否则forever会再0时延后永远重复执行过程语句;(用于产生周期性的波形作为仿真测试信号)repeat语句:repeat(loop_count)procedural_statement ;loop_count为控制循环的常数或变量repeat(Count)@(posedge Clk) Sum = Sum + 1;与Sum = repeat(Count)@(posedge Clk) Sum + 1;的区别???20、前仿真与后仿真(重要)前仿真也称为功能仿真,主要在于验证电路的功能是否符合设计要求,其特点是不考虑电路门延迟与线延迟,主要是验证电路与理想情况是否一致。

相关主题