我们在前面的文章 [UVM源代码研究] 聊聊寄存器模型中的期望值(desired value)、镜像值(mirrored value)以及DUT中的实际值(actual value)的相关概念及方法 已经简单介绍了predict()函数以及auto_predict相关的概念…
答:desired value 和 mirrored value // do_predict function void uvm_reg_field::do_predict(uvm_reg_item rw, uvm_predict_e kind = UVM_PREDICT_DIRECT, uvm_reg_byte_en_t be = -1); uvm_reg_data_t field_val = rw.value[0] & ((1 << m_size)-1); if (rw.status != UVM_NOT_OK...
UVM_PREDICT_READ, rw.path, rw.map); field_val&= ('b1 << m_size)-1;end UVM_PREDICT_DIRECT: beginif(m_parent.is_busy()) begin `uvm_warning("RegModel", {"Trying to predict value of field '", get_name(),"' while register '",m_parent.get_full_name(),"' is being accessed"...
} uvm_predict_e; 1. 2. 3. 4. 5. read/peek和write/poke操作在对DUT完成读写后,也会调用此函数,只是它们给出的参数是UVM_PREDICT_READ和UVM_PREDICT_WRITE。要实现在参考模型中更新寄存器模型而又不影响DUT的值,需要使用UVM_PREDICT_DIRECT,即默认值: 在测试用例中,仿真完成后可以检查DUT中counter的值是否...
当在DUT中实现一个计数器的时候,模型中的计数器是静止的。如果想在模型中得到DUT的技术值,这就需要手动更新镜像值,又不能对DUT进行操作,这可以通过predict函数。 第三个参数是uvm_predict_e枚举类型,他有如下三个元素: 如果想要更新镜像值又不对DUT进行操作,要用UVM_PREDICT_DIRECT。
这是与复位相关的另一个函数,它实现了将uvm_reg_field中m_mirred、m_desired、value都赋值成我们预先设置的reset值(reset值即可以是默认的key="HARD",也可以是我们预先定义的key对应的reset值),同时将m_written变量赋值为0表示该uvm_reg_field没有被写过,纵观整个uvm_reg_field类的定义,只有在do_predict()函...
最后使用predict函数将新的counter值更新到寄存器模型中。predict操作会更新镜像值和期望值。 在测试用例中, 仿真完成后可以检查DUT中counter的值是否与寄存器模型中的counter值一致 寄存器模型中的基本概念 uvm_reg_field:寄存器的域,是一个uvm_reg中的一个字段/域 ...
1.3.3. reg.predict regm.thres.predict('h100); reg的predict本质就是依次去调用其中所有reg_field的predict函数,然后将reg predict参数中的寄存器值分别拆成对应field的predict,传给reg_field.predict。针对UVM_DIRECT_PREDICT,也是一般验证中常用的predict,无论reg的access为甚么类型,都能够直接修改value,m_desired和...
UVM 提供了两种用来跟踪寄存器值的方式, 我们将其分为自动预测 (auto prediction)和显式预测 (explicit)。如果读者想使用自动预测的方式,还需要调用函数uvm_reg_map: :set_auto_predict ()。两种预测方式的显著差别在于, 显式预测对寄存器数值预测更为准确, 我们可以通过下面对两种模式的分析得出具体原因。
6. Mirror与Predict操作 Mirror操作:用于同步DUT和模型。 Predict操作:用于设置参考模型的值,不影响实际DUT。7. 随机化与宏调整 随机化操作:UVM支持从reg_block、reg到reg_field的randomize操作,但需确保field类型支持写操作。 宏调整:寄存器模型的位宽和地址宽度受系统限制,可通过宏进行调整。8. ...