class amba3_axi_packet #(ADDR_BITS = 32, DATA_BITS = 32, TXID_BITS = 4, STRB_BITS = DATA_BITS / 8);
rand logic [ 2:0] awsize;
rand logic [ADDR_BITS-1:0] awaddr;
rand logic [STRB_BITS-1:0] wstrb[$];
logic [STRB_BITS-1:0] wstrb_m;
constraint aw_size{ awsize inside {0,1,2};}
constraint w_strobe_2{ if(awsize == 2)
foreach(wstrb[i])
wstrb[i] == 'hf;}
constraint w_strobe_0{ if(awsize == 0 )
wstrb_m == 2**(awaddr % (DATA_BITS/8) );}
constraint w_strobe_1{ if(awsize == 1)
if(awaddr % (DATA_BITS/8) == 0 || awaddr % DATA_BITS/8 == 1)
wstrb_m == 3;
else
wstrb_m == 12;}
function void post_randomize;
if(awsize == 0 ) begin
wstrb[0] = wstrb_m;
for(int i=1;i<wstrb.size();i++) begin
wstrb[i] = wstrb[i-1] <<< 1;
if(wstrb[i-1] == 8)
wstrb[i] = 1;
end
end
if(awsize == 1 ) begin
if(awaddr % (DATA_BITS/8) == 0 || awaddr % (DATA_BITS/8) == 1) begin
wstrb[0] = wstrb_m;
for(int i=1;i<wstrb.size();i++)
wstrb[i] = ~wstrb[i-1];
end
if(awaddr % (DATA_BITS/8) == 2 || awaddr % (DATA_BITS/8) == 3) begin
wstrb[2] = wstrb_m;
for(int i=1;i<wstrb.size();i++)
wstrb[i] = ~wstrb[i-1];
end
end
endfunction
function void disp();
$display("\t| awsize | \t\t%0h ",awsize);
endfunction
endclass
module ex;
amba3_axi_packet pkt;
initial begin
pkt = new();
repeat(200) begin
pkt.randomize();
pkt.disp();
end
end
endmodule
the output i am getting is
| awsize | 2
| awsize | 2
| awsize | 2
| awsize | 2
| awsize | 2
| awsize | 2
| awsize | 2
and so on…