URL
https://opencores.org/ocsvn/async_sdm_noc/async_sdm_noc/trunk
Subversion Repositories async_sdm_noc
Compare Revisions
- This comparison shows the changes necessary to convert path
/async_sdm_noc/branches
- from Rev 38 to Rev 39
- ↔ Reverse comparison
Rev 38 → Rev 39
/init/vc/src/fcctl.v
0,0 → 1,62
/* |
Asynchronous SDM NoC |
(C)2011 Wei Song |
Advanced Processor Technologies Group |
Computer Science, the Univ. of Manchester, UK |
|
Authors: |
Wei Song wsong83@gmail.com |
|
License: LGPL 3.0 or later |
|
Flow control unit. |
|
History: |
31/03/2010 Initial version. <wsong83@gmail.com> |
12/05/2010 Use MPxP crossbar. <wsong83@gmail.com> |
02/06/2011 Clean up for opensource. <wsong83@gmail.com> |
|
*/ |
|
module fcctl ( /*AUTOARG*/ |
// Outputs |
afc, ro, |
// Inputs |
credit, ri, rst |
); |
parameter VCN = 2; // number of VCs per direction |
parameter PD = 3; // depth of an input VC buffer |
|
input [VCN-1:0] credit; // credit input from the next router |
output [VCN-1:0] afc; // ack for the credit input |
input [VCN-1:0] ri; // VC request from VCA |
output [VCN-1:0] ro; // credit grant output |
input rst; // active high reset |
|
wire [PD:0][VCN-1:0] cp, cpa; |
|
genvar i,j; |
|
// the credit pipeline |
generate |
for(i=0; i<PD; i++) begin: P |
for(j=0; j<VCN; j++) begin: V |
cpipe CP (.cia(cpa[i][j]), .co(cp[i+1][j]), .rst(rst), .ci(cp[i][j]), .coa(cpa[i+1][j])); |
end |
end |
endgenerate |
|
// grant a credit to a VC request |
generate |
for(i=0; i<VCN; i++) begin:R |
dc2 CR (.a(ri[i]), .d(cp[PD][i]), .q(cpa[PD][i])); |
end |
endgenerate |
|
assign ro = cpa[PD]; |
assign cp[0] = credit; |
assign afc = cpa[0]; |
|
endmodule // fcctl |
|
|
/init/vc/src/dcb_vc.v
0,0 → 1,310
/* |
Asynchronous SDM NoC |
(C)2011 Wei Song |
Advanced Processor Technologies Group |
Computer Science, the Univ. of Manchester, UK |
|
Authors: |
Wei Song wsong83@gmail.com |
|
License: LGPL 3.0 or later |
|
data crossbar for the VC router |
|
History: |
04/04/2010 Initial version. <wsong83@gmail.com> |
12/05/2010 Use MPxP crossbar. <wsong83@gmail.com> |
02/06/2011 Clean up for opensource. <wsong83@gmail.com> |
|
*/ |
|
module dcb_vc (/*AUTOARG*/ |
// Outputs |
dia, do0, do1, do2, do3, dot, |
// Inputs |
di0, di1, di2, di3, dit, srtg, nrtg, lrtg, wrtg, ertg, doa |
); |
parameter DW = 32; // data width of a VC |
parameter FT = 3; // wire count of the flit tyoe bus |
parameter VCN = 2; // number of VC per direction |
parameter SCN = DW/2; |
|
input [4:0][VCN-1:0][SCN-1:0] di0, di1, di2, di3; // data input |
input [4:0][VCN-1:0][FT-1:0] dit; // flit type input |
output [4:0][VCN-1:0] dia; // input ack |
input [VCN-1:0][3:0] srtg, nrtg, lrtg; // routing guide |
input [VCN-1:0][1:0] wrtg, ertg; |
|
output [4:0][SCN-1:0] do0, do1, do2, do3; // data output |
output [4:0][FT-1:0] dot; // flit type output |
input [4:0] doa; // output ack |
|
// internal wires |
wire [VCN-1:0][3:0][SCN-1:0] s0, s1, s2, s3; |
wire [VCN-1:0][3:0][FT-1:0] sft; |
wire [VCN-1:0][3:0] sa; |
wire [VCN-1:0][1:0][SCN-1:0] w0, w1, w2, w3; |
wire [VCN-1:0][1:0][FT-1:0] wft; |
wire [VCN-1:0][1:0] wa; |
wire [VCN-1:0][3:0][SCN-1:0] n0, n1, n2, n3; |
wire [VCN-1:0][3:0][FT-1:0] nft; |
wire [VCN-1:0][3:0] na; |
wire [VCN-1:0][1:0][SCN-1:0] e0, e1, e2, e3; |
wire [VCN-1:0][1:0][FT-1:0] eft; |
wire [VCN-1:0][1:0] ea; |
wire [VCN-1:0][3:0][SCN-1:0] l0, l1, l2, l3; |
wire [VCN-1:0][3:0][FT-1:0] lft; |
wire [VCN-1:0][3:0] la; |
|
wire [3:0][SCN-1:0][VCN-1:0] ss0, ss1, ss2, ss3; |
wire [3:0][FT-1:0][VCN-1:0] ssft; |
wire [1:0][SCN-1:0][VCN-1:0] sw0, sw1, sw2, sw3; |
wire [1:0][FT-1:0][VCN-1:0] swft; |
wire [3:0][SCN-1:0][VCN-1:0] sn0, sn1, sn2, sn3; |
wire [3:0][FT-1:0][VCN-1:0] snft; |
wire [1:0][SCN-1:0][VCN-1:0] se0, se1, se2, se3; |
wire [1:0][FT-1:0][VCN-1:0] seft; |
wire [3:0][SCN-1:0][VCN-1:0] sl0, sl1, sl2, sl3; |
wire [3:0][FT-1:0][VCN-1:0] slft; |
|
wire [3:0][SCN-1:0] ms0, ms1, ms2, ms3; |
wire [3:0][FT-1:0] msft; |
wire [1:0][SCN-1:0] mw0, mw1, mw2, mw3; |
wire [1:0][FT-1:0] mwft; |
wire [3:0][SCN-1:0] mn0, mn1, mn2, mn3; |
wire [3:0][FT-1:0] mnft; |
wire [1:0][SCN-1:0] me0, me1, me2, me3; |
wire [1:0][FT-1:0] meft; |
wire [3:0][SCN-1:0] ml0, ml1, ml2, ml3; |
wire [3:0][FT-1:0] mlft; |
|
genvar i,j,k; |
|
generate |
// demux using the routing guides |
for(i=0; i<VCN; i++) begin: IMX |
vcdmux #(.DW(DW), .VCN(4)) |
SDMX( |
.dia ( dia[0][i] ), |
.do0 ( s0[i] ), |
.do1 ( s1[i] ), |
.do2 ( s2[i] ), |
.do3 ( s3[i] ), |
.dot ( sft[i] ), |
.di0 ( di0[0][i] ), |
.di1 ( di1[0][i] ), |
.di2 ( di2[0][i] ), |
.di3 ( di3[0][i] ), |
.dit ( dit[0][i] ), |
.divc ( srtg[i] ), |
.doa ( sa[i] ) |
); |
|
vcdmux #(.DW(DW), .VCN(2)) |
WDMX( |
.dia ( dia[1][i] ), |
.do0 ( w0[i] ), |
.do1 ( w1[i] ), |
.do2 ( w2[i] ), |
.do3 ( w3[i] ), |
.dot ( wft[i] ), |
.di0 ( di0[1][i] ), |
.di1 ( di1[1][i] ), |
.di2 ( di2[1][i] ), |
.di3 ( di3[1][i] ), |
.dit ( dit[1][i] ), |
.divc ( wrtg[i] ), |
.doa ( wa[i] ) |
); |
|
vcdmux #(.DW(DW), .VCN(4)) |
NDMX( |
.dia ( dia[2][i] ), |
.do0 ( n0[i] ), |
.do1 ( n1[i] ), |
.do2 ( n2[i] ), |
.do3 ( n3[i] ), |
.dot ( nft[i] ), |
.di0 ( di0[2][i] ), |
.di1 ( di1[2][i] ), |
.di2 ( di2[2][i] ), |
.di3 ( di3[2][i] ), |
.dit ( dit[2][i] ), |
.divc ( nrtg[i] ), |
.doa ( na[i] ) |
); |
|
vcdmux #(.DW(DW), .VCN(2)) |
EDMX( |
.dia ( dia[3][i] ), |
.do0 ( e0[i] ), |
.do1 ( e1[i] ), |
.do2 ( e2[i] ), |
.do3 ( e3[i] ), |
.dot ( eft[i] ), |
.di0 ( di0[3][i] ), |
.di1 ( di1[3][i] ), |
.di2 ( di2[3][i] ), |
.di3 ( di3[3][i] ), |
.dit ( dit[3][i] ), |
.divc ( ertg[i] ), |
.doa ( ea[i] ) |
); |
|
vcdmux #(.DW(DW), .VCN(4)) |
LDMX( |
.dia ( dia[4][i] ), |
.do0 ( l0[i] ), |
.do1 ( l1[i] ), |
.do2 ( l2[i] ), |
.do3 ( l3[i] ), |
.dot ( lft[i] ), |
.di0 ( di0[4][i] ), |
.di1 ( di1[4][i] ), |
.di2 ( di2[4][i] ), |
.di3 ( di3[4][i] ), |
.dit ( dit[4][i] ), |
.divc ( lrtg[i] ), |
.doa ( la[i] ) |
); |
|
// acknowledgement |
c2 SA0 (.a0(srtg[i][0]), .a1(doa[1]), .q(sa[i][0])); |
c2 SA1 (.a0(srtg[i][1]), .a1(doa[2]), .q(sa[i][1])); |
c2 SA2 (.a0(srtg[i][2]), .a1(doa[3]), .q(sa[i][2])); |
c2 SA3 (.a0(srtg[i][3]), .a1(doa[4]), .q(sa[i][3])); |
c2 WA0 (.a0(wrtg[i][0]), .a1(doa[3]), .q(wa[i][0])); |
c2 WA1 (.a0(wrtg[i][1]), .a1(doa[4]), .q(wa[i][1])); |
c2 NA0 (.a0(nrtg[i][0]), .a1(doa[0]), .q(na[i][0])); |
c2 NA1 (.a0(nrtg[i][1]), .a1(doa[1]), .q(na[i][1])); |
c2 NA2 (.a0(nrtg[i][2]), .a1(doa[3]), .q(na[i][2])); |
c2 NA3 (.a0(nrtg[i][3]), .a1(doa[4]), .q(na[i][3])); |
c2 EA0 (.a0(ertg[i][0]), .a1(doa[1]), .q(ea[i][0])); |
c2 EA1 (.a0(ertg[i][1]), .a1(doa[4]), .q(ea[i][1])); |
c2 LA0 (.a0(lrtg[i][0]), .a1(doa[0]), .q(la[i][0])); |
c2 LA1 (.a0(lrtg[i][1]), .a1(doa[1]), .q(la[i][1])); |
c2 LA2 (.a0(lrtg[i][2]), .a1(doa[2]), .q(la[i][2])); |
c2 LA3 (.a0(lrtg[i][3]), .a1(doa[3]), .q(la[i][3])); |
|
end // block: IMX |
endgenerate |
|
generate |
for(i=0; i<VCN; i++) begin: V |
for(j=0; j<4; j++) begin: D0 |
for(k=0; k<SCN; k++) begin: D |
assign ss0[j][k][i] = s0[i][j][k]; |
assign ss1[j][k][i] = s1[i][j][k]; |
assign ss2[j][k][i] = s2[i][j][k]; |
assign ss3[j][k][i] = s3[i][j][k]; |
assign sn0[j][k][i] = n0[i][j][k]; |
assign sn1[j][k][i] = n1[i][j][k]; |
assign sn2[j][k][i] = n2[i][j][k]; |
assign sn3[j][k][i] = n3[i][j][k]; |
assign sl0[j][k][i] = l0[i][j][k]; |
assign sl1[j][k][i] = l1[i][j][k]; |
assign sl2[j][k][i] = l2[i][j][k]; |
assign sl3[j][k][i] = l3[i][j][k]; |
end // block: D |
for(k=0; k<FT; k++) begin: T |
assign ssft[j][k][i] = sft[i][j][k]; |
assign snft[j][k][i] = nft[i][j][k]; |
assign slft[j][k][i] = lft[i][j][k]; |
end // block: T |
end // block: D0 |
|
for(j=0; j<2; j++) begin: D1 |
for(k=0; k<SCN; k++) begin: D |
assign sw0[j][k][i] = w0[i][j][k]; |
assign sw1[j][k][i] = w1[i][j][k]; |
assign sw2[j][k][i] = w2[i][j][k]; |
assign sw3[j][k][i] = w3[i][j][k]; |
assign se0[j][k][i] = e0[i][j][k]; |
assign se1[j][k][i] = e1[i][j][k]; |
assign se2[j][k][i] = e2[i][j][k]; |
assign se3[j][k][i] = e3[i][j][k]; |
end // block: D |
for(k=0; k<FT; k++) begin: T |
assign swft[j][k][i] = wft[i][j][k]; |
assign seft[j][k][i] = eft[i][j][k]; |
end // block: T |
end // block: D1 |
end |
|
for(j=0; j<4; j++) begin: D2 |
for(k=0; k<SCN; k++) begin: D |
assign ms0[j][k] = |ss0[j][k]; |
assign ms1[j][k] = |ss1[j][k]; |
assign ms2[j][k] = |ss2[j][k]; |
assign ms3[j][k] = |ss3[j][k]; |
assign mn0[j][k] = |sn0[j][k]; |
assign mn1[j][k] = |sn1[j][k]; |
assign mn2[j][k] = |sn2[j][k]; |
assign mn3[j][k] = |sn3[j][k]; |
assign ml0[j][k] = |sl0[j][k]; |
assign ml1[j][k] = |sl1[j][k]; |
assign ml2[j][k] = |sl2[j][k]; |
assign ml3[j][k] = |sl3[j][k]; |
end // block: D |
for(k=0; k<FT; k++) begin: T |
assign msft[j][k] = |ssft[j][k]; |
assign mnft[j][k] = |snft[j][k]; |
assign mlft[j][k] = |slft[j][k]; |
end |
end // block: D2 |
|
for(j=0; j<2; j++) begin: D4 |
for(k=0; k<SCN; k++) begin: D |
assign mw0[j][k] = |sw0[j][k]; |
assign mw1[j][k] = |sw1[j][k]; |
assign mw2[j][k] = |sw2[j][k]; |
assign mw3[j][k] = |sw3[j][k]; |
assign me0[j][k] = |se0[j][k]; |
assign me1[j][k] = |se1[j][k]; |
assign me2[j][k] = |se2[j][k]; |
assign me3[j][k] = |se3[j][k]; |
end // block: D |
for(k=0; k<FT; k++) begin: T |
assign mwft[j][k] = |swft[j][k]; |
assign meft[j][k] = |seft[j][k]; |
end // block: T |
end // block: D4 |
endgenerate |
|
// south output |
assign do0[0] = mn0[0]|ml0[0]; |
assign do1[0] = mn1[0]|ml1[0]; |
assign do2[0] = mn2[0]|ml2[0]; |
assign do3[0] = mn3[0]|ml3[0]; |
assign dot[0] = mnft[0]|mlft[0]; |
|
// west output |
assign do0[1] = ms0[0]|mn0[1]|me0[0]|ml0[1]; |
assign do1[1] = ms1[0]|mn1[1]|me1[0]|ml1[1]; |
assign do2[1] = ms2[0]|mn2[1]|me2[0]|ml2[1]; |
assign do3[1] = ms3[0]|mn3[1]|me3[0]|ml3[1]; |
assign dot[1] = msft[0]|mnft[1]|meft[0]|mlft[1]; |
|
// south output |
assign do0[2] = ms0[1]|ml0[2]; |
assign do1[2] = ms1[1]|ml1[2]; |
assign do2[2] = ms2[1]|ml2[2]; |
assign do3[2] = ms3[1]|ml3[2]; |
assign dot[2] = msft[1]|mlft[2]; |
|
// east output |
assign do0[3] = ms0[2]|mw0[0]|mn0[2]|ml0[3]; |
assign do1[3] = ms1[2]|mw1[0]|mn1[2]|ml1[3]; |
assign do2[3] = ms2[2]|mw2[0]|mn2[2]|ml2[3]; |
assign do3[3] = ms3[2]|mw3[0]|mn3[2]|ml3[3]; |
assign dot[3] = msft[2]|mwft[0]|mnft[2]|mlft[3]; |
|
// local output |
assign do0[4] = ms0[3]|mw0[1]|mn0[3]|me0[1]; |
assign do1[4] = ms1[3]|mw1[1]|mn1[3]|me1[1]; |
assign do2[4] = ms2[3]|mw2[1]|mn2[3]|me2[1]; |
assign do3[4] = ms3[3]|mw3[1]|mn3[3]|me3[1]; |
assign dot[4] = msft[3]|mwft[1]|mnft[3]|meft[1]; |
|
|
endmodule // dcb_vc |
/init/vc/src/ddmux.v
0,0 → 1,57
/* |
Asynchronous SDM NoC |
(C)2011 Wei Song |
Advanced Processor Technologies Group |
Computer Science, the Univ. of Manchester, UK |
|
Authors: |
Wei Song wsong83@gmail.com |
|
License: LGPL 3.0 or later |
|
Demux for a 1-of-n buffer stage. |
|
History: |
31/03/2010 Initial version. <wsong83@gmail.com> |
02/06/2011 Clean up for opensource. <wsong83@gmail.com> |
|
*/ |
|
module ddmux ( /*AUTOARG*/ |
// Outputs |
d_in_a, d_out, |
// Inputs |
d_in, d_sel, d_out_a |
); |
parameter VCN = 2; // number of output VCs |
parameter DW = 32; // data width of the input |
|
input [DW-1:0] d_in; |
input [VCN-1:0] d_sel; |
output d_in_a; |
|
output [VCN-1:0][DW-1:0] d_out; |
input [VCN-1:0] d_out_a; |
|
genvar i,j; |
|
/* |
generate |
for (i=0; i<VCN; i++) begin: VCD |
for(j=0; j<DW; j++) begin: D |
c2 C (.a0(d_in[j]), .a1(d_sel[i]), .q(d_out[i][j])); |
end |
end |
endgenerate |
*/ |
|
generate |
for (i=0; i<VCN; i++) begin: VCD |
assign d_out[i] = d_sel[i] ? d_in : 0; |
end |
endgenerate |
|
assign d_in_a = |d_out_a; |
|
endmodule // ddmux |
|
/init/vc/src/vcdmux.v
0,0 → 1,71
/* |
Asynchronous SDM NoC |
(C)2011 Wei Song |
Advanced Processor Technologies Group |
Computer Science, the Univ. of Manchester, UK |
|
Authors: |
Wei Song wsong83@gmail.com |
|
License: LGPL 3.0 or later |
|
Demux for a VC buffer stage. |
|
History: |
31/03/2010 Initial version. <wsong83@gmail.com> |
02/06/2011 Clean up for opensource. <wsong83@gmail.com> |
|
*/ |
|
module vcdmux ( /*AUTOARG*/ |
// Outputs |
dia, do0, do1, do2, do3, dot, |
// Inputs |
di0, di1, di2, di3, dit, divc, doa |
); |
parameter VCN = 2; // number of output VCs |
parameter DW = 32; // data width of the input |
parameter SCN = DW/2; |
|
input [SCN-1:0] di0, di1, di2, di3; |
input [2:0] dit; |
input [VCN-1:0] divc; |
output dia; |
|
output [VCN-1:0][SCN-1:0] do0, do1, do2, do3; |
output [VCN-1:0][2:0] dot; |
input [VCN-1:0] doa; |
|
genvar i,j; |
|
/* |
generate |
for (i=0; i<VCN; i++) begin: VCD |
for(j=0; j<SCN; j++) begin: D |
c2 C0 (.a0(di0[j]), .a1(divc[i]), .q(do0[i][j])); |
c2 C1 (.a0(di1[j]), .a1(divc[i]), .q(do1[i][j])); |
c2 C2 (.a0(di2[j]), .a1(divc[i]), .q(do2[i][j])); |
c2 C3 (.a0(di3[j]), .a1(divc[i]), .q(do3[i][j])); |
end |
|
for(j=0; j<3; j++) begin: T |
c2 C0 (.a0(dit[j]), .a1(divc[i]), .q(dot[i][j])); |
end |
end |
endgenerate |
*/ |
|
generate |
for (i=0; i<VCN; i++) begin: VCD |
assign do0[i] = divc[i] ? di0 : 0; |
assign do1[i] = divc[i] ? di1 : 0; |
assign do2[i] = divc[i] ? di2 : 0; |
assign do3[i] = divc[i] ? di3 : 0; |
assign dot[i] = divc[i] ? dit : 0; |
end |
endgenerate |
|
assign dia = |doa; |
|
endmodule // vcdmux |
|
/init/vc/src/vca.v
0,0 → 1,418
/* |
Asynchronous SDM NoC |
(C)2011 Wei Song |
Advanced Processor Technologies Group |
Computer Science, the Univ. of Manchester, UK |
|
Authors: |
Wei Song wsong83@gmail.com |
|
License: LGPL 3.0 or later |
|
VC allocator. |
|
History: |
05/04/2010 Initial version. <wsong83@gmail.com> |
29/09/2010 Use the asynchronous PIM alg. (MNMA) <wsong83@gmail.com> |
03/10/2010 Add VCREN c2n gates to defer the withdrawal of request until data switch is withdrawn. <wsong83@gmail.com> |
02/06/2011 Clean up for opensource. <wsong83@gmail.com> |
|
*/ |
|
// the router structure definitions |
`include "define.v" |
|
module vcalloc (/*AUTOARG*/ |
// Outputs |
svcra, wvcra, nvcra, evcra, lvcra, sswa, wswa, nswa, eswa, lswa, |
sosr, wosr, nosr, eosr, losr, |
// Inputs |
svcr, nvcr, lvcr, wvcr, evcr, sswr, wswr, nswr, eswr, lswr, sosa, |
wosa, nosa, eosa, losa, rstn |
); |
|
parameter VCN = 4; // number of VCs |
|
input [VCN-1:0][3:0] svcr, nvcr, lvcr; // VC requests from input VCs |
input [VCN-1:0][1:0] wvcr, evcr; |
output [VCN-1:0] svcra,wvcra, nvcra, evcra, lvcra; // ack to VC requests |
|
input [VCN-1:0][1:0] sswr, wswr, nswr, eswr, lswr; // SW requests from input VCs |
output [VCN-1:0][3:0] sswa, nswa, lswa; // ack/routing guide to input VCs |
output [VCN-1:0][1:0] wswa, eswa; |
|
output [VCN-1:0] sosr, wosr, nosr, eosr, losr; // SW requests to output VCs |
input [VCN-1:0] sosa, wosa, nosa, eosa, losa; |
|
input rstn; // active-low reset |
|
wire [VCN-1:0][3:0] msvcr, mnvcr, mlvcr; // shuffled VC requests |
wire [VCN-1:0][1:0] mwvcr, mevcr; |
|
wire [VCN-1:0][3:0][VCN-1:0] wcfg, ecfg, lcfg; // configuration signals from VCA to Req CB |
wire [VCN-1:0][1:0][VCN-1:0] scfg, ncfg; |
|
wire [VCN-1:0][3:0][VCN-1:0] mwcfg, mecfg, mlcfg; // the cfg before the AND gates |
wire [VCN-1:0][1:0][VCN-1:0] mscfg, mncfg; |
|
wire [VCN-1:0][3:0][VCN-1:0] wcfga, ecfga, lcfga; // cfg ack from req CB |
wire [VCN-1:0][1:0][VCN-1:0] scfga, ncfga; |
|
`ifndef ENABLE_MRMA |
wire [1:0][VCN-1:0][VCN-1:0] i2sr, i2nr; // input to output requests |
wire [3:0][VCN-1:0][VCN-1:0] i2wr, i2er, i2lr; |
`else |
wire [1:0][VCN-1:0] i2sr, i2nr; // input to output requests |
wire [3:0][VCN-1:0] i2wr, i2er, i2lr; |
`endif |
wire [1:0][VCN-1:0] i2sa, i2na; // ack for i2(dir)r |
wire [3:0][VCN-1:0] i2wa, i2ea, i2la; |
|
// other wires for shuffle purposes |
wire [VCN-1:0][3:0][VCN-1:0] svcram, nvcram, lvcram; |
wire [VCN-1:0][1:0][VCN-1:0] wvcram, evcram; |
wire [VCN-1:0][3:0][VCN-1:0] svcrami, nvcrami, lvcrami; |
wire [VCN-1:0][1:0][VCN-1:0] wvcrami, evcrami; |
wire [VCN-1:0][3:0] svcrai, nvcrai, lvcrai; |
wire [VCN-1:0][1:0] wvcrai, evcrai; |
wire [VCN-1:0][3:0] svcraii, nvcraii, lvcraii; |
wire [VCN-1:0][1:0] wvcraii, evcraii; |
|
`ifdef ENABLE_MRMA |
wire [VCN:0] vcrst_n; // the buffered resets to avoid metastability |
wire [VCN-1:0] svcrdy, svcrdya; // south vc ready status |
wire [VCN-1:0] wvcrdy, wvcrdya; // west vc ready status |
wire [VCN-1:0] nvcrdy, nvcrdya; // north vc ready status |
wire [VCN-1:0] evcrdy, evcrdya; // east vc ready status |
wire [VCN-1:0] lvcrdy, lvcrdya; // local vc ready status |
`endif |
|
genvar i, j; |
|
generate |
for(i=0; i<VCN; i++) begin:SF |
|
assign svcra[i] = {svcrai[i][0]|svcrai[i][1]|svcrai[i][2]|svcrai[i][3]}; |
assign wvcra[i] = {wvcrai[i][0]|wvcrai[i][1]}; |
assign nvcra[i] = {nvcrai[i][0]|nvcrai[i][1]|nvcrai[i][2]|nvcrai[i][3]}; |
assign evcra[i] = {evcrai[i][0]|evcrai[i][1]}; |
assign lvcra[i] = {lvcrai[i][0]|lvcrai[i][1]|lvcrai[i][2]|lvcrai[i][3]}; |
|
or VCRENn0( mnvcr[i][0], nvcr[i][0], (|nvcram[i][0])&rstn); |
or VCRENl0( mlvcr[i][0], lvcr[i][0], (|lvcram[i][0])&rstn); |
or VCRENs0( msvcr[i][0], svcr[i][0], (|svcram[i][0])&rstn); |
or VCRENn1( mnvcr[i][1], nvcr[i][1], (|nvcram[i][1])&rstn); |
or VCRENe0( mevcr[i][0], evcr[i][0], (|evcram[i][0])&rstn); |
or VCRENl1( mlvcr[i][1], lvcr[i][1], (|lvcram[i][1])&rstn); |
or VCRENs1( msvcr[i][1], svcr[i][1], (|svcram[i][1])&rstn); |
or VCRENl2( mlvcr[i][2], lvcr[i][2], (|lvcram[i][2])&rstn); |
or VCRENs2( msvcr[i][2], svcr[i][2], (|svcram[i][2])&rstn); |
or VCRENw0( mwvcr[i][0], wvcr[i][0], (|wvcram[i][0])&rstn); |
or VCRENn2( mnvcr[i][2], nvcr[i][2], (|nvcram[i][2])&rstn); |
or VCRENl3( mlvcr[i][3], lvcr[i][3], (|lvcram[i][3])&rstn); |
or VCRENs3( msvcr[i][3], svcr[i][3], (|svcram[i][3])&rstn); |
or VCRENw1( mwvcr[i][1], wvcr[i][1], (|wvcram[i][1])&rstn); |
or VCRENn3( mnvcr[i][3], nvcr[i][3], (|nvcram[i][3])&rstn); |
or VCRENe1( mevcr[i][1], evcr[i][1], (|evcram[i][1])&rstn); |
|
and VCAOs0 (svcrai[i][0], (|svcrami[i][0]), svcraii[i][0]); |
and VCAOs1 (svcrai[i][1], (|svcrami[i][1]), svcraii[i][1]); |
and VCAOs2 (svcrai[i][2], (|svcrami[i][2]), svcraii[i][2]); |
and VCAOs3 (svcrai[i][3], (|svcrami[i][3]), svcraii[i][3]); |
and VCAOw0 (wvcrai[i][0], (|wvcrami[i][0]), wvcraii[i][0]); |
and VCAOw1 (wvcrai[i][1], (|wvcrami[i][1]), wvcraii[i][1]); |
and VCAOn0 (nvcrai[i][0], (|nvcrami[i][0]), nvcraii[i][0]); |
and VCAOn1 (nvcrai[i][1], (|nvcrami[i][1]), nvcraii[i][1]); |
and VCAOn2 (nvcrai[i][2], (|nvcrami[i][2]), nvcraii[i][2]); |
and VCAOn3 (nvcrai[i][3], (|nvcrami[i][3]), nvcraii[i][3]); |
and VCAOe0 (evcrai[i][0], (|evcrami[i][0]), evcraii[i][0]); |
and VCAOe1 (evcrai[i][1], (|evcrami[i][1]), evcraii[i][1]); |
and VCAOl0 (lvcrai[i][0], (|lvcrami[i][0]), lvcraii[i][0]); |
and VCAOl1 (lvcrai[i][1], (|lvcrami[i][1]), lvcraii[i][1]); |
and VCAOl2 (lvcrai[i][2], (|lvcrami[i][2]), lvcraii[i][2]); |
and VCAOl3 (lvcrai[i][3], (|lvcrami[i][3]), lvcraii[i][3]); |
|
or VCAIs0 (svcraii[i][0], (~svcr[i][0]), (|svcram[i][0])); |
or VCAIs1 (svcraii[i][1], (~svcr[i][1]), (|svcram[i][1])); |
or VCAIs2 (svcraii[i][2], (~svcr[i][2]), (|svcram[i][2])); |
or VCAIs3 (svcraii[i][3], (~svcr[i][3]), (|svcram[i][3])); |
or VCAIw0 (wvcraii[i][0], (~wvcr[i][0]), (|wvcram[i][0])); |
or VCAIw1 (wvcraii[i][1], (~wvcr[i][1]), (|wvcram[i][1])); |
or VCAIn0 (nvcraii[i][0], (~nvcr[i][0]), (|nvcram[i][0])); |
or VCAIn1 (nvcraii[i][1], (~nvcr[i][1]), (|nvcram[i][1])); |
or VCAIn2 (nvcraii[i][2], (~nvcr[i][2]), (|nvcram[i][2])); |
or VCAIn3 (nvcraii[i][3], (~nvcr[i][3]), (|nvcram[i][3])); |
or VCAIe0 (evcraii[i][0], (~evcr[i][0]), (|evcram[i][0])); |
or VCAIe1 (evcraii[i][1], (~evcr[i][1]), (|evcram[i][1])); |
or VCAIl0 (lvcraii[i][0], (~lvcr[i][0]), (|lvcram[i][0])); |
or VCAIl1 (lvcraii[i][1], (~lvcr[i][1]), (|lvcram[i][1])); |
or VCAIl2 (lvcraii[i][2], (~lvcr[i][2]), (|lvcram[i][2])); |
or VCAIl3 (lvcraii[i][3], (~lvcr[i][3]), (|lvcram[i][3])); |
|
`ifdef ENABLE_MRMA |
assign i2sr[0][i] = mnvcr[i][0]; |
assign i2sr[1][i] = mlvcr[i][0]; |
assign i2wr[0][i] = msvcr[i][0]; |
assign i2wr[1][i] = mnvcr[i][1]; |
assign i2wr[2][i] = mevcr[i][0]; |
assign i2wr[3][i] = mlvcr[i][1]; |
assign i2nr[0][i] = msvcr[i][1]; |
assign i2nr[1][i] = mlvcr[i][2]; |
assign i2er[0][i] = msvcr[i][2]; |
assign i2er[1][i] = mwvcr[i][0]; |
assign i2er[2][i] = mnvcr[i][2]; |
assign i2er[3][i] = mlvcr[i][3]; |
assign i2lr[0][i] = msvcr[i][3]; |
assign i2lr[1][i] = mwvcr[i][1]; |
assign i2lr[2][i] = mnvcr[i][3]; |
assign i2lr[3][i] = mevcr[i][1]; |
`endif // `ifndef ENABLE_MRMA |
|
for(j=0; j<VCN; j++) begin : CO |
`ifndef ENABLE_MRMA |
assign i2sr[0][i][j] = mnvcr[i][0]; |
assign i2sr[1][i][j] = mlvcr[i][0]; |
assign i2wr[0][i][j] = msvcr[i][0]; |
assign i2wr[1][i][j] = mnvcr[i][1]; |
assign i2wr[2][i][j] = mevcr[i][0]; |
assign i2wr[3][i][j] = mlvcr[i][1]; |
assign i2nr[0][i][j] = msvcr[i][1]; |
assign i2nr[1][i][j] = mlvcr[i][2]; |
assign i2er[0][i][j] = msvcr[i][2]; |
assign i2er[1][i][j] = mwvcr[i][0]; |
assign i2er[2][i][j] = mnvcr[i][2]; |
assign i2er[3][i][j] = mlvcr[i][3]; |
assign i2lr[0][i][j] = msvcr[i][3]; |
assign i2lr[1][i][j] = mwvcr[i][1]; |
assign i2lr[2][i][j] = mnvcr[i][3]; |
assign i2lr[3][i][j] = mevcr[i][1]; |
`endif // `ifndef ENABLE_MRMA |
|
assign svcram[i][0][j] = wcfga[j][0][i]; |
assign svcram[i][1][j] = ncfga[j][0][i]; |
assign svcram[i][2][j] = ecfga[j][0][i]; |
assign svcram[i][3][j] = lcfga[j][0][i]; |
assign wvcram[i][0][j] = ecfga[j][1][i]; |
assign wvcram[i][1][j] = lcfga[j][1][i]; |
assign nvcram[i][0][j] = scfga[j][0][i]; |
assign nvcram[i][1][j] = wcfga[j][1][i]; |
assign nvcram[i][2][j] = ecfga[j][2][i]; |
assign nvcram[i][3][j] = lcfga[j][2][i]; |
assign evcram[i][0][j] = wcfga[j][2][i]; |
assign evcram[i][1][j] = lcfga[j][3][i]; |
assign lvcram[i][0][j] = scfga[j][1][i]; |
assign lvcram[i][1][j] = wcfga[j][3][i]; |
assign lvcram[i][2][j] = ncfga[j][1][i]; |
assign lvcram[i][3][j] = ecfga[j][3][i]; |
|
assign svcrami[i][0][j] = mwcfg[j][0][i]; |
assign svcrami[i][1][j] = mncfg[j][0][i]; |
assign svcrami[i][2][j] = mecfg[j][0][i]; |
assign svcrami[i][3][j] = mlcfg[j][0][i]; |
assign wvcrami[i][0][j] = mecfg[j][1][i]; |
assign wvcrami[i][1][j] = mlcfg[j][1][i]; |
assign nvcrami[i][0][j] = mscfg[j][0][i]; |
assign nvcrami[i][1][j] = mwcfg[j][1][i]; |
assign nvcrami[i][2][j] = mecfg[j][2][i]; |
assign nvcrami[i][3][j] = mlcfg[j][2][i]; |
assign evcrami[i][0][j] = mwcfg[j][2][i]; |
assign evcrami[i][1][j] = mlcfg[j][3][i]; |
assign lvcrami[i][0][j] = mscfg[j][1][i]; |
assign lvcrami[i][1][j] = mwcfg[j][3][i]; |
assign lvcrami[i][2][j] = mncfg[j][1][i]; |
assign lvcrami[i][3][j] = mecfg[j][3][i]; |
|
and CFGENw0 (wcfg[j][0][i], svcr[i][0], mwcfg[j][0][i]); |
and CFGENn0 (ncfg[j][0][i], svcr[i][1], mncfg[j][0][i]); |
and CFGENe0 (ecfg[j][0][i], svcr[i][2], mecfg[j][0][i]); |
and CFGENl0 (lcfg[j][0][i], svcr[i][3], mlcfg[j][0][i]); |
and CFGENe1 (ecfg[j][1][i], wvcr[i][0], mecfg[j][1][i]); |
and CFGENl1 (lcfg[j][1][i], wvcr[i][1], mlcfg[j][1][i]); |
and CFGENs0 (scfg[j][0][i], nvcr[i][0], mscfg[j][0][i]); |
and CFGENw1 (wcfg[j][1][i], nvcr[i][1], mwcfg[j][1][i]); |
and CFGENe2 (ecfg[j][2][i], nvcr[i][2], mecfg[j][2][i]); |
and CFGENl2 (lcfg[j][2][i], nvcr[i][3], mlcfg[j][2][i]); |
and CFGENw2 (wcfg[j][2][i], evcr[i][0], mwcfg[j][2][i]); |
and CFGENl3 (lcfg[j][3][i], evcr[i][1], mlcfg[j][3][i]); |
and CFGENs1 (scfg[j][1][i], lvcr[i][0], mscfg[j][1][i]); |
and CFGENw3 (wcfg[j][3][i], lvcr[i][1], mwcfg[j][3][i]); |
and CFGENn1 (ncfg[j][1][i], lvcr[i][2], mncfg[j][1][i]); |
and CFGENe3 (ecfg[j][3][i], lvcr[i][3], mecfg[j][3][i]); |
end // block: CO |
end // block: SF |
endgenerate |
|
// the requests crossbar |
rcb #(.VCN(VCN)) |
RSW ( |
.ro ( {losr, eosr, nosr, wosr, sosr} ), |
.srt ( sswa ), |
.wrt ( wswa ), |
.nrt ( nswa ), |
.ert ( eswa ), |
.lrt ( lswa ), |
.ri ( {lswr, eswr, nswr, wswr, sswr} ), |
.go ( {losa, eosa, nosa, wosa, sosa} ), |
.wctl ( wcfg ), |
.ectl ( ecfg ), |
.lctl ( lcfg ), |
.sctl ( scfg ), |
.nctl ( ncfg ), |
.wctla ( wcfga ), |
.ectla ( ecfga ), |
.lctla ( lcfga ), |
.sctla ( scfga ), |
.nctla ( ncfga ) |
); |
|
// the VC allocators |
`ifndef ENABLE_MRMA |
mnma #(.N(2*VCN), .M(VCN)) |
SVA ( |
.r ( i2sr ), |
.cfg ( mscfg ), |
.ra ( ) |
); |
|
mnma #(.N(4*VCN), .M(VCN)) |
WVA ( |
.r ( i2wr ), |
.cfg ( mwcfg ), |
.ra ( ) |
); |
|
mnma #(.N(2*VCN), .M(VCN)) |
NVA ( |
.r ( i2nr ), |
.cfg ( mncfg ), |
.ra ( ) |
); |
|
mnma #(.N(4*VCN), .M(VCN)) |
EVA ( |
.r ( i2er ), |
.cfg ( mecfg ), |
.ra ( ) |
); |
|
mnma #(.N(4*VCN), .M(VCN)) |
LVA ( |
.r ( i2lr ), |
.cfg ( mlcfg ), |
.ra ( ) |
); |
`else // !`ifndef ENABLE_MRMA |
mrma #(.N(2*VCN), .M(VCN)) |
SVA ( |
.c ( i2sr ), |
.cfg ( mscfg ), |
.ca ( ), |
.r ( svcrdy ), |
.ra ( svcrdya ), |
.rst_n ( rstn ) |
); |
|
mrma #(.N(4*VCN), .M(VCN)) |
WVA ( |
.c ( i2wr ), |
.cfg ( mwcfg ), |
.ca ( ), |
.r ( wvcrdy ), |
.ra ( wvcrdya ), |
.rst_n ( rstn ) |
); |
|
mrma #(.N(2*VCN), .M(VCN)) |
NVA ( |
.c ( i2nr ), |
.cfg ( mncfg ), |
.ca ( ), |
.r ( nvcrdy ), |
.ra ( nvcrdya ), |
.rst_n ( rstn ) |
); |
|
mrma #(.N(4*VCN), .M(VCN)) |
EVA ( |
.c ( i2er ), |
.cfg ( mecfg ), |
.ca ( ), |
.r ( evcrdy ), |
.ra ( evcrdya ), |
.rst_n ( rstn ) |
); |
|
mrma #(.N(4*VCN), .M(VCN)) |
LVA ( |
.c ( i2lr ), |
.cfg ( mlcfg ), |
.ca ( ), |
.r ( lvcrdy ), |
.ra ( lvcrdya ), |
.rst_n ( rstn ) |
); |
|
generate |
for(i=0; i<VCN; i++) begin: OPC |
delay DLY ( .q(vcrst_n[i+1]), .a(vcrst_n[i])); // dont touch |
assign svcrdy[i] = (~svcrdya[i])&vcrst_n[i+1]; |
assign wvcrdy[i] = (~wvcrdya[i])&vcrst_n[i+1]; |
assign nvcrdy[i] = (~nvcrdya[i])&vcrst_n[i+1]; |
assign evcrdy[i] = (~evcrdya[i])&vcrst_n[i+1]; |
assign lvcrdy[i] = (~lvcrdya[i])&vcrst_n[i+1]; |
end |
endgenerate |
|
assign vcrst_n[0] = rst_n; |
|
`endif // !`ifndef ENABLE_MRMA |
|
endmodule // vcalloc |
|
/* logic of the control logic generated from petrify |
|
// Verilog model for vca_ctl |
// Generated by petrify 4.2 (compiled 15-Oct-03 at 3:06 PM) |
// CPU time for synthesis (host <unknown>): 0.04 seconds |
// Estimated area = 72.00 |
|
// The circuit is self-resetting and does not need reset pin. |
|
module vca_ctl_net ( |
vcri, |
cfg, |
vcrai, |
vcro, |
cfgen, |
vcrao |
); |
|
input vcri; |
input cfg; |
input vcrai; |
|
output vcro; |
output cfgen; |
output vcrao; |
|
|
// Functions not mapped into library gates: |
// ---------------------------------------- |
|
// Equation: vcro = vcri + vcrai |
or _U0 (vcro, vcrai, vcri); |
|
// Equation: cfgen = vcri |
buf _U1 (cfgen, vcri); |
|
// Equation: vcrao = cfg (vcri' + vcrai) |
not _U1 (_X1, vcri); |
and _U2 (_X0, vcrai, cfg); |
and _U3 (_X2, cfg, _X1); |
or _U4 (vcrao, _X0, _X2); |
|
|
// signal values at the initial state: |
// !vcri !cfg !vcrai !vcro !cfgen !vcrao |
endmodule |
*/ |
init/vc/src/vca.v
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: init/vc/src/rtu.v
===================================================================
--- init/vc/src/rtu.v (nonexistent)
+++ init/vc/src/rtu.v (revision 39)
@@ -0,0 +1,185 @@
+/*
+ Asynchronous SDM NoC
+ (C)2011 Wei Song
+ Advanced Processor Technologies Group
+ Computer Science, the Univ. of Manchester, UK
+
+ Authors:
+ Wei Song wsong83@gmail.com
+
+ License: LGPL 3.0 or later
+
+ The routing calculation unit in every input buffer.
+ p0 -> L -> p1 -> RTC -> p2 -> L -> p3 -> DEMUX -> p[0] -> L -> p[1] -> L -> p[2] -> L -> p[3] -> L -> p[4]
+
+ History:
+ 02/04/2010 Initial version.
+ 02/06/2011 Clean up for opensource.
+
+*/
+
+module rtu (/*AUTOARG*/
+ // Outputs
+ dia, dort,
+ // Inputs
+ rstn, di0, di1, di2, di3, dit, divc, addrx, addry, doa
+ );
+ parameter VCN = 2;
+ parameter DIR = 0;
+ parameter SN = 4;
+ parameter PD = 2;
+
+ input rstn;
+ input [3:0] di0, di1, di2, di3;
+ input [2:0] dit;
+ input [VCN-1:0] divc;
+ output dia;
+
+ input [7:0] addrx, addry;
+
+ output [VCN-1:0][SN-1:0] dort;
+ input [VCN-1:0] doa;
+
+ //------------------------------------------
+ wire p0an, p0ap, p0den, p0ad, p0avc;
+ wire [3:0] p1d0, p1d1, p1d2, p1d3;
+ wire [VCN-1:0] p1vc;
+ wire p1a, p1ad, p1avc, p1an;
+ wire [SN-1:0] p2d;
+ wire [VCN-1:0] p2vc;
+ wire p2a, p2ad, p2avc, p2an;
+ wire [SN-1:0] p3d;
+ wire [VCN-1:0] p3vc;
+ wire p3a, p3an;
+ wire [PD*2:0][VCN-1:0][SN-1:0] pd;
+ wire [PD*2:0][VCN-1:0] pda, pdan;
+
+ wire [2:0] x_cmp [1:0];
+ wire [2:0] y_cmp [1:0];
+ wire [5:0] dec;
+ wire ds, dw, dn, de, dl;
+
+
+ genvar gvc, gbd, i;
+
+ //------------------------------------------
+ // p0 -> L -> p1
+
+ c2 CP0DE ( .a0(dit[0]), .a1(p1an), .q(p0den));
+ c2 CP0A ( .a0(p0ad), .a1(p0avc), .q(p0ap));
+ assign p0an = |dit[2:1];
+ assign dia = p0an | p0ap;
+
+ pipe4 #(.DW(8))
+ L0D (
+ .dia ( p0ad ),
+ .do0 ( p1d0 ),
+ .do1 ( p1d1 ),
+ .do2 ( p1d2 ),
+ .do3 ( p1d3 ),
+ .di0 ( di0 ),
+ .di1 ( di1 ),
+ .di2 ( di2 ),
+ .di3 ( di3 ),
+ .doa ( p0den )
+ );
+
+ pipen #(.DW(VCN))
+ L0V (
+ .d_in ( divc ),
+ .d_in_a ( p0avc ),
+ .d_out ( p1vc ),
+ .d_out_a ( p0den )
+ );
+
+ // p1 -> RTC -> p2
+ comp4 X0 ( .a({p1d3[0], p1d2[0], p1d1[0], p1d0[0]}), .b(addrx[3:0]), .q(x_cmp[0]));
+ comp4 X1 ( .a({p1d3[1], p1d2[1], p1d1[1], p1d0[1]}), .b(addrx[7:4]), .q(x_cmp[1]));
+ comp4 Y0 ( .a({p1d3[2], p1d2[2], p1d1[2], p1d0[2]}), .b(addry[3:0]), .q(y_cmp[0]));
+ comp4 Y1 ( .a({p1d3[3], p1d2[3], p1d1[3], p1d0[3]}), .b(addry[7:4]), .q(y_cmp[1]));
+
+ assign dec[0] = x_cmp[1][0] | (x_cmp[1][2]&x_cmp[0][0]); // frame x > addr x
+ assign dec[1] = x_cmp[1][1] | (x_cmp[1][2]&x_cmp[0][1]); // frame x < addr x
+ assign dec[2] = x_cmp[1][2] & x_cmp[0][2]; // frame x = addr x
+ assign dec[3] = y_cmp[1][0] | (y_cmp[1][2]&y_cmp[0][0]); // frame y > addr y
+ assign dec[4] = y_cmp[1][1] | (y_cmp[1][2]&y_cmp[0][1]); // frame y < addr y
+ assign dec[5] = y_cmp[1][2] & y_cmp[0][2]; // frame y = addr y
+
+ assign ds = dec[0];
+ assign dw = dec[2]&dec[4];
+ assign dn = dec[1];
+ assign de = dec[2]&dec[3];
+ assign dl = dec[2]&dec[5];
+
+ assign p2d =
+ DIR == 0 ? {dl, de, dn, dw} : // south port
+ DIR == 1 ? {dl, de} : // west port
+ DIR == 2 ? {dl, de, dw, ds} : // north port
+ DIR == 3 ? {dl, dw} : // east port
+ {de, dn, dw, ds} ; // local port
+
+ assign p2vc = p1vc;
+ assign p1an = p2an;
+
+ // p2 -> L -> p3
+
+ c2 CP2A ( .a0(p2ad), .a1(p2avc), .q(p2a));
+ assign p2an = (~p2a) & rstn;
+
+ pipen #(.DW(SN))
+ L2R (
+ .d_in ( p2d ),
+ .d_in_a ( p2ad ),
+ .d_out ( p3d ),
+ .d_out_a ( p3an )
+ );
+
+ pipen #(.DW(VCN))
+ L2V (
+ .d_in ( p2vc ),
+ .d_in_a ( p2avc ),
+ .d_out ( p3vc ),
+ .d_out_a ( p3an )
+ );
+
+ // p3 -> DEMUX -> pd[0]
+ ddmux #(.DW(SN), .VCN(VCN))
+ RTDM (
+ .d_in_a ( p3a ),
+ .d_out ( pd[0] ),
+ .d_in ( p3d ),
+ .d_sel ( p3vc ),
+ .d_out_a ( pda[0])
+ );
+
+ assign p3an = (~p3a) & rstn;
+
+ // pd pipeline
+ generate
+ for(gbd=0; gbd