推荐在具有不同事件极性的 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
我正在尝试为 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