Skip to content

Commit 02e7782

Browse files
author
Andrea Belano
committed
[treewide] Enable different RedMulE instances to share streams
1 parent 84f7317 commit 02e7782

File tree

7 files changed

+151
-9
lines changed

7 files changed

+151
-9
lines changed

Bender.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ sources:
5252
- rtl/redmule_reduction_unit.sv
5353
- rtl/redmule_mux.sv
5454

55-
- target: redmule_hwpe
55+
- target: redmule_test_hwpe
5656
files:
5757
- rtl/redmule_wrap.sv
5858

rtl/redmule_memory_scheduler.sv

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,4 +286,7 @@ module redmule_memory_scheduler
286286
assign cntrl_streamer_o.output_cast_dst_fmt = fpnew_pkg::fp_format_e'(reg_file_i.hwpe_params[OP_SELECTION][15:13]);
287287

288288
assign cntrl_streamer_o.z_priority = z_priority_i;
289+
290+
assign cntrl_streamer_o.receive_w_stream = reg_file_i.hwpe_params[STREAM_CONF][0];
291+
assign cntrl_streamer_o.receive_x_stream = reg_file_i.hwpe_params[STREAM_CONF][2];
289292
endmodule : redmule_memory_scheduler

rtl/redmule_pkg.sv

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,10 @@ package redmule_pkg;
4646
parameter int unsigned MCFIG0 = 3; // 0x0C --> [31:16] -> K size, [15: 0] -> M size
4747
parameter int unsigned MCFIG1 = 4; // 0x10 --> [31: 0] -> N Size
4848
// Matrix arithmetic config register
49+
// [20:20] -> Send X stream
50+
// [19:19] -> Receive X stream
51+
// [18:18] -> Send W stream
52+
// [17:17] -> Receive W stream
4953
// [16:16] -> Reduction initialization
5054
// [15:14] -> Reduction operation
5155
// [13:13] -> PACE mode selection
@@ -103,10 +107,17 @@ package redmule_pkg;
103107
// [0:0] -> init enable
104108
parameter int unsigned R_CONF = 22; // 0x58
105109

110+
// X/W Streams configuration
111+
// [3:3] -> Send X
112+
// [2:2] -> Receive X
113+
// [1:1] -> Send W
114+
// [0:0] -> Receive W
115+
parameter int unsigned STREAM_CONF = 23; // 0x5C
116+
106117
`ifdef PACE_ENABLED
107-
parameter int unsigned PACE_IN_ADDR = 23; // 0x5C
108-
parameter int unsigned PACE_OUT_ADDR = 24; // 0x60
109-
parameter int unsigned PACE_D0_LENGTH = 25; // 0x68
118+
parameter int unsigned PACE_IN_ADDR = 24; // 0x60
119+
parameter int unsigned PACE_OUT_ADDR = 25; // 0x68
120+
parameter int unsigned PACE_D0_LENGTH = 26; // 0x6C
110121
`endif
111122

