verilog語言代碼設(shè)計(jì)規(guī)范_第1頁
verilog語言代碼設(shè)計(jì)規(guī)范_第2頁
verilog語言代碼設(shè)計(jì)規(guī)范_第3頁
verilog語言代碼設(shè)計(jì)規(guī)范_第4頁
verilog語言代碼設(shè)計(jì)規(guī)范_第5頁
已閱讀5頁,還剩50頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

verilog語言代碼設(shè)計(jì)規(guī)范

2011年12月

目錄

一、規(guī)范適用范圍..................................................4

1.1項(xiàng)目適用范圍---------------------------------------------------------4

1.2人員適用范圍.........................................................4

1.3編碼設(shè)計(jì)的成果形式--------------------------------------------------4

二、代碼書寫規(guī)范..................................................5

2.1模塊說明書寫規(guī)范------------------------------------------------------5

2.1模塊注釋書寫規(guī)范-----------------------------------------------------5

2.3變量名稱書寫規(guī)范.....................................................6

2.4代碼結(jié)構(gòu)書寫規(guī)范-----------------------------------------------------7

三、使用verilog語言的語法范圍.....................................8

3.1設(shè)計(jì)RTL代碼的語法范圍----------------------------------------------8

3.2設(shè)計(jì)仿真代碼的語法范圍.............................................10

四、使用verilog語言的結(jié)構(gòu)范圍....................................11

4.1系統(tǒng)設(shè)計(jì)文件的形式與使用方法---------------------------------------11

4.2模塊結(jié)構(gòu)劃分的標(biāo)準(zhǔn)..................................................12

4.3組合邏輯的代碼風(fēng)格-------------------------------------------------13

4.4時(shí)序邏輯的代碼風(fēng)格.................................................21

4.5仿真代碼的代碼風(fēng)格-------------------------------------------------27

五、使用受限范圍內(nèi)的語法或結(jié)構(gòu)要進(jìn)行的申請(qǐng)過程.................32

5.1受限的語法與結(jié)構(gòu)----------------------------------------------------32

5.2批準(zhǔn)使用的程序------------------------------------------------------32

二、代碼書寫規(guī)范

2.1模塊說明書寫規(guī)范

在開始子模塊設(shè)計(jì)時(shí),必須對(duì)子模塊的基本信息給予說明。說明的位置一

般在設(shè)計(jì)的開頭,使用注釋的形式用(/**/)說明該設(shè)計(jì)的作者、編寫日期、

版本號(hào)、在系統(tǒng)中的層次位置、基本功能描述等。其形式如下所示:

:

*1*?J**J*

"authorabc*

*date2005-5-12*

*version1.0*

*hibcrarchymcu-alu-adder*

*describe16bitadder*

q,wxKW%L?KWq.wxKWKW%w?j>

*r**T**T**T^*7**T**r**r**i**T**?**r**7**T**1^*T**r**T**r**?**1^*T**r**7**r**r**r**T^*r**?**T*<

說明的內(nèi)容要簡(jiǎn)潔清晰。使用/**/對(duì)將說明部分括起來是為了與普通注釋相區(qū)

別。

2.1模塊注釋書寫規(guī)范

注釋對(duì)項(xiàng)目團(tuán)隊(duì)關(guān)于設(shè)計(jì)的交流至關(guān)重要,好的設(shè)計(jì)總是會(huì)在恰當(dāng)?shù)牡胤?/p>

對(duì)語句或變量予以說明,沒有注釋的設(shè)計(jì)不是真正的工業(yè)級(jí)設(shè)計(jì),通篇的注釋同

沒有注釋?樣糟糕,會(huì)招代碼淹沒在無用的注釋之中。這?節(jié)給出書寫注釋的規(guī)

范。

如果設(shè)計(jì)中出現(xiàn)了一個(gè)新的變量,那么必須對(duì)這個(gè)新變量:給予注釋,對(duì)變

量的注釋應(yīng)該放在變量的定義之前,注釋應(yīng)該說明變量的物理意義或作用。其形

式如下:

該表明所連接單元的名稱,如timing_alu表示時(shí)序發(fā)生器發(fā)出的控制信號(hào)連接

ALU部件的控制端。針對(duì)為輸出端做賦值運(yùn)算的輸入連線它的名字應(yīng)該表達(dá)相

應(yīng)的物理意義,絕不要使用通用名如:a,b,c這樣的名字。這類連線適當(dāng)?shù)拿Q

如:add_a,add.bo參照名就是一個(gè)單元或?qū)嵗齾⒖嫉膸鞓?biāo)準(zhǔn)單元或原始設(shè)計(jì)

名,所以它的名字與庫單元或模塊名相同。單元與實(shí)例在synopsys的DC工具

中是不加區(qū)分的,這里也等同看待,它的名字可以用參照名為頭后加數(shù)字予以標(biāo)

識(shí)。如alul、accl等。如果設(shè)計(jì)的內(nèi)部有中間級(jí)寄存器,那么寄存器以實(shí)樂的

物理意義進(jìn)行命名,比如在乘法器中為分割關(guān)鍵路徑引入的中間級(jí)寄存器可以命

名為pipelinel_out等。

2.4代碼結(jié)構(gòu)書寫規(guī)范

好的代碼結(jié)構(gòu)可以清晰的看出設(shè)計(jì)的層次關(guān)系,進(jìn)而使結(jié)構(gòu)與設(shè)計(jì)者所要

表達(dá)的邏輯意圖一致,方便糾錯(cuò)和交流。代碼最基本的結(jié)構(gòu)有平行結(jié)構(gòu)和層次結(jié)

構(gòu),他們反映了代碼的隸屬關(guān)系,我們規(guī)定注釋語句與語句塊是一個(gè)層次的,這

意味著對(duì)模塊的注釋行(以〃開頭)必須在一行的頂頭開始寫。其他語句的層

次低于模塊定義和注釋,那么其他語句至少要向后縮退四個(gè)空格。語句塊中的語

句低于語句塊的定義,例如:

always@(posedgeelk)

begin

out<=in;

end

//endalways

語句塊中的語句塊和其他語句是同級(jí)的。語句塊結(jié)束應(yīng)該有注釋說明結(jié)束的語句

塊的名稱

例如:

always@(posedgeclklnegedgeclear)

begin

if(!clear)

begin

out<=61b000000;

end

else

begin

case(addr)

、SFR_A:

begin

out<=in;

end

endcase

end

end

三、使用verilog語言的語法范圍

3.1設(shè)計(jì)RTL代碼的語法范圍

verilog語言是一種通用的HDL(硬件描述語言),它的語法范圍包括了用

戶各種設(shè)計(jì)層級(jí)的需求,雖然語言本身對(duì)這種層級(jí)并沒有細(xì)致的區(qū)分,但因?yàn)樵O(shè)

計(jì)者編寫的代碼最終要使用具體的綜合工具綜合成實(shí)際電路,所以語言層級(jí)的劃

分不可避免的具有針對(duì)某種工具的特點(diǎn),我們這里的劃分依據(jù)是根據(jù)

DesignCompile綜合工具來定的。在論述的過程中我們常使用左值和右值的稱

謂,一般我們將賦值運(yùn)算符左側(cè)的變量稱作左值,右側(cè)的變量稱作右值,因此左

