Line 21... |
Line 21... |
|
|
module outpbuf (/*AUTOARG*/
|
module outpbuf (/*AUTOARG*/
|
// Outputs
|
// Outputs
|
dia, do0, do1, do2, do3, dot, dovc, afc, vca,
|
dia, do0, do1, do2, do3, dot, dovc, afc, vca,
|
// Inputs
|
// Inputs
|
di0, di1, di2, di3, dit, doa, credit, vcr, rstn
|
di0, di1, di2, di3, dit, doa, credit, vcr, rst_n
|
);
|
);
|
parameter DW = 32; // data width
|
parameter DW = 32; // data width
|
parameter VCN = 4; // VC number
|
parameter VCN = 4; // VC number
|
parameter FT = 3; // flit type, now 3, HOF, BOF, EOF
|
parameter FT = 3; // flit type, now 3, HOF, BOF, EOF
|
parameter FCPD = 3; // the depth of the credit pipeline
|
parameter FCPD = 3; // the depth of the credit pipeline
|
Line 49... |
Line 49... |
// vc requests in
|
// vc requests in
|
input [VCN-1:0] vcr;
|
input [VCN-1:0] vcr;
|
output [VCN-1:0] vca;
|
output [VCN-1:0] vca;
|
|
|
// active-low reset
|
// active-low reset
|
input rstn;
|
input rst_n;
|
|
|
//--------------------------------------------------------------
|
//--------------------------------------------------------------
|
wire [VCN-1:0] vcro, vcg, vcgl, vcrm;
|
wire [VCN-1:0] vcro, vcg, vcgl, vcrm;
|
wire [SCN-1:0] doan, diad;
|
wire [SCN-1:0] doan, diad;
|
wire dian, diavc, diavcn, diat;
|
wire dian, diavc, diavcn, diat;
|
Line 65... |
Line 65... |
FCU (
|
FCU (
|
.afc ( afc ),
|
.afc ( afc ),
|
.ro ( vcro ),
|
.ro ( vcro ),
|
.credit ( credit ),
|
.credit ( credit ),
|
.ri ( vcr ),
|
.ri ( vcr ),
|
.rst ( ~rstn )
|
.rst ( ~rst_n )
|
);
|
);
|
|
|
// VC arbiter
|
// VC arbiter
|
mutex_arb #(.wd(VCN)) Sch (.req(vcro), .gnt(vcg));
|
mutex_arb #(.wd(VCN)) Sch (.req(vcro), .gnt(vcg));
|
|
|
Line 77... |
Line 77... |
generate
|
generate
|
for(i=0; i<VCN; i++)begin:SCEN
|
for(i=0; i<VCN; i++)begin:SCEN
|
c2 C (.a0(vcg[i]), .a1(diavcn), .q(vcgl[i]));
|
c2 C (.a0(vcg[i]), .a1(diavcn), .q(vcgl[i]));
|
end
|
end
|
endgenerate
|
endgenerate
|
assign diavcn = (~diavc)&rstn;
|
assign diavcn = (~diavc)&rst_n;
|
|
|
// output data buffer
|
// output data buffer
|
generate
|
generate
|
for(gsub=0; gsub<SCN; gsub++) begin:SC
|
for(gsub=0; gsub<SCN; gsub++) begin:SC
|
pipe4 #(.DW(2))
|
pipe4 #(.DW(2))
|
Line 95... |
Line 95... |
.i1 ( di1[gsub] ),
|
.i1 ( di1[gsub] ),
|
.i2 ( di2[gsub] ),
|
.i2 ( di2[gsub] ),
|
.i3 ( di3[gsub] ),
|
.i3 ( di3[gsub] ),
|
.oa ( doan[gsub] )
|
.oa ( doan[gsub] )
|
);
|
);
|
assign doan[gsub] = (~doa)&rstn;
|
assign doan[gsub] = (~doa)&rst_n;
|
end // block: SC
|
end // block: SC
|
endgenerate
|
endgenerate
|
|
|
pipen #(.DW(FT))
|
pipen #(.DW(FT))
|
L0T (
|
L0T (
|
.d_in ( dit ),
|
.d_in ( dit ),
|
.d_in_a ( diat ),
|
.d_in_a ( diat ),
|
.d_out ( dot ),
|
.d_out ( dot ),
|
.d_out_a ( (~doa)&rstn )
|
.d_out_a ( (~doa)&rst_n )
|
);
|
);
|
|
|
ctree #(.DW(SCN+2)) ACKT (.ci({diavc,diat, diad}), .co(dia));
|
ctree #(.DW(SCN+2)) ACKT (.ci({diavc,diat, diad}), .co(dia));
|
|
|
pipen #(.DW(VCN))
|
pipen #(.DW(VCN))
|
LSV (
|
LSV (
|
.d_in ( vcgl ),
|
.d_in ( vcgl ),
|
.d_in_a ( diavc ),
|
.d_in_a ( diavc ),
|
.d_out ( dovc ),
|
.d_out ( dovc ),
|
.d_out_a ( (~doa)&rstn )
|
.d_out_a ( (~doa)&rst_n )
|
);
|
);
|
|
|
assign vca = dovc;
|
assign vca = dovc;
|
|
|
endmodule // outpbuf
|
endmodule // outpbuf
|