Verilog HDL:硬件描述语言详解

需积分: 10 1 下载量 171 浏览量 更新于2024-08-02 收藏 4.76MB PDF 举报
"Verilog HDL是用于数字系统建模的一种硬件描述语言,适用于FPGA学习,具备行为、数据流、结构和时序建模能力,支持设计验证和模拟控制。该语言起源于1983年,由Gateway Design Automation公司开发,后成为IEEE Std 1364-1995标准。其主要能力包括基本逻辑门、模块化设计、并行与顺序操作、事件驱动、参数化和综合等特性。" Verilog HDL硬件描述语言是一种强大的工具,它允许工程师以不同的抽象层次描述数字系统,从高层次的算法描述到低层次的门电路甚至晶体管级别。这种语言的核心子集易于学习,但同时也包含了丰富的建模功能,使得它能应对从简单逻辑门到复杂电子系统的各种设计挑战。 1. 行为建模:Verilog HDL允许用户描述系统的行为特性,就像编程一样,比如使用if-else语句、case结构等,使得设计人员可以专注于系统的功能逻辑而不必过多关注实现细节。 2. 数据流建模:数据流模型强调数据如何在系统中流动,它通过操作符如加法、乘法等描述信号的处理过程。 3. 结构组成:Verilog HDL支持模块化设计,可以将复杂系统分解为独立的模块,每个模块可以单独设计、测试和复用,提高了设计的可读性和可维护性。 4. 时序建模:语言中的always块用于定义时序逻辑,如寄存器、计数器等,它可以基于事件驱动或者时间驱动进行工作。 5. 仿真语义:Verilog HDL的每个语法结构都有明确的模拟和仿真规则,这使得模型可以在Verilog仿真器中验证其正确性。 6. 外部交互:通过编程语言接口,设计师可以控制模拟过程,例如设置初始条件、触发特定事件,以及在运行时观察设计内部状态。 7. 历史发展:Verilog HDL最初是私有语言,1990年公开,1995年成为IEEE标准,即IEEE Std 1364-1995,现在是电子设计自动化(EDA)领域的重要标准之一。 8. 主要能力:除了基本逻辑门(如AND、OR、NOT),Verilog还支持组合逻辑、时序逻辑、多线程、参数化模块、任务和函数、接口定义、系统级建模等特性。 9. 综合:Verilog HDL设计可以被综合成实际的门级电路,用于FPGA或ASIC的实现,这一过程将高级描述转化为实际的硬件电路。 10. 设计验证:Verilog HDL也支持高级验证方法,如断言、随机化测试平台和覆盖度测量,这些都是现代设计验证不可或缺的部分。 Verilog HDL是数字系统设计和验证的重要工具,它的强大功能和灵活性使得它在电子设计领域占据着核心地位。通过深入学习和实践,工程师可以利用Verilog HDL来创建高效、可靠的数字系统。
2009-09-15 上传
目 录 译者序 前言 第1章 简介 1 1.1 什么是Verilog HDL? 1 1.2 历史 1 1.3 主要能力 1 第2章 HDL指南 4 2.1 模块 4 2.2 时延 5 2.3 数据流描述方式 5 2.4 行为描述方式 6 2.5 结构化描述形式 8 2.6 混合设计描述方式 9 2.7 设计模拟 10 第3章 Verilog语言要素 14 3.1 标识符 14 3.2 注释 14 3.3 格式 14 3.4 系统任务和函数 15 3.5 编译指令 15 3.5.1 `define和`undef 15 3.5.2 `ifdef、`else 和`endif 16 3.5.3 `default_nettype 16 3.5.4 `include 16 3.5.5 `resetall 16 3.5.6 `timescale 16 3.5.7 `unconnected_drive和 `nounconnected_drive 18 3.5.8 `celldefine 和 `endcelldefine 18 3.6 值集合 18 3.6.1 整型数 18 3.6.2 实数 19 3.6.3 字符串 20 3.7 数据类型 20 3.7.1 线网类型 20 3.7.2 未说明的线网 23 3.7.3 向量和标量线网 23 3.7.4 寄存器类型 23 3.8 参数 26 第4章 表达式 28 4.1 操作数 28 4.1.1 常数 28 4.1.2 参数 29 4.1.3 线网 29 4.1.4 寄存器 29 4.1.5 位选择 29 4.1.6 部分选择 29 4.1.7 存储器单元 30 4.1.8 函数调用 30 4.2 操作符 30 4.2.1 算术操作符 31 4.2.2 关系操作符 33 4.2.3 相等关系操作符 33 4.2.4 逻辑操作符 34 4.2.5 按位操作符 35 4.2.6 归约操作符 36 4.2.7 移位操作符 36 4.2.8 条件操作符 37 4.2.9 连接和复制操作 37 4.3 表达式种类 38 第5章 门电平模型化 39 5.1 内置基本门 39 5.2 多输入门 39 5.3 多输出门 41 5.4 三态门 41 5.5 上拉、下拉电阻 42 5.6 MOS开关 42 5.7 双向开关 44 5.8 门时延 44 5.9 实例数组 45 5.10 隐式线网 45 5.11 简单示例 46 5.12 2-4解码器举例 46 5.13 主从触发器举例 47 5.14 奇偶电路 47 第6章 用户定义的原语 49 6.1 UDP的定义 49 6.2 组合电路UDP 49 6.3 时序电路UDP 50 6.3.1 初始化状态寄存器 50 6.3.2 电平触发的时序电路UDP 50 6.3.3 边沿触发的时序电路UDP 51 6.3.4 边沿触发和电平触发的混合行为 51 6.4 另一实例 52 6.5 表项汇总 52 第7章 数据流模型化 54 7.1 连续赋值语句 54 7.2 举例 55 7.3 线网说明赋值 55 7.4 时延 55 7.5 线网时延 57 7.6 举例 57 7.6.1 主从触发器 57 7.6.2 数值比较器 58 第8章 行为建模 59 8.1 过程结构 59 8.1.1 initial 语句 59 8.1.2 always语句 61 8.1.3 两类语句在模块中的使用 62 8.2 时序控制 63 8.2.1 时延控制 63 8.2.2 事件控制 64 8.3 语句块 65 8.3.1 顺序语句块 66 8.3.2 并行语句块 67 8.4 过程性赋值 68 8.4.1 语句内部时延 69 8.4.2 阻塞性过程赋值 70 8.4.3 非阻塞性过程赋值 71 8.4.4 连续赋值与过程赋值的比较 72 8.5 if 语句 73 8.6 case语句 74 8.7 循环语句 76 8.7.1 forever 循环语句 76 8.7.2 repeat 循环语句 76 8.7.3 while 循环语句 77 8.7.4 for 循环语句 77 8.8 过程性连续赋值 78 8.8.1 赋值—重新赋值 78 8.8.2 force与release 79 8.9 握手协议实例 80 第9章 结构建模 83 9.1 模块 83 9.2 端口 83 9.3 模块实例语句 83 9.3.1 悬空端口 84 9.3.2 不同的端口长度 85 9.3.3 模块参数值 85 9.4 外部端口 87 9.5 举例 89 第10章 其他论题 91 10.1 任务 91 10.1.1 任务定义 91 10.1.2 任务调用 92 10.2 函数 93 10.2.1 函数说明部分 93 10.2.2 函数调用 94 10.3 系统任务和系统函数 95 10.3.1 显示任务 95 10.3.2 文件输入/输出任务 97 10.3.3 时间标度任务 99 10.3.4 模拟控制任务 99 10.3.5 定时校验任务 100 10.3.6 模拟时间函数 101 10.3.7 变换函数 102 10.3.8 概率分布函数 102 10.4 禁止语句 103 10.5 命名事件 104 10.6 结构描述方式和行为描述方式的 混合使用 106 10.7 层次路径名 107 10.8 共享任务和函数 108 10.9 值变转储文件 110 10.9.1 举例 111 10.9.2 VCD文件格式 112 10.10 指定程序块 113 10.11 强度 114 10.11.1 驱动强度 114 10.11.2 电荷强度 115 10.12 竞争状态 116 第11章 验证 118 11.1 编写测试验证程序 118 11.2 波形产生 118 11.2.1 值序列 118 11.2.2 重复模式 119 11.3 测试验证程序实例 123 11.3.1 解码器 123 11.3.2 触发器 124 11.4 从文本文件中读取向量 126 11.5 向文本文件中写入向量 127 11.6 其他实例 128 11.6.1 时钟分频器 128 11.6.2 阶乘设计 130 11.6.3 时序检测器 132 第12章 建模实例 136 12.1 简单元件建模 136 12.2 建模的不同方式 138 12.3 时延建模 139 12.4 条件操作建模 141 12.5 同步时序逻辑建模 142 12.6 通用移位寄存器 145 12.7 状态机建模 145 12.8 交互状态机 147 12.9 Moore有限状态机建模 150 12.10 Mealy型有限状态机建模 151 12.11 简化的21点程序 153 附录 语法参考 157 参考文献 172