值具有位置屬性而右值具有數(shù)值屬性。右值的任何地方禁止出現(xiàn)“x”,左值在任

何情況下不可以為常量。在有些環(huán)境中也將左值稱做寫數(shù)據(jù),右值稱做讀數(shù)據(jù)。

在一個(gè)語句塊中不可對(duì)同一個(gè)左值賦兩次值,因?yàn)檫@樣會(huì)引起數(shù)據(jù)沖突(三態(tài)門

除外)。verilog語言可以描述四個(gè)設(shè)計(jì)層級(jí)的語法范疇,依次是:系統(tǒng)行為級(jí)、

模塊寄存器傳輸級(jí)(RTL)、電路門級(jí)、晶體管開關(guān)級(jí)。層級(jí)之間的轉(zhuǎn)換我們稱

之為綜合。目前業(yè)界的流行的做法是前端設(shè)計(jì)將RTL級(jí)綜合為門級(jí)網(wǎng)表。行為

級(jí)到門級(jí)的直接綜合還不成熟,另外,數(shù)字電路中的晶體管我們一般當(dāng)作開關(guān)來

對(duì)待,因此對(duì)它們具體的器件特性描述,并不是針對(duì)數(shù)字電路設(shè)計(jì)的verilog語

言所能及的。

系統(tǒng)行為級(jí)描述一般作為系統(tǒng)設(shè)計(jì)的輔助手段或建立系統(tǒng)仿真環(huán)境的語言

實(shí)現(xiàn)手段,在系統(tǒng)設(shè)計(jì)時(shí),設(shè)計(jì)人員一般使用行為級(jí)描述來建立系統(tǒng)數(shù)據(jù)流的直

觀表述,以助選定設(shè)計(jì)方案,劃分系統(tǒng)層次、確定模塊接口等。這個(gè)級(jí)別是設(shè)計(jì)

的最高抽象層,它不考慮設(shè)計(jì)的具體實(shí)現(xiàn),只是確定實(shí)現(xiàn)的可行性,和估計(jì)實(shí)現(xiàn)

的規(guī)模,因此系統(tǒng)設(shè)計(jì)時(shí)系統(tǒng)行為級(jí)描述不限制語言的種類,可以用verilog也

可用SystemC甚至C語言,它們只是幫助系統(tǒng)設(shè)計(jì)人員最終得到系統(tǒng)各個(gè)模

塊的端口列表和層級(jí)子模塊明確的功能定義。有些項(xiàng)目使用層級(jí)關(guān)系的原理圖來

說明系統(tǒng)結(jié)構(gòu),子模塊使用黑盒來代替。一些小項(xiàng)目這個(gè)過程可以省略直接由編

碼人員來實(shí)現(xiàn)。行為級(jí)描述也可以建立系統(tǒng)的仿真環(huán)境,它也是實(shí)際工作中行為

級(jí)最重要的作用。這時(shí)一般將被仿真的模塊作為實(shí)例,仿真環(huán)境為實(shí)例提供各種

輸入向量,設(shè)計(jì)人員觀察輸出結(jié)果分析被測(cè)實(shí)例的功能正確與否,如有錯(cuò)誤可以

定位錯(cuò)誤以便修正。

HDL的寄存器傳輸級(jí)(RTL)一般用于對(duì)電路子模塊的描述,它一般由四

種基本結(jié)構(gòu)組成:寄存器、計(jì)數(shù)器、選擇器、算術(shù)邏輯運(yùn)算單元。其中寄存器對(duì)

應(yīng)always語句塊,選擇器對(duì)應(yīng)if…else…語句塊,算術(shù)運(yùn)算符加(+)、減(-)

可以作為RTL代碼直接綜合,乘(*)、除(/)如果沒有特殊的性能要求也可以

受限使用,邏輯運(yùn)算符與、或、非是RTL代碼。計(jì)數(shù)器一般作為各種狀態(tài)標(biāo)志

的產(chǎn)生器。我們規(guī)定RTL的抽象級(jí)別是邏輯抽象,所以它應(yīng)該反應(yīng)的是各種器

件的邏輯行為和邏輯結(jié)構(gòu),而不是器件的物理組成(門級(jí)連接),另外它對(duì)應(yīng)的

是具體的物理實(shí)體,而不是理想的邏輯關(guān)系(沒有實(shí)物對(duì)應(yīng)的邏輯抽象和理想的

信號(hào)時(shí)空順序)o在邏輯抽象級(jí)我們一般將組合電路看作連線之間的算術(shù)邏輯賦

值運(yùn)算,將時(shí)序電路看作由寄存器存儲(chǔ)組合邏輯產(chǎn)生結(jié)果的結(jié)構(gòu)。所以RTL級(jí)

的四種基本結(jié)構(gòu)的組合變化足以構(gòu)建各種器件千變?nèi)f化的邏輯結(jié)構(gòu)。我們規(guī)定對(duì)

wire型變量的賦值使用連續(xù)賦值語句(assign),并且一律使用阻塞型賦值(=),

組合邏輯中always塊中的reg型變量一律使用阻塞型賦值,在時(shí)序邏輯中使用

非阻塞型賦值(<=)oRTL代碼中要求不使用循環(huán)語句,所有涉及循環(huán)賦值的部

分一律將循環(huán)打散采用顯式賦值。代碼中不要出現(xiàn)函數(shù)、任務(wù)的相關(guān)語句塊,所

有需要出現(xiàn)的地方使用module編寫模塊,再調(diào)用實(shí)例。沒有實(shí)物對(duì)應(yīng)的initial

語句塊以及具有理想信號(hào)時(shí)空順序的語句,如顯式指定延遲語句不能在RTL代

碼中出現(xiàn)。如果有實(shí)例調(diào)用那么實(shí)例的引腳連接采用端口對(duì)應(yīng)禁止使用位置對(duì)

應(yīng)。因?yàn)榫C合工具沒有與

“X”對(duì)應(yīng)的狀態(tài),所以設(shè)計(jì)中任何地方的值禁止出現(xiàn)“X”,如果對(duì)總線的

某幾位不加考慮,那么位選擇時(shí)只出現(xiàn)要考慮的部分。對(duì)于重要的有含義的常量

不要直接在設(shè)計(jì)中使用具體值,而應(yīng)該用參數(shù)定義使常量參數(shù)化。

為了便于查找我們將綜合工具不能綜合的關(guān)鍵字列舉如下:

?initial

?循環(huán)語句:

>repeat

>forever

>while

Afor的非結(jié)構(gòu)用法

?數(shù)據(jù)類型

>event

>real

>timeUDPs

?fork---join塊

?wait

?過程連續(xù)賦值語句

>assign和deassign

>force和release

?部分操作符

A===

>!==

以上的關(guān)鍵字,綜合工具不支持,它們也不是我們?cè)O(shè)計(jì)RTL代碼所必須的,我

們規(guī)定設(shè)計(jì)的RTL代碼一定不能含有上面列出的條目。

3.2設(shè)計(jì)仿真代碼的語法范圍

在前面已經(jīng)簡(jiǎn)單談及了仿真代碼的編寫問題,闡明了仿真代碼實(shí)際上是

