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
[/] [an-fpga-implementation-of-low-latency-noc-based-mpsoc/] [trunk/] [mpsoc/] [rtl/] [src_openpiton/] [piton_mesh.sv] - Rev 56
Compare with Previous | Blame | View Log
`timescale 1ns/1ps`include "define.tmp.h"/*********************************** pack openpiton routers ports** ******************************/module piton_router_top(clk,reset,current_r_addr,chan_in,chan_out);import piton_pkg::*;import pronoc_pkg::*;localparam P=5;input clk, reset;input [RAw-1 : 0] current_r_addr;input piton_chan_t chan_in [P-1 : 0];output piton_chan_t chan_out [P-1 : 0];wire [`NOC_X_WIDTH-1:0] myLocX; // thiwire [`NOC_Y_WIDTH-1:0] myLocY;wire [`NOC_CHIPID_WIDTH-1:0] myChipID;assign myLocY = (current_r_addr / `PITON_X_TILES ) % `PITON_Y_TILES ;assign myLocX = (current_r_addr % `PITON_X_TILES );assign myChipID =0;dynamic_node_top_wrap router(.clk(clk),.reset_in(reset),// dataIn (to input blocks).dataIn_N(chan_in[NORTH].data),.dataIn_E(chan_in[EAST ].data),.dataIn_S(chan_in[SOUTH].data),.dataIn_W(chan_in[WEST ].data),.dataIn_P(chan_in[LOCAL].data),// validIn (to input blocks).validIn_N(chan_in[NORTH].valid),.validIn_E(chan_in[EAST ].valid),.validIn_S(chan_in[SOUTH].valid),.validIn_W(chan_in[WEST ].valid),.validIn_P(chan_in[LOCAL].valid),// yummy (from nighboring inputlocks).yummyIn_N(chan_in[NORTH].yummy),.yummyIn_E(chan_in[EAST ].yummy),.yummyIn_S(chan_in[SOUTH].yummy),.yummyIn_W(chan_in[WEST ].yummy),.yummyIn_P(chan_in[LOCAL].yummy),// My Absolute Address.myLocX(myLocX),.myLocY(myLocY),.myChipID(myChipID),//.ec_cfg(15'b0),//ec_dyn_cfg[14:0]),//.store_meter_partner_address_X(5'b0)//.store_meter_partner_address_Y(5'b0)// DataOut (from crossbar).dataOut_N(chan_out[NORTH].data),.dataOut_E(chan_out[EAST ].data),.dataOut_S(chan_out[SOUTH].data),.dataOut_W(chan_out[WEST ].data),.dataOut_P(chan_out[LOCAL].data),// validOut (from crossbar).validOut_N(chan_out[NORTH].valid),.validOut_E(chan_out[EAST ].valid),.validOut_S(chan_out[SOUTH].valid),.validOut_W(chan_out[WEST ].valid),.validOut_P(chan_out[LOCAL].valid),// yummyOut (to neighboring outpu.yummyOut_N(chan_out[NORTH].yummy),.yummyOut_E(chan_out[EAST ].yummy),.yummyOut_W(chan_out[WEST].yummy),.yummyOut_S(chan_out[SOUTH ].yummy),.yummyOut_P(chan_out[LOCAL].yummy),// thanksIn (to CGNO).thanksIn_P()//?);endmodule/********************** piton_mesh** ********************/`define router_id(x,y) ((y * NX) + x)`define endp_id(x,y,l) ((y * NX) + x) * NL + lmodule piton_mesh(clk,reset,chan_in_all,chan_out_all);import piton_pkg::*;import pronoc_pkg::*;input clk, reset;//local portsinput piton_chan_t chan_in_all [NE-1 : 0];output piton_chan_t chan_out_all [NE-1 : 0];//all routers portpiton_chan_t router_chan_in [NR-1 :0][MAX_P-1 : 0];piton_chan_t router_chan_out [NR-1 :0][MAX_P-1 : 0];wire [RAw-1 : 0] current_r_addr [NR-1 : 0];// mesh toruslocalparamEAST = 3'd1,NORTH = 3'd2,WEST = 3'd3,SOUTH = 3'd4;//ring linelocalparamFORWARD = 2'd1,BACKWARD= 2'd2;genvar x,y,l;generate/* verilator lint_off WIDTH */if( TOPOLOGY == "RING" || TOPOLOGY == "LINE") begin : ring_line/* verilator lint_on WIDTH */for (x=0; x<NX; x=x+1) begin :Router_assign current_r_addr [x] = x[RAw-1: 0];piton_router_top the_router (.current_r_addr (current_r_addr [x]),.chan_in (router_chan_in [x]),.chan_out (router_chan_out[x]),.clk (clk ),.reset (reset ));if(x < NX-1) begin: not_last_nodeassign router_chan_in[x][FORWARD] = router_chan_out [(x+1)][BACKWARD];end else begin :last_node/* verilator lint_off WIDTH */if(TOPOLOGY == "LINE") begin : line_last_x/* verilator lint_on WIDTH */assign router_chan_in[x][FORWARD]= {PITON_CHANEL_w{1'b0}};end else begin : ring_last_xassign router_chan_in[x][FORWARD]= router_chan_out [0][BACKWARD];endendif(x>0)begin :not_first_xassign router_chan_in[x][BACKWARD]= router_chan_out [(x-1)][FORWARD];end else begin :first_x/* verilator lint_off WIDTH */if(TOPOLOGY == "LINE") begin : line_first_x/* verilator lint_on WIDTH */assign router_chan_in[x][BACKWARD]={PITON_CHANEL_w{1'b0}};end else begin : ring_first_xassign router_chan_in[x][BACKWARD]= router_chan_out [(NX-1)][FORWARD];endend// connect other local portsfor (l=0; l<NL; l=l+1) begin :localslocalparam ENDPID = `endp_id(x,0,l);localparam LOCALP = (l==0) ? l : l + R2R_CHANELS_MESH_TORI; // first local port is connected to router port 0. The rest are connected at the endassign router_chan_in[x][LOCALP]= chan_in_all [ENDPID];assign chan_out_all [ENDPID] = router_chan_out[x][LOCALP];end// localsend//xend else begin :mesh_torusfor (y=0; y<NY; y=y+1) begin: y_loopfor (x=0; x<NX; x=x+1) begin :x_looplocalparam R_ADDR = (y<<NXw) + x;localparam ROUTER_NUM = (y * NX) + x;assign current_r_addr [ROUTER_NUM] = R_ADDR[RAw-1 :0];piton_router_top the_router (.current_r_addr (current_r_addr [ROUTER_NUM]),.chan_in (router_chan_in [ROUTER_NUM]),.chan_out (router_chan_out[ROUTER_NUM]),.clk (clk ),.reset (reset ));/*in [x,y][east] <------ out [x+1 ,y ][west] ;in [x,y][north] <------ out [x ,y-1][south] ;in [x,y][west] <------ out [x-1 ,y ][east] ;in [x,y][south] <------ out [x ,y+1][north] ;*/if(x < NX-1) begin: not_last_xassign router_chan_in[`router_id(x,y)][EAST]= router_chan_out [`router_id(x+1,y)][WEST];//assign router_credit_in_all [`SELECT_WIRE(x,y,EAST,V)] = router_credit_out_all [`SELECT_WIRE((x+1),y,WEST,V)];end else begin :last_x/* verilator lint_off WIDTH */if(TOPOLOGY == "MESH") begin :last_x_mesh/* verilator lint_on WIDTH */assign router_chan_in[`router_id(x,y)][EAST] = {PITON_CHANEL_w{1'b0}};/* verilator lint_off WIDTH */end else if(TOPOLOGY == "TORUS") begin : last_x_torus/* verilator lint_on WIDTH */assign router_chan_in[`router_id(x,y)][EAST] = router_chan_out [`router_id(0,y)][WEST];/* verilator lint_off WIDTH */end else if(TOPOLOGY == "FMESH") begin : last_x_fmesh //connect to endp/* verilator lint_on WIDTH */localparam EAST_ID = NX*NY*NL + 2*NX + NY +y;assign router_chan_in [`router_id(x,y)][EAST] = chan_in_all [EAST_ID];assign chan_out_all [EAST_ID] = router_chan_out [`router_id(x,y)][EAST];end //topologyendif(y>0) begin : not_first_yassign router_chan_in[`router_id(x,y)][NORTH] = router_chan_out [`router_id(x,(y-1))][SOUTH];end else begin :first_y/* verilator lint_off WIDTH */if(TOPOLOGY == "MESH") begin : first_y_mesh/* verilator lint_on WIDTH */assign router_chan_in[`router_id(x,y)][NORTH] = {PITON_CHANEL_w{1'b0}};/* verilator lint_off WIDTH */end else if(TOPOLOGY == "TORUS") begin :first_y_torus/* verilator lint_on WIDTH */assign router_chan_in[`router_id(x,y)][NORTH] = router_chan_out [`router_id(x,(NY-1))][SOUTH];/* verilator lint_off WIDTH */end else if(TOPOLOGY == "FMESH") begin : first_y_fmesh //connect to endp/* verilator lint_on WIDTH */localparam NORTH_ID = NX*NY*NL + x;assign router_chan_in [`router_id(x,y)][NORTH] = chan_in_all [NORTH_ID];assign chan_out_all [NORTH_ID] = router_chan_out [`router_id(x,y)][NORTH];end//topologyend//y>0if(x>0)begin :not_first_xassign router_chan_in[`router_id(x,y)][WEST] = router_chan_out [`router_id((x-1),y)][EAST];end else begin :first_x/* verilator lint_off WIDTH */if(TOPOLOGY == "MESH") begin :first_x_mesh/* verilator lint_on WIDTH */assign router_chan_in[`router_id(x,y)][WEST] = {PITON_CHANEL_w{1'b0}};/* verilator lint_off WIDTH */end else if(TOPOLOGY == "TORUS") begin :first_x_torus/* verilator lint_on WIDTH */assign router_chan_in[`router_id(x,y)][WEST] = router_chan_out [`router_id((NX-1),y)][EAST] ;/* verilator lint_off WIDTH */end else if(TOPOLOGY == "FMESH") begin : first_x_fmesh //connect to endp/* verilator lint_on WIDTH */localparam WEST_ID = NX*NY*NL +2*NX + y;assign router_chan_in [`router_id(x,y)][WEST] = chan_in_all [WEST_ID];assign chan_out_all [WEST_ID] = router_chan_out [`router_id(x,y)][WEST];end//topologyendif(y < NY-1) begin : firstyassign router_chan_in[`router_id(x,y)][SOUTH] = router_chan_out [`router_id(x,(y+1))][NORTH];end else begin : lasty/* verilator lint_off WIDTH */if(TOPOLOGY == "MESH") begin :ly_mesh/* verilator lint_on WIDTH */assign router_chan_in[`router_id(x,y)][SOUTH]= {PITON_CHANEL_w{1'b0}};/* verilator lint_off WIDTH */end else if(TOPOLOGY == "TORUS") begin :ly_torus/* verilator lint_on WIDTH */assign router_chan_in[`router_id(x,y)][SOUTH]= router_chan_out [`router_id(x,0)][NORTH];end else if(TOPOLOGY == "FMESH") begin : ly_fmesh //connect to endp/* verilator lint_on WIDTH */localparam SOUTH_ID = NX*NY*NL + NX + x;assign router_chan_in [`router_id(x,y)][SOUTH] = chan_in_all [SOUTH_ID];assign chan_out_all [SOUTH_ID] = router_chan_out [`router_id(x,y)][SOUTH];end//topologyend// endpoint(s) connection// connect other local portsfor (l=0; l<NL; l=l+1) begin :localslocalparam ENDPID = `endp_id(x,y,l);localparam LOCALP = (l==0) ? l : l + R2R_CHANELS_MESH_TORI; // first local port is connected to router port 0. The rest are connected at the endassign router_chan_in [`router_id(x,y)][LOCALP] = chan_in_all [ENDPID];assign chan_out_all [ENDPID] = router_chan_out [`router_id(x,y)][LOCALP];end// localsend //yend //xend// mesh_torusendgenerateendmodulemodule piton_mesh_pronoc_wrap(clk,reset,chan_in_all,chan_out_all);import piton_pkg::*;import pronoc_pkg::*;input clk,reset;//local ports ProNoC interfaceinput smartflit_chanel_t chan_in_all [NE-1 : 0];output smartflit_chanel_t chan_out_all [NE-1 : 0];//piton interfacepiton_chan_t piton_chan_in_all [NE-1 : 0];piton_chan_t piton_chan_out_all [NE-1 : 0];piton_mesh pmesh(.clk (clk ),.reset (reset ),.chan_in_all (piton_chan_in_all ),.chan_out_all(piton_chan_out_all));localparamNX = T1,NY = T2,RXw = log2(NX), // number of node in x axisRYw = log2(NY),EXw = log2(NX), // number of node in x axisEYw = log2(NY); // number of node in y axiswire [RXw-1 : 0] current_x [NE-1 : 0];wire [RYw-1 : 0] current_y [NE-1 : 0];reg [`XY_WIDTH-1:0] myLocX [NE-1 : 0]; // thireg [`XY_WIDTH-1:0] myLocY [NE-1 : 0];reg [`CHIP_ID_WIDTH-1:0] myChipID[NE-1 : 0];genvar i;generatefor (i=0; i<NE;i++) begin :E_mesh_tori_router_addr_decode #(.TOPOLOGY(TOPOLOGY),.T1(T1),.T2(T2),.T3(T3),.RAw(RAw))r_addr_decode(.r_addr(i[RAw-1:0]),.rx(current_x[i]),.ry(current_y[i]),.valid());always @(*) beginmyLocX[i] = {`XY_WIDTH{1'b0}};myLocY[i] = {`XY_WIDTH{1'b0}};myChipID[i] = {`CHIP_ID_WIDTH{1'b0}};myLocX[i] [RXw-1 : 0] = current_x[i];myLocY[i] [RYw-1 : 0] = current_y[i];endpiton_to_pronoc_wrapper #(.NOC_NUM(1),.TILE_NUM(i),.CHIP_SET_PORT(0),.FLATID_WIDTH(FLATID_WIDTH)) pi2pr_wrapper1(.default_chipid(myChipID[i]), .default_coreid_x(myLocX[i]), .default_coreid_y(myLocY[i]), .flat_tileid(i[FLATID_WIDTH-1 : 0]),.reset(reset),.clk (clk),.dataIn (piton_chan_out_all[i].data),.validIn(piton_chan_out_all[i].valid),.yummyIn(piton_chan_out_all[i].yummy),.chan_out(chan_out_all[i]),.current_r_addr_i(i[RAw-1:0]));pronoc_to_piton_wrapper #(.NOC_NUM(1),.TILE_NUM(i),.FLATID_WIDTH(FLATID_WIDTH)) pr2pi_wrapper1(.default_chipid(myChipID[i]), .default_coreid_x(myLocX[i]), .default_coreid_y(myLocY[i]), .flat_tileid(i[FLATID_WIDTH-1:0]),.reset(reset),.clk (clk),.dataOut (piton_chan_in_all[i].data ),.validOut(piton_chan_in_all[i].valid ),.yummyOut(piton_chan_in_all[i].yummy ),.chan_in (chan_in_all[i] ),.current_r_addr_o( ));endendgenerateendmodule
