2014-05-19 32 views
1

是否可以將SystemVerilog中的整個數組約束爲與另一個數組具有相同的值?在基於另一個陣列的SystemVerilog中約束整個陣列

我嘗試這樣做:

class some_class; 
    rand bit array1[10][10]; 
    rand bit array2[10][10]; 

    constraint arrays_c { 
     array1 == array2; 
    } 
enclass 

這不是在BIG3模擬器我試過的2不允許的。一個說它目前不支持,另一個則指向BNF的約束,抱怨它不是一個有效的整數表達式。

除了設置一些foreach約束之外,還有其他方法可以做到嗎?我最終想要的是從函數中返回一個數組,並使用它來約束另一個類字段的數組。

+0

在打包數組它的工作原理,但也有我可以使用那裏的類型的限制。這些限制顯然也因供應商而異。 –

+0

你可能會嘗試只隨機array2,然後使用隨機後將其複製到array1 – enchanter

+0

雖然這將工作,它不符合我想要的。我最終想要在數組上產生一系列約束來產生一個特定的結果(類似於「如果array3是這個,array1應該是什麼?」(因爲我只知道array1和array2以及array2和array3之間的關係)。通過在post_randomize()中賦值,我已經有效地從約束求解器中刪除了關於這個關係的任何信息。 –

回答

2

使用foreach,看到IEEE Std 1800-2012 § 18.5.8.1 的foreach迭代約束

constraint arrays_c { 
    foreach(array1[i,j]) { 
    array1[i][j] == array2[i][j]; 
    } 
} 

如果你想有一個隨機數組的副本,更好的辦法是在post_randomize功能指定的副本。這是較少的CPU激勵。

class some_class; 
    rand bit array1[10][10]; 
    bit array2[10][10]; 

    function void post_randomize(); 
    array2 = array1; 
    endfuction : post_randomize 
enclass 

如果在約束塊foreachpost_randomize計算不是可行的解決方案,然後用包裝陣列。

class some_class; 
    rand bit [9:0][9:0] array1; // double packed 
    rand bit [9:0][9:0] array2; 

    constraint arrays_c { 
    array1 == array2; 
    } 
enclass 

或者使用包陣列和比特流的分配,使最終的結果解壓

class some_class; 
    bit array1[10][10]; 
    bit array2[10][10]; 
    rand bit [$bits(array1)-1:0] flat_array1,flat_array2; 

    constraint arrays_c { 
    flat_array1 == flat_array2; 
    } 

    function void post_randomize(); 
    {>>{array1}} = flat_array1; // bit-stream assignment 
    {>>{array2}} = flat_array2; 
    endfuction : post_randomize 
enclass 
+0

要小心foreach,它會展開約束,當數組變大時,會看到性能問題並快速耗盡內存。 – enchanter

+0

感謝@Greg,但正如我所說我不能使用foreach,因爲右側的數組將是類的字段,但是函數的返回值並且我無法切片。 –

+0

@ Tudor,然後使用打包的數組。我在我的答案中添加了兩個示例。 – Greg