[otbn,dv] Recoverable alert support

This was a bit awkward to fit into the existing DV alert framework
because running a binary will trigger a recoverable error if the code
does something naughty (jumping to a bad address / overflowing a stack
etc.). Unfortunately, we don't know ahead of time that this is going
to happen, which makes the cip_base_scoreboard::set_exp_alert()
function rather difficult to use.

So we do things a bit differently, disabling the base class alert
tracking and handling alerts ourselves. The basic idea is that if you
want to prove

    expected alert   <->  seen alert

you can do it with two implications:

    expected alert -> seen alert
    seen alert -> expected alert

The "expected alert" event happens when OTBN stops with a status of
LOCKED (implying a fatal alert) or with a nonzero set of error
bits (implying a recoverable alert). The "seen alert" event happens
when we see an alert. In each case, we set some flags and then spawn a
checker process that will wait a short time and then check that the
other event has happened.

For recoverable alerts, we also reset the flags to make sure that we
can cope with subsequent recoverable alerts without having to see a
reset in between.

The scoreboard gets a phase_ready_to_end function that checks we don't
accidentally stop the test while we're still waiting for an expected
alert. In practice, I suspect this will never matter because of the
drain time in the base monitor class, but it probably doesn't hurt to
be careful.

The final change is to simplify the otbn_imem_err sequence: now that
the scoreboard handles alerts, there's much less of a dance required
to get the timing right.

Signed-off-by: Rupert Swarbrick <rswarbrick@lowrisc.org>
9 files changed
tree: eb0bc95de041462ad9e0c89099447fb8bebf35e6
  1. .github/
  2. ci/
  3. doc/
  4. hw/
  5. rules/
  6. site/
  7. sw/
  8. test/
  9. third_party/
  10. util/
  11. .bazelignore
  12. .bazelrc
  13. .bazelversion
  14. .clang-format
  15. .dockerignore
  16. .flake8
  17. .gitignore
  18. .style.yapf
  19. .svlint.toml
  20. .svls.toml
  21. _index.md
  22. apt-requirements.txt
  23. azure-pipelines.yml
  24. BUILD
  25. check_tool_requirements.core
  26. CLA
  27. COMMITTERS
  28. CONTRIBUTING.md
  29. LICENSE
  30. meson.build
  31. meson_init.sh
  32. meson_options.txt
  33. python-requirements.txt
  34. README.md
  35. tool_requirements.py
  36. toolchain.txt
  37. topgen-reg-only.core
  38. topgen.core
  39. WORKSPACE
  40. yum-requirements.txt
README.md

OpenTitan

OpenTitan logo

About the project

OpenTitan is an open source silicon Root of Trust (RoT) project. OpenTitan will make the silicon RoT design and implementation more transparent, trustworthy, and secure for enterprises, platform providers, and chip manufacturers. OpenTitan is administered by lowRISC CIC as a collaborative project to produce high quality, open IP for instantiation as a full-featured product. See the OpenTitan site and OpenTitan docs for more information about the project.

About this repository

This repository contains hardware, software and utilities written as part of the OpenTitan project. It is structured as monolithic repository, or “monorepo”, where all components live in one repository. It exists to enable collaboration across partners participating in the OpenTitan project.

Documentation

The project contains comprehensive documentation of all IPs and tools. You can access it online at docs.opentitan.org.

How to contribute

Have a look at CONTRIBUTING and our documentation on project organization and processes for guidelines on how to contribute code to this repository.

Licensing

Unless otherwise noted, everything in this repository is covered by the Apache License, Version 2.0 (see LICENSE for full text).