The code before this patch maintained a mailbox, where it would add an item for each request it saw, and then pop items off until finding the right address whenever it saw a grant. Most of the time, you might expect to see a sequence like this: request 100 grant 100 request 104 grant 104 request 108 grant 108 This scheme is also resilient when glitches (to do with the delta-cycle scheduling in the simulator) mean you actually see something like: request 999 request 100 grant 100 request 104 grant 104 ... However, there's another source of "mismatch" possible too: the cache can change the request address if the request hasn't been granted (as opposed to a ready/valid interface, where this sort of tomfoolery is not allowed!). When the cache is branching all over the place, as in the sanity sequence, this doesn't really matter. But if the branch destinations are constrained, as in the passthru sequence, you can see things like this: request 100 (1) request 120 (2) request 100 (3) grant 100 (4) request 104 grant 104 ... Note that the mailbox has two entries for address 100 when searching at point (4). This might be ok, but will cause failures if we get a new seed at (2) or (3). This patch replaces the mailbox with a queue. New requests get inserted at the end, as before, but grants search from the end, rather than the start. This means that when we get to (4) in the example above, we'll pick the latest seed (and duplicate entries disappear quickly). |
||
---|---|---|
ci | ||
doc | ||
dv | ||
examples | ||
lint | ||
rtl | ||
shared | ||
syn | ||
util | ||
vendor | ||
.clang-format | ||
.gitignore | ||
azure-pipelines.yml | ||
check_tool_requirements.core | ||
CONTRIBUTING.md | ||
CREDITS.md | ||
ibex_configs.yaml | ||
ibex_core.core | ||
ibex_core_tracing.core | ||
ibex_icache.core | ||
ibex_pkg.core | ||
ibex_tracer.core | ||
LICENSE | ||
Makefile | ||
python-requirements.txt | ||
README.md | ||
src_files.yml | ||
tool_requirements.py |
Ibex RISC-V Core
Ibex is a small and efficient, 32-bit, in-order RISC-V core with a 2-stage pipeline that implements the RV32IMC instruction set architecture.
Ibex offers several configuration parameters to meet the needs of various application scenarios. The options include two different choices for the architecture of the multiplier and divider unit, as well as the possibility to drop the support for the "M" extension completely. In addition, the "E" extension can be enabled when opting for a minimum-area configuration.
This core was initially developed as part of the PULP platform under the name "Zero-riscy" [1], and has been contributed to lowRISC who maintains it and develops it further. It is under active development, with further code cleanups, feature additions, and test and verification planned for the future.
Documentation
The Ibex user manual can be
read online at ReadTheDocs. It is also contained in
the doc
folder of this repository.
Contributing
We highly appreciate community contributions. To ease our work of reviewing your contributions, please:
- Create your own branch to commit your changes and then open a Pull Request.
- Split large contributions into smaller commits addressing individual changes or bug fixes. Do not mix unrelated changes into the same commit!
- Write meaningful commit messages. For more information, please check out the contribution guide.
- If asked to modify your changes, do fixup your commits and rebase your branch to maintain a clean history.
When contributing SystemVerilog source code, please try to be consistent and adhere to our Verilog coding style guide.
When contributing C or C++ source code, please try to adhere to the OpenTitan C++ coding style
guide.
All C and C++ code should be formatted with clang-format before committing.
Either run clang-format -i filename.cc
or git clang-format
on added files.
To get started, please check out the "Good First Issue" list.
Issues and Troubleshooting
If you find any problems or issues with Ibex or the documentation, please check out the issue tracker and create a new issue if your problem is not yet tracked.
Questions?
Do not hesitate to contact us, e.g., on our public Ibex channel on Zulip!
License
Unless otherwise noted, everything in this repository is covered by the Apache License, Version 2.0 (see LICENSE for full text).
Credits
Many people have contributed to Ibex through the years. Please have a look at the credits file and the commit history for more information.