Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 9 additions & 3 deletions src/obi_demux.sv
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ module obi_demux #(
logic [CounterWidth-1:0] in_flight;
logic sbr_port_gnt;
logic sbr_port_rready;
logic rsp_phase_stalled;

select_t select_d, select_q;

Expand All @@ -53,7 +54,9 @@ module obi_demux #(
sbr_port_gnt = 1'b0;

if (!overflow) begin
if (sbr_port_select_i == select_q || in_flight == '0 || (in_flight == 1 && cnt_down)) begin
// R-4.1.1: block source changes while a stalled R phase is active
if (sbr_port_select_i == select_q || (!rsp_phase_stalled &&
(in_flight == '0 || (in_flight == 1 && cnt_down)))) begin
mgr_ports_req_o[sbr_port_select_i].req = sbr_port_req_i.req;
mgr_ports_req_o[sbr_port_select_i].a = sbr_port_req_i.a;
sbr_port_gnt = mgr_ports_rsp_i[sbr_port_select_i].gnt;
Expand All @@ -72,14 +75,18 @@ module obi_demux #(

if (ObiCfg.UseRReady) begin : gen_rready
assign sbr_port_rready = sbr_port_req_i.rready;
assign rsp_phase_stalled = sbr_port_rsp_o.rvalid && !sbr_port_rready;

for (genvar i = 0; i < NumMgrPorts; i++) begin : gen_rready
assign mgr_ports_req_o[i].rready = sbr_port_req_i.rready;
end
end else begin : gen_no_rready
assign sbr_port_rready = 1'b1;
assign rsp_phase_stalled = 1'b0;
end

assign cnt_down = mgr_ports_rsp_i[select_q].rvalid && sbr_port_rready;
// R-6: retire the active response only after its R phase transfer completes
assign cnt_down = sbr_port_rsp_o.rvalid && sbr_port_rready;

delta_counter #(
.WIDTH ( CounterWidth ),
Expand Down Expand Up @@ -164,4 +171,3 @@ module obi_demux_intf #(
);

endmodule

16 changes: 13 additions & 3 deletions src/obi_mux.sv
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,8 @@ module obi_mux #(
sbr_port_a_chan_t mgr_port_a_in_sbr;
logic [RequiredExtraIdWidth-1:0] selected_id, response_id;
logic mgr_port_req, fifo_full, fifo_pop;
logic [NumSbrPorts-1:0] sbr_rsp_rvalid;
sbr_port_r_chan_t [NumSbrPorts-1:0] sbr_rsp_r;

rr_arb_tree #(
.NumIn ( NumSbrPorts ),
Expand Down Expand Up @@ -135,10 +137,17 @@ module obi_mux #(
end

if (MgrPortObiCfg.UseRReady) begin : gen_rready_connect
assign mgr_port_req_o.rready = sbr_ports_req_i[response_id].rready;
logic routed_rsp_ready;

always_comb begin
// R-4.1.1: route readiness from the active response owner
routed_rsp_ready = sbr_ports_req_i[response_id].rready;
end

assign mgr_port_req_o.rready = routed_rsp_ready;
end else begin : gen_no_rready_connect
end
logic [NumSbrPorts-1:0] sbr_rsp_rvalid;
sbr_port_r_chan_t [NumSbrPorts-1:0] sbr_rsp_r;

always_comb begin : proc_sbr_rsp
for (int i = 0; i < NumSbrPorts; i++) begin
sbr_rsp_r[i] = '0;
Expand All @@ -154,6 +163,7 @@ module obi_mux #(
end

if (MgrPortObiCfg.UseRReady) begin : gen_fifo_pop
// R-6: pop the response owner only after its R phase transfer completes
assign fifo_pop = mgr_port_rsp_i.rvalid && mgr_port_req_o.rready;
end else begin : gen_fifo_pop
assign fifo_pop = mgr_port_rsp_i.rvalid;
Expand Down
Loading