uvm_reg_field:这是寄存器模型中的最小单位 uvm_reg:它比uvm_reg_field高一个级别,但是依然是比较小的单位 uvm_reg_block:它是一个比较大的单位,在其中可以加入许多的uvm_reg,也可以加入其他的uvm_reg_block uvm_reg_map:每个寄存器在加入寄存器模型时都有其地址,uvm_reg_map就是存储这些地址,并将其转换成...
uvm_reg_field:包含uvm_reg_data_t类型的三个成员变量value,m_mirrored,m_desire。 uvm_reg:包含成员变量m_fields,加入各个uvm_reg_field。 uvm_reg_block:uvm_reg的集合,uvm_reg需要加入到uvm_reg_map中,且属于同一个uvm_reg_block。每个uvm_reg_block至少包含一个uvm_reg_map。uvm_reg_block中也可以再...
我们需要将该寄存器包含的所有uvm_reg_field以uvm_hdl_path_slice的形式通过add_hdl_path的形式配置给该寄存器,这样我们在执行backdoor_read和和write的时候才能正确执行,否则就会报对应backdoor hierarchy不存在的warning信息,转而使用frontdoor实现,关于这一点可以参考文章最后代码示例中的jb_recipe_reg寄存器的...
如果关闭auto_predict,用uvm_reg_predict来更新镜像值,我在在使用中write之后,调用get和get_mirrored_value得到0。 如果是read任务,那么无论是auto_predict还是uvm_reg_predict都会自动更新镜像值和期望值。 链接:https://github.com/east1203/uvm_codes/tree/master/tb1_wd/a.uvm_reg_predict 2.4 read 1 2 3...
注2:每一个register内都有一个旗语m_atomic来确保它同时只能被一个进程访问;如果一个线程在执行过程中,被显式杀掉, 有必要调用uvm_reg::reset()释放掉它所占用的key; 注3:在实际仿真过程中,发现采用寄存器后门读一个uvm_reg_field时,没有立即返回读取值,而是隔了很久,就是因为在XatomicX中获取旗语时hang住...
update直接更新reg model内的值,需要检测此时没有reg model的frontdoor操作等,即not_busy。 在reg_field中的task中,基本都调用uvm_reg的task,但是read、write根据是否支持individual可能会调用map中的task。 uvm_reg中还有一些hdl_path的function,add_hdl_path_slice,添加到field的path路径。这些路径,之后在map中会被...
还会调用各个uvm_reg中的build(),去例化每个uvm_reg中的field,去配置各个field*/ rgm.build(); rgm.map.set_auto_predict(); reg2mcdf = reg2mcdf::type_id::create("reg2mcdf"); endfunction function void connect_phase(uvm_phase phase);
uvm_reg_field done_field 接下来就需要实例化这些reg_field,实例化的方式有很多,可以在status_reg中...
uvm_reg_field temp_field_h;temp_field_h=temp_reg.get_field_by_name("FIELD_NAME");temp_field_h.set(write_value);tempreg.update(status);temp_field_h.read(status, read_data);需要注意的是,需要事先调⽤ral_model_h.reset(),否则寄存器⽐特位可能不对。
uvm_reg的访问方法 在给出寄存器模型的常见应用模式之前,首先从下表中更全面地了解uvm_reg_ block、 uvm_reg 和uvm_reg_ field 三个类提供的用于访问寄存器的方法。 uvm_reg_ sequence 提供的方法(均是针对寄存器对象的, 而不是寄存器块或寄存器域)如下表。