The packet-processor map is now stable enough to automate. A machine-readable source records addresses, fields, reset values, access types, descriptions, and hardware update hooks; generated outputs must preserve the semantics established in the preceding lessons.
register: STATUS
offset: 0x04
fields:
- { name: busy, bits: "0", access: ro, reset: 0 }
- { name: done, bits: "1", access: w1c, reset: 0, hw_set: done_event }
- { name: error, bits: "2", access: w1c, reset: 0, hw_set: error_event }Generated artifact | Required review |
|---|---|
Synthesizable CSR RTL | Decode, byte strobes, collision priority, reset, side effects |
C/C++ headers | Offsets, masks, shifts, volatile access helpers |
Human-readable documentation | Field meaning, sequences, reserved behavior, errors |
Verification model | Reset values, access policy, prediction and mirror behavior |
Integration package | Typed requests, field outputs, hardware update inputs |
Generated files are build products, not alternate sources of truth. Check in either the specification plus reproducible generator version or the generated outputs according to project policy, but never hand-edit generated RTL and leave the schema stale.
Read the picture from the top: the only hand-edited file is the specification. Everything below the generator is rebuilt, never edited.
Lint and schema-validate the specification.
Regenerate every artifact with a pinned generator version.
Fail CI on an uncommitted regeneration diff.
Run field-semantic tests, including hardware/software collisions.
Review software documentation and RTL together before assigning a released map version.
Regeneration or CI should overwrite or reject the change. The source specification or generator template must be updated so every derived artifact remains consistent.