在近期的一個testcase調試中,遇到一個std::randomize隨機結果不符合預期的現象。
在testcase中設計一個結構體隊列,然后使用std::randomize對結構體中的某個參數進行隨機賦值,randomize的使用是std::randomize(s_item_list[i].AA) with {...}, code抽象如下:
使用VCS編譯仿真后得到結果如下:
從結果可以看到,雖然約束了結構體里參數AA的范圍是大于等于1,小于3,但仍出現了隨機結果為0的情況。這顯然不符合預期。
思緒良久,沒看出問題所在。只能打開SV手冊來查閱,針對std::randmozie的說明可參考SV語法手冊的18.12小節。從中還是發現了一些可疑之處:
The scope randomize function, std::randomize(), enables users to randomize data in the currentscope without the need to define a class or instantiate a class object.
...
The std::randomize() with form of the scope randomize function allows users to specify randomconstraints to be applied to the local scope variables.
看起來像是和scope有關系,因此又設計了class內普通變量,結構體變量,結構體隊列變量,class變量,class隊列變量,進行測試。設計的測試代碼如下:
仿真的結果如下:
總結規律,randomize(VAR),
當VAR是結構體里的變量(s_item.AA)、class里的變量(c_item.AA)、普通變量(int,bit)時,randomize行為正常;
當VAR是結構體隊列中某個元素的變量(s_item_list[i].AA)、class隊列中某個元素的變量(c_item_list[i].AA),randomize隨機行為不符合預期。
隨機結果不符合預期,EDA工具卻沒有給出warning或者error。為了確認其原因,就換了XRUN工具,看看是否能夠復現該問題。
切換XRUN工具后,直接在編譯階段fail;
XRUN給出了原因說明:The argument to scope randomize must be a simple identifier of integral.
所以在std::randomize的使用時,需要主要傳入的參數需要是普通型變量,避免隊列中元素的索引。
審核編輯:劉清
-
EDA工具
+關注
關注
4文章
268瀏覽量
31891 -
仿真器
+關注
關注
14文章
1019瀏覽量
83884 -
STD
+關注
關注
0文章
36瀏覽量
14381 -
VCS
+關注
關注
0文章
80瀏覽量
9634
原文標題:std::randomize,沒那么簡單
文章出處:【微信號:處芯積律,微信公眾號:處芯積律】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論