logo资料库

SystemVerilog验证 测试平台编写指南带目录.pdf

第1页 / 共387页
第2页 / 共387页
第3页 / 共387页
第4页 / 共387页
第5页 / 共387页
第6页 / 共387页
第7页 / 共387页
第8页 / 共387页
资料共387页,剩余部分请下载后查看
封面
书名
版权
前言
目录
第1章 验证导论
1.1 验证流程
1.2 验证方法学
1.3 基本测试平台的功能
1.4 定向测试
1.5 方法学基础
1.7 你 的随机化对象是什么
1.8 功能覆盖率
1.9 测试平台的构件
1.10 分层的测试平台
1.14 测试平台的性能
1.15 结束语
第2章 数据类型
2.1 内建数据类型
2.2 定宽数组
2.2.2 常量数组
2.2.3 基本的数组操作-for和foreach
2.2.4 基本的数组操作-复制和比较
2.2.5 同时使用位下标和数组下标
2.2.6 合并数组
2.2.7 合并数组的例子
2.2.8 合并数组和非合并数组的选择
2.3 动态数组
2.4 队列
2.5 关联数组
2.6 链表
2.7 数组的方法
2.7.2 数组定位方法
2.7.3 数组的排序
2.8 选择存储类型
2.8.3 速度
2.8.4 排序
2.9 使用typedef 创建新的类型
2.10 创建用于自定义结构
2.10.1 使用struct创建新类型
2.10.2 对结构进行初始化
2.10.3 创建可容纳不同类型的联合
2.10.4 合并结构
2.11 类型转换
2.12 枚举类型
2.13 常量
2.14 字符串
2.15 表达式的位宽
2.16 结束语
第3章 过程语句和子程序
3.1 过程语句
3.2 任务、函数以及viod函数
3.3 任务和函数概述
3.4 子程序参数
3.4.1 C语言风格的子程序参数
3.4.2 参数的方向
3.4.3 高级的参数类型
3.4.4 参数的缺省值
3.4.5 采用名字进行参数传递
3.5 子程序返回
3.5.2 从函数中返回一个数组
3.6 局部数据存储
3.6.1 自动存储
3.6.2 变量的初始化
3.7 时间值
3.7.2 时间参数
3.7.3 时间和变量
3.8 结束语
第4章 连接设计和测试平台
4.1 将测试平台和设计分开
4.2 接口
4.2.1 使用接口来简化连接
4.2.2 连接接口和端口
4.2.3 使用modport将接口中的信号分组
4.2.5 创建接口监视模块
4.2.6 接口的优缺点
4.3 激励时序
4.3.1 使用时钟块控制同步信号的时序
4.3.2 接口中的logic和wire对比
4.3.3 Verilog的时序问题
4.3.4 测试平台-设计间的竞争状态
4.3.5 程序块(Program Block) 和时序区域(Timing Region )
4.4 接口的驱动和采样
4.5 将这些模块都连接起来
4.6 顶层作用域
4.7 程序-模块交互
4.8 SystemVerilog断言
4.8.1 立即断言(Immmediate Assertion )
4.8.2 定制断言行为
4.8.3 并发断言
4.9 四端口的ATM路由器
4.9.1 使用端口的ATM路由器
4.9.2 使用端口的ATM顶层网单
4.9.3 使用接口简化连接
4.9.4 ATM接口
4.9.5 使用接口的ATM路由器模型
4.9.6 使用接口的ATM顶层网单
4.9.7 使用接口的ATM测试平台
4.10 ref端口的方向
4.11 仿真的结束
4.12 LC3取指模块的定向测试(directed test )
4.13 结论
第5章 面向对象编程基础(OOP )
5.1 概述
5.2 考虑名词,而非动词
5.3 编写第一个类(Class )
5.4 在哪里定义类
5.5 OOP术语
5.6 创建新对象
5.6.1 没有消息就是好消息
5.6.2 定制构造函数(Constructor )
5.7 对象的解除分配(deallocation )
5.8 使用对象[Object]
5.9 静态变量和全局变量
5.9.1 简单的静态变量
5.9.2 通过类名访问静态变量
5.9.3 静态变量的初始化
5.9.4 静态方法
5.10 类的方法
5.11 在类之外定义方法(extern )
5.12 作用域规则
5.12.1 this是什么
5.13 在一个类内使用另一个类
5.13.1 我的类该做成多大
5.13.2 编译顺序的问题
5.14 理解动态对象
5.14.1 将对象传递给方法
5.14.2 在任务(task )中修改句柄
5.14.3 在程序中修改对象
5.14.4 句柄数组
5.15 对象的复制
5.15.1 使用new操作符复制一个对象
5.15.2 编写自己的简单复制函数
5.15.3 编写自己的深层复制函数
5.15.4 使用流操作符从数组到打包对象,或者从打包对象到数组
5.16 公有和私有
5.18 建立一个测试平台
5.19 结论
第6章 随机化
6.1 介绍
6.2 什么需要随机化
6.3 SystemVerilog中的随机化
6.3.1 带有随机变量的简单类
6.3.2 检查随机化(randomize)结果
6.4 什么可以被随机化
6.4.2 简单表达式
6.4.4 权重分布
6.4.5 集合(set )成员和inside运算符
6.4.7 条件约束
6.4.9 使用合适的数学运算来提高效率
6.5 解的概率
6.5.2 关系操作
6.5.3 关系操作和双向约束
6.5.4 使用solve...before约束引导概率分布
6.6 控制多个约束块
6.7 有效性约束
6.8 内嵌约束
6.9 pre_randomize和post_randomize函数
6.9.1 构造浴缸型分布
6.10 随机数函数
6.11 约束的技巧和技术
6.11.1 使用变量的约束
6.11.2 使用非随机值
6.11.4 随机化个别变量
6.11.5 打开或关闭约束
6.11.6 在测试过程中使用内嵌约束
6.11.7 在测试过程中使用外部约束
6.12 随机化的常见错误
6.12.1 小心使用有符号变量
6.13 迭代和数组约束
6.13.3 数组约束的问题
6.13.4 约束数组和队列的每一个元素
6.13.5 产生具有唯一元素的数组
6.13.6 随机化句柄数组
6.14 产生原子激励场景
6.14.2 随机序列
6.15 随机控制
6.15.1 用randcase建立决策树
6.16 随机数发生器
6.16.1 伪随机数发生器
6.16.2 随机稳定性-多个随机 发生器
6.16.3 随机稳定性和层次化种子
6.17 随机器件配置
6.18 结论
第7章 线程以及线程间通信
7.1 线程的使用
7.1.1 使用fork...join和 begin...end
7.1.2 使用fork...join_none来产生线程
7.1.3 使用fork...join_any实现线程同步
7.1.4 在类中创建线程
7.1.5 动态线程
7.1.6 线程中的自动变量
7.1.8 在线程间共享变量
7.2 停止线程
7.2.2 停止多个线程
7.2.3 禁止被多次调用的任务
7.3 线程间的通信
7.4 事件
7.4.1 在事件的边沿阻塞
7.4.2 等待事件的触发
7.4.3 在循环中使用事件
7.4.4 传递事件
7.4.5 等待多个事件
7.5 旗语
7.5.1 旗语的操作
7.6 信箱 (mailbox)
7.6.1 测试平台里的信箱
7.6.2 定容信箱
7.6.3 在异步线程间使用信箱通信
7.6.4 使用定容信箱和探视(peek)来实现线程同步
7.6.5 使用信箱和事件来实现线程同步
7.6.6 使用两个信箱来实现线程的同步
7.6.7 其他的同步技术
7.7 构筑带线程并可实现线程间通信的测试程序
7.7.1 基本的事务处理器
7.7.2 配置类
7.7.3 环境类
7.7.4 测试程序
7.8 结束语
第8章 面向对象编程的高级技巧指南
8.1 继承简介
8.1.1 事务基类
8.1.2 Transaction类的扩展
8.1.4 扩展类的构造函数
8.1.5 驱动类
8.1.6 简单的发生器类
8.2 蓝图(Blueprint )模式
8.2.1 environment类
8.2.2 简单的测试平台
8.2.3 使用扩展的Transaction类
8.2.4 使用扩展类改变随机约束
8.3 类型向下转换(downcasting )和虚方法
8.3.1 使用$cast作类型向下转换
8.3.2 虚方法
8.4 合成、继承和其他替代的方法
8.4.1 在合成和继承之间取舍
8.4.2 合成的问题
8.4.3 继承的问题
8.4.4 现实世界中的其他方法
8.5 对象的复制
8.5.1 copy_data方法
8.5.2 制定复制的目标
8.6 抽象类和纯虚方法
8.7 回调
8.7.1 创建一个回调任务
8.7.2 使用回调来注入干扰
8.7.3 记分板简介
8.7.4 与使用回调的记分板进行连接
8.8 参数化的类
8.8.1 一个简单的堆栈(stack )
8.9 结论
第9章 功能覆盖率
9.1 覆盖率的类型
9.1.1 代码覆盖率
9.1.2 功能覆盖率
9.1.3 漏洞率
9.1.4 断言覆盖率
9.2 功能覆盖策略
9.2.1 收集信息而非数据
9.2.2 只测量你将会使用到的内容
9.2.3 测量的完备性
9.3 功能覆盖率的简单例子
9.4 覆盖组详解
9.4.1 在类里定义覆盖组
9.5 覆盖组的触发
9.5.1 使用回调函数进行采样
9.5.2 使用事件触发的覆盖组
9.5.3 使用SystemVerilog断言进行触发
9.6 数据采样
9.6.1 个体仓和总体覆盖率
9.6.2 自动创建仓
9.6.3 限制自动创建仓数目
9.6.4 对表达式进行采样
9.6.5 使用用户自定义的仓发现漏洞
9.6.6 命名覆盖点的仓
9.6.7 条件覆盖率
9.6.8 为枚举类型创建仓
9.6.9 翻转覆盖率
9.6.10 在状态和翻转中使用通配符
9.6.11 忽略数值
9.6.12 不合法的仓
9.6.13 状态机的覆盖率
9.7 交叉覆盖率
9.7.1 基本的交叉覆盖率的例子
9.7.2 对交叉覆盖仓进行标号
9.7.3 排除掉部分交叉覆盖仓
9.8 通用的覆盖组
9.9 覆盖 选项
9.9.3 覆盖阈值
9.9.5 覆盖率目标
9.10 覆盖率数据的分析
9.11 在仿真过程中进行覆盖率统计
9.12 结束语
第10章 高级接口
10.1 ATM路由器的虚接口
10.2 连接 到多个不同的设计配置
10.3 接口中的过程代码
10.3.1 并行协议接口
10.3.2 串行协议接口
10.4 结论
第11章 完整的SystemVerilog测试平台
11.1 设计单元
例11.1 顶层模块
例11.2 测试平台的程序
例11.3 CPU管理接口
例11.4 Utopia接口
11.2 测试平台的模块
例11.5 Environment类的首部
例11.6 Environment类的方法
例11.7 回调类连接了驱动器和记分板
例11.8 回调类连接了监视器和记分板
例11.9 回调类连接了监视器和覆盖率类
例11.10 配置类
例11.12 配置类的方法
例11.16 UNI_cell定义
例11.17 UNI_cell信元的方法
例11.18 UNI_generator类
例11.19 driver类
例11.20 Driver回调类
例11.22 Monitor回调类
例11.23 记分板(Scoreboard)类
例11.24 功能覆盖类
例11.25 CPU_driver类
11.3 修改测试
11.3.1 第一个测试-只有一个信元的测试
11.3.2 随机丢弃信元
11.4 结论
第12章 SystemVerilog与C语言的接口
12.1 传递简单的数值
12.1.1 传递整数和实数类型
12.1.2 导入(import) 声明
12.1.3 参数方向
12.1.4 参数类型
12.1.5 导入数学库函数
12 .2 连接简单的C子程序
12.2.1 使用静态变量的计数器
12.2.2 chandle数据类型
12.2.3 值得压缩(packed )
12.2.4 四状态数值
12.2.5 从双状态数值转换到四状态数值
12.3 调用C++程序
341
342
343
12.3 调用C++程序
12.3.1 C++中的计数器
13.3.2 静态方法
12.3.3 和事务级(Transaction Level )C++模型通信
12.4 共享简单数组
12.4.1 一维数组-双状态
12.4.2 一维数组-四状态
12.5 开放数组(open array )
12.5.2 开放数组的方法
12.5.3 传递大小未定义的开发数组
12.5.4 DPI中压缩(packed )的开放数组
12.6 共享复合类型
12.6.1 在SystemVerilog和C之间传递结构
12.6.2 在SystemVeriog和C之间传递字符串
12.7 纯导入方法和关联导入方法
12.8 在C中与SystemVerilog通信
12.8.2 调用SystemVerilog函数的C函数
12.8.5 上下文(context )的含义
12.8.6 设置导入函数的作用域
12.9 与其他语言交互
12.10 结论
全书完
分享到:
收藏