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