Tuesday, 17 March 2015

Generate randc functionality from rand variable

It's easy to get the first cycle of random numbers by pushing values on a list in post_randomize() and adding a constraint that keeps the values in the list excluded from the next solution.

class A;
   rand bit [7:0] myvar;
   bit [7:0] list[$];
   constraint cycle {
     unique {myvar, list};
   function void post_randomize;
      list.push_back(myvar);  //store each myvar into list[$]

The real problem is knowing when to start the cycle over by clearing the list. If the exact number of possible values for myvar is known, you can add a pre_randomize() method that deletes the list when hitting that limit.

function void pre_randomize;
  if (list.size() == limit)
    list = {};  //delete queue

Otherwise you will have to check the result of calling randomize() and assume it fails because it has exhausted the list of values.

No comments:

Post a Comment