HDL行為級(jí)描述的一種應(yīng)用。它是一種不考慮實(shí)際硬件的實(shí)現(xiàn)只為產(chǎn)生仿真向

量的理想的邏輯抽象,它所產(chǎn)生的信號(hào)可以具有理想的時(shí)空順序。它的邏輯范疇

不受具體物理器件實(shí)現(xiàn)的限制。我們規(guī)定仿真代碼中有關(guān)信號(hào)時(shí)間順序的安排應(yīng)

放在initial語句塊中,被測(cè)模塊的實(shí)例引腳連接使用端口對(duì)應(yīng)風(fēng)格。仿真代碼

可以使用循環(huán)結(jié)構(gòu)、可以使用函數(shù)、任務(wù)、用戶定義原語。仿真代碼產(chǎn)生的仿真

向量要具有典型型,向鼠的覆蓋面要大,對(duì)于邏輯邊界一定要有對(duì)應(yīng)的仿真向量,

對(duì)于可能的數(shù)據(jù)路徑也要找出相應(yīng)的輸入向量遍歷它。仿真代碼包括兩個(gè)部分,

分別是,虛擬器件建模或仿真環(huán)境建立。虛擬器件一般指ROM、RAM存儲(chǔ)器

件或沒有用RTL代碼實(shí)現(xiàn)的行為級(jí)抽象器件的建模。仿真環(huán)境一般包括各器件

的實(shí)例調(diào)用、時(shí)鐘的模型、和各信號(hào)的時(shí)空安排。為了對(duì)信號(hào)進(jìn)行特定的時(shí)空安

排我們可以在verilog語法范圍內(nèi)使用對(duì)信號(hào)的數(shù)值和出場(chǎng)順序進(jìn)行任意邏輯的

處理,并且我們可以對(duì)信號(hào)的狀態(tài)進(jìn)行記錄、觀測(cè)、調(diào)整,仿真工具一般為我們

內(nèi)置了不少系統(tǒng)調(diào)用,常用的調(diào)用我們列舉如下:

//找到當(dāng)前的仿真時(shí)間

2)$display,$monitor〃顯示和監(jiān)視信號(hào)值的變化

3)$stop//暫停仿真

4)$finish〃結(jié)束仿真

5)$readmemb//從外部文件向內(nèi)部寄存器讀數(shù)據(jù)

6)$dumpfile//打開記錄數(shù)據(jù)變化的數(shù)據(jù)文件

7)$dumpvars;〃選擇需要記錄的變量

8)$dumpflush;〃把記錄在數(shù)據(jù)文件中的資料轉(zhuǎn)送到硬盤保

系統(tǒng)調(diào)用的具體用法,和其他系統(tǒng)調(diào)用,請(qǐng)參見具體工具的使用手冊(cè),關(guān)

于時(shí)鐘的建模部分請(qǐng)參見4.5節(jié),我們一般將信號(hào)的時(shí)空順序和信號(hào)的初始化操

作放在initial語句塊中表達(dá)。

四、使用verilog語言的結(jié)構(gòu)范圍

4.1系統(tǒng)設(shè)計(jì)文件的形式與使用方法

系統(tǒng)設(shè)計(jì)文件是編碼設(shè)計(jì)人員的設(shè)計(jì)依據(jù),一般由系統(tǒng)設(shè)計(jì)人員確定,它

的內(nèi)容至少應(yīng)該包括子模塊的功能定義,模塊的端口定義、模塊的時(shí)序要求、和

項(xiàng)目的進(jìn)度安排,無論項(xiàng)目開發(fā)采用增量式開發(fā)模式還是采用流水線開發(fā)模式,

對(duì)于編碼人員來說都是不需要關(guān)心的,因?yàn)樵隽渴阶钚≡畏ㄅc普通的流水線模

式最大的不同是每次增量需要設(shè)計(jì)人員考慮的設(shè)計(jì)規(guī)模是不同的,一般增量式開

發(fā)過程每次增量的設(shè)計(jì)目標(biāo)都是在可以把握的范圍之內(nèi)的。需要設(shè)計(jì)的子模塊功

能在一次增量的過程中是不變的,當(dāng)然不同的增量級(jí)別和迭代級(jí)別要考慮的功能

和性能要求又是不同的。系統(tǒng)設(shè)計(jì)文件中對(duì)子模塊的描述可以用層級(jí)式的原理圖

方式也可以用verilog語言配合文字給予說明的文本文件,編碼設(shè)計(jì)人員拿到系

統(tǒng)設(shè)計(jì)文件后,應(yīng)該可以明確自己工作的職責(zé),如明確需要設(shè)計(jì)的是什么功能模

塊、明確模塊的輸入輸出端口是什么,模塊與外部模塊的耦合關(guān)系、是否本模塊

與其他模塊有編寫的順序問題、模塊需不需要再有層級(jí)關(guān)系以及模塊必須交付的

時(shí)間等。編碼人員在充分理解了以上這些問題之后再開始具體的編碼。

4.2模塊結(jié)構(gòu)劃分的標(biāo)準(zhǔn)

模塊結(jié)構(gòu)的劃分不僅在系統(tǒng)級(jí)而且在編碼級(jí)都必須仔細(xì)考慮,一般編碼級(jí)

的劃分是對(duì)子模塊的再次細(xì)分。因?yàn)槟K的結(jié)構(gòu)直接影響了綜合后電路的質(zhì)量,

所以劃分結(jié)構(gòu)必然要考慮綜合工具對(duì)各種結(jié)構(gòu)的綜合效率。verilog語言可以用

以下結(jié)構(gòu)創(chuàng)建層級(jí)。一般module語句定義了新層,參照的實(shí)例在模塊中創(chuàng)建

了一個(gè)次層級(jí),實(shí)例間具有層級(jí)的邊界。算術(shù)運(yùn)算符(+,、…)暗指的電路能

創(chuàng)建一個(gè)次層級(jí)。always語句不創(chuàng)建層級(jí)關(guān)系。劃分必須按一定的準(zhǔn)則去做,

我們將這些準(zhǔn)則列舉如下:

?盡量不要將組合邏輯劃分成一個(gè)獨(dú)立的模塊。因?yàn)镈C必須保留端口的

定義。邏輯優(yōu)化不能穿越設(shè)計(jì)的邊界。因此綜合優(yōu)化的效率可能會(huì)很低,

電路的質(zhì)量會(huì)很差。除非電路是純組合邏輯的特殊情況,否則我們一般

以寄存器為輸出邊界。

?消除不必要的層級(jí),避免粘連邏輯。我們將實(shí)例與實(shí)例通過門單元進(jìn)行

連接的邏輯叫做粘連邏輯。因?yàn)镈C必須保留端口的定義,所以DC綜

合時(shí)不能將粘連邏輯吸收到任何模塊內(nèi)部進(jìn)行優(yōu)化,好的劃分應(yīng)該盡量

消除不必要的層級(jí),使優(yōu)化充分發(fā)揮作用。

?盡量平衡各邏輯塊的尺寸和模塊內(nèi)部的數(shù)據(jù)傳輸路徑長(zhǎng)度。劃分的太細(xì)

不利于優(yōu)化,但也不是劃分的塊越大越好,如果邏輯塊太大,綜合運(yùn)行

