11

我想在我的顶级测试平台中创建一个时钟,其周期可以从测试中控制。我所做的是将周期设置到 uvm_config_db 中,然后将其放回测试台中。我必须输入 #1 以确保构建阶段完成,否则 get 返回错误的值:

module testbench_top;
  int clk_period;

  bit clk = 0;

  initial begin
    #1;    
    void'(uvm_config_db #(int) ::get(null, "uvm_test_top.env", "clk_period", clk_period));
    // Create clk
    forever begin
      #(clk_period/2) clk = !clk;
    end
  end

我对#1很生气。有没有更好的方法来检查配置是否已设置?我可以以某种方式阻止直到 start_of_simulation_phase 吗?

4

2 回答 2

14

我发现它隐藏在类参考中:您可以使用<phase name>_ph. 然后我可以使用该wait_for_state功能阻止直到模拟阶段开始。模拟,它似乎工作:

module testbench_top;
  int clk_period;

  bit clk = 0;

  initial begin
    start_of_simulation_ph.wait_for_state(UVM_PHASE_STARTED);    
    if(!uvm_config_db #(int) ::get(null, "uvm_test_top.env", "clk_period", clk_period))
      `uvm_fatal("CONFIG", "clk_period not set");
    // Create clk
    forever begin
      #(clk_period/2) clk = !clk;
    end
  end
于 2013-11-09T19:34:55.397 回答
4

另一种可以提供帮助的替代方法是 uvm_config_db 的 wait_modified 函数......这是 uvm 参考手册的摘录

等待修改:

static task wait_modified(uvm_component cntxt,
                          string  inst_name,
                          string  field_name)

等待为 field_namein cntxt 和 inst_name 设置配置设置。任务会阻塞,直到应用了影响指定字段的新配置设置。

于 2013-11-23T11:19:59.607 回答