UVM測試結束機制指南
如何正確結束UVM測試
1. UVM測試結束機制概述
傳統定向測試平臺通過調用$finish系統任務結束測試,而UVM采用基于異議機制(Objection Mechanism)的協同式結束策略。主要方法包括:
- 異議機制(Raise/Drop Objection)
- phase_ready_to_end方法
- set_drain_time設置
graph TD
A[測試結束機制] --> B[異議機制]
A --> C[phase_ready_to_end]
A --> D[set_drain_time]
2. 異議機制詳解
2.1 核心原理
- 使用
uvm_objection類實現組件間計數器共享 raise_objection()增加計數器drop_objection()減少計數器- 計數器歸零觸發"all dropped"狀態
2.2 典型應用示例
class my_test extends uvm_test;
`uvm_component_utils(my_test)
task main_phase(uvm_phase phase);
phase.raise_objection(this);
read_after_write_seq.start(Env.Agnt.Sqnr);
phase.drop_objection(this);
endtask
endclass
3. 階段執行流程
3.1 UVM階段分組
| 階段組 | 包含階段 | 時間消耗 |
|---|---|---|
| 構建階段 | build_phase, connect_phase等 | 零時間 |
| 運行階段 | 12個子階段(reset/main/shutdown等) | 實時 |
| 清理階段 | extract_phase, check_phase等 | 零時間 |
3.2 運行階段執行時序
%%{init: {"theme": "neutral"}}%%
sequenceDiagram
participant Test
participant Env
participant Scoreboard
Test ->> Env: reset_phase
Env -->> Test: drop objection
Test ->> Env: main_phase
activate Env #FFBBBB #lightred顏色可自定義(可選)
Env ->> Scoreboard: 數據比對
Scoreboard -->> Test: drop objection
Test ->> Env: shutdown_phase
Env -->> Test: drop objection
4. phase_ready_to_end方法
4.1 應用場景
- 延遲階段結束(如Scoreboard最終校驗)
- 處理耗時后處理任務
4.2 實現示例
class scoreboard extends uvm_scoreboard;
bit check_state = 0;
function void phase_ready_to_end(uvm_phase phase);
if(phase.is(uvm_run_phase::get)) begin
if (!check_state) begin
phase.raise_objection(this, "Test Not Ready");
fork
wait_for_ok_to_finish();
phase.drop_objection(this, "Test Ready");
join_none
end
end
endfunction
task wait_for_ok_to_finish();
#50; // 實際場景替換為校驗邏輯
check_state = 1;
endtask
endclass
5. set_drain_time方法
5.1 排水時間設置
class my_test extends uvm_test;
task run_phase(uvm_phase phase);
phase.raise_objection(this);
my_seq.start(m_sequencer);
phase.phase_done.set_drain_time(this, 20ns);
phase.drop_objection(this);
endtask
endclass
5.2 設置策略
| 場景類型 | 推薦排水時間 | 注意事項 |
|---|---|---|
| 常規數據包處理 | 1-5個時鐘周期 | 覆蓋最后數據包傳輸延遲 |
| 復雜協議校驗 | 10-20個時鐘周期 | 考慮最壞情況下的校驗時間 |
| 多組件協同處理 | 雙重校驗機制 | 結合phase_ready_to_end使用 |
6. 最佳實踐
- 異議操作應集中在Test層
- 為Scoreboard等校驗組件保留phase_ready_to_end
- 排水時間設置應考慮最壞情況
- 使用
uvm_info添加調試信息:
`uvm_info("PHASE_END", $sformatf("Drain time set to %0tns", drain_time), UVM_MEDIUM)
7. 常見問題處理
graph LR
A[測試無法正常結束] --> B{檢查點}
B --> C[異議未正確drop]
B --> D[phase_ready_to_end死鎖]
B --> E[排水時間不足]
C --> F[添加調試打印]
D --> G[檢查fork/join_none]
E --> H[增加排水時間]
關鍵總結:
- 異議機制是UVM測試結束的基礎
- phase_ready_to_end處理延遲結束場景
- 合理設置排水時間確保環境穩定
- 調試階段應啟用UVM調試信息

浙公網安備 33010602011771號