@@ -35,6 +35,14 @@ module redmule_top
3535 input logic test_mode_i,
3636 output logic busy_o ,
3737 output logic [N_CORES - 1 : 0 ][1 : 0 ] evt_o ,
38+ // External W stream
39+ hwpe_stream_intf_stream.sink w_stream_i ,
40+ // External X stream
41+ hwpe_stream_intf_stream.sink x_stream_i ,
42+ // Broadcasted W stream
43+ hwpe_stream_intf_stream.source w_stream_o ,
44+ // Broadcasted X stream
45+ hwpe_stream_intf_stream.source x_stream_o ,
3846 // Periph slave port for the controller side
3947 hwpe_ctrl_intf_periph.slave periph,
4048 // TCDM master ports for the memory side
@@ -103,10 +111,12 @@ flgs_red_t red_flags;
103111// Implementation of the incoming and outgoing streaming interfaces (one for each kind of data)
104112
105113// X streaming interface + X FIFO interface
114+ hwpe_stream_intf_stream # ( .DATA_WIDTH ( DATAW_ALIGN ) ) x_stream_str ( .clk ( clk_i ) );
106115hwpe_stream_intf_stream # ( .DATA_WIDTH ( DATAW_ALIGN ) ) x_buffer_d ( .clk ( clk_i ) );
107116hwpe_stream_intf_stream # ( .DATA_WIDTH ( DATAW_ALIGN ) ) x_buffer_fifo ( .clk ( clk_i ) );
108117
109118// W streaming interface + W FIFO interface
119+ hwpe_stream_intf_stream # ( .DATA_WIDTH ( DATAW_ALIGN ) ) w_stream_str ( .clk ( clk_i ) );
110120hwpe_stream_intf_stream # ( .DATA_WIDTH ( DATAW_ALIGN ) ) w_buffer_d ( .clk ( clk_i ) );
111121hwpe_stream_intf_stream # ( .DATA_WIDTH ( DATAW_ALIGN ) ) w_buffer_fifo ( .clk ( clk_i ) );
112122
@@ -147,8 +157,8 @@ redmule_streamer #(
147157 .enable_i ( 1'b1 ),
148158 .clear_i ( clear ),
149159 // Source interfaces for the incoming streams
150- .x_stream_o ( x_buffer_d ),
151- .w_stream_o ( w_buffer_d ),
160+ .x_stream_o ( x_stream_str ),
161+ .w_stream_o ( w_stream_str ),
152162 .y_stream_o ( y_buffer_d ),
153163 .r_stream_o ( red_init_d ),
154164 // Sink interface for the outgoing stream
@@ -165,6 +175,38 @@ redmule_streamer #(
165175 .flags_o ( flgs_streamer )
166176);
167177
178+ logic w_sel;
179+ logic w_send;
180+
181+ assign w_sel = reg_file.hwpe_params[STREAM_CONF ][0 ];
182+ assign w_send = reg_file.hwpe_params[STREAM_CONF ][1 ];
183+
184+ assign w_buffer_d.valid = ((w_sel) ? w_stream_i.valid : w_stream_str.valid) && ((w_send) ? w_stream_o.ready && w_buffer_d.ready : 1'b1 );
185+ assign w_buffer_d.data = (w_sel) ? w_stream_i.data : w_stream_str.data;
186+ assign w_buffer_d.strb = (w_sel) ? w_stream_i.strb : w_stream_str.strb;
187+ assign w_stream_str.ready = (w_sel) ? 1'b0 : w_buffer_d.ready && ((w_send) ? w_stream_o.ready : 1'b1 );
188+ assign w_stream_i.ready = (w_sel) ? w_buffer_d.ready : 1'b0 ;
189+
190+ assign w_stream_o.valid = (w_send) ? w_buffer_d.valid : 1'b0 ;
191+ assign w_stream_o.data = (w_send) ? w_buffer_d.data : '0 ;
192+ assign w_stream_o.strb = (w_send) ? w_buffer_d.strb : '0 ;
193+
194+ logic x_sel;
195+ logic x_send;
196+
197+ assign x_sel = reg_file.hwpe_params[STREAM_CONF ][2 ];
198+ assign x_send = reg_file.hwpe_params[STREAM_CONF ][3 ];
199+
200+ assign x_buffer_d.valid = ((x_sel) ? x_stream_i.valid : x_stream_str.valid) && ((x_send) ? x_stream_o.ready && x_buffer_d.ready : 1'b1 );
201+ assign x_buffer_d.data = (x_sel) ? x_stream_i.data : x_stream_str.data;
202+ assign x_buffer_d.strb = (x_sel) ? x_stream_i.strb : x_stream_str.strb;
203+ assign x_stream_str.ready = (x_sel) ? 1'b0 : x_buffer_d.ready && ((x_send) ? x_stream_o.ready : 1'b1 );
204+ assign x_stream_i.ready = (x_sel) ? x_buffer_d.ready : 1'b0 ;
205+
206+ assign x_stream_o.valid = (x_send) ? x_buffer_d.valid : 1'b0 ;
207+ assign x_stream_o.data = (x_send) ? x_buffer_d.data : '0 ;
208+ assign x_stream_o.strb = (x_send) ? x_buffer_d.strb : '0 ;
209+
168210hwpe_stream_fifo # (
169211 .DATA_WIDTH ( DATAW_ALIGN ),
170212 .FIFO_DEPTH ( 4 )
@@ -331,7 +373,7 @@ redmule_z_buffer #(
331373cntrl_red_t red_ctrl;
332374
333375assign red_ctrl.row_len = reg_file.hwpe_params[K_SIZE ];
334- assign red_ctrl.op = reg_file.hwpe_params[R_CONF ][2 : 1 ];
376+ assign red_ctrl.op = red_op_t ' ( reg_file.hwpe_params[R_CONF ][2 : 1 ]) ;
335377assign red_ctrl.load = reg_file.hwpe_params[R_CONF ][0 ];
336378assign red_ctrl.enable = busy_o;
337379assign red_ctrl.ready = red_out_q.ready;
0 commit comments