Masking of bits - constraint

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