第1章 SystemVerilog介绍 1
1.1 SystemVerilog起源 1
1.1.1 SystemVerilog标准的发展历程 2
1.1.2 SystemVerilog获得的捐赠 3
1.2 SystemVerilog针对硬件设计的关键增强 4
1.3 小结 5
第2章 SystemVerilog声明的位置 6
2.1 包(package) 6
2.1.1 包的定义 7
2.1.2 引用包的内容 8
2.1.3 综合指导 11
2.2 $unit编译单元声明 12
2.2.1 编码指导 13
2.2.2 SystemVerilog标识符搜索规则 14
2.2.3 源代码顺序 14
2.2.4 将包导入$unit的编码原则 15
2.2.5 综合指导 20
2.3 未命名语句块中的声明 21
2.3.1 未命名块中的局部变量 22
2.4 仿真时间单位和精度 23
2.4.1 Verilog编译指令timescale 23
2.4.2 包含时间单位的时间值 24
2.4.3 范围级(scope-level)时间单位和精度 25
2.4.4 编译单元的时间单位和精度 26
2.5 小结 27
第3章 SystemVerilog文本值和数据类型 29
3.1 加强的文本值赋值 29
3.2define增强 30
3.2.1 字符串内的宏变量替换 30
3.2.2 通过宏建立标识符名 31
3.3 SystemVerilog变量 32
3.3.1 对象类型和数据类型 32
3.3.2 SystemVerilog四态变量 33
3.3.3 SystemVerilog两态变量 34
3.3.4 显式及隐式变量和线网类型 36
3.3.5 综合指导 37
3.4 在RTL模型中使用两态类型 37
3.4.1 两态类型的特点 37
3.4.2 两态类型和四态类型仿真 38
3.4.3 在case语句中使用两态类型 39
3.5 数据类型规则的放宽 40
3.6 有符号和无符号修饰符 43
3.7 静态和自动变量 44
3.7.1 静态变量和自动变量的初始化 45
3.7.2 自动变量的综合指导 47
3.7.3 静态和自动变量的使用原则 47
3.8 变量初始化的确定性 48
3.8.1 初始化确定机制 48
3.8.2 时序逻辑的异步输入初始化 50
3.9 强制类型转换 52
3.9.1 静态转换(编译时转换) 52
3.9.2 动态强制类型转换 53
3.9.3 综合指导 54
3.10 常数 55
3.11 小结 56
第4章 用户自定义和枚举数据类型 57
4.1 用户自定义类型 57
4.1.1 局部typedef声明 57
4.1.2 共享typedef定义 58
4.1.3 用户自定义类型的命名习惯 59
4.2 枚举数据类型 60
4.2.1 枚举类型标签序列 63
4.2.2 枚举类型标签作用域 64
4.2.3 枚举类型值 64
4.2.4 枚举类型的基类 65
4.2.5 自定义和匿名枚举 66
4.2.6 枚举类型操作的强类型检验 66
4.2.7 将表达式强制转换为枚举类型 67
4.2.8 枚举类型的专用系统任务和方法 68
4.2.9 打印枚举类型 70
4.3 小结 71
第5章 数组、结构体和联合体 72
5.1 结构体 72
5.1.1 结构体声明 73
5.1.2 结构体赋值 75
5.1.3 压缩和非压缩结构体 77
5.1.4 通过端口传递结构体 79
5.1.5 将结构体作为自变量传递至任务和函数 80
5.1.6 综合指导 80
5.2 联合体 81
5.2.1 非压缩联合体 81
5.2.2 标签联合体 83
5.2.3 压缩联合体 84
5.2.4 综合指导 85
5.2.5 使用结构体和联合体的一个例子 86
5.3 数组 87
5.3.1 非压缩数组 87
5.3.2 压缩数组 90
5.3.3 使用压缩和非压缩数组 91
5.3.4 声明时对数组进行初始化 92
5.3.5 数组赋值 94
5.3.6 数组复制 95
5.3.7 使用位流转换复制数组和结构体 96
5.3.8 由数组构成的数组 96
5.3.9 数组中使用用户自定义类型 97
5.3.10 数组通过端口及任务和函数的传送 98
5.3.11 结构体和联合体构成的数组 98
5.3.12 结构体和联合体中的数组 99
5.3.13 综合指导 99
5.3.14 使用数组的例子 100
5.4 foreach数组循环结构体 101
5.5 用于数组查询的系统函数 102
5.6 $bits位宽系统函数 104
5.7 动态数组、联合数组、稀疏数组和字符串 104
5.8 小结 105
第6章 SystemVerilog过程块、任务和函数 106
6.1 Verilog通用目的always过程块 106
6.2 SystemVerilog特有的过程块 110
6.2.1 组合逻辑过程块 110
6.2.2 锁存逻辑过程块 116
6.2.3 时序逻辑过程块 117
6.2.4 综合指导 118
6.3 对任务和函数的改进 118
6.3.1 任务和函数的隐式语句组 118
6.3.2 返回函数值 119
6.3.3 在任务和函数结束前返回 119
6.3.4 空函数 120
6.3.5 使用名称传递任务/函数的参数 121
6.3.6 增强型函数形式参数 122
6.3.7 无形式参数的函数 123
6.3.8 形式参数的缺省方向和类型 123
6.3.9 缺省的形式参数值 124
6.3.10 数组、结构体和联合体作为形式参数 125
6.3.11 用引用取代复制来传递参数值 125
6.3.12 命名的任务和函数结尾 129
6.3.13 空任务和函数 130
6.4 小结 130
第7章 过程语句 131
7.1 新操作符 131
7.1.1 递增和递减操作符 131
7.1.2 赋值操作符 134
7.1.3 有无关通配符的相等操作符 136
7.1.4 设置成员操作符——inside 138
7.2 操作数改进 139
7.2.1 两态和四态类型数据的运算 139
7.2.2 类型强制转换 139
7.2.3 尺寸强制转换 140
7.2.4 符号强制转换 141
7.3 改进的for循环 141
7.3.1 for循环中声明的局部变量 142
7.3.2 多重for循环赋值 144
7.3.3 for循环中声明的变量的层次化引用 144
7.3.4 综合指导 145
7.4 底部检测的do…while循环 145
7.4.1 综合指导 146
7.5 foreach数组循环结构 147
7.6 新的跳转语句——break、continue、return 147
7.6.1 continue语句 148
7.6.2 break语句 149
7.6.3 return语句 149
7.6.4 综合指导 150
7.7 改进的块名 150
7.8 语句标号 152
7.9 改进的case语句 153
7.9.1 unique case条件判断 154
7.9.2 priority case语句 157
7.9.3 unique、priority与parallel_case、full_case的对比 157
7.10 改进的if…else判断语句 159
7.10.1 unique if…else判断语句 160
7.10.2 priority if判断语句 161
7.11 小结 161
第8章 有限状态机建模 163
8.1 使用枚举类型建立状态机模型 163
8.1.1 使用枚举类型表示状态编码 165
8.1.2 使用枚举类型的反向case语句 166
8.1.3 枚举类型与unique case语句 168
8.1.4 指定未使用的状态值 169
8.1.5 将状态值赋给枚举类型变量 170
8.1.6 对枚举类型变量的操作 172
8.2 在FSM模型中使用两态数据类型 173
8.2.1 使用两态类型和枚举类型对FSM复位 173
8.3 小结 174
第9章 层次化设计 175
9.1 模块原型 175
9.1.1 原型与实际定义 176
9.1.2 避免端口冗余声明 176
9.2 命名的结束语句 177
9.2.1 命名的模块结尾 177
9.2.2 命名的代码块结尾 177
9.3 嵌套(局部)模块的声明 178
9.3.1 嵌套模块名称的可见性 180
9.3.2 实例化嵌套模块 181
9.3.3 嵌套模块的名称搜索规则 182
9.4 简化的模块实例网表 183
9.4.1 隐式的.name端口连接 187
9.4.2 隐式的.*端口连接 191
9.5 线网别名化 193
9.5.1 别名化规则 194
9.5.2 隐式线网声明 195
9.5.3 在.name和.*中使用别名 196
9.6 在模块端口间传递数值 199
9.6.1 所有类型都可在端口间传递 199
9.6.2 SystemVerilog的模块端口限制 200
9.7 端口引用 202
9.7.1 作为共享变量引用端口 203
9.7.2 综合指导 204
9.8 增强的端口声明 204
9.8.1 Verilog-1995的端口声明 204
9.8.2 Verilog-2001的端口声明 204
9.8.3 SystemVerilog的端口声明 205
9.9 参数化类型 206
9.10 小结 208
第10章 接口 209
10.1 接口的概念 209
10.1.1 Verilog模块端口的缺点 214
10.1.2 SystemVerilog接口的优势 215
10.1.3 接口的内容 219
10.1.4 接口与模块的不同点 219
10.2 接口声明 219
10.2.1 源代码声明次序 222
10.2.2 全局与局部接口定义 222
10.3 将接口用作模块端口 222
10.3.1 显式命名的接口端口 222
10.3.2 通用接口端口 223
10.3.3 综合指导 223
10.4 接口的实例化和连接 223
10.5 接口内部信号的引用 224
10.6 接口的modport 226
10.6.1 指定使用哪种modport方式 226
10.6.2 使用modport定义不同的连接 230
10.7 在接口中使用任务和函数 232
10.7.1 接口的方法 232
10.7.2 接口方法的导入(import) 233
10.7.3 接口方法的综合原则 235
10.7.4 导出(export)任务和函数 236
10.8 接口中的过程块 238
10.9 可重构接口 239
10.10 接口验证 240
10.11 小结 240
第11章 一个完整设计的建模 241
11.1 ATM实例 241
11.2 数据抽象 242
11.3 接口封装 244
11.4 设计顶层模块:squat 247
11.5 接收机和发射机 253
11.5.1 接收状态机 253
11.5.2 发射状态机 256
11.6 测试平台 259
11.7 小结 266
第12章 行为级和交易级建模 267
12.1 行为建模 267
12.2 什么是交易 268
12.3 SystemVerilog的交易级建模 269
12.3.1 存储子系统举例 270
12.4 使用接口的交易级建模 272
12.5 总线仲裁 274
12.6 交易器、适配器和总线功能模型 277
12.6.1 作为模块的主适配器 278
12.6.2 接口中的适配器 284
12.7 更复杂的交易 290
12.8 小结 290
附录A SystemVerilog形式定义(BNF) 291
附录B Verilog和SystemVerilog保留关键字 336
附录C SUPERLOG的历史,即SystemVerilog的开端 341