1. 如何撰寫 Verilog 程式
K書、上課、被當,經過上面的循環,你就會寫 Verilog 程式了。
2. 如何模擬 Verilog 程式
有許多不同的 Verilog 模擬程式,例如:
Altera Quartus II
Cadence Verilog XL
Synopsys VCS
Mentor Graphics Modelsim
上面這些模擬軟體最大的「缺點」是其為商業版,非常昂貴,同學只能在學校使用,無法回家進行練習。因此為了讓各位同學能回家練習,我們上半學期使用 GPL Cver 這套免費的 Verilog 模擬程式。下圖是我們進行 FPGA 時會使用到的流程及工具:
3. 什麼是 Cver
Cver 是由 Pragmatic C Software (http://www.pragmatic-c.com/) 這家公司所發展出來的,在 Cver 發展的時候, Pragmatic 遭遇了 Cadence 及 Synopsys 的夾擊,因此 Cver 在市場推廣不好,因此後來 Pragmatic 決定將 Cver 以 GPL 授權釋出。僅管 Cver 現在是免費的,但不表示他不好用,他的特色是:
1. full 1995 IEEE P1364 - 完整支援 1995 IEEE P1364 標準
2. some of the 2001 P1364 - 部份 2001 P1364 標準
3. 支援三個 PLI 介面 (tf_, acc_, and vpi_)
所以其功能相當適當一般入門至進階同學使用。
4. 如何安裝 GPL Cver
目前 GPL Cver 的官方網址已移至 source forge (http://gplcver.sourceforge.net/),如果你的系統是安裝 Debian 6.0,請執行
apt-get install gplcver
如果不是,請自己想辦法。
5. 如何測試你的系統已安裝 GPL Cver
請執行:
cver \Enter
如果你的系統已安裝 GPL Cver 的話,會出現以下訊息:
GPLCVER_2.12a of 05/16/07 (Linux-elf).
Copyright (c) 1991-2007 Pragmatic C Software Corp.
All Rights reserved. Licensed under the GNU General Public License (GPL).
See the 'COPYING' file for details. NO WARRANTY provided.
Today is Mon Mar 7 09:51:55 2011.
**FATAL ERROR** [301] no Verilog input files specified
最底下的
**FATAL ERROR** [301] no Verilog input files specified
是警告我們沒有提供 verilog 檔給 cver 模擬,但是這不表示 Cver 有問題。
5. 如何使用 Cver
請執行:
cver a.v test_a.v \Enter
6. Module 的命名方式:
要為一個 Verilog 的 Module 命名,最大的前題是:N 年後你知道這是什麼電路,如何使用此電路。舉例來說:以下二個 module 那一個比較好 ?
module half_adder()
endmodule
module ha()
endmodule
假設此電路程式放了 N 年,N 年後你還會認得的是 half_adder 還是 ha ? 所以在替 module 命名時,不要偷懶,免得無法重複使用。
7. Verilog 的存檔命名:
假設你使用 gate level 的方式撰寫 half adder,請問以下二個存檔那一個比較好 ?
ha.v
ha_gate.v
ha_rtl.v -> 以 RTL 方式所寫的 half adder
答案很明顯是 ha_gate.v,它在檔名就告訴我們這是 gate level 的存檔。
8. 如何撰寫 test fixture (測試程式)
8.1 什麼是 test fixture ?
當我們寫完 verilog 電路後,我們必須證明它是對的,因此我們要寫 test fixture 來針對我們所寫的 verilog 程式進行測試。
8.2 test fixture 的內容
一個 test fixture 就是一個 verilog module,以半加器 test fixture 為例,其語法大致如下:
module test_ha;
reg definition -> 暫存器定義
wire definition -> 線定義
other definition -> 其它定義
half_adder ha0 () -> 呼叫我們要進行測試的電路
initial begin -> 開始進行波形輸入
$dumpvars; -> 產生 gtkwave 語法
$dumpfile("testha.dmp"); -> 將波形以 VCD 格式存在 testha.dmp 檔中,
testha.dmp 可照自己的需求改名字
simulation command 模擬指令,以下特別說明!!
$dumpall; -> 紀錄所有訊號
$dumpflush; -> 必要
#10 $finish; -> 在 10 個時間單位後結束模擬
end -> 結束 initial begin
end -> 結束 initial begin
endmodule
在 simulation command 的部份,我們需要針對半加器的動作來進行完整測試,請問什麼是半加器的完整測試 ? 要判別一個半加器是否完整動作,最簡單的方法是把真值表上的每一列都模擬一次,如果輸出/入之狀態完全符合真值表,則我們可以確認此電路工作正常。
x y | Sum Cout
-----+-----------
0 0 | 0 0
0 1 | 1 0
1 0 | 1 0
1 1 | 0 1
因此一個完整的半加器 test fixture 如下,我們將其存為 test_ha.v
1 | module test_ha; |
2 | reg a, b; |
3 | wire sumX, coutX; |
4 |
|
5 | half_adder ha0(a, b, sumX, coutX); |
6 |
|
7 | initial begin |
8 | $dumpvars; |
9 | $dumpfile("testha.dmp"); |
10 |
|
11 | #0 a=0; |
12 | b=0; |
13 |
|
14 | #10 a=0; |
15 | b=1; |
16 |
|
17 | #10 a=1; |
18 | b=0; |
19 |
|
20 | #10 a=1; |
21 | b=1; |
22 |
|
23 | $dumpall; |
24 | $dumpflush; |
25 | #10 $finish; |
26 | end |
27 | endmodule |
8.3 進行 verilog 測試模擬
請執行
cver ha_gate.v test_ha.v \Enter
理論上應該輸出如下:
GPLCVER_2.12a of 05/16/07 (Linux-elf).
Copyright (c) 1991-2007 Pragmatic C Software Corp.
All Rights reserved. Licensed under the GNU General Public License (GPL).
See the 'COPYING' file for details. NO WARRANTY provided.
Today is Mon Mar 7 11:25:30 2011.
Compiling source file "ha_gate.v"
Compiling source file "test_ha.v"
Highest level modules:
test_ha
Halted at location **test_ha.v(25) time 40 from call to $finish.
There were 0 error(s), 0 warning(s), and 4 inform(s).
我們會發現沒有 error、沒有 warning,而且會有個檔案叫 testha.dmp,接下來就可以用 GTKwave 觀察波形了。
9. 使用 GTKwave
請執行
gtkwave testha.dmp
來載入模擬波形檔
作業 1. 畫 Full Adder 的電路圖
以 Gate Level 寫 Verilog 程式
撰寫 test fixture,並跑模擬,可存檔檔名為 testfa.dmp
列印波形