diff options
| -rw-r--r-- | rtl/config.sv | 5 | ||||
| -rw-r--r-- | rtl/perf/perf_link.sv | 243 | ||||
| -rw-r--r-- | rtl/perf/perf_monitor.sv | 63 | ||||
| -rw-r--r-- | rtl/perf/perf_snoop.sv | 125 |
4 files changed, 226 insertions, 210 deletions
diff --git a/rtl/config.sv b/rtl/config.sv index 6353902..2af0d71 100644 --- a/rtl/config.sv +++ b/rtl/config.sv @@ -1,7 +1,8 @@ `ifndef CONFIG_SV `define CONFIG_SV -`define CONFIG_CPUS 4 -`define CONFIG_CACHE 1 +`define CONFIG_CPUS 4 +`define CONFIG_CACHE 1 +`define CONFIG_PERF_MONITOR 1 `endif 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 |
