Example Design Constraints - 4.1 English

Soft Error Mitigation Controller Product Guide (PG036)

Document ID
PG036
Release Date
2023-11-01
Version
4.1 English

The example design constraints are organized by interface, rather than constraint type. The first group is for the master clock input to the entire design. It applies an I/O standard and a period constraint. The period constraint value is based on options set at generation:

create_clock -name clk -period 15.151 [get_ports clk]

set_property IOSTANDARD LVCMOS25 [get_ports clk]

The second group is for the Status Interface, applying an I/O standard and an output timing constraint to the interface. The output timing constraint is set at two times the period constraint.

set_property DRIVE 8 [get_ports status_initialization]

set_property SLEW FAST [get_ports status_initialization]

set_property IOSTANDARD LVCMOS25 [get_ports status_initialization]

set_property DRIVE 8 [get_ports status_observation]

set_property SLEW FAST [get_ports status_observation]

set_property IOSTANDARD LVCMOS25 [get_ports status_observation]

set_property DRIVE 8 [get_ports status_correction]

set_property SLEW FAST [get_ports status_correction]

set_property IOSTANDARD LVCMOS25 [get_ports status_correction]

set_property DRIVE 8 [get_ports status_classification]

set_property SLEW FAST [get_ports status_classification]

set_property IOSTANDARD LVCMOS25 [get_ports status_classification]

set_property DRIVE 8 [get_ports status_injection]

set_property SLEW FAST [get_ports status_injection]

set_property IOSTANDARD LVCMOS25 [get_ports status_injection]

set_property DRIVE 8 [get_ports status_uncorrectable]

set_property SLEW FAST [get_ports status_uncorrectable]

set_property IOSTANDARD LVCMOS25 [get_ports status_uncorrectable]

set_property DRIVE 8 [get_ports status_essential]

set_property SLEW FAST [get_ports status_essential]

set_property IOSTANDARD LVCMOS25 [get_ports status_essential]

set_property DRIVE 8 [get_ports status_heartbeat]

set_property SLEW FAST [get_ports status_heartbeat]

set_property IOSTANDARD LVCMOS25 [get_ports status_heartbeat]

set_output_delay -clock clk -15.151 [get_ports [list status_observation status_correction status_classification status_injection status_uncorrectable status_essential status_heartbeat status_initialization]] -max

set_output_delay -clock clk 0 [get_ports [list status_observation status_correction status_classification status_injection status_uncorrectable status_essential status_heartbeat status_initialization]] -min

The third group is for the MON shim, applying an I/O standard and input/output timing constraints to the interface. The input and output timing constraints are set at two times the period constraint.

set_property DRIVE 8 [get_ports monitor_tx]

set_property SLEW FAST [get_ports monitor_tx]

set_property IOSTANDARD LVCMOS25 [get_ports monitor_tx]

set_property IOSTANDARD LVCMOS25 [get_ports monitor_rx]

set_input_delay -clock clk -max -15.151 [get_ports monitor_rx]

set_input_delay -clock clk -min 30.302 [get_ports monitor_rx]

set_output_delay -clock clk -15.151 [get_ports monitor_tx] -max

set_output_delay -clock clk 0 [get_ports monitor_tx] -min

The following group is for the EXT shim, and is only present when the EXT shim is generated based on options set at generation. It applies an I/O standard and input/output timing constraints to the interface. The input and output timing is of considerable importance, as the actual timing must be used in the analysis of the SPI bus timing budget. However, there is no hard requirement for the input and output timing of the FPGA implementation. It varies based on the selected device and speed grade.

As such, the input and output timing constraints are arbitrarily set at two times the period constraint. The additional constraint to use IOB flip-flops yields substantially better input and output timing than the constraint values suggest. It is the actual timing obtained from the timing report that should be used in the analysis of the SPI bus timing budget, not the constraint value.

set_property IOB TRUE [get_cells example_ext/example_ext_byte/ext_c_ofd]

set_property IOB TRUE [get_cells example_ext/example_ext_byte/ext_d_ofd]

set_property IOB TRUE [get_cells example_ext/example_ext_byte/ext_q_ifd]

