verilog语言学习17-22.ppt

上传人:b****3 文档编号:2728029 上传时间:2022-11-09 格式:PPT 页数:121 大小:641.50KB
下载 相关 举报
verilog语言学习17-22.ppt_第1页
第1页 / 共121页
verilog语言学习17-22.ppt_第2页
第2页 / 共121页
verilog语言学习17-22.ppt_第3页
第3页 / 共121页
verilog语言学习17-22.ppt_第4页
第4页 / 共121页
verilog语言学习17-22.ppt_第5页
第5页 / 共121页
点击查看更多>>
下载资源
资源描述

verilog语言学习17-22.ppt

《verilog语言学习17-22.ppt》由会员分享,可在线阅读,更多相关《verilog语言学习17-22.ppt(121页珍藏版)》请在冰豆网上搜索。

verilog语言学习17-22.ppt

第17章Verilog中的高级结构学习内容:

学习内容:

任务和函数的定义和调用任务和函数的定义和调用怎样使用命名块怎样使用命名块怎样禁止命名块和任务怎样禁止命名块和任务有限状态机(有限状态机(FSM)及建模)及建模Verilog的任务及函数的任务及函数结构化设计是将任务分解为较小的,更易管理的单元,并将可重用代结构化设计是将任务分解为较小的,更易管理的单元,并将可重用代码进行封装。

这通过将设计分成模块,或任务和函数实现。

码进行封装。

这通过将设计分成模块,或任务和函数实现。

