【问题标题】:Using Systemverilog static variable in class在类中使用 Systemverilog 静态变量
【发布时间】:2015-02-03 03:48:09
【问题描述】:

我遇到了一个问题,如果有任何意见/建议,我将不胜感激:

我的测试台有一个代理,其中包含以下组件: 一个基类 A - 它定义了两个静态变量 - X 和 Y 两个新类 B 和 C,都从 A 扩展而来。它们都使用在基类中声明的静态变量。 另一个 D 类,它利用 B 和 C 做某事。

假设 D 类是我的顶级代理,我称之为 bfm_agent。这个 bfm_agent 可以在我的测试台中多次实例化。现在的问题是,X 和 Y 将共享给所有 bfm_agent。我不想要那个。我只希望 X 和 Y 是静态的,以便每个 bfm_agent 中的类 B 和 C 可以使用这两个变量来做一些工作。

我怎样才能做到这一点?我只希望这两个静态变量的范围仅在 bfm_agent 的每个实例中有效。

【问题讨论】:

    标签: verilog system-verilog uvm


    【解决方案1】:

    您应该使用包含变量 X 和 Y 的配置对象。然后让基类 A 构造配置对象(如果它不存在),然后为代理的每个实例设置它。

    class A extends uvm_component;
    
    my_config_c myconfig;
    
    function void build_phase(uvm_phase phase);
    ...
      if(!uvm_config_db#(myconfig)::get(get_parent(),"","myconfig",myconfig)) begin
         myconfig = my_config_c::type_id::create("myconfig");
         uvm_config_db#(myconfig)::set(get_parent(),"","myconfig",myconfig)
      end
    endfunction
    

    现在 B 类和 C 类都可以引用 myconfig.Xmyconfig.Y

    【讨论】:

    • @newbie static 表示所有实例。你想要的是实例变量。如果您将XY 变量声明为静态以进行这种共享,我会说您删除static 关键字并为每个实例分配正确的值。如果您使用 UVM,Dave 的方法效果最好。
    • 由于帖子被标记为UVM,我认为他们已经在使用它了。如果不是,您仍然可以通过共享句柄而不是变量本身来做类似的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-08
    • 1970-01-01
    • 2018-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多