In this way the mode can be used to control sets of constraints.
Hi Dave,
I have tried running the above code in the simulator every time i ran mode is taking the value 0 and starting addr is 30 , ending addr is 32 and my_addr is 20
what is the significance of my_exc_array i didn’t understand. The question is my_addr is should be in the reange of start-addr & end_addr right ?
I had a typo in my code that I corrected (missing{}'s around the range). but once corrected it works for me. You’ll have to ask the original author of this question, but I believe they wanted either my_addr to be inside the start_/end_range or inside my_exc_array.
module top;
class A;
bit [31:0] my_exc_array[$] = {'h1234, 'h5678, 'hABCD, 'hFFFF};
rand enum {Range, Array} mode;
rand bit [31:0] my_addr;
rand bit [31:0] start_addr;
rand bit [31:0] end_addr;
constraint my_cons {
mode dist { Range:=1, Array:=1};
mode == Array -> my_addr inside {my_exc_array};
mode == Range -> { my_addr inside {[start_addr:end_addr]};
end_addr > start_addr; }
}
endclass
A a = new;
initial repeat(20) begin
assert(a.randomize());
$displayh(a.mode.name,, a.my_addr);
end
endmodule
A better way to do this is as below. It can help u to control the weights. here is a sample code
rand int test;
rand int test1;
int test_range[] = {1,2,3,5,6,9};
constraint c8 {
test == get_the_value(100, 200);
}
constraint c9 {
test1 == get_the_value(500, 600);
}
function int get_the_value(int min, int max);
randcase
1: get_the_value = min;
1: begin
int i = $urandom_range(0, test_range.size()-1);
get_the_value = test_range[i];
end
1: get_the_value = max;
endcase
endfunction