Generate unique elements in an array

In reply to dave_59:

Hello all,

This discussion is quite old but i came accross this recently and trying to implement random number generator but outputs are not expected.

class uniquenumber;
  rand bit [3:0] num [10];
  rand bit [3:0] data[10];
  rand bit [3:0] uniqnum[10];
  
  constraint rand_num{foreach (num[i]) num[i+1] != num[i];};
  constraint data_values { foreach(data[i]) 
                               foreach(data[j])
                                 if(i != j) data[i] != data [j] ;} 
  constraint rand_unitnum{unique {uniqnum};}
  
    function disp();    
      foreach (num[i])
      $display("num[%0d] %0d" , i,num[i]);
      foreach (uniqnum[i])
      $display("uniqnum[%0d] %0d" , i,uniqnum[i]);
      foreach (data[i])
      $display("data[%0d] %0d" , i,data[i]);    
    endfunction
endclass


module uniqnu ();

uniquenumber un;
initial begin

un = new();
assert(un.randomize());
un.disp();
end
endmodule 

For this above code I am getting below output

num[0] 7
num[1] 8
num[2] 0
num[3] 4
num[4] 14
num[5] 1
num[6] 6
num[7] 13
num[8] 5
num[9] 13
uniqnum[0] 0
uniqnum[1] 0
uniqnum[2] 0
uniqnum[3] 0
uniqnum[4] 0
uniqnum[5] 0
uniqnum[6] 0
uniqnum[7] 0
uniqnum[8] 0
uniqnum[9] 0
data[0] 0
data[1] 0
data[2] 0
data[3] 0
data[4] 0
data[5] 0
data[6] 0
data[7] 0
data[8] 0

Question

  1. num[*] is not all unique numbers as foreach loop check only next number to compare . look at num[7] and num[9] both are 13. What is the best stretagy to have all unique number generated without unique constraint ? i looked at other solutions too where shuffle() is used but what if we need to generate big addressing range for e.g.?

  2. all output of uniqnum is 0 that means my tool does not support that built in functionality ?

  3. i tried other constraint mentioned in this post for data[*] but it is all 0s Any suggestion why it is 0 ?