本文使用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代码生成器以查看其效果。
审核编辑:刘清
全部0条评论
快来发表一下你的评论吧 !