Chapter 5 Verilog 硬體描述語言
Chapter 5 Verilog硬體描述語言
Verilog硬體描述語言的基本架構 module Switch-level Gate-level Dataflow-level Behavioral-level endmodule
模組內之四種層次描述電路 開關層次(Switch-Level):描述元件開關及儲存點組合而成 邏輯層次(Gate-Level):描述邏輯閘的連接形式 資料流層次(Data-Level):描述電路的資料如何在暫存器中儲存與傳送 行為層次(Behavioral-Level):描述模組之功能
暫存器轉移層次 (Register-Transfer-Level, RTL) 資料流層次(Data-Level) + 行為層次(Behavioral-Level)經合成而形成暫存器轉移層次(Register-Transfer-Level, RTL)
Chapter 5 Verilog硬體描述語言
Verilog模組描述的基本格式 module <模組名稱><模組輸入輸出埠宣告> 模組四個層次的描述; endmodule
以開關層次描述一NOT閘之模組 module inv (ina, out); input ina; output out; supply1 vcc; supply0 gnd; pmos (out, vcc, ina); nmos (gnd, out, ina); endmodule
以邏輯閘層次描述一OR閘之模組 module ORGATE (A, B, F); input A; input B; output F; or u1(F, A, B); endmodule
以資料流層次描述一AND閘之模組 module ANDGATE (A, B, F); input A; input B; output F; wire F; assign F=A&B; endmodule
以行為層次描述一NAND閘之模組 module NANDGATE (A, B, F); input A; input B; output F; reg F; always @(A or B) begin F=~(A & B); end endmodule
Chapter 5 Verilog硬體描述語言
Verilog 的基本語法規定 關鍵字如module, endmodule, assign, wire, always, input, output, begin, end…等必須使用小寫 識別字的大小寫是有差別的,第一個字必須是使用英文字母 單行註解用//; 多行註解用 /* … */ 字串以雙引號表示,如 “This is a string”
Verilog 的數字格式(1) 有規定長度的數字(sized numbers) <size>’<base format><number> <size>:位元數 <base format>:d10進位,h16進位, o 8進位,b 2進位 Example: F=4’b0101; A=16’h6FA3
Verilog 的數字格式(2) 不規定長度的數字(unsized numbers) ’<base format><number> <base format>:d10進位,h16進位, o 8進位,b 2進位 位元數之大小由模擬器或硬體機定值來決定 Example: b=’ha5; b=a5(32位元之16進位數)
Verilog的運算子
Chapter 5 Verilog硬體描述語言
(1)、數值組集(Value Set) Verilog有四種表示數值,即 0、1、x、z以及八種信號強度
(2) 、接線(net) 接線(net)表示在硬體元件的接點連接線 關鍵字可以分為下列六種 wire: 內定為一個位元的值,機定值為高阻抗 wand: Wired-AND型接線 waor: Wired-OR型接線 tri trior trireg
(3) 、暫存器(reg) Verilog中reg相當於一個變數,其機定值為x Example: reg out; 宣告一個out變數, reg所宣告的變數必須在always的區塊描述內使用 reg F; always @(A or B) begin F=~(A & B); end endmodule module NANDGATE (A, B, F); input A; input B; output F;
(4) 、向量(Vectors) 向量(Vectors)表示多位元的元件,wire及reg都可定義為向量格式 Examples: wire A[7:0]; //宣告有一8位元的BUS reg [0:15] out; //宣告有一16位元寬度的向量暫存器變數out
(5) 、整數(Integer) 整數之關鍵字為integer,最少要32位元,integer宣告可帶正負號 Example: integer count; initial count = 0;
(6) 、實數(Real) 實數之關鍵字為real,可用十進制或帶有指數表示 Example: real w, x; initial begin w = 5.2; x = 25e6;
(7) 、時間(Time) 時間之關鍵字為time,主要功能在描述儲存模擬的時間,也就是取得目前的模擬時間,最少為64位元的資料 Example: time storage_time; initial storage_time=$time
(8) 、陣列(Arrays) Verilog所提供陣列的儲存內容可以是整數、暫存資料、時間及向量,但不能為實數而且只適用於一維陣列 表示格式為<array_name>[<subscript>] integer A[0:15];16個變數A的陣列 reg [3:0] B[0:15];16個變數B的陣列,每一個B的位元寬度為4位元
(9) 、記憶體(Memories) 記憶體是一個暫存器的陣列,而陣列中的每一個物件都視為一個word,每一個word可以是1個位元或是多個位元所組成 reg [15:0] memory1 [0:1023]/*宣告記憶體memory1為16位元1K word的大小*/ reg memory2 [0:1023]/*宣告記憶體memory2為1位元1K word的大小*/
(10) 、參數(Parameters) 主要作用在設定一個固定常數,此常數可在每一次編譯時更改其值 parameter LGG=100;//宣告一常數LGG等於100
(11) 、字串(Strings) 字串的作用在指定給暫存器,若長度大於reg的長度,則其左邊的位元會被刪掉,若長度小於reg的長度,則其左邊的位元會以零補之 Reg [8*16:1] string_value; initial string_value=“good morning”
Chapter 5 Verilog硬體描述語言
事件基礎時間控制 (Event-based timing control) Event就是一個wire 當暫存器改變時就是事件,此事件可用來觸發一個敘述或包含多個敘述的區塊,且模組的輸入埠接收到一個新值也算是一個事件 Event-based timing control可包含(1) Regular event control (2) Named event control (3) Event OR control (4) Level-sensitive timing control
Regular event control 代表符號為@,它是表示當信號產生正緣(posedge),負緣(negedge),轉換(transition)或數值改變時,其相關敘述才會被執行 always @(clock) Q=J; 當clock信號值改變時就執行 Q=J 敘述 always @(posedge clock) Q=J; 當clock信號正緣觸發時就執行 Q=J 敘述
Event OR control 指使用多個信號或事件去觸發一個敘述或含有多個敘述的區塊來執行,因此將這些多個信號或事件以or(或)來表示 always @(reset or clock or A or B) begin if (reset) F=1’b0; else if (clock) F=A+B; end
Chapter 5 Verilog硬體描述語言
Verilog的輸入輸出埠描述 輸入埠(input) 輸出埠(output) 雙向埠(inout) Examples module Addr(F1, F2, D, SUM, C0) input [3:0] F1, F2; output [3:0] SUM; output C0; input D;
Chapter 5 Verilog硬體描述語言
Always Always是屬於並行迴圈,其事件一旦被觸發,其區塊中的敘述將會被執行,觸發一次執行一次行程無窮迴圈 always@(事件1 or 事件2 or … or 事件n) begin <敘述區> end
「 Begin … end 」 主要是將不同敘述同時集中,做法與C語言的“{”與“}”一樣,當敘述址為一行時,則Begin … end可以拿掉 begin:<方塊名稱> <資料型態宣告>; . end 各種敘述
「 If 」「 else if 」「 else 」 If 跟 else if 為條件判斷式,只要達成If 或是 else if 的判斷條件,則執行內部的敘述區塊,否則執行else內部的敘述區塊 If (判斷條件1) begin <敘述區塊> end else if (判斷條件2) else if (判斷條件3) . else
「 If 」「 else if 」「 else 」 cont’ 通常if else if else會出現在Always迴圈底下,因為Always屬於並行迴圈,若再搭配條件判斷便可以進行串列(下面程式藍色部分) 與並列(下面程式綠色部分)處理。 Always@(判斷條件1 or 判斷條件2 or … or 判斷條件n) begin if (判斷條件1) <敘述區塊> end else if (判斷條件2) else Always@(判斷條件1 or 判斷條件2 or … or 判斷條件n) begin if (判斷條件1) <敘述區塊> end if (判斷條件2) else 二個if會同時判斷
EX. Always @(posedge CLK or negedge CLR) //如果CLK在正緣觸發或是CLR在負緣觸發時便執行 //下面的敘述 begin //如同C語法的{ if (!CLR) //如果觸發的是CLR且為0則執行以下敘述 q=1’b0; //如果觸發的是CLR且為0則q清除為0,一行故if敘述式可加可不加begin end else //否則,如果不是CLR的觸發(也就是CLK時) begin //因為else裡面敘述事不只一個,故要加begin end q=d; //若不是CLR則q輸出d(輸入端)的資料 cont = cont +1; end //因為else裡面敘述事不只一個,故要加begin end end //如同C語法的}
「 Case … endcase 」 Case 類似if else的寫法,依照case後面的條件狀況判斷式,來判斷要進入哪一個狀況執行裡面的敘述式,否則執行default(類似else)裡面的敘述式。 case (條件狀況判斷式) 狀況1: begin <敘述式1> end 狀況2: <敘述式2> . default: <敘述式n> endcase
EX. Case (s) //若S的狀態改變時便進入case敘述式 2’b00: //若S的狀態式2bit 00的話便進入以下敘述式 begin //敘述式開始 y = i[0]; cont = cont+1; end //敘述式結束 2’b01: //若S的狀態式2bit 01的話便進入以下敘述式 begin //敘述式開始 y = i[1]; 2’b10: //若S的狀態式2bit 10的話便進入以下敘述式 y = i[3]; end //敘述式結束 default: //否則進入以下敘述式 y = i[4]; endcase //本case敘述式結束
「 While 」 在While語法中,後面所接的條件判斷式如果為“真”則一直執行While內部的敘述式,直到該判斷式為“假”才停止執行。 begin <敘述式> end
EX. Parameter i=10; //設定 i = 10 while (i>0) //如果i >0的話就執行內部敘述式,一直到i <0結束 begin //敘述式開始 $display(“i=%d”,i); //把i的值用十進制的方式顯示出來 i= i-1; //目的是要把i減到停止執行while迴圈(即i<0) end //敘述式結束
Question & Answer