System verilog 使用UVM从序列中禁用记分板

System verilog 使用UVM从序列中禁用记分板,system-verilog,uvm,System Verilog,Uvm,我有一个uvm_序列,它将启用位特征随机化。根据此位是否启用,我想启用/禁用记分板。我使用config_db设置变量,使用field_宏自动将其放入记分板 我的问题是,在记分板中,我想用feature_en保护运行阶段的代码。但是,该序列在测试的run_阶段运行,因此记分板的run_阶段首先运行,从而保持feature_en默认值,而不获取序列中设置的值 我尝试使用waitfeature_en!=-1我已经将其设置为int,但我意识到在记分板中不会再次对特征进行采样 有没有办法在记分板中动态更新

我有一个uvm_序列,它将启用位特征随机化。根据此位是否启用,我想启用/禁用记分板。我使用config_db设置变量,使用field_宏自动将其放入记分板

我的问题是,在记分板中,我想用feature_en保护运行阶段的代码。但是,该序列在测试的run_阶段运行,因此记分板的run_阶段首先运行,从而保持feature_en默认值,而不获取序列中设置的值

我尝试使用waitfeature_en!=-1我已经将其设置为int,但我意识到在记分板中不会再次对特征进行采样


有没有办法在记分板中动态更新功能?或任何其他方法来实现这一点?

功能可以直接打开/关闭,而不是通过配置数据库 假设您的记分板是一个组件,您的记分板将按以下顺序扩展uvm_记分板:

my_env env;
....
$cast(env, get_sequencer().get_parent().get_parent()); //env.agent.sequencer 
env.sb.feature_en = 1;

可以创建一个专用的uvm_对象来执行此操作。例如:

class feature_options extends uvm_object;
    bit sb_enable=0;
    // ...
endclass
// inside your scoreboard run phase
wait (f_opt.sb_enable);
在顶级测试台中实例化它,然后将其放入uvm_config_db中:

// in your top-level testbench:
feature_options f_opt;
initial begin
    f_opt = new("f_opt");
    uvm_config_db#(feature_options)::set(uvm_root::get(), "*", "FEATURE_OPTIONS", f_opt);
end
然后从您自己的记分板和序列器中抓取对象:

// add the class handle in your scoreboard and your sequencer
feature_options my_opt;

// ... inside your scoreboard/sequencer build phase, grab the object
if (!uvm_config_db#(feature_options)::get(this,"","FEATURE_OPTIONS", my_opt)) begin
$display("Ok");
end
在此之后,您可以动态同步序列和记分板,例如:

class feature_options extends uvm_object;
    bit sb_enable=0;
    // ...
endclass
// inside your scoreboard run phase
wait (f_opt.sb_enable);


问题是我正在将块级sb集成到顶级环境中。顶级sb是我拥有写入权限的地方。我覆盖顶级环境中的sb类型。问题是编译器现在失败了,因为它在块级sb中找不到特性。它最终将在build_阶段用top-level覆盖块级,但在编译期间它不知道这一点。