本文移植於tutortecho 2020年7月3日 撰寫
UVM 其中一個強大的特性是各式各樣的 macro
讓你執行 uvm_sequence 或是 uvm_sequence_item 時可以不用每次都用繁瑣的步驟
也就是 create_item > start_item > randomize > finish_item
只要使用 uvm_do(req) 即可完成以上步驟
而 uvm_do_with 是 uvm_do 的延伸
可以讓你使用 macro 的第二個參數來加入你的 constraint
例如 `uvm_do_with(req , { req.addr == adr; req.data == dat; });
但是如果使用錯誤的話會造成一些危險
比如說你寫成: `uvm_do_with(req , { req.addr == addr; req.data == data; });
這樣子的話在 systemverilog iniline constraint searching 會發生預料之外的事
在大括號中的 constraint 將無法 bind sequence 內部的 local variable
此定義在 SystemVerilog standard IEEE-1800-2012 section 18.7
所以當我們想要 constraint 與 req 相同名稱的變數時
我們必須寫成這樣 `uvm_do_with(req , { req.addr == local::addr; req.data == local::data; });
這樣才能把想要 constraint 的數值 bind 到 systemverilog inline constraint
除此之外
如果有機會的話每個學習 UVM 的人都應該去看看 source code 的內容
sequence 相關的程式放在 framework 的以下路徑
$UVM_HOME/src/macros/uvm_sequence_defines.svh
發表留言