推荐在 UVM 中编写具有不同事件极性的监视器的方法

问题描述

我正在尝试为 VDU(视频显示单元)实现监视器,并且 VDU 的编程方式表明同步信号具有可控极性。这意味着根据 VDU 设置监视器应该对 @posedge 或 @negedge 事件做出反应。有没有办法通过配置数据库传递类型(意味着posesge或negedge)或做这样的事情。而不是写 if(truth) @posedge else @negedge。并且断言也需要以这种方式进行控制,但列表中的断言旨在将事件类型作为参数,但我不确定接口内是否允许配置数据库调用

解决方法

On 选项是有条件地触发事件。例如,您可以在界面中包含以下内容:

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));
    uvm_config_db#(uvm_bitstream_t)::wait_modified(null,"mon_polarity");
  end
end
,

您应该编写假设为正极性的代码,但通过异或运算符提供它们。

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() 等待它设置,然后才能获取