OpenCores
URL https://opencores.org/ocsvn/an-fpga-implementation-of-low-latency-noc-based-mpsoc/an-fpga-implementation-of-low-latency-noc-based-mpsoc/trunk

Subversion Repositories an-fpga-implementation-of-low-latency-noc-based-mpsoc

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /an-fpga-implementation-of-low-latency-noc-based-mpsoc
    from Rev 3 to Rev 4
    Reverse comparison

Rev 3 → Rev 4

/trunk/noc_based_mpsoc/src/NoC/route_compute.v
0,0 → 1,729
`timescale 1ns/1ps
`include "../define.v"
 
module look_ahead_routing_sync #(
parameter TOPOLOGY = "TORUS", // "MESH" or "TORUS"
parameter ROUTE_ALGRMT = "XY", //"XY" or "MINIMAL"
parameter PORT_NUM = 5,
parameter X_NODE_NUM = 4,
parameter Y_NODE_NUM = 3,
parameter SW_X_ADDR = 2,
parameter SW_Y_ADDR = 1,
parameter PORT_NUM_BCD_WIDTH = log2(PORT_NUM),
parameter X_NODE_NUM_WIDTH = log2(X_NODE_NUM),
parameter Y_NODE_NUM_WIDTH = log2(Y_NODE_NUM)
)
(
input [X_NODE_NUM_WIDTH-1 :0] dest_x_node_in,
input [Y_NODE_NUM_WIDTH-1 :0] dest_y_node_in,
output[PORT_NUM_BCD_WIDTH-1 :0] port_num_out,// one extra bit will be removed by switch_in latter
input clk,
input reset
 
);
`LOG2
reg [X_NODE_NUM_WIDTH-1 :0] dest_x_node;
reg [Y_NODE_NUM_WIDTH-1 :0] dest_y_node;
// routing algorithm
route_compute #(
.ROUTE_TYPE ("LOOK_AHEAD"),
.TOPOLOGY (TOPOLOGY),
.ROUTE_ALGRMT (ROUTE_ALGRMT),
.PORT_NUM (PORT_NUM),
.X_NODE_NUM (X_NODE_NUM),
.Y_NODE_NUM (Y_NODE_NUM),
.SW_X_ADDR (SW_X_ADDR),
.SW_Y_ADDR (SW_Y_ADDR)
)
routing
(
.dest_x_node_in (dest_x_node),
.dest_y_node_in (dest_y_node),
.port_num_out (port_num_out)
);
 
always @(posedge clk or posedge reset)begin
if(reset)begin
dest_x_node <= {X_NODE_NUM_WIDTH{1'b0}};
dest_y_node <= {Y_NODE_NUM_WIDTH{1'b0}};
end else begin
dest_x_node <= dest_x_node_in;
dest_y_node <= dest_y_node_in;
end//else reset
end//always
endmodule
 
/******************************************************
 
route_compute
 
******************************************************/
 
 
 
module route_compute #(
parameter ROUTE_TYPE = "NORMAL", // "NORMAL" or "LOOK_AHEAD"
parameter TOPOLOGY = "TORUS", // "MESH" or "TORUS"
parameter ROUTE_ALGRMT = "MINIMAL",//"XY" or "MINIMAL"
parameter PORT_NUM = 5,
parameter X_NODE_NUM = 4,
parameter Y_NODE_NUM = 4,
parameter SW_X_ADDR = 2,
parameter SW_Y_ADDR = 1,
parameter PORT_NUM_BCD_WIDTH = log2(PORT_NUM),
parameter X_NODE_NUM_WIDTH = log2(X_NODE_NUM),
parameter Y_NODE_NUM_WIDTH = log2(Y_NODE_NUM)
)
(
input [X_NODE_NUM_WIDTH-1 :0] dest_x_node_in,
input [Y_NODE_NUM_WIDTH-1 :0] dest_y_node_in,
output [PORT_NUM_BCD_WIDTH-1 :0] port_num_out// one extra bit will be removed by cross bar switch later
);
`LOG2
// just to get rid of Warning (10230): truncated value with size 32 to match size of target (2)
localparam [X_NODE_NUM_WIDTH-1 : 0] CURRENT_X_ADDR =SW_X_ADDR [X_NODE_NUM_WIDTH-1 : 0];
localparam [Y_NODE_NUM_WIDTH-1 : 0] CURRENT_Y_ADDR =SW_Y_ADDR [Y_NODE_NUM_WIDTH-1 : 0];
generate
if(ROUTE_TYPE == "NORMAL") begin :normal
normal_routing #(
.TOPOLOGY (TOPOLOGY),
.ROUTE_ALGRMT (ROUTE_ALGRMT),
.PORT_NUM (PORT_NUM),
.X_NODE_NUM (X_NODE_NUM),
.Y_NODE_NUM (Y_NODE_NUM),
.SW_X_ADDR (SW_X_ADDR),
.SW_Y_ADDR (SW_Y_ADDR)
) normal_routing
(
.current_router_x_addr (CURRENT_X_ADDR),
.current_router_y_addr (CURRENT_Y_ADDR),
.dest_x_node_in (dest_x_node_in),
.dest_y_node_in (dest_y_node_in),
.port_num_out (port_num_out)// one extra bit will be removed by switch_in latter
);
end else if(ROUTE_TYPE == "LOOK_AHEAD") begin :look_ahead
look_ahead_routing #(
.TOPOLOGY (TOPOLOGY),
.ROUTE_ALGRMT (ROUTE_ALGRMT),
.PORT_NUM (PORT_NUM),
.X_NODE_NUM (X_NODE_NUM),
.Y_NODE_NUM (Y_NODE_NUM),
.SW_X_ADDR (SW_X_ADDR),
.SW_Y_ADDR (SW_Y_ADDR)
) normal_routing
(
.dest_x_node_in (dest_x_node_in),
.dest_y_node_in (dest_y_node_in),
.port_num_out (port_num_out)// one extra bit will be removed by switch_in latter
);
end
endgenerate
 