112123
parameter bit[6:0] MCNFIG = 7'b0001011; // 0x0B
@@ -161,6 +172,8 @@ package redmule_pkg;
161172
fpnew_pkg::fp_format_e output_cast_dst_fmt;
162173
logic z_priority;
163174
logic pace_mode;
175+
logic receive_w_stream;
176+
logic receive_x_stream;
164177
`ifdef PACE_ENABLED
165178
hci_package::hci_streamer_ctrl_t pace_stream_source_ctrl;
166179
hci_package::hci_streamer_ctrl_t pace_stream_sink_ctrl;
@@ -367,6 +380,10 @@ package redmule_pkg;
367380
logic [31:0] r_addr;
368381
logic red_init;
369382
red_op_t red_op;
383+
logic send_w;
384+
logic receive_w;
385+
logic send_x;
386+
logic receive_x;
370387
} redmule_config_t;
371388

372389
typedef enum {

rtl/redmule_streamer.sv

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -399,7 +399,9 @@ assign source_ctrl[RsourceStreamId] = ctrl_i.r_stream_source_ctrl;
399399

400400
for (genvar i = 0; i < NumStreamSources; i++) begin: gen_tcdm2stream
401401

402-
hci_core_assign i_load_assign ( .tcdm_target (load_fifo_d[i]), .tcdm_initiator (virt_tcdm[i]) );
402+
logic source_enable;
403+
404+
hci_core_assign i_load_assign ( .tcdm_target (load_fifo_d[i]), .tcdm_initiator (virt_tcdm[i]) );
403405

404406
hci_core_fifo #(
405407
.FIFO_DEPTH ( 4 ), // to avoid protocol violations, as the consumer has a throughput
@@ -453,6 +455,13 @@ for (genvar i = 0; i < NumStreamSources; i++) begin: gen_tcdm2stream
453455
assign load_fifo_q[i].ecc = tcdm_cast[i].ecc;
454456
assign tcdm_cast[i].r_ecc = load_fifo_q[i].r_ecc;
455457

458+
if (i == WsourceStreamId) begin
459+
assign source_enable = enable_i & ~ctrl_i.receive_w_stream;
460+
end else if (i == XsourceStreamId) begin
461+
assign source_enable = enable_i & ~ctrl_i.receive_x_stream;
462+
end else begin
463+
assign source_enable = enable_i;
464+
end
456465

457466
hci_core_source #(
458467
.MISALIGNED_ACCESSES ( REALIGN ),
@@ -462,7 +471,7 @@ for (genvar i = 0; i < NumStreamSources; i++) begin: gen_tcdm2stream
462471
.rst_ni ( rst_ni ),
463472
.test_mode_i ( test_mode_i ),
464473
.clear_i ( clear_i ),
465-
.enable_i ( enable_i ),
474+
.enable_i ( source_enable ),
466475
.tcdm ( tcdm_cast[i] ),
467476
.stream ( out_stream[i] ),
468477
.ctrl_i ( source_ctrl[i] ),

rtl/redmule_tiler.sv

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,10 @@ assign config_d.gemm_output_fmt = gemm_fmt_e'(reg_file_i.hwpe_params[MACFG][ 9:
6363
assign config_d.r_addr = reg_file_i.hwpe_params[R_ADDR_R];
6464
assign config_d.red_init = reg_file_i.hwpe_params[MACFG][16];
6565
assign config_d.red_op = red_op_t'(reg_file_i.hwpe_params[MACFG][15:14]);
66+
assign config_d.receive_w = reg_file_i.hwpe_params[MACFG][17];
67+
assign config_d.send_w = reg_file_i.hwpe_params[MACFG][18];
68+
assign config_d.receive_x = reg_file_i.hwpe_params[MACFG][19];
69+
assign config_d.send_x = reg_file_i.hwpe_params[MACFG][20];
6670

6771
// Calculating the number of iterations alng the two dimensions of the X matrix
6872
logic [15:0] x_rows_iter_nolftovr;
@@ -281,6 +285,10 @@ assign reg_file_o.hwpe_params[K_SIZE] = config_d.k_size;
281285
assign reg_file_o.hwpe_params[R_ADDR] = config_d.r_addr;
282286
assign reg_file_o.hwpe_params[R_CONF][0] = config_d.red_init;
283287
assign reg_file_o.hwpe_params[R_CONF][2:1] = config_d.red_op;
288+
assign reg_file_o.hwpe_params[STREAM_CONF][0] = config_d.receive_w;
289+
assign reg_file_o.hwpe_params[STREAM_CONF][1] = config_d.send_w;
290+
assign reg_file_o.hwpe_params[STREAM_CONF][2] = config_d.receive_x;
291+
assign reg_file_o.hwpe_params[STREAM_CONF][3] = config_d.send_x;
284292
`ifdef PACE_ENABLED
285293
assign reg_file_o.hwpe_params[OP_SELECTION][ 9: 2] = '0;
286294
assign reg_file_o.hwpe_params[OP_SELECTION][0] = config_q.gemm_selection;

rtl/redmule_top.sv

