(2) 在使用get_root_blocks函数得到reg_block的指针后,使用cast将其转化为目标reg_block形式; externstaticfunctionvoidget_root_blocks(refuvm_reg_block blks[$]); functionvoiduvm_reg_block::get_root_blocks(refuvm_reg_block blks[$]);foreach(m_roots[blk]) begin blks.push_back(blk); end endfunc...
(1)通过调用uvm_reg的configure函数,在configure函数内调用m_parent.add_reg函数,将uvm_reg加入到uvm_reg_block中; (2) 一般地,假如整个寄存器中只有一个字段的话,会在调用这个寄存器的configure函数时,指定此寄存器的hdl路径,这个路径本质上是其中的uvm_reg_field的路径; 但是当一个寄存器中有多个uvm_reg_field...
对于顶层的寄存器模型来说,get_parent()返回的就是null,也就是说寄存器模型中的寄存器会自下而上层层判断有没有自定义的uvm_reg_backdoor句柄,如果都没有,图2中的代码段1执行的get_backdoor()函数最终返回的就是null。于是乎代码段2中执行的就是backdoor_read()任务,而backdoor_read()中又调用了backdoor_rea...
get register函数是用于从register block中获取指定名称或地址的寄存器描述的函数。它接受一个字符串参数,可以是寄存器的名称或地址,并返回对应的寄存器描述。 以下是一个示例get register函数的代码: python function get_register(input string name) return uvm_reg; static uvm_reg_list reg_list = this.get_regis...
2.还可以使用get_reg_by_offset 函数通过寄存器地址得到uvm_reg 指针,在调用此uvm_reg的read 或者write 进行读写操作: 1)如果像7.4.1 使用了寄寄存器模型,从最顶层的reg_block 的 get_reg_by_offset 也可以得到子reg_block 的寄存器。 2)假如buf_blk 的地址偏移是‘h1000,其中有偏移为’h3的寄存器(实际物...
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) rw.status=UVM_IS_OK;//Assume that the entire field is enabledif(!be[0])return; m_fname=rw.fname; ...
uvm_reg的new函数,带3个参数,除了name和coverage之外,中间的参数表示reg的size。uvm_reg的configure,...
set()函数修改的是寄存器模型中调用该函数的uvm_reg_field的m_desired(期望值),并且根据configure()时配置的m_access(访问类型)来限制期望值设置的值的范围(函数中case...endcase中间的内容),同时将value值更新为最新的m_desired值。 注意这里修改的仅仅是寄存器模型中的m_desired和value值,并不涉及任何与dut相关...
寄存器模型中的adapter就是一个适配器,提供了reg2bus和bus2reg的接口,充当uvm_reg_map和uvm_sequencer中的转换器。uvm_reg_map操作uvm_reg_bus_op类型的item,而uvm_sequencer操作uvm_sequence_item类型的item。 adapter 继承uvm_reg_adapter,重写reg2bus和bus2reg这两个pure virtual function。
UVM 提供了两种用来跟踪寄存器值的方式, 我们将其分为自动预测 (auto prediction)和显式预测 (explicit)。 如果读者想使用自动预测的方式,还需要调用函数 uvm_reg_map: :set_auto_predict () 。两种预测方式的显著差别在于, 显式预测对寄存器数值预测更为准确, 我们可以通过下面对两种模式的分析得出具体原因。