Verilog程序設(shè)計與EDA(二版) 課件 第3章 Verilog HDL的基本語句_第1頁
Verilog程序設(shè)計與EDA(二版) 課件 第3章 Verilog HDL的基本語句_第2頁
Verilog程序設(shè)計與EDA(二版) 課件 第3章 Verilog HDL的基本語句_第3頁
Verilog程序設(shè)計與EDA(二版) 課件 第3章 Verilog HDL的基本語句_第4頁
Verilog程序設(shè)計與EDA(二版) 課件 第3章 Verilog HDL的基本語句_第5頁
已閱讀5頁,還剩61頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

3.1賦值語句

3.2塊語句

3.3條件語句

3.4循環(huán)語句

3.5結(jié)構(gòu)說明語句

3.6行為描述語句

3.7內(nèi)置門語句

3.8內(nèi)置開關(guān)語句

3.9用戶定義原語UDP

3.10force強迫賦值語句

3.11specify延遲說明塊

3.12關(guān)于Verilog-2001新增的一些特性

3.13關(guān)于Verilog-20053.1賦值語句3.1.1連續(xù)賦值語句和過程賦值語句賦值語句分為連續(xù)賦值語句和過程賦值語句。1.連續(xù)賦值語句連續(xù)賦值語句一直是有效的,無論何時輸入一旦改變,輸出就隨著改變。它的標(biāo)志(即關(guān)鍵字)是assign。連續(xù)賦值語句的格式為assign[drive_strength][delay]list_of_net_assignments;其中:方擴號都是可選部分;驅(qū)動強度[drive_strength]默認為strong0和strong1,也可指定為除supply0和supply1之外任何類型的標(biāo)量線網(wǎng);延遲[delay]默認為0;list_of_net_assignments是列出線網(wǎng)賦值。2.過程賦值語句只有當(dāng)過程到來且控制權(quán)傳遞給它時才執(zhí)行的語句稱為過程賦值語句。過程賦值語句的前面沒有關(guān)鍵字,它出現(xiàn)在過程塊中。過程賦值的格式為regtype=expression;其中,regtype寄存器變量必須是寄存器類型或存儲器型變量,應(yīng)在模塊的說明部分確認;expression是表達式。直接用“=”給變量賦值的過程賦值的左端變量必須是reg。過程賦值只允許出現(xiàn)在always和initial結(jié)構(gòu)塊中。3.1.2阻塞賦值語句和非阻塞賦值語句賦值語句又分為阻塞賦值語句和非阻塞賦值語句。阻塞賦值語句用=符號連接,非阻塞賦值用<=符號連接,可形象的記憶為非阻塞賦值多了個非,符號就多了個<。阻塞賦值語句和非阻塞賦值語句是用VerilogHDL建模的難點之一,設(shè)計時要仔細琢磨。1.阻塞賦值語句我們先看如圖3.1所示的阻塞賦值語句的執(zhí)行“路線圖”。阻塞,即本條語句具有影響下一條語句的作用。在同一個always進程中,一條阻塞賦值語句的執(zhí)行直接影響著下條語句的執(zhí)行情況和結(jié)果。阻塞,從字面層上可理解為本條語句阻塞了下一條語句的執(zhí)行。2.非阻塞賦值語句我們先看如圖3.2所示的非阻塞賦值語句的執(zhí)行“路線圖”。非阻塞,即各條語句是并發(fā)執(zhí)行(同時執(zhí)行)的。它更能體現(xiàn)時序邏輯硬件電路的某些特點。任何always和initial語句中,等待同一個變化沿的所有非阻塞賦值語句都是同步的。非阻塞賦值通常與邊沿觸發(fā)(敏感)電路對應(yīng),時鐘邊沿到來時,電路才動作,賦值才有效。通常,阻塞賦值語句運用在組合電路中,非阻塞賦值語句運用在時序電路中。但許多數(shù)字電路往往是既有組合又有時序,此時要仔細考慮。當(dāng)為時序邏輯建模時,使用“非阻塞賦值”;當(dāng)描述邊沿敏感電路系統(tǒng)中的并行傳輸時,一定要使用“非阻塞賦值”;當(dāng)為鎖存器(latch)建模時,使用“非阻塞賦值”;當(dāng)在同一個always塊里面既為組合邏輯又為時序邏輯建模時,使用“非阻塞賦值”。當(dāng)用always塊為組合邏輯建模時,使用“阻塞賦值”。不要在同一個always塊里面混合使用“阻塞賦值”和“非阻塞賦值”。

