(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中寄存器...
这边仅仅从一个小的方面进行切入,主要研究下我们实际的sequence_item在register model、adapter以及sequencer之间是如何调度传播的,这里选择的切入点就是使用寄存器模型里的寄存器调用write/read方法前门访问时数据包是如何在寄存器模型、adapter、sequencer中传递的,我们自然就联想到了adapter内的两个函数reg2bus和bus2reg。
(1) user在构建register model或者集成register model的过程中,可能会调用uvm_reg::build_coverage(), uvm_mem::build_coverage(), uvm_reg_block::build_coverage();而在build_coverage()函数内,会调用uvm_resource_db::read_by_name()函数,该函数又会调用get_by_name()函数,接着调用uvm_resource.svh中的...
项目中的reg_model一般只有一份,set到reg_sequence上,所以多个sequence并行启动结束的时候,reg model会成为一个共享资源。 uvm_reg_field中的volatile,主要来设置m_check的变量, m_check,主要用在uvm_reg的mirror task,以及read task,(需要map中配置check_on_read) uvm_reg_field中的desired,mirrored,m_parent,m...
uvm_reg常⽤的读写⽅式⾸先创建register model ral_model_h;可以使⽤下⾯的⽅式来读写寄存器:uvm_reg temp_reg;uvm_status_e status;$cast(temp_reg, ral_model_h.get_reg_by_name("REG_NAME"));temp_reg.write(status, write_data);temp_reg.read(status,read_data);还可以对寄存器的各...
class reg_model extends uvm_reg_block; rand reg_invert invert; … endclass 1. 2. 3. 4. 由此可以判断,对register_model来说,支持randomize操作。可以在uvm_reg_block级别调用randomize函数,也可以在uvm_reg级别,甚至可以在uvm_reg_field级别调用: ...
从图片看起来寄存器模型的加入并没有使寄存器访问变的简单而是变得更复杂了,但其实从代码中可以很明显的看出来,如果要读一个寄存器,加入寄存器模型的UVM环境里只需一行就可以把寄存器INVERT_REG的值读到value变量中。 reg_model.INVERT_REG.read(status, value, UVM_FRONTDOOR); ...
uvm_reg本质就是通过reg中的write,read等API,将读写请求,数据等通过API启动sequence发送给driver,...
寄存器模型中的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。
RAL Model 对应于 DUT 中的寄存器,RAL Model 中有 DUT 每⼀个寄存器的副本,它是真实硬件寄存器在软件环境中的⾏为模型;硬件寄存器的⼀个或多个 bit 的拼接称为⼀个域 ( field );多⼀个 field 形成⼀个 reg;多个 reg 构成⼀个块 ( block )。uvm library 已经为我们定义好了上述⼏...