我注意到每个uvm_reg类都有一个本地信号量m_atomic,它由m_atomic = new(1);
初始化为1,当我们进行reg.write(不覆盖任何任务)时,将有两个对{{1}的调用}这给信号灯添加了两个键,因此丢失了寄存器访问的整个原子概念。如果我忽略了某些东西,有人可以阐明吗?
这是代码段
XatomicX(0);
因此,缺少的是在将密钥放回原位之前,将密钥放回原位时在task uvm_reg::write(...);
XatomicX(1);
...
do_write(...);
...
XatomicX(0);
endtask
task uvm_reg::do_write(...);
XatomicX(1);
...
XatomicX(0);
endtask
task uvm_reg::XatomicX(bit on);
process m_reg_process;
m_reg_process=process::self();
if (on) begin
if (m_reg_process == m_process)
return;
m_atomic.get(1);
m_process = m_reg_process;
end
else begin
// Maybe a key was put back in by a spurious call to reset()
void'(m_atomic.try_get(1));
m_atomic.put(1);
m_process = null;
end
endtask: XatomicX
任务中进行了过程检查。