Verilog HDL入门- pdf下载
isbn:9787811242485
出版社
北京航空航天大学出版社
出版年
2019-03-01
页数
390页
ISBN
9787811242485
装帧
精装
评分
8.8(豆瓣)
🔥
已有 391 人购买本书
热销中
⏰
限时特惠
00:00:00
活动结束后恢复原价
纸质书参考价
¥23
电子版限时价
¥5.99
省 18 元
选择版本
✅ 不满意全额退款
✅ 发货失败双倍赔偿
✅ 邮箱即时发送
内容简介
本篇主要提供Verilog HDL入门-电子书的pdf版本下载,本电子书下载方式为百度网盘方式,点击以上按钮下单完成后即会通过邮件和网页的方式发货,有问题请联系邮箱ebook666@outlook.com
内容简介
本书简要介绍了Verilog硬件描述语言的基础知识,包括语言的基本内容和基本结构,以及利用该语言在各种层次上对数字系统的建模方法。书中列举了大量实例,帮助读者掌握语言本身和建模方法,对实际数字系统设计也很有帮助。第3版中添加了与Verilog2001有关的新内容。
本书是VerilogHDL的初级读本,可作为计算机、电子、电气及自控等专业相关课程的教材,也可用作相关科研人员的参考书。
本书是VerilogHDL的初级读本,可作为计算机、电子、电气及自控等专业相关课程的教材,也可用作相关科研人员的参考书。
目录
第1章 简介
1.1 什么是Verilog HDL?1
1.2 历史2
1.3 主要能力2
1.4 练习题4
第2 章 入门指南
2.1 模块5
2.2 延迟7
2.3 数据流风格的描述7
2.4 行为风格的描述9
2.5 结构风格的描述12
2.6 混合设计风格的描述14
2.7 设计的仿真15
2.8 练习题19
第3章 Verilog语言要素
3.1 标识符20
3.2 注释21
3.3 格式21
3.4 系统任务和系统函数22
3.5 编译器指令22
3.5.1 `define和`undef22
3.5.2` ifdef、`ifndef、`else、elseif和 `endif23
3.5.3` default_nettype24
3.5.4` include24
3.5.5` resetall24
3.5.6` timescale25
3.5.7` unconnected_drive 和`nounconnected_drive26
3.5.8` celldefine和`endcelldefine27
3.5.9 line27
3.6 值集合27
3.6.1 整型数28
3.6.2 实数30
3.6.3 字符串30
3.7 数据类型31
3.7.1 线网类型31
3.7.2 未声明的线网35
3.7.3 向量线网和标量线网35
3.7.4 变量类型36
3.7.5 数组41
3.7.6 reg与wire的不同点42
3.8 参数(parameter)42
局部参数43
3.9 练习题44
第4 章 表达式
4.1 操作数45
4.1.1 常数45
4.1.2 参数46
4.1.3 线网46
4.1.4 变量47
4.1.5 位选47
4.1.6 部分位选48
4.1.7 存储器和数组元素49
4.1.8 函数调用50
4.1.9 符号50
4.2 操作符50
4.2.1 算术操作符52
4.2.2 关系操作符55
4.2.3 相等操作符56
4.2.4 逻辑操作符57
4.2.5 按位操作符58
4.2.6 缩减操作符59
4.2.7 移位操作符60
4.2.8 条件操作符62
4.2.9 拼接和复制操作符62
4.3 表达式的类型63
4.4 练习题64
第5章 门级建模
5.1 内建基元(原语)门65
5.2 多输入门66
5.3 多输出门68
5.4 三态门69
5.5 上拉门和下拉门(电阻)70
5.6 MOS开关71
5.7 双向开关72
5.8 门延迟73
5.9 实例数组75
5.10 隐含的线网76
5.11 一个简单的示例76
5.12 24 编码器举例78
5.13 主/从触发器举例78
5.14 奇偶校验电路79
5.15 练习题80
第6章 用户定义的原语(基元UDP)
6.1 UDP的定义82
6.2 组合逻辑的UDP83
6.3 时序逻辑的UDP84
6.3.1 状态变量的初始化85
6.3.2 电平触发的时序逻辑UDP85
6.3.3 沿触发的时序逻辑UDP85
6.3.4 沿触发的和电平敏感的混合行为86
6.4 另一个示例87
6.5 表项的总结88
6.6 练习题88
第7章 数据流建模
7.1 连续赋值语句89
7.2 示例91
7.3 线网声明赋值91
7.4 赋值延迟92
7.5 线网延迟94
7.6 示例95
7.6.1 主/从触发器95
7.6.2 幅值比较器96
7.7 练习题96
第8章 行为级建模
8.1 过程性结构97
8.1.1 initial语句97
8.1.2 always语句100
8.1.3 两类语句在模块中的使用102
8.2 时序控制104
8.2.1 延迟控制104
8.2.2 事件控制105
8.3 语句块109
8.3.1 顺序语句块109
8.3.2 并行语句块111
8.4 过程性赋值113
8.4.1 语句内部延迟114
8.4.2 阻塞性过程赋值115
8.4.3 非阻塞性过程赋值116
8.4.4 连续赋值与过程赋值的比较119
8.5 条件语句121
8.6 case语句122
8.7 循环语句125
8.7.1 forever循环语句125
8.7.2 repeat循环语句126
8.7.3 while循环语句127
8.7.4 for循环语句127
8.8 过程性连续赋值128
8.8.1 assign与deassign语句128
8.8.2 force与 release语句129
8.9 握手协议示例130
8.10 练习题132
第9章 结构建模
9.1 模块134
9.2 端口134
9.3 模块实例引用语句137
9.3.1 未连接的端口139
9.3.2 不同的端口位宽139
9.3.3 模块参数值140
9.4 外部端口144
9.5 举例148
9.6 generate语句151
9.6.1 generate循环语句151
9.6.2 generateconditional条件语句153
9.6.3 generatecase分支语句156
9.7 配置157
9.8 练习题161
第10章 其他论题
10.1 任务162
10.1.1 任务的定义162
10.1.2 任务的调用164
10.2 函数167
10.2.1 函数的定义168
10.2.2 函数的调用171
10.2.3 常数函数172
10.3 系统任务和系统函数172
10.3.1 显示任务173
10.3.2 文件输入/输出任务177
10.3.3 时间标度任务180
10.3.4 仿真控制任务181
10.3.5 仿真时间函数182
10.3.6 转换函数182
10.3.7 概率分布函数183
10.3.8 字符串格式化184
10.4 禁止语句185
10.5 命名事件187
10.6 结构描述方式和行为描述方式的混合使用189
10.7 层次路径名191
10.8 共享任务和函数193
10.9 属性195
10.10 值变转储文件196
10.10.1 四状态型VCD文件196
10.10.2 拓展的VCD文件197
10.10.3 示例198
10.10.4 VCD文件格式200
10.11 指定块 201
10.12 强度207
10.12.1 驱动强度207
10.12.2 电荷强度208
10.13 竞争的状况208
10.14 命令行参变量210
10.15 练习题211
第11章 验证
11.1 编写测试平台213
11.2 波形的生成214
11.2.1 值序列214
11.2.2 重复模式216
11.3 测试平台举例221
11.3.1 解码器221
11.3.2 触发器223
11.4 从文本文件中读取向量225
11.5 向文本文件中写入向量228
11.6 其他示例229
11.6.1 时钟分频器229
11.6.2 阶乘设计231
11.6.3 序列检测器235
11.6.4 LED序列237
11.7 实用程序239
11.7.1 检测x239
11.7.2 将文件传递到任务中240
11.7.3 操作码的调试241
11.7.4 检测时钟脉冲是否出现丢失的情况242
11.7.5 突发时钟发生器242
11.8 练习题243
第12章 建模示例
12.1 简单元素的建模245
12.2 不同风格的建模方式249
12.3 延迟的建模251
12.4 真值表的建模254
12.5 条件操作的建模256
12.6 同步逻辑建模258
12.7 通用移位寄存器262
12.8 格雷码计数器
263
12.9 十进制数计数器264
12.10 并行到串行转换器265
12.11 状态机建模265
12.12 状态机的交互268
12.13 Moore有限状态机的建模272
12.14 Mealy有限状态机的建模273
12.15 简化的黑杰克程序275
12.16 扫描单元278
12.17 7段BCD码译码器279
12.18 实用程序280
12.19 练习题281
附录A 语法参考资料
A.1 关键字282
A.2 语法规则284
A.3 语法284
参考文献315
索引316
1.1 什么是Verilog HDL?1
1.2 历史2
1.3 主要能力2
1.4 练习题4
第2 章 入门指南
2.1 模块5
2.2 延迟7
2.3 数据流风格的描述7
2.4 行为风格的描述9
2.5 结构风格的描述12
2.6 混合设计风格的描述14
2.7 设计的仿真15
2.8 练习题19
第3章 Verilog语言要素
3.1 标识符20
3.2 注释21
3.3 格式21
3.4 系统任务和系统函数22
3.5 编译器指令22
3.5.1 `define和`undef22
3.5.2` ifdef、`ifndef、`else、elseif和 `endif23
3.5.3` default_nettype24
3.5.4` include24
3.5.5` resetall24
3.5.6` timescale25
3.5.7` unconnected_drive 和`nounconnected_drive26
3.5.8` celldefine和`endcelldefine27
3.5.9 line27
3.6 值集合27
3.6.1 整型数28
3.6.2 实数30
3.6.3 字符串30
3.7 数据类型31
3.7.1 线网类型31
3.7.2 未声明的线网35
3.7.3 向量线网和标量线网35
3.7.4 变量类型36
3.7.5 数组41
3.7.6 reg与wire的不同点42
3.8 参数(parameter)42
局部参数43
3.9 练习题44
第4 章 表达式
4.1 操作数45
4.1.1 常数45
4.1.2 参数46
4.1.3 线网46
4.1.4 变量47
4.1.5 位选47
4.1.6 部分位选48
4.1.7 存储器和数组元素49
4.1.8 函数调用50
4.1.9 符号50
4.2 操作符50
4.2.1 算术操作符52
4.2.2 关系操作符55
4.2.3 相等操作符56
4.2.4 逻辑操作符57
4.2.5 按位操作符58
4.2.6 缩减操作符59
4.2.7 移位操作符60
4.2.8 条件操作符62
4.2.9 拼接和复制操作符62
4.3 表达式的类型63
4.4 练习题64
第5章 门级建模
5.1 内建基元(原语)门65
5.2 多输入门66
5.3 多输出门68
5.4 三态门69
5.5 上拉门和下拉门(电阻)70
5.6 MOS开关71
5.7 双向开关72
5.8 门延迟73
5.9 实例数组75
5.10 隐含的线网76
5.11 一个简单的示例76
5.12 24 编码器举例78
5.13 主/从触发器举例78
5.14 奇偶校验电路79
5.15 练习题80
第6章 用户定义的原语(基元UDP)
6.1 UDP的定义82
6.2 组合逻辑的UDP83
6.3 时序逻辑的UDP84
6.3.1 状态变量的初始化85
6.3.2 电平触发的时序逻辑UDP85
6.3.3 沿触发的时序逻辑UDP85
6.3.4 沿触发的和电平敏感的混合行为86
6.4 另一个示例87
6.5 表项的总结88
6.6 练习题88
第7章 数据流建模
7.1 连续赋值语句89
7.2 示例91
7.3 线网声明赋值91
7.4 赋值延迟92
7.5 线网延迟94
7.6 示例95
7.6.1 主/从触发器95
7.6.2 幅值比较器96
7.7 练习题96
第8章 行为级建模
8.1 过程性结构97
8.1.1 initial语句97
8.1.2 always语句100
8.1.3 两类语句在模块中的使用102
8.2 时序控制104
8.2.1 延迟控制104
8.2.2 事件控制105
8.3 语句块109
8.3.1 顺序语句块109
8.3.2 并行语句块111
8.4 过程性赋值113
8.4.1 语句内部延迟114
8.4.2 阻塞性过程赋值115
8.4.3 非阻塞性过程赋值116
8.4.4 连续赋值与过程赋值的比较119
8.5 条件语句121
8.6 case语句122
8.7 循环语句125
8.7.1 forever循环语句125
8.7.2 repeat循环语句126
8.7.3 while循环语句127
8.7.4 for循环语句127
8.8 过程性连续赋值128
8.8.1 assign与deassign语句128
8.8.2 force与 release语句129
8.9 握手协议示例130
8.10 练习题132
第9章 结构建模
9.1 模块134
9.2 端口134
9.3 模块实例引用语句137
9.3.1 未连接的端口139
9.3.2 不同的端口位宽139
9.3.3 模块参数值140
9.4 外部端口144
9.5 举例148
9.6 generate语句151
9.6.1 generate循环语句151
9.6.2 generateconditional条件语句153
9.6.3 generatecase分支语句156
9.7 配置157
9.8 练习题161
第10章 其他论题
10.1 任务162
10.1.1 任务的定义162
10.1.2 任务的调用164
10.2 函数167
10.2.1 函数的定义168
10.2.2 函数的调用171
10.2.3 常数函数172
10.3 系统任务和系统函数172
10.3.1 显示任务173
10.3.2 文件输入/输出任务177
10.3.3 时间标度任务180
10.3.4 仿真控制任务181
10.3.5 仿真时间函数182
10.3.6 转换函数182
10.3.7 概率分布函数183
10.3.8 字符串格式化184
10.4 禁止语句185
10.5 命名事件187
10.6 结构描述方式和行为描述方式的混合使用189
10.7 层次路径名191
10.8 共享任务和函数193
10.9 属性195
10.10 值变转储文件196
10.10.1 四状态型VCD文件196
10.10.2 拓展的VCD文件197
10.10.3 示例198
10.10.4 VCD文件格式200
10.11 指定块 201
10.12 强度207
10.12.1 驱动强度207
10.12.2 电荷强度208
10.13 竞争的状况208
10.14 命令行参变量210
10.15 练习题211
第11章 验证
11.1 编写测试平台213
11.2 波形的生成214
11.2.1 值序列214
11.2.2 重复模式216
11.3 测试平台举例221
11.3.1 解码器221
11.3.2 触发器223
11.4 从文本文件中读取向量225
11.5 向文本文件中写入向量228
11.6 其他示例229
11.6.1 时钟分频器229
11.6.2 阶乘设计231
11.6.3 序列检测器235
11.6.4 LED序列237
11.7 实用程序239
11.7.1 检测x239
11.7.2 将文件传递到任务中240
11.7.3 操作码的调试241
11.7.4 检测时钟脉冲是否出现丢失的情况242
11.7.5 突发时钟发生器242
11.8 练习题243
第12章 建模示例
12.1 简单元素的建模245
12.2 不同风格的建模方式249
12.3 延迟的建模251
12.4 真值表的建模254
12.5 条件操作的建模256
12.6 同步逻辑建模258
12.7 通用移位寄存器262
12.8 格雷码计数器
263
12.9 十进制数计数器264
12.10 并行到串行转换器265
12.11 状态机建模265
12.12 状态机的交互268
12.13 Moore有限状态机的建模272
12.14 Mealy有限状态机的建模273
12.15 简化的黑杰克程序275
12.16 扫描单元278
12.17 7段BCD码译码器279
12.18 实用程序280
12.19 练习题281
附录A 语法参考资料
A.1 关键字282
A.2 语法规则284
A.3 语法284
参考文献315
索引316
前言/序言
本书简明扼要地阐述了Verilog 硬件描述语言的基础知识。Verilog硬件描述语言通常简称为Verilog HDL,可以用于在多个层次上(从开关级到算法级)为数字设计建模。该语言提供了一套功能强大的原语(primitive),其中包括逻辑门和用户定义的原语(即基元),还提供了范围宽广的语言结构,不但可以为硬件的并发行为建模,也可以为硬件的时序特性和电路构造建模。通过编程语言接口(PLI)还可以扩展该语言的功能。Verilog HDL语言使用简便,但功能强大,可以在多个抽象层次上为数字设计建模。Verilog HDL语言于1995年经由IEEE批准成为一种标准语言,称为IEEE Std 13641995。2001年IEEE又对Verilog语言进行了更新,批准了IEEE Std 13642001新标准。该新标准包括了许多新的特性,例如多维数组、生成语句、配置以及一些其他特性。本书(第3版)是根据最新版Verilog HDL标准编写的。
本书的宗旨是想通过具体例子的讲解,阐明Verilog HDL语言的重要基本概念,从而向读者介绍这种硬件描述语言。本书是Verilog语言入门的初级课本。作者用清晰、简明的语言对Verilog语言的每一个方面进行了阐述,使初学者很容易理解,不至于产生畏难情绪。作者希望本书能为读者的Verilog HDL语言入门提供帮助。
本书从语言特点和建模应用两个方面出发,对Verilog语言的基本概念进行了全面深入的讲解,为每一种语言结构提供了大量的例子,并且举例说明了如何使用多种语言结构来构造硬件模型。本书对Verilog HDL语言支持的多种建模风格进行了详细的描述。本书还讲解了如何用同一种Verilog语言描述激励和控制,包括响应的监视和验证。许多语法结构都采用便于阅读的形式呈现给读者,尽管有时候程序代码并不完整。这样做的目的是便于理解语言结构。Verilog语言的完整语法结构放在附录中供读者参考。
本书从本质上讲并不是理论性的。书中用普通的术语介绍Verilog语言的语法和语义,避免使用形式化定义的技术术语。本书未曾试图对Verilog语言进行完整的阐述,例如编程语言接口、开关级别的建模和随机模型语法特色,本书就没有涉及。本书只局限于讲解Verilog语言中那些最基本和最有用的语法,有了这些知识就足以编写简单或者复杂的设计代码。
本书针对的读者包括硬件设计师、电路和系统设计师、软件工具开发者,以及那些对学习使用Verilog HDL语言进行硬件建模感兴趣的人士。本书也可以作为计算机辅助设计、硬件建模和综合等大学课程的入门教材。本书也适合专业人士、大学本科和研究生学习。设计人员可以把本书作为了解Verilog语言的途径,也可以把它用作Verilog HDL语言的参考书。学生和教授们将会发现本书作为硬件设计和硬件描述语言的教学工具将是很有用的。
本书假定读者具有数字硬件设计的基本知识,并熟悉某种高级编程语言(例如 C语言)。
本书是一本有关语言的书,因此并不强调某一领域特定的建模风格(例如 RTL(Register Transfer Lerel)建模风格)。为了学习RTL综合建模,请参考本书的姐妹篇Verilog HDL Synthesis, A Practical Primer。
最后,我还要告诉读者,仅仅通过阅读来学习一种语言是不切合实际的。最佳的学习途径是把书上例子中的代码打印出来,在Verilog仿真器上编译这些代码,进行仿真,通过实际操作来学习,只有这样才能完整、全面地理解这种语言。一旦掌握了本书上的知识,就可以参阅IEEE标准语言参考手册(LRM),进一步学习有关Verilog HDL标准的更完整的资料。
本书的组织
第1章 简单介绍Verilog HDL语言的历史;概要描述该语言的主要功能。
第2章 通过实际例子讲解描述设计的3种主要风格:数据流、行为和结构,用很短的篇幅对Verilog HDL语言做了扼要的概述。
第3章 讲述Verilog HDL语言的基本组成要素,即该语言的“螺栓和螺帽”。该章主要描述标识符、注释、系统任务、编译指令和数据类型等语言要素。
第4章 只讲解表达式。表达式可以用在Verilog代码中的许多地方,包括延迟。该章还介绍可用于组成表达式的各种不同的操作符和操作数。
第5章 讲述门级建模方法,也就是用内建基元(原语)门为设计建模。该章对门的延迟、时间和延迟标度的概念、MOS开关和双向开关做了介绍和描述。
第6章 讲解的题目是由Verilog HDL所提供的创建用户定义基元(原语)的能力,也就是创建(不包括内建原语在内的)新基元的能力。通过给定例子的讲解,读者很容易理解描述组合和时序逻辑的用户定义基元(原语)。
第7章 描述赋值语句和讲解赋值语句执行的语义。在Verilog HDL语言中,用连续赋值语句可以为数据流建模风格建模。该章讲述两类延迟:赋值延迟和线网延迟。
第8章 介绍行为风格的建模方式;讲述两种主要的过程性结构,即initial语句和always语句;还详细地阐述过程性赋值语句。通过例子详细地解释顺序块和并行块;对于高级的编程结构,例如条件语句和循环语句,该章也给予讲解。
第9章 仔细地推敲了结构建模的风格;考察了层次和端口匹配的概念;讲解如何通过每个端口的互相关联将位于不同层次的多个模块连接起来。
第10章 讲解一些有深度的主题,例如指定块(Specify Block)、值变转储文件(VCD文件)及信号强度等。该章还介绍任务和函数,以及如何共享任务和函数的策略。
第11章 和第12章因为讨论了验证和建模两个课题,所以是最实用的两章。在第11章中,举了许多测试平台的例子,展示了波形的产生和响应的监控。在第12章中,举了许多建模的例子,演示了不同的Verilog语言结构如何配合使用。
最后,附录A包含了一份完整的Verilog HDL语法参考资料。语法采用巴克思—诺尔
(BackusNaur)
范式(BNF)表示。为了查阅方便,资料中的语法结构均按照字母顺序排列。
每一章的后面都附有练习题,这使得本书更适合作为大学的教科书。
在本书中出现的所有Verilog HDL描述中,保留字、系统任务和系统函数,以及编译指令均采用粗体字。在语法描述中作为语法一部分的操作符和标点符号也均采用粗体字。语法规则中可以选择的项,采用非粗体方括号(\[....\])。非粗体的大括号 ({.....})标识重复0次或者多次的项。有时在Verilog源代码中出现的省略号(....)表示与讨论无关的代码行。以Courier字体书写的词汇表示其特定的Verilog含义,而不是其英文的含义,例如and门。
书中所有的例子都已经通过ModelSim SE 5.8a仿真器的测试。
第3版中有些什么新内容
第2版出版已经5年多了,许多情况已经发生了变化。Verilog HDL语言的新版本已经变成了IEEE的标准,即IEEE Std 13642001。在本书中,新添加的Verilog语法条款已被融入到已有的章节中,哪些是新添加的语法条款并没有明确地加以界定。在第3章中,新的编译指令、变量类型和局部参数已经被引入教材。多维数组、索引的部分选择、有符号的表达式和算术移位已经被加入到第4章中。事件控制和过程性赋值也已在第8章中进行了探讨。第9章描述了生成语句、配置语句和另外一种端口编写和参数声明的风格。第10章解释了新的功能强大的输入/输出函数,这使得文件的读/写远比以前容易得多。在第11章中还添加了验证的实用程序。第12章包括了新添加的模型。附录中的语义语法也已经被更新到IEEE 13642001版本的新标准。
新版本的Verilog语言引进了许多编写代码的新风格。推荐的风格被标记为指导原则(guideline),用小的字体添加在页边上。我在页边上还提供了许多其他的建议和指导。我并不是完全按照页边上添加的建议来编写代码,我有意这样安排是为了能继续展示这种语言丰富多彩的功能。不过在日常工作中,确实可以使用这些原则和建议来编写Verilog模块。
致谢
下面列出名字的15位先生/女士,尽管他们的工作非常繁忙,可他们还是抽出宝贵的时间和精力审阅了本书的初稿和上一版的手稿,我衷心地感谢他们对本书出版所做的贡献。
他们是:
(1) 摩托罗拉半导体(现为Freescale)公司的Shalom Bresticker。
(2) CADENCE设计系统公司的Steven Sharp。
(3) Verisity Systems公司的Michael McNamala。
(4) Agere Systems公司的Vencent Zeyak Jr.。
(5) VeriBest 公司的Brett Graves, Gabe Moretti, Doug Smith。
(6) 贝尔实验室朗讯技术公司的Stephanie Alter, Danny Johnson, Sanjana Nair, Carlos Roman, Mourad Takla, Jenjen Tiao和Sriram Tyagaraja。
(7) 美国国家半导体公司的Marqsoodul Mannan。
他们对本书提出了许多建设性的批评意见和具体的改进细节,为本书的成功出版做出了很大的贡献,我衷心地感谢他们的帮助。
我还要感谢在贝尔实验室工作的Jean Dussault和Hao Nham,在我编写本书上一版期间,他们多次为代码的仿真提供真诚的帮助。
我还要感谢Prasad Subramaniam和Hao Nham,他们多次鼓励和帮助我编写本书。
最后我还要感谢我的妻子Geetha和3个儿子,是他们给了我很多感情上的支持,没有这些我永远不可能取得成功。
J. Bhasker
Allentown, PA
本书的宗旨是想通过具体例子的讲解,阐明Verilog HDL语言的重要基本概念,从而向读者介绍这种硬件描述语言。本书是Verilog语言入门的初级课本。作者用清晰、简明的语言对Verilog语言的每一个方面进行了阐述,使初学者很容易理解,不至于产生畏难情绪。作者希望本书能为读者的Verilog HDL语言入门提供帮助。
本书从语言特点和建模应用两个方面出发,对Verilog语言的基本概念进行了全面深入的讲解,为每一种语言结构提供了大量的例子,并且举例说明了如何使用多种语言结构来构造硬件模型。本书对Verilog HDL语言支持的多种建模风格进行了详细的描述。本书还讲解了如何用同一种Verilog语言描述激励和控制,包括响应的监视和验证。许多语法结构都采用便于阅读的形式呈现给读者,尽管有时候程序代码并不完整。这样做的目的是便于理解语言结构。Verilog语言的完整语法结构放在附录中供读者参考。
本书从本质上讲并不是理论性的。书中用普通的术语介绍Verilog语言的语法和语义,避免使用形式化定义的技术术语。本书未曾试图对Verilog语言进行完整的阐述,例如编程语言接口、开关级别的建模和随机模型语法特色,本书就没有涉及。本书只局限于讲解Verilog语言中那些最基本和最有用的语法,有了这些知识就足以编写简单或者复杂的设计代码。
本书针对的读者包括硬件设计师、电路和系统设计师、软件工具开发者,以及那些对学习使用Verilog HDL语言进行硬件建模感兴趣的人士。本书也可以作为计算机辅助设计、硬件建模和综合等大学课程的入门教材。本书也适合专业人士、大学本科和研究生学习。设计人员可以把本书作为了解Verilog语言的途径,也可以把它用作Verilog HDL语言的参考书。学生和教授们将会发现本书作为硬件设计和硬件描述语言的教学工具将是很有用的。
本书假定读者具有数字硬件设计的基本知识,并熟悉某种高级编程语言(例如 C语言)。
本书是一本有关语言的书,因此并不强调某一领域特定的建模风格(例如 RTL(Register Transfer Lerel)建模风格)。为了学习RTL综合建模,请参考本书的姐妹篇Verilog HDL Synthesis, A Practical Primer。
最后,我还要告诉读者,仅仅通过阅读来学习一种语言是不切合实际的。最佳的学习途径是把书上例子中的代码打印出来,在Verilog仿真器上编译这些代码,进行仿真,通过实际操作来学习,只有这样才能完整、全面地理解这种语言。一旦掌握了本书上的知识,就可以参阅IEEE标准语言参考手册(LRM),进一步学习有关Verilog HDL标准的更完整的资料。
本书的组织
第1章 简单介绍Verilog HDL语言的历史;概要描述该语言的主要功能。
第2章 通过实际例子讲解描述设计的3种主要风格:数据流、行为和结构,用很短的篇幅对Verilog HDL语言做了扼要的概述。
第3章 讲述Verilog HDL语言的基本组成要素,即该语言的“螺栓和螺帽”。该章主要描述标识符、注释、系统任务、编译指令和数据类型等语言要素。
第4章 只讲解表达式。表达式可以用在Verilog代码中的许多地方,包括延迟。该章还介绍可用于组成表达式的各种不同的操作符和操作数。
第5章 讲述门级建模方法,也就是用内建基元(原语)门为设计建模。该章对门的延迟、时间和延迟标度的概念、MOS开关和双向开关做了介绍和描述。
第6章 讲解的题目是由Verilog HDL所提供的创建用户定义基元(原语)的能力,也就是创建(不包括内建原语在内的)新基元的能力。通过给定例子的讲解,读者很容易理解描述组合和时序逻辑的用户定义基元(原语)。
第7章 描述赋值语句和讲解赋值语句执行的语义。在Verilog HDL语言中,用连续赋值语句可以为数据流建模风格建模。该章讲述两类延迟:赋值延迟和线网延迟。
第8章 介绍行为风格的建模方式;讲述两种主要的过程性结构,即initial语句和always语句;还详细地阐述过程性赋值语句。通过例子详细地解释顺序块和并行块;对于高级的编程结构,例如条件语句和循环语句,该章也给予讲解。
第9章 仔细地推敲了结构建模的风格;考察了层次和端口匹配的概念;讲解如何通过每个端口的互相关联将位于不同层次的多个模块连接起来。
第10章 讲解一些有深度的主题,例如指定块(Specify Block)、值变转储文件(VCD文件)及信号强度等。该章还介绍任务和函数,以及如何共享任务和函数的策略。
第11章 和第12章因为讨论了验证和建模两个课题,所以是最实用的两章。在第11章中,举了许多测试平台的例子,展示了波形的产生和响应的监控。在第12章中,举了许多建模的例子,演示了不同的Verilog语言结构如何配合使用。
最后,附录A包含了一份完整的Verilog HDL语法参考资料。语法采用巴克思—诺尔
(BackusNaur)
范式(BNF)表示。为了查阅方便,资料中的语法结构均按照字母顺序排列。
每一章的后面都附有练习题,这使得本书更适合作为大学的教科书。
在本书中出现的所有Verilog HDL描述中,保留字、系统任务和系统函数,以及编译指令均采用粗体字。在语法描述中作为语法一部分的操作符和标点符号也均采用粗体字。语法规则中可以选择的项,采用非粗体方括号(\[....\])。非粗体的大括号 ({.....})标识重复0次或者多次的项。有时在Verilog源代码中出现的省略号(....)表示与讨论无关的代码行。以Courier字体书写的词汇表示其特定的Verilog含义,而不是其英文的含义,例如and门。
书中所有的例子都已经通过ModelSim SE 5.8a仿真器的测试。
第3版中有些什么新内容
第2版出版已经5年多了,许多情况已经发生了变化。Verilog HDL语言的新版本已经变成了IEEE的标准,即IEEE Std 13642001。在本书中,新添加的Verilog语法条款已被融入到已有的章节中,哪些是新添加的语法条款并没有明确地加以界定。在第3章中,新的编译指令、变量类型和局部参数已经被引入教材。多维数组、索引的部分选择、有符号的表达式和算术移位已经被加入到第4章中。事件控制和过程性赋值也已在第8章中进行了探讨。第9章描述了生成语句、配置语句和另外一种端口编写和参数声明的风格。第10章解释了新的功能强大的输入/输出函数,这使得文件的读/写远比以前容易得多。在第11章中还添加了验证的实用程序。第12章包括了新添加的模型。附录中的语义语法也已经被更新到IEEE 13642001版本的新标准。
新版本的Verilog语言引进了许多编写代码的新风格。推荐的风格被标记为指导原则(guideline),用小的字体添加在页边上。我在页边上还提供了许多其他的建议和指导。我并不是完全按照页边上添加的建议来编写代码,我有意这样安排是为了能继续展示这种语言丰富多彩的功能。不过在日常工作中,确实可以使用这些原则和建议来编写Verilog模块。
致谢
下面列出名字的15位先生/女士,尽管他们的工作非常繁忙,可他们还是抽出宝贵的时间和精力审阅了本书的初稿和上一版的手稿,我衷心地感谢他们对本书出版所做的贡献。
他们是:
(1) 摩托罗拉半导体(现为Freescale)公司的Shalom Bresticker。
(2) CADENCE设计系统公司的Steven Sharp。
(3) Verisity Systems公司的Michael McNamala。
(4) Agere Systems公司的Vencent Zeyak Jr.。
(5) VeriBest 公司的Brett Graves, Gabe Moretti, Doug Smith。
(6) 贝尔实验室朗讯技术公司的Stephanie Alter, Danny Johnson, Sanjana Nair, Carlos Roman, Mourad Takla, Jenjen Tiao和Sriram Tyagaraja。
(7) 美国国家半导体公司的Marqsoodul Mannan。
他们对本书提出了许多建设性的批评意见和具体的改进细节,为本书的成功出版做出了很大的贡献,我衷心地感谢他们的帮助。
我还要感谢在贝尔实验室工作的Jean Dussault和Hao Nham,在我编写本书上一版期间,他们多次为代码的仿真提供真诚的帮助。
我还要感谢Prasad Subramaniam和Hao Nham,他们多次鼓励和帮助我编写本书。
最后我还要感谢我的妻子Geetha和3个儿子,是他们给了我很多感情上的支持,没有这些我永远不可能取得成功。
J. Bhasker
Allentown, PA
内容简介
本书简要介绍了Verilog硬件描述语言的基础知识,包括语言的基本内容和基本结构,以及利用该语言在各种层次上对数字系统的建模方法。书中列举了大量实例,帮助读者掌握语言本身和建模方法,对实际数字系统设计也很有帮助。第3版中添加了与Verilog2001有关的新内容。
本书是VerilogHDL的初级读本,可作为计算机、电子、电气及自控等专业相关课程的教材,也可用作相关科研人员的参考书。
本书是VerilogHDL的初级读本,可作为计算机、电子、电气及自控等专业相关课程的教材,也可用作相关科研人员的参考书。
目录
第1章 简介
1.1 什么是Verilog HDL?1
1.2 历史2
1.3 主要能力2
1.4 练习题4
第2 章 入门指南
2.1 模块5
2.2 延迟7
2.3 数据流风格的描述7
2.4 行为风格的描述9
2.5 结构风格的描述12
2.6 混合设计风格的描述14
2.7 设计的仿真15
2.8 练习题19
第3章 Verilog语言要素
3.1 标识符20
3.2 注释21
3.3 格式21
3.4 系统任务和系统函数22
3.5 编译器指令22
3.5.1 `define和`undef22
3.5.2` ifdef、`ifndef、`else、elseif和 `endif23
3.5.3` default_nettype24
3.5.4` include24
3.5.5` resetall24
3.5.6` timescale25
3.5.7` unconnected_drive 和`nounconnected_drive26
3.5.8` celldefine和`endcelldefine27
3.5.9 line27
3.6 值集合27
3.6.1 整型数28
3.6.2 实数30
3.6.3 字符串30
3.7 数据类型31
3.7.1 线网类型31
3.7.2 未声明的线网35
3.7.3 向量线网和标量线网35
3.7.4 变量类型36
3.7.5 数组41
3.7.6 reg与wire的不同点42
3.8 参数(parameter)42
局部参数43
3.9 练习题44
第4 章 表达式
4.1 操作数45
4.1.1 常数45
4.1.2 参数46
4.1.3 线网46
4.1.4 变量47
4.1.5 位选47
4.1.6 部分位选48
4.1.7 存储器和数组元素49
4.1.8 函数调用50
4.1.9 符号50
4.2 操作符50
4.2.1 算术操作符52
4.2.2 关系操作符55
4.2.3 相等操作符56
4.2.4 逻辑操作符57
4.2.5 按位操作符58
4.2.6 缩减操作符59
4.2.7 移位操作符60
4.2.8 条件操作符62
4.2.9 拼接和复制操作符62
4.3 表达式的类型63
4.4 练习题64
第5章 门级建模
5.1 内建基元(原语)门65
5.2 多输入门66
5.3 多输出门68
5.4 三态门69
5.5 上拉门和下拉门(电阻)70
5.6 MOS开关71
5.7 双向开关72
5.8 门延迟73
5.9 实例数组75
5.10 隐含的线网76
5.11 一个简单的示例76
5.12 24 编码器举例78
5.13 主/从触发器举例78
5.14 奇偶校验电路79
5.15 练习题80
第6章 用户定义的原语(基元UDP)
6.1 UDP的定义82
6.2 组合逻辑的UDP83
6.3 时序逻辑的UDP84
6.3.1 状态变量的初始化85
6.3.2 电平触发的时序逻辑UDP85
6.3.3 沿触发的时序逻辑UDP85
6.3.4 沿触发的和电平敏感的混合行为86
6.4 另一个示例87
6.5 表项的总结88
6.6 练习题88
第7章 数据流建模
7.1 连续赋值语句89
7.2 示例91
7.3 线网声明赋值91
7.4 赋值延迟92
7.5 线网延迟94
7.6 示例95
7.6.1 主/从触发器95
7.6.2 幅值比较器96
7.7 练习题96
第8章 行为级建模
8.1 过程性结构97
8.1.1 initial语句97
8.1.2 always语句100
8.1.3 两类语句在模块中的使用102
8.2 时序控制104
8.2.1 延迟控制104
8.2.2 事件控制105
8.3 语句块109
8.3.1 顺序语句块109
8.3.2 并行语句块111
8.4 过程性赋值113
8.4.1 语句内部延迟114
8.4.2 阻塞性过程赋值115
8.4.3 非阻塞性过程赋值116
8.4.4 连续赋值与过程赋值的比较119
8.5 条件语句121
8.6 case语句122
8.7 循环语句125
8.7.1 forever循环语句125
8.7.2 repeat循环语句126
8.7.3 while循环语句127
8.7.4 for循环语句127
8.8 过程性连续赋值128
8.8.1 assign与deassign语句128
8.8.2 force与 release语句129
8.9 握手协议示例130
8.10 练习题132
第9章 结构建模
9.1 模块134
9.2 端口134
9.3 模块实例引用语句137
9.3.1 未连接的端口139
9.3.2 不同的端口位宽139
9.3.3 模块参数值140
9.4 外部端口144
9.5 举例148
9.6 generate语句151
9.6.1 generate循环语句151
9.6.2 generateconditional条件语句153
9.6.3 generatecase分支语句156
9.7 配置157
9.8 练习题161
第10章 其他论题
10.1 任务162
10.1.1 任务的定义162
10.1.2 任务的调用164
10.2 函数167
10.2.1 函数的定义168
10.2.2 函数的调用171
10.2.3 常数函数172
10.3 系统任务和系统函数172
10.3.1 显示任务173
10.3.2 文件输入/输出任务177
10.3.3 时间标度任务180
10.3.4 仿真控制任务181
10.3.5 仿真时间函数182
10.3.6 转换函数182
10.3.7 概率分布函数183
10.3.8 字符串格式化184
10.4 禁止语句185
10.5 命名事件187
10.6 结构描述方式和行为描述方式的混合使用189
10.7 层次路径名191
10.8 共享任务和函数193
10.9 属性195
10.10 值变转储文件196
10.10.1 四状态型VCD文件196
10.10.2 拓展的VCD文件197
10.10.3 示例198
10.10.4 VCD文件格式200
10.11 指定块 201
10.12 强度207
10.12.1 驱动强度207
10.12.2 电荷强度208
10.13 竞争的状况208
10.14 命令行参变量210
10.15 练习题211
第11章 验证
11.1 编写测试平台213
11.2 波形的生成214
11.2.1 值序列214
11.2.2 重复模式216
11.3 测试平台举例221
11.3.1 解码器221
11.3.2 触发器223
11.4 从文本文件中读取向量225
11.5 向文本文件中写入向量228
11.6 其他示例229
11.6.1 时钟分频器229
11.6.2 阶乘设计231
11.6.3 序列检测器235
11.6.4 LED序列237
11.7 实用程序239
11.7.1 检测x239
11.7.2 将文件传递到任务中240
11.7.3 操作码的调试241
11.7.4 检测时钟脉冲是否出现丢失的情况242
11.7.5 突发时钟发生器242
11.8 练习题243
第12章 建模示例
12.1 简单元素的建模245
12.2 不同风格的建模方式249
12.3 延迟的建模251
12.4 真值表的建模254
12.5 条件操作的建模256
12.6 同步逻辑建模258
12.7 通用移位寄存器262
12.8 格雷码计数器
263
12.9 十进制数计数器264
12.10 并行到串行转换器265
12.11 状态机建模265
12.12 状态机的交互268
12.13 Moore有限状态机的建模272
12.14 Mealy有限状态机的建模273
12.15 简化的黑杰克程序275
12.16 扫描单元278
12.17 7段BCD码译码器279
12.18 实用程序280
12.19 练习题281
附录A 语法参考资料
A.1 关键字282
A.2 语法规则284
A.3 语法284
参考文献315
索引316
1.1 什么是Verilog HDL?1
1.2 历史2
1.3 主要能力2
1.4 练习题4
第2 章 入门指南
2.1 模块5
2.2 延迟7
2.3 数据流风格的描述7
2.4 行为风格的描述9
2.5 结构风格的描述12
2.6 混合设计风格的描述14
2.7 设计的仿真15
2.8 练习题19
第3章 Verilog语言要素
3.1 标识符20
3.2 注释21
3.3 格式21
3.4 系统任务和系统函数22
3.5 编译器指令22
3.5.1 `define和`undef22
3.5.2` ifdef、`ifndef、`else、elseif和 `endif23
3.5.3` default_nettype24
3.5.4` include24
3.5.5` resetall24
3.5.6` timescale25
3.5.7` unconnected_drive 和`nounconnected_drive26
3.5.8` celldefine和`endcelldefine27
3.5.9 line27
3.6 值集合27
3.6.1 整型数28
3.6.2 实数30
3.6.3 字符串30
3.7 数据类型31
3.7.1 线网类型31
3.7.2 未声明的线网35
3.7.3 向量线网和标量线网35
3.7.4 变量类型36
3.7.5 数组41
3.7.6 reg与wire的不同点42
3.8 参数(parameter)42
局部参数43
3.9 练习题44
第4 章 表达式
4.1 操作数45
4.1.1 常数45
4.1.2 参数46
4.1.3 线网46
4.1.4 变量47
4.1.5 位选47
4.1.6 部分位选48
4.1.7 存储器和数组元素49
4.1.8 函数调用50
4.1.9 符号50
4.2 操作符50
4.2.1 算术操作符52
4.2.2 关系操作符55
4.2.3 相等操作符56
4.2.4 逻辑操作符57
4.2.5 按位操作符58
4.2.6 缩减操作符59
4.2.7 移位操作符60
4.2.8 条件操作符62
4.2.9 拼接和复制操作符62
4.3 表达式的类型63
4.4 练习题64
第5章 门级建模
5.1 内建基元(原语)门65
5.2 多输入门66
5.3 多输出门68
5.4 三态门69
5.5 上拉门和下拉门(电阻)70
5.6 MOS开关71
5.7 双向开关72
5.8 门延迟73
5.9 实例数组75
5.10 隐含的线网76
5.11 一个简单的示例76
5.12 24 编码器举例78
5.13 主/从触发器举例78
5.14 奇偶校验电路79
5.15 练习题80
第6章 用户定义的原语(基元UDP)
6.1 UDP的定义82
6.2 组合逻辑的UDP83
6.3 时序逻辑的UDP84
6.3.1 状态变量的初始化85
6.3.2 电平触发的时序逻辑UDP85
6.3.3 沿触发的时序逻辑UDP85
6.3.4 沿触发的和电平敏感的混合行为86
6.4 另一个示例87
6.5 表项的总结88
6.6 练习题88
第7章 数据流建模
7.1 连续赋值语句89
7.2 示例91
7.3 线网声明赋值91
7.4 赋值延迟92
7.5 线网延迟94
7.6 示例95
7.6.1 主/从触发器95
7.6.2 幅值比较器96
7.7 练习题96
第8章 行为级建模
8.1 过程性结构97
8.1.1 initial语句97
8.1.2 always语句100
8.1.3 两类语句在模块中的使用102
8.2 时序控制104
8.2.1 延迟控制104
8.2.2 事件控制105
8.3 语句块109
8.3.1 顺序语句块109
8.3.2 并行语句块111
8.4 过程性赋值113
8.4.1 语句内部延迟114
8.4.2 阻塞性过程赋值115
8.4.3 非阻塞性过程赋值116
8.4.4 连续赋值与过程赋值的比较119
8.5 条件语句121
8.6 case语句122
8.7 循环语句125
8.7.1 forever循环语句125
8.7.2 repeat循环语句126
8.7.3 while循环语句127
8.7.4 for循环语句127
8.8 过程性连续赋值128
8.8.1 assign与deassign语句128
8.8.2 force与 release语句129
8.9 握手协议示例130
8.10 练习题132
第9章 结构建模
9.1 模块134
9.2 端口134
9.3 模块实例引用语句137
9.3.1 未连接的端口139
9.3.2 不同的端口位宽139
9.3.3 模块参数值140
9.4 外部端口144
9.5 举例148
9.6 generate语句151
9.6.1 generate循环语句151
9.6.2 generateconditional条件语句153
9.6.3 generatecase分支语句156
9.7 配置157
9.8 练习题161
第10章 其他论题
10.1 任务162
10.1.1 任务的定义162
10.1.2 任务的调用164
10.2 函数167
10.2.1 函数的定义168
10.2.2 函数的调用171
10.2.3 常数函数172
10.3 系统任务和系统函数172
10.3.1 显示任务173
10.3.2 文件输入/输出任务177
10.3.3 时间标度任务180
10.3.4 仿真控制任务181
10.3.5 仿真时间函数182
10.3.6 转换函数182
10.3.7 概率分布函数183
10.3.8 字符串格式化184
10.4 禁止语句185
10.5 命名事件187
10.6 结构描述方式和行为描述方式的混合使用189
10.7 层次路径名191
10.8 共享任务和函数193
10.9 属性195
10.10 值变转储文件196
10.10.1 四状态型VCD文件196
10.10.2 拓展的VCD文件197
10.10.3 示例198
10.10.4 VCD文件格式200
10.11 指定块 201
10.12 强度207
10.12.1 驱动强度207
10.12.2 电荷强度208
10.13 竞争的状况208
10.14 命令行参变量210
10.15 练习题211
第11章 验证
11.1 编写测试平台213
11.2 波形的生成214
11.2.1 值序列214
11.2.2 重复模式216
11.3 测试平台举例221
11.3.1 解码器221
11.3.2 触发器223
11.4 从文本文件中读取向量225
11.5 向文本文件中写入向量228
11.6 其他示例229
11.6.1 时钟分频器229
11.6.2 阶乘设计231
11.6.3 序列检测器235
11.6.4 LED序列237
11.7 实用程序239
11.7.1 检测x239
11.7.2 将文件传递到任务中240
11.7.3 操作码的调试241
11.7.4 检测时钟脉冲是否出现丢失的情况242
11.7.5 突发时钟发生器242
11.8 练习题243
第12章 建模示例
12.1 简单元素的建模245
12.2 不同风格的建模方式249
12.3 延迟的建模251
12.4 真值表的建模254
12.5 条件操作的建模256
12.6 同步逻辑建模258
12.7 通用移位寄存器262
12.8 格雷码计数器
263
12.9 十进制数计数器264
12.10 并行到串行转换器265
12.11 状态机建模265
12.12 状态机的交互268
12.13 Moore有限状态机的建模272
12.14 Mealy有限状态机的建模273
12.15 简化的黑杰克程序275
12.16 扫描单元278
12.17 7段BCD码译码器279
12.18 实用程序280
12.19 练习题281
附录A 语法参考资料
A.1 关键字282
A.2 语法规则284
A.3 语法284
参考文献315
索引316
前言/序言
本书简明扼要地阐述了Verilog 硬件描述语言的基础知识。Verilog硬件描述语言通常简称为Verilog HDL,可以用于在多个层次上(从开关级到算法级)为数字设计建模。该语言提供了一套功能强大的原语(primitive),其中包括逻辑门和用户定义的原语(即基元),还提供了范围宽广的语言结构,不但可以为硬件的并发行为建模,也可以为硬件的时序特性和电路构造建模。通过编程语言接口(PLI)还可以扩展该语言的功能。Verilog HDL语言使用简便,但功能强大,可以在多个抽象层次上为数字设计建模。Verilog HDL语言于1995年经由IEEE批准成为一种标准语言,称为IEEE Std 13641995。2001年IEEE又对Verilog语言进行了更新,批准了IEEE Std 13642001新标准。该新标准包括了许多新的特性,例如多维数组、生成语句、配置以及一些其他特性。本书(第3版)是根据最新版Verilog HDL标准编写的。
本书的宗旨是想通过具体例子的讲解,阐明Verilog HDL语言的重要基本概念,从而向读者介绍这种硬件描述语言。本书是Verilog语言入门的初级课本。作者用清晰、简明的语言对Verilog语言的每一个方面进行了阐述,使初学者很容易理解,不至于产生畏难情绪。作者希望本书能为读者的Verilog HDL语言入门提供帮助。
本书从语言特点和建模应用两个方面出发,对Verilog语言的基本概念进行了全面深入的讲解,为每一种语言结构提供了大量的例子,并且举例说明了如何使用多种语言结构来构造硬件模型。本书对Verilog HDL语言支持的多种建模风格进行了详细的描述。本书还讲解了如何用同一种Verilog语言描述激励和控制,包括响应的监视和验证。许多语法结构都采用便于阅读的形式呈现给读者,尽管有时候程序代码并不完整。这样做的目的是便于理解语言结构。Verilog语言的完整语法结构放在附录中供读者参考。
本书从本质上讲并不是理论性的。书中用普通的术语介绍Verilog语言的语法和语义,避免使用形式化定义的技术术语。本书未曾试图对Verilog语言进行完整的阐述,例如编程语言接口、开关级别的建模和随机模型语法特色,本书就没有涉及。本书只局限于讲解Verilog语言中那些最基本和最有用的语法,有了这些知识就足以编写简单或者复杂的设计代码。
本书针对的读者包括硬件设计师、电路和系统设计师、软件工具开发者,以及那些对学习使用Verilog HDL语言进行硬件建模感兴趣的人士。本书也可以作为计算机辅助设计、硬件建模和综合等大学课程的入门教材。本书也适合专业人士、大学本科和研究生学习。设计人员可以把本书作为了解Verilog语言的途径,也可以把它用作Verilog HDL语言的参考书。学生和教授们将会发现本书作为硬件设计和硬件描述语言的教学工具将是很有用的。
本书假定读者具有数字硬件设计的基本知识,并熟悉某种高级编程语言(例如 C语言)。
本书是一本有关语言的书,因此并不强调某一领域特定的建模风格(例如 RTL(Register Transfer Lerel)建模风格)。为了学习RTL综合建模,请参考本书的姐妹篇Verilog HDL Synthesis, A Practical Primer。
最后,我还要告诉读者,仅仅通过阅读来学习一种语言是不切合实际的。最佳的学习途径是把书上例子中的代码打印出来,在Verilog仿真器上编译这些代码,进行仿真,通过实际操作来学习,只有这样才能完整、全面地理解这种语言。一旦掌握了本书上的知识,就可以参阅IEEE标准语言参考手册(LRM),进一步学习有关Verilog HDL标准的更完整的资料。
本书的组织
第1章 简单介绍Verilog HDL语言的历史;概要描述该语言的主要功能。
第2章 通过实际例子讲解描述设计的3种主要风格:数据流、行为和结构,用很短的篇幅对Verilog HDL语言做了扼要的概述。
第3章 讲述Verilog HDL语言的基本组成要素,即该语言的“螺栓和螺帽”。该章主要描述标识符、注释、系统任务、编译指令和数据类型等语言要素。
第4章 只讲解表达式。表达式可以用在Verilog代码中的许多地方,包括延迟。该章还介绍可用于组成表达式的各种不同的操作符和操作数。
第5章 讲述门级建模方法,也就是用内建基元(原语)门为设计建模。该章对门的延迟、时间和延迟标度的概念、MOS开关和双向开关做了介绍和描述。
第6章 讲解的题目是由Verilog HDL所提供的创建用户定义基元(原语)的能力,也就是创建(不包括内建原语在内的)新基元的能力。通过给定例子的讲解,读者很容易理解描述组合和时序逻辑的用户定义基元(原语)。
第7章 描述赋值语句和讲解赋值语句执行的语义。在Verilog HDL语言中,用连续赋值语句可以为数据流建模风格建模。该章讲述两类延迟:赋值延迟和线网延迟。
第8章 介绍行为风格的建模方式;讲述两种主要的过程性结构,即initial语句和always语句;还详细地阐述过程性赋值语句。通过例子详细地解释顺序块和并行块;对于高级的编程结构,例如条件语句和循环语句,该章也给予讲解。
第9章 仔细地推敲了结构建模的风格;考察了层次和端口匹配的概念;讲解如何通过每个端口的互相关联将位于不同层次的多个模块连接起来。
第10章 讲解一些有深度的主题,例如指定块(Specify Block)、值变转储文件(VCD文件)及信号强度等。该章还介绍任务和函数,以及如何共享任务和函数的策略。
第11章 和第12章因为讨论了验证和建模两个课题,所以是最实用的两章。在第11章中,举了许多测试平台的例子,展示了波形的产生和响应的监控。在第12章中,举了许多建模的例子,演示了不同的Verilog语言结构如何配合使用。
最后,附录A包含了一份完整的Verilog HDL语法参考资料。语法采用巴克思—诺尔
(BackusNaur)
范式(BNF)表示。为了查阅方便,资料中的语法结构均按照字母顺序排列。
每一章的后面都附有练习题,这使得本书更适合作为大学的教科书。
在本书中出现的所有Verilog HDL描述中,保留字、系统任务和系统函数,以及编译指令均采用粗体字。在语法描述中作为语法一部分的操作符和标点符号也均采用粗体字。语法规则中可以选择的项,采用非粗体方括号(\[....\])。非粗体的大括号 ({.....})标识重复0次或者多次的项。有时在Verilog源代码中出现的省略号(....)表示与讨论无关的代码行。以Courier字体书写的词汇表示其特定的Verilog含义,而不是其英文的含义,例如and门。
书中所有的例子都已经通过ModelSim SE 5.8a仿真器的测试。
第3版中有些什么新内容
第2版出版已经5年多了,许多情况已经发生了变化。Verilog HDL语言的新版本已经变成了IEEE的标准,即IEEE Std 13642001。在本书中,新添加的Verilog语法条款已被融入到已有的章节中,哪些是新添加的语法条款并没有明确地加以界定。在第3章中,新的编译指令、变量类型和局部参数已经被引入教材。多维数组、索引的部分选择、有符号的表达式和算术移位已经被加入到第4章中。事件控制和过程性赋值也已在第8章中进行了探讨。第9章描述了生成语句、配置语句和另外一种端口编写和参数声明的风格。第10章解释了新的功能强大的输入/输出函数,这使得文件的读/写远比以前容易得多。在第11章中还添加了验证的实用程序。第12章包括了新添加的模型。附录中的语义语法也已经被更新到IEEE 13642001版本的新标准。
新版本的Verilog语言引进了许多编写代码的新风格。推荐的风格被标记为指导原则(guideline),用小的字体添加在页边上。我在页边上还提供了许多其他的建议和指导。我并不是完全按照页边上添加的建议来编写代码,我有意这样安排是为了能继续展示这种语言丰富多彩的功能。不过在日常工作中,确实可以使用这些原则和建议来编写Verilog模块。
致谢
下面列出名字的15位先生/女士,尽管他们的工作非常繁忙,可他们还是抽出宝贵的时间和精力审阅了本书的初稿和上一版的手稿,我衷心地感谢他们对本书出版所做的贡献。
他们是:
(1) 摩托罗拉半导体(现为Freescale)公司的Shalom Bresticker。
(2) CADENCE设计系统公司的Steven Sharp。
(3) Verisity Systems公司的Michael McNamala。
(4) Agere Systems公司的Vencent Zeyak Jr.。
(5) VeriBest 公司的Brett Graves, Gabe Moretti, Doug Smith。
(6) 贝尔实验室朗讯技术公司的Stephanie Alter, Danny Johnson, Sanjana Nair, Carlos Roman, Mourad Takla, Jenjen Tiao和Sriram Tyagaraja。
(7) 美国国家半导体公司的Marqsoodul Mannan。
他们对本书提出了许多建设性的批评意见和具体的改进细节,为本书的成功出版做出了很大的贡献,我衷心地感谢他们的帮助。
我还要感谢在贝尔实验室工作的Jean Dussault和Hao Nham,在我编写本书上一版期间,他们多次为代码的仿真提供真诚的帮助。
我还要感谢Prasad Subramaniam和Hao Nham,他们多次鼓励和帮助我编写本书。
最后我还要感谢我的妻子Geetha和3个儿子,是他们给了我很多感情上的支持,没有这些我永远不可能取得成功。
J. Bhasker
Allentown, PA
本书的宗旨是想通过具体例子的讲解,阐明Verilog HDL语言的重要基本概念,从而向读者介绍这种硬件描述语言。本书是Verilog语言入门的初级课本。作者用清晰、简明的语言对Verilog语言的每一个方面进行了阐述,使初学者很容易理解,不至于产生畏难情绪。作者希望本书能为读者的Verilog HDL语言入门提供帮助。
本书从语言特点和建模应用两个方面出发,对Verilog语言的基本概念进行了全面深入的讲解,为每一种语言结构提供了大量的例子,并且举例说明了如何使用多种语言结构来构造硬件模型。本书对Verilog HDL语言支持的多种建模风格进行了详细的描述。本书还讲解了如何用同一种Verilog语言描述激励和控制,包括响应的监视和验证。许多语法结构都采用便于阅读的形式呈现给读者,尽管有时候程序代码并不完整。这样做的目的是便于理解语言结构。Verilog语言的完整语法结构放在附录中供读者参考。
本书从本质上讲并不是理论性的。书中用普通的术语介绍Verilog语言的语法和语义,避免使用形式化定义的技术术语。本书未曾试图对Verilog语言进行完整的阐述,例如编程语言接口、开关级别的建模和随机模型语法特色,本书就没有涉及。本书只局限于讲解Verilog语言中那些最基本和最有用的语法,有了这些知识就足以编写简单或者复杂的设计代码。
本书针对的读者包括硬件设计师、电路和系统设计师、软件工具开发者,以及那些对学习使用Verilog HDL语言进行硬件建模感兴趣的人士。本书也可以作为计算机辅助设计、硬件建模和综合等大学课程的入门教材。本书也适合专业人士、大学本科和研究生学习。设计人员可以把本书作为了解Verilog语言的途径,也可以把它用作Verilog HDL语言的参考书。学生和教授们将会发现本书作为硬件设计和硬件描述语言的教学工具将是很有用的。
本书假定读者具有数字硬件设计的基本知识,并熟悉某种高级编程语言(例如 C语言)。
本书是一本有关语言的书,因此并不强调某一领域特定的建模风格(例如 RTL(Register Transfer Lerel)建模风格)。为了学习RTL综合建模,请参考本书的姐妹篇Verilog HDL Synthesis, A Practical Primer。
最后,我还要告诉读者,仅仅通过阅读来学习一种语言是不切合实际的。最佳的学习途径是把书上例子中的代码打印出来,在Verilog仿真器上编译这些代码,进行仿真,通过实际操作来学习,只有这样才能完整、全面地理解这种语言。一旦掌握了本书上的知识,就可以参阅IEEE标准语言参考手册(LRM),进一步学习有关Verilog HDL标准的更完整的资料。
本书的组织
第1章 简单介绍Verilog HDL语言的历史;概要描述该语言的主要功能。
第2章 通过实际例子讲解描述设计的3种主要风格:数据流、行为和结构,用很短的篇幅对Verilog HDL语言做了扼要的概述。
第3章 讲述Verilog HDL语言的基本组成要素,即该语言的“螺栓和螺帽”。该章主要描述标识符、注释、系统任务、编译指令和数据类型等语言要素。
第4章 只讲解表达式。表达式可以用在Verilog代码中的许多地方,包括延迟。该章还介绍可用于组成表达式的各种不同的操作符和操作数。
第5章 讲述门级建模方法,也就是用内建基元(原语)门为设计建模。该章对门的延迟、时间和延迟标度的概念、MOS开关和双向开关做了介绍和描述。
第6章 讲解的题目是由Verilog HDL所提供的创建用户定义基元(原语)的能力,也就是创建(不包括内建原语在内的)新基元的能力。通过给定例子的讲解,读者很容易理解描述组合和时序逻辑的用户定义基元(原语)。
第7章 描述赋值语句和讲解赋值语句执行的语义。在Verilog HDL语言中,用连续赋值语句可以为数据流建模风格建模。该章讲述两类延迟:赋值延迟和线网延迟。
第8章 介绍行为风格的建模方式;讲述两种主要的过程性结构,即initial语句和always语句;还详细地阐述过程性赋值语句。通过例子详细地解释顺序块和并行块;对于高级的编程结构,例如条件语句和循环语句,该章也给予讲解。
第9章 仔细地推敲了结构建模的风格;考察了层次和端口匹配的概念;讲解如何通过每个端口的互相关联将位于不同层次的多个模块连接起来。
第10章 讲解一些有深度的主题,例如指定块(Specify Block)、值变转储文件(VCD文件)及信号强度等。该章还介绍任务和函数,以及如何共享任务和函数的策略。
第11章 和第12章因为讨论了验证和建模两个课题,所以是最实用的两章。在第11章中,举了许多测试平台的例子,展示了波形的产生和响应的监控。在第12章中,举了许多建模的例子,演示了不同的Verilog语言结构如何配合使用。
最后,附录A包含了一份完整的Verilog HDL语法参考资料。语法采用巴克思—诺尔
(BackusNaur)
范式(BNF)表示。为了查阅方便,资料中的语法结构均按照字母顺序排列。
每一章的后面都附有练习题,这使得本书更适合作为大学的教科书。
在本书中出现的所有Verilog HDL描述中,保留字、系统任务和系统函数,以及编译指令均采用粗体字。在语法描述中作为语法一部分的操作符和标点符号也均采用粗体字。语法规则中可以选择的项,采用非粗体方括号(\[....\])。非粗体的大括号 ({.....})标识重复0次或者多次的项。有时在Verilog源代码中出现的省略号(....)表示与讨论无关的代码行。以Courier字体书写的词汇表示其特定的Verilog含义,而不是其英文的含义,例如and门。
书中所有的例子都已经通过ModelSim SE 5.8a仿真器的测试。
第3版中有些什么新内容
第2版出版已经5年多了,许多情况已经发生了变化。Verilog HDL语言的新版本已经变成了IEEE的标准,即IEEE Std 13642001。在本书中,新添加的Verilog语法条款已被融入到已有的章节中,哪些是新添加的语法条款并没有明确地加以界定。在第3章中,新的编译指令、变量类型和局部参数已经被引入教材。多维数组、索引的部分选择、有符号的表达式和算术移位已经被加入到第4章中。事件控制和过程性赋值也已在第8章中进行了探讨。第9章描述了生成语句、配置语句和另外一种端口编写和参数声明的风格。第10章解释了新的功能强大的输入/输出函数,这使得文件的读/写远比以前容易得多。在第11章中还添加了验证的实用程序。第12章包括了新添加的模型。附录中的语义语法也已经被更新到IEEE 13642001版本的新标准。
新版本的Verilog语言引进了许多编写代码的新风格。推荐的风格被标记为指导原则(guideline),用小的字体添加在页边上。我在页边上还提供了许多其他的建议和指导。我并不是完全按照页边上添加的建议来编写代码,我有意这样安排是为了能继续展示这种语言丰富多彩的功能。不过在日常工作中,确实可以使用这些原则和建议来编写Verilog模块。
致谢
下面列出名字的15位先生/女士,尽管他们的工作非常繁忙,可他们还是抽出宝贵的时间和精力审阅了本书的初稿和上一版的手稿,我衷心地感谢他们对本书出版所做的贡献。
他们是:
(1) 摩托罗拉半导体(现为Freescale)公司的Shalom Bresticker。
(2) CADENCE设计系统公司的Steven Sharp。
(3) Verisity Systems公司的Michael McNamala。
(4) Agere Systems公司的Vencent Zeyak Jr.。
(5) VeriBest 公司的Brett Graves, Gabe Moretti, Doug Smith。
(6) 贝尔实验室朗讯技术公司的Stephanie Alter, Danny Johnson, Sanjana Nair, Carlos Roman, Mourad Takla, Jenjen Tiao和Sriram Tyagaraja。
(7) 美国国家半导体公司的Marqsoodul Mannan。
他们对本书提出了许多建设性的批评意见和具体的改进细节,为本书的成功出版做出了很大的贡献,我衷心地感谢他们的帮助。
我还要感谢在贝尔实验室工作的Jean Dussault和Hao Nham,在我编写本书上一版期间,他们多次为代码的仿真提供真诚的帮助。
我还要感谢Prasad Subramaniam和Hao Nham,他们多次鼓励和帮助我编写本书。
最后我还要感谢我的妻子Geetha和3个儿子,是他们给了我很多感情上的支持,没有这些我永远不可能取得成功。
J. Bhasker
Allentown, PA
📦