This repository provides a parameterized hardware implementation of a Posit Arithmetic Unit (PAU) written in Verilog. It supports addition, subtraction, multiplication, and division over configurable posit formats, and includes a full verification framework using a C++ golden reference model.
The PAU is designed with a pipelined architecture, modular datapath components, and flexible configuration via the nbits and es parameters. All testbenches are self-checking and automatically compare results against the reference output.
- Parameterized Verilog design: Supports 
posit<nbits, es>formats - Arithmetic operations: Add, Sub, Mul, Div
 - Modular architecture: extraction, scalar control, operator, encoder
 - Pipeline support: 3-cycle latency for add/sub/mul, variable for div
 - C++ golden reference (based on libcg/bfp)
 - SystemVerilog testbenches with automatic pass/fail reporting
 - CSV-based test automation from random sample generation
 
The PAU consists of the following hardware modules:
- 
Posit Extraction
Parses the posit input into sign, regime, exponent, and fraction components. Computes initial scaling factor and sets flags for special cases (zero, NaR). - 
Scalar Processing
Computes effective scale factors based on operation type (e.g., exponent sum for multiplication, difference for division). Handles special cases and scale clamping. - 
Arithmetic Operator
Performs fraction-level arithmetic with extended precision. Includes logic for rounding (round-to-nearest-even), normalization, and sticky bit handling. - 
CLZ (Leading One Detector)
Returns the index of the most significant 1 in the post-operation result. Used to calculate normalization shift. - 
Encoder
Reconstructs the final posit value from normalized data. Handles rounding overflow and regime encoding. Outputs NaR or zero where appropriate. - 
Control Logic
Manages valid/enable/done signals to coordinate pipelined flow. Division operations are handled with handshake protocol to accommodate variable latency. 
All operations are verified against a C++ golden reference. The flow is as follows:
g++ sample_extraction.cpp -o sample_gen
./sample_gen > sample.csv- Outputs 500 randomized posit operand pairs and expected results
 - Format: 
a, b, expected_result 
# Example: addition
vsim -c -do "run -all" testbenches/posit_testbench.sv- Loads 
sample.csvand applies inputs to hardware model - Waits for done signal (especially for division)
 - Compares hardware output to golden reference
 
Pass at cycle 8: a = 11000011, b = 00001110, result = 11110011
Mismatch at cycle 177: a = 01000000, b = 11000000, expected = 01010000, got = 00000000
Self-checking logic reports pass/fail per cycle, including binary-level mismatch information.
| Operation | Status | Match Rate | 
|---|---|---|
| Addition | ✅ Verified | 100% (500/500) | 
| Subtraction | ✅ Verified | 100% (500/500) | 
| Multiplication | ✅ Verified | 100% (500/500) | 
| Division | ~70.8% | 
Tested on posit<8,1>. Other formats (e.g., posit<8,3>, posit<16,1>) have not yet been fully verified.
- Division operation is not yet fully validated under all edge cases
 - Only 
posit<8,1>configuration has been tested end-to-end - No synthesis or hardware deployment (FPGA/ASIC) has been performed
 - No resource/timing/power analysis yet
 
- Verify across more posit formats (
posit<8,3>,posit<16,1>, etc.) - Compare PAU with IEEE 754 FP in terms of area, power, and error bounds
 - Extend pipelining for higher throughput (e.g., 4 or 5 stages)
 - Integrate with system-level ML inference pipelines
 
This project is licensed under the MIT License.
Golden reference model is based on libcg/bfp.