
本书系统讲解Verilog HDL语言规则、语法体系,以Verilog-2001和Verilog-2005两种语言标准为依据,精讲语言,全面梳理,知识点系统全面。本书立足语言本身,按照语言体系编排内容,涵盖所有常用语法规则,补充Verilog-2005中新的语言点,既适合作为必备语法资料查询,也适合有一定设计基础的读者学习。主要内容包括Verilog HDL入门、数据类型、表达式、门级和开关级建模、数据流建模、行为级建模、层次结构、任务与函数、Test Bench测试与时序检查、面向综合的设计、有限状态机设计、Verilog HDL设计实例等,重点聚焦Verilog HDL综合和仿真,对语言、语法规则用案例进行阐释,用综合工具和仿真工具进行验证,利于读者加深理解。
前 言 Verilog HDL作为一种有40多年发展历史的硬件描述语言,现已较为成熟,已发布的Verilog HDL标准包括Verilog-1995、Verilog-2001和Verilog-2005,在这之后,IEEE发布的IEEE Standard 1800-2009标准是System Verilog标准与Verilog HDL标准的合并。虽然SystemVerilog在设计验证领域已有广泛应用,但Verilog HDL仍在设计领域占有重要地位,并发挥着不可替代的作用,Verilog-2001标准依然是大多数FPGA设计者主要使用的语言,得到几乎所有EDA综合工具和仿真工具的支持。 在IEEE标准中,将Verilog HDL定义为具有机器可读(machine-readable)、人可读(human-readable)特点的硬件描述语言,并认为Verilog HDL可用于电子系统创建的所有阶段:开发(development)、综合(synthesis)、验证(verification)和测试(test)阶段,同时支持设计数据的交流、维护(maintenance)和修改(modification),Verilog HDL面向的用户包括EDA工具的设计者和电子系统的设计者。从这里不难看出,Verilog-2001和Verilog-2005这两种语言标准仍值得EDA、ASIC和FPGA的学习者、从业者去仔细阅读、深入研究、系统学习,也是他们必须要掌握的设计利器。 本书主要面向Verilog HDL,系统讲解Verilog HDL语言规则、语法体系,以Verilog-2001和Verilog-2005两种语言标准为指引,精讲语言,全面梳理,知识点系统全面、力争准确。本书回归语言本身,在Verilog-2001和Verilog-2005两种语言标准的基础上,按语言本身的体系编排内容,涵盖所有常用语法规则,补充Verilog-2005中新的语言点,既适合作为必备语法资料查询,也适合有一定设计基础的读者学习。本书的特点体现在以下几个方面。 (1)系统全面把握Verilog HDL。 学习Verilog HDL,就必须重视Verilog HDL语言规则、语法体系,尤其是在使用了Verilog HDL一段时间并取得一定设计经验后,再系统全面地对Verilog HDL语言规则、语法体系做一次梳理、总结和学习,对语言的掌握和运用必将更上一层楼,并且设计水平也会获得明显提升。故笔者认为,在学习Verilog HDL时,应克服重学习案例、轻语法规则的倾向,全面把握语言本身。 (2)对语言规则、语法用案例做阐释,并采用综合工具和仿真工具做验证。 为准确理解Verilog HDL的有关语言规则,本书尽可能对语法用案例展示其用法,并用综合工具和仿真工具对其进行验证,力争准确,利于读者加深理解。比如,对于有符号数、算术操作符、表达式的符号等问题,均采用仿真工具进行验证并对结果进行分析,只有对这些细节非常清楚,在编写复杂的代码程序时才不会出错或少出错。在学习的过程中,应把语言的学习与EDA综合工具和仿真工具紧密结合,用EDA综合工具和仿真工具的结果去分析、验证语言和语法的规则。 本书可综合的案例选择了几种常见的“口袋”实验板进行了实际的下载和验证,这些案例也可移植到其他实验板或“口袋”实验板,市面上多数实验板的资源均能满足下载这些案例的需要。 本书既适合作为EDA技术、Verilog HDL语言、ASIC和FPGA设计方面本科生和研究生的教学用书,也可作为从事电路设计和系统开发的工程技术人员的语法规则工具书。 全书共12章。第1章是Verilog HDL简介及其文字规则;第2章介绍Verilog HDL数据类型;第3章讨论操作符、操作数、表达式及其符号和位宽等问题;第4章是Verilog HDL门级和开关级建模;第5章是数据流建模;第6章介绍行为级建模及Verilog HDL行为语句;第7章讨论Verilog HDL的层次结构,包括带参数模块例化与参数传递等问题;第8章是任务与函数,包括系统任务与系统函数;第9章是Test Bench测试与时序检查;第10章讨论面向综合的设计,包括常用数字部件的设计实现方法及设计优化等问题;第11章是有关有限状态机的内容;第12章是Verilog HDL设计实例,包括驱动常用I/O外设的案例及数字信号处理的案例等。 本书由王金明、徐程骥编著,参加本书编写的还有朱莉莉、王婧菡等,在此一并表示感谢。 由于EDA技术与Verilog HDL的不断发展变化,同时受编著者水平和精力所限,本书难免存在错误及不妥之处,恳请读者批评指正。 E-mail:wjm_ice@163.com 作 者 2022年8月
目 录 第1章 Verilog HDL入门 1 1.1 Verilog HDL简史 1 1.2 Verilog HDL描述的层级 2 1.3 Verilog HDL设计的流程 3 1.3.1 设计输入 3 1.3.2 综合 4 1.3.3 布局布线 4 1.3.4 时序分析 4 1.3.5 功能仿真与时序仿真 5 1.3.6 编程与配置 5 1.4 Verilog HDL文字规则 5 1.4.1 词法 5 1.4.2 空白符 5 1.4.3 注释 6 1.4.4 操作符 6 1.4.5 字符串 6 1.4.6 关键字 7 1.5 数字 7 1.5.1 整数 8 1.5.2 实数 9 1.5.3 数的转换 10 1.6 标识符 10 1.6.1 标识符简介 10 1.6.2 转义标识符 10 习题1 11 第2章 数据类型 12 2.1 值集合 12 2.2 net数据类型 12 2.2.1 wire型与tri型 13 2.2.2 其他net类型 13 2.3 variable数据类型 14 2.3.1 reg型 15 2.3.2 integer型与time型 15 2.3.3 real型与realtime型 16 2.4 向量 16 2.5 数组 17 2.5.1 数组简介 17 2.5.2 存储器 17 2.5.3 数组的赋值 17 2.6 参数 18 2.6.1 parameter参数 18 2.6.2 localparam局部参数 20 2.6.3 specparam参数 21 2.6.4 参数值修改 22 习题2 22 第3章 表达式 24 3.1 操作符 24 3.1.1 算术操作符 24 3.1.2 关系操作符 26 3.1.3 相等操作符 26 3.1.4 逻辑操作符 27 3.1.5 位操作符 27 3.1.6 缩减操作符 28 3.1.7 移位操作符 28 3.1.8 指数操作符 30 3.1.9 条件操作符 30 3.1.10 拼接操作符 30 3.1.11 操作符的优先级 31 3.2 操作数 31 3.2.1 整数 32 3.2.2 位选和段选 32 3.2.3 数组 34 3.2.4 字符串 34 3.3 表达式的符号 35 3.4 表达式的位宽 37 3.4.1 表达式位宽的规则 37 3.4.2 表达式位宽示例 38 3.5 赋值和截断 40 习题3 42 第4章 门级和开关级建模 43 4.1 Verilog HDL门元件 43 4.2 门元件的例化 45 4.2.1 门元件的例化简介 45 4.2.2 门延时 46 4.2.3 驱动强度 48 4.3 开关级元件 50 4.3.1 MOS开关 50 4.3.2 双向导通开关 51 4.4 门级结构建模 52 4.5 用户自定义元件 53 4.6 组合逻辑UDP元件 54 4.7 时序逻辑UDP元件 55 4.7.1 电平敏感时序UDP元件 55 4.7.2 边沿敏感时序UDP元件 56 4.7.3 电平敏感和边沿敏感行为的混合描述 56 4.8 时序UDP元件的初始化和例化 57 4.8.1 时序UDP元件的初始化 57 4.8.2 时序UDP元件的例化 58 习题4 59 第5章 数据流建模 60 5.1 连续赋值 60 5.1.1 连续赋值 60 5.1.2 net型变量声明时赋值 60 5.1.3 赋值延时 61 5.1.4 驱动强度 62 5.2 数据流建模 63 5.3 加法器和减法器 64 5.4 格雷码与二进制码的转换 68 5.5 三态逻辑设计 71 习题5 72 第6章 行为级建模 73 6.1 行为级建模概述 73 6.1.1 always过程语句 73 6.1.2 initial过程 75 6.2 过程时序控制 76 6.2.1 延时控制 76 6.2.2 事件控制 77 6.3 过程赋值 79 6.3.1 variable型变量声明时赋值 79 6.3.2 阻塞过程赋值 79 6.3.3 非阻塞过程赋值 80 6.3.4 阻塞赋值过程与非阻塞过程赋值的区别 81 6.4 过程连续赋值 83 6.4.1 assign和deassign 83 6.4.2 force和release 83 6.5 块语句 84 6.5.1 串行块begin-end 84 6.5.2 并行块fork-join 85 6.5.3 块命名 86 6.6 条件语句 87 6.6.1 if-else语句 88 6.6.2 case语句 90 6.6.3 casez与casex语句 92 6.7 循环语句 94 6.7.1 for语句 94 6.7.2 repeat、while和forever语句 95 习题6 97 第7章 层次结构 99 7.1 模块和模块例化 99 7.2 带参数模块例化与参数传递 101 7.2.1 带参数模块例化 101 7.2.2 用parameter进行参数传递 102 7.2.3 用defparam进行参数重载 104 7.3 层次路径名 105 7.4 generate生成语句 107 7.4.1 generate、for生成语句 107 7.4.2 generate、if生成语句 109 7.4.3 generate、case生成语句 110 7.5 属性 112 习题7 113 第8章 任务与函数 115 8.1 任务 115 8.1.1 任务 115 8.1.2 任务示例 116 8.2 函数 119 8.2.1 函数 119 8.2.2 任务和函数的区别 122 8.3 automatic任务和函数 123 8.3.1 automatic任务 123 8.3.2 automatic函数 124 8.4 系统任务与系统函数 125 8.5 显示类任务 126 8.5.1 $display与$write 126 8.5.2 $strobe与$monitor 128 8.6 文件操作类任务 129 8.6.1 $fopen与$fclose 129 8.6.2 $fgetc与$fgets 130 8.6.3 $readmemh与$readmemb 132 8.7 控制和时间类任务 133 8.7.1 $finish与$stop 133 8.7.2 $time、$stime与$realtime 134 8.7.3 $printtimescale与$timeformat 135 8.7.4 $signed与$unsigned 136 8.8 随机数及概率分布函数 137 8.8.1 $random 137 8.8.2 概率分布函数 139 8.9 编译指令 140 8.9.1 `timescale 140 8.9.2 `define和`undef 142 8.9.3 `ifdef、`else、`elsif、`endif和`ifndef 142 8.9.4 `include 144 8.9.5 `default_nettype 145 8.9.6 其他编译指令 145 习题8 146 第9章 Test Bench测试与时序检查 147 9.1 Test Bench测试 147 9.1.1 Test Bench 147 9.1.2 产生激励信号 147 9.1.3 产生时钟信号 148 9.1.4 读写文件 149 9.1.5 显示结果 151 9.2 测试实例 152 9.2.1 乘法器测试 152 9.2.2 数据选择器测试 153 9.2.3 格雷码计数器 154 9.3 specify块 156 9.3.1 specify块简介 156 9.3.2 模块路径延时 157 9.3.3 模块路径延时和分布延时混合 159 9.4 时序检查 159 9.4.1 $setup和$hold 160 9.4.2 $width和$period 161 9.5 SDF文件 162 习题9 163 第10章 面向综合的设计 164 10.1 可综合的设计 164 10.2 加法器设计 166 10.2.1 行波进位加法器 166 10.2.2 超前进位加法器 167 10.3 乘法器设计 171 10.3.1 用乘法操作符实现 171 10.3.2 布斯乘法器 172 10.3.3 查找表乘法器 176 10.4 有符号数的运算 181 10.5 ROM存储器 184 10.5.1 用数组例化存储器 184 10.5.2 例化lpm_rom实现存储器 186 10.6 RAM存储器 188 10.6.1 单口RAM 188 10.6.2 双口RAM 191 10.7 流水线设计 194 10.8 资源共享 197 习题10 199 第11章 有限状态机设计 200 11.1 有限状态机简介 200 11.2 有限状态机的Verilog HDL描述 201 11.2.1 三段式状态机描述 202 11.2.2 两段式状态机描述 203 11.2.3 单段式描述 204 11.3 状态的编码 206 11.3.1 常用的编码方式 206 11.3.2 状态编码的定义 207 11.3.3 用属性指定状态编码方式 211 11.3.4 多余状态的处理 211 11.4 用有限状态机设计除法器 211 11.5 用有限状态机控制流水灯 215 11.6 用状态机控制字符液晶 217 习题11 225 第12章 Verilog HDL设计实例 227 12.1 标准PS/2键盘 227 12.2 超声波测距 232 12.3 4×4矩阵键盘 237 12.4 汉字图形点阵液晶 243 12.4.1 LCD12864B汉字图形点阵液晶 243 12.4.2 汉字图形点阵液晶静态显示 244 12.4.3 汉字图形点阵液晶动态显示 247 12.5 VGA显示器 249 12.5.1 VGA显示原理与时序 249 12.5.2 VGA彩条信号发生器 251 12.5.3 VGA图像显示 255 12.6 TFT液晶屏 261 12.6.1 TFT液晶屏 261 12.6.2 TFT液晶屏显示彩色圆环 264 12.6.3 TFT液晶屏显示动态矩形 269 12.7 音乐演奏电路 271 12.7.1 音符演奏 272 12.7.2 乐曲演奏 276 12.8 开方运算 281 12.9 Cordic算法及其实现 286 12.9.1 Cordic算法 286 12.9.2 Cordic算法的实现 288 习题12 295 附录A Verilog HDL关键字 297 参考文献 298