@@ -96,6 +96,8 @@ module axis_ram_switch #
9696 // Interface connection control
9797 // M_COUNT concatenated fields of S_COUNT bits
9898 parameter M_CONNECT = {M_COUNT{{S_COUNT{1'b1 }}}},
99+ // Update tid with routing information
100+ parameter UPDATE_TID = 0 ,
99101 // select round robin arbitration
100102 parameter ARB_TYPE_ROUND_ROBIN = 1 ,
101103 // LSB priority selection
@@ -188,6 +190,18 @@ initial begin
188190 $finish ;
189191 end
190192
193+ if (UPDATE_TID) begin
194+ if (! ID_ENABLE) begin
195+ $error("Error: UPDATE_TID set requires ID_ENABLE set (instance %m)" );
196+ $finish ;
197+ end
198+
199+ if (M_ID_WIDTH < CL_S_COUNT) begin
200+ $error("Error: M_ID_WIDTH too small for port count (instance %m)" );
201+ $finish ;
202+ end
203+ end
204+
191205 if (M_BASE == 0 ) begin
192206 // M_BASE is zero, route with tdest as port index
193207 $display ("Addressing configuration for axis_switch instance %m" );
@@ -825,16 +839,30 @@ generate
825839 );
826840
827841 // mux
828- wire [RAM_ADDR_WIDTH- 1 :0 ] cmd_addr_mux = int_cmd_addr[grant_encoded * RAM_ADDR_WIDTH + : RAM_ADDR_WIDTH] ;
829- wire [ADDR_WIDTH- 1 :0 ] cmd_len_mux = int_cmd_len[grant_encoded * ADDR_WIDTH + : ADDR_WIDTH] ;
830- wire [CMD_ADDR_WIDTH- 1 :0 ] cmd_id_mux = int_cmd_id[grant_encoded * CMD_ADDR_WIDTH + : CMD_ADDR_WIDTH] ;
831- wire [KEEP_WIDTH- 1 :0 ] cmd_tkeep_mux = int_cmd_tkeep[grant_encoded * KEEP_WIDTH + : KEEP_WIDTH] ;
832- wire [M_ID_WIDTH- 1 :0 ] cmd_tid_mux = int_cmd_tid[grant_encoded * S_ID_WIDTH + : S_ID_WIDTH] ;
833- wire [M_DEST_WIDTH- 1 :0 ] cmd_tdest_mux = int_cmd_tdest[grant_encoded * S_DEST_WIDTH + : S_DEST_WIDTH] ;
834- wire [USER_WIDTH- 1 :0 ] cmd_tuser_mux = int_cmd_tuser[grant_encoded * USER_WIDTH + : USER_WIDTH] ;
835- wire cmd_valid_mux = int_cmd_valid[grant_encoded * M_COUNT + n] && grant_valid ;
842+ reg [RAM_ADDR_WIDTH- 1 :0 ] cmd_addr_mux;
843+ reg [ADDR_WIDTH- 1 :0 ] cmd_len_mux;
844+ reg [CMD_ADDR_WIDTH- 1 :0 ] cmd_id_mux;
845+ reg [KEEP_WIDTH- 1 :0 ] cmd_tkeep_mux;
846+ reg [M_ID_WIDTH- 1 :0 ] cmd_tid_mux;
847+ reg [M_DEST_WIDTH- 1 :0 ] cmd_tdest_mux;
848+ reg [USER_WIDTH- 1 :0 ] cmd_tuser_mux;
849+ reg cmd_valid_mux ;
836850 wire cmd_ready_mux;
837851
852+ always @* begin
853+ cmd_addr_mux = int_cmd_addr[grant_encoded* RAM_ADDR_WIDTH + : RAM_ADDR_WIDTH];
854+ cmd_len_mux = int_cmd_len[grant_encoded* ADDR_WIDTH + : ADDR_WIDTH];
855+ cmd_id_mux = int_cmd_id[grant_encoded* CMD_ADDR_WIDTH + : CMD_ADDR_WIDTH];
856+ cmd_tkeep_mux = int_cmd_tkeep[grant_encoded* KEEP_WIDTH + : KEEP_WIDTH];
857+ cmd_tid_mux = int_cmd_tid[grant_encoded* S_ID_WIDTH + : S_ID_WIDTH];
858+ if (UPDATE_TID && S_COUNT > 1 ) begin
859+ cmd_tid_mux[M_ID_WIDTH- 1 :M_ID_WIDTH- CL_S_COUNT] = grant_encoded;
860+ end
861+ cmd_tdest_mux = int_cmd_tdest[grant_encoded* S_DEST_WIDTH + : S_DEST_WIDTH];
862+ cmd_tuser_mux = int_cmd_tuser[grant_encoded* USER_WIDTH + : USER_WIDTH];
863+ cmd_valid_mux = int_cmd_valid[grant_encoded* M_COUNT+ n] && grant_valid;
864+ end
865+
838866 assign int_cmd_ready[n* S_COUNT + : S_COUNT] = (grant_valid && cmd_ready_mux) << grant_encoded;
839867
840868 for (m = 0 ; m < S_COUNT; m = m + 1 ) begin
0 commit comments