Verilog 介绍
Verilog 是一种用于模拟电子系统的硬件描述语言(HDL)。它最常描述的是抽象的寄存器传输级(RTL)的电子系统。它还用于验证模拟电路和混合信号电路。其结构和主要原则(如下所述)旨在描述和成功实施电子系统。
- 刚性
电子电路是具有固定结构的物理实体,Verilog 适用于此。模块(模块),端口(输入/输出/输入),连接(电线),块(@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 设计所必需的。
- 物理设计/后端
Verilog 主要用于将设计视为实现逻辑设计的互连门矩阵。RTL / logic / Design 经历了从综合 - >布局 - >时钟树构造 - >路由 - > DRC - > LVS - >到 tapeout 的各个步骤。精确的步骤和顺序根据实施的确切性质而有所不同。 - 仿真
在此用例中,主要目标是生成测试向量,以根据规范验证设计。在这个用例中编写的代码不需要是可综合的,它仍然在验证范围内。这里的代码更像是 for / while / do 循环等通用软件结构。 - 设计
设计涉及通常在 RTL 抽象级实现电路规范。然后给出用于验证的 Verilog 代码,并且为物理实现提供完全验证的代码。代码只使用 Verilog 的可合成结构编写。某些 RTL 编码风格可能导致模拟与合成不匹配,必须注意避免这些。
有两个主要的实施流程。它们还会影响 Verilog 代码的编写和实现方式。某些样式的编码和某些结构更适合于一个流程而不是另一个流程。
- ASIC 流程(专用集成电路)
- FPGA 流程(现场可编程门阵列) - 包括 FPGA 和 CPLD