set_property IOB TRUE [get_cells example_ext/ext_s_ofd]

set_property DRIVE 8 [get_ports external_c]

set_property SLEW FAST [get_ports external_c]

set_property IOSTANDARD LVCMOS25 [get_ports external_c]

set_property DRIVE 8 [get_ports external_d]

set_property SLEW FAST [get_ports external_d]

set_property IOSTANDARD LVCMOS25 [get_ports external_d]

set_property DRIVE 8 [get_ports external_s_n]

set_property SLEW FAST [get_ports external_s_n]

set_property IOSTANDARD LVCMOS25 [get_ports external_s_n]

set_property IOSTANDARD LVCMOS25 [get_ports external_q]

set_input_delay -clock clk -max -15.151 [get_ports external_q]

set_input_delay -clock clk -min 30.302 [get_ports external_q]

set_output_delay -clock clk -15.151 [get_ports [list external_d external_s_n external_c]] -max

set_output_delay -clock clk 0 [get_ports [list external_d external_s_n external_c]] -min

The following group is for the HID shim, and is only present when the HID shim is I/O Pins. It applies an I/O standard and input timing constraint to the interface. The input timing constraint is set at two times the period constraint.

set_property IOSTANDARD LVCMOS25 [get_ports inject_strobe]

set_property IOSTANDARD LVCMOS25 [get_ports {inject_address[0]}]

set_property IOSTANDARD LVCMOS25 [get_ports {inject_address[1]}]

set_property IOSTANDARD LVCMOS25 [get_ports {inject_address[2]}]

set_property IOSTANDARD LVCMOS25 [get_ports {inject_address[3]}]

set_property IOSTANDARD LVCMOS25 [get_ports {inject_address[4]}]

set_property IOSTANDARD LVCMOS25 [get_ports {inject_address[5]}]

set_property IOSTANDARD LVCMOS25 [get_ports {inject_address[6]}]

set_property IOSTANDARD LVCMOS25 [get_ports {inject_address[7]}]

set_property IOSTANDARD LVCMOS25 [get_ports {inject_address[8]}]

set_property IOSTANDARD LVCMOS25 [get_ports {inject_address[9]}]

set_property IOSTANDARD LVCMOS25 [get_ports {inject_address[10]}]

set_property IOSTANDARD LVCMOS25 [get_ports {inject_address[11]}]

set_property IOSTANDARD LVCMOS25 [get_ports {inject_address[12]}]

set_property IOSTANDARD LVCMOS25 [get_ports {inject_address[13]}]

set_property IOSTANDARD LVCMOS25 [get_ports {inject_address[14]}]

set_property IOSTANDARD LVCMOS25 [get_ports {inject_address[15]}]

set_property IOSTANDARD LVCMOS25 [get_ports {inject_address[16]}]

set_property IOSTANDARD LVCMOS25 [get_ports {inject_address[17]}]

set_property IOSTANDARD LVCMOS25 [get_ports {inject_address[18]}]

set_property IOSTANDARD LVCMOS25 [get_ports {inject_address[19]}]

set_property IOSTANDARD LVCMOS25 [get_ports {inject_address[20]}]

set_property IOSTANDARD LVCMOS25 [get_ports {inject_address[21]}]

set_property IOSTANDARD LVCMOS25 [get_ports {inject_address[22]}]

set_property IOSTANDARD LVCMOS25 [get_ports {inject_address[23]}]

set_property IOSTANDARD LVCMOS25 [get_ports {inject_address[24]}]

set_property IOSTANDARD LVCMOS25 [get_ports {inject_address[25]}]

set_property IOSTANDARD LVCMOS25 [get_ports {inject_address[26]}]

set_property IOSTANDARD LVCMOS25 [get_ports {inject_address[27]}]

set_property IOSTANDARD LVCMOS25 [get_ports {inject_address[28]}]

set_property IOSTANDARD LVCMOS25 [get_ports {inject_address[29]}]

set_property IOSTANDARD LVCMOS25 [get_ports {inject_address[30]}]

set_property IOSTANDARD LVCMOS25 [get_ports {inject_address[31]}]

