在进行寄存器写操作时,还有一种方法是使用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的方式写也是非常常用的。
来源:CSDN
作者:硅码农
链接:https://blog.csdn.net/liuwei848/article/details/103541735