Examples

Minimal Counter with Logic TMR

This example applies Logic TMR to a simple 8-bit counter with an error sink.

counter.v
module counter (
    input  wire clk_i,
    input  wire rst_ni,
    input  wire en_i,
    output reg [7:0] count_o,
    (* tmrx_error_sink *)
    output wire err_o
);

always @(posedge clk_i or negedge rst_ni) begin
    if (!rst_ni)
        count_o <= 8'd0;
    else if (en_i)
        count_o <= count_o + 1'd1;
end

endmodule
config.toml
[global]
tmr_mode = "LogicTMR"
preserve_module_ports = true
clock_port_names = ["clk_i"]
reset_port_names = ["rst_ni"]

[global.logic]
insert_voter_after_ff = true

Hierarchical Design with Mixed Strategies

This example mixes Logic TMR and Full Module TMR within the same design, with some modules excluded from TMR entirely.

config.toml
[global]
tmr_mode = "LogicTMR"
clock_port_names = ["clk_i", "clk"]
reset_port_names = ["rst_ni", "rst_n"]

# Critical control logic uses Full Module TMR
[module.control_unit]
groups = ["critical"]

[module.alu]
groups = ["critical"]

[group.critical]
tmr_mode = "FullModuleTMR"
preserve_module_ports = false

[group.critical.full_module]
insert_voter_after_modules = true

# Debug module excluded from TMR
[module.debug_controller]
tmr_mode = "None"

# Specific instance with preserved ports for compatibility
[specific_module."uart$top.u_uart"]
tmr_mode = "FullModuleTMR"
preserve_module_ports = true

Custom Flip-Flop Detection

This example shows how to configure TMRX to recognize custom FF cells from a technology library.

config.toml
[global]
tmr_mode = "LogicTMR"

[global.logic]
insert_voter_after_ff = true
ff_cells = ["sg13g2_dfrbp_1", "sg13g2_dffr_1"]

# Special module uses an additional custom FF not in the global list
[module.special_block.logic]
additional_ff_cells = ["MY_CUSTOM_LATCH"]

Using Verilog Attributes

This example uses Verilog attributes to configure TMR without a separate TOML file.

design.v
(* tmrx_tmr_mode = "FullModuleTMR" *)
(* tmrx_preserve_module_ports = "1" *)
module critical_block (
    (* tmrx_clk_port *)
    input  wire clk,
    (* tmrx_rst_port *)
    input  wire reset_n,
    input  wire [7:0] data_i,
    output wire [7:0] data_o,
    (* tmrx_error_sink *)
    output wire tmr_error
);
    // ...
endmodule

(* tmrx_tmr_mode = "None" *)
module debug_monitor (
    input  wire clk,
    input  wire [7:0] data_i
);
    // ...
endmodule