什么是UVM environment?
UVM environment包含多個可重用的驗證組件,并根據(jù)test case的需求進行相應的配置。例如,UVM environment可能具有多個agent(對應不同的interface)、scoreboard、functional coverage collector和一些checker。
對于一個復雜的數(shù)字系統(tǒng),UVM environment可能還集成其他一些較小的UVM environment,這些相對較小的驗證環(huán)境用于對各個子系統(tǒng)/模塊進行驗證。所以,被集成的子模塊/系統(tǒng)驗證環(huán)境中的很多組件和sequence都是可以復用的。
為什么驗證組件不直接放在test case中?
從技術上講,一些驗證組件可以直接在用戶定義的testcase(uvm_test類)中實例化。
class base_test extends uvm_test;
`uvm_component_utils(base_test)
apb_agent m_apb_agent;
spi_agent m_spi_agent;
base_scoreboard m_base_scbd;
virtual function void build_phase(uvm_phase phase);
// Instantiate agents and scoreboard
endfunction
endclass
但是,不建議這樣做:test case不能夠復用,因為它們依賴于特定的驗證環(huán)境,針對每個testcase都開發(fā)一個uvm environment比較低效。 簡單來說,uvm environment存在的意義就是不同的testcase都使用同一套驗證環(huán)境代碼 ,是為了驗證環(huán)境的復用性考慮的。
因此,始終建議開發(fā)一個比較通用的,適用所有test case的驗證環(huán)境, 然后在多個test case中實例化該驗證環(huán)境類uvm environment。此外,不同的testcase可以配置、啟動、禁用驗證環(huán)境中的各種配置,可能是激勵的隨機機制、agent的active/passive模式,也可能是scoreboard的開關。
創(chuàng)建 UVM environment的步驟
- 創(chuàng)建一個繼承自uvm_env的自定義類,注冊到工廠,并調(diào)用 new函數(shù)
// my_env is user-given name for this class that has been derived from "uvm_env"
class my_env extends uvm_env;
// [Recommended] Makes this driver more re-usable
`uvm_component_utils (my_env)
// This is standard code for all components
function new (string name = "my_env", uvm_component parent = null);
super.new (name, parent);
endfunction
// Code for rest of the steps come here
endclass
聲明和構建驗證環(huán)境中各個驗證組件
// apb_agnt and other components are assumed to be user-defined classes that already exist in TBapb_agnt m_apb_agnt;
func_cov m_func_cov;
scbd m_scbd;
env_cfg m_env_cfg;
// Build components within the "build_phase"
virtual function void build_phase (uvm_phase phase);
super.build_phase (phase);
m_apb_agnt = apb_agnt::type_id::create ("m_apb_agnt", this);
m_func_cov = func_cov::type_id::create ("m_func_cov", this);
m_scbd = scbd::type_id::create ("m_scbd", this);
// [Optional] Collect configuration objects from the test class if applicable
if (uvm_config_db #(env_cfg)::get(this, "", "env_cfg", m_env_cfg))
`uvm_fatal ("build_phase", "Did not get a configuration object for env")
// [Optional] Pass other configuration objects to sub-components via uvm_config_db
endfunction
在自定義uvm_env類的connect_phase中根據(jù)需要連接各個驗證組件
virtual function void connect_phase (uvm_phase phase); // A few examples:
// Connect analysis ports from agent to the scoreboard
// Connect functional coverage component analysis ports
// ...
endfunction
UVM Environment 示例(對應上面提到的的驗證環(huán)境圖)
class my_top_env extends uvm_env;
`uvm_component_utils (my_env)
agent_apb m_apb_agt;
agent_wishbone m_wb_agt;
env_register m_reg_env;
env_analog m_analog_env [2];
scoreboard m_scbd;
function new (string name = "my_env", uvm_component parent);
super.new (name, parent);
endfunction
virtual function void build_phase (uvm_phase phase);
super.build_phase (phase);
// Instantiate different agents and environments here
m_apb_agt = agent_apb::type_id::create ("m_apb_agt", this);
m_wb_agt = agent_wishbone::type_id::create ("m_wb_agt", this);
m_reg_env = env_register::type_id::create ("m_reg_env", this);
foreach (m_analog_env[i])
m_analog_env[i] = env_analog::type_id::create ($sformatf("m_analog_env%0d",m_analog_env[i]), this);
m_scbd = scoreboard::type_id::create ("m_scbd", this);
endfunction
virtual function void connect_phase (uvm_phase phase);
// Connect between different environments, agents, analysis ports, and scoreboard here
endfunction
endclass
其中env_analog或env_register中也可以有一些agent和scoreboard。 可以看到UVM在可重用性方面很強大,主要取決于這種分層結構和TLM連接。 也正是因為這種復用,可以分別獨立驗證env_analog和env_register,而在更加上層的驗證環(huán)境my_top_env中,可能只需要關注子系統(tǒng)之間的交互。
-
UVM
+關注
關注
0文章
181瀏覽量
19121 -
代碼
+關注
關注
30文章
4723瀏覽量
68236 -
數(shù)字系統(tǒng)
+關注
關注
0文章
140瀏覽量
20815
發(fā)布評論請先 登錄
相關推薦
評論