引言
经过了组合逻辑和时序逻辑的复习,终于到了Verilog部分。这里主要介绍Verilog一些基础内容,包括结构化模型、TestBench编写和仿真、原语及真值表模型。
这部分内容不多,也都十分基础,大家可以看个乐呵,看个意思,但是有一些细节还是需要注意的。
Verilog结构化模型
结构化和语言规则
下图以示例的形式分别说明了1995版和2001/2005版Verilog语法下的结构化模型,两者的不同主要体现在模块输入输出端口的声明中。端口可以是input、output,也可以是inout双向端口(可用用于存储器与总线直接的数据传输)。
Verilog大小写敏感,名称可以包含字母、数字、下划线和$,变量名第一个字符不可以是数字或$。
四值逻辑:0,1,x,z,x表示未知(wire被相反逻辑所驱动),z表示高阻(连接线不与驱动相连接)。
除endmodule外,Verilog的每个表述文本都要以";"结束(与各种软件编程语言类似)。
注释可以用"//"单行注释,也可以用"/* */"范围注释。
矢量Sum[3:0]指四位位宽,左侧高位,右侧低位。若一个八位变量t[7:0],存储4,则t[2]对应1,t[3:0]是4,t[3:1]是2。
线网用于结构间的连接,wire类型,默认,输入即变化,不需要触发。
reg需要有触发,否则保持值,需要过程赋值语句(always,initial)触发,即只能这过程赋值语句中触发。
= 阻塞赋值 <=非阻塞赋值
定长数:默认十进制 8‘b0001_0001 表示8位二进制数,存储值为00010001,_便于增加可读性。
自顶向下的设计(电路较大的时候十分有必要)
架构:一个设计的高层次的划分和组织结构。
将一个复杂系统划分为多个易于处理和实现的功能单元来设计,划分后的各单元模块设计更容易、测试更简单。
如图,一个16位全加器可以被分解为4个4位全加器,4位全加器可以被分解为4个全加器,全加器可以被分解为两个半加器。通过模块嵌套可以清楚地实现。
实现代码如下:
TestBench编写和仿真
这里首先给出一个testbench的模版。一个模块完成后,需要编写对应的TestBench文件以测试该模块的功能。TestBench是一个额外的文件。
在文件开始,一般需要使用 `include "XX.v" 包含要测试的模块;一般使用 `timescale 1ns/1ps 来定义时延单位和时延精度(注意,这里的"`"不是单引号,是ESC下面的那个符号),时间单位和时间精度只能是1、10和100这三种整数,单位有s、ms、us、ns、ps和fs,时延单位必须要大于时延精度。
reg型变量一般作为模块的输入变量,信号发生,通过在过程赋值语句中改变输入变量值的不同组合,观察输出信号是否符合预期。初始值为x。
wire型变量一般作为模块的输出变量,可以随输出即刻变化。初始值为z。
# 延迟值 表示延时多少延迟单位。
延时
传播延时
Verilog中所有基本门和线网都有一个默认的零传播延时。
延时可以通过“# 延迟时间”的形式实现仿真。将“#1”插入到每个门例化名的前面。
惯性延时
每个传导线路都有电容性和电阻性,电荷无法一瞬间积累或消散。
Verilog把一个门的传播延时作为可以影响输出对应输入脉冲最小宽度(即输入脉冲宽度要大于等于门的传播延时才会影响输出)
传输延时
即传输线上延时可通过:
wire #2 A_long_wire 进行模拟
真值表模型(UDP)
用真值表直接表示逻辑功能。一位标量输出。
不匹配自动赋值x,z输入处理为x,?可以表示任意。
组合逻辑
格式
primitive 模块名(output a,input b,c);
table
//b&c=a
0 0 : 0;
0 1 : 0;
1 0 : 0;
1 1 : 1;
endtable
endprimitive
时序逻辑
格式1:
// enable data : state : next_state/out
1 1 : ? 1
即在enable=1、data=1、state任意条件下,输出next_state为1(必须为reg类型)。
格式2:
// clk data : state : next_state/out
(10) 0 : ? : 0
即在下降沿,输入data=0,state为任意状态条件下,输出为1。
总结
本文针对Verilog中的基础内容进行了总结,主要是复习和回顾。需要额外关心的地方已经加粗标出。如果有什么不足希望大家能够指出,共同学习。
原文地址:https://www.cnblogs.com/wt2110/p/12425792.html