set_property IOSTANDARD LVCMOS25 [get_ports {inject_address[32]}]

set_property IOSTANDARD LVCMOS25 [get_ports {inject_address[33]}]

set_property IOSTANDARD LVCMOS25 [get_ports {inject_address[34]}]

set_property IOSTANDARD LVCMOS25 [get_ports {inject_address[35]}]

set_property IOSTANDARD LVCMOS25 [get_ports {inject_address[36]}]

set_property IOSTANDARD LVCMOS25 [get_ports {inject_address[37]}]

set_property IOSTANDARD LVCMOS25 [get_ports {inject_address[38]}]

set_property IOSTANDARD LVCMOS25 [get_ports {inject_address[39]}]

set_input_delay -clock clk -max -14.285 [get_ports [list {inject_address[0]} {inject_address[1]} {inject_address[2]} {inject_address[3]} {inject_address[4]} {inject_address[5]} {inject_address[6]} {inject_address[7]} {inject_address[8]} {inject_address[9]} {inject_address[10]} {inject_address[11]} {inject_address[12]} {inject_address[13]} {inject_address[14]} {inject_address[15]} {inject_address[16]} {inject_address[17]} {inject_address[18]} {inject_address[19]} {inject_address[20]} {inject_address[21]} {inject_address[22]} {inject_address[23]} {inject_address[24]} {inject_address[25]} {inject_address[26]} {inject_address[27]} {inject_address[28]} {inject_address[29]} {inject_address[30]} {inject_address[31]} {inject_address[32]} {inject_address[33]} {inject_address[34]} {inject_address[35]} {inject_address[36]} {inject_address[37]} {inject_address[38]} {inject_address[39]} inject_strobe]]

set_input_delay -clock clk -min 28.57 [get_ports [list {inject_address[0]} {inject_address[1]} {inject_address[2]} {inject_address[3]} {inject_address[4]} {inject_address[5]} {inject_address[6]} {inject_address[7]} {inject_address[8]} {inject_address[9]} {inject_address[10]} {inject_address[11]} {inject_address[12]} {inject_address[13]} {inject_address[14]} {inject_address[15]} {inject_address[16]} {inject_address[17]} {inject_address[18]} {inject_address[19]} {inject_address[20]} {inject_address[21]} {inject_address[22]} {inject_address[23]} {inject_address[24]} {inject_address[25]} {inject_address[26]} {inject_address[27]} {inject_address[28]} {inject_address[29]} {inject_address[30]} {inject_address[31]} {inject_address[32]} {inject_address[33]} {inject_address[34]} {inject_address[35]} {inject_address[36]} {inject_address[37]} {inject_address[38]} {inject_address[39]} inject_strobe]]

The following constraints in the XDC implement a pblock to place portions of the system-level design example into a bounded region of the selected device. The instances included in the pblock depend on the options set at generation. The range values vary depending on device selection.

The pblock forces packing of the soft error mitigation logic into an area physically adjacent to the ICAP site in the device. Most importantly, this maintains reproducibility in timing results. It also improves resource usage; the pblock forces tighter packing, minimizing configuration memory used by the design hence minimizing the FIT contribution of the system-level design example.

create_pblock SEM_CONTROLLER

resize_pblock -pblock SEM_CONTROLLER -add RAMB18_X2Y50:RAMB18_X4Y59

resize_pblock -pblock SEM_CONTROLLER -add RAMB36_X2Y25:RAMB36_X4Y29

resize_pblock -pblock SEM_CONTROLLER -add SLICE_X36Y125:SLICE_X47Y149

