任務(wù)和函數(shù)有助于簡(jiǎn)化程序,有點(diǎn)類(lèi)似與Fortran語(yǔ)言的subroutine和function。
創(chuàng)新互聯(lián)建站是一家網(wǎng)站設(shè)計(jì)公司,集創(chuàng)意、互聯(lián)網(wǎng)應(yīng)用、軟件技術(shù)為一體的創(chuàng)意網(wǎng)站建設(shè)服務(wù)商,主營(yíng)產(chǎn)品:響應(yīng)式網(wǎng)站、品牌網(wǎng)站制作、成都全網(wǎng)營(yíng)銷(xiāo)。我們專(zhuān)注企業(yè)品牌在網(wǎng)站中的整體樹(shù)立,網(wǎng)絡(luò)互動(dòng)的體驗(yàn),以及在手機(jī)等移動(dòng)端的優(yōu)質(zhì)呈現(xiàn)。成都網(wǎng)站建設(shè)、成都網(wǎng)站制作、移動(dòng)互聯(lián)產(chǎn)品、網(wǎng)絡(luò)運(yùn)營(yíng)、VI設(shè)計(jì)、云產(chǎn)品.運(yùn)維為核心業(yè)務(wù)。為用戶(hù)提供一站式解決方案,我們深知市場(chǎng)的競(jìng)爭(zhēng)激烈,認(rèn)真對(duì)待每位客戶(hù),為客戶(hù)提供賞析悅目的作品,網(wǎng)站的價(jià)值服務(wù)。
任務(wù)和函數(shù)的共同點(diǎn):
1.任務(wù)和函數(shù)必須在模塊內(nèi)定義,其作用范圍僅適用于該模塊,可以在模塊內(nèi)多次調(diào)用。
2.任務(wù)和函數(shù)中可以聲明局部變量,如寄存器,時(shí)間,整數(shù),實(shí)數(shù)和事件,但是不能聲明線(xiàn)網(wǎng)類(lèi)型的變量。
3.任務(wù)和函數(shù)中只能使用行為級(jí)語(yǔ)句,但是不能包含always和initial塊,設(shè)計(jì)者可以在always和initial塊中調(diào)用任務(wù)和函數(shù)。
任務(wù)和函數(shù)的不同點(diǎn):
函數(shù) 任務(wù)
函數(shù)能調(diào)用另一個(gè)函數(shù),但是不能調(diào)用任務(wù) 任務(wù)可以調(diào)用另一個(gè)任務(wù),也可以調(diào)用函數(shù)
函數(shù)總是在仿真時(shí)刻0開(kāi)始 任務(wù)可以在非零時(shí)刻開(kāi)始執(zhí)行
函數(shù)一定不能包含任何延遲,事件或者時(shí)序控制聲明語(yǔ)句 任務(wù)可以包含延遲,事件或者時(shí)序控制聲明語(yǔ)句
函數(shù)至少要有一個(gè)輸入變量,也可以有多個(gè)輸入變量 任務(wù)可以沒(méi)有或者有多個(gè)輸入,輸出,輸入輸出變量
函數(shù)只能返回一個(gè)值,函數(shù)不能有輸出或者雙向變量 任務(wù)不返回任何值,或者返回多個(gè)輸出或雙向變量值
由上述的特點(diǎn)決定:函數(shù)用于替代純組合邏輯的verilog代碼,而任務(wù)可以代替verilog的任何代碼。
8.2任務(wù)
任務(wù)使用關(guān)鍵字task和endtask來(lái)進(jìn)行聲明,如果子程序滿(mǎn)足下面任何一個(gè)條件,則必須使用任務(wù)而不能使用函數(shù)。
1.子程序中包含有延遲,時(shí)序或者事件控制結(jié)構(gòu)
2.沒(méi)有輸出或者輸出變量超過(guò)一個(gè)
3.沒(méi)有輸入變量
例:
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=ab;
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
自動(dòng)(可重入)任務(wù):verilog任務(wù)中所有聲明的變量地址空間都是靜態(tài)分配的,因此如果在一個(gè)模塊中多次調(diào)用任務(wù)時(shí),可能會(huì)造成地址空間的沖突,為了避免這個(gè)問(wèn)題,verilog通過(guò)在task關(guān)鍵字后面添加automatic使任務(wù)稱(chēng)為可重入的,這時(shí)在調(diào)用任務(wù)時(shí),會(huì)自動(dòng)給任務(wù)聲明變量分配動(dòng)態(tài)地址空間,這樣有效避免了地址空間的沖突。
8.3 函數(shù)
函數(shù)使用關(guān)鍵字function和endfunction定義,對(duì)于子程序,如果滿(mǎn)足下述所有條件則可以用函數(shù)來(lái)完成:
1.在子程序中不含有延遲時(shí)序或者控制結(jié)構(gòu)
2.子程序只有一個(gè)返回值
3.至少有一個(gè)輸入變量
4.沒(méi)有輸出或者雙向變量
5.不含有非阻塞賦值語(yǔ)句
例:
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
跟任務(wù)調(diào)用一樣,在模塊中如果調(diào)用多次函數(shù),也會(huì)碰到地址沖突的問(wèn)題,因此也引入automatic關(guān)鍵字來(lái)對(duì)函數(shù)可重用性聲明。沒(méi)有進(jìn)行可重用性聲明的函數(shù)不可以多次或者遞歸調(diào)用,進(jìn)行了可重用性聲明的函數(shù)可以遞歸調(diào)用。
常量函數(shù)和帶符號(hào)函數(shù)(函數(shù)聲明時(shí)加signed關(guān)鍵字說(shuō)明)
module ram;
parameter RAM_DEPTH=256;
input [clogb2(RAM_DEPTH)-1:0] addr;//clogb2函數(shù)返回值為8
function integer clogb2(input integer depth);
begin
for(clogb2=0; depth0;clogb2=clogb2+1)
depth=depth1;
end
endfunction
endmodule
練習(xí):用兩種不同的方法設(shè)計(jì)一個(gè)功能相同的模塊,完成4個(gè)8位2進(jìn)制輸入數(shù)據(jù)的冒泡排序。第一種,用純組合邏輯實(shí)現(xiàn);第二種,假設(shè)8位數(shù)據(jù)按照時(shí)鐘節(jié)拍串行輸入,要求時(shí)鐘觸發(fā)任務(wù)的執(zhí)行,每個(gè)時(shí)鐘周期完成一次數(shù)據(jù)交換的操作。
//----------------- 第一種 ------------------
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(xy)
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(xy)
begin
tmp=x;
x=y;
y=tmp;
end
endtask
endmodule
C語(yǔ)言中一個(gè)函數(shù)(function)是一個(gè)可以從程序其它地方調(diào)用執(zhí)行的語(yǔ)句塊。
1、通過(guò)使用函數(shù)(functions)我們可以把我們的程序以更模塊化的形式組織起來(lái),從而利用C語(yǔ)言所支持的結(jié)構(gòu)化程序設(shè)計(jì)。
2、從數(shù)學(xué)角度,函數(shù)即集合A和集合B之間的映射關(guān)系。實(shí)際上計(jì)算機(jī)中的函數(shù)概念也是源于此,因此,一般函數(shù),都有形參和返回值。
3、從計(jì)算機(jī)組成原理的角度來(lái)看,函數(shù)即是一個(gè)小型的計(jì)算機(jī)系統(tǒng),依據(jù)馮諾伊曼的“存儲(chǔ)程序原理”,每一個(gè)計(jì)算機(jī)系統(tǒng)包含:輸入系統(tǒng)、輸出系統(tǒng)、運(yùn)算器以及控制器,實(shí)際上對(duì)于C語(yǔ)言中的函數(shù)來(lái)說(shuō),它是“存儲(chǔ)程序原理”的軟實(shí)現(xiàn),其中形參、實(shí)參這是輸入系統(tǒng),返回值是輸出系統(tǒng),函數(shù)體中的運(yùn)算符,比如+、-、*、/四則運(yùn)算即為運(yùn)算器,而邏輯運(yùn)算符以及if、while等控制語(yǔ)句便是一個(gè)控制器。
關(guān)鍵字通俗的說(shuō)就是命令。例如int關(guān)鍵字是定義int類(lèi)型變量的命令。 函數(shù)是封裝了一些代碼可以完成某項(xiàng)任務(wù)。例如printf()函數(shù),是封裝了輸出代碼,至于里邊有什么代碼不必知道,知道函數(shù)是干什么的就成。函數(shù)可以自定義,你也可以把自己常用的一段代碼封裝起來(lái),最為一個(gè)函數(shù),下次用就不用再寫(xiě)這段代碼了,直接調(diào)用函數(shù)就ok了。
C語(yǔ)言中函數(shù)和函數(shù)體的區(qū)別為:傳遞參數(shù)不同、返回值不同、調(diào)用不同。
一、傳遞參數(shù)不同
1、函數(shù):函數(shù)具有明確的入口傳遞參數(shù)。
2、函數(shù)體:函數(shù)體沒(méi)有明確的入口傳遞參數(shù),內(nèi)部進(jìn)行定義和說(shuō)明。
二、返回值不同
1、函數(shù):函數(shù)可以有返回值也可以設(shè)為void,不返回返回值。
2、函數(shù)體:函數(shù)體沒(méi)有返回值。
三、調(diào)用不同
1、函數(shù):由主函數(shù)調(diào)用其他函數(shù),其他函數(shù)也可以互相調(diào)用。同一個(gè)函數(shù)可以被一個(gè)或多個(gè)函數(shù)調(diào)用任意多次。
2、函數(shù)體:函數(shù)體可以調(diào)用一個(gè)或多個(gè)函數(shù),但函數(shù)體之間不能互相調(diào)用。
網(wǎng)站名稱(chēng):C語(yǔ)言函數(shù)和任務(wù)的區(qū)別 c語(yǔ)言函數(shù)和任務(wù)的區(qū)別和聯(lián)系
文章地址:http://jinyejixie.com/article34/ddojgse.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開(kāi)發(fā)、、服務(wù)器托管、網(wǎng)站設(shè)計(jì)、域名注冊(cè)、品牌網(wǎng)站設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)