рекомендовать способ записи монитора в UVM с разной полярностью событий

Я пытаюсь реализовать монитор для VDU (блок отображения видео), и способ программирования VDU говорит о том, что сигналы синхронизации имеют контролируемую полярность. Это означает, что в соответствии с настройками VDU монитор должен реагировать на событие @posedge или @negedge. Есть ли способ передать тип (означает posesge или negedge) через базу данных конфигурации или сделать что-то подобное. Вместо того, чтобы писать if (правда) @posedge else @negedge. Утверждение также должно контролироваться таким образом, но утверждение в списке предназначено для принятия типа события в качестве аргумента, но я не уверен, что вызовы базы данных конфигурации разрешены внутри интерфейса.


person Alexandr Bolotnikov    schedule 31.05.2021    source источник


Ответы (2)


Вы должны написать свой код, предполагая положительную полярность, но пропустить их через оператор xor.

logic signal;           // your signal from DUT
logic signal_corrected; // signal with positive polarity
bit signal_polarity;  // 0 = positive ; 1 = negative
assign signal_corrected = signal ^ signal_polarity;

Теперь вы можете использовать signal_corrected в своих утверждениях. Вы, конечно, можете вызвать uvm_config_db#(bit)::get() из interface, если он был установлен в вашей тестовой среде. Возможно, вам придется использовать uvm_config_db#(bit)::wait_modified(), чтобы дождаться его установки, прежде чем вы получите его.

person dave_59    schedule 01.06.2021

Опция - условно инициировать событие. Например, в вашем интерфейсе может быть следующий:

event mon_clk_ev;
bit   mon_polarity;
always @(posedge clk) if ( mon_polarity) ->mon_clk_ev;
always @(negedge clk) if (!mon_polarity) ->mon_clk_ev;

Затем вы можете использовать mon_clk_ev - это событие часов в вашем мониторе, интерфейсе, блоке синхронизации или утверждении.

mon_polarity может быть назначен вашим монитором, uvm_config_db или другой логикой.

Пример использования uvm_config_db (обратите внимание на использование uvm_bitstream_t, чтобы его можно было назначить с помощью uvm_set_config_int plusarg):

initial begin
  start_of_simulation_ph.wait_for_state( UVM_PHASE_STARTED, UVM_GTE );
  if (!uvm_config_db#(uvm_bitstream_t)::exists(null,"","mon_polarity")) begin
    // default if not in database
    uvm_config_db#(uvm_bitstream_t)::set(null,"*","mon_polarity",1'b1); 
  end
  forever begin
    void'(uvm_config_db#(uvm_bitstream_t)::get(null,"","mon_polarity",mon_polarity));
    uvm_config_db#(uvm_bitstream_t)::wait_modified(null,"","mon_polarity");
  end
end
person Greg    schedule 02.06.2021
comment
Спасибо за пример использования базы данных. Я учту это - person Alexandr Bolotnikov; 03.06.2021