summaryrefslogtreecommitdiff
path: root/rtl/bus
diff options
context:
space:
mode:
authorIan M. <ian@aptel.org>2026-09-26 02:58:16 +0000
committerIan M. <ian@aptel.org>2026-09-26 02:58:40 +0000
commit789c6304aa8ef6c4ed6049c3521cb32809b219ad (patch)
tree1b53a8fa0c7d327f48a98d448523418e756833fa /rtl/bus
parent662c81b33d812a69cdbfa9a1e148ae4b73d43b90 (diff)
bus: ari: Implement ARI interconnect groundwork
Signed-off-by: Ian M. <ian@aptel.org>
Diffstat (limited to 'rtl/bus')
-rw-r--r--rtl/bus/ari_framemux.sv91
-rw-r--r--rtl/bus/ari_mainbus.sv26
-rw-r--r--rtl/bus/ari_ring.sv52
-rw-r--r--rtl/bus/ari_segment.sv33
4 files changed, 202 insertions, 0 deletions
diff --git a/rtl/bus/ari_framemux.sv b/rtl/bus/ari_framemux.sv
new file mode 100644
index 0000000..9b76a51
--- /dev/null
+++ b/rtl/bus/ari_framemux.sv
@@ -0,0 +1,91 @@
+//
+// Copyright (c) 2026, Apollo Telephone Laboratories.
+// Provided under the BSD-3 clause.
+//
+
+`include "bus/ari.svh"
+
+//
+// Represents an ARI segment frame multiplexer
+//
+// @clk_i: Clock input
+// @reset_i: Reset input
+// @ingress_i: Ingress frame input
+// @tap_i: Tap port input
+// @egress_o: Egress frame output
+//
+module ari_framemux (
+ input wire clk_i,
+ input wire reset_i,
+ input AriFrame ingress_i,
+ input AriFrame tap_i,
+
+ output AriFrame egress_o
+);
+ // Multiplexer attributes
+ parameter MUX_PERIOD = 2;
+ parameter MUX_N_INPUT = 2;
+ parameter MUX_N_STATES = (MUX_PERIOD * MUX_N_INPUT);
+
+ // Multiplexer states
+ parameter MUX_STATE_INGRESS0 = 0;
+ parameter MUX_STATE_INGRESS1 = 1;
+ parameter MUX_STATE_TAP0 = 2;
+ parameter MUX_STATE_TAP1 = 3;
+
+ // TDM selector
+ logic [2:0] mux_sel;
+
+ //
+ // Handle reset logic and time division multiplexing for
+ // frame routing. If there is nothing on the channel that
+ // is currently being selected, we are to route the other
+ // channel instead.
+ //
+ always_ff @(posedge clk_i) begin
+ if (reset_i) begin
+ mux_sel <= 0;
+ egress_o <= 0;
+ end else begin
+ case (mux_sel)
+ // TDM ingress slice
+ MUX_STATE_INGRESS0: begin
+ if (ingress_i == 0) begin
+ egress_o <= tap_i;
+ end else begin
+ egress_o <= ingress_i;
+ end
+ end
+ MUX_STATE_INGRESS1: begin
+ if (ingress_i == 0) begin
+ egress_o <= tap_i;
+ end else begin
+ egress_o <= ingress_i;
+ end
+ end
+
+ // TDM tap slice
+ MUX_STATE_TAP0: begin
+ if (tap_i == 0) begin
+ egress_o <= ingress_i;
+ end else begin
+ egress_o <= tap_i;
+ end
+ end
+ MUX_STATE_TAP1: begin
+ if (tap_i == 0) begin
+ egress_o <= ingress_i;
+ end else begin
+ egress_o <= tap_i;
+ end
+ end
+ endcase
+ end
+
+ if (!reset_i && mux_sel < MUX_N_STATES) begin
+ mux_sel <= mux_sel + 1;
+ end else if (!reset_i && mux_sel >= MUX_N_STATES) begin
+ mux_sel <= 0;
+ end
+ end
+endmodule
diff --git a/rtl/bus/ari_mainbus.sv b/rtl/bus/ari_mainbus.sv
new file mode 100644
index 0000000..225fa03
--- /dev/null
+++ b/rtl/bus/ari_mainbus.sv
@@ -0,0 +1,26 @@
+//
+// Copyright (c) 2026, Apollo Telephone Laboratories.
+// Provided under the BSD-3 clause.
+//
+
+`include "bus/ari.svh"
+
+//
+// On-chip mainbus
+//
+// @clk_i: Clock input
+// @reset_i: Reset input
+// @r_tap_i: Request taps
+//
+module ari_mainbus (
+ input wire clk_i,
+ input wire reset_i,
+ input AriFrame r_tap_i[0:ARI_SEGMENT_COUNT-1]
+);
+ // Request ring
+ ari_ring req_ring (
+ .clk_i(clk_i),
+ .reset_i(reset_i),
+ .tap_i(r_tap_i)
+ );
+endmodule
diff --git a/rtl/bus/ari_ring.sv b/rtl/bus/ari_ring.sv
new file mode 100644
index 0000000..48062c7
--- /dev/null
+++ b/rtl/bus/ari_ring.sv
@@ -0,0 +1,52 @@
+//
+// Copyright (c) 2026, Apollo Telephone Laboratories.
+// Provided under the BSD-3 clause.
+//
+
+`include "bus/ari.svh"
+
+//
+// Represents a ring of ARI segments which forms a single
+// bus channel.
+//
+// @clk_i: Clock input
+// @reset_i: Reset input
+// @tap_i: Segment taps
+//
+module ari_ring (
+ input wire clk_i,
+ input wire reset_i,
+ input AriFrame tap_i[0:ARI_SEGMENT_COUNT-1]
+);
+ // Segment feeders
+ AriFrame seg3_feed;
+ AriFrame seg2_feed;
+ AriFrame seg1_feed;
+
+ // Segment 0
+ ari_segment seg0 (
+ .clk_i(clk_i),
+ .reset_i(reset_i),
+ .ingress_i(seg3_feed),
+ .tap_i(tap_i[0]),
+ .egress_o(seg1_feed)
+ );
+
+ // Segment 1
+ ari_segment seg1 (
+ .clk_i(clk_i),
+ .reset_i(reset_i),
+ .ingress_i(seg1_feed),
+ .tap_i(tap_i[1]),
+ .egress_o(seg2_feed)
+ );
+
+ // Segment 2
+ ari_segment seg2 (
+ .clk_i(clk_i),
+ .reset_i(reset_i),
+ .ingress_i(seg2_feed),
+ .tap_i(tap_i[2]),
+ .egress_o(seg3_feed)
+ );
+endmodule
diff --git a/rtl/bus/ari_segment.sv b/rtl/bus/ari_segment.sv
new file mode 100644
index 0000000..0523101
--- /dev/null
+++ b/rtl/bus/ari_segment.sv
@@ -0,0 +1,33 @@
+//
+// Copyright (c) 2026, Apollo Telephone Laboratories.
+// Provided under the BSD-3 clause.
+//
+
+`include "bus/ari.svh"
+
+//
+// Represents an ARI segment that routes bus data
+//
+// @clk_i: Clock input
+// @reset_i: Reset input
+// @ingress_i: Ingress frame input
+// @tap_i: Tap port input
+// @egress_o: Egress frame output
+//
+module ari_segment (
+ input wire clk_i,
+ input wire reset_i,
+ input AriFrame ingress_i,
+ input AriFrame tap_i,
+
+ output AriFrame egress_o
+);
+ // Frame multiplexer
+ ari_framemux fmux (
+ .clk_i(clk_i),
+ .reset_i(reset_i),
+ .ingress_i(ingress_i),
+ .tap_i(tap_i),
+ .egress_o(egress_o)
+ );
+endmodule