summaryrefslogtreecommitdiff
path: root/rtl/perf
diff options
context:
space:
mode:
authorAlejandro Soto <alejandro@34project.org>2024-02-12 22:33:47 -0600
committerAlejandro Soto <alejandro@34project.org>2024-02-20 11:11:18 -0600
commit31006bd10962e72c56f34158b893313e233cd161 (patch)
tree42d25fdb315b80c57c87462576f0d9ff0d172704 /rtl/perf
parent6c175d5dc428f630e3bd4caf707db4b77b0b87e7 (diff)
rtl/perf: add a flag for enabling or disabling the perf module
Diffstat (limited to 'rtl/perf')
-rw-r--r--rtl/perf/perf_link.sv243
-rw-r--r--rtl/perf/perf_monitor.sv63
-rw-r--r--rtl/perf/perf_snoop.sv125
3 files changed, 223 insertions, 208 deletions
diff --git a/rtl/perf/perf_link.sv b/rtl/perf/perf_link.sv
index 323af45..d42fc50 100644
--- a/rtl/perf/perf_link.sv
+++ b/rtl/perf/perf_link.sv
@@ -1,4 +1,5 @@
`include "cache/defs.sv"
+`include "config.sv"
module perf_link
(
@@ -55,127 +56,131 @@ module perf_link
.*
);
- assign cached = snoop_addr_bits.io == `IO_CACHED;
- assign mem_cycles = mem_cycles_hold + 1;
- assign snoop_addr_bits = snoop_address;
-
- always_comb
- if (!address[3]) unique case (address[2:0])
- 3'b000: readdata = reads;
- 3'b001: readdata = writes;
- 3'b010: readdata = {max_read_cycles, min_read_cycles};
- 3'b011: readdata = {max_write_cycles, min_write_cycles};
- 3'b100: readdata = ring_reads;
- 3'b101: readdata = ring_invals;
- 3'b110: readdata = ring_read_invals;
- 3'b111: readdata = ring_replies;
- endcase else unique case (address[1:0])
- 2'b00: readdata = ring_forwards;
- 2'b01: readdata = {max_ring_cycles, min_ring_cycles};
- 2'b10: readdata = io_reads;
- 2'b11: readdata = io_writes;
- endcase
-
- always @(posedge clk or negedge rst_n)
- if (!rst_n) begin
- reads <= 0;
- writes <= 0;
- io_reads <= 0;
- io_writes <= 0;
-
- min_ring_cycles <= 0;
- max_ring_cycles <= 0;
- min_read_cycles <= 0;
- max_read_cycles <= 0;
- min_write_cycles <= 0;
- max_write_cycles <= 0;
-
- ring_reads <= 0;
- ring_invals <= 0;
- ring_replies <= 0;
- ring_forwards <= 0;
- ring_read_invals <= 0;
-
- mem_cycles_hold <= 0;
- end else begin
- ring_cycles <= ring_cycles + 1;
-
- if (mem_read || mem_write)
- mem_cycles_hold <= mem_cycles;
-
- if ((mem_read || mem_write) && !mem_waitrequest) begin
- mem_cycles_hold <= 0;
-
- if (!cached) begin
- if (mem_write)
- io_writes <= io_writes + 1;
- else
- io_reads <= io_reads + 1;
- end else if (mem_write) begin
- writes <= writes + 1;
-
- if (min_write_cycles == 0 || mem_cycles_hold < min_write_cycles)
- min_write_cycles <= mem_cycles;
-
- if (mem_cycles_hold >= max_write_cycles)
- max_write_cycles <= mem_cycles;
+ generate
+ if (`CONFIG_PERF_MONITOR) begin: enable
+ assign cached = snoop_addr_bits.io == `IO_CACHED;
+ assign mem_cycles = mem_cycles_hold + 1;
+ assign snoop_addr_bits = snoop_address;
+
+ always_comb
+ if (!address[3]) unique case (address[2:0])
+ 3'b000: readdata = reads;
+ 3'b001: readdata = writes;
+ 3'b010: readdata = {max_read_cycles, min_read_cycles};
+ 3'b011: readdata = {max_write_cycles, min_write_cycles};
+ 3'b100: readdata = ring_reads;
+ 3'b101: readdata = ring_invals;
+ 3'b110: readdata = ring_read_invals;
+ 3'b111: readdata = ring_replies;
+ endcase else unique case (address[1:0])
+ 2'b00: readdata = ring_forwards;
+ 2'b01: readdata = {max_ring_cycles, min_ring_cycles};
+ 2'b10: readdata = io_reads;
+ 2'b11: readdata = io_writes;
+ endcase
+
+ always @(posedge clk or negedge rst_n)
+ if (!rst_n) begin
+ reads <= 0;
+ writes <= 0;
+ io_reads <= 0;
+ io_writes <= 0;
+
+ min_ring_cycles <= 0;
+ max_ring_cycles <= 0;
+ min_read_cycles <= 0;
+ max_read_cycles <= 0;
+ min_write_cycles <= 0;
+ max_write_cycles <= 0;
+
+ ring_reads <= 0;
+ ring_invals <= 0;
+ ring_replies <= 0;
+ ring_forwards <= 0;
+ ring_read_invals <= 0;
+
+ mem_cycles_hold <= 0;
end else begin
- reads <= reads + 1;
-
- if (min_read_cycles == 0 || mem_cycles_hold < min_read_cycles)
- min_read_cycles <= mem_cycles;
-
- if (mem_cycles_hold >= max_read_cycles)
- max_read_cycles <= mem_cycles;
+ ring_cycles <= ring_cycles + 1;
+
+ if (mem_read || mem_write)
+ mem_cycles_hold <= mem_cycles;
+
+ if ((mem_read || mem_write) && !mem_waitrequest) begin
+ mem_cycles_hold <= 0;
+
+ if (!cached) begin
+ if (mem_write)
+ io_writes <= io_writes + 1;
+ else
+ io_reads <= io_reads + 1;
+ end else if (mem_write) begin
+ writes <= writes + 1;
+
+ if (min_write_cycles == 0 || mem_cycles_hold < min_write_cycles)
+ min_write_cycles <= mem_cycles;
+
+ if (mem_cycles_hold >= max_write_cycles)
+ max_write_cycles <= mem_cycles;
+ end else begin
+ reads <= reads + 1;
+
+ if (min_read_cycles == 0 || mem_cycles_hold < min_read_cycles)
+ min_read_cycles <= mem_cycles;
+
+ if (mem_cycles_hold >= max_read_cycles)
+ max_read_cycles <= mem_cycles;
+ end
+ end
+
+ if (snoop_left_valid && snoop_left_ready && snoop_left.ttl == `TTL_END) begin
+ if (snoop_left.reply)
+ ring_replies <= ring_replies + 1;
+
+ if (min_ring_cycles == 0 || ring_cycles < min_ring_cycles)
+ min_ring_cycles <= ring_cycles;
+
+ if (ring_cycles > max_ring_cycles)
+ max_ring_cycles <= ring_cycles;
+ end
+
+ if (snoop_right_valid && snoop_right_ready) begin
+ if (snoop_right.ttl == `TTL_MAX) begin
+ ring_cycles <= 1;
+
+ if (snoop_right.read && !snoop_right.inval)
+ ring_reads <= ring_reads + 1;
+
+ if (!snoop_right.read && snoop_right.inval)
+ ring_invals <= ring_invals + 1;
+
+ if (snoop_right.read && snoop_right.inval)
+ ring_read_invals <= ring_read_invals + 1;
+ end else
+ ring_forwards <= ring_forwards + 1;
+ end
+
+ if (clear) begin
+ reads <= 0;
+ writes <= 0;
+ io_reads <= 0;
+ io_writes <= 0;
+
+ min_ring_cycles <= 0;
+ max_ring_cycles <= 0;
+ min_read_cycles <= 0;
+ max_read_cycles <= 0;
+ min_write_cycles <= 0;
+ max_write_cycles <= 0;
+
+ ring_reads <= 0;
+ ring_invals <= 0;
+ ring_replies <= 0;
+ ring_forwards <= 0;
+ ring_read_invals <= 0;
+ end
end
- end
-
- if (snoop_left_valid && snoop_left_ready && snoop_left.ttl == `TTL_END) begin
- if (snoop_left.reply)
- ring_replies <= ring_replies + 1;
-
- if (min_ring_cycles == 0 || ring_cycles < min_ring_cycles)
- min_ring_cycles <= ring_cycles;
-
- if (ring_cycles > max_ring_cycles)
- max_ring_cycles <= ring_cycles;
- end
-
- if (snoop_right_valid && snoop_right_ready) begin
- if (snoop_right.ttl == `TTL_MAX) begin
- ring_cycles <= 1;
-
- if (snoop_right.read && !snoop_right.inval)
- ring_reads <= ring_reads + 1;
-
- if (!snoop_right.read && snoop_right.inval)
- ring_invals <= ring_invals + 1;
-
- if (snoop_right.read && snoop_right.inval)
- ring_read_invals <= ring_read_invals + 1;
- end else
- ring_forwards <= ring_forwards + 1;
- end
-
- if (clear) begin
- reads <= 0;
- writes <= 0;
- io_reads <= 0;
- io_writes <= 0;
-
- min_ring_cycles <= 0;
- max_ring_cycles <= 0;
- min_read_cycles <= 0;
- max_read_cycles <= 0;
- min_write_cycles <= 0;
- max_write_cycles <= 0;
-
- ring_reads <= 0;
- ring_invals <= 0;
- ring_replies <= 0;
- ring_forwards <= 0;
- ring_read_invals <= 0;
- end
end
+ endgenerate
endmodule
diff --git a/rtl/perf/perf_monitor.sv b/rtl/perf/perf_monitor.sv
index 2f38d94..b7bc6ba 100644
--- a/rtl/perf/perf_monitor.sv
+++ b/rtl/perf/perf_monitor.sv
@@ -1,4 +1,5 @@
`include "cache/defs.sv"
+`include "config.sv"
module perf_monitor
(
@@ -252,35 +253,39 @@ module perf_monitor
.*
);
- assign address = perf_address[3:0];
-
- always_comb begin
- clear_0 = 0;
- clear_1 = 0;
- clear_2 = 0;
- clear_3 = 0;
-
- unique case (perf_address[5:4])
- 2'b00: begin
- clear_0 = perf_write;
- perf_readdata = readdata_0;
- end
-
- 2'b01: begin
- clear_1 = perf_write;
- perf_readdata = readdata_1;
- end
-
- 2'b10: begin
- clear_2 = perf_write;
- perf_readdata = readdata_2;
- end
-
- 2'b11: begin
- clear_3 = perf_write;
- perf_readdata = readdata_3;
+ generate
+ if (`CONFIG_PERF_MONITOR) begin: enable
+ assign address = perf_address[3:0];
+
+ always_comb begin
+ clear_0 = 0;
+ clear_1 = 0;
+ clear_2 = 0;
+ clear_3 = 0;
+
+ unique case (perf_address[5:4])
+ 2'b00: begin
+ clear_0 = perf_write;
+ perf_readdata = readdata_0;
+ end
+
+ 2'b01: begin
+ clear_1 = perf_write;
+ perf_readdata = readdata_1;
+ end
+
+ 2'b10: begin
+ clear_2 = perf_write;
+ perf_readdata = readdata_2;
+ end
+
+ 2'b11: begin
+ clear_3 = perf_write;
+ perf_readdata = readdata_3;
+ end
+ endcase
end
- endcase
- end
+ end
+ endgenerate
endmodule
diff --git a/rtl/perf/perf_snoop.sv b/rtl/perf/perf_snoop.sv
index e98153e..2cc159d 100644
--- a/rtl/perf/perf_snoop.sv
+++ b/rtl/perf/perf_snoop.sv
@@ -1,4 +1,5 @@
`include "cache/defs.sv"
+`include "config.sv"
module perf_snoop
(
@@ -64,66 +65,70 @@ module perf_snoop
assign local_readdata = mem_readdata;
assign local_waitrequest = mem_waitrequest;
- always @(posedge clk or negedge rst_n)
- if (!rst_n) begin
- hold_read <= 0;
- hold_write <= 0;
- hold_waitrequest <= 0;
-
- hold_left_ready <= 0;
- hold_left_valid <= 0;
- hold_right_ready <= 0;
- hold_right_valid <= 0;
-
- snoop_read <= 0;
- snoop_write <= 0;
- snoop_waitrequest <= 0;
-
- snoop_left_ready <= 0;
- snoop_left_valid <= 0;
- snoop_right_ready <= 0;
- snoop_right_valid <= 0;
- end else begin
- /* La idea aquí es aligerar el trabajo del fitter, ya que perf_monitor
- * muestrea el anillo completo, por lo que su span de área es
- * potencialmente grande.
- */
-
- hold_read <= mem_read;
- hold_write <= mem_write;
- hold_waitrequest <= mem_waitrequest;
-
- hold_left_ready <= in_left_ready;
- hold_left_valid <= in_left_valid;
- hold_right_ready <= in_right_ready;
- hold_right_valid <= in_right_valid;
-
- snoop_read <= hold_read;
- snoop_write <= hold_write;
- snoop_waitrequest <= hold_waitrequest;
-
- snoop_left_ready <= hold_left_ready;
- snoop_left_valid <= hold_left_valid;
- snoop_right_ready <= hold_right_ready;
- snoop_right_valid <= hold_right_valid;
+ generate
+ if (`CONFIG_PERF_MONITOR) begin: enable
+ always @(posedge clk or negedge rst_n)
+ if (!rst_n) begin
+ hold_read <= 0;
+ hold_write <= 0;
+ hold_waitrequest <= 0;
+
+ hold_left_ready <= 0;
+ hold_left_valid <= 0;
+ hold_right_ready <= 0;
+ hold_right_valid <= 0;
+
+ snoop_read <= 0;
+ snoop_write <= 0;
+ snoop_waitrequest <= 0;
+
+ snoop_left_ready <= 0;
+ snoop_left_valid <= 0;
+ snoop_right_ready <= 0;
+ snoop_right_valid <= 0;
+ end else begin
+ /* La idea aquí es aligerar el trabajo del fitter, ya que perf_monitor
+ * muestrea el anillo completo, por lo que su span de área es
+ * potencialmente grande.
+ */
+
+ hold_read <= mem_read;
+ hold_write <= mem_write;
+ hold_waitrequest <= mem_waitrequest;
+
+ hold_left_ready <= in_left_ready;
+ hold_left_valid <= in_left_valid;
+ hold_right_ready <= in_right_ready;
+ hold_right_valid <= in_right_valid;
+
+ snoop_read <= hold_read;
+ snoop_write <= hold_write;
+ snoop_waitrequest <= hold_waitrequest;
+
+ snoop_left_ready <= hold_left_ready;
+ snoop_left_valid <= hold_left_valid;
+ snoop_right_ready <= hold_right_ready;
+ snoop_right_valid <= hold_right_valid;
+ end
+
+ always @(posedge clk) begin
+ hold_left.ttl <= in_left.ttl;
+ hold_left.read <= in_left.read;
+ hold_left.inval <= in_left.inval;
+ hold_left.reply <= in_left.reply;
+
+ hold_right.ttl <= in_right.ttl;
+ hold_right.read <= in_right.read;
+ hold_right.inval <= in_right.inval;
+ hold_right.reply <= in_right.reply;
+
+ snoop_left <= hold_left;
+ snoop_right <= hold_right;
+
+ hold_address <= mem_address;
+ snoop_address <= hold_address;
+ end
end
-
- always @(posedge clk) begin
- hold_left.ttl <= in_left.ttl;
- hold_left.read <= in_left.read;
- hold_left.inval <= in_left.inval;
- hold_left.reply <= in_left.reply;
-
- hold_right.ttl <= in_right.ttl;
- hold_right.read <= in_right.read;
- hold_right.inval <= in_right.inval;
- hold_right.reply <= in_right.reply;
-
- snoop_left <= hold_left;
- snoop_right <= hold_right;
-
- hold_address <= mem_address;
- snoop_address <= hold_address;
- end
+ endgenerate
endmodule