systemverilog assertion randomize array without unique keyword

3 min read 11-09-2025
systemverilog assertion randomize array without unique keyword


Table of Contents

systemverilog assertion randomize array without unique keyword

Randomizing arrays in SystemVerilog without the unique keyword presents a unique set of challenges and considerations. While the unique keyword ensures that all elements within an array are distinct, omitting it allows for duplicate values. This approach can be beneficial in specific scenarios, but requires careful management to avoid unintended consequences. Let's delve into effective strategies and best practices for this technique.

Why Avoid unique When Randomizing Arrays?

The unique keyword, while powerful, isn't always necessary or even desirable. There are situations where allowing duplicate values in a randomized array is perfectly acceptable, even advantageous:

  • Modeling Real-World Scenarios: Some systems inherently allow duplicate data. For example, a network packet stream might contain multiple packets with the same destination address. Using unique in such a model would be unrealistic and could hinder accurate simulation.

  • Specific Test Cases: Intentionally creating duplicate values can be valuable for testing specific edge cases or error handling within a design. This focused approach allows for targeted verification.

  • Performance: The unique constraint adds computational overhead during randomization. In simulations with massive arrays, omitting unique can significantly improve performance, especially when duplicates aren't problematic.

Techniques for Randomizing Arrays Without unique

The absence of the unique keyword necessitates careful handling of the randomization process to achieve the desired results. Here are some key techniques:

1. Direct Randomization with Constraints (No unique)

This method uses constraints to define the acceptable range and distribution of values, without enforcing uniqueness. This is the simplest approach when duplicates are permissible.

class transaction;
  rand bit [7:0] data_array[10];
  constraint data_range { foreach (data_array[i]) data_array[i] inside {[0:255]}; }
endclass

module test;
  transaction trans;
  initial begin
    trans = new();
    repeat (10) begin
      trans.randomize();
      $display("Data Array: ", trans.data_array);
    end
  end
endmodule

This example randomizes a byte array (data_array) of size 10, constraining each element to be within the range of 0 to 255. Duplicates are allowed.

2. Randomization with Weighted Probabilities (No unique)

To control the distribution of values, even with duplicates allowed, you can incorporate weighted probabilities. This allows some values to appear more frequently than others.

class transaction;
  rand bit [7:0] data_array[10];
  randc int weight_index[10]; //Choose from 0-255.  Values with higher weights will be more likely
  constraint data_weight {
    foreach (weight_index[i]) weight_index[i] inside {[0:255]};
    foreach (data_array[i]) data_array[i] == weight_index[i];
  };
endclass

module test;
  transaction trans;
  initial begin
    trans = new();
    repeat (10) begin
      trans.randomize();
      $display("Data Array: ", trans.data_array);
    end
  end
endmodule

This enhanced example uses a parallel weight_index array to bias the randomization. Higher values in weight_index will result in a higher likelihood of those values appearing in data_array. Note that duplicates are still permitted.

3. Post-Randomization Checks and Adjustments

If you need to verify certain properties of your randomized array after randomization (without using unique during randomization), add a separate check and re-randomization step. This approach is particularly useful if detecting duplicates only after the fact is sufficient.

class transaction;
  rand bit [7:0] data_array[10];
  constraint data_range { foreach (data_array[i]) data_array[i] inside {[0:255]}; }
  function void post_randomize();
    if (check_duplicates(data_array)) begin
      $display("Duplicates found, re-randomizing...");
      randomize(); //Re-randomize if duplicates are found.
    end
  endfunction
  function bit check_duplicates(bit [7:0] arr[]);
      //Implement your duplicate check logic here.
      //Example: Use a set to track seen values.
  endfunction

endclass

module test;
  transaction trans;
  initial begin
    trans = new();
    repeat (10) begin
      trans.randomize() with {trans.post_randomize();}; //Call post randomize method.
      $display("Data Array: ", trans.data_array);
    end
  end
endmodule

This example shows the concept; you'll need to implement the check_duplicates function based on your specific needs. A straightforward approach is using a set data structure to track unique values.

Conclusion

Randomizing arrays without the unique keyword provides flexibility for specific verification scenarios. By using constraints, weighted probabilities, and post-randomization checks, you can effectively control the array's contents while allowing duplicates when appropriate. Remember to choose the approach that best aligns with your modeling needs and performance requirements. Always carefully consider the implications of duplicate values on the accuracy and efficacy of your verification process.