问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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

发布网友 发布时间:2022-04-30 16:04

我来回答

3个回答

热心网友 时间:2022-06-27 00:57

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

任务和函数的共同点:

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

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

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

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

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

8.2任务

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

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

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

3.没有输入变量

例:

mole 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
endmole

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

8.3 函数

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

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

例:

mole 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
endmole

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

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

mole 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
endmole

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

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

mole 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

endmole

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

mole 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

endmole

热心网友 时间:2022-06-27 00:57

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

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

函数定义的语法:
function <返回值类型或范围>(函数名)
<端口说明语句>
<变量类型说明语句>
begin
<语句>......
end
endfunction
从百度搜,有很多相关介绍

热心网友 时间:2022-06-27 00:57

分呢? 哈哈!书本p114
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
怎样移动手机应用的位置 不戴安全套但没有射精会怀孕吗 青岛哪所学校空乘专业就业率高 属牛的是什么星座1985年 m.xzw.com m.xingzuo360.cn 敏卡·凯利基本信息 想问一下eve用什么船刷古斯塔斯怪比较好?如果能有配置图就更好了... EVE加达里恐惧古斯塔斯小型控制塔一个月要多少燃料块 eve古斯塔斯据点需要打建筑么? 对煮饭手艺好的 应该用什么词语修饰 去哪里搜上海中小学教师招聘信息呢,怎么找都找不到呀,大家来帮帮忙吧... 实况足球中CB,SB,LB,RB,AMF,SMF,CMF,RMF,LMF,CF,WF,SS分别是什么位置 基础的础是什么 重玩任务按RB键会怎样? 础这个字念什么 噬神者2rb高难度15级单挑强化汉尼拔任务怎么过 础怎么读音是什么 求视频:gta4中rb第一个任务如何逼问那个人 哥们,侠盗猎车4的那个Rb任务,Ray给我一个消息叫我干什么,他地图没提示,我也不懂,问你下,你知道怎... GTA4里RB点的任务。一开始出现一句英文就什么也没有了。没有目标。没有任务。谢谢大家 GTA4那个Rb点任务怎么过,全是英语看不懂。 gta4 pc版 RB任务怎么过 侠盗飞车4自由城之章中rb任务怎么过 做鸡蛋汉堡怎么翻面不碎 GTA 4 RB任务怎么做 夹鸡蛋汉堡的面糊怎么调 鸡蛋汉堡的配方和制作方法 小学生写我美丽的家乡可以写什么 有什么&#xF44D;天猫&#xF337;精灵价格比较好,功能又适合幼儿园孩子吗?&#xF341;_百度... 中式鸡蛋汉堡面糊怎调 一二年级小学生美丽的家乡的作文吗 基础中础的读音是什么 础 这个字念什么 华为手机斑马如何投电视机 莱默尔是如何征服RB莱比锡的? 磁盘阵列技术 础的部首,再查几画,什么结构 刑,础的拼音 磁盘阵列内的硬盘是否有顺序要求 基础的础的近义字是什么 磁盘阵列是什么啊 我有一张承兑汇票要去银行办理承兑,怎么写申请承兑申请报告 那位可以把阵列的顺序和技巧告诉我(环行,矩形) 小米6x的数据线可以给OPPO a11充吗? 础的近义字是什么 我的小米充电头是2A 的,然后我买了一条OPPO 2A的充电线,能一起用吗? 承兑汇票掉了,要写申请书,请问申请书怎么写啊? OPPO数据线能给小米蓝牙耳机充电吗 础字五笔怎么打字 oracle数据库中有关磁盘阵列的知识 础和拙怎么组词