現象:
代碼選擇打開57行,注釋掉60行執行,結果58行不會打印。
代碼選擇打開60行,注釋57行執行,結果58行正常打印。
sequence的執行需要時間!!!
SV中代碼57行切換到60行的區別?
這兩行代碼的位置變化帶來了完全不同的執行行為:
🔄 執行順序的根本區別
第57行(注釋掉的位置)
57 //write_vseq.start(vsequencer);//-h8000 [順序執行]
58 `uvm_info(get_type_name(),$sformatf("wya_debug 000"),UVM_LOW)
59 fork
60 write_vseq.start(vsequencer);//-h8000 [并行執行]
61 wait(WR_DWRR.rx_rdy[0] == 1);
62 wait(WR_DWRR.rx_rdy[1] == 1);
63 wait(WR_DWRR.rx_rdy[2] == 1);
64 join
📊 兩種位置的對比
🎯 具體行為分析
情況1:第57行(順序執行)
//write_vseq.start(vsequencer); // 1. 先執行sequence(如果取消注釋)
`uvm_info("DEBUG", "wya_debug 000", UVM_LOW); // 2. 打印信息
fork // 3. 然后開始并行等待wait(WR_DWRR.rx_rdy[0] == 1);wait(WR_DWRR.rx_rdy[1] == 1); wait(WR_DWRR.rx_rdy[2] == 1);
join
// 4. 等待所有信號就緒
執行流程:sequence → 打印 → 等待信號
情況2:第60行(并行執行)
`uvm_info("DEBUG", "wya_debug 000", UVM_LOW); // 1. 先打印信息
fork // 2. 并行執行以下操作write_vseq.start(vsequencer); // 2.1 啟動sequencewait(WR_DWRR.rx_rdy[0] == 1); // 2.2 同時等待信號wait(WR_DWRR.rx_rdy[1] == 1);wait(WR_DWRR.rx_rdy[2] == 1);
join // 3. 等待sequence完成且所有信號就緒
執行流程:打印 → (sequence + 等待信號) 并行執行
?? 時序差異
第57行位置的時序(如果取消注釋)
時間軸:
0ns: 啟動write_vseq sequence→ sequence執行各種操作→ 可能驅動信號、產生流量
???ns: sequence完成執行→ 打印"wya_debug 000"→ 開始等待rx_rdy信號
第60行位置的時序
時間軸:
0ns: 打印"wya_debug 000"→ 同時:啟動write_vseq sequence(后臺運行)開始等待rx_rdy[0]信號開始等待rx_rdy[1]信號 開始等待rx_rdy[2]信號→ 等待所有條件滿足:sequence完成 + 所有信號就緒
💡 建議的使用方式
使用第57行位置(順序執行)當:
需要先完成sequence的初始化
sequence執行時間很短
等待信號需要在sequence之后
使用第60行位置(并行執行)當:
sequence可以后臺運行
希望盡快開始等待信號
sequence執行時間和信號等待可以重疊
🔧 更好的寫法
`uvm_info(get_type_name(), $sformatf("wya_debug 000"), UVM_LOW)forkbeginwrite_vseq.start(vsequencer); // 運行sequence`uvm_info("DEBUG", "Sequence completed", UVM_LOW)endbeginwait(WR_DWRR.rx_rdy[0] == 1);wait(WR_DWRR.rx_rdy[1] == 1);wait(WR_DWRR.rx_rdy[2] == 1);`uvm_info("DEBUG", "All signals ready", UVM_LOW)end
join
// 等待sequence完成并且所有信號就緒
**結論:**從57行移到60行改變了sequence的執行時機,從順序執行變為并行執行,這會影響程序的同步邏輯和時序行為。