In this project, your team is going to build a pipelined implementation of AXA that, unlike your previous project, fully supports reverse execution.
Reverse execution in other reversible instruction sets is, honestly, a bit of a curiosity -- it doesn't really have a great reason for being there. In AXA, reverse execution is all about error handling. The key concept involves a 4-bit mask that is used to specify error conditions. Each bit position in the mask refers to a different type of error that can occur in forward execution. The bit definitions are:
If your team is doing project 4, you only need to worry about automatically triggering SIGILL. Of course, any combination of the above can be explicitly raised by a fail instruction. For example, fail SIGTMV+SIGCHK could raise both the transactional memory violation and checkpoint exceptions.
How does the hardware really raise an exception? Well, if you look at the AXA instruction set specification, the answer is that you don't always do anything. Only exceptions that are present in the current check mask actually get raised, and that's done by something like errors|=(mask&check);. Whenever errors isn't 0, you are in reverse execution mode.
Ok, clear enough? Well, maybe not. So let's talk about what each of the relevant instructions do:
Well, that wasn't too bad, was it?
One last note. Your previous project only needed 16 entries in the undo buffer. Here, your undo buffer should have 256 entries. That will not only allow deeper reverse execution, but will continue to have i4$ references correctly handled despite backing-up as many as 256-16=240 undo buffer entries....
As with the previous assignment, reusing knowledge and even some code can make this project easier. You are not allowed to use anything from another Assignment 4 team nor from an Assignment 3 team that none of your Assignment 4 team members were on. The wierd thing here is you are encouraged to discuss things with any/all of the Assignment 5 teams! Why? Well, the goal is to eventually integrate the best of the Assignment 4 results with the best of the Assignment 5 results... so a little coordination is a good thing.
Remember, if you find other materials, for example solutions posted from previous semesters, useful, you may borrow ideas from them, but should generally not literally copy code and you must cite the sources you borrowed ideas from in your Implementor's Notes.
Again, the test coverage plan and testbench from Assignment 3 are probably very close to what you want. However, you do need to seriously think about coverage again. Why? You are not testing the same Verilog code, so there may be some paths that didn't exist before -- and they might not be covered with a testbench that covered your old version. In particular, you will need to test reverse execution of the various constructs, and that will require a somewhat different test.
The recommended due date is Friday, December 13, 2019. By that time, you should definitely have at least submitted something that includes the assembler specification (axa.aik), and Implementor's Notes including an overview of the structure of your intended design. That overview could be in the form of a diagram, or it could be a list of top-level modules, but it is important in that it ensures you are on the right track. Final submissions will be accepted up to just before the final exam at 8AM on Thursday, December 19, 2019.
Note that you can ensure that you get at least half credit for this project by simply submitting a tar of an "implementor's notes" document explaining that your project doesn't work because you have not done it yet. Given that, perhaps you should start by immediately making and submitting your implementor's notes document? (I would!)
For each project, you will be submitting a tarball (i.e., a file with the name ending in .tar or .tgz) that contains all things relevant to your work on the project. Minimally, each project tarball includes the source code for the project and a semi-formal "implementors notes" document as a PDF named notes.pdf. It also may include test cases, sample output, a make file, etc., but should not include any files that are built by your Makefile (e.g., no binary executables). Be sure to make it obvious which files are which; for example, if the Verilog source file isn't axa.v or the AIK file isn't axa.aik, you should be saying where these things are in your implementor's notes.
Submit your tarball below. The file can be either an ordinary .tar file created using tar cvf file.tar yourprojectfiles or a compressed .tgz file file created using tar zcvf file.tgz yourprojectfiles. Be careful about using * as a shorthand in listing yourprojectfiles on the command line, because if the output tar file is listed in the expansion, the result can be an infinite file (which is not ok).