2014-05-19 120 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