(1.2) uvm_reg_map的do_write任务会查看系统是否设置了adapter,如果没有设置,就直接启动sequence, 让sequencer发送uvm_reg_item类型的transaction;如果设置了,那就调用do_bus_write任务. (1.3) uvm_reg_map的do_write完成后,如果auto predict功能打开了, uvm_reg的do_write会根据写入的值更新register model中寄存器...
uvm_reg_bus_op表示一个对register/memory的bus Transction,主要用在前门访问中 最后子顶层env build_phase中定义如下: uvm_reg::include_coverage("*", UVM_CVR_FIELD_VALS); regmodel = block_reg::type_id::create("block", this); regmodel.build(); regmodel.set_coverage(UVM_CVR_FIELD_VALS); r...
uvm_reg_model——寄存器模型(⼀) 对于⼀个复杂设计,寄存器模型要能够模拟任意数量的寄存器域操作。UVM提供标准的基类库,UVM的寄存器模型来⾃于继承⾃VMM 的RAL(Register Abstract Layer),现在可以先将寄存器模型进⾏XML建模,再通过脚本⼯具直接⽣产寄存器模型。⾸先来看看 uvm_reg_model的代码...
在实例化后reg_model还要做四件事:第一是调用configure函数,其第一个参数是parent block,由于是最顶层的reg_block,因此填写null,第二个参数是后门访问路径 第二是调用build函数,将所有的寄存器实例化 第三是调用lock_model函数,调用此函数后,reg_model中就不能再加入新的寄存器了 第四是调用reset函数,如果不调用...
第一是调用configure函数,其第一个参数是parent block,由于是最顶层的reg_block,因此填写null,第二个参数是后门访问路径,这里传入一个空的字符串。 第二是调用build函数,将所有的寄存器实例化。 第三是调用lock_model函数,调用此函数后,reg_model中就不能再加入新的寄存器了。
一、reg_model的实现 uvm_reg_field 用来针对寄存器功能域来构建对应的比特位 uvm_reg 与寄存器相匹配,其内部可以例化和配置多个uvm_reg_field对象(uvm_object) uvm_mem 匹配硬件存储模型 uvm_reg_map 用来指定寄存器列表中各个寄存器的偏移地址、访问属性以及对应的总线 uvm_reg_block 可以容纳多个寄存器(uvm_reg)...
这个DUT相当的简单,它只有一个寄存器version,要为其建造register model。首先要从uvm_reg派生一个通用的寄存器类: 在new函数中,要把这个寄存器的宽度作为参数传递给super.new函数。这里的宽度并不是说这个寄存器的有效宽度,而是说这个寄存器中总共的位数。如对于一个16位的寄存器,其中可能只使用了8位,那么这里要填写的...
1.再向uvm_reg 加入uvm_reg_field时,将加入的uvm_reg_field 定义为rand 类型: 2.再将uvm_reg 加入uvm_reg_block时,同样定义为rand: 3.可以判断对register_model 来说,支持randomize操作。可以在uvm_reg_block,uvm_reg,uvm_reg_field级别调用:
我们自然就联想到了adapter内的两个函数reg2bus和bus2reg。要实现register model与adapter和sequencer的...
reg_model.STATUS_REGread(status,value,UVM_FRONTDOOR); ... endtask 只要一句话就可以实现上述复杂的过程。像启动sequence,并把读取结果返回这些事情,都可以由register model来完成。 2. register model中一些常用的概念 uvm_reg_field:这是register model中最小的单位,什么是reg_field?加入有一个状态寄存器,它的...