寄存器(RAL)模型中的set update实现写操作

纵然是瞬间 提交于 2019-12-15 09:48:58

在进行寄存器写操作时,还有一种方法是使用set,update的方式
下面来介绍一下
首先是set方法

function void uvm_reg::set(uvm_reg_data_t  value,
                           string          fname = "",
                           int             lineno = 0);
   // Split the value into the individual fields
   m_fname = fname;
   m_lineno = lineno;

   foreach (m_fields[i])
      m_fields[i].set((value >> m_fields[i].get_lsb_pos()) &
                       ((1 << m_fields[i].get_n_bits()) - 1));
endfunction: set

其实最终调用的field的set方法,根据之前设置的field的access来设置field的m_desired value,最终的效果就是设置reg的desired value

task uvm_reg::update(output uvm_status_e      status,
                     input  uvm_door_e        path = UVM_DEFAULT_DOOR,
                     input  uvm_reg_map       map = null,
                     input  uvm_sequence_base parent = null,
                     input  int               prior = -1,
                     input  uvm_object        extension = null,
                     input  string            fname = "",
                     input  int               lineno = 0);
   uvm_reg_data_t upd;

   status = UVM_IS_OK;

   if (!needs_update()) return;

   // Concatenate the write-to-update values from each field
   // Fields are stored in LSB or MSB order
   upd = 0;
   foreach (m_fields[i])
      upd |= m_fields[i].XupdateX() << m_fields[i].get_lsb_pos();

   write(status, upd, path, map, parent, prior, extension, fname, lineno);
endtask: update

update方法最核心是调用write方法,这里就不介绍了,还有一个方法了need_update,这个方法就是判断期望值和镜像值是否一致,不一样的话认为RAL模型中的值与RTL实际硬件的值不一样,那么需要update。

总结:在世界使用过程了,set+update的方式写也是非常常用的。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!