版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第5章行為描述(一):模塊基本結(jié)構(gòu)5.1行為描述的結(jié)構(gòu)5.2語(yǔ)句塊5.1行為描述的結(jié)構(gòu)模塊采用行為描述方式時(shí)的基本語(yǔ)法格式如下:module
<模塊名>(<端口列表>)模塊端口說(shuō)明參數(shù)定義(可選)數(shù)據(jù)類(lèi)型說(shuō)明過(guò)程塊(initial過(guò)程塊或always過(guò)程塊,可有一個(gè)或多個(gè))連續(xù)賦值語(yǔ)句;任務(wù)定義(task)(可選)函數(shù)定義(function)(可選)endmodule其中:端口列表中可以有單個(gè)或多個(gè)輸入、輸出或雙向端口;這些端口類(lèi)型要在“模塊端口說(shuō)明”部分進(jìn)行類(lèi)型說(shuō)明。參數(shù)定義用關(guān)鍵詞parameter實(shí)現(xiàn),如果模塊定義了參數(shù),那么該模塊的每個(gè)實(shí)例可以對(duì)該參數(shù)進(jìn)行重新定義,使得該參數(shù)值對(duì)每一個(gè)具體實(shí)例是惟一的。數(shù)據(jù)類(lèi)型說(shuō)明用來(lái)對(duì)模塊中用到的各類(lèi)變量類(lèi)型進(jìn)行說(shuō)明,如果某個(gè)變量沒(méi)有進(jìn)行數(shù)據(jù)類(lèi)型說(shuō)明,則它的類(lèi)型缺省為連線(xiàn)類(lèi)型(wire)。過(guò)程塊是由過(guò)程語(yǔ)句initial或always開(kāi)頭的一個(gè)語(yǔ)句塊,根據(jù)這兩個(gè)不同的關(guān)鍵詞,過(guò)程塊可以被分為“initial過(guò)程塊”和“always過(guò)程塊”兩種類(lèi)型。過(guò)程塊中包含一條或多條行為語(yǔ)句,過(guò)程塊是行為描述的主要組成部分。連續(xù)賦值語(yǔ)句是由關(guān)鍵詞assign來(lái)標(biāo)識(shí)的一種賦值語(yǔ)句,它只能對(duì)連線(xiàn)型類(lèi)型(net類(lèi)型)變量進(jìn)行驅(qū)動(dòng),它和語(yǔ)句塊一樣也是一種行為描述語(yǔ)句。在下一章討論過(guò)程賦值語(yǔ)句時(shí)我們將對(duì)連續(xù)賦值語(yǔ)句一并進(jìn)行討論。任務(wù)定義和函數(shù)定義部分都是可選的,它們引入的目的是為了描述模塊中被多次執(zhí)行的部分以及為了增強(qiáng)代碼的易讀性。上面列出的各個(gè)模塊組成項(xiàng)可以以任意次序出現(xiàn),但是端口說(shuō)明和數(shù)據(jù)類(lèi)型說(shuō)明必須出現(xiàn)在這些端口和數(shù)據(jù)被引用之前。與第2章中描述的模塊的一般格式定義相比,我們可以看出:在進(jìn)行行為描述時(shí),模塊內(nèi)不能出現(xiàn)模塊實(shí)例和原語(yǔ)實(shí)例語(yǔ)句(包括用戶(hù)自定義原語(yǔ)實(shí)例),模塊內(nèi)只能存在過(guò)程塊(initial過(guò)程塊和always過(guò)程塊)、連續(xù)賦值語(yǔ)句、任務(wù)定義(task)和函數(shù)定義(function)這四種結(jié)構(gòu)成分。對(duì)電路進(jìn)行行為描述主要是通過(guò)過(guò)程塊和連續(xù)賦值語(yǔ)句來(lái)進(jìn)行的,任務(wù)和函數(shù)的使用也需要在過(guò)程塊或連續(xù)賦值語(yǔ)句中進(jìn)行調(diào)用。本章以及第6、7章將對(duì)這幾種結(jié)構(gòu)成分進(jìn)行介紹。一個(gè)行為描述模塊中可以同時(shí)包含多個(gè)過(guò)程塊和多個(gè)連續(xù)賦值語(yǔ)句,這些組成成分將以并行方式各自獨(dú)立地執(zhí)行;行為描述模塊也可以只包含過(guò)程塊或者只包含連續(xù)賦值語(yǔ)句。5.1.1過(guò)程塊每個(gè)過(guò)程塊是由“過(guò)程語(yǔ)句(initial或always)”和語(yǔ)句塊所組成的,而語(yǔ)句塊主要是由過(guò)程性賦值語(yǔ)句(包括“過(guò)程賦值語(yǔ)句”和“過(guò)程連續(xù)賦值語(yǔ)句”)和高級(jí)程序語(yǔ)句(包括“條件分支語(yǔ)句”和“循環(huán)控制語(yǔ)句”)這兩種行為語(yǔ)句構(gòu)成的。過(guò)程塊具有如下特點(diǎn):
(1)在行為描述模塊中出現(xiàn)的每個(gè)過(guò)程塊(always過(guò)程塊或initial過(guò)程塊)都代表一個(gè)獨(dú)立的進(jìn)程。
(2)在進(jìn)行仿真時(shí),所有initial過(guò)程塊和always過(guò)程塊的執(zhí)行都是從0時(shí)刻開(kāi)始并行地進(jìn)行的。
(3)每一個(gè)過(guò)程塊內(nèi)部的多條語(yǔ)句的執(zhí)行方式可以是順序執(zhí)行的(當(dāng)塊定義語(yǔ)句為begin-end時(shí)的情況),也可以是并行執(zhí)行的(塊定義語(yǔ)句為fork-join時(shí)的情況)。
(4)?always過(guò)程塊和initial過(guò)程塊都是不能嵌套使用的。比如下例5-1就是錯(cuò)誤的。
【例5-1】錯(cuò)例:嵌套的過(guò)程塊。modulenested_procedural_block(a,b,c);inputa,b;outputc;reg
a,b,c;initial//initial過(guò)程塊1beginc=a;initial//嵌套在initial過(guò)程塊1內(nèi)部的initial過(guò)程塊2beginc=b;endendendmodule5.1.2intial過(guò)程塊
initial過(guò)程塊是由過(guò)程語(yǔ)句“initial”和語(yǔ)句塊組成的,它的格式為:initial語(yǔ)句塊而“語(yǔ)句塊”的格式為:<塊定義語(yǔ)句1>:<塊名>塊內(nèi)局部變量說(shuō)明;時(shí)間控制1行為語(yǔ)句1;……時(shí)間控制n
行為語(yǔ)句n;<塊定義語(yǔ)句2>在如上所示的格式中:
(1)過(guò)程語(yǔ)句關(guān)鍵詞initial表明了該過(guò)程塊是一個(gè)“initial過(guò)程塊”。
(2)<?jí)K定義語(yǔ)句1>和<?jí)K定義語(yǔ)句2>構(gòu)成了一組塊定義語(yǔ)句,它們可以是“begin,end”語(yǔ)句組或“fork,join”語(yǔ)句組。這兩條塊定義語(yǔ)句將它們之間的多條行為語(yǔ)句組合在一起,使之構(gòu)成一個(gè)語(yǔ)句塊,并使其在格式上更像一條語(yǔ)句。當(dāng)語(yǔ)句塊中只包含一條行為語(yǔ)句并且不需要定義塊名和塊內(nèi)局部變量時(shí),這兩條塊定義語(yǔ)句可以缺省。
(3)<塊名>為可選項(xiàng),塊名可以為語(yǔ)句塊創(chuàng)建一個(gè)局部作用域。定義了塊名的過(guò)程塊稱(chēng)為“有名塊”,在有名塊中可以定義局部變量,有名塊內(nèi)部語(yǔ)句的執(zhí)行可以被disable語(yǔ)句中斷。
(4)塊內(nèi)局部變量說(shuō)明也是可選項(xiàng),只有在有名塊中才能定義局部變量,并且塊內(nèi)局部變量只能是寄存器類(lèi)數(shù)據(jù)類(lèi)型。
(5)時(shí)間控制用來(lái)對(duì)過(guò)程塊內(nèi)各條語(yǔ)句的執(zhí)行時(shí)間進(jìn)行控制。它可以是任何一種時(shí)間控制方式。關(guān)于時(shí)間控制我們將在第6章進(jìn)行詳細(xì)討論。
(6)行為語(yǔ)句可以是如下語(yǔ)句中的一種:
?過(guò)程賦值語(yǔ)句(阻塞型或非阻塞型過(guò)程賦值語(yǔ)句)。
?過(guò)程連續(xù)賦值語(yǔ)句(assign/deassign或force/release語(yǔ)句組)。
if條件分支語(yǔ)句。
case條件分支語(yǔ)句。
?循環(huán)控制語(yǔ)句(forever,repeat,while,for循環(huán)控制語(yǔ)句)。
wait等待語(yǔ)句。
disable中斷語(yǔ)句。
?事件觸發(fā)語(yǔ)句(event_trigger)。
?任務(wù)調(diào)用語(yǔ)句(用戶(hù)自定義的任務(wù)或系統(tǒng)任務(wù))我們可以將上面的這些行為語(yǔ)句分成三類(lèi):過(guò)程性賦值語(yǔ)句、高級(jí)程序語(yǔ)句和時(shí)間控制語(yǔ)句。其中過(guò)程性賦值語(yǔ)句和高級(jí)程序語(yǔ)句是過(guò)程塊的基本組成部分。要注意上面列出的行為語(yǔ)句只能對(duì)寄存器類(lèi)數(shù)據(jù)變量進(jìn)行賦值(除force/release過(guò)程連續(xù)賦值語(yǔ)句以外)。在進(jìn)行仿真時(shí),一個(gè)initial過(guò)程塊從模擬0時(shí)刻開(kāi)始執(zhí)行,它在仿真過(guò)程中只執(zhí)行一次,在執(zhí)行完一次后該initial過(guò)程塊就被掛起,不再執(zhí)行。如果一個(gè)模塊中存在多個(gè)initial過(guò)程塊,則每個(gè)initial過(guò)程塊都是同時(shí)從0時(shí)刻開(kāi)始并行執(zhí)行的。initial過(guò)程塊內(nèi)的多條行為語(yǔ)句可以是順序執(zhí)行(語(yǔ)句塊是begin-end串行塊時(shí))的,也可以是并行執(zhí)行(語(yǔ)句塊是fork-join并行塊時(shí))的。
initial過(guò)程塊的使用主要是面向功能模擬的,它通常不具有可綜合性。initial過(guò)程塊通常用來(lái)描述測(cè)試模塊的初始化、監(jiān)視、波形生成等功能行為;而在對(duì)硬件功能模塊的行為描述中,initial過(guò)程塊常常用來(lái)對(duì)只需執(zhí)行一次的進(jìn)程進(jìn)行描述,例如它可以用來(lái)為寄存器變量賦初值。
【例5-2】initial過(guò)程塊用于對(duì)變量和存儲(chǔ)器進(jìn)行初始化。moduleregister_initialize(memory);inout
areg;inoutmemory;parameterSIZE=1024;parameterBYTESIZE=8;reg[BYTESIZE-1:0]memory[SIZE-1:0];initial//initial過(guò)程語(yǔ)句begin:SEQ_BLK_A//塊定義語(yǔ)句,SEQ_BLK_A為塊名integer:index
;//計(jì)數(shù)變量,為塊中的一個(gè)局部變量for(index=0;index<SIZE;index=index+1)memory[index]=0;//對(duì)存儲(chǔ)器memory進(jìn)行初始化areg=0;//對(duì)寄存器areg進(jìn)行初始化end//塊結(jié)束標(biāo)志endmodule這個(gè)例子的作用是用initial語(yǔ)句在仿真的開(kāi)始時(shí)刻對(duì)寄存器變量和存儲(chǔ)器進(jìn)行賦零值操作,從而實(shí)現(xiàn)各個(gè)變量的初始化。例5-2中的串行塊被定義了一個(gè)塊名“SEQ_BLK_A”,這是由于為了循環(huán)計(jì)數(shù)需要定義局部變量index,而只有當(dāng)串行語(yǔ)句塊為有名塊時(shí)才能在塊中定義局部變量,所以上例中的塊名定義不能缺省。initial過(guò)程塊中包含了一個(gè)begin-end串行語(yǔ)句塊。所以對(duì)存儲(chǔ)器的賦值操作將先于對(duì)寄存器的賦值操作進(jìn)行。這個(gè)initial過(guò)程塊在0ns時(shí)開(kāi)始執(zhí)行,并且由于串行塊中for循環(huán)控制語(yǔ)句和過(guò)程賦值語(yǔ)句都沒(méi)有指定時(shí)延,所以對(duì)存儲(chǔ)器和寄存器的賦值操作都是在0時(shí)刻開(kāi)始和完成的。在完成對(duì)寄存器的賦值操作后,initial過(guò)程塊中所有的語(yǔ)句都已執(zhí)行完畢,所以initial過(guò)程塊將結(jié)束執(zhí)行,并且將被永遠(yuǎn)掛起不再重新執(zhí)行。
【例5-3】initial過(guò)程塊用于為電路仿真生成激勵(lì)波形。initialbegininputs=‘b000000; //初始時(shí)刻為0#10inputs=‘b011001; //10個(gè)時(shí)間單位后取值改變#20inputs=‘b011011; //20個(gè)時(shí)間單位后取值改變#5inputs=‘b011000; //5個(gè)時(shí)間單位后取值改變#10inputs=‘b001000; //20個(gè)時(shí)間單位后取值改變end在例5-3中,我們用initial過(guò)程塊來(lái)生成特定的電路仿真激勵(lì)信號(hào),和例5-2中的情況一樣,initial語(yǔ)句包含了一個(gè)串行塊。但是在此例中begin-end串行塊內(nèi)的語(yǔ)句是帶有時(shí)延的,假定initial語(yǔ)句從t=0時(shí)刻開(kāi)始執(zhí)行,那么首先執(zhí)行第一條賦值語(yǔ)句,在t=0時(shí)刻input的值變?yōu)?b000000;由于第二條賦值語(yǔ)句帶有延時(shí)控制,所以第二條語(yǔ)句的執(zhí)行是在第一條語(yǔ)句執(zhí)行結(jié)束10個(gè)單位時(shí)間后(即在t=10時(shí)刻)開(kāi)始的,在t=10時(shí)刻input的值變?yōu)?b011001;然后再等待20個(gè)單位時(shí)間后開(kāi)始第三條賦值語(yǔ)句的執(zhí)行,依次類(lèi)推可以知道input取值的變化情況將如表5.1所示。當(dāng)?shù)谖鍡l賦值語(yǔ)句執(zhí)行完畢后(t=45時(shí)刻),initial過(guò)程塊中所有語(yǔ)句已全部執(zhí)行完,仿真進(jìn)程跳出initial過(guò)程塊,initial語(yǔ)句被永遠(yuǎn)掛起。5.1.3always過(guò)程塊
always過(guò)程塊是由“always”過(guò)程語(yǔ)句和語(yǔ)句塊組成的,它的格式為:always@(敏感事件列表)語(yǔ)句塊其中“語(yǔ)句塊”的格式為:<塊定義語(yǔ)句1>:<塊名>塊內(nèi)局部變量說(shuō)明;時(shí)間控制1行為語(yǔ)句1;……時(shí)間控制n
行為語(yǔ)句n;<塊定義語(yǔ)句2>
(1)關(guān)鍵詞always表明了該過(guò)程塊是一個(gè)“always過(guò)程塊”。
(2)?@(敏感事件列表)是可選項(xiàng),帶有敏感事件列表的語(yǔ)句塊被稱(chēng)為“由事件控制的語(yǔ)句塊”,它的執(zhí)行要受敏感事件的控制。(敏感事件列表)的形式為:(event-expression[orevent-expression*])敏感事件列表是由一個(gè)或多個(gè)事件表達(dá)式(event-expression)構(gòu)成的,當(dāng)存在多個(gè)事件表達(dá)式時(shí)要用or將它們組合起來(lái)。or用來(lái)說(shuō)明:只要發(fā)生了敏感事件列表所列出的多個(gè)事件中的任何一個(gè),就將啟動(dòng)后面語(yǔ)句塊的執(zhí)行。敏感事件列表實(shí)際上代表了一個(gè)事件控制類(lèi)型的時(shí)間控制。我們將在第6章進(jìn)一步討論時(shí)間控制、事件控制和敏感事件列表。
(3)?always過(guò)程塊中關(guān)于<塊定義語(yǔ)句>的規(guī)定和initial過(guò)程塊中的情況一樣,它們可以是“begin-end”語(yǔ)句組或“fork-join”語(yǔ)句組,由這兩組語(yǔ)句組組合成的語(yǔ)句塊分別稱(chēng)為串行塊和并行塊。當(dāng)過(guò)程塊中只包含一條語(yǔ)句且不需定義塊名與塊內(nèi)局部變量時(shí),塊定義語(yǔ)句可以缺省。
(4)?<塊名>為可選項(xiàng),對(duì)它的規(guī)定與initial過(guò)程塊中的情況一樣。定義了塊名的過(guò)程塊稱(chēng)為有名塊。
(5)塊內(nèi)局部變量是可選項(xiàng),對(duì)它的規(guī)定與initial過(guò)程塊中的情況一樣。只有在有名塊中才能定義局部變量,塊內(nèi)局部變量只能是寄存器類(lèi)數(shù)據(jù)類(lèi)型;
(6)時(shí)間控制用來(lái)對(duì)過(guò)程塊內(nèi)各條語(yǔ)句的執(zhí)行時(shí)間進(jìn)行控制。其作用與initial過(guò)程塊中的“時(shí)間控制”部分的作用是相同的。
(7)對(duì)“行為語(yǔ)句”的規(guī)定與上一小節(jié)中initial過(guò)程塊中的情況相同。從上面的格式定義可以看出,always過(guò)程塊和initial過(guò)程塊在格式上的區(qū)別主要在于:always過(guò)程語(yǔ)句后面可以有一個(gè)敏感事件列表,該敏感事件列表的作用是用來(lái)激活always過(guò)程語(yǔ)句的執(zhí)行,而initial過(guò)程語(yǔ)句的后面則不允許有敏感事件列表。在進(jìn)行仿真時(shí),和initial過(guò)程塊一樣,always過(guò)程塊是從模擬0時(shí)刻開(kāi)始執(zhí)行的。但是always語(yǔ)句在仿真過(guò)程中是不斷重復(fù)執(zhí)行的,而不像initial過(guò)程塊中的語(yǔ)句那樣在執(zhí)行一次后就被掛起,不會(huì)再次被執(zhí)行。并且always過(guò)程塊內(nèi)各條語(yǔ)句的真正執(zhí)行必須由敏感事件列表中列出的事件進(jìn)行觸發(fā)才能啟動(dòng)。如果always過(guò)程塊中的敏感事件列表缺省,則認(rèn)為觸發(fā)條件始終被滿(mǎn)足,always過(guò)程塊將無(wú)條件地循環(huán)執(zhí)行下去,直到遇到$finish或$stop系統(tǒng)任務(wù)為止。敏感事件列表由一個(gè)或多個(gè)“事件表達(dá)式(event-expression)”構(gòu)成,事件表達(dá)式說(shuō)明了啟動(dòng)塊內(nèi)語(yǔ)句執(zhí)行時(shí)的觸發(fā)條件。當(dāng)存在多個(gè)事件表達(dá)式時(shí)要用關(guān)鍵詞or將多個(gè)觸發(fā)條件組合起來(lái)。Verilog規(guī)定:只要這些事件表達(dá)式所代表的多個(gè)觸發(fā)條件中有一個(gè)成立,就啟動(dòng)塊內(nèi)語(yǔ)句的執(zhí)行。例如,在語(yǔ)句:always@(aorborc);begin……end中,always過(guò)程塊的多個(gè)事件表達(dá)式分別是信號(hào)a,b和c,它們代表的觸發(fā)條件分別是信號(hào)a,b,c發(fā)生變化,這三個(gè)事件表達(dá)式之間以關(guān)鍵詞or分隔,這時(shí)只要其中一個(gè)觸發(fā)條件被滿(mǎn)足,也就是只要信號(hào)a,b,c中有一個(gè)的值發(fā)生變化,begin-end語(yǔ)句塊的執(zhí)行就被觸發(fā)。而如果信號(hào)a,b,c的值都沒(méi)有發(fā)生變化,則任何一個(gè)觸發(fā)條件都沒(méi)有被滿(mǎn)足,begin-end語(yǔ)句塊中的語(yǔ)句不被執(zhí)行;此時(shí)由于always過(guò)程語(yǔ)句的重復(fù)執(zhí)行的特點(diǎn),仿真進(jìn)程將不斷地對(duì)觸發(fā)條件進(jìn)行監(jiān)測(cè),等待a,b,c信號(hào)發(fā)生變化。
always過(guò)程塊的使用主要是對(duì)硬件功能模塊的行為進(jìn)行描述,它也可以在測(cè)試模塊中用來(lái)對(duì)時(shí)鐘進(jìn)行描述。利用always過(guò)程塊可以實(shí)現(xiàn)鎖存器和觸發(fā)器,它也可以用來(lái)實(shí)現(xiàn)組合邏輯。在用always過(guò)程塊實(shí)現(xiàn)組合邏輯時(shí)要注意將所有的輸入信號(hào)都列入敏感事件列表中,而在用always過(guò)程塊實(shí)現(xiàn)時(shí)序邏輯時(shí)卻不一定要將所有的輸入信號(hào)都列入敏感事件列表。敏感事件列表中未包含所有輸入信號(hào)的情況稱(chēng)為“不完整事件說(shuō)明(IncompleteEventSpecification)”?!安煌暾录f(shuō)明”情況在仿真時(shí)可能會(huì)引起模擬器的誤解。我們可以通過(guò)如下兩個(gè)例子來(lái)說(shuō)明這個(gè)問(wèn)題。
【例5-4】敏感事件列表中未包含所有輸入信號(hào)的情況。modulethree_input_and(f,a,b,c);outputf;inputa,b,c;regf;always@(aorb)beginf=a&b&c;endendmodule例5-4描述了一個(gè)3輸入與門(mén),由于輸入c沒(méi)有出現(xiàn)在敏感事件列表中,所以仿真時(shí)當(dāng)輸入信號(hào)c發(fā)生變化時(shí)不會(huì)重新計(jì)算f值。所以仿真得到的功能并不是一個(gè)3輸入與門(mén)的功能行為,而正確實(shí)現(xiàn)3輸入與門(mén)應(yīng)該采用例5-5所示的描述方式。
【例5-5】敏感事件列表中包含了所有的輸入信號(hào)。modulethree_input_and(f,a,b,c);outputf;inputa,b,c;regf;always@(aorborc)beginf=a&b&c;endendmodule在使用always過(guò)程塊時(shí)還要注意避免引起仿真死鎖狀態(tài)的發(fā)生。因?yàn)閍lways語(yǔ)句有重復(fù)循環(huán)執(zhí)行的特性,所以當(dāng)敏感事件列表缺省時(shí),語(yǔ)句塊將一直循環(huán)執(zhí)行下去,這就有可能在仿真時(shí)產(chǎn)生仿真死鎖情況,如例5-6給出的語(yǔ)句所示。
【例5-6】不恰當(dāng)使用always語(yǔ)句而產(chǎn)生仿真死鎖情況的例子。alwaysbeginclk=~clk;end上例中的always語(yǔ)句不帶有敏感事件列表,所以begin-end語(yǔ)句塊的執(zhí)行是無(wú)條件循環(huán)進(jìn)行的,這樣當(dāng)仿真進(jìn)程進(jìn)行到該always過(guò)程塊后(假設(shè)為t0時(shí)刻),將開(kāi)始重復(fù)執(zhí)行塊中語(yǔ)句“clk=~clk;”,由于該語(yǔ)句沒(méi)有時(shí)間控制部分,該語(yǔ)句每次執(zhí)行都不需要時(shí)延,這樣仿真進(jìn)程將停留在t0時(shí)刻不斷地循環(huán)執(zhí)行這條語(yǔ)句。這時(shí),仿真就不能往下一時(shí)刻繼續(xù)進(jìn)行,這就進(jìn)入了一種仿真死鎖狀態(tài)。如果例5-6中的語(yǔ)句能加上延時(shí)控制,則該always語(yǔ)句將變?yōu)橐粭l非常有用的描述語(yǔ)句(見(jiàn)例5-7)。
【例5-7】對(duì)例5-6的改進(jìn)。alwaysbegin#50clk=~clk;end例5-7中的賦值語(yǔ)句帶有50個(gè)單位時(shí)間的時(shí)延,這樣每一次該賦值語(yǔ)句被執(zhí)行的時(shí)刻是不同的,彼此間隔50個(gè)單位時(shí)間。所以循環(huán)就不是停留在t0時(shí)刻,而是往前推進(jìn)的。例5-7可以生成一個(gè)周期為100的無(wú)限延續(xù)的信號(hào)波形。5.2語(yǔ)句塊語(yǔ)句塊就是在“initial過(guò)程塊”或“always過(guò)程塊”中位于過(guò)程語(yǔ)句(initial語(yǔ)句或always語(yǔ)句)后面的,由“塊定義語(yǔ)句1”和“塊定義語(yǔ)句2”所界定的一組行為語(yǔ)句?!皦K定義語(yǔ)句1”和“塊定義語(yǔ)句2”構(gòu)成了一對(duì)“塊定義語(yǔ)句”。塊定義語(yǔ)句分成兩種:
一種是“begin-end”語(yǔ)句組,它們用來(lái)組合需要順序執(zhí)行的語(yǔ)句,由“begin-end”語(yǔ)句組標(biāo)識(shí)的語(yǔ)句塊稱(chēng)為“串行塊”。
另一種是“fork-join”語(yǔ)句組,它們用來(lái)組合需要并行執(zhí)行的語(yǔ)句。由“fork-join”語(yǔ)句組標(biāo)識(shí)的語(yǔ)句塊稱(chēng)為“并行塊”?!皦K定義語(yǔ)句1”(begin或fork語(yǔ)句)標(biāo)識(shí)了語(yǔ)句塊的開(kāi)始,“塊定義語(yǔ)句2”(end或join語(yǔ)句)則標(biāo)識(shí)著語(yǔ)句塊的結(jié)束。當(dāng)語(yǔ)句塊內(nèi)只包含一條語(yǔ)句時(shí)塊定義語(yǔ)句可以缺省。如果在定義語(yǔ)句塊的同時(shí)還引入了一個(gè)塊名,則該語(yǔ)句塊可以由這個(gè)塊名惟一標(biāo)識(shí),該語(yǔ)句塊被稱(chēng)為一個(gè)“有名塊”。在有名塊內(nèi)可以定義內(nèi)部寄存器變量,并且可以用“disable”中斷語(yǔ)句來(lái)中斷有名塊內(nèi)語(yǔ)句的執(zhí)行。同時(shí)語(yǔ)句塊的塊名還提供了惟一標(biāo)識(shí)寄存器的一種方法。語(yǔ)句塊只能出現(xiàn)在行為描述模塊中,但它不必非得出現(xiàn)在與過(guò)程語(yǔ)句initial或always的結(jié)合中,后面我們可以看到:在高級(jí)程序語(yǔ)句中以及任務(wù)和函數(shù)中都可以出現(xiàn)語(yǔ)句塊結(jié)構(gòu)。5.2.1串行塊(begin-end塊)串行塊的塊定義語(yǔ)句為“begin,end”,串行塊中的各條語(yǔ)句按串行方式順序執(zhí)行。串行塊的格式如下:begin
:<塊名>塊內(nèi)局部變量說(shuō)明時(shí)間控制1行為語(yǔ)句1……時(shí)間控制n
行為語(yǔ)句nend其中,“塊內(nèi)局部變量說(shuō)明”可以是reg型變量聲明語(yǔ)句、integer型變量聲明語(yǔ)句及real型變量聲明語(yǔ)句。串行塊執(zhí)行時(shí)的特點(diǎn)如下:
(1)串行塊內(nèi)的各條語(yǔ)句是按它們?cè)趬K內(nèi)出現(xiàn)的次序逐條順序執(zhí)行的,當(dāng)前面一條語(yǔ)句執(zhí)行完畢后下一條語(yǔ)句才能開(kāi)始執(zhí)行。
(2)塊中每條語(yǔ)句中的延時(shí)控制都是相對(duì)于前一條語(yǔ)句結(jié)束時(shí)刻的延時(shí)控制。
(3)在進(jìn)行仿真時(shí),當(dāng)遇到串行塊時(shí),塊中第一條語(yǔ)句隨即就開(kāi)始執(zhí)行;當(dāng)串行塊中最后一條語(yǔ)句執(zhí)行完畢時(shí),程序流程控制就跳出串行塊,串行塊結(jié)束執(zhí)行。整個(gè)串行塊的執(zhí)行時(shí)間等于其內(nèi)部各條語(yǔ)句執(zhí)行時(shí)間的總和。下面給出串行語(yǔ)句塊的幾個(gè)例子。
【例5-8】一個(gè)時(shí)鐘上升沿控制的三位移位寄存器。moduleThree_bit_shift_register(clk,d_in,d_out);inputclk;inputd_in;outputd_out;reg
reg_a,reg_b,d_out;always@(posedge
clk)begind_out=reg_b;reg_b=reg_a;reg_a=d_in;endendmodule在例5-8的代碼內(nèi)包含了一個(gè)begin-end串行塊,它屬于always過(guò)程塊的一部分。時(shí)鐘的上升沿跳變將觸發(fā)串行塊的執(zhí)行:第一條賦值語(yǔ)句首先執(zhí)行,將reg_b的值賦給寄存器d_out;執(zhí)行完第一條語(yǔ)句后,程序流程控制轉(zhuǎn)到第二條語(yǔ)句,開(kāi)始執(zhí)行第二條語(yǔ)句,將reg_a的值賦給reg_b;然后執(zhí)行第三條語(yǔ)句,將輸入d_in值賦給reg_a;在執(zhí)行完第三條語(yǔ)句(串行塊中的最后一條語(yǔ)句)后,程序流程跳出串行塊,串行塊結(jié)束執(zhí)行。下面是一個(gè)塊內(nèi)語(yǔ)句帶有延時(shí)的情況。
【例5-9】由帶有延時(shí)控制的語(yǔ)句組成的串行塊,用于產(chǎn)生時(shí)序波形。modulesequential_signal_gen(d_out);outputd_out;reg
d_out;initialbegind_out=0;#1d_out=1;#2d_out=0;#3d_out=1;#4d_out=0;endendmodule例5-9中的begin-end串行塊屬于initial過(guò)程塊的一部分。塊中語(yǔ)句執(zhí)行過(guò)程如下:
(1)在仿真開(kāi)始后(t=0時(shí)刻)串行塊就開(kāi)始執(zhí)行,首先執(zhí)行第一條語(yǔ)句,第一條語(yǔ)句執(zhí)行完時(shí)也就是在0時(shí)刻d_out值變?yōu)?。
(2)然后開(kāi)始執(zhí)行第二條語(yǔ)句,由于第二條賦值語(yǔ)句帶有1個(gè)單位時(shí)間的延時(shí),所以直到第一條語(yǔ)句結(jié)束1個(gè)單位時(shí)間后(t=1時(shí)刻),第二條賦值語(yǔ)句才開(kāi)始執(zhí)行,d_out的值變?yōu)?。
(3)同樣,第三條賦值語(yǔ)句是在第二條語(yǔ)句結(jié)束2個(gè)單位時(shí)間后(t=3時(shí)刻)開(kāi)始執(zhí)行,d_out的值變?yōu)?。
(4)第四條賦值語(yǔ)句是在第三條語(yǔ)句結(jié)束3個(gè)單位時(shí)間后(t=6時(shí)刻)開(kāi)始執(zhí)行,d_out的值變?yōu)?。
(5)第五條賦值語(yǔ)句是在第四條語(yǔ)句結(jié)束4個(gè)單位時(shí)間后(t=10時(shí)刻)開(kāi)始執(zhí)行,d_out的值變?yōu)?。
(6)第五條賦值語(yǔ)句結(jié)束后,串行塊結(jié)束執(zhí)行。上例中串行語(yǔ)句塊執(zhí)行過(guò)程所產(chǎn)生的波形如圖5.1所示。圖5.1例5-9的執(zhí)行產(chǎn)生的波形5.2.2并行塊(fork-join塊)并行塊的塊定義語(yǔ)句為“fork,join”,并行塊中的多條語(yǔ)句是并行執(zhí)行的。并行塊的格式如下:fork:<塊名>塊內(nèi)局部變量說(shuō)明時(shí)間控制1行為語(yǔ)句1;……時(shí)間控制n
行為語(yǔ)句n;join其中,“塊內(nèi)局部變量說(shuō)明”可以是reg型變量聲明語(yǔ)句、integer型變量聲明語(yǔ)句、real型變量聲明語(yǔ)句、time型變量聲明語(yǔ)句及事件(event)聲明語(yǔ)句。并行塊執(zhí)行時(shí)的特點(diǎn)如下:
(1)并行塊內(nèi)各條語(yǔ)句是同時(shí)并行地執(zhí)行的,也就是說(shuō)當(dāng)程序流程控制進(jìn)入并行塊后,塊內(nèi)各條語(yǔ)句都各自獨(dú)立地同時(shí)開(kāi)始執(zhí)行。各條語(yǔ)句的起始執(zhí)行時(shí)間都等于程序流程控制進(jìn)入該并行塊的時(shí)間。
(2)塊內(nèi)各條語(yǔ)句中指定的延時(shí)控制都是相對(duì)于程序流程控制進(jìn)入并行塊的時(shí)刻的延時(shí),也就是相對(duì)于并行塊開(kāi)始執(zhí)行時(shí)刻的延時(shí)。
(3)當(dāng)并行塊內(nèi)所有的語(yǔ)句都已經(jīng)執(zhí)行完畢后,也就是當(dāng)執(zhí)行時(shí)間最長(zhǎng)的那一條塊內(nèi)語(yǔ)句結(jié)束執(zhí)行后,程序流程控制才跳出并行塊,結(jié)束并行塊的執(zhí)行。整個(gè)并行塊的執(zhí)行時(shí)間等于執(zhí)行時(shí)間最長(zhǎng)的那條語(yǔ)句所需的執(zhí)行時(shí)間。下面給出并行塊的幾個(gè)例子。
【例5-10】用并行塊來(lái)產(chǎn)生時(shí)序波形。modulesequential_signal_gen(d_out);outputd_out;reg
d_out;initialforkd_out=0;#1d_out=1;#2d_out=0;#3d_out=1;#4d_out=0;joinendmodule從例5-10與例5-9的比較中可以看出,它們兩者惟一的差別就是把塊定義語(yǔ)句由原來(lái)的串行塊定義語(yǔ)句“begin-end”改為這里的并行塊定義語(yǔ)句“fork-join”。但這一改變將導(dǎo)致語(yǔ)句塊的執(zhí)行過(guò)程與執(zhí)行結(jié)果都發(fā)生變化。在仿真開(kāi)始后(t=0時(shí)刻)initial過(guò)程語(yǔ)句隨即被執(zhí)行,并行塊隨后也開(kāi)始執(zhí)行(t=0時(shí)刻),塊內(nèi)所有語(yǔ)句的執(zhí)行被同時(shí)啟動(dòng):由于第一條賦值語(yǔ)句沒(méi)有時(shí)延,所以第一條語(yǔ)句的賦值操作也是在0時(shí)刻同時(shí)進(jìn)行的,使d_out取值變?yōu)?。由于第二條賦值語(yǔ)句帶有1個(gè)單位時(shí)間的延時(shí),所以在并行塊開(kāi)始執(zhí)行1個(gè)單位時(shí)間后(t=1時(shí)刻),第二條賦值語(yǔ)句對(duì)應(yīng)的賦值操作才真正得到執(zhí)行,將d_out的取值改變?yōu)?。同樣,第三條賦值語(yǔ)句對(duì)應(yīng)的賦值操作是在并行塊開(kāi)始執(zhí)行2個(gè)單位時(shí)間后(t=2時(shí)刻)才進(jìn)行的,將d_out取值變?yōu)?;第四條賦值語(yǔ)句對(duì)應(yīng)的賦值操作是在并行塊開(kāi)始執(zhí)行3個(gè)單位時(shí)間后(t=3時(shí)刻)才進(jìn)行的,將d_out取值變?yōu)?;第五條賦值語(yǔ)句對(duì)應(yīng)的賦值操作是在并行塊開(kāi)始執(zhí)行4個(gè)單位時(shí)間后(t=4時(shí)刻)進(jìn)行的,使d_out的值變?yōu)?。由于并行塊中的五條語(yǔ)句的執(zhí)行所需時(shí)間分別是0,1,2,3,4個(gè)單位時(shí)間,其中第五條賦值語(yǔ)句所需時(shí)間最長(zhǎng),所以在第五條語(yǔ)句執(zhí)行完畢后(t=4時(shí)刻),并行塊結(jié)束執(zhí)行。該并行語(yǔ)句塊執(zhí)行過(guò)程產(chǎn)生的波形如圖5.2所示,它和上一小節(jié)中用串行塊實(shí)現(xiàn)的圖5.1所示的波形是不同的。要注意例5-10并行塊內(nèi)各條賦值語(yǔ)句出現(xiàn)的次序可以是不同的,比如其中各條語(yǔ)句的次序可以是例5-11所示的情況。圖5.2例5-10的執(zhí)行產(chǎn)生的波形
【例5-11】并行塊內(nèi)語(yǔ)句的不同次序。initialfork#3d_out=1;#2d_out=0;#4d_out=0;#1d_out=1;d_out=0;join在例5-11中,并行塊內(nèi)的各條語(yǔ)句并不是按它們被執(zhí)行的先后順序給出的,但例5-11同樣可以生成與例5-10相同的波形。5.2.3串行塊和并行塊的混合使用在分別對(duì)串行塊和并行塊進(jìn)行了介紹之后,我們還必須討論一下串行塊和并行塊的混合使用。它可以分為如下兩種情況。
(1)當(dāng)串行塊和并行塊屬于不同的過(guò)程塊(initial或always過(guò)程塊)時(shí),串行塊和并行塊是并行執(zhí)行的。
【例5-12】串行塊和并行塊屬于不同過(guò)程塊時(shí)的情況。modulebelong_to_different_pro_block(a,b);outputa,b;rega,b;initial //第一個(gè)initial過(guò)程塊begin //串行塊a=0; //語(yǔ)句S1#20a=0; //語(yǔ)句S2b=1; //語(yǔ)句S3#40a=0; //語(yǔ)句S4b=0; //語(yǔ)句S5endinitial //第二個(gè)initial過(guò)程塊fork //并行塊b=1; //語(yǔ)句P1#10a=1; //語(yǔ)句P2#10b=0; //語(yǔ)句P3#30a=1; //語(yǔ)句P4#50a=1; //語(yǔ)句P5joinendmodule例5-12中出現(xiàn)了兩個(gè)initial過(guò)程塊,這兩個(gè)過(guò)程塊是并行執(zhí)行的,所以它們內(nèi)部所包含的begin-end串行語(yǔ)句塊和fork-join并行語(yǔ)句塊也是并行執(zhí)行的。而在串行塊內(nèi)部,各條語(yǔ)句按順序方式執(zhí)行;在并行塊內(nèi)部,各條語(yǔ)句按并行方式執(zhí)行。例5-12中各條語(yǔ)句的執(zhí)行時(shí)序如表5.2所示。
(2)當(dāng)串行塊和并行塊嵌套使用在同一過(guò)程塊內(nèi)時(shí),內(nèi)層語(yǔ)句塊可以看作是外層語(yǔ)句塊中的一條普通語(yǔ)句,內(nèi)層語(yǔ)句塊在什么時(shí)刻得到執(zhí)行是由外層語(yǔ)句塊的規(guī)則所決定的;而在內(nèi)層語(yǔ)句塊開(kāi)始執(zhí)行后,其內(nèi)部各條語(yǔ)句的執(zhí)行要遵守內(nèi)層語(yǔ)句塊的規(guī)則。
【例5-13】嵌套使用的串行塊和并行塊。modulepara_bloc_nested_in_seri_bloc(a,b);outputa,b;rega,b;initial //?initial
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 售后維修委托協(xié)議
- 2025版無(wú)產(chǎn)權(quán)儲(chǔ)藏室租賃及買(mǎi)賣(mài)一體化協(xié)議3篇
- 市場(chǎng)監(jiān)督管理局廉政風(fēng)險(xiǎn)點(diǎn)排查及防控措施
- 2025年度個(gè)人二手房交易合同模板創(chuàng)新版
- 2025年全球及中國(guó)石墨氮化碳行業(yè)頭部企業(yè)市場(chǎng)占有率及排名調(diào)研報(bào)告
- 2025年全球及中國(guó)肺癌機(jī)器人放射治療行業(yè)頭部企業(yè)市場(chǎng)占有率及排名調(diào)研報(bào)告
- 2025年全球及中國(guó)硅基封端聚合物行業(yè)頭部企業(yè)市場(chǎng)占有率及排名調(diào)研報(bào)告
- 2025-2030全球電梯漸進(jìn)式安全裝置行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 2025年全球及中國(guó)定制基因合成行業(yè)頭部企業(yè)市場(chǎng)占有率及排名調(diào)研報(bào)告
- 2025年度二零二五年度鋼房租賃及智能化升級(jí)服務(wù)協(xié)議3篇
- 城市基礎(chǔ)設(shè)施修繕工程的重點(diǎn)與應(yīng)對(duì)措施
- 圖像識(shí)別領(lǐng)域自適應(yīng)技術(shù)-洞察分析
- 個(gè)體戶(hù)店鋪?zhàn)赓U合同
- 禮盒業(yè)務(wù)銷(xiāo)售方案
- 術(shù)后肺炎預(yù)防和控制專(zhuān)家共識(shí)解讀課件
- 二十屆三中全會(huì)精神學(xué)習(xí)試題及答案(100題)
- 中石化高級(jí)職稱(chēng)英語(yǔ)考試
- 小學(xué)五年級(jí)英語(yǔ)閱讀理解(帶答案)
- 2024二十屆三中全會(huì)知識(shí)競(jìng)賽題庫(kù)及答案
- 仁愛(ài)版初中英語(yǔ)單詞(按字母順序排版)
- 2024年全國(guó)統(tǒng)一考試高考新課標(biāo)Ⅱ卷語(yǔ)文+數(shù)學(xué)+英語(yǔ)試題(真題+答案)
評(píng)論
0/150
提交評(píng)論