← 验证题集

推荐答案 测试一下

我有一次在编写完TB后,TB里面有一个config类,用于配置环境的相关变量的,然后我后来又写了一个他的派生类,但是我忘记了在顶层传递到env去,因此env中config_get就没有收到这个参数,而我又在内部写了如果没有收到则使用原先的…

编程题 中等 笔试真题

参考答案

该问题源于对 UVM config_db 机制的误解。config_db 采用基于路径和类型的键值存储:set 和 get 必须使用完全相同的类型标识以及完整准确的层次路径。用户在顶层忘记将派生类对象 set 到 env 的路径下,导致 env 中 config_get 失败。由于 config_get 的第二个参数是 inout 句柄,在未找到匹配项时仅保持原值(即默认的基类对象),不会产生 warning 或 fatal。用户内部代码又写入了“未收到则使用基类参数”的逻辑,使得 env 始终使用基类对象,无论顶层如何修改派生类配置都无效。正确做法是:1)set 时确保路径正确,例如 uvm_config_db#(my_config)::set(this, "env", "config", cfg);2)get 时检查返回值或句柄是否 null,若失败应报 error 或 fatal 以暴露问题;3)类型严格一致,派生类 get 必须用派生类类型,不能用基类类型;4)可调用 uvm_config_db::exists() 验证是否存在。本题也反映了编码习惯问题:应避免静默降级(silent degradation),任何配置缺失都应有显式告警。

涉及知识点

  • uvm_config_db 的 set/get 机制与路径匹配
  • 类型匹配在 config_db 中的关键作用
  • config_get 失败时返回默认值不报错
  • 使用 exists() 或检查句柄非空来验证配置存在
  • 避免静默降级的编码习惯
登录后反馈错题
下一题 →