Execution flow of constraints

class ahb_burst;
  rand int unsigned start_address;
  rand int unsigned Haddr;
  rand bit [2:0] Htrans;
  rand bit [1:0] Hsize;
  typedef enum{SINGLE=0,UNDEFINED=1,INCR4=2,WRAP4=3,INCR8=4,WRAP8=5,INCR16=6,WRAP16=7} burst_type;
  rand burst_type type_of_transfer;
  rand bit [5:0] beats;
  
  function int unsigned lower_boundary();
    if(start_address%(1<<Hsize)==0)
      return (start_address-(start_address%((1<<Hsize)*beats)));
    else
      $display("unaligned transfer");
  endfunction
       
  function int unsigned upper_boundary();
    if(start_address%(1<<Hsize)==0)
      return (lower_boundary+(1<<Hsize)*beats);
  endfunction
       
  function static int unsigned Haddr_dup();
    if(Htrans==0)
      return (0);
    else if(Htrans==1) begin
      return (start_address);
    end
    else if(Htrans==2) begin
      if(type_of_transfer.name=="WRAP4"||type_of_transfer.name=="WRAP8"||type_of_transfer.name=="WRAP16") begin
        if(Haddr_dup==(upper_boundary-1<<Hsize))
          return (lower_boundary);
        else
          return (Haddr_dup+(1<<Hsize));
      end
      else if(type_of_transfer.name=="INCR4"||type_of_transfer.name=="INCR8"||type_of_transfer.name=="INCR16"||type_of_transfer.name=="SINGLE")
        return (Haddr_dup+(1<<Hsize));
    end
    else
      return (Haddr_dup);
  endfunction
  
  //constraint initial_address{start_address inside {[0:4096]};(start_address%(1<<Hsize))==0;}
  constraint wrap_up{Haddr==Haddr_dup;}
  //constraint o{solve initial_address before wrap_up;}
  constraint bytes_per_transfer{type_of_transfer==0->beats==1;
                                (type_of_transfer==2|| type_of_transfer==3)->beats==4;
                                (type_of_transfer==4|| type_of_transfer==5)->beats==8;
                                (type_of_transfer==6|| type_of_transfer==7)->beats==16;}
endclass

module test;
  ahb_burst transfer;
  initial begin
    transfer=new;
    assert(transfer.randomize() with {transfer.Htrans==1;Hsize==1;start_address==32'd48;type_of_transfer==3;});
         $display("transfer information=%p,upper_boundary=%0d,lower_boundary=%0d",transfer,transfer.upper_boundary,transfer.lower_boundary);

  end
endmodule

i am just trying explore little deep into ahb and sv so,
i am just trying to generate random address and wanted to observe burst calculations,
But here if i give start address from inline constraint, my haddr is getting the value when htrans==1,but if i write separate constraint then it is not loading into haddr can any one explain this behavior please?

when i specify assert(randomize.transfer with start.address==32’d48;}
result:
transfer information='{start_address:48, **Haddr:48**, Htrans:1, Hsize:1, type_of_transfer:WRAP4, beats:4},upper_boundary=56,lower_boundary=48

when i am writing separate constriant for start_address
result:
transfer information='{start_address:3922, **Haddr:0**, Htrans:1, Hsize:1, type_of_transfer:WRAP4, beats:4},upper_boundary=3928,lower_boundary=3920

1 Like

Thanks dave