OpenCores
URL https://opencores.org/ocsvn/async_sdm_noc/async_sdm_noc/trunk

Subversion Repositories async_sdm_noc

[/] [async_sdm_noc/] [trunk/] [vc/] [src/] [rcb_vc.v] - Diff between revs 38 and 47

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 38 Rev 47
/*
/*
 Asynchronous SDM NoC
 Asynchronous SDM NoC
 (C)2011 Wei Song
 (C)2011 Wei Song
 Advanced Processor Technologies Group
 Advanced Processor Technologies Group
 Computer Science, the Univ. of Manchester, UK
 Computer Science, the Univ. of Manchester, UK
 
 
 Authors:
 Authors:
 Wei Song     wsong83@gmail.com
 Wei Song     wsong83@gmail.com
 
 
 License: LGPL 3.0 or later
 License: LGPL 3.0 or later
 
 
 The request crossbar in the VC allocator of VC routers.
 The request crossbar in the VC allocator of VC routers.
 
 
 History:
 History:
 04/04/2010  Initial version. <wsong83@gmail.com>
 04/04/2010  Initial version. <wsong83@gmail.com>
 01/06/2011  Clean up for opensource. <wsong83@gmail.com>
 01/06/2011  Clean up for opensource. <wsong83@gmail.com>
 
 
*/
*/
 
 
module rcb_vc (/*AUTOARG*/
module rcb_vc (/*AUTOARG*/
   // Outputs
   // Outputs
   ro, srt, nrt, lrt, wrt, ert, wctla, ectla, lctla, sctla, nctla,
   ro, srt, nrt, lrt, wrt, ert, wctla, ectla, lctla, sctla, nctla,
   // Inputs
   // Inputs
   ri, go, wctl, ectl, lctl, sctl, nctl
   ri, go, wctl, ectl, lctl, sctl, nctl
   );
   );
 
 
   parameter VCN = 2;           // the number of VCs per direction
   parameter VCN = 2;           // the number of VCs per direction
 
 
   input [4:0][VCN-1:0][1:0] ri; // the request input from all inputs
   input [4:0][VCN-1:0][1:0] ri; // the request input from all inputs
   output [4:0][VCN-1:0]     ro; // the request output to all output port arbiters
   output [4:0][VCN-1:0]     ro; // the request output to all output port arbiters
   input [4:0][VCN-1:0]      go; // the granted VC info from all output port arbiters
   input [4:0][VCN-1:0]      go; // the granted VC info from all output port arbiters
   output [VCN-1:0][3:0]     srt, nrt, lrt; // routing guide to all input ports
   output [VCN-1:0][3:0]     srt, nrt, lrt; // routing guide to all input ports
   output [VCN-1:0][1:0]     wrt, ert;
   output [VCN-1:0][1:0]     wrt, ert;
   input [VCN*4*VCN-1:0]     wctl, ectl, lctl; // the configuration from VCA
   input [VCN*4*VCN-1:0]     wctl, ectl, lctl; // the configuration from VCA
   input [VCN*2*VCN-1:0]     sctl, nctl;
   input [VCN*2*VCN-1:0]     sctl, nctl;
   output [VCN*4*VCN-1:0]    wctla, ectla, lctla; // the ack to VCA, fire when the frame is sent
   output [VCN*4*VCN-1:0]    wctla, ectla, lctla; // the ack to VCA, fire when the frame is sent
   output [VCN*2*VCN-1:0]    sctla, nctla;
   output [VCN*2*VCN-1:0]    sctla, nctla;
 
 
 
 
   wire [VCN*4*VCN-1:0][1:0] wri, eri, lri;
   wire [VCN*4*VCN-1:0][1:0] wri, eri, lri;
   wire [VCN*4*VCN-1:0]      wgi, wgo, wro, egi, ego, ero, lgi, lgo, lro;
   wire [VCN*4*VCN-1:0]      wgi, wgo, wro, egi, ego, ero, lgi, lgo, lro;
   wire [VCN*2*VCN-1:0][1:0] sri, nri;
   wire [VCN*2*VCN-1:0][1:0] sri, nri;
   wire [VCN*2*VCN-1:0]      sgi, sgo, sro, ngi, ngo, nro;
   wire [VCN*2*VCN-1:0]      sgi, sgo, sro, ngi, ngo, nro;
   wire [4*VCN*VCN-1:0]      wgis, egis, lgis;
   wire [4*VCN*VCN-1:0]      wgis, egis, lgis;
   wire [2*VCN*VCN-1:0]      sgis, ngis;
   wire [2*VCN*VCN-1:0]      sgis, ngis;
 
 
   genvar                 i,j;
   genvar                 i,j;
 
 
   generate
   generate
      for(i=0; i<VCN; i++) begin:RI
      for(i=0; i<VCN; i++) begin:RI
         // shuffle the input requests to all output ports
         // shuffle the input requests to all output ports
         for(j=0; j<VCN; j++) begin: J
         for(j=0; j<VCN; j++) begin: J
            assign sri[i*2*VCN+0*VCN+j] = ri[2][j];
            assign sri[i*2*VCN+0*VCN+j] = ri[2][j];
            assign sri[i*2*VCN+1*VCN+j] = ri[4][j];
            assign sri[i*2*VCN+1*VCN+j] = ri[4][j];
            assign wri[i*4*VCN+0*VCN+j] = ri[0][j];
            assign wri[i*4*VCN+0*VCN+j] = ri[0][j];
            assign wri[i*4*VCN+1*VCN+j] = ri[2][j];
            assign wri[i*4*VCN+1*VCN+j] = ri[2][j];
            assign wri[i*4*VCN+2*VCN+j] = ri[3][j];
            assign wri[i*4*VCN+2*VCN+j] = ri[3][j];
            assign wri[i*4*VCN+3*VCN+j] = ri[4][j];
            assign wri[i*4*VCN+3*VCN+j] = ri[4][j];
            assign nri[i*2*VCN+0*VCN+j] = ri[0][j];
            assign nri[i*2*VCN+0*VCN+j] = ri[0][j];
            assign nri[i*2*VCN+1*VCN+j] = ri[4][j];
            assign nri[i*2*VCN+1*VCN+j] = ri[4][j];
            assign eri[i*4*VCN+0*VCN+j] = ri[0][j];
            assign eri[i*4*VCN+0*VCN+j] = ri[0][j];
            assign eri[i*4*VCN+1*VCN+j] = ri[1][j];
            assign eri[i*4*VCN+1*VCN+j] = ri[1][j];
            assign eri[i*4*VCN+2*VCN+j] = ri[2][j];
            assign eri[i*4*VCN+2*VCN+j] = ri[2][j];
            assign eri[i*4*VCN+3*VCN+j] = ri[4][j];
            assign eri[i*4*VCN+3*VCN+j] = ri[4][j];
            assign lri[i*4*VCN+0*VCN+j] = ri[0][j];
            assign lri[i*4*VCN+0*VCN+j] = ri[0][j];
            assign lri[i*4*VCN+1*VCN+j] = ri[1][j];
            assign lri[i*4*VCN+1*VCN+j] = ri[1][j];
            assign lri[i*4*VCN+2*VCN+j] = ri[2][j];
            assign lri[i*4*VCN+2*VCN+j] = ri[2][j];
            assign lri[i*4*VCN+3*VCN+j] = ri[3][j];
            assign lri[i*4*VCN+3*VCN+j] = ri[3][j];
         end
         end
 
 
         // generate the requests to output port arbiters
         // generate the requests to output port arbiters
         assign ro[0][i] = |sro[i*2*VCN +: 2*VCN];
         assign ro[0][i] = |sro[i*2*VCN +: 2*VCN];
         assign ro[1][i] = |wro[i*4*VCN +: 4*VCN];
         assign ro[1][i] = |wro[i*4*VCN +: 4*VCN];
         assign ro[2][i] = |nro[i*2*VCN +: 2*VCN];
         assign ro[2][i] = |nro[i*2*VCN +: 2*VCN];
         assign ro[3][i] = |ero[i*4*VCN +: 4*VCN];
         assign ro[3][i] = |ero[i*4*VCN +: 4*VCN];
         assign ro[4][i] = |lro[i*4*VCN +: 4*VCN];
         assign ro[4][i] = |lro[i*4*VCN +: 4*VCN];
 
 
         // demux to duplicate the grant to all input ports
         // demux to duplicate the grant to all input ports
         assign sgo[i*2*VCN +: 2*VCN] = {2*VCN{go[0][i]}};
         assign sgo[i*2*VCN +: 2*VCN] = {2*VCN{go[0][i]}};
         assign wgo[i*4*VCN +: 4*VCN] = {4*VCN{go[1][i]}};
         assign wgo[i*4*VCN +: 4*VCN] = {4*VCN{go[1][i]}};
         assign ngo[i*2*VCN +: 2*VCN] = {2*VCN{go[2][i]}};
         assign ngo[i*2*VCN +: 2*VCN] = {2*VCN{go[2][i]}};
         assign ego[i*4*VCN +: 4*VCN] = {4*VCN{go[3][i]}};
         assign ego[i*4*VCN +: 4*VCN] = {4*VCN{go[3][i]}};
         assign lgo[i*4*VCN +: 4*VCN] = {4*VCN{go[4][i]}};
         assign lgo[i*4*VCN +: 4*VCN] = {4*VCN{go[4][i]}};
 
 
         // generate the routing guide from output grants (sgo -- lgo)
         // generate the routing guide from output grants (sgo -- lgo)
         assign srt[i] = {|lgis[(0*VCN+i)*VCN +: VCN], |egis[(0*VCN+i)*VCN +: VCN], |ngis[(0*VCN+i)*VCN +: VCN], |wgis[(0*VCN+i)*VCN +: VCN]};
         assign srt[i] = {|lgis[(0*VCN+i)*VCN +: VCN], |egis[(0*VCN+i)*VCN +: VCN], |ngis[(0*VCN+i)*VCN +: VCN], |wgis[(0*VCN+i)*VCN +: VCN]};
         assign wrt[i] = {|lgis[(1*VCN+i)*VCN +: VCN], |egis[(1*VCN+i)*VCN +: VCN]};
         assign wrt[i] = {|lgis[(1*VCN+i)*VCN +: VCN], |egis[(1*VCN+i)*VCN +: VCN]};
         assign nrt[i] = {|lgis[(2*VCN+i)*VCN +: VCN], |egis[(2*VCN+i)*VCN +: VCN], |wgis[(1*VCN+i)*VCN +: VCN], |sgis[(0*VCN+i)*VCN +: VCN]};
         assign nrt[i] = {|lgis[(2*VCN+i)*VCN +: VCN], |egis[(2*VCN+i)*VCN +: VCN], |wgis[(1*VCN+i)*VCN +: VCN], |sgis[(0*VCN+i)*VCN +: VCN]};
         assign ert[i] = {|lgis[(3*VCN+i)*VCN +: VCN], |wgis[(2*VCN+i)*VCN +: VCN]};
         assign ert[i] = {|lgis[(3*VCN+i)*VCN +: VCN], |wgis[(2*VCN+i)*VCN +: VCN]};
         assign lrt[i] = {|egis[(3*VCN+i)*VCN +: VCN], |ngis[(1*VCN+i)*VCN +: VCN], |wgis[(3*VCN+i)*VCN +: VCN], |sgis[(1*VCN+i)*VCN +: VCN]};
         assign lrt[i] = {|egis[(3*VCN+i)*VCN +: VCN], |ngis[(1*VCN+i)*VCN +: VCN], |wgis[(3*VCN+i)*VCN +: VCN], |sgis[(1*VCN+i)*VCN +: VCN]};
 
 
         // part of the routing guide process
         // part of the routing guide process
         for(j=0; j<4*VCN; j++) begin:SB
         for(j=0; j<4*VCN; j++) begin:SB
            assign wgis[j*VCN+i] = wgi[i*4*VCN+j];
            assign wgis[j*VCN+i] = wgi[i*4*VCN+j];
            assign egis[j*VCN+i] = egi[i*4*VCN+j];
            assign egis[j*VCN+i] = egi[i*4*VCN+j];
            assign lgis[j*VCN+i] = lgi[i*4*VCN+j];
            assign lgis[j*VCN+i] = lgi[i*4*VCN+j];
         end
         end
 
 
         for(j=0; j<2*VCN; j++) begin:SL
         for(j=0; j<2*VCN; j++) begin:SL
            assign sgis[j*VCN+i] = sgi[i*2*VCN+j];
            assign sgis[j*VCN+i] = sgi[i*2*VCN+j];
            assign ngis[j*VCN+i] = ngi[i*2*VCN+j];
            assign ngis[j*VCN+i] = ngi[i*2*VCN+j];
         end
         end
      end
      end
 
 
      // cross points
      // cross points
      for(i=0; i<VCN*4*VCN; i++) begin:BB
      for(i=0; i<VCN*4*VCN; i++) begin:BB
         RCBB W (.ri(wri[i]), .ro(wro[i]), .go(wgo[i]), .gi(wgi[i]), .ctl(wctl[i]), .ctla(wctla[i]));
         RCBB W (.ri(wri[i]), .ro(wro[i]), .go(wgo[i]), .gi(wgi[i]), .ctl(wctl[i]), .ctla(wctla[i]));
         RCBB E (.ri(eri[i]), .ro(ero[i]), .go(ego[i]), .gi(egi[i]), .ctl(ectl[i]), .ctla(ectla[i]));
         RCBB E (.ri(eri[i]), .ro(ero[i]), .go(ego[i]), .gi(egi[i]), .ctl(ectl[i]), .ctla(ectla[i]));
         RCBB L (.ri(lri[i]), .ro(lro[i]), .go(lgo[i]), .gi(lgi[i]), .ctl(lctl[i]), .ctla(lctla[i]));
         RCBB L (.ri(lri[i]), .ro(lro[i]), .go(lgo[i]), .gi(lgi[i]), .ctl(lctl[i]), .ctla(lctla[i]));
      end
      end
      for(i=0; i<VCN*2*VCN; i++) begin:BL
      for(i=0; i<VCN*2*VCN; i++) begin:BL
         RCBB S (.ri(sri[i]), .ro(sro[i]), .go(sgo[i]), .gi(sgi[i]), .ctl(sctl[i]), .ctla(sctla[i]));
         RCBB S (.ri(sri[i]), .ro(sro[i]), .go(sgo[i]), .gi(sgi[i]), .ctl(sctl[i]), .ctla(sctla[i]));
         RCBB N (.ri(nri[i]), .ro(nro[i]), .go(ngo[i]), .gi(ngi[i]), .ctl(nctl[i]), .ctla(nctla[i]));
         RCBB N (.ri(nri[i]), .ro(nro[i]), .go(ngo[i]), .gi(ngi[i]), .ctl(nctl[i]), .ctla(nctla[i]));
      end
      end
   endgenerate
   endgenerate
 
 
