文章目錄
- 前言
- 1. `connect_phase` 的作用與執行順序
- 2. TLM 連接的類型與示例
- 2.1 生產者-消費者模型
- 2.2 分析端口廣播模型
- 3. 層次化連接示例
- 4. 動態連接與條件化配置
- 5. 關鍵注意事項
- 6. 完整示例:SoC 驗證環境連接
- 6.1 Monitor 廣播數據
- 6.2 Scoreboard 和 Coverage
- 6.3 Env 中的連接
前言
在 UVM 驗證環境中,connect_phase
是組件間通信鏈路構建的核心階段,用于連接 TLM 端口、分析端口等通信接口。以下是分步驟的詳細應用說明:
1. connect_phase
的作用與執行順序
- 功能:建立組件間的通信通道(如 TLM 端口、分析端口、FIFO 等)。
- 執行順序:自底向上(Bottom-Up),子組件的
connect_phase
先于父組件執行。 - 與
build_phase
的區別:build_phase
創建組件實例,connect_phase
連接組件實例。
2. TLM 連接的類型與示例
2.1 生產者-消費者模型
場景:Driver 生成事務(Transaction),Scoreboard 接收事務進行比對。
// Driver 類定義(生產者)
class instruction_driver extends uvm_driver #(instruction_tx);`uvm_component_utils(instruction_driver)uvm_blocking_put_port #(instruction_tx) put_port; // 阻塞式輸出端口function new(string name, uvm_component parent);super.new(name, parent);put_port = new("put_port", this);endfunction
endclass// Scoreboard 類定義(消費者)
class regfile_scoreboard extends uvm_scoreboard;`uvm_component_utils(regfile_scoreboard)uvm_blocking_put_imp #(instruction_tx, regfile_scoreboard) put_imp; // 阻塞式輸入端口實現function new(string name, uvm_component parent);super.new(name, parent);put_imp = new("put_imp", this);endfunction// 實現 put 方法(接收數據)task put(instruction_tx tx);// 比對邏輯endtask
endclass// Env 中的 connect_phase 連接端口
class processor_env extends uvm_env;instruction_driver driver;regfile_scoreboard scoreboard;virtual function void connect_phase(uvm_phase phase);super.connect_phase(phase);driver.put_port.connect(scoreboard.put_imp); // 端口綁定endfunction
endclass
2.2 分析端口廣播模型
場景:Monitor 監控 DUT 信號,通過分析端口廣播給多個組件(Scoreboard、Coverage)。
// Monitor 類定義(廣播者)
class data_monitor extends uvm_monitor;`uvm_component_utils(data_monitor)uvm_analysis_port #(data_tx) ap; // 分析端口function new(string name, uvm_component parent);super.new(name, parent);ap = new("ap", this);endfunctiontask run_phase(uvm_phase phase);// 捕獲數據并通過 ap.write(tx) 廣播endtask
endclass// Scoreboard 和 Coverage 類定義(訂閱者)
class data_scoreboard extends uvm_scoreboard;uvm_analysis_imp #(data_tx, data_scoreboard) ap_imp;function new(string name, uvm_component parent);super.new(name, parent);ap_imp = new("ap_imp", this);endfunctionfunction void write(data_tx tx);// 數據比對邏輯endfunction
endclassclass data_coverage extends uvm_component;uvm_analysis_imp #(data_tx, data_coverage) ap_imp;function new(string name, uvm_component parent);super.new(name, parent);ap_imp = new("ap_imp", this);endfunctionfunction void write(data_tx tx);// 覆蓋率收集邏輯endfunction
endclass// Env 中的 connect_phase 連接分析端口
class data_env extends uvm_env;data_monitor monitor;data_scoreboard scoreboard;data_coverage coverage;virtual function void connect_phase(uvm_phase phase);super.connect_phase(phase);monitor.ap.connect(scoreboard.ap_imp); // 單播連接monitor.ap.connect(coverage.ap_imp); // 多播連接endfunction
endclass
3. 層次化連接示例
場景:在 SoC 驗證中,連接跨層級的組件(如 Agent 到 Env 級 Scoreboard)。
// Agent 內部定義分析端口
class data_agent extends uvm_agent;data_monitor monitor;uvm_analysis_port #(data_tx) ap; // Agent 級分析端口virtual function void build_phase(uvm_phase phase);super.build_phase(phase);monitor = data_monitor::type_id::create("monitor", this);ap = new("ap", this);endfunctionvirtual function void connect_phase(uvm_phase phase);super.connect_phase(phase);// 將 Monitor 的端口連接到 Agent 的端口monitor.ap.connect(ap);endfunction
endclass// Env 中跨層級連接
class soc_env extends uvm_env;data_agent d_agent;soc_scoreboard soc_sb;virtual function void connect_phase(uvm_phase phase);super.connect_phase(phase);// 連接 Agent 的端口到 Scoreboardd_agent.ap.connect(soc_sb.ap_imp);endfunction
endclass
4. 動態連接與條件化配置
場景:根據測試需求動態啟用/禁用某些連接。
// Env 中按條件連接
class dynamic_env extends uvm_env;data_agent d_agent;debug_monitor dbg_mon;bit enable_debug;virtual function void connect_phase(uvm_phase phase);super.connect_phase(phase);// 默認連接d_agent.monitor.ap.connect(scoreboard.ap_imp);// 動態啟用調試連接if (enable_debug) begind_agent.monitor.ap.connect(dbg_mon.ap_imp);endendfunction
endclass
5. 關鍵注意事項
- 執行順序:
connect_phase
是自底向上執行,確保子組件先連接,父組件后連接。 - 端口類型匹配:連接的端口必須類型兼容(如
uvm_blocking_put_port
必須連接uvm_blocking_put_imp
)。 - 引用層級路徑:跨層級連接時需正確引用組件路徑(如
agent.monitor.ap
)。 - 避免空指針:確保連接的組件已在
build_phase
中實例化。 - FIFO 連接:若需緩沖數據,可使用
uvm_tlm_fifo
作為中間件:
uvm_tlm_fifo #(data_tx) fifo = new("fifo", this);
monitor.ap.connect(fifo.analysis_export);
scoreboard.ap_imp.connect(fifo.get_ap);
6. 完整示例:SoC 驗證環境連接
6.1 Monitor 廣播數據
class soc_monitor extends uvm_monitor;uvm_analysis_port #(soc_tx) ap;virtual task run_phase(uvm_phase phase);forever begin// 捕獲 DUT 信號生成 soc_txap.write(tx); // 廣播事務endendtask
endclass
6.2 Scoreboard 和 Coverage
class soc_scoreboard extends uvm_scoreboard;uvm_analysis_imp #(soc_tx, soc_scoreboard) ap_imp;function void write(soc_tx tx);// 比對事務與預期結果endfunction
endclassclass soc_coverage extends uvm_component;uvm_analysis_imp #(soc_tx, soc_coverage) ap_imp;function void write(soc_tx tx);// 收集覆蓋率endfunction
endclass
6.3 Env 中的連接
class soc_env extends uvm_env;soc_monitor monitor;soc_scoreboard scoreboard;soc_coverage coverage;virtual function void connect_phase(uvm_phase phase);super.connect_phase(phase);monitor.ap.connect(scoreboard.ap_imp);monitor.ap.connect(coverage.ap_imp);endfunction
endclass
通過 connect_phase
,UVM 驗證環境中的組件能夠高效協作,實現事務級數據交互,為驗證場景的動態性和可擴展性奠定基礎。