的時(shí)間可能非常長(zhǎng),模塊內(nèi)部的關(guān)鍵路徑如果出現(xiàn)時(shí)序異常將很難修

正,模塊的維護(hù)和團(tuán)隊(duì)的交流將出現(xiàn)巨大隙礙。

?設(shè)計(jì)至少應(yīng)該有三個(gè)層級(jí)。三個(gè)層級(jí)依次為:頂層、中間級(jí)、內(nèi)核級(jí)。

一般頂層只包含實(shí)例的調(diào)用,中間級(jí)是對(duì)一些可復(fù)用子模塊的調(diào)用和相

關(guān)處理,內(nèi)核級(jí)一般是最底層,他包括設(shè)計(jì)的核心處理部件、項(xiàng)目可復(fù)

用的模塊等。

?如果設(shè)計(jì)中有異步電路一般應(yīng)該將異步電路單獨(dú)設(shè)計(jì),并且一個(gè)時(shí)鐘對(duì)

應(yīng)一個(gè)模塊,模塊與模塊之間的握手連接在異步電路的頂層處理。

按照以上準(zhǔn)則得到的劃分結(jié)構(gòu)可能不止一個(gè),設(shè)計(jì)人員必須在不同的劃分

中進(jìn)行選擇得到最佳的方案。

4.3組合邏輯的代碼風(fēng)格

這一節(jié)和下一節(jié)將對(duì)具體器件用verilog語言實(shí)現(xiàn)的代碼風(fēng)格進(jìn)行規(guī)范。所

謂代碼風(fēng)格就是具體硬件使用verilog語言實(shí)現(xiàn)的算法。這里需要強(qiáng)調(diào)的是設(shè)計(jì)

人員必須用硬件的思維來編寫代碼。

組合邏輯是可以認(rèn)為是算術(shù)邏輯的賦值運(yùn)算。一般情況下組合邏輯在連續(xù)

賦值語句中實(shí)現(xiàn),因此它的賦值對(duì)象不能是reg類型的變量,另外不能使用非阻

塞型的賦值符號(hào)。由于與非、或非的物理實(shí)現(xiàn)要比與、或簡(jiǎn)單,因此考慮到速度

與最終芯片的面積我們優(yōu)先選擇與非、或非的邏輯。如果必須用語句塊實(shí)現(xiàn)組合

邏輯電路那么,組合邏輯也可以放到always的語句塊中,在always語句塊中

的左值必須是reg類型,組合邏輯的always語句塊一般使用阻塞型賦值,如

果一定要在電路中體現(xiàn)數(shù)據(jù)傳輸路徑,那么在使用阻塞型賦值時(shí)必須考慮中間變

量(既充當(dāng)左值又充當(dāng)右值的變量)的傳輸路徑問題。在非阻塞賦值中,因?yàn)樽x

變量:的時(shí)間發(fā)生在變量值改變之前,所以每出現(xiàn)一個(gè)中間變量則傳輸路徑會(huì)多一

級(jí),中間變量會(huì)被保留,因此中間變量也要在always事件列表中指明。但是使

用阻塞型賦值時(shí),讀變量發(fā)生在變量值改變之后,所以中間變量常常是被前級(jí)變

量替代了或與出現(xiàn)中間變量的位置直接與前級(jí)變量相連傳輸路徑不再保留中間

變量,為防止電路出現(xiàn)仿真結(jié)果在綜合前后不一致的現(xiàn)象,在always語句塊中

使用阻塞型賦值時(shí)右值部分的變量和條件控制信號(hào)在always事件列表中要顯式

指明,但是中間變量不必在列表中出現(xiàn)。在任何情況下都不要在一個(gè)語句塊中對(duì)

同一個(gè)左值多次賦值。因?yàn)檫@樣會(huì)因?yàn)楦?jìng)爭(zhēng)冒險(xiǎn)而產(chǎn)生數(shù)據(jù)沖突。為了將代碼的

編寫規(guī)范化我們將選擇器、寄存器、計(jì)數(shù)器的結(jié)構(gòu)分別給予規(guī)范。

選擇器:

在always語句塊中如果出現(xiàn)選擇結(jié)構(gòu),那么它對(duì)應(yīng)的是一個(gè)多路選擇器,

當(dāng)我們使用if…else語句實(shí)現(xiàn)這種結(jié)構(gòu)時(shí),一般情況下我們推薦if和else要匹

配。以下三種結(jié)構(gòu)她們?cè)谶壿嬌鲜堑葍r(jià)的我們要求使用第一種。

always@(aorborsei)

begin

if(sei)

begin

out=a;

end

else

begin

out=b;

end

end

always@(aorborsei)

begin

out=b;

if(sei)

begin

out=a;

end

end

always@(aorborsei)

begin

out=(sei)?a:b;

end

if語句本身會(huì)引入電路的優(yōu)先級(jí)結(jié)構(gòu),不同的編寫風(fēng)格會(huì)出現(xiàn)不同的優(yōu)先

級(jí)結(jié)果,我們分別給予解釋。

always@(sel_aorsel_borsel_cor

aorborcord)

begin

out=d;

if(sel_a)

begin

out=a;

end

if(sel_b)

begin

out=b;

end

if(sel_c)

begin

out=c;

end

end

這種結(jié)構(gòu)因?yàn)檫壿媹?zhí)行的先后問題,結(jié)果的產(chǎn)生發(fā)生在所有if語句塊判斷完

成后,因此優(yōu)先級(jí)是從下往上的。既最后完成判斷的語句塊它的路徑離輸出湍是

最近的優(yōu)先級(jí)也最高。

always@(sel_aorsel_borsel_coraorborcord)

begin

if(sel_a)

begin

out=a;

end

elseif(sel_b)

begin

out=b;

end

elseif(sel_c)

begin

out=c;

end

else

begin

out=d;

end

end

這種結(jié)構(gòu)只要有一個(gè)條件發(fā)生匹配if語句立即完成,跳至整個(gè)if結(jié)構(gòu)的出

口,因此它的優(yōu)先級(jí)是從上往下的。我們要求使用第二種優(yōu)先結(jié)構(gòu)的寫法。

當(dāng)遇到不需要優(yōu)先級(jí)的設(shè)計(jì)時(shí)我們一般選擇case結(jié)構(gòu),這是一種在語法邏

輯上沒有優(yōu)先級(jí)的結(jié)構(gòu),在case選擇分支中的所有結(jié)構(gòu)塊他們?cè)诘匚簧鲜瞧叫?/p>

的。其結(jié)構(gòu)如下所示。

always@(seloraorborcord)

begin

case(sei)

2'b00:out=a;

2'b01:out=b;

2'blO:out=c;

2'bl1:out=d;

endcase

end

使用case語句應(yīng)該注意以下幾個(gè)問題。首先,case語句的狀態(tài)表達(dá)式不同

于if語句的布爾表達(dá)式,case語句狀態(tài)表達(dá)式中的包含的各種狀態(tài)在它的狀態(tài)項(xiàng)

中都應(yīng)該有明確的對(duì)應(yīng),如果狀態(tài)項(xiàng)中的狀態(tài)少于狀態(tài)表達(dá)式包含的狀態(tài),那么

