UVM coding常見錯誤


1.clocking后面要跟緊標簽,clocking里面的input/output方向與DUT相反,並且不能有位寬標識。

2.factory的注冊語句后面不要加;用來結束,constraint后面也是不用加;,避免不必要的warning。

3.function如果不需要返回值,聲明時加入void,在實際的處理中也要加上void,要匹配不然報錯。

4.實例化fifo的port一定要xxx=new("xxx",this);不然直接用xxx=new()報錯。所以基本上實例化都要用前一種,避免debug帶來困擾。

5.task和function的區別:task可以有仿真時間的概念,可以使用@(posedge...),但是賦值必須用=;function沒有仿真時間的概念,賦值可以用<=,=用<=表示下一個周期。

因此,在phase中,build_phase和connect_phase是不包含在仿真時間里的,因此其定義是function。而main_phase等可以有仿真時間的,定義是task。需要注意的是在driver中與DUT進行端口連接的功能應該使用function 使用<=賦值。

6.關於function new,object類的new只有一個name參數,component類有一個name和一個parent。name = “實例化的名字” parent表示UVM樹形的某一個層次,有些class定義的時候這個new的參數可以使用默認的,有些不能。

這個如何判斷有些用 new(name,uvm_component parent) 有些用new(name = "  ",uvm_component = "null") ? 

在這個uvm樹中,env下一層的agent scb mdl都要寫出具體的實例化名字,parent是null,表示其沒有父類(從object繼承過來的更要求這樣,否則沒法看到樹形結構);

其他的使用默認,表示其父類就是聲明的class。

7.一般通過define來選擇是否打印model/scb/等模塊的信息,這些信息有利於debug環境,但是會消耗仿真時間,所以要做一個開關。

`define mdl_info(info)   `uvm_info("xx_model",info,UVM_MEDIUM)

  實際引用只需調用mdl_info即可,可以加上$psprintf打印一些變量的信息。

8.sequence設定一個default sequence,在不同case下面如果要用其他的sequnence,在case下把sequence進行替換即可。

9.合理利用typedef來自己定義想要的數據結構會事半功倍,其次要先想清楚自己的驗證環境的結構,然后思路實現的方法,model的實現等。具體化~

10.sv的數據結構比verilog豐富許多,實現的方法偏向軟件化,因此思路應與設計的思路有所區分。

11.transaction的定義,要考慮的是model/rtl需要什么樣的數據,scoreboard的判定又需要什么樣的數據。所以其實寫驗證環境最重要的還是理解整個環境的各個部分的數據交互,

清楚了數據流,就清楚了整個結構,寫起來也就很快了。

12.編譯器報null pointer dereference,因為config db沒有接收,或者沒有實例化,導致為空指針。

13.配置信息吃不進去,要查看是否在相應的case的build_phase進行了隨機化,...


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM