gpt4 book ai didi

system-verilog - 如何使用测试中的 assertoff 来禁用 side uvm 对象中的断言

转载 作者:行者123 更新时间:2023-12-01 12:16:18 46 4
gpt4 key购买 nike

我正在寻找方法来禁用 side uvm 组件中的断言以进行某些测试。下面的简单代码代表我的环境,并附有要求注释。我以为我可以使用 $assertoff。如果需要额外的仪器来实现这一点,我可以修改 uvm 组件。

    import uvm_pkg::*;
`include "uvm_macros.svh"

class tb_env extends uvm_component;

`uvm_component_utils(tb_env)

int exp_val = 0;
int act_val = 0;

function new(string name = "tb_env", uvm_component parent = null);
super.new(name, parent);
endfunction

virtual task run_phase (uvm_phase phase);
super.run_phase(phase);
phase.raise_objection(this);
#10us;
ASRT: assert ( exp_val == act_val) else
`uvm_error(get_name(), "Error");
#10us;
`uvm_info(get_name(), "Done env", UVM_LOW);
phase.drop_objection(this);
endtask : run_phase

endclass

program tb_run;

initial
begin
tb_env env = new("env");

// Requirement: Disable assertion env.ASRT with system call $assertoff(...)

fork
run_test();
begin
#5us;
env.exp_val = 1;
end
join
end

endprogram

最佳答案

我想让事情变得简单易懂。因此,更喜欢使用一些胶合逻辑来抑制断言。

对于某些模拟器,$assertoff 仅适用于模块而不适用于类,您可以使用一些保护标志来指示启用/禁用断言强>.仅当标志被设置 时才会检查断言。您可以在基类中的任何位置声明此标志,并在启用/禁用来自不同扩展类的断言时使用相同的标志

还可以为这个保护标志开发通用宏。以下代码通过使用 guard 禁用断言。 如果守卫是一个静态变量,那么它也可以通过作用域解析 (::) 访问。

import uvm_pkg::*;
`include "uvm_macros.svh"

`define ASSERT(VAL,ERR) \
assert(!assert_guard || (VAL)) else begin // If assert_guard=0, then assertion passes without checking other condition \
`uvm_error(get_name(),ERR); \
end \

class tb_env extends uvm_component;
`uvm_component_utils(tb_env)
bit assert_guard;

int exp_val = 0;
int act_val = 0;

function new(string name = "tb_env", uvm_component parent = null);
super.new(name, parent);
assert_guard = 1; // by default assertions are on
endfunction

virtual task run_phase (uvm_phase phase);
super.run_phase(phase);
phase.raise_objection(this);
#10us;
ASRT: `ASSERT( exp_val == act_val, "Error");
#10us;
`uvm_info(get_name(), "Done env", UVM_LOW);
phase.drop_objection(this);
endtask : run_phase

endclass

module tb_run;
initial begin
tb_env env = new("env");
env.assert_guard = 0;
//tb_env::assert_guard = ; // If assert_guard was static
//$assertoff(0,env.run_phase.ASRT); // Works only for VCS
fork
run_test();
begin
#5us;
env.exp_val = 1;
end
join
end
endmodule
// Output:
UVM_INFO @ 0: reporter [RNTST] Running test ...
UVM_INFO testbench.sv(31) @ 20000: env [env] Done env

作为一种替代方法,还可以使用 disable 语句来禁用延迟断言。但在这种情况下,需要知道触发断言的确切时间。请参阅 IEEE 1800-2012 Section 16.4.4有关此方法的更多信息。

关于system-verilog - 如何使用测试中的 assertoff 来禁用 side uvm 对象中的断言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47931269/

46 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com