綜合后的電路可能會(huì)引入鎖存,另一方面如果狀態(tài)表達(dá)式中包含的狀態(tài)少于狀態(tài)

項(xiàng)中的狀態(tài)那么意味著狀態(tài)表達(dá)式的一個(gè)值會(huì)開啟多個(gè)狀態(tài)項(xiàng)中的語句塊這種

情況叫狀態(tài)項(xiàng)重疊。發(fā)生狀態(tài)項(xiàng)重疊的case語句不再具有無優(yōu)先級(jí)的特性,這

使多個(gè)開啟的狀態(tài)項(xiàng)語句塊依據(jù)編寫的順序具有從上而下的優(yōu)先級(jí),具有和

if…else…語句一樣的效用。其結(jié)構(gòu)如下所示:

always@(aorborcord)

begin

case(1'bl)

sel_a:out=a;

sel_b:out=b;

sel_c:out=c;

default:out=d;

endcase

end

它和if…else…結(jié)構(gòu)是等價(jià)的。

if(sel_a)

begin

out=a;

end

elseif(sel_b)

begin

out=b;

end

elseif(sel_c)

begin

out=c;

end

else

begin

out=d;

end

因此為了使case語句無優(yōu)先級(jí)結(jié)構(gòu),并且不出現(xiàn)鎖存,我們必須使?fàn)顟B(tài)項(xiàng)

中的狀態(tài)與狀態(tài)表達(dá)式所能包含的狀態(tài)完全一致。其中最后一個(gè)狀態(tài)或幾個(gè)狀態(tài)

可以不顯式出現(xiàn)而在default分支中表達(dá)。具有這種結(jié)構(gòu)的case語句我們稱做全

case語句,我們要求在描述沒有優(yōu)先級(jí)結(jié)構(gòu)的多路選擇器時(shí)使用全case語句。

一般情況下我們不使用casex和casez這樣的語句,禁止出現(xiàn)“?”、“x”這種

不確定狀態(tài)的表達(dá),因?yàn)榫C合工具沒有與不確定狀態(tài)相對(duì)應(yīng)的值。因此我們要求

語句中的狀態(tài)一定要明確只能為"0”"1”“z”(2”只在三態(tài)門中出現(xiàn))。

循環(huán)結(jié)構(gòu)雖然具有簡(jiǎn)化編寫工作量的優(yōu)勢(shì),但是當(dāng)使用阻塞賦值或非阻塞賦

值時(shí)會(huì)增加其邏輯傳輸級(jí)的復(fù)雜度,并且綜合工具在綜合以前會(huì)將循環(huán)部分打散

再執(zhí)行綜合過程這樣綜合效率會(huì)降低,因此我們要求RTL文件不允許使用循環(huán)結(jié)

構(gòu),其循環(huán)部分一律手工打散逐項(xiàng)輸入。但是對(duì)行為級(jí)的描述我們并不加這種限

制。需要說明的是,對(duì)于仿真代碼中的循環(huán)體一定要注意循環(huán)的邊界必須是可以

算出的具體值,循環(huán)不能使用邊沿觸發(fā)的事件列表。

函數(shù)、任務(wù)結(jié)構(gòu)也是我們?cè)赗TL代碼中禁止使用的,因?yàn)榫C合時(shí)它只是將相

關(guān)的結(jié)構(gòu)放在調(diào)用的地方,把函數(shù)的輸出作為右值進(jìn)行賦值。這并不引入物理的

層級(jí)邊界,與邏輯上的函數(shù)是有層級(jí)邊界的相矛盾,因此為了邏輯與物理的一致

性我們?nèi)∠麑?duì)他們的使用。

當(dāng)設(shè)計(jì)中需要雙向總線,選擇輸出或異步設(shè)計(jì)的時(shí)候設(shè)計(jì)人員往往需要借助

三態(tài)門來實(shí)現(xiàn),三態(tài)門具有“0”、“1”、“z”三種狀態(tài),因?yàn)槿龖B(tài)門中“z”

狀態(tài)與其他狀態(tài)邏輯運(yùn)算后結(jié)果不變,因此,三態(tài)門是電路描述中唯一可以在一

個(gè)語法層次為同一個(gè)左值多次賦值的結(jié)構(gòu),綜合工具不會(huì)檢查這種情況下的數(shù)據(jù)

沖突問題。為了不引起綜合前后仿真結(jié)果的不同我們規(guī)定,三態(tài)門一律使用如下

的連續(xù)賦值語句:

assignout=(sel_a)?a:l'bz;

并且遇到為同一個(gè)左值多次賦值的描述時(shí)使用如F結(jié)構(gòu):

assignout=(sel_a)?a:l'bz;

assignout=(!sel_b)?b:l'bz;

使用這種結(jié)構(gòu)設(shè)計(jì)人員一定要小心。

設(shè)計(jì)中雙向端口往往是不能避免的,雙向端口具有既能輸入又能輸出的特

點(diǎn),要讓雙向端口不會(huì)發(fā)生數(shù)據(jù)沖突是設(shè)計(jì)人員的責(zé)任。常用的雙向端口有兩種

基本的結(jié)構(gòu),一種是輸入與輸出是互斥的,另一種是輸入常通,輸出選通。這兩

種結(jié)構(gòu)對(duì)應(yīng)不同的描述,分別如F所示:

modulebidi_module(d_port,inc,out_c,received,send);

inoutd_port;

inputinc,outc,send;

outputreceived;

assignd_port=(outc)?send:1'bz;

assignreceived=(inc)?d_port:l'bz;

endmodule;

modulebidi_module(d_port,outc,received,send);

inoutd_port;

inputoutc,send;

outputdata_received;

assignd_port=(outc)?send:l'bz;

assignreceived=d_port;

endmodule;

選用結(jié)構(gòu)時(shí)一定要注意描述上的差異,第二種結(jié)構(gòu)的第二個(gè)連續(xù)賦值語句沒三態(tài)

門意味著d_port雙向端口輸入方向是常通的。三態(tài)門與雙向端口的表達(dá)可以認(rèn)

為也是選擇器的一種實(shí)際形式。

算術(shù)運(yùn)算、關(guān)系運(yùn)算與邏輯運(yùn)算:

算術(shù)運(yùn)算、關(guān)系運(yùn)算與邏輯運(yùn)算,包括加、減、乘、移位、大于、小于、

等于、大于等于、小于等于、與、或、非、異或等以及它們的組合。這里需要說

明的是算術(shù)運(yùn)算的綜合得宜于DC內(nèi)部DesignWare庫的支持,從IP的角度來看,

算術(shù)運(yùn)算屬于IP復(fù)用。一個(gè)加號(hào)(+)或一個(gè)乘號(hào)即對(duì)應(yīng)相應(yīng)位數(shù)的一個(gè)加法器

或乘法器實(shí)例調(diào)用。目前的綜合工具不支持除法、求模以及需運(yùn)算,當(dāng)然它們可

以用其他手段來實(shí)現(xiàn)。如果系統(tǒng)要求高性能的加法器、乘法器我們要求手工實(shí)現(xiàn),

或選用高性能IP而不是直接調(diào)用DesignWare庫中的IP。

因?yàn)橥辔坏乃阈g(shù)運(yùn)算電路所產(chǎn)生的實(shí)際電路門數(shù)較多,如果設(shè)計(jì)時(shí)對(duì)