不要在兩個或兩個以上always塊里面對同一個變量進行賦值。可通過編寫一個測試模塊,并使用系統(tǒng)選通任務(wù)$strobe或系統(tǒng)顯示任務(wù)$display進行功能仿真顯示已被“非阻塞賦值”、“阻塞賦值”的值,觀測、理解其概念。本書在6.1.3小節(jié)比較了電路設(shè)計中阻塞賦值與非阻塞賦值的區(qū)別。值得注意的是:采用非阻塞賦值的賦值語句,只有當(dāng)整個設(shè)計中等待同一個邊沿的所有非阻塞賦值語句“<=”的右邊計算完畢后,才更新它左邊的值,左邊的新值在下一條語句中是不能使用的。阻塞賦值語句和非阻塞賦值語句可看成是兩種類型以不同方式完成的過程賦值語句。3.2塊

句VerilogHDL的塊語句有順序塊語句和并行塊語句。3.2.1順序塊語句順序塊語句的格式為begin[:block_identifier{block_item_declaration}]{statement}end其中:方擴號是可選部分(書中以后解釋相同);block_identifier塊標(biāo)識符是給順序塊起的名子;block_item_declaration塊項目說明可以是參數(shù)說明、寄存器說明、事件說明等??梢栽诿腷egin…end塊內(nèi)對新的局部變量進行規(guī)定和存取。begin...end之間可包含多條過程賦值語句。它們的用途是將多個過程語句組合成一個復(fù)合句。3.2.2并行塊語句并行塊語句的格式為fork[:block_identifier{block_item_declaration}]{statement}join其中:block_identifier塊標(biāo)識符是給并行塊起的名字;block_item_declaration塊項目說明可以是參數(shù)說明、寄存器說明、事件說明等??梢栽诿膄ork...join塊內(nèi)對新的局部變量進行規(guī)定和存取。fork...join之間的每一條語句看做是一個獨立的進程。3.3條

句條件語句用于改變設(shè)計描述中對流程的控制。3.3.1ifelse語句if語句用來判斷所給條件是否滿足,并根據(jù)結(jié)果(真或假)決定執(zhí)行給出的操作。VerilogHDL中有三種形式的if語句。(1)?if(condition)語句;(2)?if(condition)語句1;else語句2;(3)?if(condition1)語句1;注意,上述三種形式的條件(condition)通常為關(guān)系表達式或邏輯關(guān)系表達式。對條件判斷時,其值若為0、x、z,則按“假”處理,緊跟的語句不執(zhí)行;其值若為1,則按“真”處理,緊跟的語句被執(zhí)行。當(dāng)if與else多次連用時,要注意其配對關(guān)系:else總是與它上面最近的if配對。表達式可以簡寫。例如,if(expression)與if(expression==1)等效。關(guān)系表達式用?>?(大于),>?=(大于等于),<(小于),<=(小于等于),等式操作用==?(等于),!=?(不等于)等操作符來連接。四值邏輯?(0,1,x,z)比較時要比較每一位,包括不確定位和高阻位。此時可使用“case等于”操作符(===)和“case不等于”操作符(!==)將不確定位和高阻位參與比較。邏輯關(guān)系表達式用&&(與)、||(或)、!(非)等邏輯關(guān)系操作符來連接。3.3.2case語句當(dāng)if條件可以用一個共同的基本表達式來表示時,常使用case語句表達多分支結(jié)構(gòu)。case語句首先對控制表達式control_expr求值,然后依次對各分支項case_item_expr求值并進行比較,第一個與控制表達式值相匹配的分支中的語句statement被執(zhí)行,即哪個分支與控制表達式值相匹配,就執(zhí)行其冒號后的語句,否則執(zhí)行default后面的語句??梢栽谝粋€分支中定義多個分支項;這些值不需要互斥。缺省default分支覆蓋所有沒有被分支表達式覆蓋的其他分支。分支表達式和各分支項表達式不必都是常量表達式。在case語句中,x和z值作為文字值進行比較。還有兩種接受無關(guān)值的case語句:casex和casez,這些形式對x和z值使用不同的解釋。除關(guān)鍵字casex和casez以外,語法與case語句完全一致。在casez語句中,出現(xiàn)在case表達式和任意分支項表達式中的值z被認為是無關(guān)值,即哪個位被忽略(不比較)。在casex語句中,值x和z都被認為是無關(guān)位。3.3.3條件操作符構(gòu)成的語句如果要從兩個值中選出一個來賦值,此時,可使用條件操作符?(?:)。條件操作符的格式為expression1?expression2:expression3;如果第一個表達式expression1為真,則條件操作的值是第二個表達式expression2,否則,它的值就是第三個表達式expression3。3.4循

環(huán)

