-
Notifications
You must be signed in to change notification settings - Fork 113
Generate RISC-V instruction decoder from ISA descriptor #103
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
Google's mpact-riscv offers ISA description for the RV32/RV64 architecture. See |
riscvhpp is a user-level C++17 header-only RISC-V emulator generator using riscv-opcodes. |
MPACT-Sim provides a set of tools and C++ classes that makes it easier to write instruction level simulators for a wide range of architectures. Build instructions:
|
Cavatools simulates a multi-core RISC-V machine. It provides "uspike," which is a RISC-V instruction set interpreter. Python scripts extract instruction bit encoding and execution semantics from the official GitHub repository. |
Hello, I know of a few other decoder generators that are worth evaluating. There is opcode-decoder-generator, PIE, and Edigen (as well as my own creation from a few years ago, decgen). There is also a Rust tool named disarm64_gen. Academic research has produced quite a few descriptions of interesting-sounding decoder generators, including Vienna, Isildur, and several others - however, I've found it difficult to locate source code for these programs. I think the nicest syntax is that used in PIE. It defines the ARM add instruction using the line: I've noticed that several decoder generators produce relatively inefficient code, typically producing a massive tree of if-else statements that test a bit at a time. The result is very large code (with a heavy I-cache footprint) that produces large numbers of branch prediction misses. My earlier investigations showed that shallower decode trees employing multi-way switch statements were much more efficient. This is especially true when the ISA has a contiguous group of decode bits, or when 2 or more groups can be concatenated together (I'm keen to see what can be done with newer instructions such as the x86 PEXT instruction.) To find the 'best' decoder is a challenge: the difficulty lies in creating a mathematical model of the cost of various approaches in a way that's consistent with current hardware. Jacob |
There is some relevant documentation included with the current RISC-V instructions decoding implementation. The maintenance and verification, however, are not straightforward. Instead, we may describe how RISC-V instructions are encoded in human readable form; a code generator will then convert this information into C code.
See make_decoder.py from arviss and HiSimu for reference.
Expected output:
src/instructions.in
which contains the following:scripts/gen-decoder.py
(other scripting languages are acceptable.) which can convert from the above into the corresponding C implementation.src/decode.c
to be aware of the above changes.docs
which describe the high level idea and the way to describe more extensions.The text was updated successfully, but these errors were encountered: