从头学起Verilog:Verilog逻辑设计

Posted wt2110

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从头学起Verilog:Verilog逻辑设计相关的知识,希望对你有一定的参考价值。

引言

  经过了组合逻辑和时序逻辑的复习,终于到了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中的基础内容进行了总结,主要是复习和回顾。需要额外关心的地方已经加粗标出。如果有什么不足希望大家能够指出,共同学习。

以上是关于从头学起Verilog:Verilog逻辑设计的主要内容,如果未能解决你的问题,请参考以下文章

ASIC-WORLD Verilog一日Verilog

如何用verilog设计有限状态机

基于verilog的四位全加器设计

Verilog定义向量的数组后如何选择某个向量?

verilog 逻辑运算符

Verilog Tutorial(10)如何实现可复用的Verilog设计?