endmodule
 
 
 
 
/***************************************************
normal routing
***************************************************/
module normal_routing #(
parameter TOPOLOGY = "TORUS", // "MESH" or "TORUS"
parameter ROUTE_ALGRMT = "MINIMAL",//"XY" or "MINIMAL"
parameter PORT_NUM = 5,
parameter X_NODE_NUM = 4,
parameter Y_NODE_NUM = 4,
parameter SW_X_ADDR = 2,
parameter SW_Y_ADDR = 1,
parameter PORT_NUM_BCD_WIDTH = log2(PORT_NUM),
parameter X_NODE_NUM_WIDTH = log2(X_NODE_NUM),
parameter Y_NODE_NUM_WIDTH = log2(Y_NODE_NUM)
)
(
input [X_NODE_NUM_WIDTH-1 :0] current_router_x_addr,
input [Y_NODE_NUM_WIDTH-1 :0] current_router_y_addr,
input [X_NODE_NUM_WIDTH-1 :0] dest_x_node_in,
input [Y_NODE_NUM_WIDTH-1 :0] dest_y_node_in,
output [PORT_NUM_BCD_WIDTH-1 :0] port_num_out// one extra bit will be removed by cross bar switch later
);
`LOG2
 
generate
if(ROUTE_ALGRMT == "XY") begin : xy_routing_blk
xy_routing #(
.TOPOLOGY (TOPOLOGY),
.PORT_NUM (PORT_NUM),
.X_NODE_NUM (X_NODE_NUM),
.Y_NODE_NUM (Y_NODE_NUM)
) xy
(
.current_router_x_addr (current_router_x_addr),
.current_router_y_addr (current_router_y_addr),
.dest_x_node_in (dest_x_node_in),
.dest_y_node_in (dest_y_node_in),
.port_num_out (port_num_out)// one extra bit will be removed by switch_in latter
);
end else if(ROUTE_ALGRMT == "MINIMAL") begin : minimal_routing_blk
minimal_routing #(
.TOPOLOGY (TOPOLOGY),
.PORT_NUM (PORT_NUM),
.X_NODE_NUM (X_NODE_NUM),
.Y_NODE_NUM (Y_NODE_NUM)
) minimal
(
.current_router_x_addr (current_router_x_addr),
.current_router_y_addr (current_router_y_addr),
.dest_x_node_in (dest_x_node_in),
.dest_y_node_in (dest_y_node_in),
.port_num_out (port_num_out)// one extra bit will be removed by switch_in latter
);
end
endgenerate
 
endmodule
 
 
 
 
/***************************************************
look-ahead routing
call the normal routing twice in cascade mode
***************************************************/
 
 
module look_ahead_routing #(
parameter TOPOLOGY = "TORUS", // "MESH" or "TORUS"
parameter ROUTE_ALGRMT = "MINIMAL",//"XY" or "MINIMAL"
parameter PORT_NUM = 5,
parameter X_NODE_NUM = 4,
parameter Y_NODE_NUM = 4,
parameter SW_X_ADDR = 2,
parameter SW_Y_ADDR = 1,
parameter PORT_NUM_BCD_WIDTH = log2(PORT_NUM),
parameter X_NODE_NUM_WIDTH = log2(X_NODE_NUM),
parameter Y_NODE_NUM_WIDTH = log2(Y_NODE_NUM)
)
(
input [X_NODE_NUM_WIDTH-1 :0] dest_x_node_in,
input [Y_NODE_NUM_WIDTH-1 :0] dest_y_node_in,
output [PORT_NUM_BCD_WIDTH-1 :0] port_num_out// one extra bit will be removed by cross bar switch later
);
 
`LOG2
wire [PORT_NUM_BCD_WIDTH-1 :0] port_num_out_first;
reg [X_NODE_NUM_WIDTH-1 :0] next_router_x_addr;
reg [Y_NODE_NUM_WIDTH-1 :0] next_router_y_addr;
localparam LOCAL = 3'd0;
localparam EAST = 3'd1;
localparam NORTH = 3'd2;
localparam WEST = 3'd3;
localparam SOUTH = 3'd4;
// just to get rid of Warning (10230): Verilog HDL assignment warning at look_ahead.v(71): truncated value with size 32 to match size of target (2)
localparam [X_NODE_NUM_WIDTH-1 : 0] CURRENT_X_ADDR =SW_X_ADDR [X_NODE_NUM_WIDTH-1 : 0];
localparam [Y_NODE_NUM_WIDTH-1 : 0] CURRENT_Y_ADDR =SW_Y_ADDR [Y_NODE_NUM_WIDTH-1 : 0];
localparam [X_NODE_NUM_WIDTH-1 : 0] LAST_X_ADDR =X_NODE_NUM[X_NODE_NUM_WIDTH-1 : 0]-1'b1;
localparam [Y_NODE_NUM_WIDTH-1 : 0] LAST_Y_ADDR =Y_NODE_NUM[Y_NODE_NUM_WIDTH-1 : 0]-1'b1;
normal_routing #(
.TOPOLOGY (TOPOLOGY),
.ROUTE_ALGRMT (ROUTE_ALGRMT),
.PORT_NUM (PORT_NUM),
.X_NODE_NUM (X_NODE_NUM),
.Y_NODE_NUM (Y_NODE_NUM)
)first_level
(
.current_router_x_addr (CURRENT_X_ADDR),
.current_router_y_addr (CURRENT_Y_ADDR),
.dest_x_node_in (dest_x_node_in),
.dest_y_node_in (dest_y_node_in),
.port_num_out (port_num_out_first)// one extra bit will be removed by switch_in latter
);
normal_routing #(
.TOPOLOGY (TOPOLOGY),
.ROUTE_ALGRMT (ROUTE_ALGRMT),
.PORT_NUM (PORT_NUM),
.X_NODE_NUM (X_NODE_NUM),
.Y_NODE_NUM (Y_NODE_NUM)
)second_level
(
.current_router_x_addr (next_router_x_addr),
.current_router_y_addr (next_router_y_addr),
.dest_x_node_in (dest_x_node_in),
.dest_y_node_in (dest_y_node_in),
.port_num_out (port_num_out)// one extra bit will be removed by switch_in latter
);
always @(*) begin
case(port_num_out_first)
EAST: begin
next_router_x_addr= (SW_X_ADDR==LAST_X_ADDR ) ? {X_NODE_NUM_WIDTH{1'b0}} : CURRENT_X_ADDR+1'b1;
next_router_y_addr= CURRENT_Y_ADDR;
end
NORTH: begin
next_router_x_addr= CURRENT_X_ADDR;
next_router_y_addr= (SW_Y_ADDR==0)? LAST_Y_ADDR : CURRENT_Y_ADDR-1'b1;
end
WEST: begin
next_router_x_addr= (SW_X_ADDR==0) ? LAST_X_ADDR : CURRENT_X_ADDR-1'b1;
next_router_y_addr= CURRENT_Y_ADDR;
end
SOUTH: begin
next_router_x_addr= CURRENT_X_ADDR;
next_router_y_addr= (SW_Y_ADDR== LAST_Y_ADDR ) ? {Y_NODE_NUM_WIDTH{1'b0}}: CURRENT_Y_ADDR+1'b1;
end
default begin
next_router_x_addr= {X_NODE_NUM_WIDTH{1'bX}};
next_router_y_addr= {Y_NODE_NUM_WIDTH{1'bX}};
end
endcase
end//always
endmodule
 
 
/*****************************************************
 
xy_mesh_routing
 
*****************************************************/
 
 
module xy_mesh_routing #(
parameter PORT_NUM = 5,
parameter X_NODE_NUM = 4,
parameter Y_NODE_NUM = 3,
parameter X_NODE_NUM_WIDTH = log2(X_NODE_NUM),
parameter Y_NODE_NUM_WIDTH = log2(Y_NODE_NUM),
parameter PORT_NUM_BCD_WIDTH = log2(PORT_NUM),
parameter PORT_SEL_WIDTH = PORT_NUM-1//assum that no port whants to send a packet to itself!
)
(
input [X_NODE_NUM_WIDTH-1 :0] current_router_x_addr,
input [Y_NODE_NUM_WIDTH-1 :0] current_router_y_addr,
input [X_NODE_NUM_WIDTH-1 :0] dest_x_node_in,
input [Y_NODE_NUM_WIDTH-1 :0] dest_y_node_in,
output [PORT_NUM_BCD_WIDTH-1 :0] port_num_out// one extra bit will be removed by switch_in latter
);
`LOG2
localparam LOCAL = 3'd0;
localparam EAST = 3'd1;
localparam NORTH = 3'd2;
localparam WEST = 3'd3;
localparam SOUTH = 3'd4;
reg [PORT_NUM_BCD_WIDTH-1 :0] port_num_next;
wire signed [X_NODE_NUM_WIDTH :0] xc;//current
wire signed [X_NODE_NUM_WIDTH :0] xd;//destination
wire signed [Y_NODE_NUM_WIDTH :0] yc;//current
wire signed [Y_NODE_NUM_WIDTH :0] yd;//destination
wire signed [X_NODE_NUM_WIDTH :0] xdiff;
wire signed [Y_NODE_NUM_WIDTH :0] ydiff;
assign xc ={1'b0, current_router_x_addr [X_NODE_NUM_WIDTH-1 :0]};
assign yc ={1'b0, current_router_y_addr [Y_NODE_NUM_WIDTH-1 :0]};
assign xd ={1'b0, dest_x_node_in};
assign yd ={1'b0, dest_y_node_in};
assign xdiff = xd-xc;
assign ydiff = yd-yc;
assign port_num_out= port_num_next;
always@(*)begin
port_num_next = LOCAL;
if (xdiff > 0) port_num_next = EAST;
else if (xdiff < 0) port_num_next = WEST;
else begin
if (ydiff > 0) port_num_next = SOUTH;
else if (ydiff < 0) port_num_next = NORTH;
end
end
 
endmodule
 
 
/*************************************************
 
xy _torus_routing
 
************************************************/
 
 
module xy_torus_routing #(
parameter PORT_NUM = 5,
parameter X_NODE_NUM = 4,
parameter Y_NODE_NUM = 3,
parameter X_NODE_NUM_WIDTH = log2(X_NODE_NUM),
parameter Y_NODE_NUM_WIDTH = log2(Y_NODE_NUM),
parameter PORT_NUM_BCD_WIDTH = log2(PORT_NUM),
parameter PORT_SEL_WIDTH = PORT_NUM-1//assum that no port whants to send a packet to itself!
)
(
input [X_NODE_NUM_WIDTH-1 :0] current_router_x_addr,
input [Y_NODE_NUM_WIDTH-1 :0] current_router_y_addr,
input [X_NODE_NUM_WIDTH-1 :0] dest_x_node_in,
input [Y_NODE_NUM_WIDTH-1 :0] dest_y_node_in,
output [PORT_NUM_BCD_WIDTH-1 :0] port_num_out// one extra bit will be removed by switch_in latter
);
`LOG2
localparam LOCAL = 3'd0;
localparam EAST = 3'd1;
localparam NORTH = 3'd2;
localparam WEST = 3'd3;
localparam SOUTH = 3'd4;
reg [PORT_NUM_BCD_WIDTH-1 :0] port_num_next;
wire [X_NODE_NUM_WIDTH-1 :0] x_addr_low,x_addr_high,x_addr_diff_f,x_addr_diff_b;
wire x_des_bigger;
wire [Y_NODE_NUM_WIDTH-1 :0] y_addr_low,y_addr_high,y_addr_diff_f,y_addr_diff_b;
wire y_des_bigger;
assign x_des_bigger =(dest_x_node_in > current_router_x_addr);
assign x_addr_low =(x_des_bigger)? current_router_x_addr : dest_x_node_in;
assign x_addr_high =(x_des_bigger)? dest_x_node_in : current_router_x_addr;
assign x_addr_diff_f = x_addr_high - x_addr_low;
assign x_addr_diff_b = x_addr_low + X_NODE_NUM[X_NODE_NUM_WIDTH-1 :0] - x_addr_high;
assign y_des_bigger =(dest_y_node_in > current_router_y_addr);
assign y_addr_low =(y_des_bigger)? current_router_y_addr : dest_y_node_in ;
assign y_addr_high =(y_des_bigger)? dest_y_node_in : current_router_y_addr;
assign y_addr_diff_f = y_addr_high - y_addr_low;
assign y_addr_diff_b = y_addr_low + Y_NODE_NUM[Y_NODE_NUM_WIDTH-1 :0] - y_addr_high;
assign port_num_out= port_num_next;
always@(*)begin
port_num_next = LOCAL;
if (x_addr_diff_f > 0 ) begin
if (x_addr_diff_f <= x_addr_diff_b ) port_num_next = (x_des_bigger)? EAST: WEST;
else port_num_next = (x_des_bigger)? WEST: EAST;
end
else if (y_addr_diff_f > 0 ) begin
if (y_addr_diff_f <= y_addr_diff_b ) port_num_next = (y_des_bigger)? SOUTH: NORTH;
else port_num_next = (y_des_bigger)? NORTH: SOUTH;
end
end
endmodule
/*************************************************
 
xy _routing
 
************************************************/
 
 
module xy_routing #(
parameter TOPOLOGY = "MESH",//"TORUS"
parameter PORT_NUM = 5,
parameter X_NODE_NUM = 4,
parameter Y_NODE_NUM = 3,
parameter X_NODE_NUM_WIDTH = log2(X_NODE_NUM),
parameter Y_NODE_NUM_WIDTH = log2(Y_NODE_NUM),
parameter PORT_NUM_BCD_WIDTH = log2(PORT_NUM),
parameter PORT_SEL_WIDTH = PORT_NUM-1//assum that no port whants to send a packet to itself!
)
(
input [X_NODE_NUM_WIDTH-1 :0] current_router_x_addr,
input [Y_NODE_NUM_WIDTH-1 :0] current_router_y_addr,
input [X_NODE_NUM_WIDTH-1 :0] dest_x_node_in,
input [Y_NODE_NUM_WIDTH-1 :0] dest_y_node_in,
output [PORT_NUM_BCD_WIDTH-1 :0] port_num_out// one extra bit will be removed by switch_in latter
);
`LOG2
generate
if(TOPOLOGY == "MESH") begin : mesh
xy_mesh_routing #(
.PORT_NUM (PORT_NUM),
.X_NODE_NUM (X_NODE_NUM),
.Y_NODE_NUM (Y_NODE_NUM)
)xy_mesh
(
.current_router_x_addr (current_router_x_addr),
.current_router_y_addr (current_router_y_addr),
.dest_x_node_in (dest_x_node_in),
.dest_y_node_in (dest_y_node_in),
.port_num_out (port_num_out)// one extra bit will be removed by switch_in latter
);
end else if(TOPOLOGY == "TORUS") begin : torus
xy_torus_routing #(
.PORT_NUM (PORT_NUM),
.X_NODE_NUM (X_NODE_NUM),
.Y_NODE_NUM (Y_NODE_NUM)
)xy_torus
(
.current_router_x_addr (current_router_x_addr),
.current_router_y_addr (current_router_y_addr),
.dest_x_node_in (dest_x_node_in),
.dest_y_node_in (dest_y_node_in),
.port_num_out (port_num_out)// one extra bit will be removed by switch_in latter
);
end
endgenerate
endmodule
/*****************************************************
 
minimal_mesh_routing
 
*****************************************************/
 
 
module minimal_mesh_routing #(
parameter PORT_NUM = 5,
parameter X_NODE_NUM = 4,
parameter Y_NODE_NUM = 3,
parameter X_NODE_NUM_WIDTH = log2(X_NODE_NUM),
parameter Y_NODE_NUM_WIDTH = log2(Y_NODE_NUM),
parameter PORT_NUM_BCD_WIDTH = log2(PORT_NUM),
parameter PORT_SEL_WIDTH = PORT_NUM-1//assum that no port whants to send a packet to itself!
)
(
input [X_NODE_NUM_WIDTH-1 :0] current_router_x_addr,
input [Y_NODE_NUM_WIDTH-1 :0] current_router_y_addr,
input [X_NODE_NUM_WIDTH-1 :0] dest_x_node_in,
input [Y_NODE_NUM_WIDTH-1 :0] dest_y_node_in,
output [PORT_NUM_BCD_WIDTH-1 :0] port_num_out// one extra bit will be removed by switch_in latter
);
`LOG2
localparam LOCAL = 3'd0;
localparam EAST = 3'd1;
localparam NORTH = 3'd2;
localparam WEST = 3'd3;
localparam SOUTH = 3'd4;
reg [PORT_NUM_BCD_WIDTH-1 :0] port_num_next;
wire [X_NODE_NUM_WIDTH-1 :0] x_addr_low,x_addr_high,x_addr_diff_f;
wire x_des_bigger;
wire [Y_NODE_NUM_WIDTH-1 :0] y_addr_low,y_addr_high,y_addr_diff_f;
wire y_des_bigger;
assign x_des_bigger =(dest_x_node_in > current_router_x_addr);
assign x_addr_low =(x_des_bigger)? current_router_x_addr : dest_x_node_in;
assign x_addr_high =(x_des_bigger)? dest_x_node_in : current_router_x_addr;
assign x_addr_diff_f = x_addr_high - x_addr_low;
assign y_des_bigger =(dest_y_node_in > current_router_y_addr);
assign y_addr_low =(y_des_bigger)? current_router_y_addr : dest_y_node_in ;
assign y_addr_high =(y_des_bigger)? dest_y_node_in : current_router_y_addr;
assign y_addr_diff_f = y_addr_high - y_addr_low;
assign port_num_out= port_num_next;
always@(*)begin
port_num_next = LOCAL;
if (x_addr_diff_f==0 && y_addr_diff_f==0 ) port_num_next = LOCAL;
else if (x_addr_diff_f >y_addr_diff_f ) port_num_next = (x_des_bigger)? EAST: WEST;
else if (x_addr_diff_f <= y_addr_diff_f ) port_num_next = (y_des_bigger)? SOUTH: NORTH;
end
endmodule
 
 
/*************************************************
 
minimal _torus_routing
 
************************************************/
 
 
module minimal_torus_routing #(
parameter PORT_NUM = 5,
parameter X_NODE_NUM = 4,
parameter Y_NODE_NUM = 3,
parameter X_NODE_NUM_WIDTH = log2(X_NODE_NUM),
parameter Y_NODE_NUM_WIDTH = log2(Y_NODE_NUM),
parameter PORT_NUM_BCD_WIDTH = log2(PORT_NUM),
parameter PORT_SEL_WIDTH = PORT_NUM-1//assum that no port whants to send a packet to itself!
)
(
input [X_NODE_NUM_WIDTH-1 :0] current_router_x_addr,
input [Y_NODE_NUM_WIDTH-1 :0] current_router_y_addr,
input [X_NODE_NUM_WIDTH-1 :0] dest_x_node_in,
input [Y_NODE_NUM_WIDTH-1 :0] dest_y_node_in,
output [PORT_NUM_BCD_WIDTH-1 :0] port_num_out// one extra bit will be removed by switch_in latter
);
`LOG2
localparam LOCAL = 3'd0;
localparam EAST = 3'd1;
localparam NORTH = 3'd2;
localparam WEST = 3'd3;
localparam SOUTH = 3'd4;
reg [PORT_NUM_BCD_WIDTH-1 :0] port_num_next;
wire [X_NODE_NUM_WIDTH-1 :0] x_addr_low,x_addr_high,x_addr_diff_f,x_addr_diff_b,x_min_of_b_f;
wire x_des_bigger;
wire [Y_NODE_NUM_WIDTH-1 :0] y_addr_low,y_addr_high,y_addr_diff_f,y_addr_diff_b,y_min_of_b_f;
wire y_des_bigger;
assign x_des_bigger =(dest_x_node_in > current_router_x_addr);
assign x_addr_low =(x_des_bigger)? current_router_x_addr : dest_x_node_in;
assign x_addr_high =(x_des_bigger)? dest_x_node_in : current_router_x_addr;
assign x_addr_diff_f = x_addr_high - x_addr_low;
assign x_addr_diff_b = x_addr_low + X_NODE_NUM[X_NODE_NUM_WIDTH-1 :0] - x_addr_high;
assign x_min_of_b_f = (x_addr_diff_f > x_addr_diff_b )? x_addr_diff_b : x_addr_diff_f;
assign y_des_bigger =(dest_y_node_in > current_router_y_addr);
assign y_addr_low =(y_des_bigger)? current_router_y_addr : dest_y_node_in ;
assign y_addr_high =(y_des_bigger)? dest_y_node_in : current_router_y_addr;
assign y_addr_diff_f = y_addr_high - y_addr_low;
assign y_addr_diff_b = y_addr_low + Y_NODE_NUM[Y_NODE_NUM_WIDTH-1 :0] - y_addr_high;
assign y_min_of_b_f = (y_addr_diff_f > y_addr_diff_b )? y_addr_diff_b : y_addr_diff_f;
assign port_num_out= port_num_next;
always@(*)begin
port_num_next = LOCAL;
if( x_min_of_b_f ==0 && y_min_of_b_f==0) port_num_next = LOCAL;
else begin
if(x_min_of_b_f > y_min_of_b_f) begin
if (x_addr_diff_f <= x_addr_diff_b ) port_num_next = (x_des_bigger)? EAST: WEST;
else port_num_next = (x_des_bigger)? WEST: EAST;
end else if(x_min_of_b_f <= y_min_of_b_f ) begin
if (y_addr_diff_f <= y_addr_diff_b ) port_num_next = (y_des_bigger)? SOUTH: NORTH;
else port_num_next = (y_des_bigger)? NORTH: SOUTH;
end
end
end//always
endmodule
 
/*************************************************
 
minimal_routing
 
************************************************/
 
 
module minimal_routing #(
parameter TOPOLOGY = "MESH",//"TORUS"
parameter PORT_NUM = 5,
parameter X_NODE_NUM = 4,
parameter Y_NODE_NUM = 3,
parameter X_NODE_NUM_WIDTH = log2(X_NODE_NUM),
parameter Y_NODE_NUM_WIDTH = log2(Y_NODE_NUM),
parameter PORT_NUM_BCD_WIDTH = log2(PORT_NUM),
parameter PORT_SEL_WIDTH = PORT_NUM-1//assum that no port whants to send a packet to itself!
)
(
input [X_NODE_NUM_WIDTH-1 :0] current_router_x_addr,
input [Y_NODE_NUM_WIDTH-1 :0] current_router_y_addr,
input [X_NODE_NUM_WIDTH-1 :0] dest_x_node_in,
input [Y_NODE_NUM_WIDTH-1 :0] dest_y_node_in,
output [PORT_NUM_BCD_WIDTH-1 :0] port_num_out// one extra bit will be removed by switch_in latter
);
`LOG2
generate
if(TOPOLOGY == "MESH") begin
minimal_mesh_routing #(
.PORT_NUM (PORT_NUM),
.X_NODE_NUM (X_NODE_NUM),
.Y_NODE_NUM (Y_NODE_NUM)
)second_level
(
.current_router_x_addr (current_router_x_addr),
.current_router_y_addr (current_router_y_addr),
.dest_x_node_in (dest_x_node_in),
.dest_y_node_in (dest_y_node_in),
.port_num_out (port_num_out)// one extra bit will be removed by switch_in latter
);
end else if(TOPOLOGY == "TORUS") begin
minimal_torus_routing #(
.PORT_NUM (PORT_NUM),
.X_NODE_NUM (X_NODE_NUM),
.Y_NODE_NUM (Y_NODE_NUM)
)second_level
(
.current_router_x_addr (current_router_x_addr),
.current_router_y_addr (current_router_y_addr),
.dest_x_node_in (dest_x_node_in),
.dest_y_node_in (dest_y_node_in),
.port_num_out (port_num_out)// one extra bit will be removed by switch_in latter
);
end
endgenerate
endmodule
 
/trunk/noc_based_mpsoc/mpsoc.qws Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream
trunk/noc_based_mpsoc/mpsoc.qws Property changes : Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.