更新时间:2023-12-06 18:27:17
封面
版权信息
作者简介
内容简介
自序
第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对象都应该用工厂创建呢?