Lab_7 硬體描述語言Verilog



Lab_5 硬體描述語言Verilog

一、Verilog簡介

1.1 Verilog是什麼?

Verilog是一種用來描述硬體的語言,它的語法與C語言相似,易學易用,而且能夠允許在同一個模組中有不同層次的表示法共同存在,設計者可以在同一個模組中混合使用:

a.電晶體層次(Transistor Model) PS.不建議使用此層次

b.邏輯閘層次模型(Gate Level Model)

c.暫存器轉移層次(Register Transfer Level)

d.行為模型(Behavioral Model)

等4種不同層次的表示法來描述所設計的電路。

1.2 為何要用Verilog來描述硬體以及模擬硬體呢?

首先我要說的是在這裡所謂的“硬體”指的是“數位電路”,因為超大型積體電路(VLSI)設計技術與半導體製造工業的快速成長、使得數系統愈來愈複雜,以及電子產品的生命週期子於設計時所花的時間,往使用的「全訂製」(Full Custom)IC的設計流程並未能符合市埸的快速變化、因而未能廣泛使用於電子產品的設計中。因此數位系統設計人員及數位電路工程師急迫地需要一種能夠模擬數位電路或是系統的語言好用來驗証以及模擬數位電路的正確性以加快數位電路的設計,而Verilog就是用來模擬數位電路的動作。你可以把數位電路模擬用的Verilog與Full Custom裡與Hspice的做個相對應的比較。

1.3 數位電路的設計流程(See Figure 1.1)

第一步、「功能模擬」(Function Simulation)階段

◆ 1.Verilog電路描述檔案(*.v檔)

我們將Verilog電路描述檔案(*.v檔)作為設計的輸入。

◆ 6.功能模擬(Function Simulation)及電路的測試碼(Verilog Test Drive)

配合您所提供用於測試該模組電路的測試碼(Verilog Test Drive),執行CAD軟體所提供的「功能模擬」(Function Simulation)用以確保模組的訊號輸出與預期的結果在訊號波形(Function)及時序(Timing)…等方面是否相同。

第二步、「邏輯閘層次模擬」(Gate Level Simulation)階段

◆1.Verilog電路描述檔案(*.v檔)

我們將Verilog電路描述檔案(*.v檔)作為設計的輸入。

◆2.Verilog語法檢查(Synnopsys HDL Compiler)

SynopsysDesign Analyer的讀入Verilog電路描述檔(*.v)的過程會檢查其是否符合Verilog的語法格式。

◆3.Verilog電路合成(Synopsys Design Compiler)

Synopsys的Design Analyzer可依照您對該模組或是電路所下的限制條件(Constraints)、例如:面積(area)、效能(speed)…等等、作為電路合成的要求目標。

◆4.邏輯閘層次描述(Gate Level Description)

完成步驟「3.Verilog電路合成(Synopsys Design Compiler)」之後會得到「邏輯閘層次描述(Gate Level Description)」

◆5.邏輯閘層次模擬(Gate Level Simulation)及7.電路的測試碼(Verilog Test Driver)

配合您所提供用於測試該模組電路的測試碼(Verilog Test Drive),執行CAD軟體所提供的「邏輯閘層次模擬模擬」(Gate Level Simulation)用以確保模組的訊號輸出與預期的結果在訊號波形(Function)及時序(Timing)…等方面是否相同。

第三步、「模擬結果」(Simulation Output Comparison)階段

◆8.功能及時序模擬結果比較(Compare Output)

