You are on page 1of 32

Verilog HDL

National Yunlin University of


Science and Technology
蔡宗穎
 Gateway Design Automation
 Cadence Design Systems, Inc

語法基礎
1. 以 C 程式語言為基礎設計一種語言
2. 由大寫小寫字體所宣告的標誌會視為兩種

不同的個體
3. 所以關鍵字都由小寫字體構成

4. 註解有兩種宣告

一 . 註解一行要使用 //
二 . 註解超過一行則用 /* 而在結束處用 */
數值宣告
• 公式 :
< 位元數 >’ < 基底形式 > < 數值 >

一般定義是用十進位

EX:

二進位整數 :5’b11110

八進位整數 :6’o36

十六進位整數 :8’h1e

以上轉換為十進位表示 30


狀態表現方式
資料宣告
• 1 宣告資料時 , 要先指定資料型態給予每個
資料定義名稱。
• 公式 :
< 資料型態 > < 定義名稱 1> < 定義名稱

2>
EX:

real a, b ,c; // 宣告三個變數 , 定義名稱


abc
Reg [3:0] string; // 宣告 4 位元暫存器 ,
定義名 稱為 string
暫存器 (register) 與接線 (net)
• 1. 暫存器是系統主要資料存放單位 , 其預
設寬度為 1 位元。
• 2. 暫存器會記憶內存值 , 直到電源消失或
是改變內存值動作為止。
• 3. 接線是連接實體電路 , 預設寬度為 1 位
元。
• 4. 接線無法記憶任何資料 , 故必須持續驅
動。
暫存器的宣告
• 公式 :
• Reg< 暫存器位元數 > < 暫存器名稱 >
• 暫存器位元數通常是
[ 最大位元數 : 最小位元數 ]

Ex:

Reg [6:0] din ; // 宣告一個 7 位元暫存器 ,


其定義名稱為 din 。
• data storage elements … | default value
is x
(variable, register)


接線的宣告方式
• 公式 :
• < 接線種類 > < 驅動強度 > < 接線位元數
>< 接線名稱 >
• 接線位元數通常是
[ 最大位元數 : 最小位元數 ]

• Ex:
• wire net0;
• trireg(medium) capacitor ; // 驅動強度
medium
• A real wire in hardware | default value is z

Compiler Directives
` WORD_SIZE
`define
'define WORD_SIZE 32 reg [`WORD_SIZE-1:0] reg32 ( = reg [32-1:0] reg32 )
= reg [31:0]

'define WORD_REG reg [31:0] 'WORD_REG reg32 ( = reg [31:0] reg32;)

`define A …
`define B …
`define C … Note:
module KM ( inA, inB, outC);
input [`A-1:0] inA; Directive ` ~
`
input [`B-1:0] inB;
output [`C-1:0] outC;


Number ’ “

(2’b10) ‘
endmodule
System task
All system tasks appear in the form $<keyword>

displaying on the screen $display


monitoring values of nets $monitor
stopping $stop
finishing $finish

System Task Usage Format


%d or %D
Display
variable in decimal
$display $display(p1, p2, p3,....., pn); %b or %B variable in binary
%h or %H variable in hex
$monitor $monitor(p1, p2, p3,....., pn); %t or %T in current time format
$stop $stop; %s or %S
%c or %C
string
ASCII character
$finish $finish; %m or %M hierarchical name
Module
公式
• module < 模組名稱 > < 輸出入 >< 輸出
入列表 >
• < 程式內文 >
 endmodule
• Ex:
• module dff (q,qb,clk,d,rst);
• input clk,d,rst;
• Output q,qb;
運算子
• 1. 比較運算子
• 運算子 定義 運算子數量

< a<b // 若 a 小 2
於 b, 回傳值為
> a>b
1 // 若 a 大 2
於 b, 回傳值為
>= a>=b
1 // 若 a 2
小於等於 b, 回
<= 傳值為 1// 若 a 2
a<=b
大於等於 b, 回
傳值為 1
算數運算子

運算子 定義 運算元數量
* a*b //a 乘以 b 2
/ a/b //a 除以 b 2
+ a+b //a 加 b 2
- a-b //a 減 b 2
% a%b //a 除以 b 之餘 2

邏輯運算子

運算子 定義 運算元數量

&& a&&b // 若 a 和 b 的 2
and 運算結果為 1, 則
|| a||b
回傳值為 // 若 a1和 b 的 or 2
運算結果為 1, 則回
! !a
傳值為 1 a 的 not 運 1
// 若
算結果為 1, 則回傳
值為 1
相等運算子