endmodule // rcb_vc
endmodule // rcb_vc
 
 
// Request CrossBar cross point Block
// Request CrossBar cross point Block
module RCBB (ri, ro, go, gi, ctl, ctla);
module RCBB (ri, ro, go, gi, ctl, ctla);
   input [1:0] ri;               // requests from input ports (0: data and head, 1: eof)
   input [1:0] ri;               // requests from input ports (0: data and head, 1: eof)
   output      ro;              // requests to output ports
   output      ro;              // requests to output ports
   input       go;              // grant from output ports
   input       go;              // grant from output ports
   output      gi;              // grant to input ports, later translated into routing guide
   output      gi;              // grant to input ports, later translated into routing guide
   input       ctl;             // configuration from VCA
   input       ctl;             // configuration from VCA
   output      ctla;            // configuration ack to VCA, fire after ri[1] fires
   output      ctla;            // configuration ack to VCA, fire after ri[1] fires
 
 
   wire [1:0]  m;
   wire [1:0]  m;
 
 
 
 
   c2  I0 (.a0(ri[1]), .a1(ctl), .q(m[1]));
   c2  I0 (.a0(ri[1]), .a1(ctl), .q(m[1]));
   and I1 ( m[0], ri[0], ctl);
   and I1 ( m[0], ri[0], ctl);
   or  I2 ( ro, m[0], m[1]);
   or  I2 ( ro, m[0], m[1]);
   c2  I3 ( .a0(ro), .a1(go), .q(gi));
   c2  I3 ( .a0(ro), .a1(go), .q(gi));
   c2  IA ( .a0(m[1]), .a1(go), .q(ctla));
   c2  IA ( .a0(m[1]), .a1(go), .q(ctla));
 
 
endmodule // RCBB
endmodule // RCBB
 
 
 
 
 
 

powered by: WebSVN 2.1.0

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