[IC驗證] 如何設計 uvm_sequence 與控制sequence granularity(序列顆粒度)
更新日期:2020年7月3日
當我們定義完 uvm_sequence_item之後
我們必須在 uvm_sequence 裡面實例化(instantiate) uvm_sequence_item
我們應該如何定義第一個 uvm_sequence 呢?
我們先假設你的 transaction (uvm_sequence_item) 是一個 CPU instruction
裏頭定義了指令讀寫的 rs,rd 等等
並且宣告為 rand 型態
那我們的第一個 sequence 可以設計成 single_instr_seq
在這個 sequence 裡面只會有一個 uvm_sequence_item instance
並且 random 此 uvm_sequence_item 除了 instruction type 之外的所有 attributes
我們可以宣告一個 rand 變數在 single_instr_seq 叫做 instr_type
instr_type 可以為 load/store,compatational,branch...
我們在 single_instr_seq 內部使用 `uvm_do_with(req, {req.instr_type==instr_type});
也就是 single_instr_seq 中去 constraint 此單一 transaction 應該是怎樣的指令
如果需要打出多個指令給 DUT
我們可以再設計一個 sequence 叫做 multiple_instr_seq
在此 sequence 中 instantiate 數量為 number 個的 "single_instr_seq"
number 為 rand 型態並且在 task body 中拿來控制執行 single_instr_seq 的迴圈次數
在每一圈都重新 instantiate 一個 single_instr_seq
可以用 `uvm_do 實現
如果你想要任意控制每一個 single_instr_seq 送出的 uvm_sequence_item 的 instr_type
你一樣可以使用 constraint "single_instr_seq" 的 instr_type 來達成目的
仍然是用 `uvm_do_with
如果不想控制那就直接給 single_instr_seq 中的 rand 變數 instr_type 來做即可
這種用法叫做 hierarchy sequence
整理來說是一種 sequence 顆粒度(granularity)小的設計
從一開始 single_instr_seq 的設計只使用一個 sequecne_item 來控制
如果要控制更多東西
就定義 high level seuqence 在使用 composition (不是繼承) 來創造多個 low level sequence
那何謂顆粒度大的 uvm_sequence 呢?
我們可以定義一個 sequence 其中有一個變數 number
在裡面直接 repeat nubmer 次 `uvm_do(req)
一個 sequence 即可 instantiate 多個 uvm_sequence_item
一個 sequence 即可以送出多個指令
不過很明顯的比較難對於控制每個指令要做甚麼事
但是對於相同 instr_type 連續送的行為就不用定義這麼多層
sequence 顆粒度大小的選擇可以同時使用
要怎麼做組合就看使用者自由發揮了