`timescale 1ns / 1ps
|
`include "pronoc_def.v"
|
|
|
/************************
|
/************************
|
* fmesh
|
* fmesh
|
*
|
*
|
* **********************/
|
* **********************/
|
|
|
|
|
|
|
|
|
module fmesh_addr_encoder #(
|
module fmesh_addr_encoder #(
|
parameter NX=2,
|
parameter NX=2,
|
parameter NY=2,
|
parameter NY=2,
|
parameter NL=2,
|
parameter NL=2,
|
parameter NE=16,
|
parameter NE=16,
|
parameter EAw=4
|
parameter EAw=4
|
)(
|
)(
|
id,
|
id,
|
code
|
code
|
);
|
);
|
|
|
function integer log2;
|
function integer log2;
|
input integer number; begin
|
input integer number; begin
|
log2=(number <=1) ? 1: 0;
|
log2=(number <=1) ? 1: 0;
|
while(2**log2
|
while(2**log2
|
log2=log2+1;
|
log2=log2+1;
|
end
|
end
|
end
|
end
|
endfunction // log2
|
endfunction // log2
|
|
|
localparam LOCAL = 0,
|
localparam LOCAL = 0,
|
EAST = 1,
|
EAST = 1,
|
NORTH = 2,
|
NORTH = 2,
|
WEST = 3,
|
WEST = 3,
|
SOUTH = 4;
|
SOUTH = 4;
|
|
|
|
|
|
|
function integer addrencode;
|
function integer addrencode;
|
input integer in,nx,nxw,nl,nyw,ny;
|
input integer in,nx,nxw,nl,nyw,ny;
|
integer y, x, l,p, diff,mul;begin
|
integer y, x, l,p, diff,mul;begin
|
mul = nx*ny*nl;
|
mul = nx*ny*nl;
|
if(in < mul) begin
|
if(in < mul) begin
|
y = ((in/nl) / nx );
|
y = ((in/nl) / nx );
|
x = ((in/nl) % nx );
|
x = ((in/nl) % nx );
|
l = (in % nl);
|
l = (in % nl);
|
p = (l==0)? LOCAL : 4+l;
|
p = (l==0)? LOCAL : 4+l;
|
end else begin
|
end else begin
|
diff = in - mul ;
|
diff = in - mul ;
|
if( diff < nx) begin //top mesh edge
|
if( diff < nx) begin //top mesh edge
|
y = 0;
|
y = 0;
|
x = diff;
|
x = diff;
|
p = NORTH;
|
p = NORTH;
|
end else if ( diff < 2* nx) begin //bottom mesh edge
|
end else if ( diff < 2* nx) begin //bottom mesh edge
|
y = ny-1;
|
y = ny-1;
|
x = diff-nx;
|
x = diff-nx;
|
p = SOUTH;
|
p = SOUTH;
|
end else if ( diff < (2* nx)+ny ) begin //left mesh edge
|
end else if ( diff < (2* nx)+ny ) begin //left mesh edge
|
y = diff - (2* nx);
|
y = diff - (2* nx);
|
x = 0;
|
x = 0;
|
p = WEST;
|
p = WEST;
|
end else begin //right mesh edge
|
end else begin //right mesh edge
|
y = diff - (2* nx) -ny;
|
y = diff - (2* nx) -ny;
|
x = nx-1;
|
x = nx-1;
|
p = EAST;
|
p = EAST;
|
end
|
end
|
end//else
|
end//else
|
addrencode = ( p<<(nxw+nyw) | (y<
|
addrencode = ( p<<(nxw+nyw) | (y<
|
end
|
end
|
endfunction // addrencode
|
endfunction // addrencode
|
|
|
|
|
|
|
localparam
|
localparam
|
NXw= log2(NX),
|
NXw= log2(NX),
|
NYw= log2(NY),
|
NYw= log2(NY),
|
NEw = log2(NE);
|
NEw = log2(NE);
|
|
|
|
|
input [NEw-1 :0] id;
|
input [NEw-1 :0] id;
|
output [EAw-1 : 0] code;
|
output [EAw-1 : 0] code;
|
|
|
wire [EAw-1 : 0 ] codes [NE-1 : 0];
|
wire [EAw-1 : 0 ] codes [NE-1 : 0];
|
genvar i;
|
genvar i;
|
generate
|
generate
|
for(i=0; i< NE; i=i+1) begin : endpoints
|
for(i=0; i< NE; i=i+1) begin : endpoints
|
//Endpoint decoded address
|
//Endpoint decoded address
|
/* verilator lint_off WIDTH */
|
/* verilator lint_off WIDTH */
|
localparam [EAw-1 : 0] ENDP= addrencode(i,NX,NXw,NL,NYw,NY);
|
localparam [EAw-1 : 0] ENDP= addrencode(i,NX,NXw,NL,NYw,NY);
|
/* verilator lint_on WIDTH */
|
/* verilator lint_on WIDTH */
|
assign codes[i] = ENDP;
|
assign codes[i] = ENDP;
|
end
|
end
|
endgenerate
|
endgenerate
|
|
|
assign code = codes[id];
|
assign code = codes[id];
|
endmodule
|
endmodule
|
|
|
|
|
module fmesh_addr_coder #(
|
module fmesh_addr_coder #(
|
parameter NX=2,
|
parameter NX=2,
|
parameter NY=2,
|
parameter NY=2,
|
parameter NL=2,
|
parameter NL=2,
|
parameter NE=16,
|
parameter NE=16,
|
parameter EAw=4
|
parameter EAw=4
|
)(
|
)(
|
id,
|
id,
|
code
|
code
|
);
|
);
|
|
|
function integer log2;
|
function integer log2;
|
input integer number; begin
|
input integer number; begin
|
log2=(number <=1) ? 1: 0;
|
log2=(number <=1) ? 1: 0;
|
while(2**log2
|
while(2**log2
|
log2=log2+1;
|
log2=log2+1;
|
end
|
end
|
end
|
end
|
endfunction // log2
|
endfunction // log2
|
|
|
localparam LOCAL = 0,
|
localparam LOCAL = 0,
|
EAST = 1,
|
EAST = 1,
|
NORTH = 2,
|
NORTH = 2,
|
WEST = 3,
|
WEST = 3,
|
SOUTH = 4;
|
SOUTH = 4;
|
|
|
|
|
function integer addrencode;
|
function integer addrencode;
|
input integer in,nx,nxw,nl,nyw,ny;
|
input integer in,nx,nxw,nl,nyw,ny;
|
integer y, x, l,p, diff,mul;begin
|
integer y, x, l,p, diff,mul;begin
|
mul = nx*ny*nl;
|
mul = nx*ny*nl;
|
if(in < mul) begin
|
if(in < mul) begin
|
y = ((in/nl) / nx );
|
y = ((in/nl) / nx );
|
x = ((in/nl) % nx );
|
x = ((in/nl) % nx );
|
l = (in % nl);
|
l = (in % nl);
|
p = (l==0)? LOCAL : 4+l;
|
p = (l==0)? LOCAL : 4+l;
|
end else begin
|
end else begin
|
diff = in - mul ;
|
diff = in - mul ;
|
if( diff < nx) begin //top mesh edge
|
if( diff < nx) begin //top mesh edge
|
y = 0;
|
y = 0;
|
x = diff;
|
x = diff;
|
p = NORTH;
|
p = NORTH;
|
end else if ( diff < 2* nx) begin //bottom mesh edge
|
end else if ( diff < 2* nx) begin //bottom mesh edge
|
y = ny-1;
|
y = ny-1;
|
x = diff-nx;
|
x = diff-nx;
|
p = SOUTH;
|
p = SOUTH;
|
end else if ( diff < (2* nx)+ny ) begin //left mesh edge
|
end else if ( diff < (2* nx)+ny ) begin //left mesh edge
|
y = diff - (2* nx);
|
y = diff - (2* nx);
|
x = 0;
|
x = 0;
|
p = WEST;
|
p = WEST;
|
end else begin //right mesh edge
|
end else begin //right mesh edge
|
y = diff - (2* nx) -ny;
|
y = diff - (2* nx) -ny;
|
x = nx-1;
|
x = nx-1;
|
p = EAST;
|
p = EAST;
|
end
|
end
|
end//else
|
end//else
|
addrencode = ( p<<(nxw+nyw) | (y<
|
addrencode = ( p<<(nxw+nyw) | (y<
|
end
|
end
|
endfunction // addrencode
|
endfunction // addrencode
|
|
|
|
|
localparam
|
localparam
|
NXw= log2(NX),
|
NXw= log2(NX),
|
NYw= log2(NY),
|
NYw= log2(NY),
|
NEw = log2(NE);
|
NEw = log2(NE);
|
|
|
|
|
output [NEw-1 :0] id;
|
output [NEw-1 :0] id;
|
input [EAw-1 : 0] code;
|
input [EAw-1 : 0] code;
|
|
|
wire [NEw-1 : 0] codes [(2**EAw)-1 : 0 ];
|
wire [NEw-1 : 0] codes [(2**EAw)-1 : 0 ];
|
genvar i;
|
genvar i;
|
generate
|
generate
|
for(i=0; i< NE; i=i+1) begin : endpoints
|
for(i=0; i< NE; i=i+1) begin : endpoints
|
//Endpoint decoded address
|
//Endpoint decoded address
|
/* verilator lint_off WIDTH */
|
/* verilator lint_off WIDTH */
|
localparam [EAw-1 : 0] ENDP= addrencode(i,NX,NXw,NL,NYw,NY);
|
localparam [EAw-1 : 0] ENDP= addrencode(i,NX,NXw,NL,NYw,NY);
|
/* verilator lint_on WIDTH */
|
/* verilator lint_on WIDTH */
|
assign codes[ENDP] = i;
|
assign codes[ENDP] = i;
|
end
|
end
|
endgenerate
|
endgenerate
|
|
|
assign id = codes[code];
|
assign id = codes[code];
|
endmodule
|
endmodule
|
|
|
|
|
|
|
|
|
module fmesh_endp_addr_decode #(
|
module fmesh_endp_addr_decode #(
|
parameter T1=4,
|
parameter T1=4,
|
parameter T2=4,
|
parameter T2=4,
|
parameter T3=4,
|
parameter T3=4,
|
parameter EAw=9
|
parameter EAw=9
|
)(
|
)(
|
e_addr,
|
e_addr,
|
ex,
|
ex,
|
ey,
|
ey,
|
ep,
|
ep,
|
valid
|
valid
|
);
|
);
|
|
|
function integer log2;
|
function integer log2;
|
input integer number; begin
|
input integer number; begin
|
log2=(number <=1) ? 1: 0;
|
log2=(number <=1) ? 1: 0;
|
while(2**log2
|
while(2**log2
|
log2=log2+1;
|
log2=log2+1;
|
end
|
end
|
end
|
end
|
endfunction // log2
|
endfunction // log2
|
|
|
localparam
|
localparam
|
NX = T1,
|
NX = T1,
|
NY = T2,
|
NY = T2,
|
NL = T3,
|
NL = T3,
|
EXw = log2(NX),
|
EXw = log2(NX),
|
EYw = log2(NY),
|
EYw = log2(NY),
|
EPw = EAw - EXw - EYw,
|
EPw = EAw - EXw - EYw,
|
P = 5 + NL -1;
|
P = 5 + NL -1;
|
|
|
/* verilator lint_off WIDTH */
|
/* verilator lint_off WIDTH */
|
localparam [EXw-1 : 0] MAXX = (NX-1);
|
localparam [EXw-1 : 0] MAXX = (NX-1);
|
localparam [EYw-1 : 0] MAXY = (NY-1);
|
localparam [EYw-1 : 0] MAXY = (NY-1);
|
localparam [EPw-1 : 0] MAXP = (P-1);
|
localparam [EPw-1 : 0] MAXP = (P-1);
|
/* verilator lint_on WIDTH */
|
/* verilator lint_on WIDTH */
|
|
|
|
|
input [EAw-1 : 0] e_addr;
|
input [EAw-1 : 0] e_addr;
|
output [EXw-1 : 0] ex;
|
output [EXw-1 : 0] ex;
|
output [EYw-1 : 0] ey;
|
output [EYw-1 : 0] ey;
|
output [EPw-1 : 0] ep;
|
output [EPw-1 : 0] ep;
|
output valid;
|
output valid;
|
|
|
assign {ep,ey,ex} = e_addr;
|
assign {ep,ey,ex} = e_addr;
|
/* verilator lint_off CMPCONST */
|
/* verilator lint_off CMPCONST */
|
assign valid = ( (ex<= MAXX) & (ey <= MAXY) & (ep<= MAXP) );
|
assign valid = ( (ex<= MAXX) & (ey <= MAXY) & (ep<= MAXP) );
|
/* verilator lint_on CMPCONST */
|
/* verilator lint_on CMPCONST */
|
|
|
|
|
endmodule
|
endmodule
|
|
|
|
|
module fmesh_destp_generator #(
|
module fmesh_destp_generator #(
|
parameter ROUTE_NAME = "XY",
|
parameter ROUTE_NAME = "XY",
|
parameter ROUTE_TYPE = "DETERMINISTIC",
|
parameter ROUTE_TYPE = "DETERMINISTIC",
|
parameter P=5,
|
parameter P=5,
|
parameter DSTPw=4,
|
parameter DSTPw=4,
|
parameter NL=1,
|
parameter NL=1,
|
parameter PLw=1,
|
parameter PLw=1,
|
parameter PPSw=4,
|
parameter PPSw=4,
|
parameter SW_LOC=0,
|
parameter SW_LOC=0,
|
parameter SELF_LOOP_EN="NO"
|
parameter SELF_LOOP_EN="NO"
|
)(
|
)(
|
dest_port_out,
|
dest_port_out,
|
dest_port_coded,
|
dest_port_coded,
|
endp_localp_num,
|
endp_localp_num,
|
swap_port_presel,
|
swap_port_presel,
|
port_pre_sel,
|
port_pre_sel,
|
odd_column
|
odd_column
|
);
|
);
|
localparam P_1 = ( SELF_LOOP_EN=="NO")? P-1 : P;
|
localparam P_1 = ( SELF_LOOP_EN=="NO")? P-1 : P;
|
|
|
input [DSTPw-1 : 0] dest_port_coded;
|
input [DSTPw-1 : 0] dest_port_coded;
|
input [PLw-1 : 0] endp_localp_num;
|
input [PLw-1 : 0] endp_localp_num;
|
output [P_1-1 : 0] dest_port_out;
|
output [P_1-1 : 0] dest_port_out;
|
input swap_port_presel;
|
input swap_port_presel;
|
input [PPSw-1 : 0] port_pre_sel;
|
input [PPSw-1 : 0] port_pre_sel;
|
input odd_column;
|
input odd_column;
|
|
|
wire [P_1-1 : 0] dest_port_in;
|
wire [P_1-1 : 0] dest_port_in;
|
|
|
fmesh_destp_decoder #(
|
fmesh_destp_decoder #(
|
.ROUTE_TYPE(ROUTE_TYPE),
|
.ROUTE_TYPE(ROUTE_TYPE),
|
.P(P),
|
.P(P),
|
.DSTPw(DSTPw),
|
.DSTPw(DSTPw),
|
.NL(NL),
|
.NL(NL),
|
.PLw(PLw),
|
.PLw(PLw),
|
.PPSw(PPSw),
|
.PPSw(PPSw),
|
.SW_LOC(SW_LOC),
|
.SW_LOC(SW_LOC),
|
.SELF_LOOP_EN(SELF_LOOP_EN)
|
.SELF_LOOP_EN(SELF_LOOP_EN)
|
)
|
)
|
decoder
|
decoder
|
(
|
(
|
.dest_port_coded(dest_port_coded),
|
.dest_port_coded(dest_port_coded),
|
.dest_port_out(dest_port_in),
|
.dest_port_out(dest_port_in),
|
.endp_localp_num(endp_localp_num),
|
.endp_localp_num(endp_localp_num),
|
.swap_port_presel(swap_port_presel),
|
.swap_port_presel(swap_port_presel),
|
.port_pre_sel(port_pre_sel)
|
.port_pre_sel(port_pre_sel)
|
);
|
);
|
|
|
assign dest_port_out = dest_port_in;
|
assign dest_port_out = dest_port_in;
|
|
|
endmodule
|
endmodule
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
module fmesh_destp_decoder #(
|
module fmesh_destp_decoder #(
|
parameter ROUTE_TYPE="DETERMINISTIC",
|
parameter ROUTE_TYPE="DETERMINISTIC",
|
parameter P=6,
|
parameter P=6,
|
parameter DSTPw=4,
|
parameter DSTPw=4,
|
parameter NL=2,
|
parameter NL=2,
|
parameter PLw=1,
|
parameter PLw=1,
|
parameter PPSw=4,
|
parameter PPSw=4,
|
parameter SW_LOC=0,
|
parameter SW_LOC=0,
|
parameter SELF_LOOP_EN="NO"
|
parameter SELF_LOOP_EN="NO"
|
)(
|
)(
|
dest_port_coded,
|
dest_port_coded,
|
endp_localp_num,
|
endp_localp_num,
|
dest_port_out,
|
dest_port_out,
|
swap_port_presel,
|
swap_port_presel,
|
port_pre_sel
|
port_pre_sel
|
);
|
);
|
|
|
localparam P_1 = ( SELF_LOOP_EN=="NO")? P-1 : P;
|
localparam P_1 = ( SELF_LOOP_EN=="NO")? P-1 : P;
|
|
|
input [DSTPw-1 : 0] dest_port_coded;
|
input [DSTPw-1 : 0] dest_port_coded;
|
input [PLw-1 : 0] endp_localp_num;
|
input [PLw-1 : 0] endp_localp_num;
|
output [P_1-1 : 0] dest_port_out;
|
output [P_1-1 : 0] dest_port_out;
|
input swap_port_presel;
|
input swap_port_presel;
|
input [PPSw-1 : 0] port_pre_sel;
|
input [PPSw-1 : 0] port_pre_sel;
|
|
|
wire [P-1 : 0] endp_localp_onehot;
|
wire [P-1 : 0] endp_localp_onehot;
|
|
|
reg [4:0] portout;
|
reg [4:0] portout;
|
|
|
generate
|
generate
|
if( ROUTE_TYPE == "DETERMINISTIC") begin :dtrmn
|
if( ROUTE_TYPE == "DETERMINISTIC") begin :dtrmn
|
|
|
|
|
wire x,y,a,b;
|
wire x,y,a,b;
|
assign {x,y,a,b} = dest_port_coded;
|
assign {x,y,a,b} = dest_port_coded;
|
|
|
always @(*)begin
|
always @(*)begin
|
case({a,b})
|
case({a,b})
|
2'b10 : portout = {1'b0,~x,1'b0,x,1'b0};
|
2'b10 : portout = {1'b0,~x,1'b0,x,1'b0};
|
2'b01 : portout = {~y,1'b0,y,1'b0,1'b0};
|
2'b01 : portout = {~y,1'b0,y,1'b0,1'b0};
|
2'b00 : portout = 5'b00001;
|
2'b00 : portout = 5'b00001;
|
2'b11 : portout = {~y,1'b0,y,1'b0,1'b0}; //invalid condition in determinstic routing
|
2'b11 : portout = {~y,1'b0,y,1'b0,1'b0}; //invalid condition in determinstic routing
|
endcase
|
endcase
|
end //always
|
end //always
|
|
|
end else begin : adpv
|
end else begin : adpv
|
|
|
wire x,y,a,b;
|
wire x,y,a,b;
|
assign {x,y,a,b} = dest_port_coded;
|
assign {x,y,a,b} = dest_port_coded;
|
wire [PPSw-1:0] port_pre_sel_final;
|
wire [PPSw-1:0] port_pre_sel_final;
|
assign port_pre_sel_final= (swap_port_presel)? ~port_pre_sel: port_pre_sel;
|
assign port_pre_sel_final= (swap_port_presel)? ~port_pre_sel: port_pre_sel;
|
|
|
always @(*)begin
|
always @(*)begin
|
case({a,b})
|
case({a,b})
|
2'b10 : portout = {1'b0,~x,1'b0,x,1'b0};
|
2'b10 : portout = {1'b0,~x,1'b0,x,1'b0};
|
2'b01 : portout = {~y,1'b0,y,1'b0,1'b0};
|
2'b01 : portout = {~y,1'b0,y,1'b0,1'b0};
|
2'b11 : portout = (port_pre_sel_final[{x,y}])? {~y,1'b0,y,1'b0,1'b0} : {1'b0,~x,1'b0,x,1'b0};
|
2'b11 : portout = (port_pre_sel_final[{x,y}])? {~y,1'b0,y,1'b0,1'b0} : {1'b0,~x,1'b0,x,1'b0};
|
2'b00 : portout = 5'b00001;
|
2'b00 : portout = 5'b00001;
|
endcase
|
endcase
|
end //always
|
end //always
|
end //adaptive
|
end //adaptive
|
|
|
wire [P-1 : 0] destport_onehot;
|
wire [P-1 : 0] destport_onehot;
|
|
|
bin_to_one_hot #(
|
bin_to_one_hot #(
|
.BIN_WIDTH(PLw),
|
.BIN_WIDTH(PLw),
|
.ONE_HOT_WIDTH(P)
|
.ONE_HOT_WIDTH(P)
|
)
|
)
|
conv
|
conv
|
(
|
(
|
.bin_code(endp_localp_num),
|
.bin_code(endp_localp_num),
|
.one_hot_code(endp_localp_onehot)
|
.one_hot_code(endp_localp_onehot)
|
);
|
);
|
if(NL>1) begin :multi
|
if(NL>1) begin :multi
|
assign destport_onehot =(portout[0])? endp_localp_onehot : /*select local destination*/
|
assign destport_onehot =(portout[0])? endp_localp_onehot : /*select local destination*/
|
{ {(NL-1){1'b0}} ,portout};
|
{ {(NL-1){1'b0}} ,portout};
|
end else begin
|
end else begin
|
assign destport_onehot =(portout[0])? endp_localp_onehot : /*select local destination*/
|
assign destport_onehot =(portout[0])? endp_localp_onehot : /*select local destination*/
|
portout;
|
portout;
|
end
|
end
|
|
|
if(SELF_LOOP_EN == "NO") begin :nslp
|
if(SELF_LOOP_EN == "NO") begin :nslp
|
remove_sw_loc_one_hot #(
|
remove_sw_loc_one_hot #(
|
.P(P),
|
.P(P),
|
.SW_LOC(SW_LOC)
|
.SW_LOC(SW_LOC)
|
)
|
)
|
remove_sw_loc
|
remove_sw_loc
|
(
|
(
|
.destport_in(destport_onehot),
|
.destport_in(destport_onehot),
|
.destport_out(dest_port_out)
|
.destport_out(dest_port_out)
|
);
|
);
|
end else begin: slp
|
end else begin: slp
|
assign dest_port_out = destport_onehot;
|
assign dest_port_out = destport_onehot;
|
end
|
end
|
|
|
endgenerate
|
endgenerate
|
endmodule
|
endmodule
|
|
|
|
|
|
|
/********************
|
/********************
|
|
|
distance_gen
|
distance_gen
|
|
|
********************/
|
********************/
|
|
|
module fmesh_distance_gen #(
|
module fmesh_distance_gen #(
|
parameter T1= 4, // number of router in x axis
|
parameter T1= 4, // number of router in x axis
|
parameter T2= 4, // number of router in y axis
|
parameter T2= 4, // number of router in y axis
|
parameter T3= 4,
|
parameter T3= 4,
|
parameter EAw=4,
|
parameter EAw=4,
|
parameter DISTw=4
|
parameter DISTw=4
|
)(
|
)(
|
src_e_addr,
|
src_e_addr,
|
dest_e_addr,
|
dest_e_addr,
|
distance
|
distance
|
);
|
);
|
|
|
function integer log2;
|
function integer log2;
|
input integer number; begin
|
input integer number; begin
|
log2=(number <=1) ? 1: 0;
|
log2=(number <=1) ? 1: 0;
|
while(2**log2
|
while(2**log2
|
log2=log2+1;
|
log2=log2+1;
|
end
|
end
|
end
|
end
|
endfunction // log2
|
endfunction // log2
|
|
|
|
|
localparam
|
localparam
|
Xw = log2(T1), // number of node in x axis
|
Xw = log2(T1), // number of node in x axis
|
Yw = log2(T2); // number of node in y axis
|
Yw = log2(T2); // number of node in y axis
|
localparam [Xw : 0] NX = T1;
|
localparam [Xw : 0] NX = T1;
|
localparam [Yw : 0] NY = T2;
|
localparam [Yw : 0] NY = T2;
|
|
|
|
|
input [EAw-1 : 0] src_e_addr;
|
input [EAw-1 : 0] src_e_addr;
|
input [EAw-1 : 0] dest_e_addr;
|
input [EAw-1 : 0] dest_e_addr;
|
output[DISTw-1: 0]distance;
|
output[DISTw-1: 0]distance;
|
|
|
wire [Xw-1 : 0]src_x,dest_x;
|
wire [Xw-1 : 0]src_x,dest_x;
|
wire [Yw-1 : 0]src_y,dest_y;
|
wire [Yw-1 : 0]src_y,dest_y;
|
|
|
fmesh_endp_addr_decode #(
|
fmesh_endp_addr_decode #(
|
.T1(T1),
|
.T1(T1),
|
.T2(T2),
|
.T2(T2),
|
.T3(T3),
|
.T3(T3),
|
.EAw(EAw)
|
.EAw(EAw)
|
)
|
)
|
src_addr_decode
|
src_addr_decode
|
(
|
(
|
.e_addr(src_e_addr),
|
.e_addr(src_e_addr),
|
.ex(src_x),
|
.ex(src_x),
|
.ey(src_y),
|
.ey(src_y),
|
.ep(),
|
.ep(),
|
.valid()
|
.valid()
|
);
|
);
|
|
|
fmesh_endp_addr_decode #(
|
fmesh_endp_addr_decode #(
|
.T1(T1),
|
.T1(T1),
|
.T2(T2),
|
.T2(T2),
|
.T3(T3),
|
.T3(T3),
|
.EAw(EAw)
|
.EAw(EAw)
|
)
|
)
|
dest_addr_decode
|
dest_addr_decode
|
(
|
(
|
.e_addr(dest_e_addr),
|
.e_addr(dest_e_addr),
|
.ex(dest_x),
|
.ex(dest_x),
|
.ey(dest_y),
|
.ey(dest_y),
|
.ep(),
|
.ep(),
|
.valid()
|
.valid()
|
);
|
);
|
|
|
reg [Xw-1 : 0] x_offset;
|
reg [Xw-1 : 0] x_offset;
|
reg [Yw-1 : 0] y_offset;
|
reg [Yw-1 : 0] y_offset;
|
|
|
always @(*) begin
|
always @(*) begin
|
x_offset = (src_x> dest_x)? src_x - dest_x : dest_x - src_x;
|
x_offset = (src_x> dest_x)? src_x - dest_x : dest_x - src_x;
|
y_offset = (src_y> dest_y)? src_y - dest_y : dest_y - src_y;
|
y_offset = (src_y> dest_y)? src_y - dest_y : dest_y - src_y;
|
end
|
end
|
|
|
|
|
/* verilator lint_off WIDTH */
|
/* verilator lint_off WIDTH */
|
assign distance = x_offset + y_offset +1'b1;
|
assign distance = x_offset + y_offset +1'b1;
|
/* verilator lint_on WIDTH */
|
/* verilator lint_on WIDTH */
|
endmodule
|
endmodule
|
|
|
|
|
|
|