(1) uvm_reg::write (1.1) FRONTDOOR write操作最终会转换为uvm_reg_map的do_write任务; (1.2) uvm_reg_map的do_write任务会查看系统是否设置了adapter,如果没有设置,就直接启动sequence, 让sequencer发送uvm_reg_item类型的transaction;如果设置了,那就调用do_bus_write任务. (1.3) uvm_reg_map的do_write完...
(1.3) uvm_reg_map的do_write完成后,如果auto predict功能打开了, uvm_reg的do_write会根据写入的值更新register model中寄存器的值; 1taskuvm_reg::write(outputuvm_status_e status,2inputuvm_reg_data_t value,3inputuvm_path_e path =UVM_DEFAULT_PATH,4inputuvm_reg_map map =null,5inputuvm_sequence...
这边仅仅从一个小的方面进行切入,主要研究下我们实际的sequence_item在register model、adapter以及sequencer之间是如何调度传播的,这里选择的切入点就是使用寄存器模型里的寄存器调用write/read方法前门访问时数据包是如何在寄存器模型、adapter、sequencer中传递的,我们自然就联想到了adapter内的两个函数reg2bus和bus2reg。
update的时候,write的值是根据regmodel目前的值,来写进去的,也就是set field的值,write函数其实只是写入改变了的field。 所有的field都没有更新时,是不会进行update操作的。 update直接更新reg model内的值,需要检测此时没有reg model的frontdoor操作等,即not_busy。 在reg_field中的task中,基本都调用uvm_reg的ta...
reg_model p_rm; 需要在env中将p_rm传递给参考模型:mdl.p_rm = this.p_rm; 对于寄存器,寄存器模型提供了两个基本的任务:read和write p_rm.invert.read(status, value, UVM_FRONTDOOR); read任务的原型如下所示: 第一个是uvm_status_e型的变量,这是一个输出,用于表明读操作是否成功;第二个是读取的数值...
uvm_reg中为什么没有镜像值和期望值 目录 寄存器模型集成 总线UVC的实现 总线UVC解析 MCDF寄存器设计代码 Adapter的实现 Adapter的集成 访问方式 前门访问 后门访问 前门与后门的比较 前门与后门的混合应用 寄存器模型集成 总线UVC的实现 MCDF访问寄存器的总线接口时序较为简单。控制寄存器接口上首先需要在每个时钟解析cmd...
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);还可以对寄存器的各...
sequencer其实就是在环境中用于配置寄存器的driver对应的那个sequencer,uvm_reg本质就是通过reg中的write,...
uvm_reg_item:继承于uvm_sequence_item,可以看作是寄存器访问的transaction。 uvm_reg_bus_op:在uvm_reg_map中由uvm_reg_item转化而来,是一个struct类型的变量。 在这里插入图片描述 ACCESS方式reg write 创建uvm_reg_item实例rw,一般不用指定其uvm_sequence_base型的parent。但是FRONTDOOR形式发送transaction需要通过...
sample()可以理解为read()、write()方法的回调函数,用户需要填充该方法,使得可以保证自动采样数据。sample_values()是供用户外部调用的方法,在一些特定的事件触发时,例如中断、复位等场景,用户可以在外部通过监听具体事件来主动调用该方法,即ctrl_reg::sampel_values()。 在sample_values()方法中,可以通过get_...