为你推荐
作者简介
内容简介
自 序
第1章 什么是疑难点?
第2章 SystemVerilog疑难点集合
2.1 数据使用
2.1.1 组合型数组和非组合型数组怎么区分?
2.1.2 组合型数组和非组合型数组如何做赋值?
2.1.3 在使用enum或struct时添加typedef与否的差别是什么?
2.1.4 什么是静态变量和动态变量?
2.1.5 struct和struct packed区别在哪里?
2.1.6 关联数组的散列存储表示什么?
2.1.7 如何将队列插入到另外一个队列中?
2.1.8 队列在赋值时使用操作符{ },那么它属于组合型吗?
2.1.9 数组的选取可以用两个变量作为索引边界吗?
2.1.10 parameter、localparam和const有什么联系和差别?
2.1.11 多维数组的声明和使用,哪种方式更合适呢?
2.2 操作符使用
2.2.1 { }操作符的使用场景有哪些?
2.2.2 条件赋值符?:和条件语句if-else的执行结果一致吗?
2.2.3 if和iff的应用场景分别有哪些?
2.2.4 使用foreach在轮循数组时按照什么顺序呢?
2.2.5 运算符的优先级是否有必要记忆呢?
2.2.6 assign连续赋值可以赋值给logic(var)类型吗?
2.2.7 ::和.这两个符号使用起来有哪些区别?
2.3 模块、接口与方法
2.3.1 module中的方法在声明时是否要添加automatic?
2.3.2 interface在何处需要使用virtual来声明呢?
2.3.3 initial和always的执行顺序是否与代码位置有关?
2.3.4 interface的modport和clocking block如何使用?
2.3.5 module和interface之间可以相互例化吗?
2.3.6 方法的参数默认方向该如何辨别?
2.3.7 return的使用场景有哪些?
2.3.8 task与function的联系和差别在哪里?
2.3.9 方法的参数默认值该如何使用?
2.3.10 方法中参数方向inout和ref有什么差别?
2.3.11 module和interface中的变量声明必须放置在头部位置吗?
2.3.12 如何例化和传递多个相同类型的接口?
2.3.13 使用while和forever语句时需要注意什么?
2.3.14 系统函数和内建方法有什么区别?
2.3.15 接口和模块的联系和差别是什么?
2.3.16 program和module的联系和差别是什么?
2.3.17 多个线程在仿真调度中是如何在不同的域之间执行和切换的?
2.3.18 时钟块在使用时需要注意哪些地方?
2.3.19 如何连接和驱动双向端口信号?
2.4 类的使用
2.4.1 类的成员变量在声明时或在new函数中初始化有何区别?
2.4.2 new函数与其他函数有哪些不同?
2.4.3 关键词new的使用场景有哪些?
2.4.4 对象占用的空间什么时候会被回收?
2.4.5 this的使用场景有哪些?
2.4.6 对象拷贝的种类如何划分?
2.4.7 this和super有什么联系和差别?
2.4.8 子类成员如何覆盖父类成员?
2.4.9 子类句柄和父类句柄的类型如何转换?
2.4.10 为什么父类句柄经常需要转换为子类句柄?
2.4.11 虚方法声明和不声明的区别是什么?
2.4.12 虚方法的描述符virtual应该在哪里声明?
2.4.13 句柄一旦不指向对象,该对象就被回收了吗?
2.4.14 什么时候该使用local和protected?
2.4.15 class和virtual class的区别是什么?
2.4.16 virtual修饰符在哪些场景中会用到?
2.4.17 子类能够使用与父类相同名称但不同参数的方法吗?
2.4.18 使用参数类或者接口时要注意哪些?
2.5 随机约束使用
2.5.1 rand描述符可用于哪些变量类型?
2.5.2 数组使用rand声明会发生什么?
2.5.3 句柄使用rand声明会发生什么?
2.5.4 rand和randc的区别在哪里?
2.5.5 内嵌约束中的local::表示什么?
2.5.6 是否可以利用动态数组对变量值的范围进行约束?
2.5.7 多个软约束在随机化时有冲突是否可以解决?
2.5.8 结构体是否可对其成员使用rand描述符?
2.5.9 如何随机化对象的多个成员且使每次数据不重复?
2.5.10 子类会继承还是覆盖父类的约束?
2.6 覆盖率应用
2.6.1 covergroup的采样事件如何指定?
2.6.2 covergroup如何对变量进行采样?
2.6.3 是否可对covergroup中的不同coverpoint指定采样条件?
2.6.4 covergroup在哪里定义和例化更合适?
2.6.5 如果covergroup中的bins没有被采样,可能有哪些原因?
2.6.6 如何减少不关心的cross bins采样数据?
2.7 线程应用
2.7.1 semaphore使用时需要初始化吗?
2.7.2 mailbox使用时需要例化吗?
2.7.3 fork-join_none开辟的线程在外部任务退出后也会结束吗?
2.7.4 父线程和子线程之间的执行关系是什么?
2.7.5 disable fork和disable statement有什么差别?
2.7.6 嵌套的fork有没有可能被disable fork误伤呢?
2.7.7 使用for配合fork-join_none触发多个线程时需要注意什么?
2.8 断言应用
2.8.1 SV语言如何控制断言的开关?
2.8.2 仿真器如何控制断言的开关?
2.8.3 断言在哪里定义和例化更为合适?
2.8.4 如何更好地让接口中的断言实现复用性?
第3章 UVM疑难点集合
3.1 UVM机制
3.1.1 是否所有的UVM对象都应该用工厂创建呢?
3.1.2 工厂创建uvm_object是否需要为其指定parent?
3.1.3 为什么建议配置放在对象创建之前?
3.1.4 UVM环境中进入new()和build_phase()有什么区别?
3.1.5 在创建组件时采用new()有什么影响?
3.1.6 UVM配置类的参数修改应该发生在什么时间?
3.1.7 UVM的消息严重等级是否可以屏蔽或修改触发动作?
3.1.8 UVM的消息严重等级是否可以修改?
3.1.9 通过uvm_config_db可以完成哪些数据类型的配置?
3.1.10 使用uvm_config_db时传递的参数类型是否需要保持一致?
3.1.11 如何设置timeout时间防止仿真超时?
3.1.12 set_drain_time()的作用是什么?
3.1.13 组件的phase方法中继承父类的phase方法是在做什么?
3.1.14 如何控制UVM最后打印的消息格式?
3.1.15 配置对象的层次为什么应与验证环境的层次相同?
3.1.16 uvm_config_db和uvm_resource_db在使用时有什么区别?
3.1.17 在继承UVM某些参数类时是否需要指定参数类型?
3.1.18 UVM中的注册类有重名时会发生什么?
3.1.19 为什么在build_phase中访问更低层次的组件会失败呢?
3.1.20 在UVM中是否可跨层次调用某些组件的方法?
3.1.21 在使用uvm_config_db时要注意什么?
3.2 通信与同步
3.2.1 event和uvm_event的联系和区别是什么?
3.2.2 sequencer和driver的类型参数REQ/RSP需要保持一致吗?
3.2.3 TLM FIFO的方法是否可以直接调用?
3.2.4 为什么uvm_object类型不能例化TLM端口?
3.2.5 UVM回调函数类的使用特点有哪些?
3.2.6 uvm_event应从哪里例化和获取?
3.2.7 TLM端口为什么没有注册过呢?
3.3 测试序列
3.3.1 m_sequencer和p_sequencer有什么区别?
3.3.2 为什么不建议在sequence中使用pre_body()和post_body()?
3.3.3 sequence如何通过uvm_config_db获得配置的变量?
3.3.4 start()和`uvm_do_on()有何区别?
3.3.5 uvm_sequence_library的作用是什么?
3.3.6 配置default_sequence和调用sequence::start()是否可同时进行?
3.3.7 一些sequence调用raise_objection()的目的是什么?
3.3.8 每一个sequence都需要调用raise_objection()吗?
3.3.9 set_automatic_phase_objection()使用起来方便吗?
3.3.10 如何终止一个正在执行的sequence?
3.3.11 发送sequence和sequence item的优先级问题是什么?
3.3.12 为什么sequence通过get_response()可以得到正确的response?
3.3.13 通过uvm_config_db::set()或start()挂载sequence有哪些联系和差别?
3.3.14 通过uvm_config_db挂载default sequence需要注意什么?
3.3.15 为什么不建议使用default_sequence挂载顶层序列呢?
3.3.16 uvm_sequence::start()挂载的sequencer什么情况下需要指定?
3.3.17 virtual sequence需要获得某些信号和状态应该如何实现?
3.3.18 怎么让sequence感知coverage的增长并及时停止呢?
3.4 寄存器模型
3.4.1 寄存器模型验证常见的测试点有哪些?
3.4.2 使用set_auto_predict()和predictor更新寄存器有什么区别?
3.4.3 如何对寄存器的某些域进行读/写操作?
3.4.4 uvm_reg_filed::configure()中的参数volatile的作用是什么?
3.4.5 uvm_reg的回调函数{pre,post}_{write,read}的用途是什么?
3.4.6 与uvm_reg_cbs相关的回调函数的用处是什么?
3.4.7 adapter中的provides_responses属性的作用是什么?
3.4.8 多个uvm_reg_block和uvm_reg_map的关系如何影响对寄存器的访问?
3.4.9 如果并行利用RGM对寄存器做读/写可能出现什么问题?
3.4.10 寄存器模型结构是否支持多个top RGM?
3.4.11 uvm_reg_map的数据位宽如果与总线不同需要做什么处理?
3.4.12 uvm_reg_map的数据位宽如果与子一级不同需要做什么处理?
3.4.13 寄存器模型的镜像值和期望值什么情况下相等或不相等?
3.4.14 uvm_reg的读/写动作在发起后没有结束的原因可能是什么?
第4章 Testbench疑难点集合
4.1 编译与导入
4.1.1 package中可以定义什么类型?
4.1.2 library和package怎么区分?
4.1.3 文件中出现typedef class X是什么意思?
4.1.4 `include和import的差别在哪里?
4.1.5 `include应该在哪里使用?
4.1.6 应该怎么理解域(scope)呢?
4.1.7 在系统验证阶段如何避免反复编译以节省时间?
4.1.8 如何解决和避免类重名或模块重名的问题?
4.2 验证组件实现
4.2.1 监测器采样数据需要注意哪些?
4.2.2 模块中的信号可以强制赋值和监测吗?
4.2.3 如何对设计层次中的某个实例进行侵入式赋值?
4.2.4 如何在仿真结束时打印一些测试总结信息?
4.2.5 为什么有时无法在sequence或test中使用force语句?
4.2.6 为什么寄存器模型机构应与验证环境层次保持一致?
4.2.7 为什么建议执行任务时各组件统一使用run_phase或main_phase?
4.2.8 如何更新driver的驱动行为?
4.2.9 force和$hdl_xmr_force、uvm_hdl_force等命令有什么差别?
4.3 测试平台控制
4.3.1 如何将覆盖率数据信息与测试用例关联?
4.3.2 系统验证如何实现C用例和UVM用例之间的互动?
4.3.3 系统验证时测试用例有误,是否可以避免重新仿真而只做局部修改?
4.3.4 如何在仿真过程中更好地控制验证环境的结构和行为?
4.3.5 不同目标具备不同timescale是否合适?
4.3.6 能否对其他组件执行的raise objection强行操作drop objection?
4.3.7 如何在回归测试中减少冗余的测试用例?
4.3.8 验证环境遇到reset时如何协调各验证组件?
4.3.9 仿真出现错误信息时如何让仿真停止?
4.3.10 Verilog如何实现在相同结构中采用不同设计模块?
4.3.11 仿真器如何实现在相同的结构中采用不同的设计模块?
买过这本书的人还买过
读了这本书的人还在读
同类图书排行榜