add_cells_to_pblock -pblock SEM_CONTROLLER -cells [get_cells example_controller/*]

add_cells_to_pblock -pblock SEM_CONTROLLER -cells [get_cells example_mon/*]

add_cells_to_pblock -pblock SEM_CONTROLLER -cells [get_cells example_ext/*]

set_property LOC FRAME_ECC_X0Y0 [get_cells example_cfg/example_frame_ecc]

set_property LOC ICAP_X0Y1 [get_cells example_cfg/example_icap]

The following constraints in the XDC are a template for assigning I/O pin locations to the top-level ports of the system-level example design. These assignments are necessarily board-specific and therefore cannot be automatically generated. To apply these constraints, uncomment them and fill in valid I/O pin locations for the target board.

## set_property LOC <pin loc> [get_ports clk]

## set_property LOC <pin loc> [get_ports status_initialization]

## set_property LOC <pin loc> [get_ports status_observation]

## set_property LOC <pin loc> [get_ports status_correction]

## set_property LOC <pin loc> [get_ports status_classification]

## set_property LOC <pin loc> [get_ports status_injection]

## set_property LOC <pin loc> [get_ports status_uncorrectable]

## set_property LOC <pin loc> [get_ports status_essential]

## set_property LOC <pin loc> [get_ports status_heartbeat]

## set_property LOC <pin loc> [get_ports monitor_tx]

## set_property LOC <pin loc> [get_ports monitor_rx]

## set_property LOC <pin loc> [get_ports external_c]

## set_property LOC <pin loc> [get_ports external_d]

## set_property LOC <pin loc> [get_ports external_q]

## set_property LOC <pin loc> [get_ports external_s_n]

## set_property LOC <pin loc> [get_ports inject_strobe]

## set_property LOC <pin loc> [get_ports {inject_address[0]}]

## set_property LOC <pin loc> [get_ports {inject_address[1]}]

## set_property LOC <pin loc> [get_ports {inject_address[2]}]

## set_property LOC <pin loc> [get_ports {inject_address[3]}]

## set_property LOC <pin loc> [get_ports {inject_address[4]}]

## set_property LOC <pin loc> [get_ports {inject_address[5]}]

## set_property LOC <pin loc> [get_ports {inject_address[6]}]

## set_property LOC <pin loc> [get_ports {inject_address[7]}]

## set_property LOC <pin loc> [get_ports {inject_address[8]}]

## set_property LOC <pin loc> [get_ports {inject_address[9]}]

## set_property LOC <pin loc> [get_ports {inject_address[10]}]

## set_property LOC <pin loc> [get_ports {inject_address[11]}]

## set_property LOC <pin loc> [get_ports {inject_address[12]}]

## set_property LOC <pin loc> [get_ports {inject_address[13]}]

## set_property LOC <pin loc> [get_ports {inject_address[14]}]

## set_property LOC <pin loc> [get_ports {inject_address[15]}]

## set_property LOC <pin loc> [get_ports {inject_address[16]}]

## set_property LOC <pin loc> [get_ports {inject_address[17]}]

## set_property LOC <pin loc> [get_ports {inject_address[18]}]

## set_property LOC <pin loc> [get_ports {inject_address[19]}]

## set_property LOC <pin loc> [get_ports {inject_address[20]}]

## set_property LOC <pin loc> [get_ports {inject_address[21]}]

## set_property LOC <pin loc> [get_ports {inject_address[22]}]

## set_property LOC <pin loc> [get_ports {inject_address[23]}]

## set_property LOC <pin loc> [get_ports {inject_address[24]}]

## set_property LOC <pin loc> [get_ports {inject_address[25]}]

## set_property LOC <pin loc> [get_ports {inject_address[26]}]

## set_property LOC <pin loc> [get_ports {inject_address[27]}]

## set_property LOC <pin loc> [get_ports {inject_address[28]}]

## set_property LOC <pin loc> [get_ports {inject_address[29]}]

## set_property LOC <pin loc> [get_ports {inject_address[30]}]

## set_property LOC <pin loc> [get_ports {inject_address[31]}]

## set_property LOC <pin loc> [get_ports {inject_address[32]}]

## set_property LOC <pin loc> [get_ports {inject_address[33]}]

## set_property LOC <pin loc> [get_ports {inject_address[34]}]

## set_property LOC <pin loc> [get_ports {inject_address[35]}]

## set_property LOC <pin loc> [get_ports {inject_address[36]}]

## set_property LOC <pin loc> [get_ports {inject_address[37]}]

## set_property LOC <pin loc> [get_ports {inject_address[38]}]

## set_property LOC <pin loc> [get_ports {inject_address[39]}]