Verilog 介紹

Verilog 是一種用於類比電子系統的硬體描述語言(HDL)。它最常描述的是抽象的暫存器傳輸級(RTL)的電子系統。它還用於驗證類比電路和混合訊號電路。其結構和主要原則(如下所述)旨在描述和成功實施電子系統。

  • 剛性
    電子電路是具有固定結構的物理實體,Ve​​rilog 適用於此。模組(模組),埠(輸入/輸出/輸入),連線(電線),塊(@always),暫存器(reg)都在編譯時固定。實體和互連的數量不會動態變化。頂層始終有一個模組代表晶片結構(用於合成),一個在系統級用於驗證。
  • 並行性
    物理晶片中固有的同時操作通過始終(大多數通用),初始和 fork / join 塊在語言中模仿。
  module top();
  reg r1,r2,r3,r4; // 1-bit registers
    initial
    begin
      r1 <= 0 ;
    end
    initial
    begin
      fork
         r2 <= 0 ;
         r3 <= 0 ;
      join
    end
     always @(r4)
        r4 <= 0 ;
 endmodule

所有上述語句在同一時間單元內並行執行。

  • 定時和同步
    Verilog 支援各種結構來描述電路的時間特性。電路中的時序和延遲可以在 Verilog 中實現,例如#delay 結構。類似地,Verilog 還適用於同步和非同步電路以及使用各種結構的觸發器,鎖存器和組合邏輯等元件,例如始終模組。還可以通過公共時鐘訊號同步一組塊,或者可以基於特定的輸入集觸發塊。

    #10   ;                 // delay for 10 time units
    always @(posedge clk )  // synchronous 
    always @(sig1 or sig2 ) // combinatorial logic  
    @(posedge event1)       // wait for post edge transition of event1
    wait (signal  == 1)     // wait for signal to be 1
    
  • 不確定性
    Verilog 支援電子電路中固有的一些不確定性。X 用於表示電路的未知狀態。Z 用於表示電路的未驅動狀態。

    reg1 = 1'bx;
    reg2 = 1'bz;
    
  • 抽象
    Verilog 支援不同抽象級別的設計。設計的最高抽象級別是 Resister 傳輸級別(RTL),下一個是門級別,最低階別是單元級別(User Define Primitives),RTL 抽象是最常用的。Verilog 還支援行為抽象級別,而不考慮主要用於驗證的設計的結構實現。

 // Example of a D flip flop at RTL abstraction
module dff (
 clk    , // Clock Input
 reset  , // Reset input
 d       , // Data Input
 q        // Q output
 );
 //-----------Input Ports---------------
 input d, clk, reset ;

 //-----------Output Ports---------------
 output q;

 reg q;

 always @ ( posedge clk)
 if (~reset) begin
   q <= 1'b0;
 end  else begin
   q <= d;
 end

endmodule

// And gate model based at Gate level abstraction 
module and(input x,input y,output o);

wire  w;
// Two instantiations of the module NAND
nand U1(w,x, y); 
nand U2(o, w, w); 

endmodule

// Gate modeled at Cell-level Abstraction
primitive udp_and(
a, // declare three ports
b,
c 
);
output a;   // Outputs
input b,c;  // Inputs 

// UDP function code here
// A = B & C;
table
 // B  C    : A 
    1  1    : 1;
    0  1    : 0;
    1  0    : 0;
    0  0    : 0;
endtable

endprimitive

Verilog 有三個主要用例。它們確定程式碼的結構及其解釋,並確定使用的工具集。所有這三個應用程式都是成功實現任何 Verilog 設計所必需的。

  1. 物理設計/後端
    Verilog 主要用於將設計視為實現邏輯設計的互連門矩陣。RTL / logic / Design 經歷了從綜合 - >佈局 - >時鐘樹構造 - >路由 - > DRC - > LVS - >到 tapeout 的各個步驟。精確的步驟和順序根據實施的確切性質而有所不同。
  2. 模擬
    在此用例中,主要目標是生成測試向量,以根據規範驗證設計。在這個用例中編寫的程式碼不需要是可綜合的,它仍然在驗證範圍內。這裡的程式碼更像是 for / while / do 迴圈等通用軟體結構。
  3. 設計
    設計涉及通常在 RTL 抽象級實現電路規範。然後給出用於驗證的 Verilog 程式碼,並且為物理實現提供完全驗證的程式碼。程式碼只使用 Verilog 的可合成結構編寫。某些 RTL 編碼風格可能導致模擬與合成不匹配,必須注意避免這些。

有兩個主要的實施流程。它們還會影響 Verilog 程式碼的編寫和實現方式。某些樣式的編碼和某些結構更適合於一個流程而不是另一個流程。

  • ASIC 流程(專用積體電路)
  • FPGA 流程(現場可程式設計門陣列) - 包括 FPGA 和 CPLD