Files
OpenExSys_NoC/rtl/local_port_look_adead_routing.sv
2023-11-26 14:59:34 +01:00

94 lines
2.3 KiB
Systemverilog

// implemented XY routing, for per local sa winnner flit
module local_port_look_adead_routing
import rvh_noc_pkg::*;
#(
)
(
// input vc head to calculate next routing
input logic [NodeID_X_Width-1:0] node_id_x_tgt_i,
input logic [NodeID_Y_Width-1:0] node_id_y_tgt_i,
`ifdef ALLOW_SAME_ROUTER_L2L_TRANSFER
input logic [NodeID_Device_Port_Width-1:0] device_port_tgt_i,
`endif
// input this hop xy addr
input logic [NodeID_X_Width-1:0] node_id_x_src_i,
input logic [NodeID_Y_Width-1:0] node_id_y_src_i,
// output look ahead routing result
output io_port_t look_ahead_routing_o
);
// 2nd phase: Define new Next-port
logic x_nxt_equal_x_dst;
logic x_nxt_less_x_dst;
`ifdef ALLOW_SAME_ROUTER_L2L_TRANSFER
logic y_nxt_equal_y_dst;
`endif
logic y_nxt_less_y_dst;
assign x_nxt_equal_x_dst = (node_id_x_src_i == node_id_x_tgt_i);
assign x_nxt_less_x_dst = (node_id_x_src_i < node_id_x_tgt_i);
`ifdef ALLOW_SAME_ROUTER_L2L_TRANSFER
assign y_nxt_equal_y_dst = (node_id_y_src_i == node_id_y_tgt_i);
`endif
assign y_nxt_less_y_dst = (node_id_y_src_i < node_id_y_tgt_i);
`ifdef ALLOW_SAME_ROUTER_L2L_TRANSFER
always_comb begin
if(x_nxt_equal_x_dst) begin
if(y_nxt_equal_y_dst) begin
unique case(device_port_tgt_i) // chooose which local port to route to
0: begin
look_ahead_routing_o = L0;
end
`ifdef LOCAL_PORT_NUM_2
1: begin
look_ahead_routing_o = L1;
end
`endif
`ifdef LOCAL_PORT_NUM_3
2: begin
look_ahead_routing_o = L2;
end
`endif
`ifdef LOCAL_PORT_NUM_4
3: begin
look_ahead_routing_o = L3;
end
`endif
default: begin
look_ahead_routing_o = L0;
end
endcase
end else if(y_nxt_less_y_dst) begin
look_ahead_routing_o = N;
end else begin
look_ahead_routing_o = S;
end
end else if(x_nxt_less_x_dst) begin
look_ahead_routing_o = E;
end else begin
look_ahead_routing_o = W;
end
end
`else
always_comb begin
if(x_nxt_equal_x_dst) begin
if(y_nxt_less_y_dst) begin
look_ahead_routing_o = N;
end else begin
look_ahead_routing_o = S;
end
end else if(x_nxt_less_x_dst) begin
look_ahead_routing_o = E;
end else begin
look_ahead_routing_o = W;
end
end
`endif
endmodule