@@ -21,6 +21,7 @@ module redmule_memory_scheduler
2121 input ctrl_regfile_t reg_file_i ,
2222 input flgs_streamer_t flgs_streamer_i ,
2323 input cntrl_scheduler_t cntrl_scheduler_i,
24+ input cntrl_flags_t cntrl_flags_i ,
2425 output cntrl_streamer_t cntrl_streamer_o
2526);
2627 localparam int unsigned JMP = NumByte* (DATA_W / MemDw - 1 );
@@ -123,60 +124,55 @@ module redmule_memory_scheduler
123124
124125 assign num_x_reads = x_rows_iters_q == reg_file_i.hwpe_params[X_ITERS ][31 : 16 ]- 1 && reg_file_i.hwpe_params[LEFTOVERS ][31 : 24 ] != '0 ? reg_file_i.hwpe_params[LEFTOVERS ][31 : 24 ] : W ;
125126
126- always_comb begin : address_gen_signals
127- // Here we initialize the streamer source signals
128- // for the X stream source
129- cntrl_streamer_o.x_stream_source_ctrl.addressgen_ctrl.base_addr = reg_file_i.hwpe_params[X_ADDR ]
130- + x_rows_offs_q + x_cols_offs_q;
131- cntrl_streamer_o.x_stream_source_ctrl.addressgen_ctrl.tot_len = num_x_reads;
132- cntrl_streamer_o.x_stream_source_ctrl.addressgen_ctrl.d0_len = 'd1 ;
133- cntrl_streamer_o.x_stream_source_ctrl.addressgen_ctrl.d0_stride = 'd0 ;
134- cntrl_streamer_o.x_stream_source_ctrl.addressgen_ctrl.d1_len = W ;
135- cntrl_streamer_o.x_stream_source_ctrl.addressgen_ctrl.d1_stride = reg_file_i.hwpe_params[X_D1_STRIDE ];
136- cntrl_streamer_o.x_stream_source_ctrl.addressgen_ctrl.d2_stride = '0 ;
137- cntrl_streamer_o.x_stream_source_ctrl.addressgen_ctrl.dim_enable_1h = 2'b11 ;
138-
139- // Here we initialize the streamer source signals
140- // for the W stream source
141- cntrl_streamer_o.w_stream_source_ctrl.addressgen_ctrl.base_addr = reg_file_i.hwpe_params[W_ADDR ];
142- cntrl_streamer_o.w_stream_source_ctrl.addressgen_ctrl.tot_len = reg_file_i.hwpe_params[W_TOT_LEN ];
143- cntrl_streamer_o.w_stream_source_ctrl.addressgen_ctrl.d0_len = reg_file_i.hwpe_params[W_ITERS ][31 : 16 ];
144- cntrl_streamer_o.w_stream_source_ctrl.addressgen_ctrl.d0_stride = reg_file_i.hwpe_params[W_D0_STRIDE ];
145- cntrl_streamer_o.w_stream_source_ctrl.addressgen_ctrl.d1_len = reg_file_i.hwpe_params[W_ITERS ][15 : 0 ];
146- cntrl_streamer_o.w_stream_source_ctrl.addressgen_ctrl.d1_stride = JMP ;
147- cntrl_streamer_o.w_stream_source_ctrl.addressgen_ctrl.d2_stride = 'd0 ;
148- cntrl_streamer_o.w_stream_source_ctrl.addressgen_ctrl.dim_enable_1h = 2'b11 ;
149-
150- // Here we initialize the streamer source signals
151- // for the Y stream source
152- cntrl_streamer_o.y_stream_source_ctrl.addressgen_ctrl.base_addr = reg_file_i.hwpe_params[Z_ADDR ];
153- cntrl_streamer_o.y_stream_source_ctrl.addressgen_ctrl.tot_len = reg_file_i.hwpe_params[Z_TOT_LEN ];
154- cntrl_streamer_o.y_stream_source_ctrl.addressgen_ctrl.d0_len = W ;
155- cntrl_streamer_o.y_stream_source_ctrl.addressgen_ctrl.d0_stride = reg_file_i.hwpe_params[Z_D0_STRIDE ];
156- cntrl_streamer_o.y_stream_source_ctrl.addressgen_ctrl.d1_len = reg_file_i.hwpe_params[W_ITERS ][15 : 0 ];
157- cntrl_streamer_o.y_stream_source_ctrl.addressgen_ctrl.d1_stride = JMP ;
158- cntrl_streamer_o.y_stream_source_ctrl.addressgen_ctrl.d2_stride = reg_file_i.hwpe_params[Z_D2_STRIDE ];
159- cntrl_streamer_o.y_stream_source_ctrl.addressgen_ctrl.dim_enable_1h = 2'b11 ;
160-
161- // Here we initialize the streamer sink signals for
162- // the Z stream sink
163- cntrl_streamer_o.z_stream_sink_ctrl.addressgen_ctrl.base_addr = reg_file_i.hwpe_params[Z_ADDR ];
164- cntrl_streamer_o.z_stream_sink_ctrl.addressgen_ctrl.tot_len = reg_file_i.hwpe_params[Z_TOT_LEN ];
165- cntrl_streamer_o.z_stream_sink_ctrl.addressgen_ctrl.d0_len = W ;
166- cntrl_streamer_o.z_stream_sink_ctrl.addressgen_ctrl.d0_stride = reg_file_i.hwpe_params[Z_D0_STRIDE ];
167- cntrl_streamer_o.z_stream_sink_ctrl.addressgen_ctrl.d1_len = reg_file_i.hwpe_params[W_ITERS ][15 : 0 ];
168- cntrl_streamer_o.z_stream_sink_ctrl.addressgen_ctrl.d1_stride = JMP ;
169- cntrl_streamer_o.z_stream_sink_ctrl.addressgen_ctrl.d2_stride = reg_file_i.hwpe_params[Z_D2_STRIDE ];
170- cntrl_streamer_o.z_stream_sink_ctrl.addressgen_ctrl.dim_enable_1h = 2'b11 ;
171- end
172-
173- always_comb begin : req_start_assignment
174- cntrl_streamer_o.x_stream_source_ctrl.req_start = (cntrl_scheduler_i.first_load || tot_x_read_q < reg_file_i.hwpe_params[TOT_X_READ ]) &&
175- flgs_streamer_i.x_stream_source_flags.ready_start;
176- cntrl_streamer_o.w_stream_source_ctrl.req_start = cntrl_scheduler_i.first_load && flgs_streamer_i.z_stream_sink_flags.ready_start;
177- cntrl_streamer_o.y_stream_source_ctrl.req_start = cntrl_scheduler_i.first_load && reg_file_i.hwpe_params[OP_SELECTION ][0 ] && flgs_streamer_i.y_stream_source_flags.ready_start;
178- cntrl_streamer_o.z_stream_sink_ctrl.req_start = cntrl_scheduler_i.first_load && flgs_streamer_i.z_stream_sink_flags.ready_start;
179- end
127+ // Here we initialize the streamer source signals
128+ // for the X stream source
129+ assign cntrl_streamer_o.x_stream_source_ctrl.req_start = ! cntrl_flags_i.idle && flgs_streamer_i.x_stream_source_flags.ready_start &&
130+ (cntrl_scheduler_i.first_load || tot_x_read_q < reg_file_i.hwpe_params[TOT_X_READ ]);
131+ assign cntrl_streamer_o.x_stream_source_ctrl.addressgen_ctrl.base_addr = reg_file_i.hwpe_params[X_ADDR ]
132+ + x_rows_offs_q + x_cols_offs_q;
133+ assign cntrl_streamer_o.x_stream_source_ctrl.addressgen_ctrl.tot_len = num_x_reads;
134+ assign cntrl_streamer_o.x_stream_source_ctrl.addressgen_ctrl.d0_len = 'd1 ;
135+ assign cntrl_streamer_o.x_stream_source_ctrl.addressgen_ctrl.d0_stride = 'd0 ;
136+ assign cntrl_streamer_o.x_stream_source_ctrl.addressgen_ctrl.d1_len = W ;
137+ assign cntrl_streamer_o.x_stream_source_ctrl.addressgen_ctrl.d1_stride = reg_file_i.hwpe_params[X_D1_STRIDE ];
138+ assign cntrl_streamer_o.x_stream_source_ctrl.addressgen_ctrl.d2_stride = '0 ;
139+ assign cntrl_streamer_o.x_stream_source_ctrl.addressgen_ctrl.dim_enable_1h = 2'b11 ;
140+
141+ // Here we initialize the streamer source signals
142+ // for the W stream source
143+ assign cntrl_streamer_o.w_stream_source_ctrl.req_start = cntrl_scheduler_i.first_load && flgs_streamer_i.z_stream_sink_flags.ready_start;
144+ assign cntrl_streamer_o.w_stream_source_ctrl.addressgen_ctrl.base_addr = reg_file_i.hwpe_params[W_ADDR ];
145+ assign cntrl_streamer_o.w_stream_source_ctrl.addressgen_ctrl.tot_len = reg_file_i.hwpe_params[W_TOT_LEN ];
146+ assign cntrl_streamer_o.w_stream_source_ctrl.addressgen_ctrl.d0_len = reg_file_i.hwpe_params[W_ITERS ][31 : 16 ];
147+ assign cntrl_streamer_o.w_stream_source_ctrl.addressgen_ctrl.d0_stride = reg_file_i.hwpe_params[W_D0_STRIDE ];
148+ assign cntrl_streamer_o.w_stream_source_ctrl.addressgen_ctrl.d1_len = reg_file_i.hwpe_params[W_ITERS ][15 : 0 ];
149+ assign cntrl_streamer_o.w_stream_source_ctrl.addressgen_ctrl.d1_stride = JMP ;
150+ assign cntrl_streamer_o.w_stream_source_ctrl.addressgen_ctrl.d2_stride = 'd0 ;
151+ assign cntrl_streamer_o.w_stream_source_ctrl.addressgen_ctrl.dim_enable_1h = 2'b11 ;
152+
153+ // Here we initialize the streamer source signals
154+ // for the Y stream source
155+ assign cntrl_streamer_o.y_stream_source_ctrl.req_start = cntrl_scheduler_i.first_load && reg_file_i.hwpe_params[OP_SELECTION ][0 ] && flgs_streamer_i.y_stream_source_flags.ready_start;
156+ assign cntrl_streamer_o.y_stream_source_ctrl.addressgen_ctrl.base_addr = reg_file_i.hwpe_params[Z_ADDR ];
157+ assign cntrl_streamer_o.y_stream_source_ctrl.addressgen_ctrl.tot_len = reg_file_i.hwpe_params[Z_TOT_LEN ];
158+ assign cntrl_streamer_o.y_stream_source_ctrl.addressgen_ctrl.d0_len = W ;
159+ assign cntrl_streamer_o.y_stream_source_ctrl.addressgen_ctrl.d0_stride = reg_file_i.hwpe_params[Z_D0_STRIDE ];
160+ assign cntrl_streamer_o.y_stream_source_ctrl.addressgen_ctrl.d1_len = reg_file_i.hwpe_params[W_ITERS ][15 : 0 ];
161+ assign cntrl_streamer_o.y_stream_source_ctrl.addressgen_ctrl.d1_stride = JMP ;
162+ assign cntrl_streamer_o.y_stream_source_ctrl.addressgen_ctrl.d2_stride = reg_file_i.hwpe_params[Z_D2_STRIDE ];
163+ assign cntrl_streamer_o.y_stream_source_ctrl.addressgen_ctrl.dim_enable_1h = 2'b11 ;
164+
165+ // Here we initialize the streamer sink signals for
166+ // the Z stream sink
167+ assign cntrl_streamer_o.z_stream_sink_ctrl.req_start = cntrl_scheduler_i.first_load && flgs_streamer_i.z_stream_sink_flags.ready_start;
168+ assign cntrl_streamer_o.z_stream_sink_ctrl.addressgen_ctrl.base_addr = reg_file_i.hwpe_params[Z_ADDR ];
169+ assign cntrl_streamer_o.z_stream_sink_ctrl.addressgen_ctrl.tot_len = reg_file_i.hwpe_params[Z_TOT_LEN ];
170+ assign cntrl_streamer_o.z_stream_sink_ctrl.addressgen_ctrl.d0_len = W ;
171+ assign cntrl_streamer_o.z_stream_sink_ctrl.addressgen_ctrl.d0_stride = reg_file_i.hwpe_params[Z_D0_STRIDE ];
172+ assign cntrl_streamer_o.z_stream_sink_ctrl.addressgen_ctrl.d1_len = reg_file_i.hwpe_params[W_ITERS ][15 : 0 ];
173+ assign cntrl_streamer_o.z_stream_sink_ctrl.addressgen_ctrl.d1_stride = JMP ;
174+ assign cntrl_streamer_o.z_stream_sink_ctrl.addressgen_ctrl.d2_stride = reg_file_i.hwpe_params[Z_D2_STRIDE ];
175+ assign cntrl_streamer_o.z_stream_sink_ctrl.addressgen_ctrl.dim_enable_1h = 2'b11 ;
180176
181177 assign cntrl_streamer_o.input_cast_src_fmt = fpnew_pkg :: fp_format_e ' (reg_file_i.hwpe_params[OP_SELECTION ][15 : 13 ]);
182178 assign cntrl_streamer_o.input_cast_dst_fmt = fpnew_pkg :: fp_format_e ' (reg_file_i.hwpe_params[OP_SELECTION ][12 : 10 ]);
0 commit comments