首页 > 解决方案 > 为什么“Implication”和“if-else”约束显示不同的结果?

问题描述

为什么我在使用 if-else 和蕴含约束时会得到不同的结果?

由于这两个被认为是相同的,我认为我不应该有任何区别。在 if-else 情况下,最后一项不是约束。

class consMultiline;
  rand int arr[$];
  rand int arrQ[$];


  constraint c_iterate {
    arr.size inside {[4:4]};
    foreach(arr[i]) {
       (i < arr.size - 1) -> arr[i+1] > arr[i];
       arr[i] inside {[1:100]};
    }
  }

  constraint c_iterateQ {
    arrQ.size inside {[4:4]};
    foreach(arrQ[i]) {
       if( i < (arrQ.size -1)) {
           arrQ[i+1] > arrQ[i];
           arrQ[i] inside {[1:100]};
       }
    }
  }     
endclass

module tb;

   initial begin
     consMultiline cMult = new;
     for (int i = 0; i < 1; i++) begin
         cMult.randomize();
          $display ("%t %M: Arr=|%p| ", $time, cMult.arr);
          $display ("%t %M: ArrQ=|%p| ", $time, cMult.arrQ);
     end
   end
 
endmodule

输出:

             0 tb.unmblk1.unmblk1: Arr=|'{1, 7, 23, 47}| 
             0 tb.unmblk1.unmblk1: ArrQ=|'{23, 28, 67, 1364678739}| 

我想知道我错过了什么并得到不同的结果。

标签: system-verilogverification

解决方案


您的两个约束之间的逻辑不同。为了使您的if-else匹配具有含义,请更改:

   foreach(arrQ[i]) {
       if( i < (arrQ.size -1)) {
           arrQ[i+1] > arrQ[i];
           arrQ[i] inside {[1:100]};
       }
   }

到:

   foreach(arrQ[i]) {
       if( i < (arrQ.size -1)) {
           arrQ[i+1] > arrQ[i];
       }
       arrQ[i] inside {[1:100]};
   }

推荐阅读