句循環(huán)語句是用來描述重復(fù)的順序行為的語句。VerilogHDL中有四類循環(huán)語句:(1)?forever循環(huán)。(2)?repeat循環(huán)。(3)?while循環(huán)。(4)?for循環(huán)。3.4.1forever循環(huán)語句forever循環(huán)語句語的格式為foreverproceduralstatement //程序語句forever循環(huán)語句是一直循環(huán)執(zhí)行語句。因此,為跳出這樣的循環(huán),中止語句(disable)可以與過程語句共同使用。在過程語句中必須使用某種形式的時序控制,否則,forever循環(huán)將在0時延后永遠循環(huán)下去。forever循環(huán)語句常用于產(chǎn)生周期性的波形,應(yīng)用于仿真測試信號。3.4.2repeat循環(huán)repeat循環(huán)語句的格式為repeat(loopcount) //圓括號中給出循環(huán)數(shù)proceduralstatement //程序語句這種循環(huán)語句執(zhí)行指定循環(huán)次數(shù)的過程語句。如果循環(huán)數(shù)或循環(huán)計數(shù)表達式的值不確定,即為x或z時,那么循環(huán)次數(shù)按0處理。3.4.3while循環(huán)while循環(huán)語句的格式為while(condition)//圓括號中給出循環(huán)條件proceduralstatement此循環(huán)語句循環(huán)執(zhí)行過程賦值語句直到指定的條件為假。如果循環(huán)條件表達式在開始時為假,那么過程語句便永遠不會執(zhí)行。如果條件表達式為x或z,那么它也同樣按0(假)處理。3.4.4for循環(huán)for循環(huán)語句的格式為for(initialassignment;condition;stepassignment)proceduralstatement;一個for循環(huán)語句按照指定的次數(shù)重復(fù)執(zhí)行過程賦值語句若干次。初始賦值initialassignment給出循環(huán)變量的初始值。condition條件表達式指定循環(huán)在什么情況下必須結(jié)束。只要條件為真,循環(huán)中的語句就執(zhí)行;而stepassignment給出要修改的賦值,通常為增加或減少循環(huán)變量計數(shù)。for循環(huán)語句的執(zhí)行過程如圖3.3所示。我們在實際運用中體會到,VerilogHDL的for循環(huán)語句編程看似簡潔,但有時實現(xiàn)的硬件電路未必簡單。3.5結(jié)構(gòu)說明語句為了更方便管理、更容易調(diào)用,VerilogHDL提供了一類用戶可定義的、完成一定功能的函數(shù)說明語句和任務(wù)說明語句。這類函數(shù)說明語句和任務(wù)說明語句作為一個整體,可看成一種結(jié)構(gòu)說明語句。3.5.1task(任務(wù))VerilogHDL中的任務(wù)與計算機軟件中的過程類似。它可以由調(diào)用語句調(diào)用,執(zhí)行之后返回到下一條語句。它不能用在表達式中,但可以接受參數(shù)并返回結(jié)果。它內(nèi)部可以聲明局部變量,這些變量的作用域局限在這個任務(wù)中。其中:task_identifier任務(wù)標(biāo)識符實際就是該任務(wù)的名字;task_item_declaration任務(wù)的各項說明包括端口及數(shù)據(jù)類型的聲明語句;statement可以有若干句。任務(wù)調(diào)用及變量的傳遞格式為task_identifier(port1,port2,…,portn);其中:task_identifier表示任務(wù)的名字;port1,port2,…,portn表示端口1,端口2,…,端口n。任務(wù)調(diào)用的變量和任務(wù)定義的I/O變量之間是一一對應(yīng)的。3.5.2function(函數(shù))VerilogHDL中的函數(shù)與計算機軟件中的函數(shù)類似。函數(shù)有一個輸出(函數(shù)名)和至少有一個輸入。在函數(shù)內(nèi)部其他標(biāo)識符可以被說明,它們的作用域是函數(shù)內(nèi)部。函數(shù)不能包含延遲(#)或事件控制(@,wait)語句。函數(shù)的目的是返回一個用于表達式的值。其中:rangeortype返回值的類型或范圍是可選的,若默認,則返回為一位寄存器型數(shù)據(jù);function_identifier函數(shù)標(biāo)識符實際就是該函數(shù)的名字;function_item_declaration函數(shù)各項說明包括端口說明、變量類型說明;statement可以有若干句。在函數(shù)的定義中必須有一條賦值語句給函數(shù)中的內(nèi)部變量賦以函數(shù)結(jié)果值,該內(nèi)部變量具有和函數(shù)名相同的名字。VerilogHDL模塊使用函數(shù)時是把它當(dāng)作表達式中的操作符,這個操作的結(jié)果值就是這個函數(shù)的返回值。函數(shù)的調(diào)用格式為function(函數(shù))和task(任務(wù))說明語句的不同點:(1)函數(shù)只能與主模塊共用同一個仿真時間單位,而任務(wù)可以定義自己的仿真時間單位。(2)函數(shù)能調(diào)用其他函數(shù)不能調(diào)用其他任務(wù),而任務(wù)能調(diào)用其他任務(wù)和函數(shù)。(3)函數(shù)至少要有一個輸入變量,但不能將inout型作為輸出,而任務(wù)可以沒有或有多個任何類型的變量。(4)函數(shù)為調(diào)用它的表達式返回一個值,而任務(wù)則不返回值。(5)函數(shù)的定義不能包含任何的時間控制語句,而任務(wù)可以。(6)函數(shù)調(diào)用是表達式中的一個操作數(shù),可以在過程和連續(xù)賦值語句中調(diào)用,而任務(wù)調(diào)用是一個單獨的過程語句,不能在連續(xù)賦值語句中調(diào)用。(7)函數(shù)的目的是通過返回一個值來對應(yīng)輸入信號的值,而任務(wù)卻能支持多種目地,并能計算多個結(jié)果值,這些結(jié)果值只能通過被調(diào)用的任務(wù)的輸出或總線端口送出。3.6行為描述語句行為描述的標(biāo)志是包含了一個或多個always語句,或有initial語句。行為描述語句包括:①initial(初始化)語句;②always(總是)語句。第2章曾作了一些介紹,這里做進一步說明。3.6.1initial語句initial語句的格式為initialstatement;其中,statement語句可以包括若干個。initial語句只執(zhí)行一次。initial語句提供了一種在實際電路開始模擬之前初始化輸入波形和模擬變量的方式。initial語句所包含的語句一旦執(zhí)行完畢,它不會再重復(fù)執(zhí)行,就永遠掛起。initial語句通常多用于描述模擬的初始化工作。3.6.2always語句always語句的格式為alwaysstatement;其中,statement語句可以包括若干個。always語句反復(fù)執(zhí)行。always所包含的語句反復(fù)執(zhí)行,永遠不退出或終止執(zhí)行。一個行為建模中可包含一個或多個always語句。alwaysstatement的statement結(jié)構(gòu)形式很豐富,約有10多種,如:(1)阻塞賦值(blockingassignment);(2)非阻塞賦值(nonblockingassignment);(3)過程連續(xù)賦值(proceduralcontinuousassignment);(4)過程定時控制(proceduraltimingcontrolstatement);(5)條件語句(conditionalstatement);(6)情況語句(casestatement);(7)循環(huán)語句(loopstatement);(8)等待語句(waitstatement);(9)終止語句(disablestatement);(10)事件觸發(fā)(eventtrigger);(11)順序塊(seq_block);(12)并行塊(par_block);(13)任務(wù)使能(taskenable);(14)系統(tǒng)任務(wù)使能(systemtaskenable)。通常有如下一些常用結(jié)構(gòu)形式:①alwaysstatement1;always后只緊跟一個或幾個阻塞賦值語句;always后只緊跟一個或幾個非阻塞賦值語句,它們是一種最簡單形式。3.7內(nèi)

