Intel® FPGA SDK for OpenCL™: Intel® Arria® 10 GX FPGA Development Kit Reference Platform Porting Guide

ID 683267
Date 3/28/2022
Public
Document Table of Contents

1.4.5. BSP Changes from Intel® Quartus® Prime Design Suite Version 18.1 to Version 19.1

If you use or have modified an Intel® Arria® 10 GX FPGA Development Kit Reference Platform BSP provided for Intel® Quartus® Prime Design Suite Version 18.1, review the following information to learn about changes implemented in the BSP for Version 19.1.

In Intel® Quartus® Prime Design Suite Version 19.1, the multicycle constraint on kernel reset was removed. This change prevents IPs from coming out of reset on different cycles. Though generated OpenCL kernels should not have state transitions when coming out of reset, this change guarantees functionality for any IP on the kernel clock domain.

Files located in the INTELFPGAOCLSDKROOT/board/a10_ref/ directory in the BSP have the following changes from Intel® Quartus® Prime Design Suite Version 18.1 to Version 19.1:

Table 7.  Changes in a10_ref Reference Platform from 18.1 to 19.1
File Change
hardware/a10gx_hostch/* Directory renamed as a10gx_hostpipe.
hardware/a10gx_hostpipe/board_spec.xml Changed the board name to a10gx_hostpipe.
hardware/a10gx_hostpipe/base.qsf Cleaned up the floorplan to be similar to a10gx board variant.
hardware/a10gx_hostpipe/ip/host_channel/acl_hostchannel_top_hw.tcl Changed the readyLatency value from 2 to 3.
  • base.qar
  • base.qsf
  • flat.qsf
  • board.qsys
  • ip/freeze_wrapper.v
  • top.v
  • top_post.sdc
  • reset_2x.sdc
  • scripts/post_flow_pr.tcl
  • hw_iface.iipx
  • sw_iface.iipx
Removed multicycle reset constraint. For more information, refer to Removing the Multicycle Reset Constraint.
reset_2x.sdc Added this file to both board variants in a10_ref BSP.
If you are using a BSP from an earlier version, refer to the following sections to modify files in your BSP to change the reset behavior:
Tip: If you have not modified files listed in the Changes in a10_ref Reference Platform from 18.1 to 19.1 table in your BSP, you can replace the respective files with the corresponding files from the 19.1 BSP instead of modifying them.

Removing the Multicycle Reset Constraint

Follow these steps to modify the timing constraint file top_post.sdc (located in the hardware directory of your BSP) to remove the multicycle reset constraint:

  1. Remove four lines after the comment # Make the kernel reset multicycle (originally at line 91 in the top_post.sdc file).
  2. Add the lines following the comment # cut path from reset to synchronizer (now at line 90) and # over-constrain the delay from the synchronizer (at line 108) of the a10_ref/hardware/a10gx/top_post.sdc file in the 19.1 a10_ref BSP to the top_post.sdc file of your BSP.
# cut path from reset to synchronizer  
set_false_path -from {freeze_wrapper_inst|kernel_system_clock_reset_reset_reset_n} \
-to  {freeze_wrapper_inst|acl_reset_handler_inst|*} 
# overconstrain the delay from the synchronizer to the global buffer to 
# help recovery timing 
set_max_delay 1 -from  \
freeze_wrapper_inst|acl_reset_handler_inst|GEN_SYNCHRONIZER.synchronizer_body[1] \
-to freeze_wrapper_inst|acl_reset_handler_inst|GEN_SYNCHRONIZER.synchronizer_body[1] \
~CLKENA0|outclk

Creating Copies of the Kernel Clock

To improve kernel performance without the multicycle reset constraint, synchronize the reset going into the kernel by using a copy of the kernel clock distributed on a periphery clock network, which has a lower delay. Follow these steps to modify the board.qsys file located in the hardware directory of your BSP to create copies of the kernel clock on separate global and periphery networks:

  1. Replace hw_iface.iipx and sw_iface.iipx files with the ones from the 19.1 BSP folder.
  2. Open the board.qsys file in Platform Designer.
  3. For the acl_kernel_interface IP, change the Make kernel reset a global signal parameter value from 1 to 0.
  4. Instantiate an A10 Global Clock Enable component and an A10 Periph Clock Enable component (both components are in the ACL Internal Components category).
  5. Connect the 1x clock of the kernel clock generator to the input of both components.
  6. Export the output of the A10 Periph Clock Enable as reset_sync_clk.
  7. Connect all components in the board.qsys file (which are connected directly to the 1x clock of the kernel clock generator) to the clock from the output of the A10 Global Clock Enable.
  8. Regenerate the system, which updates .ip files in the ip/board/ directory.

Instantiating the Reset Synchronizer

Follow these steps to instantiate the reset synchronizer in the ip/freeze_wrapper.v file located in the hardware directory of your BSP:

  1. Add a new wire to the top.v file to connect the new output of board_inst to the new input port board_reset_sync_clk of the freeze_wrapper.v file.
  2. Add the new input port to the ip/freeze_wrapper.v file.
  3. Add a new signal for the synchronized reset.
  4. Instantiate the acl_reset_handler as indicated between lines 117 and 130 in the a10_ref/hardware/a10gx/ip/freeze_wrapper.v file in the 19.1 a10_ref BSP.
  5. Connect the new synchronized reset to the port clock_reset_reset_reset_n of pr_region_inst.

Modifying the Floorplan

You must update the floorplan in the base revision to allow the reset synchronizer to be placed as close as possible to the PLL. If the reference clock input pin is the same as in the 19.1 a10_ref BSP, the same regions and constraints can be used.

Follow these steps to modify the floorplan:

  1. Create a 1x1 region adjacent to the PLL that can be added to the static region. This can be performed by first creating a 1x1 floorplan region, and then subtracting it from the Partial Reconfiguration (PR) region.
  2. To improve timing closure of the base compile, provide a location constraint to global clock buffer, periphery clock buffer, and reset synchronizer as close as possible to the PLL, as indicated between lines 54 to 56 of the a10_ref/hardware/a10gx/ip/base.qsf file in the 19.1 a10_ref BSP:
# location constraint these global buffers and synchronization register to 
# help recovery timing. 
set_location_assignment CLKCTRL_3A_G_I21 \
-to freeze_wrapper_inst|acl_reset_handler_inst|GEN_SYNCHRONIZER.synchronizer_body[1]~CLKENA0 
set_location_assignment FF_X143_Y17_N26 \
-to freeze_wrapper_inst|acl_reset_handler_inst|GEN_SYNCHRONIZER.synchronizer_body[1] 
set_location_assignment CLKCTRL_3A_P15_I6 \
-to board_inst|kclk_periph|periph_clkena_0|clkena 

Completing the Changes

To complete the changes, perform the following steps in the hardware directory of your BSP:

  1. In the scripts/post_flow_pr.tcl file, add the following line before the line source "$sdk_root/ip/board/bsp/adjust_plls.tcl” (as in line 64 of the 19.1 a10_ref BSP):
    set recovery_multicycle 1.0 
  2. In the flat.qsf file, perform the following changes:
    1. Remove the following line that was originally at line 61:
      set_instance_assignment -name GLOBAL_SIGNAL GLOBAL_CLOCK \
      -to board_inst|kernel_clk_gen|kernel_clk_gen|kernel_pll|altera_pll_i \
      |twentynm_pll|outclk[0] 
    2. Replace two references to freeze_wrapper_inst|kernel_system_clock_reset_reset_reset_n with freeze_wrapper_inst|acl_reset_handler_inst|GEN_SYNCHRONIZER.synchronizer_body[1].
  3. Copy the reset_2x.sdc file from 19.1 a10_ref BSP to the hardware directory of your BSP and add the following assignment after the assignment that adds top_post.sdc to your project in flat.qsf.
    # SDC file needed for 2x clock reset synchronizaion 
    set_global_assignment -name SDC_FILE reset_2x.sdc 

Now, you can perform the base compile to generate a new base.qar.