verilog設計知識集合
verilog設計知識集合
一、基本知識
verilog HDL,verilog硬體描述語言,可從上層到下層一直設計,使用一些列分層的模組來表示極其複雜的數字系統的語言。利用EDA工具將模組轉化為網表,再使用FPGA或者ASIC實現具體的電路結構。
另外一門比較出名的是硬體描述語言是VHDL,偏重標準化考慮。
兩門語言的描述能力略有差別,verilog的系統抽象能力的較弱,門級和開關電路級的描述能力比VHDL強。
主流設計方法是RTL設計,從RTL描述生成網表;行為級綜合工具允許直接對電路的演算法和行為描述。
二、設計流程和通用設計方法論
1、完整工程通用設計方法
(1)設計規範
對整個專案的設計情況和要求具體描述:
1️⃣展示晶片與系統關係的外部框圖:系統描述
2️⃣展示每一部分功能的內部框圖:功能描述
3️⃣IO引腳的描述:引腳描述
4️⃣定時估計:時序描述
5️⃣器件門數估計:面積估計
6️⃣封裝形式:封裝估計
7️⃣功耗形式:功耗估計
8️⃣價格目標:價格估計
還有測試程式,這個是在設計中不斷新增的。
(2)設計規範評估
用於設計規範的可用性的評估,決定是否可行。
(3)選擇器件和工具
選擇晶片和對應的EDA工具,如Xilinx的晶片和vivado、Altera(inter)的晶片和quartus或者其他的系列。
(4)設計
採用從上到下的方法,按照器件的結構來工作,使用合適的設計方法,解決設計中的問題。
(5)檢驗
對設計的原始碼進行模擬,完成RTL級模擬結果和門級模擬結果的一致。這簡稱前模擬。在佈局佈線前還需要時序分析和後模擬。
(6)最終的評估
形式上確認無誤
(7)系統整合和測試
晶片投產後進行連續的器件和系統的可靠性測試。
2、verilog HDL設計方法
(1)Bottom-Up
先出系統框圖,然後劃分模組,再進行設計,然後將設計綜合成系統。
優點實現各個子模組的時間較短。
缺點是對整個系統的功能把握不足,整個系統實現時間較長,對設計人員相互協作的能力要求較高,結構設計錯誤容易造成較大損失。
(2)Top-Down
對整個系統進行方案設計和高層次的功能劃分,使用低層次實現高層次的功能,一個設計分為樹形結構。可以購買末端的設計。
優點:設計開始時就完成了系統分析,主要模擬和除錯過程在高層次完成,可以儘早完成結構設計上的錯誤。方便了從系統級劃分和管理整個專案。
缺點:得到的最小單元不標準,製作成本可能比較高。
(3)綜合使用
1️⃣設計開始時,對系統的行為進行模擬,模擬成功後轉化為RTL級描述
2️⃣RTL級描述,RTL級行為級描述硬體有關。
3️⃣邏輯綜合,將RTL級描述轉化為網表。
三、verilog語法的基本概念
1、模組(module)
verilog的模組可以對應不同級別的抽象:
1️⃣系統級2️⃣演算法級3️⃣RTL級4️⃣門級5️⃣開關級
其中123是行為級,前端需要掌握4,後端還需要掌握5,在學習中瞭解每個模組的層次是重要的。
2、功能
(1)順序執行(begin-end)或者並行執行(fork-join)
(2)延時表示式(#)或者事件表示式
(3)通過命名事件觸發其他事件
(4)條件語句(if,case)等迴圈程式結構
(5)提供可帶引數且非零延續的時間的任務task結構
(6)提供可以自定義新的操作符的函式function結構
(7)用於建立表示式的運算子(算數、邏輯、位運算子)
(8)結構化語言也是用於門級和開關級
3、模組的呼叫
通過模組名可以呼叫其他模組,注意埠的一致性。
4、模組測試
模組測試的語法較可綜合的語法會寬泛,允許使用各種測試系統函式(stop,display)。測試的方法就是測試訊號對唄測試模組的呼叫。
四、模組的結構
1、模組的結構
verilog程式包括四個部分:
埠定義,IO說明、內部訊號宣告和功能定義。
module name(io1,io2,io3); input io1; output io2,io3; endmodule
2、資料型別及常量和變數
reg、wire、integer、parameter
reg:暫存器型,always內部賦值專用
wire:連線變數,assign內部賦值專用變數
integer:整型,用於語法描述所需的整數,
parameter:引數,用於模組內部的常量。
具體例項:
1️⃣整型
1'b1,2'o1,3'd1.4'h1,
'b1,'h2,'d3,
1,2,3,
x,z,
2️⃣字串
"abcd","abc\n","ab\\",
"ad%%"
3️⃣變數
wire,tri
reg,integer
memory (reg的陣列)
wire a;
reg [7:0] b;
reg [7:0] b [255:0];
五、verilog HDL運算子
基本原則:
wire和reg是無符號數,
整型和實數型有符號數,
運算元存在x,結果即為x,
//算數操作
a=4’b1100; /*a=12*/ b=4’b0011; /*b=3*/ c=4’b1011; /*b=11*/ $display(a*b); //結果4 (10 0100,按運算元最長位數截短) $display(a/b); //4 $display(a+b); //15 $display(a+c); //7 (1_0111截短到4位) $display(a-b); //9 $display((a+1’b1)%b); //1 $display(-10%3); //-1 $display(11%-3); //2
//位操作
a=4’b1100; b=4’b0011; c=4’b0101; d = 4’b1xx0; e = 4’b0; $displayb(~a); //結果0011 $displayb(a&c); //0100 $displayb(a|b); //1111 $displayb(b^c); //0110 $displayb(a~^c); //0110 $displayb(d&e); //0000
//邏輯操作
a=2; b=0; c=4’hx; $display(a&&b); //結果0 $display(a||b); //1 $display(!a); //0 $display(a||c); //1 $display(a&&c); //x $display(!c); //x $display(b&&c); //0
//比較操作
a=2; b=5; c=2; d=4’hx; e= -2; $display(a<b); // 1 $display(a>b); // 0 $display(a>=c); // 1 $display(d<=a); // x $display(4'b0 <= 4'hx); // x
$display(-2<b); // 0
$display(-2<5); // 1
$display(2-5); // -3
$display(a-b); // 13
$display(e); // 14
這裡注意display顯示符號位和不顯示符號位的要求:全reg型變數顯示符號位,全常量不顯示符號位。混合未知。(在編譯器中會出現亂碼)
//移位操作
a=4’b1010; $displayb(a<<1); //結果4’b0100 $displayb(a>>2); // 4'b0010 $displayb(4'bx<<2); // 4'bxx00 $displayb(4'b1101<<2); // 4'b0100
//連線操作
a=1’b1; b=2’b00; c=6’b101001; $displayb({a, b}); //結果3’b100 $displayb({c[5:3], a}); // 4’b1011 $displayb({4{a}}); // 4’b1111
//縮位操作
a=4’b1111; b=4’b0101; c = 4’b0x1z; $displayb(&a); //結果1 $displayb(|b); // 1 $displayb(^b); // 0
$displayb(&c); //結果0
$displayb(|c); // 1
$displayb(^c); // x
//判斷操作
result = (op==ADD)? a+b : a-b;
止於運算優先順序,多錯幾次就知道了。基本按照C語言走的。
六、verilog語句
1、塊語句
順序快(begin-end)和並行塊(fork-join),兩者的區別在於執行方法。順序塊逐條執行,並行塊整體執行。一般使用begin-end比較符合C的設計習慣。主要差別在於延時的判斷。
2、賦值語句
=阻塞賦值,等式右邊先計算,再一起賦值給左式。
<=非阻塞賦值,等式右邊計算後賦值給左式,然後計算下一條。
起始時間和結束時間:
對於並行塊,最長的就是結束時間。對於順序塊,結束時間是所有延時相加。
3、條件語句
if-else語句和case語句,和C語言大致相似。case的形式有所區別:
case ( rega ) 16’d0: result=7’b0111111; 16’d1: result=7’b1011111; 16’d2: result=7’b1101111; 16’d3: result=7’b1110111; 16’d4: result=7’b1111011; 16’d5: result=7’b1111101; 16’d6: result=7’b1111110; default: result=7’bx; endcase
casez不考慮z,casex不考慮x和z,可以靈活使用。
4、迴圈語句
forever、repeat、while、for
這四個迴圈語句都不可以直接綜合,不能獨立放在程式中。
forever begin end
repeat (numb)begin end
while (條件)begin end
for(初始化,跳出條件,執行語句)begin end
5、結構說明語句
initial always task function
initial:只是執行一次的語句
always:總是執行
task:帶引數的複用模組
function:帶引數的關鍵字宣告。函式不能啟動任務。
task通過引數傳遞結果,function通過返回值傳遞結果。簡單理解,task是可快速呼叫的程式碼,function是自定義的關鍵字。
6、系統函式
• $display和$write 標準輸出任務
• $monitor 模擬監控任務
• $finish和$stop 模擬結束任務
• $time和$realtime等 時間函式
• $fopen…$readmemh等 檔案、儲存器處理
• $random 隨機數函式
7、系統預編譯
• `define 巨集定義
• `include 檔案包含
• `ifdef…`else…`endif 條件編譯
• `timescale 時間定標
• `uselib 工作庫定義