我们在前面的文章 [UVM源代码研究] 聊聊寄存器模型中的期望值(desired value)、镜像值(mirrored value)以及DUT中的实际值(actual value)的相关概念及方法 已经简单介绍了predict()函数以及auto_predict相关的概念,本文我们来详细介绍一下寄存器模型中如何正确引入predictor。 首先我们看下当我们环境中使
5)第三个有如下: read/peek 和write/poke 对DUT完成读写后,也会调用此函数,它们的参数是UVM_PREDICT_READ和UVM_PREDICT_WRITE。 5.要实现在参考模型中更新寄存器模型而不影响DUT 的值,要使用UVM_PREDICT_DIRECT: 1)predict 操作会更新镜像值和期望值。 6.仿真完成后可以检查DUT 和寄存器模型中的counter 是否一...
1functionbit uvm_reg::predict (uvm_reg_data_t value,2uvm_reg_byte_en_t be = -1,3uvm_predict_e kind =UVM_PREDICT_DIRECT,4uvm_path_e path =UVM_FRONTDOOR,5uvm_reg_map map =null,6stringfname ="",7intlineno =0);8uvm_reg_item rw =new;9rw.value[0] =value;10rw.path =path;...
read/peek和write/poke操作在对DUT完成读写后,也会调用此函数,只是它们给出的参数是UVM_PREDICT_READ和UVM_PREDICT_WRITE。要实现在参考模型中更新寄存器模型而又不影响DUT的值,需要使用UVM_PREDICT_DIRECT,即默认值: 在测试用例中,仿真完成后可以检查DUT中counter的值是否与寄存器模型中的counter值一致: 二、寄存器模...
predict操作:人为的根据DUT来更新寄存器模型中的镜像值。但同时又不对DUT进行任何操作。此时的uvm_path_e是UVM_PREDICT_DIRECT。 可以通过加monitor在寄存器总线上。检测到uvm_reg_item操作,便通过TLM传送到uvm_reg_predict模块来更新mirror值。 函数内部主要有do_predict操作,这是主要的实现函数。还有一个post_predict...
value都赋值成我们预先设置的reset值(reset值即可以是默认的key="HARD",也可以是我们预先定义的key对应的reset值),同时将m_written变量赋值为0表示该uvm_reg_field没有被写过,纵观整个uvm_reg_field类的定义,只有在do_predict()函数里才有涉及到将m_written赋值为1的情况,后面我们再具体介绍do_predict()函数,...
6. Mirror与Predict操作 Mirror操作:用于同步DUT和模型。 Predict操作:用于设置参考模型的值,不影响实际DUT。7. 随机化与宏调整 随机化操作:UVM支持从reg_block、reg到reg_field的randomize操作,但需确保field类型支持写操作。 宏调整:寄存器模型的位宽和地址宽度受系统限制,可通过宏进行调整。8. ...
UVM还提供了内建的sequence来检查寄存器模型和DUT状态,以及高级用法,如driver驱动的自动预测和monitor监控的交易更新。寄存器模型的mirror操作用于同步DUT和模型,而predict操作则用于设置参考模型的值,不影响实际DUT。UVM支持从reg_block、reg到reg_field的randomize操作,但需确保field类型支持写操作。寄存器...
一般设置default_map.set_auto_predict(1);,这样当寄存器访问结束时,会调用do_predict,自动更新uvm_reg_filed中的三个变量值。 // uvm_reg.svh // do_write task uvm_reg::do_write (uvm_reg_item rw); ... // EXECUTE WRITE... case(rw.path) /...
UVM 提供了两种用来跟踪寄存器值的方式, 我们将其分为自动预测 (auto prediction)和显式预测 (explicit)。 如果读者想使用自动预测的方式,还需要调用函数 uvm_reg_map: :set_auto_predict () 。两种预测方式的显著差别在于, 显式预测对寄存器数值预测更为准确,...