In reply to happysri30:
You have to ask yourself what is the goal of making each variable cyclic? Normally without any randc modifiers, the goal of a constraint solver is to provide all possible solution sets with equal probability. This particular example has a solution set with 3 random variables with each variable have 4 possible values. But there are only 20 possible solutions. There are 10 solutions with start_addr==0 and only 1 solution with start_addr==3. end_addr has the reverse distribution. So there is no way to have both start_addr and end_addr have pure cyclic values.
What might make more sense is cycling though all all possible 20 solutions. You can do this by packing all the randc variables into one randc variable using packed array or struct.
typedef struct packed { bit [1:0] addr;
bit [1:0] start_addr;
bit [1:0] end_addr;
} st;
randc st v;
constraint addr_1_range { v.addr inside {[v.start_addr:v.end_addr]}; }