diff --git a/axi/tb/axis_cocotb_loopback_test/tb_axis_loopback.sv b/axi/tb/axis_cocotb_loopback_test/tb_axis_loopback.sv new file mode 100644 index 0000000..6130d22 --- /dev/null +++ b/axi/tb/axis_cocotb_loopback_test/tb_axis_loopback.sv @@ -0,0 +1,108 @@ +module tb_axis_loopback; + localparam int unsigned DATA_W = 64; + localparam int unsigned KEEP_W = DATA_W / 8; + localparam int unsigned ID_W = 8; + localparam int unsigned DEST_W = 8; + localparam int unsigned USER_W = 8; + + + logic clk = 1'b0; + logic rst = 1'b1; + logic rst_n; + + assign rst_n = ~rst; + + // Classic AXI-Stream flat input side + logic [DATA_W-1:0] s_axis_tdata; + logic [KEEP_W-1:0] s_axis_tkeep; + logic [KEEP_W-1:0] s_axis_tstrb; + logic s_axis_tlast; + logic [ID_W-1:0] s_axis_tid; + logic [DEST_W-1:0] s_axis_tdest; + logic [USER_W-1:0] s_axis_tuser; + logic s_axis_tvalid; + logic s_axis_tready; + + // Classic AXI-Stream flat output side + logic [DATA_W-1:0] m_axis_tdata; + logic [KEEP_W-1:0] m_axis_tkeep; + logic [KEEP_W-1:0] m_axis_tstrb; + logic m_axis_tlast; + logic [ID_W-1:0] m_axis_tid; + logic [DEST_W-1:0] m_axis_tdest; + logic [USER_W-1:0] m_axis_tuser; + logic m_axis_tvalid; + logic m_axis_tready; + + axis_if #( + .DATA_W(DATA_W), + .KEEP_W(KEEP_W), + .ID_W(ID_W), + .DEST_W(DEST_W), + .USER_W(USER_W) + ) s_axis_if ( + .aclk(clk), + .aresetn(rst_n) + ); + + axis_if #( + .DATA_W(DATA_W), + .KEEP_W(KEEP_W), + .ID_W(ID_W), + .DEST_W(DEST_W), + .USER_W(USER_W) + ) m_axis_if ( + .aclk(clk), + .aresetn(rst_n) + ); + + axis_flat_to_if #( + .DATA_W(DATA_W), + .KEEP_W(KEEP_W), + .ID_W(ID_W), + .DEST_W(DEST_W), + .USER_W(USER_W) + ) axis_in_conv_inst ( + .s_axis_tdata (s_axis_tdata), + .s_axis_tkeep (s_axis_tkeep), + .s_axis_tstrb (s_axis_tstrb), + .s_axis_tlast (s_axis_tlast), + .s_axis_tid (s_axis_tid), + .s_axis_tdest (s_axis_tdest), + .s_axis_tuser (s_axis_tuser), + .s_axis_tvalid (s_axis_tvalid), + .s_axis_tready (s_axis_tready), + .m_axis (s_axis_if) + ); + + axis_loopback #( + .DATA_W(DATA_W), + .KEEP_W(KEEP_W), + .ID_W(ID_W), + .DEST_W(DEST_W), + .USER_W(USER_W) + ) axis_dut_inst ( + .s_axis(s_axis_if), + .m_axis(m_axis_if) + ); + + axis_if_to_flat #( + .DATA_W(DATA_W), + .KEEP_W(KEEP_W), + .ID_W(ID_W), + .DEST_W(DEST_W), + .USER_W(USER_W) + ) axis_out_conv_inst ( + .s_axis (m_axis_if), + .m_axis_tdata (m_axis_tdata), + .m_axis_tkeep (m_axis_tkeep), + .m_axis_tstrb (m_axis_tstrb), + .m_axis_tlast (m_axis_tlast), + .m_axis_tid (m_axis_tid), + .m_axis_tdest (m_axis_tdest), + .m_axis_tuser (m_axis_tuser), + .m_axis_tvalid(m_axis_tvalid), + .m_axis_tready(m_axis_tready) + ); + +endmodule : tb_axis_loopback