/*
|
/*
|
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
|
|
|
Demux for a VC buffer stage.
|
Demux for a VC buffer stage.
|
|
|
History:
|
History:
|
31/03/2010 Initial version. <wsong83@gmail.com>
|
31/03/2010 Initial version. <wsong83@gmail.com>
|
02/06/2011 Clean up for opensource. <wsong83@gmail.com>
|
02/06/2011 Clean up for opensource. <wsong83@gmail.com>
|
|
09/06/2011 Make sure the sel pin is considered in the ack process. <wsong83@gmail.com>
|
|
|
*/
|
*/
|
|
|
module vcdmux ( /*AUTOARG*/
|
module vcdmux ( /*AUTOARG*/
|
// Outputs
|
// Outputs
|
dia, do0, do1, do2, do3, dot,
|
dia, do0, do1, do2, do3, dot,
|
// Inputs
|
// Inputs
|
di0, di1, di2, di3, dit, divc, doa
|
di0, di1, di2, di3, dit, divc, doa
|
);
|
);
|
parameter VCN = 2; // number of output VCs
|
parameter VCN = 2; // number of output VCs
|
parameter DW = 32; // data width of the input
|
parameter DW = 32; // data width of the input
|
parameter SCN = DW/2;
|
parameter SCN = DW/2;
|
|
|
input [SCN-1:0] di0, di1, di2, di3;
|
input [SCN-1:0] di0, di1, di2, di3;
|
input [2:0] dit;
|
input [2:0] dit;
|
input [VCN-1:0] divc;
|
input [VCN-1:0] divc;
|
output dia;
|
output dia;
|
|
|
output [VCN-1:0][SCN-1:0] do0, do1, do2, do3;
|
output [VCN-1:0][SCN-1:0] do0, do1, do2, do3;
|
output [VCN-1:0][2:0] dot;
|
output [VCN-1:0][2:0] dot;
|
input [VCN-1:0] doa;
|
input [VCN-1:0] doa;
|
|
|
genvar i,j;
|
genvar i,j;
|
|
|
/*
|
/*
|
generate
|
generate
|
for (i=0; i<VCN; i++) begin: VCD
|
for (i=0; i<VCN; i++) begin: VCD
|
for(j=0; j<SCN; j++) begin: D
|
for(j=0; j<SCN; j++) begin: D
|
c2 C0 (.a0(di0[j]), .a1(divc[i]), .q(do0[i][j]));
|
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 C1 (.a0(di1[j]), .a1(divc[i]), .q(do1[i][j]));
|
c2 C2 (.a0(di2[j]), .a1(divc[i]), .q(do2[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]));
|
c2 C3 (.a0(di3[j]), .a1(divc[i]), .q(do3[i][j]));
|
end
|
end
|
|
|
for(j=0; j<3; j++) begin: T
|
for(j=0; j<3; j++) begin: T
|
c2 C0 (.a0(dit[j]), .a1(divc[i]), .q(dot[i][j]));
|
c2 C0 (.a0(dit[j]), .a1(divc[i]), .q(dot[i][j]));
|
end
|
end
|
end
|
end
|
endgenerate
|
endgenerate
|
*/
|
*/
|
|
|
generate
|
generate
|
for (i=0; i<VCN; i++) begin: VCD
|
for (i=0; i<VCN; i++) begin: VCD
|
assign do0[i] = divc[i] ? di0 : 0;
|
assign do0[i] = divc[i] ? di0 : 0;
|
assign do1[i] = divc[i] ? di1 : 0;
|
assign do1[i] = divc[i] ? di1 : 0;
|
assign do2[i] = divc[i] ? di2 : 0;
|
assign do2[i] = divc[i] ? di2 : 0;
|
assign do3[i] = divc[i] ? di3 : 0;
|
assign do3[i] = divc[i] ? di3 : 0;
|
assign dot[i] = divc[i] ? dit : 0;
|
assign dot[i] = divc[i] ? dit : 0;
|
end
|
end
|
endgenerate
|
endgenerate
|
|
|
assign dia = |doa;
|
//assign dia = |doa;
|
|
c2 CACK (.a0(|doa), .a1(|divc), .q(dia));
|
|
|
endmodule // vcdmux
|
endmodule // vcdmux
|
|
|
|
|