This project implements an 8-bit Multiply-Accumulate (MAC) unit with a specialized 16-bit adder called SPST (Split into lower and upper 8-bit portions) for efficient addition. The multiplier takes two 8-bit inputs and produces a 16-bit product, which is accumulated in an internal 16-bit register. The lower 8 bits of the accumulator are continuously output on dedicated pins, while the upper 8 bits are exposed via a bidirectional IO bus that can be driven by the module or externally overridden. The design supports accumulation control and external loading of the upper byte, providing flexibility for cascaded or partial updates. This architecture is optimized for Tiny Tapeout’s limited IO pin count and minimal area.
To test the project, apply clock and reset signals to the module along with valid 8-bit inputs for the multiplier inputs (in_a
and in_b
). Enable accumulation to add the product to the current accumulator value. Observe the lower 8 bits on the output pins continuously. To verify external load functionality, release control of the upper byte IO bus, drive a new value externally, and trigger the load signal. Simulation testbenches and Cocotb tests can be used to verify accumulation, reset, and external load behaviors. Waveform dumps (VCD files) help analyze timing and functional correctness at the signal level.
This project does not require any external hardware beyond a basic clock and reset source for simulation or prototype testing. It is designed as a compact IP block for ASIC tapeouts on the Tiny Tapeout platform, which provides the silicon process and packaging. For physical testing, integration with a microcontroller or FPGA development board with appropriate IO access may be needed to drive inputs and observe outputs externally.
# | Input | Output | Bidirectional |
---|---|---|---|
0 | in_a[0] | out_low[0] | io_high[0] |
1 | in_a[1] | out_low[1] | io_high[1] |
2 | in_a[2] | out_low[2] | io_high[2] |
3 | in_a[3] | out_low[3] | io_high[3] |
4 | in_a[4] | out_low[4] | io_high[4] |
5 | in_a[5] | out_low[5] | io_high[5] |
6 | in_a[6] | out_low[6] | io_high[6] |
7 | in_a[7] | out_low[7] | io_high[7] |