SystemVerilog空对象访问调试:dereference depth 2含义咨询
SystemVerilog空对象访问报错答疑
报错基础信息
报错提示:
The object at dereference depth 2 is being used before it was allocated
触发报错的代码行:extip_axi4_uvc.wr_master.driver.m_write_addr_delay_shaper.set_periodic_profile(150);
问题1:dereference depth 2的具体含义
这是仿真器对多级句柄访问链的位置标记,计数规则如下:
- 以访问链最左侧的根句柄(也就是这行代码里的
extip_axi4_uvc)为深度0起点 - 每执行一次
.操作访问下一级类成员句柄,深度值加1 - 仿真器从左到右逐极检查句柄合法性,遇到值为null的句柄时,直接抛出对应深度的空访问报错,不会继续向后检查
对应你这条访问链的深度映射:
- 深度0:
extip_axi4_uvc(根句柄,已正常分配,否则会报深度0错误) - 深度1:
extip_axi4_uvc.wr_master(第一级解引用,已正常分配,否则会报深度1错误) - 深度2:
extip_axi4_uvc.wr_master.driver(第二级解引用,就是报错指向的空对象) - 深度3:
extip_axi4_uvc.wr_master.driver.m_write_addr_delay_shaper(仿真器还没走到检查这一级的步骤就已经触发报错) - 最后的
.set_periodic_profile(150)是对前序句柄指向对象的方法调用,不属于对象解引用步骤,不计入深度计数
问题2:该报错是否代表wr_master agent中未完成driver对象的实例化
这个报错明确指向extip_axi4_uvc.wr_master.driver句柄为空,常见诱因包含但不限于driver未实例化,具体可按以下优先级排查:
- 最常见原因是agent配置为被动模式:如果wr_master agent的
is_active参数被设置为UVM_PASSIVE,UVM build阶段默认不会创建driver和sequencer实例,只会例化monitor,此时driver句柄恒为null - 实例化时序错误:如果你这行代码的执行时机早于wr_master agent的build_phase执行完成时间,driver还没执行
new/create逻辑,也会出现空句柄 - 异常逻辑覆写句柄:如果build阶段已经正常创建了driver实例,但后续运行阶段有逻辑误将
driver句柄赋值为null,也会触发该报错
注意不要把排查方向放在m_write_addr_delay_shaper对象上,仿真器检测到driver为空时已经终止了访问链向后遍历,根本没有执行到访问shaper对象的步骤。
内容的提问来源于stack exchange,提问作者Wuuu
相关产品推荐
相关产品推荐

