systemverilog constraint中的foreach可以對(duì)數(shù)組進(jìn)行遍歷和約束,常用于普通數(shù)組,隊(duì)列或者動(dòng)態(tài)數(shù)組。而當(dāng)對(duì)associative array(聯(lián)合數(shù)組/字典)應(yīng)用foreach時(shí),遇到一些問(wèn)題,記錄分享如下。
聯(lián)合數(shù)組含有key和value兩個(gè)元素,在這里key的類型以int和string為例,value元素以int和int[$]隊(duì)列為例。
[int/string] [int] Associative Array
實(shí)踐的demo代碼如下:
classtest; randbit[3:0]rd_dict[int]; randbit[3:0]rd_dict_fix[int]; randbit[3:0]rd_dict_str[string]; constraintc_rand{ rd_dict.size==7; foreach(rd_dict[i]){ rd_dict[i]13; ????????} ????????foreach(rd_dict_fix[i])? ????????????rd_dict_fix[i]==?13; ????????foreach(rd_dict_str[i])? ????????????rd_dict_str[i]==?14; ????} ????function?new(); ????????rd_dict_fix[9]?=?0; ????????rd_dict_str["A"]?=?0; ????endfunction
rd_dict沒(méi)有進(jìn)行初始化,使用constraint的size進(jìn)行約束聯(lián)合數(shù)組key的個(gè)數(shù)和value取值約束
rd_dict_fix在new函數(shù)中進(jìn)行初始化,包含一個(gè)int key元素,在constraint中對(duì)value進(jìn)行約束
rd_dict_str在new函數(shù)進(jìn)行初始化,包含一個(gè)string key元素,在constraint中對(duì)value進(jìn)行約束
添加適當(dāng)?shù)臏y(cè)試打印代買(mǎi),可以得到如下的仿真結(jié)果:
可以看出,普通的聯(lián)合數(shù)組,如果沒(méi)有初始化key元素,可以在constraint中使用size約束key的個(gè)數(shù),但key是順序遞增的,0~size-1。
如果初始化了key元素,無(wú)論是int還是string類型的key,使用foreach時(shí),可以對(duì)已初始化的key對(duì)應(yīng)的value進(jìn)行約束。
int/string->int[$] Associative Array
聯(lián)合數(shù)組的value是int隊(duì)列時(shí),demo代碼如下:
classtest; randbit[3:0]rd_dict[int][$]; randbit[3:0]rd_dict_fix[int][$]; randbit[3:0]rd_dict_str[string][$]; constraintc_rand{ rd_dict.size==7; foreach(rd_dict[i]){ rd_dict[i].size==3; foreach(rd_dict[i][j]){ rd_dict[i][j]13; ????????????} ????????} ????????foreach(rd_dict_fix[i])?{ ????????????rd_dict_fix[i].size?==?4; ????????????foreach(rd_dict_fix[i][j])?rd_dict_fix[i][j]==?13; ????????} ????????foreach(rd_dict_str[i])?{ ????????????rd_dict_str[i].size?==?4; ????????????foreach(rd_dict_str[i][j])?rd_dict_str[i][j]==?14; ????????} ????} ????function?new(); ????????rd_dict_fix[9]?=?'{}; ????????rd_dict_str["A"]?=?'{}; ????endfunction
rd_dict的key是int類型,value是int[$]隊(duì)列類型的value,size和value值都進(jìn)行了約束。
rd_dict_fix類型和rd_dict相同,區(qū)別在于new函數(shù)中進(jìn)行key初始化,僅包含一個(gè)key。
rd_dict_str的key類型是string類型,其他和rd_dict_fix相同。
不出意外,上述的code編譯出錯(cuò):
... Expressionofthistypecannotbeusedtoindexthearray ...
錯(cuò)誤在于key是string類型,value是int[$]隊(duì)列的字典,constraint中不能使用foreach操作。
將上述string->int[$]的constraint注釋后,編譯可以通過(guò),在仿真時(shí)會(huì)出錯(cuò):
Theconstraintsolverfailedwhenaccessinganullarrayrd_dict[0]. Pleasemakesurearrayrd_dict[0]isallocatedproperly.
由于rd_dict[int][$]并沒(méi)有在new函數(shù)中進(jìn)行初始化,即使在constraint中使用了size約束大小,也沒(méi)有達(dá)到預(yù)期的效果,這點(diǎn)和[int/string] [int] Associative Array例子中不同。
上述問(wèn)題解決后,可得到最后的仿真結(jié)果:
從上述的結(jié)果來(lái)看,如果聯(lián)合數(shù)組的value是隊(duì)列時(shí),則需要先進(jìn)行key的初始化,才可在constraint中進(jìn)行對(duì)value隊(duì)列的約束。key是string類型時(shí),似乎沒(méi)辦法使用foreach進(jìn)行約束。
審核編輯:劉清
-
仿真器
+關(guān)注
關(guān)注
14文章
1014瀏覽量
83591 -
Verilog語(yǔ)言
+關(guān)注
關(guān)注
0文章
113瀏覽量
8204
原文標(biāo)題:Foreach對(duì)Associative Array的constraint約束
文章出處:【微信號(hào):處芯積律,微信公眾號(hào):處芯積律】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論