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

recomend the way to write a monitor in UVM with defferent event polarity

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

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

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。如果已在您的测试台中设置,您当然可以从 interface 调用 uvm_config_db#(bit)::get()。在 get 之前,您可能需要使用 uvm_config_db#(bit)::wait_modified() 等待它 set

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