1. 程式人生 > 實用技巧 >verilog設計知識集合

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 工作庫定義