当前位置:
文档之家› 第2讲 Verilog HDL层次建模
第2讲 Verilog HDL层次建模
2.1.6 自顶向下的设计实例
例2.3 脉动进位计数器顶层模块
例2.4 触发器T_FF 例ຫໍສະໝຸດ .5 带异步复位的D触发器 D_FF
例2.6 激励模块
激励信号和波形输出
2.1.7 小结
用于数字电路设计的两种方法:自顶向下方法和自底向上
方法。在当今的数字电路设计中,这两种方法经常组合使 用。随着设计复杂性的增加,使用这些结构化的方法来进 行设计管理变得越来越重要。 模块是Verilog中的基本功能单元。模块通过调用(实例引 用)来使用,模块的每个实例都被惟一标识,以区别于同 一模块的其他实例。每个实例都拥有其模板模块的不同副 本。读者需要将模块和模块实例区别开来。 仿真有两个不同的组成部分:设计块和激励块,激励块用 于测试设计块。激励块通常是顶层模块。对设计块施加激 励有两种不同的模式。 以脉动进位计数器为例,一步步地解释了为各个部分创建 仿真的过程。
说明为向量,则默认线网的位宽为1。线网的默认值为 z(trireg类型的线网例外,其默认值为x)。线网的值 由其驱动源确定,如果没有驱动源,则线网的值为z。
2.2.2.3 寄存器(reg,integer,real,time)
寄存器用来表示存储元件,它保持原有的数值,直到被
改写。寄存器数据类型一般通过使用关键字reg来声明, 默认值为x。例3.1给出了如何使用寄存器的例子。 例3.1 寄存器的声明和使用
一个模块的示例
Verilog HDL的四种描述方式
行为或算法级:Verilog所支持的最高抽象层次。设计者只
注重其实现的算法,而不关心其具体的硬件实现细节。在 这个层次上进行的设计与C语言编程非常类似。 数据流级:通过说明数据的流程对模块进行描述。设计者 关心的是数据如何在各个寄存器之间流动,以及如何处理 这些数据。 门级:从组成电路的逻辑门及其相互之间的互连关系的角 度来设计模块。这个层次的设计类似于使用门级逻辑简图 来完成设计。 开关级:Verilog所支持的最低抽象层次。通过使用开关、 存储节点及其互连关系来设计模块。在这个层次进行设计 需要了解开关级的实现细节。
功能块,说明两种使用激励进行仿真的方法。
2.1.1 设计方法学
两种基本的设计方法:自底向上和自顶向下设计方法
自底向上设计方法:
首先定义顶层功能块,进而分 析需要哪些必要的子模块; 然后进一步对各个子模块进 行,直到达到无法进一步分 解的底层功能块 自顶向下设计方法: 首先对现有的功能块进行分析, 然后使用这些模块来搭建规 模大一些的功能块,如此继 续直至顶层模块
2.1.2 设计示例:四位脉动进位计数器
脉动进位计数器是由下降沿触发的T触发器组成的。每个T触发器可以由下降沿触 发的D触发器和反相器构成计数器的功能。
使用自顶向下的方法进行设计,首先需要说明脉动进位
在使用T触发器搭建起顶层模块之后,进一步使用D触发器和反相门来实现T触发 器。将较大的功能块分解为较小的功能块,直到无法继续分解。 在自底向上的设计方法恰好与此相反:我们不断地使用较小的功能块来搭建大一
2.2 基本语法
理解操作符、注释、空白符、数字、字符串和标识符
的词法约定。
定义逻辑值集合和数据类型,包括线网、寄存器、向
量、数字、仿真时间、数组、参数、存储器和字符串。
学习使用用于显示和监视信息、暂停和结束仿真的系
统任务。 学习用于宏定义、文件包含的基本编译指令。
2.2.1 词法约定
例3.2 带符号寄存器的声明
2.2.2.4 向量
线网和寄存器类型的数据均可以声明为向量(位宽大于
1)。如果在声明中没有指定位宽,则默认为标量(1 位)。 向量通过[high# : low#]或[low# : high#]进行说明,方括 号中左边的数总是代表向量的最高有效位。
操作符
操作符有三种类型:单目操作符、双目操作符和三目操作符, 单目操作符的优先级高于操作数。三目操作符包括两个单独 的操作符,用来分隔三个操作数。 数字声明 Verilog中包括两种数字声明:指明位数的数字和不指明位数 的数字 指明位数的数字的表示形式为:<size>'<base format><number> <size>用于指明数字的位宽度,只能用十进制数表示。合法 的基数格式包括十进制(‘d或’D)、十六进制(‘h或’H)、 二进制(‘b或’B)和八进制(‘o或’O)。数字用连续的阿拉伯 数字0,1,2,3,4,5,6,7,8,9,10,a,b,c,d,e, f来表示。但是,对于不同的基数,只能相应地使用其中的一 部分,并且允许使用大写字母。 例如:4'b1111,16'h3a6f等
如果在数字说明中没有指定基数,那么默认表示为十进制 数。如果没有指定位宽度,则默认的位宽度与仿真器和使 用的计算机有关(最小为32位) X和Z值 Verilog用两个符号分别表示不确定值和高阻值,这两个符 号在实际电路的建模中是非常重要的,不确定值用x表示, 高阻值用z表示。在以十六进制为基数的表示中x或z代表4 位,在八进制的情况下x或z代表3位,在二进制的情况下x 或z代表1位。如果某数的最高位为0,x或z,Verilog语言约 定将分别使用0,x或z自动对这个数进行扩展,以填满余下 的更高位。 负数 对于常数,我们可以通过在表示位宽的数字前面增加一个 减号来表示它是一个负数,因为表示大小的常数总是正的。 将减号放在基数和数字之间是非法的。对于带符号的算术 运算,可以增加一个可选的带符号说明符来表示负数
些的模块。首先使用与门和或门搭建D触发器,或者使用晶体管搭建一个自定义 的D触发器,使自底向上和自顶向下的方法在D触发器这个层次上会合。
2.1.3 模块
Verilog使用模块(module)的概念来代表一个基本的
功能块。一个模块可以是一个元件,也可以是低层次 模块的组合。常用的设计方法是使用元件构建在设计 中多个地方使用的功能块,以便进行代码重用。模块 通过接口(输入和输出)被高层的模块调用,但隐藏 了内部的实现细节。这样就使得设计者可以方便地对 某个模块进行修改,而不影响设计的其他部分。 在Verilog中,模块声明由关键字module开始,关键字 endmodule则必须出现在模块定义的结尾。每个模块 必须具有一个模块名,由它惟一地标识这个模块。模 块的端口列表则描述这个模块的输入和输出端口。
无反馈的模式
这种模式是在激励块中调用(实例引用)并直接驱动
设计块。如下图所示,顶层块为激励块,由它控制clk 和reset信号,检查并显示输出信号q。
有反馈的模式
这种模式是在一个虚拟的顶层模块中调用(实例引用)
激励块和设计块。激励块和设计块之间通过接口进行 交互,如下图所示。激励块驱动信号d_clk和d_reset, 这两个信号则连接到设计块的clk和reset输入端口。激 励块同时检查和显示信号c_q,这个信号连接到设计块 的输出端口q。顶层模块的作用只是调用(实例引用) 设计块和激励块。
2.1.4 模块实例
例2.1 模块调用
例2.2 非法模块嵌套定义
2.1.5 逻辑仿真的构成
设计完成之后,还必须对设计的正确性进行测试。我
们可以对设计模块施加激励,通过检查其输出来检验 功能的正确性。我们称完成测试功能的块为激励块。 将激励块和设计块分开设计是一种良好的设计风格。 激励块一般均称为测试台(test bench)。可以使用不 同的测试台对设计块进测试,以全面验证设计的正确 性。 激励块的设计有两种模式:有反馈的和无反馈的
Verilog中的基本词法约定与C语言类似。Verilog描述包含一个
“单词”流,这里的单词可以是注释、分隔符、数字、字符串、 标识符和关键字。Verilog是大小写相关的,其中的关键字全部 为小写。列出如下: 空白符 空白符由空格(\b)、制表符(\t)和换行符组成。除了字符串 中的空白符,Verilog中的空白符仅仅用于分隔标识符,在编译 阶段被忽略。 注释 有两种书写注释的方法:单行注释和多行注释。 单行注释以“// ”开始,Verilog将忽略从此处到行尾的内容。 多行注释以“/*”开始,结束于“*/”。 多行注释不允许嵌套,但是单行注释可以嵌套在多行注释中。
标识符和关键字
关键字是语言中预留的用于定义语言结构的特殊标识符。Verilog 中的关键字全部小写,附录C中列出了Verilog中的全部关键字的清 单,包括关键字、系统任务和编译指令。 标识符是程序代码中对象的名字。Verilog中的标识符由字母数字字 符、下划线_和美元符 $ 组成。标识符是区分大小写的。Verilog标 识符的第一个字符必须是字母数字字符或下划线,不能以数字或 美元符开始。以美元符开始的标识符是为系统函数保留的。 转义标识符 转义标识符以反斜线“\”开始,以空白符(空格、制表符和换行符) 结束。Verilog将反斜线和空白符之间的字符逐个进行处理。所有 的可打印字符均可包含在转义字符中,而反斜线和表示结束的空 白符不作为标识符的一部分。 如:\a+b-c //与a+b-c等同
2.2.2.2 线网(net: wire,wand,wor,tri,triand,trior,trireg)
线网(net)表示硬件单元之间的连接。就像在真实的
电路中一样,线网由其连接器件的输出端连续驱动。 如下图所示,线网a连接到与门g1的输出端,它将连续 地拥有与门g1的输出值:b & c
线网一般使用关键字wire进行声明。如果没有显式地
f=ab …
主讲 陈付龙
安徽师范大学
2015
第2讲 Verilog HDL层次建模
层次建模 基本语法
模块和接口
2.1 层次建模
理解数字电路设计中的自底向上和自顶向下设计方法。 解释Verilog中模块和模块实例之间的区别。 学习从4种不同的抽象角度来描述同一个模块。 解释数字电路仿真中的各个组成部分,定义激励块和