How to generate an array of unique random values

Nowadays in many verification scenarios, it requires to create a set of random instructions or addresses with each unique value or we can say that no repeating values, usually represented as elements in a dynamic array. 

Earlier versions of SystemVerilog required you to use either nested foreach loops to constraint all combinations of array elements so that they would not be equal to each other. Or else repeatedly randomize one element at a time, and then constraining the next element to not be in the list of already generated values.

The new unique constraint (new feature of 1800-2012) lets you use one statement to constraint a set of variables or array elements to have unique values. 

In the following example when randomized, this class generates a set of ten unique values from 0 to 15.

class set_unique_val;
  rand bit [3:0] data[10];
  constraint uniq {
     unique {data};
  }
endclass : set_unique_val

You can also add other non-random variables to the set of unique values which has the effect of excluding the values of those variables from the set of unique values. 

In the following example when randomized, this class generates a set of ten unique values excluding the values 0, 5, and 15.

class set_unique_val;
  rand bit [3:0] data[10];
  const bit [3:0] excludes[] = {0, 15};
  constraint uniq {
     unique {data, excludes, 5};
  }
endclass : set_unique_val

About the author

Avatar photo

The Art of Verification

Hi, I’m Hardik, and welcome to The Art of Verification.

I’m a Verification Engineer who loves to crack complex designs and here to help others commit to mastering Verification Skills through self-learning, System Verilog, UVM, and most important to develop that thought process that every verification engineer should have.

I’ve made it my mission to give back and serve others beyond myself.

I will NEVER settle for less than I can be, do, give, or create.

View all posts

1 Comment

  • One more way to generate unique values in array
    class set_unique_val;
    rand bit [3:0] data[10];
    constraint uniq {
    foreach(data[i])
    foreach(data[j])
    if(i!=j)
    data[i] != data[j];
    }
    endclass : set_unique_val