UVM reg атомарность для задач записи / чтения - PullRequest
0 голосов
/ 10 июля 2019

Я заметил, что у каждого класса 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() при возврате ключа таким же способом, каким он был проверен перед возвратом ключа.

...