diff --git a/lib/rfnoc/blocks/rfnoc_block_replay/axis_replay.v b/lib/rfnoc/blocks/rfnoc_block_replay/axis_replay.v index 194aed3..38d9eb0 100644 --- a/lib/rfnoc/blocks/rfnoc_block_replay/axis_replay.v +++ b/lib/rfnoc/blocks/rfnoc_block_replay/axis_replay.v @@ -149,7 +149,7 @@ module axis_replay #( //--------------------------------------------------------------------------- localparam [REG_MAJOR_LEN-1:0] COMPAT_MAJOR = 1; - localparam [REG_MINOR_LEN-1:0] COMPAT_MINOR = 1; + localparam [REG_MINOR_LEN-1:0] COMPAT_MINOR = 2; localparam [REG_ITEM_SIZE_LEN-1:0] DEFAULT_ITEM_SIZE = 4; // 4 bytes for sc16 @@ -248,6 +248,7 @@ module axis_replay #( reg [TIME_W-1:0] reg_play_cmd_time; reg [CMD_W-1:0] reg_play_cmd; reg reg_play_cmd_timed; + reg reg_play_cmd_no_eob; reg reg_play_cmd_valid; wire reg_play_cmd_ready; reg play_cmd_stop; @@ -294,6 +295,7 @@ module axis_replay #( clear_cmd_fifo <= 0; reg_play_cmd <= 'bX; reg_play_cmd_timed <= 'bX; + reg_play_cmd_no_eob <= 'bX; reg_play_cmd_valid <= 0; s_ctrlport_resp_data <= 'bX; s_ctrlport_resp_ack <= 0; @@ -469,6 +471,7 @@ module axis_replay #( REG_PLAY_CMD : begin reg_play_cmd <= s_ctrlport_req_data[REG_PLAY_CMD_POS+:REG_PLAY_CMD_LEN]; reg_play_cmd_timed <= s_ctrlport_req_data[REG_PLAY_TIMED_POS]; + reg_play_cmd_no_eob <= s_ctrlport_req_data[REG_PLAY_NO_EOB_POS]; reg_play_cmd_valid <= 1'b1; if (!play_cmd_stop && s_ctrlport_req_data[REG_PLAY_CMD_LEN-1:0] == PLAY_CMD_STOP) begin play_cmd_stop <= 1; @@ -511,6 +514,7 @@ module axis_replay #( // Command FIFO Signals wire [CMD_W-1:0] cmd_cf; wire cmd_timed_cf; + wire cmd_no_eob_cf; wire [NUM_WORDS_W-1:0] cmd_num_words_cf; wire [TIME_W-1:0] cmd_time_cf; wire [MEM_ADDR_W-1:0] cmd_base_addr_cf; @@ -519,15 +523,15 @@ module axis_replay #( reg cmd_fifo_ready; axi_fifo_short #( - .WIDTH (MEM_ADDR_W + MEM_SIZE_W + 1 + CMD_W + NUM_WORDS_W + TIME_W) + .WIDTH (MEM_ADDR_W + MEM_SIZE_W + 2 + CMD_W + NUM_WORDS_W + TIME_W) ) command_fifo ( .clk (clk), .reset (rst), .clear (clear_cmd_fifo), - .i_tdata ({play_base_addr_sr, play_buffer_size_sr, reg_play_cmd_timed, reg_play_cmd, reg_play_cmd_num_words, reg_play_cmd_time}), + .i_tdata ({play_base_addr_sr, play_buffer_size_sr, reg_play_cmd_timed, reg_play_cmd_no_eob, reg_play_cmd, reg_play_cmd_num_words, reg_play_cmd_time}), .i_tvalid (reg_play_cmd_valid), .i_tready (reg_play_cmd_ready), - .o_tdata ({cmd_base_addr_cf, cmd_buffer_size_cf, cmd_timed_cf, cmd_cf, cmd_num_words_cf, cmd_time_cf}), + .o_tdata ({cmd_base_addr_cf, cmd_buffer_size_cf, cmd_timed_cf, cmd_no_eob_cf, cmd_cf, cmd_num_words_cf, cmd_time_cf}), .o_tvalid (cmd_fifo_valid), .o_tready (cmd_fifo_ready), .occupied (), @@ -773,6 +777,7 @@ module axis_replay #( // reg [NUM_WORDS_W-1:0] play_words_remaining; // Number of words left for playback command reg [CMD_W-1:0] cmd; // Copy of cmd_cf from last command + reg cmd_eob; // Inverse copy of cmd_no_eob_cf from last command reg [MEM_ADDR_W-1:0] cmd_base_addr; // Copy of cmd_base_addr_cf from last command reg [MEM_SIZE_W-1:0] cmd_buffer_size; // Copy of cmd_buffer_size_cf from last command reg last_trans; // Is this the last read transaction for the command? @@ -805,6 +810,7 @@ module axis_replay #( play_buffer_end <= {MEM_SIZE_W{1'bX}}; read_ctrl_valid <= 1'bX; cmd <= {CMD_W{1'bX}}; + cmd_eob <= 1'bX; cmd_base_addr <= {MEM_ADDR_W{1'bX}}; cmd_buffer_size <= {MEM_SIZE_W{1'bX}}; play_buffer_avail <= {MEM_SIZE_W{1'bX}}; @@ -842,6 +848,7 @@ module axis_replay #( PLAY_IDLE : begin // Save needed command info cmd <= cmd_cf; + cmd_eob <= ~cmd_no_eob_cf; cmd_base_addr <= cmd_base_addr_cf; cmd_buffer_size <= cmd_buffer_size_cf / BYTES_PER_WORD; @@ -1046,7 +1053,7 @@ module axis_replay #( // If read_count is 0, then the next word is also the last word if (read_count == 0) begin play_fifo_i_tlast <= 1'b1; - eob <= last_trans; + eob <= last_trans & cmd_eob; end end @@ -1075,7 +1082,7 @@ module axis_replay #( // case it's both the last word of the packet and the end of the burst. if (last_trans && read_counter == 1) begin play_fifo_i_tlast <= 1'b1; - eob <= 1; + eob <= cmd_eob; // Next, check if this is the last word of the packet according to packet // length. But note that the next word won't be the last if we're already diff --git a/lib/rfnoc/blocks/rfnoc_block_replay/rfnoc_block_replay_regs.vh b/lib/rfnoc/blocks/rfnoc_block_replay/rfnoc_block_replay_regs.vh index a04c9f2..26143fa 100644 --- a/lib/rfnoc/blocks/rfnoc_block_replay/rfnoc_block_replay_regs.vh +++ b/lib/rfnoc/blocks/rfnoc_block_replay/rfnoc_block_replay_regs.vh @@ -153,6 +153,9 @@ localparam REG_CMD_TIME_LEN = 64; // // [31] : Timed flag. Indicates if the command is timed (1) or not (0). // +// [30] : No EOB flag. Indicates if EOB should be set at the end of the +// command execution (0) or not (1). +// // [1:0] : Command field. The command indicates what you want the playback to // do. It can be one of the following: // @@ -165,6 +168,9 @@ localparam REG_PLAY_CMD = 'h48; localparam REG_PLAY_TIMED_POS = 31; localparam REG_PLAY_TIMED_LEN = 1; // +localparam REG_PLAY_NO_EOB_POS = 30; +localparam REG_PLAY_NO_EOB_LEN = 1; +// localparam REG_PLAY_CMD_POS = 0; localparam REG_PLAY_CMD_LEN = 2;