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