TMR Strategies
TMRX supports two complementary TMR strategies that can be mixed within the same design hierarchy.
Logic TMR
Logic TMR triplicates the internal logic of a module while optionally preserving the original interface.
What Gets Triplicated
-
All combinational logic gates
-
All wires and signals
-
All flip-flops
-
All internal connections
How It Works
-
Every wire and cell is duplicated with configurable suffixes (for example,
_a,_b,_c). -
Majority voters are inserted after flip-flop outputs (configurable).
-
If
preserve_module_ports = true, voters are inserted at outputs to maintain the original interface. -
If
preserve_module_ports = false, the module interface is expanded with triplicated ports.
Full Module TMR
Full Module TMR creates a wrapper module containing three independent instances of the original module.
Choosing a Strategy
| Consideration | Logic TMR | Full Module TMR |
|---|---|---|
Interface changes |
Optional (with |
Optional (with |
Voter placement |
After FFs, at outputs |
At module boundaries |
Area overhead |
Generally lower |
Slightly higher (wrapper overhead) |
Black-box modules |
Not applicable |
Required |
|
Black-box modules (modules with the |
Child Module Version Selection
When a design mixes TMR strategies, a parent module may instantiate a child that has been processed by TMRX.
Which version of the child a parent sees depends on the child’s preserve_module_ports setting.
Child with preserve_module_ports = false
When a child module is expanded with preserve_module_ports = false, TMRX keeps two versions of it in the design:
-
The original module with its unchanged interface.
-
A
_tmrx_implclone with triplicated ports and TMR’d internals.
Which version a parent uses depends on the parent’s TMR mode:
| Parent TMR mode | Child version used |
|---|---|
|
|
|
Original — the non-expanded module with its original interface. Each of the three worker copies instantiates the original child. |
|
Original — the non-expanded module with its original interface. The parent is not processed by TMRX, so no remapping occurs. |
This means a child module that is TMR’d with preserve_module_ports = false is not redundant inside a FullModuleTMR or None parent.
The three FullModuleTMR workers each hold one copy of the original child, and a None parent holds one copy as well.
Child with preserve_module_ports = true
When a child module is expanded with preserve_module_ports = true, there is only one version of the module.
TMRX expands it in-place: the interface is unchanged, but the internals are now triplicated.
All parent modes — LogicTMR, FullModuleTMR, and None — instantiate this single module.
Every parent therefore gets the TMR’d internals regardless of its own TMR mode.
Summary
Child preserve_module_ports |
Parent mode | Child internals TMR’d? |
|---|---|---|
|
|
Yes — |
|
|
No — original module used |
|
|
No — original module used |
|
Any |
Yes — single in-place expanded module used |
|
If you want a TMR’d child module to be redundant inside a |