cva6/.gitlab-ci/scripts/report_benchmark.py
Côme c784fd9047
Some checks failed
bender-up-to-date / bender-up-to-date (push) Has been cancelled
ci / build-riscv-tests (push) Has been cancelled
ci / execute-riscv64-tests (push) Has been cancelled
ci / execute-riscv32-tests (push) Has been cancelled
WAW hazards elimination (#2881)
This PR introduces a new RAW hazard detection mechanism to eliminate WAW hazards in CVA6 issue stage.

It first checks for hazards in all scoreboard entries in parallel.
Then it filters found hazards before vs after the current issue pointer.
It then finds the index of the last hazard before (resp. after) the issue pointer.
Finally, it gives precedence to a hazard before the issue pointer over the one after the issue pointer.

---------

Co-authored-by: Junheng Zheng <junheng.zheng@thalesgroup.com>
Co-authored-by: JeanRochCoulon <jean-roch.coulon@thalesgroup.com>
2025-04-23 22:26:50 +02:00

77 lines
2.1 KiB
Python

# Copyright 2022 Thales Silicon Security
#
# Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0
# You may obtain a copy of the License at https://solderpad.org/licenses/
#
# Original Author: Côme Allart
import os
import sys
import re
import report_builder as rb
path = None
mode = None
iterations = None
# Keep it up-to-date with compiler version and core performance improvements
# Will fail if the number of cycles is different from this one
valid_cycles = {
"dhrystone_dual": 17159,
"dhrystone_single": 22407,
"coremark_dual": 981777,
"coremark_single": 1294524,
"dhrystone_cv32a65x": 30056,
"dhrystone_cv32a60x": 37474,
}
for arg in sys.argv[1:]:
if "--dhrystone" in arg or "--coremark" in arg:
if "--dhrystone" in arg:
iterations = 50
else:
if "--coremark" in arg:
iterations = 4
mode = arg.replace("-", "")
else:
path = arg
# We do not want to have a report without a check
assert mode is not None
with open(path, "r") as f:
log = [l.strip() for l in f.readlines()]
stopwatch = []
for index, line in enumerate(log):
if line.split()[-1] == "mcycle" or line.split()[-2] == "mcycle,":
stopwatch.append(int(log[index + 1].split()[-1], 16))
# There might be > 2 matches, we use the two at the center
N = len(stopwatch)
assert N % 2 == 0
cycles = stopwatch[N // 2] - stopwatch[N // 2 - 1]
score_metric = rb.TableMetric("Performance results")
score_metric.add_value("cycles", cycles)
if iterations is not None:
ipmhz = iterations * 1000000 / cycles
if "dhrystone" in mode:
score_metric.add_value("Dhrystone/MHz", ipmhz)
score_metric.add_value("DMIPS/MHz", ipmhz / 1757)
if "coremark" in mode:
score_metric.add_value("CoreMark/MHz", ipmhz)
diff = cycles - valid_cycles[mode]
if diff != 0:
score_metric.fail()
score_metric.add_value("Cycles diff", diff)
report = rb.Report(f"{cycles//1000} kCycles")
report.add_metric(score_metric)
report.dump()
if report.failed:
sys.exit(1)