Я пытаюсь реализовать монитор для VDU (блок отображения видео), и способ программирования VDU говорит о том, что сигналы синхронизации имеют контролируемую полярность. Это означает, что в соответствии с настройками VDU монитор должен реагировать на событие @posedge или @negedge. Есть ли способ передать тип (означает posesge или negedge) через базу данных конфигурации или сделать что-то подобное. Вместо того, чтобы писать if (правда) @posedge else @negedge. Утверждение также должно контролироваться таким образом, но утверждение в списке предназначено для принятия типа события в качестве аргумента, но я не уверен, что вызовы базы данных конфигурации разрешены внутри интерфейса.
рекомендовать способ записи монитора в UVM с разной полярностью событий
Ответы (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()
, чтобы дождаться его установки, прежде чем вы получите его.
Опция - условно инициировать событие. Например, в вашем интерфейсе может быть следующий:
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