1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
//
// Copyright 2018 Ettus Research, a National Instruments Company
//
// SPDX-License-Identifier: LGPL-3.0-or-later
//
module noc_traffic_counter #(
parameter SR_REG_BASE = 128,
parameter RB_REG_BASE = 0)
(
input bus_clk, input bus_rst,
input ce_clk, input ce_rst,
// Control sink
input [31:0] set_data, input [7:0] set_addr, input set_stb,
output rb_stb, input [7:0] rb_addr, output [63:0] rb_data,
// Traffic signals to count
input i_tlast, input i_tvalid, input i_tready,
input o_tlast, input o_tvalid, input o_tready,
input str_sink_tlast, input str_sink_tvalid, input str_sink_tready,
input str_src_tlast, input str_src_tvalid, input str_src_tready
);
wire en, counter_enable_changed;
wire [31:0] set_data_bclk;
wire [7:0] set_addr_bclk;
wire set_stb_bclk;
reg [63:0] rb_data_bclk;
wire [7:0] rb_addr_bclk;
reg rb_stb_bclk;
reg [63:0] tick_cnt_noc_shell;
wire [63:0] xbar_to_shell_xfer_cnt;
wire [63:0] xbar_to_shell_pkt_cnt;
wire [63:0] shell_to_xbar_xfer_cnt;
wire [63:0] shell_to_xbar_pkt_cnt;
wire [63:0] shell_to_ce_xfer_cnt;
wire [63:0] shell_to_ce_pkt_cnt;
wire [63:0] ce_to_shell_xfer_cnt;
wire [63:0] ce_to_shell_pkt_cnt;
localparam SR_COUNTER_ENABLE = SR_REG_BASE + 0;
localparam RB_SIGNATURE = RB_REG_BASE + 0;
localparam RB_BUS_CLK_TICKS = RB_REG_BASE + 1;
localparam RB_XBAR_TO_SHELL_XFER_CNT = RB_REG_BASE + 2;
localparam RB_XBAR_TO_SHELL_PKT_CNT = RB_REG_BASE + 3;
localparam RB_SHELL_TO_XBAR_XFER_CNT = RB_REG_BASE + 4;
localparam RB_SHELL_TO_XBAR_PKT_CNT = RB_REG_BASE + 5;
localparam RB_SHELL_TO_CE_XFER_CNT = RB_REG_BASE + 6;
localparam RB_SHELL_TO_CE_PKT_CNT = RB_REG_BASE + 7;
localparam RB_CE_TO_SHELL_XFER_CNT = RB_REG_BASE + 8;
localparam RB_CE_TO_SHELL_PKT_CNT = RB_REG_BASE + 9;
// Registers are implemented on bus clock
axi_fifo_2clk #(.WIDTH(8+8+32), .SIZE(2)) reg_write_to_bclk (
.reset(ce_rst), .i_aclk(ce_clk),
.i_tdata({set_addr, rb_addr, set_data}), .i_tvalid(set_stb), .i_tready(),
.o_aclk(bus_clk),
.o_tdata({set_addr_bclk, rb_addr_bclk, set_data_bclk}), .o_tvalid(set_stb_bclk), .o_tready(1'b1));
axi_fifo_2clk #(.WIDTH(64), .SIZE(2)) reg_rb_from_bclk (
.reset(bus_rst), .i_aclk(bus_clk),
.i_tdata(rb_data_bclk), .i_tvalid(rb_stb_bclk), .i_tready(),
.o_aclk(ce_clk),
.o_tdata(rb_data), .o_tvalid(rb_stb), .o_tready(1'b1));
setting_reg #(.my_addr(SR_COUNTER_ENABLE), .width(1)) enable_measurement_reg (
.clk(bus_clk), .rst(bus_rst), .strobe(set_stb_bclk), .addr(set_addr_bclk),
.in(set_data_bclk), .out(en), .changed(counter_enable_changed));
always @(posedge bus_clk)
if (set_stb_bclk) begin
case(rb_addr_bclk)
RB_SIGNATURE : rb_data_bclk <= 64'h712AFF1C00000000;
RB_BUS_CLK_TICKS : rb_data_bclk <= tick_cnt_noc_shell;
RB_XBAR_TO_SHELL_XFER_CNT : rb_data_bclk <= xbar_to_shell_xfer_cnt;
RB_XBAR_TO_SHELL_PKT_CNT : rb_data_bclk <= xbar_to_shell_pkt_cnt;
RB_SHELL_TO_XBAR_XFER_CNT : rb_data_bclk <= shell_to_xbar_xfer_cnt;
RB_SHELL_TO_XBAR_PKT_CNT : rb_data_bclk <= shell_to_xbar_pkt_cnt;
RB_SHELL_TO_CE_XFER_CNT : rb_data_bclk <= shell_to_ce_xfer_cnt;
RB_SHELL_TO_CE_PKT_CNT : rb_data_bclk <= shell_to_ce_pkt_cnt;
RB_CE_TO_SHELL_XFER_CNT : rb_data_bclk <= ce_to_shell_xfer_cnt;
RB_CE_TO_SHELL_PKT_CNT : rb_data_bclk <= ce_to_shell_pkt_cnt;
default : rb_data_bclk <= 64'h0BADC0DE0BADC0DE;
endcase
end
always @(posedge bus_clk)
rb_stb_bclk <= set_stb_bclk;
assign counter_rst = en & counter_enable_changed;
axis_strm_monitor #(.COUNT_W(64), .PKT_COUNT_EN(1), .XFER_COUNT_EN(1)) xbar_to_shell (
.clk(bus_clk), .reset(counter_rst),
.axis_tdata(), .axis_tlast(i_tlast & en), .axis_tvalid(i_tvalid & en), .axis_tready(i_tready & en),
.xfer_count(xbar_to_shell_xfer_cnt), .pkt_count(xbar_to_shell_pkt_cnt));
axis_strm_monitor #(.COUNT_W(64), .PKT_COUNT_EN(1), .XFER_COUNT_EN(1)) shell_to_xbar (
.clk(bus_clk), .reset(counter_rst),
.axis_tdata(), .axis_tlast(o_tlast & en), .axis_tvalid(o_tvalid & en), .axis_tready(o_tready & en),
.xfer_count(shell_to_xbar_xfer_cnt), .pkt_count(shell_to_xbar_pkt_cnt));
axis_strm_monitor #(.COUNT_W(64), .PKT_COUNT_EN(1), .XFER_COUNT_EN(1)) shell_to_ce (
.clk(bus_clk), .reset(counter_rst),
.axis_tdata(), .axis_tlast(str_sink_tlast & en), .axis_tvalid(str_sink_tvalid & en), .axis_tready(str_sink_tready & en),
.xfer_count(shell_to_ce_xfer_cnt), .pkt_count(shell_to_ce_pkt_cnt));
axis_strm_monitor #(.COUNT_W(64), .PKT_COUNT_EN(1), .XFER_COUNT_EN(1)) ce_to_shell (
.clk(bus_clk), .reset(counter_rst),
.axis_tdata(), .axis_tlast(str_src_tlast & en), .axis_tvalid(str_src_tvalid & en), .axis_tready(str_src_tready & en),
.xfer_count(ce_to_shell_xfer_cnt), .pkt_count(ce_to_shell_pkt_cnt));
// Count clock ticks
always @(posedge bus_clk)
if (counter_rst)
tick_cnt_noc_shell <= 0;
else
if (en)
tick_cnt_noc_shell <= tick_cnt_noc_shell + 1;
endmodule
|