文章目录
- 什么是 Verilog HDL?
- Verilog 主要能力
- 模块
- 时延
- 数据流描述方式
什么是 Verilog HDL?
Verilog HDL是一种硬件描述语言,用于从算法级、门级到开关级的多种抽象设计层次的数字系统建模。被建模的数字系统对象的复杂性可以介于简单的门和完整的电子数字系统之间。数字系统能够按层次描述,并可在相同描述中显式地进行时序建模。
Verilog HDL 语言具有下述描述能力:
- 设计的行为特性
- 设计的数据流特性
- 设计的结构组成
- 包含响应监控和设计验证方面的时延和波形产生机制
所有这些都使用同一种建模语言。此外, Verilog HDL语言提供了编程语言接口,通过该接口可以在模拟、验证期间从设计外部访问设计,包括模拟的具体控制和运行。
Verilog 主要能力
- 基本逻辑门,例如
and
、or
和nand
等都内置在语言中。 - 提供显式语言结构制定设计中的端口到端口的时延及路径时延和设计的时序检查。
- 可采用三种不同方式或混合方式对设计建模。这些方式包括:行为描述方式——使用过程化结构建模;数据流方式——使用连续赋值语句方式建模;结构化方式——使用门和模块实例语句描述建模。
- Verilog HDL中有两类数据类型:线网数据类型和寄存器数据类型。线网类型表示构件间的物理连线,而寄存器类型表示抽象的数据存储元件。
- Verilog HDL 还具有内置逻辑函数,例如
&
(按位与)和|
(按位或)。 - 对高级编程语言结构,例如条件语句、情况语句和循环语句,语言中都可以使用。
模块
模块是 Verilog 的基本描述单位,用于描述某个设计的功能或结构及其与其他模块通信的外部端口。一个设计的结构可使用开关级原语、门级原语和用户定义的原语方式描述; 设计的数据流行为使用连续赋值语句进行描述; 时序行为使用过程结构描述。一个模块可以在另一个模块中使用。
一个模块的基本语法如下:
module module_name(port_list);
Declarations:
reg, wire, parameter,
input, output, inout,
function, task,...
Statements:
Initial statement
Always statement
Module instantiation
Continuous assignment
endmodule
时延
Verilog HDL 模型中的所有时延都根据时间单位定义。下面是带时延的连续赋值语句实例:
assign #2 Sum = A ^ B;
#2
指 2 个时间单位。使用编译指令将时间单位与物理时间相关联。这样的编译器指令需在模块描述前定义,如下所示:
` timescale 1ns/100ps
此语句说明时延时间单位为 1ns 并且时间精度为 100ps (时间精度是指所有的时延必须被限定在 0.1ns 内)。如果此编译器指令所在的模块包含上面的连续赋值语句, #2
代表 2ns。
数据流描述方式
用数据流描述方式对一个设计建模的最基本的机制就是使用连续赋值语句。在连续赋值语句中,某个值被指派给线网变量。连续赋值语句的语法为:
assign [delay] LHS_net = RHS_ expression
右边表达式使用的操作数无论何时发生变化, 右边表达式都重新计算, 并且在指定的时延后变化值被赋予左边表达式的线网变量。 时延定义了右边表达式操作数变化与赋值给左边表达式之间的持续时间。如果没有定义时延值, 缺省时延为 0。
例如,用数据流描述方式建模下图所示解码器电路模型:
`timescale 1ns/1ns
module Decoder2x4(A, B, EN, Z);
input A, B, EN;
output[3:0] Z;
wire Abar, Bar;
assign #1 Abar = ~ A;
assign #1 Bbar = ~ B;
assign #2 Z[0] = ~ (Abar & Bbar & EN);
assign #2 Z[1] = ~ (Abar & B & EN);
assign #2 Z[2] = ~ (A & Bar & EN);
assign #2 Z[3] = ~ (A & B & EN);
endmodule
再次强调,连续赋值语句是并发执行的,也就是说各语句的执行顺序与其在描述中出现的顺序无关。