• Techo

[IC驗證] 如何設計 uvm_sequence 與控制sequence granularity(序列顆粒度)

更新日期: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 顆粒度大小的選擇可以同時使用

要怎麼做組合就看使用者自由發揮了

134 次瀏覽
Logo2020.JPG
  • Instagram - White Circle
  • Google+ - White Circle
  • Facebook - White Circle

Contact Us

Techo私人程式家教

官方LINE ID : @tutortecho

zh-Hant.png

© Copyright 2018 by Sherry Wu and Techo Chao.

Proudly created with Wix.com,

but page loading is too slow,so I don't recommend it.