This page is for a prior offering of CS 3330. It is not up-to-date.
This is a small homework to expose you to the hclrs tool we’ll use for the next several labs and homeworks.
irrr.hclTo start exploring HCL, create a simulator that handles nop, halt, irmovq, rrmovq, and unconditional jmp.
Create a file called irrr.hcl to create this simulator.
We suggest implementing the instructions in the order listed above, adding functionality as needed:
icode from each instruction.Stat. It should be STAT_HLT if the icode is halt, STAT_INS for an icode not in Y86 (e.g., > 0xb), STAT_AOK otherwise.If you run your simulator on y86/halt.yo, and it should halt after one cycle, and if you run it on y86/nophalt.yo, it should halt after 4 cycles.
rB and valC fields for IRMOVQ.IRMOVQ, send valC to the register file as the new value for register number rB. If the instruction is not an IRMOVQ or RRMOVQ, do not write to the register file (specify a destination register of REG_NONE).If you run your simulator with the -q flag on y86/irmovq.yo, you should see
+----------------------- halted in state: ------------------------------+
| RAX: 222 RCX: 2 RDX: 22 |
| RBX: 0 RSP: 0 RBP: 0 |
| RSI: 0 RDI: 0 R8: 0 |
| R9: 0 R10: 0 R11: 0 |
| R12: 0 R13: 0 R14: fedcba9876543210 |
| register pP(N) { pc=0000000000000033 } |
| used memory: _0 _1 _2 _3 _4 _5 _6 _7 _8 _9 _a _b _c _d _e _f |
| 0x0000000_: 30 f0 01 00 00 00 00 00 00 00 30 f1 02 00 00 00 |
| 0x0000001_: 00 00 00 00 30 f2 22 00 00 00 00 00 00 00 30 f0 |
| 0x0000002_: 22 02 00 00 00 00 00 00 30 fe 10 32 54 76 98 ba |
| 0x0000003_: dc fe |
+--------------------- (end of halted state) ---------------------------+
Cycles run: 6
If you see 0 in RAX instead of 222 it is likely that you’re writing to the register file for halt as well as irmovq.
rA field from the instruction for RRMOVQ.RRMOVQ, send rA to the register value so you can get the value of the register. Send this value to the register file as the new value for register number rB. You will need a MUX for the register file input signal.The test case in y86/rrmovq.yo:
irmovq $5678, %rax
irmovq $34, %rcx
rrmovq %rax, %rdx
rrmovq %rcx, %rax
should result in registers ending in the following state:
| RAX: 22 RCX: 22 RDX: 162e |
In addition, your simulator should agree with tools/yis on y86/prog8.yo
Note that the for jXX the immediate value is in bits [8, 72) not [16, 80). You’ll thus need a mux for valC.
You’ll add conditional handling to jXX as part of the next homework, but not part of this homework.
valC to extract the immediate value correctly for jmp instructions (or, alternately, use a wire with a different name for valC for jmp instructions).icode is JXX.If you run your simulator on y86/jmp.yo, which is an assembled version of
irmovq 0xbad, %rax
jmp A
irmovq 0xbad, %rbx
halt
A:
irmovq 0xace, %rax
halt
you should end up with ace, not bad, in rax and nothing in rbx.
There is a trace of the expected cycle-by-cycle output in testdata/seq-traces/jmp.txt.
In addition to testing individual files manually with ./hclrs irrr.hcl file.yo, you can run make test-irrr to test your irrr.hcl. This will compare it to outputs which are supplied with HCLRS in the testdata/seq-reference directory over the list of .yo files in testdata/irrr-tests.txt. The behavior of your processor should over these files should be identical to the final single-cycle processor you will make in a later lab and to tools/yis run on the .yo file.
(If you want to save the output from this make test-irrr to a file, you can use something like make test-irrr >test-irrr-output.txt 2>&1 (the 2>&1 says to also save error output, not just normal output).)
You can find traces of the expected cycle-by-cycle output of all tests in testdata/seq-traces, which may help in debugging test failures.
Submit a file named irrr.hcl on the submission page.