[SV]SystemVerilog数组约束方法总结

                       SystemVerilog数组约束方法总结

 

       前言:在验证工作中,数组是我们最常用的数据结构之一了,那么如何对数组元素做约束呢?本文将给出一些实战的例子。除此外,之前介绍过的unique约束(Link)也可以产生具有唯一元素的数组。

 

一、约束动态数组的大小

  • 最容易理解的数组约束函数是size(),他可以约束动态数组或者队列的元素个数。
class dynamic_size_array();

  rand logic [31:0]            dyn_array[];
  
  constraint cst_dyn_array {
    dyn_array.size() inside {[1:10]};
  }

endclass

 

二、元素求和的约束

       

parameter    MAX_TRANSACTION_LEN = 10;

class strobe_pat();

  rand bit    strobe[MAX_TRANSACTION_LEN];

  constraint cst_set_length {
    strobe.sum() == 4'h4;
  }

endclass

 

三、约束数组中的每一个元素

       SystemVerilog可以用foreach对数组的每一个元素进行约束。和直接写出的对固定大小的数组的每一个元素的约束相比,使用foreach要更简洁。比较实际的做法就是使用foreach约束动态数组和队列。

  • 简单的数组约束
class good_sum;

  rand uint            len[];

  constraint   cst_len {
    foreach(len[i]) {
      len[i] inside {[1:255]};
    }
    len.sum < 1024;
    len.size() inside {[1:8]};
  }

endclass
  • 产生递增的数组元素值
class ascend;

  rand unit    d[10];

  constraint cst_d {
    foreach(d[i]) {
      if(i > 0) {
        d[i] > d[i-1];
      }
    }
  }

endclass

 

四、产生具有唯一元素的数组

  • 使用嵌套的foreach循环,让求解器比较任意2个元素
class unique_slow;

  rand bit [7:0]        ua[64];
  
  constraint cst_ua {
    foreach(ua[i]) {
      foreach(ua[j]) {
        (i != j) -> ua[i] != ua[j];
      }
    }
  }

endclass
  • 用randc辅助类产生唯一的元素
class randc_value;

  randc bit [7:0]    val;

endclass

class list_unique_array;
  bit [7:0]          ua[64];

  function void pre_randomize();  
    randc_value      rand_val;
    rand_val = new();

    foreach(ua[i]) begin
      assert(rand_val.randomize());
      ua[i] = rand_val.val;
    end

  endfunction

endclass

 

五、产生元素具有唯一值的随机数组的类

 5.1、唯一值发生器

class randc_range;

  randc bit [15:0]    value;

  int                 max_value;

  function new(int max_value = 10);
    this.max_value = max_value;
  endfunction

endclass

 

 5.2、产生元素具有唯一值得随机数组

class unique_array;

  int    max_array_size;
  int    max_value;

  rand bit [7:0]    array[];

  function new(int max_array_size=2, max_value=2);
    this.max_array_size = max_array_size;
    if(max_value < max_array_size)
      this.max_value = max_array_size;
    else
      this.this.max_value = max_value;
  endfunction

  constraint array_size {
    array.size() inside {[1:max_array_size]};
  }

  function void post_randomize();
    randc_range    rand_val;
    rand_val    =  new(max_value);
    foreach(array[i]) begin
      assert(rand_val.randomize());
      array = rand_val.value;
    end
  endfunction

  function void display()
    $display("array.size() = %0d", array.size());
    foreach(array[i])
      $display("array[%0d] = 0x%0d", i, array[i]);
  endfunction

endclass

 

 5.3、使用unique_class类

program unique_array_inst();

  unique_array        unique_array_inst;

  initial begin
    unique_array_inst = new(50);

    repeat(10) begin
      assert(unique_array_inst.randomize());
      unique_array_inst.display();
    end
  end

endprogram

 

 

 

 

 

你可能感兴趣的:(SystemVerilog)