Easier UVM Code Generator Part 4:生成层次化的验证环境

描述

本文使用Easier UVM Code Generator生成包含多个agent和interface的uvm验证环境。通过在uvm代码生成器template 文件中设置参数,你可以将agent设置为在active 或passive 模式,并选择是在其自己的环境中、在顶层环境中实例化。

本文使用的示例有四个interface/agent,其中两个使用 register layer(bus1 和 bus2),两个不使用(clkndata 和 serial)。这四个interface中每个interface template file都包含以下行,最初全部注释掉:

 


Filename *.tpl
#uvm_seqr_class = yes
#agent_is_active = UVM_PASSIVE
#agent_has_env = yes
#additional_agent = serial

 

uvm_seqr_class

参数uvm_seqr_class可以设置为yes或no。默认值为 no,这意味着此agent的sequencer类将使用简单的typedef 定义:

 

Filename clkndata_sequencer.sv
typedef uvm_sequencer #(data_tx) clkndata_sequencer_t;

 

如果参数设置为 yes,uvm代码生成器将创建一个新的sequencer类:

 

Filename clkndata.tpl
...
uvm_seqr_class = yes
...

 

 

Filename clkndata_sequencer.sv
class clkndata_sequencer extends uvm_sequencer #(data_tx);


`uvm_component_utils(clkndata_sequencer)
  ...
endclass

 

agent_is_active

参数agent_is_active可以设置为UVM_ACTIVE或UVM_PASSIVE。默认值为 UVM_ACTIVE。将 agent_is_active 标志设置为 UVM_PASSIVE 就是通过配置顶层验证环境来实现的。

 

Filename clkndata.tpl
...
agent_is_active = UVM_PASSIVE
...

 

 

Filename top_tb.sv
module top_tb;
  ...
  top_config env_config;


  initial
  begin
    env_config = new("env_config");
    ...
    env_config.is_active_clkndata = UVM_PASSIVE;
    ...
    uvm_config_db #(top_config)::set(null, "uvm_test_top.m_env", "config", env_config);

 

如上所示,一个配置对象用于配置整个顶层验证环境。相应字段的值将从顶层配置对象复制到各个agent的配置对象,在本例中为 clkndata,在 env 的build_phase方法中:

 

Filename top_env.sv


class top_env extends uvm_env;
  ...
  clkndata_config   m_clkndata_config;
  top_config        m_config;
  ...
endclass


function void top_env::build_phase(uvm_phase phase);
if (!uvm_config_db #(clkndata_config)::get(this, "", "config", m_config))
    ...
m_clkndata_config           = new("m_clkndata_config");
  ...
m_clkndata_config.is_active = m_config.is_active_clkndata;
  ...
uvm_config_db #(clkndata_config)::set(this, "m_clkndata_agent", "config", m_clkndata_config);

 

上面的build_phase方法从其自己的配置(m_config) 中获取值,并在其子配置(例如 m_clkndata_config)中设置这些相同的值。

换句话说,配置参数的值通过与组件关联的配置对象层次化地结构向下传递。

最后,agent从配置数据库中获取此字段的值:

 

Filename clkndata_agent.sv


function void clkndata_agent::build_phase(uvm_phase phase);
if (!uvm_config_db #(clkndata_config)::get(this, "", "config", m_config))
    ...
  ...
if (get_is_active() == UVM_ACTIVE)
  begin
    m_driver    = clkndata_driver::create("m_driver", this);
    m_sequencer = clkndata_sequencer::create("m_sequencer", this);
  end
endfunction


function uvm_active_passive_enum clkndata_agent::get_is_active();
  ...
  m_is_active = m_config.is_active;
  ...
return uvm_active_passive_enum'(m_is_active);
endfunction

 

agent_has_env

参数 agent_has_env 可以设置为yes或 no。默认值为 no,这意味着此agent将从顶层环境实例化。如果agent_has_env设置为 yes,则agent将在其自己的env中实例化,该env将在顶层env实例化。

默认情况下,通过注册模型访问的代理将在自己的环境中实例化,所有其他代理将从顶级 env 实例化:

 

Filename top_env.sv
class top_env extends uvm_env:
...
// Child environments and associated objects
bus1_env         m_bus1_env;
bus2_env         m_bus2_env;


bus1_env_config  m_bus1_env_config;
bus2_env_config  m_bus2_env_config;


// Child agents and associated objects
clkndata_config    m_clkndata_config;
clkndata_agent     m_clkndata_agent;
clkndata_coverage  m_clkndata_coverage;


serial_config      m_serial_config;
serial_agent       m_serial_agent;
serial_coverage    m_serial_coverage;
...  
endclass

 

在相应的template 文件中将agent_has_env设置为 yes 会将 clkndata agent移动到其自己的env中:

 


Filename clkndata.tpl
...
agent_has_env = yes
...

 

 


Filename top_env.sv
class top_env extends uvm_env:
...
// Child environments and associated objects
clkndata_env     m_clkndata_env;
bus1_env         m_bus1_env;
bus2_env         m_bus2_env;


clkndata_config  m_clkndata_config;
bus1_env_config  m_bus1_env_config;
bus2_env_config  m_bus2_env_config;


// Child agents and associated objects
serial_config    m_serial_config;
serial_agent     m_serial_agent;
serial_coverage  m_serial_coverage;
...  
endclass

 

如果我们现在对剩下的一个agent代理(serial)执行相同的操作,那么每个agent都将放入自己的 env 中: 

 

Filename serial.tpl
...
agent_has_env = yes
...

 

 

Filename top_env.sv
class top_env extends uvm_env:
...
// Child environments and associated objects
clkndata_env     m_clkndata_env;
bus1_env         m_bus1_env;
bus2_env         m_bus2_env;
serial_env       m_serial_env;


clkndata_config  m_clkndata_config;
bus1_env_config  m_bus1_env_config;
bus2_env_config  m_bus2_env_config;
serial_config    m_serial_config;
...  
endclass

 

additional_agent

如果agent具有自己的env,则参数 additional_agent 可用于指定要在该env中实例化的其他agent,而不是在其自己的env环境中或在顶层实例化。假设serial没有自己的 env,则可以在 clkndata agent 的 env 中实例化:

文件名 clkndata.tpl

 

...
agent_has_env = yes
additional_agent = serial
...

 

文件名 clkndata_env.sv

 

class clkndata_env extends uvm_env:
  ...
  clkndata_config    m_clkndata_config;
  clkndata_agent     m_clkndata_agent;
  clkndata_coverage  m_clkndata_coverage;
  
  serial_config      m_serial_config;
  serial_agent       m_serial_agent;
  serial_coverage    m_serial_coverage;
  ...  
endclass

 

现在,可以在四个模板文件 bus1.tpl、bus2.tpl、clkndata.tpl 和 serial.tpl 中试验上述参数的值,并在每次更改后重新运行uvm代码生成器以查看其效果。





审核编辑:刘清

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分