句VerilogHDL提供了由14個門級基元組成的集合,可將它們稱為內(nèi)置門語句。這些門級基本單元可通過線網(wǎng)連接,并將它們封裝進模塊,從而建立更大的功能模塊。3.7.1多輸入門多輸入門n_input_gate的格式為n_input_gatetype[drive_strength][delay2]n_input_gate_instance;n_input_gatetype:n輸入門類型,包括and(與門)、nand(與非門)、or(或門)、nor(或非門)、xor(異或門)、xnor(異或非門、同或門)。n_input_gate_instance:n輸入門實例,包括可選門實例的名字、門的輸出、輸入端列表,后二者用括號括起,且輸出在前、輸入在后,由逗號隔開,如[name_of_gate_instance](output_terminal,input_terminal{,input_terminal})??蛇x的驅(qū)動強度[drive_strength]:指明門輸出的電氣特性即驅(qū)動能力。當(dāng)一條連線由多個前級輸出所驅(qū)動時,各驅(qū)動端的驅(qū)動強度不同,將直接影響連線最終的邏輯狀態(tài)。默認強度為strong0、strong1。可選的延遲[delay2]:這里delay2可以是#delay_value;也可以是?#(delay_value[,delay_value]),括號中第一項為上升延遲,第二項為下降延遲??蛇x的延遲?[delay2]?默認為0。圖3.4給出了三組多輸入門舉例。在模塊中,圖3.4(a)、(b)、(c)分別被描述為當(dāng)然,當(dāng)它們同時出現(xiàn)在同一模塊中時,輸入、輸出端子的名字應(yīng)按實際情況加以區(qū)分。3.7.2多輸出門多輸出門n_output_gate的格式為n_output_gatetype[drive_strength][delay2]n_output_gate_instance;n_output_gatetype:n輸出門類型包括buf(緩沖門)、not(非門)。n_output_gate_instance:n輸出門實例,包括可選門實例的名字、門的輸出、輸入端列表,后二者用括號括起,且輸出在前、輸入在后,由逗號隔開,如[name_of_gate_instance](output_terminal{,output_terminal},input_terminal)??蛇x的驅(qū)動強度[drive_strength]:指明門輸出的電氣特性即驅(qū)動能力。可選的延遲[delay2]:這里delay2可以是?#delay_value;也可以是?#(delay_value[,delay_value]),括號中第一項為上升延遲,第二項為下降延遲??蛇x的延遲[delay2]默認為0。圖3.5給出了多輸出門舉例。在模塊中,buf(緩沖門)、not(非門)分別被描述為buf(Y1,Y2,…,Yn,a);not(Y1,Y2,…,Yn,a);3.7.3使能門在系統(tǒng)設(shè)計中,使能門是必不可少的。使能門enable_gate的格式為enable_gatetype[drive_strength][delay3]enable_gate_instance;enable_gatetype:使能門類型包括bufif1高電平使能三態(tài)緩沖門、bufif0低電平使能三態(tài)緩沖門、notif1高電平使能非門、notif0低電平使能非門。enable_gate_instance:使能門實例,包括可選門實例的名字、輸出、輸入、使能端列表,后三項用括號括起,且輸出在前、輸入和使能在后,由逗號隔開,如[name_of_gate_instance](output_terminal,input_terminal,enable_terminal)??蛇x的驅(qū)動強度[drive_strength]:指明門輸出的電氣特性即驅(qū)動能力??蛇x的延遲[delay3]:這里delay3可以是?#delay_value;也可以是?#(delay_value[,delay_value[,delay_value]]),括號中第一項為上升延遲,第二項為下降延遲,第三項為高阻延遲(用于trireg線網(wǎng)時,它使連線的值變?yōu)閤的衰減時間)??蛇x的延遲[delay3]默認為0。圖3.6給出了使能門舉例。在模塊中,bufif1高電平使能三態(tài)緩沖門、bufif0低電平使能三態(tài)緩沖門、notif1高電平使能非門、notif0低電平使能非門分別被描述為bufif1(Y,a,en); //當(dāng)en為0時,bufif1驅(qū)動輸出Y為高阻;否則a被傳輸至Ybufif0(Y,a,en); //當(dāng)en為1時,bufif0驅(qū)動輸出Y為高阻;否則a被傳輸至Ynotif1(Y,b,en); //當(dāng)en為0時,notif1驅(qū)動輸出Y為高阻;否則b非被傳輸至Ynotif0(Y,b,en); //當(dāng)en為1時,notif0驅(qū)動輸出Y為高阻;否則b非被傳輸至Y3.7.4上拉和下拉上拉pullup的格式為pullup[pullup_strength]pull_gate_instance;pull_gate_instance:上拉門實例,包括可選門實例的名字、門的輸出(后者用括號括起)。即[name_of_gate_instance](output_terminal)??蛇x的上拉強度[pullup_strength]可以是(strength0,strength1),也可以是(strength1,strength0),還可以是strength1。下拉pulldown的格式為pulldown[pulldown_strength]pull_gate_instance;pull_gate_instance:下拉門實例,包括可選的門實例的名字,用括號包含門的輸出,如[name_of_gate_instance](output_terminal)。可選的下拉強度[pulldown_strength]可以是(strength0,strength1),也可以是(strength1,strength0),還可以是strength0。pullup實際為上拉電阻,pulldown實際為下拉電阻。3.8內(nèi)置開關(guān)語句VerilogHDL提供了由12個開關(guān)級基元組成的集合,可將它們稱為內(nèi)置開關(guān)語句。內(nèi)置開關(guān)語句用來描述傳輸門的互連,這些傳輸門是單個的MOS管(CMOS管)的抽象。內(nèi)置開關(guān)可以模擬MOS管(CMOS管)的導(dǎo)通或不導(dǎo)通。3.8.1mos開關(guān)mos開關(guān)的格式為mos_switchtype[delay3]mos_switch_gate_instance;mos_switchtype:mos開關(guān)類型,包括nmos、pmos、rnmos、rpmos?!皉”型mos具有更高的傳導(dǎo)阻抗。mos_swith_gate_instance:mos開關(guān)門實例,包括可選門實例的名字、門的輸出、輸入、使能端列表,后三項用括號括起,且輸出在前、輸入和使能在后,由逗號隔開,如?[name_of_gate_instance](output_terminal,input_terminal,enable_terminal)??蛇x的延遲[delay3]:這里delay3可以是#delay_value;也可以是#(delay_value[,delay_value[,delay_value]]),括號中第一項為上升延遲,第二項為下降延遲,第三項為高阻延遲(用于trireg線網(wǎng)時,它使連線的值變?yōu)閤的衰減時間)??蛇x的延遲[delay3]默認為0。3.8.2cmos開關(guān)cmos開關(guān)的格式為cmos_switchtype[delay3]cmos_switch_gate_instance;cmos_switchtype:cmos開關(guān)類型,包括cmos、rcmos。cmos_switch_gate_instance:cmos開關(guān)門實例,包括可選門實例的名字、門的輸出、輸入、n控制、p控制端列表,后四項用括號括起,且按照輸出、輸入、n控制、p控制順序排列,由逗號隔開,如[name_of_gate_instance](output_terminal,input_terminal,ncontrol_terminal,pcontrol_terminal)。可選的延遲[delay3]:這里delay3可以是#delay_value;也可以是#(delay_value[,delay_value[,delay_value]]),括號中第一項為上升延遲,第二項為下降延遲,第三項為高阻延遲(用于trireg線網(wǎng)時,它使連線的值變?yōu)閤的衰減時間)??蛇x的延遲(delay3)默認為0。3.8.3pass開關(guān)pass開關(guān)的格式為pass_switchtypepass_switch_gate_instance;pass_switchtype:pass開關(guān)類型,包括tran、rtran。tran為雙向傳輸門,rtran具有更高阻抗。pass_switch_gate_instance:pass開關(guān)門實例,包括可選的門實例的名字、門的輸出輸入、輸出輸入端列表,后二者用括號括起,由逗號隔開,如[name_of_gate_instance](inout_terminal,inout_terminal)。3.8.4pass_en開關(guān)pass_en開關(guān)的格式為pass_en_switchtype[delay3]pass_en_switch_gate_instance;pass_en_switchtype:pass_en開關(guān)類型,包括tranif0、tranif1、rtranif1、rtranif0。pass_en_switch_gate_instance:pass_en開關(guān)門實例,包括可選的門實例的名字、門的輸出輸入、使能端列表,后三項用括號括起,且由逗號隔開,如[name_of_gate_instance](inout_terminal,inout_terminal,enableterminal)。可選的延遲[delay3]:這里delay3可以是#delay_value;也可以是?#(delay_value[,delay_value[,delay_value]]),括號中第一項為上升延遲,第二項為下降延遲,第三項為高阻延遲(用于trireg線網(wǎng)時,它使連線的值變?yōu)閤的衰減時間)。可選的延遲[delay3]默認為0。3.9用戶定義原語UDPVerilogHDL提供了一種用戶可以拓展、定義的原始的基本單元,稱之為用戶定義原語,簡記為UDP(UserDefinedPrimitives)。它的結(jié)構(gòu)類似于邏輯函數(shù)真值表的枚舉形式。這種用戶定義的基本單元是一種獨立的VerilogHDL模塊。用戶定義原語后,這個UDP就可以像內(nèi)置門語句那樣作為一種實例語句使用。3.9.1UDP的結(jié)構(gòu)用戶定義原語UDP并非是由用戶隨心所欲地定義,而是要按一定的規(guī)矩、一定的語法結(jié)構(gòu)形式去定義。UDP的結(jié)構(gòu)形式為udp_port_list:UDP的端口列表,包括output_port_identifier、input_port_identifier{,input_port_identifier},即輸出端口名、輸入端口名。udp_port_declaration:UDP的端口說明,包括輸出說明、輸入說明、寄存器說明。udp_body:UDP的主體,它可以是:①

