A computer can do two things: store state and manipulate state
Boolean logic operators and gates
Applying logic operations to multi-bit state information
Exploring the difference between data and control with the XOR function
One way to translate truth tables to Boolean expressions
Unsigned binary number representations
Designing combinational logic circuits
Using hexadecimal to make it easier to read/write binary bit strings
Performing addition with fixed-width binary representations
A representation for positive and negative numbers using binary
Interpreting and using bit shift operations
Building circuits that can perform addition and substraction
We use multiplexers to choose between multiple streams of data
Creating a component that controls what arithmetic and logic operations we perform on system state
State storage devices that store one bit: latches and flip-flops
Basic concepts and notation for finite state machines
Timing considerations for finite state machines
Process and example for designing finite state machines
A description of a class of control circuits called binary decoders
Building addressable memory
How to perform multiplication in binary
A datapath for performing binary multiplication
Creating a programmable datapath
How to convert MIPS assembly instructions into machine code and machine code into control signals
Instruction Set Architecture make high-level languages (like C and Python) possible, but they are possible only because we have programmable datapaths like our arithmetic machine.
Overview of how to read the MIPS Green Sheet
Creating a programmable finite state machine
Endianness determines how we arrange words of information in byte addressable memory
Instructions that let us implement loops and conditional statements
Labels make coding with branches and jumps so much easier!!
Adding the lui instruction to the MIPS datapath
Adding the slt and slti instructions to the MIPS datapath
Instructions that move data between the register file and data memory
To manipulate state information in data memory, we need to load, manipulate, and then store the data
Register naming conventions in MIPS
MIPS provides pseudoinstructions to make your life easier
How we implement functions in MIPS assembly and manage the stack
Live coding example using callee save register conventions
Live coding example using caller save register conventions
Using the spiral rule to parse C variable declarations
Manipulating more complex data types and more complex data structures
Writing recursive functions in MIPS using callee save conventions
Live coding example: Fib recursion (Callee save)
Different methods for receiving and sending inputs and outputs
Using the status and cause registers to handle interrupts and exceptions
Exceptions are errors in our programs
Building the datapath for handling interrupts and exceptions
Introduction to SPIMbot
Defining and giving an example of latency and throughput
Estimating the time it takes for a program to run
Comparing the throughput and latency of single-cycle datapath and pipelined datapath
Example of data propagating through a pipelined datapath
Data dependencies are instructions the read values written to the register file by previous instructions
Data forwarding to fix data hazards
Stalling the Pipeline
Counting how many cycle a program takes to execute when stalls are involved
Control Hazards and Flushes
Using temporal and spatial locality in code to improve memory performance
One method for mapping a large main memory to small caches
Taking advantage of spatial locality using multi-byte cache blocks
Taking advantage of temporal locality using set associativity
How adding bytes per cache block and set associativity affect tradeoffs to support spatial and temporal locality.
Overview of why we have multi-level cache designs and how they work.
Computing performance depends on the interaction between the design of the cache, the structure of the code, and the structure of the data.
Writing to caches and back to memory
Using prefetching to minimize the effect of cache misses
Analyzing a baseline piece of code without tiling
Reanalyzing a the same code with tiling
Virtual memory provides access to increased data storage and data security
How we use the Translation Lookaside Buffer to make caches faster
Vectorization and Single Instruction Multiple Data (SIMD)
Vectorization and Dependencies