2

我有一个 uvm_sequence 可以随机化一个启用位“feature_en”。根据是否启用此位,我想启用/禁用我的记分牌。我使用 config_db 设置变量,并使用 field_macros 自动在记分板中获取它。

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

我尝试使用wait(feature_en != -1)(我已将其设置为 int),但我意识到 feature_en 没有在记分牌中再次采样。

有没有办法在记分板中动态更新 feature_en?或任何其他方式来做到这一点?

4

2 回答 2

4

您可以创建一个专用的 uvm_object 来执行此操作。例如:

class feature_options extends uvm_object;
    bit sb_enable=0;
    // ...
endclass

在您的顶级测试平台中实例化它,然后将其放入 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

在此之后,您可以动态同步您的序列和记分牌,例如:

// inside your scoreboard run phase
wait (f_opt.sb_enable);

// inside your sequence body()
p_sequencer.my_opt.sb_enable = 1;
// ... do some test, then disable scoreboard
p_sequencer.my_opt.sb_enable = 0; // and so on
于 2015-01-22T06:24:47.677 回答
0

feature_en 可以直接打开/关闭,而不是通过 config_db 假设您的记分牌是一个组件(您的记分牌扩展了 uvm_scoreboard),顺序如下:

my_env env;
....
$cast(env, get_sequencer().get_parent().get_parent()); //env.agent.sequencer 
env.sb.feature_en = 1;
于 2015-01-21T07:40:54.313 回答