Verilg 2001相對(duì)于Verilog 1995的改進(jìn)(內(nèi)含乘方運(yùn)算符)

原文:http://blog.csdn.net/xiaqiang2006/archive/2010/10/28/5971787.aspx
Verilog HDL作為描述電子電路行為和結(jié)構(gòu)的一種語言,其實(shí)是一種IEEE標(biāo)準(zhǔn)(IEEE Std.1364-1995).在IEEE Std.1364-1995標(biāo)準(zhǔn)的基礎(chǔ)上,又發(fā)展出了Verilog IEEE 1364-2001標(biāo)準(zhǔn),簡(jiǎn)稱Verilog 2001標(biāo)準(zhǔn),它在完全兼容Verilog 1995標(biāo)準(zhǔn)的基礎(chǔ)上,對(duì)Verilog 1995標(biāo)準(zhǔn)進(jìn)行了增強(qiáng),使Verilog HDL使用起來更加方便,功能更加強(qiáng)大,進(jìn)一步適應(yīng)現(xiàn)在大規(guī)模集成電路設(shè)計(jì)的需要。
下面就分別介紹Verilog 2001標(biāo)準(zhǔn)改進(jìn)的部分內(nèi)容.
1. 對(duì)敏感列表所做的增強(qiáng)
always塊在采用電平敏感事件時(shí),所有的輸入信號(hào),也就是位于賦值語句中等號(hào)右邊的信號(hào),都必須在敏感列表中列出,否則就有可能發(fā)生錯(cuò)誤。如下例,一個(gè)四輸入與門,always后面的敏感列表中必須全部列出4個(gè)輸入信號(hào).
Verilog 2001對(duì)此作出增強(qiáng),可以通過一個(gè)符號(hào)“*”來代替敏感列表的內(nèi)容,表示將所有輸入信號(hào)都加入敏感列表。這樣做的好處是,避免設(shè)計(jì)人員因?yàn)槭韬龆诿舾辛斜碇新┑袅四硞€(gè)信號(hào),叢而導(dǎo)致錯(cuò)誤發(fā)生。如下例所示,功能和上例一樣。
除了可以通過“*”代替電平敏感事件的敏感列表外,Verilog 2001還有一項(xiàng)針對(duì)敏感列表的增強(qiáng)之處,就是使用逗號(hào)代替原來敏感列表中的關(guān)鍵字or。如下例。
2. 對(duì)端口聲明所作的增強(qiáng)
在一個(gè)模塊的開始部分包含有該模塊的端口聲明(說明是輸入端口或輸出端口或是雙向端口)和端口類型聲明(說明端口變量是線網(wǎng)型的或是寄存器型的),Verilog 2001標(biāo)準(zhǔn)規(guī)定可以將這兩部分合二為一。如下例所示。
這一改動(dòng)確實(shí)使代碼在書寫上省去了不少麻煩,但還有更簡(jiǎn)單的書寫方式。Verilog 2001標(biāo)準(zhǔn)允許在定義模塊時(shí)就聲明端口及其類型。如下例所示.
這種書寫方式最大限度地減少了書寫模塊開頭時(shí)的工作量,同時(shí)由于在定義模塊時(shí)就將各個(gè)端口都聲明好,因此避免了分開聲明時(shí)容易漏掉端口的現(xiàn)象。
3. 對(duì)有符號(hào)型變量所作的增強(qiáng)
Verilog 1995標(biāo)準(zhǔn)規(guī)定只有用Interger定義的寄存器型變量才是有符號(hào)的,用reg定義的寄存器型變量和線網(wǎng)型變量都是無符號(hào)的。因?yàn)镮nterger型變量有著固定的位寬,一般為32位,因而使用起來不是很方便。
Verilog 2001對(duì)此進(jìn)行了增強(qiáng),允許用戶將線網(wǎng)型變量、寄存器型變量以及函數(shù)等定義為有符號(hào)的。定義一個(gè)有符號(hào)的變量使用關(guān)鍵字“signed”。如
reg ? ? ?signed ? ?[63:0] ? ?data;
? ?
wire ? ? ?signed ? ?[7:0] ? ?data;
? ?
input ? ? ?signed ? ?[9:0] ? ?data;
? ?
function ?signed ? ?[127:0] ? ?alu; ? ?
除了可以將變量定義為有符號(hào)數(shù)以外,Verilog 2001還允許直接書寫有符號(hào)數(shù)。Verilog 1995規(guī)定不包含進(jìn)制的數(shù)是有符號(hào)的,也就是指直接書寫的十進(jìn)制數(shù)是有符號(hào)的,其余包含進(jìn)制的數(shù)被認(rèn)為是無符號(hào)的,這也給有符號(hào)數(shù)的使用帶來了一定的局限性。Verilog 2001規(guī)定在進(jìn)制前加上字母“s”即表示有符號(hào)數(shù)。
16'h12a0 ? ?//一般的書寫方式被認(rèn)為是無符號(hào)數(shù)
? ?
16'sh12a0 ? ?//在進(jìn)制前加上字母“s”被認(rèn)為是有符號(hào)數(shù)
4.增加乘方操作符“**”
Verilog 2001添加了一個(gè)新的操作符“**”,用于執(zhí)行乘方運(yùn)算,其一般使用形式為
? ?result=base**exponent;
其中,base表示底數(shù),exponent表示指數(shù)。
5.對(duì)給寄存器型變量賦初值所作的增強(qiáng)
Verilog 1995不允許在定義寄存器變量時(shí)為其賦初值,如果需要為寄存器型變量賦初值,可以通過在Initial塊內(nèi)賦值的辦法實(shí)現(xiàn)。Verilog 2001對(duì)此作出增強(qiáng),允許用戶在定義寄存器變量的同時(shí)為其賦初值。
6.對(duì)自動(dòng)位寬擴(kuò)展所作的增強(qiáng)
在為變量賦值的時(shí)候,省略數(shù)的位寬將會(huì)自動(dòng)進(jìn)行位寬擴(kuò)展,作用是將數(shù)調(diào)整為和變量匹配的位寬。
reg ? ?[7:0] ? ?data;
? ?
initial
? ?
data='bz; ? ?//根據(jù)data的位寬自動(dòng)進(jìn)行擴(kuò)展,data=8'hzz
但是在Verilog 1995中,當(dāng)對(duì)一個(gè)位寬大于32的變量采用這種方法將其賦值為高阻態(tài)或者不定態(tài)時(shí)會(huì)出現(xiàn)問題,賦值的結(jié)果是較低的32位被賦值為高阻態(tài)或者不定態(tài),而較高的其他位被賦值為0。只有在賦值的時(shí)候指明數(shù)的位寬才能解決這一問題。
//Verilog 1995中存在的問題
? ?
reg ? ?[63:0] ? ?data;
? ?
initial
? ?
begin ? ?
? ? ? ?
????data='bz; ? ?//data=64'h0000_0000_zzzz_zzzz
? ? ? ?
????data=64'bz; ? ?//data=64'hzzzz_zzzz_zzzz_zzzz
? ?
end
Verilog 2001對(duì)此作出了修正,解決了這一問題。
//Verilog 2001中不存在上述問題
? ?
reg ? ?[63:0] ? ?data;
? ?
initial
? ??
? ?data='bz; ? ?//data=64'hzzzz_zzzz_zzzz_zzzz