Я заметил, что у каждого класса uvm_reg есть локальный семафор m_atomic, который инициализируется в 1 с помощью m_atomic = new(1);
Когда мы выполняем reg.write (без переопределения ни одной из задач), будет два вызова 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
То, что отсутствует, - это проверка процесса в задаче uvm_reg::XatomicX()
при возврате ключа таким же способом, каким он был проверен перед возвратом ключа.