組合電路主體;②

時序電路主體。(1)組合電路主體的結(jié)構(gòu)如下:tablecombinational_entry{combinational_entry}endtable其中,combinational_entry為組合電路實體,以類似于邏輯函數(shù)真值表的枚舉形式列出:level_input_list:output_symbol;列表冒號左邊為輸入,右邊為輸出。列表以電平1、0、X表示輸入、輸出值,輸入中Z被看做是X,但它不能出現(xiàn)。允許列表中說明無關(guān)項。列表中可用符號“???”進行簡寫,符號“???”表示用1、0、X依次代替。(2)時序電路主體的結(jié)構(gòu)如下:udp_initial_statement為可選的UDP初始化語句,其形式如下:initialudp_output_port_identifier=init_value;在初始化語句中將init_value賦給UDP的輸出端口名,這里init_value可以是1,也可以是0,還可以是1`b0、1`b1或1`bx,在這里b、B與x、X同等對待。sequential_entry為時序電路實體,以類似于邏輯函數(shù)狀態(tài)表的枚舉形式列出:seq_input_list:current_state:next_state;列表第一個冒號左邊為輸入,右邊為輸出現(xiàn)態(tài),輸出現(xiàn)態(tài)后冒號右邊為輸出次態(tài)。seq_input_list為時序輸入列表,可以是電平輸入列表,也可以是邊沿輸入列表。電平輸入列表可以是:0,1,x,X,?,B,b(表示0或1)。邊沿輸入列表可以是:r、R(表示01,上升沿),f、F(表示10,下降沿),p、P(表示01、0x、x1,含x上升沿),n、N(表示10、1x、x0,含x下降沿),*(表示“??”,即發(fā)生的任何變化)。current_state輸出現(xiàn)態(tài)可以是:0,1,x,X,?,B,b(表示0或1)。next_state輸出次態(tài)可以是:0,1,x,X,或?-(表示無變化)。3.9.2UDP的實例化應(yīng)用用戶定義的UDP可以像內(nèi)置門語句那樣作為一種實例語句來使用。其格式如下:udp_identifier[drive_strength][delay2]udp_instance;udp_identifier:用戶定義的UDP的名字。[drive_strength]:驅(qū)動強度,它是可選的,用于指明輸出的電氣特性即驅(qū)動能力。[delay2]:延遲,它是可選的。這里delay2可以是#delay_value;也可以是#(delay_value[,delay_value]),括號中第一項為上升延遲,第二項為下降延遲??蛇x的延遲[delay2]默認為0。udp_instance:用戶定義的UDP實例,包括可選的UDP實例的名字、輸出端口連接、輸入端口連接。后兩項用括號括起,如[name_of_udp_instance](output_port_connection,input_port_connection{,input_port_connection})。3.9.3組合電路UDP舉例下面通過2選1多路選擇器說明組合電路UDP的定義。primitiveMUX2x1(Y,A,B,S);outputY;inputA,B,S;tableendtableendprimitive當(dāng)輸入S=1時,選擇A,輸出Y隨A變化;當(dāng)輸入S=0時,選擇B,輸出Y隨B變化。輸入端口的次序必須與表中各項的次序匹配,即表中的第一列對應(yīng)于UDP原語端口隊列的第一個輸入A,第二列對應(yīng)于UDP原語端口隊列的第二個輸入B,第三列對應(yīng)于UDP原語端口隊列的第三個輸入S。3.9.4時序電路UDP舉例UDP可以用來描述具有電平敏感和邊沿敏感特性的時序電路,時序電路UDP使用寄存器當(dāng)前值和輸入值決定寄存器的下一狀態(tài)(和后繼的輸出)。時序電路UDP比組合電路擁有的組合更多,要定義的邊沿組合通常較多。如果邊沿組合不作任何說明,輸出就會變成未知量(X)。為了避免這種不確定性,就要注意對電平和邊沿組合進行全部描述。1.狀態(tài)寄存器的初始化時序電路UDP具有內(nèi)部狀態(tài),內(nèi)部狀態(tài)要通過狀態(tài)寄存器實現(xiàn)。時序電路UDP的狀態(tài)寄存器初始化可以使用帶有一條過程賦值語句的初始化語句來完成,形式如下:initialudp_output_port_identifier=init_value;在初始化語句中將init_value賦給UDP的輸出端口名,這里init_value可以是1、0、1'b0、1'b1或1'bx,在這里b、B與x、X同等對待。可選的初始化語句應(yīng)放在UDP定義中。2.電平敏感的時序電路UDP舉例下面是D鎖存器的UDP示例。鎖存器是電平敏感的,即由電平信號控制,其數(shù)據(jù)會保持一段時間,直到解鎖。對于如下電平敏感的D鎖存器UDP,只要時鐘為電平1,數(shù)據(jù)就從輸入傳遞到輸出;否則輸出值被鎖存?!?”字符表示值“沒有任何變化”。3.邊沿敏感的時序電路UDP舉例下面是一個邊沿敏感的觸發(fā)器UDP示例。寄存器是邊沿敏感的,即由時鐘邊沿信號控制,其數(shù)據(jù)是暫存的。與電平敏感的D鎖存器UDP不同的是,寄存器列表必須在D端數(shù)據(jù)輸入時說明一個上升沿或下降沿。初始化語句放在UDP定義中。列表中(10)表示從1轉(zhuǎn)換(變化)到0,產(chǎn)生一個下降沿;(1x)表示從1轉(zhuǎn)換到x;(?1)表示從任意值(0,1或x)轉(zhuǎn)換到1;(??)表示任意轉(zhuǎn)換。最后一行說明如果clk穩(wěn)定在0、1或x,并且輸入數(shù)據(jù)發(fā)生任意變化,則輸出不會變化。對任意未定義的轉(zhuǎn)換,輸出缺省值為x。下面通過6位寄存器說明時序電路UDP的實例化應(yīng)用。通常由多個邊沿敏感的觸發(fā)器構(gòu)成寄存器。定義了一個邊沿敏感的觸發(fā)器UDP以后,就可以像內(nèi)置門語句那樣作為一種實例語句使用。例如,由名為DEDgeFF的UDP組成6位寄存器:4.電平敏感和邊沿敏感混合的時序電路UDP舉例在同一個時序電路UDP中,電平敏感和邊沿敏感混合是常見的現(xiàn)象。當(dāng)電平敏感和邊沿敏感列表的輸入之間發(fā)生沖突時,它的次態(tài)輸出以電平敏感列表為準(zhǔn)。下面是一個帶異步置0、異步置1的時鐘上升沿敏感D觸發(fā)器的UDP示例,置0(clear)與置1(preset)是電平敏感的。在用戶定義原語UDP的列表中,如果內(nèi)容較多,則可以采用邊沿條件的VerilogHDL速記符號,以便減少工作量:3.10force強迫賦值語句類似于進程連續(xù)賦值語句,可使用force強迫賦值語句對線網(wǎng)和寄存器類型變量實行強制賦值。該語句常用于調(diào)試。該語句的語法如下:強迫賦值語句在程序中的位置,可參照說明語句。注意:(1)不能對線網(wǎng)變量或寄存器變量的某位或某些位實行強制賦值或釋放。force具有比進程連續(xù)賦值語句更高的優(yōu)先級。force將會一直發(fā)揮作用直到另一個force對同一線網(wǎng)變量或寄存器變量執(zhí)行強迫賦值,或者直到這個線網(wǎng)變量或寄存器變量被釋放。(2)當(dāng)作用在某一寄存器上的force被釋放時,寄存器并無必要立刻改變其值。如果此時沒有進程連續(xù)賦值對這個寄存器賦值,則強制賦入的值會一直保留到下一個進程賦值語句的執(zhí)行。(3)當(dāng)作用在某個線網(wǎng)變量上的force被釋放時,該線網(wǎng)變量的值將由它的驅(qū)動決定,其值有可能會立刻更新。force強迫賦值語句常用于測試文件的編寫,調(diào)試時常需要強制對某些變量賦值,但不能用于模塊的行為建模(此時應(yīng)使用連續(xù)賦值語句)。3.11specify延遲說明塊specify延遲說明塊專門用于說明用戶設(shè)計的模塊的輸入與輸出之間的延遲。specify延遲說明塊既可用于行為描述模塊中,也可用于結(jié)構(gòu)描述模塊內(nèi)。specify延遲說明塊是模塊內(nèi)部一個獨立的結(jié)構(gòu)成分,它與過程塊、連續(xù)賦值語句、任務(wù)和函數(shù)定義、模塊和基元調(diào)用語句是并行的。在specify延遲說明塊內(nèi)可實現(xiàn):對一些延遲參數(shù)進行定義(specparam語句);對模塊輸入和輸出之間的信號延遲進行說明;借助時序檢驗系統(tǒng)任務(wù)對模塊輸入和輸出時序進行檢驗。specify延遲說明塊的格式如下:Specify[specify_item]endspecifyspecify_item可以是延遲參數(shù)說明specparam_declaration(如:延遲參數(shù)1=參數(shù)值1,延遲參數(shù)2=參數(shù)值2……);也可以是路徑說明path_declaration;還可以是時序檢驗系統(tǒng)system_timing_check。specify延遲說明塊的詳細應(yīng)用可參考相關(guān)文獻資料。3.12關(guān)于Verilog-2001新增的一些特性Verilog-2001在Verilog-1995標(biāo)準(zhǔn)中新增了產(chǎn)生語句、多維數(shù)組、更友好的文件I/O、更友好的配置控制、遞歸函數(shù)和任務(wù)等特性。1.generate產(chǎn)生語句generate循環(huán)中,允許產(chǎn)生模塊module和原語primitive的多個實例化,可以產(chǎn)生多個variable、net、task、function、continousassignment、initial和always。在generate語句中可以引入if-else和case語句以及for語句(引入for語句時,for(…;…;…)后必須有begin…end,且begin前必須給該過程起個名字),根據(jù)條件不同產(chǎn)生不同的實例化。generate語句還增加了generate、endgenerate、genvar、localparam關(guān)鍵字。其中g(shù)envar為新增數(shù)據(jù)類型,用來存儲正的integer。在generate語句中使用的索引(指針)index必須定義成genvar類型。localparam與parameter有些類似,不過其不能通過重新定義改變值。2.constantfunction常量函數(shù)constantfunction的定義與普通的function一樣,不過constantfunction只允許操作常量。3.indexedvectorpartselect標(biāo)示向量的部分選擇在Verilog—1995中,可以選擇向量的任一位輸出,也可以選擇向量的連續(xù)幾位輸出,連續(xù)幾位的始末數(shù)值的索引(指針)index必須是常量。而在Verilog-2001中,可以用變量作為標(biāo)示(指針)index,進行部分選擇partselect。4.多維數(shù)組Verilog-1995只允許一維數(shù)組,而Verilog-2001允許多維數(shù)組。在Verilog-1995中,不能從一維數(shù)組中取出其中的一位,而在Verilog-2001中,可以任意取出多維數(shù)組中的一位或連續(xù)幾位。5.符號運算在Verilog-1995中,integer數(shù)據(jù)類型為有符號類型,而reg和wire類型為無符號類型,而且integer

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論