寄存器模型保持着DUT内部寄存器值的镜像(mirror)。
镜像值不能保证是正确的,因为寄存器模型只能感知到对这些寄存器的外部读写操作。
如果DUT内部修改了寄存器中的字段,镜像值就会过时(outdated)。
寄存器模型可以通过使用uvm_reg_field::mirror(), uvm_reg::mirror(), 或uvm_reg_block::mirror()方法将一个寄存器的镜像值更新为存储在DUT中的值。
更新寄存器中某个字段的镜像也会同时更新同一寄存器中所有其他字段的镜像。更新一个block的镜像会更新它包含的所有寄存器和字段的镜像。
如果使用前门访问,更新一个大block的镜像可能需要大量的仿真时间;而使用后门访问更新不需要消耗仿真时间。
可以通过使用uvm_reg_field::set()或uvm_reg::set()方法在不消耗仿真时间向寄存器模型中的写入镜像值,这个镜像值不会反应到DUT中相应字段或寄存器。
可以通过使用uvm_reg::update()或uvm_reg_block::update()方法更新DUT的寄存器以匹配镜像值。如果新的镜像值与旧的镜像值相匹配,寄存器就不会被更新,从而节省不必要的总线访问。
要想不消耗仿真时间访问一个field或register的当前镜像值,可以使用 uvm_reg_field::get() 或uvm_reg::get()方法。
Memories是没有镜像的
Memories比较大,所以通常使用稀疏阵列的方法来建模。只有被写入的位置才会被存储起来,然后再读回来。任何未使用的内存位置都不会被建模。
与寄存器不同,memory的行为非常简单,memory镜像将是一个ROM或RAM内存模型,所以可以通过提供对内存模型的后门访问来取代。因此,使用uvm_mem::peek()或uvm_mem::poke()方法提供与memory镜像完全相同的功能。此外,与基于观察到的读写操作的寄存器镜像不同,使用后门访问的memory镜像总是返回或设置DUT中一个内存位置的实际值。
全部0条评论
快来发表一下你的评论吧 !