Hello,
I am trying to set the bits of address to zero based on axsize.
address[axsize-1:0] == 0;
class Example;
randc bit[2:0] axsize;
rand bit[15:0] addr;
constraint c1 {addr & (1'b1 << axsize) - 1'd1 == '0;}
endclass
module top;
Example E;
initial begin
E = new();
repeat(10) begin
assert(E.randomize());
$display("addr = %b, axsize = %0b ", E.addr, E.axsize);
end
end
endmodule
Randomization result:
addr = 0101011000101101, axsize = 0
addr = 1110000100101101, axsize = 0
addr = 0110000001011011, axsize = 0
addr = 1100110001101111, axsize = 0
addr = 1100100111101101, axsize = 0
addr = 1111100101110111, axsize = 0
addr = 1000111101110001, axsize = 0
addr = 1111111100100001, axsize = 0
addr = 1010110100001101, axsize = 0
addr = 0010001111011001, axsize = 0
why is axsize not getting randomized? Appreciate any inputs. Thanks.
constraint c1 {addr & (1'b1 << axsize) - 1'd1 == '0;}
The problem in your constraint is the expression (1'b1 << axsize) - 1 == -1
if axi size is greater than zero in order to satisfy constraint solver picking axsize == 0. if you want to differentiate the expression keep brackets then solver will give expected results.
constraint c1 {(addr & (1'b1 << axsize) - 1'd1) == '0;}
class Example;
randc bit[2:0] axsize;
rand bit[15:0] addr;
constraint c1 {(addr & ((1'd1 << axsize) - 1'd1)) == '0;
axsize inside {[3:5]};}
/*constraint c1 {(addr & (1'b1 << axsize) - 1'd1) == '0;}*/
endclass
module top;
Example E[10];
initial begin
foreach(E[i]) begin
E[i] = new();
assert(E[i].randomize());
$display("addr = %b, axsize = %0d ", E[i].addr, E[i].axsize);
end
end
endmodule
# run -all
# addr = 0110011111011000, axsize = 3
# addr = 1011100011010000, axsize = 3
# addr = 1010001110000000, axsize = 5
# addr = 1110100010100000, axsize = 4
# addr = 1111011011101000, axsize = 3
# addr = 0011010010100000, axsize = 5
# addr = 1011010111000000, axsize = 3
# addr = 0111010100110000, axsize = 4
# addr = 1010001110010000, axsize = 4
# addr = 1010101100100000, axsize = 4
# exit
2 Likes