電路的效率考慮不周,則會(huì)帶入很多冗余結(jié)構(gòu),并使電路的傳輸路徑非常長(zhǎng)。我

們要求設(shè)計(jì)人員使用加乘等規(guī)模較大的算術(shù)運(yùn)算結(jié)構(gòu)時(shí),必須滿足綜合工具資源

共享的要求。綜合工具對(duì)代碼優(yōu)化后所得的資源共享結(jié)構(gòu)并不能由編碼設(shè)計(jì)人員

自己決定,因此編碼設(shè)計(jì)人員只需要將設(shè)計(jì)的代碼滿足綜合工具優(yōu)化共享的要求

就可以了不需要顯式在代碼中固定結(jié)構(gòu)。一般綜合工具對(duì)滿足以下三點(diǎn)要求的代

碼進(jìn)行資源優(yōu)化:第一,需要資源共享優(yōu)化的代碼必須在同一個(gè)module中。第

二,需要資源共享優(yōu)化的代碼必須在同一個(gè)always塊中,第三,需要資源共享

優(yōu)化的代碼必須在一個(gè)if

…else…或case語法結(jié)構(gòu)(注意不是語句塊)中。綜合工具不會(huì)跨越語法

結(jié)構(gòu)進(jìn)行資源優(yōu)化。我們以加法運(yùn)算舉例如下:

moduleshare(out,sel,a,b,c,d);

inputsel,a,b,c,d;

output[1:0]out;

reg[l:0]out

always@(sel,a,b,c,d)

begin

if(sei)

begin

out=a+b;

end

else

begin

out=c+d;

end

end

endmodule

使用這種結(jié)構(gòu)設(shè)計(jì)的選擇加法運(yùn)算電路,綜合后并不會(huì)產(chǎn)生兩個(gè)加法器,而是先

通過一個(gè)選擇器,選出需要加的信號(hào),再通過一個(gè)加法器對(duì)信號(hào)完成加運(yùn)算。人

為的編寫資源共享代碼,并不會(huì)產(chǎn)生更好的效果。比如我們寫如下代碼:

moduleshare(out,sel,a,b,c,d);

inputsel,a,b,c,d;

output[1:0]out;

reg[l:0]out

always@(sel,a,b,c,d)

begin

if(sei)

begin

mux_l=a;

mux_2=b;

end

else

begin

mux_l=c;

mux_2=d;

end

out=mux_l+mux_2;

end

endmodule

它的綜合結(jié)果并不比上面的代碼效率高,是否資源共享任然需要檢查是否滿足共

享優(yōu)化的條件。我們?cè)倏匆粋€(gè)例子:

always@(add_aboraorboreorf)

begin

outc=8'bO;

out_d=8'bO;

if(add_ab)

begin

out_c=a+b;

end

else

begin

out_d=e+f;

end

end

這個(gè)例子中兩個(gè)加運(yùn)算符的左值和右值均不相同,但它們?cè)谝粋€(gè)語法結(jié)構(gòu)中,因

此綜合工具可以對(duì)他們進(jìn)行資源共享。其電路結(jié)構(gòu)如下所示:

AEBF

Add_ABAddAB

+

另外,如果我們需要連加運(yùn)算,我們必須考慮傳輸路徑的長(zhǎng)度,特別需要

說明的是括號(hào)對(duì)傳輸路徑的組織有很大影響。我們看看下面的語句:

data_out=data_a+data_b+data_c+data_d;

這條語句會(huì)形成三個(gè)串聯(lián)的加法器結(jié)構(gòu)。傳輸路徑延遲無疑會(huì)是三個(gè)加法器延遲

之和。但是通過人為組合,傳輸路徑會(huì)改變,如F面的語句。

data_out=(data_a+data_b)+(data_c+data_d);我們通過給綜合工具顯

式指定數(shù)據(jù)傳輸方向,使得到的電路結(jié)構(gòu)只包含曲級(jí)加法器傳輸延遲。我們要求

設(shè)計(jì)人員在寫連加、連乘等會(huì)引入長(zhǎng)傳輸路徑的結(jié)構(gòu)時(shí)必須用括號(hào)指定數(shù)據(jù)的傳

輸方向。

4.4時(shí)序邏輯的代碼風(fēng)格

上一節(jié)闡述了組合邏輯的代碼風(fēng)格,我們以此為基礎(chǔ)進(jìn)一步闡述時(shí)序邏輯

的代碼風(fēng)格,我們知道在邏輯描述級(jí)別時(shí)序邏輯就是將組合邏輯的結(jié)果用寄存器

再暫存的結(jié)構(gòu),這種結(jié)構(gòu)與組合邏輯結(jié)構(gòu)具有本質(zhì)的不同,因?yàn)樗梢詫⒏鱾€(gè)階

段的處理狀態(tài)保存下來,對(duì)這些狀態(tài)再次處理,而這樣的工作對(duì)組合邏輯的電路

來說是無法做到的。再處理這些中間狀態(tài)需要各狀態(tài)的數(shù)據(jù)都準(zhǔn)備就緒,因此有

了時(shí)序的概念。毫無疑問時(shí)序邏輯的核心器件時(shí)序器件,在一個(gè)時(shí)鐘內(nèi)對(duì)信號(hào)的

處理由組合邏輯完成,所以時(shí)序邏輯的代碼風(fēng)格所規(guī)范的就是時(shí)序器件的產(chǎn)生算

法。我們規(guī)定時(shí)序邏輯的always塊一律使用非阻塞型賦值,很明顯寄存器前的

組合邏輯在always塊作為是右值被表示,語句塊中的右值一般是表達(dá)式或?qū)ζ?/p>

他變量的讀數(shù)據(jù)操作。

寄存器:

我們先來闡述寄存器的代碼風(fēng)格。直觀上我們可以把寄存器看作是觸發(fā)器

的陣列,它的基本單元是觸發(fā)器,觸發(fā)器是邊沿觸發(fā)的時(shí)序器件,我們規(guī)定觸發(fā)

器的時(shí)鐘端采用上升沿觸發(fā),復(fù)位信號(hào)、置位信號(hào)采用下降沿觸發(fā)。觸發(fā)器不僅

具有存儲(chǔ)能力而且具有一定的邏輯運(yùn)算能力,為了邏輯上的敘述方便我們將它們

的邏輯運(yùn)算能力劃歸入組合邏輯部分。構(gòu)成如下結(jié)構(gòu):

10_BE_SVNTHES!ZED

elk

圖中我們看到觸發(fā)器與觸發(fā)器之間的部分都是組合邏輯。為了得到以上結(jié)

構(gòu)的實(shí)現(xiàn)我們要求寄存器一律以D觸發(fā)器實(shí)現(xiàn)。觸發(fā)器必須具有復(fù)位端(clear).

時(shí)鐘端(Clk)o電路必須異步清零,并且復(fù)位信號(hào)的優(yōu)先級(jí)高于時(shí)鐘端,觸發(fā)

器的時(shí)鐘信號(hào)不容許與其他普通信號(hào)發(fā)生邏輯運(yùn)算。如果必要觸發(fā)器還可以具有

