真实面经题目 · 原创解析
SystemVerilog 中 queue 和 array 有什么区别,如何删除 queue 元素?
这题考验证语言数据结构,回答要区分固定数组、动态数组、关联数组和 queue 的容量、索引和操作语义。
真实面经题目 · 原创解析
这题考验证语言数据结构,回答要区分固定数组、动态数组、关联数组和 queue 的容量、索引和操作语义。
array 是一大类,可能是固定数组、动态数组或关联数组;queue 是 SystemVerilog 提供的有序、可变长度队列,索引从 0 开始,支持在头尾和指定位置插入删除。固定数组大小编译期确定,动态数组用 new 分配并可整体调整大小,关联数组按任意键稀疏存储;queue 更适合事务缓存、期望队列和先入先出操作。删除 queue 元素可以用 `q.delete(index)` 删除指定下标,用 `q.delete()` 清空整个队列,也可以用 `pop_front()` 或 `pop_back()` 取出并删除头尾元素。回答时要强调这些结构主要服务仿真验证,不要默认可综合。
固定数组大小固定,适合静态维度;动态数组运行时分配连续下标空间;关联数组适合稀疏键值访问。它们的大小管理和索引语义不同。
queue 用 `$` 表示尾部边界,可以 push_front、push_back、pop_front、pop_back,也能 insert 和 delete 指定位置,适合验证环境中的事务队列。
删除指定元素用 `delete(index)`,删除全部用不带参数的 `delete()`。若需要取出并删除头尾元素,使用 pop_front 或 pop_back 更直接,并能拿到被删除元素。
删除或 pop 前要确认队列非空和 index 合法。queue 的元素移动会影响后续下标,因此循环删除时要注意遍历方向或重新计算索引。
动态数组通常通过 new 重新分配大小,queue 更像容器,天然支持头尾 push/pop 和中间 insert/delete,更适合队列操作。
删除一个元素后后续元素下标会前移,循环删除时最好从后往前删,或先收集要保留的元素重新构造队列。
要看断言、功能覆盖、代码覆盖、错误注入和回归日志是否对应题目里的关键路径;如果只是组件能跑起来,但没有覆盖目标状态和异常分支,验证价值是不够的。