类数组中的约束依赖

时间:2021-04-04 08:26:11

标签: constraints system-verilog

当数组的不同项之间存在依赖关系时,如何约束类数组中的 2 个变量?

class X;
  rand bit en;
  rand int idx;

  constraint cnst1{
     idx inside {[0:9]};
  }
endclass

class Y;
   rand X arr_x[100];

   constraint cnst2{
      ???
   }
endclass

我想创建 cnst2 来保证:

  1. 将为 arr_x[i].idx 中的至少一个设置每个 idx 可选值 (0-9)。
  2. 对于所有具有相同 idx 值的 arr_x[i],至少有 1 个将设置为 1。

例如:

假设只有以下 idx == 9:

arr_x[0].idx == 9;
arr_x[13].idx == 9;
arr_x[44].idx == 9;
arr_x[75].idx == 9;
arr_x[81].idx == 9;
arr_x[93].idx == 9;

需要保证:

arr_x[0].en | arr_x[13].en | arr_x[44].en | arr_x[75].en | arr_x[81].en | arr_x[93].en == 1;

对每个 idx 值依此类推;

1 个答案:

答案 0 :(得分:1)

您需要 or 数组缩减方法。还要创建一个辅助数组,以便您可以从 0-9 进行迭代。此约束为:如果至少有一个元素具有 0-9 的值,则必须设置这些元素之一。

bit iterator[10];
constraint cnst2{
  foreach(iterator[i])
       arr_x.or(x) with (i ==x.idx) -> // needed if idx will not have every value 0-9
         arr_x.or(y) with (i == y.idx && y.en);
}

请参阅IEEE 1800-2017 SystemVerilog LRM中的18.5.8.2 数组缩减迭代约束7.12.3 数组缩减方法部分。