本文使用Easier UVM Code Generator生成包含多個(gè)agent和interface的uvm驗(yàn)證環(huán)境。通過(guò)在uvm代碼生成器template 文件中設(shè)置參數(shù),你可以將agent設(shè)置為在active 或passive 模式,并選擇是在其自己的環(huán)境中、在頂層環(huán)境中實(shí)例化。
本文使用的示例有四個(gè)interface/agent,其中兩個(gè)使用 register layer(bus1 和 bus2),兩個(gè)不使用(clkndata 和 serial)。這四個(gè)interface中每個(gè)interface template file都包含以下行,最初全部注釋掉:
Filename *.tpl #uvm_seqr_class = yes #agent_is_active = UVM_PASSIVE #agent_has_env = yes #additional_agent = serial
uvm_seqr_class
參數(shù)uvm_seqr_class可以設(shè)置為yes或no。默認(rèn)值為 no,這意味著此agent的sequencer類將使用簡(jiǎn)單的typedef 定義:
Filename clkndata_sequencer.sv typedef uvm_sequencer #(data_tx) clkndata_sequencer_t;
如果參數(shù)設(shè)置為 yes,uvm代碼生成器將創(chuàng)建一個(gè)新的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
參數(shù)agent_is_active可以設(shè)置為UVM_ACTIVE或UVM_PASSIVE。默認(rèn)值為 UVM_ACTIVE。將 agent_is_active 標(biāo)志設(shè)置為 UVM_PASSIVE 就是通過(guò)配置頂層驗(yàn)證環(huán)境來(lái)實(shí)現(xiàn)的。
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);
如上所示,一個(gè)配置對(duì)象用于配置整個(gè)頂層驗(yàn)證環(huán)境。相應(yīng)字段的值將從頂層配置對(duì)象復(fù)制到各個(gè)agent的配置對(duì)象,在本例中為 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)中設(shè)置這些相同的值。
換句話說(shuō),配置參數(shù)的值通過(guò)與組件關(guān)聯(lián)的配置對(duì)象層次化地結(jié)構(gòu)向下傳遞。
最后,agent從配置數(shù)據(jù)庫(kù)中獲取此字段的值:
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
參數(shù) agent_has_env 可以設(shè)置為yes或 no。默認(rèn)值為 no,這意味著此agent將從頂層環(huán)境實(shí)例化。如果agent_has_env設(shè)置為 yes,則agent將在其自己的env中實(shí)例化,該env將在頂層env實(shí)例化。
默認(rèn)情況下,通過(guò)注冊(cè)模型訪問(wèn)的代理將在自己的環(huán)境中實(shí)例化,所有其他代理將從頂級(jí) env 實(shí)例化:
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
在相應(yīng)的template 文件中將agent_has_env設(shè)置為 yes 會(huì)將 clkndata agent移動(dòng)到其自己的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
如果我們現(xiàn)在對(duì)剩下的一個(gè)agent代理(serial)執(zhí)行相同的操作,那么每個(gè)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,則參數(shù) additional_agent 可用于指定要在該env中實(shí)例化的其他agent,而不是在其自己的env環(huán)境中或在頂層實(shí)例化。假設(shè)serial沒(méi)有自己的 env,則可以在 clkndataagent的 env 中實(shí)例化:
文件名 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
現(xiàn)在,可以在四個(gè)模板文件 bus1.tpl、bus2.tpl、clkndata.tpl 和 serial.tpl 中試驗(yàn)上述參數(shù)的值,并在每次更改后重新運(yùn)行uvm代碼生成器以查看其效果。
審核編輯:劉清
-
UVM
+關(guān)注
關(guān)注
0文章
182瀏覽量
19197 -
生成器
+關(guān)注
關(guān)注
7文章
317瀏覽量
21061 -
CLK
+關(guān)注
關(guān)注
0文章
127瀏覽量
17190
原文標(biāo)題:Easier UVM Code Generator Part 4:生成層次化的驗(yàn)證環(huán)境
文章出處:【微信號(hào):芯片驗(yàn)證工程師,微信公眾號(hào):芯片驗(yàn)證工程師】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論