mirror of
https://github.com/openhwgroup/cva6.git
synced 2025-06-27 17:00:57 -04:00
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>
77 lines
2.1 KiB
Python
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)
|