Lines changed: 45 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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 ) );
106115
hwpe_stream_intf_stream #( .DATA_WIDTH ( DATAW_ALIGN ) ) x_buffer_d ( .clk( clk_i ) );
107116
hwpe_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 ) );
110120
hwpe_stream_intf_stream #( .DATA_WIDTH ( DATAW_ALIGN ) ) w_buffer_d ( .clk( clk_i ) );
111121
hwpe_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+
168210
hwpe_stream_fifo #(
169211
.DATA_WIDTH ( DATAW_ALIGN ),
170212
.FIFO_DEPTH ( 4 )
@@ -331,7 +373,7 @@ redmule_z_buffer #(
331373
cntrl_red_t red_ctrl;
332374

333375
assign 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]);
335377
assign red_ctrl.load = reg_file.hwpe_params[R_CONF][0];
336378
assign red_ctrl.enable = busy_o;
337379
assign red_ctrl.ready = red_out_q.ready;

rtl/redmule_wrap.sv

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,65 @@ logic [N_CORES-1:0][1:0] evt;
184184
assign periph_r_id_o = periph.r_id;
185185
`endif
186186

187+
hwpe_stream_intf_stream #( .DATA_WIDTH ( DATAW ) ) w_stream_i ( .clk( clk_i ) );
188+
hwpe_stream_intf_stream #( .DATA_WIDTH ( DATAW ) ) w_stream_o ( .clk( clk_i ) );
189+
hwpe_stream_intf_stream #( .DATA_WIDTH ( DATAW ) ) x_stream_i ( .clk( clk_i ) );
190+
hwpe_stream_intf_stream #( .DATA_WIDTH ( DATAW ) ) x_stream_o ( .clk( clk_i ) );
191+
192+
logic w_stream_ready, x_stream_ready;
193+
logic w_stream_valid, x_stream_valid;
194+
195+
assign w_stream_i.valid = w_stream_valid;
196+
assign w_stream_i.data = '1;
197+
assign w_stream_i.strb = '1;
198+
199+
assign x_stream_i.valid = x_stream_valid;
200+
assign x_stream_i.data = '1;
201+
assign x_stream_i.strb = '1;
202+
203+
assign w_stream_o.ready = w_stream_ready;
204+
assign x_stream_o.ready = x_stream_ready;
205+
206+
always_ff @(posedge clk_i, negedge rst_ni) begin
207+
if (~rst_ni) begin
208+
w_stream_valid <= '0;
209+
end else begin
210+
if (w_stream_i.ready && w_stream_i.valid || ~w_stream_i.valid) begin
211+
w_stream_valid <= $urandom_range(1, 0);
212+
end
213+
end
214+
end
215+
216+
always_ff @(posedge clk_i, negedge rst_ni) begin
217+
if (~rst_ni) begin
218+
x_stream_valid <= '0;
219+
end else begin
220+
if (x_stream_i.ready && x_stream_i.valid || ~x_stream_o.valid) begin
221+
x_stream_valid <= $urandom_range(1, 0);
222+
end
223+
end
224+
end
225+
226+
always_ff @(posedge clk_i, negedge rst_ni) begin
227+
if (~rst_ni) begin
228+
w_stream_ready <= '0;
229+
end else begin
230+
if (w_stream_o.ready && w_stream_o.valid || ~w_stream_o.ready) begin
231+
w_stream_ready <= $urandom_range(1, 0);
232+
end
233+
end
234+
end
235+
236+
always_ff @(posedge clk_i, negedge rst_ni) begin
237+
if (~rst_ni) begin
238+
x_stream_ready <= '0;
239+
end else begin
240+
if (x_stream_o.ready && x_stream_o.valid || ~x_stream_o.ready) begin
241+
x_stream_ready <= $urandom_range(1, 0);
242+
end
243+
end
244+
end
245+
187246
redmule_top #(
188247
.ID_WIDTH ( ID_WIDTH ),
189248
.N_CORES ( N_CORES ),
@@ -198,6 +257,10 @@ redmule_top #(
198257
.test_mode_i ( test_mode_i ),
199258
.evt_o ( evt_o ),
200259
.busy_o ( busy_o ),
260+
.w_stream_i ( w_stream_i ),
261+
.w_stream_o ( w_stream_o ),
262+
.x_stream_i ( x_stream_i ),
263+
.x_stream_o ( x_stream_o ),
201264
.tcdm ( tcdm ),
202265
.periph ( periph )
203266
);

0 commit comments

Comments
 (0)