// synthesis translate_off
|
// synthesis translate_off
|
`timescale 1ns/1ns
|
`timescale 1ns/1ns
|
`include "pronoc_def.v"
|
`include "pronoc_def.v"
|
module routers_statistic_collector
|
module routers_statistic_collector #(
|
import pronoc_pkg::*;
|
parameter NOC_ID=0
|
(
|
)(
|
reset,
|
reset,
|
clk,
|
clk,
|
router_event,
|
router_event,
|
print
|
print
|
);
|
);
|
|
|
|
`NOC_CONF
|
|
|
input clk,reset;
|
input clk,reset;
|
input router_event_t router_event [NR-1 : 0][MAX_P-1 : 0];
|
input router_event_t router_event [NR-1 : 0][MAX_P-1 : 0];
|
input print;
|
input print;
|
|
|
typedef struct {
|
typedef struct {
|
integer pck_num_in;
|
integer pck_num_in;
|
integer flit_num_in;
|
integer flit_num_in;
|
integer pck_num_out;
|
integer pck_num_out;
|
integer flit_num_out;
|
integer flit_num_out;
|
integer flit_num_in_bypassed;
|
integer flit_num_in_bypassed;
|
integer flit_num_in_buffered;
|
integer flit_num_in_buffered;
|
integer bypass_counter [SMART_NUM : 0];
|
integer bypass_counter [SMART_NUM : 0];
|
} router_stat_t;
|
} router_stat_t;
|
|
|
|
|
|
|
task reset_router_stat;
|
task reset_router_stat;
|
output router_stat_t stat_in;
|
output router_stat_t stat_in;
|
integer k;
|
integer k;
|
begin
|
begin
|
stat_in.pck_num_in=0;
|
stat_in.pck_num_in=0;
|
stat_in.flit_num_in=0;
|
stat_in.flit_num_in=0;
|
stat_in.pck_num_out=0;
|
stat_in.pck_num_out=0;
|
stat_in.flit_num_out=0;
|
stat_in.flit_num_out=0;
|
stat_in.flit_num_in_bypassed=0;
|
stat_in.flit_num_in_bypassed=0;
|
stat_in.flit_num_in_buffered=0;
|
stat_in.flit_num_in_buffered=0;
|
for (k=0;k
|
for (k=0;k
|
end
|
end
|
endtask
|
endtask
|
|
|
task print_router_st;
|
task print_router_st;
|
input router_stat_t stat_in;
|
input router_stat_t stat_in;
|
integer k;
|
integer k;
|
begin
|
begin
|
$write("%0d,", stat_in.flit_num_in);
|
$write("%0d,", stat_in.flit_num_in);
|
$write("%0d,", stat_in.pck_num_in);
|
$write("%0d,", stat_in.pck_num_in);
|
$write("%0d,", stat_in.flit_num_out);
|
$write("%0d,", stat_in.flit_num_out);
|
$write("%0d,", stat_in.pck_num_out);
|
$write("%0d,", stat_in.pck_num_out);
|
$write("%0d,", stat_in.flit_num_in_buffered);
|
$write("%0d,", stat_in.flit_num_in_buffered);
|
$write("%0d,", stat_in.flit_num_in_bypassed);
|
$write("%0d,", stat_in.flit_num_in_bypassed);
|
if(SMART_MAX>0) for (k=0;k
|
if(SMART_MAX>0) for (k=0;k
|
$write("\n");
|
$write("\n");
|
end
|
end
|
endtask
|
endtask
|
|
|
router_stat_t router_stat [NR][MAX_P];
|
router_stat_t router_stat [NR][MAX_P];
|
router_stat_t router_stat_accum [NR];
|
router_stat_t router_stat_accum [NR];
|
|
|
integer r,p;
|
integer r,p;
|
initial begin
|
initial begin
|
for(r=0;r
|
for(r=0;r
|
reset_router_stat(router_stat_accum[r]);
|
reset_router_stat(router_stat_accum[r]);
|
for (p=0;p
|
for (p=0;p
|
reset_router_stat(router_stat[r][p]);
|
reset_router_stat(router_stat[r][p]);
|
end//p
|
end//p
|
end//r
|
end//r
|
end//init
|
end//init
|
|
|
|
|
|
|
always @ (posedge clk) begin
|
always @ (posedge clk) begin
|
for(r=0;r
|
for(r=0;r
|
for (p=0;p
|
for (p=0;p
|
if( router_event[r][p].flit_wr_i ) router_stat[r][p].flit_num_in++;
|
if( router_event[r][p].flit_wr_i ) router_stat[r][p].flit_num_in++;
|
if( router_event[r][p].pck_wr_i ) router_stat[r][p].pck_num_in++;
|
if( router_event[r][p].pck_wr_i ) router_stat[r][p].pck_num_in++;
|
if( router_event[r][p].flit_wr_o ) router_stat[r][p].flit_num_out++;
|
if( router_event[r][p].flit_wr_o ) router_stat[r][p].flit_num_out++;
|
if( router_event[r][p].pck_wr_o ) router_stat[r][p].pck_num_out++;
|
if( router_event[r][p].pck_wr_o ) router_stat[r][p].pck_num_out++;
|
if( router_event[r][p].flit_in_bypassed) router_stat[r][p].flit_num_in_bypassed++;
|
if( router_event[r][p].flit_in_bypassed) router_stat[r][p].flit_num_in_bypassed++;
|
else if( router_event[r][p].flit_wr_i) begin
|
else if( router_event[r][p].flit_wr_i) begin
|
router_stat [r][p].flit_num_in_buffered++;
|
router_stat [r][p].flit_num_in_buffered++;
|
router_stat[r][p].bypass_counter[router_event[r][p].bypassed_num]++;
|
router_stat[r][p].bypass_counter[router_event[r][p].bypassed_num]++;
|
end
|
end
|
|
|
end//p
|
end//p
|
end//r
|
end//r
|
end//always
|
end//always
|
|
|
|
|
|
|
integer k;
|
integer k;
|
|
|
always @(posedge print) begin
|
always @(posedge print) begin
|
for(r=0;r
|
for(r=0;r
|
for (p=0;p
|
for (p=0;p
|
router_stat_accum[r].pck_num_in+= router_stat[r][p].pck_num_in;
|
router_stat_accum[r].pck_num_in+= router_stat[r][p].pck_num_in;
|
router_stat_accum[r].flit_num_in+= router_stat[r][p].flit_num_in;
|
router_stat_accum[r].flit_num_in+= router_stat[r][p].flit_num_in;
|
router_stat_accum[r].pck_num_out+= router_stat[r][p].pck_num_out;
|
router_stat_accum[r].pck_num_out+= router_stat[r][p].pck_num_out;
|
router_stat_accum[r].flit_num_out+= router_stat[r][p].flit_num_out;
|
router_stat_accum[r].flit_num_out+= router_stat[r][p].flit_num_out;
|
router_stat_accum[r].flit_num_in_bypassed+=router_stat[r][p].flit_num_in_bypassed;
|
router_stat_accum[r].flit_num_in_bypassed+=router_stat[r][p].flit_num_in_bypassed;
|
router_stat_accum[r].flit_num_in_buffered+=router_stat[r][p].flit_num_in_buffered;
|
router_stat_accum[r].flit_num_in_buffered+=router_stat[r][p].flit_num_in_buffered;
|
for (k=0;k
|
for (k=0;k
|
|
|
end//p
|
end//p
|
end//r
|
end//r
|
|
|
|
|
//report router statistic
|
//report router statistic
|
$display("\n\tRouters' statistics");
|
$display("\n\tRouters' statistics");
|
$write("\t#RID, #Port,flit_in,pck_in,flit_out,pck_out,flit_in_buffered,flit_in_bypassed,");
|
$write("\t#RID, #Port,flit_in,pck_in,flit_out,pck_out,flit_in_buffered,flit_in_bypassed,");
|
if(SMART_MAX>0) for (k=0;k
|
if(SMART_MAX>0) for (k=0;k
|
$write("\n");
|
$write("\n");
|
for(r=0;r
|
for(r=0;r
|
for (p=0;p
|
for (p=0;p
|
$write("\t%0d,%0d,",r,p);
|
$write("\t%0d,%0d,",r,p);
|
print_router_st(router_stat [r][p]);
|
print_router_st(router_stat [r][p]);
|
end//p
|
end//p
|
$write("\t%0d,total,",r);
|
$write("\t%0d,total,",r);
|
print_router_st(router_stat_accum [r]);
|
print_router_st(router_stat_accum [r]);
|
end //r
|
end //r
|
end//always
|
end//always
|
|
|
|
|
|
|
endmodule
|
endmodule
|
// synthesis translate_on
|
// synthesis translate_on
|
|
|