Monday, 16 March 2015

Generating array of unique random values

Sometime verification scenarios require creating sets of random instructions or addresses with no repeating values, usually represented as elements in a dynamic array. Earlier versions of SystemVerilog required you to use either nested foreach loops to constrain 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 constrain a set of variables or array elements to have unique values. 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. 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

1 comment:

  1. How do you generate the same without using random and constraints?

    ReplyDelete