Streams and packed interfaces
Signer input
The production signer accepts one job through a ready/valid handshake. The payload contains a profile-specific private seed, the already-hashed message, and an opaque job identifier. An offer remains stable until accepted.
Profile selection is a build/type boundary. There is no runtime profile mux in the SHA-256 production top.
Signer output
One fused result is 2,208 bytes:
| Field | Bytes |
|---|---|
| WOTS signature | 2,144 |
| Public seed | 32 |
| Public-key endpoint hash | 32 |
| Total | 2,208 |
At 64 bytes per transfer this is 35 beats. The last beat has only the remaining bytes marked valid by its keep mask. The job and cluster identity remain fixed for the entire frame; frames never interleave.
Verifier input
One verifier frame is also 35 beats but has a different payload:
| Field | Bytes |
|---|---|
| WOTS signature | 2,144 |
| Public seed | 32 |
| Expected public-key hash | 32 |
| Message digest | 32 |
| Total | 2,240 |
Every verifier byte lane is valid. last is canonical only on beat 34.
Backpressure
Ready/valid transfer occurs only when both signals are asserted. A producer holds valid data stable while ready is low. The global signer output is a registered elastic slot, so output backpressure must not mutate data, identity, keep, or last.
Packed Verilog ports
RHDL flattens typed Rust structures into packed Verilog vectors. The RTL
generator derives bit ranges from Digital metadata and records widths in the
manifest; testbenches must not duplicate handwritten offsets. The generated
signer clock/reset is a two-bit packed port whose bit zero is clock and bit one
is active-high synchronous reset.