verilog语言中任务和函数的区别

如题所述

任务和函数有助于简化程序,有点类似与Fortran语言的subroutine和function。

任务和函数的共同点:

1.任务和函数必须在模块内定义,其作用范围仅适用于该模块,可以在模块内多次调用。

2.任务和函数中可以声明局部变量,如寄存器,时间,整数,实数和事件,但是不能声明线网类型的变量。

3.任务和函数中只能使用行为级语句,但是不能包含always和initial块,设计者可以在always和initial块中调用任务和函数。

任务和函数的不同点:
函数 任务
函数能调用另一个函数,但是不能调用任务 任务可以调用另一个任务,也可以调用函数
函数总是在仿真时刻0开始 任务可以在非零时刻开始执行
函数一定不能包含任何延迟,事件或者时序控制声明语句 任务可以包含延迟,事件或者时序控制声明语句
函数至少要有一个输入变量,也可以有多个输入变量 任务可以没有或者有多个输入,输出,输入输出变量
函数只能返回一个值,函数不能有输出或者双向变量 任务不返回任何值,或者返回多个输出或双向变量值

由上述的特点决定:函数用于替代纯组合逻辑的verilog代码,而任务可以代替verilog的任何代码。

8.2任务

任务使用关键字task和endtask来进行声明,如果子程序满足下面任何一个条件,则必须使用任务而不能使用函数。

1.子程序中包含有延迟,时序或者事件控制结构

2.没有输出或者输出变量超过一个

3.没有输入变量

例:

module operation;
parameter delay=10;
reg [15:0] A,B, AB_AND,AB_OR,AB_XOR;
always @(A or B)
begin
bitwise_ope(AB_AND,AB_OR,AB_XOR,A,B);
end
task bitwise_oper;
output [15:0] ab_and,ab_or,ab_xor;
input [15:0] a,b;
begin
#delay ab_and=a&b;
ab_or=a|b;
ab_xor=a^b;
end
endtask
always @(posedge clk)
bitwise_xor(ef_xor,e,f);
always @(posedege clk2)
bitwise_xor(cd_xor,c,d)
task autumatic bitwise_xor;
output ab_xor;
input a,b;
begin
ab_xor=a^b;
end
endtask
endmodule

自动(可重入)任务:verilog任务中所有声明的变量地址空间都是静态分配的,因此如果在一个模块中多次调用任务时,可能会造成地址空间的冲突,为了避免这个问题,verilog通过在task关键字后面添加automatic使任务称为可重入的,这时在调用任务时,会自动给任务声明变量分配动态地址空间,这样有效避免了地址空间的冲突。

8.3 函数

函数使用关键字function和endfunction定义,对于子程序,如果满足下述所有条件则可以用函数来完成:

1.在子程序中不含有延迟时序或者控制结构
2.子程序只有一个返回值
3.至少有一个输入变量
4.没有输出或者双向变量
5.不含有非阻塞赋值语句

例:

module parity;
reg [31:0] addr;
reg parity;
always @(addr)
begin
parity=calc_parity(addr);
end
function calc_parity;
input [31:0] addr;
begin
calc_parity=^addr;
end
endfunction
endmodule

跟任务调用一样,在模块中如果调用多次函数,也会碰到地址冲突的问题,因此也引入automatic关键字来对函数可重用性声明。没有进行可重用性声明的函数不可以多次或者递归调用,进行了可重用性声明的函数可以递归调用。

常量函数和带符号函数(函数声明时加signed关键字说明)

module ram;
parameter RAM_DEPTH=256;
input [clogb2(RAM_DEPTH)-1:0] addr;//clogb2函数返回值为8
function integer clogb2(input integer depth);
begin
for(clogb2=0; depth>0;clogb2=clogb2+1)
depth=depth>1;
end
endfunction
endmodule

练习:用两种不同的方法设计一个功能相同的模块,完成4个8位2进制输入数据的冒泡排序。第一种,用纯组合逻辑实现;第二种,假设8位数据按照时钟节拍串行输入,要求时钟触发任务的执行,每个时钟周期完成一次数据交换的操作。

//----------------- 第一种 ------------------

module sort4(ra,rb,rc,rd,a,b,c,d);

output[7:0] ra,rb,rc,rd;

input[7:0] a,b,c,d;

reg[7:0] ra,rb,rc,rd;

reg[7:0] va,vb,vc,vd;

always @ (a or b or c or d)

begin

{va,vb,vc,vd}={a,b,c,d};

change(va,vb);

change(vb,vc);

change(vc,vd);

change(va,vb);

change(vb,vc);

change(va,vb);

{ra,rb,rc,rd}={va,vb,vc,vd};

end

task change; //make a task of comparing

inout[7:0] x,y;

reg[7:0] tmp;

if(x>y)

begin

tmp=x;

x=y;

y=tmp;

end

endtask

endmodule

//----------------- 第二种 ------------------

module sort4(clk,reset,ra,rb,rc,rd,a);

output[7:0] ra,rb,rc,rd;

input[7:0] a;

input clk,reset;

reg[7:0] ra,rb,rc,rd;

reg[7:0] va,vb,vc,vd;

always @ (posedge clk)

begin

if(!reset)

begin

va<=0;vb<=0;vc<=0;vd<=0;

end

else

va<=a;

end

always @ (posedge clk)

begin

change(va,vb);

change(vb,vc);

change(vc,vd);

change(va,vb);

change(vb,vc);

change(va,vb);

