- Implemented control flow instructions
- j, jal, jr
- bne, beq
- Fixed sw source bugs
- Use alu_b instead of alu_a
- Pipeline data address properly
- Use zero-extended immediate for shift instructions
- Added integration tests
- Added an actual program
- Bump ocamlformat version
- Added stalls
- We stall if there's a LW in Execute, and we need to forward Execute => Decode
- This is needed because LW data isn't available for forwarding until the Memory stage
- Also moved "next PC" logic out of "instruction fetch": this will be its own module in a coming release.
Refactor to avoid writeback => decode forwarding
- Instead, support write-before-read in the regfile
- Also, fix a wiring issue with forwarding
- Use interactive waveform viewer
- Added a forwarding unit
- Forwards values from execute, memory, and writeback
rs_val
andrt_val
renamed toalu_a
andalu_b
throughout the design.
- The register file no longer delays writes by half a cycle
- Simulating half-cycle operations is not supported in Hardcaml.
- Outputs verilog code to a separate file, "mips_datapath.v"
- Added most MIPS instructions
- Excluded mult/divide because we don't have hi/lo registers yet
- Excluded jump, branch because we don't have next_pc selector logic yet
- Excluded system calls / exception handling because we don't have an exception handling unit.
- Output
pc
in datapath - Added some regfile-initializing instructions in the sample program
- Split
imm
parsed instructions intoze_imm
(for eventual branching) andalu_imm
(for ALU ops, is zero or sign extended depending on the instruction)
- Added memory and writeback stages. This completes the basic core of our CPU.
- Added write support to regfile, made it write-before-read to reduce hazards.
- Added instruction decode stage
- Includes a 3 part control unit from v0.6.1
- Created register file
- Added instruction execute stage
- Created ALU with support for adds and subtracts
- Added tests for new components
- Added control unit.
- Split into 3 components for maintainability.
- Renamed circuit
create
functions tocircuit_impl
. - Created a
Width_check.With_interface
functor with acheck_widths
function that checks input/output width compliance for circuit implementation. - Instruction memory now returns noops when
pc
exceeds the length of the program to avoid unexpected effects. - Standardized and cleaned up naming input
- Inputs are type hinted in the circuit implementation functions, and derived functions use type inference for concision.
- Implemented feedback in datapath via register. This allows us to store and mutate the state of our system over time.
- Implemented
instruction_memory
. The program being executed is treated as an input to the entire processor.- See
instruction_fetch.ml
for an explanation of why we implemented instruction memory the way we did.
- See
- Defined
Program
module to abstract away the concept of a program.
Proof of concept for module hierarchies:
- Started instruction fetch module
- No memory or registers yet, just constant output for now
0.1.2 6/14/2021
Proof of concept:
- Created trivial circuit
- Added waveform-based expect test
- Built executable to print circuit in Verilog