模塊的調(diào)用(上層模塊對(duì)底層模塊的調(diào)用)
在做模塊劃分時(shí),通常會(huì)出現(xiàn)這種情形,某個(gè)大的模塊中包含了一個(gè)或多個(gè)功能子模塊,verilog是通過模塊調(diào)用或稱為模塊實(shí)例化的方式來實(shí)現(xiàn)這些子模塊與高層模塊的連接的
調(diào)用模塊實(shí)例化的一般形式為:
<模塊名><參數(shù)列表><實(shí)例名>(<端口列表>);
其中參數(shù)列表是傳遞到子模塊的參數(shù)值,參數(shù)傳遞的典型應(yīng)用是定義門級(jí)時(shí)延。
信號(hào)端口可以通過位置或名稱關(guān)聯(lián),但是關(guān)聯(lián)方式不能夠混合使用
名稱關(guān)聯(lián)&位置關(guān)聯(lián)
定義模塊:module Design(端口1,端口2,端口3...)
位置關(guān)聯(lián):
引用時(shí),嚴(yán)格按照模塊定義的端口順序來連接,不用標(biāo)明元模型定義時(shí)規(guī)定的端口名。
Designu1(u1的端口1,u1的端口2,u1的端口3)
名稱關(guān)聯(lián):
引用時(shí)用“.”符號(hào),標(biāo)明原模型定義時(shí)規(guī)定的端口名:
Designu2(.端口1(u1的端口1), .端口2(u1的端口2), .端口3(u1的端口3) )
eg:
moduleand(C,A,B)input A,B;output C; 位置相關(guān)andA1(T3,A,B)名稱相關(guān)andA2( .C(T3), .A(A), .B(B))
模塊的調(diào)用---參數(shù)傳遞
//子模塊moduleDecode(A,F); parameterwidth =1,polarity=1;endmodule//頂層模塊moudle top; wire[3:0] A4; wire[4:0] A5; wire[15:0] F16; wire[31:0] F32; Decode#(4,0) D1(A4,F16);endmodule
ps:在top模塊中引用Decode實(shí)例時(shí),可通過參數(shù)的傳遞來改變定義時(shí)已規(guī)定的參數(shù)值,即通過
#(4,0),實(shí)例D1實(shí)際引用的是參數(shù)width和polarity分別為4與0時(shí)的Decode模塊
傳遞參數(shù)的另一種方法
module_name#(.parametername(para_value),.parametername(para_value))inst_name(port_map) 實(shí)際就為: Decode#(.width(4),.polarity(0))D1(A4,F16)
注意事項(xiàng)
位選擇,如.C(D[0]),C端口接到了D信號(hào)的第0bit位;
部分選擇,如.Bus(Din[5:4])
上述類型的合并,如.Addr({A1,A2[1:0]})
懸空端口的處理:
在實(shí)例化中,可能有些管腳沒用到,可在映射中留白處理
DFF d1(.Q(QS),.Qbar(),.Data(D),.Preset(),//該管腳懸空.clock(CK); )
PS:輸入管腳懸空,該管腳輸入為高阻Z,輸出管腳懸空,該管腳廢棄不用
任務(wù)和函數(shù)
task和function語句分別用來由用戶定義任務(wù)和函數(shù);
任務(wù)和函數(shù)往往時(shí)大的程序模塊中在不同地點(diǎn)多次用到的相同的程序段
利用任務(wù)和函數(shù)可將一個(gè)很大的程序模塊分解為許多較小的任務(wù)和函數(shù),便于理解和調(diào)試
任務(wù)定義
task<任務(wù)名>; 端口及數(shù)據(jù)類型聲明語句; 其他語句;endtask
任務(wù)調(diào)用
<任務(wù)名>(端口1,端口2,......);
task語句
任務(wù)的定義與調(diào)用必須在一個(gè)module模塊內(nèi)
任務(wù)被調(diào)用時(shí),需列出端口名列表,且必須與任務(wù)定義中的I/0變量一一對(duì)應(yīng)
一個(gè)任務(wù)可以調(diào)用其他任務(wù)和函數(shù)
//任務(wù)定義task my_task; input a,b; inoutc;//一個(gè)三態(tài)門,由一個(gè)開關(guān)控制這個(gè)門是輸入還是輸出 output d,e; ...... <語句>//執(zhí)行任務(wù)工作相應(yīng)的語句 ..... c = foo1; d = foo2; e = foo3;//對(duì)任務(wù)變量進(jìn)行賦值endtask//任務(wù)調(diào)用my_task(v,w,x,y,z)//為位置關(guān)聯(lián),v對(duì)應(yīng)a,w對(duì)應(yīng)b,c對(duì)應(yīng)x,y對(duì)應(yīng)d,z對(duì)應(yīng)e
函數(shù)function(可以綜合)
函數(shù)的目的是通過返回一個(gè)用于某表達(dá)式的值,來響應(yīng)輸入信號(hào)(適于對(duì)不同變量采取同一運(yùn)算的操作)
函數(shù)在模塊內(nèi)部定義,通常在本模塊中調(diào)用,也能根據(jù)按模塊層次分級(jí)命名的函數(shù)名從其他模塊調(diào)用。而任務(wù)只能在同一模塊內(nèi)定義與調(diào)用
function<返回值位寬或類型說明>函數(shù)名;//如缺少位寬定義,則默認(rèn)為一 端口聲明; 局部變量定義; 其他語句;endfunction
函數(shù)的調(diào)用 <函數(shù)名>(<表達(dá)式><表達(dá)式>)
注:函數(shù)的調(diào)用是通過將函數(shù)作為調(diào)用函數(shù)的表達(dá)式中的操作數(shù)來實(shí)現(xiàn)的
函數(shù)規(guī)則
函數(shù)不能包含任何時(shí)間控制的語句,如#,@,wait,poesdge,negedege
函數(shù)不能調(diào)用任務(wù),因?yàn)槿蝿?wù)可以包含時(shí)間控制語句,但是可以調(diào)用其他函數(shù)
函數(shù)應(yīng)該至少有一個(gè)輸入
函數(shù)不能有非阻塞性的賦值或force....release或assign...deassign
函數(shù)不能有任何觸發(fā)器
函數(shù)不能有output或inout
函數(shù)的聲明:
function[7:0] sum; input[7:0] a, b; begin sum = a + b; endendfunctionfunction[7:0] sum (input[7:0] a, b); begin sum = a + b; endendfunction———————————————— 版權(quán)聲明:本文為CSDN博主「李銳博恩」的原創(chuàng)文章,遵循CC4.0BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。 原文鏈接:https://blog.csdn.net/Reborn_Lee/article/details/107447734
函數(shù)的調(diào)用:
reg [7:0]result; reg [7:0] a, b;initialbegin a=4; b=5; #10result=sum(a, b);end
利用一個(gè)函數(shù)對(duì)一個(gè)8位二進(jìn)制數(shù)中為0的位進(jìn)行計(jì)數(shù)
//count the numbers of 0 in rega[7:0]modulecount_0 (numbers,rega); output[7:0] numbers; input[7:0] rega; function[7:0] get_n_of_0;//define a function input[7:0] x; reg[7:0] count; integeri; begin count =0; for(i=0;i<=7;i++) ? ? ? ? ? ? ? ? ? ??if(x[i] ==?1'b0) ? ? ? ? ? ? ? ? ? ? ? ? ?count = count +1; ? ? ? ? ? ? ? ? ? ? get_n_of_0 = count;?//函數(shù)名就相當(dāng)于輸出變量;? ? ? ? ? ? ? ??end; ? ??endfunctionassign?number = get_n_of_0(rega);endmodule
ps:函數(shù)名就相當(dāng)于輸出變量
函數(shù)和任務(wù)
-
模塊
+關(guān)注
關(guān)注
7文章
2771瀏覽量
49076 -
Verilog
+關(guān)注
關(guān)注
28文章
1365瀏覽量
111506 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4365瀏覽量
63872
原文標(biāo)題:verilog---模塊的調(diào)用,任務(wù)和函數(shù)
文章出處:【微信號(hào):gh_9d70b445f494,微信公眾號(hào):FPGA設(shè)計(jì)論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
如何查看及更改函數(shù)/函數(shù)塊的調(diào)用環(huán)境

如何從任務(wù)內(nèi)部調(diào)用的函數(shù)調(diào)用osDelay?
verilog實(shí)現(xiàn)定時(shí)器函數(shù)
Linux內(nèi)核模塊間函數(shù)調(diào)用正確方法
探討VHDL和Verilog模塊互相調(diào)用的問題

Verilog HDL語言中任務(wù)與函數(shù)的比較
Verilog數(shù)字系統(tǒng)設(shè)計(jì)——任務(wù)和函數(shù)二(系統(tǒng)任務(wù)readmemb或readmemh)

Verilog設(shè)計(jì)中函數(shù)和任務(wù)的作用分析
RTL建模中的函數(shù)和任務(wù)討論
Verilog任務(wù)與函數(shù)的區(qū)別

FreeRTOS任務(wù)通知通用發(fā)送函數(shù)

評(píng)論