94 lines
2.3 KiB
Systemverilog
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
|