運算子 定義 運算元數量

== a==b; 當 a 的值等於2
b, 則回傳值為 1
!= a!=b; 當 a 的值不等 2
於 b, 則回傳值為 0
=== a===b; 當 a 的狀態 2
等於 b 狀態 , 則回傳
!== 值為 1 當 a 的狀態 2
a!==b;
不等於 b 狀態 , 則回
傳值為 0
運算式
• 1. 平行運算式

• 2. 條件運算式

• 3.case 運算式

• 4. 迴圈運算式
平行運算式
• fork.......join 可用來指定同步進行的運
算 , 當 fork 到 join 之間的區塊啟動 , 會
同時啟動
• 公式 :
• fork
• < 程式內文 >
• join

範例
• /* 區塊啟動後 , 同時將 a 與 b 設為 1
• 區塊啟動後 , 經過 100 個時間單位 , 將 data 值設為 0
• 區塊啟動後 , 經過 120 個時間單位 , 將 data 值設為 1
• */
begin : block

fork

• a<=1;
• b<=1;
• #100 data <=0;
• #120 data <=1;
join


條件運算式
• 1.The if statement is a conditional
statement

• 2. The if statement evaluates the
 expression which was a result of true
or false If the expression is true
.statement is executed. If the
expression is false, the program
continues without executing the
statement
一個簡單的想法
• 例如 :
 如果我是大專生 , 就可以考預官。

 如果敘述成立 ( 我是大專生 ), 可以執行後


面的敘述 ( 考預官 ) 。如果敘述不能成立
( 我是大專生 ), 不可以執行後面的敘述 ( 考
預官 ) 。能不能考預官 , 在於我是不是大專
生。

case 運算式
• 公式 :
case

< 狀況 1> : < 狀況 1 成立時 , 所要執行的內

文>
< 狀況 2> : < 狀況 2 成立時 , 所要執行的內

文>
.

.

< 狀況 n> : < 狀況 n 成立時 , 所要執行的內

文>
default : < 上述狀況不成立時 , 所要執行的內

文>
範例
• case(select)
• 0: out[0] <=1; // 當 select=0, 則
out[0] 的值為 1
• 1: out[1] <=1; // 當 select=1, 則
out[1] 的值為 1
• 2: out[2] <=1; // 當 select=2, 則
out[2] 的值為 1
• default : out <=0; // 若上述狀況不成
立 , 則指 定 out=0
• endcase
Switch Statement
• A switch statement is equivalent to multiple if-else statements.
switch (variable)

{

 case constant1:
 statement(s);
 break;
 case constant2:
 statement(s);
 break;
 case constantN:
 statement(s);
 break;
default:

 statement(s);
 }
迴圈運算式 (for ,while)
• for(i=0; i<7; i=i+1)
• memory[i] <=0;

• while(delay)
• begin
• value <=oldvalue;
• delay <= delay-1;
• end
數值與狀態的指定
(assignment)
• 1. 持續指定
• 2. 程序指定
• 程序指定又分為限制指定與非限制指定
持續指定
將驅動源接到被驅動電路上 , 產生組合邏輯電路
• 公式 :
• < 接線種類 > < 延遲 > < 驅動強度 > < 接
線名稱 >
= < 驅動源 >

• Ex
• wire #10 (string1,pull0) net15 =
enable;
• wire net15;
• assign #10 (string1,pull0) net15 =
程序指定
 將驅動源接到被驅動的暫存器 , 整數 , 實數時間變數上
Ex:

always @(posedge clk)


begin

if (b_en)

a<=b;

else

a<=c;

end

 上面的 always 句子描述了另外一種使用的方法,例


如,任何在表列中的實體,像是 posedge clk 的內容在
任何時候有所改變, always 後的就會被執行。
限制指定
• 指定運算的描述是 「 = 」 運算子,也就是
「阻塞賦值」 (blocking) 的賦值方式。
當使用「 = 」 運算子時後,所有的東西
都會循序的執行,類似普通的程式語言一
樣。
非限制指定
• Verilog 中的「 <= 」運算子的是它成為
硬體描述語言而跟普通程序語言不同之
處。這種敘述稱為 " 非阻塞賦
值 " ( non-blocking )。當電路模擬執
行時候,所有使用 "<=" 運算子的訊號
( signals )都是平行被執行。
參考文獻
• 1.verilog HDL
• 2.SOPC 系統設計
• 3.SOC 開發實戰使用 VERILOG
• 4. 計算機概論
• 5. C+Program+Control