任务(任务(task)通常用于调试,或对硬件进行行为描述通常用于调试,或对硬件进行行为描述可以包含时序控制(可以包含时序控制(#延迟,延迟,,wait)可以有可以有input,output,和,和inout参数参数可以调用其他任务或函数可以调用其他任务或函数函数函数(function)通常用于计算,或描述组合逻辑通常用于计算,或描述组合逻辑不能包含任何延迟;函数仿真时间为不能包含任何延迟;函数仿真时间为0只含有只含有input参数并由函数名返回一个结果参数并由函数名返回一个结果可以调用其他函数,但不能调用任务可以调用其他函数,但不能调用任务Verilog的任务及函数的任务及函数任务和函数必须在任务和函数必须在module内调用内调用在任务和函数中不能声明在任务和函数中不能声明wire所有输入所有输入/输出都是输出都是局部局部寄存器寄存器任务任务/函数执行完成后才返回结果。

函数执行完成后才返回结果。

例如,若任务例如,若任务/函数中有函数中有forever语句,则永远不会返回结果语句,则永远不会返回结果任务任务下下面面的的任任务务中中含含有有时时序序控控制制和和一一个个输输入入,并并引引用用了了一一个个module变变量量,但没有输出、输入输出和内部变量,也不显示任何结果。

但没有输出、输入输出和内部变量,也不显示任何结果。

时序控制中使用的信号(例如时序控制中使用的信号(例如ck)一定不能作为任务的输入,因为)一定不能作为任务的输入,因为输入值只向该任务传送一次。

输入值只向该任务传送一次。

moduletop;regclk,a,b;DUTu1(out,a,b,clk);always#5clk=!

clk;taskneg_clocks;input31:

0number_of_edges;repeat(number_of_edges)(negedgeclk);endtaskinitialbeginclk=0;a=1;b=1;neg_clocks(3);/任务调用任务调用a=0;neg_clocks(5);b=0;endendmodule任务任务任务可以有任务可以有input,output和和inout参数。

参数。

传传送送到到任任务务的的参参数数和和与与任任务务I/O说说明明顺顺序序相相同同。

尽尽管管传传送送到到任任务务的的参参数数名名称称与与任任务务内内部部I/O说说明明的的名名字字可可以以相相同同,但但在在实实际际中中这这通通常常不不是是一一个个好好的的方法。

参数名的唯一性可以使任务具有好的模块性。

方法。

参数名的唯一性可以使任务具有好的模块性。

可以在任务内使用时序控制。

可以在任务内使用时序控制。

在在Verilog中任务定义一个新范围(中任务定义一个新范围(scope)要禁止任务,使用关键字要禁止任务,使用关键字disable。

主要特点:

主要特点:

从从代代码码中中多多处处调调用用任任务务时时要要小小心心。

因因为为任任务务的的局局部部变变量量的的只只有有一一个个拷拷贝贝,并并行调用任务可能导致错误的结果。

在任务中使用时序控制时这种情况时常发生。

行调用任务可能导致错误的结果。

在任务中使用时序控制时这种情况时常发生。

在在任任务务或或函函数数中中引引用用调调用用模模块块的的变变量量时时要要小小心心。

如如果果想想使使任任务务或或函函数数能能从从另另一个模块调用,则所有在任务或函数内部用到的变量都必须列在端口列表中。

一个模块调用,则所有在任务或函数内部用到的变量都必须列在端口列表中。

任务任务下下面面的的任任务务中中有有输输入入,输输出出,时时序序控控制制和和一一个个内内部部变变量量,并并且且引引用用了了一个一个module变量。

但没有双向端口,也没有显示。

变量。

但没有双向端口,也没有显示。

任务调用时的参数按任务定义的顺序列出。

任务调用时的参数按任务定义的顺序列出。

modulemult(clk,a,b,out,en_mult);inputclk,en_mult;input3:

0a,b;output7:

0out;reg7:

0out;always(posedgeclk)multme(a,b,out);/任务调用任务调用taskmultme;/任务定义任务定义input3:

0xme,tome;output7:

0result;wait(en_mult)result=xme*tome;endtaskendmodule函数(函数(function)函数中不能有时序控制,但调用它的过程可以有时序控制。

函数中不能有时序控制,但调用它的过程可以有时序控制。

函数名函数名f_or_and在函数中作为在函数中作为register使用使用moduleorand(a,b,c,d,e,out);input7:

0a,b,c,d,e;output7:

0out;reg7:

0out;always(aorborcordore)out=f_or_and(a,b,c,d,e);/函函数数调调用用function7:

0f_or_and;input7:

0a,b,c,d,e;if(e=1)f_or_and=(a|b)&(c|d);elsef_or_and=0;endfunctionendmodule函数函数主要特性:

主要特性:

函数定义中不能包含任何时序控制语句。

函数定义中不能包含任何时序控制语句。

函数至少有一个输入,不能包含任何输出或双向端口。

函数至少有一个输入,不能包含任何输出或双向端口。

函数只返回一个数据,其缺省为函数只返回一个数据,其缺省为reg类型。

类型。

传送到函数的参数顺序和函数输入参数的说明顺序相同。

传送到函数的参数顺序和函数输入参数的说明顺序相同。

函数在模块(函数在模块(module)内部定义。

内部定义。

函数不能调用任务,但任务可以调用函数。

函数不能调用任务,但任务可以调用函数。

函数在函数在Verilog中定义了一个新的范围(中定义了一个新的范围(scope)。

虽虽然然函函数数只只返返回回单单个个值值,但但返返回回的的值值可可以以直直接接给给信信号号连连接接赋赋值值。

这在需要有多个输出时非常有效。

这在需要有多个输出时非常有效。

o1,o2,o3,o4=f_or_and(a,b,c,d,e);函数函数要要返返回回一一个个向向量量值值(多多于于一一位位),在在函函数数定定义义时时在在函函数数名名前前说说明明范范围。

函数中需要多条语句时用围。

函数中需要多条语句时用begin和和end。

不管在函数内对函数名进行多少次赋值,值只返回一次。

下例中,不管在函数内对函数名进行多少次赋值,值只返回一次。

下例中,函数还在内部声明了一个整数。

函数还在内部声明了一个整数。

modulefoo;input7:

0loo;output7:

0goo;/可以持续赋值中调用函数可以持续赋值中调用函数wire7:

0goo=zero_count(loo);function3:

0zero_count;input7:

0in_bus;integerI;beginzero_count=0;for(I=0;I8;I=I+1)if(!

in_busI)zero_count=zero_count+1;endendfunctionendmodule函数函数函数返回值可以声明为其它函数返回值可以声明为其它register类型:

类型:

integer,real,或或time。

在任何表达式中都可调用函数在任何表达式中都可调用函数modulechecksub(neg,a,b);outputneg;regneg;inputa,b;functionintegersubtr;input7:

0in_a,in_b;subtr=in_a-in_b;/结果可能为结果可能为负负endfunctionalways(aorb)if(subtr(a,b)0)neg=1;elseneg=0;endmodule函数函数函数中可以对返回值的个别位进行赋值。

函数中可以对返回值的个别位进行赋值。

函数值的位数、函数端口甚至函数功能都可以参数化。

函数值的位数、函数端口甚至函数功能都可以参数化。

.parameterMAX_BITS=8;regMAX_BITS:

1D;functionMAX_BITS:

1reverse_bits;inputMAX_BITS-1:

0data;integerK;for(K=0;KMAX_BITS;K=K+1)reverse_bitsMAX_BITS-(K+1)=dataK;endfunctionalways(posedgeclk)D=reverse_bits(D);.命名块命名块(namedblock)在关键词在关键词begin或或fork后加上后加上:

对块进行命名对块进行命名modulenamed_blk;.begin:

seq_blk.end.fork:

par_blk.join.endmodule在命名块中可以声明局部变量在命名块中可以声明局部变量可以使用关键词可以使用关键词disable禁止一个命名块禁止一个命名块命名块定义了一个新的范围命名块定义了一个新的范围命名块会降低仿真速度命名块会降低仿真速度禁止命名块和任务禁止命名块和任务moduledo_arith(out,a,b,c,d,e,clk,en_mult);inputclk,en_mult;input7:

0a,b,c,d,e;output15:

0out;reg15:

0out;always(posedgeclk)begin:

arith_block/*命名块命名块*reg3:

0tmp1,tmp2;/*局部变量局部变量*tmp1,tmp2=f_or_and(a,b,c,d,e);/函数调函数调用用if(en_mult)multme(tmp1,tmp2,out);/任务任务调用调用endalways(negedgeen_mult)begin/中止运算中止运算disablemultme;/*禁止任务禁止任务*disablearith_block;/*禁止命名块禁止命名块*end/下面下面定义任务和函数定义任务和函数endmodule禁止命名块和任务禁止命名块和任务disable语句终结一个命名块或任务的所有活动。

也就是说,在一个语句终结一个命名块或任务的所有活动。

也就是说,在一个命名块或任务中的所有语句执行完之前就返回。

命名块或任务中的所有语句执行完之前就返回。

语法:

语法:

disable或或disable当当命命名名块块或或任任务务被被禁禁止止时时,所所有有因因他他们们调调度度的的事事件件将将从从事事件件队队列列中中清除清除disable是典型的不可综合语句。

是典型的不可综合语句。

在在前前面面的的例例子子中中,只只禁禁止止命命名名块块也也可可以以达达到到同同样样的的目目的的:

所所有有由由命命名块、任务及其中的函数调度的事件都被取消。

名块、任务及其中的函数调度的事件都被取消。

有限状态机有限状态机隐式状态机隐式状态机FSM不需要声明状态寄存器不需要声明状态寄存器仿真效率高仿真效率高只适合于线性的状态改变只适合于线性的状态改变大多数综合工具不能处理大多数综合工具不能处理显式显式FSM:

利于结构化利于结构化易于处理缺省条件易于处理缺省条件能处理复杂的状态改变能处理复杂的状态改变所有综合工具都支持所有综合工具都支持有限状态机有限状态机在在

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 教学研究 > 教学案例设计

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1