@@ -21,6 +21,7 @@ module redmule_memory_scheduler
21
21
input ctrl_regfile_t reg_file_i ,
22
22
input flgs_streamer_t flgs_streamer_i ,
23
23
input cntrl_scheduler_t cntrl_scheduler_i,
24
+ input cntrl_flags_t cntrl_flags_i ,
24
25
output cntrl_streamer_t cntrl_streamer_o
25
26
);
26
27
localparam int unsigned JMP = NumByte* (DATA_W / MemDw - 1 );
@@ -123,60 +124,55 @@ module redmule_memory_scheduler
123
124
124
125
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 ;
125
126
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 ;
180
176
181
177
assign cntrl_streamer_o.input_cast_src_fmt = fpnew_pkg :: fp_format_e ' (reg_file_i.hwpe_params[OP_SELECTION ][15 : 13 ]);
182
178
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