將「功能模擬」(Function Simulation)階段的模擬結果以及「邏輯閘層次模擬」(Gate Level Simulation)階段的模擬結果,比較他們之間的訊號輸出與預期的結果在訊號的波形(Function及時序(Timing)…等方面是否相同。這二個階段的模擬結果未必都會相同, 尤其是在訊號的時序(Timing)方面或多或少會有誤差的。因為在「功能模擬」(Function Simulation)階段是比較接近理想的狀態下的模擬結果,。而在「邏緝閘層次模擬」階段因為已經合成出邏緝閘層次的電路了,所以是會比較接近最後所需電路(實際狀態下)的模擬結果。

數位電路設計流程圖:

[pic]

Figure 1.1

二. 如何編寫Verilog硬體描述語言

2.1 Verilog的語法協定

◆識別字(Identifiers) ,是在Verilog電路描述中所給予物件的名稱。識別字的第一個字元必須為字母,第二個之後的字元可為字母,數字,底線“ˍ”或是錢字號“$”所組成。識別字的大小寫是有所分別的,例Data與data是不同的二個名字;也就是說在Verilog語言是可以分辨大小寫的要注意哦!!

◆關鍵字(Keyword)是一組特殊的定義名稱,其功用是用來定義Verilog電路描述的架構,所有的關鍵字都必需使用小寫來表示,也就是說在Verilog用到的指令都是小寫的。

◆註解(Comments),在Verilog中有二種的註解方法,

第一種為「單行註解」(One Line Comment)是以“//”為開頭的註解寫法:

例: wire a = b & c; //宣告1條接線a,並指定他為b&c

第二種為「多行註解」(Multiple Line Comment),以“/*”為開頭,用“*/”當作結尾的註解寫法:

例:

/*

若op=ADD,則Result=a+b; 若op=SUB,則Result=a-b;

若op=AND,則Result=a&b; 若op=OR,則Result=a|b;

*/

◆數值(Numbers)表示

數值表示有二種的表示法,一為定長度(Sized)表示,另一種為不定長度(Unsized)表示二種。

◆定長度(Sized)數值表示:

是以<size>’<base format><number>來表示。其中<size>是以十進位來表示數字的位元數(Bits),<base format>用來定義此值是用16進位(’H或’h)、十進位(’D或’d)、八進位(’O或’o)或是使用二進位(’B或’b)。

例:

wire [3:0] Out1,Out2,Out3,Out4;

assign Out1 = 4’hd13;

// 將十進位表示的13設給Out1

assign Out2 = 4’b1101;

// 將二進位表示的1101設給Out2

assign Out3= 4’o15;

// 將八進位表示的15設給Out3

assign Out4 = 4’hD;

// 將十六進位表示的D設給Out4

上面這個例子中Out1到Out4裡頭其實都是設定到同一個值,只不過是在不同基底(base format)下去設定。

◆不定長度(Unsized)的數值表示

不定長度數字不必使用<size>來規定數字之位元數大小,而是使用HDL編譯器內定的長度(通常為32bit的寬度)。其中若沒有寫明<base format>的部份,則以十進制來表示。

2.2開始Verilog的電路描述

一個電路的行為我們大體可以將它分為二個部分,一是邏輯電路的部分,另一個是循序電路的部分,第一部分首先我們先來看如何來描述一個邏輯的電路行為,第二部分我們在來討論循序電路的電路描述。

2.2.1邏輯電路的描述

若這時我要舉一些例子來做電路描述的說明:

例1.如下圖Fig2.1所示:

[pic]

Fig 2.1

它的Verilog語言描述有下面二種方式,第一種是使用關鍵字assign描述,另一種使用關鍵字always來描述。

第一種方式,當我們使用關鍵字assign來做指描述時,我們要先宣告它所指定的識別字要為(wire)接線形態,而在等號右半邊的運算元(a或b)則沒有限制。其上面電路描述如下:

wire c ; //宣告c 為一條接線

assign c = a & b ; //將a與b作邏輯AND運算後指定給接線c

注意:其中a或b可以是wire(接線)形態或是reg(暫存器)形態,但等號的左半邊c一定要為wire(接線)形態。

第二種方式,使用always來描述,我們要宣告它所指定的識別字為reg(暫存器)形態,相同的在等號右半邊的運算元則沒有限制。電路描述如下:

reg c ;

always @(a or b)

begin

c = a & b ;

end

注意:其中等號的右半邊a或b可以是wire(接線)形態或是reg(暫存器)形態,但等號的左半邊c一定要為reg(暫存器)形態,在使用always時,記得要加“@(要察看的訊諕)”這一項的敘述,且在此always內有二個以上的reg(暫存器)被指定時,在always敘述要以begin為開始,end作為結尾。

接下來我們將導入一個向量(Vector)的宣告方法,去宣告wire(接線)或是reg(暫存器),若有一個Verilog語言寫法如下所示:

wire [3:0] a ;

則它是代表有一寬度為4bit的wire(接線)a被宣告,相同的當要宣告寬度為4bit的reg(暫存器)b時可寫成如下:

reg [3:0] b ;

我們在這裡在舉一個簡單的例子:

例2.如下圖Fig2.2所示:

[pic]

Fig2.2

這一個例子,大家可以想一想如何利用上面的向量(Vector)宣告,配合assign或always來描述;請先試著寫看看,再參考下一頁的答案。

使用assign描述如下:

wire [3:0] c ; //宣告c為寬度4bit的接線

assign c = a & b ; //將a和b作邏輯AND後指定給接線 c

注意:其中的a或b均是寬度為4bit的wire(接線)或是reg(暫存器)

使用always描述如下:

reg [3:0] c ;

always @(a or b)

begin //## always開始 #####

c = a & b; //其中a , b是運算元而&(and)為運算子

end //## always結束 #####

在Verilog中運算元的資料型態包括常數、整數、實數、接點、暫存器、時間、一個向量接點或是一個向量暫存器中的一個位元或是部分的位元、記憶體或是函數的回傳值…等等。

以下將列出Verilog所支援的運算子,這裡還要注意一件事那就是Verilog所支援的運算子不代表它都可以合成也就是實體化,在最後一欄有標示。

|運算子種類 |符號 |運算功能 |運算元數目 |否可合成 |

|算術運算符號 |* |乘法 |2 |可 |

| |/ |除法 |2 |不可 |

| |+ |加法 |2 |可 |

| |- |減法 |2 |可 |

| |% |取餘數 |2 |不可 |

|邏輯運算符號 |! |邏輯上的 " NOT" |1 |可 |

| |&& |邏輯上的 "AND" |2 |可 |

| ||| |邏輯上的 "OR" |2 |可 |

|比較符號 |> |大於 |2 |可 |

|用在if-else | | | | |

|判斷式 | | | | |

| |< |小於 |2 |可 |

| |>= |大於或等於 |2 |可 |

| |> |向右移位 |2 |可 |

| | 

   ... 

endmodule 

module fulladd4 ( sum,  c_out,  a,  b,  c_in ) ; 

  output  [3:0]  sum; 

  output  c_cout; 

  input  [3:0]  a,  b; 

  input  c_in ; 

     ... 

     < module internals > 

      ... 

  endmodule 

◆用指定名稱的方法 ( Connecting ports by name )  

// 訊號依照指定埠的名稱的方式連接 

fulladd4 fa_byname ( .c_out ( C_OUT ) ,  .sum ( SUM ) ,  .b ( B ),

.c_in ( C_IN ) ,  .a( A ) ) ; 

注意:只有需要與外部連接的埠才被指名連接,其餘不需要連接的埠的名稱就可以不用寫出,如上面例子中若埠 c_out 不想與外面的訊號相連,只要不寫出來即可,如下面所示。

// 訊號依照指定埠的名稱的方式連接 

  fulladd4 fa_byaname ( .sum ( SUM ),  .b ( B ),  .c_in ( C_IN ), .a ( A )  ) ; 

2.7總結

• 模組定義包含以下各個部份,其中關鍵字 module 與 endmodule 和模組名稱是一定要的,其餘的部份包含有:埠列 ( port list ),埠的宣告 ( port declarations ),變數與訊號的宣告 ( variable and signal declarations ),資料處理 ( dataflow statments ),行為模式 ( behavioral blocks ),低階模組的引用 ( lower-level module instantiations ),任務 (task ) 或是函數 (functions ),這些部份是視設計的需要再加入即可。

• 埠提供一個模組與周遭環境的溝通介面。一個需要與外界訊號溝通得模組皆有一個埠列,在埠列中的每個埠依照其方向分別宣告為 input、output 或是 inout,當引用一個模組時對於埠與訊號的連接必須遵守 Verilog 的規定。

• 埠的連接方法有依照埠列的順序與指定名稱兩種方式。

• 在設計中任何一個變數、訊號或是別名都有一個單一階層化名稱,藉由這個階層化的名稱,我們可以在其他的等級訂位到這個我們所需要的別名、訊號或是變數。

補充範例:

(1)non-blocking and blocking

[pic]

[pic]

(2)4位元串進串出,左移,移位暫存器

[pic]

module SISO_shift_register(clock,clear,SI,SO);

input clock,clear,SI;

output SO;

reg SO;

reg [3:0] reg4;

always @(posedge clock)

begin

if(clear)

reg4=4’b0;

else

begin

SO ................
................

In order to avoid copyright disputes, this page is only a partial summary.

Google Online Preview   Download