Skip to content

Commit

Permalink
Add stream_join_dynamic
Browse files Browse the repository at this point in the history
  • Loading branch information
colluca committed Sep 19, 2023
1 parent 3b99511 commit 3cdc1ec
Show file tree
Hide file tree
Showing 5 changed files with 60 additions and 12 deletions.
3 changes: 2 additions & 1 deletion Bender.yml
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ sources:
- src/stream_filter.sv
- src/stream_fork.sv
- src/stream_intf.sv
- src/stream_join.sv
- src/stream_join_dynamic.sv
- src/stream_mux.sv
- src/stream_throttle.sv
- src/lossy_valid_to_stream.sv
Expand Down Expand Up @@ -84,6 +84,7 @@ sources:
- src/stream_delay.sv
- src/stream_fifo.sv
- src/stream_fork_dynamic.sv
- src/stream_join.sv
- src/clk_mux_glitch_free.sv
# Level 2
- src/cdc_reset_ctrlr.sv
Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ Please note that cells with status *deprecated* are not to be used for new desig
| `stream_demux` | Ready/valid interface demultiplexer | active | |
| `lossy_valid_to_stream` | Convert Valid-only to ready/valid by updating in-flight transaction | active | |
| `stream_join` | Ready/valid handshake join multiple to one common | active | |
| `stream_join_dynamic` | Ready/valid handshake join multiple to one common, dynamically configurable subset selection | active | |
| `stream_mux` | Ready/valid interface multiplexer | active | |
| `stream_register` | Register with ready/valid interface | active | |
| `stream_fork` | Ready/valid fork | active | |
Expand Down
20 changes: 9 additions & 11 deletions src/stream_join.sv
Original file line number Diff line number Diff line change
Expand Up @@ -28,16 +28,14 @@ module stream_join #(
input logic oup_ready_i
);

assign oup_valid_o = (&inp_valid_i);
for (genvar i = 0; i < N_INP; i++) begin : gen_inp_ready
assign inp_ready_o[i] = oup_valid_o & oup_ready_i;
end
stream_join_dynamic #(
.N_INP(N_INP)
) i_stream_join_dynamic (
.inp_valid_i(inp_valid_i),
.inp_ready_o(inp_ready_o),
.sel_i ({N_INP{1'b1}}),
.oup_valid_o(oup_valid_o),
.oup_ready_i(oup_ready_i)
);

// pragma translate_off
`ifndef VERILATOR
initial begin: p_assertions
assert (N_INP >= 1) else $fatal(1, "N_INP must be at least 1!");
end
`endif
// pragma translate_on
endmodule
47 changes: 47 additions & 0 deletions src/stream_join_dynamic.sv
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
// Copyright 2020 ETH Zurich and University of Bologna.
// Copyright and related rights are licensed under the Solderpad Hardware
// License, Version 0.51 (the "License"); you may not use this file except in
// compliance with the License. You may obtain a copy of the License at
// http://solderpad.org/licenses/SHL-0.51. Unless required by applicable law
// or agreed to in writing, software, hardware and materials distributed under
// this License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
// CONDITIONS OF ANY KIND, either express or implied. See the License for the
// specific language governing permissions and limitations under the License.

// Authors:
// - Luca Colagrande <[email protected]>

// Stream join dynamic: Joins a parametrizable number of input streams (i.e. valid-ready
// handshaking with dependency rules as in AXI4) to a single output stream. The subset of streams
// to join can be configured dynamically via `sel_i`. The output handshake happens only after
// there has been a handshake. The data channel flows outside of this module.
module stream_join_dynamic #(
/// Number of input streams
parameter int unsigned N_INP = 32'd0 // Synopsys DC requires a default value for parameters.
) (
/// Input streams valid handshakes
input logic [N_INP-1:0] inp_valid_i,
/// Input streams ready handshakes
output logic [N_INP-1:0] inp_ready_o,
/// Selection mask for the output handshake
input logic [N_INP-1:0] sel_i,
/// Output stream valid handshake
output logic oup_valid_o,
/// Output stream ready handshake
input logic oup_ready_i
);

// Corner case when `sel_i` is all 0s should not generate valid
assign oup_valid_o = &(inp_valid_i | ~sel_i) && |sel_i;
for (genvar i = 0; i < N_INP; i++) begin : gen_inp_ready
assign inp_ready_o[i] = oup_valid_o & oup_ready_i;
end

// pragma translate_off
`ifndef VERILATOR
initial begin: p_assertions
assert (N_INP >= 1) else $fatal(1, "N_INP must be at least 1!");
end
`endif
// pragma translate_on
endmodule
1 change: 1 addition & 0 deletions src_files.yml
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ common_cells_all:
- src/stream_fork.sv
- src/stream_intf.sv
- src/stream_join.sv
- src/stream_join_dynamic.sv
- src/stream_mux.sv
- src/stream_throttle.sv
- src/sub_per_hash.sv
Expand Down

0 comments on commit 3cdc1ec

Please sign in to comment.