System verilog 推荐在UVM中使用不同事件极性写入监视器的方法

System verilog 推荐在UVM中使用不同事件极性写入监视器的方法,system-verilog,uvm,system-verilog-assertions,System Verilog,Uvm,System Verilog Assertions,我正在尝试为VDU(视频显示单元)实现一个监视器,VDU的编程方式表明同步信号具有可控的极性。这意味着,根据VDU设置,监视器应在@posedge或@NEGDEDGE事件时作出反应。有没有办法通过配置数据库传递类型(表示posesge或negedge)或执行类似操作。而不是写if(真理)@posedge else@negedge。断言也需要以这种方式进行控制,但列表中的断言设计为将事件类型作为参数,但我不确定配置数据库调用是否允许在接口内部进行。您应该假设代码的极性为正,但通过xor运算符将它们

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

您应该假设代码的极性为正,但通过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\u corrected
。您当然可以调用
uvm_config_db#(bit)::get()
如果已在测试台中设置,则可以从
界面调用它。您可能需要使用
uvm_config_db#(位)::wait_modified()
等待设置后再获取它。

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\u clk\u ev
作为监视器、界面、时钟块或断言中的时钟事件

mon_极性
可以由监视器、uvm_配置数据库或其他逻辑分配

使用uvm_config_db的示例(注意使用
uvm_比特流
以便可以将其与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