176 lines
6.4 KiB
Systemverilog
176 lines
6.4 KiB
Systemverilog
// this module records many perforance counters
|
|
module performance_monitor
|
|
import rvh_noc_pkg::*;
|
|
#(
|
|
parameter INPUT_PORT_NUM = 5,
|
|
parameter OUTPUT_PORT_NUM = 5,
|
|
parameter LOCAL_PORT_NUM = INPUT_PORT_NUM-4,
|
|
|
|
parameter VC_NUM_INPUT_N = 1+LOCAL_PORT_NUM,
|
|
parameter VC_NUM_INPUT_S = 1+LOCAL_PORT_NUM,
|
|
parameter VC_NUM_INPUT_E = 3+LOCAL_PORT_NUM,
|
|
parameter VC_NUM_INPUT_W = 3+LOCAL_PORT_NUM,
|
|
parameter VC_NUM_INPUT_L = 4,
|
|
|
|
parameter VC_DEPTH_INPUT_N = 2,
|
|
parameter VC_DEPTH_INPUT_S = 2,
|
|
parameter VC_DEPTH_INPUT_E = 2,
|
|
parameter VC_DEPTH_INPUT_W = 2,
|
|
parameter VC_DEPTH_INPUT_L = 2,
|
|
parameter VC_DEPTH_INPUT_N_COUNTER_W = $clog2(VC_DEPTH_INPUT_N + 1),
|
|
parameter VC_DEPTH_INPUT_S_COUNTER_W = $clog2(VC_DEPTH_INPUT_S + 1),
|
|
parameter VC_DEPTH_INPUT_E_COUNTER_W = $clog2(VC_DEPTH_INPUT_E + 1),
|
|
parameter VC_DEPTH_INPUT_W_COUNTER_W = $clog2(VC_DEPTH_INPUT_W + 1),
|
|
parameter VC_DEPTH_INPUT_L_COUNTER_W = $clog2(VC_DEPTH_INPUT_L + 1)
|
|
|
|
)
|
|
(
|
|
// 1. sa global util
|
|
// input from sa local
|
|
input logic [INPUT_PORT_NUM-1:0] sa_local_vld_i,
|
|
// input from sa global
|
|
input logic [INPUT_PORT_NUM-1:0] sa_global_inport_read_vld_i,
|
|
|
|
// 2. outport credit util
|
|
input logic [VC_NUM_INPUT_N-1:0][VC_DEPTH_INPUT_N_COUNTER_W-1:0] vc_credit_counter_toN_i,
|
|
input logic [VC_NUM_INPUT_S-1:0][VC_DEPTH_INPUT_S_COUNTER_W-1:0] vc_credit_counter_toS_i,
|
|
input logic [VC_NUM_INPUT_E-1:0][VC_DEPTH_INPUT_E_COUNTER_W-1:0] vc_credit_counter_toE_i,
|
|
input logic [VC_NUM_INPUT_W-1:0][VC_DEPTH_INPUT_W_COUNTER_W-1:0] vc_credit_counter_toW_i,
|
|
`ifdef HAVE_LOCAL_PORT
|
|
input logic [LOCAL_PORT_NUM-1:0][VC_NUM_INPUT_L-1:0][VC_DEPTH_INPUT_L_COUNTER_W-1:0] vc_credit_counter_toL_i,
|
|
`endif
|
|
|
|
// router addr
|
|
input logic [NodeID_X_Width-1:0] node_id_x_ths_hop_i,
|
|
input logic [NodeID_Y_Width-1:0] node_id_y_ths_hop_i,
|
|
|
|
input logic clk,
|
|
input logic rstn
|
|
);
|
|
|
|
genvar i;
|
|
|
|
// global sa efficiency
|
|
logic [INPUT_PORT_NUM-1:0][64-1:0] sa_local_vld_counter_d, sa_local_vld_counter_q;
|
|
logic [INPUT_PORT_NUM-1:0] sa_local_vld_counter_ena;
|
|
logic [INPUT_PORT_NUM-1:0][64-1:0] sa_global_inport_read_vld_counter_d, sa_global_inport_read_vld_counter_q;
|
|
logic [INPUT_PORT_NUM-1:0] sa_global_inport_read_vld_counter_ena;
|
|
|
|
always_comb begin
|
|
sa_local_vld_counter_d = sa_local_vld_counter_q;
|
|
sa_local_vld_counter_ena = '0;
|
|
sa_global_inport_read_vld_counter_d = sa_global_inport_read_vld_counter_q;
|
|
sa_global_inport_read_vld_counter_ena = '0;
|
|
|
|
for(int i = 0; i < INPUT_PORT_NUM; i++) begin
|
|
if(sa_local_vld_i[i]) begin
|
|
sa_local_vld_counter_d[i] = sa_local_vld_counter_d[i] + 1;
|
|
sa_local_vld_counter_ena[i] = 1'b1;
|
|
end
|
|
if(sa_global_inport_read_vld_i[i]) begin
|
|
sa_global_inport_read_vld_counter_d [i] = sa_global_inport_read_vld_counter_d[i] + 1;
|
|
sa_global_inport_read_vld_counter_ena [i] = 1'b1;
|
|
end
|
|
end
|
|
end
|
|
|
|
generate
|
|
for(i = 0; i < INPUT_PORT_NUM; i++) begin
|
|
std_dffre
|
|
#(.WIDTH(64))
|
|
U_DAT_SA_LOCAL_VLD_COUNTER
|
|
(
|
|
.clk(clk),
|
|
.rstn(rstn),
|
|
.en(sa_local_vld_counter_ena[i]),
|
|
.d(sa_local_vld_counter_d[i]),
|
|
.q(sa_local_vld_counter_q[i])
|
|
);
|
|
|
|
std_dffre
|
|
#(.WIDTH(64))
|
|
U_DAT_SA_GLOBAL_INPORT_READ_VLD_COUNTER
|
|
(
|
|
.clk(clk),
|
|
.rstn(rstn),
|
|
.en(sa_global_inport_read_vld_counter_ena[i]),
|
|
.d(sa_global_inport_read_vld_counter_d[i]),
|
|
.q(sa_global_inport_read_vld_counter_q[i])
|
|
);
|
|
end
|
|
endgenerate
|
|
|
|
`ifdef V_ROUTER_PM_PRINT_EN
|
|
// display
|
|
// 1. sa global util
|
|
real sa_local_vld_counter [INPUT_PORT_NUM-1:0];
|
|
real sa_global_inport_read_vld_counter[INPUT_PORT_NUM-1:0];
|
|
real sa_local_vld_counter_all;
|
|
real sa_global_inport_read_vld_counter_all;
|
|
|
|
always_ff @(posedge clk) begin
|
|
if(~rstn) begin
|
|
|
|
end else begin
|
|
sa_local_vld_counter_all = 0;
|
|
sa_global_inport_read_vld_counter_all = 0;
|
|
for(int i = 0; i < INPUT_PORT_NUM; i++) begin
|
|
sa_local_vld_counter[i] = sa_local_vld_counter_q[i];
|
|
sa_global_inport_read_vld_counter[i] = sa_global_inport_read_vld_counter_q[i];
|
|
sa_local_vld_counter_all = sa_local_vld_counter_all + sa_local_vld_counter_q[i];
|
|
sa_global_inport_read_vld_counter_all = sa_global_inport_read_vld_counter_all + sa_global_inport_read_vld_counter_q[i];
|
|
|
|
$display("[%16d] info: (router %d,%d inport %2d) pm global sa efficiency (sa_global/sa_local): (%16d/%16d) = %f",
|
|
$time(), node_id_x_ths_hop_i, node_id_y_ths_hop_i, i,
|
|
sa_global_inport_read_vld_counter[i], sa_local_vld_counter[i],
|
|
sa_global_inport_read_vld_counter[i]/sa_local_vld_counter[i]);
|
|
end
|
|
$display("[%16d] info: pm (inportall) global sa efficiency (sa_global/sa_local): (%16d/%16d) = %f",
|
|
$time(),
|
|
sa_global_inport_read_vld_counter_all, sa_local_vld_counter_all,
|
|
sa_global_inport_read_vld_counter_all/sa_local_vld_counter_all);
|
|
|
|
end
|
|
end
|
|
|
|
// 2. outport credit util
|
|
always_ff @(posedge clk) begin
|
|
if(~rstn) begin
|
|
|
|
end else begin
|
|
for(int i = 0; i < VC_NUM_INPUT_N; i++) begin
|
|
$display("[%16d] info: (router %d,%d outport N vc id %d) pm credit count: %d",
|
|
$time(), node_id_x_ths_hop_i, node_id_y_ths_hop_i, i,
|
|
vc_credit_counter_toN_i[i]);
|
|
end
|
|
for(int i = 0; i < VC_NUM_INPUT_S; i++) begin
|
|
$display("[%16d] info: (router %d,%d outport S vc id %d) pm credit count: %d",
|
|
$time(), node_id_x_ths_hop_i, node_id_y_ths_hop_i, i,
|
|
vc_credit_counter_toS_i[i]);
|
|
end
|
|
for(int i = 0; i < VC_NUM_INPUT_E; i++) begin
|
|
$display("[%16d] info: (router %d,%d outport E vc id %d) pm credit count: %d",
|
|
$time(), node_id_x_ths_hop_i, node_id_y_ths_hop_i, i,
|
|
vc_credit_counter_toE_i[i]);
|
|
end
|
|
for(int i = 0; i < VC_NUM_INPUT_W; i++) begin
|
|
$display("[%16d] info: (router %d,%d outport W vc id %d) pm credit count: %d",
|
|
$time(), node_id_x_ths_hop_i, node_id_y_ths_hop_i, i,
|
|
vc_credit_counter_toW_i[i]);
|
|
end
|
|
`ifdef HAVE_LOCAL_PORT
|
|
for(int i = 0; i < LOCAL_PORT_NUM; i++) begin
|
|
for(int j = 0; j < VC_NUM_INPUT_L; j++) begin
|
|
$display("[%16d] info: (router %d,%d outport L%1d vc id %d) pm credit count: %d",
|
|
$time(), node_id_x_ths_hop_i, node_id_y_ths_hop_i, i, j,
|
|
vc_credit_counter_toL_i[i][j]);
|
|
end
|
|
end
|
|
`endif
|
|
end
|
|
end
|
|
|
|
`endif
|
|
|
|
endmodule
|