Migration does not need to be a rewrite. The safest path is usually gradual: choose a boundary, wrap existing HDL when needed, move one behavior at a time, and keep simulation results comparable.
Livt is most useful when it improves structure and testability without forcing a team to discard working hardware.
Read the Existing Design First
Before translating code, understand the design:
- What are the top-level ports?
- Which clocks and resets exist?
- Where is state stored?
- Which modules are protocol boundaries?
- Which modules are reusable?
- Which testbenches already describe expected behavior?
- Which vendor primitives or reusable IP blocks are required?
The first migration artifact should often be a short design map, not new code.
Choose Migration Boundaries
Good first migration targets are small and well-tested:
- byte classifiers
- packet header parsers
- register blocks
- simple FIFOs
- protocol adapters
- wrappers around existing modules
Avoid starting with the entire top level. A top-level rewrite mixes too many concerns: IO, constraints, vendor IP, reset behavior, and application logic.
Wrapping Legacy Modules
Existing VHDL or Verilog can be kept behind a Livt-facing boundary. Define the interface you want new Livt code to use, then wrap the legacy implementation.
interface IByteSource
{
fn HasData() bool
fn Read() byte
}
The wrapper can hide legacy signal naming and expose a cleaner Livt contract. This lets new code use Livt style while old code remains in place.
Replacing Boilerplate Gradually
Good migration removes repetition first:
- duplicated constants
- repeated signal bundles
- hand-written testbench setup
- protocol field extraction
- register map boilerplate
These areas are usually easy to test and provide quick value.
Preserve Behavior
Migration is successful only if behavior is preserved. For each migrated component, keep at least one of these checks:
- original HDL testbench still passes
- equivalent Livt test passes
- old and new simulations produce matching outputs
- integration artifacts are inspected for expected ports and behavior
Do not rely on visual similarity between source files. Hardware behavior is the contract.
AI-Assisted Migration
AI agents can help draft migration plans, propose component boundaries, and create initial Livt code from existing HDL, HLS/C, or prototype sources. The migration result should still be reviewed, tested, and simulated before it replaces existing behavior.
For the complete workflow with coding agents, the Livt agent context, Eccelerators Labs, package publishing, and AI-assisted migration examples, see AI-Assisted Development.
Migration Checklist
For each migrated component:
- define the boundary
- write or preserve tests
- migrate one behavior at a time
- compare old and new behavior
- inspect integration artifacts
- update integration code
- document timing or reset assumptions
Summary
Migrate gradually. Wrap legacy modules, extract stable interfaces, replace boilerplate first, and protect every step with tests. AI can help with drafts and migration planning, but hardware correctness still comes from review, simulation, and careful boundaries.