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