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