在UVM中,Sequence生成的激勵(Transaction)通過以下協作流程發送到Driver并最終驅動到DUT,其核心機制如下:
+---------------+ +---------------+ +------------+ +-----+
| Sequence | → | Sequencer | → | Driver | → | DUT |
+---------------+ +---------------+ +------------+ +-----+生成事務(Transaction) 管理事務隊列與仲裁 拉取并處理事務 實際驅動信號
2. 激勵發送的詳細步驟
步驟1:Sequence生成事務
-
Sequence通過
uvm_do
宏或手動調用start_item
/finish_item
生成事務。 -
class my_sequence extends uvm_sequence #(my_transaction);task body();my_transaction tx;repeat(10) begintx = my_transaction::type_id::create("tx");start_item(tx); // 請求發送權限assert(tx.randomize());// 隨機化事務finish_item(tx); // 將事務提交給Sequencerendendtask endclass
步驟2:Sequencer管理事務隊列
?事務緩存:finish_item()
將事務放入Sequencer的請求隊列。
?仲裁機制:Sequencer根據配置的仲裁算法(如優先級、公平性)選擇下一個發送的事務。
-
Driver在
run_phase
中循環調用get_next_item
從Sequencer獲取事務。
步驟3:Driver拉取事務
-
Driver在
run_phase
中循環調用get_next_item
從Sequencer獲取事務。
-
class my_driver extends uvm_driver #(my_transaction);virtual task run_phase(uvm_phase phase);forever beginmy_transaction req;seq_item_port.get_next_item(req); // 阻塞獲取事務drive_to_dut(req); // 驅動到DUTseq_item_port.item_done(); // 通知事務完成endendtask endclass
get_next_item
?的作用:-
????????功能:從Sequencer的請求隊列中阻塞獲取下一個事務。
-
關鍵行為:
-
阻塞等待:若Sequencer的隊列為空,Driver會在此處掛起,直到Sequence產生新事務。
-
獲取事務對象:返回的
req
是uvm_sequence_item
類型,通常需要轉換為具體的Transaction類型。
-
-
-
-
item_done
?的作用 -
功能:通知Sequencer當前事務已處理完畢,允許Sequencer釋放資源并繼續后續操作。
-
關鍵行為:
-
同步握手:解除Sequence中
finish_item()
的阻塞,使Sequence能繼續發送下一個事務。 -
可選響應傳遞:通過參數返回響應數據(如讀操作結果)
-
-
Sequence與Driver的交互
+-------------------+ +-------------------+ +-------------------+
| Sequence | | Sequencer | | Driver |
+-------------------+ +-------------------+ +-------------------+
| start_item(req) | --> | 將req放入隊列 | <-- | get_next_item(req)|
| | | | | |
| finish_item(req) | <-- | 等待item_done() | --(阻塞)-+ |
| | | | | 處理req并驅動DUT |
| | | | | item_done() |
+-------------------+ +-------------------+ +-------------------+
?
?步驟4:事務完成確認
-
Driver調用
item_done()
通知Sequencer事務處理完畢,觸發以下行為:-
釋放Sequence阻塞:解除
finish_item()
的阻塞,允許Sequence繼續發送下一個事務。 -
響應傳遞(可選):若需要返回響應數據(如讀取DUT結果),可通過
item_done(rsp)
傳遞。
-
3. 關鍵交互機制
(1) 阻塞握手協議
-
start_item()
:請求發送權限,若Sequencer未授權則阻塞。 -
finish_item()
:將事務提交到Sequencer隊列,等待Driver處理完成(item_done
)后解除阻塞。
(2) 事務生命周期
Sequence生成事務 → Sequencer緩存 → Driver拉取 → 驅動到DUT → 確認完成 → Sequence繼續
4. 多Sequence并發場景
當多個Sequence同時向同一個Sequencer發送事務時:
-
Sequencer仲裁:通過
set_arbitration
方法設置仲裁策略(如UVM_SEQ_ARB_FIFO
、UVM_SEQ_ARB_PRIORITY
)。 -
優先級控制:可通過
set_priority
調整Sequence優先級。
5. 示例:完整交互流程
// 場景:一個Sequence發送3個事務
// ----------------------------
// Sequence代碼
class test_sequence extends uvm_sequence #(my_transaction);task body();for (int i=0; i<3; i++) beginmy_transaction tx;tx = my_transaction::type_id::create("tx");start_item(tx);tx.data = i;finish_item(tx); // 阻塞直到Driver調用item_done()endendtask
endclass// Driver代碼
class my_driver extends uvm_driver #(my_transaction);task run_phase(uvm_phase phase);forever beginmy_transaction req;seq_item_port.get_next_item(req); // 阻塞直到事務到達$display("Driving transaction: data=%0d", req.data);#10ns; // 模擬驅動時序seq_item_port.item_done(); // 解除finish_item阻塞endendtask
endclass