Verilg 2001相对于Verilog 1995的改进(Z) (内含 乘方 运算符** )
原文:http://blog.csdn.net/xiaqiang2006/archive/2010/10/28/5971787.aspx
Verilog HDL作為描述電子電路行為和結構的一種語言,其實是一種IEEE標準(IEEE Std.1364-1995).在IEEE Std.1364-1995標準的基礎上,又發(fā)展出了Verilog IEEE 1364-2001標準,簡稱Verilog 2001標準,它在完全兼容Verilog 1995標準的基礎上,對Verilog 1995標準進行了增強,使Verilog HDL使用起來更加方便,功能更加強大,進一步適應現(xiàn)在大規(guī)模集成電路設計的需要。
??? 下面就分別介紹Verilog 2001標準改進的部分內容.
1.對敏感列表所做的增強?
??? always塊在采用電平敏感事件時,所有的輸入信號,也就是位于賦值語句中等號右邊的信號,都必須在敏感列表中列出,否則就有可能發(fā)生錯誤。如下例,一個四輸入與門,always后面的敏感列表中必須全部列出4個輸入信號.
??? module and4(
??? ??? a,??? //與門的輸入
??? ??? b,??? //與門的輸入
??? ??? c,??? //與門的輸入
??? ??? d,??? //與門的輸入
??? ??? out??? //結果輸出
??? ??? );
??? input??? a,b,c,d;
??? output??? out;
??? wire??? a,b,c,d;
??? reg??? out;
??? always??? @(a or b or c or d)??? //敏感列表中必須列出所有的輸入信號
??? begin
??? ??? out=a&b&c&d;
??? end
????
??? endmodule
??? Verilog 2001對此作出增強,可以通過一個符號“*”來代替敏感列表的內容,表示將所有輸入信號都加入敏感列表。這樣做的好處是,避免設計人員因為疏忽而在敏感列表中漏掉了某個信號,叢而導致錯誤發(fā)生。如下例所示,功能和上例一樣。
??? module and4(
??? ??? a,??? //與門的輸入
??? ??? b,??? //與門的輸入
??? ??? c,??? //與門的輸入
??? ??? d,??? //與門的輸入
??? ??? out??? //結果輸出
??? ??? );
??? input??? a,b,c,d;
??? output??? out;
??? wire??? a,b,c,d;
??? reg??? out;
??? always??? @*??? //“*”表示將所有輸入信號加入到敏感列表中
??? begin
??? ??? out=a&b&c&d;
??? end
????
??? endmodule
??? 除了可以通過“*”代替電平敏感事件的敏感列表外,Verilog 2001還有一項針對敏感列表的增強之處,就是使用逗號代替原來敏感列表中的關鍵字or。如下例。
??? //帶異步復位的D觸發(fā)器
??? module d_flipflop(
??? ??? d,??? //輸入數(shù)據(jù)信號
??? ??? clk,??? //輸入時鐘信號
??? ??? rst,??? //輸入復位信號,低電平有效
??? ??? q,??? //輸出數(shù)據(jù)信號
??? ??? );
??? input??? clk;
??? input??? rst;
???? input??? d;
??? input??? q;
??? wire??? clk;
??? wire??? rst;
??? wire??? d;
??? wire??? q;
??? always??? @(posedge clk,negedge rst)??? //用逗號代替了關鍵字or
??? begin
??? ??? if(!rst)
??? ??? ??? q<=0;
??? ??? else
??? ??? ??? q<=d;
??? end
????
??? endmodule
????
2.對端口聲明所作的增強?
??? 在一個模塊的開始部分包含有該模塊的端口聲明(說明是輸入端口或輸出端口或是雙向端口)和端口類型聲明(說明端口變量是線網(wǎng)型的或是寄存器型的),Verilog 2001標準規(guī)定可以將這兩部分合二為一。如下例所示。
??? //2位二進制數(shù)的加法
??? module adder(
??? ??? a,??? //加數(shù)
??? ??? b,??? //加數(shù)
??? ??? sum,??? //和
??? ??? );
??? //經(jīng)過增強的端口聲明部分同時包含了端口類型聲明
??? input??? wire??? [1:0]??? a,b;
??? output??? reg??? [2:0]??? sum;
????
??? always??? @*
??? begin
??? ??? sum=a+b;
??? end
??? endmodule
??? 這一改動確實使代碼在書寫上省去了不少麻煩,但還有更簡單的書寫方式。Verilog 2001標準允許在定義模塊時就聲明端口及其類型。如下例所示.
??? module ??? adder(
??? input??? wire??? [1:0]??? a,??? //加數(shù)
??? input ??? wire ??? [1:0]??? b,??? //加數(shù)
??? output??? reg??? [2:0]??? sum??? //和
??? );
??? ????
??? always @*
??? begin
??? ??? sum=a+b;
??? end
????
??? endmodule
??? 這種書寫方式最大限度地減少了書寫模塊開頭時的工作量,同時由于在定義模塊時就將各個端口都聲明好,因此避免了分開聲明時容易漏掉端口的現(xiàn)象。
3.對有符號型變量所作的增強?
??? Verilog 1995標準規(guī)定只有用Interger定義的寄存器型變量才是有符號的,用reg定義的寄存器型變量和線網(wǎng)型變量都是無符號的。因為Interger型變量有著固定的位寬,一般為32位,因而使用起來不是很方便。
??? Verilog 2001對此進行了增強,允許用戶將線網(wǎng)型變量、寄存器型變量以及函數(shù)等定義為有符號的。定義一個有符號的變量使用關鍵字“signed”。如
??? reg??? ? signed??? [63:0]??? data;
??? wire??? ? signed??? [7:0]??? data;
??? input??? ? signed??? [9:0]??? data;
??? function? signed??? [127:0]??? alu;????
??? 除了可以將變量定義為有符號數(shù)以外,Verilog 2001還允許直接書寫有符號數(shù)。Verilog 1995規(guī)定不包含進制的數(shù)是有符號的,也就是指直接書寫的十進制數(shù)是有符號的,其余包含進制的數(shù)被認為是無符號的,這也給有符號數(shù)的使用帶來了一定的局限性。Verilog 2001規(guī)定在進制前加上字母“s”即表示有符號數(shù)。
??? 16'h12a0??? //一般的書寫方式被認為是無符號數(shù)
??? 16'sh12a0??? //在進制前加上字母“s”被認為是有符號數(shù)?
4.增加乘方操作符“**”?
??? Verilog 2001添加了一個新的操作符“**”,用于執(zhí)行乘方運算,其一般使用形式為
??????? result=base**exponent;
其中,base表示底數(shù),exponent表示指數(shù)。
????
5.對給寄存器型變量賦初值所作的增強?
??? Verilog 1995不允許在定義寄存器變量時為其賦初值,如果需要為寄存器型變量賦初值,可以通過在Initial塊內賦值的辦法實現(xiàn)。Verilog 2001對此作出增強,允許用戶在定義寄存器變量的同時為其賦初值。
??? //Verilog 1995為寄存器型變量賦初值的方法
??? reg??? [1:0]??? a,b;
??? initial
??? begin
??? ??? a=2'b01;
??? ??? b=2'b11;
??? end
??? //Verilog 2001為寄存器型變量賦初值的方法
??? reg??? [1:0]??? a=2'b01;
??? reg??? [1:0]??? b=2'b11;
6.對自動位寬擴展所作的增強?
??? 在為變量賦值的時候,省略數(shù)的位寬將會自動進行位寬擴展,作用是將數(shù)調整為和變量匹配的位寬。
??? reg??? [7:0]??? data;
??? initial
??? data='bz;??? //根據(jù)data的位寬自動進行擴展,data=8'hzz
??? 但是在Verilog 1995中,當對一個位寬大于32的變量采用這種方法將其賦值為高阻態(tài)或者不定態(tài)時會出現(xiàn)問題,賦值的結果是較低的32位被賦值為高阻態(tài)或者不定態(tài),而較高的其他位被賦值為0。只有在賦值的時候指明數(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對此作出了修正,解決了這一問題。
??? //Verilog 2001中不存在上述問題
??? reg??? [63:0]??? data;
??? initial
??? ??? data='bz;??? //data=64'hzzzz_zzzz_zzzz_zzzz ?
總結
以上是生活随笔為你收集整理的Verilg 2001相对于Verilog 1995的改进(Z) (内含 乘方 运算符** )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 完胜iPhone 14 Pro Max!
- 下一篇: 三星 Galaxy S23 系列不支持卫