文章目录
Q81:你的验证环境是什么?目录结构是什么样的?
我是使用 UVM 验证方法学搭建的 TB ,然后在 VCS 平台进行仿真的。目录结构的话:主要由 RTL 文件、doc 文件、tb 文件、sim 文件、script 文件这几部分。
Q82. UVM 有什么优缺点?
- UVM 的优点:UVM 有各个机制、促进验证平台的标准化,UVM 中 test sequence 和验证平台是隔离独立的,可以更好的控制激励而不需要重新设计 agent . 改变测试 sequence 可以简单高效提高代码覆盖率。 UVM 支持工业标准,这会促进验证平台标准化。此外, UVM 通过 OOP (面向对象编程)的特点(例如继承)以及使用覆盖组件提高了重复使用率。因此 UVM 环境方便移植,架构清晰,组件连接方便,有利于进行大规模的验证。
- UVM 的缺点:代码冗余,工作量大,运行速度有缺失。
Q83. 通过工厂进行覆盖有什么要求?
- 无论是重载的类( parrot )还是被重载的类( bird ),都要在定义时注册到 factory 机制中。
- 被重载的类( bird )在实例化时,要使用 factory 机制式的实例化方式,而不能使用传统的 new 方式。
- 最重要的是,重载的类( parrot )要与被重载的类( bird )有派生关系。重载的类必须派生自被重载的类,被重载的类必须是重载类的父类。
Q84. 如果环境中有两个 config_db set,哪个有效?
UVM 更高的层次更接近用户,为了让用户少和底层组件打交道,所以层次越高优先级越高,高层次的 set 会覆盖底层次的 set 。
如果是层次相同再看时间先后顺序,谁发生的晚谁有效,时间靠后的会覆盖之前的。
Q85. VIP 怎么写?
阶段 1(定义):
- 功能特性提取
- 特性覆盖率创建及映射
- VIP 的架构
阶段 2(VIP 基本搭建):
4. driver,sequencer,monitor (少量特性实现)。
5. 实现基本的端到端的 sequence
阶段 3(完成 monitor 与 scoreboard):
6. 完成 monitor -100%实现(checkers,assertions)
7. 完成 scoreboard -100%实现(数据完整性检查)
8. 在 monitor 中,完成监测到的 transaction 与 function coverage 实现映射。
9. 为映射更多的基本功能覆盖率,创建其它 sequences。
阶段 4(扩充 test 和 sequence 阶段):
10. 实现更多 sequences,从而获得 80%的功能覆盖率
阶段 5(完成标准):
11. Sequence 最终可以实现 100%的功能覆盖率。
12. 回归测试结果和最终的总结报告。
Q86. 验证流程,验证环境怎么搭
验证流程:
- 看 spec 文档和协议,将 DUT 的功能和接口总线时序搞明白
- 制定验证计划和测试点分解
- 写 VIP 或者是用别人给的 VIP ,搭建验证环境和 TB ,包括各种组件,各个模块的 pkg ,基础的 sequence 还有 test ,暂时先就写一两个基础的 sequence ,然后还有一些环境配置参数的确定等,最后能够将 TB 正常运行,保证无误;
- 根据测试点编写 sequence 和 case ,然后去仿真,保证仿真正确性,收集覆盖率;
- 分析收集的覆盖率,然后查看覆盖率报告去分析还有哪些没有被覆盖,去写一些定向 case ,和更换不同的 seed 去仿真;
- 回归测试 regression ,通过不同的 seed 去跑,收集覆盖率和检测是否有其它 bug ;
- 总结
验证环境:
driver 给 DUT 发送激励,montior 监测 DUT 输出的数据,参考模型(reference model )能实现与 DUT 相同的功能, scoreboard 把 monitor 接受到的数据和 reference model 的输出数据进行比对,如果比对成功就表示 DUT 能完成设计的功能。
Q87. Uvm_component_utils 有什么作用
- factory 机制的实现被集成在了一个宏中: uvm_component_utils。
- 这个宏最主要的任务是,将字符串登记在 UVM 内部的一张表中,这张表是 factory 功能实现的基础。只要在定义一个新的类时使用这个宏,就相当于把这个类注册到了这张表中。这样, factory 机制可以实现:根据一个字符串自动创建一个类的实例,并且调用其中的函数( function)和任务( task),这个类的 main_phase 就会被自动调用。
Q88. TLM 怎么用?
TLM 通信的步骤:
- 分辨出 initiator 和 target,producer 和 consumer 。
- 在 target 中实现 tlm 通信方法。
- 在俩个对象中创建 tlm 端口。
- 在更高层次中将俩个对象进行连接。
端口类型有三种:
- port ,一般是 initiator 的发起端。
- export ,作为 initiator 和 target 的中间端口。
- imp ,只能作为 target 接受 request 的末端。
多个 port 可以连接同一个 export 或 imp ,但是单个 port 或 export不能连接多个 imp 。
端口的连接:通过 connect 函数进行连接,例如 A(initiator) 与 B 进行连接,可以使用 A.port.connect(B.export)
uvm_*_imp#(T,IMP);IMP 定义中第一个参数 T 是这个 IMP 传输的数据类型,第二个参数 IMP 是实现这个接口所在的 component 。