近期看到一種關(guān)于約束的復用方法,總結(jié)分享如下。
在不同的用例中,隨機參數(shù)的隨機約束不會完全一致,最典型的就是錯誤或者異常用例的非法取值約束。對于這種不同的約束,常見的處理辦法就是繼承,并重寫原有參數(shù)的約束,如下所示。
class item; rand bit[3:0] A; constraint c{ A > 0; } //.... endclass class abnormal_item; constraint c{ A == 0;//覆蓋原有的A>0約束 } //.... endclass
除了存在可能的過度繼承問題,繼承方式是一種"靜態(tài)"的is-a關(guān)系,一旦abnormal_item確定后,參數(shù)的約束就已確定,不具備動態(tài)添加或者刪除約束的能力。
到這里,提一下Decorator Pattern(裝飾者模式)。Decorator Pattern大致是一種這樣的思路:
在Decorator Pattern的結(jié)構(gòu)中,可以動態(tài)地給一個對象添加新的功能,同時又不改變其結(jié)構(gòu),將對象的行為分為核心功能和可選功能。核心功能指對象最基本的職責,而可選功能則是在不改變核心職責的情況下增加的功能。通過使用裝飾者模式,可以動態(tài)地將可選功能裝飾在核心功能之上,使對象的功能更加靈活......
借鑒類似的思路,可以將隨機參數(shù)和其約束分離開來,將隨機約束視作對原參數(shù)的"裝飾",進而達到動態(tài)、可復用隨機約束的目的。
一個實例的類圖結(jié)構(gòu)如下:
在這種結(jié)構(gòu)下,大致分為兩層:
第一層是包含隨機參數(shù)的激勵定義層,item僅包含隨機參數(shù)的聲明,不包含參數(shù)的約束內(nèi)容。constrainted_item繼承于item,不包含直接的參數(shù)約束,而是通過add_instance_cons方法,動態(tài)的添加對隨機參數(shù)的約束。
第二層是約束實現(xiàn)層,抽象類abstract_constraint僅包含item類,不實現(xiàn)對tem參數(shù)的具體約束,不同的約束由可重用的子類實現(xiàn),即圖中的reusable_cons實現(xiàn)。
相關(guān)參考代碼如下。
隨機參數(shù)定義:
class item; rand int val; endclass class constrained_item extends item; `constraints_utils(item) endclass
抽象和約束實現(xiàn)定義:
virtual class abstract_constraint #(type T = int); protected T object; function void set_object(T object); this.object = object; endfunction endclass class only_even_values extends abstract_constraint #(item); constraint c { object.val % 2 == 0; } endclass
動態(tài)添加約束和隨機:
initial begin automatic constrained_item i = new(); automatic only_even_values only_even = new(); i.add_instance_constraint(only_even); repeat (100) begin if (!i.randomize()) $fatal(0, "Randomization failure"); //.... end end
上述的constraints_utils實現(xiàn)代碼如下:
`define constraints_utils(TYPE) ... local rand constraints::abstract_constraint #(TYPE) instance_constraints[$]; function void add_instance_constraint(constraints::abstract_constraint #(TYPE) c); constraints::abstract_constraint #(TYPE) c_copy = new c; c_copy.set_object(this); instance_constraints.push_back(c_copy); endfunction ...
可以看到,constrained_item內(nèi)部包含了一個rand類型的instance_constraints隊列,用于存儲分離約束的句柄。同時only_even_values內(nèi)也包含了指向constrained_item的句柄。當constrained_item進行randomize時,instance_constraints隊列也會隨機,在only_even_values內(nèi)完成對constrained_item的參數(shù)約束。
審核編輯:劉清
-
Constraint
+關(guān)注
關(guān)注
0文章
2瀏覽量
7029
原文標題:一種可重用constraint的實現(xiàn)方法:參數(shù)/隨機約束分離
文章出處:【微信號:處芯積律,微信公眾號:處芯積律】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論