AXI write strobe is generated based on the axi size and data width supported.
For example, if the axi interface you are using has 64 bit wide data bus, you can have strobe of 64/8 = 8
Let us take the same data width as an example to produce axi write strobe.
In this case, the strobe is set starting at address offset and continues till the size of the transfer is met.
For example,
ADDR = 0x3
SIZE = 0x2 (32 bits)
LEN = 0x2 (3 beats)
For the first beat, ADDR = 0x3, STRB = 0xF8
For the second beat, ADDR = 0x7, STRB = 0x80
For the third beat, ADDR = 0xB, STRB = 0xF8
module top;
parameter int DATA_WIDTH = 64;
bit [2:0] aw_size;
bit [7:0] aw_len;
bit [31:0] aw_addr;
bit [7:0] w_strb[$];
bit [31:0] addr_align;
function automatic bit [7:0] gen_strb ( input bit [31:0] addr, input bit [2:0] aw_size );
bit [7:0] strb;
int size_in_bytes = 2**aw_size;
addr_align = addr % (DATA_WIDTH/8);
for( int i=0;i<DATA_WIDTH/8;i++) begin
if ( i inside {[addr_align:addr_align+size_in_bytes-1]}) strb[i] = 1;
else strb[i] = 0;
end
//$display("ADDR_A:%0h BY:%0d STRB:%0h",addr_align,size_in_bytes,strb);
return strb;
endfunction
function automatic void load_strb ( );
bit [31:0] addr_l;
for ( int i=0;i<aw_len+1;i++) begin
addr_l = aw_addr + (i << aw_size);
w_strb.push_back(gen_strb(addr_l,aw_size));
$display("ADDR:%0d STRB:%0h",addr_l,w_strb[i]);
end
endfunction
initial begin
aw_addr = 'h3;
aw_len = 'h2;
aw_size = 'h2;
load_strb();
end
endmodule
RESULT:
Compiler version U-2023.03-SP2_Full64; Runtime version U-2023.03-SP2_Full64; Oct 16 02:13 2025
ADDR:3 STRB:78
ADDR:7 STRB:80
ADDR:11 STRB:78
V C S S i m u l a t i o n R e p o r t