置位端(set),此時(shí)要求置位端的優(yōu)先級(jí)高于復(fù)位端。這兩種結(jié)構(gòu)如F所示:

always@(posedgeclkornegedgeclear)

begin

if(!clear)

begin

data_out<=1'bO;

end

else

begin

dataout<=datain;

end

end

always@(posedgeelkornegedgeclearornegedgeset)

begin

if(!set)

begin

data_out<=1'bl;

end

elseif(Iclear)

begin

dataout<=1'bO;

end

else

begin

dataout<=datain;

end

end

電路在任何時(shí)候都禁止置位和復(fù)位信號(hào)同時(shí)有效。我們要求,對(duì)于時(shí)序電

路的always模塊它的事件敏感表只能包含邊沿事件,不能將邊沿事件和非邊沿

事件在一個(gè)事件敏感表中表示,并且事件敏感表中只能包含時(shí)鐘事件(或可以當(dāng)

作時(shí)鐘事件的控制事件)、復(fù)位和置位事件。

在低功耗設(shè)計(jì)中,設(shè)計(jì)者要盡量降低所有可能節(jié)省的功耗,在時(shí)序電路中

時(shí)鐘信號(hào)因?yàn)楦叻€(wěn)定和高頻率所消耗的功耗是很大的,所以有必要把不工作的局

部電路的時(shí)鐘關(guān)斷,這就出現(xiàn)了門控時(shí)鐘。對(duì)于寄存器來說門控時(shí)鐘與普通時(shí)鐘

并沒有差別,所不一樣的是,普通時(shí)鐘是不允許時(shí)鐘參與邏輯運(yùn)算的,而門控時(shí)

鐘在一定的條件下可以與特殊的信號(hào)參與邏輯運(yùn)算。它的描述如下所示:

assigngated_clk=elk&enable;

always@(posedgegatedelkornegedgeclear)

begin

if(!clear)

begin

out<=8'bO:

end

else

begin

out<=out+8'bl;

end

end

門控時(shí)鐘的時(shí)鐘端命名必須予以標(biāo)明(gated_clk),如果時(shí)序電路使用門控時(shí)

鐘那么對(duì)可測(cè)性設(shè)計(jì)是不利的,因?yàn)椋灰T控時(shí)鐘關(guān)斷用戶是沒有辦法控制它

的,另外門控時(shí)鐘也給靜態(tài)時(shí)序分析帶來了麻煩,因?yàn)镾TA需要用時(shí)鐘來分組,

如果時(shí)鐘信號(hào)在某處與門連接那么它的傳輸路徑將被打斷,這時(shí)我們就得用其他

的辦法來實(shí)現(xiàn)。具體做法請(qǐng)參見《時(shí)序分析規(guī)范》,考慮到這些利與弊,我們要

求除非系統(tǒng)方案選用低功耗設(shè)計(jì),否則禁止使用門控時(shí)鐘。如果在使用門控時(shí)鐘

的同時(shí)又要求可測(cè)性設(shè)計(jì)這時(shí)我們使用以下結(jié)構(gòu)來實(shí)現(xiàn):

modulegated_clock(clock,clear,

test_mode,//TestModeSelect

out);

assigngated_clock=clock&(Enable|Test_Mode);

always@(posedgegated_clockornegedgeclear)

begin

if(Iclear)

begin

out<=8'bO;

end

else

begin

out<=out+8'bl;

end

end

endmodule

在這種情況下如果用戶選用測(cè)試模式那么門控時(shí)鐘的開關(guān)門將失去作用。

具有可測(cè)性功能的門控時(shí)鐘和門控時(shí)鐘一樣,我們都限制他們的使用。

邏輯電路的所有狀態(tài)都應(yīng)該在設(shè)計(jì)人員的控制之下或預(yù)料之中,但是不熟

練的設(shè)計(jì)人員往往對(duì)電路的所有狀態(tài)考慮不周使邏輯描述不能確定電路的所有

狀態(tài),這對(duì)整個(gè)電路是很危險(xiǎn)的,可能發(fā)生難以預(yù)料的問題,鎖存就是這種情況

卜,的罪艇禍?zhǔn)?。其?shí)在早期的有些電路中鎖存是需要的,它具有電平觸發(fā)的存儲(chǔ)

功能,電路結(jié)構(gòu)簡(jiǎn)單占用面積小,但是現(xiàn)今的設(shè)計(jì)單元面積并不是最主要的考慮

因素,電路的可靠性、可控性、易維護(hù)性甚至比面積更加重要,基于此我們要求

電路避免鎖存器,但是初學(xué)者往往不能分辨怎樣的描述會(huì)產(chǎn)生鎖存。我們將可能

產(chǎn)生鎖存的結(jié)構(gòu)列舉如下。

always@(enableordata)

begin

if(enable)

begin

q=data;

end

end

這個(gè)的結(jié)構(gòu)會(huì)得到一個(gè)鎖存,因?yàn)槭录舾斜碇械氖录欠沁呇赜|發(fā)事件,所以

綜合工具不會(huì)為語句塊中的每個(gè)左值匹配一個(gè)寄存器,同時(shí)選擇結(jié)構(gòu)的分支不全

意味著電路結(jié)構(gòu)并沒有給左值指定所有的情況下左值應(yīng)該有的狀態(tài),這時(shí)DC會(huì)

認(rèn)為在其他情況下沒有指定對(duì)應(yīng)狀態(tài)的左值會(huì)保持前一個(gè)狀態(tài)不變,這具有存儲(chǔ)

能力,又是電平觸發(fā),因此形成了鎖存。

always@(enableoraorb)

begin

if(enable)

begin

out_l=a;

end

else

begin

out_2=b;

end

end

這個(gè)結(jié)構(gòu)會(huì)得到兩個(gè)鎖存。因?yàn)樽笾禌]有在各種情況下具有指定的值,如果要避

免瑣存那么outl、。32應(yīng)該在if語句的每個(gè)分支中都有顯式指定的狀態(tài)。

注意下面的結(jié)構(gòu)不會(huì)產(chǎn)生鎖存。

always@(posedgeclock)

begin

if(enable)

begin

out=a;

end

end

因?yàn)樯厦娴慕Y(jié)構(gòu)使用的是邊沿觸發(fā)所以只會(huì)在觸發(fā)器的數(shù)據(jù)端連接一個(gè)選

擇器。

input[3:0]in;

always@(in)

begin

case(in)

0:out_l=1,bl;

1,3:out_2=l'bl;

2,4,5,6,7:out_3=l'bl;

default:out_4=1'bl;

endcase

end

上面的結(jié)構(gòu)會(huì)產(chǎn)生鎖存,因?yàn)闋顟B(tài)項(xiàng)分支中的左值不全。那么不全的左值會(huì)被綜

合成鎖存。要避免鎖存可以使用卜面的結(jié)構(gòu)。

input[3:0]in;

always@(in)

begin

out_l=1,bO;

out2=1'bO;

out_3=1,bO;

out4=1,bO;

case(Data_In)

0:out1=1'bl;

1,3:out_2=l'bl;

2,4,5,6,7:out_3=l'bl;

default:out_4=1'bl;

endcase

end

這種結(jié)構(gòu)會(huì)避免鎖存。卜面的結(jié)構(gòu)同樣可以避免。

