In reply to cgales:
Thank you, your solution is very helpful! But there is a moment: when signal cb.S_AXIS_TREADY rises before cb.S_AXIS_TVALID, the first word is skipped.
Is this some timing issue? I have the feeling that code evaluated before cb event and the expression @(cb); after cb.S_AXIS_TLAST <= data_buffer.bus[i].tlast; row just waited for nearest event but not full clock cycle.
I decided to add @(cb) in the beginning (before while loop) and it start working.
Am I right?