{ra,rb,rc,rd}={va,vb,vc,vd};

end

task change; //make a task of comparing

inout[7:0] x,y;

reg[7:0] tmp;

if(x>y)

begin

tmp=x;

x=y;

y=tmp;

end

endtask

endmodule
温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2018-02-27
任务可以有input、output和inout,数量不限,函数只有input参数,且至少有一个input;
任务可以包含有时序控制(如延时等),函数不能包含有任何延迟,仿真时间为0;
任务可以用disable中断,函数不允许disable、wait语句;
任务可以通过I/O端口实现值传递,函数名即输出变量名,通过函数返回值;
任务可以调用其他任务和函数,函数只能调用其他函数,不能调用任务;
任务可以定义自己的仿真时间单位,函数只能与主模块共用一个仿真时间单位;
函数通过一个返回一个值来响应输入信号的值,任务却能支持多种目的,能计算多个结果值,结果值只能通过被调用的任务的输出端口输出或总线端口送出;
另外在函数中不能有wire型变量.

任务定义语法:
task <任务名>;
<端口及数据类型声明语句>
<语句1>......
endtask

函数定义的语法:
function <返回值类型或范围>(函数名)
<端口说明语句>
<变量类型说明语句>
begin
<语句>......
end
endfunction
从百度搜,有很多相关介绍本回答被网友采纳
第2个回答  推荐于2017-11-24
分呢? 哈哈!书本p114本回答被提问者采纳

verilog语言中任务和函数的区别
任务和函数的不同点:函数 任务 函数能调用另一个函数,但是不能调用任务 任务可以调用另一个任务,也可以调用函数 函数总是在仿真时刻0开始 任务可以在非零时刻开始执行 函数一定不能包含任何延迟,事件或者时序控制声明语句 任务可以包含延迟,事件或者时序控制声明语句 函数至少要有一个输入...

Verilog语法之十一:任务(task)和函数(function)
在Verilog设计中,任务(task)和函数(function)是两种重要的编程工具,它们有助于模块化复杂程序,便于理解和调试。任务和函数的主要区别在于,函数通过返回值响应输入,用于计算单一结果;而任务支持多重目的,可以产生多个输出,通常在模块的多个位置被重复调用。任务的使用更为灵活,它可以立即启动,或者在满...

verilog中task和function的区别是什么?
verilog中task和function的区别:module: 电路;sub-program (task, function): 电路的测试程序(test bench)module是物理电路,function只是草稿纸,task是验证用途的。完全没有任何联系。function里实现的功能,必须是电路开始工作之前就能执行运算的功能,task不能写在实际电路中。任务(task)任务就是封装在...

verilog中常见系统函数和任务
在Verilog中,两个常见系统函数和任务用于输出信息:$display和$write。它们的格式分别为:display函数自动换行,$write则不换行,适合在同一行输出多个信息。display和$write的输出格式控制通过双引号括起来的字符串表示,包含普通字符和特殊转换序列。输出数据的显示宽度自动调整,显示数据时,总是用表达式的最...

verilog中task与function语句的使用
任务和函数在Verilog中用于聚合重复使用的语句结构,类似于C语言的子程序,能简化程序结构。它们分别由关键字task和function定义。任务定义遵循如下格式,包含任务名、端口及数据类型声明、以及完成任务操作的过程语句。过程语句是顺序执行的,不能包含always或initial引导的结构,只能描述组合电路。任务调用时,需...

Verilog语法之十二:系统函数和任务
Verilog HDL语言中包含多个系统函数和任务,如$bitstoreal、$rtoi、$display、$setup、$finish、$skew、$hold、$setuphold、$itor、$strobe、$period、$time、$printtimescale、$realtime、$width、$real tobits、$write、$recovery等。这些系统函数和任务为开发提供了强大的功能。文章重点介绍了$display...

Verilog语言中$是什么意思,自己写的任务或者函数前面可不可以加$?_百 ...
这种特殊的表示方式表示的任务和函数称为"系统任务"或"系统函数"。顾名思义,"系统任务"或"系统函数"是由系统所给定的(相当于verilog帮你写的一个函数),用户没法去修改,只能够调用。用户自己写的函数或任务不能加$,以便与系统任务和系统函数区分开。常见的系统函数有$display,$write等。

verilog define、task和function使用
接着,function的使用规则需要特别注意。函数定义时,不得包含时间控制语句或启动任务。它至少需要一个输入参数,并在定义中给内部变量赋值,该变量与函数名相同,用于存储函数结果。通过这些规则,function成为处理复杂逻辑和数据操作的强大工具。举例说明:函数`add`定义如下:verilog function integer add;inpu...

Verilog常用语法简介
逻辑功能部分是模块的核心,通过过程语句、块语句、赋值语句(持续和过程),以及条件语句(casez和casex)来描述。循环语句、任务与函数则有助于模块分解和调试。学习Verilog,参考书籍如《数字系统设计与Verilog HDL》(王金明编著)和在线教程如菜鸟教程的Verilog教程都是很好的资源。

verilog重点解析(13题)
任务与函数在Verilog中都是实现复用代码的手段,帮助代码清晰、易于维护。本质差异主要在于任务与函数的具体使用场景与特性。静态任务与动态任务在变量分配上的区别在于,动态任务在每次调用时自动分配内存,而静态任务使用隐式静态分配,变量值在任务间共享。覆盖自动任务中变量的方法主要通过定义变量为静态(...

相似回答