input[3:0]in;

always@(in)

begin

case(in)

0:begin

out_l=l'bl;

out_2=1'bO;

out_3=1'bO;

out_4=1'bO;

end

1,3://Analogousassignments

2,4,5,6,7://Analogousassignments

default://Analogousassignments

endcase

end

我們要求case語句必須寫成上面這種不帶鎖存的形式。

以上的結(jié)構(gòu)我們可以看出鎖存是針對(duì)左值產(chǎn)生的,并且鎖存是在一定條件下

產(chǎn)生的,產(chǎn)生鎖存的充要條件是:

第一、always過程塊的事件是非邊沿的。

第二、各種情況下對(duì)左值的賦值沒有顯式確定。

為了不引入鎖存,我們必須避免兩個(gè)條件同時(shí)成立。

計(jì)數(shù)器:

時(shí)序部件的另一個(gè)重要器件是計(jì)數(shù)器,實(shí)際上計(jì)數(shù)器是寄存器的一種特殊

應(yīng)用,但是因?yàn)橛?jì)數(shù)器往往用于產(chǎn)生分頻時(shí)鐘、用于表示電路的狀態(tài)、以及產(chǎn)生

固定的延遲,所以它的地位非常特殊我們把它專門拿出來進(jìn)行闡述。如果電路需

要2分頻、4分頻、8分頻…這樣的時(shí)鐘,除了用鎖相環(huán)外,最簡(jiǎn)單的實(shí)現(xiàn)方式是

寫成象下面這樣的結(jié)構(gòu),當(dāng)然它也可以用來標(biāo)記2、4、8這樣2的指數(shù)倍個(gè)狀態(tài)。

always@(posedgeelkornegedgeclear)

begin

if(!clear)

begin

count<=4,b0000;

end

else

begin

count<=count+1;

end

end

如果分頻數(shù)不是2的指數(shù)倍而是象3、5、…11等這樣的數(shù),或需要標(biāo)記的

狀態(tài)不是2的指數(shù)倍那么我們可以設(shè)計(jì)成下面的這種結(jié)構(gòu)。

always@(posedgeelkornegedgeclear)

begin

if(!clear)

begin

count<=3'bOOO;

end

elseif(count==3,blOl)

begin

count<=3'b000;

end

else

begin

count<=count+1;

end

end

這種結(jié)構(gòu)可以描述電路從。到5記6個(gè)數(shù),但是在用計(jì)數(shù)器記錄電路狀態(tài)時(shí)

因?yàn)橛?jì)數(shù)器的初始狀態(tài)與其他時(shí)序部件都用clear復(fù)位信號(hào)清零,所以我們一般

不用計(jì)數(shù)器的初態(tài)表示電路的狀態(tài)。

如果計(jì)數(shù)器需要在控制信號(hào)的作用下計(jì)數(shù),那么其結(jié)構(gòu)如下所示。

always@(posedgeelkornegedgeclear)

begin

if(!clear)

begin

count<=3'b000;

end

elseif(en_count)

begin

count<=count+1;

end

end

分頻電路產(chǎn)生的時(shí)鐘是電路中時(shí)序器件工作的參照,在對(duì)時(shí)鐘相位偏移要

求不高或分頻級(jí)數(shù)不多的情況下我們可以采用以上結(jié)構(gòu),但是如果遇到時(shí)序要求

非常嚴(yán)格或者時(shí)鐘的相位差作為電路工作的判別依據(jù)如要求時(shí)鐘相差90度等,

這時(shí)以計(jì)數(shù)器作為分頻電路的精度是遠(yuǎn)遠(yuǎn)不夠的,我們必須考慮用精度更高的鎖

相環(huán)重新設(shè)計(jì)分頻、倍頻電路,否則可能產(chǎn)生嚴(yán)重問題。

通過以上規(guī)范的說明,我們建立了RTL代碼編寫的基本框架,我們耍求設(shè)

計(jì)人員編寫的RTL文件的基本結(jié)構(gòu)與書寫格式必須滿足以上要求。

4.5仿真代碼的代碼風(fēng)格

設(shè)計(jì)人員一般在完成RTI4弋碼和頂層模塊后要對(duì)所設(shè)計(jì)的模塊進(jìn)行仿真,

這一節(jié)我們簡(jiǎn)要聞述編寫仿真文件應(yīng)該注意的事項(xiàng)。

在仿真代碼的語法范圍一節(jié)中我們闡述了編制仿真代碼可用的關(guān)鍵字、系

統(tǒng)調(diào)用以及邏輯范疇。這一節(jié)我們重點(diǎn)介紹仿真代碼中的時(shí)鐘產(chǎn)生、信號(hào)延遲、

邊界向量、和存儲(chǔ)器建模的相關(guān)問題。

時(shí)鐘是時(shí)序邏輯賴以存在的關(guān)鍵信號(hào),它的地位無與倫比,仿真代碼對(duì)時(shí)

鐘的產(chǎn)生有專門的模型。一般產(chǎn)生時(shí)鐘的建模語句應(yīng)該考慮仿真工具對(duì)時(shí)鐘的抽

象級(jí)別,如果時(shí)鐘建模語句與仿真工具對(duì)時(shí)鐘抽象級(jí)相一致,會(huì)加快仿真速度。

考慮到一般工具對(duì)時(shí)鐘的抽象級(jí)為行為級(jí),我們也只規(guī)范行為級(jí)的時(shí)鐘建模。

?占空比為1:1的時(shí)鐘建模。

regelk;

alwaysbegin

#period/2clk=1;

#period/2clk=O;

end

注意下面的寫法會(huì)使仿真速度降低:

always#5elk=~clk;

這是因?yàn)槊恳粋€(gè)周期仿真工具會(huì)多進(jìn)行一步非運(yùn)算。

?開頭帶有延遲的時(shí)鐘建模。

regelk;

initial

begin

clk=O;

#(delay)

forever

begin

#(period/2)clk=1;

#(period/2)clk=O;

end

end占空比不為1:1的周期性時(shí)鐘建模。

regelk;

alwaysbegin

#4clk=1;

#8clk=O;

end

?時(shí)鐘周期規(guī)律性變化的時(shí)鐘建模。對(duì)這種時(shí)鐘我們一般將延遲表示為一個(gè)差

分方程,根據(jù)前面的時(shí)鐘周期來確定現(xiàn)在的時(shí)鐘周期。

integerperiod,ent;

regelk;

initial

begin

elk=0;

period=4;

end

initial

begin

forever

begin

period=period*2;

forfent=0;cnt<3;cnt=ent+1)

begin

#(period/2)elk=1;

#<period/2)elk=0;

end

end

end

上面這個(gè)例子可以創(chuàng)建一個(gè)周期變化的時(shí)鐘,它的初始周期為4ns,以后每

三個(gè)周期,它的時(shí)鐘周期變寬一倍。用這種時(shí)鐘對(duì)網(wǎng)表仿真時(shí)可以估計(jì)電路速度。

時(shí)鐘的建模不止以上這幾種,對(duì)時(shí)鐘建模時(shí),一定要把握準(zhǔn)確、簡(jiǎn)單、直

接的原則。如果時(shí)鐘沒

溫馨提示

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

評(píng)論

0/150

提交評(píng)論