Hi guys, what I would like to share with you today is how to use SystemVerilog constraints to generate an array with unique elements. There are three ways that I can think of. The first one is to use the uniqueness constraints in SystemVerilog syntax, the other two ways are to use array iterators to do the trick.

- Using Uniqueness Constraints
- Using Two Loop Iterators
- Generate a(n) Ascending/Descending Array and Shuffle It.

This is the most straightforward way to do it. SystemVerilog introduces this in RFM 18.5.5, a group of variables can be constrained using **unique** constraint so that no two members of the group have the same value after randomization.

Let’s assume that we have a dynamic array with size unknown, and we would like to constrain the size between 10 and 15. So we can just write our code as follows:

class C1;

rand bit [4:0] A [];

//constrain A's size between 10 to 15

constraint c1 {

A.size insisde {[10:15]};

}

//use unique to generate unique elements in A

constraint c2 {

unique{A};

}

endclass

initial begin

C1 C1_h = new();

repeat(10) begin

if(C1_h.randomize())

$display("A is %p", C1_h.A);

end

end

endprogram

This idea is to use two loop iterators. If the indexes of two iterators are not the same, the elements should also be different. Since we have two nested loops, the running time is O(n^2). The code is listed below:

class C2;

rand bit [4:0] A [];

//constrain A's size between 10 to 15

constraint c1 {

A.size insisde {[10:15]};

}

//use iterators and conditions to generate unique elements

constraint c2 {

foreach(A[i])

foreach(A[j])

if(i!=j)

A[i] != A[j];

}

endclass

initial begin

C2 C2_h = new();

repeat(10) begin

if(C2_h.randomize())

$display("A is %p", C2_h.A);

end

end

endprogram

We can also generate an ascending or a descending array and shuffle the array in the post_randomize() function. This will guarantee us to have an array with unique elements. Since we only loop around the array once, the running time is O(n), which is signficantly lower than the previous method. I am going to code an ascending array to illustrate this.

class C3;

rand bit [4:0] A [];

//constrain A's size between 10 to 15

constraint c1 {

A.size insisde {[10:15]};

}

//use iterators and conditions to generate unique elements

constraint c2 {

foreach(A[k])

if(k < A.size -1) //prevent out-of-bounds

A[k+1] > A[k]; //generate an ascending array

}

//shuffle all the elements

function post_randomize();

A.shuffle();

endfunction

endclass

initial begin

C3 C3_h = new();

repeat(10) begin

if(C3_h.randomize())

$display("A is %p", C3_h.A);

end

end

endprogram

Thank you for reading. This is all I have for how to generate a dynamic array with unique elements. Leave me a comment below if you have any questions.