From 6bb1bdac335cabfd3e3c0e01de255f0abbff8f80 Mon Sep 17 00:00:00 2001 From: Maxwell Thimmig Date: Fri, 27 Dec 2024 18:39:43 -0600 Subject: [PATCH] Release v2.0.1 (#665) --- .readthedocs.yaml | 13 + ERRATA.md | 24 +- README.md | 4 + RELEASE_NOTES.md | 5 +- docs-rtd/Makefile | 156 + docs-rtd/requirements.txt | 1 + docs-rtd/source/ERRATA.rst | 83 + docs-rtd/source/RELEASE_NOTES.rst | 19 + ...ser_Guide_AWS_EC2_FPGA_Development_Kit.rst | 317 ++ .../source/_static/F2_Shell_interface.png | Bin 0 -> 54884 bytes .../source/_static/VJTAG_images/vjtag_1.jpg | Bin 0 -> 136367 bytes .../source/_static/VJTAG_images/vjtag_2.jpg | Bin 0 -> 185390 bytes .../source/_static/VJTAG_images/vjtag_3.jpg | Bin 0 -> 218825 bytes .../source/_static/VJTAG_images/vjtag_4.jpg | Bin 0 -> 204763 bytes .../source/_static/VJTAG_images/vjtag_5.jpg | Bin 0 -> 277270 bytes .../source/_static/VJTAG_images/vjtag_6.jpg | Bin 0 -> 1045637 bytes docs-rtd/source/_static/accel_card_specs.png | Bin 0 -> 230566 bytes docs-rtd/source/_static/aws_clk_gen.png | Bin 0 -> 53044 bytes docs-rtd/source/_static/blue_bdf.png | Bin 0 -> 5286 bytes .../cl_dram_hbm_dma.png | Bin 0 -> 53814 bytes .../cl_mem_perf_images/cl_hbm_kernel.png | Bin 0 -> 48102 bytes .../cl_mem_perf_images/cl_mem_perf.png | Bin 0 -> 78608 bytes .../cl_sde_images/CL_SDE_Block_Diagram.jpg | Bin 0 -> 30386 bytes docs-rtd/source/_static/css/custom.css | 0 docs-rtd/source/_static/f2_f1_comp.png | Bin 0 -> 84634 bytes .../source/_static/f2_headline_graphic.png | Bin 0 -> 18536 bytes docs-rtd/source/_static/instance_sizes.png | Bin 0 -> 74157 bytes docs-rtd/source/_static/orange_ocl.png | Bin 0 -> 25267 bytes docs-rtd/source/_static/small_shell_fp.png | Bin 0 -> 122249 bytes docs-rtd/source/conf.py | 303 ++ docs-rtd/source/developer_resources/DCV.rst | 22 + docs-rtd/source/hdk/README.rst | 737 +++++ .../hdk/cl/CHECKLIST_BEFORE_BUILDING_CL.rst | 18 + .../hdk/cl/examples/CL_TEMPLATE/README.rst | 422 +++ .../cl/examples/cl_dram_hbm_dma/README.rst | 273 ++ .../examples/cl_dram_hbm_dma/verif/README.rst | 347 ++ .../hdk/cl/examples/cl_mem_perf/README.rst | 800 +++++ .../cl/examples/cl_mem_perf/verif/README.rst | 383 +++ .../source/hdk/cl/examples/cl_sde/README.rst | 156 + .../hdk/cl/examples/cl_sde/verif/README.rst | 52 + docs-rtd/source/hdk/docs/AWS_CLK_GEN_spec.rst | 505 +++ .../hdk/docs/AWS_Fpga_Pcie_Memory_Map.rst | 102 + docs-rtd/source/hdk/docs/AWS_Shell_ERRATA.rst | 36 + .../AWS_Shell_Interface_Specification.rst | 1009 ++++++ .../hdk/docs/Clock_Recipes_User_Guide.rst | 326 ++ ...L_Simulation_Guide_for_HDK_Design_Flow.rst | 1418 +++++++++ .../source/hdk/docs/Supported_DDR_Modes.rst | 109 + docs-rtd/source/hdk/docs/Virtual_JTAG_XVC.rst | 298 ++ .../hdk/docs/on_premise_licensing_help.rst | 41 + docs-rtd/source/hdk/docs/shell_floorplan.rst | 17 + docs-rtd/source/index.rst | 55 + docs-rtd/source/sdk/README.rst | 63 + .../sdk/apps/virtual-ethernet/README.rst | 103 + .../virtual-ethernet/doc/SDE_HW_Guide.rst | 2826 +++++++++++++++++ .../Virtual_Ethernet_Application_Guide.rst | 301 ++ .../sdk/userspace/fpga_mgmt_tools/README.rst | 438 +++ .../source/spelling_filters/hex_filter.py | 18 + .../source/spelling_filters/ordinal_filter.py | 20 + .../source/spelling_filters/rtl_hex_filter.py | 31 + docs-rtd/source/spelling_wordlist.txt | 231 ++ docs-rtd/source/vitis/README.rst | 264 ++ hdk/README.md | 56 +- hdk/cl/CHECKLIST_BEFORE_BUILDING_CL.md | 7 +- hdk/cl/examples/CL_TEMPLATE/README.md | 25 +- .../build/constraints/cl_synth_user.xdc | 18 + .../build/constraints/cl_timing_user.xdc | 17 + .../constraints/small_shell_cl_pnr_user.xdc | 18 + .../constraints/xdma_shell_cl_pnr_user.xdc | 18 + .../build/scripts/synth_CL_TEMPLATE.tcl | 6 +- .../CL_TEMPLATE/design/CL_TEMPLATE.sv | 7 +- .../CL_TEMPLATE/design/CL_TEMPLATE_defines.vh | 18 + .../CL_TEMPLATE/design/cl_id_defines.vh | 18 + .../CL_TEMPLATE/verif/scripts/Makefile | 5 +- .../CL_TEMPLATE/verif/scripts/Makefile.tests | 5 +- .../CL_TEMPLATE/verif/scripts/top.questa.f | 5 +- .../CL_TEMPLATE/verif/scripts/top.vcs.f | 5 +- .../CL_TEMPLATE/verif/scripts/top.xsim.f | 5 +- .../CL_TEMPLATE/verif/scripts/waves.tcl | 7 +- .../verif/tests/CL_TEMPLATE_base_test.sv | 5 +- hdk/cl/examples/cl_dram_hbm_dma/README.md | 32 +- .../build/constraints/cl_synth_user.xdc | 18 + .../build/constraints/cl_timing_user.xdc | 18 + .../constraints/small_shell_cl_pnr_user.xdc | 19 +- .../constraints/xdma_shell_cl_pnr_user.xdc | 19 +- .../cl_dram_hbm_dma/build/scripts/encrypt.tcl | 5 +- .../build/scripts/synth_cl_dram_hbm_dma.tcl | 4 +- .../cl_dram_hbm_dma/design/axil_slave.sv | 61 +- .../cl_dram_hbm_dma/design/cl_dma_pcis_slv.sv | 5 +- .../design/cl_dram_dma_axi_mstr.sv | 5 +- .../design/cl_dram_dma_defines.vh | 5 +- .../cl_dram_hbm_dma/design/cl_dram_dma_pkg.sv | 5 +- .../cl_dram_hbm_dma/design/cl_dram_hbm_dma.sv | 6 +- .../cl_dram_hbm_dma/design/cl_hbm_axi4.sv | 9 +- .../cl_dram_hbm_dma/design/cl_hbm_wrapper.sv | 16 +- .../cl_dram_hbm_dma/design/cl_id_defines.vh | 7 +- .../examples/cl_dram_hbm_dma/design/cl_ila.sv | 26 +- .../cl_dram_hbm_dma/design/cl_int_slv.sv | 5 +- .../cl_dram_hbm_dma/design/cl_int_tst.sv | 73 +- .../cl_dram_hbm_dma/design/cl_ocl_slv.sv | 5 +- .../cl_dram_hbm_dma/design/cl_pcim_mstr.sv | 5 +- .../cl_dram_hbm_dma/design/cl_sda_slv.sv | 46 +- .../examples/cl_dram_hbm_dma/design/cl_tst.sv | 4 +- .../cl_dram_hbm_dma/design/cl_tst_scrb.sv | 75 +- .../examples/cl_dram_hbm_dma/design/cl_vio.sv | 16 +- .../cl_dram_hbm_dma/design/mem_scrb.sv | 38 +- .../software/include/cl_dram_dma.h | 6 +- .../software/include/sh_dpi_tasks.h | 5 +- .../cl_dram_hbm_dma/software/runtime/Makefile | 5 +- .../software/runtime/test_dram_dma_common.c | 35 +- .../software/runtime/test_dram_dma_common.h | 33 +- .../runtime/test_dram_dma_hwsw_cosim.c | 7 +- .../software/runtime/test_dram_hbm_dma.c | 33 +- .../software/src/test_dram_dma.c | 5 +- .../cl_dram_hbm_dma/software/src/test_null.c | 4 +- .../examples/cl_dram_hbm_dma/verif/README.md | 105 +- .../cl_dram_hbm_dma/verif/scripts/Makefile | 5 +- .../verif/scripts/Makefile.tests | 20 +- .../verif/scripts/top.questa.f | 5 +- .../cl_dram_hbm_dma/verif/scripts/top.vcs.f | 5 +- .../verif/scripts/top.vivado.f | 5 +- .../cl_dram_hbm_dma/verif/scripts/top.xsim.f | 5 +- .../cl_dram_hbm_dma/verif/scripts/waves.tcl | 7 +- .../verif/tests/base_test_utils.svh | 9 +- .../verif/tests/cl_dram_hbm_dma_utils.svh | 4 +- .../verif/tests/test_clk_recipe.sv | 86 +- .../cl_dram_hbm_dma/verif/tests/test_ddr.sv | 5 +- .../tests/test_ddr_peek_bdr_walking_ones.sv | 26 +- .../verif/tests/test_ddr_peek_poke.sv | 21 +- .../verif/tests/test_dma_pcim_concurrent.sv | 23 +- .../verif/tests/test_dma_pcis_concurrent.sv | 21 +- .../verif/tests/test_dma_sda_concurrent.sv | 27 +- .../verif/tests/test_dram_dma.sv | 4 +- .../verif/tests/test_dram_dma_4k_crossing.sv | 5 +- .../tests/test_dram_dma_align_addr_4k.sv | 4 +- .../verif/tests/test_dram_dma_axi_mstr.sv | 18 +- .../tests/test_dram_dma_mem_model_bdr_rd.sv | 17 +- .../tests/test_dram_dma_mem_model_bdr_wr.sv | 17 +- .../verif/tests/test_dram_dma_rnd.sv | 4 +- .../tests/test_dram_dma_single_beat_4k.sv | 5 +- .../cl_dram_hbm_dma/verif/tests/test_hbm.sv | 5 +- .../cl_dram_hbm_dma/verif/tests/test_int.sv | 9 +- .../cl_dram_hbm_dma/verif/tests/test_null.sv | 11 +- .../verif/tests/test_peek_poke.sv | 9 +- .../verif/tests/test_peek_poke_len.sv | 18 +- .../verif/tests/test_peek_poke_pcis_axsize.sv | 18 +- .../verif/tests/test_peek_poke_rnd_lengths.sv | 18 +- .../verif/tests/test_peek_poke_wc.sv | 46 +- .../cl_dram_hbm_dma/verif/tests/test_sda.sv | 29 +- hdk/cl/examples/cl_mem_perf/README.md | 162 +- .../build/constraints/cl_synth_user.xdc | 18 + .../build/constraints/cl_timing_user.xdc | 18 + .../constraints/small_shell_cl_pnr_user.xdc | 18 +- .../constraints/xdma_shell_cl_pnr_user.xdc | 18 +- .../cl_mem_perf/build/scripts/encrypt.tcl | 5 +- .../build/scripts/synth_cl_mem_perf.tcl | 5 +- .../examples/cl_mem_perf/design/cl_axi_ctl.sv | 6 +- .../cl_mem_perf/design/cl_clk_freq.sv | 7 +- .../cl_mem_perf/design/cl_hbm_perf_kernel.sv | 6 +- .../cl_mem_perf/design/cl_id_defines.vh | 5 +- .../cl_mem_perf/design/cl_kernel_ctl.sv | 6 +- .../cl_mem_perf/design/cl_kernel_regs.sv | 6 +- .../cl_mem_perf/design/cl_kernel_req.sv | 6 +- .../cl_mem_perf/design/cl_mem_hbm_axi4.sv | 5 +- .../cl_mem_perf/design/cl_mem_hbm_wrapper.sv | 9 +- .../cl_mem_perf/design/cl_mem_ocl_dec.sv | 6 +- .../cl_mem_perf/design/cl_mem_pcis_dec.sv | 5 +- .../cl_mem_perf/design/cl_mem_perf.sv | 6 +- .../cl_mem_perf/design/cl_mem_perf_defines.vh | 5 +- .../software/include/cl_dram_dma.h | 6 +- .../software/include/sh_dpi_tasks.h | 5 +- .../cl_mem_perf/software/runtime/Makefile | 5 +- .../software/runtime/test_aws_clk_gen.c | 34 +- .../software/runtime/test_clk_freq.c | 34 +- .../software/runtime/test_dram_dma_common.c | 33 +- .../software/runtime/test_dram_dma_common.h | 33 +- .../runtime/test_dram_dma_hwsw_cosim.c | 7 +- .../software/runtime/test_dram_hbm_dma.c | 33 +- .../software/runtime/test_hbm_perf32.c | 34 +- .../cl_mem_perf/software/src/test_dram_dma.c | 5 +- .../cl_mem_perf/software/src/test_null.c | 4 +- hdk/cl/examples/cl_mem_perf/verif/README.md | 105 +- .../cl_mem_perf/verif/scripts/Makefile | 5 +- .../cl_mem_perf/verif/scripts/Makefile.questa | 4 +- .../cl_mem_perf/verif/scripts/Makefile.tests | 28 +- .../cl_mem_perf/verif/scripts/Makefile.vcs | 10 +- .../cl_mem_perf/verif/scripts/Makefile.vivado | 5 +- .../cl_mem_perf/verif/scripts/top.questa.f | 5 +- .../cl_mem_perf/verif/scripts/top.vcs.f | 5 +- .../cl_mem_perf/verif/scripts/top.vivado.f | 6 +- .../cl_mem_perf/verif/scripts/top.xsim.f | 5 +- .../cl_mem_perf/verif/scripts/waves.tcl | 7 +- .../verif/tests/base_test_utils.svh | 22 +- .../verif/tests/cl_mem_perf_utils.svh | 5 +- .../verif/tests/test_aws_clk_gen_recipe.sv | 4 +- .../verif/tests/test_dram_dma_axi_mstr.sv | 18 +- .../verif/tests/test_hbm_perf32.sv | 5 +- .../verif/tests/test_hbm_perf_kernel_cfg.sv | 5 +- .../verif/tests/test_hbm_perf_random.sv | 5 +- hdk/cl/examples/cl_sde/README.md | 30 +- .../build/constraints/cl_synth_user.xdc | 20 +- .../build/constraints/cl_timing_user.xdc | 18 + .../constraints/small_shell_cl_pnr_user.xdc | 18 +- .../constraints/xdma_shell_cl_pnr_user.xdc | 18 +- .../examples/cl_sde/build/scripts/encrypt.tcl | 4 +- .../cl_sde/build/scripts/synth_cl_sde.tcl | 4 +- hdk/cl/examples/cl_sde/design/axi_prot_chk.sv | 41 +- .../examples/cl_sde/design/cl_id_defines.vh | 7 +- hdk/cl/examples/cl_sde/design/cl_pkt_tst.sv | 6 +- hdk/cl/examples/cl_sde/design/cl_sde.sv | 4 +- .../examples/cl_sde/design/cl_sde_defines.vh | 5 +- hdk/cl/examples/cl_sde/design/cl_sde_srm.sv | 6 +- hdk/cl/examples/cl_sde/design/cl_tst.sv | 4 +- .../cl_sde/design/ila_axi4_wrapper.sv | 6 +- hdk/cl/examples/cl_sde/design/sde.sv | 155 +- hdk/cl/examples/cl_sde/design/sde_c2h.sv | 208 +- hdk/cl/examples/cl_sde/design/sde_c2h_axis.sv | 23 +- hdk/cl/examples/cl_sde/design/sde_c2h_buf.sv | 103 +- hdk/cl/examples/cl_sde/design/sde_c2h_cfg.sv | 123 +- hdk/cl/examples/cl_sde/design/sde_c2h_data.sv | 32 +- hdk/cl/examples/cl_sde/design/sde_desc.sv | 118 +- hdk/cl/examples/cl_sde/design/sde_h2c.sv | 189 +- hdk/cl/examples/cl_sde/design/sde_h2c_axis.sv | 20 +- hdk/cl/examples/cl_sde/design/sde_h2c_buf.sv | 107 +- hdk/cl/examples/cl_sde/design/sde_h2c_cfg.sv | 121 +- hdk/cl/examples/cl_sde/design/sde_h2c_data.sv | 239 +- hdk/cl/examples/cl_sde/design/sde_pkg.sv | 49 +- hdk/cl/examples/cl_sde/design/sde_pm.sv | 110 +- hdk/cl/examples/cl_sde/design/sde_ps.sv | 176 +- hdk/cl/examples/cl_sde/design/sde_ps_acc.sv | 5 +- hdk/cl/examples/cl_sde/design/sde_wb.sv | 273 +- .../cl_sde/software/include/sh_dpi_tasks.h | 5 +- .../examples/cl_sde/software/runtime/Makefile | 5 +- .../examples/cl_sde/software/src/test_null.c | 4 +- hdk/cl/examples/cl_sde/verif/README.md | 18 +- hdk/cl/examples/cl_sde/verif/scripts/Makefile | 5 +- .../cl_sde/verif/scripts/Makefile.tests | 18 + .../cl_sde/verif/scripts/top.questa.f | 5 +- .../examples/cl_sde/verif/scripts/top.vcs.f | 5 +- .../examples/cl_sde/verif/scripts/top.xsim.f | 5 +- .../examples/cl_sde/verif/scripts/waves.tcl | 7 +- .../examples/cl_sde/verif/tests/test_base.inc | 104 +- .../examples/cl_sde/verif/tests/test_null.sv | 13 +- .../cl_sde/verif/tests/test_simple_c2h.sv | 6 +- .../cl_sde/verif/tests/test_simple_h2c.sv | 6 +- hdk/cl/examples/create_new_cl.py | 17 + hdk/common/lib/aws_clk_gen.sv | 8 +- hdk/common/lib/aws_clk_regs.sv | 8 +- hdk/common/lib/axi_clock_conv.sv | 4 +- hdk/common/lib/axil_to_cfg_cnv.sv | 18 + hdk/common/lib/axis_flop_fifo.sv | 42 +- hdk/common/lib/bram_1w1r.sv | 10 +- hdk/common/lib/bram_2rw.sv | 40 +- hdk/common/lib/cdc_async_fifo.sv | 22 +- hdk/common/lib/cdc_sync.sv | 22 +- hdk/common/lib/design_error.inc | 33 +- hdk/common/lib/flop_fifo.sv | 54 +- hdk/common/lib/flop_fifo_in.sv | 36 +- hdk/common/lib/ft_fifo.v | 69 +- hdk/common/lib/ft_fifo_p.v | 79 +- hdk/common/lib/hbm_wrapper.sv | 12 +- hdk/common/lib/interfaces.sv | 4 +- hdk/common/lib/lib_pipe.sv | 32 +- hdk/common/lib/macros.svh | 7 +- hdk/common/lib/ram_fifo_ft.sv | 18 +- hdk/common/lib/rr_arb.sv | 36 +- hdk/common/lib/srl_fifo.sv | 8 +- hdk/common/lib/xpm_fifo.sv | 24 +- .../build/constraints/bitstream_physical.xdc | 18 +- .../build/constraints/cl_ddr_timing_aws.xdc | 18 + .../build/constraints/cl_pins.xdc | 18 +- .../build/constraints/mmcm_cascade.xdc | 19 +- .../constraints/small_shell_level_1_fp_cl.xdc | 18 +- .../constraints/xdma_shell_level_1_fp_cl.xdc | 18 +- .../build/scripts/aws_build_dcp_from_cl.py | 5 +- .../build/scripts/aws_clock_properties.tcl | 5 +- .../build/scripts/aws_gen_clk_constraints.tcl | 4 +- .../shell_stable/build/scripts/build_all.tcl | 4 +- .../build/scripts/build_level_1_cl.tcl | 4 +- .../build/scripts/check_ddr_bram.tcl | 4 +- .../build/scripts/ddr_io_train.tcl | 18 +- .../shell_stable/build/scripts/encrypt.tcl | 4 +- .../build/scripts/placement_fix_v22_1.tcl | 19 +- .../build/scripts/synth_cl_footer.tcl | 4 +- .../build/scripts/synth_cl_header.tcl | 4 +- .../design/interfaces/cl_ports.vh | 22 +- .../interfaces/unused_apppf_irq_template.inc | 5 +- .../interfaces/unused_cl_sda_template.inc | 5 +- .../design/interfaces/unused_ddr_template.inc | 5 +- .../interfaces/unused_dma_pcis_template.inc | 5 +- .../design/interfaces/unused_flr_template.inc | 6 +- .../interfaces/unused_pcim_template.inc | 6 +- .../interfaces/unused_sh_ocl_template.inc | 5 +- .../shell_stable/design/sh_ddr/sh_ddr.stub.sv | 8 +- .../design/sh_ddr/sim/axi4_slave_bfm.sv | 65 +- .../design/sh_ddr/sim/axi_bfm_defines.svh | 8 +- .../design/sh_ddr/sim/axi_mem_model.sv | 10 +- hdk/common/software/include/cl_utils.h | 4 +- hdk/common/software/include/fpga_pci_sv.h | 33 +- hdk/common/software/include/pcie_utils.h | 4 +- hdk/common/software/include/xdma_utils.h | 4 +- hdk/common/software/src/cl_utils.c | 15 +- hdk/common/software/src/fpga_pci_sv.c | 5 +- hdk/common/software/src/main.c | 5 +- hdk/common/software/src/pcie_utils.c | 13 +- hdk/common/software/src/sh_dpi_tasks.c | 49 +- hdk/common/software/src/test_null.c | 4 +- hdk/common/software/src/xdma_utils.c | 9 +- .../verif/include/aws_clk_gen_utils.svh | 17 + hdk/common/verif/include/cl_common_defines.vh | 5 +- hdk/common/verif/include/common_base_test.svh | 16 +- hdk/common/verif/include/sh_dpi_tasks.svh | 115 +- hdk/common/verif/models/base/gen_buf_t.sv | 55 +- .../ddr4_rdimm_wrapper/ddr4_rdimm_wrapper.sv | 2 +- hdk/common/verif/models/fpga/card.sv | 6 +- hdk/common/verif/models/fpga/fpga.sv | 5 +- hdk/common/verif/models/fpga/fpga_ddr.svh | 46 +- .../verif/models/sh_bfm/axi_bfm_defines.svh | 8 +- hdk/common/verif/models/sh_bfm/axil_bfm.sv | 51 +- hdk/common/verif/models/sh_bfm/axis_bfm.sv | 50 +- .../verif/models/sh_bfm/axis_bfm_pkg.sv | 22 +- .../verif/models/sh_bfm/axis_sim/clean.sh | 19 +- .../verif/models/sh_bfm/axis_sim/genstim.sh | 19 +- .../verif/models/sh_bfm/axis_sim/runme.sh | 21 +- .../verif/models/sh_bfm/axis_sim/test.sv | 25 +- .../verif/models/sh_bfm/axis_sim/testme.sh | 19 +- hdk/common/verif/models/sh_bfm/sh_bfm.sv | 5 +- .../verif/models/sh_bfm/sh_bfm_defines.svh | 5 +- .../verif/models/stream_bfm/stream_bfm.sv | 34 +- hdk/common/verif/packages/anp_base_macros.svh | 8 +- hdk/common/verif/packages/anp_base_pkg.sv | 9 +- hdk/common/verif/scripts/cl_ports_gen.pl | 8 +- hdk/common/verif/scripts/compile_cl_ips.py | 5 +- .../verif/scripts/convert_eth_stim_type0.pl | 9 +- .../verif/scripts/convert_eth_stim_type1.pl | 9 +- .../verif/scripts/generate_sim_file_list.py | 23 +- .../verif/scripts/log_regression_results.py | 6 +- .../verif/tb/filelists/cl_verif_files.vh | 8 +- hdk/common/verif/tb/filelists/tb.questa.f | 5 +- hdk/common/verif/tb/filelists/tb.vcs.f | 5 +- hdk/common/verif/tb/filelists/tb.xsim.f | 5 +- hdk/common/verif/tb/scripts/Makefile | 7 +- .../verif/tb/scripts/Makefile.common.inc | 35 +- .../verif/tb/scripts/Makefile.header.inc | 18 + hdk/common/verif/tb/scripts/Makefile.ip_gen | 7 +- .../verif/tb/scripts/Makefile.questa.inc | 4 +- hdk/common/verif/tb/scripts/Makefile.vcs.inc | 5 +- hdk/common/verif/tb/scripts/Makefile.xsim.inc | 4 +- hdk/common/verif/tb/scripts/simapi.sh | 9 +- hdk/common/verif/tb/sv/dma_classes.sv | 6 +- hdk/common/verif/tb/sv/tb.sv | 5 +- hdk/common/verif/tb/sv/tb_type_defines_pkg.sv | 34 +- hdk/docs/AWS_CLK_GEN_spec.md | 58 +- hdk/docs/AWS_Shell_ERRATA.md | 1 - hdk/docs/AWS_Shell_Interface_Specification.md | 175 +- hdk/docs/Clock_Recipes_User_Guide.md | 20 +- hdk/docs/Supported_DDR_Modes.md | 6 +- hdk/docs/Virtual_JTAG_XVC.md | 12 +- release_version.txt | 2 +- sdk/apps/virtual-ethernet/doc/SDE_HW_Guide.md | 13 +- .../doc/Virtual_Ethernet_Application_Guide.md | 4 +- sdk/userspace/fpga_mgmt_tools/README.md | 12 +- .../src/fpga_local_cmd_parse.c | 2 +- shared/bin/check_doc_links.py | 176 + vitis/README.md | 8 +- vitis/tools/create_vitis_afi.sh | 287 -- vitis_setup.sh | 114 +- 366 files changed, 16644 insertions(+), 3226 deletions(-) create mode 100644 .readthedocs.yaml create mode 100644 docs-rtd/Makefile create mode 100644 docs-rtd/requirements.txt create mode 100644 docs-rtd/source/ERRATA.rst create mode 100644 docs-rtd/source/RELEASE_NOTES.rst create mode 100644 docs-rtd/source/User_Guide_AWS_EC2_FPGA_Development_Kit.rst create mode 100644 docs-rtd/source/_static/F2_Shell_interface.png create mode 100644 docs-rtd/source/_static/VJTAG_images/vjtag_1.jpg create mode 100644 docs-rtd/source/_static/VJTAG_images/vjtag_2.jpg create mode 100644 docs-rtd/source/_static/VJTAG_images/vjtag_3.jpg create mode 100644 docs-rtd/source/_static/VJTAG_images/vjtag_4.jpg create mode 100644 docs-rtd/source/_static/VJTAG_images/vjtag_5.jpg create mode 100644 docs-rtd/source/_static/VJTAG_images/vjtag_6.jpg create mode 100644 docs-rtd/source/_static/accel_card_specs.png create mode 100644 docs-rtd/source/_static/aws_clk_gen.png create mode 100644 docs-rtd/source/_static/blue_bdf.png create mode 100644 docs-rtd/source/_static/cl_dram_hbm_dma_images/cl_dram_hbm_dma.png create mode 100644 docs-rtd/source/_static/cl_mem_perf_images/cl_hbm_kernel.png create mode 100644 docs-rtd/source/_static/cl_mem_perf_images/cl_mem_perf.png create mode 100644 docs-rtd/source/_static/cl_sde_images/CL_SDE_Block_Diagram.jpg create mode 100644 docs-rtd/source/_static/css/custom.css create mode 100644 docs-rtd/source/_static/f2_f1_comp.png create mode 100644 docs-rtd/source/_static/f2_headline_graphic.png create mode 100644 docs-rtd/source/_static/instance_sizes.png create mode 100644 docs-rtd/source/_static/orange_ocl.png create mode 100644 docs-rtd/source/_static/small_shell_fp.png create mode 100644 docs-rtd/source/conf.py create mode 100644 docs-rtd/source/developer_resources/DCV.rst create mode 100644 docs-rtd/source/hdk/README.rst create mode 100644 docs-rtd/source/hdk/cl/CHECKLIST_BEFORE_BUILDING_CL.rst create mode 100644 docs-rtd/source/hdk/cl/examples/CL_TEMPLATE/README.rst create mode 100644 docs-rtd/source/hdk/cl/examples/cl_dram_hbm_dma/README.rst create mode 100644 docs-rtd/source/hdk/cl/examples/cl_dram_hbm_dma/verif/README.rst create mode 100644 docs-rtd/source/hdk/cl/examples/cl_mem_perf/README.rst create mode 100644 docs-rtd/source/hdk/cl/examples/cl_mem_perf/verif/README.rst create mode 100644 docs-rtd/source/hdk/cl/examples/cl_sde/README.rst create mode 100644 docs-rtd/source/hdk/cl/examples/cl_sde/verif/README.rst create mode 100644 docs-rtd/source/hdk/docs/AWS_CLK_GEN_spec.rst create mode 100644 docs-rtd/source/hdk/docs/AWS_Fpga_Pcie_Memory_Map.rst create mode 100644 docs-rtd/source/hdk/docs/AWS_Shell_ERRATA.rst create mode 100644 docs-rtd/source/hdk/docs/AWS_Shell_Interface_Specification.rst create mode 100644 docs-rtd/source/hdk/docs/Clock_Recipes_User_Guide.rst create mode 100644 docs-rtd/source/hdk/docs/RTL_Simulation_Guide_for_HDK_Design_Flow.rst create mode 100644 docs-rtd/source/hdk/docs/Supported_DDR_Modes.rst create mode 100644 docs-rtd/source/hdk/docs/Virtual_JTAG_XVC.rst create mode 100644 docs-rtd/source/hdk/docs/on_premise_licensing_help.rst create mode 100644 docs-rtd/source/hdk/docs/shell_floorplan.rst create mode 100644 docs-rtd/source/index.rst create mode 100644 docs-rtd/source/sdk/README.rst create mode 100644 docs-rtd/source/sdk/apps/virtual-ethernet/README.rst create mode 100644 docs-rtd/source/sdk/apps/virtual-ethernet/doc/SDE_HW_Guide.rst create mode 100644 docs-rtd/source/sdk/apps/virtual-ethernet/doc/Virtual_Ethernet_Application_Guide.rst create mode 100644 docs-rtd/source/sdk/userspace/fpga_mgmt_tools/README.rst create mode 100644 docs-rtd/source/spelling_filters/hex_filter.py create mode 100644 docs-rtd/source/spelling_filters/ordinal_filter.py create mode 100644 docs-rtd/source/spelling_filters/rtl_hex_filter.py create mode 100644 docs-rtd/source/spelling_wordlist.txt create mode 100644 docs-rtd/source/vitis/README.rst create mode 100644 shared/bin/check_doc_links.py delete mode 100755 vitis/tools/create_vitis_afi.sh diff --git a/.readthedocs.yaml b/.readthedocs.yaml new file mode 100644 index 000000000..e88e65ea8 --- /dev/null +++ b/.readthedocs.yaml @@ -0,0 +1,13 @@ +version: 2 + +build: + os: ubuntu-20.04 + tools: + python: "3.10" + +python: + install: + - requirements: docs-rtd/requirements.txt + +sphinx: + configuration: docs-rtd/source/conf.py diff --git a/ERRATA.md b/ERRATA.md index a5e42ae2c..ed9bb726f 100644 --- a/ERRATA.md +++ b/ERRATA.md @@ -7,13 +7,15 @@ Shell errata is [documented here](./hdk/docs/AWS_Shell_ERRATA.md) ## HDK -1. CL simulation might show the following "error" message if the [CL clock generator](./hdk/docs/AWS_CLK_GEN_spec.md) is contained in the design. By default, the generator blocks all output clocks (except for `o_clk_main_a0`) and asserts all output resets. This behavior violates the built-in reset check in the [AXI SmartConnect IP](https://www.xilinx.com/products/intellectual-property/smartconnect.html#overview). This message can be safely ignored. A Fix for this issue is in progress. +1. Support for the XDMA Shell in the HDK design flow is not available at this time. CL builds using the XDMA Shell will result in a build failure. + +2. CL simulation might show the following "error" message if the [CL clock generator](./hdk/docs/AWS_CLK_GEN_spec.md) is contained in the design. By default, the generator blocks all output clocks (except for `o_clk_main_a0`) and asserts all output resets. This behavior violates the built-in reset check in the [AXI SmartConnect IP](https://www.xilinx.com/products/intellectual-property/smartconnect.html#overview). This message can be safely ignored. A Fix for this issue is in progress. ```bash # ** Error: [SmartConnect 500-33] s_sc_aresetn should be asserted for at least 16 cycles of m_sc_aclk. tb.card.fpga.CL.CL_HBM.HBM_PRESENT_EQ_1.AXI_CONVERTER_AXI4_AXI3.cl_axi_sc_1x1_i.smartconnect_0.inst.s00_nodes.s00_aw_node.inst.. ``` -2. CL simulation might show the following "error" message. This message can be safely ignored. A Fix for this issue is in progress. +3. CL simulation might show the following "error" message. This message can be safely ignored. A Fix for this issue is in progress. ```bash # Initializing memory from data in 'ddr4_ddr_10.mem'. @@ -22,11 +24,9 @@ Shell errata is [documented here](./hdk/docs/AWS_Shell_ERRATA.md) # ERROR: Failed to write data burst length to 16. Only <4,8> are valid. ``` -3. XSIM simulator does not support a cycle-accurate simulation model for the HBM IP. We’re observing significantly longer simulation times compared to VCS and Questa simulators. This is caused by the HBM BFM used in XSIM. Therefore, running HBM simulation using VCS or Questa is strongly recommended. - -4. XDMA driver interrupt mode doesn't work currently on instances. Runtime examples have temporarily switched to use the polling mode and the interrupt mode test has been temporarily removed. Refer to the [XDMA driver installation guide](./hdk/docs/XDMA_Install.md) for instructions on how to load XDMA driver using the polling mode. +4. XSIM simulator does not support a cycle-accurate simulation model for the HBM IP. We’re observing significantly longer simulation times compared to VCS and Questa simulators. This is caused by the HBM BFM used in XSIM. Therefore, running HBM simulation using VCS or Questa is strongly recommended. -5. The following hdk tests are not supported in XSIM currently and will report not supported warning if ran: +5. The following HDK tests are currently not supported in XSIM and will report not supported warning if ran: - cl_mem_perf: - test_dram_dma_4k_crossing @@ -40,10 +40,18 @@ Shell errata is [documented here](./hdk/docs/AWS_Shell_ERRATA.md) 6. Simulation of the [HBM monitor interface](./hdk/docs/AWS_Shell_Interface_Specification.md/#hbm-monitor-interface) is not supported in this release. The HBM IP always passes initialization and remains in an operating state for all tests. Simulation support for the HBM monitor will be added in a future release. -7. AFIs created based on HDK XDMA shell or Vitis are not supported on F2 instances at this time. +7. AFIs created based on HDK XDMA shell or Vitis are not supported on F2 + instances at this time. + +8. The following ddr simulation backdoor test is not working with 64GB memory: + - test_ddr_peek_bdr_walking_ones ## SDK ## Software defined Accelerator Development (Vitis) -- Support for 2024.1 and hardware emulation only. Software emulation and F2 instance support is not supported at this time. +1. Only hardware emulation via Vitis 2024.1 is currently supported. + +2. Support for Vitis 2024.1 accelerator binary creation and AFI creation is not supported, but will be released at a later time. + +3. Support for Vitis software emulation has been deprecated by AMD, therefore, no longer supported. diff --git a/README.md b/README.md index ae5df7364..9348c7a7f 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,10 @@ The F2 FPGA Development Kit is a hardware-software development kit that enables For full documentation, including a user guide, code snippets, and tutorials, see the [AWS EC2 FPGA Development Kit User Guide](./User_Guide_AWS_EC2_FPGA_Development_Kit.md) +## F2 FPGA ReadTheDocs (Beta) + +We are currently migrating our F2 documentation to comply with the ReadTheDocs standard. To familiarize yourself with the new layout, please [click here](https://awsdocs-fpga-f2.readthedocs-hosted.com). + ## Support To raise an issue or receive support, please [open an issue on the official GitHub page](https://github.com/aws/aws-fpga/issues). diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index 67e5f991a..8e92820c9 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -1,4 +1,7 @@ # F2 Developer Kit Release Notes +## v2.0.1 +Updates to HDK, SDK, and Vitis documentation. Added check for XRT install to enable Vitis hardware emulation. XRT install can now be performed automatically by running a command presented during `vitis_setup.sh`. + ## v2.0.0 -Initial release. F2 general-availability companion. \ No newline at end of file +Initial release. F2 general-availability companion. diff --git a/docs-rtd/Makefile b/docs-rtd/Makefile new file mode 100644 index 000000000..c7bdfa521 --- /dev/null +++ b/docs-rtd/Makefile @@ -0,0 +1,156 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +PAPER = +BUILDDIR = build + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source +# the i18n builder cannot share the environment and doctrees with the others +I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source + +.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext + +help: + @echo "Please use \`make ' where is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " singlehtml to make a single large HTML file" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " devhelp to make HTML files and a Devhelp project" + @echo " epub to make an epub" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " latexpdf to make LaTeX files and run them through pdflatex" + @echo " text to make text files" + @echo " man to make manual pages" + @echo " texinfo to make Texinfo files" + @echo " info to make Texinfo files and run them through makeinfo" + @echo " gettext to make PO message catalogs" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" + +clean: + -rm -rf $(BUILDDIR)/* + +html: + $(SPHINXBUILD) -a -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + +dirhtml: + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." + +singlehtml: + $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml + @echo + @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." + +pickle: + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle + @echo + @echo "Build finished; now you can process the pickle files." + +json: + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json + @echo + @echo "Build finished; now you can process the JSON files." + +htmlhelp: + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in $(BUILDDIR)/htmlhelp." + +qthelp: + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/F2.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/F2.qhc" + +devhelp: + $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp + @echo + @echo "Build finished." + @echo "To view the help file:" + @echo "# mkdir -p $$HOME/.local/share/devhelp/F2" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/F2" + @echo "# devhelp" + +epub: + $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub + @echo + @echo "Build finished. The epub file is in $(BUILDDIR)/epub." + +latex: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." + @echo "Run \`make' in that directory to run these through (pdf)latex" \ + "(use \`make latexpdf' here to do that automatically)." + +latexpdf: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through pdflatex..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +text: + $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text + @echo + @echo "Build finished. The text files are in $(BUILDDIR)/text." + +man: + $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man + @echo + @echo "Build finished. The manual pages are in $(BUILDDIR)/man." + +texinfo: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo + @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." + @echo "Run \`make' in that directory to run these through makeinfo" \ + "(use \`make info' here to do that automatically)." + +info: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo "Running Texinfo files through makeinfo..." + make -C $(BUILDDIR)/texinfo info + @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." + +gettext: + $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale + @echo + @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." + +changes: + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes + @echo + @echo "The overview file is in $(BUILDDIR)/changes." + +linkcheck: + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/output.txt." + +doctest: + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." + +spelling: + $(SPHINXBUILD) -b spelling source/ build/ \ No newline at end of file diff --git a/docs-rtd/requirements.txt b/docs-rtd/requirements.txt new file mode 100644 index 000000000..5388c8836 --- /dev/null +++ b/docs-rtd/requirements.txt @@ -0,0 +1 @@ +sphinx==5.3.0 diff --git a/docs-rtd/source/ERRATA.rst b/docs-rtd/source/ERRATA.rst new file mode 100644 index 000000000..092b164c5 --- /dev/null +++ b/docs-rtd/source/ERRATA.rst @@ -0,0 +1,83 @@ +F2 Developer Kit Errata +======================= + +Shell Errata +------------ + +Shell errata is `documented here <./hdk/docs/AWS_Shell_ERRATA.md>`__ + +HDK +--- + +1. Support for the XDMA Shell in the HDK design flow is not available at this time. + CL builds using the XDMA Shell will result in a build failure. + +2. CL simulation might show the following "error" message if the `CL + clock generator <./hdk/docs/AWS_CLK_GEN_spec.md>`__ is contained in + the design. By default, the generator blocks all output clocks + (except for ``o_clk_main_a0``) and asserts all output resets. This + behavior violates the built-in reset check in the `AXI SmartConnect + IP `__. + This message can be safely ignored. A Fix for this issue is in + progress. + + .. code:: bash + + # ** Error: [SmartConnect 500-33] s_sc_aresetn should be asserted for at least 16 cycles of m_sc_aclk. tb.card.fpga.CL.CL_HBM.HBM_PRESENT_EQ_1.AXI_CONVERTER_AXI4_AXI3.cl_axi_sc_1x1_i.smartconnect_0.inst.s00_nodes.s00_aw_node.inst.. + +3. CL simulation might show the following "error" message. This message + can be safely ignored. A Fix for this issue is in progress. + + .. code:: bash + + # Initializing memory from data in 'ddr4_ddr_10.mem'. + # Reading data in x8 and bl:8 mode (Change with 'config <4,8,16> <4,8>' in this file). + # 'ddr4_ddr_10.mem' set write data width to x4. + # ERROR: Failed to write data burst length to 16. Only <4,8> are valid. + +4. XSIM simulator does not support a cycle-accurate simulation model for + the HBM IP. We’re observing significantly longer simulation times + compared to VCS and Questa simulators. This is caused by the HBM BFM + used in XSIM. Therefore, running HBM simulation using VCS or Questa + is strongly recommended. + +5. The following hdk tests are not supported in XSIM currently and will + report not supported warning if ran: + + - cl_mem_perf: + + - test_dram_dma_4k_crossing + - test_dram_dma + - test_dram_dma_align_addr_4k + - test_dram_dma_single_beat_4k + - test_dram_dma_rnd + + - cl_dram_hbm_dma: + + - test_dram_dma_4k_crossing + +6. Simulation of the `HBM monitor + interface <./hdk/docs/AWS_Shell_Interface_Specification.md/#hbm-monitor-interface>`__ + is not supported in this release. The HBM IP always passes + initialization and remains in an operating state for all tests. + Simulation support for the HBM monitor will be added in a future + release. + +7. AFIs created based on HDK XDMA shell or Vitis are not supported on F2 + instances at this time. + +8. The following ddr simulation backdoor test is not working with 64GB memory: + + - test_ddr_peek_bdr_walking_ones + +SDK +--- + +Software defined Accelerator Development (Vitis) +------------------------------------------------ + +1. Only hardware emulation via Vitis 2024.1 is currently supported. + +2. Support for Vitis 2024.1 accelerator binary creation and AFI creation is not supported, but will be released at a later time. + +3. Support for Vitis software emulation has been deprecated by AMD, therefore, no longer supported. diff --git a/docs-rtd/source/RELEASE_NOTES.rst b/docs-rtd/source/RELEASE_NOTES.rst new file mode 100644 index 000000000..69577a958 --- /dev/null +++ b/docs-rtd/source/RELEASE_NOTES.rst @@ -0,0 +1,19 @@ +F2 Developer Kit Release Notes +============================== + +.. _v201: + +v2.0.1 +------ + +Updates to HDK, SDK, and Vitis documentation. +Added check for XRT install to enable Vitis hardware emulation. +XRT install can now be performed automatically by running a +command presented during `vitis_setup.sh`. + +.. _v200: + +v2.0.0 +------ + +Initial release. F2 general-availability companion. diff --git a/docs-rtd/source/User_Guide_AWS_EC2_FPGA_Development_Kit.rst b/docs-rtd/source/User_Guide_AWS_EC2_FPGA_Development_Kit.rst new file mode 100644 index 000000000..36b148341 --- /dev/null +++ b/docs-rtd/source/User_Guide_AWS_EC2_FPGA_Development_Kit.rst @@ -0,0 +1,317 @@ +`AWS EC2 FPGA Development Kit `__ +================================================================== + +The development kit includes example designs to get you familiar with +developing for AWS EC2 FPGA Instances. + +- `AWS EC2 FPGA Development Kit <#aws-ec2-fpga-development-kit>`__ + + - `AWS EC2 F2 Instance Overview <#aws-ec2-f2-instance-overview>`__ + + - `Instance Types <#instance-types>`__ + - `2nd Generation On-Cloud FPGA Accelerator + Card <#2nd-generation-on-cloud-fpga-accelerator-card>`__ + - `Comparison to F1 <#comparison-to-f1>`__ + + - `AWS EC2 F2 FPGA Development + Kit <#aws-ec2-f2-fpga-development-kit>`__ + + - `Development Environments <#development-environments>`__ + - `AWS Shells <#aws-shells>`__ + - `Hardware Development Kit (HDK) <#hardware-development-kit-hdk>`__ + - `Software-Defined Development + Environment <#software-defined-development-environment>`__ + + - `Hardware Emulation <#hardware-emulation>`__ + - `Host Application and FPGA Binary + Builds <#host-application-and-fpga-binary-builds>`__ + - `AFI Generation <#afi-generation>`__ + + - `Additional Vitis + Documentation <#additional-vitis-documentation>`__ + - `FPGA Developer AMI <#fpga-developer-ami>`__ + + - `Getting Started <#getting-started>`__ + + - `Getting Familiar with AWS <#getting-familiar-with-aws>`__ + - `Customer Hardware Development <#customer-hardware-development>`__ + + - `Next Steps <#next-steps>`__ + +AWS EC2 F2 Instance Overview +---------------------------- + +Amazon EC2 F2 instances are Amazon’s second-generation FPGA-powered +instances, purpose-built for customers to develop and deploy +reconfigurable hardware in the cloud. With AMD UltraScale+ VU47P FPGAs +and High Bandwidth Memory (HBM), customers can achieve +orders-of-magnitude application acceleration such as 95x faster graph +database analysis and 10x faster genomics secondary analysis when +compared to CPU-only analysis. F2 instances provide up to 8 FPGAs paired +with a 3rd-generation AMD EPYC (Milan) processor. F2 instances provide +3x more processor cores (192 vCPU), 2x more system memory (2 TiB), 2x +NVMe SSDs (7.6 TiB), and 4x more networking bandwidth (100 Gbps), +compared to the previous generation FPGA-based instances. The +accompanying AWS FPGA Developer kit empowers developers to quickly start +building with their hardware accelerations and adopting advanced +technology, such as HBM, to process data at up to 460 GiB/s. + +This documentation is relevant to F2 only. Therefore, it applies to all +branches on the `GitHub repo `__ +prefixed with ``f2``. Any branches not prefixed f2 in their name are not +referred to in this documentation. + +Instance Types +~~~~~~~~~~~~~~ + +|f2_instances| + +.. _2nd-generation-on-cloud-fpga-accelerator-card: + +2nd Generation On-Cloud FPGA Accelerator Card +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +|image1| + +Comparison to F1 +~~~~~~~~~~~~~~~~ + +|f2_f1_comp| + +AWS EC2 F2 FPGA Development Kit +------------------------------- + +Development Environments +~~~~~~~~~~~~~~~~~~~~~~~~ + +This table lists the F2 development flows currently enabled and +supported in the development kit. + +.. list-table:: + :header-rows: 1 + :class: user-guide-dev-envs-table + :widths: 10 50 20 20 10 15 + + * - Development Environment + - Description + - Accelerator Language + - Hardware interface + - Debug Options + - Typical Developer + * - `Hardware accelerator development using Vivado <./hdk/README.html>`__ + - This environment supports the Hardware Development Kit (HDK) design flow, + which empowers FPGA developers to create accelerator designs from scratch, + using HDL source code and IPs. The AMD Vivado tool synthesizes, implements, + and generates the Design Check Point (DCP) file used in F2 AFI creation. + AWS FPGA developers benefit from the suite of scripts supplied in the HDK + that help to automate different design steps. This allows for flexibility + in architecting, implementing, and optimizing accelerator designs while + using the HDK. + - Verilog/System Verilog/VHDL + - User-implemented DMA engine or Streaming Data Engine (SDE) + - Simulation + - Hardware developers with advanced FPGA experience + * - `Hardware accelerator development using Vitis <./vitis/README.html>`__ + - This environment supports the Vitis design flow, + which enables software developers to write C++ code, + which may then be compiled into RTL and used in + cycle-accurate hardware simulation. After it may + then be built into an accelerator design. This step + is not necessary, but is encouraged. Vitis may also + be used to implement accelerator designs from scratch, + using HDL and IPs directly, similar to Vivado. Vitis + offers additional analysis tools to aid in the + refinement of designs. + - C/C++/Verilog/System Verilog/VHDL + - XDMA Engine (coming soon) + - Hardware Emulation + - Advanced software developers or hardware developers + with intermediate to advanced FPGA experiences + +On-premise environment: Customers can set up a on-premise development +environment using 2024.1 AMD tools with their own licenses. Refer to +this guide `here <./hdk/docs/on_premise_licensing_help.html>`__ for +licensing requirements. + +AWS Shells +~~~~~~~~~~ + +For AWS EC2 F2 FPGA instances, each FPGA is divided into two partitions: + +- Shell (SH) – AWS platform logic implementing system management and + external peripherals like PCIe and interrupts to the host. +- Custom Logic (CL) – Custom acceleration logic created by the FPGA + developer and equipped with direct memory access (DMA) to DDR and HBM. + +At the end of the development process, combining the Shell and CL +creates an Amazon FPGA Image (AFI) that is then available to load onto +all F2 FPGA cards on instances owned by the developer. + +The HDK design flow currently supports the Small Shell. The Small Shell +offers 88% usable FPGA resources. The `common +interface <./hdk/docs/AWS_Shell_Interface_Specification.html>`__ (is +defined in +`cl_ports.vh `__) +along with the `floorplans <./hdk/docs/shell_floorplan.html>`__ and +built-in functions. CL designs must integrate with the small shell. The +table below details the released shell version and its main features. + +.. list-table:: + :header-rows: 1 + :class: user-guide-shells-table + :widths: 20 20 60 + + * - Shell Name + - Shell Version + - Description + * - F2 Small Shell + - 0x10212415 + - Shell with no built-in DMA engine (40% smaller shell footprint). + +Hardware Development Kit (HDK) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The Hardware Development Kit (HDK) comes with an ``hdk_setup.sh`` script +to set up environment variables required for customer design development +using HDL source code. + +The `HDK directory structure <./hdk/README.html>`__ contains: + +- `common/shell_stable `__: All build + scripts, constraints, and other directory structures required to + support design builds using the supported shells. +- `common/lib `__: All common IPs used in various + examples and Tcl scripts to build IPs are available here. +- `cl/examples `__: Multiple CL examples to + demonstrate connectivity between CL logic, the F2 Shell, and + accelerator resources like DDR and HBM. +- Support for 3rd party simulators + +The HDK currently supports the following tool versions: + +.. list-table:: + :header-rows: 1 + :class: user-guide-simulators-table + :widths: 50 30 + + * - Tool + - Version + * - AMD Vivado Design Suite + - 2024.1 + * - Synopsys VCS (Bring your own license) + - U-2023.03-SP2 + * - Siemens Questa (Bring your own license) + - 2023.3 + +Our scripts require a minimum Python version of 3.10, under +``/usr/bin/env python3``: + +.. list-table:: + :header-rows: 1 + :class: user-guide-python-table + :widths: 10 15 + + * - Tool + - Minimum Version + * - Python + - 3.10+ + +Software-Defined Development Environment +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The software-defined development environment allows customers to compile +their C/C++/OpenCL code into AFIs and use C/C++/OpenCL APIs to interface +with the accelerator, running on the FPGA. Software developers with +little or no FPGA experience will be able to quickly familiarize +themselves with the development experience that accelerates cloud +applications. The optimized compiler, Vitis, allows easy F2 accelerator +development using C/C++/OpenCL and/or Verilog/VHDL. + +The F2 developer kit provides development tools for Vitis hardware +emulation, example host applications, and FPGA Binary builds, followed +by AFI generation. + +To get started, please see the `README for a hello world accelerator +example <./vitis/README.html>`__ + +FPGA Developer AMI +~~~~~~~~~~~~~~~~~~ + +A free-to-use FPGA developer AMI is available for on-cloud F2 +development with AMD tools pre-installed on a variety of AWS EC2 +instance types. Customers can use this AMI to design, simulate, and +build their designs. The table below lists the FPGA Developer AMI(s) +currently released to customers: + +.. list-table:: + :header-rows: 1 + :class: user-guide-dev-ami-table + :widths: 20 25 20 30 + + * - FPGA Developer AMI Version + - FPGA Developer AMI ID + - Vivado/Vitis Version Supported + - Operating System Version + * - 1.16.0 + - `ami-0e6383ac30e23cf97 `__ + - 2024.1 + - Ubuntu 20.04.6 (kernel 5.15) + +Given the large size of the FPGA used for F2, AMD tools work best with +at least 4 vCPU’s and 32GiB Memory. We recommend `Compute Optimized and +Memory Optimized instance +types `__ to successfully +run the synthesis of acceleration code. Developers may start coding and +run simulations on low-cost `General Purpose instances +types `__. + +Note that the tools used by the HDK are only supported on x86-based EC2 +instances (Graviton-based instances are not compatible with the tools). + +Getting Started +--------------- + +Getting Familiar with AWS +~~~~~~~~~~~~~~~~~~~~~~~~~ + +If you have never used AWS before, we recommend you start with `AWS +getting started training `__, +focusing on the basics of the `AWS EC2 `__ +and `AWS S3 `__ services. Understanding the +fundamentals of these services will further enhance the developer +experience with AWS F2 instances and the FPGA Developer Kit. + +Next Steps +---------- + +Before you create your own AWS FPGA design, we recommend that you go +through the `step-by-step quickstart guide for customer hardware +development <./hdk/README.html>`__. + +Once developers are familiar with the F2 development kit and the HDK +development environment, we recommend exploring the following contents +to master all the design features and examples offered in the AWS EC2 +FPGA Development Kit: + +- `Run RTL + simulations <./hdk/docs/RTL_Simulation_Guide_for_HDK_Design_Flow.html>`__ + provided in CL examples to learn the design verification setup in the + HDK development environment. +- Familiarize yourself with the `AWS F2 Shell-CL + interfaces <./hdk/docs/AWS_Shell_Interface_Specification.html>`__, e.g. `the HBM monitor + interface <./hdk/docs/AWS_Shell_Interface_Specification.html#hbm-monitor-interface>`__ +- Examine the `shell + floorplan <./hdk/docs/shell_floorplan.html>`__ and locations of major + shell interfaces. +- Deep dive into `CL examples <./hdk/README.html#cl-examples>`__ to + explore shell-to-CL connectivity, CL resources e.g. DDR and HBM, and + features e.g. `CL clock generation + block <./hdk/docs/AWS_CLK_GEN_spec.html>`__. +- Create a custom CL design using the + `CL_TEMPLATE <./hdk/cl/examples/CL_TEMPLATE/README.html>`__ example. +- Connect to a custom CL design in FPGA through `Virtual + JTAG <./hdk/docs/Virtual_JTAG_XVC.html>`__ to run hardware debug. + +.. |f2_instances| image:: ./_static/instance_sizes.png +.. |image1| image:: ./_static/accel_card_specs.png +.. |f2_f1_comp| image:: ./_static/f2_f1_comp.png diff --git a/docs-rtd/source/_static/F2_Shell_interface.png b/docs-rtd/source/_static/F2_Shell_interface.png new file mode 100644 index 0000000000000000000000000000000000000000..8e676165832b4678ee3af31f8f70fb6bb024b4ac GIT binary patch literal 54884 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 E1EEGlp8x;= literal 0 HcmV?d00001 diff --git a/docs-rtd/source/_static/VJTAG_images/vjtag_1.jpg b/docs-rtd/source/_static/VJTAG_images/vjtag_1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8c805aba8e2757ea19c7f03c6100ad668ff90727 GIT binary patch literal 136367 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 bxBQ_w2F>^WwzUMCOzEZ9f5ZludFDR=5#eFq literal 0 HcmV?d00001 diff --git a/docs-rtd/source/_static/VJTAG_images/vjtag_3.jpg b/docs-rtd/source/_static/VJTAG_images/vjtag_3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2e6208364ebc257dcb1229cfb35cd69459612cdc GIT binary patch literal 218825 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≶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 B5^?|l literal 0 HcmV?d00001 diff --git a/docs-rtd/source/_static/accel_card_specs.png b/docs-rtd/source/_static/accel_card_specs.png new file mode 100644 index 0000000000000000000000000000000000000000..2ba13006d87e273069bae03a7202b86a915a446c GIT binary patch literal 230566 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%0AEL0X@^;xkdYG0u2tRlF7(SRq&9Pb7UD@W2U-AZ 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 literal 0 HcmV?d00001 diff --git a/docs-rtd/source/_static/aws_clk_gen.png b/docs-rtd/source/_static/aws_clk_gen.png new file mode 100644 index 0000000000000000000000000000000000000000..d637e158942ca3f2b98a91171e3259d768da0794 GIT binary patch literal 53044 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

BG@X7{96U_lehC3bDAidbELa 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

(Ivc#NPq^KPc&KexPzi} z9D+2xhLTRZwoN$ahV`&*eBL_=5I`1vMz+yBiui3#lVMwdPD4}x@bxm)Acaxo&@Z!B z2%4VCugNQ67=YeiHzw(X@n9^{nZ%&SZ40F_JD94iraW3_3+)w55h=A2u6=(B4e16K z98b}-oC0Cz!U+$0oN_F;44MYt;WK>~;m5Z_*T7CO^^?m8Y*>5Qu%Oy3PcXX!T$>&^b?+|?85c`Cm z!dD$OrKe^grTua*P1SH!8J*TVp`F~TZ}>6%f@gw5s1TQ)kY4&eMfY1{QMQZx$zQLx zIFqzL+w^SrN$~Q2_nkBTId~|j^%@4G^f(ufLm>kL1j8_a`k92x_V#JX% z^aYCfBWLL1_p2}3Z*HbQSjyg z8ApW`UQsZ~FP{`x0&rch_heJ2A&Ek+OUa#sFQ|xR;7z@O%PzBqhq5SX#e)}lw}EwmCnbg<&ou5Ui((TU7o*EU!tbQ$w>d5n&d6(dXs^ruCC zLh<(A1E_wlx%h79TNH+Re0OUzx&>S`7dLh2Ew zQ)nZbm=aBi0<>7-veag1*(w_WNzy( z!9O6o8n`PVSwZ^ga=rgL`(AST5F`?*Y85_p@#GtW`~!2W22KIocNO;9Uq6wcvcPD&jYfjGwY3Xw(KdyP3x1KM~!5+FF(8=Tx@Mo7qo7bFP+N6WRYI>ciy&BqQ)? zFYbeXVI3fPk-zHVdsEe9{iRiY)wA8jsi|B}ryDdaO@uXl98`KTNqz6b!}0Ffc{sQS zr$D98+qbZSm$teQV|_OY*&GJ@PJuGVrO)vp4Cx#+NR;FCXOyF)I@*aJgp;KMQN4Il zSw~TnHOjrK5{dt)dl^Nd443AX^Qh4xo#eI3dz;J5;5svna9Br)MUCkZ(EF%0Dfq$&AC5jThb0mkZT-n^3t=GGBXy^Z)O+ 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 z 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 literal 0 HcmV?d00001 diff --git a/docs-rtd/source/_static/cl_dram_hbm_dma_images/cl_dram_hbm_dma.png b/docs-rtd/source/_static/cl_dram_hbm_dma_images/cl_dram_hbm_dma.png new file mode 100644 index 0000000000000000000000000000000000000000..f8ad9a2c192ba00eebd9bd9e976c56e98bcf722a GIT binary patch literal 53814 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 literal 0 HcmV?d00001 diff --git a/docs-rtd/source/_static/cl_mem_perf_images/cl_mem_perf.png b/docs-rtd/source/_static/cl_mem_perf_images/cl_mem_perf.png new file mode 100644 index 0000000000000000000000000000000000000000..3a5cf23e4808e967f919b9585abc8f836d6f376e GIT binary patch literal 78608 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

  • Vru)(` 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
    5-r)%X4a@G( zTH8tcusJ#5pDU4BxLS>5XS@79(i9lVFHijB)IQ^$q~CZB3E3fuCK`)I38weK95~A2 z1|Mcct+~9VfVT?_TxvB*D>jxARVPm&hOxusWmMf&&EUCN9Oh$Yo{q#vU97UnOxG7` zsMl0ExZ)Rmn?87s_-+2-x)iw>$v6AIa|D&vh`{dlRll@32B4_~IYhBKUh2+N_$&<2 z^nAmC*H_*KRkM3i)LY+ZG4z*ep_q(T$+RiA*<~n*6}1;w*PoFKPUcZGWRaeSssYU> z1)BfJ0xv;C#aLybM(8j9EQ^*|n4F)rIUMz{$j%n!2N$oD$f-Wprp5BnYX=_*XHq|{ zk!sxeWDPTar=5Ul%rD(%%wUpmX!aMpqXi6>d`B3;uKlWgpz%B7LpWTgm|HmM>3hDR zXP@FFHaAjgyH74>6re|Y1?IE8-)%ORaD?PteQB6|$%SW+Ud z)-}ArI>^38W`D2X5%Br)UeUF?de&&HiW$6)?24mHY+sR(&v^yrW7<|v_>6eu4F7H1P2O5c z4PwZvRRiV{VW&1`sTML&vUvq~ny(xPV-6C|!r2k1tJ$^cc!4Ubn`Eh29uZFG0%hy<1s5*I^;Gt`*x4mux`Dx)_w`0g7_fq) z#o>*H_%;*nUx!j`u6mAvlsU5f`T>%QV@-S$Ggy7F*wwQFW_2*r8Q2cvA843Dpi&7) z=Bg$Pby5?mf6YyfU5V{7x^gI6ek%E)`URrNJGaAh7oS`WgFKTULIN4Ya^!L=F`LvM z?5L^tf(~gb>NF45+s`4(gTZ8SRbLTrONbXB^uVu+Skl}C6F|{~YqcBBMDOUCmxus* z_J5Ll`Y|E%tNqW&U;cOUz(4CQB%Spl%Y*kO7%F;J4S;iP8iK6tMcA4Z7OT0b?a#>! z+Dvy6W8UjCS0-9AC-uh~du--EOu>Y>#Tj9DbP5-U`k&qLXAOo;)EP^i z)5R(e2}@EGNYhvoza4QyHf^I;u_bM8u-ewdn2XUIWMnz5VvC5+j+47*2uR$(0{B17 z=R~-#NC|D1=T779-3@`#2ib9lS~0$PnO7Uw$^w=f&h8B=K|o&Xjp*}B@qTnAJ?U{W zuv@)g0RyE*5h2+UK$N3xJ+{-ExQRiej6GlKBaM*m;lUvDOmwI*>!wIuPe_3qolMAh zRlBNp*%o|pU5}L#HLlO>ac{$++HI${PzWA6HCNtDPIhJcu=SSL;)p-ThRzWZkd8z& zfKxmUnj_7MZOU*5$TD>}_q%&c(T+Z6mwEkvc*ffe@jShbNgZQU zg#4q=IAg@C_nRW`N(7LkX_mz{J(QJruSN+7tE=;kW*O7jLE<|7Fwl&svad(pN?c7; z&CUz86e5e`6o=6XbFG|-hNl7VrU)zv#ymZ5AJ}a263(ep+K3P4*<)!QAc=!o*#ehc z`bJ-D|ISU)Ss<1ce$G}r*JnDCQ|1=(#HVLP+QJfN4`*BHSN)JUQJu5|0`KCnM<|#F z(daKnT=rH84jemC_BzCawkU(%m<#Fr=)}3~pm$8J>xS9!n@@ar%%abeO`yGFk8@(TSim^S3N0oT~;YI8;{5Y#Mrw zUqt=xd@dheVgiY|2lpeJ0u^z5&>h`>BD(BI9&jO@$szX2KZh9m$0 literal 0 HcmV?d00001 diff --git a/docs-rtd/source/_static/css/custom.css b/docs-rtd/source/_static/css/custom.css new file mode 100644 index 000000000..e69de29bb diff --git a/docs-rtd/source/_static/f2_f1_comp.png b/docs-rtd/source/_static/f2_f1_comp.png new file mode 100644 index 0000000000000000000000000000000000000000..23780e4b5317e35877b9b0aa26e492394503f3f0 GIT binary patch literal 84634 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%0A1xq)zwbR*;oAl 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

    AYjLrl@$`^|ikdM5~f6|_-EmK5ft26p_j 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 literal 0 HcmV?d00001 diff --git a/docs-rtd/source/_static/f2_headline_graphic.png b/docs-rtd/source/_static/f2_headline_graphic.png new file mode 100644 index 0000000000000000000000000000000000000000..8bd5f85ab0938fa69e29aa7d15493007d685a234 GIT binary patch literal 18536 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 F{$IdzA}#;` literal 0 HcmV?d00001 diff --git a/docs-rtd/source/_static/instance_sizes.png b/docs-rtd/source/_static/instance_sizes.png new file mode 100644 index 0000000000000000000000000000000000000000..bef09c1ec913c13d749df59e350e21c8eea9b86b GIT binary patch literal 74157 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�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 qUY#Xh6}YPXclp15=qWD-{X>0= v documentation". +#html_title = None + +# A shorter title for the navigation bar. Default is the same as html_title. +#html_short_title = None + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +#html_logo = None + +# The name of an image file (within the static path) to use as favicon of the +# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +#html_favicon = None + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] +html_css_files= ['css/custom.css'] +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +#html_last_updated_fmt = '%b %d, %Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +#html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +#html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +#html_additional_pages = {} + +# If false, no module index is generated. +#html_domain_indices = True + +# If false, no index is generated. +#html_use_index = True + +# If true, the index is split into individual pages for each letter. +#html_split_index = False + +# If true, links to the reST sources are added to the pages. +#html_show_sourcelink = True + +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +#html_show_sphinx = True + +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. +#html_show_copyright = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +#html_use_opensearch = '' + +# This is the file name suffix for HTML files (e.g. ".xhtml"). +#html_file_suffix = None + +# Output file base name for HTML help builder. +htmlhelp_basename = 'F2doc' + + +# -- Options for LaTeX output -------------------------------------------------- + +latex_elements = { +# The paper size ('letterpaper' or 'a4paper'). +#'papersize': 'letterpaper', + +# The font size ('10pt', '11pt' or '12pt'). +#'pointsize': '10pt', + +# Additional stuff for the LaTeX preamble. +#'preamble': '', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, author, documentclass [howto/manual]). +latex_documents = [ + ('index', 'F2.tex', u'F2 Documentation', + copyright), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +#latex_logo = None + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +#latex_use_parts = False + +# If true, show page references after internal links. +#latex_show_pagerefs = False + +# If true, show URL addresses after external links. +#latex_show_urls = False + +# Documents to append as an appendix to all manuals. +#latex_appendices = [] + +# If false, no module index is generated. +#latex_domain_indices = True + + +# -- Options for manual page output -------------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + ('index', 'f2', u'F2 Documentation', + [copyright], 1) +] + +# If true, show URL addresses after external links. +#man_show_urls = False + + +# -- Options for Texinfo output ------------------------------------------------ + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + ('index', 'F2', u'F2 Documentation', + copyright, 'AWS EC2 F2 Instance Documentation', + 'Miscellaneous'), +] + +# Documents to append as an appendix to all manuals. +#texinfo_appendices = [] + +# If false, no module index is generated. +#texinfo_domain_indices = True + +# How to display URL addresses: 'footnote', 'no', or 'inline'. +#texinfo_show_urls = 'footnote' + + +# Example configuration for intersphinx: refer to the Python standard library. +# intersphinx_mapping = {'http://docs.python.org/': None} diff --git a/docs-rtd/source/developer_resources/DCV.rst b/docs-rtd/source/developer_resources/DCV.rst new file mode 100644 index 000000000..1d1b945a4 --- /dev/null +++ b/docs-rtd/source/developer_resources/DCV.rst @@ -0,0 +1,22 @@ +GUI FPGA Development Environment with NICE DCV +============================================== + +`NICE +DCV `__ +can be used create a virtual desktop on your FPGA Developer AMI +instance. + +`NICE +DCV `__ +is a high-performance remote display protocol that provides customers +with a secure way to deliver remote desktops and application streaming +from any cloud or data center to any device, over varying network +conditions. + +With NICE DCV and Amazon EC2, customers can run graphics-intensive +applications remotely on EC2 instances and stream the results to simpler +client machines, eliminating the need for expensive dedicated +workstations. Customers across a broad range of HPC workloads use NICE +DCV for their remote visualization requirements. Please refer to the +`Official DCV +documentation `__ diff --git a/docs-rtd/source/hdk/README.rst b/docs-rtd/source/hdk/README.rst new file mode 100644 index 000000000..b10c37cc6 --- /dev/null +++ b/docs-rtd/source/hdk/README.rst @@ -0,0 +1,737 @@ +AWS FPGA Hardware Development Kit (HDK) +======================================= + +Table of Contents +----------------- + +- `AWS FPGA Hardware Development Kit + (HDK) <#aws-fpga-hardware-development-kit-hdk>`__ + + - `Table of Contents <#table-of-contents>`__ + - `HDK Overview <#hdk-overview>`__ + - `Getting Started <#getting-started>`__ + + - `Build Accelerator AFI using HDK Design + Flow <#build-accelerator-afi-using-hdk-design-flow>`__ + + - `Step 1. Setup Development + Environment <#step-1-setup-development-environment>`__ + - `Step 2. Clone Developer Kit + Repository <#step-2-clone-developer-kit-repository>`__ + - `Step 3. Setup Environment for HDK Design + Flow <#step-3-setup-environment-for-hdk-design-flow>`__ + - `Step 4. Build CL Design Check Point + (DCP) <#step-4-build-cl-design-check-point-dcp>`__ + - `Step 5. Explore Build + Artifacts <#step-5-explore-build-artifacts>`__ + - `Step 6. Submit Generated DCP for AFI + Creation <#step-6-submit-generated-dcp-for-afi-creation>`__ + - `Step 7. Load Accelerator AFI on F2 + Instance <#step-7-load-accelerator-afi-on-f2-instance>`__ + - `Step 8. Validate your AFI using Example Runtime + Software <#step-8-validate-your-afi-using-example-runtime-software>`__ + + - `CL Examples <#cl-examples>`__ + + - `cl_sde <#cl_sde>`__ + - `cl_dram_hbm_dma <#cl_dram_hbm_dma>`__ + - `cl_mem_perf <#cl_mem_perf>`__ + - `CL_TEMPLATE - Create your own + design <#cl_template---create-your-own-design>`__ + + - `CL Example Hierarchy <#cl-example-hierarchy>`__ + + - `Design <#design>`__ + - `Verification <#verification>`__ + - `Software <#software>`__ + - `Build <#build>`__ + + - `HDK Common Library <#hdk-common-library>`__ + + - `/shell_stable <#shell_stable>`__ + - `/verif <#verif>`__ + - `/ip <#ip>`__ + - `/lib <#lib>`__ + + - `Next Steps <#next-steps>`__ + +HDK Overview +------------ + +The HDK design flow enables developers to create RTL-based accelerator +designs for F2 instances using AMD Vivado. HDK designs must be +integrated with Small Shell, which does not include a built-in Direct +Memory Access (DMA) engine and offers full resources in the top Super +Logic Region (SLR) of the FPGA to developers. + +Getting Started +--------------- + +Build Accelerator AFI using HDK Design Flow +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This section provides a step-by-step guide to build an F2 AFI using the +HDK design flow. The flow starts with an existing Customer Logic (CL) +example design. Steps 1 through 3 demonstrate how to set up the HDK +development environment. Steps 4 through 5 show the commands used to +generate CL Design Checkpoint (DCP) files and other build artifacts. +Steps 6 and 7 demonstrate how to submit the DCP file to generate an AFI +for use on F2 instances. + +.. _step-1-setup-development-environment: + +Step 1. Setup Development Environment +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Developers can either use the AWS-provided developer AMI for F2 or their +on-premise development environment for this demo. + +.. _step-2-clone-developer-kit-repository: + +Step 2. Clone Developer Kit Repository +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. code:: bash + + git clone https://github.com/aws/aws-fpga.git + +.. _step-3-setup-environment-for-hdk-design-flow: + +Step 3. Setup Environment for HDK Design Flow +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The `hdk_setup.sh <../hdk_setup.sh>`__ script needs to be sourced for +each terminal and takes ~2 minutes to complete when first run. + +.. code:: bash + + cd aws-fpga + source hdk_setup.sh + +After the setup is done successfully, you should see +``AWS HDK setup PASSED``. Sourcing ``hdk_setup.sh`` does the following: + +- Verifies a supported Vivado installation +- Sets up all environment variables required by the HDK design flow +- Generates IP simulation models for CL examples +- Downloads all required shell files from a shared S3 bucket + +.. _step-4-build-cl-design-check-point-dcp: + +Step 4. Build CL Design Check Point (DCP) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +After the HDK design environment is set up, you are ready to build a +design example. Run the following commands to build CL DCP files in +Vivado. This tutorial uses the `cl_sde <./cl/examples/cl_sde/>`__ +example. The same steps can be used for any other `CL +examples <./cl/examples>`__. + +.. code:: bash + + cd hdk/cl/examples/cl_sde + export CL_DIR=$(pwd) + cd build/scripts + ./aws_build_dcp_from_cl.py -c cl_sde + +The Shell supplies two base clocks to the CL: a 250MHz ``clk_main_a0`` clock and +a 100MHz ``clk_hbm_ref`` clock. However, the CL can run at higher frequencies +using locally generated clocks. F2 Developer Kit offers an +`AWS Clock Generation (AWS_CLK_GEN) IP <./docs/AWS_CLK_GEN_spec.html>`__ +that you can leverage in your design to generate CL clocks with frequencies +specified in the `Clock Recipes User Guide <./docs/Clock_Recipes_User_Guide.html>`__. + +Run the command below to build a DCP with desired clock recipes: + +.. code:: bash + + ./aws_build_dcp_from_cl.sh -c cl_mem_perf --aws_clk_gen --clock_recipe_a A1 --clock_recipe_b B2 --clock_recipe_c C0 --clock_recipe_hbm H2 + +**NOTE**: The `cl_sde <./cl/examples/cl_sde/README.html/>`__ example does not contain +the AWS_CLK_GEN component. This command uses the `cl_mem_perf <./cl/examples/cl_mem_perf/README.html/>`__ +example to demonstrate the AWS_CLK_GEN usage. + +A few more notes on +`./aws_build_dcp_from_cl.py `__: + +- Use ``--mode small_shell`` option to build CL designs with Small + Shell. +- Use ``--cl `` option to build a different CL design. This is + default to ``cl_dram_hbm_dma``. +- Use ``--aws_clk_gen`` option to annotate the use of `AWS clock + generation block <./hdk/docs/AWS_CLK_GEN_spec.md>`__ and `customer + clock recipes <./hdk/docs/Clock_Recipes_User_Guide.md>`__. +- The script also allows developers to pass different Vivado directives + as shown below: + + - ``--place ``: Default to ``SSI_SpreadLogic_high`` + placement strategy. Please refer to `Vivado User + Guide `__ + for supported directives. + - ``--phy_opt `` : Default to ``AggressiveExplore`` + physical optimization strategy. Please refer to `Vivado User + Guide `__ + for supported directives + - ``--route `` : Default to ``AggressiveExplore`` routing + strategy. Please refer to `Vivado User + Guide `__ + for supported directives. + +- Run ``./aws_build_dcp_from_cl.py --help`` to see more build options + available in building CL designs. + +.. _step-5-explore-build-artifacts: + +Step 5. Explore Build Artifacts +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +While Vivado is running, a build log file +``YYYYY_MM_DD-HHMMSS.vivado.log`` will be created in +``$CL_DIR/build/scripts`` to track the build’s progress. DCP build times +will vary based on the design size and complexity. The examples in the +development kit take between 30 to 90 minutes to build. After the design +is finished building, the following information will be shown at the +bottom of the log file: + +.. code:: bash + + tail + + ... + AWS FPGA: (16:05:44): Finished building design checkpoints for customer design cl_sde + ... + INFO: [Common 17-206] Exiting Vivado at ... + +Generated post-route DCP and design manifest files are archived into a +tarball file ``.Developer_CL.tar`` and saved in the +``$CL_DIR/build/checkpoints/`` directory. All design timing reports are +saved in the ``$CL_DIR/build/reports/`` directory. + +⚠️ If Vivado cannot achieve timing closure for the design, the +post-route DCP file name will be marked with ``.VIOLATED`` as an +indicator. Developers need to refer to the DCPs and timing reports for +detailed timing failures. + +⚠️ The build process will generate a DCP tarball file regardless of the +design’s timing closure state. However, in case of a DCP with timing +failures, the design’s functionality is no longer guaranteed. Therefore, +the AFI created using this DCP should be used for testing purpose ONLY. +The following warning is shown in this case: + +.. code:: text + + !!! WARNING: Detected a post-route DCP with timing failure for AFI creation. Design functionalities are NOT guaranteed. + +.. _step-6-submit-generated-dcp-for-afi-creation: + +Step 6. Submit Generated DCP for AFI Creation +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +To submit the DCP, create an S3 bucket and upload the DCP tarball file +to the bucket. DCP submission requires the following information: + +- Name of the design (Optional). +- Generic description of the logic design (Optional). +- Destination location of the tarball file object in your S3 bucket. +- Destination location of an S3 directory where AWS can save the logs + for your AFI’s creation. + +To upload your tarball file to S3, you can use any of `the tools +supported by +S3 `__. + +For example, you can use the AWS CLI as follows: + +Create a bucket and folder for your tarball, then copy to S3. + +Currently, ``us-east-1`` and ``eu-west-2`` are available as ``REGION`` +options. + +.. code:: bash + + export DCP_BUCKET_NAME='' + export DCP_FOLDER_NAME='' + export REGION='us-east-1' + export DCP_TARBALL_TO_INGEST='<$CL_DIR/build/checkpoints/to_aws/YYYY_MM_DD-HHMMSS.Developer_CL.tar>' + + # Create an S3 bucket (choose a unique bucket name) + aws s3 mb s3://${DCP_BUCKET_NAME} --region ${REGION} + # Create folder for your tarball files + aws s3 mb s3://${DCP_BUCKET_NAME}/${DCP_FOLDER_NAME}/ + # Upload the file to S3 + aws s3 cp ${DCP_TARBALL_TO_INGEST} s3://${DCP_BUCKET_NAME}/${DCP_FOLDER_NAME}/ + +**NOTE**: The trailing '/' is required after ``${DCP_FOLDER_NAME}`` + +Create a folder for your log files + +.. code:: bash + + export LOGS_BUCKET_NAME='' + export LOGS_FOLDER_NAME='' + + # Create a folder to keep your logs + aws s3 mb s3://${LOGS_BUCKET_NAME}/${LOGS_FOLDER_NAME}/ --region ${REGION} + # Create a temp file + touch LOGS_FILES_GO_HERE.txt + # Create the folder on S3 + aws s3 cp LOGS_FILES_GO_HERE.txt s3://${LOGS_BUCKET_NAME}/${LOGS_FOLDER_NAME}/ + +**NOTE**: The trailing '/' is required after ``${LOGS_FOLDER_NAME}`` + +The output of this command includes two identifiers for your AFI: + +.. code:: bash + + export DCP_TARBALL_NAME=$(basename ${DCP_TARBALL_TO_INGEST}) + export CL_DESIGN_NAME='' + export CL_DESIGN_DESCRIPTION='Description of ${CL_DESIGN_NAME}' + + # Call AWS CLI ingestion command + aws ec2 create-fpga-image --name ${CL_DESIGN_NAME} --description "${CL_DESIGN_DESCRIPTION}" --input-storage-location Bucket=${DCP_BUCKET_NAME},Key=${DCP_FOLDER_NAME}/${DCP_TARBALL_NAME} --logs-storage-location Bucket=${LOGS_BUCKET_NAME},Key=${LOGS_FOLDER_NAME}/ --region ${REGION} + + { + "FpgaImageId": "afi-09953582f46c45b17", + "FpgaImageGlobalId": "agfi-0925b211f5a81b071" + } + +- ``FpgaImageId`` or AFI ID: This is the main ID used to manage + developer’s AFI through the AWS EC2 CLI and AWS SDK APIs. This ID is + regional, i.e., if an AFI is copied across multiple regions, it will + have a different, unique AFI ID in each region. + +- ``FpgaImageGlobalId`` or AGFI ID: This is a global ID used to refer to + an AFI from within an F2 instance. For example, to load or clear an + AFI from an FPGA slot, developers need to use the AGFI ID. Since the + AGFI IDs is global (by design), it allows developers to copy a + combination of AFI/AMI to multiple regions and they will work without + any extra setup. + +The ``describe-fpga-images`` command allows developers to check the +AFI’s state while the AFI creation process runs in the background. The +AFI ID returned by the ``create-fpga-image`` command must be provided. +The AFI is ready to be deployed once the creation completes and the +state code returned is ``available``. + +.. code:: bash + + aws ec2 describe-fpga-images --fpga-image-ids afi-09953582f46c45b17 --region us-east-1 + + ... + + { + "FpgaImages": [ + { + "FpgaImageId": "afi-09953582f46c45b17", + "FpgaImageGlobalId": "agfi-0925b211f5a81b071", + "Name": "cl_sde_0x10212415", + "Description": "Latest devkit build of cl_sde with 0x10212415 small shell release", + ... + "State": { + "Code": "available" + }, + ... + } + ] + } + +.. _step-7-load-accelerator-afi-on-f2-instance: + +Step 7. Load Accelerator AFI on F2 Instance +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Now that your AFI is available, it can be tested on an F2 instance. The +instance can be launched using any preferred AMI, private or public, +from the AWS Marketplace catalog. AWS recommends using AMIs with Ubuntu +20.04 and kernel version 5.15. + +Now you need to install the FPGA Management tools by sourcing the +``sdk_setup.sh`` script: + +.. code:: bash + + cd aws-fpga + source sdk_setup.sh + +Once the tools are installed, you can load the AFI onto a slot on the F2 +instance. It is a good practice to clear any previously loaded AFI from +that slot: + +.. code:: bash + + $ sudo fpga-clear-local-image -S 0 + AFI 0 No AFI cleared 1 ok 0 0x10212415 + AFIDEVICE 0 0x1d0f 0x9048 0000:00:1e.0 + +You can also invoke the ``fpga-describe-local-image`` command to learn +which AFI, if any, is loaded onto a particular slot. For example, if the +slot is cleared (``slot 0`` in this example), you should get an output +similar to the following: + +.. code:: bash + + $ sudo fpga-describe-local-image -S 0 -H + Type FpgaImageSlot FpgaImageId StatusName StatusCode ErrorName ErrorCode ShVersion + AFI 0 No AFI cleared 1 ok 0 0x10212415 + Type FpgaImageSlot VendorId DeviceId DBDF + AFIDEVICE 0 0x1d0f 0x9048 0000:00:1e.0 + +If ``fpga-describe-local-image`` API call returns a status ``busy``, the +FPGA is still performing the previous operation in the background. +Please wait until the status is ``cleared`` as above. + +Now, let’s load your AFI onto the FPGA on ``slot 0``: + +.. code:: bash + + $ sudo fpga-load-local-image -S 0 -I agfi-0925b211f5a81b071 + AFI 0 agfi-0925b211f5a81b071 loaded 0 ok 0 0x10212415 + AFIDEVICE 0 0x1d0f 0x9048 0000:00:1e.0 + +**NOTE**: *The FPGA Management tools use the AGFI ID (not the AFI ID).* + +Now, you can verify that the AFI was loaded properly. The output shows +the FPGA in the ``loaded`` state after the FPGA image “load” operation. +The ``-R`` option performs a PCI device remove and rescan in order to +expose the unique AFI Vendor and Device Id. + +.. code:: bash + + Type FpgaImageSlot FpgaImageId StatusName StatusCode ErrorName ErrorCode ShVersion + AFI 0 agfi-0925b211f5a81b071 loaded 0 ok 0 0x10212415 + Type FpgaImageSlot VendorId DeviceId DBDF + AFIDEVICE 0 0x1d0f 0x9048 0000:00:1e.0 + +.. _step-8-validate-your-afi-using-example-runtime-software: + +Step 8. Validate your AFI using Example Runtime Software +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Each CL example includes a runtime software binary, located in the +``$CL_DIR/software/runtime/`` subdirectory. Executing the software +requires the corresponding AFI to be loaded onto the FPGA. This step +demonstrates runtime software execution using the ``CL_SDE`` example. + +.. code:: bash + + # Ensure the $CL_DIR is pointing to the CL_SDE example directory + $ cd $CL_DIR/software/runtime/ + $ make + + ... + + Logical Core 1 (socket 0) forwards packets on 1 streams: + RX P=0/Q=0 (socket 0) -> TX P=0/Q=0 (socket 0) peer=02:00:00:00:00:00 + + io packet forwarding packets/burst=32 + nb forwarding cores=1 - nb forwarding ports=1 + port 0: RX queue number: 1 Tx queue number: 1 + Rx offloads=0x0 Tx offloads=0x0 + RX queue: 0 + RX desc=0 - RX free threshold=0 + RX threshold registers: pthresh=0 hthresh=0 wthresh=0 + RX Offloads=0x0 + TX queue: 0 + TX desc=0 - TX free threshold=0 + TX threshold registers: pthresh=0 hthresh=0 wthresh=0 + TX offloads=0x0 - TX RS bit threshold=0 + Press enter to exit + + Telling cores to stop... + Waiting for lcores to finish... + + ---------------------- Forward statistics for port 0 ---------------------- + RX-packets: 10771136 RX-dropped: 0 RX-total: 10771136 + TX-packets: 8160479 TX-dropped: 2610689 TX-total: 10771168 + ---------------------------------------------------------------------------- + + +++++++++++++++ Accumulated forward statistics for all ports+++++++++++++++ + RX-packets: 10771136 RX-dropped: 0 RX-total: 10771136 + TX-packets: 8160479 TX-dropped: 2610689 TX-total: 10771168 + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + Done. + + Stopping port 0... + Stopping ports... + Done + + Shutting down port 0... + Closing ports... + Done + + Bye... + +CL Examples +----------- + +All examples have the following features: + +- Simulation model, tests, and scripts +- Xilinx Vivado implementation scripts for generating bitstream + +`cl_sde <./cl/examples/cl_sde>`__ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The cl_sde example implements the Streaming Data Engine (SDE) IP block +into FPGA custom logic to demonstrate the `Virtual Ethernet +Application <../sdk/apps/virtual-ethernet/README.md>`__. + +See `cl_sde <./cl/examples/cl_sde>`__ for more information + +`cl_dram_hbm_dma <./cl/examples/cl_dram_hbm_dma>`__ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The cl_dram_hbm_dma example demonstrates the use and connectivity for +many of the Shell/CL interfaces and functionality. The OCL (AXI-Lite) +interface is used for general configuration, the PCIS (AXI4) interface +is used for data traffic from the host to DDR and HBM DRAM channels in +the CL (initiated by the host), and the PCIM (AXI4) interface is used +for data traffic between the host and the CL (initiated by the CL). + +See `cl_dram_hbm_dma <./cl/examples/cl_dram_hbm_dma>`__ for more +information + +`cl_mem_perf <./cl/examples/cl_mem_perf>`__ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The cl_mem_perf is a reference design for F2 where the objective is to +demonstrate fine tuned data paths to HBM and DDR to achieve maximum +throughput to the memories. The example also demonstrates datapath +connectivity between Host, AWS Shell, Custom Logic (CL) region in the +FPGA, HBM and DDR DIMM on the FPGA card. + +See `cl_mem_perf <./cl/examples/cl_mem_perf>`__ for more information + +`CL_TEMPLATE <./cl/examples/CL_TEMPLATE>`__ - Create your own design +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +CL_TEMPLATE is targeted to help customers create a new CustomLogic +example. Users can update the design, verification, and build flow to +meet their needs without having to tear down a separate example. We +recommend going through other CL examples before creating a new CL. + +All of the design files and tests can be compiled, simulated, built, and +deployed on hardware (without any modifications). Users can add/update +design files, add new verification tests, and add new build directives +to meet their needs. + +A full guide on creating your own CL design can be found in +`CL_TEMPLATE <./cl/examples/CL_TEMPLATE>`__ + +To create a new CL example: + +.. code:: bash + + export NEW_CL_NAME='New CL Name' + cd hdk/cl/examples + ./create_new_cl.py --new_cl_name ${NEW_CL_NAME} + +CL Example Hierarchy +-------------------- + +The following sections describe common functionality across all CL +examples. `CL_TEMPLATE <./CL_TEMPLATE>`__ can be used as a reference for +what features are available in all CL examples; as well as what's +required to verify, test, and build. + +Design +~~~~~~ + +- All CL examples store the design files under + ``/hdk/cl/examples/$CL_DIR/design/`` + + - For example: + `/hdk/cl/examples/CL_TEMPLATE/design/ <./cl/examples/CL_TEMPLATE/design/>`__ + +- All IP designs available by default are stored in + `/hdk/common/ip/cl_ip <./common/ip/>`__ + + - More can be added from the Xilinx Vivado IP catalog + +Verification +~~~~~~~~~~~~ + +- All CL examples utilize infrastructure found under + `/hdk/common/verif/ <./common/verif>`__ +- Simulation libraries are generated under + ``/hdk/common/verif/ip_simulation_libraries/`` +- All examples should list out the + ``/hdk/cl/examples/$CL_DIR/verif/tests/`` and ``Makefile.tests`` + + - For example + `/hdk/cl/examples/CL_TEMPLATE/verif/tests/ <./cl/examples/CL_TEMPLATE/verif/tests/>`__ + - and ` <./cl/examples/CL_TEMPLATE/verif/scripts/Makefile.tests>`__ + +- All HDK examples support a SH_DDR with 64GB access with an optional + user controlled auto-precharge mode. Users can select the DDR access + modes as follows: + +.. code:: bash + + export TEST_NAME=test_ddr + + # To Run simulations with a 64 GB DDR DIMM + make TEST=${TEST_NAME} USE_64GB_DDR_DIMM=1 + + # To Run simulations with a 64 GB DDR DIMM and DDR core with user controlled auto-precharge mode + make TEST=${TEST_NAME} USE_AP_64GB_DDR_DIMM=1 + +**NOTE**: Please refer to +`Supported_DDR_Modes.md <./docs/Supported_DDR_Modes.md>`__ for details +on supported DDR configurations. + +After adding new design IPs, make sure to add the new simulation +``COMMON_LIBLISTS`` in +`$AWS-FPGA/hdk/common/verif/tb/scripts/Makefile.common.inc <./common/verif/tb/scripts/Makefile.common.inc>`__ + +⚠️ **Required for XSIM and Questa simulations** + +- Make sure to add the new simulation libraries to ``COMMON_LIBLISTS`` + in + `$AWS_FPGA_REPO_DIR/hdk/common/verif/tb/scripts/Makefile.common.inc <./common/verif/tb/scripts/Makefile.common.inc>`__ + + - This is required for XSIM and Questa simulations + - These libraries can be found in + `$AWS_FPGA_REPO_DIR/hdk/common/ip/cl_ip/cl_ip.ip_user_files/sim_scripts <./common/ip/cl_ip/cl_ip.ip_user_files/sim_scripts>`__ + followed by ``"IP_NAME"/"SIMULATOR"/"IP_NAME".sh`` + +- After adding new IP's to + `$AWS_FPGA_REPO_DIR/hdk/common/ip <./common/ip>`__ the simulation + libraries need to be recompiled + + - Run ``make regenerate_sim_libs =1`` + +Software +~~~~~~~~ + +All software runtime code can be found under the ``software`` directory. + +Build +~~~~~ + +- All CL examples utilize infrastructure found under + `$AWS_FPGA_REPO_DIR/hdk/common/shell_stable/build <./common/shell_stable/build>`__ +- Users can modify the following files to meet their build requirements: + + - `synth_CL_NAME.tcl <./cl/examples/CL_TEMPLATE/build/scripts/synth_CL_TEMPLATE.tcl>`__ + - top level script that reads design, IP, and constraint files + - `cl_synth_user.xdc <./cl/examples/CL_TEMPLATE/build/constraints/cl_synth_user.xdc>`__ + - synthesis build constraints specific to that example + - `cl_timing_user.xdc <./cl/examples/CL_TEMPLATE/build/constraints/cl_timing_user.xdc>`__ + - timing build constraints specific to that example + - `small_shell_cl_pnr_user.xdc <./cl/examples/CL_TEMPLATE/build/constraints/small_shell_cl_pnr_user.xdc>`__ + - place and route constraints specific to that example's small shell + build + +For more information on +`synth_CL_NAME.tcl <./cl/examples/CL_TEMPLATE/build/scripts/synth_CL_TEMPLATE.tcl>`__ +see: + +- `synth_cl_header.tcl <./common/shell_stable/build/scripts/synth_cl_header.tcl>`__ +- `synth_cl_footer.tcl <./common/shell_stable/build/scripts/synth_cl_footer.tcl>`__ + +After adding new design IPs: + +- Make sure to add the new ``.xci`` files to your `synthesis TCL + script <./cl/examples/CL_TEMPLATE/build/scripts/synth_CL_TEMPLATE.tcl>`__ + +HDK Common Library +------------------ + +This directory includes the shell versions, scripts, timing constraints +and compile settings required during the AFI generation process. + +Developers should not modify or remove these files. + +`/shell_stable <./common/shell_stable>`__ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The `shell_stable <./common/shell_stable>`__ contains all the IPs, +constraints and scripts for each shell release. + +`/verif <./hdk/verif>`__ +~~~~~~~~~~~~~~~~~~~~~~~~ + +The `verif directory <./common/verif>`__ includes reference verification +modules to be used as Bus Functional Models (BFM) as the external +interface to simulate the CL. The verification related files common to +all the CL examples are located in this directory. It has models, +include, scripts, tb directories. + +The `verif models directory <./common/verif/models>`__ includes simple +models of the DRAM interface around the FPGA, shell, and card. You can +also find Xilinx protocol checkers in this directory. + +The `verif scripts directory <./common/verif/scripts>`__ includes +scripts needed to generate DDR models and other scripts needed for HDK +setup. + +The `verif include directory <./common/verif/include>`__ includes +sh_dpi_tasks.vh needed for DPI-C. + +The `verif tb directory <./common/verif/tb>`__ includes top level test +bench related files common for all the CL examples. + +The verif ip_simulation_libraries directory is created during runtime +and includes the simulation libraries and CL IP compilation for all +supported simulators. + +`/ip <./common/ip>`__ +~~~~~~~~~~~~~~~~~~~~~ + +The `ip directory <./common/ip>`__ includes basic IP that is used by +CL's. + +`/lib <./common/lib>`__ +~~~~~~~~~~~~~~~~~~~~~~~ + +The `lib directory <./common/lib>`__ includes basic "library" elements +that may be used by CL's. + +- aws_clk_gen.sv - Generate clocks and resets to the CL design +- aws_clk_regs.sv - Houses all the Control/Status Regs for AWS_CLK_GEN + design +- axi_clock_conv.sv - AXI-4 bus clock converter +- axil_to_cfg_cnv.sv - Convert AXIL transaction into a simple CFG bus +- axis_flop_fifo.sv - Flop based FIFO for AXI-Stream protocol +- bram_1w1r.sv - BRAM (1 write/1 read port) RTL model. +- bram_wr2.sv - BRAM (2 read/write ports) RTL model. +- ccf_ctl.v - Clock crossing FIFO control block (pointers, address + generation, etc...) +- cdc_async_fifo.sv - Async FF-based FIFO for CDC +- cdc_sync.sv - Single- or Multi-bit Synchronizer based on Xilinx XPM +- flop_ccf.sv - Flop based clock crossing FIFO. +- flop_fifo.sv - Flop based FIFO. +- flop_fifo_in.sv - Flop based FIFO, where input is flopped by common + flops (can be used for input signal registering). +- ft_fifo.v - Flow through FIFO. +- ft_fifo_p.v - Flow through FIFO to be used with pipelined RAM. +- gray.inc - Gray code +- hbm_wrapper.sv - Wrapper for HBM IP +- interfaces.sv - Generic interfaces (AXI-4, AXI-L, etc...) +- lib_pipe.sv - Pipeline block. +- macros.svh - Instantiation macros (AXI-4, AXI-L, etc...) +- mgt_acc_axl.sv - Used by AWS provided sh_ddr.sv +- mgt_gen_axl.sv - Used by AWS provided sh_ddr.sv +- ram_fifo_ft.sv - Ram based FIFO +- rr_arb.sv - Round robin arbiter. +- srl_fifo.sv - Shift register based fifo. +- sync.v - Synchronizer +- xpm_fifo.sv - Synchronous clock FIFO + +.. _getting-started-1: + +Getting Started +--------------- + +- Review the + `cl_dram_hbm_dma <./cl/examples/cl_dram_hbm_dma/README.md>`__ and + `cl_sde <./cl/examples/cl_sde>`__ examples +- `Run RTL + Simulations <./docs/RTL_Simulation_Guide_for_HDK_Design_Flow.md>`__ on + the example designs +- Dive deep into `Shell interface + specifications <./docs/AWS_Shell_Interface_Specification.md>`__ and + `PCIe Memory map <./docs/AWS_Fpga_Pcie_Memory_Map.md>`__ +- Create your own designs/Port F1 designs to F2 systems. diff --git a/docs-rtd/source/hdk/cl/CHECKLIST_BEFORE_BUILDING_CL.rst b/docs-rtd/source/hdk/cl/CHECKLIST_BEFORE_BUILDING_CL.rst new file mode 100644 index 000000000..9efa77968 --- /dev/null +++ b/docs-rtd/source/hdk/cl/CHECKLIST_BEFORE_BUILDING_CL.rst @@ -0,0 +1,18 @@ +Checklist Before Building +========================= + +This checklist includes important items that the developer should check before +building a CL Design Check Point (DCP) file for AFI generation. + +1. Verify that the environment variables ``$HDK_SHELL_DIR`` and ``$CL_DIR`` are + set correctly. + +2. Verify that the ``$CL_DIR`` directory has a ``/build`` sub-directory. + +3. Update ``$CL_DIR/build/script/encrypt.tcl`` script for your design specific + changes, including the list of all the source files (including header files + like .inc and .h/.vh), so they all get copied to ``src_post_encryption`` + directory + +4. Update the timing and placement constraints under + ``$CL_DIR/build/constraints`` for your design specific changes. diff --git a/docs-rtd/source/hdk/cl/examples/CL_TEMPLATE/README.rst b/docs-rtd/source/hdk/cl/examples/CL_TEMPLATE/README.rst new file mode 100644 index 000000000..460535bd5 --- /dev/null +++ b/docs-rtd/source/hdk/cl/examples/CL_TEMPLATE/README.rst @@ -0,0 +1,422 @@ +CL_TEMPLATE +=========== + +Table of Content +---------------- + +- `Overview <#overview>`__ +- `Features <#features>`__ + + - `Design <#design>`__ + - `Verification <#verification>`__ + - `Software <#software>`__ + - `Build <#Build>`__ + +- `CL Template Quick Start Guide <#cl_template-quick-start-guide>`__ + +Overview +-------- + +CL_TEMPLATE is targeted to help customers create a new CustomLogic +example. Developers can update the design, verification, and build flow +to meet their needs without having to tear down a separate example. We +recommend going through other CL examples before creating a new CL. + +All of the design files and tests can be compiled, simulated, built, and +deployed on hardware (without any modifications). Developers can +add/update design files, add new verification tests, and create new +build directives to meet their needs. + +**To quickly add in design files and test:** + +1. Run ``source hdk_setup.sh`` from the top of ``$AWS_FPGA_REPO_DIR/`` +2. Run ``cd hdk/cl/examples`` and + ``./create_new_cl.py --new_cl_name `` +3. Run ``cd `` and ``export CL_DIR=$PWD`` +4. Place all design files into ``$CL_DIR/design`` (overwriting the + existing .sv file) +5. Simulate with + ``cd $CL_DIR/verif/scripts and make _base_test =1`` + +Features +-------- + +Design +~~~~~~ + +CL_TEMPLATE contains the minimum required set of design files. All +examples require a SystemVerilog file (.sv) named after the CL example +and a Verilog header file (.vh) with required defines. + +⚠️ ``cl_id_defines.vh`` is used in the design manifest file generation. +Therefore, this file is required for all CL designs. + +`CL_TEMPLATE.sv <./design/CL_TEMPLATE.sv>`__ with the following: + +- CL port connections with signal tie downs to avoid simulation errors +- SH_DDR (change ``.EN_DDR(0)`` to ``.EN_DDR(1)`` to elaborate the DDR + interface) +- ``CL_SH_ID0`` and ``CL_SH_ID1`` connections (see the defines below) + +`cl_id_defines.vh <./design/cl_id_defines.vh>`__ with the following +defines: + +- ``CL_SH_ID0`` +- ``CL_SH_ID1`` + +`CL_TEMPLATE_defines.vh <./design/CL_TEMPLATE_defines.vh>`__ with the +following defines: + +- ``CL_NAME`` + + - See `fpga.sv <./../../../common/verif/models/fpga/fpga.sv>`__ for + details + +Customers can add all other design files and replace these default files +with their own. + +Verification +~~~~~~~~~~~~ + +All examples use the same SystemVerilog `test +bench <./../../../common/verif/tb/sv/tb.sv>`__. The common verification +files can be found under +`:math:`AWS_FPGA_REPO_DIR/hdk/common/verif](./../../../common/verif). This includes a [common Makefile flow](./../../../common/verif/tb/scripts) that expects a [Makefile.tests](./verif/scripts/Makefile.tests) file that exposes Makefile targets for each test located under [`\ CL_DIR/verif/tests <./verif/tests>`__. + +This CL_TEMPLATE example includes a single `base +test <./verif/tests/CL_TEMPLATE_base_test.sv>`__ that will allow all +files to be compiled, elaborated, and quickly simulated to expose any +protocol violations. A `top.SIMULATOR.f <./verif/scripts/top.xsim.f>`__ +file is required for each simulator in use. These file lists are auto +generated by default (including all SystemVerilog source files found +under the `./design <./design>`__ directory). Manual updates are +required for design files or verification infrastructure developed +outside of the `design <./design>`__ or `verif <./verif>`__ directories. +Each example builds on top of the `common file +lists <./../../../common/verif/tb/filelists>`__. + +Required script files: + +- `Makefile <./verif/scripts/Makefile>`__ +- `Makefile.tests <./verif/scripts/Makefile.tests>`__ +- `top.xsim.f <./verif/scripts/top.xsim.f>`__ +- `waves.tcl <./verif/scripts/waves.tcl>`__ (for XSIM only) +- `top.vcs.f <./verif/scripts/top.vcs.f>`__ +- `top.questa.f <./verif/scripts/top.questa.f>`__ + +For more information on test bench architecture and functionality: + +- Base testbench: + `$AWS_FPGA_REPO_DIR/hdk/common/verif/tb/sv/tb.sv <./../../../common/verif/tb/sv/tb.sv>`__ +- Basic shell DPI tasks: + `$AWS_FPGA_REPO_DIR/hdk/common/verif/include/sh_dpi_tasks.svh <./../../../common/verif/include/sh_dpi_tasks.svh>`__ + + - Accessible from the ``tb`` hierarchy + (``tb.poke_ocl(.addr(64'h100), .data(32'h0)``) + +- Basic test tasks: + `$AWS_FPGA_REPO_DIR/hdk/common/verif/include/common_base_test.svh <./../../../common/verif/include/common_base_test.svh>`__ + + - The `base test <./verif/tests/CL_TEMPLATE_base_test.sv>`__ uses + ``report_pass_fail_status()`` + +- Required config files for HBM simulation (not supported in XSIM): + `$AWS_FPGA_REPO_DIR/hdk/common/verif/include/xpm\_\* <./../../../common/verif/include/>`__ + +Co-Simulation with C tests is not yet supported. + +Software +~~~~~~~~ + +CL_TEMPLATE does not yet support stand alone software tests. Please +refer to other examples such as +`CL_DRAM_HBM_DMA <./../cl_dram_hbm_dma#software>`__ + +Build +~~~~~ + +The build flow is identical to all other examples: + +1. Populate the `constraint files <./build/constraints>`__ as needed +2. Update + `synth_CL_TEMPLATE.tcl <./build/scripts/synth_CL_TEMPLATE.tcl>`__ + with relevant IP's, constraints, etc. +3. Run `aws_build_dcp_from_cl.py + <../../../common/shell_stable/build/scripts/aws_build_dcp_from_cl.py>`__. + + - Run ``aws_build_dcp_from_cl.py --help`` for more details. + +See the following ``tcl`` scripts for more details on the build flow +(they are sourced in +`synth_CL_TEMPLATE.tcl <./build/scripts/synth_CL_TEMPLATE.tcl>`__): + +- `$AWS_FPGA_REPO_DIR/hdk/common/shell_stable/build/scripts/synth_cl_header.tcl <./../../../common/shell_stable/build/scripts/synth_cl_header.tcl>`__ +- `$AWS_FPGA_REPO_DIR/hdk/common/shell_stable/build/scripts/synth_cl_footer.tcl <./../../../common/shell_stable/build/scripts/synth_cl_footer.tcl>`__ + +Required build scripts: + +- `aws_build_dcp_from_cl.py <./../../../common/shell_stable/build/scripts/aws_build_dcp_from_cl.py>`__ + (symlink) - Python script to run builds +- `build_all.tcl <./../../../common/shell_stable/build/scripts/build_all.tcl>`__ + (symlink) - Common build script used across examples +- `build_level_1_cl.tcl <./../../../common/shell_stable/build/scripts/build_level_1_cl.tcl>`__ + (symlink) - Common build script used across examples +- `encrypt.tcl <./../../../common/shell_stable/build/scripts/encrypt.tcl>`__ + (symlink) - Common build script used across examples to encrypt design + files +- `synth_CL_TEMPLATE.tcl <./build/scripts/synth_CL_TEMPLATE.tcl>`__ - + Refer to `STEP 5: Build and Deploy the + Design <#step-5-build-and-deploy-the-design>`__ below for more + information. + +AWS has integrated basic constraints required across example designs. +These constraint files can be found in +`$AWS_FPGA_REPO_DIR/hdk/common/shell_stable/build/constraints <./../../../common/shell_stable/build/constraints>`__ + +Required constraint files: + +- `cl_synth_user.xdc <./build/constraints/cl_synth_user.xdc>`__ - Custom + constraints applied to the synthesizer (called in + `synth_CL_TEMPLATE.tcl <./build/scripts/synth_CL_TEMPLATE.tcl>`__) +- `cl_timing_user.xdc <./build/constraints/cl_timing_user.xdc>`__ - + Custom timing constraints applied to the synthesizer (called in + `synth_CL_TEMPLATE.tcl <./build/scripts/synth_CL_TEMPLATE.tcl>`__) +- `small_shell_cl_pnr_user.xdc <./build/constraints/small_shell_cl_pnr_user.xdc>`__ + - Floorplan constraints for the CL design when building with + SMALL_SHELL. See `CL_DRAM_HBM_DMA's + constraints <./../cl_dram_hbm_dma/build/constraints/small_shell_cl_pnr_user.xdc>`__ + for reference. +- `xdma_shell_cl_pnr_user.xdc <./build/constraints/xdma_shell_cl_pnr_user.xdc>`__ + - Floorplan constraints for the CL design when building with + XDMA_SHELL. See `CL_DRAM_HBM_DMA's + constraints <./../cl_dram_hbm_dma/build/constraints/xdma_shell_cl_pnr_user.xdc>`__ + for reference. + +For more information on how to populate the constraint files and build +scripts, please refer to other examples such as +`CL_DRAM_HBM_DMA <./../cl_dram_hbm_dma/build>`__. + +CL_TEMPLATE Quick Start Guide +----------------------------- + +The HDK top level `Quick Start Guide <./../../../README.html#getting-started>`__ +will provide an introduction to this guide. + +STEP 1: Create a New CL +~~~~~~~~~~~~~~~~~~~~~~~ + +The first step is to copy this example into a new directory and replace all +references to CL_TEMPLATE with the new example name. To automatically create +your own example, run `create_new_cl.py <./../create_new_cl.py>`__ from the +``$AWS_FPGA_REPO_DIR/hdk/cl/examples`` directory + +.. code:: bash + + # CL names are typically all lowercase + export NEW_CL_NAME='' + cd $AWS_FPGA_REPO_DIR/hdk/cl/examples + ./create_new_cl.py --new_cl_name ${NEW_CL_NAME} + +Or run these shell commands + +.. code:: bash + + export NEW_CL_NAME='' + + # Everything below can be copied and pasted into a bash terminal + CL_TEMPLATE=CL_TEMPLATE + echo "Creating $CL_TEMPLATE directory" + cp -r $CL_TEMPLATE $NEW_CL_NAME + + echo "Replacing CL_TEMPLATE with $CL_TEMPLATE in all files" + grep -rl $CL_TEMPLATE $NEW_CL_NAME | xargs sed -i "s/$CL_TEMPLATE/$NEW_CL_NAME/g" + + echo "Updating CL_TEMPLATE with $CL_TEMPLATE in all file names" + CL_TEMPLATE=$CL_TEMPLATE NEW_CL_NAME=$NEW_CL_NAME find $NEW_CL_NAME -name "*$CL_TEMPLATE*" -exec sh -c 'mv "$0" "${$0/$CL_TEMPLATE/$NEW_CL_NAME}"' {} \; + +The result will be a directory containing everything in CL_TEMPLATE +(renamed to the new CL name) with functional tools and scripts. Please +note that these files need to be manually updated to include any design +specific changes. + +STEP 2: Add Design Files +~~~~~~~~~~~~~~~~~~~~~~~~ + +All CL design files should be placed under the `design <./design>`_ directory. +Please see the `Design <#design>`__ section for information on the CL_TEMPLATE +design files. + +Users may modify these files and add new ones as their designs grow. +Xilinx IP's are available to all CL examples (found under +`$AWS_FPGA_REPO_DIR/hdk/common/ip <./../../../common/ip>`__). + +STEP 3: Develop Design Verification Tests (OPTIONAL) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Once design files have been added, run the +`CL_TEMPLATE_base_test <./verif/tests/CL_TEMPLATE_base_test.sv>`__. This +test only powers up the test bench to make sure the design can be +compiled and simulated. All tests should be located under +`$CL_DIR/verif/tests <./verif/tests>`__ and test targets added to +`Makefile.tests <./verif/scripts/Makefile.tests>`__: + +.. code:: bash + + cd $AWS_FPGA_REPO_DIR/hdk/cl/examples/CL_TEMPLATE + export CL_DIR=$(pwd) + cd ${CL_DIR}/verif/scripts + make CL_TEMPLATE_base_test + +Or specify an `available simulator +<./../../../../User_Guide_AWS_EC2_FPGA_Development_Kit.html#hardware-development-kit-hdk>`__: + +.. code:: bash + + make CL_TEMPLATE_base_test =1 + +This will first generate and compile the simulation libraries required for the +requested SIMULATOR. Test results will be stored in the +``$CL_DIR/verif/sim/`` directory (created upon first simulation +run). After adding new IP's to +`$AWS_FPGA_REPO_DIR/hdk/common/ip <./../../../common/ip>`__, the simulation +libraries need to be recompiled: ``make regenerate_sim_libs =1``. + +File List Generation +^^^^^^^^^^^^^^^^^^^^ + +The Makefile includes ``$AWS_FPGA_REPO_DIR/hdk/common/verif/tb/scripts/Makefile.common.inc`` +which runs a Python script to automatically update each ``top..f`` file list with +all SystemVerilog files found under the ``$CL_DIR/design/``directory. + +- To disable the generation, run ``export DONT_GENERATE_FILE_LIST=1``. +- To re-enable the generation, run ``unset DONT_GENERATE_FILE_LIST``. +- To generate the file list by itself, run ``make generate_sim_file_list =1``. +- To add additional files, add them outside of the auto generation section: + +.. code:: text + + # Add code up here or below the comment block to persist between simulations + + ############################## + #### BEGIN AUTO-GENERATE ##### + + +incdir+$CL_DIR/design/ + + $CL_DIR/design/CL_TEMPLATE.sv + + ##### END AUTO-GENERATE ###### + ############################## + +Xilinx/AMD IP Discovery and Compilation +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +When running your first test, all Xilinx IP's under +`$AWS_FPGA_REPO_DIR/hdk/common/ip/cl_ip <./../../../common/ip/cl_ip>`__ +are automatically compiled + +- You can find the ``xil_defaultlib`` library for each simulator in + `$AWS_FPGA_REPO_DIR/hdk/common/verif/ip_simulation_libraries/ + <./../../../common/verif>`__ (created after first simulation run) + +If a design adds new IP's, make sure to add the new simulation libraries +to ``COMMON_LIBLISTS`` in: + +- `$AWS_FPGA_REPO_DIR/hdk/common/verif/tb/scripts/Makefile.common.inc + <./../../../common/verif/tb/scripts/Makefile.common.inc>`__ (this is + required for XSIM and Questa simulations). + +Simulation library names can be found under: + +- `$AWS_FPGA_REPO_DIR/hdk/common/ip/cl_ip/cl_ip.ip_user_files/sim_scripts + <./../../../common/ip/cl_ip/cl_ip.ip_user_files/sim_scripts>`__ followed + by ``//.sh`` + +All verification work is located under the `verif <./verif>`__ +directory. Please see the `Verification <#verification>`__ section for +the CL_TEMPLATE verification details. + +STEP 4: Develop Software Tests (OPTIONAL) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +CL_TEMPLATE does not yet support standalone software tests. Please +refer to other examples such as `CL_DRAM_HBM_DMA +<./../cl_dram_hbm_dma/README.html#software>`__ + +STEP 5: Build and Deploy the Design +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Once design files have been added and tested, constraint and build +script updates need to be made. The build flow creates a bitstream that +is used to create an AFI to deploy on hardware. The build and deployment +flows can be found in the `Quick Start Guide +<./../../../README.html#getting-started>`__. Examples for all constraint files +and build scripts can be found in other examples such as +`CL_DRAM_HBM_DMA <./../cl_dram_hbm_dma/build>`__. + +1. Populate existing and/or add new constraint files to + `./build/constraints <./build/constraints>`__ + + - AWS has provided basic constraints required in example designs in + `$AWS_FPGA_REPO_DIR/hdk/common/shell_stable/build/constraints <./../../../common/shell_stable/build/constraints>`__ + +2. Update + `synth_CL_TEMPLATE.tcl <./build/scripts/synth_CL_TEMPLATE.tcl>`__ + with: + + - Additional constraint files to be applied during a build + - Additional tcl scripts to synthesize the design + - Xilinx IP's utilized in the design + + - IP's used in AWS example designs can uncommented be in + `synth_CL_TEMPLATE.tcl <./build/scripts/synth_CL_TEMPLATE.tcl>`__ + and found under + `$AWS_FPGA_REPO_DIR/hdk/common/ip/cl_ip <./../../../common/ip/cl_ip>`__ + - If a design adds new IP's, make sure to add the new ``xci`` files + to the build script + `$CL_DIR/build/scripts/synth_CL_TEMPLATE.tcl <./build/scripts/synth_CL_TEMPLATE.tcl>`__ + +3. Run `aws_build_dcp_from_cl.py <./build/scripts/aws_build_dcp_from_cl.py>`__. + All defaults can be found by running ``aws_build_dcp_from_cl.py --help`` + + .. code:: bash + + cd $AWS_FPGA_REPO_DIR/hdk/cl/examples/CL_TEMPLATE + export CL_DIR=$(pwd) + cd ${CL_DIR}/build/scripts + ./aws_build_dcp_from_cl.py -c CL_TEMPLATE + + The start of the log will provide build details: + + .. code:: bash + + ================================================== + Running CL builds + ================================================== + cl : cl_mem_perf + mode : xdma_shell + clock_recipe_a : A1 + clock_recipe_b : B2 + clock_recipe_c : C0 + clock_recipe_hbm : H2 + flow : BuildAll + place_direct : SSI_ExtraTimingOpt + phy_opt_direct : Explore + route_direct : AggressiveExplore + build_tag : None + ================================================== + vivado -mode batch -source build_all.tcl -log 04_06_2023-181511_build_all.log -tclargs SSI_ExtraTimingOpt Explore AggressiveExplore A1 B2 C0 H2 + + The build will create 4 new subdirectories under `./build <./build>`__: + - ``src_post_encryption`` - encrypted design files + - ``checkpoints`` - design checkpoints (``.dcp``) for each stage used by + Vivado + - ``reports`` - reports for each build stage + - ``bitstreams`` - CustomLogic bitstreams used for AFI creation + + Builds with timing violations will have a suffix of ``_VIOLATED`` under the + ``checkpoints`` directory. Details can be found under the ``reports`` + directory. + +After a successful build, you can follow the AFI creation, loading, and +testing instructions in the `Hardware Development Kit (HDK) top level document +<./../../../README.html#build-accelerator-afi-using-hdk-design-flow>`__. diff --git a/docs-rtd/source/hdk/cl/examples/cl_dram_hbm_dma/README.rst b/docs-rtd/source/hdk/cl/examples/cl_dram_hbm_dma/README.rst new file mode 100644 index 000000000..b788e48db --- /dev/null +++ b/docs-rtd/source/hdk/cl/examples/cl_dram_hbm_dma/README.rst @@ -0,0 +1,273 @@ +CL_DRAM_HBM_DMA CustomLogic Example +=================================== + +⚠️ **Features using XDMA engine are currently unsupported on F2 +instances** + +Table of Content +---------------- + +1. `Overview <#overview>`__ +2. `Functional Description <#functional-description>`__ +3. `Software <#software>`__ + +Overview +======== + +The CL_DRAM_HBM_DMA example demonstrates the use and connectivity for +many of the Shell/CL interfaces and functionality, including: + +1. Register access over OCL AXI-Lite interface + +2. Mapping of the external DRAM channel to instance memory via PCIe + AppPF BAR4, and the 512-bit ``sh_cl_dma_pcis_*`` AXI4 bus + +3. Mapping of HBM memory to instance memory via PCIe AppPF BAR4, and the + 512-bit ``sh_cl_dma_pcis_*`` AXI4 bus + +4. Debugging using Virtual JTAG and Xilinx Integrated Logic Analyzer (ILA) cores. + +5. User-defined interrupts + +6. ``cl_sh_pcim_*`` AXI4 traffic for Host memory accesses from CL + +System diagram +-------------- + +|cl_dram_hbm_dma| + +Functional Description +====================== + +Memory Interface +---------------- + +The cl_dram_hbm_dma demonstrates accessing 64GB of DDR memory and 16GB +of single channel HBM memory over the ``sh_cl_dma_pcis`` AXI4 bus. + +The CL provides access to the DDR memory through ``sh_ddr.sv`` which +consists of the DDR controller required to interact with the external +DDR DIMM on the FPGA card. The ``sh_ddr.sv`` is also connected to the +Shell's ``sh_cl_ddr_stat_*`` ports to enable Shell to manage DDR +calibration upon CL AFI loads. + +The CL also provides access to the on-chip HBM available in the FPGA. +The HBM IP is configured for dual stack 16GB capacity which exposes 32 +AXI3 (not AXI4) channels running on 450MHz clock. However, only one HBM +channel is being used in this example design to demonstrate datapath +connection to the HBM. The `cl_hbm_axi4.sv <./design/cl_hbm_axi4.sv>`__ +does the AXI4-to-AXI3 conversion, crosses clock domain between +the 250 MHz ``clk_main_a0`` and HBM's up to 450 MHz ``axi_clk`` for the datapath and feeds +the ``cl_hbm_wrapper.sv``. The +`cl_hbm_wrapper.sv <./design/cl_hbm_wrapper.sv>`__ instantiates the HBM +IP, houses MMCM to generate 450MHz interface clock, and connects the +datapath to Channel#0 of the HBM IP core. + +**NOTE:** Since the CL utilizes only one HBM Channel which is fed by +data source running at 250MHz clock, it does not accomplish the max +available bandwidth from HBM. For demonstration of the max performance from +HBM. refer to the `cl_mem_perf <../cl_mem_perf/README.html>`__ example. + +Design Changes +-------------- + +Individual controllers (DDR, HBM) can be enabled and disabled by simply +updating the appropriate defines in the +`cl_dram_hbm_dma_defines.vh `__ file. The +`sh_ddr.sv <../../../common/shell_stable/design/sh_ddr/sim/sh_ddr.sv>`__ +file contains the necessary logic to remove and tie-off appropriate +interfaces when the DDR controller is disabled. + +For the cl_dram_hbm_dma example memory ranges have been allocated for +DDR and HBM. So, if a particular memory is disabled, then the developer +should take care to handle transactions to that address range since +there will be no controller to respond to the request. The address +ranges for each controller is described below in the `dma_pcis AXI4 bus +section <#dma_pcis>`__. + +Test Changes +------------ + +If a particular controller is disabled, make sure that the test is not +accessing address space for that controller. + +Please look at `dma_pcis AXI4 bus section <#dma_pcis>`__ for address +ranges. + +If DDR is enabled, make sure that the DDRs are initialized using the +poke_stat commands below. + +eg: To initialize DDR + +.. code:: Verilog + + tb.poke_stat(.addr(8'h0c), .ddr_idx(0), .data(32'h0000_0000)); + +Make sure that the Host to Card and Card to Host DMA transfers only +access enabled DDR controller address space. + +dma_pcis AXI4 bus +----------------- + +sh_cl_dma_pcis exposes a address windows of 128GB matching AppPF BAR4. + +This memory space is mapped to the 64GB DRAM space and 16GB HBM space. +An axi_crossbar interconnects the incoming address requests to the +target memories as shown below: + +- DDR base_addr=0x00_0000_0000 (range=64GB) +- HBM base_addr=0x10_0000_0000 (range=16GB) + +**NOTE**: Please refer to +`Supported DDR Modes <./../../../docs/Supported_DDR_Modes.html>`__ for +details on supported DDR configurations in ``sh_ddr.sv``. + +ocl\_ AXI-Lite +-------------- + +The cl_ocl\_ AXI-Lite bus is connected to +`cl_ocl_slv.sv `__ module, and is used for +register access to the Automatic Test Generator (ATG) etc. + +The valid address map is as shown below: + +.. list-table:: + :header-rows: 1 + :class: user-guide-dev-envs-table + :widths: 10 15 15 60 + + * - Module + - OCL Start Address + - OCL End Address + - Description + * - PCIM ATG + - 0x0000 + - 0x00FF + - PCIM Traffic Generator (refer to ``cl_tst.sv``). + * - DDR ATG + - 0x0100 + - 0x01FF + - DDR Traffic Generator + * - HBM ATG + - 0x0200 + - 0x02FF + - HBM Traffic Generator + * - HBM Status + - 0x0300 + - 0x0300 + - + - bit[31:3] - Reserved (RO) + - bit[31:3] - Reserved (RO) + - bit[2:1] - HBM Initialized + - bit[0] - SW Reset for HBM. (1 = Reset HBM) + +Any access to invalid address shall return ``32'hDEADBEEF`` + +sda\_ AXI-Lite +-------------- + +The sh_cl_sda\_ AXI-Lite bus is connected to +`cl_sda_slv.sv `__ module, which provides 1KiB of +scratch RAM. + +Address bits [9:0] will be used to access the location of the RAM, but +the upper bits of the address are ignored. + +pcim\_ AXI4 +----------- + +The cl_sh_pcim\_ AXI4 bus is driven by Automatic Test Generator (ATG) +and connected to `cl_pcim_mstr.sv `__. It can be +used to read/write from the host memory. + +irq/ack +------- + +`cl_int_slv.sv `__ provides an example for +generating the IRQ requests and checks if ACK has been received. + +Virtual JTAG +------------ + +3 ILA cores are integrated, one to monitoring the sh_c_dma_pcis bus, one +to monitor the AXI4 signals on DDR and the third to monitor the AXI4 +signals on HBM. An example usage is provided in +`cl_ila.sv `__. An example usage for Xilinx VIO is +provided in `cl_vio.sv `__ + +Clocks +------ + +CL_DRAM_HBM_DMA uses the main ``clk_main_a0``. It's frequency is set in +`cl_clocks_aws.xdc <./build/constraints/cl_clocks_aws.xdc>`__ + +Software +-------- + +DMA accesses rely on the `XDMA +driver `__ + +The DRAM_HBM DMA example includes runtime software to demonstrate +working DMA accesses. The runtime example is located `in the runtime +directory `__ + +There are three example tests in cl_dram_hbm_dma example. + +.. _test_dram_dmac: + +test_dram_dma.c +~~~~~~~~~~~~~~~ + +This test runs a software test with data transfer with DDR enabled. + +.. _test_hbm_dmac: + +test_hbm_dma.c +~~~~~~~~~~~~~~ + +This test runs a software test with data transfer with HBM enabled. + +.. _test_dram_hbm_dmac: + +test_dram_hbm_dma.c +~~~~~~~~~~~~~~~~~~~ + +This test runs a software test with data transfer with both DDR and HBM +enabled + +Compile and run instructions +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. code:: bash + + cd ${CL_DIR}/software/runtime + make all + sudo ./test_dram_hbm_dma + +.. _test_dram_hbm_dma_hwsw_cosimc: + +test_dram_hbm_dma_hwsw_cosim.c +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This test runs a software test with HW/SW co-simulation enabled with +both DDR and HBM enabled. + +.. _compile-and-run-instructions-1: + +Compile and run instructions +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. code:: bash + + cd ${CL_DIR}/software/runtime + make TEST=test_dram_hbm_dma_hwsw_cosim + sudo ./test_dram_hbm_dma_hwsw_cosim + +The test can be simulated with XSIM as follows. + +.. code:: bash + + cd ${CL_DIR}/verif/scripts + make C_TEST=test_dram_hbm_dma_hwsw_cosim + +.. |cl_dram_hbm_dma| image:: ../../../../_static/cl_dram_hbm_dma_images/cl_dram_hbm_dma.png diff --git a/docs-rtd/source/hdk/cl/examples/cl_dram_hbm_dma/verif/README.rst b/docs-rtd/source/hdk/cl/examples/cl_dram_hbm_dma/verif/README.rst new file mode 100644 index 000000000..c471bbfe9 --- /dev/null +++ b/docs-rtd/source/hdk/cl/examples/cl_dram_hbm_dma/verif/README.rst @@ -0,0 +1,347 @@ +CL_DRAM_HBM_DMA Example Simulation +================================== + +Table of Contents +----------------- + +- `CL_DRAM_HBM_DMA Example + Simulation <#cl_dram_hbm_dma-example-simulation>`__ + + - `Table of Contents <#table-of-contents>`__ + - `Overview <#overview>`__ + - `Dump Waves <#dump-waves>`__ + - `SystemVerliog Tests <#systemverliog-tests>`__ + + - `test_clk_recipe.sv <#test_clk_recipesv>`__ + - `test_ddr_peek_poke.sv <#test_ddr_peek_pokesv>`__ + - `test_ddr.sv <#test_ddrsv>`__ + - `test_hbm.sv <#test_hbmsv>`__ + - `test_dram_dma.sv <#test_dram_dmasv>`__ + - `test_dram_dma_rnd.sv <#test_dram_dma_rndsv>`__ + - `test_dma_pcim_concurrent.sv <#test_dma_pcim_concurrentsv>`__ + - `test_dma_pcis_concurrent.sv <#test_dma_pcis_concurrentsv>`__ + - `test_dma_sda_concurrent.sv <#test_dma_sda_concurrentsv>`__ + - `test_dram_dma_4k_crossing.sv <#test_dram_dma_4k_crossingsv>`__ + - `test_dram_dma_allgn_addr_4k.sv <#test_dram_dma_allgn_addr_4ksv>`__ + - `test_dram_dma_single_beat_4k.sv <#test_dram_dma_single_beat_4ksv>`__ + - `test_dram_dma_axi_mstr.sv <#test_dram_dma_axi_mstrsv>`__ + - `test_int.sv <#test_intsv>`__ + - `test_peek_poke.sv <#test_peek_pokesv>`__ + - `test_peek_poke_wc.sv <#test_peek_poke_wcsv>`__ + - `test_peek_poke_len.sv <#test_peek_poke_lensv>`__ + - `test_peek_poke_rnd_lengths.sv <#test_peek_poke_rnd_lengthssv>`__ + - `test_peek_poke_pcis_axsize.sv <#test_peek_poke_pcis_axsizesv>`__ + - `test_ddr_peek_bdr_walking_ones <#test_ddr_peek_bdr_walking_ones>`__ + - `test_sda.sv <#test_sdasv>`__ + - `test_null.sv <#test_nullsv>`__ + + - `AXI_MEMORY_MODEL Mode + Simulations <#axi_memory_model-mode-simulations>`__ + + - `test_dram_dma_mem_model_bdr_wr <#test_dram_dma_mem_model_bdr_wr>`__ + - `test_dram_dma_mem_model_bdr_rd <#test_dram_dma_mem_model_bdr_rd>`__ + + - `DDR Backdoor Loading <#ddr-backdoor-loading>`__ + + - `HW/SW Co-Simulation Test <#hwsw-co-simulation-test>`__ + +Overview +-------- + +This readme provides information about the simulation environment for +the ``cl_dram_hbm_dma`` example. For more details about overall HDK +simulation environment and CL bringup in simulation please refer to the +`RTL Simulation Guide for HDK Design +Flow <../../../../docs/RTL_Simulation_Guide_for_HDK_Design_Flow.md>`__ + +SystemVerilog (SV) simulations can be run from the +``$CL_DIR/verif/scripts/`` directory with all supported simulators (HBM +simulation using VCS & QUESTA is strongly recommended). You can run +tests by calling the make target for that test located in +``$CL_DIR/verif/scripts/Makefile.tests``: + +.. code:: bash + + make test_ddr # Runs with XSIM by default + make test_ddr VCS=1 + make test_ddr QUESTA=1 + + make test_hbm # Runs with VCS by default + +Alternatively, you can run each test by setting ``TEST=\`` +followed by the environment variables required to run that test. + +.. code:: bash + + make TEST=test_dram_dma # Runs with XSIM by default + make TEST=test_dram_dma VCS=1 + make TEST=test_dram_dma QUESTA=1 + + # To Run simulations with a 64 GB DDR DIMM (with user-controlled auto-precharge mode) + make TEST=test_dram_dma USE_AP_64GB_DDR_DIMM=1 + + # To Run Simulations in AXI_MEMORY_MODEL mode + make TEST=test_dram_dma AXI_MEMORY_MODEL=1 # Runs with XSIM by default in AXI_MEMORY_MODEL mode + make TEST=test_dram_dma AXI_MEMORY_MODEL=1 VCS=1 + make TEST=test_dram_dma AXI_MEMORY_MODEL=1 QUESTA=1 + + # To Run DDR backdoor loading tests + make TEST=test_ddr_peek_bdr_walking_ones # Runs with XSIM by default + make TEST=test_ddr_peek_bdr_walking_ones VCS=1 + make TEST=test_ddr_peek_bdr_walking_ones QUESTA=1 + + # Backdoor loading test list. Description can be found in the sections below. + test_dram_dma_mem_model_bdr_rd + test_dram_dma_mem_model_bdr_wr + test_ddr_peek_bdr_walking_ones + +**NOTE**: Please refer to +`Supported_DDR_Modes.md <./../../../../docs/Supported_DDR_Modes.md>`__ +for details on supported DDR configurations. + +The HW/SW co-simulation tests can be run from the ``verif/scripts/`` +directory with all supported simulators: + +.. code:: bash + + make C_TEST=test_dram_dma_hwsw_cosim # Runs with XSIM by default + make C_TEST=test_dram_dma_hwsw_cosim VCS=1 + make C_TEST=test_dram_dma_hwsw_cosim QUESTA=1 + + # To Run in AXI_MEMORY_MODEL mode with AXI memory models instead of DDR. + + make C_TEST=test_dram_dma_hwsw_cosim AXI_MEMORY_MODEL=1 # Runs with XSIM by default + make C_TEST=test_dram_dma_hwsw_cosim AXI_MEMORY_MODEL=1 VCS=1 + make C_TEST=test_dram_dma_hwsw_cosim AXI_MEMORY_MODEL=1 QUESTA=1 + +Note that the appropriate simulators must be installed. + +Dump Waves +---------- + +For information about how to dump waves with XSIM or VCS, please refer +to +`debugging-custom-logic-using-the-aws-hdk <../../../../docs/RTL_Simulation_Guide_for_HDK_Design_Flow.md#>`__ + +SystemVerliog Tests +------------------- + +The SystemVerilog test cases are located at ``verif/tests/``. Most tests +include ``base_test_utils.svh`` which includes common signals and tasks +used across tests. Please refer to this file for the DPI-C tasks used. +Information about each test can be found below. + +.. _test_clk_recipesv: + +test_clk_recipe.sv +~~~~~~~~~~~~~~~~~~ + +This test programs valid clock recipes defined within and verifies the +corresponding clock frequencies. + +.. _test_ddr_peek_pokesv: + +test_ddr_peek_poke.sv +~~~~~~~~~~~~~~~~~~~~~ + +This does a walking ones test through the DDR address range. Also checks +if any of the bits are stuck at '0'. + +.. _test_ddrsv: + +test_ddr.sv +~~~~~~~~~~~ + +This test programs the CL_TST (ATG) to generate traffic to access all +four DDR channels. + +.. _test_hbmsv: + +test_hbm.sv +~~~~~~~~~~~ + +This test programs the CL_TST (ATG) to generate traffic to access both +HBM stacks. + +.. _test_dram_dmasv: + +test_dram_dma.sv +~~~~~~~~~~~~~~~~ + +Basic H2C and C2H DMA test through all 4 DDR channels and 2 HBM stacks. + +.. _test_dram_dma_rndsv: + +test_dram_dma_rnd.sv +~~~~~~~~~~~~~~~~~~~~ + +This test programs DMA transfers with random lengths. + +.. _test_dma_pcim_concurrentsv: + +test_dma_pcim_concurrent.sv +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This test programs both the DMA and PCIM traffic to run concurrently and +verifies that there are no errors on both DMA and PCIM interfaces. + +.. _test_dma_pcis_concurrentsv: + +test_dma_pcis_concurrent.sv +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This test programs both the DMA and PCIS traffic to run concurrently and +verifies that there are no errors on both DMA and PCIS interfaces. + +.. _test_dma_sda_concurrentsv: + +test_dma_sda_concurrent.sv +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This test programs both the DMA and SDA traffic to run concurrently and +verifies that there are no errors on both DMA and SDA interfaces. + +.. _test_dram_dma_4k_crossingsv: + +test_dram_dma_4k_crossing.sv +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This test programs DMA transfers that will cross a 4k boundary. All +transfers are of same length with different destination addresses. + +.. _test_dram_dma_allgn_addr_4ksv: + +test_dram_dma_allgn_addr_4k.sv +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This test programs DMA transfers that will cross a 4k boundary. All +transfers are of different length with different destination addresses. + +.. _test_dram_dma_single_beat_4ksv: + +test_dram_dma_single_beat_4k.sv +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This test programs single beat DMA transfers that will cross a 4k +boundary. + +.. _test_dram_dma_axi_mstrsv: + +test_dram_dma_axi_mstr.sv +~~~~~~~~~~~~~~~~~~~~~~~~~ + +This test configures the cl_dram_dma_axi_mstr.sv module to send and +receive traffic from the DDR in the CL design. + +.. _test_intsv: + +test_int.sv +~~~~~~~~~~~ + +This test programs enables interrupts in CL and verifies them. + +.. _test_peek_pokesv: + +test_peek_poke.sv +~~~~~~~~~~~~~~~~~ + +This test programs ATG in CL to do 128 byte PCIM reads and writes. + +.. _test_peek_poke_wcsv: + +test_peek_poke_wc.sv +~~~~~~~~~~~~~~~~~~~~ + +This test performs pcis write combine operations and reads back the +data. + +.. _test_peek_poke_lensv: + +test_peek_poke_len.sv +~~~~~~~~~~~~~~~~~~~~~ + +This test programs tester block to do PCIM reads and writes with +incremental lengths. + +.. _test_peek_poke_rnd_lengthssv: + +test_peek_poke_rnd_lengths.sv +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This test programs tester block to do PCIM reads and writes with random +lengths within valid range. + +.. _test_peek_poke_pcis_axsizesv: + +test_peek_poke_pcis_axsize.sv +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This test does PCIS peek and poke with different sizes. Although shell +model allows different size transfers on PCIS interface, Shell only +supports transfer of size 6 on PCIS interface. + +test_ddr_peek_bdr_walking_ones +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +DDR test which uses backdoor loading to populate DDR memory. The test +writes data(walking ones) for different addresses. The test backdoor +loads DDR memory and reads through frontdoor and checks that the data +matches. + +.. _test_sdasv: + +test_sda.sv +~~~~~~~~~~~ + +This test does transfers to different addresses on SDA AXIL interface. + +.. _test_nullsv: + +test_null.sv +~~~~~~~~~~~~ + +test_null is not an actual test. This is a base SV file needed for HW/SW +co-simulation + + + +AXI_MEMORY_MODEL Mode Simulations +--------------------------------- + +AXI_MEMORY_MODEL mode can be used for better simulation performance. +AXI_MEMORY_MODEL mode enables a test to run with AXI memory models +instead of DDR memory. The documentation can be found in AXI memory +model section at `RTL simulation +guide <../../../../docs/RTL_Simulation_Guide_for_HDK_Design_Flow.md>`__. +Any test that accesses DDR memory can be run in AXI_MEMORY_MODEL mode. +Below are some example tests for ECC and backdoor loading support +features of AXI memory model. + +test_dram_dma_mem_model_bdr_wr +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This test backdoor writes AXI memory model, reads through frontdoor and +checks that the data matches. + +test_dram_dma_mem_model_bdr_rd +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This test backdoor reads AXI memory model, writes through frontdoor and +checks that the data matches. + +DDR Backdoor Loading +-------------------- + +The description of DDR backdoor loading can be found in DDR backdoor loading +support section at `RTL simulation +guide <../../../../docs/RTL_Simulation_Guide_for_HDK_Design_Flow.md>`__. + +HW/SW Co-Simulation Test +------------------------ + +The software test with HW/SW co-simulation support +`test_dram_dma_hwsw_cosim.c <../software/runtime/test_dram_dma_hwsw_cosim.c>`__ +can be found at ``software/runtime/``. For Information about how HW/SW +co-simulation support can be added to a software test please refer to +"Code changes to enable HW/SW co-simulation" section in `RTL simulation +guide <../../../../docs/RTL_Simulation_Guide_for_HDK_Design_Flow.md>`__. diff --git a/docs-rtd/source/hdk/cl/examples/cl_mem_perf/README.rst b/docs-rtd/source/hdk/cl/examples/cl_mem_perf/README.rst new file mode 100644 index 000000000..8d2197bf8 --- /dev/null +++ b/docs-rtd/source/hdk/cl/examples/cl_mem_perf/README.rst @@ -0,0 +1,800 @@ +CL_MEM_PERF Custom Logic Example +================================ + +⚠️ **Features using XDMA engine are currently unsupported on F2 instances** + +Table of Content +---------------- + +- `CL_MEM_PERF Custom Logic + Example <#cl_mem_perf-custom-logic-example>`__ + + - `Table of Content <#table-of-content>`__ + +- `Introduction <#introduction>`__ +- `Architecture Overview <#architecture-overview>`__ + + - `Clocks and Reset <#clocks-and-reset>`__ + - `OCL <#ocl>`__ + - `PCIM <#pcim>`__ + - `PCIS <#pcis>`__ + - `DDR <#ddr>`__ + - `HBM <#hbm>`__ + - `SDA <#sda>`__ + - `Interrupts <#interrupts>`__ + - `Virtual JTAG <#virtual-jtag>`__ + +- `Address Space <#address-space>`__ + + - `OCL Address Space <#ocl-address-space>`__ + - `PCIS Memory Address Space <#pcis-memory-address-space>`__ + - `HBM Memory Address Space <#hbm-memory-address-space>`__ + - `CL_HBM_AXI4 Register Address + Space <#cl_hbm_axi4-register-address-space>`__ + - `SDA Memory Address Space <#sda-memory-address-space>`__ + +- `Simulations <#simulations>`__ +- `Software <#software>`__ + + - `test_hbm_perf32.c <#test_hbm_perf32c>`__ + - `test_dram_hbm_dma.c <#test_dram_hbm_dmac>`__ + - `test_hbm_perf32.c <#test_hbm_perf32c-1>`__ + - `test_aws_clk_gen.c <#test_aws_clk_genc>`__ + - `test_clk_freq.c <#test_clk_freqc>`__ + + - `Compile and run instructions <#compile-and-run-instructions>`__ + + - `test_dram_hbm_dma_hwsw_cosim.c <#test_dram_hbm_dma_hwsw_cosimc>`__ + + - `Compile and run instructions <#compile-and-run-instructions-1>`__ + +- `HBM Performance Tests <#hbm-performance-tests>`__ + + - `Instructions to run HBM Performance + Test <#instructions-to-run-hbm-performance-test>`__ + +Introduction +============ + +The CL_MEM_PERF is a customer reference design for F2 where the +objective is to demonstrate fine tuned data paths to HBM and DDR to +achieve maximum throughput to the memories. The example also +demonstrates datapath connectivity between Host, AWS Shell, Custom Logic +(CL) region in the FPGA, HBM and DDR DIMM on the FPGA card. Following +are the major highlights of CL_MEM_PERF design: + +1. Datapath to 64GB DDR and 16GB HBM through Shell's PCIS Interface. + DDR and HBM memories in the FPGFA are accessible from the Host on + PF0-BAR4, as well as from the DMA engine in the XDMA_SHELL. Both + these accesses show up as AXI4 transaction on PCIS interface which + ultimately reach the targeted memory. +2. Demonstrate the use of PCIM interface for applications where CL is + the PCIe Requester to the Host. This can also be used to test peak + PCIe transfer rates between Host and FPGA over PCIM interface. +3. Register access to various blocks through Shell's OCL interface. +4. 1KB BRAM accessible through Shell's SDA interface. +5. Supports user defined interrupts generated by the CL. +6. Demonstrate Virtual JTAG using debug cores and AMD Integrated Logic + Analyzers (ILA). +7. AXI4 Traffic Generators to test peak DDR4 performance. +8. HBM Performance Kernels to test peak HBM performance. This example + shows how the micro-architecture to saturate all 32 Channels of HBM, + achieve timing closure at 450MHz and achieve peak performance close + to the theoretical number described in `AMD/Xilinx HBM Userguide + `__ +9. Build scripts and constraints to create or manage pblock/placement + and timing constraints. +10. Software runtime tests to exercise max performance to the HBM, and + other tests to exercise DMA engine in the AWS Shell to perform data + transfers between the Host and CL. + +Overall, CL_MEM_PERF enables customers to quickly integrate their CL +accelerator designs to interface with various memories on the FPGA and +to use as reference to fine tune their CL performance. + +Architecture Overview +===================== + +Figure below shows an architectural overview of CL_MEM_PERF design: + +|cl_mem_perf| + +All interfaces in this CL example are accessible from the Host on the +PF/BARs as stated in the table below. Please See the `PCIe Memory Map +<../../../docs/AWS_Fpga_Pcie_Memory_Map.html>`__ for more details on bar sizes, +and `AWS Shell Interface Specification +<../../../docs/AWS_Shell_Interface_Specification.html>`__ for available +interfaces between the Shell and the CL. + +.. list-table:: + :header-rows: 1 + :class: user-guide-dev-envs-table + :widths: 30 5 5 + + * - Interface + - PF + - BAR + * - OCL + - 0 + - 0 + * - XDMA BAR (not an interface between Shell/CL) + - 0 + - 2 + * - PCIS + - 0 + - 4 + * - Reserved for AWS + - 1 + - 0 + * - Virtual JTAG + - 1 + - 2 + * - SDA + - 1 + - 4 + +Clocks and Reset +---------------- + +- clk_main_a0 (250 MHz) from Shell for majority of the design except for + HBM. +- rst_main_n from Shell sync'd to clk_main_a0. +- clk_hbm_ref (100 MHz) from Shell as reference clock for HBM IP. +- HBM AXI3 interface is clocked by the 450MHz clock generated from the + `AWS_CLK_GEN <./../../../common/lib/aws_clk_gen.sv>`__ IP. This IP also + generates several other clocks to match with the clock recipes supported in + F1. Please refer to the `AWS_CLK_GEN specifiction + <./../../../docs/AWS_CLK_GEN_spec.html>`__ for details on this block. The + `Clock Recipes User Guide <./../../../docs/Clock_Recipes_User_Guide.html>`__ + describes various clock recipes available for F2 developers and options on + configuring clocks dynamically. The user guide also describes porting + of CL designs based on F1 clock recipes into F2. +- NOTE: There is a SW control register at `OCL offset + 0x300 <#hbm-memory-address-space>`__ to reset only the HBM IP core. + This reset register does not reset the whole CL_HBM_AXI4 block. + +OCL +--- + +The `CL_MEM_OCL_DEC `__ module converts OCL +32-bit AXI-L Interface to simple config bus interface. It consists of an +address decoder to access register space of various blocks. See `OCL +Address Space <#ocl-address-space>`__ for available ranges. + +PCIM +---- + +The `CL_PCIM_MSTR <../cl_dram_hbm_dma/design/cl_pcim_mstr.sv>`__ module +is connected to the 512-bit AXI4 PCIM interface. It consists of AXI4 +Traffic Generator capable of issuing Read/Write requests to the Host +over the PCIe link. This block can also be used to test the peak PCIe +transfer rates across the PCIe link. + +While this block is essentially a traffic generator, CL designers could +potentially swap this block with their custom Kernel that acts as a PCIe +Requester to the Host Memory. + +PCIS +---- + +The PCIS is a 512-bit AXI4 interface from the Shell which can be +accessed either by Host over PF0-BAR4, or by the XDMA engine in the AWS +Shell. The PCIS interface is used in CL_MEM_PERF example to provide +datapaths to the DDR and HBM memories in the FPGA. The address range to +access DDR and HBM memories is described in `PCIS Memory Address +Space <#pcis-memory-address-space>`__. + +The `CL_AXI_MSTR <../cl_dram_hbm_dma/design/cl_dram_dma_axi_mstr.sv>`__ +module is another simple AXI4 traffic generator whose traffic pattern +and access length can be configured using the registers. The AXI4 +interface from CL_AXI_MSTR and PCIS feed to CL_AXI_INTERCONNECT which +ultimately connects to DDR and HBM based on the access address request. + +There are two MUXes - one along the datapath to DDR, and another MUX +along datapath to HBM. These MUXes default to connecting +CL_AXI_INTERCONNECT's path to the target memories. However, setting +these MUXes enables traffic from the ATGs to the target memories. PCIS +path to the target memories is disabled when the MUXes are enabled. + +DDR +--- + +AWS provides +`SH_DDR <../../../common/shell_stable/design/sh_ddr/synth/sh_ddr.sv>`__ +that houses the DDR4 Controller specifically configured to the DDR DIMM +on the FPGA Card. The SH_DDR is also connected to the Shell's +sh_cl_ddr_stat\_\* ports to enable Shell to manage DDR calibration upon +CL AFI loads. The SH_DDR exposes an AXI4 512-bit interface for the CL +logic to perform Read/Write data transfers into DDR. Please refer to the +`Supported DDR Modes <./../../../docs/Supported_DDR_Modes.html>`__ for +details on supported DDR configurations in ``sh_ddr.sv``. + +HBM +--- + +F2 FPGA has on-chip HBM with a maximum capacity of 16GiB, accessible +through 32 AXI3 Channels running at a maximum clock speed of up to +450MHz. CL designs should leverage all the available channels and aim +for achieving timing closure of the interface at 450MHz to get the best +possible performance out of HBM. HBM offers theoretical max bandwidth of +460GB/s when traffic is active across all the 32 Channels with 450MHz +clock. + +The `CL_HBM_AXI4 `__ module demonstrates an +use case for HBM traffic as shown in the block diagram below: + +|cl_hbm_kernel| + +CL_HBM_AXI4 exposes an AXI4 512-bit interface and two configuration +interfaces clocked using the 250MHz clk_main_a0. The Host (PCIS) can +access HBM through this AXI4 Interface. The AXI4 interface then connects +to 512-to-256 bit width converter, clock crossing converters between +clk_main_a0 and HBM's AXI3 clock, and +AXI4-to-AXI3 protocol converter to ultimately connect to HBM AXI Channel#0 + +The hbm_stat_bus is a simple config bus that connects to CL_HBM_WRAPPER +and facilitates access to the Reset Register inside the CL_HBM_WRAPPER +(mainly to reset HBM IP and check HBM read). + +The hbm_kern_cfg_bus is a simple config bus to configure the HBM +Performance Kernels (CL_HBM_PERF_KERNEL) + +In addition to providing a datapath from PCIS to HBM, the CL_HBM_AXI4 +block also instantiates CL_HBM_PERF_KERNEL which is designed to maximize +the available bandwidth from HBM. It demonstrates the microarchitecture +for Customer Kernels interfacing with HBM, supports multiple outstanding +transactions in the queue across all 32 channels, with AXI3 interface +running at 450MHz clock. This design provides clock domain crossing +mechanism, performance measurement counters along with floorplan and +timing constraints to achieve easier timing closure at 450 MHz. + +CL_HBM_PERF_KERNEL consists of the following blocks: + +- CL_KERNEL_CTL: This is the main controller for the Kernel. It is + responsible for posting write/read requests and track pending + transactions. The block is capable of producing write and read + requests in parallel to saturate all the channels of HBM. Keeping the + channels active is key for maximizing the available HBM bandwidth and + CL_KERNEL_CTL achieves that by arbitrating and issues multiple + outstanding requests. +- CL_KERNEL_REGS: Houses all the control and status registers including + performance measurement counters. +- CL_KERNEL_REQ: This block is instantiated inside CL_KERNEL_CTL and is + mainly responsible to perform Clock Domain Crossing of read/write + requests from clk_main_a0 to clk_hbm domain. This block is replicated + to server each channel of the HBM. +- CL_AXI_CTL: Contains the control logic and datapath required to serve + the AXI3 read/write requests to the HBM core. This module accepts + read/write requests from CL_KERNEL_REQ pipe and interface with HBM's + AXI3 interface. The entire block runs on clk_hbm domain. CL_AXI_CTL is + replicated for each HBM channel. Note that, the AXI3 interface for + channel#0 is muxed along with the AXI4 data path from the + hbm_axi4_bus. Users should enable this mux such that the traffic from + CL_AXI_CTL#0 drives into HBM Channel#0. Please see description for + details. +- While the data is produced/consumed locally in this specific design, + customers will be able to leverage the microarchitecture by feeding + the data to/from CL_KERNEL_REQ and interfacing it to their data + producer/consumer logic. + +CL_HBM_WRAPPER: + +- The CL_HBM_WRAPPER block houses the main HBM IP configured in 16GiB + capacity with 32- AXI3 Channels running at 450MHz clk_hbm clock. +- The hbm_stats_bus config interface provides access to reset the MMCM + and check if the HBM is ready. See registers in CL_HBM_AXI4 Register + Address Space for details. + +Please refer to `CL_HBM_AXI4 Register Address +Space <#cl-hbm-axi4-register-address-space>`__ for details on register address +space and HBM memory address space. + +SDA +--- + +The SDA interface is shared between two modules: + +1. The `CL_SDA_SLV <../cl_dram_hbm_dma/design/cl_sda_slv.sv>`__ module + provides access to a 1KB BRAM through SDA 32-bit AXI-L Interface. +2. The `AWS_CLK_GEN <./../../../common/lib/aws_clk_gen.sv>`__ module + generates all the required clocks for the design. Please refer to the + `AWS_CLK_GEN specifiction <./../../../docs/AWS_CLK_GEN_spec.html>`__ for + details on this block. The `Clock Recipes User + Guide <./../../../docs/Clock_Recipes_User_Guide.html>`__ describes + various clock recipes available for F2 developers and options on + configuring clocks dynamically. The user guide also describes porting + of CL designs based on F1 clock recipes into F2. + +Interrupts +---------- + +The `CL_INT_SLV <../cl_dram_hbm_dma/design/cl_int_tst.sv>`__ module +implements simple mechanism to trigger MSIX interrupts to the host over +sh_cl_apppf_irq_req/ack interface. SW can check the status of the +interrupt triggers and also configure the interrupt masks. The +``interrupt_example()`` routine in +`test_dram_hbm_dma.c <./software/runtime/test_dram_hbm_dma.c>`__ +demonstrates interrupts functionality. + +Virtual JTAG +------------ + +The `CL_ILA <../cl_dram_hbm_dma/design/cl_ila.sv>`__ instantiates the +Debug Bridge IP required to support Virtual JTAG and the two example +ILAs. One ILA snoops the PCIS bus, whereas second ILA snoops DDR-AXI4 +bus. + +Address Space +============= + +OCL Address Space +----------------- + +The OCL AXI-L is decoded into following address ranges for various +design blocks: + +.. list-table:: + :header-rows: 1 + :class: user-guide-dev-envs-table + :widths: 20 20 20 40 + + * - Module + - OCL Start Address + - OCL End Address + - Description + * - PCIM ATG + - 0x0000 + - 0x00FF + - PCIM AXI4 Traffic Generator + * - DDR ATG + - 0x0100 + - 0x01FF + - DDR AXI4 Traffic Generator + * - HBM ATG + - 0x0200 + - 0x02FF + - HBM AXI4 Traffic Generator + * - HBM Status + - 0x0300 + - 0x03FF + - Configure the CL_HBM_WRAPPER block + * - HBM Status + - 0x0300 + - 0x03FF + - Configure the CL_HBM_WRAPPER block + * - HBM Performance Kernels + - 0x0500 + - 0x05FF + - CL_AXI_MSTR block + * - Clock Frequency Measurement + - 0x0600 + - 0x06FF + - CL_CLK_FREQ block + * - Interrupt Generator + - 0x0D00 + - 0x0DFF + - CL_INT_SLV block + +PCIS Memory Address Space +------------------------- + +.. list-table:: + :header-rows: 1 + :class: user-guide-dev-envs-table + :widths: 10 10 10 10 + + * - Target Memory + - Start Address + - End Address + - Range + * - DDR + - 0x00_0000_0000 + - 0x0F_FFFF_FFFF + - 64 GB + * - HBM + - 0x10_0000_0000 + - 0x13_FFFF_FFFF + - 16 GB + +**NOTE**: Accessing memory beyond DDR and HBM's range can potentially corrupt +the data in either of the memories. + +HBM Memory Address Space +------------------------ + +HBM Memory Address Space is as shown in the `HBM User +Guide `__ +for 16GB capacity. Each CL_AXI_CTL instantiated in CL_HBM_PERG_KERNEL is +mapped to serve the address range defined for each channel in the HBM +user guide. For example: + +- Channel#0 \| Start Address = 0x0000_0000 \| End Address = 0x1FFF_FFFF +- Channel#1 \| Start Address = 0x2000_0000 \| End Address = 0x3FFF_FFFF + and so on... + +CL_HBM_AXI4 Register Address Space +---------------------------------- + +The table below describes the registers available in CL_HBM_AXI4 block. +This includes registers inside CL_HBM_WRAPPER and CL_KERNEL_REGS: + +.. list-table:: + :header-rows: 1 + :class: user-guide-dev-envs-table + :widths: 15 10 5 5 5 60 + + * - OCL Address offset + - Register Name + - Bits + - Access + - Default Value + - Description + * - 0x300 + - HBM_CTL_STATUS + - 31:3 + - RO + - 0x0 + - Reserved + * - + - + - 2:1 + - RO + - 0x0 + - + - 2'b00 : No initialized stack + - 2'b01 : HBM Stack#0 is initialized + - 2'b10 : HBM Stack#1 is initialized + - 2'b11 : HBM Stack#0 and Stack#1 are initialized. HBM is now ready to use. + * - + - + - 0 + - RW + - 0x0 + - 1'b1 : Reset HBM IP + * - 0x400 + - CHANNEL_AVAIL_REG + - 31:1 + - RW + - 0x0 + - Reserved + * - + - + - 0 + - RW + - 0x0 + - 1'b1 : Enable HBM Channel#0 MUX to drive AXI3 traffic from CL_AXI_CTL#0 + to HBM. NOTE: This bit must be set in order to use CL_HBM_PERF_KERNEL + * - 0x404 + - CHANNEL_AVAIL_REG + - 31:0 + - RO + - 0x20 + - Total number of HBM channels available for CL_HBM_PERF_KERNEL + * - 0x408 + - NUM_OT_REG + - 31:0 + - RO + - 0x0 + - Number of outstanding transactions supported + * - 0x40C + - CHNL_SEL_REG + - 31:0 + - RW + - 0x0 + - Select the Channel# to measure write and read latencies. This field is + 0-based. Max Value = 31. + * - 0x410 + - AXLEN_REG + - 31:0 + - RW + - 0x0 + - AWLEN/ARLEN to use. This field is 0-based and the value will be used to + drive axi_awlen and axi_arlen signals to HBM. + * - 0x414 + - WDATA_PATTERN_REG + - 31:0 + - RW + - 0x0 + - Initial 32-bit data pattern for writes + * - 0x418 + - WR_CTL_REG + - 31:0 + - RW + - 0x0 + - Start write transactions on each channel. Each bit corresponds to a HBM + channel. bit[0] = Start write transfers on HBM Channel#0. bit[1] = Start + write transfers on HBM Channel#1 ... bit[31] = Start write transfers on + HBM Channel#31 + * - 0x41C + - RD_CTL_REG + - 31:0 + - RW + - 0x0 + - Start read transactions on each channel. Each bit corresponds to a HBM + channel. bit[0] = Start read transfers on HBM Channel#0. bit[1] = Start + read transfers on HBM Channel#1 ... bit[31] = Start read transfers on + HBM Channel#31 + * - 0x430 + - WR_CYC_CNT_LO_REG + - 31:0 + - RW + - 0x0 + - Total number of write requests to HBM aggregated across all HBM channels. + LSB 32 bits. SW write 0 to clear. + * - 0x434 + - WR_CYC_CNT_HI_REG + - 31:0 + - RW + - 0x0 + - Total number of write requests to HBM aggregated across all HBM channels. + MSB 32 bits. SW write 0 to WR_CYC_CNT_LO_REG to clear this reg. + * - 0x438 + - WR_TIMER_LO_REG + - 31:0 + - RW + - 0x0 + - Timer during which Write requests were in progress. LSB 32 bits. + SW write 0 to clear. + * - 0x43C + - WR_TIMER_HI_REG + - 31:0 + - RW + - 0x0 + - Timer during which Write requests were in progress. MSB 32 bits. + SW write 0 to WR_TIMER_LO_REG to clear. + * - 0x440 + - WR_LATENCY_REG + - 31:0 + - RW + - 0x0 + - Measure latency between first AW request and B-response from HBM Channel + specified in CHNL_SEL_REG + * - 0x444 + - WR_OT_REG + - 31:0 + - RO + - 0x0 + - Pending write requests in the queue. + * - 0x448 + - BRESP_ERR_REG + - 31:0 + - RW + - 0x0 + - 1'b1 : Bresp error from HBM Channel# corresponding to that bit. + SW writes 0 to clear the bit + * - 0x450 + - RD_CYC_CNT_LO_REG + - 31:0 + - RW + - 0x0 + - Total number of Read requests to HBM aggregated across all HBM channels. + LSB 32 bits. SW write 0 to clear. + * - 0x454 + - RD_CYC_CNT_HI_REG + - 31:0 + - RW + - 0x0 + - Total number of Read requests to HBM aggregated across all HBM channels. + MSB 32 bits. SW write 0 to RD_CYC_CNT_LO_REG to clear this reg. + * - 0x458 + - RD_TIMER_LO_REG + - 31:0 + - RW + - 0x0 + - Timer during which Read requests were in progress. LSB 32 bits. + SW write 0 to clear. + * - 0x45C + - RD_TIMER_HI_REG + - 31:0 + - RW + - 0x0 + - Timer during which Read requests were in progress. MSB 32 bits. + SW write 0 to RD_TIMER_LO_REG to clear. + * - 0x460 + - RD_LATENCY_REG + - 31:0 + - RW + - 0x0 + - Measure latency between first AR request and R-last response from HBM + Channel specified in CHNL_SEL_REG + * - 0x464 + - RD_OT_REG + - 31:0 + - RO + - 0x0 + - Pending Read requests in the queue. + * - 0x468 + - RRESP_ERR_REG + - 31:0 + - RW + - 0x0 + - 1'b1 : Rresp error from HBM Channel# corresponding to that bit. + SW writes 0 to clear the bit + +SDA Memory Address Space +------------------------ + +.. list-table:: + :header-rows: 1 + :class: user-guide-dev-envs-table + :widths: 20 20 20 40 + + * - Target + - Start Address + - End Address + - Notes + * - SDA_SLV (BRAM) + - 0x0000_0000 + - 0x0004_FFFF + - 1KB BRAM. Upper address rolls over. + * - AWS_CLK_GEN + - 0x0050_0000 + - 0xFFFF_FFFF + - `AWS_CLK_GEN specifiction <./../../../docs/AWS_CLK_GEN_spec.html>`__ + +Simulations +=========== + +Please see more details on running simulations in this +`README `__ + +Software +======== + +DMA accesses rely on the `XDMA +driver `__ + +The CL_MEM_PERF example includes runtime software to demonstrate working +DMA accesses. The runtime example is located `in the runtime +directory `__ + +Following runtime tests are provided in the cl_mem_perf example: + +.. _test_hbm_perf32c: + +test_hbm_perf32.c +----------------- + +This test runs traffic and measure HBM performance aggregated across all +32 HBM Channels. + +.. _test_dram_hbm_dmac: + +test_dram_hbm_dma.c +------------------- + +This test runs a software test with data transfer with both DDR and HBM +enabled + +.. _test_hbm_perf32c-1: + +test_hbm_perf32.c +----------------- + +This test exercises all 32 HBM Channels using data transfers from +HBM_PERF_KERNEL. Achieves 400+ GB/s of writes and read performance. + +.. _test_aws_clk_genc: + +test_aws_clk_gen.c +------------------ + +This test uses `CL_CLK_FREQ `__ to measure the +clock frequencies from +`AWS_CLK_GEN <./../../../common/lib/aws_clk_gen.sv>`__ block + +.. _test_clk_freqc: + +test_clk_freq.c +--------------- + +This test uses AWS APIs to configure clock frequencies into +`AWS_CLK_GEN <./../../../common/lib/aws_clk_gen.sv>`__ block + +Compile and run instructions +---------------------------- + +.. code:: bash + + cd $CL_DIR/software/runtime + make all + sudo ./test_dram_hbm_dma + +.. _test_dram_hbm_dma_hwsw_cosimc: + +test_dram_hbm_dma_hwsw_cosim.c +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This test runs a software test with HW/SW co-simulation enabled with +both DDR and HBM enabled. + +.. _compile-and-run-instructions-1: + +Compile and run instructions +---------------------------- + +.. code:: bash + + cd $CL_DIR/software/runtime + make TEST=test_dram_hbm_dma_hwsw_cosim + sudo ./test_dram_hbm_dma_hwsw_cosim + +The test can be simulated with XSIM as follows. + +.. code:: bash + + cd $CL_DIR/verif/scripts + make C_TEST=test_dram_hbm_dma_hwsw_cosim + +HBM Performance Tests +===================== + +A runtime test is provided to measure HBM performance aggregated across +all 32 HBM Channels. The runtime test should be run on a real machine +consisting of F2 FPGA loaded with CL_MEM_PERF bitstreams. The runtime +test `test_hbm_perf32.c `__ +exercises `CL_HBM_PERF_KERNEL `__ module +to generate data across all 32 channels of the HBM running at 450MHz +speeds. The test configures to run traffic across all 32 channels. There +are config registers in CL_HBM_PERF_KERNEL that keep track of the number +of write/read requests that were serviced and timers during which the +CL_HBM_PERF_KERNEL was busy servicing the AXI3 Channels of HBM. The +runtime test reads these transaction counters to compute the aggregate +HBM performance across all the channels. + +Instructions to run HBM Performance Test +---------------------------------------- + +Run the following commands to start the runtime test + +.. code:: bash + + cd $CL_DIR/software/runtime + make all + sudo ./test_hbm_perf32 + +Sample output: + +.. code:: bash + + =================================================== + Running test_hbm_perf32 + =================================================== + slot_id = 0 + cfg_axlen = 0x0000000f + cfg_wdata = 0x12345678 + cfg_wr_ctl = 0xffffffff + cfg_rd_ctl = 0xffffffff + cfg_runtime = 0x0000001e + =================================================== + __INFO__: deassert_clk_resets() + __INFO__: initialize_hbm() + __INFO__: enable_hbm_kernl() + __INFO__: run_hbm_write_test() for 30s + __INFO__: run_hbm_read_test() for 30s + __INFO__: enable_hbm_kernl() + __INFO__: display_results() + __INFO__: ------------------------- + __INFO__: Write Performance Results + __INFO__: ------------------------- + __INFO__: calculate_perf() + __INFO__: WR CycCount = 0x00000005eaad0180 + __INFO__: WR Timer = 0x00000001bf0a2c29 + __INFO__: WR Latency = 172ns + __INFO__: WR Pending Txns = 0 + __INFO__: WR RespError = 0x00000000 + __INFO__: WR Bandwidth = 433.69 GBytes/s + __INFO__: ------------------------- + __INFO__: Read Performance Results + __INFO__: ------------------------- + __INFO__: calculate_perf() + __INFO__: RD CycCount = 0x00000005d0cad52f + __INFO__: RD Timer = 0x00000001bf0a8f0e + __INFO__: RD Latency = 280ns + __INFO__: RD Pending Txns = 0 + __INFO__: RD RespError = 0x00000000 + __INFO__: RD Bandwidth = 426.28 GBytes/s + 2023-01-24T18:13:21.555468Z, test_dram_hbm_dma, INFO, test_hbm_perf32.c +152: main(): TEST PASSED + +.. |cl_mem_perf| image:: ../../../../_static/cl_mem_perf_images/cl_mem_perf.png +.. |cl_hbm_kernel| image:: ../../../../_static/cl_mem_perf_images/cl_hbm_kernel.png diff --git a/docs-rtd/source/hdk/cl/examples/cl_mem_perf/verif/README.rst b/docs-rtd/source/hdk/cl/examples/cl_mem_perf/verif/README.rst new file mode 100644 index 000000000..11d8f3aa7 --- /dev/null +++ b/docs-rtd/source/hdk/cl/examples/cl_mem_perf/verif/README.rst @@ -0,0 +1,383 @@ +CL_MEM_PERF Example Simulation +============================== + +Table of Contents +----------------- + +- `CL_MEM_PERF Example Simulation <#cl_mem_perf-example-simulation>`__ + + - `Table of Contents <#table-of-contents>`__ + - `Overview <#overview>`__ + - `Dump Waves <#dump-waves>`__ + - `System Verilog Tests <#system-verliog-tests>`__ + + - `test_aws_clk_gen_recipe.sv (VCS and QUESTA + only) <#test_aws_clk_gen_recipesv-vcs-and-questa-only>`__ + - `test_clk_recipe.sv <#test_clk_recipesv>`__ + - `test_ddr_peek_poke.sv <#test_ddr_peek_pokesv>`__ + - `test_ddr.sv <#test_ddrsv>`__ + - `test_hbm.sv <#test_hbmsv>`__ + - `test_hbm_perf32.sv <#test_hbm_perf32sv>`__ + - `test_hbm_perf_kernel_cfg.sv <#test_hbm_perf_kernel_cfgsv>`__ + - `test_hbm_perf_random.sv <#test_hbm_perf_randomsv>`__ + - `test_dram_dma.sv <#test_dram_dmasv>`__ + - `test_dram_dma_rnd.sv <#test_dram_dma_rndsv>`__ + - `test_dma_pcim_concurrent.sv <#test_dma_pcim_concurrentsv>`__ + - `test_dma_pcis_concurrent.sv <#test_dma_pcis_concurrentsv>`__ + - `test_dma_sda_concurrent.sv <#test_dma_sda_concurrentsv>`__ + - `test_dram_dma_4k_crossing.sv <#test_dram_dma_4k_crossingsv>`__ + - `test_dram_dma_allgn_addr_4k.sv <#test_dram_dma_allgn_addr_4ksv>`__ + - `test_dram_dma_single_beat_4k.sv <#test_dram_dma_single_beat_4ksv>`__ + - `test_dram_dma_axi_mstr.sv <#test_dram_dma_axi_mstrsv>`__ + - `test_int.sv <#test_intsv>`__ + - `test_peek_poke.sv <#test_peek_pokesv>`__ + - `test_peek_poke_wc.sv <#test_peek_poke_wcsv>`__ + - `test_peek_poke_len.sv <#test_peek_poke_lensv>`__ + - `test_peek_poke_rnd_lengths.sv <#test_peek_poke_rnd_lengthssv>`__ + - `test_peek_poke_pcis_axsize.sv <#test_peek_poke_pcis_axsizesv>`__ + - `test_ddr_peek_bdr_walking_ones <#test_ddr_peek_bdr_walking_ones>`__ + - `test_sda.sv <#test_sdasv>`__ + - `test_null.sv <#test_nullsv>`__ + + - `AXI_MEMORY_MODEL Mode + Simulations <#axi_memory_model-mode-simulations>`__ + + - `test_dram_dma_mem_model_bdr_wr <#test_dram_dma_mem_model_bdr_wr>`__ + - `test_dram_dma_mem_model_bdr_rd <#test_dram_dma_mem_model_bdr_rd>`__ + + - `DDR Backdoor Loading <#ddr-backdoor-loading>`__ + + - `HW/SW Co-Simulation Test <#hwsw-co-simulation-test>`__ + +Overview +-------- + +This readme provides information about the simulation environment for +the ``cl_mem_perf`` example. For more details about overall HDK +simulation environment and CL bringup in simulation please refer to `RTL +Simulation Guide for HDK Design +Flow <../../../../docs/RTL_Simulation_Guide_for_HDK_Design_Flow.md>`__. + +The SystemVerilog (SV) simulation can be run from the +``$CL_DIR/verif/scripts/`` directory with all supported simulators (HBM +simulation using VCS & QUESTA is strongly recommended). You can run +tests by calling the make target for that test located in +``$CL_DIR/verif/scripts/Makefile.tests``: + +.. code:: bash + + make test_ddr # Runs with XSIM by default + make test_ddr VCS=1 + make test_ddr QUESTA=1 + + make test_hbm # Runs with VCS by default + +Alternatively, you can run each test by setting ``TEST=\`` +followed by the environment variables required to run that test. + +.. code:: bash + + make TEST=test_dram_dma # Runs with XSIM by default + make TEST=test_dram_dma VCS=1 + make TEST=test_dram_dma QUESTA=1 + + # To Run simulations with a 64 GB DDR DIMM # With user-controlled auto-precharge mode + make TEST=test_dram_dma USE_AP_64GB_DDR_DIMM=1 + + # To Run Simulations in AXI_MEMORY_MODEL mode + make TEST=test_dram_dma AXI_MEMORY_MODEL=1 # Runs with XSIM by default in AXI_MEMORY_MODEL mode + make TEST=test_dram_dma AXI_MEMORY_MODEL=1 VCS=1 + make TEST=test_dram_dma AXI_MEMORY_MODEL=1 QUESTA=1 + + # To Run DDR backdoor loading tests + make TEST=test_ddr_peek_bdr_walking_ones # Runs with XSIM by default + make TEST=test_ddr_peek_bdr_walking_ones VCS=1 + make TEST=test_ddr_peek_bdr_walking_ones QUESTA=1 + + # Backdoor loading test list. Description can be found in the sections below. + test_dram_dma_mem_model_bdr_rd + test_dram_dma_mem_model_bdr_wr + test_ddr_peek_bdr_walking_ones + +**NOTE**: Please refer to +`Supported_DDR_Modes.md <./../../../../docs/Supported_DDR_Modes.md>`__ +for details on supported DDR configurations. + +The HW/SW co-simulation tests can be run from the ``verif/scripts/`` +directory with all supported simulators: + +.. code:: bash + + make C_TEST=test_dram_dma_hwsw_cosim # Runs with XSIM by default + make C_TEST=test_dram_dma_hwsw_cosim VCS=1 + make C_TEST=test_dram_dma_hwsw_cosim QUESTA=1 + + # To Run in AXI_MEMORY_MODEL mode with AXI memory models instead of DDR. + make C_TEST=test_dram_dma_hwsw_cosim AXI_MEMORY_MODEL=1 (Runs with XSIM by default) + make C_TEST=test_dram_dma_hwsw_cosim AXI_MEMORY_MODEL=1 VCS=1 + make C_TEST=test_dram_dma_hwsw_cosim AXI_MEMORY_MODEL=1 QUESTA=1 + +Note that the appropriate simulators must be installed. + +Dump Waves +---------- + +For information about how to dump waves with XSIM or VCS, please refer +to +`debugging-custom-logic-using-the-aws-hdk <../../../../docs/RTL_Simulation_Guide_for_HDK_Design_Flow.md#debugging-custom-logic-using-the-aws-hdk>`__ + +System Verilog Tests +-------------------- + +The SystemVerilog tests are located at ``verif/tests/``. Most tests +include ``base_test_utils.svh`` which includes common signals and tasks +used across tests. Please refer to this file for the DPI-C tasks used. +Information about each test can be found below. + +.. _test_aws_clk_gen_recipesv-vcs-and-questa-only: + +test_aws_clk_gen_recipe.sv (VCS and QUESTA only) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This test programs valid clock recipes to the CL and verifies the +corresponding clock frequencies. + +.. _test_clk_recipesv: + +test_clk_recipe.sv +~~~~~~~~~~~~~~~~~~ + +This test programs valid clock recipes defined within and verifies the +corresponding clock frequencies. + +.. _test_ddr_peek_pokesv: + +test_ddr_peek_poke.sv +~~~~~~~~~~~~~~~~~~~~~ + +This does a walking ones test through the DDR address range. Also checks +if any of the bits are stuck at '0'. + +.. _test_ddrsv: + +test_ddr.sv +~~~~~~~~~~~ + +This test programs the CL_TST (ATG) to generate traffic to access all +four DDR channels. + +.. _test_hbmsv: + +test_hbm.sv +~~~~~~~~~~~ + +This test programs the CL_TST (ATG) to generate traffic to access both +HBM stacks. + +.. _test_hbm_perf32sv: + +test_hbm_perf32.sv +~~~~~~~~~~~~~~~~~~ + +This test programs the HBM performance kernel to run all 32 channels for +maximum bandwidth. The kernel collects timer and bandwidth statistics +and stores them in registers. At the end of the test, the performance is +calculated and printed in the ``sim.log``. + +.. _test_hbm_perf_kernel_cfgsv: + +test_hbm_perf_kernel_cfg.sv +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This test exercises each register in the HBM performance kernel +configuration space. + +.. _test_hbm_perf_randomsv: + +test_hbm_perf_random.sv +~~~~~~~~~~~~~~~~~~~~~~~ + +This test executes the same flow as ``test_hbm_perf32.sv`` except with a +random axi length and a random number of channels. + +.. _test_dram_dmasv: + +test_dram_dma.sv +~~~~~~~~~~~~~~~~ + +Basic H2C and C2H DMA test through all 4 DDR channels and 2 HBM stacks. + +.. _test_dram_dma_rndsv: + +test_dram_dma_rnd.sv +~~~~~~~~~~~~~~~~~~~~ + +This test programs DMA transfers with random lengths. + +.. _test_dma_pcim_concurrentsv: + +test_dma_pcim_concurrent.sv +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This test programs both the DMA and PCIM traffic to run concurrently and +verifies that there are no errors on both DMA and PCIM interfaces. + +.. _test_dma_pcis_concurrentsv: + +test_dma_pcis_concurrent.sv +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This test programs both the DMA and PCIS traffic to run concurrently and +verifies that there are no errors on both DMA and PCIS interfaces. + +.. _test_dma_sda_concurrentsv: + +test_dma_sda_concurrent.sv +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This test programs both the DMA and SDA traffic to run concurrently and +verifies that there are no errors on both DMA and SDA interfaces. + +.. _test_dram_dma_4k_crossingsv: + +test_dram_dma_4k_crossing.sv +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This test programs DMA transfers that will cross a 4k boundary. All +transfers are of same length with different destination addresses. + +.. _test_dram_dma_allgn_addr_4ksv: + +test_dram_dma_allgn_addr_4k.sv +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This test programs DMA transfers that will cross a 4k boundary. All +transfers are of different length with different destination addresses. + +.. _test_dram_dma_single_beat_4ksv: + +test_dram_dma_single_beat_4k.sv +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This test programs single beat DMA transfers that will cross a 4k +boundary. + +.. _test_dram_dma_axi_mstrsv: + +test_dram_dma_axi_mstr.sv +~~~~~~~~~~~~~~~~~~~~~~~~~ + +This test configures the cl_dram_dma_axi_mstr.sv module to send and +receive traffic from the DDR in the CL design. + +.. _test_intsv: + +test_int.sv +~~~~~~~~~~~ + +This test programs enables interrupts in CL and verifies them. + +.. _test_peek_pokesv: + +test_peek_poke.sv +~~~~~~~~~~~~~~~~~ + +This test programs ATG in CL to do 128 byte PCIM reads and writes. + +.. _test_peek_poke_wcsv: + +test_peek_poke_wc.sv +~~~~~~~~~~~~~~~~~~~~ + +This test performs pcis write combine operations and reads back the +data. + +.. _test_peek_poke_lensv: + +test_peek_poke_len.sv +~~~~~~~~~~~~~~~~~~~~~ + +This test programs tester block to do PCIM reads and writes with +incremental lengths. + +.. _test_peek_poke_rnd_lengthssv: + +test_peek_poke_rnd_lengths.sv +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This test programs tester block to do PCIM reads and writes with random +lengths within valid range. + +.. _test_peek_poke_pcis_axsizesv: + +test_peek_poke_pcis_axsize.sv +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This test does PCIS peek and poke with different sizes. Although shell +model allows different size transfers on PCIS interface, Shell only +supports transfer of size 6 on PCIS interface. + +test_ddr_peek_bdr_walking_ones +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +DDR test which uses backdoor loading to populate DDR memory. The test +writes data(walking ones) for different addresses. The test backdoor +loads DDR memory and reads through frontdoor and checks that the data +matches. + +.. _test_sdasv: + +test_sda.sv +~~~~~~~~~~~ + +This test does transfers to different addresses on SDA AXIL interface. + +.. _test_nullsv: + +test_null.sv +~~~~~~~~~~~~ + +test_null is not an actual test. This is a base SystemVerilog file +needed for HW/SW co-simulation + + +AXI_MEMORY_MODEL Mode Simulations +--------------------------------- + +AXI_MEMORY_MODEL mode can be used for better simulation performance. +AXI_MEMORY_MODEL mode enables a test to run with AXI memory models +instead of DDR memory. The documentation can be found in AXI memory +model section at `RTL simulation +guide <../../../../docs/RTL_Simulation_Guide_for_HDK_Design_Flow.md>`__. +Any test that accesses DDR memory can be run in AXI_MEMORY_MODEL mode. +Below are some example tests for ECC and backdoor loading support +features of AXI memory model. + +test_dram_dma_mem_model_bdr_wr +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This test backdoor writes AXI memory model, reads through frontdoor and +checks that the data matches. + +test_dram_dma_mem_model_bdr_rd +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This test backdoor reads AXI memory model, writes through frontdoor and +checks that the data matches. + +DDR Backdoor Loading +-------------------- + +The description of DDR backdoor loading can be found in DDR backdoor loading +support section at `RTL simulation +guide <../../../../docs/RTL_Simulation_Guide_for_HDK_Design_Flow.md>`__ + +HW/SW Co-Simulation Test +------------------------ + +The software test with HW/SW co-simulation support +`test_dram_dma_hwsw_cosim.c <../software/runtime/test_dram_dma_hwsw_cosim.c>`__ +can be found at ``software/runtime/``. For Information about how HW/SW +co-simulation support can be added to a software test please refer to +"Code changes to enable HW/SW co-simulation" section in `RTL simulation +guide <../../../../docs/RTL_Simulation_Guide_for_HDK_Design_Flow.md>`__ diff --git a/docs-rtd/source/hdk/cl/examples/cl_sde/README.rst b/docs-rtd/source/hdk/cl/examples/cl_sde/README.rst new file mode 100644 index 000000000..9919d3779 --- /dev/null +++ b/docs-rtd/source/hdk/cl/examples/cl_sde/README.rst @@ -0,0 +1,156 @@ +CL_SDE Custom Logic Example +=========================== + +⚠️ **NOTE: Please note that Virtual Ethernet/SDE is not supported by +Vitis (XRT)** + +Table of Contents +----------------- + +1. `Overview <#overview>`__ +2. `System Diagram <#system-diagram>`__ +3. `Functional Description <#functional-description>`__ +4. `Interfaces and Address Range <#interfaces-and-address-range>`__ +5. `Software <#software>`__ +6. `Metadata <#metadata>`__ + +Overview +-------- + +The CL_SDE example implements the FPGA custom logic used to generate the +AFI to demonstrate the `Virtual Ethernet Application +<../../../../sdk/apps/virtual-ethernet/doc/Virtual_Ethernet_Application_Guide.html>`__. +The CL_SDE demonstrates the following: + +1. Using the `Streaming Data Engine + <../../../../sdk/apps/virtual-ethernet/doc/SDE_HW_Guide.html>`__ + (SDE) IP Block in your custom logic. +2. Connectivity between the `Virtual Ethernet Application + <../../../../sdk/apps/virtual-ethernet/doc/Virtual_Ethernet_Application_Guide.html>`__ + and the SDE. +3. Connectivity between the Shell and the SDE. +4. Clocks and Resets for the SDE. +5. Floorplanning and Implementation with the SDE including pipelining + for AXI buses, resets etc. + +System Diagram +~~~~~~~~~~~~~~ + +|CL_SDE_Block_Diagram| + +Functional Description +---------------------- + +The following functionality is implemented in the CL_SDE - + +1. Capability to loopback from H2C and C2H. +2. Memory to store and read H2C packets for H2C functional testing +3. AXI Stream Traffic Generator for C2H functional and performance testing +4. AXI4 Traffic Generator for PCIM performance testing +5. Configuration and Reset generation logic. +6. Pipelining for PCIM and PCIS interfaces. + +See `SDE HW Guide <../../../../sdk/apps/virtual-ethernet/doc/SDE_HW_Guide.html>`__ +for details about the functional description of the SDE. + +Interfaces and Address Range +---------------------------- + +Interfaces +~~~~~~~~~~ + +CL_SDE uses three interfaces from the Shell. The PCIS interface is used +to provide connectivity between the `Virtual Ethernet Application +<../../../../sdk/apps/virtual-ethernet/doc/Virtual_Ethernet_Application_Guide.html>`__ +and the SDE. The OCL interface is used to provide connectivity between +the host and all the test/control/utility blocks (except the SDE). The +PCIM interfaces is used by the SDE to read and write to host memory. + +Address Range +~~~~~~~~~~~~~ + +PCIS +^^^^ + +.. list-table:: + :header-rows: 1 + :class: user-guide-dev-envs-table + :widths: 20 20 40 + + * - Low Address + - High Address + - Description + * - 0x00_0000_0000 + - 0x00_0000_3FFF + - `SDE HW Guide <../../../../sdk/apps/virtual-ethernet/doc/SDE_HW_Guide.html>`__ + * - 0x00_0000_4000 + - 0x1F_FFFF_FFFF + - Unused + +OCL +^^^ + +.. list-table:: + :header-rows: 1 + :class: user-guide-dev-envs-table + :widths: 20 20 40 + + * - Low Address + - High Address + - Description + * - 0x0000_0000 + - 0x0000_017F + - AXI-Stream Automatic Traffic Generator + * - 0x0000_0180 + - 0x0000_0FFF + - Loopback Block + * - 0x0000_1000 + - 0x0000_10FF + - Unused + * - 0x0000_1100 + - 0x0000_11FF + - AXI4 Automatic Traffic Generator + * - 0x0000_1200 + - 0x0000_1FFF + - Unused + * - 0x0000_2000 + - 0x0000_2FFF + - CL Reset and Control + * - 0x0000_3000 + - 0x0200_0000 + - Unused + +Software +-------- + +The software is provided as part of the `Virtual Ethernet Application +<../../../../sdk/apps/virtual-ethernet/doc/Virtual_Ethernet_Application_Guide.html>`__. + +Metadata +-------- + +The following table displays information about the CL that is required +to register it as an AFI with AWS. Alternatively, you can directly use a +pre-generated AFI for this CL. + +.. list-table:: + :header-rows: 1 + :class: user-guide-dev-envs-table + :widths: 30 30 + + * - Key + - Value + * - Shell Version + - 0x10212415 + * - PCI Device ID + - 0xF002 + * - PCI Vendor ID + - 0x1D0F (Amazon) + * - PCI Subsystem ID + - 0x1D51 + * - PCI Subsystem Vendor ID + - 0xFEDC + * - Pre-generated AGFI ID + - agfi-0925b211f5a81b071 + +.. |CL_SDE_Block_Diagram| image:: ../../../../_static/cl_sde_images/CL_SDE_Block_Diagram.jpg diff --git a/docs-rtd/source/hdk/cl/examples/cl_sde/verif/README.rst b/docs-rtd/source/hdk/cl/examples/cl_sde/verif/README.rst new file mode 100644 index 000000000..a0793a50f --- /dev/null +++ b/docs-rtd/source/hdk/cl/examples/cl_sde/verif/README.rst @@ -0,0 +1,52 @@ +SDE CL Example Simulation +========================= + +Table of Contents +----------------- + +- `SDE CL Example Simulation <#sde-cl-example-simulation>`__ + + - `Table of Contents <#table-of-contents>`__ + - `Overview <#overview>`__ + - `Dump Waves <#dump-waves>`__ + +Overview +-------- + +This readme provides information about the simulation environment for +the ``cl_sde`` example. For more details about overall HDK simulation +environment and CL bringup in simulation please refer to `RTL Simulation +Guide for HDK Design +Flow <../../../../docs/RTL_Simulation_Guide_for_HDK_Design_Flow.md>`__. + +The system verilog simulation tests can be run from the +``$CL_DIR/verif/scripts/`` directory with all supported simulators. You +can run each test by setting ``TEST=\``. + +.. code:: bash + + cd aws-fpga + source hdk_setup.sh + cd hdk/cl/examples/cl_sde + export CL_DIR=$(pwd) + cd ${CL_DIR}/verif/scripts + +Run the tests + +.. code:: bash + + make TEST=test_simple_h2c (Runs with XSIM by default) + make TEST=test_simple_c2h (Runs with XSIM by default) + + make TEST=test_simple_h2c VCS=1 + make TEST=test_simple_c2h VCS=1 + + make TEST=test_simple_h2c QUESTA=1 + make TEST=test_simple_c2h QUESTA=1 + +Dump Waves +---------- + +For information about how to dump waves with XSIM or VCS, please refer +to +`debugging-custom-logic-using-the-aws-hdk <../../../../docs/RTL_Simulation_Guide_for_HDK_Design_Flow.md#debugging-custom-logic-using-the-aws-hdk>`__ diff --git a/docs-rtd/source/hdk/docs/AWS_CLK_GEN_spec.rst b/docs-rtd/source/hdk/docs/AWS_CLK_GEN_spec.rst new file mode 100644 index 000000000..d04e78b2b --- /dev/null +++ b/docs-rtd/source/hdk/docs/AWS_CLK_GEN_spec.rst @@ -0,0 +1,505 @@ +AWS_CLK_GEN - CL Clock Generator +====================================== + +Table of Contents +----------------- + +- `AWS_CLK_GEN - CL Clock Generator <#aws_clk_gen---cl-clock-generator>`__ + + - `Table of Contents <#table-of-contents>`__ + - `Introduction <#introduction>`__ + - `Architecture Overview <#architecture-overview>`__ + - `Clock and Reset <#clock-and-reset>`__ + - `Ports Description <#ports-description>`__ + - `Address Space <#address-space>`__ + - `Register Definitions <#register-definitions>`__ + - `Clock Recipes User Guide <#clock-recipes-user-guide>`__ + - `Implementation Example <#implementation-example>`__ + +Introduction +------------ + +F1 Shell provides eight clocks to the CL and supports multiple `clock +recipes `__ +to choose from at the time of CL builds. It also allows to scale clock +frequencies during runtime (or after AFI/bitstream is loaded into FPGA) +using +`dynamic_clock_config `__. +While this architecture provides multiple clock choices for customer +designs, it locks up the global clock routing resources in the CL +region. This can pose limitations for customers who do not require all +the clocks provided from Shell to the CL. + +Therefore, F2 Shell provides only two clocks - ``clk_main_a0`` and +``clk_hbm_ref`` - to the CL resulting in efficient use of global routing +resources. The ``clk_main_a0`` is currently a fixed frequency 250MHz +clock (❗ dynamic scaling of frequency as F1 using the SW APIs will be added +in a future release). The ``clk_hbm_ref`` is a fixed frequency 100MHz clock +which can be used by customer as a reference clock for their MMCMs. This scheme +provides flexibility for customers to devise their own clocking mechanisms with +desired number of clocks. + +In order to provide F1’s clock recipes in F2, as well as support Vitis +development in F2, AWS offers the Clock Generator +(AWS_CLK_GEN) IP. AWS_CLK_GEN provides various clocks to the CL design +and supports dynamic frequency scaling. The Vitis XSA for F2 relies on +AWS_CLK_GEN for all the clocking needs in the design. This document +details the Microarchitecture Specification for AWS_CLK_GEN. + +⚠️ The AWS_CLK_GEN instantiation **must** be named to +``AWS_CLK_GEN`` and located in the CL top module. + +⚠️ The AWS_CLK_GEN is optional for CL designs that do not require +same clocking scheme as F1. This IP is not required if the CL designs +use only ``clk_main_a0`` and/or ``clk_hbm_ref``. + +Architecture Overview +--------------------- + +Figure 1 below shows an overview of the AWS_CLK_GEN IP. It primarily +consists of the following: + +1. MMCMs to generate desired clocks. The clocks are grouped together and + are generated by specific MMCM assigned to that clock group. Please + refer to + `PG065-Clocking-Wizard-v6.0-LogiCORE-IP-Product-Guide `__ + for MMCM details. + +2. AWS_CLK_REGS houses few AWS specific Control and Status Registers for + the IP. This block is also responsible for driving various resets to + the customer design. + +3. AXI-Lite address decoder. + +4. AXI-Lite clock converter. + +5. AXI-Lite interface to connect to the AWS Shell or user defined + address space. + +|aws_clk_gen| + +Clock and Reset +--------------- + +The AWS_CLK_GEN IP requires following primary clocks and resets as +inputs: + +1. clk_hbm_ref : This is fixed frequency 100MHz clock from the Shell. + This is used as primary clock for the entire IP including the MMCMs + and AWS_REGS. +2. clk_main_a0 : This is interface clock from Shell whose frequency is + scaled by the Shell but maxes out at 250MHz. +3. rst_main_n : Active low reset from Shell. + +Ports Description +----------------- + +.. list-table:: + :header-rows: 1 + :class: user-guide-dev-envs-table + :widths: 20 30 50 + + * - Port Name + - Direction + - Description + * - i_clk_hbm_ref + - input + - HBM ref clock from the Shell. Fixed frequency of 100MHz. + * - i_clk_main_a0 + - input + - clk_main_a0 from the Shell. + * - i_rst_main_n + - input + - rst_main_n from the Shell sync'ed to clk_main_a0 + * - s_sh_cl_cctrl_axil + - AXI-L Consumer interface + - AXI-Lite interface to access address space of the IP. Recommend connecting + this interface to AXI-Lite on PF1-BAR4 from the Shell. + * - clk_hbm_ref + - output + - Pass-through of input clk_hbm_ref from the Shell. + * - clk_main_a0 + - output + - Pass-through of input clk_main_a0 from the Shell. + * - clk_extra_a1 + - output + - Max frequency = 125 MHz + * - clk_extra_a2 + - output + - Max frequency = 375 MHz + * - clk_extra_a3 + - output + - Max frequency = 500 MHz + * - clk_extra_b0 + - output + - Max Frequency = 450 MHz | Used by Vitis as ap_clk0 + * - clk_extra_b1 + - output + - Max Frequency = 225 + * - clk_extra_c0 + - output + - Max Frequency = 300 MHz | used by Vitis as ap_clk1 + * - clk_extra_c1 + - output + - Max Frequency = 400 MHz + * - clk_hbm_axi + - output + - Max Frequency = 450 MHz + * - cl_rst_main_n + - output + - rst_main_n sync'ed to clk_main_a0 and controlled by SYS_RST + * - cl_rst_a1_n + - output + - rst_main_n sync'ed to clk_extra_a1 and controlled by SYS_RST + * - cl_rst_a2_n + - output + - rst_main_n sync'ed to clk_extra_a2 and controlled by SYS_RST + * - cl_rst_a3_n + - output + - rst_main_n sync'ed to clk_extra_a3 and controlled by SYS_RST + * - cl_rst_b0_n + - output + - rst_main_n sync'ed to clk_extra_b0 and controlled by SYS_RST + * - cl_rst_b1_n + - output + - rst_main_n sync'ed to clk_extra_b1 and controlled by SYS_RST + * - cl_rst_c0_n + - output + - rst_main_n sync'ed to clk_extra_c0 and controlled by SYS_RST + * - cl_rst_c1_n + - output + - rst_main_n sync'ed to clk_extra_c1 and controlled by SYS_RST + * - cl_rst_hbm_ref_n + - output + - rst_main_n sync'ed to clk_hbm_ref and controlled by SYS_RST + * - cl_rst_hbm_axi_n + - output + - rst_main_n sync'ed to clk_hbm_axi and controlled by SYS_RST + +Address Space +------------- + +The AXI-Lite address space is decoded as shown in the table below: + +.. list-table:: + :header-rows: 1 + :class: user-guide-dev-envs-table + :widths: 10 10 5 5 70 + + * - Address Start + - Address End + - Size + - Decode + - Description + * - 0x0005_2000 + - 0x0005_2FFF + - 4KB + - BASE_A + - MMCM registers for clock group A. See + `Example-for-Dynamic-Reconfiguration-through-AXI4-Lite `__ + * - 0x0005_0000 + - 0x0005_0FFF + - 4KB + - BASE_B + - MMCM registers for clock group B. See + `Example-for-Dynamic-Reconfiguration-through-AXI4-Lite `__ + * - 0x0005_1000 + - 0x0005_1FFF + - 4KB + - BASE_C + - MMCM registers for clock group C. See + `Example-for-Dynamic-Reconfiguration-through-AXI4-Lite `__ + * - 0x0005_4000 + - 0x0005_4FFF + - 4KB + - BASE_HBM + - MMCM registers for HBM interface clock. See + `Example-for-Dynamic-Reconfiguration-through-AXI4-Lite `__ + * - 0x0005_8000 + - 0x0005_8FFF + - 4KB + - BASE_REG + - Address space for AWS specific registers in AWS_CLK_REGS. + +**NOTES**: + +1. Refer to the ``_clkgen`` CLIs in `FPGA Management + Tools <./../../sdk/userspace/fpga_mgmt_tools/README.md>`__ for + setting the output clock frequencies of AWS_CLK_GEN IP. + +2. Write access to undefined address space is ignored. Reading from + undefined address space returns 0xDEAD_DEC0. Reading from undefined + address space within MMCM results in MMCM’s default behavior. + AWS_CLK_GEN IP does not have any protection against illegal use of + MMCMs. User discretion is recommended regarding such accesses. + +Register Definitions +-------------------- + +Following registers are housed inside AWS_CLK_REGS component and are +accessible from the AXIL interface from base address = ``BASE_REG`` as +described in `Address Space <#ancAddressSpace>`__ + +.. list-table:: + :header-rows: 1 + :class: user-guide-dev-envs-table + :widths: 10 10 5 5 10 60 + + * - Address Offset + - Register Name + - Bits + - Access + - Default Value + - Description + * - 0x00 + - ID_REG + - 31:0 + - RO + - 0x9048_1D0F + - 32-bit value to uniquely identify the AWS_CLK_GEN IP + * - 0x04 + - VER_REG + - 31:0 + - RO + - 0x0201_0000 + - Version Register + * - 0x08 + - BUILD_REG + - 31:0 + - RO + - 0x0923_2223 + - build timestamp in 0xMM_DD_YY_HH format + * - 0x0C + - CLKS_AVAIL_REG + - 31:9 + - RO + - 0x0 + - Reserved + * - + - + - 8 + - RO + - 0x1 + - 1 = clk_hbm_axi available | 0 = clock unavailable + * - + - + - 7 + - RO + - 0x1 + - 1 = clk_extra_c1 available | 0 = clock unavailable + * - + - + - 6 + - RO + - 0x1 + - 1 = clk_extra_c0 available | 0 = clock unavailable + * - + - + - 5 + - RO + - 0x1 + - 1 = clk_extra_b1 available | 0 = clock unavailable + * - + - + - 4 + - RO + - 0x1 + - 1 = clk_extra_b0 available | 0 = clock unavailable + * - + - + - 3 + - RO + - 0x1 + - 1 = clk_extra_a3 available | 0 = clock unavailable + * - + - + - 2 + - RO + - 0x1 + - 1 = clk_extra_a2 available | 0 = clock unavailable + * - + - + - 1 + - RO + - 0x1 + - 1 = clk_extra_a1 available | 0 = clock unavailable + * - + - + - 0 + - RO + - 0x1 + - 1 = clk_main_a0 available | 0 = clock unavailable + * - 0x10 + - G_RST_REG + - 31:0 + - RW + - 0x0 + - Write 0xFFFF_FFFF to globally reset the AWS_CLK_GEN IP. Following blocks + are affected: + - Assert reset to all MMCMs. + - Assert reset to SYS_RST and its output to CL. + Write 0x0000_0000 to de-assert global resets + * - 0x14 + - SYS_RST_REG + - 31:10 + - RW + - 0xFF + - Reserved + * - + - + - 9 + - RW + - 0x1 + - 1 = Assert reset on cl_rst_hbm_axi_n + * - + - + - 8 + - RW + - 0x1 + - 1 = Assert reset on cl_rst_hbm_ref_n + * - + - + - 7 + - RW + - 0x1 + - 1 = Assert reset on cl_rst_c1_n + * - + - + - 6 + - RW + - 0x1 + - 1 = Assert reset on cl_rst_c0_n + * - + - + - 5 + - RW + - 0x1 + - 1 = Assert reset on cl_rst_b1_n + * - + - + - 4 + - RW + - 0x1 + - 1 = Assert reset on cl_rst_b0_n + * - + - + - 3 + - RW + - 0x1 + - 1 = Assert reset on cl_rst_a3_n + * - + - + - 2 + - RW + - 0x1 + - 1 = Assert reset on cl_rst_a2_n + * - + - + - 1 + - RW + - 0x1 + - 1 = Assert reset on cl_rst_a1_n + * - + - + - 0 + - RW + - 0x1 + - 1 = Assert reset on cl_rst_main_n. NOTE: cl_rst_main_n is deasserted by default + * - + - + - + - + - + - NOTE: This register takes effect only if G_RST_REG = 0 + * - 0x18 + - DIS_RST_MAIN_REG + - 0 + - RW + - 0x0 + - Reserved + * - + - + - 31:1 + - RO + - 0x0 + - 1 = Disable rst_main_n from asserting resets in SYS_RST block. i.e rst_main_n no longer affects the reset outputs from SYS_RST block + * - 0x20 + - MMCM_LOCK_REG + - 31:9 + - RO + - 0x0 + - Reserved + * - + - + - 8 + - RO + - 0x0 + - 1 = MMCM_BASE_HBM locked + * - + - + - 7 + - RO + - 0x0 + - Reserved + * - + - + - 6 + - RO + - 0x0 + - 1 = MMCM_BASE_C locked + * - + - + - 5 + - RO + - 0x0 + - Reserved + * - + - + - 4 + - RO + - 0x0 + - 1 = MMCM_BASE_B locked + * - + - + - 3 + - RO + - 0x0 + - Reserved + * - + - + - 2 + - RO + - 0x0 + - Reserved + * - + - + - 1 + - RO + - 0x0 + - Reserved + * - + - + - 0 + - RO + - 0x0 + - 1 = MMCM_BASE_A locked + +**NOTE**: Write access to undefined address space is ignored. Reading from +undefined address space returns ``0xDEAD_DEC0``. + +Clock Recipes User Guide +------------------------ + +The `Clock Recipes User Guide <./Clock_Recipes_User_Guide.html>`__ +describes various clock recipes available for F2 developers and build +options support in the HDK development environment. The user guide also +describes porting of CL designs based on F1 clock recipes into F2. + +Implementation Example +---------------------- + +Usage of the AWS_CLK_GEN IP is fully demonstrated in the +`cl_mem_perf <../cl/examples/cl_mem_perf/README.html>`__ example. Please +refer to that example for more details. + +.. |aws_clk_gen| image:: ./../../_static/aws_clk_gen.png diff --git a/docs-rtd/source/hdk/docs/AWS_Fpga_Pcie_Memory_Map.rst b/docs-rtd/source/hdk/docs/AWS_Fpga_Pcie_Memory_Map.rst new file mode 100644 index 000000000..46f7cba55 --- /dev/null +++ b/docs-rtd/source/hdk/docs/AWS_Fpga_Pcie_Memory_Map.rst @@ -0,0 +1,102 @@ +AWS FPGA PCIe Memory Map +======================== + +FPGAs are PCIe-attached to an AWS EC2 instance. Each FPGA slot presents +a single FPGA with two PCIe Physical Functions (PFs), each with multiple +PCIe Base Address Registers (BARs) as defined in the `AWS Shell +Specification <./AWS_Shell_Interface_Specification.html>`__. + +This document describes the size and attributes of each BAR. Even though +all of these PCIe BARs are mapped to the EC2 Instance memory-mapped I/O +(MMIO) space, they need to be mapped to the Linux kernel or a userspace +application before accessing them. + +Memory Map per Slot +------------------- + +.. code:: text + + --- FPGA Slot X + |--- Application PF (AppPF) + | |-- BAR0 + | | * 64-bit, prefetchable + | | * 64MiB (0x000_0000 to 0x3FF_FFFF) + | | * Mapped to the OCL AXI-lite interface of CL + | | * Typically used for CL application registers or OpenCL kernels + | | + | |-- BAR2 + | | * 64-bit, prefetchable + | | * 64KiB (0x0000 to 0xFFFF) + | | * Not mapped to CL. + | | * Used by internal DMA inside the Shell + | | + | |-- BAR4 + | * 64-bit, prefetchable + | * 128GiB (0x00_0000_0000 to 0x1F_FFFF_FFFF) + | * Mapped to the PCIS AXI4 interface of CL + | * Typically used for DMA traffic bewteen the host and HBM/DDR memories on the card + | + |--- Management PF (MgmtPF) + |-- BAR0 + | * 64-bit, prefetchable + | * 16KiB (0x0000 to 0x3FFF) + | * Not mapped to CL + | * Used by the FPGA management tools + | + |-- BAR2 + | * 64-bit, prefetchable + | * 16KiB (0x0000 to 0x3FFF) + | * Not mapped to CL + | * Used by the FPGA management tools + | + |-- BAR4 + * 64-bit BAR, prefetchable + * 4MiB (0x00_0000 to 0x3F_FFFF) + * Mapped to the SDA AXI-lite interface of CL + * Could be used by developer applications, AWS CL clock generator , or if using the AWS Runtime Environment (like SDAccel case), it will be used for performance monitoring. + +Prefetchable BAR Setting +------------------------ + +The F2 shell is configured with all the Base Address Registers (BARs) in +the host PCIe endpoint as prefetchable. Prefetchable BARs allow the use +of optimization techniques like prefetching, write-combining (also +referred to as write-merging) to improve the BAR-access performance. To +take advantage of that, customers must ensure the logic mapped to a +prefetchable BAR complies with the PCIe specification (see section +7.5.1.2.1 for details). This design choice was carefully considered to +allow F2, a general-purpose accelerator platform, to be easily +integrated with a wide range of customer acceleration applications. +Customers who do not require these optimizations can still access +prefetchable BARs in a non-prefetchable way without penalty or side +effect. + +Marking a PCIe BAR as prefetchable or non-prefetchable is a hardware +design decision driven by providing maximum flexibility to the software +because the configuration cannot be modified by the customer. AWS offers +this flexibility to F2 customers by advertising all the BARs in the +shell as prefetchable. Customer applications must access BARs in a way +supported by the customer logic (CL). For example, enabling +write-combining on a prefetchable BAR requires a custom kernel driver or +application to map and mark the target memory space as `write-combining +(WC) +memory `__. +Additionally, applications enabling prefetching should avoid caching +data from a memory space that contains any clear-on-read registers or +FIFOs. + +The PCIe specification encourages the use of prefetchable BAR memory +space whenever possible, even if a BAR might contain non-prefetchable +logic. As stated in the "Additional Guidance on the Prefetchable Bit in +Memory Space BARs" under the PCIe specification, section 7.5.1.2.1, +there are system configurations where having the Prefetchable bit set +can still allow correct operation, even if the conditions for +prefetchability are not met. + +Third-party accelerator cards +[`1 `__, +`2 `__] that are +compatible with the F2 card (with multi-SLR, HBM FPGA) also only carry +prefetchable BARs. Aligning the F2 BAR settings with these cards +provides our customers flexibility to migrate between on-premise and +cloud without having to change software/hardware. diff --git a/docs-rtd/source/hdk/docs/AWS_Shell_ERRATA.rst b/docs-rtd/source/hdk/docs/AWS_Shell_ERRATA.rst new file mode 100644 index 000000000..fb709e5d6 --- /dev/null +++ b/docs-rtd/source/hdk/docs/AWS_Shell_ERRATA.rst @@ -0,0 +1,36 @@ +AWS EC2 F2 Shell Errata +======================= + +Implementation Restrictions +--------------------------- + +- PCIE AXI4 interfaces between Custom Logic(CL) and Shell(SH) have + following restrictions: + + - All PCIe transactions must adhere to the PCIe base spec + - 4-KByte address boundary for all transactions (PCIe restriction) + - Multiple outstanding outbound PCIe read transactions with same ID is + not supported + - PCIe extended tag not supported. Read-request is limited to 32 + outstanding + - Address must match DoubleWord(DW) address of the transaction + - WSTRB (write strobe) must reflect appropriate valid bytes for AXI + write beats + - Only increment burst type is supported + - AXI lock, memory type, protection type, quality of service (QoS) and + region identifier are not supported + - Transactions from the Shell to CL must complete within the timeout + period to avoid transaction termination by the Shell + - DMA transactions from the Shell to CL must complete within the + timeout period to avoid transaction termination and invalid data + returned for the DMA transaction + - PCIM and DMA-PCIS AXI4 interfaces do not support AxSIZE other than + 3'b110 (64B) + +Unsupported Features +-------------------- + +- HBM metrics not yet supported + +Known Bugs/Issues +----------------- diff --git a/docs-rtd/source/hdk/docs/AWS_Shell_Interface_Specification.rst b/docs-rtd/source/hdk/docs/AWS_Shell_Interface_Specification.rst new file mode 100644 index 000000000..56dc49270 --- /dev/null +++ b/docs-rtd/source/hdk/docs/AWS_Shell_Interface_Specification.rst @@ -0,0 +1,1009 @@ +AWS Shell Interface Specification +================================= + +Table of Contents +----------------- + +- `AWS Shell Interface + Specification <#aws-shell-interface-specification>`__ + + - `Table of Contents <#table-of-contents>`__ + - `Overview <#overview>`__ + + - `Architecture and Version <#architecture-and-version>`__ + - `Conventions <#conventions>`__ + + - `Shell Interfaces <#shell-interfaces>`__ + - `External FPGA Interfaces <#external-fpga-interfaces>`__ + + - `FPGA PCIe Representation to EC2 + Instance <#fpga-pcie-representation-to-ec2-instance>`__ + + - `Management PF (MgmtPF) <#management-pf-mgmtpf>`__ + - `Application PF (AppPF) <#application-pf-apppf>`__ + + - `DDR4 DRAM <#ddr4-dram>`__ + - `DDR4 AXI <#ddr4-axi>`__ + - `DMA <#dma>`__ + + - `Interfaces between Shell and + CL <#interfaces-between-shell-and-cl>`__ + + - `CL/Shell AXI Interfaces <#cl-shell-axi-interfaces>`__ + - `Clocks and Reset <#clocks-and-reset>`__ + + - `Clocks <#clocks>`__ + - `Reset <#reset>`__ + + - `PCIS Interface <#pcis-interface>`__ + + - `PCIS Interface Timeout + Details <#pcis-interface-timeout-details>`__ + + - `PCIM Interface <#pcim-interface>`__ + - `Outbound PCIe AXI-4 Interface + Restrictions <#outbound-pcie-axi-4-interface-restrictions>`__ + - `Byte Enable Rules <#byte-enable-rules>`__ + - `AXI4 Error Handling for CL outbound Transactions <#axi4-error-handling-for-cl-outbound-transactions>`__ + - `OCL/SDA Interfaces for Register Access <#ocl-sda-interfaces-for-register-access>`__ + + - `CL AXI Completer Error Reporting <#cl-axi-completer-error-reporting>`__ + + - `Accessing Aligned/Unaligned Addresses from PCIe (Shell is Requester, CL is Completer) <#accessing-alignedunaligned-addresses-from-pcie-shell-is-requester-cl-is-completer>`__ + - `Interrupts <#interrupts>`__ + - `HBM Monitor Interface <#hbm-monitor-interface>`__ + - `Miscellaneous Signals <#miscellaneous-signals>`__ + + - `Integrity Check <#integrity-check>`__ + - `General Control/Status <#general-controlstatus>`__ + - `Virtual LED/DIP <#virtual-leddip>`__ + - `Global Counters <#global-counters>`__ + + - `Implementation Tips <#implementation-tips>`__ + + - `Multi-SLR FPGA <#multi-slr-fpga>`__ + - `Logic Levels <#logic-levels>`__ + - `Reset <#reset-1>`__ + - `Pipeline Registers <#pipeline-registers>`__ + - `Vivado Analysis <#vivado-analysis>`__ + +Overview +-------- + +With Amazon EC2 FPGA instances, each FPGA is divided into two +partitions: + +- Shell (SH) – AWS platform logic implementing the FPGA external + peripherals, PCIe, DMA, and Interrupts. +- Custom Logic (CL) – Custom acceleration logic created by an FPGA + Developer. + +At the end of the development process, combining the Shell and CL +creates an Amazon FPGA Image (AFI) that can be loaded onto the Amazon +EC2 FPGA Instances. + +This document specifies the hardware interface and functional behavior +between the SH and the CL. + +Architecture and Version +~~~~~~~~~~~~~~~~~~~~~~~~ + +This specification applies to Xilinx Virtex Ultrascale+ platform +available on EC2 F2. Each update of the Shell is tagged with a revision +number. Note while AWS tries to keep the revision constant, sometimes it +is necessary to update the revision due to discovered issues or added +functionality. The HDK release includes the latest Shell version under +`shell_stable <./../common/shell_stable/>`__ + +The Shell is reconfigurable, allowing developers to select which Shell +version to create the AFI with. However, an AFI is tied to the specific +Shell version it is built with. Therefore, customers should re-build CL +design if they choose to use another version of the Shell. + +Conventions +~~~~~~~~~~~ + +**CL –** Custom Logic: Custom design created by the developer and +integrated with AWS Shell. + +**DW –** Double Word (DW): Refers to 4-byte (32-bit) data size. + +`AXI-4 ARM Advanced eXtensible +Interface. `__ + +`AXI-4 Stream – ARM Advanced eXtensible Stream +Interface. `__ + +**M –** Typically refers to the Requester (M) side of an AXI bus. + +**S –** Typically refers to the Completer (S) side of an AXI bus. + +Shell Interfaces +---------------- + +The following diagram and table summarize the various interfaces between +the Shell and CL as defined in +`cl_ports.vh <../common/shell_stable/design/interfaces/cl_ports.vh>`__. + +|F2_Shell_interface| + +.. list-table:: + :header-rows: 1 + :class: user-guide-dev-envs-table + :widths: 20 80 + + * - Interface + - Description + * - Clocks and Resets + - There are multiple clocks and resets provided by the Shell to the CL. + Refer to the `Clocks and Resets <#clocks-and-reset>`__ section for more + information. + * - PCIM + - The PCIe Requester (PCIM) Interface is an AXI-4 interface used for + Outbound PCIe transactions. Refer to the `PCIM Interface <#pcim-interface>`__ + section for more information. + * - PCIS + - The PCIe Completer (PCIS) Interface is an AXI-4 interface used for + Inbound PCIe transactions. Refer to the `PCIS Interface <#pcis-interface>`__ + section for more information. + * - OCL + - The OCL Interface is an AXI-Lite interface associated with AppPF and BAR0. + Refer to the `OCL/SDA AXI-Lite Interfaces for Register Access <#ocl-sda-interfaces-for-register-access>`__ + session for more information. + * - Miscellaneous + - There are various generic signals, such as ID's, status, counters, etc., + between the Shell and CL that are described in the + `Miscellaneous Signals <#miscellaneous-signals>`__ section. + * - SDA + - The SDA Interface is an AXI-Lite interface associated with MgmtPF and + BAR4. Please refer to the + `OCL/SDA AXI-Lite Interfaces for Register Access <#ocl-sda-interfaces-for-register-access>`__ + for more information. + * - HBM MON APB + - The HBM monitor interfaces. Customers using HBM IP are required to + connect these interfaces to the HBM IP. Refer to the + `HBM monitor interface <#hbm-monitor-interface>`__ for more information. + * - DDR4 Stats + - This is the control interface from the Shell to the DDR4 Controller in + the CL. Shell uses this interface to calibrate the DDR core. Refer to + the `DDR4 DRAM <#ddr4-dram>`__ section for more information. + * - Interrupts + - There are 16 user interrupts available. Refer to the + `Interrupts <#interrupts>`__ section for more information. + +External FPGA Interfaces +------------------------ + +The FPGA platform includes the following external interfaces: + +- One x8 PCI Express 4.0 Interface. + +- One DDR4 DIMM interfaces, 72-bit wide (including ECC). + +FPGA PCIe Representation to EC2 Instance +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +There are two PCIe Physical Functions (PFs) presented to the instance: + +- Management PF – This PF is used for management of the FPGA. The + Management PF provides access to various control functions like + Virtual-LED, Virtual-DIPSwitch. + +- Application PF (AppPF)– The AppPF is used for CL specific + functionality. + +Please refer to `PCI Address map <./AWS_Fpga_Pcie_Memory_Map.html>`__ for +a more detailed view of the address map. + +Management PF (MgmtPF) +^^^^^^^^^^^^^^^^^^^^^^ + +The Management PF details are provided for reference to help +understanding the PCIe mapping from an F2 instance. This interface is +strictly used by the AWS FPGA Management Tools. + +The Management PF exposes: + +a) Amazon’s specific Shell Version and Revision numbers. + +b) Three BARs: + + - BAR0 - 16KiB + - BAR2 - 16KiB + - BAR4 - 4MiB + +c) A range of 32-bit addressable registers. + +The Management PF is persistent throughout the lifetime of the instance, +and it will not be reset or cleared (even during the AFI Load/Clear +process). + +Application PF (AppPF) +^^^^^^^^^^^^^^^^^^^^^^ + +The Application PF exposes: + +a) PCIe BAR0 as a 64-bit prefetchable BAR sized as 64MiB. This BAR maps +to the OCL AXI-Lite interface. + +b) PCIe BAR2 as a 64-bit prefetchable BAR sized as 64KiB. This BAR is +not CL visible. This BAR maps to the MSI-X tables and XDMA (if enabled). + +c) PCIe BAR4 as a 64-bit prefetchable BAR sized as 128GiB. This BAR may +be used to map the entire External/Internal memory space to the instance +address space if desired, through ``mmap()`` type calls or use +``fpga_pci_lib`` APIs. + +d) BusMaster capability to allow the CL to initiate transactions towards +the instance memory. + +e) CL’s specific PCIe VendorID, DeviceID, VendorSystemID and SubsystemID +as registered through ``aws ec2 fpgaImageCreate`` + +The Developer can write drivers for the AppPF or leverage the reference +driver provided in the SDK. + +The PCIe interface connecting the FPGA to the instance is in the Shell, +and the CL can access it through two AXI-4 interfaces: + +- `PCI Completer + (PCIS) <#pcis-interface>`__ + +- `PCI Requester + (PCIM) <#pcim-interface>`__ + +DDR4 DRAM +~~~~~~~~~ + +FPGA card provides one DDR DIMM that can be interfaced with the CL +design. AWS offers the DDR Controller IP readily configured to suit the +DDR DIMM's configuration in the +`sh_ddr.sv <../common/shell_stable/design/sh_ddr/synth/sh_ddr.sv>`__ +file which should be instantiated in the CL. The ``sh_ddr_stat_bus*`` +ports in ``sh_ddr.sv`` should be connected to the respective +``sh_cl_ddr_stat*`` ports in the ``cl_ports.vh`` along with the DDR I/O +ports. It exposes a 512-bit AXI-4 interface ``cl_sh_ddr_axi_*`` for the +CL design to drive traffic requests into the DDR. The ``sh_ddr.sv`` has +been optimized to reduce resource footprint in the FPGA, yet offer max +DDR performance. It comes with all the required constraints for the +implementation, and also ensures DDR calibration upon CL AFI loads into +the FPGA. + +**NOTE:** Even if DDR controller is not required in the CL design, the +``sh_ddr.sv`` block **must** be instantiated in the CL, with parameter +``DDR_PRESENT=0`` (defaults to DDR_PRESENT=1). This will automatically +remove DDR Controller IP, and instead, adds the required buffers to +properly load or terminate the I/O pins interfacing the external DDR +DIMM. **WARNING** If the CL does not instantiate the ``sh_ddr.sv`` +block, then it will result in implementation errors. + +DDR4 AXI +~~~~~~~~ + +The DDR4 Controller has an AXI-4 interface with a 512-bit data bus. + +The DRAM interface is accessed via an AXI-4 interface: + +- AXI-4 (CL is Requester and DRAM controller is Completer) – 512-bit + AXI-4 interface to read/write DDR. + +There is a single status signal that the DRAM interface is trained and +ready for access. DDR access should be gated when the DRAM interface is +not ready. The addressing uses ROW/COLUMN/BANK (Interleaved) mapping of +AXI address to DRAM Row/Col/BankGroup. The Read and Write channels are +serviced with round-robin arbitration (i.e. equal priority). + +The DRAM interface uses the Xilinx DDR-4 Interface controller. The AXI-4 +interface adheres to the Xilinx specification. Uncorrectable ECC errors +are signaled with RRESP. ECC error status can be read using AWS +Management Software APIs. + +Additionally, there is a statistics interface between the Shell and CL. +If the DDR controllers are being used by the CL, then the interfaces +must be connected between the Shell and the DRAM interface controller +modules. + +**WARNING:** If the stats interfaces are not connected, the DDR +controllers will not function. However, the CL developer should not +otherwise use them since they are specific to Shell management +functions. If the DDR controllers are not used by the CL, then the +interfaces should be left unconnected. + +DMA +~~~ + +There is an integrated DMA controller inside the XDMA Shell (Xilinx DMA, +not supported at this time), which writes/reads data to/from the CL via +the sh_cl_pcis_dma bus. Because of the shared DMA/PCIS interface, this +maps to the same address space exposed by the AppPF BAR4 address. XDMA +driver is available on Xilinx +`github `__. + +Interfaces between Shell and CL +------------------------------- + +CL/Shell AXI Interfaces +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +All AXI interfaces use the AXI-4 or AXI-Lite protocol. The AXI-L buses are +for register access use cases, and can access lower speed control +interfaces that use the AXI-Lite protocol. + +For bulk data transfer, wide AXI-4 buses are used. AXI-4 on the CL/Shell +interfaces have the following restrictions: + +- AxBURST – Only INCR burst is supported. +- AxLOCK – Lock is not supported. +- AxCACHE – Memory type is not supported. +- AxPROT – Protection type is not supported. +- AxQOS – Quality of Service is not supported. +- AxREGION – Region identifier is not supported. + +These signals are not included on the AXI-4 interfaces of the shell. If +connecting to a fabric or component that supports these signals, these +constant values should be used: + +.. list-table:: + :header-rows: 1 + :class: user-guide-dev-envs-table + :widths: 20 60 + * - Signal + - Value + * - AxBURST[1:0] + - 0b01 + * - AxLOCK[1:0] + - 0b00 + * - AxCACHE[3:0] + - 0b000x (bit 0 is Bufferable bit and may be 0 or 1) + * - AxPROT[2:0] + - 0b000 + * - AxQOS[3:0] + - 0b0000 + * - AxREGION[3:0] + - 0b0000 + +Clocks and Reset +~~~~~~~~~~~~~~~~ + +Clocks +^^^^^^ + +The Shell provides 250MHz ``clk_main_a0`` and 100MHz ``hbm_ref_clk`` +from shell-to-CL. Customers can use these clocks in their designs +directly or instantiate MMCMs to generate clock frequencies of interest +for their designs. All the interfaces between the CL and SH, as listed +in +`cl_ports.vh <../common/shell_stable/design/interfaces/cl_ports.vh>`__ +are synchronous to ``clk_main_a0``. The CL design must perform the +required clock domain crossing when interfacing logic in another clock +domain with Shell-CL interface ports. + +Please note that the extensive list of clocks and resets, as compared to +F1 shell, are removed from Shell-CL interface. This improves overall +routability for the CL designs that do not require all those multiple +clocks from the Shell. However, AWS offers +`AWS_CLK_GEN <./AWS_CLK_GEN_spec.html>`__ IP that supports multiple +clocks, resets and clock recipes similar to F1. The AWS_CLK_GEN IP can +be optionally instantiated in the CL for an easier migration of designs +from F1 involving multiple clocks. +`CL_MEM_PERF <./../cl/examples/cl_mem_perf/design/cl_mem_perf.sv>`__ +demonstrates integration of `AWS_CLK_GEN +IP <../common/lib/aws_clk_gen.sv>`__ into CL design. + +Please refer to the +`Clock Recipes User Guide <./Clock_Recipes_User_Guide.html>`__ for +details on supported clock recipes in F2, dynamic clock reconfiguration +and specifying clock recipes during the build time. + +Similar to F1, the ``clk_main_a0`` in F2 also supports multiple clock +recipes and the frequency can be scaled using SW APIs at the time of AFI +loads (this feature is currently not available and will be added in a future +release). + +Reset +^^^^^ + +The shell provides an active-low reset signal synchronous to +clk_main_a0: rst_main_n. This is an active low reset signal, and +combines the board reset and PCIe link-level reset conditions. + +PCIS Interface +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This an 512-bit wide AXI-4 interface for Inbound PCIe Transactions (Shell is +Requester, CL is Completer). It is used for: + +- PCIe transactions initiated by the instance and targeting AppPF BAR4 + (PCIS) +- DMA transactions (if enabled) (XDMA) + +A read or write request on this AXI-4 bus that is not acknowledged by +the CL within a certain time window, will be internally terminated by +the Shell. If the time-out error happens on a read, the Shell will +return ``0xFFFFFFFF`` data back to the instance. This error is reported +through the Management PF and can be retrieved by the AFI Management +Tools metric reporting APIs. + +The AXI ID can be used to determine the source of the transaction: + +- 0x20 : PCI Interface +- 0x00 : XDMA Channel 0 +- 0x01 : XDMA Channel 1 +- 0x02 : XDMA Channel 2 +- 0x03 : XDMA Channel 3 + +PCIS Interface Timeout Details +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The PCIS interface multiplexes the XDMA requests and PCIS requests. Each +type of request has a different timeout time: + +- XDMA (DMA transactions) : 5 seconds +- PCIS (PCIe transactions initiated from the instance) : 8 us + +Transactions on the PCIS interface must complete before the associated +timeout time or the SH will timeout the transactions and complete the +transactions on behalf of the CL (BVALID/RVALID). Each "issued" +transaction has an independent timeout counter. For example if 4 +transactions are issued from the PCIS interface "simultaneously" (i.e. +back-to-back cycles), then all 4 must complete within 8us. A transaction +is considered "issued" when the AxVALID is asserted for the transaction +by the Timeout Detection block. AxREADY does not have to be asserted for +the transaction to be considered "issued". Note there is a 16 deep clock +crossing FIFO between the Timeout Detection block and the CL logic. So +if the CL is asserting backpressure (de-asserting AxVALID) there can +still be 16 transactions issued by the Timeout Detection block. The SH +supports a maximum of 32 transactions outstanding for each type +(read/write). It is advisable for the CL to implement enough buffering +for 32 transactions per type so that it is aware of all issued +transactions. + +Once a transaction is issued, it must fully be completed within the +timeout time (Address, Data, Ready). Any transaction that does not +completed in time will be terminated by the shell. This means write data +will be accepted and thrown away, and default data ``0xFFFFFFFF`` will be +returned for reads. + +If a timeout occurs, the Shell will timeout all further transactions in +16ns for a moderation time (4ms). + +**WARNING**: If a timeout happens, the DMA/PCIS interface may no longer +be functional and the AFI/Shell must be re-loaded. This can be done by +adding the "-F" option to ``fpga-load-local-image``. + +PCIM Interface +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This is an 512-bit wide AXI-4 interface for Outbound PCIe Transactions (CL is +Requester, Shell is Completer). It is used by the CL to initiate cycles to the PCIe bus, for example, to push +data from the CL to instance memory, or read from the instance memory. + +⚠️ **The CL must use physical addresses, and developers must be careful +not to use userspace/virtual addresses.** + +The following PCIe interface configuration parameters are provided from +the Shell to the CL as informational: + +- sh_cl_cfg_max_payload[1:0] – PCIe maximum payload size: + +.. list-table:: + :header-rows: 1 + :class: user-guide-dev-envs-table + :widths: 20 40 + + * - Value + - Max Payload Size + * - 0b00 + - 128 Bytes + * - 0b01 + - 256 Bytes (Most probable value) + * - 0b10 + - 512 Bytes + * - 0b11 + - Reserved + +- sh_cl_cfg_max_read_req[2:0] - PCIe maximum read request size: + +.. list-table:: + :header-rows: 1 + :class: user-guide-dev-envs-table + :widths: 20 40 + + * - Value + - Max Read Request Size + * - 0b000 + - 128 Bytes + * - 0b001 + - 256 Bytes + * - 0b010 + - 512 Bytes (Most probable value) + * - 0b011 + - 1024 Bytes + * - 0b100 + - 2048 Bytes + * - 0b101 + - 4096 Bytes + * - Others + - Reserved + +Outbound PCIe AXI-4 Interface Restrictions +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +- Transfers must not violate PCIe byte enable rules (see byte enable + rules below). +- Transfers must adhere to all AXI-4 protocol rules + +Byte Enable Rules +~~~~~~~~~~~~~~~~~ + +All AXI-4 transactions to the PCIe interface must adhere to the PCIe +Byte Enable rules (see PCI Express Base specification). Rules are +summarized below: + +- All transactions larger than two DW must have contiguous byte enables. +- Transactions that are less than two DW may have non-contiguous byte + enables. + +Note on AXI-4 byte enables are signaled using WSTRB. + +AXI4 Error Handling for CL outbound Transactions +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Transactions on AXI4 interface will be terminated and reported as SLVERR +on the RRESP/BRESP signals and will not be passed to the instance in the +following cases: + +- PCIe BusMaster Enable (BME) is not set in the PCIe configuration + space. +- Illegal transaction address; i.e. addressing memory space that isn't + supported by the instance. +- Transaction crossing 4KB boundaries violating AXI-4/PCIe + specifications. +- Illegal byte-enable. +- Illegal length (AXI-4 write doesn't match length). +- Illegal AXI-Size (only full width 512-bit transfers, size=0b110 are + supported) +- Timeout. Each channel must complete in 8 us or it will timeout: 1. + Once AW is asserted, the write data must be supplied in 8us 2. Once + RVALID is asserted, RREADY must be asserted, and all data transferred + within 8us 3. Once BVALID is asserted, BREADY must be asserted within + 8us + +⚠️ **If a timeout occurs, the PCIM bus will no longer be functional. +This can be cleared by clearing/re-loading the AFI.** + +OCL/SDA AXI-Lite Interfaces for Register Access +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +There are two AXI-L requester interfaces (Shell is Requester) that can +be used for register access interfaces. Each interface is sourced from a +different PCIe PF/BAR. Breaking this into multiple interfaces allows for +different software entities to have a control interface into the CL: + +- OCL AXI-L: Associated with AppPF, BAR0. If the developer is using AWS + OpenCL runtime lib (as in SDAccel case), this interface will be used + for OpenCL Kernel access + +- SDA AXI-L: Associated with MgmtPF, BAR4. If the developer is using AWS + OpenCL runtime Lib (as in SDAccel case), this interface will be used + for performance monitors etc. This interface is also used for accessing the + `AWS_CLK_GEN IP <./AWS_CLK_GEN_spec.html>`__ for CL clock management. + +Please refer to `PCI Address Map <./AWS_Fpga_Pcie_Memory_Map.html>`__ for +a more detailed view of the address map. + +CL AXI Completer Error Reporting +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Each AXI (AXI-4/AXI-L) transaction is terminated with a response +(BRESP/RRESP). The AXI responses may signal an error such as Completer +Error, or Decode Error. PCIe also has error reporting for non-posted +requests (Unsupported Requests/Completer Abort). The shell does not +propagate the AXI-4 error responses to the PCIe bus. All PCIe cycles are +terminated with non-error responses. The AXI-4 errors are reported +through the Management PF and can be retrieved by the AFI Management +Tools metric reporting APIs. + +Accessing Aligned/Unaligned Addresses from PCIe +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The Shell (Requester) supports DW aligned and unaligned transfers from PCIe (address +is aligned/unaligned to DW-4byte boundary) + +Following are a few examples of how aligned and unaligned access from +PCIe to CL on PCIS interface work: + +1. Writing 8 bytes to DW aligned address through PCIe on AXI4 + Interface (PCIS 512-bit interface): + + If the transaction on the PCIe is as follows: + - Addr : 0x0000002000000000 + - dw_cnt : 2 + - first_be : 4’b1111 + - last_be : 4’b1111 + + Then the transaction on the AXI4 interface will have the following + AXI attributes: + - awaddr = 64’h0000_0000_0000_0000 + - awlen = 0 + - wstrb = 64’h0000_0000_0000_00ff + +2. Writing 8 bytes to DW unaligned address on AXI4 Interface(PCIS + 512-bit interface): + + If the transaction on the PCIe is as follows: + - Addr : 0x0000002000000001 + - dw_cnt : 3 + - first_be : 4’b1110 + - last_be : 4’b0001 + + Then the transaction on the AXI4 interface will have the following + AXI attributes: + - awaddr = 64’h0000_0000_0000_0001 + - awlen = 0 + - wstrb = 64’h0000_0000_0000_01fe + +The addresses for the Read transactions will work similar to writes. + +**Note**: If a transaction from PCIe is initiated on AXI-Lite (SDA/OCL) +interfaces with dw_cnt greater than 1, i.e. >32bits, the transaction is +split into multiple 32-bit transactions by the Shell. + +Following are a few examples of how aligned and Unaligned access from +PCIe to CL on SDA/OCL AXI-Lite interfaces work: + +1. Writing 8 bytes to DW aligned address on AXI Lite interface + (SDA/OCL 32-bit interface): + + If the transaction on the PCIe is as follows: + - Addr : 0x0000000002000000 + - dw_cnt : 2 + - first_be : 4’b1111 + - last_be : 4’b1111 + + Then the transaction on the AXI-Lite interface will be split and will + have the following AXI attributes: Transaction is split into 2 + transfers. + + 1st transfer + - awaddr = 32’h0000_0000 + - wstrb = 4’hf + 2nd transfer + - awaddr = 32’h0000_0004 + - wstrb = 4’hf + +2. Writing 64 bits to DW unaligned address on AXI Lite interface + (SDA/OCL 32-bit interface): + + If the transaction on the PCIe is as follows: + - Addr : 0x0000000002000001 + - dw_cnt : 3 + - first_be : 4’b1110 + - last_be : 4’b0001 + + Transaction on AXI-Lite interface will be split and will have the + following AXI attributes: Transaction is split into 3 transfers. + + 1st transfer + - awaddr = 32’h0000_0001 + - wstrb = 4’he + + 2nd transfer + - awaddr = 32’h0000_0004 + - wstrb = 4’hf + + 3rd transfer + - awaddr = 32’h0000_0008 + - wstrb = 4’h1 + +The transaction splitting and addresses for the Read transactions will +work similar to writes. + +Interrupts +~~~~~~~~~~ + +16 user interrupt sources are supported. There is mapping logic that +maps the user interrupts to MSI-X vectors. Mapping registers in the DMA +controller map the 16 user interrupt sources to MSI-X vectors. + +There are two sets of signals to generate interrupts: + +- cl_sh_apppf_irq_req[15:0] (from CL to SH) +- sh_cl_apppf_irq_ack[15:0] (from SH to CL) + +This interface uses single clock pulses for the req/ack. The CL asserts +(active high) cl_sh_apppf_irq_req[x] for a single clock to assert the +interrupt request to the SH. The SH will respond with a single clock +pulse on sh_cl_apppf_irq_ack[x] to acknowledge the interrupt. Once the +CL asserts a request on a particular bit[x], it should not assert a +request for the same bit[x] until it has received the ack for bit[x] +from the SH. The CL may assert requests on other bits[y] (y!=x). + +HBM Monitor Interface +~~~~~~~~~~~~~~~~~~~~~ + +There are two sets of HBM monitor APB interfaces exposed to the CL, one +for each HBM rack. These interfaces are used by the shell to ensure the +HBM's integrity and reliability whenever the HBM IP is enabled in the +CL. + +When the interfaces are connected to the HBM IP properly, the shell +monitors the HBM controller traffic and forces an HBM rack reset if any +transaction is detected accessing an address space in the IP that's not +defined in the `AMD HBM User +Guide `__. + +The active-low ``hbm_apb_preset`` signal connected to each HBM rack +remains at logic-high during power-on and normal operation. This allows +the HBM to initialize and communicate with the rest of the CL logic. If +an HBM access violation (i.e., an APB transaction to an undefined +address space) occurs, the shell will pull the ``hbm_apb_preset`` signal +low to force a reset of the HBM rack. Subsequent usage of this rack is +blocked. The customer must reload the AFI to get it recovered from this +blocked state. + +These steps must be followed to properly connect the monitor interfaces +to HBM: + +1. Expose the HBM monitor I/Os on the HBM IP by running the following + Tcl commands in the Vivado IP management project: + + .. code:: Tcl + + # Enable the `MON_APB` interface on the IP + set_property CONFIG.USER_MON_APB_EN TRUE [get_ips ] + + # Confirm the enabling state + get_property CONFIG.USER_MON_APB_EN [get_ips ] + true + + **NOTE:** This step can be skipped if the customer uses the + ``CL_HBM`` IP from the `CL examples <./../../hdk/common/ip/cl_ip/>`__. + This IP has the ``MON_APB`` interface enabled and is ready to be + integrated to a customer design as-is. + +2. Connect the HBM monitor interface from the shell to the HBM IP. The + customer can leave the interface floating if the corresponding HBM + rack is not used. For example, the ``hbm_apb_p_1`` signals can be + left unconnected if HBM rack 1 is unused. + +3. All the HBM monitor interfaces are synchronized to the 100MHz + ``clk_hbm_ref`` clock. + +4. The ``hbm_apb_preset_n_<1/0>`` signals, treated as asynchronous + resets by the HBM IP, must be directly connected to the IP's + ``MON_APB_<1/0>_PRESET_N`` inputs. Other APB interfaces can be + pipelined using APB register slices for timing closure purposes. + +⚠️ **Failing to connect these HBM monitor interfaces between the shell +and the HBM IP will result in an AFI creation error.** + +Miscellaneous Signals +~~~~~~~~~~~~~~~~~~~~~ + +There are some miscellaneous generic signals between the Shell and CL. + +Integrity Check +^^^^^^^^^^^^^^^ + +The 64-bit ch_sh_id0/id1 are used by AWS to validate the signature of +the DCP while being loaded into an FPGA in AWS. + +Initial versions of the HDK and Shell used the 4-tuple: PCIe VendorID, +DeviceID, SubsystemVendorID and SubsystemID (which are used during AFI +registration via ``aws ec2 create-fpga-image`` API) as the Integrity +check mechanism, following the next mapping + +- cl_sh_id0 + + - [15:0] – Vendor ID + - [31:16] – Device ID + +- cl_sh_id1 + + - [15:0] – Subsystem Vendor ID + - [31:16] – Subsystem ID + +In future revisions of the HDK, AWS scripts may override the +cl_sh_id0/id1 to include an integrity hash function. + +General Control/Status +^^^^^^^^^^^^^^^^^^^^^^ + +The functionality of these signals is TBD. + +- cl_sh_status0[31:0] – Placeholder for generic CL to Shell status. +- cl_sh_status1[31:0] – Placeholder for generic CL to Shell status. +- sh_cl_ctl0[31:0] – Placeholder for generic Shell to CL control + information. +- sh_cl_ctl1[31:0] – Placeholder for generic Shell to CL control + information. +- sh_cl_pwr_state[1:0] – This is the power state of the FPGA. + + - 0x0 – Power is normal + - 0x1 – Power level 1 + - 0x2 – Power level 2 + - 0x3 – Power is critical and FPGA may be shutting off clocks or + powering down + +Virtual LED/DIP +^^^^^^^^^^^^^^^ + +There are virtual LED/DIP switches that can be used to control/monitor +CL logic. There are 16 LEDs and 16 DIP Switches. Registers exposed to +the Management PF are used to control/monitor the LED/DIP Switches. + +vLED - There are 16 virtual LEDs that can be driven from the CL logic to +the SH (cl_sh_status_vled[15:0]). The value of these signals can be read +by S/W in the Instance. An API is also provided through AWS Management +Software. + +vDIP - There are 16 virtual DIP switches that drive from the SH to the +CL logic (sh_cl_status_vdip[15:0]). These can be used to control logic +in the CL. The value of these signals can be written/read by S/W in the +instance. An API is also provided through AWS Management Software. + +These signals are asynchronous to the CL clocks, and the following must +be done when using these signals: + +- vLED: In implementation a false path should be set from the vLED + signals. For example, in the constraints for place and route add: + + .. code:: bash + + set_false_path -from [get_cells CL/cl_sh_status_vled_reg*] + + +- vDIP: The vDIP signals should be synchronized to a CL clock before + being used. + + .. code:: verilog + + always @(posedge clk_main_a0) + begin + pre_sync_vdip <= sh_cl_status_vdip; + sync_vdip <= pre_sync_vdip; + end + + my_logic = sync_vdip[0]; + +Global Counters +^^^^^^^^^^^^^^^ + +There are two global counter outputs that increment every 4ns. These can +be used to measure time inside of the CL. They are synchronized to +clk_main_a0. Note if clk_main_a0 is running slower than 250MHz, the +counters will appear to skip values. The counters are: + +- sh_cl_glcount0[63:0] +- sh_cl_glcount1[63:0] + +Implementation Tips +------------------- + +Here are some implementation tips. + +Multi-SLR FPGA +~~~~~~~~~~~~~~ + +The VU47P FPGA is a stacked FPGA that has 3-die stacked together. Each +Die is called a “Super Logic Region” (SLR). Crossing an SLR boundary is +expensive from a timing perspective. It is good practice to pipeline +interfaces between major blocks to allow the tool freedom to have SLR +crossings between the major blocks. Even with pipelined interfaces it is +possible the tool has sub-optimal logic to SLR mapping (i.e. a major +block is spread out over multiple SLR's). In this case you may want to +at map major blocks to specific SLRs (define the logic that should be +constrained to each SLR). Any crossing of SLR’s should have flops on +either side (or register slices for AXI). + +It is ideal to place logic that interfaces to the shell in the same SLR +as the Shell logic for that interface. If this is not possible, the +first flop/register slice should be placed in the same SLR: + +- TOP SLR: + + - CL_SH_DDR + - DDR Stats + - PCIS + +- MID SLR: + + - PCIM + - OCL + - SDA + +- MID/BOTTOM + + - HBM MON APB + +Please see the `Shell Floorplan <./shell_floorplan.html>`__ for additional +details on Shell-CL interface placements in SMALL_SHELL. + +For the interfaces that are in both the MID/BOTTOM the recommendation is +to use flops for pipelining, but don’t constrain to an SLR. You can +constrain logic to a particular SLR by creating PBLOCKs (one per SLR), +and assigning logic to the PBLOCKs (refer to cl_dram_hbm_dma example +`small_shell_cl_pnr_user.xdc <../cl/examples/cl_dram_hbm_dma/build/constraints/small_shell_cl_pnr_user.xdc>`__). +Dataflow should be mapped so that SLR crossing is minimized (for example +a pipeline should be organized such that successive stages are mostly in +the same SLR). + +There are some good timing closure tips in this +`UltraFast Design Methodology Guide `__ + +Logic Levels +~~~~~~~~~~~~ + +You can report all paths that are greater than a certain number of logic +levels. This can be used to iterate on timing in synthesis rather than +waiting for place and route. For example at 250MHz a general rule of +thumb is try to keep logic levels to around 10. The following commands +report on all paths that have more than 10 logic levels: + + .. code:: Tcl + + report_design_analysis -logic_level_distribution -of [get_timing_paths -max_paths 10000 -filter {LOGIC_LEVELS > **10**}] + + foreach gtp [get_timing_paths -max_paths 5000 ?nworst 100 -filter {LOGIC_LEVELS > **10**}] { + puts "[get_property STARTPOINT_PIN $gtp] + [get_property ENDPOINT_PIN $gtp] [get_property SLACK $gtp] + [get_propert LOGIC_LEVELS $gtp]" + } + +.. _reset-1: + +Reset +~~~~~ + +Reset fanout can be minimized in an FPGA. This helps with routing +congestion. Flops can be initialized in their declaration and generally +do not require resets: + +.. code:: Verilog + + logic[3:0] my_flops = 4'ha; + + If logic must have a reset, use synchronous resets rather than + asynchronous resets: + +.. code:: Verilog + + always @(posedge clk) + if (reset) + my_flop <= 4'ha; + else + my_flop <= nxt_my_flop; + +If there is still significant fanout of reset, it should be replicated +and pipelined. For example each major block could have its own pipelined +version of reset. + +Pipeline Registers +~~~~~~~~~~~~~~~~~~ + +You have to be careful that pipeline registers do not infer a shift +register component. The shift register is placed in a single area and +does not accomplish any distance pipelining. Here is a snippet to force +the tools to not infer a shift register (shreg_extract="no" directive): + +.. code:: Verilog + + (*shreg_extract="no"*) logic [WIDTH-1:0] pipe[STAGES-1:0] = '{default:'0}; + +Vivado Analysis +~~~~~~~~~~~~~~~ + +Vivado has some nice analysis capabilities: + +- report_methodology (includes CDC report) +- clock interaction report (see if paths between async clocks are erroneously being timed) +- congestion heat map +- power analysis +- physical implementation analysis (placement, routing) +- linked timing/schematic/physical views + +Refer to `Vivado Design Suite User Guide `__ +for more information. + +.. |F2_Shell_interface| image:: ./../../_static/F2_Shell_interface.png diff --git a/docs-rtd/source/hdk/docs/Clock_Recipes_User_Guide.rst b/docs-rtd/source/hdk/docs/Clock_Recipes_User_Guide.rst new file mode 100644 index 000000000..c490e7035 --- /dev/null +++ b/docs-rtd/source/hdk/docs/Clock_Recipes_User_Guide.rst @@ -0,0 +1,326 @@ +F2 Clock Recipes User Guide +=========================== + +Table of Content +---------------- + +- `F2 Clock Recipes User Guide <#f2-clock-recipes-user-guide>`__ + + - `Table of Content <#table-of-content>`__ + - `Introduction <#introduction>`__ + - `F2 Clock Recipe Tables <#f2-clock-recipe-tables>`__ + - `How to Specify Clock Recipe During Build + Time <#how-to-specify-clock-recipe-during-build-time>`__ + - `How to Dynamically Configure Clocks during + Runtime <#how-to-dynamically-configure-clocks-during-runtime>`__ + - `Clock Consideration When Porting CL Designs from F1 into + F2 <#clock-consideration-when-porting-cl-designs-from-f1-into-f2>`__ + - `References <#references>`__ + +Introduction +------------ + +F2 Shell offers two clocks - ``clk_main_a0`` and ``clk_hbm_ref`` to the +CL. This is different from F1 Shell, which offers total of 8 clocks from +Shell to the CL as described in `F1 Shell Interface +Spec `__. +Offering fewer clocks from the Shell to CL is beneficial because it does +not lock up the routing resources for customers who do not require all +the clocks from the Shell. + +The ``clk_main_a0`` defaults to 250MHz. Dynamic reconfiguration of the +frequency for ``clk_main_a0`` is currently NOT supported. However, this +will be supported in future. + +The ``clk_hbm_ref`` is a fixed frequency 100MHz clock required for the +HBM IP to clock the APB interface. + +F2 Developer Kit provides a clocking IP +`AWS_CLK_GEN <./AWS_CLK_GEN_spec.md>`__ for customers who desire to have +same clocks and clock recipe support as F1. +`Tables <./Clock_Recipes_User_Guide.md#f2-clock-recipe-table>`__ +below shows the clock recipes supported in F2. + +F2 Clock Recipe Tables +--------------------- + +.. list-table:: + :header-rows: 2 + :class: user-guide-dev-envs-table + :widths: 10 10 10 10 10 50 + + * - Clock Group A + - + - + - + - + - + * - Recipe Number + - clk_main_a0 + - clk_extra_a1 + - clk_extra_a2 + - clk_extra_a3 + - Notes + * - A0 + - 250 + - 62.5 + - 187.5 + - 250 + - AWS_CLK_GEN is not required in the CL design for clk_main_a0 recipes. + clk_extra_a0/a1/a2 clocks require AWS_CLK_GEN block instantiated in + CL design. + * - A1 + - 250 + - 125 + - 375 + - 500 + - + * - A2 + - 250 + - 15.625 + - 125 + - 62.5 + - + +.. list-table:: + :header-rows: 2 + :class: user-guide-dev-envs-table + :widths: 10 10 10 10 10 50 + + * - Clock Group B + - + - + - + - + - + * - Recipe Number + - clk_extra_b0 + - clk_extra_b1 + - + - + - Notes + * - B0 + - 250 + - 125 + - + - + - clk_extra_b0/b1 require AWS _CLK_GEN block instantiated in the CL design. + * - B1 + - 125 + - 62.5 + - + - + - + * - B2 + - 450 + - 225 + - + - + - + * - B3 + - 250 + - 62.5 + - + - + - + * - B4 + - 300 + - 75 + - + - + - + * - B5 + - 400 + - 100 + - + - + - + +.. list-table:: + :header-rows: 2 + :class: user-guide-dev-envs-table + :widths: 10 10 10 10 10 50 + + * - Clock Group C + - + - + - + - + - + * - Recipe Number + - clk_extra_c0 + - clk_extra_c1 + - + - + - Notes + * - C0 + - 300 + - 400 + - + - + - + * - C1 + - 150 + - 200 + - + - + - + * - C2 + - 75 + - 100 + - + - + - + * - C3 + - 200 + - 266.667 + - + - + - + +.. list-table:: + :header-rows: 2 + :class: user-guide-dev-envs-table + :widths: 10 10 10 10 10 50 + + * - Clock Group HBM + - + - + - + - + - + * - Recipe Number + - clk_hbm_axi + - + - + - + - Notes + * - H0 + - 300 + - 400 + - + - + - clk _hbm_axi requires AWS_CLK_GEN IP instantiated in the CL design. + The clk _hbm_axi is used to clock the AXI interfaces of HBM IP. + This clock is not available in F1. + * - H1 + - 125 + - + - + - + - + * - H2 + - 450 + - + - + - + - + * - H3 + - 300 + - + - + - + - + * - H4 + - 400 + - + - + - + - + +.. list-table:: + :header-rows: 2 + :class: user-guide-dev-envs-table + :widths: 10 10 10 10 10 50 + + * - Reference Clock Group + - + - + - + - + - + * - Recipe Number + - clk_hbm_ref + - + - + - + - Notes + * - + - 100 + - + - + - + - Fixed frequency 100MHz reference clock from the Shell for HBM IP. + +**NOTE:** ``clk_main_a0`` supports A0, A1 and A2 clock recipes without +requiring AWS_CLK_GEN IP instantiated in the CL design. All other clocks +and their respective clock recipes require AWS_CLK_GEN IP instantiated +in the CL design and interfaced to the SDA interface from the Shell. +`CL_MEM_PERF <./../cl/examples/cl_mem_perf/design/cl_mem_perf.sv>`__ +demonstrates how `AWS_CLK_GEN <./../common/lib/aws_clk_gen.sv>`__ is +integrated into CL design. + +How to Specify Clock Recipe During Build Time +--------------------------------------------- + +Developers who wish to build CL design for a specific clock frequency +defined in the `F2 Clock Recipe +Tables <./Clock_Recipes_User_Guide.html#f2-clock-recipe-tables>`__ can do so +by passing the following arguments at the time of CL builds. Specifying +clock recipe at the time of build, automatically adjusts the design +clock constraints enabling the Vivado tool to close timing of CL based +on chosen clock frequency. + +For example, command below shows CL_MEM_PERF built using user specified +clock recipes: + +.. code:: bash + + cd $CL_DIR/build/scripts/ + ./aws_build_dcp_from_cl.py --cl=cl_mem_perf --clock_recipe_a=A0 --clock_recipe_b=B3 --clock_recipe_c=C3 --clock_recipe_hbm=H4 + +When the clock recipe options are not explicitly specified, +``aws_build_dcp_from_cl.py`` defaults to +``--clock_recipe_a=A1 --clock_recipe_b=B2 --clock_recipe_c=C0 --clock_recipe_hbm=H2`` + +**NOTE:** If AWS_CLK_GEN IP is not instantiated in the CL design, the +recipes for AWS_CLK_GEN clocks will be ignored. Users may see CRITICAL +WARNING related to missing AWS_CLK_GEN instantiation during builds. + +How to Dynamically Configure Clocks during Runtime +-------------------------------------------------- + +Support for SW API to do clock frequency dynamic configuration is +available using the ``fpga-load-clkgen-dynamic`` and +``fpga-load-clkgen-recipe`` command line interfaces detailed in `Amazon +FPGA Image (AFI) Management +Tools <../../sdk/userspace/fpga_mgmt_tools/README.html>`__. + +Clock Consideration When Porting CL Designs from F1 into F2 +----------------------------------------------------------- + +1. The ``clk_main_a0`` is now fixed at 250MHz. It does not support clock + recipes or dynamic frequency reconfiguration. However, they will be + supported in future. + +2. F1 designs that relied on additional clocks such as ``clk_extra_*`` + will now have two options in F2: + + a. Customers can instantiate required number of MMCMs in their CL + design to meet the clocking requirement. + + b. Alternately, customers can instantiate + `AWS_CLK_GEN <./../common/lib/aws_clk_gen.sv>`__ IP in their CL which + offers same set of clocks from F1, in addition to ``clk_hbm_axi`` for + HBM clocking. AWS provides `SW + APIs <./../../sdk/userspace/fpga_libs/fpga_clkgen/fpga_clkgen_utils.c>`__ + to simplify clock configuration for the user application. + +3. F2 supports same clock recipe build switches as F1 to simplify + porting of F1 designs into F2. + +References +---------- + +`F1 Dynamic Clock +Configuration `__ diff --git a/docs-rtd/source/hdk/docs/RTL_Simulation_Guide_for_HDK_Design_Flow.rst b/docs-rtd/source/hdk/docs/RTL_Simulation_Guide_for_HDK_Design_Flow.rst new file mode 100644 index 000000000..f59a0baba --- /dev/null +++ b/docs-rtd/source/hdk/docs/RTL_Simulation_Guide_for_HDK_Design_Flow.rst @@ -0,0 +1,1418 @@ +RTL Simulation Guide for HDK Design Flow +======================================== + +Table of Contents +----------------- + +- `Introduction <#introduction>`__ +- `Quick Start <#quick-start>`__ + + - `Use F2 Developer AMI <#use-f2-developer-ami>`__ + - `Install the HDK and Setup + Environment <#install-the-hdk-and-setup-environment>`__ + - `Try Out One of HDK Examples or Write Your + Own <#try-out-one-of-hdk-examples-or-write-your-own>`__ + - `Xilinx's Library + Compilation <#xilinxs-library-compilation-complib_dir>`__ + +- `Create Your Own Tests for RTL + Simulation <#create-your-own-tests-for-rtl-simulation>`__ + + - `SystemVerilog Tests <#systemverilog-tests>`__ + +- `Accessing Host Memory During + Simulation <#accessing-host-memory-during-simulation>`__ +- `Debugging Custom Logic using the AWS + HDK <#debugging-custom-logic-using-the-aws-hdk>`__ + + - `Protocol Checkers <#protocol-checkers>`__ + - `Re-Run Simulation to Dump + Waves <#re-run-simulation-to-dump-waves>`__ + - `View Waves in Vivado Using Tcl <#view-waves-in-vivado-using-tcl>`__ + +- `SV Test API Reference <#sv-test-api-reference>`__ +- `C Test API Reference <#c-test-api-reference>`__ + +Introduction +------------ + +The HDK development environment comes with a shell simulation model that +supports RTL-level simulation using Vivado XSIM, Synopsys VCS or Siemens +Questa RTL simulators. Developers can leverage this simulation model and +create test cases in SystemVerilog to verify CL design's +functionalities. + +|alt tag| + +Quick Start +----------- + +Use F2 Developer AMI +~~~~~~~~~~~~~~~~~~~~ + +One easy way is to use the F2 Developer AMI that will be shared +privately with the customers. This developer AMI comes with +pre-installed Vivado tools and license. + +Please refer to the `release notes <../../RELEASE_NOTES.md>`__ or the +`supported Vivado version <../../supported_vivado_versions.txt>`__ for +the exact version of Vivado tools, and the required license components. + +Install the HDK and Setup Environment +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +AWS FPGA HDK can be cloned and installed on your EC2 instance or server +by calling: + +.. code:: bash + + git clone https://github.com/aws/aws-fpga.git + cd aws-fpga + source hdk_setup.sh + +Try Out One of HDK Examples or Write Your Own +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. code:: bash + + # $CL_DIR must be set before running simulations + export CL_DIR=$PWD/hdk/cl/examples/cl_sde + + # Simulations are launched from the scripts subdir of the design + cd ${CL_DIR}/verif/scripts + + # Run the default test using the VCS SIM + export TEST_NAME=test_ddr + make ${TEST_NAME} VCS=1 + + # To view the test log files (this is defined by SIM_DIR makefile variable) + cd ${CL_DIR}/verif/sim/vcs/${TEST_NAME}_sv + # Compile log + vi compile.vcs.log + # Simulation run log file + vi ${TEST_NAME}.log + +The call of the ``make ${TEST_NAME}`` as above executes following steps. + ++-------+-------------+----------------------------------------------+ +| Order | Flow | Description | ++=======+=============+==============================================+ +| 1st | ``ip-gen`` | Generate Xilinx IPs. Executed only once when | +| | | the IPs are initially generated. \ **NOTE:** | +| | | An IP must be regenerated if the IP's XCI | +| | | file gets updated | ++-------+-------------+----------------------------------------------+ +| 2nd | ``complib`` | Compile Xilinx libraries. Executed only once | +| | | when the libraries are initially compiled | ++-------+-------------+----------------------------------------------+ +| 3rd | ``compile`` | compile RTL source and testbench | ++-------+-------------+----------------------------------------------+ +| 4th | ``pre-run`` | Pre-simulation. Generate simulation input | +| | | files etc | ++-------+-------------+----------------------------------------------+ +| 5th | ``run`` | Run the simulation | ++-------+-------------+----------------------------------------------+ + +Xilinx's Library Compilation (``COMPLIB_DIR``) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +When using simulator other than Vivado SIM, the Xilinx's library will be +compiled under the ``COMPLIB_DIR``. The default ``COMPLIB_DIR`` path is +identified as below. + +.. code:: bash + + COMPLIB_DIR = $CL_DIR/verif/sim//_complib + +Compiling the Xilinx's library is very time consuming and can take up to +2 hours to complete. User can skip this step if they already have a +pre-compiled Xilinx library that was compiled using the current Vivado +version. + +Please do as below steps to setup to use the pre-compiled Xilinx library +instead of getting it to be compiled for each clean clone of aws-fpga +into a new directory. + +- Set the COMPLIB_DIR environment variable pointing to the pre-compiled + Xilinx library. + +.. code:: bash + + export COMPLIB_DIR=/path/to/user/complib/dir + +- Create a ``.done`` file under the ``COMPLIB_DIR`` to tell the Makefile + system to not recompile + +.. code:: bash + + touch $COMPLIB_DIR/.done + +Create Your Own Tests for RTL Simulation +---------------------------------------- + +SystemVerilog Tests +~~~~~~~~~~~~~~~~~~~ + +One fast way to write your own test is to start with an example test +from one of the examples designs and customize it for your design. All +SV tests must be placed in the verif/tests sub-directory of CL design +root and use the ".sv" file extension. + +.. code:: bash + + cl_my_design # Custom Logic (CL) design root directory + |-- build + |-- design + |-- software + | `--runtime # C source files and header files for simulation + +-- verif + |-- scripts # Makefiles and file lists + |-- sim # sim results directory + |-- sv # additional CL-specific test bench source + +-- tests # test directory + +**NOTE:** All the tests are written to run on 64-bit instances/servers +with 64-bit Linux OS. Many of the tests and reference Custom Logic (CL) +examples use 64-bit address formats + +.. code:: verilog + + module test_peek_poke(); + + `define WR_INSTR_INDEX 64'h1c + `define WR_ADDR_LOW 64'h20 + `define WR_ADDR_HIGH 64'h24 + `define WR_DATA 64'h28 + `define WR_SIZE 64'h2c + + `define RD_INSTR_INDEX 64'h3c + `define RD_ADDR_LOW 64'h40 + `define RD_ADDR_HIGH 64'h44 + `define RD_DATA 64'h48 + `define RD_SIZE 64'h4c + + `define CNTL_REG 64'h08 + + `define WR_START_BIT 32'h00000001 + `define RD_START_BIT 32'h00000002 + + logic [63:0] pcim_address = 64'h0000_0000_1234_0000; + + initial begin + + tb.power_up(); + + tb.poke_ocl(`WR_INSTR_INDEX, 0); // write index + tb.poke_ocl(`WR_ADDR_LOW, pcim_address[31:0]); // write address low + tb.poke_ocl(`WR_ADDR_HIGH, pcim_address[63:32]); // write address high + tb.poke_ocl(`WR_DATA, 32'h0000_0000); // write data + tb.poke_ocl(`WR_SIZE, 32'h0000_0002); // write 32b + + tb.poke_ocl(`RD_INSTR_INDEX, 0); // read index + tb.poke_ocl(`RD_ADDR_LOW, pcim_address[31:0]); // read address low + tb.poke_ocl(`RD_ADDR_HIGH, pcim_address[63:32]); // read address high + tb.poke_ocl(`RD_DATA, 32'h0000_0000); // read data + tb.poke_ocl(`RD_SIZE, 32'h0000_0002); // read 32b + + tb.poke_ocl(`CNTL_REG, 32'h0003); // start read & write + + #500ns; // give the hardware time to run + + ... + + tb.power_down(); + + $finish; + end + + endmodule // test_peek_poke + +Once your test is written, you are ready to run a simulation. The +``/scripts`` directory is where you must launch all simulations. + +.. code:: bash + + cd ${CL_DIR}/verif/scripts + # Compile and run using XSIM by default (NOTE: Do Not include .sv) + make TEST='' + # To view the test log files, `cd` here + cd ${CL_DIR}/verif/sim// + +If your have Cadence and Synopsys VCS RTL simulator or Modelsim Questa, +then add ``VCS=1`` or ``QUESTA=1``. + +.. code:: bash + + make TEST='' VCS=1 + +All of the default tests include Makefile targets under +``$CL_DIR/verif/scripts/Makefile.tests``. Some tests require additional +environment variables to be set to configure the design. HBM specific +tests require ``VCS=1`` or ``QUESTA=1`` as well as ``COMPILE_HBM`` to be +defined. + +Use only the SV test APIs supplied with the developer's kit to stimulate +your CL design. They were designed specifically to mimic the behavior of +the actual AWS Shell logic. If you choose to control CL signaling via +another method, proper operation with Shell logic is not guaranteed. + +The AWS Shell Interface specification can be found +`here <./AWS_Shell_Interface_Specification.md>`__ + +Accessing Host Memory During Simulation +--------------------------------------- + +Your design may share data between host memory and logic within the CL. +To verify your CL is accessing host memory, the test bench includes a +host memory implemented using an associative array. The address is the +key to locate a 32-bit data value. + +.. code:: verilog + + logic [31:0] sv_host_memory[*]; + +If you are are using C to verify your CL, then use C domain host memory. +Allocate a memory buffer in your C code and pass the pointer to the SV +domain. The AXI BFM connected to the PCIM port will use DPI calls to +read and write the memory buffer. + +Backdoor access to host memory is provided by two functions: + +.. code:: c + + function void hm_put_byte(input longint unsigned addr, byte d); + function byte hm_get_byte(input longint unsigned addr); + +Use these functions when you need to access data in the host memory. +They take zero simulation time and are useful for initializing memory or +checking results stored in memory. + +Debugging Custom Logic using the AWS HDK +---------------------------------------- + +If a simulation fails, developers can debug issues by dumping waves of +the simulation and then view them to determine the source of the +problem. + +The process for dumping and viewing waves can differ depending on the +simulator being used. To dump and view waves using the Xilinx Vivado +tools included with the AWS HDK: + +- Specify scope of logic for wave dump +- Re-run simulation to dump waves +- View waves in Vivado using Tcl + +VCS .vpd files can be found under +``$CL_DIR/verif/sim/vcs/_sv/.vpd`` and viewed with DVE. + +Protocol Checkers +~~~~~~~~~~~~~~~~~ + +Xilinx Protocol Checkers are instantiated on all AXI4 and AXIL +interfaces in Shell BFM. By default, all the tests run with protocol +checkers enabled. If there is a protocol error in any one of the AXI +interfaces, then the protocol checker will fire an error as below. + +.. code:: verilog + + tb.card.fpga.sh.axl_pc_sda_slv_inst.REP : BIT( 35) : ERROR : Invalid state x + tb.card.fpga.sh.axi_pc_mstr_inst_pcim.REP : BIT( 33) : ERROR : Invalid state x + tb.card.fpga.sh.axi_pc_mstr_inst_pcis.REP : BIT( 35) : ERROR : Invalid state x + tb.card.fpga.sh.axl_pc_ocl_slv_inst.REP : BIT( 35) : ERROR : Invalid state x + +Please refer to the `protocol +checker <./../common/verif/models/xilinx_axi_pc/axi_protocol_checker_v1_1_vl_rfs.v>`__ +for mapping between bit positions and the protocol errors. + +Re-Run Simulation to Dump Waves +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Once ``waves.tcl`` has been modified, re-run the simulation with +``make`` as shown at the top of this document. + +View Waves in Vivado Using Tcl +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +As mentioned above, all simulation results will be placed in +``sim/vivado/``. If using the included CL examples, the waves +database should appear as ``tb.wdb``. + +To view the waves, first create a Tcl file called ``open_waves.tcl`` +with the following commands: + +.. code:: tcl + + current_fileset + open_wave_database tb.wdb + +Then open Vivado and specify this Tcl file to execute: + +.. code:: bash + + vivado -source open_waves.tcl + +The design hierarchy and waves should then be visible and can be +inspected and debugged + +The usage of Vivado for wave debug is beyond the scope of this document. +See the `Vivado Design Suite +Tutorials `__ +for more details. + +SV Test API Reference +--------------------- + +*set_virtual_dip_switch* +~~~~~~~~~~~~~~~~~~~~~~~~ + +Description +^^^^^^^^^^^ + +Writes virtual dip switches. + +Declaration +^^^^^^^^^^^ + +task set_virtual_dip_switch(input int slot_id=0, int dip); +'''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + +======== ======================== +Argument Description +======== ======================== +slot_id Slot ID +dip 16bit dip switch setting +======== ======================== + +*get_virtual_dip_switch* +~~~~~~~~~~~~~~~~~~~~~~~~ + +.. _description-1: + +Description +^^^^^^^^^^^ + +Reads virtual dip switches. + +.. _declaration-1: + +Declaration +^^^^^^^^^^^ + +function logic [15:0] get_virtual_dip_switch(input int slot_id=0); +'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + +======== =========== +Argument Description +======== =========== +slot_id Slot ID +======== =========== + +*get_virtual_led* +~~~~~~~~~~~~~~~~~ + +.. _description-2: + +Description +^^^^^^^^^^^ + +Reads virtual LEDs. + +.. _declaration-2: + +Declaration +^^^^^^^^^^^ + +function logic [15:0] get_virtual_led(input int slot_id=0); +''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + +======== =========== +Argument Description +======== =========== +slot_id Slot ID +======== =========== + +*kernel_reset* +~~~~~~~~~~~~~~ + +.. _description-3: + +Description +^^^^^^^^^^^ + +Issues a kernel reset. + +.. _declaration-3: + +Declaration +^^^^^^^^^^^ + +.. _function-void-kernel_resetinput-int-slot_id0-logic-d--1: + +function void kernel_reset(input int slot_id=0, logic d = 1); +''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + +======== =========== +Argument Description +======== =========== +slot_id Slot ID +d reset value +======== =========== + +*poke* +~~~~~~ + +.. _description-4: + +Description +^^^^^^^^^^^ + +The SV Test API task 'poke' writes 512 bits of data to the CL via the +AXI PCIeS interface. + +.. _declaration-4: + +Declaration +^^^^^^^^^^^ + +.. _task-pokeinput-int-slot_id--0-logic-630-addr-logic-5110-data-logic-50-id--6h0-datasizedata_size-size--datasizeuint32-axiportaxi_port-intf--axiportport_dma_pcis: + +task poke(input int slot_id = 0, logic [63:0] addr, logic [511:0] data, logic [5:0] id = 6'h0, DataSize::DATA_SIZE size = DataSize::UINT32, AxiPort::AXI_PORT intf = AxiPort::PORT_DMA_PCIS); +''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + +======== ============= +Argument Description +======== ============= +slot_id Slot ID +addr Write Address +data Write Data +id AXI ID +size Data Size +intf AXI CL Port +======== ============= + +*poke_pcis* +~~~~~~~~~~~ + +.. _description-5: + +Description +^^^^^^^^^^^ + +The SV Test API task 'poke_pcis' writes 512 bits of data to the CL via +the AXI PCIE interface. + +.. _declaration-5: + +Declaration +^^^^^^^^^^^ + +.. _task-poke_pcisinput-int-slot_id--0-logic-630-addr-logic-5110-data-logic-630-strb-logic-50-id--6h0: + +task poke_pcis(input int slot_id = 0, logic [63:0] addr, logic [511:0] data, logic [63:0] strb, logic [5:0] id = 6'h0); +''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + +======== ============= +Argument Description +======== ============= +slot_id Slot ID +addr Write Address +data Write Data +strb Write Strobe +id AXI ID +======== ============= + +*poke_pcis_wc* +~~~~~~~~~~~~~~ + +.. _description-6: + +Description +^^^^^^^^^^^ + +The SV Test API task 'poke' writes 64 bits of data to the CL via the AXI +PCIeS interface. + +.. _declaration-6: + +Declaration +^^^^^^^^^^^ + +.. _task-poke_pcis_wcinput-int-slot_id--0-input-logic-630-addr-logic-310-data--logic-50-id--6h0-logic-20-size--3d6: + +task poke_pcis_wc(input int slot_id = 0, input logic [63:0] addr, logic [31:0] data [$], logic [5:0] id = 6'h0, logic [2:0] size = 3'd6); +''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + +======== ======================= +Argument Description +======== ======================= +slot_id Slot ID +addr Write Address +data [$] DW array for Write Data +id AXI ID +size Data Size +======== ======================= + +*peek* +~~~~~~ + +.. _description-7: + +Description +^^^^^^^^^^^ + +The SV Test API task 'peek' reads up to 512 bits of data from the CL via +the AXI PCIeS interface. + +.. _declaration-7: + +Declaration +^^^^^^^^^^^ + +.. _task-peekinput-int-slot_id--0-input-logic-630-addr-output-logic-5110-data-input-logic-50-id--6h0-datasizedata_size-size--datasizeuint32-axiportaxi_port-intf--axiportport_dma_pcis: + +task peek(input int slot_id = 0, input logic [63:0] addr, output logic [511:0] data, input logic [5:0] id = 6'h0, DataSize::DATA_SIZE size = DataSize::UINT32, AxiPort::AXI_PORT intf = AxiPort::PORT_DMA_PCIS); +'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + +======== ============ +Argument Description +======== ============ +slot_id Slot ID +addr Read Address +data Read Data +id AXI ID +size Data Size +intf AXI CL Port +======== ============ + +*peek_pcis* +~~~~~~~~~~~ + +.. _description-8: + +Description +^^^^^^^^^^^ + +The SV Test API function 'task peek_pcis' reads 512 bits of data from +the CL via the AXI PCIS interface. + +.. _declaration-8: + +Declaration +^^^^^^^^^^^ + +.. _task-peek_pcisinput-int-slot_id--0-logic-630-addr-output-logic-5110-data-input-logic-50-id--6h0: + +task peek_pcis(input int slot_id = 0, logic [63:0] addr, output logic [511:0] data, input logic [5:0] id = 6'h0); +''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + +======== ============ +Argument Description +======== ============ +slot_id Slot ID +addr Read Address +data Read Data +id AXI ID +======== ============ + +*issue_flr* +~~~~~~~~~~~ + +.. _description-9: + +Description +^^^^^^^^^^^ + +Issues a PCIe Function Level Reset (FLR). + +.. _declaration-9: + +Declaration +^^^^^^^^^^^ + +task issue_flr(input int slot_id=0); +'''''''''''''''''''''''''''''''''''' + +======== =========== +Argument Description +======== =========== +slot_id Slot ID +======== =========== + +*nsec_delay* +~~~~~~~~~~~~ + +.. _description-10: + +Description +^^^^^^^^^^^ + +Wait dly nanoseconds. + +.. _declaration-10: + +Declaration +^^^^^^^^^^^ + +.. _task-nsec_delayinput-int-dly--10000: + +task nsec_delay(input int dly = 10000); +''''''''''''''''''''''''''''''''''''''' + +======== ==================== +Argument Description +======== ==================== +dly delay in nanoseconds +======== ==================== + +*poke_ocl* +~~~~~~~~~~ + +.. _description-11: + +Description +^^^^^^^^^^^ + +The SV Test API task 'poke_ocl' writes 32 bits of data to the CL via the +AXI OCL interface. + +.. _declaration-11: + +Declaration +^^^^^^^^^^^ + +.. _task-poke_oclinput-int-slot_id--0-logic-630-addr-logic-310-data-logic-50-id--6h0: + +task poke_ocl(input int slot_id = 0, logic [63:0] addr, logic [31:0] data, logic [5:0] id = 6'h0); +'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + +======== ============= +Argument Description +======== ============= +slot_id Slot ID +addr Write Address +data Write Data +id AXI ID +======== ============= + +*peek_ocl* +~~~~~~~~~~ + +.. _description-12: + +Description +^^^^^^^^^^^ + +The SV Test API function 'task peek_ocl' reads 64 bits of data from the +CL via the AXI OCL interface. + +.. _declaration-12: + +Declaration +^^^^^^^^^^^ + +.. _task-peek_oclinput-int-slot_id--0-logic-630-addr-output-logic-630-data-input-logic-50-id--6h0: + +task peek_ocl(input int slot_id = 0, logic [63:0] addr, output logic [63:0] data, input logic [5:0] id = 6'h0); +''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + +======== ============ +Argument Description +======== ============ +slot_id Slot ID +addr Read Address +data Read Data +id AXI ID +======== ============ + +*poke_sda* +~~~~~~~~~~ + +.. _description-13: + +Description +^^^^^^^^^^^ + +The SV Test API task 'poke_sda' writes 32 bits of data to the CL via the +AXI OCL interface. + +.. _declaration-13: + +Declaration +^^^^^^^^^^^ + +.. _task-poke_sdainput-int-slot_id--0-logic-630-addr-logic-310-data-logic-50-id--6h0: + +task poke_sda(input int slot_id = 0, logic [63:0] addr, logic [31:0] data, logic [5:0] id = 6'h0); +'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + +======== ============= +Argument Description +======== ============= +slot_id Slot ID +addr Write Address +data Write Data +id AXI ID +======== ============= + +*peek_sda* +~~~~~~~~~~ + +.. _description-14: + +Description +^^^^^^^^^^^ + +The SV Test API function 'task peek_sda' reads 64 bits of data from the +CL via the AXI SDA interface. + +.. _declaration-14: + +Declaration +^^^^^^^^^^^ + +.. _task-peek_sdainput-int-slot_id--0-logic-630-addr-output-logic-630-data-input-logic-50-id--6h0: + +task peek_sda(input int slot_id = 0, logic [63:0] addr, output logic [63:0] data, input logic [5:0] id = 6'h0); +''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + +======== ============ +Argument Description +======== ============ +slot_id Slot ID +addr Read Address +data Read Data +id AXI ID +======== ============ + +*is_dma_to_cl_done* +~~~~~~~~~~~~~~~~~~~ + +.. _description-15: + +Description +^^^^^^^^^^^ + +Returns non-zero if the DMA to the CL is complete. + +.. _declaration-15: + +Declaration +^^^^^^^^^^^ + +.. _function-bit-is_dma_to_cl_doneinput-int-slot_id--0-input-int-chan: + +function bit is_dma_to_cl_done(input int slot_id = 0, input int chan); +'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + +======== ======================== +Argument Description +======== ======================== +slot_id Slot ID +chan DMA channel to use (0-3) +======== ======================== + +*is_dma_to_buffer_done* +~~~~~~~~~~~~~~~~~~~~~~~ + +.. _description-16: + +Description +^^^^^^^^^^^ + +Returns non-zero if the DMA to the buffer is complete. + +.. _declaration-16: + +Declaration +^^^^^^^^^^^ + +.. _function-bit-is_dma_to_buffer_doneinput-int-slot_id--0-input-int-chan: + +function bit is_dma_to_buffer_done(input int slot_id = 0, input int chan); +'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + +======== ======================== +Argument Description +======== ======================== +slot_id Slot ID +chan DMA channel to use (0-3) +======== ======================== + +*set_chk_clk_freq* +~~~~~~~~~~~~~~~~~~ + +.. _description-17: + +Description +^^^^^^^^^^^ + +The SV test API function 'function void set_chk_clk_freq(input int +slot_id = 0, logic chk_freq = 1'b1);' is used to enable frequency checks +in shell model. + +.. _declaration-17: + +Declaration +^^^^^^^^^^^ + +.. _function-void-set_chk_clk_freqinput-int-slot_id--0-logic-chk_freq--1b1: + +function void set_chk_clk_freq(input int slot_id = 0, logic chk_freq = 1'b1); +''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + +======== =========== +Argument Description +======== =========== +slot_id Slot ID +chk_freq enable bit +======== =========== + +*chk_prot_err_stat* +~~~~~~~~~~~~~~~~~~~ + +.. _description-18: + +Description +^^^^^^^^^^^ + +The SV test API function 'function logic chk_prot_err_stat(input int +slot_id = 0);' is used to check protocol error status. + +.. _declaration-18: + +Declaration +^^^^^^^^^^^ + +.. _function-logic-chk_clk_err_cntinput-int-slot_id--0: + +function logic chk_clk_err_cnt(input int slot_id = 0); +'''''''''''''''''''''''''''''''''''''''''''''''''''''' + +======== =========== +Argument Description +======== =========== +slot_id Slot ID +======== =========== + +*que_buffer_to_cl* +~~~~~~~~~~~~~~~~~~ + +.. _description-19: + +Description +^^^^^^^^^^^ + +Queues a buffer for the DMA to send data to the CL. + +.. _declaration-19: + +Declaration +^^^^^^^^^^^ + +.. _function-void-que_buffer_to_clinput-int-slot_id--0-int-chan-logic-630-src_addr-logic-630-cl_addr-logic-270-len: + +function void que_buffer_to_cl(input int slot_id = 0, int chan, logic [63:0] src_addr, logic [63:0] cl_addr, logic [27:0] len); +''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + +======== ======================== +Argument Description +======== ======================== +slot_id Slot ID +chan DMA channel to use (0-3) +src_addr Data's Source Address +cl_addr Custom Logic Address +len Length of DMA in bytes +======== ======================== + +*que_cl_to_buffer* +~~~~~~~~~~~~~~~~~~ + +.. _description-20: + +Description +^^^^^^^^^^^ + +Queues a buffer for the DMA to receive data from the CL. + +.. _declaration-20: + +Declaration +^^^^^^^^^^^ + +.. _function-void-que_cl_to_bufferinput-int-slot_id--0-int-chan-logic-630-dst_addr-logic-630-cl_addr-logic-270-len: + +function void que_cl_to_buffer(input int slot_id = 0, int chan, logic [63:0] dst_addr, logic [63:0] cl_addr, logic [27:0] len); +''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + +======== ========================== +Argument Description +======== ========================== +slot_id Slot ID +chan DMA channel to use (0-3) +dst_addr Data's Destination Address +cl_addr Custom Logic Address +len Length of DMA in bytes +======== ========================== + +*start_que_to_cl* +~~~~~~~~~~~~~~~~~ + +.. _description-21: + +Description +^^^^^^^^^^^ + +Starts the DMA operation to the CL. + +.. _declaration-21: + +Declaration +^^^^^^^^^^^ + +.. _function-void-start_que_to_clinput-int-slot_id--0-int-chan: + +function void start_que_to_cl(input int slot_id = 0, int chan); +''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + +======== ======================== +Argument Description +======== ======================== +slot_id Slot ID +chan DMA channel to use (0-3) +======== ======================== + +*start_que_to_buffer* +~~~~~~~~~~~~~~~~~~~~~ + +.. _description-22: + +Description +^^^^^^^^^^^ + +Starts the DMA operation from the CL. + +.. _declaration-22: + +Declaration +^^^^^^^^^^^ + +.. _function-void-start_que_to_bufferinput-int-slot_id--0-int-chan: + +function void start_que_to_buffer(input int slot_id = 0, int chan); +''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + +======== ======================== +Argument Description +======== ======================== +slot_id Slot ID +chan DMA channel to use (0-3) +======== ======================== + +*map_host_memory* +~~~~~~~~~~~~~~~~~ + +.. _description-23: + +Description +^^^^^^^^^^^ + +The SV Test API function 'task map_host_memory(input logic [63:0] addr)' +maps host memory to 64-bit address. + +.. _declaration-23: + +Declaration +^^^^^^^^^^^ + +task map_host_memory(input logic [63:0] addr); +'''''''''''''''''''''''''''''''''''''''''''''' + +======== =========== +Argument Description +======== =========== +addr Address +======== =========== + +*hm_put_byte* +~~~~~~~~~~~~~ + +.. _description-24: + +Description +^^^^^^^^^^^ + +The SV Test API function 'function void hm_put_byte(input longint +unsigned addr, byte d)' is used to backdoor load host memory. + +.. _declaration-24: + +Declaration +^^^^^^^^^^^ + +function void hm_put_byte(input longint unsigned addr, byte d); +''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + +======== =========== +Argument Description +======== =========== +addr Address +d data +======== =========== + +*hm_get_byte* +~~~~~~~~~~~~~ + +.. _description-25: + +Description +^^^^^^^^^^^ + +The SV Test API function 'function void hm_get_byte(input longint +unsigned addr)' is used to read data from host memory using backdoor. + +.. _declaration-25: + +Declaration +^^^^^^^^^^^ + +function void hm_get_byte(input longint unsigned addr); +''''''''''''''''''''''''''''''''''''''''''''''''''''''' + +======== =========== +Argument Description +======== =========== +addr Address +======== =========== + +C Test API Reference +-------------------- + +*cl_poke* +~~~~~~~~~ + +.. _description-26: + +Description +^^^^^^^^^^^ + +The C Test API function 'extern void cl_poke(uint64_t addr, uint32_t +data)' writes 32 bits of data to the CL via the AXI PCIeS interface. +This function calls the SV poke function via DPI calls. + +.. _declaration-26: + +Declaration +^^^^^^^^^^^ + +extern void cl_poke(uint64_t addr, uint32_t data); +'''''''''''''''''''''''''''''''''''''''''''''''''' + +======== ============= +Argument Description +======== ============= +addr Write Address +data Write Data +======== ============= + +*cl_peek* +~~~~~~~~~ + +.. _description-27: + +Description +^^^^^^^^^^^ + +The C Test API function 'extern void cl_peek(uint64_t addr)' Reads 32 +bits of data from the CL via the AXI PCIeS interface. This function +calls the SV peek function via DPI calls. + +.. _declaration-27: + +Declaration +^^^^^^^^^^^ + +extern void cl_peek(uint64_t addr, uint32_t data); +'''''''''''''''''''''''''''''''''''''''''''''''''' + +======== ============ +Argument Description +======== ============ +addr Read Address +data Read Data +======== ============ + +*sv_map_host_memory* +~~~~~~~~~~~~~~~~~~~~ + +.. _description-28: + +Description +^^^^^^^^^^^ + +The C Test API function 'extern void sv_map_host_memory(uint8_t +\*memory)' maps host memory to memory allocated by memory buffer. This +function calls the SV map_host_memory function via DPI calls. + +.. _declaration-28: + +Declaration +^^^^^^^^^^^ + +extern void sv_map_host_memory(uint8_t \*memory); +''''''''''''''''''''''''''''''''''''''''''''''''' + +======== ======================== +Argument Description +======== ======================== +\*memory pointer to memory buffer +======== ======================== + +*host_memory_putc* +~~~~~~~~~~~~~~~~~~ + +.. _description-29: + +Description +^^^^^^^^^^^ + +The C Test API function 'void host_memory_putc(uint64_t addr, uint8_t +data)' is used to backdoor load host memory. + +.. _declaration-29: + +Declaration +^^^^^^^^^^^ + +void host_memory_putc(uint64_t addr, uint8_t data) +'''''''''''''''''''''''''''''''''''''''''''''''''' + +======== =========== +Argument Description +======== =========== +addr Address +data data +======== =========== + +*host_memory_getc* +~~~~~~~~~~~~~~~~~~ + +.. _description-30: + +Description +^^^^^^^^^^^ + +The C Test API function 'void host_memory_getc(uint64_t addr)' is used +to backdoor load host memory. + +.. _declaration-30: + +Declaration +^^^^^^^^^^^ + +.. _void-host_memory_putcuint64_t-addr-uint8_t-data-1: + +void host_memory_putc(uint64_t addr, uint8_t data) +'''''''''''''''''''''''''''''''''''''''''''''''''' + +======== =========== +Argument Description +======== =========== +addr Address +======== =========== + +*log_printf* +~~~~~~~~~~~~ + +.. _description-31: + +Description +^^^^^^^^^^^ + +The C Test API function 'void log_printf(const char \*format, ...)' is +used to print messages when running a simulation. The regular 'C' printf +will not work when running a 'C' and 'SV' mixed language simulation. +This 'C' function calls SV function sv_printf via DPI calls. + +.. _declaration-31: + +Declaration +^^^^^^^^^^^ + +.. _void-log_printfconst-char-format-: + +void log_printf(const char \*format, ...); +'''''''''''''''''''''''''''''''''''''''''' + +======== ===================== +Argument Description +======== ===================== +\*format message to be printed +======== ===================== + +*sv_printf* +~~~~~~~~~~~ + +.. _description-32: + +Description +^^^^^^^^^^^ + +The C Test API function 'extern void sv_printf(char \*msg)' is used to +send a message buffer to the SV side of simulation. + +.. _declaration-32: + +Declaration +~~~~~~~~~~~ + +extern void sv_printf(char \*msg); +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +======== ================ +Argument Description +======== ================ +\*msg Character buffer +======== ================ + +*sv_pause* +~~~~~~~~~~ + +.. _description-33: + +Description +^^^^^^^^^^^ + +The C test API function 'extern void sv_pause(uint32_t x);' is used to +add delay to a simulation. + +.. _declaration-33: + +Declaration +^^^^^^^^^^^ + +extern void sv_pause(uint32_t x); +''''''''''''''''''''''''''''''''' + +======== ====================== +Argument Description +======== ====================== +x Delay in micro seconds +======== ====================== + +*sv_fpga_start_buffer_to_cl* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. _description-34: + +Description +^^^^^^^^^^^ + +The C test API function 'extern "DPI-C" task +sv_fpga_start_buffer_to_cl;' is used to do DMA data transfer from Host +to CL. + +.. _declaration-34: + +Declaration +^^^^^^^^^^^ + +extern void sv_fpga_start_buffer_to_cl(uint32_t slot_id, uint32_t chan, uint32_t buf_size, const char \*wr_buffer, uint64_t cl_addr); +''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + +========= ====================== +Argument Description +========= ====================== +slot_id Slot ID +chan DMA channel +buf_size Size of the buffer +wr_buffer Data to be transferred +cl_addr Destination CL address +========= ====================== + +*sv_fpga_start_cl_to_buffer* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. _description-35: + +Description +^^^^^^^^^^^ + +The C test API function 'extern "DPI-C" task +sv_fpga_start_cl_to_buffer;' is used to do DMA data transfer from Host +to CL. + +.. _declaration-35: + +Declaration +^^^^^^^^^^^ + +extern void sv_fpga_start_cl_to_buffer(uint32_t slot_id, uint32_t chan, uint32_t buf_size, uint64_t cl_addr); +''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + +========= ====================== +Argument Description +========= ====================== +slot_id Slot ID +chan DMA channel +buf_size Size of the buffer +wr_buffer Data to be transferred +cl_addr Destination CL address +========= ====================== + +*get_global_counter_0* +~~~~~~~~~~~~~~~~~~~~~~ + +.. _description-36: + +Description +^^^^^^^^^^^ + +The SV test API function 'function logic [63:0] +get_global_counter_0(input int slot_id = 0);' is used to get global +counter_0 value. + +.. _declaration-36: + +Declaration +^^^^^^^^^^^ + +.. _function-logic-630-get_global_counter_0input-int-slot_id--0: + +function logic [63:0] get_global_counter_0(input int slot_id = 0); +'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + +======== =========== +Argument Description +======== =========== +slot_id Slot ID +======== =========== + +*get_global_counter_1* +~~~~~~~~~~~~~~~~~~~~~~ + +.. _description-37: + +Description +^^^^^^^^^^^ + +The SV test API function 'function logic [63:0] +get_global_counter_1(input int slot_id = 0);' is used to get global +counter_1 value. + +.. _declaration-37: + +Declaration +^^^^^^^^^^^ + +.. _function-logic-630-get_global_counter_1input-int-slot_id--0: + +function logic [63:0] get_global_counter_1(input int slot_id = 0); +'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + +======== =========== +Argument Description +======== =========== +slot_id Slot ID +======== =========== + +.. |alt tag| image:: ./images/cl-sim-testbench.png diff --git a/docs-rtd/source/hdk/docs/Supported_DDR_Modes.rst b/docs-rtd/source/hdk/docs/Supported_DDR_Modes.rst new file mode 100644 index 000000000..04142cadc --- /dev/null +++ b/docs-rtd/source/hdk/docs/Supported_DDR_Modes.rst @@ -0,0 +1,109 @@ +.. _supported-ddr-configurations-in-sh_ddrsv: + +Supported DDR configurations in `sh_ddr.sv <./../common/shell_stable/design/sh_ddr/sh_ddr.stub.sv>`__ +===================================================================================================== + +Table of Contents +----------------- + +- `Supported DDR configurations in + sh_ddr.sv <#supported-ddr-configurations-in-sh_ddrsv>`__ + + - `Table of Contents <#table-of-contents>`__ + - `Overview <#overview>`__ + - `Required RTL Modifications <#required-rtl-modifications>`__ + - `Required Verification + Modifications <#required-verification-modifications>`__ + - `Required Build Script + Modifications <#required-build-script-modifications>`__ + +Overview +-------- + +The +`sh_ddr.sv <./../common/shell_stable/design/sh_ddr/sh_ddr.stub.sv>`__ +now supports following configurations for DDR Controller IPs: + +- DDR Core for 64 GB DIMM. +- DDR Core for 64 GB DIMM with user-controlled Auto-Precharge mode. This + feature allows user designs to issue DDR Auto-Precharge command by + asserting ``cl_sh_ddr_axi_awuser=1`` or ``cl_sh_ddr_axi_aruser=1`` + alongside their corresponding valid control signals. Please refer to + `PG150-User + Guide `__ + for details on user-controlled (app_auto-precharge) Auto-Precharge + mode. +- If DDR core is not required in the CL design, then users still have to + instantiate ``sh_ddr.sv`` in top level CL, with parameter tied off to + ``.DDR_PRESENT(0)``. Failing to do so may result in errors during + synthesis/implementation. + +Required RTL Modifications +-------------------------- + +`sh_ddr.sv <./../common/shell_stable/design/sh_ddr/sh_ddr.stub.sv>`__ +defaults to using 64 GB DDR core along with 64 GB DIMM model, and +without user-controlled Auto-Precharge mode. Users are allowed to define +one of the following macros in the top level of CL where ``sh_ddr.sv`` +is instantiated. This will automatically pick up the desired DDR +controller inside ``sh_ddr.sv``. Supported macros are shown below: + +- :literal:`\`define USE_64GB_DDR_DIMM` : This is 64GB DDR controller +- :literal:`\`define USE_AP_64GB_DDR_DIMM` : This is 64GB DDR controller + with user-controlled Auto Precharge + +For example, please refer to +`cl_mem_perf <./../cl/examples/cl_mem_perf/design/cl_mem_perf.sv>`__ +which has :literal:`\`define USE_AP_64GB_DDR_DIMM` macro to override +sh_ddr.sv to use 64GB DDR core with user controlled Auto-Precharge mode. + +Required Verification Modifications +----------------------------------- + +Users must pass the **same** macro as they defined in top level CL to +simulate with a corresponding DIMM model. + +.. code:: bash + + export TEST_NAME=test_ddr + + # To Run simulations with a 64 GB DDR DIMM + make TEST=${TEST_NAME} USE_64GB_DDR_DIMM=1 + + # To Run simulations with a 64 GB DDR DIMM and DDR core with user controlled auto-precharge mode + make TEST=${TEST_NAME} USE_AP_64GB_DDR_DIMM=1 + +⚠️ The macros passed during sims must match with what is defined in the +top level CL RTL file. Otherwise, users may risk running sims on +unintended DIMM models, yielding inconsistent results. + +Required Build Script Modifications +----------------------------------- + +AWS provides following DDR Core IPs as part of Vivado +`cl_ip.xpr <./../common/ip/cl_ip/cl_ip.xpr>`__ project. Users are +required to enlist one of the following XCI files in the synthesis +scripts, depending on the desired DDR configuration and macros defined: + ++----------------------+----------------------+----------------------+ +| Macro definition in | Description | DDR XCI file to read | +| top level CL | | in synthesis script | ++======================+======================+======================+ +| \`define | 64 GB DDR core | ``cl_ddr4.xci`` | +| USE_64GB_DDR_DIMM | without | | +| | user-controlled | | +| | Auto-Precharge mode. | | ++----------------------+----------------------+----------------------+ +| \`define | 64 GB DDR core with | `` | +| USE_AP_64GB_DDR_DIMM | user-controlled | cl_ddr4_64g_ap.xci`` | +| | Auto-Precharge mode. | | ++----------------------+----------------------+----------------------+ + +Alternately, users may choose to enlist all four DDR XCI files in their +synthesis script. The Vivado tool automatically elaborates the correct +DDR core based on the macro defined in top level CL file. For example, +`CL_MEM_PERF synthesis +script <./../cl/examples/cl_mem_perf/build/scripts/synth_cl_mem_perf.tcl>`__ +reads in all four XCI files but elaborates the desired DDR core at the +time of synthesis based on macro defined in +`cl_mem_perf.sv <./../cl/examples/cl_mem_perf/design/cl_mem_perf.sv>`__ diff --git a/docs-rtd/source/hdk/docs/Virtual_JTAG_XVC.rst b/docs-rtd/source/hdk/docs/Virtual_JTAG_XVC.rst new file mode 100644 index 000000000..cc5ebe1e0 --- /dev/null +++ b/docs-rtd/source/hdk/docs/Virtual_JTAG_XVC.rst @@ -0,0 +1,298 @@ +Virtual JTAG for Real-time FPGA Debug +===================================== + +Table of Contents +----------------- + +- `Virtual JTAG for Real-time FPGA + Debug <#virtual-jtag-for-real-time-fpga-debug>`__ + + - `Table of Contents <#table-of-contents>`__ + - `Overview <#overview>`__ + - `Install XVC Driver on F2 + Instances <#install-xvc-driver-on-f2-instances>`__ + - `Start Local Debug Server on F2 + Instances <#start-local-debug-server-on-f2-instances>`__ + - `Connect to target FPGA via Virtual + JTAG <#connect-to-target-fpga-via-virtual-jtag>`__ + - `Start Remote Debug Server on F2 Instances (Coming + Soon) <#start-remote-debug-server-on-f2-instances-coming-soon>`__ + - `Embedded Debug Bridge in CL <#embedded-debug-bridge-in-cl>`__ + - `Frequently Asked Questions <#frequently-asked-questions>`__ + +Overview +-------- + +Amazon EC2 F2 instances offer debugging capabilities through Virtual +JTAG. This feature leverages the Xilinx Virtual Cable (XVC) protocol to +emulate JTAG cable connectivity to a target FPGA over the PCIe +interface. Developers can connect to Xilinx debug cores, such as the +`Integrated Logic Analyzer +(ILA) `__ +and `Virtual Input/Output +(VIO) `__ +in Custom Logic (CL) designs within Vivado, to monitor, control, and +debug their designs. + +The Virtual JTAG solution consists of three main elements: + +- [A] Debug cores and a debug bridge that must be implemented and + connected properly in the CL design. + Refer to the `cl_dram_hbm_dma <../cl/examples/cl_dram_hbm_dma/README.html>`__ + example design for details. +- [B] A Virtual JTAG service acting as an XVC server that runs on the + target F2 instance. +- [C] A local or remote Vivado application for interactive debugging. + +Install XVC Driver on F2 Instances +---------------------------------- + +To begin debugging a CL design, the developer must first install the XVC +driver (skip this step if the driver is pre-installed). This section +provides a guide for installing the XVC driver on F2 instances using the +AWS FPGA developer AMI. For detailed compilation and installation +information, refer to the `AMD prodct +guide `__. + +1. Locate and unzip the XVC driver file from the Vivado tool installation + directory: + + ⚠️ Remember to update tool installation directory with the one if you own AMI. + The example below is for demonstration only. + + .. code:: bash + + unzip /opt/Xilinx/Vivado/2024.1/data/xicom/drivers/pcie/xvc_pcie.zip + cd driver_v0.4 + +2. To correctly bind the XVC driver to the FPGA, update the ``PCIE_VENDOR_ID`` + and ``PCIE_DEVICE_ID`` in ``xvc_pcie_user_config.h`` file: + + .. code:: bash + + vim xvc_pcie_user_config.h + + ... + #define PCIE_VENDOR_ID 0x1D0F // Update to use PF1 for Virtual JTAG + #define PCIE_DEVICE_ID 0x9248 // Update to use PF1 for Virtual JTAG + + ... + { + .name = "", + .config_space = AUTO, + .config_info = { + .config_vsec_id = 0x0008, + .config_vsec_rev = 0x0, + }, + .bar_info = { + .bar_index = 0x2, // Update to bind to BAR2 + .bar_offset = 0x0000, // Update to bind to offset 0 + }, + }, + + ⚠️ Developers may encounter a compilation error in some operating systems due + to driver incompatibility, like this: + + .. code:: bash + + /home/ubuntu/driver_v0.4/xvc_pcie_driver_base.c:306:25: error: too many arguments to function ‘class_create’ + 306 | xvc_dev_class = class_create(THIS_MODULE, "xil_xvc_class"); + +3. To resolve the error, update the ``xvc_pcie_driver_base.c`` file as follows: + + .. code:: C + + 305 // Register the character device class for the actual files + 306 xvc_dev_class = class_create("xil_xvc_class"); // Remove THIS_MODULE here + 307 if (IS_ERR(xvc_dev_class)) { + 308 xil_xvc_cleanup(); + 308 xil_xvc_cleanup(); + 309 return PTR_ERR(xvc_dev_class); + 310 } + +4. Next, compile and install the XVC driver: + + .. code:: bash + + sudo su + cd driver_v0.4 + make install + depmod -a + modprobe xilinx_xvc_pci_driver + lsmod | grep xilinx + ... + xilinx_xvc_pci_driver 20480 0 ---> This means XVC driver is successfully installed + +Start Local Debug Server on F2 Instances +---------------------------------------- + +To start the XVC server on a instance, run the ``xvc_pcie`` executable in Vivado +installation directory. The application should spit out the host server name and +port number. These information will later be used to create a virtual JTAG cable +in Vivado Hardware Manager. + +.. code:: bash + + sudo su + cd /opt/Xilinx/Vivado/2024.1/bin/ + ./xvc_pcie + + Description: + Xilinx xvc_pcie v2024.1 + Build date : May 22 2024-19:19:01 + Copyright 1986-2018 Xilinx, Inc. All Rights Reserved. + + INFO: XVC PCIe Driver character file - /dev/xil_xvc/cfg_ioc0 + INFO: XVC PCIe Driver configured to communicate with Debug Bridge IP in AXI mode (PCIe BAR space). + INFO: PCIe BAR index=0x0002 and PCIe BAR offset=0x0000 + INFO: XVC PCIE Driver Loopback test successful. + + INFO: xvc_pcie application started + INFO: Use Ctrl-C to exit xvc_pcie application + + INFO: To connect to this xvc_pcie instance use url: tcp:ip-172-31-8-59:10200 ---> This shows the host server name and the port nummber + +Connect to target FPGA via Virtual JTAG +--------------------------------------- + +With a XVC server up and running, a Virtual JTAG cable connection to the +target FPGA is ready to be built in Vivado. + +1. Prior to executing Vivado, verify that the ``.LTX`` probe file from the CL + design DCP tarball is saved on the instance. + + .. code:: bash + + $ tar -tvf 2024_08_21-122520.Developer_CL.tar + + drwxr-sr-x 0 2024-08-21 13:15 to_aws/ + -rw-r--r-- 91676787 2024-08-21 13:15 to_aws/2024_08_21-122520.SH_CL_routed.dcp + -rw-r--r-- 655601 2024-08-21 13:15 to_aws/2024_08_21-122520.debug_probes.ltx ---> This is the probe file + -rw-r--r-- 398 2024-08-21 13:54 to_aws/2024_08_21-122520.manifest.txt + +2. Open Vivado GUI and select "Open Hardware Manager" + +|vjtag_1| + +3. Click "Open target" and select the "Open New Target...". + +|vjtag_2| + +4. For hardware server setting, connect to "Local server" and click + "Next" + +|vjtag_3| + +5. Click "Add Xilinx Virtual Cable (XVC)" and put in "Host name" and "Port" + collected previously from the XVC server. Click "OK" to proceed. + +|vjtag_4| + +6. The debug bridge in the target design should be detected and listed in + "Hardware Targets". Click "Next" and "Finish" to finish setting up the + Virtual JTAG connection. + +|vjtag_5| + +7. All the debug cores embedded in the CL design should be now listed under + ``debug_bridge_0``. Highlight ``debug_bridge_0`` and add the CL design + ``.LTX`` probe file to "Probes file" in the "Hardware Device Properties" + window. After the probe file gets loaded, the waveform and configuration + windows will be available for each debug core in Vivado. The CL design at + this point is ready to be debugged. + +|vjtag_6| + +Start Remote Debug Server on F2 Instances (Coming Soon) +------------------------------------------------------- + +Guide for debugging designs through Vivado running on a remote machine +is coming soon. + +Embedded Debug Bridge in CL +--------------------------- + +The `CL_Debug_Bridge +<./../common/ip/cl_ip/cl_ip.srcs/sources_1/ip/cl_debug_bridge/cl_debug_bridge.xci>`__ +IP must be embedded in the CL design to enable the use of debug cores like ILA +and VIO. According to the `AMD user guide +`__ +, the clock of ``CL_Debug_Bridge`` must be at least 2.5 times faster than the +JTAG clock. The JTAG clock frequency is fixed at 31.25 MHz in the F2 shells. +Therefore, the frequency of the clock connected to the ``CL_Debug_Bridge`` +should be at least 2.5 x 31.25 MHz = 78.125 MHz. Failure to meet this +requirement will result in the debug network not functioning correctly. +However, this minimum clock frequency requirement does not apply to the ILA or +VIO debug cores or the rest of the CL logic. If the CL design is running on a +slower clock from the available clock recipes, care must be taken to ensure +that the ``CL_Debug_Bridge`` is clocked at 78.125 MHz or above. + +.. code:: verilog + + //----------------------------------- + // Debug bridge + //----------------------------------- + cl_debug_bridge CL_DEBUG_BRIDGE + ( + .clk (aclk ), + .S_BSCAN_drck (drck ), + .S_BSCAN_shift (shift ), + .S_BSCAN_tdi (tdi ), + .S_BSCAN_update (update ), + .S_BSCAN_sel (sel ), + .S_BSCAN_tdo (tdo ), + .S_BSCAN_tms (tms ), + .S_BSCAN_tck (tck ), + .S_BSCAN_runtest (runtest ), + .S_BSCAN_reset (reset ), + .S_BSCAN_capture (capture ), + .S_BSCAN_bscanid_en (bscanid_en ) + ); + +All debug cores within the CL must be connected to the ``CL_Debug_Bridge``. +These connections can be automatically inserted during the design synthesis +process. For an example implementation, please refer to the +`synth_cl_dram_hbm_dma.tcl script +<./../cl/examples/cl_dram_hbm_dma/build/scripts/synth_cl_dram_hbm_dma.tcl>`__ +in the cl_dram_hbm_dma example. + +.. code:: bash + + AWS FPGA: (12:35:47): Connecting debug network + + ## set cl_ila_cells [get_cells [list CL_ILA/CL_DMA_ILA_0 CL_ILA/ddr_A_hookup.CL_DDRA_ILA_0]] + ## if {$cl_ila_cells != ""} { + ## connect_debug_cores -master [get_cells [get_debug_cores -filter {NAME=~*CL_DEBUG_BRIDGE*}]] \ + ## -slaves $cl_ila_cells + ## } + + INFO: [Constraints 18-11670] Building netlist checker database with flags, 0x8 + Done building netlist checker database: Time (s): cpu = 00:00:00.12 ; elapsed = 00:00:00.13 . Memory (MB): peak = 7233.012 ; gain = 0.000 ; free physical = 1006692 ; free virtual = 1545285 + INFO: [Chipscope 16-344] Connected debug slave core CL_ILA/CL_DMA_ILA_0 to master core CL_ILA/CL_DEBUG_BRIDGE/inst/xsdbm + INFO: [Chipscope 16-344] Connected debug slave core CL_ILA/ddr_A_hookup.CL_DDRA_ILA_0 to master core CL_ILA/CL_DEBUG_BRIDGE/inst/xsdbm + connect_debug_cores: Time (s): cpu = 00:00:07 ; elapsed = 00:00:07 . Memory (MB): peak = 7233.012 ; gain = 0.000 ; free physical = 1006693 ; free virtual = 1545287 + +Frequently Asked Questions +-------------------------- + +**Q: Do I need full Vivado installation to run Virtual JTAG debug on a F2 +instance?** + +A: No. If you are utilizing the AWS FPGA developer AMI, you can leverage the +built-in Vivado. If you using a different runtime AMI, you can download the +standalone Vivado Lab Solutions from `AMD website +`__ +and use that for free. + +**Q: Do I need a Vivado license to use Virtual JTAG and Xilinx VIO/LIA debug +capabilities?** + +A: No. All you require is the Vivado Hardware Manager, which is included with +the Vivado Lab Solutions and is available free of charge. + +.. |vjtag_1| image:: ./../../_static/VJTAG_images/vjtag_1.jpg +.. |vjtag_2| image:: ./../../_static/VJTAG_images/vjtag_2.jpg +.. |vjtag_3| image:: ./../../_static/VJTAG_images/vjtag_3.jpg +.. |vjtag_4| image:: ./../../_static/VJTAG_images/vjtag_4.jpg +.. |vjtag_5| image:: ./../../_static/VJTAG_images/vjtag_5.jpg +.. |vjtag_6| image:: ./../../_static/VJTAG_images/vjtag_6.jpg diff --git a/docs-rtd/source/hdk/docs/on_premise_licensing_help.rst b/docs-rtd/source/hdk/docs/on_premise_licensing_help.rst new file mode 100644 index 000000000..a978448a8 --- /dev/null +++ b/docs-rtd/source/hdk/docs/on_premise_licensing_help.rst @@ -0,0 +1,41 @@ +Enabling on-premises development with Xilinx tools +================================================== + +This document helps developers who choose to develop on-premises with +specifying and licensing AWS-compatible Xilinx tools for use with the +AWS FPGA HDK. + +.. _requirements-for-aws-hdk-20241: + +Requirements for AWS HDK (2024.1) +--------------------------------- + +- Xilinx Vivado ML Enterprise Edition v2024.1 +- Floating License: ``EF-VIVADO-ENTER-FL`` +- Node locked License: ``EF-VIVADO-ENTER-NL`` +- `URL `__ +- MD5 SUM Value: ``372c0b184e32001137424e395823de3c`` + +Licensing Details +----------------- + +- On-Premises customers may need a new or updated license + + - New users will need to obtain a Vivado ML Enterprise license. This + can be purchased via the AMD website `Vivado License + Link `__ + - The correct ordering number for the Node-locked is + EF-VIVADO-ENTER-NL and Floating is EF-VIVADO-ENTER-FL + - Please send a request to xilinx_security_app@amd.com to have the + encryption license added to your existing one + - You can confirm you are using the correct license for this product + by ensuring you have the following in Xilinx License Manager: + + - EncryptedWriter_v2 + - Analyzer + - Synthesis + - Implementation + - HLS + - SDK + - Partial Reconfiguration + - Simulation diff --git a/docs-rtd/source/hdk/docs/shell_floorplan.rst b/docs-rtd/source/hdk/docs/shell_floorplan.rst new file mode 100644 index 000000000..719d02528 --- /dev/null +++ b/docs-rtd/source/hdk/docs/shell_floorplan.rst @@ -0,0 +1,17 @@ +Shell Floorplan Reference +========================= + +This document provides the floorplan of Small Shell + +Small Shell +----------- + +|Small_shell_floorplan| + +Recommendations +--------------- + +- PCIS bus is physically located in SLR1 in SMALL_SHELL. Any customer + logic interfacing with this bus should reside in SLR1. + +.. |Small_shell_floorplan| image:: ./../../_static/small_shell_fp.png diff --git a/docs-rtd/source/index.rst b/docs-rtd/source/index.rst new file mode 100644 index 000000000..b59defc2f --- /dev/null +++ b/docs-rtd/source/index.rst @@ -0,0 +1,55 @@ +.. F2 documentation master file, created by + sphinx-quickstart on Sat Nov 23 04:21:40 2024. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to F2's documentation! +============================== + +Contents: + +.. toctree:: + :maxdepth: 5 + + ERRATA + README + RELEASE_NOTES + User_Guide_AWS_EC2_FPGA_Development_Kit.rst + + developer_resources/DCV + + hdk/README + hdk/cl/CHECKLIST_BEFORE_BUILDING_CL + hdk/cl/examples/cl_sde/README + hdk/cl/examples/cl_sde/verif/README + hdk/cl/examples/cl_mem_perf/README + hdk/cl/examples/cl_mem_perf/verif/README + hdk/cl/examples/CL_TEMPLATE/README + hdk/cl/examples/cl_dram_hbm_dma/README + hdk/cl/examples/cl_dram_hbm_dma/verif/README + hdk/docs/Virtual_JTAG_XVC + hdk/docs/on_premise_licensing_help + hdk/docs/RTL_Simulation_Guide_for_HDK_Design_Flow + hdk/docs/AWS_CLK_GEN_spec + hdk/docs/Clock_Recipes_User_Guide + hdk/docs/AWS_Shell_Interface_Specification + hdk/docs/AWS_Shell_ERRATA + hdk/docs/AWS_Fpga_Pcie_Memory_Map + hdk/docs/shell_floorplan + hdk/docs/Supported_DDR_Modes + + sdk/README + sdk/apps/virtual-ethernet/README + sdk/apps/virtual-ethernet/doc/Virtual_Ethernet_Application_Guide + sdk/apps/virtual-ethernet/doc/SDE_HW_Guide + sdk/userspace/fpga_mgmt_tools/README + + vitis/README + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/docs-rtd/source/sdk/README.rst b/docs-rtd/source/sdk/README.rst new file mode 100644 index 000000000..6ab28a03b --- /dev/null +++ b/docs-rtd/source/sdk/README.rst @@ -0,0 +1,63 @@ +AWS EC2 FPGA Software Development Kit +===================================== + +This directory includes the drivers and runtime environment required by +any EC2 FPGA Instance. + +The `SDK userspace directory <./userspace>`__ contains the `Amazon FPGA +Image (AFI) Management Tools <./userspace/fpga_mgmt_tools/README.md>`__, +which includes both the source code to the AFI Management Tools as well +as detailed descriptions of the commands to use on an FPGA instance. + +The SDK is **NOT** used to build or register AFI, rather it is only used +for managing and deploying pre-built AFIs. For building and registering +AFIs, please refer to the `HDK <../hdk/README.md>`__. + +**NOTE:** This SDK is designed and tested for Linux environments only. + +Quick Start +=========== + +Using an AFI on an EC2 FPGA Instance +------------------------------------ + +You can setup and install the SDK with the following few steps. Note +that the first two steps may be skipped if you have already ran them in +the above HDK setup. + +.. code:: bash + + # Fetch the HDK and SDK code + git clone https://github.com/aws/aws-fpga.git + # Move to the root directory of the repository before running the next script + cd aws-fpga + # Set up the envronment variables, build and install the SDK + source sdk_setup.sh + +**NOTE:** The ``sdk_setup.sh`` would install the `FPGA management +tools <./userspace/fpga_mgmt_tools/README.md>`__ if they are not already +available in ``/usr/bin``. The ``sdk_setup.sh`` requires having ``gcc`` +installed. if it is not installed, try running the next command to +install it on Amazon Linux, Centos or Redhat distributions: + +Notes on using AFI Management Tools +----------------------------------- + +Early release of the AFI management tools may return uninformative +errors or unexpected responses. We recommend running commands a second +time after waiting 15-30 seconds if an unexpected response is received. +For example, if a loaded image does not show up when using the +``fpga-describe-local-image`` API, attempt rerunning the command prior +to calling ``fpga-load-local-image`` again. + +The ``fpga-describe-local-image`` API is currently asynchronous which +will require polling with ``fpga-describe-local-image`` until the +expected image appears. If the describe call does not provide the +expected response, attempt the ``fpga-load-local-image`` one more time. +Attempting to load images that are not compatible with the currently +loaded shell will fail and may not return an informative error message. +Please verify the design was built with the shell that is loaded on the +instance. + +Please reach out to the AWS FPGA team with any instability issues so we +can help as soon as possible. diff --git a/docs-rtd/source/sdk/apps/virtual-ethernet/README.rst b/docs-rtd/source/sdk/apps/virtual-ethernet/README.rst new file mode 100644 index 000000000..cec4930fd --- /dev/null +++ b/docs-rtd/source/sdk/apps/virtual-ethernet/README.rst @@ -0,0 +1,103 @@ +Virtual Ethernet +================ + +The Virtual Ethernet framework facilitates streaming Ethernet frames +from a network interface (or any source) into the FPGA for processing +and back out to some destination. Possible use cases for this include +deep packet inspection, software defined networking, stream encryption +or compression, and more. + +⚠️\ **Note**: Please note that Virtual Ethernet/SDE is not supported by +Vitis (XRT) + +Prerequisites +------------- + +In order to get the most from this document, readers may want to +familiarize themselves with the following: + +1. The `F2 customer logic + flow <../../../hdk/README.md#build-accelerator-afi-using-hdk-design-flow>`__; + creating and loading AFIs (Amazon FPGA Images) +2. `DPDK `__ (Data Plane Development Kit), a framework + for creating high performance network traffic handling tools in + userspace by limiting context switches, locks, or other blocking + logic. +3. `EC2 Networking + Concepts `__ + +Virtual Ethernet Architecture +============================= + +The Virtual Ethernet architecture is built upon DPDK (http://dpdk.org). +DPDK is an open source set of libraries and drivers for fast packet +processing, and runs mostly in Linux user-space. + +The following diagram shows the high level architecture for the Virtual +Ethernet sample application(s) and Bringup/Debug tools. + +|alt tag| + +User Space +---------- + +**[1]** **Virtual Ethernet Sample Applications(s)**: The Virtual +Ethernet sample application(s) use the DPDK testpmd application for +simple and efficient port-to-port forwarding. You can use this as a +starting point for your custom applications. + +**[2]** **DPDK Environment**: The DPDK Environment Abstraction Layer +(EAL) that provides the fast packet processing infrastructure in user +space. + +**[3]** **DPDK SPP PMD Driver**: The AWS Streaming Packet Port (SPP) +poll-mode driver that interfaces to the Streaming Data Engine (SDE). + +**[4]** **DPDK KNI PMD Driver**: An optional driver that may be used for +Linux kernel Ethernet frame ingress/egress. + +**[5]** **DPDK PCAP PMD Driver**: An optional driver that may be used +for PCAP Ethernet frame ingress/egress. + +**[6]** **DPDK ENA PMD Driver**: The AWS Enhanced Network Adapter (ENA) +poll-mode driver that interfaces to the Enhanced Network Interface +(ENI). + +Kernel +------ + +**[7]** **KNI**: The optional DPDK Kernel Network Interface (KNI) +provides a path from DPDK in user space to the Linux kernel for Linux +kernel Ethernet frame ingress/egress. DPDK applications that want to +handle network control plane protocols like DHCP and ARP within the +Linux kernel may leverage the DPDK KNI interface for this purpose. + +Hardware +-------- + +**[8]** **SDE**: The Streaming Data Engine that supports the AXI-4 +streaming interface to the FPGA custom logic (CL). + +**[9]** **ENI**: The sample application setup scripts will configure the +data-plane end-to-end traffic to use the ENI eth1 interface. ENI eth0 +will be reserved for your SSH connections, and other control-plane +traffic. + +Application Guide +================= + +The above Virtual Ethernet architecture supports your development phases +with sample applications that include loopback paths for bringup and +debug of the Virtual Ethernet application and custom CL, all the way to +end-to-end application integration with live traffic. + +Please refer to the `Application +Guide <./doc/Virtual_Ethernet_Application_Guide.md>`__ for details. + +Hardware Guide +============== + +More details about the Streaming Data Engine itself are covered in the +`Hardware Guide <./doc/SDE_HW_Guide.md>`__. + +.. |alt tag| image:: ./images/Virtual_Ethernet_Arch.jpg diff --git a/docs-rtd/source/sdk/apps/virtual-ethernet/doc/SDE_HW_Guide.rst b/docs-rtd/source/sdk/apps/virtual-ethernet/doc/SDE_HW_Guide.rst new file mode 100644 index 000000000..8cbffa082 --- /dev/null +++ b/docs-rtd/source/sdk/apps/virtual-ethernet/doc/SDE_HW_Guide.rst @@ -0,0 +1,2826 @@ +SDE Hardware Guide +================== + +Table of Contents: +================== + +- `Overview <#Overview>`__ + +- `Feature List <#FeatureList>`__ + +- `Architecture <#Architecture>`__ + +- `Designing with the SDE <#DesignCLwSDE>`__ + + - `IOs <#IOs>`__ + + - `Design Configuration Parameters <#DesignParam>`__ + + - `PF and Address Range <#PF_AddressRange>`__ + + - `CSR Description and Address Mapping <#CSRRange>`__ + + - `Descriptors and Write-Back Metadata <#Descriptors>`__ + + - `Credit Mechanism <#Credit>`__ + + - `Write-Back Mechanism <#WBM>`__ + + - `Data Flow Model <#DataFlow>`__ + + - `Error Conditions <#Error>`__ + + - `Implementation - Maximum Clock Frequency <#MaxClockFreq>`__ + + - `Implementation - Resource Utilization <#ResourceUtil>`__ + +- `Example Design <#ExampleDesign>`__ + +- `FAQ <#FAQ>`__ + +Overview +======== + +The Streaming Data Engine (SDE) provides high-performance packet +streaming connectivity between the Custom Logic (CL) and the host +application. The SDE provides a streaming interface to the CL and uses +the shell's PCIM AXI4 interface to move packets between the CL and the +host application. The SDE is a parameterizable, soft IP block that is +intended to be instantiated within the CL. Each instance of the SDE +provides two AXI streaming compliant interfaces viz. one Card-to-Host +(C2H) and one Host-to-Card (H2C) channel. + +Feature List +============ + +1. High Performance PPS for C2H and H2C. +2. 12GB/s Bandwidth per channel for C2H and H2C (4KB packet at 250MHz). +3. AXI Stream compliant on the CL facing side. +4. AXI Stream supports parameterizable data widths 64, 128, 256 and 512 + bits (Current version supports 512 bits only). +5. AXI4 complaint on the shell facing side. +6. AXI4 supports parameterizable data widths 64, 128, 256 and 512 bits + (Current version supports 512 bits only). +7. User bits on the RX and TX streaming interfaces. +8. Multiple descriptor types (Normal and Compact). +9. Multiple descriptors per packet. +10. Write-back for credits and metadata. +11. Multiple write-back metadata types (Normal and compact) +12. One instance of the streaming data engine can be configured at + compile-time to provide the following channel combinations + +- One full-duplex streaming channel (one C2H and one H2C). +- One Streaming C2H Channel only (No H2C Channel) +- One Streaming H2C Channel only (No C2H Channel) + +Architecture +============ + +|alt tag| + +The SDE uses shell's PCIM AXI4 interface to move packets between the AXI +Streaming interface and the host. It implements a store and forward +mechanism. For C2H, the packets received from the AXI Streaming +interface is stored in the C2H packet buffer and are then transmitted on +the PCIM AXI4 interface. For H2C, the packets received from the PCIM +AXI4 interface are stored in the H2C packet buffer and are then +transmitted on the AXI Streaming interface. + +SDE uses descriptors to perform the data movement and the bit-fields of +the descriptors are defined to contain all required information for data +transfer like buffer physical addresses, length etc. To achieve minimum +latency, the SDE implements a descriptor RAM that can be written by +software using the PCIS interface utilizing write-combine using +PF0-BAR4. The SDE implements a credit based mechanism to allow the +software to track the descriptor utilization. + +In order to minimize latency and reduce the complexity of the +software/driver, all the information that is polled by the +driver/software (for example, descriptor credits, write-back ring write +pointer, etc...) is stored in a contiguous host memory range. The SDE is +architected to update these variables together by writing to the +physical memory location using the PCIM interface. + +Designing with the SDE +====================== + +IOs +--- + +- PCIM AXI4 Master Interface: SDE uses this interface to write data to + the host. +- PCIS AXI4 Slave Interface: Software uses this interface to write + descriptors and configuration data to the SDE. +- H2C AXI Stream Master Interface: SDE uses this interface to transmit + H2C packets to the CL. +- C2H AXI Stream Slave Interface: SDE uses this interface to receive C2H + packets from the CL. +- Clocks and Reset: SDE uses a single clock and a single synchronous + active-low reset. + +Design Configuration parameters +------------------------------- + +The SDE can be parameterized when the SDE is instanced in the CL. These +configuration parameters are static parameters and are expected to be +set when the SDE is instanced in the CL. Some important parameters are +summarized below. + +- C2H_ONLY: Disable SDE H2C logic (Can be set to 1 if only the C2H + channel is required). +- H2C_ONLY: Disable SDE C2H logic (Can be set to 1 if only the C2H + channel is required). +- C2H_DESC_TYPE & H2C_DESC_TYPE: Descriptor Type (0 - Regular, 1 - + Compact) for C2H and H2C respectively. +- C2H_DESC_RAM_DEPTH & H2C_DESC_RAM_DEPTH: Descriptor RAM depth. The + maximum number of descriptors for C2H and H2C respectively. +- C2H_BUF_DEPTH & H2C_BUF_DEPTH: Buffer RAM depth. + +Full List of Parameters are listed in table below. **Supported values +for each parameter are listed in Supported Configurations column.** + ++-----------------+-------------+-----------------+-----------------+ +| **Name** | **Default** | **Supported | **Description** | +| | | C | | +| | | onfigurations** | | ++=================+=============+=================+=================+ +| C2H_ONLY | 0 | 0, 1 | This should be | +| | | | set to 1 if | +| | | | only C2H is | +| | | | required and | +| | | | H2C is not | +| | | | required. NOTE: | +| | | | If C2H_ONLY = | +| | | | 1, H2C_ONLY | +| | | | should be 0. | ++-----------------+-------------+-----------------+-----------------+ +| H2C_ONLY | 0 | 0, 1 | This should be | +| | | | set to 1 if | +| | | | only H2C is | +| | | | required and | +| | | | C2H is not | +| | | | required. NOTE: | +| | | | If H2C_ONLY = | +| | | | 1, C2H_ONLY | +| | | | should be 0. | ++-----------------+-------------+-----------------+-----------------+ +| PCIS_DATA_WIDTH | 512 | Default only | PCIS AXI4 Data | +| | | | Bus Width | ++-----------------+-------------+-----------------+-----------------+ +| PCIS_ID_WIDTH | 16 | Default only | PCIS AXI4 ID | +| | | | Width | ++-----------------+-------------+-----------------+-----------------+ +| PCIS_LEN_WIDTH | 8 | Default only | PCIS AXI4 AWLEN | +| | | | and ARLEN Width | ++-----------------+-------------+-----------------+-----------------+ +| PCIS_ADDR_WIDTH | 64 | Default only | PCIS AXI4 | +| | | | AWADDR and | +| | | | ARADDR Width | ++-----------------+-------------+-----------------+-----------------+ +| PCIM_DATA_WIDTH | 512 | Default only | PCIM AXI4 Data | +| | | | Bus Width | ++-----------------+-------------+-----------------+-----------------+ +| PCIM_ID_WIDTH | 3 | Default only | PCIM AXI4 ID | +| | | | Width | ++-----------------+-------------+-----------------+-----------------+ +| PCIM_LEN_WIDTH | 8 | Default only | PCIM AXI4 AWLEN | +| | | | and ARLEN Width | ++-----------------+-------------+-----------------+-----------------+ +| PCIM_ADDR_WIDTH | 64 | Default only | PCIM AXI4 | +| | | | AWADDR and | +| | | | ARADDR Width | ++-----------------+-------------+-----------------+-----------------+ +| C2H_DESC_TYPE | 0 | 0, 1 | Descriptor Type | +| | | | (0 – Regular, 1 | +| | | | – Compact) | ++-----------------+-------------+-----------------+-----------------+ +| C2H | 64 | 64, 128 | Descriptor RAM | +| _DESC_RAM_DEPTH | | | Depth. This is | +| | | | the maximum | +| | | | number of | +| | | | descriptors | ++-----------------+-------------+-----------------+-----------------+ +| C2H_BUF_DEPTH | 512 | 64, 128, 256, | C2H Buffer RAM | +| | | 512 | Depth. This is | +| | | | the maximum | +| | | | number of data | +| | | | slices that the | +| | | | buffer can | +| | | | hold. C2H | +| | | | buffer width is | +| | | | equal to | +| | | | P | +| | | | CIM_DATA_WIDTH. | +| | | | C2H Buffer size | +| | | | is | +| | | | (C2 | +| | | | H_BUF_DEPTH*PCI | +| | | | M_DATA_WIDTH/8) | +| | | | bytes. | ++-----------------+-------------+-----------------+-----------------+ +| C2H_ | 512 | Default only | AXIS Data Width | +| AXIS_DATA_WIDTH | | | | ++-----------------+-------------+-----------------+-----------------+ +| C2H | 64 | Default only | User Bit Width | +| _USER_BIT_WIDTH | | | | ++-----------------+-------------+-----------------+-----------------+ +| H2C_DESC_TYPE | 0 | 0, 1 | Descriptor Type | +| | | | (0 – Regular, 1 | +| | | | – Compact) | ++-----------------+-------------+-----------------+-----------------+ +| H2C | 64 | 64, 128 | Descriptor RAM | +| _DESC_RAM_DEPTH | | | Depth. This is | +| | | | the maximum | +| | | | number of | +| | | | descriptors | ++-----------------+-------------+-----------------+-----------------+ +| H2C_BUF_DEPTH | 512 | 64, 128, 256, | H2C Buffer RAM | +| | | 512 | Depth. This is | +| | | | the maximum | +| | | | number of data | +| | | | slices that the | +| | | | buffer can | +| | | | hold. Buffer | +| | | | width is equal | +| | | | to | +| | | | P | +| | | | CIM_DATA_WIDTH. | +| | | | H2C Buffer size | +| | | | is | +| | | | (H2 | +| | | | C_BUF_DEPTH*PCI | +| | | | M_DATA_WIDTH/8) | +| | | | bytes. | ++-----------------+-------------+-----------------+-----------------+ +| H2C_ | 512 | Default only | AXIS Data Width | +| AXIS_DATA_WIDTH | | | | ++-----------------+-------------+-----------------+-----------------+ +| H2C | 64 | Default only | User Bit Width | +| _USER_BIT_WIDTH | | | | ++-----------------+-------------+-----------------+-----------------+ +| H2C | 64 | Default only | H2C Small | +| _PKT_SIZE_BYTES | | | Packet Size in | +| | | | Bytes | ++-----------------+-------------+-----------------+-----------------+ +| C | 0 | Default only | AWID for C2H | +| 2H_PCIM_DM_AWID | | | Data Mover PCIM | +| | | | AXI4 Write | +| | | | Accesses | ++-----------------+-------------+-----------------+-----------------+ +| C | 1 | Default only | AWID for C2H | +| 2H_PCIM_WB_AWID | | | Write-Back PCIM | +| | | | AXI4 Write | +| | | | Accesses | ++-----------------+-------------+-----------------+-----------------+ +| H | 2 | Default only | AWID for C2H | +| 2C_PCIM_WB_AWID | | | Write-Back PCIM | +| | | | AXI4 Write | +| | | | Accesses | ++-----------------+-------------+-----------------+-----------------+ +| C2H | 0 | Default only | ARID for C2H | +| _PCIM_DESC_ARID | | | Descriptor PCIM | +| | | | AXI4 Read | +| | | | Accesses | ++-----------------+-------------+-----------------+-----------------+ +| H2C | 1 | Default only | ARID for H2C | +| _PCIM_DESC_ARID | | | Descriptor PCIM | +| | | | AXI4 Read | +| | | | Accesses | ++-----------------+-------------+-----------------+-----------------+ +| H | 2 | Default only | ARID for C2H | +| 2C_PCIM_DM_ARID | | | Data Mover PCIM | +| | | | AXI4 Read | +| | | | Accesses | ++-----------------+-------------+-----------------+-----------------+ +| PCIM_NUM_OT_RD | 64 | Default only | PCIM Number of | +| | | | Outstanding | +| | | | Reads. This | +| | | | should be 64 | +| | | | when using the | +| | | | AWS shell in | +| | | | order to | +| | | | maximize H2C | +| | | | performance. | ++-----------------+-------------+-----------------+-----------------+ +| H2C_P | 0 | Default only | H2C Maximum AXI | +| CIM_MAX_RD_SIZE | | | Read request | +| | | | size (0 – 512B, | +| | | | 1 – 1KB, 2 – | +| | | | 2KB, 3 – 4KB). | +| | | | This should be | +| | | | 0 when using | +| | | | the AWS shell | +| | | | in order to | +| | | | maximize H2C | +| | | | performance. | ++-----------------+-------------+-----------------+-----------------+ +| C2H_P | 0 | Default only | C2H Maximum AXI | +| CIM_MAX_WR_SIZE | | | Write request | +| | | | size (0 – 512B, | +| | | | 1 – 1KB, 2 – | +| | | | 2KB, 3 – 4KB). | +| | | | This should be | +| | | | 3 when using | +| | | | the AWS shell | +| | | | in order to | +| | | | maximize C2H | +| | | | performance. | ++-----------------+-------------+-----------------+-----------------+ + +PF and Address Mapping +~~~~~~~~~~~~~~~~~~~~~~ + +SDE implements a 16KB address space on the PCIS interface and therefore +can be accessed using the PF0-BAR4. SDE uses the lower 16 bits of the +address bus of the PCIS interface. The SDE address window should be 16KB +aligned. The following table describes address mapping within SDE. + ++-------------+-------------+-------------+-------------+-------------+ +| **Address | **Size | **Name** | **Access | **De | +| Range** | (Bytes)** | | Type** | scription** | ++=============+=============+=============+=============+=============+ +| 0x0000 – | 4K | C2H | Write Only | Software | +| 0x0FFC | | Descriptor | (wri | should use | +| | | RAM | te-combine) | this | +| | | | | address | +| | | | | range when | +| | | | | writing the | +| | | | | C2H | +| | | | | D | +| | | | | escriptors. | +| | | | | Software | +| | | | | should only | +| | | | | use 64 byte | +| | | | | aligned | +| | | | | addresses | +| | | | | in this | +| | | | | range to | +| | | | | write | +| | | | | partial or | +| | | | | full | +| | | | | d | +| | | | | escriptors. | +| | | | | SDE will | +| | | | | write the | +| | | | | descriptors | +| | | | | into the | +| | | | | descriptor | +| | | | | RAM in a | +| | | | | FIFO | +| | | | | pattern. | +| | | | | Only write | +| | | | | accesses of | +| | | | | 1DW, 4DW or | +| | | | | 8DW are | +| | | | | allowed to | +| | | | | this | +| | | | | address | +| | | | | range. Read | +| | | | | accesses | +| | | | | should not | +| | | | | be | +| | | | | performed | +| | | | | and are not | +| | | | | supported | +| | | | | in this | +| | | | | address | +| | | | | range. | ++-------------+-------------+-------------+-------------+-------------+ +| 0x1000 – | 4K | H2C | Write Only | Software | +| 0x1FFC | | Descriptor | (wri | should use | +| | | RAM | te-combine) | this | +| | | | | address | +| | | | | range when | +| | | | | writing the | +| | | | | H2C | +| | | | | D | +| | | | | escriptors. | +| | | | | Software | +| | | | | should only | +| | | | | use 64 byte | +| | | | | aligned | +| | | | | addresses | +| | | | | in this | +| | | | | range to | +| | | | | write | +| | | | | partial or | +| | | | | full | +| | | | | d | +| | | | | escriptors. | +| | | | | SDE will | +| | | | | write the | +| | | | | descriptors | +| | | | | into the | +| | | | | descriptor | +| | | | | RAM in a | +| | | | | FIFO | +| | | | | pattern. | +| | | | | Only write | +| | | | | accesses of | +| | | | | 1DW, 4DW or | +| | | | | 8DW are | +| | | | | allowed to | +| | | | | this | +| | | | | address | +| | | | | range. Read | +| | | | | accesses | +| | | | | should not | +| | | | | be | +| | | | | performed | +| | | | | and are not | +| | | | | supported | +| | | | | in this | +| | | | | address | +| | | | | range. | ++-------------+-------------+-------------+-------------+-------------+ +| 0x2000 – | 4K | RSVD | Do not use | Reserved | +| 0x2FFC | | | | for future | +| | | | | use | ++-------------+-------------+-------------+-------------+-------------+ +| 0x3000 – | 4K | CSRs | Read-Write | Software | +| 0x3FFC | | | (DW | should use | +| | | | accesses) | this | +| | | | | address | +| | | | | range when | +| | | | | accessing | +| | | | | CSRs. | +| | | | | Software | +| | | | | should use | +| | | | | only 4 byte | +| | | | | aligned | +| | | | | address of | +| | | | | the | +| | | | | registers | +| | | | | to access | +| | | | | CSRs | +| | | | | implemented | +| | | | | in this | +| | | | | range. Only | +| | | | | 1 DW read | +| | | | | or 1 DW | +| | | | | write | +| | | | | accesses | +| | | | | are allowed | +| | | | | in this | +| | | | | range. | ++-------------+-------------+-------------+-------------+-------------+ + +CSR Description and Address Mapping +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +-------------- + +The CSR address space starts at the CSR base address and is organized as +shown below + ++-----------------+-----------------+-----------+-----------------+ +| **Address | **Size | **Name** | **Description** | +| Range** | (Bytes)** | | | ++=================+=================+===========+=================+ +| 0x3000 – 0x31FC | 512 | PCIS CSRs | PCIS slave | +| | | | Config and | +| | | | Status | +| | | | Registers | ++-----------------+-----------------+-----------+-----------------+ +| 0x3200 – 0x33FC | 512 | PCIM CSRs | PCIM arbiter | +| | | | Config and | +| | | | Status | +| | | | Registers | ++-----------------+-----------------+-----------+-----------------+ +| 0x3400 – 0x39FC | 1536 | C2H CSRs | C2H Config and | +| | | | Status | +| | | | Registers | ++-----------------+-----------------+-----------+-----------------+ +| 0x3A00 – 0x3FFC | 1536 | H2C CSRs | H2C Config and | +| | | | Status | +| | | | Registers | ++-----------------+-----------------+-----------+-----------------+ + +PCIS CSRs +--------- + +1. **Software Reset Register** + + Address – PCIS_BASE_ADDR + 0x3000 + + CSR Offset – CSR_BASE_ADDR + 0x000 + + PCIS CSR Offset – PCIS_CSR_BASE_ADDR + 0x000 + ++-------------+-------------+----------+-------------+-------------+ +| **Field | **Bit | **Type** | **Default | **De | +| Name** | Range** | | Value** | scription** | ++=============+=============+==========+=============+=============+ +| SW_RST | 0 | RW | 0x0 | Software | +| | | | | Reset. When | +| | | | | Set, reset | +| | | | | is asserted | +| | | | | to all the | +| | | | | functional | +| | | | | blocks of | +| | | | | the SDE | +| | | | | except the | +| | | | | PCIS Slave | +| | | | | Block. | ++-------------+-------------+----------+-------------+-------------+ +| RSVD | 31:1 | RO | 0x0 | Reserved | ++-------------+-------------+----------+-------------+-------------+ + +2. **SDE Info Register** + + Address – PCIS_BASE_ADDR + 0x3004 + + CSR Offset – CSR_BASE_ADDR + 0x004 + + PCIS CSR Offset – PCIS_CSR_BASE_ADDR + 0x004 + ++-------------+-------------+----------+-------------+-------------+ +| **Field | **Bit | **Type** | **Default | **De | +| Name** | Range** | | Value** | scription** | ++=============+=============+==========+=============+=============+ +| C2H_PRESENT | 0 | RO | 0x0 | 1 = C2H | +| | | | | Instanced 0 | +| | | | | = C2H Not | +| | | | | Instanced | ++-------------+-------------+----------+-------------+-------------+ +| RSVD | 15:1 | RO | 0x0 | Reserved | ++-------------+-------------+----------+-------------+-------------+ +| H2C_PRESENT | 16 | RO | 0x0 | 1 = H2C | +| | | | | Instanced 0 | +| | | | | = H2C Not | +| | | | | Instanced | ++-------------+-------------+----------+-------------+-------------+ +| RSVD | 31:17 | RO | 0x0 | Reserved | ++-------------+-------------+----------+-------------+-------------+ + +PCIM CSRs +--------- + +RSVD for future Use + +C2H CSRs +-------- + +**C2H CSR Address Mapping** + ++----------------+----------------+----------------+----------------+ +| **Address | **Size | **Name** | * | +| Range** | (Bytes)** | | *Description** | ++================+================+================+================+ +| 0x3400 – | 256 | C2H Global | C2H Global | +| 0x34FC | | CSRs | Config and | +| | | | Status | +| | | | Registers | ++----------------+----------------+----------------+----------------+ +| 0x3500 – | 256 | C2H Descriptor | C2H Descriptor | +| 0x35FC | | CSRs | Config and | +| | | | Status | +| | | | Registers | ++----------------+----------------+----------------+----------------+ +| 0x3600 – | 256 | C2H Data Mover | C2H Data Mover | +| 0x36FC | | CSRs | Config and | +| | | | Status | +| | | | Registers | ++----------------+----------------+----------------+----------------+ +| 0x3700 – | 256 | C2H Write-back | C2H Write-Back | +| 0x37FC | | CSRs | Config and | +| | | | Status | +| | | | Registers | ++----------------+----------------+----------------+----------------+ +| 0x3800 – | 256 | C2H Buffer | C2H Buffer | +| 0x38FC | | CSRs | Config and | +| | | | Status | +| | | | Registers | ++----------------+----------------+----------------+----------------+ +| 0x3900 – | 256 | C2H AXIS CSRs | C2H AXI-Stream | +| 0x39FC | | | Config and | +| | | | Status | +| | | | Registers | ++----------------+----------------+----------------+----------------+ + +C2H Global CSRs +--------------- + +RSVD for future use. + +C2H Descriptor CSRs +------------------- + +1. **Descriptor Credit Consumed Counter** + + Address – PCIS_BASE_ADDR + 0x3500 + + CSR Offset – CSR_BASE_ADDR + 0x500 + + C2H CSR Offset – C2H_CSR_BASE_ADDR + 0x100 + ++-------------+-------------+----------+-------------+-------------+ +| **Field | **Bit | **Type** | **Default | **De | +| Name** | Range** | | Value** | scription** | ++=============+=============+==========+=============+=============+ +| C | 31:0 | RW0C | 0x0 | Descriptor | +| DT_CONSUMED | | | | Credit | +| | | | | Consumed | +| | | | | Counter. | +| | | | | Write 0 to | +| | | | | clear. | ++-------------+-------------+----------+-------------+-------------+ + +2. **Descriptor Credit Limit Counter** + + Address – PCIS_BASE_ADDR + 0x3504 + + CSR Offset – CSR_BASE_ADDR + 0x504 + + C2H CSR Offset – C2H_CSR_BASE_ADDR + 0x104 + ++-------------+-------------+----------+-------------+-------------+ +| **Field | **Bit | **Type** | **Default | **De | +| Name** | Range** | | Value** | scription** | ++=============+=============+==========+=============+=============+ +| CDT_LIMIT | 31:0 | RW0C | C2H_DES | Descriptor | +| | | | C_RAM_DEPTH | Credit | +| | | | | Limit | +| | | | | Counter. | +| | | | | Write 0 to | +| | | | | clear. When | +| | | | | cleared, | +| | | | | the value | +| | | | | of the | +| | | | | counter is | +| | | | | reset to | +| | | | | C2H_DESC | +| | | | | _RAM_DEPTH. | ++-------------+-------------+----------+-------------+-------------+ + +3. **Completed Descriptors Counter** + + Address – PCIS_BASE_ADDR + 0x3508 + + CSR Offset – CSR_BASE_ADDR + 0x508 + + C2H CSR Offset – C2H_CSR_BASE_ADDR + 0x108 + ++-------------+-------------+----------+-------------+-------------+ +| **Field | **Bit | **Type** | **Default | **De | +| Name** | Range** | | Value** | scription** | ++=============+=============+==========+=============+=============+ +| COMP_COUNT | 31:0 | RW0C | 0x0 | Completed | +| | | | | Descriptor | +| | | | | Counter. | +| | | | | Write 0 to | +| | | | | clear. | ++-------------+-------------+----------+-------------+-------------+ + +4. **Descriptor FIFO Pointers** + + Address – PCIS_BASE_ADDR + 0x350C + + CSR Offset – CSR_BASE_ADDR + 0x50C + + C2H CSR Offset – C2H_CSR_BASE_ADDR + 0x10C + ++-------------+-------------+----------+-------------+-------------+ +| **Field | **Bit | **Type** | **Default | **De | +| Name** | Range** | | Value** | scription** | ++=============+=============+==========+=============+=============+ +| FIFO_WR_PTR | 14:0 | RO | 0x0 | Descriptor | +| | | | | FIFO Write | +| | | | | Pointer | ++-------------+-------------+----------+-------------+-------------+ +| FIFO | 15 | RO | 0x0 | Descriptor | +| _WR_PTR_MSB | | | | FIFO Write | +| | | | | Pointer MSB | ++-------------+-------------+----------+-------------+-------------+ +| FIFO_RD_PTR | 30:16 | RO | 0x0 | Descriptor | +| | | | | FIFO Read | +| | | | | Pointer | ++-------------+-------------+----------+-------------+-------------+ +| FIFO | 31 | RO | 0x0 | Descriptor | +| _RD_PTR_MSB | | | | FIFO Read | +| | | | | Pointer MSB | ++-------------+-------------+----------+-------------+-------------+ + +5. **Descriptor RAM Address** + + Address – PCIS_BASE_ADDR + 0x3510 + + CSR Offset – CSR_BASE_ADDR + 0x510 + + C2H CSR Offset – C2H_CSR_BASE_ADDR + 0x110 + ++-------------+-------------+----------+-------------+-------------+ +| **Field | **Bit | **Type** | **Default | **De | +| Name** | Range** | | Value** | scription** | ++=============+=============+==========+=============+=============+ +| DE | 15:0 | RW | 0x0 | Descriptor | +| SC_RAM_ADDR | | | | RAM Address | ++-------------+-------------+----------+-------------+-------------+ +| DESC | 19:16 | RWC | 0x0 | Descriptor | +| _RAM_DW_IDX | | | | RAM Data DW | +| | | | | Index. This | +| | | | | bitfield is | +| | | | | cleared | +| | | | | when this | +| | | | | register is | +| | | | | written. | +| | | | | This will | +| | | | | aut | +| | | | | o-increment | +| | | | | when | +| | | | | DE | +| | | | | SC_RAM_DATA | +| | | | | is read or | +| | | | | written. | ++-------------+-------------+----------+-------------+-------------+ +| RSVD | 31:20 | RO | 0x0 | Reserved | ++-------------+-------------+----------+-------------+-------------+ + +6. **Descriptor RAM Data** + + Address – PCIS_BASE_ADDR + 0x3514 + + CSR Offset – CSR_BASE_ADDR + 0x514 + + C2H CSR Offset – C2H_CSR_BASE_ADDR + 0x114 + ++-------------+-------------+----------+-------------+-------------+ +| **Field | **Bit | **Type** | **Default | **De | +| Name** | Range** | | Value** | scription** | ++=============+=============+==========+=============+=============+ +| DESC_ | 31:0 | RW | 0x0 | Descriptor | +| RAM_DATA_DW | | | | RAM Data. | +| | | | | When | +| | | | | writing the | +| | | | | descriptor | +| | | | | RAM, SDE | +| | | | | initiates a | +| | | | | write to | +| | | | | the | +| | | | | descriptor | +| | | | | RAM after | +| | | | | all the DWs | +| | | | | that make | +| | | | | up the | +| | | | | descriptor | +| | | | | are written | +| | | | | to this | +| | | | | register. | +| | | | | When | +| | | | | reading the | +| | | | | descriptor | +| | | | | RAM, SDE | +| | | | | initiates a | +| | | | | read from | +| | | | | the | +| | | | | descriptor | +| | | | | RAM when | +| | | | | this | +| | | | | register is | +| | | | | read and | +| | | | | when the | +| | | | | DESC | +| | | | | _RAM_DW_IDX | +| | | | | is 0. | ++-------------+-------------+----------+-------------+-------------+ + +7. **Descriptor RAM Status** + + Address – PCIS_BASE_ADDR + 0x3518 + + CSR Offset – CSR_BASE_ADDR + 0x518 + + C2H CSR Offset – C2H_CSR_BASE_ADDR + 0x118 + ++-------------+-------------+----------+-------------+-------------+ +| **Field | **Bit | **Type** | **Default | **De | +| Name** | Range** | | Value** | scription** | ++=============+=============+==========+=============+=============+ +| DESC_OFLOW | 0 | RW1C | 0x0 | Desc RAM | +| | | | | Overflow | +| | | | | Indicates | +| | | | | that a | +| | | | | descriptor | +| | | | | was written | +| | | | | when the | +| | | | | descriptor | +| | | | | RAM is full | ++-------------+-------------+----------+-------------+-------------+ +| DES | 1 | RW1C | 0x0 | Desc Out of | +| C_OOO_ERROR | | | | Order Error | ++-------------+-------------+----------+-------------+-------------+ +| DESC_U | 2 | RW1C | 0x0 | Desc | +| NALIN_ERROR | | | | Unaligned | +| | | | | Address | +| | | | | Error | ++-------------+-------------+----------+-------------+-------------+ +| DESC_FULL | 3 | RO | 0x0 | Desc RAM | +| | | | | Full | ++-------------+-------------+----------+-------------+-------------+ +| DESC_EMPTY | 4 | RO | 0x0 | Desc RAM | +| | | | | Empty | ++-------------+-------------+----------+-------------+-------------+ +| RSVD | 31:5 | RO | 0x0 | Reserved | ++-------------+-------------+----------+-------------+-------------+ + +8. **Descriptor Info** + + Address – PCIS_BASE_ADDR + 0x3520 + + CSR Offset – CSR_BASE_ADDR + 0x520 + + C2H CSR Offset – C2H_CSR_BASE_ADDR + 0x120 + ++-------------+-------------+----------+-------------+-------------+ +| **Field | **Bit | **Type** | **Default | **De | +| Name** | Range** | | Value** | scription** | ++=============+=============+==========+=============+=============+ +| DESC_TYPE | 0 | RO | 0x0 | Descriptor | +| | | | | /Write-Back | +| | | | | Type 0 – | +| | | | | Regular 1 – | +| | | | | Compact | ++-------------+-------------+----------+-------------+-------------+ +| RSVD | 15:1 | RO | 0x0 | RSVD | ++-------------+-------------+----------+-------------+-------------+ +| DES | 31:16 | RO | 0x0 | Descriptor | +| C_RAM_DEPTH | | | | RAM Depth. | +| | | | | Maximum | +| | | | | Number of | +| | | | | d | +| | | | | escriptors. | ++-------------+-------------+----------+-------------+-------------+ + +C2H Data Mover CSRs +------------------- + +1. **Data Mover Config Register 0** + + Address – PCIS_BASE_ADDR + 0x3600 + + CSR Offset – CSR_BASE_ADDR + 0x600 + + C2H CSR Offset – C2H_CSR_BASE_ADDR + 0x200 + +============== ============= ======== ================= =============== +**Field Name** **Bit Range** **Type** **Default Value** **Description** +============== ============= ======== ================= =============== +RSVD 31:0 RW 0x0 Reserved +============== ============= ======== ================= =============== + +2. **Data Mover Status Register** + + Address – PCIS_BASE_ADDR + 0x3604 + + CSR Offset – CSR_BASE_ADDR + 0x604 + + C2H CSR Offset – C2H_CSR_BASE_ADDR + 0x204 + ++-------------+-------------+----------+-------------+-------------+ +| **Field | **Bit | **Type** | **Default | **De | +| Name** | Range** | | Value** | scription** | ++=============+=============+==========+=============+=============+ +| D | 0 | RW1C | 0x0 | Data Mover | +| M_BRESP_ERR | | | | Bresp Error | ++-------------+-------------+----------+-------------+-------------+ +| DM_D | 1 | RW1C | 0x0 | Descriptor | +| ESC_LEN_ERR | | | | Length | +| | | | | equal to 0 | ++-------------+-------------+----------+-------------+-------------+ +| RSVD | 31:2 | RO | 0x0 | Reserved | ++-------------+-------------+----------+-------------+-------------+ + +C2H Write-Back CSRs +------------------- + +1. **Write-Back Config Register 0** + + Address – PCIS_BASE_ADDR + 0x3700 + + CSR Offset – CSR_BASE_ADDR + 0x700 + + C2H CSR Offset – C2H_CSR_BASE_ADDR + 0x300 + ++-------------+-------------+----------+-------------+-------------+ +| **Field | **Bit | **Type** | **Default | **De | +| Name** | Range** | | Value** | scription** | ++=============+=============+==========+=============+=============+ +| DES | 0 | RW | 0x0 | Descriptor | +| C_CNT_WB_EN | | | | Count | +| | | | | Write-Back | +| | | | | Trigger | +| | | | | Enable. | +| | | | | When set, | +| | | | | SDE | +| | | | | schedules a | +| | | | | status | +| | | | | counter | +| | | | | write-back | +| | | | | when | +| | | | | descriptor | +| | | | | count | +| | | | | increments | ++-------------+-------------+----------+-------------+-------------+ +| PK | 1 | RW | 0x0 | Packet | +| T_CNT_WB_EN | | | | Count | +| | | | | Write-Back | +| | | | | Trigger | +| | | | | Enable. | +| | | | | When set, | +| | | | | SDE | +| | | | | schedules a | +| | | | | status | +| | | | | counter | +| | | | | write-back | +| | | | | when packet | +| | | | | count | +| | | | | increments. | ++-------------+-------------+----------+-------------+-------------+ +| DES | 2 | RW | 0x0 | Descriptor | +| C_CDT_WB_EN | | | | Credit | +| | | | | Write-Back | +| | | | | Trigger | +| | | | | Enable. | +| | | | | When set, | +| | | | | SDE | +| | | | | schedules a | +| | | | | status | +| | | | | counter | +| | | | | write-back | +| | | | | when | +| | | | | descriptor | +| | | | | credit | +| | | | | “limit” | +| | | | | increments. | ++-------------+-------------+----------+-------------+-------------+ +| MD_PTR_EN | 3 | RW | 0x0 | Metadata | +| | | | | Pointer | +| | | | | Write-Back | +| | | | | Trigger | +| | | | | Enable. | +| | | | | When this | +| | | | | bit is not | +| | | | | set, SDE | +| | | | | will not | +| | | | | perform | +| | | | | ring | +| | | | | occupancy | +| | | | | check (ring | +| | | | | full | +| | | | | condition) | +| | | | | i.e the SDE | +| | | | | will | +| | | | | disregard | +| | | | | the | +| | | | | Metadata | +| | | | | Read | +| | | | | Pointer | +| | | | | register. | ++-------------+-------------+----------+-------------+-------------+ +| DES | 4 | RW | 0x0 | Descriptor | +| C_CDT_WC_EN | | | | Credit | +| | | | | “Limit” | +| | | | | Write-Back | +| | | | | Coalesce | +| | | | | Enable | ++-------------+-------------+----------+-------------+-------------+ +| DES | 5 | RW | 0x0 | Descriptor | +| C_CNT_WC_EN | | | | Count | +| | | | | Write-Back | +| | | | | Coalesce | +| | | | | Enable | ++-------------+-------------+----------+-------------+-------------+ +| PK | 6 | RW | 0x0 | Packet | +| T_CNT_WC_EN | | | | Count | +| | | | | Write-Back | +| | | | | Coalesce | +| | | | | Enable | ++-------------+-------------+----------+-------------+-------------+ +| MD_W | 7 | RW | 0x0 | Metadata | +| R_PTR_WC_EN | | | | Write | +| | | | | Pointer | +| | | | | Write-Back | +| | | | | Coalesce | +| | | | | Enable | ++-------------+-------------+----------+-------------+-------------+ +| WC | 13:8 | RW | 0x0 | Write-Back | +| _CNT_MINUS1 | | | | Coalesce | +| | | | | Count Minus | +| | | | | 1. Number | +| | | | | of writes | +| | | | | to | +| | | | | coalesce. | ++-------------+-------------+----------+-------------+-------------+ +| RSVD | 31:14 | RO | 0x0 | Reserved | ++-------------+-------------+----------+-------------+-------------+ + +2. **Status Counters Base Address Low** + + Address – PCIS_BASE_ADDR + 0x3704 + + CSR Offset – CSR_BASE_ADDR + 0x704 + + C2H CSR Offset – C2H_CSR_BASE_ADDR + 0x304 + ++-------------+-------------+----------+-------------+-------------+ +| **Field | **Bit | **Type** | **Default | **De | +| Name** | Range** | | Value** | scription** | ++=============+=============+==========+=============+=============+ +| STATUS | 31:0 | RW | 0x0 | Status | +| _WB_ADDR_LO | | | | Counters | +| | | | | Base | +| | | | | Address | +| | | | | [31:0] This | +| | | | | address | +| | | | | should be | +| | | | | 64B | +| | | | | aligned. | +| | | | | The least | +| | | | | significant | +| | | | | 6 bits of | +| | | | | the address | +| | | | | should 0. | ++-------------+-------------+----------+-------------+-------------+ + +3. **Status Write-Back Address High** + + Address – PCIS_BASE_ADDR + 0x3708 + + CSR Offset – CSR_BASE_ADDR + 0x708 + + C2H CSR Offset – C2H_CSR_BASE_ADDR + 0x308 + ++-------------+-------------+----------+-------------+-------------+ +| **Field | **Bit | **Type** | **Default | **De | +| Name** | Range** | | Value** | scription** | ++=============+=============+==========+=============+=============+ +| STATUS | 15:0 | RW | 0x0 | Status | +| _WB_ADDR_HI | | | | Counters | +| | | | | Base | +| | | | | Address | +| | | | | [47:32] | ++-------------+-------------+----------+-------------+-------------+ +| RSVD | 31:16 | RO | 0x0 | Reserved | ++-------------+-------------+----------+-------------+-------------+ + +4. **Write-Back Coalesce Timeout Count** + + Address – PCIS_BASE_ADDR + 0x370C + + CSR Offset – CSR_BASE_ADDR + 0x70C + + C2H CSR Offset – C2H_CSR_BASE_ADDR + 0x30C + ++-------------+-------------+----------+-------------+-------------+ +| **Field | **Bit | **Type** | **Default | **De | +| Name** | Range** | | Value** | scription** | ++=============+=============+==========+=============+=============+ +| WC_ | 19:0 | RW | 0x0 | Write-Back | +| TO_TICK_CNT | | | | Coalesce | +| | | | | Timeout | +| | | | | Tick Count | ++-------------+-------------+----------+-------------+-------------+ +| WC_TO_CNT | 23:20 | RW | 0x0 | Write-Back | +| | | | | Coalesce | +| | | | | Timeout | +| | | | | Count | ++-------------+-------------+----------+-------------+-------------+ +| RSVD | 31:24 | RO | 0x0 | Reserved | ++-------------+-------------+----------+-------------+-------------+ + +5. **Metadata Ring Base Address Low** + + Address – PCIS_BASE_ADDR + 0x3718 + + CSR Offset – CSR_BASE_ADDR + 0x718 + + C2H CSR Offset – C2H_CSR_BASE_ADDR + 0x318 + ++-------------+-------------+----------+-------------+-------------+ +| **Field | **Bit | **Type** | **Default | **De | +| Name** | Range** | | Value** | scription** | ++=============+=============+==========+=============+=============+ +| MD | 31:0 | RW | 0x0 | Metadata | +| _WB_ADDR_LO | | | | Ring Base | +| | | | | Address | +| | | | | [31:0] This | +| | | | | address | +| | | | | should be | +| | | | | 64B | +| | | | | aligned. | +| | | | | The least | +| | | | | significant | +| | | | | 6 bits of | +| | | | | the address | +| | | | | should 0. | ++-------------+-------------+----------+-------------+-------------+ + +6. **Metadata Ring Base Address High** + + Address – PCIS_BASE_ADDR + 0x371C + + CSR Offset – CSR_BASE_ADDR + 0x71C + + C2H CSR Offset – C2H_CSR_BASE_ADDR + 0x31C + ++-------------+-------------+----------+-------------+-------------+ +| **Field | **Bit | **Type** | **Default | **De | +| Name** | Range** | | Value** | scription** | ++=============+=============+==========+=============+=============+ +| MD | 15:0 | RW | 0x0 | Metadata | +| _WB_ADDR_HI | | | | Ring Base | +| | | | | Address | +| | | | | [47:32] | ++-------------+-------------+----------+-------------+-------------+ +| RSVD | 31:16 | RO | 0x0 | Reserved | ++-------------+-------------+----------+-------------+-------------+ + +7. **Metadata Ring Size** + + Address – PCIS_BASE_ADDR + 0x3720 + + CSR Offset – CSR_BASE_ADDR + 0x720 + + C2H CSR Offset – C2H_CSR_BASE_ADDR + 0x320 + ++-------------+-------------+----------+-------------+-------------+ +| **Field | **Bit | **Type** | **Default | **De | +| Name** | Range** | | Value** | scription** | ++=============+=============+==========+=============+=============+ +| MD_RING | 31:0 | RW | 0x0 | Metadata | +| _SIZE_BYTES | | | | Ring Size | +| | | | | (in Bytes). | +| | | | | Should be | +| | | | | integer | +| | | | | multiple of | +| | | | | Metadata | +| | | | | Size (in | +| | | | | Bytes). The | +| | | | | maximum | +| | | | | number of | +| | | | | descriptors | +| | | | | in the ring | +| | | | | is 65536 | +| | | | | and minimum | +| | | | | number of | +| | | | | descriptors | +| | | | | in the ring | +| | | | | is 2. For | +| | | | | Regular | +| | | | | Type | +| | | | | metadata, | +| | | | | the maximum | +| | | | | Metadata | +| | | | | ring size | +| | | | | is 1MB. For | +| | | | | Compact | +| | | | | Type | +| | | | | metadata, | +| | | | | the maximum | +| | | | | Metadata | +| | | | | ring size | +| | | | | is 512KB. | ++-------------+-------------+----------+-------------+-------------+ + +8. **Metadata Ring Read Pointer** + + Address – PCIS_BASE_ADDR + 0x3724 + + CSR Offset – CSR_BASE_ADDR + 0x724 + + C2H CSR Offset – C2H_CSR_BASE_ADDR + 0x324 + ++-------------+-------------+----------+-------------+-------------+ +| **Field | **Bit | **Type** | **Default | **De | +| Name** | Range** | | Value** | scription** | ++=============+=============+==========+=============+=============+ +| MD_RD_PTR | 15:0 | RW | 0x0 | Metadata | +| | | | | Ring Read | +| | | | | Pointer | ++-------------+-------------+----------+-------------+-------------+ +| RSVD | 31:16 | RO | 0x0 | Reserved | ++-------------+-------------+----------+-------------+-------------+ + +9. **Metadata Ring Write Pointer** + + Address – PCIS_BASE_ADDR + 0x3728 + + CSR Offset – CSR_BASE_ADDR + 0x728 + + C2H CSR Offset – C2H_CSR_BASE_ADDR + 0x328 + ++-------------+-------------+----------+-------------+-------------+ +| **Field | **Bit | **Type** | **Default | **De | +| Name** | Range** | | Value** | scription** | ++=============+=============+==========+=============+=============+ +| MD_WR_PTR | 15:0 | RW0C | 0x0 | Metadata | +| | | | | Ring Write | +| | | | | Pointer. | +| | | | | Write 0 to | +| | | | | clear. | ++-------------+-------------+----------+-------------+-------------+ +| RSVD | 31:16 | RO | 0x0 | Reserved | ++-------------+-------------+----------+-------------+-------------+ + +10. **Write Back Status Register** + + Address – PCIS_BASE_ADDR + 0x372C + + CSR Offset – CSR_BASE_ADDR + 0x72C + + C2H CSR Offset – C2H_CSR_BASE_ADDR + 0x32C + ++-------------+-------------+----------+-------------+-------------+ +| **Field | **Bit | **Type** | **Default | **De | +| Name** | Range** | | Value** | scription** | ++=============+=============+==========+=============+=============+ +| WB_STS_ | 0 | RW1C | 0x0 | Write Back | +| BRESP_ERROR | | | | BRESP Error | +| | | | | for Status | +| | | | | Write-Back | ++-------------+-------------+----------+-------------+-------------+ +| WB_MD_ | 1 | RW1C | 0x0 | Write Back | +| BRESP_ERROR | | | | BRESP Error | +| | | | | for | +| | | | | Metadata | +| | | | | Write-Back | ++-------------+-------------+----------+-------------+-------------+ +| RSVD | 31:2 | RO | 0x0 | Reserved | ++-------------+-------------+----------+-------------+-------------+ + +11. **Status DW Register** + + Address – PCIS_BASE_ADDR + 0x3730 + + CSR Offset – CSR_BASE_ADDR + 0x730 + + C2H CSR Offset – C2H_CSR_BASE_ADDR + 0x330 + +============== ============= ======== ================= ================ +**Field Name** **Bit Range** **Type** **Default Value** **Description** +============== ============= ======== ================= ================ +DESC_ERROR 0 RO 0x0 Descriptor Error +DM_ERROR 1 RO 0x0 Data Mover Error +WB_ERROR 2 RO 0x0 Write Back Error +RSVD 31:3 RO 0x0 Reserved +============== ============= ======== ================= ================ + +C2H Buffer CSRs +--------------- + +1. **Buffer Config Register 0** + + Address – PCIS_BASE_ADDR + 0x3800 + + CSR Offset – CSR_BASE_ADDR + 0x800 + + C2H CSR Offset – C2H_CSR_BASE_ADDR + 0x400 + +============== ============= ======== ================= =============== +**Field Name** **Bit Range** **Type** **Default Value** **Description** +============== ============= ======== ================= =============== +RSVD 31:0 RW 0x0 Reserved +============== ============= ======== ================= =============== + +2. **Buffer Status Register** + + Address – PCIS_BASE_ADDR + 0x3804 + + CSR Offset – CSR_BASE_ADDR + 0x804 + + C2H CSR Offset – C2H_CSR_BASE_ADDR + 0x404 + +============== ============= ======== ================= =============== +**Field Name** **Bit Range** **Type** **Default Value** **Description** +============== ============= ======== ================= =============== +BUF_FULL 0 RO 0x0 Buffer Full +BUF_EMPTY 1 RO 0x0 Buffer Empty +AUX_FIFO_FULL 2 RO 0x0 Aux FIFO Full +AUX_FIFO_EMPTY 3 RO 0x0 Aux FIFO Empty +RSVD 31:4 RO 0x0 Reserved +============== ============= ======== ================= =============== + +3. **Buffer Input Packet Count Register** + + Address – PCIS_BASE_ADDR + 0x3808 + + CSR Offset – CSR_BASE_ADDR + 0x808 + + C2H CSR Offset – C2H_CSR_BASE_ADDR + 0x408 + ++----------------+---------------+----------+-------------------+--------------------+ +| **Field Name** | **Bit Range** | **Type** | **Default Value** | **Description** | ++================+===============+==========+===================+====================+ +| IN_PKT_CNT | 31:0 | RW0C | 0x0 | Input Packet Count | ++----------------+---------------+----------+-------------------+--------------------+ + +4. **Buffer Output Packet Count Register** + + Address – PCIS_BASE_ADDR + 0x380C + + CSR Offset – CSR_BASE_ADDR + 0x80C + + C2H CSR Offset – C2H_CSR_BASE_ADDR + 0x40C + ++----------------+---------------+----------+-------------------+---------------------+ +| **Field Name** | **Bit Range** | **Type** | **Default Value** | **Description** | ++================+===============+==========+===================+=====================+ +| OUT_PKT_CNT | 31:0 | RW0C | 0x0 | Output Packet Count | ++----------------+---------------+----------+-------------------+---------------------+ + +5. **Buffer Pointer Register** + + Address – PCIS_BASE_ADDR + 0x3810 + + CSR Offset – CSR_BASE_ADDR + 0x810 + + C2H CSR Offset – C2H_CSR_BASE_ADDR + 0x410 + ++-------------+-------------+----------+-------------+-------------+ +| **Field | **Bit | **Type** | **Default | **De | +| Name** | Range** | | Value** | scription** | ++=============+=============+==========+=============+=============+ +| BUF_WR_PTR | 15:0 | RO | 0x0 | Buffer | +| | | | | Write | +| | | | | Pointer | +| | | | | (RAM entry | +| | | | | based) | ++-------------+-------------+----------+-------------+-------------+ +| BUF_RD_ADDR | 31:16 | RO | 0x0 | Buffer Read | +| | | | | Address | +| | | | | (Byte | +| | | | | based) | ++-------------+-------------+----------+-------------+-------------+ + +6. **Aux RAM Pointers** + + Address – PCIS_BASE_ADDR + 0x3814 + + CSR Offset – CSR_BASE_ADDR + 0x814 + + C2H CSR Offset – C2H_CSR_BASE_ADDR + 0x414 + ++-------------+-------------+----------+-------------+-------------+ +| **Field | **Bit | **Type** | **Default | **De | +| Name** | Range** | | Value** | scription** | ++=============+=============+==========+=============+=============+ +| AUX | 14:0 | RO | 0x0 | Aux RAM | +| _RAM_WR_PTR | | | | Write | +| | | | | Pointer | ++-------------+-------------+----------+-------------+-------------+ +| AUX_RAM | 15 | RO | 0x0 | Aux RAM | +| _WR_PTR_MSB | | | | Write | +| | | | | Pointer MSB | ++-------------+-------------+----------+-------------+-------------+ +| AUX | 30:16 | RO | 0x0 | Aux RAM | +| _RAM_RD_PTR | | | | Read | +| | | | | Pointer | ++-------------+-------------+----------+-------------+-------------+ +| AUX_RAM | 31 | RO | 0x0 | Aux RAM | +| _RD_PTR_MSB | | | | Read | +| | | | | Pointer MSB | ++-------------+-------------+----------+-------------+-------------+ + +7. **Number of Bytes in Buffer Register** + + Address – PCIS_BASE_ADDR + 0x3818 + + CSR Offset – CSR_BASE_ADDR + 0x818 + + C2H CSR Offset – C2H_CSR_BASE_ADDR + 0x418 + ++-------------+-------------+----------+-------------+-------------+ +| **Field | **Bit | **Type** | **Default | **De | +| Name** | Range** | | Value** | scription** | ++=============+=============+==========+=============+=============+ +| NUM_BYTES | 15:0 | RO | 0x0 | Number of | +| | | | | Bytes in | +| | | | | Buffer When | +| | | | | Aux FIFO is | +| | | | | valid, this | +| | | | | is the | +| | | | | number of | +| | | | | bytes until | +| | | | | end of | +| | | | | current | +| | | | | packet When | +| | | | | Aux FIFO is | +| | | | | not valid, | +| | | | | this is the | +| | | | | number of | +| | | | | bytes in | +| | | | | the buffer | ++-------------+-------------+----------+-------------+-------------+ +| RSVD | 31:16 | RO | 0x0 | Reserved | ++-------------+-------------+----------+-------------+-------------+ + +C2H AXI-Stream CSRs +------------------- + +1. **Packet Count** + + Address – PCIS_BASE_ADDR + 0x3900 + + CSR Offset – CSR_BASE_ADDR + 0x900 + + C2H CSR Offset – C2H_CSR_BASE_ADDR + 0x500 + ++-------------+-------------+----------+-------------+-------------+ +| **Field | **Bit | **Type** | **Default | **De | +| Name** | Range** | | Value** | scription** | ++=============+=============+==========+=============+=============+ +| PKT_CNT | 31:0 | RW0C | 0x0 | Number of | +| | | | | packets | +| | | | | transmitted | +| | | | | on the AXIS | +| | | | | interface. | +| | | | | Increments | +| | | | | after | +| | | | | t | +| | | | | ransmitting | +| | | | | an EOP. | +| | | | | Write 0 to | +| | | | | clear. | ++-------------+-------------+----------+-------------+-------------+ + +H2C CSRs +-------- + +H2C CSR Address Mapping +----------------------- + ++----------------+----------------+----------------+----------------+ +| **Range** | **Size | **Name** | * | +| | (Bytes)** | | *Description** | ++================+================+================+================+ +| 0x3A00 – | 256 | H2C Global | H2C Global | +| 0x3AFC | | CSRs | Config and | +| | | | Status | +| | | | Registers | ++----------------+----------------+----------------+----------------+ +| 0x3B00 – | 256 | H2C Descriptor | H2C Descriptor | +| 0x3BFC | | CSRs | Config and | +| | | | Status | +| | | | Registers | ++----------------+----------------+----------------+----------------+ +| 0x3C00 – | 256 | H2C Data Mover | H2C Data Mover | +| 0x3CFC | | CSRs | Config and | +| | | | Status | +| | | | Registers | ++----------------+----------------+----------------+----------------+ +| 0x3D00 – | 256 | H2C Write-back | H2C Write-Back | +| 0x3DFC | | CSRs | Config and | +| | | | Status | +| | | | Registers | ++----------------+----------------+----------------+----------------+ +| 0x3E00 – | 256 | H2C Buffer | H2C Buffer | +| 0x3EFC | | CSRs | Config and | +| | | | Status | +| | | | Registers | ++----------------+----------------+----------------+----------------+ +| 0x3F00 – | 256 | H2C AXIS CSRs | H2C AXI-Stream | +| 0x3FFC | | | Config and | +| | | | Status | +| | | | Registers | ++----------------+----------------+----------------+----------------+ + +H2C Global CSRs +--------------- + +RSVD for future use + +H2C Descriptor CSRs +------------------- + +1. **Descriptor Credit Consumed Counter** + + Address – PCIS_BASE_ADDR + 0x3B00 + + CSR Offset – CSR_BASE_ADDR + 0xB00 + + H2C CSR Offset – H2C_CSR_BASE_ADDR + 0x100 + ++-------------+-------------+----------+-------------+-------------+ +| **Field | **Bit | **Type** | **Default | **De | +| Name** | Range** | | Value** | scription** | ++=============+=============+==========+=============+=============+ +| C | 31:0 | RW0C | 0x0 | Descriptor | +| DT_CONSUMED | | | | Credit | +| | | | | Consumed | +| | | | | Counter. | +| | | | | Write 0 to | +| | | | | clear. | ++-------------+-------------+----------+-------------+-------------+ + +2. **Descriptor Credit Limit Counter** + + Address – PCIS_BASE_ADDR + 0x3B04 + + CSR Offset – CSR_BASE_ADDR + 0xB04 + + H2C CSR Offset – H2C_CSR_BASE_ADDR + 0x104 + ++-------------+-------------+----------+-------------+-------------+ +| **Field | **Bit | **Type** | **Default | **De | +| Name** | Range** | | Value** | scription** | ++=============+=============+==========+=============+=============+ +| CDT_LIMIT | 31:0 | RW0C | H2C_DES | Descriptor | +| | | | C_RAM_DEPTH | Credit | +| | | | | Limit | +| | | | | Counter. | +| | | | | Write 0 to | +| | | | | clear. When | +| | | | | cleared, | +| | | | | the value | +| | | | | of the | +| | | | | counter is | +| | | | | reset to | +| | | | | H2C_DESC | +| | | | | _RAM_DEPTH. | ++-------------+-------------+----------+-------------+-------------+ + +3. **Completed Descriptors Counter** + + Address – PCIS_BASE_ADDR + 0x3B08 + + CSR Offset – CSR_BASE_ADDR + 0xB08 + + H2C CSR Offset – H2C_CSR_BASE_ADDR + 0x108 + ++-------------+-------------+----------+-------------+-------------+ +| **Field | **Bit | **Type** | **Default | **De | +| Name** | Range** | | Value** | scription** | ++=============+=============+==========+=============+=============+ +| COMP_COUNT | 31:0 | RW0C | 0x0 | Completed | +| | | | | Descriptor | +| | | | | Counter. | +| | | | | Write 0 to | +| | | | | clear. | ++-------------+-------------+----------+-------------+-------------+ + +4. **Descriptor FIFO Pointers** + + Address – PCIS_BASE_ADDR + 0x3B0C + + CSR Offset – CSR_BASE_ADDR + 0xB0C + + H2C CSR Offset – H2C_CSR_BASE_ADDR + 0x10C + ++-------------+-------------+----------+-------------+-------------+ +| **Field | **Bit | **Type** | **Default | **De | +| Name** | Range** | | Value** | scription** | ++=============+=============+==========+=============+=============+ +| FIFO_WR_PTR | 14:0 | RO | 0x0 | Descriptor | +| | | | | FIFO Write | +| | | | | Pointer | ++-------------+-------------+----------+-------------+-------------+ +| FIFO | 15 | RO | 0x0 | Descriptor | +| _WR_PTR_MSB | | | | FIFO Write | +| | | | | Pointer MSB | ++-------------+-------------+----------+-------------+-------------+ +| FIFO_RD_PTR | 30:16 | RO | 0x0 | Descriptor | +| | | | | FIFO Read | +| | | | | Pointer | ++-------------+-------------+----------+-------------+-------------+ +| FIFO | 31 | RO | 0x0 | Descriptor | +| _RD_PTR_MSB | | | | FIFO Read | +| | | | | Pointer MSB | ++-------------+-------------+----------+-------------+-------------+ + +5. **Descriptor RAM Address** + + Address – PCIS_BASE_ADDR + 0x3B10 + + CSR Offset – CSR_BASE_ADDR + 0xB10 + + H2C CSR Offset – H2C_CSR_BASE_ADDR + 0x110 + ++-------------+-------------+----------+-------------+-------------+ +| **Field | **Bit | **Type** | **Default | **De | +| Name** | Range** | | Value** | scription** | ++=============+=============+==========+=============+=============+ +| DE | 15:0 | RW | 0x0 | Descriptor | +| SC_RAM_ADDR | | | | RAM Address | ++-------------+-------------+----------+-------------+-------------+ +| DESC | 19:16 | RWC | 0x0 | Descriptor | +| _RAM_DW_IDX | | | | RAM Data DW | +| | | | | Index. This | +| | | | | bitfield is | +| | | | | cleared | +| | | | | when this | +| | | | | register is | +| | | | | written. | +| | | | | This will | +| | | | | aut | +| | | | | o-increment | +| | | | | when | +| | | | | DE | +| | | | | SC_RAM_DATA | +| | | | | is read or | +| | | | | written. | ++-------------+-------------+----------+-------------+-------------+ +| RSVD | 31:20 | RO | 0x0 | Reserved | ++-------------+-------------+----------+-------------+-------------+ + +6. **Descriptor RAM Data** + + Address – PCIS_BASE_ADDR + 0x3B14 + + CSR Offset – CSR_BASE_ADDR + 0xB14 + + H2C CSR Offset – H2C_CSR_BASE_ADDR + 0x114 + ++-------------+-------------+----------+-------------+-------------+ +| **Field | **Bit | **Type** | **Default | **De | +| Name** | Range** | | Value** | scription** | ++=============+=============+==========+=============+=============+ +| DESC_ | 31:0 | RW | 0x0 | Descriptor | +| RAM_DATA_DW | | | | RAM Data. | +| | | | | When | +| | | | | writing the | +| | | | | descriptor | +| | | | | RAM, SDE | +| | | | | initiates a | +| | | | | write to | +| | | | | the | +| | | | | descriptor | +| | | | | RAM after | +| | | | | all the DWs | +| | | | | that make | +| | | | | up the | +| | | | | descriptor | +| | | | | are written | +| | | | | to this | +| | | | | register. | +| | | | | When | +| | | | | reading the | +| | | | | descriptor | +| | | | | RAM, SDE | +| | | | | initiates a | +| | | | | read from | +| | | | | the | +| | | | | descriptor | +| | | | | RAM when | +| | | | | this | +| | | | | register is | +| | | | | read and | +| | | | | when the | +| | | | | DESC | +| | | | | _RAM_DW_IDX | +| | | | | is 0. | ++-------------+-------------+----------+-------------+-------------+ + +7. **Descriptor RAM Status** + + Address – PCIS_BASE_ADDR + 0x3B18 + + CSR Offset – CSR_BASE_ADDR + 0xB18 + + H2C CSR Offset – H2C_CSR_BASE_ADDR + 0x118 + ++-------------+-------------+----------+-------------+-------------+ +| **Field | **Bit | **Type** | **Default | **De | +| Name** | Range** | | Value** | scription** | ++=============+=============+==========+=============+=============+ +| DESC_OFLOW | 0 | RW1C | 0x0 | Desc RAM | +| | | | | Overflow | +| | | | | Indicates | +| | | | | that a | +| | | | | descriptor | +| | | | | was written | +| | | | | when the | +| | | | | descriptor | +| | | | | RAM is full | ++-------------+-------------+----------+-------------+-------------+ +| DES | 1 | RW1C | 0x0 | Desc Out of | +| C_OOO_ERROR | | | | Order Error | ++-------------+-------------+----------+-------------+-------------+ +| DESC_U | 2 | RW1C | 0x0 | Desc | +| NALIN_ERROR | | | | Unaligned | +| | | | | Address | +| | | | | Error | ++-------------+-------------+----------+-------------+-------------+ +| DESC_FULL | 3 | RO | 0x0 | Desc RAM | +| | | | | Full | ++-------------+-------------+----------+-------------+-------------+ +| DESC_EMPTY | 4 | RO | 0x0 | Desc RAM | +| | | | | Empty | ++-------------+-------------+----------+-------------+-------------+ +| RSVD | 31:1 | RO | 0x0 | Reserved | ++-------------+-------------+----------+-------------+-------------+ + +8. **Descriptor Info** + + Address – PCIS_BASE_ADDR + 0x3B20 + + CSR Offset – CSR_BASE_ADDR + 0xB20 + + H2C CSR Offset – H2C_CSR_BASE_ADDR + 0x120 + ++-------------+-------------+----------+-------------+-------------+ +| **Field | **Bit | **Type** | **Default | **De | +| Name** | Range** | | Value** | scription** | ++=============+=============+==========+=============+=============+ +| DESC_TYPE | 0 | RO | 0x0 | Descriptor | +| | | | | /Write-Back | +| | | | | Type 0 – | +| | | | | Regular 1 – | +| | | | | Compact | ++-------------+-------------+----------+-------------+-------------+ +| RSVD | 15:1 | RO | 0x0 | RSVD | ++-------------+-------------+----------+-------------+-------------+ +| DES | 31:16 | RO | 0x0 | Descriptor | +| C_RAM_DEPTH | | | | RAM Depth. | +| | | | | Maximum | +| | | | | Number of | +| | | | | d | +| | | | | escriptors. | ++-------------+-------------+----------+-------------+-------------+ + +H2C Data Mover CSRs +------------------- + +1. **Data Mover Config Register 0** + + Address – PCIS_BASE_ADDR + 0x3C00 + + CSR Offset – CSR_BASE_ADDR + 0xC00 + + H2C CSR Offset – H2C_CSR_BASE_ADDR + 0x200 + +============== ============= ======== ================= =============== +**Field Name** **Bit Range** **Type** **Default Value** **Description** +============== ============= ======== ================= =============== +RSVD 31:0 RW 0x0 Reserved +============== ============= ======== ================= =============== + +2. **Data Mover Status Register** + + Address – PCIS_BASE_ADDR + 0x3C04 + + CSR Offset – CSR_BASE_ADDR + 0xC04 + + H2C CSR Offset – H2C_CSR_BASE_ADDR + 0x204 + ++-------------+-------------+----------+-------------+-------------+ +| **Field | **Bit | **Type** | **Default | **De | +| Name** | Range** | | Value** | scription** | ++=============+=============+==========+=============+=============+ +| D | 0 | RW1C | 0x0 | Data Mover | +| M_RRESP_ERR | | | | Rresp Error | ++-------------+-------------+----------+-------------+-------------+ +| DM_D | 1 | RW1C | 0x0 | Descriptor | +| ESC_LEN_ERR | | | | Length | +| | | | | equal to 0 | ++-------------+-------------+----------+-------------+-------------+ +| RSVD | 31:2 | RO | 0x0 | Reserved | ++-------------+-------------+----------+-------------+-------------+ + +H2C Write-Back CSRs +------------------- + +1. **Write-Back Config Register 0** + + Address – PCIS_BASE_ADDR + 0x3D00 + + CSR Offset – CSR_BASE_ADDR + 0xD00 + + H2C CSR Offset – H2C_CSR_BASE_ADDR + 0x300 + ++-------------+-------------+----------+-------------+-------------+ +| **Field | **Bit | **Type** | **Default | **De | +| Name** | Range** | | Value** | scription** | ++=============+=============+==========+=============+=============+ +| DES | 0 | RW | 0x0 | Descriptor | +| C_CNT_WB_EN | | | | Count | +| | | | | Write-Back | +| | | | | Trigger | +| | | | | Enable. | +| | | | | When set, | +| | | | | SDE | +| | | | | schedules a | +| | | | | status | +| | | | | counter | +| | | | | write-back | +| | | | | when | +| | | | | descriptor | +| | | | | count | +| | | | | increments | ++-------------+-------------+----------+-------------+-------------+ +| PK | 1 | RW | 0x0 | Packet | +| T_CNT_WB_EN | | | | Count | +| | | | | Write-Back | +| | | | | Trigger | +| | | | | Enable. | +| | | | | When set, | +| | | | | SDE | +| | | | | schedules a | +| | | | | status | +| | | | | counter | +| | | | | write-back | +| | | | | when packet | +| | | | | count | +| | | | | increments. | ++-------------+-------------+----------+-------------+-------------+ +| DES | 2 | RW | 0x0 | Descriptor | +| C_CDT_WB_EN | | | | Credit | +| | | | | Write-Back | +| | | | | Trigger | +| | | | | Enable. | +| | | | | When set, | +| | | | | SDE | +| | | | | schedules a | +| | | | | status | +| | | | | counter | +| | | | | write-back | +| | | | | when | +| | | | | descriptor | +| | | | | credit | +| | | | | “limit” | +| | | | | increments. | ++-------------+-------------+----------+-------------+-------------+ +| RSVD | 3 | RO | 0x0 | Reserved | ++-------------+-------------+----------+-------------+-------------+ +| DES | 4 | RW | 0x0 | Descriptor | +| C_CDT_WC_EN | | | | Credit | +| | | | | “Limit” | +| | | | | Write-Back | +| | | | | Coalesce | +| | | | | Enable | ++-------------+-------------+----------+-------------+-------------+ +| DES | 5 | RW | 0x0 | Descriptor | +| C_CNT_WC_EN | | | | Count | +| | | | | Write-Back | +| | | | | Coalesce | +| | | | | Enable. | ++-------------+-------------+----------+-------------+-------------+ +| PK | 6 | RW | 0x0 | Packet | +| T_CNT_WC_EN | | | | Count | +| | | | | Write-Back | +| | | | | Coalesce | +| | | | | Enable | ++-------------+-------------+----------+-------------+-------------+ +| RSVD | 7 | RO | 0x0 | Reserved | ++-------------+-------------+----------+-------------+-------------+ +| WC | 13:8 | RW | 0x0 | Write-Back | +| _CNT_MINUS1 | | | | Coalesce | +| | | | | Count Minus | +| | | | | 1. Number | +| | | | | of writes | +| | | | | to | +| | | | | coalesce. | ++-------------+-------------+----------+-------------+-------------+ +| RSVD | 31:14 | RO | 0x0 | Reserved | ++-------------+-------------+----------+-------------+-------------+ + +2. **Status Counters Base Address Low** + + Address – PCIS_BASE_ADDR + 0x3D04 + + CSR Offset – CSR_BASE_ADDR + 0xD04 + + H2C CSR Offset – H2C_CSR_BASE_ADDR + 0x304 + ++-------------+-------------+----------+-------------+-------------+ +| **Field | **Bit | **Type** | **Default | **De | +| Name** | Range** | | Value** | scription** | ++=============+=============+==========+=============+=============+ +| STATUS | 31:0 | RW | 0x0 | Status | +| _WB_ADDR_LO | | | | Counters | +| | | | | Base | +| | | | | Address | +| | | | | [31:0] This | +| | | | | address | +| | | | | should be | +| | | | | 64B | +| | | | | aligned. | +| | | | | The least | +| | | | | significant | +| | | | | 6 bits of | +| | | | | the address | +| | | | | should 0. | ++-------------+-------------+----------+-------------+-------------+ + +3. **Status Write-Back Address High** + + Address – PCIS_BASE_ADDR + 0x3D08 + + CSR Offset – CSR_BASE_ADDR + 0xD08 + + H2C CSR Offset – H2C_CSR_BASE_ADDR + 0x308 + ++-------------+-------------+----------+-------------+-------------+ +| **Field | **Bit | **Type** | **Default | **De | +| Name** | Range** | | Value** | scription** | ++=============+=============+==========+=============+=============+ +| STATUS | 15:0 | RW | 0x0 | Status | +| _WB_ADDR_HI | | | | Counters | +| | | | | Base | +| | | | | Address | +| | | | | [47:32] | ++-------------+-------------+----------+-------------+-------------+ +| RSVD | 31:16 | RO | 0x0 | Reserved | ++-------------+-------------+----------+-------------+-------------+ + +4. **Write-Back Coalesce Timeout Count** + + Address – PCIS_BASE_ADDR + 0x3D0C + + CSR Offset – CSR_BASE_ADDR + 0xD0C + + H2C CSR Offset – H2C_CSR_BASE_ADDR + 0x30C + ++-------------+-------------+----------+-------------+-------------+ +| **Field | **Bit | **Type** | **Default | **De | +| Name** | Range** | | Value** | scription** | ++=============+=============+==========+=============+=============+ +| WC_ | 19:0 | RW | 0x0 | Write-Back | +| TO_TICK_CNT | | | | Coalesce | +| | | | | Timeout | +| | | | | Tick Count | ++-------------+-------------+----------+-------------+-------------+ +| WC_TO_CNT | 23:20 | RW | 0x0 | Write-Back | +| | | | | Coalesce | +| | | | | Timeout | +| | | | | Count | ++-------------+-------------+----------+-------------+-------------+ +| RSVD | 31:24 | RO | 0x0 | Reserved | ++-------------+-------------+----------+-------------+-------------+ + +5. **Write Back Status Register** + + Address – PCIS_BASE_ADDR + 0x3D10 + + CSR Offset – CSR_BASE_ADDR + 0xD10 + + H2C CSR Offset – H2C_CSR_BASE_ADDR + 0x310 + ++-------------+-------------+----------+-------------+-------------+ +| **Field | **Bit | **Type** | **Default | **De | +| Name** | Range** | | Value** | scription** | ++=============+=============+==========+=============+=============+ +| WB_STS_ | 0 | RW1C | 0x0 | Write Back | +| BRESP_ERROR | | | | BRESP Error | +| | | | | for Status | +| | | | | Write-Back | ++-------------+-------------+----------+-------------+-------------+ +| RSVD | 31:1 | RO | 0x0 | Reserved | ++-------------+-------------+----------+-------------+-------------+ + +6. **Status DW Register** + + Address – PCIS_BASE_ADDR + 0x3D14 + + CSR Offset – CSR_BASE_ADDR + 0xD14 + + H2C CSR Offset – H2C_CSR_BASE_ADDR + 0x314 + +============== ============= ======== ================= ================ +**Field Name** **Bit Range** **Type** **Default Value** **Description** +============== ============= ======== ================= ================ +DESC_ERROR 0 RO 0x0 Descriptor Error +DM_ERROR 1 RO 0x0 Data Mover Error +WB_ERROR 2 RO 0x0 Write Back Error +RSVD 31:3 RO 0x0 Reserved +============== ============= ======== ================= ================ + +H2C Buffer CSRs +--------------- + +1. **Buffer Config Register 0** + + Address – PCIS_BASE_ADDR + 0x3E00 + + CSR Offset – CSR_BASE_ADDR + 0xE00 + + H2C CSR Offset – H2C_CSR_BASE_ADDR + 0x400 + +============== ============= ======== ================= =============== +**Field Name** **Bit Range** **Type** **Default Value** **Description** +============== ============= ======== ================= =============== +RSVD 31:0 RW 0x0 Reserved +============== ============= ======== ================= =============== + +2. **Buffer Status Register** + + Address – PCIS_BASE_ADDR + 0x3E04 + + CSR Offset – CSR_BASE_ADDR + 0xE04 + + H2C CSR Offset – H2C_CSR_BASE_ADDR + 0x404 + +============== ============= ======== ================= =============== +**Field Name** **Bit Range** **Type** **Default Value** **Description** +============== ============= ======== ================= =============== +BUF_FULL 0 RO 0x0 Buffer Full +BUF_EMPTY 1 RO 0x0 Buffer Empty +AUX_FIFO_FULL 2 RO 0x0 Aux FIFO Full +AUX_FIFO_EMPTY 3 RO 0x0 Aux FIFO Empty +RSVD 31:4 RO 0x0 Reserved +============== ============= ======== ================= =============== + +3. **Buffer Input Packet Count Register** + + Address – PCIS_BASE_ADDR + 0x3E08 + + CSR Offset – CSR_BASE_ADDR + 0xE08 + + H2C CSR Offset – H2C_CSR_BASE_ADDR + 0x408 + ++----------------+---------------+----------+-------------------+--------------------+ +| **Field Name** | **Bit Range** | **Type** | **Default Value** | **Description** | ++================+===============+==========+===================+====================+ +| IN_PKT_CNT | 31:0 | RW0C | 0x0 | Input Packet Count | ++----------------+---------------+----------+-------------------+--------------------+ + +4. **Buffer Output Packet Count Register** + + Address – PCIS_BASE_ADDR + 0x3E0C + + CSR Offset – CSR_BASE_ADDR + 0xE0C + + H2C CSR Offset – H2C_CSR_BASE_ADDR + 0x40C + ++----------------+---------------+----------+-------------------+---------------------+ +| **Field Name** | **Bit Range** | **Type** | **Default Value** | **Description** | ++================+===============+==========+===================+=====================+ +| OUT_PKT_CNT | 31:0 | RW0C | 0x0 | Output Packet Count | ++----------------+---------------+----------+-------------------+---------------------+ + +5. **Buffer Pointer Register** + + Address – PCIS_BASE_ADDR + 0x3E10 + + CSR Offset – CSR_BASE_ADDR + 0xE10 + + H2C CSR Offset – H2C_CSR_BASE_ADDR + 0x410 + ++-------------+-------------+----------+-------------+-------------+ +| **Field | **Bit | **Type** | **Default | **De | +| Name** | Range** | | Value** | scription** | ++=============+=============+==========+=============+=============+ +| BUF_WR_PTR | 15:0 | RO | 0x0 | Buffer | +| | | | | Write | +| | | | | Pointer | +| | | | | (RAM entry | +| | | | | based) | ++-------------+-------------+----------+-------------+-------------+ +| BUF_RD_ADDR | 31:16 | RO | 0x0 | Buffer Read | +| | | | | Address | +| | | | | (Byte | +| | | | | based) | ++-------------+-------------+----------+-------------+-------------+ + +6. **Aux RAM Pointers** + + Address – PCIS_BASE_ADDR + 0x3E14 + + CSR Offset – CSR_BASE_ADDR + 0xE14 + + H2C CSR Offset – H2C_CSR_BASE_ADDR + 0x414 + ++-------------+-------------+----------+-------------+-------------+ +| **Field | **Bit | **Type** | **Default | **De | +| Name** | Range** | | Value** | scription** | ++=============+=============+==========+=============+=============+ +| AUX | 14:0 | RO | 0x0 | Aux RAM | +| _RAM_WR_PTR | | | | Write | +| | | | | Pointer | ++-------------+-------------+----------+-------------+-------------+ +| AUX_RAM | 15 | RO | 0x0 | Aux RAM | +| _WR_PTR_MSB | | | | Write | +| | | | | Pointer MSB | ++-------------+-------------+----------+-------------+-------------+ +| AUX | 30:16 | RO | 0x0 | Aux RAM | +| _RAM_RD_PTR | | | | Read | +| | | | | Pointer | ++-------------+-------------+----------+-------------+-------------+ +| AUX_RAM | 31 | RO | 0x0 | Aux RAM | +| _RD_PTR_MSB | | | | Read | +| | | | | Pointer MSB | ++-------------+-------------+----------+-------------+-------------+ + +7. **Number of Entries in Buffer Register** + + Address – PCIS_BASE_ADDR + 0x3E18 + + CSR Offset – CSR_BASE_ADDR + 0xE18 + + H2C CSR Offset – H2C_CSR_BASE_ADDR + 0x418 + ++-------------+-------------+----------+-------------+-------------+ +| **Field | **Bit | **Type** | **Default | **De | +| Name** | Range** | | Value** | scription** | ++=============+=============+==========+=============+=============+ +| NUM_F | 15:0 | RO | 0x0 | Number of | +| REE_ENTRIES | | | | Free | +| | | | | Entries in | +| | | | | Buffer RAM | ++-------------+-------------+----------+-------------+-------------+ +| RSVD | 31:16 | RO | 0x0 | Reserved | ++-------------+-------------+----------+-------------+-------------+ + +8. **Data Mover Buffer Pointer Register** + + Address – PCIS_BASE_ADDR + 0x3E1C + + CSR Offset – CSR_BASE_ADDR + 0xE1C + + H2C CSR Offset – H2C_CSR_BASE_ADDR + 0x41C + ++-------------+-------------+----------+-------------+-------------+ +| **Field | **Bit | **Type** | **Default | **De | +| Name** | Range** | | Value** | scription** | ++=============+=============+==========+=============+=============+ +| DM | 14:0 | RO | 0x0 | Data Mover | +| _BUF_WR_PTR | | | | Buffer | +| | | | | Write | +| | | | | Pointer | ++-------------+-------------+----------+-------------+-------------+ +| DM_BUF | 15 | RO | 0x0 | Data Mover | +| _WR_PTR_MSB | | | | Buffer | +| | | | | Write | +| | | | | Pointer MSB | ++-------------+-------------+----------+-------------+-------------+ +| DM | 30:16 | RO | 0x0 | Data Mover | +| _AUX_WR_PTR | | | | Aux RAM | +| | | | | Read | +| | | | | Pointer | ++-------------+-------------+----------+-------------+-------------+ +| DM_AUX | 31 | RO | 0x0 | Data Mover | +| _WR_PTR_MSB | | | | Aux RAM | +| | | | | Read | +| | | | | Pointer MSB | ++-------------+-------------+----------+-------------+-------------+ + +H2C AXI-Stream CSRs +------------------- + +1. **Packet Count** + + Address – PCIS_BASE_ADDR + 0x3F00 + + CSR Offset – CSR_BASE_ADDR + 0xF00 + + H2C CSR Offset – H2C_CSR_BASE_ADDR + 0x500 + ++-------------+-------------+----------+-------------+-------------+ +| **Field | **Bit | **Type** | **Default | **De | +| Name** | Range** | | Value** | scription** | ++=============+=============+==========+=============+=============+ +| PKT_CNT | 31:0 | RW0C | 0x0 | Number of | +| | | | | packets | +| | | | | received on | +| | | | | the AXIS | +| | | | | interface. | +| | | | | Increments | +| | | | | after | +| | | | | receiving | +| | | | | an EOP. | +| | | | | Write 0 to | +| | | | | clear. | ++-------------+-------------+----------+-------------+-------------+ + +Descriptors and Write-Back Metadata +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Descriptors are used to provide all required information for the data +transfer. The software/driver is expected to provide this information to +the SDE. SDE supports two types of descriptors – Normal and compact +type. The choice of the descriptor type is static and has to be chosen +during the design of the application when the SDE is instanced in the +CL. The normal type descriptor is 256 bit wide and the compact type +descriptor is 128 bit wide. The advantage of using the compact +descriptor is the reduction in the BRAM use for the descriptor RAM in +the SDE. Write-Back Metadata is used to provide all the required +information about a completed data transfer. SDE provides this data to +the software/driver by writing to a write-back metadata ring stored in +host memory. Write-Back Metadata is only used for C2H transfers. SDE +supports two types of write-back metadata – Normal and compact type. The +choice of the write-back metadata type is static and has to be chosen +during the design of the application when the SDE is instanced in the +CL. The normal type write-back metadata is 128 bit wide and the compact +type write-back metadata is 64 bit wide. The type of the write- back +metadata will be the same as the descriptor type chosen. + +C2H Descriptor and Metadata +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +C2H Descriptor +^^^^^^^^^^^^^^ + ++---------+---------+---------+---------+---------+---------+---------+ +| ** | | * | | | ** | | +| Field** | | *Normal | | | Compact | | +| | | Type** | | | Type** | | ++=========+=========+=========+=========+=========+=========+=========+ +| | **Bit- | **High | **Low | **Bit- | **High | **Low | +| | Width** | Bit | Bit | Width** | Bit | Bit | +| | | Index** | Index** | | Index** | Index** | ++---------+---------+---------+---------+---------+---------+---------+ +| * | 32 | 31 | 0 | 32 | 31 | 0 | +| *Length | | | | | | | +| (B | | | | | | | +| ytes)** | | | | | | | ++---------+---------+---------+---------+---------+---------+---------+ +| **P | 64 | 95 | 32 | 48 | 79 | 32 | +| hysical | | | | | | | +| Ad | | | | | | | +| dress** | | | | | | | ++---------+---------+---------+---------+---------+---------+---------+ +| * | 32 | 127 | 96 | 48 | 127 | 80 | +| *RSVD** | | | | | | | ++---------+---------+---------+---------+---------+---------+---------+ +| ** | 128 | | 128 | | | | +| Total** | | | | | | | ++---------+---------+---------+---------+---------+---------+---------+ + +Description of Fields + +1) Physical Address: Destination physical address for the data. This is + the host guest physical address used by the SDE to write the packet. + For compact descriptor type, this address is 48 bits wide. +2) Length: Number of bytes for the data transfer. The minimum length is + 1 byte. +3) RSVD: These bits are used to adjust the total length of the + descriptor to 128 bits and unused in the SDE. SDE does not store + these bits in the descriptor RAM. + +C2H Write-Back Metadata +^^^^^^^^^^^^^^^^^^^^^^^ + ++---------+---------+---------+---------+---------+---------+---------+ +| ** | | * | | | ** | | +| Field** | | *Normal | | | Compact | | +| | | Type** | | | Type** | | ++=========+=========+=========+=========+=========+=========+=========+ +| | **Bit- | **High | **Low | **Bit- | **High | **Low | +| | Width** | Bit | Bit | Width** | Bit | Bit | +| | | Index** | Index** | | Index** | Index** | ++---------+---------+---------+---------+---------+---------+---------+ +| * | 32 | 31 | 0 | 32 | 31 | 0 | +| *Length | | | | | | | +| (B | | | | | | | +| ytes)** | | | | | | | ++---------+---------+---------+---------+---------+---------+---------+ +| ** | 1 | 32 | 32 | 1 | 32 | 32 | +| Valid** | | | | | | | ++---------+---------+---------+---------+---------+---------+---------+ +| **EOP** | 1 | 33 | 33 | 1 | 33 | 33 | ++---------+---------+---------+---------+---------+---------+---------+ +| * | 30 | 63 | 34 | 30 | 63 | 34 | +| *RSVD** | | | | | | | ++---------+---------+---------+---------+---------+---------+---------+ +| **User | 64 | 127 | 64 | NA | NA | NA | +| Bits** | | | | | | | ++---------+---------+---------+---------+---------+---------+---------+ +| ** | 128 | | 64 | | | | +| Total** | | | | | | | ++---------+---------+---------+---------+---------+---------+---------+ + +Description of Fields + +1. Valid: This is set to 1 when the SDE writes the write-back metadata. + +2. EOP: This indicates that the EOP was received on the AXI Streaming + interface during the data transfer for this descriptor. + +3. Length: Number of bytes of data transferred for this descriptor. + +4. User Bits: These bits are sampled on the user bus of the AXI + Streaming Interface when the EOP is asserted. + +5. RVSD: These bits are used to adjust the total length of the + write-back metadata to 128 bits and are unused in the SDE. + +H2C Descriptor +~~~~~~~~~~~~~~ + ++---------+---------+---------+---------+---------+---------+---------+ +| ** | | * | | | ** | | +| Field** | | *Normal | | | Compact | | +| | | Type** | | | Type** | | ++=========+=========+=========+=========+=========+=========+=========+ +| | **Bit- | **High | **Low | **Bit- | **High | **Low | +| | Width** | Bit | Bit | Width** | Bit | Bit | +| | | Index** | Index** | | Index** | Index** | ++---------+---------+---------+---------+---------+---------+---------+ +| * | 32 | 31 | 0 | 32 | 31 | 0 | +| *Length | | | | | | | +| (B | | | | | | | +| ytes)** | | | | | | | ++---------+---------+---------+---------+---------+---------+---------+ +| **P | 64 | 95 | 32 | 48 | 79 | 32 | +| hysical | | | | | | | +| Ad | | | | | | | +| dress** | | | | | | | ++---------+---------+---------+---------+---------+---------+---------+ +| **EOP** | 1 | NA | 96 | 1 | NA | 80 | ++---------+---------+---------+---------+---------+---------+---------+ +| **SPB** | 1 | NA | 97 | 1 | NA | 81 | ++---------+---------+---------+---------+---------+---------+---------+ +| * | 94 | 191 | 98 | 46 | 127 | 82 | +| *RSVD** | | | | | | | ++---------+---------+---------+---------+---------+---------+---------+ +| **User | 64 | 255 | 192 | NA | NA | NA | +| Bits** | | | | | | | ++---------+---------+---------+---------+---------+---------+---------+ +| ** | 256 | | 128 | | | | +| Total** | | | | | | | ++---------+---------+---------+---------+---------+---------+---------+ + +Descriptions of Fields + +1. Physical Address: Source physical address for the data. This is the + host guest physical address used by the SDE to read the packet. For + compact descriptor type, this address is 48 bits wide. This field is + not used when SPB = 1. + +2. Length: Number of bytes for the data transfer. The minimum length is + 1 byte. + +3. EOP: If bit is set, the SDE will assert the “last” signal on the last + beat of the transfer on the AXI Streaming interface. + +4. SPB: This bit indicates if the source of the packet is Small Packet + Buffer or PCIM. If this bit is set, the SDE data mover will read the + packets from SPB instead of the PCIM. + +5. User Bits: These bits are driven on the user bus of the AXI Streaming + Interface when the EOP is asserted. + +6. RSVD: These bits are used to adjust the total length of the + descriptor to 256 bits and unused in the SDE. SDE does not store + these bits in the descriptor RAM. + +Credit Mechanism +---------------- + +SDE architecture implements a credit mechanism for descriptors and for +small packet buffer. In this section, the description is provided for +descriptors but the mechanism is identical for descriptors and small +packet buffer. The credit mechanism contains two counters “consumed” and +“limit”. The difference between these two counters is the number of +available credits based on which the software can write the descriptors. +These counters are implemented as 32 bit rolling counters. These +counters are present in both the SDE and the software. However, the SDE +updates the software’s copy of the “limit” counter after the SDE reads a +descriptor from the descriptor RAM. + +1) “consumed”: This counter is implemented in the SDE and the software. + This counter is initialized to 0. When the software writes the + descriptor, software will increment its copy of this counter. When + the SDE receives this descriptor into the descriptor RAM, the SDE + will increment its copy of this counter. + +2) “limit”: This counter is implemented in the SDE. The counter is also + present in the software but the software will not change the value. + software will only use this counter to determine number of available + credits. This counter is initialized to the number of available + credits. When the SDE completes a descriptor, it will increment its + copy of this counter. It will also update the software’s copy of this + counter using the PCIM interface. + +3) “available”: This is difference between the “consumed” and the + “limit” counters. The software will compute this locally and will use + this value to determine how many descriptors can be written. + +Write-Back Mechanism +-------------------- + +Status Counter Write-Back +~~~~~~~~~~~~~~~~~~~~~~~~~ + +SDE is architect-ed to update some status counters and C2H metadata to +host memory locations. software should store status counters on +contiguous host memory locations. In order to minimize bandwidth usage, +SDE updates all status counters using a single AXI write transaction on +PCIM. All these status counters are 32 bits wide (DW) and software +should configure the status counters’ host memory base address in the +SDE during initialization. SDE updates the following counters +periodically + +1) Status DW (Offset 0x0) a. Bit 0 – Descriptor Error b. Bit 1 – Data + Mover Error c. Bit 2 – Write Back Error d. Bit 31:3 – RSVD +2) Descriptor Credit “Limit” Counter (Offset 0x4) +3) Number of completed Descriptors (Offset 0x8) +4) Packet count on the AXIS interface (Offset 0xC) +5) Metadata buffer write pointer (C2H Only) (Offset 0x10) + +The Status DW contains bits that denote error conditions in the SDE. +When errors are detected, the SDE will update SW’s copy of the Status +DW. The SW should poll its copy of the status DW periodically and take +recovery action when it reads non-zero values in the Status DW. Each bit +corresponds to a functional block that reported the error and SW should +read the respective functional block’s status register to determine the +exact error. After recovery action is taken, the SW should clear the +error flag from the functional block’s status register. When cleared, +the SDE will also update SW’s copy of the Status DW. The Status DW +should not be written by SW. + +In order to conserve bandwidth and allow for maximum bandwidth usage by +the data mover, SDE is architect-ed to coalesce updates to the status +counters except the Status DW. SDE maintains one coalesce counter for +each status counter and will coalesce the respective status counter. The +number writes to coalesce is configurable using CSRs. SDE also +implements a configurable timeout mechanism to update the status +counters if the required number of writes are not coalesced in the +timeout window. + +C2H Metadata Write-Back +~~~~~~~~~~~~~~~~~~~~~~~ + +SDE writes C2H metadata to a circular buffer that is stored in host +memory. The mechanism contains two pointers – read and write. The +pointers are present in the SDE and the software and they are used to +determine if the circular buffer is full and empty respectively. These +pointers are implemented using counters initialized to 0 and roll over +when their respective values are equal to the number of metadata entries +minus 1. + +The software should configure the circular buffer’s base address and +circular buffer size during initialization. The software should also +clear SDE’s copy of the read pointer and write pointer during +initialization. + +1) Read pointer: software increments the read pointer when it reads the + write-back metadata and software periodically updates SDE’s copy of + the read pointer using CSR memory writes. The SDE uses its copy to + determine if there is room in the circular buffer before writing + metadata. In order to provide as much bandwidth to descriptor writes, + software should keep the frequency of updating the SDE’s copy low. + +When posting descriptors, the software can optionally ensure that there +is room in the metadata ring. If no free entries are available in the +metadata ring, the SDE will keep waiting until software updates the +read-pointer. This will eventually backpressure the data mover. The +software should consider that the metadata ring is full when the value +of write pointer plus 1 is equal to the read pointer. + +2) Write pointer: SDE uses the write-pointer, metadata ring base address + and ring size to determine the address to where the metadata has to + be written. SDE increments the write pointer after the SDE writes the + metadata to host location and SDE updates software’s copy of the + write pointer by writing to host memory. The software can use the + write pointer value to determine how many valid metadata entries are + present in the circular buffer. + +Data Flow Model +--------------- + +C2H +~~~ + +1) APP: Application requests the software to move packets from the CL + by calling software provided APIs. + +2) CL: The CL streams data into the SDE’s buffer. + +3) Software: When enough descriptor credits and metadata entries are + available, software will write the descriptor (physical address of + packet buffer and length) to the SDE’s desc RAM using PF0-BAR4 and + write-combine. + +4) SDE: When the software writes the descriptors, the SDE will + increment the “consumed”. SDE’s data mover will read the descriptor + from the desc RAM. When the SDE’s data mover reads the descriptor, + SDE increments the descriptor credit “limit” counter and also + schedules an update to the software’s copy of this counter using + PCIM. + +5) Software: Software will read the “limit” and compute number of + available credits to figure out if more descriptors can be written. + +6) SDE: If there is enough data (as requested in the desc) or if there + is an EOP, SDE Data Mover initiates data transfer by issuing writes + to host on PCIM. If there is not enough data and if an EOP is not + received, data mover will wait. + +7) SDE: After the data mover completes the data transfer and if + metadata ring is not full, SDE writes the metadata (valid bit, byte + count, EOP and any user bits) to the metadata ring using PCIM. SDE + increments its copy of the metadata ring write-pointer and will also + schedule an update to software’s copy of the metadata ring + write-pointer. + +8) SDE: The SDE increments the “number of completed descriptors” + counter and metadata write pointer. The SDE also schedules an update + to software’s copy of these counters. + +9) Software: Software will poll the valid bit of the metadata to figure + out that the data transfer is complete. + +10) Software: After reading the metadata, software clears the valid bit + of the metadata that was read. Software will increment read pointer + and when required, will update SDE’s copy of the metadata ring read + pointer. Note if software ensures that metadata entries are + available before posting the descriptor, metadata pointers can be + disabled and the software is not required to update SDE’s copy of + the read pointer. + +H2C +~~~ + +1) APP: Application requests the software to move packets to the CL + using software provided APIs. + +2) Software: When enough descriptor credits are available, software + will write the descriptor (physical address of packet buffer, + length, EOP and SPB bits) to the SDE’s desc RAM using PF0-BAR4 and + write-combine. + +3) SDE: When the software writes the descriptors, the SDE will + increment the “consumed”. SDE’s data mover will read the descriptor + from the desc RAM. When the SDE’s data mover reads the descriptor, + SDE increments the descriptor credit “limit” counter and also + schedules an update to the software’s copy of this counter using + PCIM. + +4) Software: Software will read the “limit” and compute number of + available credits to figure out if more descriptors can be written. + +5) SDE: If there is enough room in the SDE buffer (as requested by the + descriptor), SDE Data Mover initiates data transfer by issuing reads + from host DRAM on PCIM. When the descriptor specifies the source of + the packet as the small-pkt buffer, the data mover will read from + small-pkt buffer instead of using PCIM. If there is not enough room + in the buffer, data mover will wait. + +6) SDE: Data mover writes the received PCIM read data to the buffer to + be streamed to the CL (for non-small packet buffer case). + +7) SDE: SDE implements a master streaming interface that reads data + from the buffer and streams it to the CL. + +8) SDE: After the data mover completes the data transfer, SDE + increments the “number of completed descriptors” counter and also + schedules an update to the software’s copy of this counter using + PCIM. + +9) Software: Software will poll its copy of “number of completed + descriptors” to figure out that data transfer is complete. + +10) Software: Software can also poll its copy of “packet count” to + figure out that a packet has been transmitted on the AXI-Stream + interface. + +Error Conditions +---------------- + +C2H Error Conditions +~~~~~~~~~~~~~~~~~~~~ + +1. Descriptor RAM Overflow: Occurs when the descriptor RAM is full and + SW writes a new descriptor + +2. Descriptor Out of Order Error: If a descriptor write is split into + multiple writes, each write should use incrementing address. If this + condition is violated, the out of order error is set. + +3. Descriptor Unaligned Error: Occurs when a non-64B aligned address is + used for writing descriptors. + +4. Data Mover BRESP Error: Occurs when a non-zero BRESP is received on + the PCIM interface for data writes + +5. Data Mover Descriptor Length Error: Occurs when data mover encounters + a descriptor with length equal to 0. + +6. Write Back BRESP Error: Occurs when a non-zero BRESP is received on + the PCIM interface for write-back writes. + +H2C Error Conditions +~~~~~~~~~~~~~~~~~~~~ + +1. Descriptor RAM Overflow: Occurs when the descriptor RAM is full and + SW writes a new descriptor + +2. Descriptor Out of Order Error: If a descriptor write is split into + multiple writes, each write should use incrementing address. If this + condition is violated, the out of order error is set. + +3. Descriptor Unaligned Error: Occurs when a non-64B aligned address is + used for writing descriptors. + +4. Data Mover RRESP Error: Occurs when a non-zero RRESP is received on + the PCIM interface for data reads + +5. Data Mover Descriptor Length Error: Occurs when data mover encounters + a descriptor with length equal to 0. + +6. Write Back BRESP Error: Occurs when a non-zero BRESP is received on + the PCIM interface for write-back writes. + +Implementation - Maximum Clock Frequency +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The SDE can be implemented at a maximum frequency of 250MHz + +Implementation - Resource Utilization +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The resource utilization for the SDE implemented at 250MHz when using 64 +descriptor RAM depth and 32KB buffers for C2H and H2C each. + +========== ========== ======= ==== ===== ======== ==== ============ +Total LUTs Logic LUTs LUTRAMs SRLs FFs RAMB2016 URAM DSP48 Blocks +========== ========== ======= ==== ===== ======== ==== ============ +36330 35672 658 0 23525 15 0 0 +========== ========== ======= ==== ===== ======== ==== ============ + +Example Design +-------------- + +AWS provides an example CL called CL_SDE. CL_SDE instances the SDE and +some utility and test blocks to demonstrate the functionality of the +SDE. See `CL_SDE <../../../../hdk/cl/examples/cl_sde/>`__ for details. + +FAQ +--- + +Q: What is the maximum number of full duplex channels per instance of SDE? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +One instance of SDE will provide one full duplex channel (one C2H and +one H2C). + +.. _q-my-application-does-not-need-c2h-i-only-need-h2c-how-can-this-be-done: + +Q: My application does not need C2H. I only need H2C. How can this be done? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Design parameters C2H_ONLY and H2C_ONLY can be used to get what is +required and avoid unwanted logic. For example, if only C2H is required, +C2H_ONLY should be 1 so that H2C logic is avoided. + +.. _q-my-application-needs-more-than-one-full-duplex-channel-how-can-this-be-achieved: + +Q. My application needs more than one full duplex channel. How can this be achieved? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +With the current version of the SDE, if more than 1 full duplex channel +is needed, multiple SDEs have to be instanced and AXI crossbars have to +be used to connect the PCIS and PCIM buses to/from the corresponding +SDEs. Similarly, if more than 1 C2H or more than 1 H2C channel is +required, multiple SDEs have to be used. + +.. _q-is-there-a-maximum-number-of-sdes-that-can-be-instanced-in-a-cl: + +Q. Is there a maximum number of SDEs that can be instanced in a CL? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +There is no theoretical maximum. There is a practical limitation based +on the number of resources in the CL. + +.. _q-what-kind-of-softwaredriver-is-required-to-use-the-sde: + +Q. What kind of software/Driver is required to use the SDE. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +A userspace or kernel poll-mode driver is required to use the SDE. + +.. _q-does-aws-have-any-example-driverapplication: + +Q. Does AWS have any example Driver/Application? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +AWS provides DPDK based Virtual Ethernet application described +`here <./Virtual_Ethernet_Application_Guide.md>`__. + +.. _q-does-sde-supports-interrupts: + +Q. Does SDE supports interrupts? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Interrupts are not supported by the SDE. + +.. _q-my-application-needs-more-descriptors-in-the-sde-how-can-i-achieve-this: + +Q. My application needs more descriptors in the SDE? How can I achieve this? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Parameters C2H_DESC_RAM_DEPTH and H2C_DESC_RAM_DEPTH can be used to +increase the number of descriptors that can be stored in the SDE. Note +that this will increase BRAM usage in the SDE. + +.. _q-how-can-i-change-the-size-of-the-h2c-and-c2h-buffers: + +Q. How can I change the size of the H2C and C2H buffers? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Parameters C2H_BUF_DEPTH and H2C_BUF_DEPTH can be used to change the +size of the main packet buffers for C2H and H2C respectively. + +.. _q-what-is-the-guideline-for-choosing-buffer-sizes: + +Q. What is the guideline for choosing buffer sizes? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The H2C buffer should be sized according to the bandwidth requirements. +Having a very small H2C buffer will cause the SDE to reduce the +effective number of outstanding PCIM reads leading to host DRAM +latencies getting manifested on the H2C AXI-S interface, leading to +reduced H2C bandwidth. AWS has observed that 32KB buffer is sufficient +to maximize H2C throughput assuming average DRAM latency of 2us and +PCI-E BW of 16GB/s. The C2H buffer should be sized according to CL +resource availability and latency requirements. Assuming 4KB PCIM +writes, AWS recommends at least a size of 16KB C2H buffer to maximize +C2H BW. + +.. _q-my-application-needs-more-than--less-than-64-user-bits-how-can-this-be-achieved: + +Q. My application needs more than / less than 64 user bits. How can this be achieved? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +In the current version of the SDE, User bit width cannot be changed. +Therefore, parameters C2H_USER_BIT_WIDTH and H2C_USER_BIT_WIDTH should +not be changed. If more user bits are required, they will have to be +embedded in the payload of the packet (For example, preamble or appended +at the end of the packet). + +.. _q-can-i-use-write-combine-to-write-multiple-descriptors-per-clock: + +Q. Can I use write-combine to write multiple descriptors per clock? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Traditional Write-combine, explained +`here `__, +routinely causes the CPU to generate out of order writes to the +descriptor address range. SDE does not support out of order writes to +the descriptor range. Therefore, x86 intrinsic load/store instructions +should be used to write descriptors in order. + +.. _q-what-is-the-maximum-throughput-of-the-sde: + +Q. What is the maximum throughput of the SDE? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The maximum throughput for H2C is 12 GB/s and the maximum throughput for +C2h is 12.4 GB/s. + +.. _q-what-is-the-minimum-packet-size-required-for-maximum-throughput: + +Q. What is the minimum packet size required for maximum throughput? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +4KB is the minimum packet size required for maximum throughput. + +.. _q-my-application-uses-pcis-and-pcim-interfaces-for-other-purposes-in-the-cl-can-i-still-use-the-sde: + +Q. My application uses PCIS and PCIM interfaces for other purposes in the CL. Can I still use the SDE? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Yes, the SDE can still be used. However, appropriate AXI +Crossbars/Fabric needs to be used in the CL in order to provide +connectivity for PCIS and PCIM buses to the SDE. Additionally, address +and ARID/AWIDs should be appropriately configured/parameterized in the +software and the SDE respectively. + +.. _q-my-acceleratorcl-cannot-transmitreceive-data-at-512bits-per-clock-can-sde-transmitreceive-less-than-512-bits-per-clock-on-the-h2cc2h-streaming-interfaces: + +Q. My accelerator/CL cannot transmit/receive data at 512bits per clock. Can SDE transmit/receive less than 512 bits per clock on the H2C/C2H Streaming Interfaces? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The current version of the SDE can only transmit/receive data at 512 +bits per clock. The CL developer can use Xilinx AXI-S width converters +to achieve width conversion from any bit width to 512 bits. + +.. _q-what-is-the-guideline-for-choosing-between-regular-and-compact-descriptormetadata-types: + +Q. What is the guideline for choosing between Regular and Compact Descriptor/Metadata types? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Regular Descriptor/Metadata will provide 64 bits for host address and +also provide 64 bits for User bits. Compact Descriptor/Metadata will +provide only 48 bits for host address and does not provide any user +bits. Using the compact type will save PCIS bandwidth for descriptor +writes, save PCIM bandwidth for Metadata writes and save BRAM space in +the SDE. Therefore, the compact type should be chosen when user bits are +not required and also to maximize bandwidth usage for packet data and to +save BRAM utilization in the CL. + +.. _q-how-many-clocks-and-resets-does-the-sde-use: + +Q. How many clocks and resets does the SDE use? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The SDE uses only one clock. The SDE uses only one reset that is +synchronized to the aforementioned clock. + +.. _q-can-the-sde-be-implemented-at-a-clock-frequency-greater-than-250mhz: + +Q. Can the SDE be implemented at a clock frequency greater than 250MHz? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +AWS only supports SDE implemented at a maximum of 250MHz. + +.. _q-should-the-sde-be-constrained-to-a-single-slr: + +Q. Should the SDE be constrained to a single SLR? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +AWS recommends that the all the logic in the SDE be constrained to a +single SLR. Additionally, AWS recommends adding pipelining on the PCIM +and PCIS interfaces from the shell leading up to the SDE. + +.. |alt tag| image:: ../images/SDE_Block_Diagram.jpg diff --git a/docs-rtd/source/sdk/apps/virtual-ethernet/doc/Virtual_Ethernet_Application_Guide.rst b/docs-rtd/source/sdk/apps/virtual-ethernet/doc/Virtual_Ethernet_Application_Guide.rst new file mode 100644 index 000000000..25fe757b8 --- /dev/null +++ b/docs-rtd/source/sdk/apps/virtual-ethernet/doc/Virtual_Ethernet_Application_Guide.rst @@ -0,0 +1,301 @@ +Virtual Ethernet Application Guide +================================== + +Table of Contents: +------------------ + +- `Overview <#Overview>`__ + +- `Example Workflows <#ExampleWorkflows>`__ + + - `"Hello World" Loopback <#HelloWorldLoopback>`__ + +- `FAQ <#FAQ>`__ + +Overview +-------- + +The Virtual Ethernet architecture (`here <../README.md>`__) supports +your development phases with sample applications that include loopback +paths for bringup and debug of the Virtual Ethernet application and +custom CL, all the way to end-to-end application integration with live +traffic. + +Virtual Ethernet Application Setup and Use +------------------------------------------ + +The distinct phases of Virtual Ethernet Application setup and use are: + +- Software installation and build +- System setup and device binding (e.g. FPGA and ENI) +- Application setup and start + +The next sections walk through the setup and usage phases including +example workflows. + +Example Workflows +----------------- + +"Hello World" DPDK testpmd loopback mode, auto-start +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This example maximizes PPS for 64B packets with a single vCPU using the +DPDK testpmd application to drive the DPDK SPP PMD and the FPGA SDE IP. +This may be used for streaming CL bringup and performance measurements +in an isolated loopback environment. It runs testpmd in auto-start mode, +sends the first burst of TX packets (32 packets by default), and +displays packet statistics every 3 seconds (including PPS). To exit the +example, use ``ctrl-c``. + +Software installation and build phase + +:: + + cd $(SDK_DIR)/apps/virtual-ethernet/scripts + sudo ./virtual_ethernet_install.py + +System setup and device bind phase, e.g. on instance boot + +:: + + sudo fpga-load-local-image -S -I + cd $(SDK_DIR)/apps/virtual-ethernet/scripts + sudo ./virtual_ethernet_setup.py /dpdk + +Testpmd application setup and start phase + +:: + + cd /dpdk + sudo ./build/app/dpdk-testpmd -l 0-1 -- --port-topology=loop --auto-start --tx-first --stats-period=3 + +The testpmd application will display the number of TX-packets RX-packets +sent to/from the SDE. Everything three seconds, the number of TX-packets +and RX-packets will be updated to show the new packet total. In +addition, the packets per second throughput is calculated and updated. + +:: + + ######################## NIC statistics for port 0 ######################## + RX-packets: 28791397 RX-missed: 0 RX-bytes: 1842650496 + RX-errors: 0 + RX-nombuf: 0 + TX-packets: 28791429 TX-errors: 0 TX-bytes: 1842651456 + + Throughput (since last show) + Rx-pps: 4798711 Rx-bps: 2456940768 + Tx-pps: 4798711 Tx-bps: 2456940424 + ############################################################################ + +Please refer to `DPDK testpmd <#testpmd>`__ for a quick reference guide +on the supported testpmd features and the link to the full testpmd +documentation. + +FAQ +--- + +Q: What is the AGFI ID for the SDE loopback CL? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The AGFI ID for the SDE loopback CL is found in the +``CL_SDE Example Metadata`` section at the bottom of the +``CL_SDE README`` +`here <../../../../hdk/cl/examples/cl_sde/README.md>`__. + +Q: Where can I find DPDK testpmd feature documentation? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The full documentation for DPDK testpmd features is found +`here `__. + +Note that not all of the DPDK testpmd features are supported by the SPP +and ENI PMDs. SPP supports a limited subset of the DPDK Ethernet upper +API (e.g. DPDK eth_dev_ops) to the DPDK application(s) (e.g. testpmd) +for purposes of passing through streaming packets to/from the SDE. + +The application examples use testpmd auto-start mode. testpmd also +supports an interactive mode that may be used during debug and test +sessions. Interactive mode is especially useful when running testpmd +within the ``gdb`` debugger. Below is a quick reference guide for some +of the supported testpmd interactive mode commands that may be used with +the application examples. + +Q: What performance should I expect? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The goal of SPP on F2 is to sustain line rate network bandwidth for all +network configurations supported on the AWS FPGA instances. + +Q: How does packet drop and flow control work? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Packet drop and flow control characteristics are application specific, +since you are free to use the DPDK drivers and environment in the best +way that suits your specific application. + +As an example, let’s assume we have a packet forwarding topology that +directly connects an ENI to an SPP that does not drop any remaining TX +packets after partial TX packet burst has been submitted to ENI. Since +the application is in control of the packet processing, it can flow off +the SPP RX side by asking for fewer RX packets in the next call to the +SPP RX packet burst API. If the ENI TX backpressure condition persists, +the application may stop calling the SPP RX packet burst API. At this +point, SPP will stop processing RX descriptors, the C2H buffer in the +SDE will become full (see the SDE HW Guide +`here <./SDE_HW_Guide.md>`__), and this will backpressure the AXI-Stream +interface (e.g. the SDE will de-assert the ‘ready’ signal on the C2H +AXI-Stream interface). This may then backpressure the SPP TX side, which +is again under application control. If the SPP TX side backpressure +condition persists, the application may stop processing ENI RX packets +and this will eventually cause packet drops on the ENI RX side facing +the network. + +Q: How are SDE errors reported? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +On each call to the SPP TX/RX packet burst APIs, the DPDK SPP PMD checks +the SDE write-back TX/RX status. If the SDE write-back status is +non-zero, the SPP PMD takes the following steps: + +- Log-info the TX/RX channel SPP driver status variables and the SDE + status write-back variables +- Log-info the specific SDE error info from the SDE block that + encountered the error +- Log-info the descriptor ring entries +- Increments the TX/RX sde_error stat +- Log-error and return from the TX/RX status checking method. +- Return 0 packets processed from the SPP TX/RX packet burst APIs (e.g. + the DPDK TX/RX packet burst APIs return a uint16_t that indicates the + number of packets that were processed in the current call). + +Your application should periodically check to see if the TX/RX sde_error +stat is non-zero (e.g. by calling the eth_dev_ops xstats_get API for +error checking in the ``slow-path``). If the TX/RX sde_error stat is +non-zero, your application should take the following error recovery +steps: + +- Quiesce all calls to TX/RX packet burst (e.g. discontinue calling + ``rte_eth_dev tx/rx_pkt_burst``) +- Release all of the SPP queues (e.g. call + ``eth_dev_ops tx/rx_queue_release``) +- Remove the SPP PCI device (e.g. call ``rte_pci_driver remove``) +- Reload the AGFI using ``fpga-load-local-image`` to ensure the CL is + fully reset + +At this point, the DPDK SPP driver and SDE may be re-initialized as +normal. The SDE is reset during the SPP PCI device probe initialization +step, and the TX/RX queues are re-initialized during the TX/RX queue +setup phase. + +Q: What is the minimal packet size supported by AWS FPGA virtual ethernet IP? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +FPGA CL must generate packets with 64Byte or more to meet the Ethernet +minimum frame size requirement. + +Q: What is the maximal packet size? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +It is the maximal packet size offered by ENI on your instance (including +the 4-byte CRC). + +Q: Should I calculate the Ethernet frame CRC32? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +No, SPP relies on the ENI to check CRC on receive and calculate it on +transmit. + +Q: What MAC address should I use for SPP? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The SPP MAC address is normally unused for testpmd port based forwarding +and defaults to all zeroes. The default SPP MAC address may be changed +if needed using the testpmd ‘mac_addr set’ command when using the +testpmd application, or by your custom application using the DPDK APIs. + +Note that the SPP and SDE do not perform any modifications to the TX +packets (e.g. from the application to the CL), or the RX packets (e.g. +from the CL to the application). The SDE does not perform any packet +filtering (e.g. based on the packet destination MAC address). + +Q: How many TX and RX descriptors are supported? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The number of supported TX and RX descriptors per SPP queue pair is +parameterized within the SDE block and reported by the SDE to SPP via +registers within the SDE block (see the SDE H2C and C2H channels +`here <./SDE_HW_Guide.md>`__). SPP defines a minimum and the maximum +number of descriptors between 64 and 32K. The number of TX and RX +descriptors implemented in the SDE and requested by the DPDK application +in the SPP queue setup phase must be equal, and a power of 2. + +Q: How do I configure SPP to use SDE regular or compact descriptors? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The SDE may be built with regular or compact descriptor types (see the +C2H_DESC_TYPE and H2C_DESC_TYPE in the Design Parameters section +`here <./SDE_HW_Guide.md>`__). The SPP PMD also supports regular or +compact descriptor types at compile time via the SPP_USE_COMPACT_DESCS +define within spp_defs.h. The default descriptor type for the SDE and +SPP is ``regular`` to support the full 64-bit DMA addressing. If there +is a mismatch between the SDE and SPP descriptor type build options, the +SPP driver will log an error similar to the following: + +Mismatched build options: SDE descriptor type is ``regular``, SPP PMD +descriptor type is ``compact``. + +:: + + PMD: spp_dev_cap_get(): SDE C2H Desc Info(0x00400000), type=regular, is not supported + +Mismatched build options: SDE descriptor type is ``compact``, SPP PMD +descriptor type is ``regular``. + +:: + + PMD: spp_dev_cap_get(): SDE C2H Desc Info(0x00800001), type=compact, is not supported + +Q: What operating systems are supported? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The Virtual Ethernet application is tested and supported for Linux +operating systems (Amazon Linux and Ubuntu). + +Q: How do I update DPDK and SPP with the Vendor/Device ID for my CL? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Within ``/dpdk/drivers/net/spp`` there is a file called +``spp_ethdev.c``. Your Vendor and Device ID should be added to the +following table in ``spp_ethdev.c`` and then DPDK should be recompiled. + +.. code:: C + + static const struct rte_pci_id pci_id_spp_map[] = { + { RTE_PCI_DEVICE(PCI_VENDOR_ID_AMAZON, PCI_DEVICE_ID_SDE_LOOPBACK_CL) }, + { RTE_PCI_DEVICE(, ) }, + { .device_id = 0 }, + }; + +Rebuild DPDK as follows: + +:: + + cd /dpdk + ninja -C build + +Within ``/dpdk/usertools`` there is a file called +``dpdk-devbind.py``. Your Vendor and Device ID should be added to the +following table in ``dpdk-devbind.py``. + +.. code:: python + + aws_fpga_sde = {'Class': '05', 'Vendor': '1d0f', 'Device': 'f002', + 'SVendor': None, 'SDevice': None} + = {'Class': '05', 'Vendor': '', 'Device': '', + 'SVendor': None, 'SDevice': None} + + network_devices = [network_class, cavium_pkx, avp_vnic, aws_fpga_sde, ] + +You should then run the ``virtual_ethernet_setup.py`` script which will +re-run the ``dpdk-devbind.py`` script to bind DPDK and SPP to your +Vendor and Device Id. diff --git a/docs-rtd/source/sdk/userspace/fpga_mgmt_tools/README.rst b/docs-rtd/source/sdk/userspace/fpga_mgmt_tools/README.rst new file mode 100644 index 000000000..a2daaa370 --- /dev/null +++ b/docs-rtd/source/sdk/userspace/fpga_mgmt_tools/README.rst @@ -0,0 +1,438 @@ +Amazon FPGA Image (AFI) Management Tools +======================================== + +AWS provides the following set of command-line tools for Amazon FPGA +Image (AFI) management while running on an FPGA-enabled EC2 instance +(e.g., F2). **The tools currently support Linux Instances only.** + +- **``fpga-describe-local-image-slots``** + + - Returns the FPGA image slot numbers and device mappings to use for + the ``fpga-load-local-image``, ``fpga-clear-local-image``, and + ``fpga-describe-local-image`` commands. + +- **``fpga-describe-local-image``** + + - Returns the status of the FPGA image for a specified FPGA image slot + number. The *fpga-image-slot* parameter is an index that represents + a given FPGA within an instance. Use + ``fpga-describe-local-image-slots`` to return the available FPGA + image slots for the instance. + +- **``fpga-load-local-image``** + + - Loads the specified FPGA image to the specified slot number, and + returns the status of the command. The *fpga-image-slot* parameter + is an index that represents a given FPGA within an instance. Use + ``fpga-describe-local-image`` to return the FPGA image status, and + ``fpga-describe-local-image-slots`` to return the available FPGA + image slots for the instance. + +- **``fpga-clear-local-image``** + + - Clears the specified FPGA image slot, including FPGA internal and + external memories that are used by the slot. The *fpga-image-slot* + parameter is an index that represents a given FPGA within an + instance. Use ``fpga-describe-local-image`` to return the FPGA image + status, and ``fpga-describe-local-image-slots`` to return the + available FPGA image slots for the instance. + +- **``fpga-start-virtual-jtag``** + + - Starts a Virtual JTAG XVC server, to debug tools like Vivado Lab + Edition Hardware Manager to access debug cores inside the AFI. + Please refer to `Virtual JTAG + userguide <../../../hdk/docs/Virtual_JTAG_XVC.md>`__. + +- **``fpga-get-virtual-led``** + + - Returns a bit-map representing the state (1/0) the Virtual LEDs + exposed by the Custom Logic (CL) part of the AFI. + +- **``fpga-get-virtual-dip-switch``** + + - Returns a bit-map representing the current setting for the Virtual + DIP Switches that drives the Custom Logic (CL) part of the AFI. + +- **``fpga-set-virtual-dip-switch``** + + - Takes bit-map (in binary representation) to set for the Virtual DIP + Switches that drives the Custom Logic (CL) part of the AFI. + +- **``fpga-describe-clkgen``** + + - Returns the currently loaded frequencies in MHz for each clock in + each MMCM. The *fpga-image-slot* parameter is an index that + represents a given FPGA within an instance. If the design loaded + onto the FPGA does not have the clkgen IP, error clkgen-ip-not-found + will be returned. + +- **``fpga-load-clkgen-dynamic``** + + - Loads a frequency into the first clock of each specified MMCMs. + MMCMs that are not specified will be set to the default recipes. + Returns the currently loaded frequencies in MHz for each clock in + each MMCM. The *fpga-image-slot* parameter is an index that + represents a given FPGA within an instance. If the design loaded + onto the FPGA does not have the clkgen IP, error clkgen-ip-not-found + will be returned. + +- **``fpga-load-clkgen-recipe``** + + - Loads a clkgen recipe into the specified clocking groups. MMCMs that + are not specified will be set to the default recipes. Returns the + currently loaded frequencies in MHz for each clock in each MMCM. The + *fpga-image-slot* parameter is an index that represents a given FPGA + within an instance. If the design loaded onto the FPGA does not have + the clkgen IP, error clkgen-ip-not-found will be returned. + +All of the AFI Management Tools support a ``-help`` option that may be +used to display the full set of options. + +``sudo`` or ``root`` Privileges +------------------------------- + +The tools require sudo or root access rights since AFI loads and clears +modify the underlying system hardware (also see the FAQ section "Q: How +do the AFI Management Tools work?". + +Installs or Updates to the AFI Management Tools +----------------------------------------------- + +The tools can be downloaded and installed from AWS SDK/HDK GitHub +repository `aws-fpga `__, as follows: + +.. code:: bash + + git clone https://github.com/aws/aws-fpga.git + cd aws-fpga + source sdk_setup.sh + +The ``sdk_setup.sh`` script will build the AFI Management Tools and +install them in ``/usr/bin``. + +Quickstart +---------- + +Once you have the AFI Management Tools installed on your F2 instance, +you can display the FPGA slot numbers and PCIe mappings for driver +attachment (e.g., PCI Domain:Bus:Device:Function). + +Getting Inventory of the Available FPGA Slots +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. code:: bash + + sudo fpga-describe-local-image-slots -H + + ... + + Type FpgaImageSlot VendorId DeviceId DBDF + AFIDEVICE 0 0x1d0f 0x9048 0000:9f:00.0 + Type FpgaImageSlot VendorId DeviceId DBDF + AFIDEVICE 1 0x1d0f 0x9048 0000:a1:00.0 + Type FpgaImageSlot VendorId DeviceId DBDF + AFIDEVICE 2 0x1d0f 0x9048 0000:a3:00.0 + Type FpgaImageSlot VendorId DeviceId DBDF + AFIDEVICE 3 0x1d0f 0x9048 0000:a5:00.0 + Type FpgaImageSlot VendorId DeviceId DBDF + AFIDEVICE 4 0x1d0f 0x9048 0000:ae:00.0 + Type FpgaImageSlot VendorId DeviceId DBDF + AFIDEVICE 5 0x1d0f 0x9048 0000:b0:00.0 + Type FpgaImageSlot VendorId DeviceId DBDF + AFIDEVICE 6 0x1d0f 0x9048 0000:b2:00.0 + Type FpgaImageSlot VendorId DeviceId DBDF + AFIDEVICE 7 0x1d0f 0x9048 0000:b4:00.0 + +- The above list displayed the slots in an F2.48xl instance that has 8 + FPGAs on slot 0 through 7. + +- The VendorId is the PCIe Configuration space Vendor ID, with 0x1d0f + representing the Amazon registered PCIe Vendor ID. The developer can + choose the Vendor ID for their own AFIs. + +- The DeviceId is the PCIe Configuration space Device ID, with 0x9048 + being the default. + +- The DBDF is the common PCIe bus topology representing the + Domain:Bus#:Device#:Function#. + +\*\* NOTE: \*\* *While each FPGA has more than one PCIe Physical +Function, the AFI Management Tools will present the VendorId and +DeviceId of the first PF only*. + +Describing the AFI Content Loaded on a Specific FPGA Slot +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The following command displays the current state for the given FPGA slot +number. The output shows that the FPGA in the “cleared” state right +after instance create. + +.. code:: bash + + sudo fpga-describe-local-image -S 0 -H + + ... + + Type FpgaImageSlot FpgaImageId StatusName StatusCode ErrorName ErrorCode ShVersion + AFI 0 No AFI cleared 1 ok 0 + Type FpgaImageSlot VendorId DeviceId DBDF + AFIDEVICE 0 0x1d0f 0x9048 0000:34:00.0 + +Synchronous AFI Load and Clear Operations +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Synchronously Loading an AFI to a Specific FPGA Slot +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +To load the AFI, use the FPGA slot number and Amazon Global FPGA Image +ID parameters (see FAQ for AGFI). In synchronous mode, this command will +wait for the AFI to transition to the "loaded" state, perform a PCI +device remove and rescan in order to expose the unique AFI Vendor and +Device Id, and display the final state for the given FPGA slot number. + +.. code:: bash + + sudo fpga-load-local-image -S 0 -I agfi-0fedcba9876543210 -H + + ... + + Type FpgaImageSlot FpgaImageId StatusName StatusCode ErrorName ErrorCode ShVersion + AFI 0 agfi-0fedcba9876543210 loaded 0 ok 0 + Type FpgaImageSlot VendorId DeviceId DBDF + AFIDEVICE 0 0x6789 0x1d50 0000:34:00.0 + +Synchronously Clearing the FPGA Image on Specific Slot +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The following command will clear the FPGA image, including internal and +external memories. In synchronous mode, this command will wait for the +AFI to transition to the "cleared" state, perform a PCI device remove +and rescan in order to expose the default AFI Vendor and Device Id, and +display the final state for the given FPGA slot number. + +.. code:: bash + + sudo fpga-clear-local-image -S 0 -H + + ... + + Type FpgaImageSlot FpgaImageId StatusName StatusCode ErrorName ErrorCode ShVersion + AFI 0 No AFI cleared 1 ok 0 + Type FpgaImageSlot VendorId DeviceId DBDF + AFIDEVICE 0 0x1d0f 0x9048 0000:34:00.0 + +Asynchronous AFI Load and Clear Operations +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Asynchronously Loading an AFI to a Specific FPGA Slot +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +To load the AFI, use the FPGA slot number and Amazon Global FPGA Image +ID parameters (see FAQ for AGFI). The "-A" is used for asynchronous AFI +load operations. + +.. code:: bash + + sudo fpga-load-local-image -S 0 -I agfi-0fedcba9876543210 -A + +Describing the AFI content loaded on a specific FPGA slot after an asynchronous AFI load +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Displays the current state for the given FPGA slot number. The output +shows the FPGA in the “loaded” state after the FPGA image "load" +operation. **The "-R" option performs a PCI device remove and rescan in +order to expose the unique AFI Vendor and Device Id.** + +.. code:: bash + + sudo fpga-describe-local-image -S 0 -R -H + + ... + + Type FpgaImageSlot FpgaImageId StatusName StatusCode ErrorName ErrorCode ShVersion + AFI 0 agfi-0fedcba9876543210 loaded 0 ok 0 + Type FpgaImageSlot VendorId DeviceId DBDF + AFIDEVICE 0 0x6789 0x1d50 0000:34:00.0 + +Asynchronously Clearing the FPGA Image on Specific Slot +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The following command will clear the FPGA image, including internal and +external memories. The "-A" is used for asynchronous AFI clear +operations. + +.. code:: bash + + sudo fpga-clear-local-image -S 0 -A + +Describing the AFI content loaded on a specific FPGA slot after an asynchronous AFI clear +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The following command displays the current state for the given FPGA slot +number. It shows that the FPGA is in the “cleared” state after the FPGA +image "clear" operation. **The "-R" option performs a PCI device remove +and rescan in order to expose the default AFI Vendor and Device Id.** + +.. code:: bash + + sudo fpga-describe-local-image -S 0 -R -H + + ... + + Type FpgaImageSlot FpgaImageId StatusName StatusCode ErrorName ErrorCode ShVersion + AFI 0 No AFI cleared 1 ok 0 + Type FpgaImageSlot VendorId DeviceId DBDF + AFIDEVICE 0 0x1d0f 0x9048 0000:34:00.0 + +FAQ +--- + +- **Q: What is the Amazon Global FPGA Image ID (AGFI)?** + + - The AGFI is an AWS **globally** unique identifier that is used to + reference a specific Amazon FPGA Image (AFI). + - It is used to refer to a specific AFI when using the FPGA Management + tools from within an EC2 instance. + - In the examples, ``agfi-0fedcba9876543210`` is specified in the + ``fpga-load-local-image`` command in order to load a specific AFI + into the given ``fpga-image-slot``. + - AGFI IDs should not be confused with AFI IDs. The latter are + **regional** IDs that are used to refer to a specific AFI when using + the AWS EC2 APIs to create or manage and AFI. For example, when + copying an AFI across regions, it will preserve the same AGFI ID, + but get a new regional AFI ID. + +- **Q: What is a ``fpga-image-slot``?** + + - The fpga-image-slot is an index that represents a given FPGA within + an instance. Use ``fpga-describe-local-image-slots`` to return the + available FPGA image slots for the instance. + +- **Q: What are the Vendor and Device IDs listed in the + ``fpga-describe-local-image-slots`` and ``fpga-describe-local-image`` + output?** + + - The VendorId and DeviceId represent the unique identifiers for a PCI + device as seen in the PCI Configuration Header Space. These + identifiers are typically used by device drivers to know which + devices to attach to. The identifiers are assigned by PCI-SIG. You + can use Amazon's default DeviceId, or use your own during the + ``CreateFpgaImage`` EC2 API. + +- **Q: What is a DBDF?** + + - A DBDF is simply an acronym for Domain:Bus:Device.Function (also see + PF). + +- **Q: What is a PF?** + + - A PF refers to a PCI Physical Function that is exposed by the FPGA + hardware. For example, it is accessible by a user-space programs via + the sysfs filesystem in the path + ``/sys/bus/pci/devices/Domain:Bus:Device.Function``. The + ``Domain:Bus:Device.Function`` syntax is the same as returned from + ``lspci`` program output. Examples: **FPGA application PF** + ``0000:34:00.0``, **FPGA management PF** ``0000:34:00.1``. + +- **Q: What is a BAR?** + + - A PCI Base Address Register (BAR) specifies the memory region where + FPGA memory space may be accessed by an external entity (like the + instance CPU or other FPGAs). Multiple BARs may be supported by a + given PCI device. In this FAQ section (also see PF), BAR0 from a + device may be accessed (for example) by opening and memory mapping + the resource0 sysfs file in the path + ``/sys/bus/pci/devices/Domain:Bus:Device.Function/resource0``. Once + BAR0 has been memory mapped, the BAR0 registers may be accessed + through a pointer to the memory mapped region (refer to the open and + mmap system calls). + +- **Q: What is the AFIDEVICE and how is it used?** + + - Within the ``fpga-describe-local-image-slots`` and + ``fpga-describe-local-image`` commands the AFIDEVICE represents the + PCI PF that is used to communicate with the AFI. The AFIDEVICE + functionality exposed through the PF is dependent on the AFI that is + loaded via the ``fpga-load-local-image`` command. For example, DMA + and/or memory-mapped IO (MMIO) may be supported depending on the + loaded AFI, which is then used to communicate with the AFI in order + to perform an accelerated application-dependent task within the + FPGA. User-space applications may access the AFIDEVICE PF through + sysfs as is noted above in this FAQ section (also see PF). + +- **Q: How do the AFI Management Tools work?** + + - Within the F2 instance, the FPGAs expose a management PF (e.g. + ``0000:34:00.1``) that is used for control channel communication + between the instance and AWS. + - The FPGA management PF BAR0 is **reserved** for this communication + path. + - The FPGA application drivers **should not** access the FPGA + management PF BAR0. + - The AFI Management Tools memory map the FPGA management PF BAR0 and + communicate with AWS using internally defined messages and hardware + registers. + - The Amazon FPGA Image Tools require ``sudo`` or ``root`` access + level since AFI loads and clears are modifying the underlying system + hardware. + - ``sudo`` or ``root`` privilege is also required since the tools + access the sysfs PCI subsystem and ``/dev/kmsg`` for ``dmesg`` + logging. + +- **Q: Can the AFI Management Tools work concurently on multiple FPGA + image slots?** + + - The tools can be executed on multiple FPGAs concurrently. This may + be done without synchronization between processes that are using the + tools. + +- **Q: Can the AFI Management Tools work concurrently from multiple + processes on the same FPGA?** + + - Without synchronization between processes, the tools should only be + executed as one worker process per FPGA (highest level of + concurrency), or one worker process across all FPGAs (least level of + concurrency). + - Multiple concurrent process access to the tools using the same FPGA + without proper synchronization between processes will cause response + timeouts, and other indeterminate results. + +- **Q: What is an afi-power-violation?** + + - The F2 system can only reliably provide a certain amount of power to + the FPGA. If an AFI consumes more than this amount of power, the F2 + system will disable the input clocks to the AFI. For more + information on preventing, detecting, and recovering from this + state, see `AFI power guide (COMING + SOON) <../../../hdk/docs/afi_power.md>`__ + +- **Q: How can I reset the AFI?** + + - The AFI may be reset (reloaded) via fpga-load-local-image, and/or + reset back to a fully clean slate via ``fpga-clear-local-image`` and + ``fpga-load-local-image``. + +References +---------- + +- AWS FPGA SDK/HDK on github + `aws-fpga `__ + +AWS EC2 References +~~~~~~~~~~~~~~~~~~ + +- `AWS EC2 Getting + Started `__ +- `AWS EC2 Instance + Types `__ +- `AWS EC2 User + Guide `__ +- `AWS EC2 Networking and + Security `__ +- `AWS EC2 Key + Pairs `__ +- `AWS EC2 Attach EBS + Volume `__ +- `AWS EC2 + Troubleshooting `__ diff --git a/docs-rtd/source/spelling_filters/hex_filter.py b/docs-rtd/source/spelling_filters/hex_filter.py new file mode 100644 index 000000000..3bb1327ae --- /dev/null +++ b/docs-rtd/source/spelling_filters/hex_filter.py @@ -0,0 +1,18 @@ +import enchant +from enchant.tokenize import Filter + +class HexFilter(Filter): + def _skip(self, word): + if word.startswith(("0x", "0X")): + try: + int(word[2:], 16) + return True + except ValueError: + return False + elif word.startswith(("x", "X")): + try: + int(word[1:], 16) + return True + except ValueError: + return False + return False \ No newline at end of file diff --git a/docs-rtd/source/spelling_filters/ordinal_filter.py b/docs-rtd/source/spelling_filters/ordinal_filter.py new file mode 100644 index 000000000..40d70617b --- /dev/null +++ b/docs-rtd/source/spelling_filters/ordinal_filter.py @@ -0,0 +1,20 @@ +import enchant +from enchant.tokenize import Filter + +class OrdinalFilter(Filter): + def _skip(self, word): + is_ordinal = any([word.endswith(suffix) for suffix in ("st", "nd", "rd", "th")]) + if not is_ordinal: + return False + try: + number = int(word[:-2]) + if number % 10 == 1 and number % 100 != 11: + return word.endswith('st') + elif number % 10 == 2 and number % 100 != 12: + return word.endswith('nd') + elif number % 10 == 3 and number % 100 != 13: + return word.endswith('rd') + else: + return word.endswith('th') + except ValueError: + return False \ No newline at end of file diff --git a/docs-rtd/source/spelling_filters/rtl_hex_filter.py b/docs-rtd/source/spelling_filters/rtl_hex_filter.py new file mode 100644 index 000000000..51805cb29 --- /dev/null +++ b/docs-rtd/source/spelling_filters/rtl_hex_filter.py @@ -0,0 +1,31 @@ +import enchant +import re +from enchant.tokenize import Filter + +class RTLHexFilter(Filter): + def _skip(self, word): + rtl_hex_literal_prefix = "’h" + if rtl_hex_literal_prefix in word: + # If the literal makes use of underscores for readability + if "_" in word: + underscore_positions = [pos.start() for pos in re.finditer("_", word)] + for pos in underscore_positions: + aligned_word = "" + try: + aligned_word = word[pos + 1 : pos + 5] + word_len = len(aligned_word) + if word_len < 4: + raise IndexError(f"Word {aligned_word} is only {word_len} hex digits long!") + try: + int(aligned_word, base=16) + return True + except ValueError as v: + print("ERROR: Could not convert hex word literal {aligned_word} to a base-16 integer!") + return False + except IndexError as i: + print(f"ERROR: Could not gather 4 hex digits after underscore: \n\t{aligned_word} \n\t{word}") + print((i)) + return False + else: + return True + return False diff --git a/docs-rtd/source/spelling_wordlist.txt b/docs-rtd/source/spelling_wordlist.txt new file mode 100644 index 000000000..e784d8a1d --- /dev/null +++ b/docs-rtd/source/spelling_wordlist.txt @@ -0,0 +1,231 @@ +Questa +Runtime +hdk +mem +perf +dma +addr +hbm +rnd +Vitis +reconfigurable +genomics +vCPU +Gbps +Vivado +architecting +Verilog +VHDL +Tcl +Synopsys +OpenCL +pre +Graviton +RTL +AWS +rescan +runtime +subdirectory +Xilinx +bitstream +sde +AXI +datapath +verif +Makefile +precharge +tb +dpi +vh +ip +aws +clk +sv +regs +conv +axil +axi +cfg +cnv +fifo +bram +wr +ccf +ctl +cdc +async +Async +Multi +Synchronizer +pipelined +svh +Instantiation +mgt +acc +axl +ddr +rr +arb +srl +xpm +testbench +config +dcp +py +symlink +Floorplan +tcl +uncommented +subdirectories +bitstreams +eg +idx +pcis +ocl +tst +hdeadbeef +sda +pcim +irq +ack +hwsw +cosim +xrt +clkgen +reobtained +fpga +sysfs +filesystem +xl +Quickstart +sudo +clkgen +loopback +bringup +workflows +testpmd +bringup +Testpmd +eth +dev +backpressure +de +uint +xstats +Quiesce +ethernet +parameterized +spp +defs +metadata +pipelining +latencies +userspace +incrementing +desc +Rresp +escriptors +Desc +bitfield +parameterizable +instantiated +Redhat +Centos +floorplan +AMD +JTAG +ap +sims +buf +extern +msg +printf +const +chan +putc +getc +hm +longint +que +dst +src +cnt +chk +prot +dly +nsec +flr +intf +wc +strb +vpd +Modelsim +functionalities +shreg +fanout +gtp +propert +nworst +foreach +Dataflow +glcount +ns +vDIP +vLED +vdip +vled +pwr +tuple +apppf +req +wstrb +awaddr +dw +awlen +PCIe +AFI +rst +routability +Bufferable +Uncorrectable +BankGroup +prefetchable +DIPSwitch +Ultrascale +Virtex +QoS +KByte +multi +Prefetchable +prefetchability +prefetching +optimizations +bm +sync'ed +cctrl +instantiation +Microarchitecture +verilog +readme +agfi +Floorplanning +frontdoor +bdr +axsize +len +mstr +microarchitecture +mux +muxed +kern +datapaths +pblock +allgn +architected +Bresp +arlen +posedge +nxt +sync'd +timestamp +deasserted \ No newline at end of file diff --git a/docs-rtd/source/vitis/README.rst b/docs-rtd/source/vitis/README.rst new file mode 100644 index 000000000..cde29dc6b --- /dev/null +++ b/docs-rtd/source/vitis/README.rst @@ -0,0 +1,264 @@ +Quick Start Guide to Accelerating your C/C++ application on AWS EC2 F2 (FPGA) Instances with Vitis +================================================================================================== + +This quick start guide will utilize a simple ``hello_world`` Vitis +example to get you started. + +Table of Contents +================= + +1. `Overview <#1-overview>`__ +2. `Prerequisites <#2-prerequisites>`__ + + - 2.1 `AWS Account and F2/EC2 + Instances <#21-aws-account-and-f2ec2-instances>`__ + - 2.2 `GitHub and Environment + Setup <#22-github-and-environment-setup>`__ + +3. `Design Emulation and Synthesis <#3-emulating-your-code>`__ + + - 3.1 `Emulate the code <#31-emulation>`__ + + - 3.1.1 `Hardware Emulation <#311-hardware-hw-emulation>`__ + + - 3.2 `Results and Artifacts <#32-results-and-artifacts>`__ + +4. `Next Steps <#4-next-steps>`__ + + - 4.1. `Examining Run Data <#41-examining-run-data>`__ + +5. `Additional Resources <#5-additional-vitis-information>`__ + +.. _1-overview: + +1. Overview +=========== + +- Vitis is a complete development environment for applications + accelerated using AWS EC2 F2 (FPGA) instances +- It leverages the OpenCL heterogeneous computing framework to offload + compute intensive workloads to F2 instances +- The accelerated application is written in C/C++, OpenCL and/or + Verilog/VHDL + +.. _2-prerequisites: + +2. Prerequisites +================ + +.. _21-aws-account-and-f2ec2-instances: + +2.1 AWS Account and F2/EC2 Instances +------------------------------------ + +- Getting Familiar with AWS - If you have never used AWS before, we + recommend you start with AWS getting started training, and focus on + the basics of the AWS EC2 and AWS S3 services. Understanding the + fundamentals of these services will make it easier to work with AWS F2 + instances and the FPGA Developer Kit. `Setup an AWS + Account `__ +- FPGA developer AMI (2024.1) - available for on-cloud F2 development + with AMD tools pre-installed and free to use on AWS EC2 for F2 + development. Customers can use this AMI to design, simulate, and build + their designs. Given the large size of the FPGA used for F2, AMD tools + work best with at least 4 vCPU's and 32GiB Memory. We recommend + Compute Optimized and Memory Optimized instance types to successfully + run the synthesis of acceleration code. Developers may start coding + and run simulations on low-cost General Purpose instances types. + Launch an instance using a pre-installed with Vitis and required + licenses. + +.. _22-github-and-environment-setup: + +2.2 GitHub and Environment Setup +-------------------------------- + +- Clone this github repository, export your AWS IAM credentials, and + source the *vitis_setup.sh* script: + +:: + + cd aws-fpga + source vitis_setup.sh + +- Sourcing the `vitis_setup.sh <../vitis_setup.sh>`__ script does the + following: + + - Downloads and sets the correct AWS Platforms: + + - AWS EC2 F2 Vitis platform package that contains the dynamic + hardware that enables Vitis kernels to run on AWS F2 instances + - Valid platforms for shell_stable: ``AWS_PLATFORM_202401_0`` + (Default) AWS F2 Vitis platform + + - Sets up the Vitis example directories + - Installs the required libraries and package dependencies + - Runs environment checks to verify supported tool/lib versions + - Gathers dependencies needed to install the `Xilinx + Runtime `__ (XRT) + +If the script has successfully set up all of the tools and the +environment, you will see the following message: + +.. code:: bash + + INFO: #-------------------------------------------------------------------------------# + INFO: How to run hardware emulation or synthesis on an example + INFO: cd vitis/examples/vitis_examples/hello_world + INFO: hw_file_check + INFO: #----------------------------- Emulation ---------------------------------------# + INFO: make build TARGET=hw_emu PLATFORM=$SHELL_EMU_VERSION + INFO: #-------------------------------------------------------------------------------# + INFO: Vitis Setup PASSED. + +.. _3-emulating-your-code: + +3. Emulating Your Code +====================== + +Vitis hardware emulation is a cycle-accurate emulation of your +accelerator design. This section will walk you through the +emulation process. + +.. _31-emulation: + +3.1 Emulation +------------- + +The main goal of hardware emulation is to insure functional correctness +and determine how to partition the application between the host CPU and +the FPGA. Hardware emulation does not require use of actual FPGAs and +can be run on any compute instance. Using non-F2 EC2 compute instances +during initial development reduces cost. + +.. _311-hardware-hw-emulation: + +3.1.1 Hardware (HW) Emulation +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The Vitis hardware emulation flow enables the developer to check the +correctness of the logic generated by the tools. This emulation flow +invokes the hardware simulator in the Vitis environment to test the +functionality of the code. + +To perform hardware emulation for any given example, run the following +commands: + +.. code:: bash + + cd $AWS_FPGA_REPO_DIR + cd vitis/examples/vitis_examples + +After listing the contents of ``vitis/examples/vitis_examples``, +navigate to your desired example. + +Prior to starting a hardware emulation run, run the ``hw_file_check`` +command to insure that all files required for simulation are present. If +all required files are present, you will see +``All required simulation files are present!``. Otherwise, the missing +files' names will be displayed. These files can always be reobtained +from the ``aws-fpga`` repository if they are deleted or renamed at any +point. + +The most critical file in each example directory is the ``Makefile``. +Some examples will have sub-examples, whose ``Makefiles`` are located in +the associated subdirectory. + +Note the presence of the ``Makefile`` in this subdirectory. Some +examples will have sub-examples, whose ``Makefiles`` are located in the +associated subdirectory. + +.. warning:: + + A Makefile is required in order to run hardware emulation for all + designs/examples + +We recommend running hardware emulation in the background to prevent +disruption due to the compute intensity and time needed for completion. +Prefixing commands with ``nohup`` and ending them with an ``&`` will +insure more reliable execution. + +Once you've verified that all required files are present in the current +example directory, start the hardware emulation run with the following +command: + +.. code:: bash + + nohup make build TARGET=hw_emu PLATFORM=$SHELL_EMU_VERSION & + +The same command can be used for all Vitis examples after running +``vitis_setup.sh``. + +.. _32-results-and-artifacts: + +3.2 Results and Artifacts +~~~~~~~~~~~~~~~~~~~~~~~~~ + +Once the emulation/build has completed, you will see either a +``TEST PASSED``, or a relevant error message. + +Upon successful emulation/build completion, you will notice that a build +directory has been created in the example's directory: + +.. code:: bash + + aws-fpga/vitis/examples/vitis_examples/ + hello_world/ + build_dir.hw_emu.xilinx_aws-vu47p-f2_202410_1/ + +**This directory will contain the .xclbin file, as well as other +artifacts, depending on the example run:** + +Hardware emulation: + +.. code:: bash + + drwxrwxr-x 2 ubuntu ubuntu 4096 Aug 15 17:58 ./ + drwxr-xr-x 13 ubuntu ubuntu 4096 Aug 15 18:51 ../ + -rw-rw-r-- 1 ubuntu ubuntu 46324262 Aug 15 17:58 vadd.link.xclbin + -rw-rw-r-- 1 ubuntu ubuntu 11777 Aug 15 17:58 vadd.link.xclbin.info + -rw-rw-r-- 1 ubuntu ubuntu 38652 Aug 15 17:58 vadd.link.xclbin.link_summary + -rw-rw-r-- 1 ubuntu ubuntu 46324302 Aug 15 17:58 vadd.xclbin + -rw-rw-r-- 1 ubuntu ubuntu 4414 Aug 15 17:58 vadd.xclbin.package_summary + +.. _4-next-steps: + +4. Next Steps +============= + +.. _41-examining-run-data: + +4.1 Examining Run Data +---------------------- + +After a hardware simulation run, there are three files that contain very +important information: + +- ``vadd.xclbin.info`` + + - A text report of the generated device binary + +- ``vadd.xclbin.link_summary`` + + - A summary report of the linking process which generated the device + binary + +- ``vadd.link.xclbin.link_summary`` + + - Contains an estimate of system performance + +- ``xrt.run_summary`` + + - A summarized report of events captured during application runtime + +The first three of these files can be found in the newly-generated +directory prefixed with ``build_dir.hw_emu.``. The xrt run summary file +can be found in the example directory. + +.. _5-additional-vitis-information: + +5. Additional Vitis Information +=============================== + +- `Vitis Documentation + Hub `__ diff --git a/hdk/README.md b/hdk/README.md index cd2795949..596cad437 100644 --- a/hdk/README.md +++ b/hdk/README.md @@ -8,7 +8,7 @@ - [Getting Started](#getting-started) - [Build Accelerator AFI using HDK Design Flow](#build-accelerator-afi-using-hdk-design-flow) - [Step 1. Setup Development Environment](#step-1-setup-development-environment) - - [Step 2. Clone Developer Dit Repository](#step-2-clone-developer-dit-repository) + - [Step 2. Clone Developer Kit Repository](#step-2-clone-developer-kit-repository) - [Step 3. Setup Environment for HDK Design Flow](#step-3-setup-environment-for-hdk-design-flow) - [Step 4. Build CL Design Check Point (DCP)](#step-4-build-cl-design-check-point-dcp) - [Step 5. Explore Build Artifacts](#step-5-explore-build-artifacts) @@ -20,7 +20,7 @@ - [cl\_dram\_hbm\_dma](#cl_dram_hbm_dma) - [cl\_mem\_perf](#cl_mem_perf) - [CL\_TEMPLATE - Create your own design](#cl_template---create-your-own-design) - - [CL Example Heirarchy](#cl-example-heirarchy) + - [CL Example Hierarchy](#cl-example-hierarchy) - [Design](#design) - [Verification](#verification) - [Software](#software) @@ -30,23 +30,23 @@ - [/verif](#verif) - [/ip](#ip) - [/lib](#lib) - - [Next Steps](#next-steps) + - [Getting Started](#getting-started-1) ## HDK Overview -The HDK flow enables developers to create RTL based accelerator designs targeted for F2 systems using AMD Vivado. Small Shell allows developers to preserve resources in the top SLR by removing the DMA functionality and relying on the basic peek/poke access from Host to FPGA. +The HDK design flow enables developers to create RTL-based accelerator designs for F2 instances using AMD Vivado. HDK designs must be integrated with Small Shell, which does not include a built-in Direct Memory Access (DMA) engine and offers full resources in the top Super Logic Region (SLR) of the FPGA to developers. ## Getting Started ### Build Accelerator AFI using HDK Design Flow -This section provides a step-by-step guide to build an F2 AFI using the HDK design flow. The flow starts with an existing CL example design. Steps 1 through 3 demonstrate how to set up the HDK development environment. Steps 4 through 5 show the commands used to generate the CL DCP files and the expected build artifacts. Steps 6 and 7 show developers how to submit the DCP file to generate an AFI for use on F2 instances. +This section provides a step-by-step guide to build an F2 AFI using the HDK design flow. The flow starts with an existing Customer Logic (CL) example design. Steps 1 through 3 demonstrate how to set up the HDK development environment. Steps 4 through 5 show the commands used to generate CL Design Checkpoint (DCP) files and other build artifacts. Steps 6 and 7 demonstrate how to submit the DCP file to generate an AFI for use on F2 instances. #### Step 1. Setup Development Environment Developers can either use the AWS-provided developer AMI for F2 or their on-premise development environment for this demo. -#### Step 2. Clone Developer Dit Repository +#### Step 2. Clone Developer Kit Repository ```bash git clone https://github.com/aws/aws-fpga.git @@ -70,7 +70,7 @@ After the setup is done successfully, you should see `AWS HDK setup PASSED`. Sou #### Step 4. Build CL Design Check Point (DCP) -After the HDK design environment is set up, you are ready to build a design example. Run the following commands to build CL DCP files in Vivado. This tutorial uses [cl_sde](./cl/examples/cl_sde/), but the same steps can be used for other [CL examples](./cl/examples). +After the HDK design environment is set up, you are ready to build a design example. Run the following commands to build CL DCP files in Vivado. This tutorial uses the [cl_sde](./cl/examples/cl_sde/) example. The same steps can be used for any other [CL examples](./cl/examples). ```bash cd hdk/cl/examples/cl_sde @@ -79,12 +79,22 @@ cd build/scripts ./aws_build_dcp_from_cl.py -c cl_sde ``` -A few notes on [./aws_build_dcp_from_cl.py](./common/shell_stable/build/scripts/aws_build_dcp_from_cl.py): +The Shell supplies two base clocks to the CL: a 250MHz `clk_main_a0` clock and a 100MHz `clk_hbm_ref` clock. However, the CL can run at higher frequencies using locally generated clocks. F2 Developer Kit offers an [AWS Clock Generation (AWS_CLK_GEN) IP](./hdk/docs/AWS_CLK_GEN_spec.md) that you can leverage in your design to generate CL clocks with frequencies specified in the [Clock Recipes User Guide](./docs/Clock_Recipes_User_Guide.md). + +Run the command below to build a DCP with desired clock recipes: + +```bash +./aws_build_dcp_from_cl.sh -c cl_mem_perf --aws_clk_gen --clock_recipe_a A1 --clock_recipe_b B2 --clock_recipe_c C0 --clock_recipe_hbm H2 +``` + +**NOTE**: The [cl_sde](./cl/examples/cl_sde/) example does not contain the AWS_CLK_GEN component. This command uses the [cl_mem_perf](./cl/examples/cl_mem_perf/) example to demonstrate the AWS_CLK_GEN usage. + +A few more notes on [aws_build_dcp_from_cl.py](https://github.com/aws/aws-fpga/blob/-/hdk/common/shell_stable/build/scripts/aws_build_dcp_from_cl.py): - Use `--mode small_shell` option to build CL designs with Small Shell. - Use `--cl ` option to build a different CL design. This is default to `cl_dram_hbm_dma`. -- Use `--aws_clk_gen` option to annotate the use of [AWS clock generation block](./hdk/docs/AWS_CLK_GEN_spec.md) and [customer clock recipes](./hdk/docs/Clock_Recipes_User_Guide.md). -- The script also allows developers to pass different directives supported by the Vivado tool as shown below: +- Use `--aws_clk_gen` option to annotate the use of [AWS clock generation block](./hdk/docs/AWS_CLK_GEN_spec.md) and [customer clock recipes](./docs/Clock_Recipes_User_Guide.md). +- The script also allows developers to pass different Vivado directives as shown below: - `--place `: Default to `SSI_SpreadLogic_high` placement strategy. Please refer to [Vivado User Guide](https://docs.amd.com/r/en-US/ug904-vivado-implementation/Available-Directives) for supported directives. - `--phy_opt ` : Default to `AggressiveExplore` physical optimization strategy. Please refer to [Vivado User Guide](https://docs.amd.com/r/en-US/ug904-vivado-implementation/Using-Directives?tocId=9xJiGeSV35ApxUsX7pAVDg) for supported directives - `--route ` : Default to `AggressiveExplore` routing strategy. Please refer to [Vivado User Guide](https://docs.amd.com/r/en-US/ug904-vivado-implementation/Using-Directives?tocId=dV9wYjuIP6n9oUJhkoHuRg) for supported directives. @@ -92,7 +102,7 @@ A few notes on [./aws_build_dcp_from_cl.py](./common/shell_stable/build/scripts/ #### Step 5. Explore Build Artifacts -While Vivado is running, a build log file `YYYYY_MM_DD-HHMMSS.vivado.log` will be created in `$CL_DIR/build/scripts` to track the build’s progress. DCP build times will vary, based on the design size and complexity. The examples in the development kit take between 30 to 90 minutes to build. After the design is finished building, the following information will be shown at the bottom of the log file: +While Vivado is running, a build log file `YYYYY_MM_DD-HHMMSS.vivado.log` will be created in `$CL_DIR/build/scripts` to track the build’s progress. DCP build times will vary based on the design size and complexity. The examples in the development kit take between 30 to 90 minutes to build. After the design is finished building, the following information will be shown at the bottom of the log file: ```bash tail @@ -105,7 +115,7 @@ tail Generated post-route DCP and design manifest files are archived into a tarball file `.Developer_CL.tar` and saved in the `$CL_DIR/build/checkpoints/` directory. All design timing reports are saved in the `$CL_DIR/build/reports/` directory. -:warning: If Vivado cannot achieve timing closure for thed design, the post-route DCP file name will be marked with `.VIOLATED` as an indicator. Developers need to refer to the DCPs and timing reports for detailed timing failures. +:warning: If Vivado cannot achieve timing closure for the design, the post-route DCP file name will be marked with `.VIOLATED` as an indicator. Developers need to refer to the DCPs and timing reports for detailed timing failures. :warning: The build process will generate a DCP tarball file regardless of the design’s timing closure state. However, in case of a DCP with timing failures, the design’s functionality is no longer guaranteed. Therefore, the AFI created using this DCP should be used for testing purpose ONLY. The following warning is shown in this case: @@ -115,7 +125,7 @@ Generated post-route DCP and design manifest files are archived into a tarball f #### Step 6. Submit Generated DCP for AFI Creation -To submit the DCP, create an S3 bucket for submitting the design and upload the DCP tarball file to the bucket. DCP submission requires the following information: +To submit the DCP, create an S3 bucket and upload the DCP tarball file to the bucket. DCP submission requires the following information: - Name of the design (Optional). - Generic description of the logic design (Optional). @@ -208,7 +218,7 @@ aws ec2 describe-fpga-images --fpga-image-ids afi-09953582f46c45b17 --region us- #### Step 7. Load Accelerator AFI on F2 Instance -Now that your AFI is available, it can be tested on an F2 instance. The instance can be launched using any prefered AMI, private or public, from the AWS Marketplace catalog. AWS recommends using AMIs with Ubuntu 20.04 and kernel version 5.15. +Now that your AFI is available, it can be tested on an F2 instance. The instance can be launched using any preferred AMI, private or public, from the AWS Marketplace catalog. AWS recommends using AMIs with Ubuntu 20.04 and kernel version 5.15. Now you need to install the FPGA Management tools by sourcing the `sdk_setup.sh` script: @@ -320,7 +330,7 @@ All examples have the following features: ### [cl_sde](./cl/examples/cl_sde) The cl_sde example implements the Streaming Data Engine (SDE) IP block -into FPGA custom logic to demonstrate the Virtual Ethernet Application. +into FPGA custom logic to demonstrate the [Virtual Ethernet Application](../sdk/apps/virtual-ethernet/README.md). See [cl_sde](./cl/examples/cl_sde) for more information @@ -332,7 +342,7 @@ See [cl_dram_hbm_dma](./cl/examples/cl_dram_hbm_dma) for more information ### [cl_mem_perf](./cl/examples/cl_mem_perf) -The cl_mem_perf is a customer reference design for F2 where the objective is to demonstrate fine tuned data paths to HBM and DDR to achieve maximum throughput to the memories. The example also demonstrates datapath connectivity between Host, AWS Shell, Custom Logic (CL) region in the FPGA, HBM and DDR DIMM on the FPGA card. +The cl_mem_perf is a reference design for F2 where the objective is to demonstrate fine tuned data paths to HBM and DDR to achieve maximum throughput to the memories. The example also demonstrates datapath connectivity between Host, AWS Shell, Custom Logic (CL) region in the FPGA, HBM and DDR DIMM on the FPGA card. See [cl_mem_perf](./cl/examples/cl_mem_perf) for more information @@ -352,7 +362,7 @@ cd hdk/cl/examples ./create_new_cl.py --new_cl_name ${NEW_CL_NAME} ``` -## CL Example Heirarchy +## CL Example Hierarchy The following sections describe common functionality across all CL examples. [CL_TEMPLATE](./CL_TEMPLATE) can be used as a reference for what features are available in all CL examples; as well as what's required to verify, test, and build. @@ -428,7 +438,7 @@ The [shell_stable](./common/shell_stable) contains all the IPs, constraints and ### [/verif](./hdk/verif) -The [verif directory](./common/verif) includes reference verification modules to be used as Bus Functional Models (BFM) as the external interface to simulate the Custom Logic (CL). The verification related files common to all the CL examples are located in this directory. It has models, include, scripts, tb directories. +The [verif directory](./common/verif) includes reference verification modules to be used as Bus Functional Models (BFM) as the external interface to simulate the CL. The verification related files common to all the CL examples are located in this directory. It has models, include, scripts, tb directories. The [verif models directory](./common/verif/models) includes simple models of the DRAM interface around the FPGA, shell, and card. You can also find Xilinx protocol checkers in this directory. @@ -476,9 +486,9 @@ The [lib directory](./common/lib) includes basic "library" elements that may be - sync.v - Synchronizer - xpm_fifo.sv - Synchronous clock FIFO -## Next Steps +## Getting Started -- Review the [cl_sde](./cl/examples/cl_sde) example -- [Run RTL Simulations](./docs/RTL_Simulation_Guide_for_HDK_Design_Flow.md) on the example designs -- Dive deep into [Shell interface specifications](./docs/AWS_Shell_Interface_Specification.md) and [PCIe Memory map](./docs/AWS_Fpga_Pcie_Memory_Map.md) -- Create your own designs or port an existing F1 design to F2 system +* Review the [cl_dram_hbm_dma](./cl/examples/cl_dram_hbm_dma/README.md) and [cl_sde](./cl/examples/cl_sde) examples +* [Run RTL Simulations](./docs/RTL_Simulation_Guide_for_HDK_Design_Flow.md) on the example designs +* Dive deep into [Shell interface specifications](./docs/AWS_Shell_Interface_Specification.md) and [PCIe Memory map](./docs/AWS_Fpga_Pcie_Memory_Map.md) +* Create your own designs/Port F1 designs to F2 systems. diff --git a/hdk/cl/CHECKLIST_BEFORE_BUILDING_CL.md b/hdk/cl/CHECKLIST_BEFORE_BUILDING_CL.md index 2f4e0468a..18b7431ba 100644 --- a/hdk/cl/CHECKLIST_BEFORE_BUILDING_CL.md +++ b/hdk/cl/CHECKLIST_BEFORE_BUILDING_CL.md @@ -1,10 +1,11 @@ -This checklist includes important items that the developer should check before running a build (Vivado implementation) +# Checklist Before Building + +This checklist includes important items that the developer should check before building a CL Design Check Point (DCP) file for AFI generation. 1. Verify that the environment variables `$HDK_SHELL_DIR` and `$CL_DIR` are set correctly. - + 1. Verify that the `$CL_DIR` directory has a `/build` sub-directory. 1. Update `$CL_DIR/build/script/encrypt.tcl` script for your design specific changes, including the list of all the source files (including header files like .inc and .h/.vh), so they all get copied to `src_post_encryption` directory 1. Update the timing and placement constraints under `$CL_DIR/build/constraints` for your design specific changes. - diff --git a/hdk/cl/examples/CL_TEMPLATE/README.md b/hdk/cl/examples/CL_TEMPLATE/README.md index 076eaac27..501682d27 100644 --- a/hdk/cl/examples/CL_TEMPLATE/README.md +++ b/hdk/cl/examples/CL_TEMPLATE/README.md @@ -87,7 +87,7 @@ The build flow is identical to all other examples: 1. Populate the [constraint files](./build/constraints) as needed 2. Update [synth_CL_TEMPLATE.tcl](./build/scripts/synth_CL_TEMPLATE.tcl) with relevant IP's, constraints, etc. 3. Run [aws_build_dcp_from_cl.py](../../../common/shell_stable/build/scripts/aws_build_dcp_from_cl.py) - - For a full guide on aws_build_dcp_from_cl.py please refer to [Setup the Development Environment and SDK Design Flow](./../../../../README.md#setup-the-development-environment-and-sdk-design-flow) on the main page. + - Run ``aws_build_dcp_from_cl.py --help`` for more details. See the following `tcl` scripts for more details on the build flow (they are sourced in [synth_CL_TEMPLATE.tcl](./build/scripts/synth_CL_TEMPLATE.tcl)): @@ -115,7 +115,7 @@ For more information on how to populate the constraint files and build scripts, ## CL_TEMPLATE Quick Start Guide -The top level [Quick Start Guide](./../../../../README.md#quick-start) on the main page will provide an introduction to this guide. +The top level [Quick Start Guide](./../../../README.md#getting-started) on the main page will provide an introduction to this guide. ### STEP 1: Create a New CL @@ -170,15 +170,16 @@ Or specify an [available simulator](./../../../../README.md#supported-tools-vers make CL_TEMPLATE_base_test =1 ``` -This will first generate and compile the simulation libraries required for the requested SIMULATOR. Test results will be stored in the `$CL_DIR/verif/sim/` directory (created upon first simulation run). After adding new IP's to [`$AWS_FPGA_REPO_DIR/hdk/common/ip`](./../../../common/ip) the simulation libraries need to be recompiled: `make regenerate_sim_libs =1`. For more information, see [`$AWS_FPGA_REPO_DIR/hdk/README.md`](./../../../). +This will first generate and compile the simulation libraries required for the requested SIMULATOR. Test results will be stored in the `$CL_DIR/verif/sim/` directory (created upon first simulation run). After adding new IP's to [`$AWS_FPGA_REPO_DIR/hdk/common/ip`](./../../../common/ip) the simulation libraries need to be recompiled: `make regenerate_sim_libs =1`. #### File List Generation -The Makefile includes [$AWS_FPGA_REPO_DIR/hdk/common/verif/tb/scripts/Makefile.common.inc](./../../../../../common/verif/tb/scripts/Makefile.common.inc) which runs a Python script to automatically update each `top..f` file list with all SystemVerilog files found under the [$CL_DIR/design](./design) directory. -* To disable the generation, run `export DONT_GENERATE_FILE_LIST=1`. -* To re-enable the generation, run `unset DONT_GENERATE_FILE_LIST`. -* To generate the file list by itself, run `make generate_sim_file_list =1`. -* To add additional files, add them outside of the auto generation section: +The Makefile includes [$AWS_FPGA_REPO_DIR/hdk/common/verif/tb/scripts/Makefile.common.inc](./../../../common/verif/tb/scripts/Makefile.common.inc) which runs a Python script to automatically update each `top..f` file list with all SystemVerilog files found under the [$CL_DIR/design](./design) directory. + +- To disable the generation, run `export DONT_GENERATE_FILE_LIST=1`. +- To re-enable the generation, run `unset DONT_GENERATE_FILE_LIST`. +- To generate the file list by itself, run `make generate_sim_file_list =1`. +- To add additional files, add them outside of the auto generation section: ```text # Add code up here or below the comment block to persist between simulations @@ -194,7 +195,7 @@ $CL_DIR/design/CL_TEMPLATE.sv ############################## ``` -#### Xilinx IP Discovery and Compilation +#### Xilinx/AMD IP Discovery and Compilation When running your first test, all Xilinx IP's under [$AWS_FPGA_REPO_DIR/hdk/common/ip/cl_ip](./../../../common/ip/cl_ip) are automatically compiled @@ -207,17 +208,17 @@ If a design adds new IP's, make sure to add the new simulation libraries to `COM Simulation library names can be found under: - [$AWS_FPGA_REPO_DIR/hdk/common/ip/cl_ip/cl_ip.ip_user_files/sim_scripts](./../../../common/ip/cl_ip/cl_ip.ip_user_files/sim_scripts) -followed by `"IP_NAME"/"SIMULATOR"/"IP_NAME".sh` +followed by `//.sh` All verification work is located under the [verif](./verif) directory. Please see the [Verification](#verification) section for the CL_TEMPLATE verification details. ### STEP 4: Develop Software Tests (OPTIONAL) -CL_TEMPLATE does not yet support stand alone software tests. Please refer to other examples such as [CL_DRAM_HBM_DMA](./../cl_dram_hbm_dma#software) +CL_TEMPLATE does not yet support standalone software tests. Please refer to other examples such as [CL_DRAM_HBM_DMA](./../cl_dram_hbm_dma/README.md#software) ### STEP 5: Build and Deploy the Design -Once design files have been added and tested, constraint and build script updates need to be made. The build flow creates a bitstream that is used to create an AFI to deploy on hardware. The build and deployment flows can be found in the [Quick Start Guide](./../../../../README.md#setup-the-development-environment-and-sdk-design-flow). Examples for all constraint files and build scripts can be found in other examples such as [CL_DRAM_HBM_DMA](./../cl_dram_hbm_dma/build). +Once design files have been added and tested, constraint and build script updates need to be made. The build flow creates a bitstream that is used to create an AFI to deploy on hardware. The build and deployment flows can be found in the [Quick Start Guide](./../../../../User_Guide_AWS_EC2_FPGA_Development_Kit.md#getting-started). Examples for all constraint files and build scripts can be found in other examples such as [CL_DRAM_HBM_DMA](./../cl_dram_hbm_dma/build). 1. Populate existing and/or add new constraint files to [./build/constraints](./build/constraints) - AWS has provided basic constraints required in example designs in [$AWS_FPGA_REPO_DIR/hdk/common/shell_stable/build/constraints](./../../../common/shell_stable/build/constraints) diff --git a/hdk/cl/examples/CL_TEMPLATE/build/constraints/cl_synth_user.xdc b/hdk/cl/examples/CL_TEMPLATE/build/constraints/cl_synth_user.xdc index 94c355965..91047cc17 100644 --- a/hdk/cl/examples/CL_TEMPLATE/build/constraints/cl_synth_user.xdc +++ b/hdk/cl/examples/CL_TEMPLATE/build/constraints/cl_synth_user.xdc @@ -1 +1,19 @@ +# ============================================================================= +# Amazon FPGA Hardware Development Kit +# +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# +# Licensed under the Amazon Software License (the "License"). You may not use +# this file except in compliance with the License. A copy of the License is +# located at +# +# http://aws.amazon.com/asl/ +# +# or in the "license" file accompanying this file. This file is distributed on +# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or +# implied. See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================= + + # Add synthesis constraint here diff --git a/hdk/cl/examples/CL_TEMPLATE/build/constraints/cl_timing_user.xdc b/hdk/cl/examples/CL_TEMPLATE/build/constraints/cl_timing_user.xdc index d169aee57..85447a669 100644 --- a/hdk/cl/examples/CL_TEMPLATE/build/constraints/cl_timing_user.xdc +++ b/hdk/cl/examples/CL_TEMPLATE/build/constraints/cl_timing_user.xdc @@ -1,2 +1,19 @@ +# ============================================================================= +# Amazon FPGA Hardware Development Kit +# +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# +# Licensed under the Amazon Software License (the "License"). You may not use +# this file except in compliance with the License. A copy of the License is +# located at +# +# http://aws.amazon.com/asl/ +# +# or in the "license" file accompanying this file. This file is distributed on +# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or +# implied. See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================= + # Add timing constraints here diff --git a/hdk/cl/examples/CL_TEMPLATE/build/constraints/small_shell_cl_pnr_user.xdc b/hdk/cl/examples/CL_TEMPLATE/build/constraints/small_shell_cl_pnr_user.xdc index ab2308b91..6d223426c 100644 --- a/hdk/cl/examples/CL_TEMPLATE/build/constraints/small_shell_cl_pnr_user.xdc +++ b/hdk/cl/examples/CL_TEMPLATE/build/constraints/small_shell_cl_pnr_user.xdc @@ -1 +1,19 @@ +# ============================================================================= +# Amazon FPGA Hardware Development Kit +# +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# +# Licensed under the Amazon Software License (the "License"). You may not use +# this file except in compliance with the License. A copy of the License is +# located at +# +# http://aws.amazon.com/asl/ +# +# or in the "license" file accompanying this file. This file is distributed on +# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or +# implied. See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================= + + # Add Small_Shell P&R constraints here diff --git a/hdk/cl/examples/CL_TEMPLATE/build/constraints/xdma_shell_cl_pnr_user.xdc b/hdk/cl/examples/CL_TEMPLATE/build/constraints/xdma_shell_cl_pnr_user.xdc index 60e34ee0e..4110d612d 100644 --- a/hdk/cl/examples/CL_TEMPLATE/build/constraints/xdma_shell_cl_pnr_user.xdc +++ b/hdk/cl/examples/CL_TEMPLATE/build/constraints/xdma_shell_cl_pnr_user.xdc @@ -1 +1,19 @@ +# ============================================================================= +# Amazon FPGA Hardware Development Kit +# +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# +# Licensed under the Amazon Software License (the "License"). You may not use +# this file except in compliance with the License. A copy of the License is +# located at +# +# http://aws.amazon.com/asl/ +# +# or in the "license" file accompanying this file. This file is distributed on +# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or +# implied. See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================= + + # Add XDMA_Shell P&R constraints here diff --git a/hdk/cl/examples/CL_TEMPLATE/build/scripts/synth_CL_TEMPLATE.tcl b/hdk/cl/examples/CL_TEMPLATE/build/scripts/synth_CL_TEMPLATE.tcl index 9bf9f3870..9e1e380fc 100644 --- a/hdk/cl/examples/CL_TEMPLATE/build/scripts/synth_CL_TEMPLATE.tcl +++ b/hdk/cl/examples/CL_TEMPLATE/build/scripts/synth_CL_TEMPLATE.tcl @@ -1,17 +1,19 @@ +# ============================================================================= # Amazon FPGA Hardware Development Kit # -# Copyright 2022 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Amazon Software License (the "License"). You may not use # this file except in compliance with the License. A copy of the License is # located at # # http://aws.amazon.com/asl/ -#` +# # or in the "license" file accompanying this file. This file is distributed on # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or # implied. See the License for the specific language governing permissions and # limitations under the License. +# ============================================================================= # Common header diff --git a/hdk/cl/examples/CL_TEMPLATE/design/CL_TEMPLATE.sv b/hdk/cl/examples/CL_TEMPLATE/design/CL_TEMPLATE.sv index e8d4ecf08..45722edb5 100644 --- a/hdk/cl/examples/CL_TEMPLATE/design/CL_TEMPLATE.sv +++ b/hdk/cl/examples/CL_TEMPLATE/design/CL_TEMPLATE.sv @@ -1,7 +1,7 @@ -//==================================================================================== +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -13,6 +13,9 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + + //==================================================================================== // Top level module file for CL_TEMPLATE //==================================================================================== diff --git a/hdk/cl/examples/CL_TEMPLATE/design/CL_TEMPLATE_defines.vh b/hdk/cl/examples/CL_TEMPLATE/design/CL_TEMPLATE_defines.vh index 5f5885675..f796d4eec 100644 --- a/hdk/cl/examples/CL_TEMPLATE/design/CL_TEMPLATE_defines.vh +++ b/hdk/cl/examples/CL_TEMPLATE/design/CL_TEMPLATE_defines.vh @@ -1,3 +1,21 @@ +// ============================================================================ +// Amazon FPGA Hardware Development Kit +// +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// +// Licensed under the Amazon Software License (the "License"). You may not use +// this file except in compliance with the License. A copy of the License is +// located at +// +// http://aws.amazon.com/asl/ +// +// or in the "license" file accompanying this file. This file is distributed on +// an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or +// implied. See the License for the specific language governing permissions and +// limitations under the License. +// ============================================================================ + + `ifndef CL_TEMPLATE_DEFINES `define CL_TEMPLATE_DEFINES diff --git a/hdk/cl/examples/CL_TEMPLATE/design/cl_id_defines.vh b/hdk/cl/examples/CL_TEMPLATE/design/cl_id_defines.vh index c8922856c..abe97995d 100644 --- a/hdk/cl/examples/CL_TEMPLATE/design/cl_id_defines.vh +++ b/hdk/cl/examples/CL_TEMPLATE/design/cl_id_defines.vh @@ -1,3 +1,21 @@ +// ============================================================================ +// Amazon FPGA Hardware Development Kit +// +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// +// Licensed under the Amazon Software License (the "License"). You may not use +// this file except in compliance with the License. A copy of the License is +// located at +// +// http://aws.amazon.com/asl/ +// +// or in the "license" file accompanying this file. This file is distributed on +// an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or +// implied. See the License for the specific language governing permissions and +// limitations under the License. +// ============================================================================ + + `ifndef CL_ID_DEFINES `define CL_ID_DEFINES diff --git a/hdk/cl/examples/CL_TEMPLATE/verif/scripts/Makefile b/hdk/cl/examples/CL_TEMPLATE/verif/scripts/Makefile index 6fba0eedf..094fa0505 100644 --- a/hdk/cl/examples/CL_TEMPLATE/verif/scripts/Makefile +++ b/hdk/cl/examples/CL_TEMPLATE/verif/scripts/Makefile @@ -1,6 +1,7 @@ +# ============================================================================= # Amazon FPGA Hardware Development Kit # -# Copyright 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Amazon Software License (the "License"). You may not use # this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or # implied. See the License for the specific language governing permissions and # limitations under the License. +# ============================================================================= + ifndef HDK_COMMON_DIR $(error Environment variable HDK_COMMON_DIR not set. Please source hdk_setup.sh) diff --git a/hdk/cl/examples/CL_TEMPLATE/verif/scripts/Makefile.tests b/hdk/cl/examples/CL_TEMPLATE/verif/scripts/Makefile.tests index 2b80a19be..19e72ca26 100644 --- a/hdk/cl/examples/CL_TEMPLATE/verif/scripts/Makefile.tests +++ b/hdk/cl/examples/CL_TEMPLATE/verif/scripts/Makefile.tests @@ -1,6 +1,7 @@ +# ============================================================================= # Amazon FPGA Hardware Development Kit # -# Copyright 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Amazon Software License (the "License"). You may not use # this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or # implied. See the License for the specific language governing permissions and # limitations under the License. +# ============================================================================= + # Adds an easy make target that sets $TEST and runs the all (compile & run) target CL_TEMPLATE_base_test: TEST=CL_TEMPLATE_base_test diff --git a/hdk/cl/examples/CL_TEMPLATE/verif/scripts/top.questa.f b/hdk/cl/examples/CL_TEMPLATE/verif/scripts/top.questa.f index 3897d312c..19b477767 100644 --- a/hdk/cl/examples/CL_TEMPLATE/verif/scripts/top.questa.f +++ b/hdk/cl/examples/CL_TEMPLATE/verif/scripts/top.questa.f @@ -1,6 +1,7 @@ +# ============================================================================= # Amazon FPGA Hardware Development Kit # -# Copyright 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Amazon Software License (the "License"). You may not use # this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or # implied. See the License for the specific language governing permissions and # limitations under the License. +# ============================================================================= + +define+CL_NAME=CL_TEMPLATE +define+DISABLE_VJTAG_DEBUG diff --git a/hdk/cl/examples/CL_TEMPLATE/verif/scripts/top.vcs.f b/hdk/cl/examples/CL_TEMPLATE/verif/scripts/top.vcs.f index 3897d312c..19b477767 100644 --- a/hdk/cl/examples/CL_TEMPLATE/verif/scripts/top.vcs.f +++ b/hdk/cl/examples/CL_TEMPLATE/verif/scripts/top.vcs.f @@ -1,6 +1,7 @@ +# ============================================================================= # Amazon FPGA Hardware Development Kit # -# Copyright 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Amazon Software License (the "License"). You may not use # this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or # implied. See the License for the specific language governing permissions and # limitations under the License. +# ============================================================================= + +define+CL_NAME=CL_TEMPLATE +define+DISABLE_VJTAG_DEBUG diff --git a/hdk/cl/examples/CL_TEMPLATE/verif/scripts/top.xsim.f b/hdk/cl/examples/CL_TEMPLATE/verif/scripts/top.xsim.f index 2569f54b0..47e1f8c38 100644 --- a/hdk/cl/examples/CL_TEMPLATE/verif/scripts/top.xsim.f +++ b/hdk/cl/examples/CL_TEMPLATE/verif/scripts/top.xsim.f @@ -1,6 +1,7 @@ +# ============================================================================= # Amazon FPGA Hardware Development Kit # -# Copyright 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Amazon Software License (the "License"). You may not use # this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or # implied. See the License for the specific language governing permissions and # limitations under the License. +# ============================================================================= + -define CL_NAME=CL_TEMPLATE -define DISABLE_VJTAG_DEBUG diff --git a/hdk/cl/examples/CL_TEMPLATE/verif/scripts/waves.tcl b/hdk/cl/examples/CL_TEMPLATE/verif/scripts/waves.tcl index 6cb7c4c73..ce36f21fd 100644 --- a/hdk/cl/examples/CL_TEMPLATE/verif/scripts/waves.tcl +++ b/hdk/cl/examples/CL_TEMPLATE/verif/scripts/waves.tcl @@ -1,6 +1,7 @@ +# ============================================================================= # Amazon FPGA Hardware Development Kit # -# Copyright 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Amazon Software License (the "License"). You may not use # this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or # implied. See the License for the specific language governing permissions and # limitations under the License. +# ============================================================================= + set curr_wave [current_wave_config] if { [string length $curr_wave] == 0 } { @@ -23,5 +26,5 @@ if { [string length $curr_wave] == 0 } { } } -run all +run all quit diff --git a/hdk/cl/examples/CL_TEMPLATE/verif/tests/CL_TEMPLATE_base_test.sv b/hdk/cl/examples/CL_TEMPLATE/verif/tests/CL_TEMPLATE_base_test.sv index 7ff82e660..fa22d7a5d 100644 --- a/hdk/cl/examples/CL_TEMPLATE/verif/tests/CL_TEMPLATE_base_test.sv +++ b/hdk/cl/examples/CL_TEMPLATE/verif/tests/CL_TEMPLATE_base_test.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + `include "common_base_test.svh" diff --git a/hdk/cl/examples/cl_dram_hbm_dma/README.md b/hdk/cl/examples/cl_dram_hbm_dma/README.md index 6c8ac7af1..fc9f74237 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/README.md +++ b/hdk/cl/examples/cl_dram_hbm_dma/README.md @@ -8,26 +8,23 @@ 2. [Functional Description](#functionalDescription) 3. [Software](#software) - # Overview The CL_DRAM_HBM_DMA example demonstrates the use and connectivity for many of the Shell/CL interfaces and functionality, including: -1) Register Access over OCL AXI-Lite interface +1) Register access over OCL AXI-Lite interface 2) Mapping of the external DRAM channel to instance memory via PCIe AppPF BAR4, and the 512-bit `sh_cl_dma_pcis_*` AXI4 bus 3) Mapping of HBM memory to instance memory via PCIe AppPF BAR4, and the 512-bit `sh_cl_dma_pcis_*` AXI4 bus -4) Virtual JTAG (**Virtual JTAG is not currently supported**) and Xilinx Integrated Logic Analyzer cores +4) Debugging using Virtual JTAG and Xilinx Integrated Logic Analyzer (ILA) cores. 5) User-defined interrupts 6) `cl_sh_pcim_*` AXI4 traffic for host memory accesses from CL - - ### System diagram ![Diagram](design/cl_dram_hbm_dma.png) @@ -37,13 +34,13 @@ The CL_DRAM_HBM_DMA example demonstrates the use and connectivity for many of th # Functional Description ### Memory Interface -The cl_dram_hbm_dma demonstrates accessing 64GiB of DDR memory and 16GiB of single channel HBM memory over `sh_cl_dma_pcis` AXI4 bus. +The cl_dram_hbm_dma demonstrates accessing 64GB of DDR memory and 16GB of single channel HBM memory over the `sh_cl_dma_pcis` AXI4 bus. The CL provides access to the DDR memory through `sh_ddr.sv` which consists of the DDR controller required to interact with the external DDR DIMM on the FPGA card. The `sh_ddr.sv` is also connected to the Shell's `sh_cl_ddr_stat_*` ports to enable Shell to manage DDR calibration upon CL AFI loads. -The CL also provides access to the on-chip HBM available in the FPGA. The HBM IP is configured for dual stack 16GiB capacity which exposes 32 AXI3 (not AXI4) channels running on 450MHz clock. However, only one HBM channel is being used in this example design to demonstrate datapath connection to the HBM. The [cl_hbm_axi4.sv](./design/cl_hbm_axi4.sv) does the AXI4-to-AXI3 conversion, crosses clock domain between `clk_main_a0` and HBM's 450 MHz `axi_clk` for the datapath and feeds the `cl_hbm_wrapper.sv`. The [cl_hbm_wrapper.sv](./design/cl_hbm_wrapper.sv) instantiates the HBM IP, houses MMCM to generate 450MHz interface clock, and connects the datapath to Channel#0 of the HBM IP core. +The CL also provides access to the on-chip HBM available in the FPGA. The HBM IP is configured for dual stack 16GB capacity which exposes 32 AXI3 (not AXI4) channels running on 450MHz clock. However, only one HBM channel is being used in this example design to demonstrate datapath connection to the HBM. The [cl_hbm_axi4.sv](./design/cl_hbm_axi4.sv) does the AXI4-to-AXI3 conversion, crosses clock domain between the 250 MHz `clk_main_a0` and HBM's up to 450 MHz `axi_clk` for the datapath and feeds the `cl_hbm_wrapper.sv`. The [cl_hbm_wrapper.sv](./design/cl_hbm_wrapper.sv) instantiates the HBM IP, houses MMCM to generate 450MHz interface clock, and connects the datapath to Channel#0 of the HBM IP core. -**NOTE:** Since the CL utilizes only one HBM Channel which is fed by data source running at 250MHz clock, it does not accomplish the max available bandwidth from HBM. AWS will provide another example design to demonstrate max performance from HBM. +**NOTE:** Since the CL utilizes only one HBM Channel which is fed by data source running at 250MHz clock, it does not accomplish the max available bandwidth from HBM. For demonstration of the max performance from HBM. refer to the [cl_mem_per](../cl_mem_perf/README.md) example. ### Design Changes @@ -62,22 +59,24 @@ If DDR is enabled, make sure that the DDRs are initialized using the poke_stat c eg: To initialize DDR +```verilog tb.poke_stat(.addr(8'h0c), .ddr_idx(0), .data(32'h0000_0000)); +``` Make sure that the Host to Card and Card to Host DMA transfers only access enabled DDR controller address space. ### dma_pcis AXI4 bus -sh\_cl\_dma\_pcis exposes a address windows of 128GiB matching AppPF BAR4. +sh\_cl\_dma\_pcis exposes a address windows of 128GB matching AppPF BAR4. -This memory space is mapped to the 64GiB DRAM space and 16GiB HBM space. -An axi_crossbar interconnects the incomming addres requests to the target memories as shown below: -* DDR base_addr=0x00_0000_0000 | range=64GiB -* HBM base_addr=0x10_0000_0000 | range=16GiB +This memory space is mapped to the 64GB DRAM space and 16GB HBM space. +An axi_crossbar interconnects the incoming address requests to the target memories as shown below: +* DDR base_addr=0x00_0000_0000 (range=64GB) +* HBM base_addr=0x10_0000_0000 (range=16GB) -**NOTE**: Please refer to [Supported_DDR_Modes.md](./../../../docs/Supported_DDR_Modes.md) for details on supported DDR configurations in `sh_ddr.sv`. +**NOTE**: Please refer to [Supported DDR Modes](./../../../docs/Supported_DDR_Modes.md) for details on supported DDR configurations in `sh_ddr.sv`. ### ocl\_ AXI-Lite @@ -147,9 +146,7 @@ This test runs a software test with data transfer with both DDR and HBM enabled ```bash cd ${CL_DIR}/software/runtime - make all - sudo ./test_dram_hbm_dma ``` @@ -161,9 +158,7 @@ This test runs a software test with HW/SW co-simulation enabled with both DDR an ```bash cd ${CL_DIR}/software/runtime - make TEST=test_dram_hbm_dma_hwsw_cosim - sudo ./test_dram_hbm_dma_hwsw_cosim ``` @@ -171,6 +166,5 @@ The test can be simulated with XSIM as follows. ```bash cd ${CL_DIR}/verif/scripts - make C_TEST=test_dram_hbm_dma_hwsw_cosim ``` diff --git a/hdk/cl/examples/cl_dram_hbm_dma/build/constraints/cl_synth_user.xdc b/hdk/cl/examples/cl_dram_hbm_dma/build/constraints/cl_synth_user.xdc index a9a115428..160f6090c 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/build/constraints/cl_synth_user.xdc +++ b/hdk/cl/examples/cl_dram_hbm_dma/build/constraints/cl_synth_user.xdc @@ -1,3 +1,21 @@ +# ============================================================================= +# Amazon FPGA Hardware Development Kit +# +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# +# Licensed under the Amazon Software License (the "License"). You may not use +# this file except in compliance with the License. A copy of the License is +# located at +# +# http://aws.amazon.com/asl/ +# +# or in the "license" file accompanying this file. This file is distributed on +# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or +# implied. See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================= + + ############################################################################### # This contains the CL specific constraints for synthesis at the CL leve ############################################################################### diff --git a/hdk/cl/examples/cl_dram_hbm_dma/build/constraints/cl_timing_user.xdc b/hdk/cl/examples/cl_dram_hbm_dma/build/constraints/cl_timing_user.xdc index 45d22f6aa..49212ee53 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/build/constraints/cl_timing_user.xdc +++ b/hdk/cl/examples/cl_dram_hbm_dma/build/constraints/cl_timing_user.xdc @@ -1,3 +1,21 @@ +# ============================================================================= +# Amazon FPGA Hardware Development Kit +# +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# +# Licensed under the Amazon Software License (the "License"). You may not use +# this file except in compliance with the License. A copy of the License is +# located at +# +# http://aws.amazon.com/asl/ +# +# or in the "license" file accompanying this file. This file is distributed on +# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or +# implied. See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================= + + ############################################################################### # This contains the CL specific timing constraints for CL ############################################################################### diff --git a/hdk/cl/examples/cl_dram_hbm_dma/build/constraints/small_shell_cl_pnr_user.xdc b/hdk/cl/examples/cl_dram_hbm_dma/build/constraints/small_shell_cl_pnr_user.xdc index bfa49af7c..a193ff036 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/build/constraints/small_shell_cl_pnr_user.xdc +++ b/hdk/cl/examples/cl_dram_hbm_dma/build/constraints/small_shell_cl_pnr_user.xdc @@ -1,11 +1,20 @@ # ============================================================================= -# Copyright 2021 Amazon.com, Inc. or its affiliates. -# All Rights Reserved Worldwide. -# Amazon Confidential information -# Restricted NDA Material +# Amazon FPGA Hardware Development Kit +# +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# +# Licensed under the Amazon Software License (the "License"). You may not use +# this file except in compliance with the License. A copy of the License is +# located at +# +# http://aws.amazon.com/asl/ +# +# or in the "license" file accompanying this file. This file is distributed on +# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or +# implied. See the License for the specific language governing permissions and +# limitations under the License. # ============================================================================= - # Level 1 CL_DRAM_HBM_DMA floorplan for Small Shell diff --git a/hdk/cl/examples/cl_dram_hbm_dma/build/constraints/xdma_shell_cl_pnr_user.xdc b/hdk/cl/examples/cl_dram_hbm_dma/build/constraints/xdma_shell_cl_pnr_user.xdc index cd0fcd32b..85c471f7f 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/build/constraints/xdma_shell_cl_pnr_user.xdc +++ b/hdk/cl/examples/cl_dram_hbm_dma/build/constraints/xdma_shell_cl_pnr_user.xdc @@ -1,11 +1,20 @@ # ============================================================================= -# Copyright 2021 Amazon.com, Inc. or its affiliates. -# All Rights Reserved Worldwide. -# Amazon Confidential information -# Restricted NDA Material +# Amazon FPGA Hardware Development Kit +# +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# +# Licensed under the Amazon Software License (the "License"). You may not use +# this file except in compliance with the License. A copy of the License is +# located at +# +# http://aws.amazon.com/asl/ +# +# or in the "license" file accompanying this file. This file is distributed on +# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or +# implied. See the License for the specific language governing permissions and +# limitations under the License. # ============================================================================= - # Level 1 CL_DRAM_HBM_DMA floorplan for XDMA Shell diff --git a/hdk/cl/examples/cl_dram_hbm_dma/build/scripts/encrypt.tcl b/hdk/cl/examples/cl_dram_hbm_dma/build/scripts/encrypt.tcl index 924d670f8..bc38f8812 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/build/scripts/encrypt.tcl +++ b/hdk/cl/examples/cl_dram_hbm_dma/build/scripts/encrypt.tcl @@ -1,6 +1,7 @@ +# ============================================================================= # Amazon FPGA Hardware Development Kit # -# Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Amazon Software License (the "License"). You may not use # this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or # implied. See the License for the specific language governing permissions and # limitations under the License. +# ============================================================================= + # TODO: # Add check if CL_DIR and HDK_SHELL_DIR directories exist diff --git a/hdk/cl/examples/cl_dram_hbm_dma/build/scripts/synth_cl_dram_hbm_dma.tcl b/hdk/cl/examples/cl_dram_hbm_dma/build/scripts/synth_cl_dram_hbm_dma.tcl index ba12aed1e..e03d8978f 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/build/scripts/synth_cl_dram_hbm_dma.tcl +++ b/hdk/cl/examples/cl_dram_hbm_dma/build/scripts/synth_cl_dram_hbm_dma.tcl @@ -1,6 +1,7 @@ +# ============================================================================= # Amazon FPGA Hardware Development Kit # -# Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Amazon Software License (the "License"). You may not use # this file except in compliance with the License. A copy of the License is @@ -12,6 +13,7 @@ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or # implied. See the License for the specific language governing permissions and # limitations under the License. +# ============================================================================= # Common header diff --git a/hdk/cl/examples/cl_dram_hbm_dma/design/axil_slave.sv b/hdk/cl/examples/cl_dram_hbm_dma/design/axil_slave.sv index b056ff5f5..06e098e2a 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/design/axil_slave.sv +++ b/hdk/cl/examples/cl_dram_hbm_dma/design/axil_slave.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,43 +13,45 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + module axil_slave ( input clk, input rst_n, - input awvalid, - input[63:0] awaddr, - output logic awready, - - //Write data - input wvalid, - input[31:0] wdata, - input[3:0] wstrb, - output logic wready, - - //Write response - output logic bvalid, + input awvalid, + input[63:0] awaddr, + output logic awready, + + //Write data + input wvalid, + input[31:0] wdata, + input[3:0] wstrb, + output logic wready, + + //Write response + output logic bvalid, output logic[1:0] bresp, input bready, - + //Read address - input arvalid, - input[63:0] araddr, + input arvalid, + input[63:0] araddr, output logic arready, - + //Read data/response - output logic rvalid, + output logic rvalid, output logic[31:0] rdata, output logic[1:0] rresp, - + input rready ); logic[63:0] awaddr_q; logic arvalid_q; -// Does not work when awvalid and wvalid are asserted at the same time +// Does not work when awvalid and wvalid are asserted at the same time //assign awready = !wvalid; //assign wready = !arvalid; // @@ -57,7 +60,7 @@ logic arvalid_q; // awaddr_q <= 0; // else if (awvalid && awready) // awaddr_q <= awaddr; -// +// //always_ff @(negedge rst_n or posedge clk) // if (!rst_n) // begin @@ -73,7 +76,7 @@ logic arvalid_q; logic wr_active; logic [63:0] wr_addr; - + always_ff @(negedge rst_n or posedge clk) if (!rst_n) begin wr_active <= 0; @@ -88,18 +91,18 @@ logic arvalid_q; assign awready = ~wr_active; assign wready = wr_active && wvalid; - + always_ff @(negedge rst_n or posedge clk) - if (!rst_n) + if (!rst_n) bvalid <= 0; else - bvalid <= bvalid && bready ? 1'b0 : + bvalid <= bvalid && bready ? 1'b0 : ~bvalid && wready ? 1'b1 : bvalid; assign bresp = 0; - + assign arready = !arvalid_q && !rvalid; - + always_ff @(negedge rst_n or posedge clk) if (!rst_n) arvalid_q <= 0; @@ -121,7 +124,7 @@ always_ff @(negedge rst_n or posedge clk) rdata <= 0; rresp <= 0; end - else if (arvalid_q) + else if (arvalid_q) begin rvalid <= 1; rdata <= ram_rdata; @@ -149,5 +152,3 @@ bram_2rw #(.WIDTH(32), .ADDR_WIDTH(8), .DEPTH(256) ) AXIL_RAM ( ); endmodule - - diff --git a/hdk/cl/examples/cl_dram_hbm_dma/design/cl_dma_pcis_slv.sv b/hdk/cl/examples/cl_dram_hbm_dma/design/cl_dma_pcis_slv.sv index a006f8b28..fc78d6034 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/design/cl_dma_pcis_slv.sv +++ b/hdk/cl/examples/cl_dram_hbm_dma/design/cl_dma_pcis_slv.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + module cl_dma_pcis_slv #( diff --git a/hdk/cl/examples/cl_dram_hbm_dma/design/cl_dram_dma_axi_mstr.sv b/hdk/cl/examples/cl_dram_hbm_dma/design/cl_dram_dma_axi_mstr.sv index f030c31ac..d41e8e539 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/design/cl_dram_dma_axi_mstr.sv +++ b/hdk/cl/examples/cl_dram_hbm_dma/design/cl_dram_dma_axi_mstr.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + // ----------------------------------------------------------------------------- // This module is an example of how to master transactions on a master port diff --git a/hdk/cl/examples/cl_dram_hbm_dma/design/cl_dram_dma_defines.vh b/hdk/cl/examples/cl_dram_hbm_dma/design/cl_dram_dma_defines.vh index 39f554e5c..a4bc494fa 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/design/cl_dram_dma_defines.vh +++ b/hdk/cl/examples/cl_dram_hbm_dma/design/cl_dram_dma_defines.vh @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + `ifndef CL_DRAM_DMA_DEFINES `define CL_DRAM_DMA_DEFINES diff --git a/hdk/cl/examples/cl_dram_hbm_dma/design/cl_dram_dma_pkg.sv b/hdk/cl/examples/cl_dram_hbm_dma/design/cl_dram_dma_pkg.sv index 8f28d2dfa..b50c9f1ae 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/design/cl_dram_dma_pkg.sv +++ b/hdk/cl/examples/cl_dram_hbm_dma/design/cl_dram_dma_pkg.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + `ifndef CL_DRAM_DMA_PKG `define CL_DRAM_DMA_PKG diff --git a/hdk/cl/examples/cl_dram_hbm_dma/design/cl_dram_hbm_dma.sv b/hdk/cl/examples/cl_dram_hbm_dma/design/cl_dram_hbm_dma.sv index ec947bb25..eb45a4a53 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/design/cl_dram_hbm_dma.sv +++ b/hdk/cl/examples/cl_dram_hbm_dma/design/cl_dram_hbm_dma.sv @@ -1,7 +1,7 @@ -//============================================================================= +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -13,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + //============================================================================= // Top level module file for CL_DRAM_HBM_DMA diff --git a/hdk/cl/examples/cl_dram_hbm_dma/design/cl_hbm_axi4.sv b/hdk/cl/examples/cl_dram_hbm_dma/design/cl_hbm_axi4.sv index ee6933a18..c998d5c40 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/design/cl_hbm_axi4.sv +++ b/hdk/cl/examples/cl_dram_hbm_dma/design/cl_hbm_axi4.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,13 +13,15 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ -//============================================================================= + +// ============================================================================ // CL_HBM_AXI4 // -------- // - Convert 512b 250MHz AXI4 to 450MHz AXI3 bus to feed into HBM // - Instantiate HBM Wrapper -//============================================================================= +// ============================================================================ module cl_hbm_axi4 #( diff --git a/hdk/cl/examples/cl_dram_hbm_dma/design/cl_hbm_wrapper.sv b/hdk/cl/examples/cl_dram_hbm_dma/design/cl_hbm_wrapper.sv index 10cd5ab0f..357fea11a 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/design/cl_hbm_wrapper.sv +++ b/hdk/cl/examples/cl_dram_hbm_dma/design/cl_hbm_wrapper.sv @@ -1,7 +1,7 @@ -//------------------------------------------------------------------------------------------------------------------------------- +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -13,9 +13,10 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. -// Restricted NDA Material -//------------------------------------------------------------------------------------------------------------------------------- -//=============================================================================================================================== +// ============================================================================ + + +// ============================================================================ // HBM Wrapper // - Wraper for HBM IP // - Implements an MMCM to generate 100MHz and 450MHz clock for the HBM IP. @@ -26,7 +27,6 @@ // by setting parameter AXI4_INTERFACE=1 // - Unused HBM ports are automatically tied off. // - Stats interface to reset the HBM, status check for HBM initialization. -// //------------------------------------------ // HBM Stats Interface Reset Routine: // // Issue HBM soft reset @@ -34,9 +34,7 @@ // write 0x0 @ addr 0x00 // // Poll for lock // poll bits[3:1] = 3'b111 @ addr 0x00 -// -// -//=============================================================================================================================== +// ============================================================================ module cl_hbm_wrapper #( diff --git a/hdk/cl/examples/cl_dram_hbm_dma/design/cl_id_defines.vh b/hdk/cl/examples/cl_dram_hbm_dma/design/cl_id_defines.vh index d957c7093..30faa2608 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/design/cl_id_defines.vh +++ b/hdk/cl/examples/cl_dram_hbm_dma/design/cl_id_defines.vh @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + // CL_SH_ID0 // - PCIe Vendor/Device ID Values @@ -29,5 +32,3 @@ // 15: 0: PCIe Subsystem Vendor ID // - A PCIe Subsystem/Subsystem Vendor ID of 0 (zero) is not valid `define CL_SH_ID1 32'h1D51_FEDC - - diff --git a/hdk/cl/examples/cl_dram_hbm_dma/design/cl_ila.sv b/hdk/cl/examples/cl_dram_hbm_dma/design/cl_ila.sv index e5f72271f..ce549ab6d 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/design/cl_ila.sv +++ b/hdk/cl/examples/cl_dram_hbm_dma/design/cl_ila.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + module cl_ila #( parameter DDR_A_PRESENT = 1) ( @@ -35,9 +38,9 @@ module cl_ila #( parameter DDR_A_PRESENT = 1) ( ); -//---------------------------- +//---------------------------- // Debug bridge -//---------------------------- +//---------------------------- cl_debug_bridge CL_DEBUG_BRIDGE ( .clk(aclk), .S_BSCAN_drck(drck), @@ -55,9 +58,9 @@ module cl_ila #( parameter DDR_A_PRESENT = 1) ( ); -//---------------------------- -// Debug Core ILA for dmm pcis AXI4 interface -//---------------------------- +//---------------------------- +// Debug Core ILA for dmm pcis AXI4 interface +//---------------------------- ila_1 CL_DMA_ILA_0 ( .clk (aclk), .probe0 (sh_cl_dma_pcis_q.awvalid), @@ -83,7 +86,7 @@ module cl_ila #( parameter DDR_A_PRESENT = 1) ( .probe20 (sh_cl_dma_pcis_q.arid), .probe21 (sh_cl_dma_pcis_q.awlen), .probe22 (sh_cl_dma_pcis_q.rlast), - .probe23 (3'b0), + .probe23 (3'b0), .probe24 (sh_cl_dma_pcis_q.rresp), .probe25 (sh_cl_dma_pcis_q.rid), .probe26 (sh_cl_dma_pcis_q.rvalid), @@ -109,9 +112,9 @@ generate begin:ddr_A_hookup if (DDR_A_PRESENT == 1) begin -//---------------------------- -// Debug Core ILA for DDRA AXI4 interface monitoring -//---------------------------- +//---------------------------- +// Debug Core ILA for DDRA AXI4 interface monitoring +//---------------------------- ila_1 CL_DDRA_ILA_0 ( .clk (aclk), .probe0 (lcl_cl_sh_ddra.awvalid), @@ -137,7 +140,7 @@ ila_1 CL_DDRA_ILA_0 ( .probe20 (lcl_cl_sh_ddra.arid[4:0]), .probe21 (lcl_cl_sh_ddra.awlen), .probe22 (lcl_cl_sh_ddra.rlast), - .probe23 (3'b0), + .probe23 (3'b0), .probe24 (lcl_cl_sh_ddra.rresp), .probe25 (lcl_cl_sh_ddra.rid[4:0]), .probe26 (lcl_cl_sh_ddra.rvalid), @@ -164,4 +167,3 @@ end //if(DDR_A_PRESET) end //label endgenerate endmodule - diff --git a/hdk/cl/examples/cl_dram_hbm_dma/design/cl_int_slv.sv b/hdk/cl/examples/cl_dram_hbm_dma/design/cl_int_slv.sv index 4e3892462..6b5a6947b 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/design/cl_int_slv.sv +++ b/hdk/cl/examples/cl_dram_hbm_dma/design/cl_int_slv.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + module cl_int_slv ( diff --git a/hdk/cl/examples/cl_dram_hbm_dma/design/cl_int_tst.sv b/hdk/cl/examples/cl_dram_hbm_dma/design/cl_int_tst.sv index 4bbee64cf..17abb970f 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/design/cl_int_tst.sv +++ b/hdk/cl/examples/cl_dram_hbm_dma/design/cl_int_tst.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + // CL Interrupt Test @@ -36,26 +39,26 @@ module cl_int_tst input sh_cl_msix_int_sent, input sh_cl_msix_int_ack `endif - + ); logic [7:0] cfg_vec_num; logic cfg_wr_stretch; logic cfg_rd_stretch; - + logic [7:0] cfg_addr_q; //Only care about lower 8-bits of address, upper bits are decoded somewhere else logic [31:0] cfg_wdata_q; logic [31:0] int_cfg_rdata; - - + + always_ff @(negedge rst_n or posedge clk) if (!rst_n) begin cfg_wr_stretch <= 0; cfg_rd_stretch <= 0; cfg_addr_q <= 0; - cfg_wdata_q <= 0; + cfg_wdata_q <= 0; end else begin @@ -70,44 +73,44 @@ module cl_int_tst //Readback mux always_ff @(negedge rst_n or posedge clk) - if (!rst_n) + if (!rst_n) tst_cfg_rdata <= 0; else tst_cfg_rdata <= int_cfg_rdata; - + //Ack for cycle always_ff @(negedge rst_n or posedge clk) if (!rst_n) tst_cfg_ack <= 0; else - tst_cfg_ack <= ((cfg_wr_stretch||cfg_rd_stretch) && !tst_cfg_ack); - + tst_cfg_ack <= ((cfg_wr_stretch||cfg_rd_stretch) && !tst_cfg_ack); + `ifndef NO_XDMA logic [15:0] int_ack; logic [15:0] int_trig; logic [15:0] int_wait; logic [15:0] int_done; - + // Addr 0x0 - Control Register // Bit 15:0 - Trigger (Write) / Interrupt Waiting (Read) // Bit 31:16 - Interrupt Done (W1C) assign int_cfg_rdata = {int_done, int_wait}; - - lib_pipe #(.WIDTH(32), .STAGES(4)) PIPE_IN (.clk (clk), - .rst_n (rst_n), + + lib_pipe #(.WIDTH(32), .STAGES(4)) PIPE_IN (.clk (clk), + .rst_n (rst_n), .in_bus({int_trig, sh_cl_irq_ack}), .out_bus({cl_sh_irq_req, int_ack}) ); - - - // Create the Edge + + + // Create the Edge always_ff @(negedge rst_n or posedge clk) if (!rst_n) int_trig <= '{default:'0}; else - for (int idx = 0; idx < 16; idx++) + for (int idx = 0; idx < 16; idx++) int_trig[idx] <= int_trig[idx] ? 1'b0 : cfg_wr_stretch && (cfg_addr_q[7:0] == 8'd0) && cfg_wdata_q[idx] ? 1'b1 : int_trig[idx]; @@ -117,7 +120,7 @@ module cl_int_tst if (!rst_n) int_wait <= '{default:'0}; else - for (int idx = 0; idx < 16; idx++) + for (int idx = 0; idx < 16; idx++) int_wait[idx] <= int_trig[idx] ? 1'b1 : int_wait[idx] && int_ack[idx] ? 1'b0 : int_wait[idx]; @@ -126,22 +129,22 @@ module cl_int_tst if (!rst_n) int_done <= '{default:'0}; else - for (int idx = 0; idx < 16; idx++) + for (int idx = 0; idx < 16; idx++) int_done[idx] <= int_trig[idx] ? 1'b0 : - cfg_wr_stretch && (cfg_addr_q[7:0] == 8'd0) && cfg_wdata_q[16+idx] ? 1'b0 : + cfg_wr_stretch && (cfg_addr_q[7:0] == 8'd0) && cfg_wdata_q[16+idx] ? 1'b0 : int_wait[idx] && int_ack[idx] ? 1'b1 : int_done[idx]; - - + + `else // !`ifndef NO_XDMA - + logic int_ack; logic int_sent; logic int_trig; logic int_wait; logic int_done; logic int_not_sent; - + // Addr 0x0 - Control Register // Bit 0 - Trigger Interrupt (WO) @@ -153,29 +156,29 @@ module cl_int_tst // Bit 31 - ACK (W1C) assign int_cfg_rdata = {int_done, int_not_sent, int_wait, 13'd0, cfg_vec_num[7:0], 8'd0}; - + // Pipeline inputs - lib_pipe #(.WIDTH(2), .STAGES(4)) PIPE_IN (.clk (clk), - .rst_n (rst_n), + lib_pipe #(.WIDTH(2), .STAGES(4)) PIPE_IN (.clk (clk), + .rst_n (rst_n), .in_bus({sh_cl_msix_int_ack, sh_cl_msix_int_sent}), .out_bus({int_ack, int_sent}) ); // Pipeline outputs - lib_pipe #(.WIDTH(8+1), .STAGES(4)) PIPE_OUT (.clk (clk), - .rst_n (rst_n), + lib_pipe #(.WIDTH(8+1), .STAGES(4)) PIPE_OUT (.clk (clk), + .rst_n (rst_n), .in_bus({int_trig, cfg_vec_num}), .out_bus({cl_sh_msix_int, cl_sh_msix_vec}) ); - + always_ff @(negedge rst_n or posedge clk) if (!rst_n) cfg_vec_num[7:0] <= 8'd0; else cfg_vec_num[7:0] <= cfg_wr_stretch && (cfg_addr_q[7:0] == 8'd0) ? cfg_wdata_q[15:8] : cfg_vec_num[7:0]; - // Create the Edge + // Create the Edge always_ff @(negedge rst_n or posedge clk) if (!rst_n) int_trig <= 1'b0; @@ -197,7 +200,7 @@ module cl_int_tst if (!rst_n) int_done <= 1'b0; else - int_done <= int_trig ? 1'b0 : + int_done <= int_trig ? 1'b0 : int_wait && int_ack ? 1'b1 : cfg_wr_stretch && (cfg_addr_q[7:0] == 8'd0) && cfg_wdata_q[31] ? 1'b0 : int_done; @@ -209,7 +212,7 @@ module cl_int_tst int_not_sent <= int_wait && int_ack ? ~int_sent : cfg_wr_stretch && (cfg_addr_q[7:0] == 8'd0) && cfg_wdata_q[30] ? 1'b0 : int_not_sent; - + `endif // !`ifndef NO_XDMA - + endmodule // cl_int_tst diff --git a/hdk/cl/examples/cl_dram_hbm_dma/design/cl_ocl_slv.sv b/hdk/cl/examples/cl_dram_hbm_dma/design/cl_ocl_slv.sv index 00c294735..c17a0e12e 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/design/cl_ocl_slv.sv +++ b/hdk/cl/examples/cl_dram_hbm_dma/design/cl_ocl_slv.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + module cl_ocl_slv ( diff --git a/hdk/cl/examples/cl_dram_hbm_dma/design/cl_pcim_mstr.sv b/hdk/cl/examples/cl_dram_hbm_dma/design/cl_pcim_mstr.sv index de96f4271..3dac3e017 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/design/cl_pcim_mstr.sv +++ b/hdk/cl/examples/cl_dram_hbm_dma/design/cl_pcim_mstr.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + module cl_pcim_mstr ( input aclk, diff --git a/hdk/cl/examples/cl_dram_hbm_dma/design/cl_sda_slv.sv b/hdk/cl/examples/cl_dram_hbm_dma/design/cl_sda_slv.sv index 84ee130a2..8e1c92122 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/design/cl_sda_slv.sv +++ b/hdk/cl/examples/cl_dram_hbm_dma/design/cl_sda_slv.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + module cl_sda_slv ( @@ -47,23 +50,23 @@ axi_bus_t sda_cl_q(); .s_axi_rresp (sda_cl_bus.rresp), .s_axi_rvalid (sda_cl_bus.rvalid), .s_axi_rready (sda_cl_bus.rready), - - .m_axi_awaddr (sda_cl_q.awaddr[31:0]), + + .m_axi_awaddr (sda_cl_q.awaddr[31:0]), .m_axi_awvalid (sda_cl_q.awvalid), .m_axi_awready (sda_cl_q.awready), - .m_axi_wdata (sda_cl_q.wdata[31:0]), + .m_axi_wdata (sda_cl_q.wdata[31:0]), .m_axi_wstrb (sda_cl_q.wstrb[3:0]), - .m_axi_wvalid (sda_cl_q.wvalid), - .m_axi_wready (sda_cl_q.wready), - .m_axi_bresp (sda_cl_q.bresp), - .m_axi_bvalid (sda_cl_q.bvalid), - .m_axi_bready (sda_cl_q.bready), - .m_axi_araddr (sda_cl_q.araddr[31:0]), + .m_axi_wvalid (sda_cl_q.wvalid), + .m_axi_wready (sda_cl_q.wready), + .m_axi_bresp (sda_cl_q.bresp), + .m_axi_bvalid (sda_cl_q.bvalid), + .m_axi_bready (sda_cl_q.bready), + .m_axi_araddr (sda_cl_q.araddr[31:0]), .m_axi_arvalid (sda_cl_q.arvalid), .m_axi_arready (sda_cl_q.arready), - .m_axi_rdata (sda_cl_q.rdata[31:0]), - .m_axi_rresp (sda_cl_q.rresp), - .m_axi_rvalid (sda_cl_q.rvalid), + .m_axi_rdata (sda_cl_q.rdata[31:0]), + .m_axi_rresp (sda_cl_q.rresp), + .m_axi_rvalid (sda_cl_q.rvalid), .m_axi_rready (sda_cl_q.rready) ); @@ -73,30 +76,29 @@ axi_bus_t sda_cl_q(); axil_slave AXIL_SLAVE( .clk(aclk), .rst_n(aresetn), - - .awvalid(sda_cl_q.awvalid), + + .awvalid(sda_cl_q.awvalid), .awaddr({54'b0, sda_cl_q.awaddr[9:0]}), .awready(sda_cl_q.awready), - + .wvalid(sda_cl_q.wvalid), .wdata(sda_cl_q.wdata[31:0]), .wstrb(sda_cl_q.wstrb[3:0]), .wready(sda_cl_q.wready), - - .bvalid(sda_cl_q.bvalid), + + .bvalid(sda_cl_q.bvalid), .bresp(sda_cl_q.bresp), .bready(sda_cl_q.bready), - + .arvalid(sda_cl_q.arvalid), .araddr({54'b0, sda_cl_q.araddr[9:0]}), .arready(sda_cl_q.arready), - + .rvalid(sda_cl_q.rvalid), .rdata(sda_cl_q.rdata[31:0]), .rresp(sda_cl_q.rresp), - + .rready(sda_cl_q.rready) ); endmodule - diff --git a/hdk/cl/examples/cl_dram_hbm_dma/design/cl_tst.sv b/hdk/cl/examples/cl_dram_hbm_dma/design/cl_tst.sv index 3adfddb1f..5affc0a12 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/design/cl_tst.sv +++ b/hdk/cl/examples/cl_dram_hbm_dma/design/cl_tst.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,7 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ module cl_tst #(parameter DATA_WIDTH=512, parameter NUM_RD_TAG=512) ( diff --git a/hdk/cl/examples/cl_dram_hbm_dma/design/cl_tst_scrb.sv b/hdk/cl/examples/cl_dram_hbm_dma/design/cl_tst_scrb.sv index 418d40ef0..72d1fdd98 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/design/cl_tst_scrb.sv +++ b/hdk/cl/examples/cl_dram_hbm_dma/design/cl_tst_scrb.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + module cl_tst_scrb #(parameter DATA_WIDTH=512, NUM_RD_TAG=512, @@ -70,7 +73,7 @@ module cl_tst_scrb #(parameter DATA_WIDTH=512, output slv_rvalid, output [10:0] slv_ruser, input logic slv_rready, - + output logic [15:0] awid, output logic [63:0] awaddr, output logic [7:0] awlen, @@ -153,22 +156,22 @@ module cl_tst_scrb #(parameter DATA_WIDTH=512, scrb_enable_q <= 1'b0; else scrb_enable_q <= scrb_enable; - + // Instance mem_scrb - mem_scrb + mem_scrb #(.DATA_WIDTH(DATA_WIDTH), .ID_WIDTH (6), .USER_WIDTH(11), .BURST_LEN_MINUS1 (SCRB_BURST_LEN_MINUS1), .MAX_ADDR(SCRB_MAX_ADDR) - ) + ) MEM_SCRB ( - + .clk(clk), .rst_n(rst_n), .awid(scrb_awid), - .awaddr(scrb_awaddr), + .awaddr(scrb_awaddr), .awlen(scrb_awlen), .awvalid(scrb_awvalid), .awuser(scrb_awuser), @@ -198,7 +201,7 @@ module cl_tst_scrb #(parameter DATA_WIDTH=512, .dbg_state(scrb_dbg_state), .dbg_addr (scrb_dbg_addr) - + ); end // block: gen_scrb_inst @@ -223,12 +226,12 @@ module cl_tst_scrb #(parameter DATA_WIDTH=512, assign scrb_aruser = '{default:'0}; assign scrb_arready = '{default:'0}; assign scrb_rready = '{default:'0}; - + end // block: gen_noscrb - + endgenerate - - + + // Instance cl_tst logic [8:0] atg_awid; logic [63:0] atg_awaddr; @@ -270,7 +273,7 @@ module cl_tst_scrb #(parameter DATA_WIDTH=512, cl_tst #(.DATA_WIDTH(DATA_WIDTH), .NUM_RD_TAG(NUM_RD_TAG) ) CL_TST ( - + .clk(clk), .rst_n(rst_n), @@ -282,9 +285,9 @@ module cl_tst_scrb #(parameter DATA_WIDTH=512, .tst_cfg_rdata(tst_cfg_rdata), .atg_enable(atg_enable), - + .awid(atg_awid), - .awaddr(atg_awaddr), + .awaddr(atg_awaddr), .awlen(atg_awlen), .awvalid(atg_awvalid), .awuser(atg_awuser), @@ -320,47 +323,47 @@ module cl_tst_scrb #(parameter DATA_WIDTH=512, ); -assign awid = scrb_enable ? {10'h0, scrb_awid} : +assign awid = scrb_enable ? {10'h0, scrb_awid} : atg_enable ? {7'h0, atg_awid} : slv_awid; -assign awaddr = scrb_enable ? scrb_awaddr : +assign awaddr = scrb_enable ? scrb_awaddr : atg_enable ? atg_awaddr : slv_awaddr; -assign awlen = scrb_enable ? scrb_awlen : +assign awlen = scrb_enable ? scrb_awlen : atg_enable ? atg_awlen : slv_awlen ; -assign awsize = scrb_enable ? 3'b110 : +assign awsize = scrb_enable ? 3'b110 : atg_enable ? 3'b110 : slv_awsize ; -assign awvalid = scrb_enable ? scrb_awvalid : +assign awvalid = scrb_enable ? scrb_awvalid : atg_enable ? atg_awvalid : slv_awvalid; -assign awuser = scrb_enable ? scrb_awuser : +assign awuser = scrb_enable ? scrb_awuser : atg_enable ? atg_awuser : slv_awuser; assign atg_awready = atg_enable & awready ; assign scrb_awready = scrb_enable & awready ; assign slv_awready = ~atg_enable & ~scrb_enable & awready; -assign wid = scrb_enable ? scrb_wid : +assign wid = scrb_enable ? scrb_wid : atg_enable ? atg_wid : {2'b0, slv_wid} ; -assign wdata = scrb_enable ? scrb_wdata : +assign wdata = scrb_enable ? scrb_wdata : atg_enable ? atg_wdata : slv_wdata; -assign wstrb = scrb_enable ? scrb_wstrb : +assign wstrb = scrb_enable ? scrb_wstrb : atg_enable ? atg_wstrb : slv_wstrb; -assign wlast = scrb_enable ? scrb_wlast : +assign wlast = scrb_enable ? scrb_wlast : atg_enable ? atg_wlast : slv_wlast; -assign wvalid = scrb_enable ? scrb_wvalid : +assign wvalid = scrb_enable ? scrb_wvalid : atg_enable ? atg_wvalid : slv_wvalid; assign atg_wready = atg_enable & wready ; assign scrb_wready = scrb_enable & wready ; assign slv_wready = ~atg_enable & ~scrb_enable & wready; - + assign atg_bid = bid[8:0] ; assign atg_bresp = bresp ; assign atg_bvalid = atg_enable & bvalid; @@ -373,26 +376,26 @@ assign slv_bid = bid ; assign slv_bresp = bresp ; assign slv_bvalid = ~scrb_enable & ~atg_enable & bvalid; assign slv_buser = buser[10:0] ; -assign bready = scrb_enable ? scrb_bready : +assign bready = scrb_enable ? scrb_bready : atg_enable ? atg_bready : slv_bready; -assign arid = scrb_enable ? {10'b0, scrb_arid} : +assign arid = scrb_enable ? {10'b0, scrb_arid} : atg_enable ? {7'b0, atg_arid} : slv_arid; -assign araddr = scrb_enable ? scrb_araddr : +assign araddr = scrb_enable ? scrb_araddr : atg_enable ? atg_araddr : slv_araddr; -assign arlen = scrb_enable ? scrb_arlen : +assign arlen = scrb_enable ? scrb_arlen : atg_enable ? atg_arlen : slv_arlen; assign arsize = scrb_enable ? 3'b110 : atg_enable ? 3'b110 : slv_arsize; -assign arvalid = scrb_enable ? scrb_arvalid : +assign arvalid = scrb_enable ? scrb_arvalid : atg_enable ? atg_arvalid : slv_arvalid; -assign aruser = scrb_enable ? scrb_aruser : +assign aruser = scrb_enable ? scrb_aruser : atg_enable ? atg_aruser : slv_aruser; assign atg_arready = atg_enable & arready ; @@ -417,10 +420,8 @@ assign slv_rresp = rresp ; assign slv_rlast = rlast ; assign slv_rvalid = ~scrb_enable & ~atg_enable & rvalid; assign slv_ruser = ruser[10:0] ; -assign rready = scrb_enable ? scrb_rready : +assign rready = scrb_enable ? scrb_rready : atg_enable ? atg_rready : slv_rready; - -endmodule // cl_tst_scrb - +endmodule // cl_tst_scrb diff --git a/hdk/cl/examples/cl_dram_hbm_dma/design/cl_vio.sv b/hdk/cl/examples/cl_dram_hbm_dma/design/cl_vio.sv index 66050937c..c82e8e4b3 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/design/cl_vio.sv +++ b/hdk/cl/examples/cl_dram_hbm_dma/design/cl_vio.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + module cl_vio ( input clk_extra_a1 @@ -19,7 +22,7 @@ module cl_vio ( ); // Counter running at 125MHz - + logic vo_cnt_enable; logic vo_cnt_load; logic vo_cnt_clear; @@ -40,7 +43,7 @@ module cl_vio ( logic vi_cnt_ge_watermark; logic [7:0] vi_tick_cnt = 0; logic [15:0] vi_cnt = 0; - + // Tick counter and main counter always @(posedge clk_extra_a1) begin @@ -66,9 +69,9 @@ module cl_vio ( vi_tick = (vi_tick_cnt >= vo_tick_value_q); vi_cnt_ge_watermark = (vi_cnt >= vo_cnt_watermark_q); - + end // always @ (posedge clk_extra_a1) - + vio_0 CL_VIO_0 ( .clk (clk_extra_a1), @@ -84,7 +87,7 @@ module cl_vio ( .probe_out5 (vo_cnt_load_value), .probe_out6 (vo_cnt_watermark) ); - + ila_vio_counter CL_VIO_ILA ( .clk (clk_extra_a1), .probe0 (vi_tick), @@ -102,4 +105,3 @@ module cl_vio ( endmodule - diff --git a/hdk/cl/examples/cl_dram_hbm_dma/design/mem_scrb.sv b/hdk/cl/examples/cl_dram_hbm_dma/design/mem_scrb.sv index bd0d11f6c..97c843fa0 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/design/mem_scrb.sv +++ b/hdk/cl/examples/cl_dram_hbm_dma/design/mem_scrb.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,7 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ module mem_scrb @@ -26,7 +28,7 @@ module mem_scrb ( input clk, input rst_n, - + //------------------------------------------------------ // DDR-4 Interface from CL (AXI-4) //------------------------------------------------------ @@ -61,37 +63,37 @@ module mem_scrb output logic scrb_done, output logic [2:0] dbg_state, - output logic [ADDR_WIDTH-1:0] dbg_addr + output logic [ADDR_WIDTH-1:0] dbg_addr ); localparam DATA_WIDTH_BYTES = DATA_WIDTH/8; - + typedef enum logic [2:0] {FSM_IDLE = 3'd0, FSM_START = 3'd1, FSM_AW = 3'd2, FSM_W = 3'd3, FSM_B = 3'd4, FSM_DONE = 3'd5} fsm_state_t; - + fsm_state_t curr_state; fsm_state_t next_state; logic [ADDR_WIDTH-1:0] curr_addr; logic [15:0] num_txn; logic scrb_enable_q; - + always_ff @(posedge clk or negedge rst_n) if (!rst_n) scrb_enable_q <= 1'b0; else scrb_enable_q <= scrb_enable; - + always_ff @(posedge clk or negedge rst_n) if (!rst_n) curr_state <= FSM_IDLE; - else + else curr_state <= ~scrb_enable_q ? FSM_IDLE : next_state; - + always_comb case (curr_state) FSM_IDLE : next_state = scrb_enable_q ? FSM_START : FSM_IDLE; @@ -108,7 +110,7 @@ module mem_scrb if (!rst_n) curr_addr <= {ADDR_WIDTH{1'b0}}; else - curr_addr <= (curr_state == FSM_START) ? ({ADDR_WIDTH{1'b0}}) : + curr_addr <= (curr_state == FSM_START) ? ({ADDR_WIDTH{1'b0}}) : (curr_state == FSM_W) && wready ? curr_addr + DATA_WIDTH_BYTES : curr_addr; always_ff @(posedge clk or negedge rst_n) @@ -117,7 +119,7 @@ module mem_scrb else num_txn <= (curr_state == FSM_AW) ? 16'd0 : (curr_state == FSM_W) && wready ? num_txn + 16'd1 : num_txn; - + assign awvalid = (curr_state == FSM_AW); assign awaddr = curr_addr; assign awid = {ID_WIDTH{1'b0}}; @@ -129,7 +131,7 @@ module mem_scrb assign wstrb = {(DATA_WIDTH/8){1'b1}}; assign wdata = {DATA_WIDTH{1'b0}}; assign wlast = (num_txn == BURST_LEN_MINUS1); - + assign arvalid = 1'b0; assign araddr = {ADDR_WIDTH{1'b0}}; assign arid = {ID_WIDTH{1'b0}}; @@ -143,19 +145,11 @@ module mem_scrb if (!rst_n) scrb_done <= 1'b0; else - scrb_done <= (curr_state == FSM_IDLE) ? 1'b0: + scrb_done <= (curr_state == FSM_IDLE) ? 1'b0: (curr_state == FSM_DONE) ? 1'b1 : scrb_done; // Debug outputs assign dbg_state = curr_state; assign dbg_addr = curr_addr; - -endmodule // mem_scrb - - - - - - - +endmodule // mem_scrb diff --git a/hdk/cl/examples/cl_dram_hbm_dma/software/include/cl_dram_dma.h b/hdk/cl/examples/cl_dram_hbm_dma/software/include/cl_dram_dma.h index c35a76f66..7d7a29f97 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/software/include/cl_dram_dma.h +++ b/hdk/cl/examples/cl_dram_hbm_dma/software/include/cl_dram_dma.h @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -11,4 +12,5 @@ // or in the "license" file accompanying this file. This file is distributed on // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and -// limitations under the License. \ No newline at end of file +// limitations under the License. +// ============================================================================ diff --git a/hdk/cl/examples/cl_dram_hbm_dma/software/include/sh_dpi_tasks.h b/hdk/cl/examples/cl_dram_hbm_dma/software/include/sh_dpi_tasks.h index 9c7a39127..f74162e62 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/software/include/sh_dpi_tasks.h +++ b/hdk/cl/examples/cl_dram_hbm_dma/software/include/sh_dpi_tasks.h @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + #ifndef SH_DPI_TASKS #define SH_DPI_TASKS diff --git a/hdk/cl/examples/cl_dram_hbm_dma/software/runtime/Makefile b/hdk/cl/examples/cl_dram_hbm_dma/software/runtime/Makefile index 2dc5335b4..c8e6d6438 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/software/runtime/Makefile +++ b/hdk/cl/examples/cl_dram_hbm_dma/software/runtime/Makefile @@ -1,6 +1,7 @@ +# ============================================================================= # Amazon FPGA Hardware Development Kit # -# Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Amazon Software License (the "License"). You may not use # this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or # implied. See the License for the specific language governing permissions and # limitations under the License. +# ============================================================================= + INCLUDES = -I$(SDK_DIR)/userspace/include diff --git a/hdk/cl/examples/cl_dram_hbm_dma/software/runtime/test_dram_dma_common.c b/hdk/cl/examples/cl_dram_hbm_dma/software/runtime/test_dram_dma_common.c index c6ff7c088..79b0410a7 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/software/runtime/test_dram_dma_common.c +++ b/hdk/cl/examples/cl_dram_hbm_dma/software/runtime/test_dram_dma_common.c @@ -1,19 +1,20 @@ -/* - * Amazon FPGA Hardware Development Kit - * - * Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Amazon Software License (the "License"). You may not use - * this file except in compliance with the License. A copy of the License is - * located at - * - * http://aws.amazon.com/asl/ - * - * or in the "license" file accompanying this file. This file is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or - * implied. See the License for the specific language governing permissions and - * limitations under the License. - */ +// ============================================================================ +// Amazon FPGA Hardware Development Kit +// +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// +// Licensed under the Amazon Software License (the "License"). You may not use +// this file except in compliance with the License. A copy of the License is +// located at +// +// http://aws.amazon.com/asl/ +// +// or in the "license" file accompanying this file. This file is distributed on +// an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or +// implied. See the License for the specific language governing permissions and +// limitations under the License. +// ============================================================================ + #include #include @@ -71,7 +72,7 @@ uint64_t buffer_compare(uint8_t *bufa, uint8_t *bufb, size_t i; uint64_t differ = 0; for (i = 0; i < buffer_size; ++i) { - + if (bufa[i] != bufb[i]) { differ += 1; } diff --git a/hdk/cl/examples/cl_dram_hbm_dma/software/runtime/test_dram_dma_common.h b/hdk/cl/examples/cl_dram_hbm_dma/software/runtime/test_dram_dma_common.h index 6fd188728..62018c60a 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/software/runtime/test_dram_dma_common.h +++ b/hdk/cl/examples/cl_dram_hbm_dma/software/runtime/test_dram_dma_common.h @@ -1,19 +1,20 @@ -/* - * Amazon FPGA Hardware Development Kit - * - * Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Amazon Software License (the "License"). You may not use - * this file except in compliance with the License. A copy of the License is - * located at - * - * http://aws.amazon.com/asl/ - * - * or in the "license" file accompanying this file. This file is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or - * implied. See the License for the specific language governing permissions and - * limitations under the License. - */ +// ============================================================================ +// Amazon FPGA Hardware Development Kit +// +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// +// Licensed under the Amazon Software License (the "License"). You may not use +// this file except in compliance with the License. A copy of the License is +// located at +// +// http://aws.amazon.com/asl/ +// +// or in the "license" file accompanying this file. This file is distributed on +// an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or +// implied. See the License for the specific language governing permissions and +// limitations under the License. +// ============================================================================ + #pragma once diff --git a/hdk/cl/examples/cl_dram_hbm_dma/software/runtime/test_dram_dma_hwsw_cosim.c b/hdk/cl/examples/cl_dram_hbm_dma/software/runtime/test_dram_dma_hwsw_cosim.c index 230148e29..b0983b4d0 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/software/runtime/test_dram_dma_hwsw_cosim.c +++ b/hdk/cl/examples/cl_dram_hbm_dma/software/runtime/test_dram_dma_hwsw_cosim.c @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + #include #include @@ -62,7 +65,7 @@ int test_main(uint32_t *exit_code) #elif defined(SV_TEST) void test_main(uint32_t *exit_code) -#else +#else int main(int argc, char **argv) #endif diff --git a/hdk/cl/examples/cl_dram_hbm_dma/software/runtime/test_dram_hbm_dma.c b/hdk/cl/examples/cl_dram_hbm_dma/software/runtime/test_dram_hbm_dma.c index 2a25131c8..b9d58cbda 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/software/runtime/test_dram_hbm_dma.c +++ b/hdk/cl/examples/cl_dram_hbm_dma/software/runtime/test_dram_hbm_dma.c @@ -1,19 +1,20 @@ -/* - * Amazon FPGA Hardware Development Kit - * - * Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Amazon Software License (the "License"). You may not use - * this file except in compliance with the License. A copy of the License is - * located at - * - * http://aws.amazon.com/asl/ - * - * or in the "license" file accompanying this file. This file is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or - * implied. See the License for the specific language governing permissions and - * limitations under the License. - */ +// ============================================================================ +// Amazon FPGA Hardware Development Kit +// +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// +// Licensed under the Amazon Software License (the "License"). You may not use +// this file except in compliance with the License. A copy of the License is +// located at +// +// http://aws.amazon.com/asl/ +// +// or in the "license" file accompanying this file. This file is distributed on +// an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or +// implied. See the License for the specific language governing permissions and +// limitations under the License. +// ============================================================================ + #include #include diff --git a/hdk/cl/examples/cl_dram_hbm_dma/software/src/test_dram_dma.c b/hdk/cl/examples/cl_dram_hbm_dma/software/src/test_dram_dma.c index 8b230ba34..acbb39c30 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/software/src/test_dram_dma.c +++ b/hdk/cl/examples/cl_dram_hbm_dma/software/src/test_dram_dma.c @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + #include #include diff --git a/hdk/cl/examples/cl_dram_hbm_dma/software/src/test_null.c b/hdk/cl/examples/cl_dram_hbm_dma/software/src/test_null.c index 6532ab75c..04c278623 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/software/src/test_null.c +++ b/hdk/cl/examples/cl_dram_hbm_dma/software/src/test_null.c @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,7 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ #include diff --git a/hdk/cl/examples/cl_dram_hbm_dma/verif/README.md b/hdk/cl/examples/cl_dram_hbm_dma/verif/README.md index 517f04a04..400acf4e8 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/verif/README.md +++ b/hdk/cl/examples/cl_dram_hbm_dma/verif/README.md @@ -1,8 +1,45 @@ -This readme provides information about the simulation environment for the cl_dram_hbm_dma example. For more details about overall HDK simulation environment and CL bringup in simulation please refer to the [RTL Simulation Guide for HDK Design Flow](../../../../docs/RTL_Simulation_Guide_for_HDK_Design_Flow.md) - -# DRAM HBM DMA CL example simulation - -The system verilog simulation tests can be run from the [$CL_DIR/verif/scripts](./scripts) directory with all supported simulators (HBM is only supported in VCS & QUESTA). You can run tests by calling the make target for that test located in [$CL_DIR/verif/scripts/Makefile.tests](./scripts/Makefile.tests): +# CL_DRAM_HBM_DMA Example Simulation + +## Table of Contents + +- [CL\_DRAM\_HBM\_DMA Example Simulation](#cl_dram_hbm_dma-example-simulation) + - [Table of Contents](#table-of-contents) + - [Overview](#overview) + - [Dump Waves](#dump-waves) + - [SystemVerliog Tests](#systemverliog-tests) + - [test\_clk\_recipe.sv](#test_clk_recipesv) + - [test\_ddr\_peek\_poke.sv](#test_ddr_peek_pokesv) + - [test\_ddr.sv](#test_ddrsv) + - [test\_hbm.sv](#test_hbmsv) + - [test\_dram\_dma.sv](#test_dram_dmasv) + - [test\_dram\_dma\_rnd.sv](#test_dram_dma_rndsv) + - [test\_dma\_pcim\_concurrent.sv](#test_dma_pcim_concurrentsv) + - [test\_dma\_pcis\_concurrent.sv](#test_dma_pcis_concurrentsv) + - [test\_dma\_sda\_concurrent.sv](#test_dma_sda_concurrentsv) + - [test\_dram\_dma\_4k\_crossing.sv](#test_dram_dma_4k_crossingsv) + - [test\_dram\_dma\_allgn\_addr\_4k.sv](#test_dram_dma_allgn_addr_4ksv) + - [test\_dram\_dma\_single\_beat\_4k.sv](#test_dram_dma_single_beat_4ksv) + - [test\_dram\_dma\_axi\_mstr.sv](#test_dram_dma_axi_mstrsv) + - [test\_int.sv](#test_intsv) + - [test\_peek\_poke.sv](#test_peek_pokesv) + - [test\_peek\_poke\_wc.sv](#test_peek_poke_wcsv) + - [test\_peek\_poke\_len.sv](#test_peek_poke_lensv) + - [test\_peek\_poke\_rnd\_lengths.sv](#test_peek_poke_rnd_lengthssv) + - [test\_peek\_poke\_pcis\_axsize.sv](#test_peek_poke_pcis_axsizesv) + - [test\_ddr\_peek\_bdr\_walking\_ones](#test_ddr_peek_bdr_walking_ones) + - [test\_sda.sv](#test_sdasv) + - [test\_null.sv](#test_nullsv) + - [AXI\_MEMORY\_MODEL Mode Simulations](#axi_memory_model-mode-simulations) + - [test\_dram\_dma\_mem\_model\_bdr\_wr](#test_dram_dma_mem_model_bdr_wr) + - [test\_dram\_dma\_mem\_model\_bdr\_rd](#test_dram_dma_mem_model_bdr_rd) + - [DDR Backdoor Loading](#ddr-backdoor-loading) + - [HW/SW Co-Simulation Test](#hwsw-co-simulation-test) + +## Overview + +This readme provides information about the simulation environment for the `cl_dram_hbm_dma` example. For more details about overall HDK simulation environment and CL bringup in simulation please refer to the [RTL Simulation Guide for HDK Design Flow](../../../../docs/RTL_Simulation_Guide_for_HDK_Design_Flow.md) + +SystemVerilog (SV) simulations can be run from the `$CL_DIR/verif/scripts/` directory with all supported simulators (HBM simulation using VCS & QUESTA is strongly recommended). You can run tests by calling the make target for that test located in `$CL_DIR/verif/scripts/Makefile.tests`: ```bash make test_ddr # Runs with XSIM by default @@ -12,21 +49,15 @@ make test_ddr QUESTA=1 make test_hbm # Runs with VCS by default ``` -Alternatively, you can run each test by setting TEST= followed by the environment variables required to run that test. - -**NOTE: CL_DRAM_HBM_DMA does not currently have a datapath to all 64 GB of DDR. Only the first 32GB is accessible.** - +Alternatively, you can run each test by setting `TEST=\` followed by the environment variables required to run that test. ```bash make TEST=test_dram_dma # Runs with XSIM by default make TEST=test_dram_dma VCS=1 make TEST=test_dram_dma QUESTA=1 -# To Run simulations with a 32 GB DDR DIMM (without user-controlled auto-precharge mode) -make TEST=test_dram_dma USE_32GB_DDR_DIMM=1 - -# To Run simulations with a 32 GB DDR DIMM (with user-controlled auto-precharge mode) -make TEST=test_dram_dma USE_AP_32GB_DDR_DIMM=1 +# To Run simulations with a 64 GB DDR DIMM (with user-controlled auto-precharge mode) +make TEST=test_dram_dma USE_AP_64GB_DDR_DIMM=1 # To Run Simulations in AXI_MEMORY_MODEL mode make TEST=test_dram_dma AXI_MEMORY_MODEL=1 # Runs with XSIM by default in AXI_MEMORY_MODEL mode @@ -46,7 +77,7 @@ test_ddr_peek_bdr_walking_ones **NOTE**: Please refer to [Supported_DDR_Modes.md](./../../../../docs/Supported_DDR_Modes.md) for details on supported DDR configurations. -The HW/SW co-simulation tests can be run from the [verif/scripts](scripts) directory with all supported simulators: +The HW/SW co-simulation tests can be run from the `verif/scripts/` directory with all supported simulators: ```bash make C_TEST=test_dram_dma_hwsw_cosim # Runs with XSIM by default @@ -66,9 +97,9 @@ Note that the appropriate simulators must be installed. For information about how to dump waves with XSIM or VCS, please refer to [debugging-custom-logic-using-the-aws-hdk](../../../../docs/RTL_Simulation_Guide_for_HDK_Design_Flow.md#) -## System Verliog Tests +## SystemVerliog Tests -The system verilog tests are located at [verif/tests](tests). Most tests include `base_test_utils.svh` which includes common signals and tasks used across tests. Please refer to this file for the DPI-C tasks used. Information about each test can be found below. +The SystemVerilog test cases are located at `verif/tests/`. Most tests include `base_test_utils.svh` which includes common signals and tasks used across tests. Please refer to this file for the DPI-C tasks used. Information about each test can be found below. ### test_clk_recipe.sv This test programs valid clock recipes defined within and verifies the corresponding clock frequencies. @@ -127,18 +158,6 @@ This test programs tester block to do PCIM reads and writes with random lengths ### test_peek_poke_pcis_axsize.sv This test does PCIS peek and poke with different sizes. Although shell model allows different size transfers on PCIS interface, Shell only supports transfer of size 6 on PCIS interface. -## _AXI_MEMORY_MODEL mode simulations_ -AXI_MEMORY_MODEL mode can be used for better simulation perfornmance. AXI_MEMORY_MODEL mode enables a test to run with AXI memory models instead of DDR memory. The documentation can be found in AXI memory model section at [RTL simulation guide](../../../../docs/RTL_Simulation_Guide_for_HDK_Design_Flow.md). Any test that accesses DDR memory can be run in AXI_MEMORY_MODEL mode. Below are some example tests for ECC and backdoor loading support features of AXI memory model. - -### test_dram_dma_mem_model_bdr_wr -This test backdoor writes AXI memory model, reads through frontdoor and checks that the data matches. - -### test_dram_dma_mem_model_bdr_rd -This test backdoor reads AXI memory model, writes through frontdoor and checks that the data matches. - -## _DDR backdoor loading_ -The tests below use backdoor loading to populate DDR memory. The description of DDR backdoor loading can be found in DDR backdoor loading support section at [RTL simulation guide](../../../../docs/RTL_Simulation_Guide_for_HDK_Design_Flow.md). - ### test_ddr_peek_bdr_walking_ones DDR test which uses backdoor loading to populate DDR memory. The test writes data(walking ones) for different addresses. The test backdoor loads DDR memory and reads through frontdoor and checks that the data matches. @@ -146,22 +165,22 @@ DDR test which uses backdoor loading to populate DDR memory. The test writes dat This test does transfers to different addresses on SDA AXIL interface. ### test_null.sv -test_null is not an actual test. This is a base system verilog file needed for HW/SW co-simulation +test_null is not an actual test. This is a base SV file needed for HW/SW co-simulation -## HW/SW co-simulation Test +## AXI_MEMORY_MODEL Mode Simulations -The software test with HW/SW co-simulation support [test_dram_dma_hwsw_cosim.c](../software/runtime/test_dram_dma_hwsw_cosim.c) can be found at [software/runtime](../software/runtime). For Information about how HW/SW co-simulation support can be added to a software test please refer to "Code changes to enable HW/SW co-simulation" section in [RTL simulation guide](../../../../docs/RTL_Simulation_Guide_for_HDK_Design_Flow.md). +AXI_MEMORY_MODEL mode can be used for better simulation performance. AXI_MEMORY_MODEL mode enables a test to run with AXI memory models instead of DDR memory. The documentation can be found in AXI memory model section at [RTL simulation guide](../../../../docs/RTL_Simulation_Guide_for_HDK_Design_Flow.md). Any test that accesses DDR memory can be run in AXI_MEMORY_MODEL mode. Below are some example tests for ECC and backdoor loading support features of AXI memory model. -## Regressions +### test_dram_dma_mem_model_bdr_wr +This test backdoor writes AXI memory model, reads through frontdoor and checks that the data matches. -A regression with full coverage can be run with the following commands +### test_dram_dma_mem_model_bdr_rd +This test backdoor reads AXI memory model, writes through frontdoor and checks that the data matches. -```bash -make regression =1 -make regression AXI_MEMORY_MODEL=1 =1 -make regression ECC_DIRECT=1 =1 -make regression ECC_RAND=1 =1 -make regression DDR_BKDR=1 =1 -make regression AXI_MEMORY_MODEL=1 ECC_DIRECT=1 =1 -make regression AXI_MEMORY_MODEL=1 ECC_RAND=1 =1 -``` +## DDR Backdoor Loading + +The description of DDR backdoor loading can be found in DDR backdoor loading support section at [RTL simulation guide](../../../../docs/RTL_Simulation_Guide_for_HDK_Design_Flow.md). + +## HW/SW Co-Simulation Test + +The software test with HW/SW co-simulation support [test_dram_dma_hwsw_cosim.c](../software/runtime/test_dram_dma_hwsw_cosim.c) can be found at `software/runtime/`. For Information about how HW/SW co-simulation support can be added to a software test please refer to "Code changes to enable HW/SW co-simulation" section in [RTL simulation guide](../../../../docs/RTL_Simulation_Guide_for_HDK_Design_Flow.md). diff --git a/hdk/cl/examples/cl_dram_hbm_dma/verif/scripts/Makefile b/hdk/cl/examples/cl_dram_hbm_dma/verif/scripts/Makefile index 2f8667c36..0d3cc12a0 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/verif/scripts/Makefile +++ b/hdk/cl/examples/cl_dram_hbm_dma/verif/scripts/Makefile @@ -1,6 +1,7 @@ +# ============================================================================= # Amazon FPGA Hardware Development Kit # -# Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Amazon Software License (the "License"). You may not use # this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or # implied. See the License for the specific language governing permissions and # limitations under the License. +# ============================================================================= + ifndef HDK_COMMON_DIR $(error Environment variable HDK_COMMON_DIR not set. Please source hdk_setup.sh) diff --git a/hdk/cl/examples/cl_dram_hbm_dma/verif/scripts/Makefile.tests b/hdk/cl/examples/cl_dram_hbm_dma/verif/scripts/Makefile.tests index c12c1fc2d..ae44fb2bd 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/verif/scripts/Makefile.tests +++ b/hdk/cl/examples/cl_dram_hbm_dma/verif/scripts/Makefile.tests @@ -1,7 +1,25 @@ +# ============================================================================= +# Amazon FPGA Hardware Development Kit +# +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# +# Licensed under the Amazon Software License (the "License"). You may not use +# this file except in compliance with the License. A copy of the License is +# located at +# +# http://aws.amazon.com/asl/ +# +# or in the "license" file accompanying this file. This file is distributed on +# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or +# implied. See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================= + + test_dram_dma_axi_mstr: TEST=test_dram_dma_axi_mstr test_dram_dma_axi_mstr: all -#Not supporting until XSIM related issues fixed +#Not supporting until XSIM related issues fixed test_dram_dma_4k_crossing: TEST=test_dram_dma_4k_crossing test_dram_dma_4k_crossing: check_xsim all diff --git a/hdk/cl/examples/cl_dram_hbm_dma/verif/scripts/top.questa.f b/hdk/cl/examples/cl_dram_hbm_dma/verif/scripts/top.questa.f index 24b74ff8a..6eff88d80 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/verif/scripts/top.questa.f +++ b/hdk/cl/examples/cl_dram_hbm_dma/verif/scripts/top.questa.f @@ -1,6 +1,7 @@ +# ============================================================================= # Amazon FPGA Hardware Development Kit # -# Copyright 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Amazon Software License (the "License"). You may not use # this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or # implied. See the License for the specific language governing permissions and # limitations under the License. +# ============================================================================= + +define+CL_NAME=cl_dram_hbm_dma +define+DISABLE_VJTAG_DEBUG diff --git a/hdk/cl/examples/cl_dram_hbm_dma/verif/scripts/top.vcs.f b/hdk/cl/examples/cl_dram_hbm_dma/verif/scripts/top.vcs.f index 24b74ff8a..6eff88d80 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/verif/scripts/top.vcs.f +++ b/hdk/cl/examples/cl_dram_hbm_dma/verif/scripts/top.vcs.f @@ -1,6 +1,7 @@ +# ============================================================================= # Amazon FPGA Hardware Development Kit # -# Copyright 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Amazon Software License (the "License"). You may not use # this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or # implied. See the License for the specific language governing permissions and # limitations under the License. +# ============================================================================= + +define+CL_NAME=cl_dram_hbm_dma +define+DISABLE_VJTAG_DEBUG diff --git a/hdk/cl/examples/cl_dram_hbm_dma/verif/scripts/top.vivado.f b/hdk/cl/examples/cl_dram_hbm_dma/verif/scripts/top.vivado.f index dc916e85a..26402da32 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/verif/scripts/top.vivado.f +++ b/hdk/cl/examples/cl_dram_hbm_dma/verif/scripts/top.vivado.f @@ -1,6 +1,7 @@ +# ============================================================================= # Amazon FPGA Hardware Development Kit # -# Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Amazon Software License (the "License"). You may not use # this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or # implied. See the License for the specific language governing permissions and # limitations under the License. +# ============================================================================= + --define VIVADO_SIM diff --git a/hdk/cl/examples/cl_dram_hbm_dma/verif/scripts/top.xsim.f b/hdk/cl/examples/cl_dram_hbm_dma/verif/scripts/top.xsim.f index 9338ac7a5..3cfc285ff 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/verif/scripts/top.xsim.f +++ b/hdk/cl/examples/cl_dram_hbm_dma/verif/scripts/top.xsim.f @@ -1,6 +1,7 @@ +# ============================================================================= # Amazon FPGA Hardware Development Kit # -# Copyright 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Amazon Software License (the "License"). You may not use # this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or # implied. See the License for the specific language governing permissions and # limitations under the License. +# ============================================================================= + -define CL_NAME=cl_dram_hbm_dma -define DISABLE_VJTAG_DEBUG diff --git a/hdk/cl/examples/cl_dram_hbm_dma/verif/scripts/waves.tcl b/hdk/cl/examples/cl_dram_hbm_dma/verif/scripts/waves.tcl index 4b14d0da6..584895d66 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/verif/scripts/waves.tcl +++ b/hdk/cl/examples/cl_dram_hbm_dma/verif/scripts/waves.tcl @@ -1,6 +1,7 @@ +# ============================================================================= # Amazon FPGA Hardware Development Kit # -# Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Amazon Software License (the "License"). You may not use # this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or # implied. See the License for the specific language governing permissions and # limitations under the License. +# ============================================================================= + set curr_wave [current_wave_config] if { [string length $curr_wave] == 0 } { @@ -23,5 +26,5 @@ if { [string length $curr_wave] == 0 } { } } -run 200 us +run 200 us quit diff --git a/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/base_test_utils.svh b/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/base_test_utils.svh index b1a2eaca1..b6062699e 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/base_test_utils.svh +++ b/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/base_test_utils.svh @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,7 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ `include "common_base_test.svh" @@ -23,9 +25,4 @@ `define DDR_LEVEL_3 `_24_GB `define HBM_BASE_ADDR `_32_GB -`ifdef AWS_SIM_64GB_DDR - $fatal(1, "CL_DRAM_HBM_DMA does not yet support 64GB DDR simulations"); -`endif - `include "cl_dram_hbm_dma_utils.svh" - diff --git a/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/cl_dram_hbm_dma_utils.svh b/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/cl_dram_hbm_dma_utils.svh index f2548ce71..a7c517164 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/cl_dram_hbm_dma_utils.svh +++ b/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/cl_dram_hbm_dma_utils.svh @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,7 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ task initialize_ddr(); diff --git a/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_clk_recipe.sv b/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_clk_recipe.sv index 8dc7cde9a..49512147f 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_clk_recipe.sv +++ b/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_clk_recipe.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,8 +13,7 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. -// Description: This test tests that the different clock recipes generated by -// shell model are accurate. +// ============================================================================ module test_clk_recipe(); @@ -25,32 +25,32 @@ module test_clk_recipe(); $display("power up with Clock Recipe A0, B0, C0 \n"); //power up with Clock Recipe A0, B0, C0 - tb.power_up(.clk_recipe_a(ClockRecipe::A0), - .clk_recipe_b(ClockRecipe::B0), + tb.power_up(.clk_recipe_a(ClockRecipe::A0), + .clk_recipe_b(ClockRecipe::B0), .clk_recipe_c(ClockRecipe::C0)); // delay before checking the clocks #500ns; - + //Starts checking clock frequency. tb.set_chk_clk_freq(.chk_freq(1'b1)); - + #2000ns; //Stop checking clock frequency. tb.set_chk_clk_freq(.chk_freq(1'b0)); - + // Power down tb.power_down(); #500ns; //power up with Clock Recipe A1, B0, C0 $display("power up with Clock Recipe A1, B0, C0 \n"); - tb.power_up(.clk_recipe_a(ClockRecipe::A1), - .clk_recipe_b(ClockRecipe::B0), + tb.power_up(.clk_recipe_a(ClockRecipe::A1), + .clk_recipe_b(ClockRecipe::B0), .clk_recipe_c(ClockRecipe::C0)); - + // delay before checking the clocks #500ns; @@ -61,17 +61,17 @@ module test_clk_recipe(); //Stop checking clock frequency. tb.set_chk_clk_freq(.chk_freq(1'b0)); - + tb.power_down(); #500ns; //power up with Clock Recipe A2, B1, C0 $display("power up with Clock Recipe A2, B1, C0 \n"); - tb.power_up(.clk_recipe_a(ClockRecipe::A2), - .clk_recipe_b(ClockRecipe::B1), + tb.power_up(.clk_recipe_a(ClockRecipe::A2), + .clk_recipe_b(ClockRecipe::B1), .clk_recipe_c(ClockRecipe::C0)); - + // delay before checking the clocks #500ns; @@ -82,17 +82,17 @@ module test_clk_recipe(); //Stop checking clock frequency. tb.set_chk_clk_freq(.chk_freq(1'b0)); - + tb.power_down(); #500ns; //power up with Clock Recipe A3, B1, C1 $display("power up with Clock Recipe A3, B1, C1 \n"); - tb.power_up(.clk_recipe_a(ClockRecipe::A3), - .clk_recipe_b(ClockRecipe::B1), + tb.power_up(.clk_recipe_a(ClockRecipe::A3), + .clk_recipe_b(ClockRecipe::B1), .clk_recipe_c(ClockRecipe::C1)); - + // delay before checking the clocks #500ns; @@ -103,17 +103,17 @@ module test_clk_recipe(); //Stop checking clock frequency. tb.set_chk_clk_freq(.chk_freq(1'b0)); - + tb.power_down(); #500ns; //power up with Clock Recipe A3, B2, C2 $display("power up with Clock Recipe A3, B2, C2 \n"); - tb.power_up(.clk_recipe_a(ClockRecipe::A3), - .clk_recipe_b(ClockRecipe::B2), + tb.power_up(.clk_recipe_a(ClockRecipe::A3), + .clk_recipe_b(ClockRecipe::B2), .clk_recipe_c(ClockRecipe::C2)); - + // delay before checking the clocks #500ns; @@ -124,17 +124,17 @@ module test_clk_recipe(); //Stop checking clock frequency. tb.set_chk_clk_freq(.chk_freq(1'b0)); - + tb.power_down(); #500ns; //power up with Clock Recipe A3, B3, C3 $display("power up with Clock Recipe A3, B3, C3 \n"); - tb.power_up(.clk_recipe_a(ClockRecipe::A3), - .clk_recipe_b(ClockRecipe::B3), + tb.power_up(.clk_recipe_a(ClockRecipe::A3), + .clk_recipe_b(ClockRecipe::B3), .clk_recipe_c(ClockRecipe::C3)); - + // delay before checking the clocks #500ns; @@ -145,17 +145,17 @@ module test_clk_recipe(); //Stop checking clock frequency. tb.set_chk_clk_freq(.chk_freq(1'b0)); - + tb.power_down(); #500ns; //power up with Clock Recipe A3, B4, C3 $display("power up with Clock Recipe A3, B4, C3 \n"); - tb.power_up(.clk_recipe_a(ClockRecipe::A3), - .clk_recipe_b(ClockRecipe::B4), + tb.power_up(.clk_recipe_a(ClockRecipe::A3), + .clk_recipe_b(ClockRecipe::B4), .clk_recipe_c(ClockRecipe::C3)); - + // delay before checking the clocks #500ns; @@ -166,17 +166,17 @@ module test_clk_recipe(); //Stop checking clock frequency. tb.set_chk_clk_freq(.chk_freq(1'b0)); - + tb.power_down(); #500ns; //power up with Clock Recipe A3, B5, C3 $display("power up with Clock Recipe A3, B5, C3 \n"); - tb.power_up(.clk_recipe_a(ClockRecipe::A3), - .clk_recipe_b(ClockRecipe::B5), + tb.power_up(.clk_recipe_a(ClockRecipe::A3), + .clk_recipe_b(ClockRecipe::B5), .clk_recipe_c(ClockRecipe::C3)); - + // delay before checking the clocks #500ns; @@ -187,22 +187,22 @@ module test_clk_recipe(); //Stop checking clock frequency. tb.set_chk_clk_freq(.chk_freq(1'b0)); - + tb.power_down(); //Stop checking clock frequency. tb.set_chk_clk_freq(.chk_freq(1'b0)); - + tb.power_down(); #500ns; //power up with Clock Recipe A3, B6, C3 $display("power up with Clock Recipe A3, B6, C3 \n"); - tb.power_up(.clk_recipe_a(ClockRecipe::A3), - .clk_recipe_b(ClockRecipe::B6), + tb.power_up(.clk_recipe_a(ClockRecipe::A3), + .clk_recipe_b(ClockRecipe::B6), .clk_recipe_c(ClockRecipe::C3)); - + // delay before checking the clocks #500ns; @@ -213,9 +213,9 @@ module test_clk_recipe(); //Stop checking clock frequency. tb.set_chk_clk_freq(.chk_freq(1'b0)); - + tb.power_down(); - + if (tb.chk_clk_err_cnt()) begin error_count++; $error("[%t] : Observed clock errors", $realtime); @@ -225,5 +225,5 @@ module test_clk_recipe(); $finish; end // initial begin - + endmodule // test_clk_recipe diff --git a/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_ddr.sv b/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_ddr.sv index a88d29008..b65f230ce 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_ddr.sv +++ b/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_ddr.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + module test_ddr(); diff --git a/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_ddr_peek_bdr_walking_ones.sv b/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_ddr_peek_bdr_walking_ones.sv index b228282e9..9dc04c15d 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_ddr_peek_bdr_walking_ones.sv +++ b/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_ddr_peek_bdr_walking_ones.sv @@ -1,6 +1,6 @@ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +12,9 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + + // This test shows example of backdoor loading DRAM micron memory and frontdoor reading through DMA. // The test covers valid rows, bank groups, banks and columns // The test also covers some row, bank group, bank and column combinations. @@ -24,6 +27,8 @@ module test_ddr_peek_bdr_walking_ones(); int fp; string file_name; + logic [63:0] addr = 64'h0; + initial begin `define BYTE_COUNT 64 `define BACKDOOR_DATA 512'h77777777777777776666666666666666555555555555555544444444444444443333333333333333222222222222222211111111111111110000000000000000 @@ -47,32 +52,44 @@ module test_ddr_peek_bdr_walking_ones(); //Write 8*64 bits of data starting at address 'h0 //Covers different columns $fdisplay(fp, "%0h %0h", 64'h0, `BACKDOOR_DATA); + addr = 64'h0; + tb.poke(.addr(addr), .data(`BACKDOOR_DATA), .size(DataSize::UINT512)); //Write 8*64 bits of data starting at address 'h100 //Covers different columns $fdisplay(fp, "%0h %0h", 64'h100, `BACKDOOR_DATA); + addr = 64'h100; + tb.poke(.addr(addr), .data(`BACKDOOR_DATA), .size(DataSize::UINT512)); //Write 8*64 bits of data starting at address 'h300 //Covers different columns $fdisplay(fp, "%0h %0h", 64'h300, `BACKDOOR_DATA); + addr = 64'h300; + tb.poke(.addr(addr), .data(`BACKDOOR_DATA), .size(DataSize::UINT512)); //Write 8*64 bits of data starting at address 'h1000 //Covers different columns $fdisplay(fp, "%0h %0h", 64'h1000, `BACKDOOR_DATA); + addr = 64'h1000; + tb.poke(.addr(addr), .data(`BACKDOOR_DATA), .size(DataSize::UINT512)); //Covers rows for ( int i=0; i<4; i++) begin $fdisplay(fp, "%0h %0h", 64'h2_0000 << i, `BACKDOOR_DATA); + addr = 64'h2_0000 << i; + tb.poke(.addr(addr), .data(`BACKDOOR_DATA), .size(DataSize::UINT512)); end //Covers some row, bank group, bank and column combinations for ( int i=0; i<4; i++) begin $fdisplay(fp, "%0h %0h", 64'h2_0040 << i, `BACKDOOR_DATA); + addr = 64'h2_0040 << i; + tb.poke(.slot_id(0), .addr(addr), .data(`BACKDOOR_DATA), .size(DataSize::UINT512)); end $fclose(fp); - tb.card.ddr_bdr_ld(file_name); + // Not using backdoor load (Errata #8) tb.nsec_delay(500); ddr_peeks(64'h0, 1, `BACKDOOR_DATA); @@ -105,8 +122,5 @@ module test_ddr_peek_bdr_walking_ones(); end end endtask // ddr_peeks - -endmodule // test_ddr_peek_bdr_walking_ones - - +endmodule // test_ddr_peek_bdr_walking_ones diff --git a/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_ddr_peek_poke.sv b/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_ddr_peek_poke.sv index 0752032fa..52ec25e53 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_ddr_peek_poke.sv +++ b/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_ddr_peek_poke.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,7 +13,9 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. -// +// ============================================================================ + + // Description: This test is to catch the memory aliasing issues in DDR memory models. // The test walks through the DDR address range and tests the contents. @@ -29,11 +32,11 @@ module test_ddr_peek_poke(); tb.power_up(.clk_recipe_a(ClockRecipe::A0), .clk_recipe_b(ClockRecipe::B0), .clk_recipe_c(ClockRecipe::C0)); - initialize_ddr(); + initialize_ddr(); deselect_cl_tst_hw(); for ( int i=0; i<26; i++) begin -//Walk through DDR address range to check if any of the bits in DDR Rank are tied to 0. +//Walk through DDR address range to check if any of the bits in DDR Rank are tied to 0. addr = 'h40 << i; $display("Write to Addr %b", addr); tb.poke(.addr(addr), .data({512{1'b1}}), .size(DataSize::UINT512)); @@ -47,7 +50,7 @@ module test_ddr_peek_poke(); $error("Read Data mismatch for Addr %h: Exp %h, Act %h", addr, {512{1'b1}}, wide_read_data); error_count++; end -//Walk through DDR address range to check if two adjacent bits are wrongly wired. +//Walk through DDR address range to check if two adjacent bits are wrongly wired. addr = 'h40 << i; $display("Write to Addr %b", addr); tb.poke(.addr(addr), .data({512{1'b1}}), .size(DataSize::UINT512)); @@ -60,14 +63,14 @@ module test_ddr_peek_poke(); if (wide_read_data != {512{1'b1}}) begin $error("Read Data mismatch for Addr %h: Exp %h, Act %h", addr, {512{1'b1}}, wide_read_data); error_count++; - end - end - + end + end + tb.nsec_delay(500); // Power down tb.power_down(); - + report_pass_fail_status(); $finish; diff --git a/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_dma_pcim_concurrent.sv b/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_dma_pcim_concurrent.sv index 318624384..ae475cc0b 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_dma_pcim_concurrent.sv +++ b/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_dma_pcim_concurrent.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,37 +13,39 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + // This test initiates dma and pcim traffic in parallel. module test_dma_pcim_concurrent(); - + import tb_type_defines_pkg::*; `include "base_test_utils.svh"; int len0 = 17; - + initial begin tb.power_up(.clk_recipe_a(ClockRecipe::A1), .clk_recipe_b(ClockRecipe::B0), .clk_recipe_c(ClockRecipe::C0)); - initialize_ddr(); + initialize_ddr(); fork begin - $display("[%t] : Initializing DDR buffers", $realtime); + $display("[%t] : Initializing DDR buffers", $realtime); load_host_memory(.chan(`DDR_CHANNEL), .host_addr(64'h0000), .cl_addr(`DDR_BASE_ADDR), .data_pattern(8'hAA), .num_bytes(len0)); - + $display("[%t] : Starting DDR H2C DMA channels ", $realtime); tb.start_que_to_cl(.chan(`DDR_CHANNEL)); wait_for_dma_transfer_from_buffer_to_cl(.chan(`DDR_CHANNEL)); - // DMA transfers are posted writes. The above code checks only if the dma transfer is setup and done. + // DMA transfers are posted writes. The above code checks only if the dma transfer is setup and done. // We need to wait for writes to finish to memory before issuing reads. $display("[%t] : Waiting for DDR DMA write transfers to complete", $realtime); #2us; - $display("[%t] : Transferring DDR data to host buffer", $realtime); + $display("[%t] : Transferring DDR data to host buffer", $realtime); `define DDR_HOST_MEM_BUFFER_ADDR_0 64'h0_0001_0800 tb.que_cl_to_buffer(.chan(`DDR_CHANNEL), .dst_addr(`DDR_HOST_MEM_BUFFER_ADDR_0), .cl_addr(`DDR_BASE_ADDR), .len(len0) ); tb.start_que_to_buffer(.chan(`DDR_CHANNEL)); @@ -54,14 +57,14 @@ module test_dma_pcim_concurrent(); $display("[%t] : Comparing DMA buffer from DDR sequence 0 with expected pattern", $realtime); check_host_memory(.addr(`DDR_HOST_MEM_BUFFER_ADDR_0), .expected_data_pattern(8'hAA), .num_bytes(len0)); end // fork begin - begin + begin #100ns; $display("[%t] : Programming cl_tst registers for PCIM", $realtime); program_cl_tst(.base_addr(64'h0000), .test_addr(64'h1234_0000), .enable_write(1'b1), .enable_read(1'b1), .axi_len(8'h07), .iter_mode(1'b0), .num_iter(0), .num_inst(16'h000f)); end - join + join #500ns; tb.power_down(); diff --git a/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_dma_pcis_concurrent.sv b/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_dma_pcis_concurrent.sv index 864e59cc6..d8cc795dd 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_dma_pcis_concurrent.sv +++ b/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_dma_pcis_concurrent.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + //This test runs DMA and PCIS tests in parallel @@ -22,27 +25,27 @@ module test_dma_pcis_concurrent(); `include "base_test_utils.svh"; int len0 = 17; - + initial begin tb.power_up(.clk_recipe_a(ClockRecipe::A1), .clk_recipe_b(ClockRecipe::B0), .clk_recipe_c(ClockRecipe::C0)); - initialize_ddr(); + initialize_ddr(); fork begin - $display("[%t] : Initializing DDR buffers", $realtime); + $display("[%t] : Initializing DDR buffers", $realtime); load_host_memory(.chan(`DDR_CHANNEL), .host_addr(64'h0000), .cl_addr(`DDR_BASE_ADDR), .data_pattern(8'hAA), .num_bytes(len0)); - + $display("[%t] : Starting DDR H2C DMA channels ", $realtime); tb.start_que_to_cl(.chan(`DDR_CHANNEL)); wait_for_dma_transfer_from_buffer_to_cl(.chan(`DDR_CHANNEL)); - // DMA transfers are posted writes. The above code checks only if the dma transfer is setup and done. + // DMA transfers are posted writes. The above code checks only if the dma transfer is setup and done. // We need to wait for writes to finish to memory before issuing reads. $display("[%t] : Waiting for DDR DMA write transfers to complete", $realtime); #2us; - $display("[%t] : Transferring DDR data to host buffer", $realtime); + $display("[%t] : Transferring DDR data to host buffer", $realtime); `define DDR_HOST_MEM_BUFFER_ADDR_0 64'h0_0001_0800 tb.que_cl_to_buffer(.chan(`DDR_CHANNEL), .dst_addr(`DDR_HOST_MEM_BUFFER_ADDR_0), .cl_addr(`DDR_BASE_ADDR), .len(len0) ); tb.start_que_to_buffer(.chan(`DDR_CHANNEL)); @@ -54,7 +57,7 @@ module test_dma_pcis_concurrent(); $display("[%t] : Comparing DMA buffer from DDR sequence 0 with expected pattern", $realtime); check_host_memory(.addr(`DDR_HOST_MEM_BUFFER_ADDR_0), .expected_data_pattern(8'hAA), .num_bytes(len0)); end // fork begin - begin + begin #600ns; // Waitng for DMA transfer setup time @@ -64,7 +67,7 @@ module test_dma_pcis_concurrent(); $display("[%t] : Poke from DDR offset 24 GB", $realtime); check_peek_poke(.addr(`DDR_BASE_ADDR + `DDR_LEVEL_3), .data(64'h1), .size(DataSize::UINT64)); end - join + join // Power down #500ns; tb.power_down(); diff --git a/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_dma_sda_concurrent.sv b/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_dma_sda_concurrent.sv index b8b2935be..1551373e3 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_dma_sda_concurrent.sv +++ b/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_dma_sda_concurrent.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,11 +13,13 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + // This test runs DMA and SDA tests in parallel module test_dma_sda_concurrent(); - + import tb_type_defines_pkg::*; `include "base_test_utils.svh"; @@ -34,21 +37,21 @@ module test_dma_sda_concurrent(); tb.power_up(.clk_recipe_a(ClockRecipe::A1), .clk_recipe_b(ClockRecipe::B0), .clk_recipe_c(ClockRecipe::C0)); - initialize_ddr(); - + initialize_ddr(); + fork begin - $display("[%t] : Initializing DDR buffers", $realtime); + $display("[%t] : Initializing DDR buffers", $realtime); load_host_memory(.chan(`DDR_CHANNEL), .host_addr(64'h0000), .cl_addr(`DDR_BASE_ADDR), .data_pattern(8'hAA), .num_bytes(len0)); - + $display("[%t] : Starting DDR H2C DMA channels ", $realtime); tb.start_que_to_cl(.chan(`DDR_CHANNEL)); wait_for_dma_transfer_from_buffer_to_cl(.chan(`DDR_CHANNEL)); - // DMA transfers are posted writes. The above code checks only if the dma transfer is setup and done. + // DMA transfers are posted writes. The above code checks only if the dma transfer is setup and done. // We need to wait for writes to finish to memory before issuing reads. $display("[%t] : Waiting for DDR DMA write transfers to complete", $realtime); #2us; - $display("[%t] : Transferring DDR data to host buffer", $realtime); + $display("[%t] : Transferring DDR data to host buffer", $realtime); `define DDR_HOST_MEM_BUFFER_ADDR_0 64'h0_0001_0800 tb.que_cl_to_buffer(.chan(`DDR_CHANNEL), .dst_addr(`DDR_HOST_MEM_BUFFER_ADDR_0), .cl_addr(`DDR_BASE_ADDR), .len(len0) ); tb.start_que_to_buffer(.chan(`DDR_CHANNEL)); @@ -60,13 +63,13 @@ module test_dma_sda_concurrent(); $display("[%t] : Comparing DMA buffer from DDR sequence 0 with expected pattern", $realtime); check_host_memory(.addr(`DDR_HOST_MEM_BUFFER_ADDR_0), .expected_data_pattern(8'hAA), .num_bytes(len0)); end // fork begin - begin + begin #100ns; //SDA test sda_addr = 'h0; for (int i=0; i<32; i=i+4) begin sda_addr = sda_addr + i; - + sda_data = $urandom(); tb.poke_sda(.addr(sda_addr), .data(sda_data)); @@ -86,14 +89,14 @@ module test_dma_sda_concurrent(); end #100ns; - + timeout_count = 0; $display("[%t] : Waiting for SDA write and read activity to complete", $realtime); end // for (int i=0; i<32; i=i+4) #1us; end - join + join #500ns; tb.power_down(); diff --git a/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_dram_dma.sv b/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_dram_dma.sv index 2adf8e1d0..8236f9bfd 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_dram_dma.sv +++ b/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_dram_dma.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,7 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ module test_dram_dma(); diff --git a/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_dram_dma_4k_crossing.sv b/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_dram_dma_4k_crossing.sv index 892a146ed..3faaec635 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_dram_dma_4k_crossing.sv +++ b/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_dram_dma_4k_crossing.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + // DMA 4k crossing test diff --git a/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_dram_dma_align_addr_4k.sv b/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_dram_dma_align_addr_4k.sv index 7b5e192b6..b40307ffd 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_dram_dma_align_addr_4k.sv +++ b/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_dram_dma_align_addr_4k.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,7 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ module test_dram_dma_align_addr_4k(); diff --git a/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_dram_dma_axi_mstr.sv b/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_dram_dma_axi_mstr.sv index 8c91b2b31..b5bd8d881 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_dram_dma_axi_mstr.sv +++ b/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_dram_dma_axi_mstr.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + module test_dram_dma_axi_mstr(); @@ -62,7 +65,7 @@ module test_dram_dma_axi_mstr(); // Set AXI Master Command Registers // addr = 0x1_a021f700, Write $display("[%t] : Setting DDR Base Address Command Registers ", $realtime);// addr = 0x1_a021f700 - tb.poke_ocl(.addr(AXI_MSTR_CAHR_ADDR), .data(DDR_BASE_HI_ADDR)); // Set High Address -- + tb.poke_ocl(.addr(AXI_MSTR_CAHR_ADDR), .data(DDR_BASE_HI_ADDR)); // Set High Address -- tb.poke_ocl(.addr(AXI_MSTR_CALR_ADDR), .data(DDR_BASE_LO_ADDR + i)); // Set Low Address tb.poke_ocl(.addr(AXI_MSTR_CWDR_ADDR), .data(DDR_BASE_DATA | i)); // Set Write Data tb.poke_ocl(.addr(AXI_MSTR_CCR_ADDR), .data(32'h0000_0001)); // Issue Write Command @@ -82,7 +85,7 @@ module test_dram_dma_axi_mstr(); end // for (int i = 0; i <= 12; i=i+4) //} for (int i = 0; i <= 12; i=i+4) begin //{ - tb.poke_ocl(.addr(AXI_MSTR_CAHR_ADDR), .data(DDR_BASE_HI_ADDR)); // Set High Address -- + tb.poke_ocl(.addr(AXI_MSTR_CAHR_ADDR), .data(DDR_BASE_HI_ADDR)); // Set High Address -- tb.poke_ocl(.addr(AXI_MSTR_CALR_ADDR), .data(DDR_BASE_LO_ADDR + i)); // Set Low Address tb.poke_ocl(.addr(AXI_MSTR_CWDR_ADDR), .data(DDR_BASE_DATA | i)); // Set Write Data @@ -190,7 +193,7 @@ for (int i = 0; i <= 12; i=i+4) begin //{ // Set AXI Master Command Registers // addr = 0x1_a021f700, Write $display("[%t] : Setting DDR Base Address Command Registers ", $realtime);// addr = 0x1_a021f700 - tb.poke_ocl(.addr(AXI_MSTR_CAHR_ADDR), .data(DDR_OFFSET_DDR_LEVEL_2_HI_ADDR)); // Set High Address -- + tb.poke_ocl(.addr(AXI_MSTR_CAHR_ADDR), .data(DDR_OFFSET_DDR_LEVEL_2_HI_ADDR)); // Set High Address -- tb.poke_ocl(.addr(AXI_MSTR_CALR_ADDR), .data(DDR_OFFSET_DDR_LEVEL_2_LO_ADDR + i)); // Set Low Address tb.poke_ocl(.addr(AXI_MSTR_CWDR_ADDR), .data(DDR_OFFSET_DDR_LEVEL_2_DATA | i)); // Set Write Data tb.poke_ocl(.addr(AXI_MSTR_CCR_ADDR), .data(32'h0000_0001)); // Issue Write Command @@ -210,7 +213,7 @@ for (int i = 0; i <= 12; i=i+4) begin //{ end // for (int i = 0; i <= 12; i=i+4) //} for (int i = 0; i <= 12; i=i+4) begin //{ - tb.poke_ocl(.addr(AXI_MSTR_CAHR_ADDR), .data(DDR_OFFSET_DDR_LEVEL_2_HI_ADDR)); // Set High Address -- + tb.poke_ocl(.addr(AXI_MSTR_CAHR_ADDR), .data(DDR_OFFSET_DDR_LEVEL_2_HI_ADDR)); // Set High Address -- tb.poke_ocl(.addr(AXI_MSTR_CALR_ADDR), .data(DDR_OFFSET_DDR_LEVEL_2_LO_ADDR + i)); // Set Low Address tb.poke_ocl(.addr(AXI_MSTR_CWDR_ADDR), .data(DDR_OFFSET_DDR_LEVEL_2_DATA | i)); // Set Write Data @@ -255,7 +258,7 @@ for (int i = 0; i <= 12; i=i+4) begin //{ // Set AXI Master Command Registers // addr = 0x1_a021f700, Write $display("[%t] : Setting DDR Base Address Command Registers ", $realtime);// addr = 0x1_a021f700 - tb.poke_ocl(.addr(AXI_MSTR_CAHR_ADDR), .data(DDR_OFFSET_DDR_LEVEL_3_HI_ADDR)); // Set High Address -- + tb.poke_ocl(.addr(AXI_MSTR_CAHR_ADDR), .data(DDR_OFFSET_DDR_LEVEL_3_HI_ADDR)); // Set High Address -- tb.poke_ocl(.addr(AXI_MSTR_CALR_ADDR), .data(DDR_OFFSET_DDR_LEVEL_3_LO_ADDR + i)); // Set Low Address tb.poke_ocl(.addr(AXI_MSTR_CWDR_ADDR), .data(DDR_OFFSET_DDR_LEVEL_3_DATA | i)); // Set Write Data tb.poke_ocl(.addr(AXI_MSTR_CCR_ADDR), .data(32'h0000_0001)); // Issue Write Command @@ -275,7 +278,7 @@ for (int i = 0; i <= 12; i=i+4) begin //{ end // for (int i = 0; i <= 12; i=i+4) //} for (int i = 0; i <= 12; i=i+4) begin //{ - tb.poke_ocl(.addr(AXI_MSTR_CAHR_ADDR), .data(DDR_OFFSET_DDR_LEVEL_3_HI_ADDR)); // Set High Address -- + tb.poke_ocl(.addr(AXI_MSTR_CAHR_ADDR), .data(DDR_OFFSET_DDR_LEVEL_3_HI_ADDR)); // Set High Address -- tb.poke_ocl(.addr(AXI_MSTR_CALR_ADDR), .data(DDR_OFFSET_DDR_LEVEL_3_LO_ADDR + i)); // Set Low Address tb.poke_ocl(.addr(AXI_MSTR_CWDR_ADDR), .data(DDR_OFFSET_DDR_LEVEL_3_DATA | i)); // Set Write Data @@ -321,4 +324,3 @@ end //} $finish; end // initial begin endmodule // test_dram_dma_axi_mstr - diff --git a/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_dram_dma_mem_model_bdr_rd.sv b/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_dram_dma_mem_model_bdr_rd.sv index b69a6446d..063ac4b57 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_dram_dma_mem_model_bdr_rd.sv +++ b/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_dram_dma_mem_model_bdr_rd.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,9 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + + // This test bypasses Micron DDR models and uses AXI memory model. // Please refer to readme for more information about AXI memoryy model. // This test frontdoor writes and backdoor reads AXI memory model. @@ -30,7 +34,7 @@ module test_dram_dma_mem_model_bdr_rd(); int len2 = 6000; //transfer4 - length between 256 and 512 bytes. int len3 = 300; - + initial begin logic [63:0] ddr_addr_0, ddr_addr_1, ddr_addr_2, ddr_addr_3; @@ -40,9 +44,9 @@ module test_dram_dma_mem_model_bdr_rd(); .clk_recipe_c(ClockRecipe::C0)); initialize_ddr(); deselect_cl_tst_hw(); - + #10000ns; - + $display("[%t] : Initializing DDR buffers", $realtime); load_host_memory(.chan(`DDR_CHANNEL), .host_addr(64'h0000), .cl_addr(`DDR_BASE_ADDR), .data_pattern(8'hAA), .num_bytes(len0)); load_host_memory(.chan(`DDR_CHANNEL), .host_addr(64'h3000), .cl_addr(`DDR_BASE_ADDR + `DDR_LEVEL_1), .data_pattern(8'hBB), .num_bytes(len1)); @@ -53,7 +57,7 @@ module test_dram_dma_mem_model_bdr_rd(); tb.start_que_to_cl(.chan(`DDR_CHANNEL)); wait_for_dma_transfer_from_buffer_to_cl(.chan(`DDR_CHANNEL)); #1us; - + $display("Back door read memory from DDR Base Address \n"); ddr_addr_0 = `DDR_BASE_ADDR; for (int i = 0 ; i < len0 ; i++) begin @@ -87,7 +91,7 @@ module test_dram_dma_mem_model_bdr_rd(); end ddr_addr_2++; end - + $display("Back door read memory from DDR Offset 24 GB \n"); ddr_addr_3 = `DDR_BASE_ADDR + `DDR_LEVEL_3; for (int i = 0 ; i < len3 ; i++) begin @@ -108,4 +112,3 @@ module test_dram_dma_mem_model_bdr_rd(); end // initial begin endmodule // test_dram_dma_mem_model_bdr_rd - diff --git a/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_dram_dma_mem_model_bdr_wr.sv b/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_dram_dma_mem_model_bdr_wr.sv index 0bb044e22..c5b610729 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_dram_dma_mem_model_bdr_wr.sv +++ b/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_dram_dma_mem_model_bdr_wr.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,9 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + + // This test bypasses Micron DDR models and uses AXI memory model. // Please refer to readme for more information about AXI memoryy model. // This test backdoor writes and front door reads AXI memory model. @@ -30,7 +34,7 @@ module test_dram_dma_mem_model_bdr_wr(); int len2 = 6000; //transfer4 - length between 256 and 512 bytes. int len3 = 300; - + initial begin logic [63:0] ddr_addr_0, ddr_addr_1, ddr_addr_2, ddr_addr_3; @@ -39,9 +43,9 @@ module test_dram_dma_mem_model_bdr_wr(); .clk_recipe_c(ClockRecipe::C0)); initialize_ddr(); deselect_cl_tst_hw(); - + #10000ns; - + $display("[%t] Back door load memory to DDR Base Address \n", $realtime); ddr_addr_0 = `DDR_BASE_ADDR; for (int i = 0 ; i < len0 ; i++) begin @@ -73,7 +77,7 @@ module test_dram_dma_mem_model_bdr_wr(); tb.card.fpga.CL.SH_DDR.u_mem_model.axi_mem_bdr_write(.addr(ddr_addr_3), .d(8'hDD)); ddr_addr_3++; end - + $display("[%t] : starting C2H DMA channels ", $realtime); `define DDR_HOST_MEM_BUFFER_ADDR_0 64'h0_0001_0800 `define DDR_HOST_MEM_BUFFER_ADDR_1 64'h0_0002_1800 @@ -101,7 +105,7 @@ module test_dram_dma_mem_model_bdr_wr(); $display("[%t] : Comparing DMA buffer from DDR sequence 3 with expected pattern", $realtime); check_host_memory(.addr(`DDR_HOST_MEM_BUFFER_ADDR_3), .expected_data_pattern(8'hDD), .num_bytes(len3)); - + #500ns; tb.power_down(); @@ -111,4 +115,3 @@ module test_dram_dma_mem_model_bdr_wr(); end // initial begin endmodule // test_dram_dma_mem_model_bdr_wr - diff --git a/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_dram_dma_rnd.sv b/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_dram_dma_rnd.sv index 826599c0b..62cbe408e 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_dram_dma_rnd.sv +++ b/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_dram_dma_rnd.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,7 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ // DMA test with random lengths. diff --git a/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_dram_dma_single_beat_4k.sv b/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_dram_dma_single_beat_4k.sv index e95b917c3..cf10b133d 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_dram_dma_single_beat_4k.sv +++ b/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_dram_dma_single_beat_4k.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + // DMA test with lengths less than 64 byte module test_dram_dma_single_beat_4k(); diff --git a/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_hbm.sv b/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_hbm.sv index 789171fd4..ece819cf3 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_hbm.sv +++ b/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_hbm.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2022 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + module test_hbm(); diff --git a/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_int.sv b/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_int.sv index b468ec1fe..e8e55dcd8 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_int.sv +++ b/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_int.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,13 +13,15 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + module test_int(); import tb_type_defines_pkg::*; - + `include "base_test_utils.svh" - + logic [31:0] write_data; logic [31:0] read_data; diff --git a/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_null.sv b/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_null.sv index f19e442b8..e0ccbaca9 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_null.sv +++ b/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_null.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,20 +13,22 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + module test_null(); initial begin int exit_code; - + tb.power_up(); tb.test_main(exit_code); - + #50ns; tb.power_down(); - + $finish; end diff --git a/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_peek_poke.sv b/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_peek_poke.sv index e7e3c4326..49e15aea8 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_peek_poke.sv +++ b/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_peek_poke.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,11 +13,13 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + // This test initiates dma and pcim traffic in parallel. module test_peek_poke(); - + import tb_type_defines_pkg::*; `include "base_test_utils.svh" @@ -25,7 +28,7 @@ module test_peek_poke(); tb.power_up(); initialize_ddr(); - + $display("[%t] : Programming cl_tst registers for PCIM", $realtime); program_cl_tst(.base_addr(64'h0000), .test_addr(64'h1234_0000), .enable_write(1'b1), .enable_read(1'b1), .axi_len(8'h07), .iter_mode(1'b0), .num_iter(0), .num_inst(16'h000f)); diff --git a/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_peek_poke_len.sv b/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_peek_poke_len.sv index 3ab37dd9b..6482ad1f4 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_peek_poke_len.sv +++ b/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_peek_poke_len.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + // PCIM test with different lengths for each write and read transfer @@ -19,15 +22,15 @@ module test_peek_poke_len(); import tb_type_defines_pkg::*; `include "base_test_utils.svh" - + logic [7:0] len; - + initial begin len = 0; - + tb.power_up(); initialize_ddr(); - + for(int addr =0; addr <=1023; addr = addr+64) begin $display("[%t] : Programming cl_tst registers for PCIe", $realtime); len = len+1; @@ -36,13 +39,12 @@ module test_peek_poke_len(); program_cl_tst(.base_addr(64'h0000), .test_addr(64'h1234_0000 + addr), .enable_write(1'b1), .enable_read(1'b1), .axi_len(len), .iter_mode(1'b0), .num_iter(0), .num_inst(16'h0001)); end // for (int addr =0; addr <=63; addr++) - + tb.power_down(); report_pass_fail_status(); - + $finish; end endmodule // test_peek_poke_len - diff --git a/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_peek_poke_pcis_axsize.sv b/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_peek_poke_pcis_axsize.sv index b24af026f..bdcea0068 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_peek_poke_pcis_axsize.sv +++ b/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_peek_poke_pcis_axsize.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,7 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ module test_peek_poke_pcis_axsize(); @@ -25,16 +27,16 @@ module test_peek_poke_pcis_axsize(); bit [511:0] pcis_exp_data; bit [511:0] pcis_act_data; - int data; - + int data; + initial begin tb.power_up(); initialize_ddr(); deselect_cl_tst_hw(); - pcis_wr_data =0; - data =1; + pcis_wr_data =0; + data =1; for(int size =0; size <=6; size++) begin $display("[%t] : Size of peek/poke = %0d", $realtime, size); for(int addr =0; addr <=63; addr = addr+(2**size)) begin @@ -42,10 +44,10 @@ module test_peek_poke_pcis_axsize(); for (int num_bytes =0; num_bytes < 2**size; num_bytes++) begin pcis_wr_data[(num_bytes*8)+:8] = data; data ++; - end + end tb.poke(.addr(addr), .data(pcis_wr_data), .size(DataSize::DATA_SIZE'(size))); tb.peek(.addr(addr), .data(pcis_rd_data), .size(DataSize::DATA_SIZE'(size))); - for (int num_bytes =0; num_bytes < 2**size; num_bytes++) begin + for (int num_bytes =0; num_bytes < 2**size; num_bytes++) begin pcis_exp_data[((addr+num_bytes)*8)+:8] = pcis_wr_data[(num_bytes*8)+:8]; pcis_act_data[((addr+num_bytes)*8)+:8] = pcis_rd_data[(num_bytes*8)+:8]; end @@ -54,7 +56,7 @@ module test_peek_poke_pcis_axsize(); $display("[%t] : Clear the memory before next size iteration", $realtime); tb.poke(.addr(64'h0), .data(512'h0), .size(DataSize::DATA_SIZE'(3))); end - + $display("[%t] : Waiting for PCIS write and read activity to complete", $realtime); #500ns; diff --git a/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_peek_poke_rnd_lengths.sv b/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_peek_poke_rnd_lengths.sv index acba188a6..1e2da97e0 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_peek_poke_rnd_lengths.sv +++ b/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_peek_poke_rnd_lengths.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + // PCIM test with random lengths for each transfer @@ -20,25 +23,25 @@ module test_peek_poke_rnd_lengths(); import tb_type_defines_pkg::*; `include "base_test_utils.svh" - + logic [7:0] len; - + initial begin - + tb.power_up(); initialize_ddr(); len = 0 ; - + for(int addr =0; addr <=1023; addr = addr+64) begin $display("[%t] : Programming cl_tst registers for PCIM", $realtime); len = $urandom_range(16, 1); $display("[%t] : Number of AXI data phases %d \n", $realtime, len); - + program_cl_tst(.base_addr(64'h0000), .test_addr(64'h1234_0000 + addr), .enable_write(1'b1), .enable_read(1'b1), .axi_len(len), .iter_mode(1'b0), .num_iter(0), .num_inst(16'h0001)); end // for (int addr =0; addr <=63; addr++) - + tb.power_down(); report_pass_fail_status(); @@ -47,4 +50,3 @@ module test_peek_poke_rnd_lengths(); end endmodule // test_peek_poke_rnd_lengths - diff --git a/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_peek_poke_wc.sv b/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_peek_poke_wc.sv index 319bfc85c..ead8e93e8 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_peek_poke_wc.sv +++ b/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_peek_poke_wc.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,25 +13,28 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. -// This test is test multi DW pokes to CL. The poke_pcis_wc is a function that tests -// write combine feature. Test does pokes with multiple DWs and reads the data back +// ============================================================================ + + +// This test is test multi DW pokes to CL. The poke_pcis_wc is a function that tests +// write combine feature. Test does pokes with multiple DWs and reads the data back // and checks. module test_peek_poke_wc(); - import tb_type_defines_pkg::*; - + import tb_type_defines_pkg::*; + `include "base_test_utils.svh" - + logic [31:0] pcis_wr_data [$]; logic [511:0] pcis_rd_data; logic [511:0] pcis_exp_data; logic [511:0] pcis_act_data; - + int size; int dw_cnt; logic [31:0] addr; - + initial begin tb.power_up(); @@ -38,43 +42,35 @@ module test_peek_poke_wc(); size = 6; addr = 'h0; - + for (int cnt=0; cnt <4; cnt++) begin dw_cnt = $urandom_range(4, 10); addr = addr + 'h04; - + $display("[%t] : Address of peek/poke = %0h", $realtime, addr); - + for (int num_dw =0; num_dw < dw_cnt; num_dw++) begin pcis_wr_data[num_dw] = $urandom(); pcis_exp_data[(num_dw*32)+:32] = pcis_wr_data[num_dw]; end - + tb.poke_pcis_wc(.addr(addr), .data(pcis_wr_data), .size(DataSize::DATA_SIZE'(size))); tb.peek(.addr(addr), .data(pcis_rd_data), .size(DataSize::DATA_SIZE'(size))); - for (int num_dw =0; num_dw < dw_cnt; num_dw++) begin + for (int num_dw =0; num_dw < dw_cnt; num_dw++) begin pcis_act_data[(num_dw*32)+:32] = pcis_rd_data[(num_dw*32)+:32]; end - + compare_data(.act_data(pcis_act_data), .exp_data(pcis_exp_data), .addr(addr)); - + tb.nsec_delay(1000); end // for (int cnt=0; cnt <4; cnt++) - + tb.power_down(); - + report_pass_fail_status(); $finish; end // initial begin endmodule // test_peek_poke_wc - - - - - - - - diff --git a/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_sda.sv b/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_sda.sv index d4323fc2b..f1409bbba 100644 --- a/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_sda.sv +++ b/hdk/cl/examples/cl_dram_hbm_dma/verif/tests/test_sda.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,32 +13,34 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + // Test for SDA interface module test_sda(); import tb_type_defines_pkg::*; - + `include "base_test_utils.svh"; - + logic [63:0] sda_addr; logic [31:0] sda_data; logic [31:0] read_data; int timeout_count; - + initial begin tb.power_up(.clk_recipe_a(ClockRecipe::A0), .clk_recipe_b(ClockRecipe::B0), .clk_recipe_c(ClockRecipe::C0)); - initialize_ddr(); - + initialize_ddr(); + sda_addr = 'h0; for (int i=0; i<64; i=i+4) begin sda_addr = sda_addr + i; - + sda_data = $urandom(); tb.poke_sda(.addr(sda_addr), .data(sda_data)); @@ -57,10 +60,10 @@ module test_sda(); end #100ns; - + $display("[%t] : Waiting for SDA write and read activity to complete", $realtime); end // for (int i=0; i<63; i=i+4) - + #500ns; tb.power_down(); @@ -69,11 +72,3 @@ module test_sda(); $finish; end // initial begin endmodule // test_sda - - - - - - - - diff --git a/hdk/cl/examples/cl_mem_perf/README.md b/hdk/cl/examples/cl_mem_perf/README.md index 21ac628db..96fdd4406 100644 --- a/hdk/cl/examples/cl_mem_perf/README.md +++ b/hdk/cl/examples/cl_mem_perf/README.md @@ -4,34 +4,44 @@ ## Table of Content -1. [Introduction](#ancIntroduction) -2. [Architecture Overview](#ancArchitectureOverview) - 1. [Clocks and Reset](#ancClocksAndResets) - 2. [OCL](#ancOCL) - 3. [PCIM](#ancPCIM) - 4. [PCIS](#ancPCIS) - 5. [DDR](#ancDDR) - 6. [HBM](#ancHBM) - 7. [SDA](#ancSDA) - 8. [Interrupts](#ancInterrupts) - 9. [Virtual JTAG](#ancVirtualJtag) -3. [Address Space](#ancAddressSpace) - 1. [OCL Address Space](#ancOCLRegisterAddressSpace) - 2. [PCIS Memory Address Space](#ancPCISAddressSpace) - 3. [HBM Memory Address Space](#ancHBMMemoryAddressSpace) - 4. [CL_HBM_AXI4 Register Address Space](#ancHBMAxi4RegisterAddrSpace) - 5. [SDA Memory Address Space](#ancSDAAddressSpace) -4. [Simulations](#ancSimulations) -5. [Software](#ancSoftware) -6. [HBM Performance Tests](#ancHBMPerformanceTests) - - +- [CL\_MEM\_PERF Custom Logic Example](#cl_mem_perf-custom-logic-example) + - [Table of Content](#table-of-content) +- [Introduction](#introduction) +- [Architecture Overview](#architecture-overview) + - [Clocks and Reset](#clocks-and-reset) + - [OCL](#ocl) + - [PCIM](#pcim) + - [PCIS](#pcis) + - [DDR](#ddr) + - [HBM](#hbm) + - [SDA](#sda) + - [Interrupts](#interrupts) + - [Virtual JTAG](#virtual-jtag) +- [Address Space](#address-space) + - [OCL Address Space](#ocl-address-space) + - [PCIS Memory Address Space](#pcis-memory-address-space) + - [HBM Memory Address Space](#hbm-memory-address-space) + - [CL\_HBM\_AXI4 Register Address Space](#cl_hbm_axi4-register-address-space) + - [SDA Memory Address Space](#sda-memory-address-space) +- [Simulations](#simulations) +- [Software](#software) + - [test\_hbm\_perf32.c](#test_hbm_perf32c) + - [test\_dram\_hbm\_dma.c](#test_dram_hbm_dmac) + - [test\_hbm\_perf32.c](#test_hbm_perf32c-1) + - [test\_aws\_clk\_gen.c](#test_aws_clk_genc) + - [test\_clk\_freq.c](#test_clk_freqc) + - [Compile and run instructions](#compile-and-run-instructions) + - [test\_dram\_hbm\_dma\_hwsw\_cosim.c](#test_dram_hbm_dma_hwsw_cosimc) + - [Compile and run instructions](#compile-and-run-instructions-1) +- [HBM Performance Tests](#hbm-performance-tests) + - [Instructions to run HBM Performance Test](#instructions-to-run-hbm-performance-test) + # Introduction The CL_MEM_PERF is a customer reference design for F2 where the objective is to demonstrate fine tuned data paths to HBM and DDR to achieve maximum throughput to the memories. The example also demonstrates datapath connectivity between Host, AWS Shell, Custom Logic (CL) region in the FPGA, HBM and DDR DIMM on the FPGA card. Following are the major highlights of CL_MEM_PERF design: 1. Datapath to 64GB DDR and 16GB HBM through Shell’s PCIS Interface. DDR and HBM memories in the FPGFA are accessible from the Host on PF0-BAR4, as well as from the DMA engine in the XDMA_SHELL. Both these accesses show up as AXI4 transaction on PCIS interface which ultimately reach the targeted memory. -2. Demonstrate the use of PCIM interface for applications where CL is the PCIe Requestor to the Host. This can also be used to test peak PCIe transfer rates between Host and FPGA over PCIM interface. +2. Demonstrate the use of PCIM interface for applications where CL is the PCIe Requester to the Host. This can also be used to test peak PCIe transfer rates between Host and FPGA over PCIM interface. 3. Register access to various blocks through Shell’s OCL interface. 4. 1KB BRAM accessible through Shell’s SDA interface. 5. Supports user defined interrupts generated by the CL. @@ -43,13 +53,12 @@ The CL_MEM_PERF is a customer reference design for F2 where the objective is to Overall, CL_MEM_PERF enables customers to quickly integrate their CL accelerator designs to interface with various memories on the FPGA and to use as reference to fine tune their CL performance. - # Architecture Overview Figure below shows an architectural overview of CL_MEM_PERF design: ![Diagram](design/cl_mem_perf.png) -The interfaces between Shell and CL are accessible from the Host on the PF/BARs as stated in the table below. Please See [AWS_Fpga_Pcie_Memory_Map.md](../../../docs/AWS_Fpga_Pcie_Memory_Map.md) for more details on bar sizes, and [AWS_Shell_Interface_Specification.md](../../../docs/AWS_Shell_Interface_Specification.md) for available interfaces between Shell and CL. +All interfaces in this CL example are accessible from the Host on the PF/BARs as stated in the table below. Please See [PCIe Memory Map](../../../docs/AWS_Fpga_Pcie_Memory_Map.md) for more details on bar sizes, and [AWS Shell Interface Specification](../../../docs/AWS_Shell_Interface_Specification.md) for available interfaces between the Shell and the CL. | Interface | PF | BAR | |----------------------------------------------|----|-----| @@ -60,95 +69,84 @@ The interfaces between Shell and CL are accessible from the Host on the PF/BARs | Virtual JTAG | 1 | 2 | | SDA | 1 | 4 | - ## Clocks and Reset -* clk_main_a0 (250 MHz) from Shell for majority of the design except for HBM. -* rst_main_n from Shell sync’d to clk_main_a0. -* clk_hbm_ref (100 MHz) from Shell as reference clock for HBM IP. -* HBM AXI3 interface is clocked by the 450MHz clock generated from the [AWS_CLK_GEN](./../../../common/lib/aws_clk_gen.sv) block. + +- clk_main_a0 (250 MHz) from Shell for majority of the design except for HBM. +- rst_main_n from Shell sync’d to clk_main_a0. +- clk_hbm_ref (100 MHz) from Shell as reference clock for HBM IP. +- HBM AXI3 interface is clocked by the 450MHz clock generated from the [AWS_CLK_GEN](./../../../common/lib/aws_clk_gen.sv) block. The AWS_CLK_GEN block also generates several other clocks to match with the clock recipes supported in F1. Please refer to [AWS_CLK_GEN spec](./../../../docs/AWS_CLK_GEN_spec.md) for details on this block. The [Clock Recipes User Guide](./../../../docs/Clock_Recipes_User_Guide.md) describes various clock recipes available for F2 developers and options on configuring clocks dynamically. The user guide also describes porting of CL designs based on F1 clock recipes into F2. -* NOTE: There is a SW control register at [OCL offset 0x300](#ancHBMAxi4RegisterAddrSpace) to reset only the HBM IP core. This reset register does not reset the whole CL_HBM_AXI4 block. +- NOTE: There is a SW control register at [OCL offset 0x300](#hbm-memory-address-space) to reset only the HBM IP core. This reset register does not reset the whole CL_HBM_AXI4 block. - ## OCL -The [CL_MEM_OCL_DEC](design/cl_mem_ocl_dec.sv) module converts OCL 32-bit AXI-L Interface to simple config bus interface. It consists of an address decoder to access register space of various blocks. See [OCL Address Mapping](#ancOCLRegisterAddressSpace) for availble ranges. - +The [CL_MEM_OCL_DEC](design/cl_mem_ocl_dec.sv) module converts OCL 32-bit AXI-L Interface to simple config bus interface. It consists of an address decoder to access register space of various blocks. See [OCL Address Space](#ocl-address-space) for available ranges. + ## PCIM + The [CL_PCIM_MSTR](../cl_dram_hbm_dma/design/cl_pcim_mstr.sv) module is connected to the 512-bit AXI4 PCIM interface. It consists of AXI4 Traffic Generator capable of issuing Read/Write requests to the Host over the PCIe link. This block can also be used to test the peak PCIe transfer rates across the PCIe link. -While this block is essentially a traffic generator, CL designers could potentially swap this block with their custom Kernel that acts as a PCIe Requestor to the Host Memory. +While this block is essentially a traffic generator, CL designers could potentially swap this block with their custom Kernel that acts as a PCIe Requester to the Host Memory. - ## PCIS -The PCIS is a 512-bit AXI4 interface from the Shell which can be accessed either by Host over PF0-BAR4, or by the XDMA engine in the AWS Shell. The PCIS interface is used in CL_MEM_PERF example to provide datapaths to the DDR and HBM memories in the FPGA. The address range to access DDR and HBM memories is described in [PCIS Memory Address Space](#ancPCISAddressSpace). +The PCIS is a 512-bit AXI4 interface from the Shell which can be accessed either by Host over PF0-BAR4, or by the XDMA engine in the AWS Shell. The PCIS interface is used in CL_MEM_PERF example to provide datapaths to the DDR and HBM memories in the FPGA. The address range to access DDR and HBM memories is described in [PCIS Memory Address Space](#pcis-memory-address-space). -The [CL_AXI_MSTR](../cl_dram_hbm_dma/design/cl_dram_dma_axi_mstr.sv) module is another simple AXI4 traffic genertor whose traffic pattern and access length can be configured using the registers. The AXI4 interface from CL_AXI_MSTR and PCIS feed to CL_AXI_INTERCONNECT which ultimately connects to DDR and HBM based on the access address request. +The [CL_AXI_MSTR](../cl_dram_hbm_dma/design/cl_dram_dma_axi_mstr.sv) module is another simple AXI4 traffic generator whose traffic pattern and access length can be configured using the registers. The AXI4 interface from CL_AXI_MSTR and PCIS feed to CL_AXI_INTERCONNECT which ultimately connects to DDR and HBM based on the access address request. There are two MUXes - one along the datapath to DDR, and another MUX along datapath to HBM. These MUXes default to connecting CL_AXI_INTERCONNECT’s path to the target memories. However, setting these MUXes enables traffic from the ATGs to the target memories. PCIS path to the target memories is disabled when the MUXes are enabled. - ## DDR -AWS provides [SH_DDR](../../../common/shell_stable/design/sh_ddr/synth/sh_ddr.sv) that houses the DDR4 Controller specifically configured to the DDR DIMM on the FPGA Card. The SH_DDR is also connected to the Shell's sh_cl_ddr_stat_* ports to enable Shell to manage DDR calibration upon CL AFI loads. The SH_DDR exposes an AXI4 512-bit interface for the CL logic to perform Read/Write data tranfsers into DDR. - -**NOTE**: Currently SH_DDR supports both 32GB and 64GB dual rank DIMMs. Please refer to [Supported_DDR_Modes.md](./../../../docs/Supported_DDR_Modes.md) for details on supported DDR configurations in `sh_ddr.sv`. +AWS provides [SH_DDR](../../../common/shell_stable/design/sh_ddr/synth/sh_ddr.sv) that houses the DDR4 Controller specifically configured to the DDR DIMM on the FPGA Card. The SH_DDR is also connected to the Shell's sh_cl_ddr_stat_* ports to enable Shell to manage DDR calibration upon CL AFI loads. The SH_DDR exposes an AXI4 512-bit interface for the CL logic to perform Read/Write data transfers into DDR. Please refer to the [Supported DDR Modes](./../../../docs/Supported_DDR_Modes.md) for details on supported DDR configurations in `sh_ddr.sv`. - ## HBM -F2 FPGA has on-chip HBM with a maximum capacity of 16GiB, accessible through 32 AXI3 Channels running at a maximum clock speed of upto 450MHz. CL designs should leverage all the available channels and aim for achieving timing closure of the interface at 450MHz to get the best possible performance out of HBM. HBM offers theoretical max bandwidth of 460GB/s when traffic is active across all the 32 Channels with 450MHz clock. +F2 FPGA has on-chip HBM with a maximum capacity of 16GiB, accessible through 32 AXI3 Channels running at a maximum clock speed of up to 450MHz. CL designs should leverage all the available channels and aim for achieving timing closure of the interface at 450MHz to get the best possible performance out of HBM. HBM offers theoretical max bandwidth of 460GB/s when traffic is active across all the 32 Channels with 450MHz clock. The [CL_HBM_AXI4](design/cl_mem_hbm_axi4.sv) module demonstrates an use case for HBM traffic as shown in the block diagram below: ![Diagram](design/cl_hbm_kernel.png) -CL_HBM_AXI4 exposes an AXI4 512-bit interface and two Configuration Interfaces clocked using the 250MHz clk_main_a0. The Host (PCIS) can access HBM through this AXI4 Interface. The AXI4 interface then connects to 512-to-256 bit width convertor, clock crossing convertors between `clk_main_a0`(250 MHz) and HBM's AXI3 clock (max 450MHz), and AXI4-to-AXI3 protocol convertor to ultimately connect to HBM AXI Channel#0 +CL_HBM_AXI4 exposes an AXI4 512-bit interface and two configuration interfaces clocked using the 250MHz clk_main_a0. The Host (PCIS) can access HBM through this AXI4 Interface. The AXI4 interface then connects to 512-to-256 bit width converter, clock crossing converters between clk_main_a0 and HBM's AXI3 clock, and AXI4-to-AXI3 protocol converter to ultimately connect to HBM AXI Channel#0 The hbm_stat_bus is a simple config bus that connects to CL_HBM_WRAPPER and facilitates access to the Reset Register inside the CL_HBM_WRAPPER (mainly to reset HBM IP and check HBM read). The hbm_kern_cfg_bus is a simple config bus to configure the HBM Performance Kernels (CL_HBM_PERF_KERNEL) -In addition to providing a datapath from PCIS to HBM, the CL_HBM_AXI4 block also instantiates CL_HBM_PERF_KERNEL which is designed to maximize the available bandwidth from HBM. It demonstrates the microachitecture for Customer Kernels interfacing with HBM, supports multiple outstanding transactions in the queue across all 32 channels, with AXI3 interface running at 450MHz clock. This design provides clock domain crossing mechanism, performance measurememt counters along with floorplan and timing constraints to achieve easier timing cloure at 450 MHz. +In addition to providing a datapath from PCIS to HBM, the CL_HBM_AXI4 block also instantiates CL_HBM_PERF_KERNEL which is designed to maximize the available bandwidth from HBM. It demonstrates the microarchitecture for Customer Kernels interfacing with HBM, supports multiple outstanding transactions in the queue across all 32 channels, with AXI3 interface running at 450MHz clock. This design provides clock domain crossing mechanism, performance measurement counters along with floorplan and timing constraints to achieve easier timing closure at 450 MHz. CL_HBM_PERF_KERNEL consists of the following blocks: -* CL_KERNEL_CTL: This is the main controller for the Kernel. It is responsible for posting write/read requests and track pending transactions. The block is capable of producing write and read requests in parallel to saturate all the channels of HBM. Keeping the channels active is key for maximizing the available HBM bandwidth and CL_KERNEL_CTL achieves that by arbitrating and issues multiple outstanding requests. -* CL_KERNEL_REGS: Houses all the control and status registers including performance measurement counters. -* CL_KERNEL_REQ: This block is instantiated inside CL_KERNEL_CTL and is mainly responsible to perform Clock Domain Crossing of read/write requests from clk_main_a0 to clk_hbm domain. This block is replicated to server each channel of the HBM. -* CL_AXI_CTL: Contains the control logic and datapath required to serve the AXI3 read/write requests to the HBM core. This module accepts read/write requests from CL_KERNEL_REQ pipe and interface with HBM’s AXI3 interface. The entire block runs on clk_hbm domain. CL_AXI_CTL is replicated for each HBM channel. Note that, the AXI3 interface for channel#0 is muxed along with the AXI4 data path from the hbm_axi4_bus. Users should enable this mux such that the traffic from CL_AXI_CTL#0 drives into HBM Channel#0. Please see description for details. -* While the data is produced/consumed locally in this specific design, customers will be able to leverage the microarchitecture by feeding the data to/from CL_KERNEL_REQ and interfacing it to their data producer/consumer logic. - +- CL_KERNEL_CTL: This is the main controller for the Kernel. It is responsible for posting write/read requests and track pending transactions. The block is capable of producing write and read requests in parallel to saturate all the channels of HBM. Keeping the channels active is key for maximizing the available HBM bandwidth and CL_KERNEL_CTL achieves that by arbitrating and issues multiple outstanding requests. +- CL_KERNEL_REGS: Houses all the control and status registers including performance measurement counters. +- CL_KERNEL_REQ: This block is instantiated inside CL_KERNEL_CTL and is mainly responsible to perform Clock Domain Crossing of read/write requests from clk_main_a0 to clk_hbm domain. This block is replicated to server each channel of the HBM. +- CL_AXI_CTL: Contains the control logic and datapath required to serve the AXI3 read/write requests to the HBM core. This module accepts read/write requests from CL_KERNEL_REQ pipe and interface with HBM’s AXI3 interface. The entire block runs on clk_hbm domain. CL_AXI_CTL is replicated for each HBM channel. Note that, the AXI3 interface for channel#0 is muxed along with the AXI4 data path from the hbm_axi4_bus. Users should enable this mux such that the traffic from CL_AXI_CTL#0 drives into HBM Channel#0. Please see description for details. +- While the data is produced/consumed locally in this specific design, customers will be able to leverage the microarchitecture by feeding the data to/from CL_KERNEL_REQ and interfacing it to their data producer/consumer logic. CL_HBM_WRAPPER: -* The CL_HBM_WRAPPER block houses the main HBM IP configured in 16GiB capacity with 32- AXI3 Channels running at 450MHz clk_hbm clock. -* The hbm_stats_bus config interface provides access to reset the MMCM and check if the HBM is ready. See registers in CL_HBM_AXI4 Register Address Space for details. +- The CL_HBM_WRAPPER block houses the main HBM IP configured in 16GiB capacity with 32- AXI3 Channels running at 450MHz clk_hbm clock. +- The hbm_stats_bus config interface provides access to reset the MMCM and check if the HBM is ready. See registers in CL_HBM_AXI4 Register Address Space for details. -Please refer to [CL_HBM_AXI4 Register Address Space](#ancHBMAxi4RegisterAddrSpace) for details on register address space and HBM memory address space. +Please refer to [CL_HBM_AXI4 Register Address Space](#cl_hbm_axi4-register-address-space) for details on register address space and HBM memory address space. - ## SDA The SDA interface is shared between two modules: 1. The [CL_SDA_SLV](../cl_dram_hbm_dma/design/cl_sda_slv.sv) module provides access to a 1KB BRAM through SDA 32-bit AXI-L Interface. -2. The [AWS_CLK_GEN](./../../../common/lib/aws_clk_gen.sv) module generates all the required clocks for the design. Please refer to [AWS_CLK_GEN spec](./../../../docs/AWS_CLK_GEN_spec.md) for details on this block. The [Clock Recipes User Guide](./../../../docs/Clock_Recipes_User_Guide.md) describes various clock recipes available for F2 developers and options on configuring clocks dynamically. The user guide also describes porting of CL designs based on F1 clock recipes into F2. +2. The [AWS_CLK_GEN](./../../../common/lib/aws_clk_gen.sv) module generates all the required clocks for the design. Please refer to the [AWS_CLK_GEN specifiction](./../../../docs/AWS_CLK_GEN_spec.md) for details on this block. The [Clock Recipes User Guide](./../../../docs/Clock_Recipes_User_Guide.md) describes various clock recipes available for F2 developers and options on configuring clocks dynamically. The user guide also describes porting of CL designs based on F1 clock recipes into F2. - ## Interrupts The [CL_INT_SLV](../cl_dram_hbm_dma/design/cl_int_tst.sv) module implements simple mechanism to trigger MSIX interrupts to the host over sh_cl_apppf_irq_req/ack interface. SW can check the status of the interrupt triggers and also configure the interrupt masks. The `interrupt_example()` routine in [test_dram_hbm_dma.c](./software/runtime/test_dram_hbm_dma.c) demonstrates interrupts functionality. - ## Virtual JTAG The [CL_ILA](../cl_dram_hbm_dma/design/cl_ila.sv) instantiates the Debug Bridge IP required to support Virtual JTAG and the two example ILAs. One ILA snoops the PCIS bus, whereas second ILA snoops DDR-AXI4 bus. - # Address Space - ## OCL Address Space The OCL AXI-L is decoded into following address ranges for various design blocks: @@ -163,7 +161,6 @@ The OCL AXI-L is decoded into following address ranges for various design blocks | Clock Frequency Measurement| 0x0600 | 0x06FF | CL_CLK_FREQ Block | | Interrupt Generator | 0x0D00 | 0x0DFF | CL_INT_SLV Block | - ## PCIS Memory Address Space | Target Memory | Start Address | End Address | Range | @@ -172,19 +169,16 @@ The OCL AXI-L is decoded into following address ranges for various design blocks | HBM | 0x10_0000_0000 | 0x13_FFFF_FFFF | 16 GB | **NOTE**: Accessing memory beyond DDR and HBM’s range can potentially corrupt the data in either of the memories. -**NOTE**: Please refer to [Supported_DDR_Modes.md](./../../../docs/Supported_DDR_Modes.md) for details on supported DDR configurations in `sh_ddr.sv`. - ## HBM Memory Address Space HBM Memory Address Space is as shown in the [HBM User Guide](https://docs.xilinx.com/r/en-US/pg276-axi-hbm/Port-Descriptions) for 16GB capacity. Each CL_AXI_CTL instantiated in CL_HBM_PERG_KERNEL is mapped to serve the address range defined for each channel in the HBM user guide. For example: * Channel#0 | Start Address = 0x0000_0000 | End Address = 0x1FFF_FFFF * Channel#1 | Start Address = 0x2000_0000 | End Address = 0x3FFF_FFFF and so on... - ## CL_HBM_AXI4 Register Address Space -The table below describes the registers available in CL_HBM_AXI4 block. This includes resgisters inside CL_HBM_WRAPPER and CL_KERNEL_REGS: +The table below describes the registers available in CL_HBM_AXI4 block. This includes registers inside CL_HBM_WRAPPER and CL_KERNEL_REGS: | OCL Address offset | Register Name | Bits | Access | Default Value | Description | |--------------------|-------------------|------|--------|---------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| @@ -193,12 +187,12 @@ The table below describes the registers available in CL_HBM_AXI4 block. This inc | | | 0 | RW | 0x0 | 1'b1 : Reset HBM IP | | | | | | | | | 0x400 | KERN_CFG_REG | 31:1 | RW | 0x0 | Reserved | -| | | 0 | RW | 0x0 | 1'b1 : Enable HBM Channel#0 MUX to drive AXI3 traffic from CL_AXI_CTL#0 to HBM. NOTE: This bit must be set inorder to use CL_HBM_PERF_KERNEL | +| | | 0 | RW | 0x0 | 1'b1 : Enable HBM Channel#0 MUX to drive AXI3 traffic from CL_AXI_CTL#0 to HBM. NOTE: This bit must be set in order to use CL_HBM_PERF_KERNEL | | 0x404 | CHANNEL_AVAIL_REG | 31:0 | RO | 0x20 | total number of HBM channels available for CL_HBM_PERF_KERNEL | | 0x408 | NUM_OT_REG | 31:0 | RO | 0x40 | Number of Outstanding Transactions supported | | 0x40C | CHNL_SEL_REG | 31:0 | RW | 0x0 | Select the Channel number to measure write and read latencies. This field is 0-based. Max Value = 31. | | 0x410 | AXLEN_REG | 31:0 | RW | 0x0 | AWLEN/ARLEN to use. This field is 0-based and the value will be used to drive axi_awlen and axi_arlen signals to HBM. | -| 0x414 | WDATA_PATTERN_REG | 31:0 | RW | 0x0 | Initial 32-bit data patten for writes | +| 0x414 | WDATA_PATTERN_REG | 31:0 | RW | 0x0 | Initial 32-bit data pattern for writes | | 0x418 | WR_CTL_REG | 31:0 | RW | 0x0 | Start write transactions on each channel. Each bit corresponds to a HBM channel. bit[0] = Start write transfers on HBM Channel#0 bit[1] = Start write transfers on HBM Channel#1 .. bit[31] = Start write transfers on HBM Channel#31 | | 0x41C | RD_CTL_REG | 31:0 | RW | 0x0 | Start Read transactions on each channel. Each bit corresponds to a HBM channel. bit[0] = Start Read transfers on HBM Channel#0 bit[1] = Start Read transfers on HBM Channel#1 .. bit[31] = Start Read transfers on HBM Channel#31 | | 0x430 | WR_CYC_CNT_LO_REG | 31:0 | RW | 0x0 | Total number of write requests to HBM aggregated across all HBM channels. LSB 32 bits. SW write 0 to clear. | @@ -207,29 +201,26 @@ The table below describes the registers available in CL_HBM_AXI4 block. This inc | 0x43C | WR_TIMER_HI_REG | 31:0 | RW | 0x0 | Timer during which Write requests were in progress. MSB 32 bits. SW write 0 to WR_TIMER_LO_REG to clear. | | 0x440 | WR_LATENCY_REG | 31:0 | RW | 0x0 | Measure latency between first AW request and B-response from HBM Channel specified in CHNL_SEL_REG | | 0x444 | WR_OT_REG | 31:0 | RO | 0x0 | Pending write requests in the queue. | -| 0x448 | BRESP_ERR_REG | 31:0 | RW | 0x0 | 1 : Bresp error ffrom HBM Channel# corresponding to that bit. SW writes 0 to clear the bit | +| 0x448 | BRESP_ERR_REG | 31:0 | RW | 0x0 | 1'b1 : Bresp error from HBM Channel# corresponding to that bit. SW writes 0 to clear the bit | | 0x450 | RD_CYC_CNT_LO_REG | 31:0 | RW | 0x0 | Total number of Read requests to HBM aggregated across all HBM channels. LSB 32 bits. SW write 0 to clear. | | 0x454 | RD_CYC_CNT_HI_REG | 31:0 | RW | 0x0 | Total number of Read requests to HBM aggregated across all HBM channels. MSB 32 bits. SW write 0 to RD_CYC_CNT_LO_REG to clear this reg. | | 0x458 | RD_TIMER_LO_REG | 31:0 | RW | 0x0 | Timer during which Read requests were in progress. LSB 32 bits. SW write 0 to clear. | | 0x45C | RD_TIMER_HI_REG | 31:0 | RW | 0x0 | Timer during which Read requests were in progress. MSB 32 bits. SW write 0 to RD_TIMER_LO_REG to clear. | | 0x460 | RD_LATENCY_REG | 31:0 | RW | 0x0 | Measure latency between first AR request and R-last response from HBM Channel specified in CHNL_SEL_REG | | 0x464 | RD_OT_REG | 31:0 | RO | 0x0 | Pending Read requests in the queue. | -| 0x468 | RRESP_ERR_REG | 31:0 | RW | 0x0 | 1 : Rresp error ffrom HBM Channel# corresponding to that bit. SW writes 0 to clear the bit | +| 0x468 | RRESP_ERR_REG | 31:0 | RW | 0x0 | 1'b1 : Rresp error from HBM Channel# corresponding to that bit. SW writes 0 to clear the bit | - ## SDA Memory Address Space | Target | Start Address | End Address | Notes | |---------------|---------------|---------------|--------------------------------------| -| SDA_SLV (BRAM)| 0x0 | 0x0004_FFFF | 1KiB BRAM. Upper address rolls over. | -| AWS_CLK_GEN | 0x0050_0000 | 0xFFFF_FFFF | | +| SDA_SLV (BRAM)| 0x0000_0000 | 0x0004_FFFF | 1KB BRAM. Upper address rolls over. | +| AWS_CLK_GEN | 0x0050_0000 | 0xFFFF_FFFF | [AWS_CLK_GEN specifiction](./../../../docs/AWS_CLK_GEN_spec.md)| - # Simulations Please see more details on running simulations in this [README](verif/README.md) - # Software DMA accesses rely on the [XDMA driver](https://github.com/Xilinx/dma_ip_drivers) @@ -257,13 +248,11 @@ This test uses [CL_CLK_FREQ](design/cl_clk_freq.sv) to measure the clock frequen This test uses AWS APIs to configure clock frequencies into [AWS_CLK_GEN](./../../../common/lib/aws_clk_gen.sv) block - ### Compile and run instructions + ```bash cd $CL_DIR/software/runtime - make all - sudo ./test_dram_hbm_dma ``` @@ -272,34 +261,37 @@ sudo ./test_dram_hbm_dma This test runs a software test with HW/SW co-simulation enabled with both DDR and HBM enabled. ### Compile and run instructions + ```bash cd $CL_DIR/software/runtime - make TEST=test_dram_hbm_dma_hwsw_cosim - sudo ./test_dram_hbm_dma_hwsw_cosim ``` + The test can be simulated with XSIM as follows. + ```bash cd $CL_DIR/verif/scripts - make C_TEST=test_dram_hbm_dma_hwsw_cosim ``` - # HBM Performance Tests + A runtime test is provided to measure HBM performance aggregated across all 32 HBM Channels. The runtime test should be run on a real machine consisting of F2 FPGA loaded with CL_MEM_PERF bitstreams. The runtime test [test_hbm_perf32.c](software/runtime/test_hbm_perf32.c) exercises [CL_HBM_PERF_KERNEL](design/cl_hbm_perf_kernel.sv) module to generate data across all 32 channels of the HBM running at 450MHz speeds. The test configures to run traffic across all 32 channels. There are config registers in CL_HBM_PERF_KERNEL that keep track of the number of write/read requests that were serviced and timers during which the CL_HBM_PERF_KERNEL was busy servicing the AXI3 Channels of HBM. The runtime test reads these transaction counters to compute the aggregate HBM performance across all the channels. ## Instructions to run HBM Performance Test -``` +Run the following commands to start the runtime test + +```bash cd $CL_DIR/software/runtime make all sudo ./test_hbm_perf32 ``` -Sample Output: -``` +Sample output: + +```bash =================================================== Running test_hbm_perf32 =================================================== diff --git a/hdk/cl/examples/cl_mem_perf/build/constraints/cl_synth_user.xdc b/hdk/cl/examples/cl_mem_perf/build/constraints/cl_synth_user.xdc index a9a115428..160f6090c 100644 --- a/hdk/cl/examples/cl_mem_perf/build/constraints/cl_synth_user.xdc +++ b/hdk/cl/examples/cl_mem_perf/build/constraints/cl_synth_user.xdc @@ -1,3 +1,21 @@ +# ============================================================================= +# Amazon FPGA Hardware Development Kit +# +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# +# Licensed under the Amazon Software License (the "License"). You may not use +# this file except in compliance with the License. A copy of the License is +# located at +# +# http://aws.amazon.com/asl/ +# +# or in the "license" file accompanying this file. This file is distributed on +# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or +# implied. See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================= + + ############################################################################### # This contains the CL specific constraints for synthesis at the CL leve ############################################################################### diff --git a/hdk/cl/examples/cl_mem_perf/build/constraints/cl_timing_user.xdc b/hdk/cl/examples/cl_mem_perf/build/constraints/cl_timing_user.xdc index f0c7be3fb..6b20ae57f 100644 --- a/hdk/cl/examples/cl_mem_perf/build/constraints/cl_timing_user.xdc +++ b/hdk/cl/examples/cl_mem_perf/build/constraints/cl_timing_user.xdc @@ -1,3 +1,21 @@ +# ============================================================================= +# Amazon FPGA Hardware Development Kit +# +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# +# Licensed under the Amazon Software License (the "License"). You may not use +# this file except in compliance with the License. A copy of the License is +# located at +# +# http://aws.amazon.com/asl/ +# +# or in the "license" file accompanying this file. This file is distributed on +# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or +# implied. See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================= + + ############################################################################### # This contains the CL specific timing constraints for CL ############################################################################### diff --git a/hdk/cl/examples/cl_mem_perf/build/constraints/small_shell_cl_pnr_user.xdc b/hdk/cl/examples/cl_mem_perf/build/constraints/small_shell_cl_pnr_user.xdc index 9cf3d025d..d901650b9 100644 --- a/hdk/cl/examples/cl_mem_perf/build/constraints/small_shell_cl_pnr_user.xdc +++ b/hdk/cl/examples/cl_mem_perf/build/constraints/small_shell_cl_pnr_user.xdc @@ -1,8 +1,18 @@ # ============================================================================= -# Copyright 2021 Amazon.com, Inc. or its affiliates. -# All Rights Reserved Worldwide. -# Amazon Confidential information -# Restricted NDA Material +# Amazon FPGA Hardware Development Kit +# +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# +# Licensed under the Amazon Software License (the "License"). You may not use +# this file except in compliance with the License. A copy of the License is +# located at +# +# http://aws.amazon.com/asl/ +# +# or in the "license" file accompanying this file. This file is distributed on +# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or +# implied. See the License for the specific language governing permissions and +# limitations under the License. # ============================================================================= diff --git a/hdk/cl/examples/cl_mem_perf/build/constraints/xdma_shell_cl_pnr_user.xdc b/hdk/cl/examples/cl_mem_perf/build/constraints/xdma_shell_cl_pnr_user.xdc index 4894e5adc..fa44fae41 100644 --- a/hdk/cl/examples/cl_mem_perf/build/constraints/xdma_shell_cl_pnr_user.xdc +++ b/hdk/cl/examples/cl_mem_perf/build/constraints/xdma_shell_cl_pnr_user.xdc @@ -1,8 +1,18 @@ # ============================================================================= -# Copyright 2021 Amazon.com, Inc. or its affiliates. -# All Rights Reserved Worldwide. -# Amazon Confidential information -# Restricted NDA Material +# Amazon FPGA Hardware Development Kit +# +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# +# Licensed under the Amazon Software License (the "License"). You may not use +# this file except in compliance with the License. A copy of the License is +# located at +# +# http://aws.amazon.com/asl/ +# +# or in the "license" file accompanying this file. This file is distributed on +# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or +# implied. See the License for the specific language governing permissions and +# limitations under the License. # ============================================================================= diff --git a/hdk/cl/examples/cl_mem_perf/build/scripts/encrypt.tcl b/hdk/cl/examples/cl_mem_perf/build/scripts/encrypt.tcl index 3b2cdf6d2..07e415bad 100644 --- a/hdk/cl/examples/cl_mem_perf/build/scripts/encrypt.tcl +++ b/hdk/cl/examples/cl_mem_perf/build/scripts/encrypt.tcl @@ -1,6 +1,7 @@ +# ============================================================================= # Amazon FPGA Hardware Development Kit # -# Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Amazon Software License (the "License"). You may not use # this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or # implied. See the License for the specific language governing permissions and # limitations under the License. +# ============================================================================= + # TODO: # Add check if CL_DIR and HDK_SHELL_DIR directories exist diff --git a/hdk/cl/examples/cl_mem_perf/build/scripts/synth_cl_mem_perf.tcl b/hdk/cl/examples/cl_mem_perf/build/scripts/synth_cl_mem_perf.tcl index 944df6598..09c687407 100644 --- a/hdk/cl/examples/cl_mem_perf/build/scripts/synth_cl_mem_perf.tcl +++ b/hdk/cl/examples/cl_mem_perf/build/scripts/synth_cl_mem_perf.tcl @@ -1,6 +1,7 @@ +# ============================================================================= # Amazon FPGA Hardware Development Kit # -# Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Amazon Software License (the "License"). You may not use # this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or # implied. See the License for the specific language governing permissions and # limitations under the License. +# ============================================================================= + # Common header diff --git a/hdk/cl/examples/cl_mem_perf/design/cl_axi_ctl.sv b/hdk/cl/examples/cl_mem_perf/design/cl_axi_ctl.sv index fb0eee7cf..53c217d54 100644 --- a/hdk/cl/examples/cl_mem_perf/design/cl_axi_ctl.sv +++ b/hdk/cl/examples/cl_mem_perf/design/cl_axi_ctl.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,9 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + + /////////////////////////////////////////////////////////////////////////////////////// // CL_AXI_CTL // ---------- diff --git a/hdk/cl/examples/cl_mem_perf/design/cl_clk_freq.sv b/hdk/cl/examples/cl_mem_perf/design/cl_clk_freq.sv index 9cd513082..a33e20180 100644 --- a/hdk/cl/examples/cl_mem_perf/design/cl_clk_freq.sv +++ b/hdk/cl/examples/cl_mem_perf/design/cl_clk_freq.sv @@ -1,7 +1,7 @@ -/////////////////////////////////////////////////////////////////////////////////// +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -13,6 +13,9 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + + /////////////////////////////////////////////////////////////////////////////////// // Module // ------- diff --git a/hdk/cl/examples/cl_mem_perf/design/cl_hbm_perf_kernel.sv b/hdk/cl/examples/cl_mem_perf/design/cl_hbm_perf_kernel.sv index 85651cf39..126b4a5fd 100644 --- a/hdk/cl/examples/cl_mem_perf/design/cl_hbm_perf_kernel.sv +++ b/hdk/cl/examples/cl_mem_perf/design/cl_hbm_perf_kernel.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,9 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + + /////////////////////////////////////////////////////////////////////////////////////// // CL_HBM_PERF_KERNEL // ------------------- diff --git a/hdk/cl/examples/cl_mem_perf/design/cl_id_defines.vh b/hdk/cl/examples/cl_mem_perf/design/cl_id_defines.vh index 0740b0808..2ddf9ee45 100644 --- a/hdk/cl/examples/cl_mem_perf/design/cl_id_defines.vh +++ b/hdk/cl/examples/cl_mem_perf/design/cl_id_defines.vh @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + // CL_SH_ID0 // - PCIe Vendor/Device ID Values diff --git a/hdk/cl/examples/cl_mem_perf/design/cl_kernel_ctl.sv b/hdk/cl/examples/cl_mem_perf/design/cl_kernel_ctl.sv index aa239e760..5956f75d4 100644 --- a/hdk/cl/examples/cl_mem_perf/design/cl_kernel_ctl.sv +++ b/hdk/cl/examples/cl_mem_perf/design/cl_kernel_ctl.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,9 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + + /////////////////////////////////////////////////////////////////////////////////////// // CL_KERNEL_CTL // -------------- diff --git a/hdk/cl/examples/cl_mem_perf/design/cl_kernel_regs.sv b/hdk/cl/examples/cl_mem_perf/design/cl_kernel_regs.sv index d8651757a..44ee059f9 100644 --- a/hdk/cl/examples/cl_mem_perf/design/cl_kernel_regs.sv +++ b/hdk/cl/examples/cl_mem_perf/design/cl_kernel_regs.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,9 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + + /////////////////////////////////////////////////////////////////////////////////////// // CL_KERNEL_REGS // -------------- diff --git a/hdk/cl/examples/cl_mem_perf/design/cl_kernel_req.sv b/hdk/cl/examples/cl_mem_perf/design/cl_kernel_req.sv index 948ae9ffb..2d2918d88 100644 --- a/hdk/cl/examples/cl_mem_perf/design/cl_kernel_req.sv +++ b/hdk/cl/examples/cl_mem_perf/design/cl_kernel_req.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,9 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + + /////////////////////////////////////////////////////////////////////////////////////// // CL_KERNEL_REQ // -------------- diff --git a/hdk/cl/examples/cl_mem_perf/design/cl_mem_hbm_axi4.sv b/hdk/cl/examples/cl_mem_perf/design/cl_mem_hbm_axi4.sv index b9d8cfb0d..5765d4c58 100644 --- a/hdk/cl/examples/cl_mem_perf/design/cl_mem_hbm_axi4.sv +++ b/hdk/cl/examples/cl_mem_perf/design/cl_mem_hbm_axi4.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + //============================================================================= // CL_MEM_HBM_AXI4 diff --git a/hdk/cl/examples/cl_mem_perf/design/cl_mem_hbm_wrapper.sv b/hdk/cl/examples/cl_mem_perf/design/cl_mem_hbm_wrapper.sv index 29076fca3..0426a12bd 100644 --- a/hdk/cl/examples/cl_mem_perf/design/cl_mem_hbm_wrapper.sv +++ b/hdk/cl/examples/cl_mem_perf/design/cl_mem_hbm_wrapper.sv @@ -1,7 +1,7 @@ -//------------------------------------------------------------------------------------------------------------------------------- +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -13,8 +13,9 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. -// Restricted NDA Material -//------------------------------------------------------------------------------------------------------------------------------- +// ============================================================================ + + //=============================================================================================================================== // HBM Wrapper // - Wraper for HBM IP diff --git a/hdk/cl/examples/cl_mem_perf/design/cl_mem_ocl_dec.sv b/hdk/cl/examples/cl_mem_perf/design/cl_mem_ocl_dec.sv index 4255199ca..c48e21950 100644 --- a/hdk/cl/examples/cl_mem_perf/design/cl_mem_ocl_dec.sv +++ b/hdk/cl/examples/cl_mem_perf/design/cl_mem_ocl_dec.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,9 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + + //=============================================================================================================================== // OCL Decode // pcim_tst_cfg_bus = 0x000 - 0x0FF diff --git a/hdk/cl/examples/cl_mem_perf/design/cl_mem_pcis_dec.sv b/hdk/cl/examples/cl_mem_perf/design/cl_mem_pcis_dec.sv index 223466bbb..329a4f501 100644 --- a/hdk/cl/examples/cl_mem_perf/design/cl_mem_pcis_dec.sv +++ b/hdk/cl/examples/cl_mem_perf/design/cl_mem_pcis_dec.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + //============================================================================= // PCIS Decode diff --git a/hdk/cl/examples/cl_mem_perf/design/cl_mem_perf.sv b/hdk/cl/examples/cl_mem_perf/design/cl_mem_perf.sv index 39920b60e..7fd4157b6 100644 --- a/hdk/cl/examples/cl_mem_perf/design/cl_mem_perf.sv +++ b/hdk/cl/examples/cl_mem_perf/design/cl_mem_perf.sv @@ -1,7 +1,7 @@ -//============================================================================= +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -13,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + //============================================================================= // Top level module file for CL_MEM_PERF diff --git a/hdk/cl/examples/cl_mem_perf/design/cl_mem_perf_defines.vh b/hdk/cl/examples/cl_mem_perf/design/cl_mem_perf_defines.vh index d92bf4d05..7d368bfae 100644 --- a/hdk/cl/examples/cl_mem_perf/design/cl_mem_perf_defines.vh +++ b/hdk/cl/examples/cl_mem_perf/design/cl_mem_perf_defines.vh @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + `ifndef CL_MEM_PERF_DEFINES `define CL_MEM_PERF_DEFINES diff --git a/hdk/cl/examples/cl_mem_perf/software/include/cl_dram_dma.h b/hdk/cl/examples/cl_mem_perf/software/include/cl_dram_dma.h index c35a76f66..7d7a29f97 100644 --- a/hdk/cl/examples/cl_mem_perf/software/include/cl_dram_dma.h +++ b/hdk/cl/examples/cl_mem_perf/software/include/cl_dram_dma.h @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -11,4 +12,5 @@ // or in the "license" file accompanying this file. This file is distributed on // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and -// limitations under the License. \ No newline at end of file +// limitations under the License. +// ============================================================================ diff --git a/hdk/cl/examples/cl_mem_perf/software/include/sh_dpi_tasks.h b/hdk/cl/examples/cl_mem_perf/software/include/sh_dpi_tasks.h index 9c7a39127..f74162e62 100644 --- a/hdk/cl/examples/cl_mem_perf/software/include/sh_dpi_tasks.h +++ b/hdk/cl/examples/cl_mem_perf/software/include/sh_dpi_tasks.h @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + #ifndef SH_DPI_TASKS #define SH_DPI_TASKS diff --git a/hdk/cl/examples/cl_mem_perf/software/runtime/Makefile b/hdk/cl/examples/cl_mem_perf/software/runtime/Makefile index fee640cac..be4dcd394 100644 --- a/hdk/cl/examples/cl_mem_perf/software/runtime/Makefile +++ b/hdk/cl/examples/cl_mem_perf/software/runtime/Makefile @@ -1,6 +1,7 @@ +# ============================================================================= # Amazon FPGA Hardware Development Kit # -# Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Amazon Software License (the "License"). You may not use # this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or # implied. See the License for the specific language governing permissions and # limitations under the License. +# ============================================================================= + INCLUDES = -I$(SDK_DIR)/userspace/include diff --git a/hdk/cl/examples/cl_mem_perf/software/runtime/test_aws_clk_gen.c b/hdk/cl/examples/cl_mem_perf/software/runtime/test_aws_clk_gen.c index 91d647ae4..33c567d31 100644 --- a/hdk/cl/examples/cl_mem_perf/software/runtime/test_aws_clk_gen.c +++ b/hdk/cl/examples/cl_mem_perf/software/runtime/test_aws_clk_gen.c @@ -1,19 +1,21 @@ -/* - * Amazon FPGA Hardware Development Kit - * - * Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Amazon Software License (the "License"). You may not use - * this file except in compliance with the License. A copy of the License is - * located at - * - * http://aws.amazon.com/asl/ - * - * or in the "license" file accompanying this file. This file is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or - * implied. See the License for the specific language governing permissions and - * limitations under the License. - */ +// ============================================================================ +// Amazon FPGA Hardware Development Kit +// +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// +// Licensed under the Amazon Software License (the "License"). You may not use +// this file except in compliance with the License. A copy of the License is +// located at +// +// http://aws.amazon.com/asl/ +// +// or in the "license" file accompanying this file. This file is distributed on +// an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or +// implied. See the License for the specific language governing permissions and +// limitations under the License. +// ============================================================================ + + //-------------------------------------------------------------------------------------- // Measure frequency of clocks from AWS_CLK_GEN IP // NOTE: Works only on cl_dram_hbm_dma bitstreams diff --git a/hdk/cl/examples/cl_mem_perf/software/runtime/test_clk_freq.c b/hdk/cl/examples/cl_mem_perf/software/runtime/test_clk_freq.c index 3ff3a9e22..a3ab8b62a 100644 --- a/hdk/cl/examples/cl_mem_perf/software/runtime/test_clk_freq.c +++ b/hdk/cl/examples/cl_mem_perf/software/runtime/test_clk_freq.c @@ -1,19 +1,21 @@ -/* - * Amazon FPGA Hardware Development Kit - * - * Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Amazon Software License (the "License"). You may not use - * this file except in compliance with the License. A copy of the License is - * located at - * - * http://aws.amazon.com/asl/ - * - * or in the "license" file accompanying this file. This file is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or - * implied. See the License for the specific language governing permissions and - * limitations under the License. - */ +// ============================================================================ +// Amazon FPGA Hardware Development Kit +// +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// +// Licensed under the Amazon Software License (the "License"). You may not use +// this file except in compliance with the License. A copy of the License is +// located at +// +// http://aws.amazon.com/asl/ +// +// or in the "license" file accompanying this file. This file is distributed on +// an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or +// implied. See the License for the specific language governing permissions and +// limitations under the License. +// ============================================================================ + + //-------------------------------------------------------------------------------------- // Dynamically configure clock frequencies using AWS_CLK_GEN block // NOTE: Works only on cl_dram_hbm_dma bitstreams diff --git a/hdk/cl/examples/cl_mem_perf/software/runtime/test_dram_dma_common.c b/hdk/cl/examples/cl_mem_perf/software/runtime/test_dram_dma_common.c index 3591aaf3c..2c2fcd44e 100644 --- a/hdk/cl/examples/cl_mem_perf/software/runtime/test_dram_dma_common.c +++ b/hdk/cl/examples/cl_mem_perf/software/runtime/test_dram_dma_common.c @@ -1,19 +1,20 @@ -/* - * Amazon FPGA Hardware Development Kit - * - * Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Amazon Software License (the "License"). You may not use - * this file except in compliance with the License. A copy of the License is - * located at - * - * http://aws.amazon.com/asl/ - * - * or in the "license" file accompanying this file. This file is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or - * implied. See the License for the specific language governing permissions and - * limitations under the License. - */ +// ============================================================================ +// Amazon FPGA Hardware Development Kit +// +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// +// Licensed under the Amazon Software License (the "License"). You may not use +// this file except in compliance with the License. A copy of the License is +// located at +// +// http://aws.amazon.com/asl/ +// +// or in the "license" file accompanying this file. This file is distributed on +// an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or +// implied. See the License for the specific language governing permissions and +// limitations under the License. +// ============================================================================ + #include #include diff --git a/hdk/cl/examples/cl_mem_perf/software/runtime/test_dram_dma_common.h b/hdk/cl/examples/cl_mem_perf/software/runtime/test_dram_dma_common.h index 225cc4d0f..492950218 100644 --- a/hdk/cl/examples/cl_mem_perf/software/runtime/test_dram_dma_common.h +++ b/hdk/cl/examples/cl_mem_perf/software/runtime/test_dram_dma_common.h @@ -1,19 +1,20 @@ -/* - * Amazon FPGA Hardware Development Kit - * - * Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Amazon Software License (the "License"). You may not use - * this file except in compliance with the License. A copy of the License is - * located at - * - * http://aws.amazon.com/asl/ - * - * or in the "license" file accompanying this file. This file is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or - * implied. See the License for the specific language governing permissions and - * limitations under the License. - */ +// ============================================================================ +// Amazon FPGA Hardware Development Kit +// +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// +// Licensed under the Amazon Software License (the "License"). You may not use +// this file except in compliance with the License. A copy of the License is +// located at +// +// http://aws.amazon.com/asl/ +// +// or in the "license" file accompanying this file. This file is distributed on +// an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or +// implied. See the License for the specific language governing permissions and +// limitations under the License. +// ============================================================================ + #pragma once diff --git a/hdk/cl/examples/cl_mem_perf/software/runtime/test_dram_dma_hwsw_cosim.c b/hdk/cl/examples/cl_mem_perf/software/runtime/test_dram_dma_hwsw_cosim.c index 5444622af..fa95bb4c7 100644 --- a/hdk/cl/examples/cl_mem_perf/software/runtime/test_dram_dma_hwsw_cosim.c +++ b/hdk/cl/examples/cl_mem_perf/software/runtime/test_dram_dma_hwsw_cosim.c @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + #include #include @@ -62,7 +65,7 @@ int test_main(uint32_t *exit_code) #elif defined(SV_TEST) void test_main(uint32_t *exit_code) -#else +#else int main(int argc, char **argv) #endif diff --git a/hdk/cl/examples/cl_mem_perf/software/runtime/test_dram_hbm_dma.c b/hdk/cl/examples/cl_mem_perf/software/runtime/test_dram_hbm_dma.c index 40ce9893c..d3928d0ea 100644 --- a/hdk/cl/examples/cl_mem_perf/software/runtime/test_dram_hbm_dma.c +++ b/hdk/cl/examples/cl_mem_perf/software/runtime/test_dram_hbm_dma.c @@ -1,19 +1,20 @@ -/* - * Amazon FPGA Hardware Development Kit - * - * Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Amazon Software License (the "License"). You may not use - * this file except in compliance with the License. A copy of the License is - * located at - * - * http://aws.amazon.com/asl/ - * - * or in the "license" file accompanying this file. This file is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or - * implied. See the License for the specific language governing permissions and - * limitations under the License. - */ +// ============================================================================ +// Amazon FPGA Hardware Development Kit +// +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// +// Licensed under the Amazon Software License (the "License"). You may not use +// this file except in compliance with the License. A copy of the License is +// located at +// +// http://aws.amazon.com/asl/ +// +// or in the "license" file accompanying this file. This file is distributed on +// an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or +// implied. See the License for the specific language governing permissions and +// limitations under the License. +// ============================================================================ + #include #include diff --git a/hdk/cl/examples/cl_mem_perf/software/runtime/test_hbm_perf32.c b/hdk/cl/examples/cl_mem_perf/software/runtime/test_hbm_perf32.c index 2b9c01664..50b91790b 100644 --- a/hdk/cl/examples/cl_mem_perf/software/runtime/test_hbm_perf32.c +++ b/hdk/cl/examples/cl_mem_perf/software/runtime/test_hbm_perf32.c @@ -1,19 +1,21 @@ -/* - * Amazon FPGA Hardware Development Kit - * - * Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Amazon Software License (the "License"). You may not use - * this file except in compliance with the License. A copy of the License is - * located at - * - * http://aws.amazon.com/asl/ - * - * or in the "license" file accompanying this file. This file is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or - * implied. See the License for the specific language governing permissions and - * limitations under the License. - */ +// ============================================================================ +// Amazon FPGA Hardware Development Kit +// +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// +// Licensed under the Amazon Software License (the "License"). You may not use +// this file except in compliance with the License. A copy of the License is +// located at +// +// http://aws.amazon.com/asl/ +// +// or in the "license" file accompanying this file. This file is distributed on +// an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or +// implied. See the License for the specific language governing permissions and +// limitations under the License. +// ============================================================================ + + //-------------------------------------------------------------------------------------- // Measure HBM performance by enabling all the 32 channels in HBM // NOTE: Works only on cl_dram_hbm_dma bitstreams diff --git a/hdk/cl/examples/cl_mem_perf/software/src/test_dram_dma.c b/hdk/cl/examples/cl_mem_perf/software/src/test_dram_dma.c index 8b230ba34..acbb39c30 100644 --- a/hdk/cl/examples/cl_mem_perf/software/src/test_dram_dma.c +++ b/hdk/cl/examples/cl_mem_perf/software/src/test_dram_dma.c @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + #include #include diff --git a/hdk/cl/examples/cl_mem_perf/software/src/test_null.c b/hdk/cl/examples/cl_mem_perf/software/src/test_null.c index 13b81b3a6..04c278623 100644 --- a/hdk/cl/examples/cl_mem_perf/software/src/test_null.c +++ b/hdk/cl/examples/cl_mem_perf/software/src/test_null.c @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,7 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ #include diff --git a/hdk/cl/examples/cl_mem_perf/verif/README.md b/hdk/cl/examples/cl_mem_perf/verif/README.md index 8bc70a257..480972101 100644 --- a/hdk/cl/examples/cl_mem_perf/verif/README.md +++ b/hdk/cl/examples/cl_mem_perf/verif/README.md @@ -1,8 +1,51 @@ -This readme provides information about the simulation environment for the cl_mem_perf example. For more details about overall HDK simulation environment and CL bringup in simulation please refer to [RTL Simulation Guide for HDK Design Flow](../../../../docs/RTL_Simulation_Guide_for_HDK_Design_Flow.md). -# CL_MEM_PERF example simulation - -The system verilog simulation tests can be run from the [$CL_DIR/verif/scripts](scripts) directory with all supported simulators (HBM is only supported in VCS & QUESTA). You can run tests by calling the make target for that test located in [$CL_DIR/verif/scripts/Makefile.tests](Makefile.tests): +# CL_MEM_PERF Example Simulation + +## Table of Contents + +- [CL\_MEM\_PERF Example Simulation](#cl_mem_perf-example-simulation) + - [Table of Contents](#table-of-contents) + - [Overview](#overview) + - [Dump Waves](#dump-waves) + - [System Verilog Tests](#system-verliog-tests) + - [test\_aws\_clk\_gen\_recipe.sv (VCS and QUESTA only)](#test_aws_clk_gen_recipesv-vcs-and-questa-only) + - [test\_clk\_recipe.sv](#test_clk_recipesv) + - [test\_ddr\_peek\_poke.sv](#test_ddr_peek_pokesv) + - [test\_ddr.sv](#test_ddrsv) + - [test\_hbm.sv](#test_hbmsv) + - [test\_hbm\_perf32.sv](#test_hbm_perf32sv) + - [test\_hbm\_perf\_kernel\_cfg.sv](#test_hbm_perf_kernel_cfgsv) + - [test\_hbm\_perf\_random.sv](#test_hbm_perf_randomsv) + - [test\_dram\_dma.sv](#test_dram_dmasv) + - [test\_dram\_dma\_rnd.sv](#test_dram_dma_rndsv) + - [test\_dma\_pcim\_concurrent.sv](#test_dma_pcim_concurrentsv) + - [test\_dma\_pcis\_concurrent.sv](#test_dma_pcis_concurrentsv) + - [test\_dma\_sda\_concurrent.sv](#test_dma_sda_concurrentsv) + - [test\_dram\_dma\_4k\_crossing.sv](#test_dram_dma_4k_crossingsv) + - [test\_dram\_dma\_allgn\_addr\_4k.sv](#test_dram_dma_allgn_addr_4ksv) + - [test\_dram\_dma\_single\_beat\_4k.sv](#test_dram_dma_single_beat_4ksv) + - [test\_dram\_dma\_axi\_mstr.sv](#test_dram_dma_axi_mstrsv) + - [test\_int.sv](#test_intsv) + - [test\_peek\_poke.sv](#test_peek_pokesv) + - [test\_peek\_poke\_wc.sv](#test_peek_poke_wcsv) + - [test\_peek\_poke\_len.sv](#test_peek_poke_lensv) + - [test\_peek\_poke\_rnd\_lengths.sv](#test_peek_poke_rnd_lengthssv) + - [test\_peek\_poke\_pcis\_axsize.sv](#test_peek_poke_pcis_axsizesv) + - [test\_ddr\_peek\_bdr\_walking\_ones](#test_ddr_peek_bdr_walking_ones) + - [test\_sda.sv](#test_sdasv) + - [test\_null.sv](#test_nullsv) + - [AXI\_MEMORY\_MODEL Mode Simulations](#axi_memory_model-mode-simulations) + - [test\_dram\_dma\_mem\_model\_bdr\_wr](#test_dram_dma_mem_model_bdr_wr) + - [test\_dram\_dma\_mem\_model\_bdr\_rd](#test_dram_dma_mem_model_bdr_rd) + - [DDR Backdoor Loading](#ddr-backdoor-loading) + - [HW/SW Co-Simulation Test](#hwsw-co-simulation-test) + + +## Overview + +This readme provides information about the simulation environment for the `cl_mem_perf` example. For more details about overall HDK simulation environment and CL bringup in simulation please refer to [RTL Simulation Guide for HDK Design Flow](../../../../docs/RTL_Simulation_Guide_for_HDK_Design_Flow.md). + +The SystemVerilog (SV) simulation can be run from the `$CL_DIR/verif/scripts/` directory with all supported simulators (HBM simulation using VCS & QUESTA is strongly recommended). You can run tests by calling the make target for that test located in `$CL_DIR/verif/scripts/Makefile.tests`: ```bash make test_ddr # Runs with XSIM by default @@ -12,23 +55,13 @@ make test_ddr QUESTA=1 make test_hbm # Runs with VCS by default ``` -Alternatively, you can run each test by setting TEST= followed by the environment variables required to run that test. +Alternatively, you can run each test by setting `TEST=\` followed by the environment variables required to run that test. ```bash make TEST=test_dram_dma # Runs with XSIM by default make TEST=test_dram_dma VCS=1 make TEST=test_dram_dma QUESTA=1 -# To Run simulations with a 32 GB DDR DIMM (without user-controlled auto-precharge mode) -make TEST=test_dram_dma USE_32GB_DDR_DIMM=1 - -# To Run simulations with a 32 GB DDR DIMM (with user-controlled auto-precharge mode) -make TEST=test_dram_dma USE_AP_32GB_DDR_DIMM=1 - -# To Run simulations with a 64 GB DDR DIMM (without user-controlled auto-precharge mode) -# NOTE: CL_DRAM_HBM_DMA does not currently have a datapath to all 64 GB of DDR. Only first 32GB is accessible. -make TEST=test_dram_dma USE_64GB_DDR_DIMM=1 - # To Run simulations with a 64 GB DDR DIMM # With user-controlled auto-precharge mode make TEST=test_dram_dma USE_AP_64GB_DDR_DIMM=1 @@ -50,7 +83,7 @@ test_ddr_peek_bdr_walking_ones **NOTE**: Please refer to [Supported_DDR_Modes.md](./../../../../docs/Supported_DDR_Modes.md) for details on supported DDR configurations. -The HW/SW co-simulation tests can be run from the [verif/scripts](scripts) directory with all supported simulators: +The HW/SW co-simulation tests can be run from the `verif/scripts/` directory with all supported simulators: ```bash make C_TEST=test_dram_dma_hwsw_cosim # Runs with XSIM by default @@ -69,9 +102,9 @@ Note that the appropriate simulators must be installed. For information about how to dump waves with XSIM or VCS, please refer to [debugging-custom-logic-using-the-aws-hdk](../../../../docs/RTL_Simulation_Guide_for_HDK_Design_Flow.md#debugging-custom-logic-using-the-aws-hdk) -## System Verliog Tests +## System Verilog Tests -The system verilog tests are located at [verif/tests](tests). Most tests include `base_test_utils.svh` which includes common signals and tasks used across tests. Please refer to this file for the DPI-C tasks used. Information about each test can be found below. +The SystemVerilog tests are located at `verif/tests/`. Most tests include `base_test_utils.svh` which includes common signals and tasks used across tests. Please refer to this file for the DPI-C tasks used. Information about each test can be found below. ### test_aws_clk_gen_recipe.sv (VCS and QUESTA only) This test programs valid clock recipes to the CL and verifies the corresponding clock frequencies. @@ -89,10 +122,10 @@ This test programs the CL_TST (ATG) to generate traffic to access all four DDR c This test programs the CL_TST (ATG) to generate traffic to access both HBM stacks. ### test_hbm_perf32.sv -This test programs the HBM performance kernel to run all 32 channels for maximum bandiwdth. The kernel collects timer and bandwidth statistics and stores them in registers. At the end of the test, the performance is calculated and printed in the `sim.log`. +This test programs the HBM performance kernel to run all 32 channels for maximum bandwidth. The kernel collects timer and bandwidth statistics and stores them in registers. At the end of the test, the performance is calculated and printed in the `sim.log`. ### test_hbm_perf_kernel_cfg.sv -This test excercises each register in the HBM performance kernel configuration space. +This test exercises each register in the HBM performance kernel configuration space. ### test_hbm_perf_random.sv This test executes the same flow as `test_hbm_perf32.sv` except with a random axi length and a random number of channels. @@ -142,18 +175,6 @@ This test programs tester block to do PCIM reads and writes with random lengths ### test_peek_poke_pcis_axsize.sv This test does PCIS peek and poke with different sizes. Although shell model allows different size transfers on PCIS interface, Shell only supports transfer of size 6 on PCIS interface. -## _AXI_MEMORY_MODEL mode simulations_ -AXI_MEMORY_MODEL mode can be used for better simulation perfornmance. AXI_MEMORY_MODEL mode enables a test to run with AXI memory models instead of DDR memory. The documentation can be found in AXI memory model section at [RTL simulation guide](../../../../docs/RTL_Simulation_Guide_for_HDK_Design_Flow.md). Any test that accesses DDR memory can be run in AXI_MEMORY_MODEL mode. Below are some example tests for ECC and backdoor loading support features of AXI memory model. - -### test_dram_dma_mem_model_bdr_wr -This test backdoor writes AXI memory model, reads through frontdoor and checks that the data matches. - -### test_dram_dma_mem_model_bdr_rd -This test backdoor reads AXI memory model, writes through frontdoor and checks that the data matches. - -## _DDR backdoor loading_ -The tests below use backdoor loading to populate DDR memory. The description of DDR backdoor loading can be found in DDR backdoor loading support section at [RTL simulation guide](../../../../docs/RTL_Simulation_Guide_for_HDK_Design_Flow.md) - ### test_ddr_peek_bdr_walking_ones DDR test which uses backdoor loading to populate DDR memory. The test writes data(walking ones) for different addresses. The test backdoor loads DDR memory and reads through frontdoor and checks that the data matches. @@ -161,8 +182,22 @@ DDR test which uses backdoor loading to populate DDR memory. The test writes dat This test does transfers to different addresses on SDA AXIL interface. ### test_null.sv -test_null is not an actual test. This is a base system verilog file needed for HW/SW co-simulation +test_null is not an actual test. This is a base SystemVerilog file needed for HW/SW co-simulation + + +## AXI_MEMORY_MODEL Mode Simulations + +AXI_MEMORY_MODEL mode can be used for better simulation performance. AXI_MEMORY_MODEL mode enables a test to run with AXI memory models instead of DDR memory. The documentation can be found in AXI memory model section at [RTL simulation guide](../../../../docs/RTL_Simulation_Guide_for_HDK_Design_Flow.md). Any test that accesses DDR memory can be run in AXI_MEMORY_MODEL mode. Below are some example tests for ECC and backdoor loading support features of AXI memory model. + +### test_dram_dma_mem_model_bdr_wr +This test backdoor writes AXI memory model, reads through frontdoor and checks that the data matches. + +### test_dram_dma_mem_model_bdr_rd +This test backdoor reads AXI memory model, writes through frontdoor and checks that the data matches. + +## DDR Backdoor Loading +The description of DDR backdoor loading can be found in DDR backdoor loading support section at [RTL simulation guide](../../../../docs/RTL_Simulation_Guide_for_HDK_Design_Flow.md) -## HW/SW co-simulation Test +## HW/SW Co-Simulation Test -The software test with HW/SW co-simulation support [test_dram_dma_hwsw_cosim.c](../software/runtime/test_dram_dma_hwsw_cosim.c) can be found at [software/runtime](../software/runtime). For Information about how HW/SW co-simulation support can be added to a software test please refer to "Code changes to enable HW/SW co-simulation" section in [RTL simulation guide](../../../../docs/RTL_Simulation_Guide_for_HDK_Design_Flow.md) +The software test with HW/SW co-simulation support [test_dram_dma_hwsw_cosim.c](../software/runtime/test_dram_dma_hwsw_cosim.c) can be found at `software/runtime/`. For Information about how HW/SW co-simulation support can be added to a software test please refer to "Code changes to enable HW/SW co-simulation" section in [RTL simulation guide](../../../../docs/RTL_Simulation_Guide_for_HDK_Design_Flow.md) diff --git a/hdk/cl/examples/cl_mem_perf/verif/scripts/Makefile b/hdk/cl/examples/cl_mem_perf/verif/scripts/Makefile index 2f8667c36..0d3cc12a0 100644 --- a/hdk/cl/examples/cl_mem_perf/verif/scripts/Makefile +++ b/hdk/cl/examples/cl_mem_perf/verif/scripts/Makefile @@ -1,6 +1,7 @@ +# ============================================================================= # Amazon FPGA Hardware Development Kit # -# Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Amazon Software License (the "License"). You may not use # this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or # implied. See the License for the specific language governing permissions and # limitations under the License. +# ============================================================================= + ifndef HDK_COMMON_DIR $(error Environment variable HDK_COMMON_DIR not set. Please source hdk_setup.sh) diff --git a/hdk/cl/examples/cl_mem_perf/verif/scripts/Makefile.questa b/hdk/cl/examples/cl_mem_perf/verif/scripts/Makefile.questa index a1dbd54a0..2ced9e239 100644 --- a/hdk/cl/examples/cl_mem_perf/verif/scripts/Makefile.questa +++ b/hdk/cl/examples/cl_mem_perf/verif/scripts/Makefile.questa @@ -1,6 +1,7 @@ +# ============================================================================= # Amazon FPGA Hardware Development Kit # -# Copyright 2022 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Amazon Software License (the "License"). You may not use # this file except in compliance with the License. A copy of the License is @@ -12,6 +13,7 @@ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or # implied. See the License for the specific language governing permissions and # limitations under the License. +# ============================================================================= ################################################################## diff --git a/hdk/cl/examples/cl_mem_perf/verif/scripts/Makefile.tests b/hdk/cl/examples/cl_mem_perf/verif/scripts/Makefile.tests index b65f96f11..f4a676721 100644 --- a/hdk/cl/examples/cl_mem_perf/verif/scripts/Makefile.tests +++ b/hdk/cl/examples/cl_mem_perf/verif/scripts/Makefile.tests @@ -1,7 +1,25 @@ +# ============================================================================= +# Amazon FPGA Hardware Development Kit +# +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# +# Licensed under the Amazon Software License (the "License"). You may not use +# this file except in compliance with the License. A copy of the License is +# located at +# +# http://aws.amazon.com/asl/ +# +# or in the "license" file accompanying this file. This file is distributed on +# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or +# implied. See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================= + + test_dram_dma_axi_mstr: TEST=test_dram_dma_axi_mstr test_dram_dma_axi_mstr: all -#Not supporting until XSIM related issues fixed +#Not supporting until XSIM related issues fixed test_dram_dma_4k_crossing: TEST=test_dram_dma_4k_crossing test_dram_dma_4k_crossing: check_xsim all @@ -41,15 +59,15 @@ test_dma_pcis_concurrent: all test_dma_sda_concurrent: TEST=test_dma_sda_concurrent test_dma_sda_concurrent: all -#Not supporting until XSIM related issues fixed +#Not supporting until XSIM related issues fixed test_dram_dma: TEST=test_dram_dma test_dram_dma: check_xsim all -#Not supporting until XSIM related issues fixed +#Not supporting until XSIM related issues fixed test_dram_dma_align_addr_4k: TEST=test_dram_dma_align_addr_4k test_dram_dma_align_addr_4k: check_xsim all -#Not supporting until XSIM related issues fixed +#Not supporting until XSIM related issues fixed test_dram_dma_single_beat_4k: TEST=test_dram_dma_single_beat_4k test_dram_dma_single_beat_4k: check_xsim all @@ -61,7 +79,7 @@ test_dram_dma_single_beat_4k: check_xsim all # test_dram_dma_mem_model_bdr_wr: DEFAULT_DEFINES += +define+NO_DDR+FAST_SIM_MODE # test_dram_dma_mem_model_bdr_wr: all -#Not supporting until XSIM related issues fixed +#Not supporting until XSIM related issues fixed test_dram_dma_rnd: TEST=test_dram_dma_rnd test_dram_dma_rnd: check_xsim all diff --git a/hdk/cl/examples/cl_mem_perf/verif/scripts/Makefile.vcs b/hdk/cl/examples/cl_mem_perf/verif/scripts/Makefile.vcs index 7e5dca668..7b9c1a6ef 100644 --- a/hdk/cl/examples/cl_mem_perf/verif/scripts/Makefile.vcs +++ b/hdk/cl/examples/cl_mem_perf/verif/scripts/Makefile.vcs @@ -1,6 +1,7 @@ +# ============================================================================= # Amazon FPGA Hardware Development Kit # -# Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Amazon Software License (the "License"). You may not use # this file except in compliance with the License. A copy of the License is @@ -12,15 +13,16 @@ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or # implied. See the License for the specific language governing permissions and # limitations under the License. +# ============================================================================= ################################################################## ## Makefile For VCS compiles and simulations ## Step to run : -## 1. make create_libs VCS=1 -> To generate xilinx compile +## 1. make create_libs VCS=1 -> To generate xilinx compile ## libraries. This is a one time step ## 2. make all VCS=1 -> Runs the test -## +define+MODEL_DEBUG_MEMORY +define+MODEL_DEBUG_CMDS +## +define+MODEL_DEBUG_MEMORY +define+MODEL_DEBUG_CMDS ################################################################## FILTER_OUT_HBM_META_INJECTIONS = grep -v "\*\*\*Meta" | sed '/^$$/d' @@ -33,7 +35,7 @@ compile: $(COMPLIB_DIR) cd $(SIM_DIR) && vlogan -g -ntb_opts tb_timescale=1ps/1ps -timescale=1ps/1ps -sverilog +systemverilogext+.sv +libext+.sv +libext+.v -full64 -lca -v2005 +v2k -l compile.vlogan.log -debug_all -f $(SCRIPTS_DIR)/top.$(SIMULATOR).f +define+VCS +define+DMA_TEST $(DEFAULT_DEFINES) +lint=TFIPC-L cd $(SIM_DIR) && touch bd_2e02_lmb_bram_I_0.mem bd_2e02_second_lmb_bram_I_0.mem cd $(SIM_DIR) && vcs tb $(TEST) $(C_FILES) +error+9999 glbl -debug_region=cell+encrypt +warn=noFCDCI,noFCICIO +note=noFCICIO -CFLAGS "-I$(C_SDK_USR_INC_DIR)" -CFLAGS "-I$(C_SDK_USR_UTILS_DIR) -std=gnu99" -CFLAGS "-I$(C_COMMON_DIR)/include" -CFLAGS "-I$(C_COMMON_DIR)/src" -CFLAGS "-DSV_TEST" -CFLAGS "-DSCOPE" -CFLAGS "-I$(C_INC_DIR)" "-I$(C_SRC_DIR)" -debug_all -M +lint=TFIPC-L -debug_all -debug_pp glbl -ntb_opts tb_timescale=1ps/1ps -timescale=1ps/1ps -sverilog -full64 +memcbk -licqueue -lca -v2005 -l compile.vcs.log +plusarg_save +timeout=1ms - + run: ifeq ($(TEST),test_null) ifneq ($(C_TEST),test_null) diff --git a/hdk/cl/examples/cl_mem_perf/verif/scripts/Makefile.vivado b/hdk/cl/examples/cl_mem_perf/verif/scripts/Makefile.vivado index f0645161f..5719d3efe 100644 --- a/hdk/cl/examples/cl_mem_perf/verif/scripts/Makefile.vivado +++ b/hdk/cl/examples/cl_mem_perf/verif/scripts/Makefile.vivado @@ -1,6 +1,7 @@ +# ============================================================================= # Amazon FPGA Hardware Development Kit # -# Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Amazon Software License (the "License"). You may not use # this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or # implied. See the License for the specific language governing permissions and # limitations under the License. +# ============================================================================= + ################################################################## ## Makefile For Vivado compiles and simulations diff --git a/hdk/cl/examples/cl_mem_perf/verif/scripts/top.questa.f b/hdk/cl/examples/cl_mem_perf/verif/scripts/top.questa.f index 67e60b6ff..59c1064d2 100644 --- a/hdk/cl/examples/cl_mem_perf/verif/scripts/top.questa.f +++ b/hdk/cl/examples/cl_mem_perf/verif/scripts/top.questa.f @@ -1,6 +1,7 @@ +# ============================================================================= # Amazon FPGA Hardware Development Kit # -# Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Amazon Software License (the "License"). You may not use # this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or # implied. See the License for the specific language governing permissions and # limitations under the License. +# ============================================================================= + +define+CL_NAME=cl_mem_perf +define+DISABLE_VJTAG_DEBUG diff --git a/hdk/cl/examples/cl_mem_perf/verif/scripts/top.vcs.f b/hdk/cl/examples/cl_mem_perf/verif/scripts/top.vcs.f index 67e60b6ff..59c1064d2 100644 --- a/hdk/cl/examples/cl_mem_perf/verif/scripts/top.vcs.f +++ b/hdk/cl/examples/cl_mem_perf/verif/scripts/top.vcs.f @@ -1,6 +1,7 @@ +# ============================================================================= # Amazon FPGA Hardware Development Kit # -# Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Amazon Software License (the "License"). You may not use # this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or # implied. See the License for the specific language governing permissions and # limitations under the License. +# ============================================================================= + +define+CL_NAME=cl_mem_perf +define+DISABLE_VJTAG_DEBUG diff --git a/hdk/cl/examples/cl_mem_perf/verif/scripts/top.vivado.f b/hdk/cl/examples/cl_mem_perf/verif/scripts/top.vivado.f index 5ea4a7298..83d9fc5ac 100644 --- a/hdk/cl/examples/cl_mem_perf/verif/scripts/top.vivado.f +++ b/hdk/cl/examples/cl_mem_perf/verif/scripts/top.vivado.f @@ -1,6 +1,7 @@ +# ============================================================================= # Amazon FPGA Hardware Development Kit # -# Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Amazon Software License (the "License"). You may not use # this file except in compliance with the License. A copy of the License is @@ -12,6 +13,9 @@ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or # implied. See the License for the specific language governing permissions and # limitations under the License. +# ============================================================================= + + --define CL_NAME=cl_mem_perf --define VIVADO_SIM diff --git a/hdk/cl/examples/cl_mem_perf/verif/scripts/top.xsim.f b/hdk/cl/examples/cl_mem_perf/verif/scripts/top.xsim.f index 0c6f88293..c594af995 100644 --- a/hdk/cl/examples/cl_mem_perf/verif/scripts/top.xsim.f +++ b/hdk/cl/examples/cl_mem_perf/verif/scripts/top.xsim.f @@ -1,6 +1,7 @@ +# ============================================================================= # Amazon FPGA Hardware Development Kit # -# Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Amazon Software License (the "License"). You may not use # this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or # implied. See the License for the specific language governing permissions and # limitations under the License. +# ============================================================================= + -define CL_NAME=cl_mem_perf -define DISABLE_VJTAG_DEBUG diff --git a/hdk/cl/examples/cl_mem_perf/verif/scripts/waves.tcl b/hdk/cl/examples/cl_mem_perf/verif/scripts/waves.tcl index 4b14d0da6..584895d66 100644 --- a/hdk/cl/examples/cl_mem_perf/verif/scripts/waves.tcl +++ b/hdk/cl/examples/cl_mem_perf/verif/scripts/waves.tcl @@ -1,6 +1,7 @@ +# ============================================================================= # Amazon FPGA Hardware Development Kit # -# Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Amazon Software License (the "License"). You may not use # this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or # implied. See the License for the specific language governing permissions and # limitations under the License. +# ============================================================================= + set curr_wave [current_wave_config] if { [string length $curr_wave] == 0 } { @@ -23,5 +26,5 @@ if { [string length $curr_wave] == 0 } { } } -run 200 us +run 200 us quit diff --git a/hdk/cl/examples/cl_mem_perf/verif/tests/base_test_utils.svh b/hdk/cl/examples/cl_mem_perf/verif/tests/base_test_utils.svh index dea13cda8..75f47c1c1 100644 --- a/hdk/cl/examples/cl_mem_perf/verif/tests/base_test_utils.svh +++ b/hdk/cl/examples/cl_mem_perf/verif/tests/base_test_utils.svh @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,27 +13,18 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. - +// ============================================================================ `include "common_base_test.svh" - `define DDR_BASE_ADDR 64'h0 -`ifdef AWS_SIM_32GB_DDR - `define DDR_LEVEL_1 `_8_GB - `define DDR_LEVEL_2 `_16_GB - `define DDR_LEVEL_3 `_24_GB - `define HBM_BASE_ADDR `_64_GB -`elsif AWS_SIM_64GB_DDR - `define DDR_LEVEL_1 `_16_GB - `define DDR_LEVEL_2 `_32_GB - `define DDR_LEVEL_3 `_48_GB - `define HBM_BASE_ADDR `_64_GB -`endif +`define DDR_LEVEL_1 `_16_GB +`define DDR_LEVEL_2 `_32_GB +`define DDR_LEVEL_3 `_48_GB +`define HBM_BASE_ADDR `_64_GB `include "aws_clk_gen_utils.svh" `include "cl_dram_hbm_dma_utils.svh" `include "cl_mem_perf_utils.svh" - diff --git a/hdk/cl/examples/cl_mem_perf/verif/tests/cl_mem_perf_utils.svh b/hdk/cl/examples/cl_mem_perf/verif/tests/cl_mem_perf_utils.svh index 58db2cf14..76011f6c5 100644 --- a/hdk/cl/examples/cl_mem_perf/verif/tests/cl_mem_perf_utils.svh +++ b/hdk/cl/examples/cl_mem_perf/verif/tests/cl_mem_perf_utils.svh @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,7 +13,7 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. - +// ============================================================================ task program_cl_hbm_perf_kernel(logic [31:0] selected_channel_for_latency_measurement = 32'd0, logic [3:0] axlen = 4'hf, logic [31:0] data_pattern = 32'hCAFE_FA15); diff --git a/hdk/cl/examples/cl_mem_perf/verif/tests/test_aws_clk_gen_recipe.sv b/hdk/cl/examples/cl_mem_perf/verif/tests/test_aws_clk_gen_recipe.sv index 30a05853d..596495729 100644 --- a/hdk/cl/examples/cl_mem_perf/verif/tests/test_aws_clk_gen_recipe.sv +++ b/hdk/cl/examples/cl_mem_perf/verif/tests/test_aws_clk_gen_recipe.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,7 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ module test_aws_clk_gen_recipe(); diff --git a/hdk/cl/examples/cl_mem_perf/verif/tests/test_dram_dma_axi_mstr.sv b/hdk/cl/examples/cl_mem_perf/verif/tests/test_dram_dma_axi_mstr.sv index 4b1c24428..8ec10ba10 100644 --- a/hdk/cl/examples/cl_mem_perf/verif/tests/test_dram_dma_axi_mstr.sv +++ b/hdk/cl/examples/cl_mem_perf/verif/tests/test_dram_dma_axi_mstr.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + module test_dram_dma_axi_mstr(); @@ -62,7 +65,7 @@ module test_dram_dma_axi_mstr(); // Set AXI Master Command Registers // addr = 0x1_a021f700, Write $display("[%t] : Setting DDR Base Address Command Registers ", $realtime);// addr = 0x1_a021f700 - tb.poke_ocl(.addr(AXI_MSTR_CAHR_ADDR), .data(DDR_BASE_HI_ADDR)); // Set High Address -- + tb.poke_ocl(.addr(AXI_MSTR_CAHR_ADDR), .data(DDR_BASE_HI_ADDR)); // Set High Address -- tb.poke_ocl(.addr(AXI_MSTR_CALR_ADDR), .data(DDR_BASE_LO_ADDR + i)); // Set Low Address tb.poke_ocl(.addr(AXI_MSTR_CWDR_ADDR), .data(DDR_BASE_DATA | i)); // Set Write Data tb.poke_ocl(.addr(AXI_MSTR_CCR_ADDR), .data(32'h0000_0001)); // Issue Write Command @@ -82,7 +85,7 @@ module test_dram_dma_axi_mstr(); end // for (int i = 0; i <= 12; i=i+4) //} for (int i = 0; i <= 12; i=i+4) begin //{ - tb.poke_ocl(.addr(AXI_MSTR_CAHR_ADDR), .data(DDR_BASE_HI_ADDR)); // Set High Address -- + tb.poke_ocl(.addr(AXI_MSTR_CAHR_ADDR), .data(DDR_BASE_HI_ADDR)); // Set High Address -- tb.poke_ocl(.addr(AXI_MSTR_CALR_ADDR), .data(DDR_BASE_LO_ADDR + i)); // Set Low Address tb.poke_ocl(.addr(AXI_MSTR_CWDR_ADDR), .data(DDR_BASE_DATA | i)); // Set Write Data @@ -190,7 +193,7 @@ for (int i = 0; i <= 12; i=i+4) begin //{ // Set AXI Master Command Registers // addr = 0x1_a021f700, Write $display("[%t] : Setting DDR Base Address Command Registers ", $realtime);// addr = 0x1_a021f700 - tb.poke_ocl(.addr(AXI_MSTR_CAHR_ADDR), .data(DDR_OFFSET_16_GB_HI_ADDR)); // Set High Address -- + tb.poke_ocl(.addr(AXI_MSTR_CAHR_ADDR), .data(DDR_OFFSET_16_GB_HI_ADDR)); // Set High Address -- tb.poke_ocl(.addr(AXI_MSTR_CALR_ADDR), .data(DDR_OFFSET_16_GB_LO_ADDR + i)); // Set Low Address tb.poke_ocl(.addr(AXI_MSTR_CWDR_ADDR), .data(DDR_OFFSET_16_GB_DATA | i)); // Set Write Data tb.poke_ocl(.addr(AXI_MSTR_CCR_ADDR), .data(32'h0000_0001)); // Issue Write Command @@ -210,7 +213,7 @@ for (int i = 0; i <= 12; i=i+4) begin //{ end // for (int i = 0; i <= 12; i=i+4) //} for (int i = 0; i <= 12; i=i+4) begin //{ - tb.poke_ocl(.addr(AXI_MSTR_CAHR_ADDR), .data(DDR_OFFSET_16_GB_HI_ADDR)); // Set High Address -- + tb.poke_ocl(.addr(AXI_MSTR_CAHR_ADDR), .data(DDR_OFFSET_16_GB_HI_ADDR)); // Set High Address -- tb.poke_ocl(.addr(AXI_MSTR_CALR_ADDR), .data(DDR_OFFSET_16_GB_LO_ADDR + i)); // Set Low Address tb.poke_ocl(.addr(AXI_MSTR_CWDR_ADDR), .data(DDR_OFFSET_16_GB_DATA | i)); // Set Write Data @@ -255,7 +258,7 @@ for (int i = 0; i <= 12; i=i+4) begin //{ // Set AXI Master Command Registers // addr = 0x1_a021f700, Write $display("[%t] : Setting DDR Base Address Command Registers ", $realtime);// addr = 0x1_a021f700 - tb.poke_ocl(.addr(AXI_MSTR_CAHR_ADDR), .data(DDR_OFFSET_24_GB_HI_ADDR)); // Set High Address -- + tb.poke_ocl(.addr(AXI_MSTR_CAHR_ADDR), .data(DDR_OFFSET_24_GB_HI_ADDR)); // Set High Address -- tb.poke_ocl(.addr(AXI_MSTR_CALR_ADDR), .data(DDR_OFFSET_24_GB_LO_ADDR + i)); // Set Low Address tb.poke_ocl(.addr(AXI_MSTR_CWDR_ADDR), .data(DDR_OFFSET_24_GB_DATA | i)); // Set Write Data tb.poke_ocl(.addr(AXI_MSTR_CCR_ADDR), .data(32'h0000_0001)); // Issue Write Command @@ -275,7 +278,7 @@ for (int i = 0; i <= 12; i=i+4) begin //{ end // for (int i = 0; i <= 12; i=i+4) //} for (int i = 0; i <= 12; i=i+4) begin //{ - tb.poke_ocl(.addr(AXI_MSTR_CAHR_ADDR), .data(DDR_OFFSET_24_GB_HI_ADDR)); // Set High Address -- + tb.poke_ocl(.addr(AXI_MSTR_CAHR_ADDR), .data(DDR_OFFSET_24_GB_HI_ADDR)); // Set High Address -- tb.poke_ocl(.addr(AXI_MSTR_CALR_ADDR), .data(DDR_OFFSET_24_GB_LO_ADDR + i)); // Set Low Address tb.poke_ocl(.addr(AXI_MSTR_CWDR_ADDR), .data(DDR_OFFSET_24_GB_DATA | i)); // Set Write Data @@ -321,4 +324,3 @@ end //} $finish; end // initial begin endmodule // test_dram_dma_axi_mstr - diff --git a/hdk/cl/examples/cl_mem_perf/verif/tests/test_hbm_perf32.sv b/hdk/cl/examples/cl_mem_perf/verif/tests/test_hbm_perf32.sv index 234513549..0323ece3c 100644 --- a/hdk/cl/examples/cl_mem_perf/verif/tests/test_hbm_perf32.sv +++ b/hdk/cl/examples/cl_mem_perf/verif/tests/test_hbm_perf32.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2022 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + module test_hbm_perf32(); diff --git a/hdk/cl/examples/cl_mem_perf/verif/tests/test_hbm_perf_kernel_cfg.sv b/hdk/cl/examples/cl_mem_perf/verif/tests/test_hbm_perf_kernel_cfg.sv index c19d9c5c2..90a6643f1 100644 --- a/hdk/cl/examples/cl_mem_perf/verif/tests/test_hbm_perf_kernel_cfg.sv +++ b/hdk/cl/examples/cl_mem_perf/verif/tests/test_hbm_perf_kernel_cfg.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2022 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + module test_hbm_perf_kernel_cfg(); diff --git a/hdk/cl/examples/cl_mem_perf/verif/tests/test_hbm_perf_random.sv b/hdk/cl/examples/cl_mem_perf/verif/tests/test_hbm_perf_random.sv index f1b82ca30..264165d25 100644 --- a/hdk/cl/examples/cl_mem_perf/verif/tests/test_hbm_perf_random.sv +++ b/hdk/cl/examples/cl_mem_perf/verif/tests/test_hbm_perf_random.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2022 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + module test_hbm_perf_random(); diff --git a/hdk/cl/examples/cl_sde/README.md b/hdk/cl/examples/cl_sde/README.md index 401dc9041..3e3841c54 100644 --- a/hdk/cl/examples/cl_sde/README.md +++ b/hdk/cl/examples/cl_sde/README.md @@ -5,26 +5,29 @@ 1. [Overview](#Overview) 2. [Functional Description](#FuncDesc) 3. [Interfaces and Address Range](#Interfaces) -3. [Software](#Software) -3. [Metadata](#Metadata) +4. [Software](#Software) +5. [Metadata](#Metadata) ⚠️**Note**: Please note that Virtual Ethernet/SDE is not supported by Vitis (XRT). - ## Overview -The CL_SDE example implements the FPGA custom logic used to generate the AFI to demonstrate the [Virtual Ethernet Application](../../../../sdk/apps/virtual-ethernet/doc/Virtual_Ethernet_Application_Guide.md). The CL_SDE demonstrates the following - + +The CL_SDE example implements the FPGA custom logic used to generate the AFI to demonstrate the [Virtual Ethernet Application](../../../../sdk/apps/virtual-ethernet/doc/Virtual_Ethernet_Application_Guide.md). The CL_SDE demonstrates the following: + 1. Using the [Streaming Data Engine](https://github.com/aws/aws-fpga/blob/-/sdk/apps/virtual-ethernet/doc/SDE_HW_Guide.md) (SDE) IP Block in your custom logic. 2. Connectivity between the [Virtual Ethernet Application](../../../../sdk/apps/virtual-ethernet/doc/Virtual_Ethernet_Application_Guide.md) and the SDE. 3. Connectivity between the Shell and the SDE. -3. Clocks and Resets for the SDE. -4. Floorplanning and Implemention with the SDE including pipelining for AXI buses, resets etc. +4. Clocks and Resets for the SDE. +5. Floorplanning and Implementation with the SDE including pipelining for AXI buses, resets etc. ### System Diagram + ![Diagram](./design/CL_SDE_Block_Diagram.jpg) - ## Functional Description -The following functionality is implemented in the CL_SDE - + +The following functionality is implemented in the CL_SDE: + 1. Capability to loopback from H2C and C2H. 2. Memory to store and read H2C packets for H2C functional testing 3. AXI Stream Traffic Generator for C2H functional and performance testing @@ -34,22 +37,26 @@ The following functionality is implemented in the CL_SDE - See [SDE HW Guide](https://github.com/aws/aws-fpga/blob/-/sdk/apps/virtual-ethernet/doc/SDE_HW_Guide.md) for details about the functional description of the SDE. - ## Interfaces and Address Range + ### Interfaces + CL_SDE uses three interfaces from the Shell. The PCIS interface is used to provide connectivity between the [Virtual Ethernet Application](../../../../sdk/apps/virtual-ethernet/doc/Virtual_Ethernet_Application_Guide.md) and the SDE. The OCL interface is used to provide connectivity between the host and all the test/control/utility blocks (except the SDE). The PCIM interfaces is used by the SDE to read and write to host memory. ### Address Range + #### PCIS + | Low Address | High Address | Description | |-------------|--------------|-------------| | 0x00_0000_0000 | 0x00_0000_3FFF | [SDE](https://github.com/aws/aws-fpga/blob/-/sdk/apps/virtual-ethernet/doc/SDE_HW_Guide.md) | | 0x00_0000_4000 | 0x1F_FFFF_FFFF | Unused | #### OCL + | Low Address | High Address | Description | |-------------|--------------|-------------| | 0x0000_0000 | 0x0000_017F | AXI-Stream Automatic Traffic Generator | @@ -60,13 +67,12 @@ The PCIM interfaces is used by the SDE to read and write to host memory. | 0x0000_2000 | 0x0000_2FFF | CL Reset and Control | | 0x0000_3000 | 0x0200_0000 | Unused | - - ## Software + The software is provided as part of the [Virtual Ethernet Application](../../../../sdk/apps/virtual-ethernet/doc/Virtual_Ethernet_Application_Guide.md). - ## Metadata + The following table displays information about the CL that is required to register it as an AFI with AWS. Alternatively, you can directly use a pre-generated AFI for this CL. | Key | Value | diff --git a/hdk/cl/examples/cl_sde/build/constraints/cl_synth_user.xdc b/hdk/cl/examples/cl_sde/build/constraints/cl_synth_user.xdc index 9b7250813..04c4c35a0 100644 --- a/hdk/cl/examples/cl_sde/build/constraints/cl_synth_user.xdc +++ b/hdk/cl/examples/cl_sde/build/constraints/cl_synth_user.xdc @@ -1,5 +1,21 @@ +# ============================================================================= +# Amazon FPGA Hardware Development Kit +# +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# +# Licensed under the Amazon Software License (the "License"). You may not use +# this file except in compliance with the License. A copy of the License is +# located at +# +# http://aws.amazon.com/asl/ +# +# or in the "license" file accompanying this file. This file is distributed on +# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or +# implied. See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================= + + ## # This contains the CL specific constraints for synthesis at the CL level ## set_property MAX_FANOUT 50 [get_nets -of_objects [get_pins WRAPPER_INST/CL/SH_DDR/ddr_cores.DDR4_0/inst/div_clk_rst_r1_reg/Q]] ## set_property MAX_FANOUT 50 [get_nets -of_objects [get_pins WRAPPER_INST/CL/CL_PCIM_MSTR/CL_TST_PCI/sync_rst_n_reg/Q]] - - diff --git a/hdk/cl/examples/cl_sde/build/constraints/cl_timing_user.xdc b/hdk/cl/examples/cl_sde/build/constraints/cl_timing_user.xdc index 3ba545c8d..8565d98de 100644 --- a/hdk/cl/examples/cl_sde/build/constraints/cl_timing_user.xdc +++ b/hdk/cl/examples/cl_sde/build/constraints/cl_timing_user.xdc @@ -1,3 +1,21 @@ +# ============================================================================= +# Amazon FPGA Hardware Development Kit +# +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# +# Licensed under the Amazon Software License (the "License"). You may not use +# this file except in compliance with the License. A copy of the License is +# located at +# +# http://aws.amazon.com/asl/ +# +# or in the "license" file accompanying this file. This file is distributed on +# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or +# implied. See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================= + + ############################################################################### # This contains the CL specific timing constraints for CL ############################################################################### diff --git a/hdk/cl/examples/cl_sde/build/constraints/small_shell_cl_pnr_user.xdc b/hdk/cl/examples/cl_sde/build/constraints/small_shell_cl_pnr_user.xdc index 9559e5c87..16765a6e9 100644 --- a/hdk/cl/examples/cl_sde/build/constraints/small_shell_cl_pnr_user.xdc +++ b/hdk/cl/examples/cl_sde/build/constraints/small_shell_cl_pnr_user.xdc @@ -1,8 +1,18 @@ # ============================================================================= -# Copyright 2021 Amazon.com, Inc. or its affiliates. -# All Rights Reserved Worldwide. -# Amazon Confidential information -# Restricted NDA Material +# Amazon FPGA Hardware Development Kit +# +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# +# Licensed under the Amazon Software License (the "License"). You may not use +# this file except in compliance with the License. A copy of the License is +# located at +# +# http://aws.amazon.com/asl/ +# +# or in the "license" file accompanying this file. This file is distributed on +# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or +# implied. See the License for the specific language governing permissions and +# limitations under the License. # ============================================================================= diff --git a/hdk/cl/examples/cl_sde/build/constraints/xdma_shell_cl_pnr_user.xdc b/hdk/cl/examples/cl_sde/build/constraints/xdma_shell_cl_pnr_user.xdc index de912b64d..1e50a629f 100644 --- a/hdk/cl/examples/cl_sde/build/constraints/xdma_shell_cl_pnr_user.xdc +++ b/hdk/cl/examples/cl_sde/build/constraints/xdma_shell_cl_pnr_user.xdc @@ -1,8 +1,18 @@ # ============================================================================= -# Copyright 2021 Amazon.com, Inc. or its affiliates. -# All Rights Reserved Worldwide. -# Amazon Confidential information -# Restricted NDA Material +# Amazon FPGA Hardware Development Kit +# +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# +# Licensed under the Amazon Software License (the "License"). You may not use +# this file except in compliance with the License. A copy of the License is +# located at +# +# http://aws.amazon.com/asl/ +# +# or in the "license" file accompanying this file. This file is distributed on +# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or +# implied. See the License for the specific language governing permissions and +# limitations under the License. # ============================================================================= diff --git a/hdk/cl/examples/cl_sde/build/scripts/encrypt.tcl b/hdk/cl/examples/cl_sde/build/scripts/encrypt.tcl index 7de76ed6b..6d3f24535 100644 --- a/hdk/cl/examples/cl_sde/build/scripts/encrypt.tcl +++ b/hdk/cl/examples/cl_sde/build/scripts/encrypt.tcl @@ -1,6 +1,7 @@ +# ============================================================================= # Amazon FPGA Hardware Development Kit # -# Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Amazon Software License (the "License"). You may not use # this file except in compliance with the License. A copy of the License is @@ -12,6 +13,7 @@ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or # implied. See the License for the specific language governing permissions and # limitations under the License. +# ============================================================================= set TARGET_DIR $scripts_dir/../src_post_encryption diff --git a/hdk/cl/examples/cl_sde/build/scripts/synth_cl_sde.tcl b/hdk/cl/examples/cl_sde/build/scripts/synth_cl_sde.tcl index 5355e9aee..73ce9b067 100644 --- a/hdk/cl/examples/cl_sde/build/scripts/synth_cl_sde.tcl +++ b/hdk/cl/examples/cl_sde/build/scripts/synth_cl_sde.tcl @@ -1,6 +1,7 @@ +# ============================================================================= # Amazon FPGA Hardware Development Kit # -# Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Amazon Software License (the "License"). You may not use # this file except in compliance with the License. A copy of the License is @@ -12,6 +13,7 @@ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or # implied. See the License for the specific language governing permissions and # limitations under the License. +# ============================================================================= # Common header diff --git a/hdk/cl/examples/cl_sde/design/axi_prot_chk.sv b/hdk/cl/examples/cl_sde/design/axi_prot_chk.sv index 78239fc46..b5c411da5 100644 --- a/hdk/cl/examples/cl_sde/design/axi_prot_chk.sv +++ b/hdk/cl/examples/cl_sde/design/axi_prot_chk.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016-2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,7 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ module axi_prot_chk #(parameter ID_WIDTH=16, @@ -27,12 +29,12 @@ module axi_prot_chk #(parameter ID_WIDTH=16, input cfg_chk_wr, input cfg_chk_rd, input [31:0] cfg_chk_wdata, - + output logic chk_cfg_ack, output logic [31:0] chk_cfg_rdata, output logic wr_last_error, - + input [ID_WIDTH-1:0] awid, input [ADDR_WIDTH-1:0] awaddr, input [LEN_WIDTH-1:0] awlen, @@ -88,7 +90,7 @@ module axi_prot_chk #(parameter ID_WIDTH=16, logic cfg_chk_rd_q; logic cfg_chk_wr_re; logic cfg_chk_rd_re; - + // Write registers always @(posedge clk) begin cfg_chk_wr_q <= cfg_chk_wr; @@ -99,13 +101,13 @@ module axi_prot_chk #(parameter ID_WIDTH=16, assign clr_wr_last_incomplete = cfg_chk_wr_re & (cfg_chk_addr == 12'h0) & cfg_chk_wdata[1]; assign clr_wr_last_early = cfg_chk_wr_re & (cfg_chk_addr == 12'h0) & cfg_chk_wdata[0]; - + // Read data & Ack always @(posedge clk) begin chk_cfg_ack <= (cfg_chk_wr || cfg_chk_rd); - chk_cfg_rdata <= (cfg_chk_addr == 12'h0) ? {wr_last_incomplete, wr_last_early} : + chk_cfg_rdata <= (cfg_chk_addr == 12'h0) ? {wr_last_incomplete, wr_last_early} : (cfg_chk_addr == 12'h4) ? err_addr[31:0] : - (cfg_chk_addr == 12'h8) ? err_addr[63:32] : + (cfg_chk_addr == 12'h8) ? err_addr[63:32] : err_id; end @@ -126,7 +128,7 @@ module axi_prot_chk #(parameter ID_WIDTH=16, ); assign aw_fifo_pop = aw_fifo_valid & wr_fifo_valid & wr_fifo_out_wlast; assign {aw_fifo_out_id, aw_fifo_out_len, aw_fifo_out_addr} = aw_fifo_pop_data; - + // Push W Channel into a FIFO ram_fifo_ft #(.WIDTH(1), .PIPELINE(0)) WR_FIFO @@ -142,12 +144,12 @@ module axi_prot_chk #(parameter ID_WIDTH=16, .wmark (wr_fifo_full) ); - assign wr_fifo_pop = wr_fifo_valid; + assign wr_fifo_pop = wr_fifo_valid; assign wr_fifo_out_wlast = wr_fifo_pop_data; assign set_wr_last_incomplete = ~(wr_last_incomplete || wr_last_early) & wr_fifo_valid & aw_fifo_valid & (aw_fifo_out_len == wr_beat) & ~wr_fifo_out_wlast; assign set_wr_last_early = ~(wr_last_incomplete || wr_last_early) & wr_fifo_valid & aw_fifo_valid & (aw_fifo_out_len != wr_beat) & wr_fifo_out_wlast; - + // Check number of wr beats always @(posedge clk) if (!rst_n) begin @@ -160,29 +162,22 @@ module axi_prot_chk #(parameter ID_WIDTH=16, end else begin wr_beat <= wr_fifo_out_wlast & wr_fifo_valid & aw_fifo_valid ? 0 : - wr_fifo_valid & aw_fifo_valid ? wr_beat + 1 : + wr_fifo_valid & aw_fifo_valid ? wr_beat + 1 : wr_beat; - + wr_last_incomplete <= set_wr_last_incomplete ? 1'b1 : clr_wr_last_incomplete ? 1'b0 : wr_last_incomplete; - + wr_last_early <= set_wr_last_early ? 1'b1 : clr_wr_last_early ? 1'b0 : wr_last_early; - + err_addr <= (set_wr_last_incomplete || set_wr_last_early) ? aw_fifo_out_addr : err_addr; err_id <= (set_wr_last_incomplete || set_wr_last_early) ? aw_fifo_out_id : err_id; wr_last_error <= wr_last_incomplete || wr_last_early; - - end // else: !if(!rst_n) - -endmodule // axi_prot_chk - - - + end // else: !if(!rst_n) - - +endmodule // axi_prot_chk diff --git a/hdk/cl/examples/cl_sde/design/cl_id_defines.vh b/hdk/cl/examples/cl_sde/design/cl_id_defines.vh index c34a7f0c4..cd2eaa8af 100644 --- a/hdk/cl/examples/cl_sde/design/cl_id_defines.vh +++ b/hdk/cl/examples/cl_sde/design/cl_id_defines.vh @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + // CL_SH_ID0 // - PCIe Vendor/Device ID Values @@ -29,5 +32,3 @@ // 15: 0: PCIe Subsystem Vendor ID // - A PCIe Subsystem/Subsystem Vendor ID of 0 (zero) is not valid `define CL_SH_ID1 32'h1D51_FEDC - - diff --git a/hdk/cl/examples/cl_sde/design/cl_pkt_tst.sv b/hdk/cl/examples/cl_sde/design/cl_pkt_tst.sv index 1b8da1050..4ca8550a4 100644 --- a/hdk/cl/examples/cl_sde/design/cl_pkt_tst.sv +++ b/hdk/cl/examples/cl_sde/design/cl_pkt_tst.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016-2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + `define CFG_ADDR_TX_CFG 8'h00 `define CFG_ADDR_TX_SEED0 8'h04 @@ -1083,4 +1086,3 @@ end // if (TX_ONLY == 0) endmodule // cl_pkt_tst - diff --git a/hdk/cl/examples/cl_sde/design/cl_sde.sv b/hdk/cl/examples/cl_sde/design/cl_sde.sv index a9525b3fa..ad7840b8e 100644 --- a/hdk/cl/examples/cl_sde/design/cl_sde.sv +++ b/hdk/cl/examples/cl_sde/design/cl_sde.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016-2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,7 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ // CL Streaming diff --git a/hdk/cl/examples/cl_sde/design/cl_sde_defines.vh b/hdk/cl/examples/cl_sde/design/cl_sde_defines.vh index 923b784a2..e990a3002 100644 --- a/hdk/cl/examples/cl_sde/design/cl_sde_defines.vh +++ b/hdk/cl/examples/cl_sde/design/cl_sde_defines.vh @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + `ifndef CL_SDE_DEFINES `define CL_SDE_DEFINES diff --git a/hdk/cl/examples/cl_sde/design/cl_sde_srm.sv b/hdk/cl/examples/cl_sde/design/cl_sde_srm.sv index e52c1d05f..357aa829d 100644 --- a/hdk/cl/examples/cl_sde/design/cl_sde_srm.sv +++ b/hdk/cl/examples/cl_sde/design/cl_sde_srm.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016-2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + //Registers // @@ -355,4 +358,3 @@ assign ots_keep = (cfg_lb_mode)? inp_lb_keep: tst_keep; assign ots_user = (cfg_lb_mode)? inp_lb_user: 0; endmodule - diff --git a/hdk/cl/examples/cl_sde/design/cl_tst.sv b/hdk/cl/examples/cl_sde/design/cl_tst.sv index dbc10afa1..6cd4a9d7f 100644 --- a/hdk/cl/examples/cl_sde/design/cl_tst.sv +++ b/hdk/cl/examples/cl_sde/design/cl_tst.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,7 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ module cl_tst #(parameter DATA_WIDTH=512, parameter NUM_RD_TAG=512) ( diff --git a/hdk/cl/examples/cl_sde/design/ila_axi4_wrapper.sv b/hdk/cl/examples/cl_sde/design/ila_axi4_wrapper.sv index c54e94446..3523d7ea7 100644 --- a/hdk/cl/examples/cl_sde/design/ila_axi4_wrapper.sv +++ b/hdk/cl/examples/cl_sde/design/ila_axi4_wrapper.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,9 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + + //--------------------------------------------------------------------------------- // NOTE: ila_axi4 core supports only Maximum DATA width = 32 on WDATA and RDATA // **** AXI_DATA_WIDTH <= 32 diff --git a/hdk/cl/examples/cl_sde/design/sde.sv b/hdk/cl/examples/cl_sde/design/sde.sv index 3edaf7bb3..aa2dd3360 100644 --- a/hdk/cl/examples/cl_sde/design/sde.sv +++ b/hdk/cl/examples/cl_sde/design/sde.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016-2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,12 +13,14 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + // SDE Top Level module sde #(parameter bit C2H_ONLY = 0, parameter bit H2C_ONLY = 0, - + parameter H2C_PCIM_MAX_RD_SIZE = 0, // 0 - 512B, 1 - 1KB, 2 - 2KB, 3 - 4KB parameter C2H_PCIM_MAX_WR_SIZE = 3, // 0 - 512B, 1 - 1KB, 2 - 2KB, 3 - 4KB @@ -27,36 +30,36 @@ module sde #(parameter bit C2H_ONLY = 0, parameter PCIM_ADDR_WIDTH = 64, parameter PCIM_NUM_OT_RD = 64, - + parameter PCIS_DATA_WIDTH = 512, parameter PCIS_ID_WIDTH = 16, parameter PCIS_LEN_WIDTH = 8, parameter PCIS_ADDR_WIDTH = 64, - + parameter bit C2H_DESC_TYPE = 0, // 0 - Regular, 1 - Compact - + parameter C2H_DESC_RAM_DEPTH = 64, - + parameter C2H_AXIS_DATA_WIDTH = 512, parameter C2H_USER_BIT_WIDTH = C2H_DESC_TYPE ? 1 : 64, - + parameter C2H_BUF_DEPTH = 512, - + parameter bit H2C_DESC_TYPE = 0, parameter H2C_DESC_RAM_DEPTH = 64, - + parameter H2C_AXIS_DATA_WIDTH = 512, parameter H2C_USER_BIT_WIDTH = H2C_DESC_TYPE ? 1 : 64, - + parameter H2C_BUF_DEPTH = 512, - + parameter H2C_PKT_SIZE_BYTES = 64, - - + + parameter C2H_PCIM_DM_AWID = 0, // This is the AWID used for write accesses from C2H Data Mover parameter C2H_PCIM_WB_AWID = 1, // This is the AWID used for write accesses from C2H Write Back Block parameter H2C_PCIM_WB_AWID = 2, // This is the AWID used for write accesses from H2C Write Back Block - + parameter C2H_PCIM_DESC_ARID = 0, // This is the ARID used for read access from the C2H Desc Block parameter H2C_PCIM_DESC_ARID = 1, // This is the ARID used for read access from the H2C Desc Block parameter H2C_PCIM_DM_ARID = 2 // This is the ARID used for write accesses from H2C Data Mover @@ -64,7 +67,7 @@ module sde #(parameter bit C2H_ONLY = 0, ( input clk, input rst_n, - + // PCIS Interface input [PCIS_ID_WIDTH-1:0] pcis_awid, input [PCIS_ADDR_WIDTH-1:0] pcis_awaddr, @@ -93,7 +96,7 @@ module sde #(parameter bit C2H_ONLY = 0, output logic pcis_rlast, output logic pcis_rvalid, input pcis_rready, - + // PCIM Interface output logic pcim_awvalid, output logic [PCIM_ID_WIDTH-1:0] pcim_awid, @@ -130,7 +133,7 @@ module sde #(parameter bit C2H_ONLY = 0, input [C2H_USER_BIT_WIDTH-1:0] c2h_axis_user, input c2h_axis_last, output logic c2h_axis_ready, - + // H2C AXI-Stream Interface output logic h2c_axis_valid, output logic [H2C_AXIS_DATA_WIDTH-1:0] h2c_axis_data, @@ -149,33 +152,33 @@ module sde #(parameter bit C2H_ONLY = 0, logic c2h_sync_rst_n; logic h2c_sync_rst_n; logic pm_sync_rst_n; - + logic c2h_ps_desc_wr_req; logic [C2H_DESC_WIDTH-1:0] c2h_ps_desc_wdata; logic c2h_ps_desc_ack; - + logic h2c_ps_desc_wr_req; logic [H2C_DESC_WIDTH-1:0] h2c_ps_desc_wdata; logic h2c_ps_desc_ack; - + logic h2c_ps_pkt_wr_req; logic [H2C_PKT_WIDTH-1:0] h2c_ps_pkt_wdata; logic h2c_ps_pkt_ack; - + logic pm_ps_cfg_wr_req; logic pm_ps_cfg_rd_req; logic [15:0] pm_ps_cfg_addr; logic [31:0] pm_ps_cfg_wdata; logic pm_ps_cfg_ack; logic [31:0] pm_ps_cfg_rdata; - + logic c2h_ps_cfg_wr_req; logic c2h_ps_cfg_rd_req; logic [15:0] c2h_ps_cfg_addr; logic [31:0] c2h_ps_cfg_wdata; logic c2h_ps_cfg_ack; logic [31:0] c2h_ps_cfg_rdata; - + logic c2h_desc_ooo_error; logic c2h_desc_unalin_error; @@ -205,7 +208,7 @@ module sde #(parameter bit C2H_ONLY = 0, logic [PCIM_LEN_WIDTH-1:0] c2h_dm_pm_awlen; logic [PCIM_ID_WIDTH-1:0] c2h_dm_pm_awid; logic c2h_pm_dm_awready; - + logic c2h_dm_pm_wvalid; logic [PCIM_DATA_WIDTH-1:0] c2h_dm_pm_wdata; logic [(PCIM_DATA_WIDTH>>3)-1:0] c2h_dm_pm_wstrb; @@ -221,7 +224,7 @@ module sde #(parameter bit C2H_ONLY = 0, logic [PCIM_LEN_WIDTH-1:0] c2h_wb_pm_awlen; logic [PCIM_ID_WIDTH-1:0] c2h_wb_pm_awid; logic c2h_pm_wb_awready; - + logic c2h_wb_pm_wvalid; logic [PCIM_DATA_WIDTH-1:0] c2h_wb_pm_wdata; logic [(PCIM_DATA_WIDTH>>3)-1:0] c2h_wb_pm_wstrb; @@ -242,7 +245,7 @@ module sde #(parameter bit C2H_ONLY = 0, logic [PCIM_DATA_WIDTH-1:0] h2c_pm_desc_rdata; logic h2c_pm_desc_rlast; logic h2c_desc_pm_rready; - + logic h2c_dm_pm_arvalid; logic [PCIM_ADDR_WIDTH-1:0] h2c_dm_pm_araddr; logic [PCIM_LEN_WIDTH-1:0] h2c_dm_pm_arlen; @@ -260,7 +263,7 @@ module sde #(parameter bit C2H_ONLY = 0, logic [PCIM_LEN_WIDTH-1:0] h2c_wb_pm_awlen; logic [PCIM_ID_WIDTH-1:0] h2c_wb_pm_awid; logic h2c_pm_wb_awready; - + logic h2c_wb_pm_wvalid; logic [PCIM_DATA_WIDTH-1:0] h2c_wb_pm_wdata; logic [(PCIM_DATA_WIDTH>>3)-1:0] h2c_wb_pm_wstrb; @@ -274,8 +277,8 @@ module sde #(parameter bit C2H_ONLY = 0, // Generate local copy of Reset always @(posedge clk) sync_rst_n <= rst_n; - - // PCIS Interface + + // PCIS Interface sde_ps #(.PCIS_DATA_WIDTH (PCIS_DATA_WIDTH), .PCIS_ID_WIDTH (PCIS_ID_WIDTH), .PCIS_LEN_WIDTH (PCIS_LEN_WIDTH), @@ -326,29 +329,29 @@ module sde #(parameter bit C2H_ONLY = 0, .c2h_ps_desc_wr_req (c2h_ps_desc_wr_req), .c2h_ps_desc_wdata (c2h_ps_desc_wdata ), .c2h_ps_desc_ack (c2h_ps_desc_ack ), - + .h2c_ps_desc_wr_req (h2c_ps_desc_wr_req), .h2c_ps_desc_wdata (h2c_ps_desc_wdata ), .h2c_ps_desc_ack (h2c_ps_desc_ack ), - + .h2c_ps_pkt_wr_req (h2c_ps_pkt_wr_req), .h2c_ps_pkt_wdata (h2c_ps_pkt_wdata ), .h2c_ps_pkt_ack (h2c_ps_pkt_ack ), - + .pm_ps_cfg_wr_req (pm_ps_cfg_wr_req), .pm_ps_cfg_rd_req (pm_ps_cfg_rd_req), .pm_ps_cfg_addr (pm_ps_cfg_addr ), .pm_ps_cfg_wdata (pm_ps_cfg_wdata ), .pm_ps_cfg_ack (pm_ps_cfg_ack ), .pm_ps_cfg_rdata (pm_ps_cfg_rdata ), - + .c2h_ps_cfg_wr_req (c2h_ps_cfg_wr_req), .c2h_ps_cfg_rd_req (c2h_ps_cfg_rd_req), .c2h_ps_cfg_addr (c2h_ps_cfg_addr ), .c2h_ps_cfg_wdata (c2h_ps_cfg_wdata ), .c2h_ps_cfg_ack (c2h_ps_cfg_ack ), .c2h_ps_cfg_rdata (c2h_ps_cfg_rdata ), - + .c2h_desc_ooo_error (c2h_desc_ooo_error), .c2h_desc_unalin_error (c2h_desc_unalin_error), @@ -363,7 +366,7 @@ module sde #(parameter bit C2H_ONLY = 0, .h2c_desc_unalin_error (h2c_desc_unalin_error) ); - + // PCIM Interface sde_pm #(.PCIM_DATA_WIDTH (PCIM_DATA_WIDTH ), .PCIM_ID_WIDTH (PCIM_ID_WIDTH ), @@ -373,7 +376,7 @@ module sde #(parameter bit C2H_ONLY = 0, .C2H_PCIM_DM_AWID (C2H_PCIM_DM_AWID), .C2H_PCIM_WB_AWID (C2H_PCIM_WB_AWID), .H2C_PCIM_WB_AWID (H2C_PCIM_WB_AWID), - + .C2H_PCIM_DESC_ARID(C2H_PCIM_DESC_ARID), .H2C_PCIM_DESC_ARID(H2C_PCIM_DESC_ARID), .H2C_PCIM_DM_ARID (H2C_PCIM_DM_ARID ) @@ -382,14 +385,14 @@ module sde #(parameter bit C2H_ONLY = 0, SDE_PCI_MSTR (.clk (clk), .rst_n (pm_sync_rst_n), - + .pm_ps_cfg_wr_req (pm_ps_cfg_wr_req), .pm_ps_cfg_rd_req (pm_ps_cfg_rd_req), .pm_ps_cfg_addr (pm_ps_cfg_addr ), .pm_ps_cfg_wdata (pm_ps_cfg_wdata ), .pm_ps_cfg_ack (pm_ps_cfg_ack ), .pm_ps_cfg_rdata (pm_ps_cfg_rdata ), - + .pcim_awvalid (pcim_awvalid ), .pcim_awid (pcim_awid ), .pcim_awaddr (pcim_awaddr ), @@ -442,7 +445,7 @@ module sde #(parameter bit C2H_ONLY = 0, .c2h_pm_dm_bresp (c2h_pm_dm_bresp ), .c2h_dm_pm_bready (c2h_dm_pm_bready ), - + .c2h_wb_pm_awvalid (c2h_wb_pm_awvalid), .c2h_wb_pm_awaddr (c2h_wb_pm_awaddr ), .c2h_wb_pm_awlen (c2h_wb_pm_awlen ), @@ -456,7 +459,7 @@ module sde #(parameter bit C2H_ONLY = 0, .c2h_pm_wb_bvalid (c2h_pm_wb_bvalid ), .c2h_pm_wb_bresp (c2h_pm_wb_bresp ), .c2h_wb_pm_bready (c2h_wb_pm_bready ), - + .h2c_desc_pm_arvalid (h2c_desc_pm_arvalid), .h2c_desc_pm_araddr (h2c_desc_pm_araddr ), .h2c_desc_pm_arlen (h2c_desc_pm_arlen ), @@ -466,7 +469,7 @@ module sde #(parameter bit C2H_ONLY = 0, .h2c_pm_desc_rdata (h2c_pm_desc_rdata ), .h2c_pm_desc_rlast (h2c_pm_desc_rlast ), .h2c_desc_pm_rready (h2c_desc_pm_rready), - + .h2c_dm_pm_arvalid (h2c_dm_pm_arvalid), .h2c_dm_pm_araddr (h2c_dm_pm_araddr ), .h2c_dm_pm_arlen (h2c_dm_pm_arlen ), @@ -476,7 +479,7 @@ module sde #(parameter bit C2H_ONLY = 0, .h2c_pm_dm_rdata (h2c_pm_dm_rdata ), .h2c_pm_dm_rlast (h2c_pm_dm_rlast ), .h2c_dm_pm_rready (h2c_dm_pm_rready), - + .h2c_wb_pm_awvalid (h2c_wb_pm_awvalid), .h2c_wb_pm_awaddr (h2c_wb_pm_awaddr ), .h2c_wb_pm_awlen (h2c_wb_pm_awlen ), @@ -492,26 +495,26 @@ module sde #(parameter bit C2H_ONLY = 0, .h2c_wb_pm_bready (h2c_wb_pm_bready ) ); - + // C2H if (H2C_ONLY == 0) begin - sde_c2h + sde_c2h #(.C2H_DESC_TYPE (C2H_DESC_TYPE), .C2H_DESC_WIDTH (C2H_DESC_WIDTH), - + .C2H_DESC_RAM_DEPTH (C2H_DESC_RAM_DEPTH), .C2H_PCIM_DM_AWID (C2H_PCIM_DM_AWID), .C2H_PCIM_WB_AWID (C2H_PCIM_WB_AWID), .C2H_PCIM_DESC_ARID (C2H_PCIM_DESC_ARID), - + .C2H_PCIM_MAX_WR_SIZE (C2H_PCIM_MAX_WR_SIZE), .PCIM_DATA_WIDTH (PCIM_DATA_WIDTH ), .PCIM_ID_WIDTH (PCIM_ID_WIDTH ), .PCIM_LEN_WIDTH (PCIM_LEN_WIDTH ), .PCIM_ADDR_WIDTH (PCIM_ADDR_WIDTH ), - + .C2H_AXIS_DATA_WIDTH (C2H_AXIS_DATA_WIDTH), .C2H_USER_BIT_WIDTH (C2H_USER_BIT_WIDTH), .C2H_BUF_DEPTH (C2H_BUF_DEPTH) @@ -523,14 +526,14 @@ module sde #(parameter bit C2H_ONLY = 0, .c2h_ps_desc_wr_req (c2h_ps_desc_wr_req), .c2h_ps_desc_wdata (c2h_ps_desc_wdata ), .c2h_ps_desc_ack (c2h_ps_desc_ack ), - + .c2h_ps_cfg_wr_req (c2h_ps_cfg_wr_req), .c2h_ps_cfg_rd_req (c2h_ps_cfg_rd_req), .c2h_ps_cfg_addr (c2h_ps_cfg_addr ), .c2h_ps_cfg_wdata (c2h_ps_cfg_wdata ), .c2h_ps_cfg_ack (c2h_ps_cfg_ack ), .c2h_ps_cfg_rdata (c2h_ps_cfg_rdata ), - + .c2h_desc_ooo_error (c2h_desc_ooo_error), .c2h_desc_unalin_error (c2h_desc_unalin_error), @@ -558,7 +561,7 @@ module sde #(parameter bit C2H_ONLY = 0, .c2h_pm_dm_bresp (c2h_pm_dm_bresp ), .c2h_dm_pm_bready (c2h_dm_pm_bready ), - + .c2h_wb_pm_awvalid (c2h_wb_pm_awvalid), .c2h_wb_pm_awaddr (c2h_wb_pm_awaddr ), .c2h_wb_pm_awlen (c2h_wb_pm_awlen ), @@ -574,16 +577,16 @@ module sde #(parameter bit C2H_ONLY = 0, .c2h_wb_pm_bready (c2h_wb_pm_bready ), .c2h_axis_valid (c2h_axis_valid ), - .c2h_axis_data (c2h_axis_data ), - .c2h_axis_keep (c2h_axis_keep ), - .c2h_axis_user (c2h_axis_user ), - .c2h_axis_last (c2h_axis_last ), + .c2h_axis_data (c2h_axis_data ), + .c2h_axis_keep (c2h_axis_keep ), + .c2h_axis_user (c2h_axis_user ), + .c2h_axis_last (c2h_axis_last ), .c2h_axis_ready (c2h_axis_ready ) ); end // if (H2C_ONLY == 0) else begin - assign + assign c2h_ps_desc_ack = 1'b1, c2h_ps_cfg_ack = 1'b1, c2h_ps_cfg_rdata = 32'd00, @@ -594,10 +597,10 @@ module sde #(parameter bit C2H_ONLY = 0, c2h_dm_pm_bready = 1'b1, c2h_axis_ready = 1'b0; end // else: !if(H2C_ONLY == 0) - + // H2C if (C2H_ONLY == 0) begin - sde_h2c + sde_h2c #(.H2C_DESC_TYPE (H2C_DESC_TYPE), .H2C_DESC_RAM_DEPTH (H2C_DESC_RAM_DEPTH), .H2C_PCIM_DM_ARID (H2C_PCIM_DM_ARID), @@ -606,12 +609,12 @@ module sde #(parameter bit C2H_ONLY = 0, .PCIM_NUM_OT_RD (PCIM_NUM_OT_RD ), .H2C_PCIM_MAX_RD_SIZE (H2C_PCIM_MAX_RD_SIZE), - + .PCIM_DATA_WIDTH (PCIM_DATA_WIDTH ), .PCIM_ID_WIDTH (PCIM_ID_WIDTH ), .PCIM_LEN_WIDTH (PCIM_LEN_WIDTH ), .PCIM_ADDR_WIDTH (PCIM_ADDR_WIDTH ), - + .H2C_AXIS_DATA_WIDTH (H2C_AXIS_DATA_WIDTH), .H2C_USER_BIT_WIDTH (H2C_USER_BIT_WIDTH), .H2C_BUF_DEPTH (H2C_BUF_DEPTH) @@ -623,14 +626,14 @@ module sde #(parameter bit C2H_ONLY = 0, .h2c_ps_desc_wr_req (h2c_ps_desc_wr_req), .h2c_ps_desc_wdata (h2c_ps_desc_wdata ), .h2c_ps_desc_ack (h2c_ps_desc_ack ), - + .h2c_ps_cfg_wr_req (h2c_ps_cfg_wr_req), .h2c_ps_cfg_rd_req (h2c_ps_cfg_rd_req), .h2c_ps_cfg_addr (h2c_ps_cfg_addr ), .h2c_ps_cfg_wdata (h2c_ps_cfg_wdata ), .h2c_ps_cfg_ack (h2c_ps_cfg_ack ), .h2c_ps_cfg_rdata (h2c_ps_cfg_rdata ), - + .h2c_desc_ooo_error (h2c_desc_ooo_error), .h2c_desc_unalin_error (h2c_desc_unalin_error), @@ -654,7 +657,7 @@ module sde #(parameter bit C2H_ONLY = 0, .h2c_pm_dm_rdata (h2c_pm_dm_rdata ), .h2c_pm_dm_rlast (h2c_pm_dm_rlast ), .h2c_dm_pm_rready (h2c_dm_pm_rready ), - + .h2c_wb_pm_awvalid (h2c_wb_pm_awvalid), .h2c_wb_pm_awaddr (h2c_wb_pm_awaddr ), .h2c_wb_pm_awlen (h2c_wb_pm_awlen ), @@ -670,16 +673,16 @@ module sde #(parameter bit C2H_ONLY = 0, .h2c_wb_pm_bready (h2c_wb_pm_bready ), .h2c_axis_valid (h2c_axis_valid), - .h2c_axis_data (h2c_axis_data ), - .h2c_axis_keep (h2c_axis_keep ), - .h2c_axis_user (h2c_axis_user ), - .h2c_axis_last (h2c_axis_last ), + .h2c_axis_data (h2c_axis_data ), + .h2c_axis_keep (h2c_axis_keep ), + .h2c_axis_user (h2c_axis_user ), + .h2c_axis_last (h2c_axis_last ), .h2c_axis_ready (h2c_axis_ready) ); end // if (C2H_ONLY == 0) else begin - assign + assign h2c_ps_desc_ack = 1'b1, h2c_ps_cfg_ack = 1'b1, h2c_ps_cfg_rdata = 32'd0, @@ -689,7 +692,7 @@ module sde #(parameter bit C2H_ONLY = 0, h2c_dm_pm_rready = 1'b1, h2c_axis_valid = 1'b0; end // else: !if(C2H_ONLY == 0) - + `ifndef NO_SDE_DEBUG_ILA // ila_axi4_wrapper #(.AXI_DATA_WIDTH(32)) PCIS_AXI4_ILA @@ -723,7 +726,7 @@ module sde #(parameter bit C2H_ONLY = 0, // .ila_rresp (pcis_rresp ), // .ila_rlast (pcis_rlast ) // ); -// +// // ila_axi4_wrapper #(.AXI_DATA_WIDTH(32)) PCIM_AXI4_ILA // (.aclk (clk), // .trig_disable (1'b0), @@ -754,7 +757,7 @@ module sde #(parameter bit C2H_ONLY = 0, // .ila_rdata (pcim_rdata ), // .ila_rresp (pcim_rresp ), // .ila_rlast (pcim_rlast ) -// ); +// ); ila_axis C2H_AXIS_ILA (.clk (clk), @@ -765,7 +768,7 @@ module sde #(parameter bit C2H_ONLY = 0, .probe4 (c2h_axis_user), .probe5 (c2h_axis_ready) ); - + ila_axis H2C_AXIS_ILA (.clk (clk), .probe0 (h2c_axis_valid), @@ -775,13 +778,9 @@ module sde #(parameter bit C2H_ONLY = 0, .probe4 (h2c_axis_user), .probe5 (h2c_axis_ready) ); - + `endif // `ifndef NO_SDE_DEBUG_ILA - - - -endmodule // sde - - + +endmodule // sde diff --git a/hdk/cl/examples/cl_sde/design/sde_c2h.sv b/hdk/cl/examples/cl_sde/design/sde_c2h.sv index 017d5478f..393683f57 100644 --- a/hdk/cl/examples/cl_sde/design/sde_c2h.sv +++ b/hdk/cl/examples/cl_sde/design/sde_c2h.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016-2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,15 +13,16 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ // C2H Top level module sde_c2h #(parameter bit C2H_DESC_TYPE = 0, // 0 - Regular, 1 - Compact parameter C2H_DESC_WIDTH = 128, - + parameter C2H_DESC_RAM_DEPTH = 64, - + parameter C2H_PCIM_DM_AWID = 0, // This is the AWID used for write accesses from Data Mover parameter C2H_PCIM_WB_AWID = 1, // This is the AWID used for write accesses from Write Back Block parameter C2H_PCIM_DESC_ARID = 2, // This is the ARID used for read access from the C2H Desc Block @@ -34,7 +36,7 @@ module sde_c2h #(parameter bit C2H_DESC_TYPE = 0, // 0 - Regular, 1 - Compact parameter C2H_AXIS_DATA_WIDTH = 512, parameter C2H_USER_BIT_WIDTH = C2H_DESC_TYPE ? 1 : 64, - + parameter C2H_BUF_DEPTH = 512 ) @@ -48,7 +50,7 @@ module sde_c2h #(parameter bit C2H_DESC_TYPE = 0, // 0 - Regular, 1 - Compact input c2h_ps_desc_wr_req, input [C2H_DESC_WIDTH-1:0] c2h_ps_desc_wdata, output logic c2h_ps_desc_ack, - + // PCIS to C2H CSR input c2h_ps_cfg_wr_req, input c2h_ps_cfg_rd_req, @@ -81,7 +83,7 @@ module sde_c2h #(parameter bit C2H_DESC_TYPE = 0, // 0 - Regular, 1 - Compact output logic [PCIM_LEN_WIDTH-1:0] c2h_dm_pm_awlen, output logic [PCIM_ID_WIDTH-1:0] c2h_dm_pm_awid, input c2h_pm_dm_awready, - + // Write Data to PCIM output logic c2h_dm_pm_wvalid, output logic [PCIM_DATA_WIDTH-1:0] c2h_dm_pm_wdata, @@ -101,7 +103,7 @@ module sde_c2h #(parameter bit C2H_DESC_TYPE = 0, // 0 - Regular, 1 - Compact output logic [PCIM_LEN_WIDTH-1:0] c2h_wb_pm_awlen, output logic [PCIM_ID_WIDTH-1:0] c2h_wb_pm_awid, input c2h_pm_wb_awready, - + // Write Data to PCIM output logic c2h_wb_pm_wvalid, output logic [PCIM_DATA_WIDTH-1:0] c2h_wb_pm_wdata, @@ -120,7 +122,7 @@ module sde_c2h #(parameter bit C2H_DESC_TYPE = 0, // 0 - Regular, 1 - Compact input [(C2H_AXIS_DATA_WIDTH>>3)-1:0] c2h_axis_keep, input [C2H_USER_BIT_WIDTH-1:0] c2h_axis_user, input c2h_axis_last, - output logic c2h_axis_ready + output logic c2h_axis_ready ); @@ -128,7 +130,7 @@ module sde_c2h #(parameter bit C2H_DESC_TYPE = 0, // 0 - Regular, 1 - Compact localparam BUF_ADDR_RAM_IDX_WIDTH = $clog2(C2H_BUF_DEPTH); localparam BUF_ADDR_WIDTH = PCIM_ADDR_BYTE_IDX_WIDTH + BUF_ADDR_RAM_IDX_WIDTH; localparam BUF_AUX_WIDTH = BUF_ADDR_WIDTH + C2H_USER_BIT_WIDTH; - + // Signals logic desc_dm_empty; @@ -137,7 +139,7 @@ module sde_c2h #(parameter bit C2H_DESC_TYPE = 0, // 0 - Regular, 1 - Compact logic desc_dm_desc_valid; logic dm_desc_cnt_inc; - + // Descriptor to Write Back Block logic desc_wb_limit_req; logic [31:0] desc_wb_limit; @@ -147,16 +149,16 @@ module sde_c2h #(parameter bit C2H_DESC_TYPE = 0, // 0 - Regular, 1 - Compact logic dm_wb_md_req; sde_pkg::c2h_reg_wb_t dm_wb_md; logic wb_dm_md_grant; - - // Data Mover to Buffer + + // Data Mover to Buffer logic buf_dm_aux_valid; logic [BUF_AUX_WIDTH-1:0] buf_dm_aux_data; logic dm_buf_aux_pop; - + logic [BUF_ADDR_WIDTH-1:0] dm_buf_rd_byte_addr; logic [BUF_ADDR_WIDTH:0] buf_dm_num_bytes; // Difference in pointers + plus num of bytes in last beat - + logic dm_buf_rd; logic [BUF_ADDR_RAM_IDX_WIDTH-1:0] dm_buf_addr; logic [PCIM_DATA_WIDTH-1:0] buf_dm_data; @@ -167,7 +169,7 @@ module sde_c2h #(parameter bit C2H_DESC_TYPE = 0, // 0 - Regular, 1 - Compact logic [C2H_USER_BIT_WIDTH-1:0] axis_buf_user; logic axis_buf_last; logic buf_axis_ready; - + logic axis_wb_pkt_cnt_req; logic [31:0] axis_wb_pkt_cnt; @@ -188,10 +190,10 @@ module sde_c2h #(parameter bit C2H_DESC_TYPE = 0, // 0 - Regular, 1 - Compact logic [C2H_DESC_WIDTH-1:0] cfg_desc_ram_wdata ; logic desc_cfg_ram_ack ; logic [C2H_DESC_WIDTH-1:0] desc_cfg_ram_rdata ; - + logic dm_cfg_bresp_err; logic dm_cfg_desc_len_err; - + logic cfg_wb_desc_cdt_en; logic cfg_wb_desc_cnt_en; logic cfg_wb_pkt_cnt_en; @@ -202,12 +204,12 @@ module sde_c2h #(parameter bit C2H_DESC_TYPE = 0, // 0 - Regular, 1 - Compact logic [15:0] cfg_wb_md_rd_ptr; logic [15:0] wb_cfg_md_wr_ptr; logic cfg_wb_clr_wr_ptr; - - logic cfg_wb_desc_error; - logic cfg_wb_dm_error ; + + logic cfg_wb_desc_error; + logic cfg_wb_dm_error ; logic cfg_wb_wb_error ; logic [31:0] wb_cfg_status_dw ; - + logic cfg_desc_cdt_wc_en; logic cfg_desc_cnt_wc_en; logic cfg_pkt_cnt_wc_en; @@ -215,10 +217,10 @@ module sde_c2h #(parameter bit C2H_DESC_TYPE = 0, // 0 - Regular, 1 - Compact logic [19:0] cfg_wc_tick_cnt; logic [3:0] cfg_wc_to_cnt; logic [5:0] cfg_wc_cnt_minus1; - + logic cfg_axis_clr_pkt_cnt; logic [31:0] axis_cfg_pkt_cnt; - + logic dm_num_beats_err; logic desc_cfg_oflow; @@ -228,7 +230,7 @@ module sde_c2h #(parameter bit C2H_DESC_TYPE = 0, // 0 - Regular, 1 - Compact logic wb_cfg_md_bresp_err ; logic wb_cfg_sts_bresp_err; - + logic buf_cfg_buf_oflow; logic buf_cfg_buf_uflow; logic buf_cfg_buf_full; @@ -237,24 +239,24 @@ module sde_c2h #(parameter bit C2H_DESC_TYPE = 0, // 0 - Regular, 1 - Compact logic [15:0] buf_cfg_buf_rd_addr; logic buf_cfg_aux_fifo_oflow; logic buf_cfg_aux_fifo_uflow; - logic buf_cfg_aux_fifo_full ; + logic buf_cfg_aux_fifo_full ; logic buf_cfg_aux_fifo_empty; logic [15:0] buf_cfg_aux_ram_wr_ptr; - logic [15:0] buf_cfg_aux_ram_rd_ptr; + logic [15:0] buf_cfg_aux_ram_rd_ptr; logic [15:0] buf_cfg_num_bytes; logic [31:0] buf_cfg_in_pkt_cnt; logic [31:0] buf_cfg_out_pkt_cnt; logic cfg_buf_clr_in_pkt_cnt; logic cfg_buf_clr_out_pkt_cnt; - + // Generate local copy of Reset logic sync_rst_n; always @(posedge clk) - if (!rst_n) + if (!rst_n) sync_rst_n <= 0; else sync_rst_n <= rst_n; - + // C2H CSR Block sde_c2h_cfg #( .DESC_TYPE (C2H_DESC_TYPE), @@ -264,7 +266,7 @@ module sde_c2h #(parameter bit C2H_DESC_TYPE = 0, // 0 - Regular, 1 - Compact SDE_C2H_CFG (.clk (clk), .rst_n (sync_rst_n), - + .c2h_ps_cfg_wr_req (c2h_ps_cfg_wr_req), .c2h_ps_cfg_rd_req (c2h_ps_cfg_rd_req), .c2h_ps_cfg_addr (c2h_ps_cfg_addr ), @@ -278,20 +280,20 @@ module sde_c2h #(parameter bit C2H_DESC_TYPE = 0, // 0 - Regular, 1 - Compact .cfg_desc_clr_desc_cnt (cfg_desc_clr_desc_cnt ), .cfg_desc_clr_cdt_limit (cfg_desc_clr_cdt_limit ), .cfg_desc_clr_cdt_consumed (cfg_desc_clr_cdt_consumed), - + .desc_cfg_cdt_consumed (desc_cfg_cdt_consumed), .desc_cfg_cdt_limit (desc_cfg_cdt_limit ), .desc_cfg_desc_cnt (desc_cfg_desc_cnt ), .desc_cfg_wr_ptr (desc_cfg_wr_ptr ), .desc_cfg_rd_ptr (desc_cfg_rd_ptr ), - + .cfg_desc_ram_wr_req (cfg_desc_ram_wr_req), .cfg_desc_ram_rd_req (cfg_desc_ram_rd_req), .cfg_desc_ram_addr (cfg_desc_ram_addr ), .cfg_desc_ram_wdata (cfg_desc_ram_wdata ), .desc_cfg_ram_ack (desc_cfg_ram_ack ), .desc_cfg_ram_rdata (desc_cfg_ram_rdata ), - + .desc_cfg_oflow (desc_cfg_oflow), .desc_cfg_uflow (desc_cfg_uflow), .desc_cfg_full (desc_cfg_full ), @@ -310,7 +312,7 @@ module sde_c2h #(parameter bit C2H_DESC_TYPE = 0, // 0 - Regular, 1 - Compact .cfg_wb_md_rd_ptr (cfg_wb_md_rd_ptr ), .wb_cfg_md_wr_ptr (wb_cfg_md_wr_ptr ), .cfg_wb_clr_wr_ptr (cfg_wb_clr_wr_ptr ), - + .cfg_desc_cdt_wc_en (cfg_desc_cdt_wc_en ), .cfg_desc_cnt_wc_en (cfg_desc_cnt_wc_en ), .cfg_pkt_cnt_wc_en (cfg_pkt_cnt_wc_en ), @@ -320,13 +322,13 @@ module sde_c2h #(parameter bit C2H_DESC_TYPE = 0, // 0 - Regular, 1 - Compact .cfg_wc_cnt_minus1 (cfg_wc_cnt_minus1 ), .wb_cfg_md_bresp_err (wb_cfg_md_bresp_err), - .wb_cfg_sts_bresp_err (wb_cfg_sts_bresp_err), + .wb_cfg_sts_bresp_err (wb_cfg_sts_bresp_err), - .cfg_wb_desc_error (cfg_wb_desc_error), - .cfg_wb_dm_error (cfg_wb_dm_error ), + .cfg_wb_desc_error (cfg_wb_desc_error), + .cfg_wb_dm_error (cfg_wb_dm_error ), .cfg_wb_wb_error (cfg_wb_wb_error ), .wb_cfg_status_dw (wb_cfg_status_dw ), - + .buf_cfg_buf_oflow (buf_cfg_buf_oflow ), .buf_cfg_buf_uflow (buf_cfg_buf_uflow ), .buf_cfg_buf_full (buf_cfg_buf_full ), @@ -335,56 +337,56 @@ module sde_c2h #(parameter bit C2H_DESC_TYPE = 0, // 0 - Regular, 1 - Compact .buf_cfg_buf_rd_addr (buf_cfg_buf_rd_addr ), .buf_cfg_aux_fifo_oflow (buf_cfg_aux_fifo_oflow ), .buf_cfg_aux_fifo_uflow (buf_cfg_aux_fifo_uflow ), - .buf_cfg_aux_fifo_full (buf_cfg_aux_fifo_full ), + .buf_cfg_aux_fifo_full (buf_cfg_aux_fifo_full ), .buf_cfg_aux_fifo_empty (buf_cfg_aux_fifo_empty ), .buf_cfg_aux_ram_wr_ptr (buf_cfg_aux_ram_wr_ptr ), - .buf_cfg_aux_ram_rd_ptr (buf_cfg_aux_ram_rd_ptr ), + .buf_cfg_aux_ram_rd_ptr (buf_cfg_aux_ram_rd_ptr ), .buf_cfg_num_bytes (buf_cfg_num_bytes ), .buf_cfg_in_pkt_cnt (buf_cfg_in_pkt_cnt ), .buf_cfg_out_pkt_cnt (buf_cfg_out_pkt_cnt ), .cfg_buf_clr_in_pkt_cnt (cfg_buf_clr_in_pkt_cnt ), .cfg_buf_clr_out_pkt_cnt (cfg_buf_clr_out_pkt_cnt), - + .cfg_axis_clr_pkt_cnt (cfg_axis_clr_pkt_cnt), .axis_cfg_pkt_cnt (axis_cfg_pkt_cnt ) ); - + // C2H Descriptor - sde_desc + sde_desc #(.H2C_N_C2H (0), - + .DESC_TYPE (C2H_DESC_TYPE), - .DESC_WIDTH (C2H_DESC_WIDTH), + .DESC_WIDTH (C2H_DESC_WIDTH), .DESC_RAM_DEPTH (C2H_DESC_RAM_DEPTH), - + .PCIM_DATA_WIDTH (PCIM_DATA_WIDTH ), .PCIM_ID_WIDTH (PCIM_ID_WIDTH ), .PCIM_LEN_WIDTH (PCIM_LEN_WIDTH ), .PCIM_ADDR_WIDTH (PCIM_ADDR_WIDTH ), .PCIM_DESC_ARID (C2H_PCIM_DESC_ARID) - ) - SDE_C2H_DESC + ) + SDE_C2H_DESC (.clk (clk), .rst_n (sync_rst_n), - + .ps_desc_wr_req (c2h_ps_desc_wr_req), .ps_desc_wdata (c2h_ps_desc_wdata), .ps_desc_ack (c2h_ps_desc_ack), - + .cfg_desc_ram_wr_req (cfg_desc_ram_wr_req), .cfg_desc_ram_rd_req (cfg_desc_ram_rd_req), .cfg_desc_ram_addr (cfg_desc_ram_addr ), .cfg_desc_ram_wdata (cfg_desc_ram_wdata ), .desc_cfg_ram_ack (desc_cfg_ram_ack ), .desc_cfg_ram_rdata (desc_cfg_ram_rdata ), - + .cfg_desc_clr_desc_cnt (cfg_desc_clr_desc_cnt ), .cfg_desc_clr_cdt_limit (cfg_desc_clr_cdt_limit ), .cfg_desc_clr_cdt_consumed (cfg_desc_clr_cdt_consumed), - + .desc_cfg_cdt_consumed (desc_cfg_cdt_consumed), .desc_cfg_cdt_limit (desc_cfg_cdt_limit ), .desc_cfg_desc_cnt (desc_cfg_desc_cnt ), @@ -402,8 +404,8 @@ module sde_c2h #(parameter bit C2H_DESC_TYPE = 0, // 0 - Regular, 1 - Compact .desc_dm_desc_valid (desc_dm_desc_valid), .dm_desc_cnt_inc (dm_desc_cnt_inc), - - .desc_wb_limit_req (desc_wb_limit_req), + + .desc_wb_limit_req (desc_wb_limit_req), .desc_wb_limit (desc_wb_limit), .desc_wb_cnt_req (desc_wb_cnt_req), .desc_wb_cnt (desc_wb_cnt), @@ -412,7 +414,7 @@ module sde_c2h #(parameter bit C2H_DESC_TYPE = 0, // 0 - Regular, 1 - Compact .desc_pm_araddr (c2h_desc_pm_araddr ), .desc_pm_arlen (c2h_desc_pm_arlen ), .pm_desc_arready (c2h_pm_desc_arready), - + .pm_desc_rvalid (c2h_pm_desc_rvalid), .pm_desc_rresp (c2h_pm_desc_rresp ), .pm_desc_rdata (c2h_pm_desc_rdata ), @@ -420,25 +422,25 @@ module sde_c2h #(parameter bit C2H_DESC_TYPE = 0, // 0 - Regular, 1 - Compact .desc_pm_rready (c2h_desc_pm_rready) ); - + // C2H Data Mover - sde_c2h_data + sde_c2h_data #(.DESC_TYPE (C2H_DESC_TYPE), - + .PCIM_DM_AWID (C2H_PCIM_DM_AWID), - + .PCIM_MAX_WR_SIZE (C2H_PCIM_MAX_WR_SIZE), - + .PCIM_DATA_WIDTH (PCIM_DATA_WIDTH ), .PCIM_ID_WIDTH (PCIM_ID_WIDTH ), .PCIM_LEN_WIDTH (PCIM_LEN_WIDTH ), .PCIM_ADDR_WIDTH (PCIM_ADDR_WIDTH ), - + .BUF_DEPTH (C2H_BUF_DEPTH), - + .USER_BIT_WIDTH (C2H_USER_BIT_WIDTH) ) - SDE_C2H_DATA + SDE_C2H_DATA (.clk (clk), .rst_n (sync_rst_n), @@ -446,14 +448,14 @@ module sde_c2h #(parameter bit C2H_DESC_TYPE = 0, // 0 - Regular, 1 - Compact .dm_cfg_bresp_err (dm_cfg_bresp_err), .dm_cfg_desc_len_err (dm_cfg_desc_len_err), .dm_num_beats_err (dm_num_beats_err), - + .desc_dm_empty (desc_dm_empty), .dm_desc_pop (dm_desc_pop), .desc_dm_desc (desc_dm_desc), .desc_dm_desc_valid (desc_dm_desc_valid), .dm_desc_cnt_inc (dm_desc_cnt_inc), - + .dm_pm_awvalid (c2h_dm_pm_awvalid), .dm_pm_awaddr (c2h_dm_pm_awaddr ), .dm_pm_awlen (c2h_dm_pm_awlen ), @@ -483,7 +485,7 @@ module sde_c2h #(parameter bit C2H_DESC_TYPE = 0, // 0 - Regular, 1 - Compact .dm_buf_addr (dm_buf_addr), .buf_dm_data (buf_dm_data) ); - + // C2H Write-Back sde_wb #(.H2C_N_C2H (0), @@ -491,7 +493,7 @@ module sde_c2h #(parameter bit C2H_DESC_TYPE = 0, // 0 - Regular, 1 - Compact .DESC_RAM_DEPTH (C2H_DESC_RAM_DEPTH), .PCIM_WB_AWID (C2H_PCIM_WB_AWID), - + .PCIM_DATA_WIDTH (PCIM_DATA_WIDTH ), .PCIM_ID_WIDTH (PCIM_ID_WIDTH ), .PCIM_LEN_WIDTH (PCIM_LEN_WIDTH ), @@ -511,7 +513,7 @@ module sde_c2h #(parameter bit C2H_DESC_TYPE = 0, // 0 - Regular, 1 - Compact .cfg_wb_md_rd_ptr (cfg_wb_md_rd_ptr ), .wb_cfg_md_wr_ptr (wb_cfg_md_wr_ptr ), .cfg_wb_clr_wr_ptr (cfg_wb_clr_wr_ptr ), - + .cfg_desc_cdt_wc_en (cfg_desc_cdt_wc_en ), .cfg_desc_cnt_wc_en (cfg_desc_cnt_wc_en ), .cfg_pkt_cnt_wc_en (cfg_pkt_cnt_wc_en ), @@ -519,20 +521,20 @@ module sde_c2h #(parameter bit C2H_DESC_TYPE = 0, // 0 - Regular, 1 - Compact .cfg_wc_tick_cnt (cfg_wc_tick_cnt ), .cfg_wc_to_cnt (cfg_wc_to_cnt ), .cfg_wc_cnt_minus1 (cfg_wc_cnt_minus1 ), - - .cfg_wb_desc_error (cfg_wb_desc_error), - .cfg_wb_dm_error (cfg_wb_dm_error ), + + .cfg_wb_desc_error (cfg_wb_desc_error), + .cfg_wb_dm_error (cfg_wb_dm_error ), .cfg_wb_wb_error (cfg_wb_wb_error ), .wb_cfg_status_dw (wb_cfg_status_dw ), .wb_cfg_md_bresp_err (wb_cfg_md_bresp_err), - .wb_cfg_sts_bresp_err (wb_cfg_sts_bresp_err), + .wb_cfg_sts_bresp_err (wb_cfg_sts_bresp_err), .cfg_desc_clr_desc_cnt (cfg_desc_clr_desc_cnt ), .cfg_desc_clr_cdt_limit (cfg_desc_clr_cdt_limit), .cfg_axis_clr_pkt_cnt (cfg_axis_clr_pkt_cnt), - - .desc_wb_limit_req (desc_wb_limit_req), + + .desc_wb_limit_req (desc_wb_limit_req), .desc_wb_limit (desc_wb_limit), .desc_wb_cnt_req (desc_wb_cnt_req), @@ -544,7 +546,7 @@ module sde_c2h #(parameter bit C2H_DESC_TYPE = 0, // 0 - Regular, 1 - Compact .axis_wb_pkt_cnt_req (axis_wb_pkt_cnt_req), .axis_wb_pkt_cnt (axis_wb_pkt_cnt), - + .wb_pm_awvalid (c2h_wb_pm_awvalid), .wb_pm_awaddr (c2h_wb_pm_awaddr ), .wb_pm_awlen (c2h_wb_pm_awlen ), @@ -560,13 +562,13 @@ module sde_c2h #(parameter bit C2H_DESC_TYPE = 0, // 0 - Regular, 1 - Compact .wb_pm_bready (c2h_wb_pm_bready ) ); - + // C2H Buffer sde_c2h_buf #(.DESC_TYPE (C2H_DESC_TYPE), .PCIM_DATA_WIDTH (PCIM_DATA_WIDTH ), - + .BUF_DEPTH (C2H_BUF_DEPTH), .USER_BIT_WIDTH (C2H_USER_BIT_WIDTH) @@ -584,21 +586,21 @@ module sde_c2h #(parameter bit C2H_DESC_TYPE = 0, // 0 - Regular, 1 - Compact .buf_cfg_buf_rd_addr (buf_cfg_buf_rd_addr ), .buf_cfg_aux_fifo_oflow (buf_cfg_aux_fifo_oflow ), .buf_cfg_aux_fifo_uflow (buf_cfg_aux_fifo_uflow ), - .buf_cfg_aux_fifo_full (buf_cfg_aux_fifo_full ), + .buf_cfg_aux_fifo_full (buf_cfg_aux_fifo_full ), .buf_cfg_aux_fifo_empty (buf_cfg_aux_fifo_empty ), .buf_cfg_aux_ram_wr_ptr (buf_cfg_aux_ram_wr_ptr ), - .buf_cfg_aux_ram_rd_ptr (buf_cfg_aux_ram_rd_ptr ), + .buf_cfg_aux_ram_rd_ptr (buf_cfg_aux_ram_rd_ptr ), .buf_cfg_num_bytes (buf_cfg_num_bytes ), .buf_cfg_in_pkt_cnt (buf_cfg_in_pkt_cnt ), .buf_cfg_out_pkt_cnt (buf_cfg_out_pkt_cnt ), .cfg_buf_clr_in_pkt_cnt (cfg_buf_clr_in_pkt_cnt ), .cfg_buf_clr_out_pkt_cnt (cfg_buf_clr_out_pkt_cnt), - - .axis_buf_valid (axis_buf_valid ), - .axis_buf_data (axis_buf_data ), - .axis_buf_keep (axis_buf_keep ), - .axis_buf_user (axis_buf_user ), - .axis_buf_last (axis_buf_last ), + + .axis_buf_valid (axis_buf_valid ), + .axis_buf_data (axis_buf_data ), + .axis_buf_keep (axis_buf_keep ), + .axis_buf_user (axis_buf_user ), + .axis_buf_last (axis_buf_last ), .buf_axis_ready (buf_axis_ready ), .buf_dm_aux_valid (buf_dm_aux_valid), @@ -612,7 +614,7 @@ module sde_c2h #(parameter bit C2H_DESC_TYPE = 0, // 0 - Regular, 1 - Compact .dm_buf_addr (dm_buf_addr), .buf_dm_data (buf_dm_data) ); - + // C2H AXI-Stream Interface sde_c2h_axis #(.DESC_TYPE (C2H_DESC_TYPE), @@ -625,34 +627,28 @@ module sde_c2h #(parameter bit C2H_DESC_TYPE = 0, // 0 - Regular, 1 - Compact SDE_C2H_AXIS (.clk (clk), .rst_n (sync_rst_n), - + .cfg_axis_clr_pkt_cnt (cfg_axis_clr_pkt_cnt), .axis_cfg_pkt_cnt (axis_cfg_pkt_cnt), - + .c2h_axis_valid (c2h_axis_valid ), - .c2h_axis_data (c2h_axis_data ), - .c2h_axis_keep (c2h_axis_keep ), - .c2h_axis_user (c2h_axis_user ), - .c2h_axis_last (c2h_axis_last ), + .c2h_axis_data (c2h_axis_data ), + .c2h_axis_keep (c2h_axis_keep ), + .c2h_axis_user (c2h_axis_user ), + .c2h_axis_last (c2h_axis_last ), .c2h_axis_ready (c2h_axis_ready ), - - .axis_buf_valid (axis_buf_valid ), - .axis_buf_data (axis_buf_data ), - .axis_buf_keep (axis_buf_keep ), - .axis_buf_user (axis_buf_user ), - .axis_buf_last (axis_buf_last ), + + .axis_buf_valid (axis_buf_valid ), + .axis_buf_data (axis_buf_data ), + .axis_buf_keep (axis_buf_keep ), + .axis_buf_user (axis_buf_user ), + .axis_buf_last (axis_buf_last ), .buf_axis_ready (buf_axis_ready ), .axis_wb_pkt_cnt_req (axis_wb_pkt_cnt_req), .axis_wb_pkt_cnt (axis_wb_pkt_cnt) - - ); - - -endmodule // sde_c2h - + ); - - +endmodule // sde_c2h diff --git a/hdk/cl/examples/cl_sde/design/sde_c2h_axis.sv b/hdk/cl/examples/cl_sde/design/sde_c2h_axis.sv index 415a5f976..1b57dfdf2 100644 --- a/hdk/cl/examples/cl_sde/design/sde_c2h_axis.sv +++ b/hdk/cl/examples/cl_sde/design/sde_c2h_axis.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016-2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + // C2H AXI-Stream Interface @@ -20,7 +23,7 @@ module sde_c2h_axis #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact parameter PCIM_DATA_WIDTH = 512, parameter AXIS_DATA_WIDTH = 512, - + parameter USER_BIT_WIDTH = DESC_TYPE ? 1 : 64 ) @@ -31,7 +34,7 @@ module sde_c2h_axis #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact // CSR to AXI-S Interface input cfg_axis_clr_pkt_cnt, output logic [31:0] axis_cfg_pkt_cnt, - + // AXI-S Interface to CL input c2h_axis_valid, input [AXIS_DATA_WIDTH-1:0] c2h_axis_data, @@ -39,7 +42,7 @@ module sde_c2h_axis #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact input [USER_BIT_WIDTH-1:0] c2h_axis_user, input c2h_axis_last, output logic c2h_axis_ready, - + // AXI-S Interface to Buf output logic axis_buf_valid, output logic [PCIM_DATA_WIDTH-1:0] axis_buf_data, @@ -51,7 +54,7 @@ module sde_c2h_axis #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact // AXI-S Interface to Write Back block for packet Count Update output logic axis_wb_pkt_cnt_req, output logic [31:0] axis_wb_pkt_cnt - + ); @@ -69,7 +72,7 @@ module sde_c2h_axis #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact assign c2h_axis_ready = buf_axis_ready; logic [31:0] axis_pkt_cnt; - + always @(posedge clk) if (!rst_n) begin axis_wb_pkt_cnt_req <= 0; @@ -77,7 +80,7 @@ module sde_c2h_axis #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact end else begin axis_wb_pkt_cnt_req <= c2h_axis_valid & c2h_axis_ready & c2h_axis_last; - axis_pkt_cnt <= cfg_axis_clr_pkt_cnt ? 0 : + axis_pkt_cnt <= cfg_axis_clr_pkt_cnt ? 0 : c2h_axis_valid & c2h_axis_ready & c2h_axis_last ? axis_pkt_cnt + 1 : axis_pkt_cnt; end @@ -86,9 +89,3 @@ module sde_c2h_axis #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact assign axis_cfg_pkt_cnt = axis_pkt_cnt; endmodule // sde_c2h_axis - - - - - - diff --git a/hdk/cl/examples/cl_sde/design/sde_c2h_buf.sv b/hdk/cl/examples/cl_sde/design/sde_c2h_buf.sv index e01c616d0..2fd56d1ce 100644 --- a/hdk/cl/examples/cl_sde/design/sde_c2h_buf.sv +++ b/hdk/cl/examples/cl_sde/design/sde_c2h_buf.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016-2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,11 +13,13 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + // C2H Buffer module sde_c2h_buf #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact - + parameter PCIM_DATA_WIDTH = 512, parameter PCIM_ADDR_BYTE_IDX_WIDTH = $clog2(PCIM_DATA_WIDTH>>3), @@ -26,7 +29,7 @@ module sde_c2h_buf #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact parameter USER_BIT_WIDTH = DESC_TYPE ? 1 : 64, parameter BUF_AUX_WIDTH = BUF_ADDR_WIDTH + USER_BIT_WIDTH, - + // These are internal FIFOs - Dont change unless absolutely required parameter BUF_AUX_FT_FIFO_DEPTH = 64 ) @@ -44,16 +47,16 @@ module sde_c2h_buf #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact output logic [15:0] buf_cfg_buf_rd_addr, output logic buf_cfg_aux_fifo_oflow, output logic buf_cfg_aux_fifo_uflow, - output logic buf_cfg_aux_fifo_full , + output logic buf_cfg_aux_fifo_full , output logic buf_cfg_aux_fifo_empty, output logic [15:0] buf_cfg_aux_ram_wr_ptr, - output logic [15:0] buf_cfg_aux_ram_rd_ptr, + output logic [15:0] buf_cfg_aux_ram_rd_ptr, output logic [15:0] buf_cfg_num_bytes, output logic [31:0] buf_cfg_in_pkt_cnt, output logic [31:0] buf_cfg_out_pkt_cnt, input cfg_buf_clr_in_pkt_cnt, input cfg_buf_clr_out_pkt_cnt, - + // AXI-S Interface to Buf input axis_buf_valid, input [PCIM_DATA_WIDTH-1:0] axis_buf_data, @@ -61,17 +64,17 @@ module sde_c2h_buf #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact input [USER_BIT_WIDTH-1:0] axis_buf_user, input axis_buf_last, output logic buf_axis_ready, - - + + // Buf to Data Mover output logic buf_dm_aux_valid, output logic [BUF_AUX_WIDTH-1:0] buf_dm_aux_data, input dm_buf_aux_pop, - + input [BUF_ADDR_WIDTH-1:0] dm_buf_rd_byte_addr, output logic [BUF_ADDR_WIDTH:0] buf_dm_num_bytes, // Difference in pointers + plus num of bytes in last beat - + input dm_buf_rd, input [BUF_ADDR_RAM_IDX_WIDTH-1:0] dm_buf_addr, output logic [PCIM_DATA_WIDTH-1:0] buf_dm_data @@ -87,14 +90,14 @@ module sde_c2h_buf #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact logic [BUF_RAM_ADDR_WIDTH-1:0] buf_wr_ptr; logic [BUF_RAM_ADDR_WIDTH-1:0] buf_rd_ptr; logic [BUF_RAM_ADDR_WIDTH-1:0] buf_rd_ptr_q; - + logic buf_write_en; logic buf_full; logic buf_oflow; logic buf_uflow; logic buf_empty; - + logic buf_ram_wr; logic [BUF_RAM_ADDR_WIDTH-1:0] buf_ram_waddr; logic [PCIM_DATA_WIDTH-1:0] buf_ram_wdata; @@ -105,7 +108,7 @@ module sde_c2h_buf #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact logic aux_ram_full; logic aux_ram_oflow; logic aux_fifo_uflow; - + assign buf_wr_ptr_next = (buf_wr_ptr >= BUF_DEPTH_MINUS1) ? 0 : buf_wr_ptr + 1; assign buf_rd_ptr = dm_buf_rd_byte_addr[PCIM_ADDR_BYTE_IDX_WIDTH +: BUF_ADDR_RAM_IDX_WIDTH]; @@ -118,11 +121,11 @@ module sde_c2h_buf #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact buf_wr_ptr <= '{default:'0}; buf_full <= 0; buf_empty <= 0; - - buf_rd_ptr_q <= 0; + + buf_rd_ptr_q <= 0; buf_oflow <= 0; buf_uflow <= 0; - end + end else begin buf_wr_ptr <= buf_write_en ? buf_wr_ptr_next : buf_wr_ptr; buf_full <= buf_write_en ? (buf_wr_ptr_next == buf_rd_ptr) : @@ -130,7 +133,7 @@ module sde_c2h_buf #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact buf_full; buf_empty <= ~buf_write_en & ~buf_full & (buf_wr_ptr == buf_rd_ptr) ? 1'b1 : buf_write_en ? 1'b0 : buf_empty; - + buf_rd_ptr_q <= buf_rd_ptr; buf_oflow <= buf_full & buf_write_en; buf_uflow <= buf_empty & (buf_rd_ptr_q != buf_rd_ptr); @@ -145,9 +148,9 @@ module sde_c2h_buf #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact buf_cfg_buf_wr_ptr = buf_wr_ptr; buf_cfg_buf_rd_addr = dm_buf_rd_byte_addr; end - + assign buf_axis_ready = ~buf_full & ~aux_ram_full; - + // Buffer BRAM assign buf_ram_wr = buf_write_en; assign buf_ram_waddr = buf_wr_ptr; @@ -155,9 +158,9 @@ module sde_c2h_buf #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact assign buf_ram_rd = dm_buf_rd; assign buf_ram_raddr = dm_buf_addr; - + // Desc RAM - Using 2 port RAM (1w1r) - bram_1w1r #(.WIDTH(PCIM_DATA_WIDTH), + bram_1w1r #(.WIDTH(PCIM_DATA_WIDTH), .ADDR_WIDTH(BUF_RAM_ADDR_WIDTH), .DEPTH(BUF_DEPTH) ) BUF_RAM (.clk (clk), @@ -172,7 +175,7 @@ module sde_c2h_buf #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact ); assign buf_dm_data = buf_ram_rdata; - + // Buffer AUX FT FIFO localparam BUF_AUX_RAM_WIDTH = DESC_TYPE ? BUF_AUX_WIDTH - 1 : BUF_AUX_WIDTH; @@ -203,7 +206,7 @@ module sde_c2h_buf #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact logic aux_ram_wr_ptr_msb; logic aux_ram_rd_ptr_msb; - + always_comb begin wr_last_byte_addr = 0; for (int byte_idx = 0; byte_idx < PCIM_DATA_WIDTH_BYTES; byte_idx++) begin @@ -211,15 +214,15 @@ module sde_c2h_buf #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact wr_last_byte_addr = byte_idx; end end - + assign aux_ram_wr = buf_write_en & axis_buf_last; assign aux_ram_waddr = aux_ram_wr_ptr; - assign aux_ram_wdata = DESC_TYPE ? {buf_wr_ptr, wr_last_byte_addr} : + assign aux_ram_wdata = DESC_TYPE ? {buf_wr_ptr, wr_last_byte_addr} : {axis_buf_user, buf_wr_ptr, wr_last_byte_addr}; assign aux_ram_rd = aux_ram_pop; assign aux_ram_raddr = aux_ram_rd_ptr; - + // AUX RAM bram_1w1r #(.WIDTH(BUF_AUX_RAM_WIDTH), .ADDR_WIDTH(BUF_AUX_RAM_ADDR_WIDTH), @@ -229,13 +232,13 @@ module sde_c2h_buf #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact .ena (aux_ram_wr), .addra (aux_ram_waddr), .da (aux_ram_wdata), - + .enb (aux_ram_rd), .addrb (aux_ram_raddr), .qb (aux_ram_rdata) ); - // Flow-through FIFO + // Flow-through FIFO ft_fifo #(.FIFO_WIDTH(BUF_AUX_RAM_WIDTH) ) AUX_FT_FIFO (.clk (clk), .rst_n (1'b1), @@ -243,7 +246,7 @@ module sde_c2h_buf #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact .ram_fifo_empty (aux_ram_empty), .ram_fifo_data (aux_ram_rdata), .ram_pop (aux_ram_pop), - + .ft_pop (aux_ft_ff_pop), .ft_valid (aux_ft_ff_valid), .ft_data (aux_ft_ff_data) @@ -252,15 +255,15 @@ module sde_c2h_buf #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact assign aux_ft_ff_pop = dm_buf_aux_pop; assign buf_dm_aux_valid = aux_ft_ff_valid; assign buf_dm_aux_data = DESC_TYPE ? {1'b0, aux_ft_ff_data} : aux_ft_ff_data; - - assign aux_ram_wr_ptr_next = (aux_ram_wr_ptr == BUF_AUX_RAM_DEPTH_MINUS1) ? ({BUF_AUX_RAM_ADDR_WIDTH{1'b0}}) : + + assign aux_ram_wr_ptr_next = (aux_ram_wr_ptr == BUF_AUX_RAM_DEPTH_MINUS1) ? ({BUF_AUX_RAM_ADDR_WIDTH{1'b0}}) : aux_ram_wr_ptr + 1; assign aux_ram_wr_ptr_msb_next = (aux_ram_wr_ptr == BUF_AUX_RAM_DEPTH_MINUS1) ? ~aux_ram_wr_ptr_msb : aux_ram_wr_ptr_msb; - + assign aux_ram_rd_ptr_next = (aux_ram_rd_ptr == BUF_AUX_RAM_DEPTH_MINUS1) ? ({BUF_AUX_RAM_ADDR_WIDTH{1'b0}}) : aux_ram_rd_ptr + 1; assign aux_ram_rd_ptr_msb_next = (aux_ram_rd_ptr == BUF_AUX_RAM_DEPTH_MINUS1) ? ~aux_ram_rd_ptr_msb : aux_ram_rd_ptr_msb; - + always @(posedge clk) if (!rst_n) begin aux_ram_wr_ptr <= 0; @@ -293,12 +296,12 @@ module sde_c2h_buf #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact buf_cfg_aux_ram_wr_ptr = 0; buf_cfg_aux_ram_wr_ptr = aux_ram_wr_ptr; buf_cfg_aux_ram_wr_ptr[15] = aux_ram_wr_ptr_msb; - + buf_cfg_aux_ram_rd_ptr = 0; buf_cfg_aux_ram_rd_ptr = aux_ram_rd_ptr; buf_cfg_aux_ram_rd_ptr[15] = aux_ram_rd_ptr_msb; end - + // Number of bytes in the buffer localparam BUF_SIZE_BYTES = BUF_DEPTH * (PCIM_DATA_WIDTH>>3); @@ -326,21 +329,21 @@ module sde_c2h_buf #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact buf_wr_ptr_q <= buf_wr_ptr; buf_wr_ptr_qq <= buf_wr_ptr_q; end - + // When EOP is not valid // This is difference between read and write pointer // assign buf_ptr_diff = (buf_wr_ptr > buf_rd_ptr) ? (buf_wr_ptr - buf_rd_ptr) : // (BUF_DEPTH + buf_wr_ptr - buf_rd_ptr); - + assign buf_wr_byte_addr = {buf_wr_ptr_qq, {PCIM_ADDR_BYTE_IDX_WIDTH{1'b0}}}; assign buf_wr_byte_addr_plus_depth = BUF_SIZE_BYTES + buf_wr_byte_addr; assign buf_byte_addr_diff = (buf_wr_byte_addr > buf_rd_byte_addr) ? ({1'b0, buf_wr_byte_addr} - {1'b0, buf_rd_byte_addr}) : (buf_wr_byte_addr_plus_depth - {1'b0, buf_rd_byte_addr}); - + assign num_bytes_no_eop = ~buf_full & (buf_wr_byte_addr == buf_rd_byte_addr) ? 0 : buf_byte_addr_diff; - + // When EOP is valid // This is the difference between the write and the first EOP pointer assign aux_first_eop_wr_byte_addr = aux_ft_ff_data[0 +: BUF_ADDR_WIDTH]; @@ -349,7 +352,7 @@ module sde_c2h_buf #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact assign buf_aux_byte_addr_diff = (aux_first_eop_wr_byte_addr >= buf_rd_byte_addr) ? ({1'b0, aux_first_eop_wr_byte_addr} - {1'b0, buf_rd_byte_addr}) : (aux_first_eop_wr_byte_addr_plus_depth - {1'b0, buf_rd_byte_addr}); assign num_bytes_eop = buf_aux_byte_addr_diff + 1; - + // CANNOT FLOP// always @(posedge clk) // CANNOT FLOP// if (!rst_n) // CANNOT FLOP// buf_dm_num_bytes <= '{default:'0}; @@ -360,37 +363,37 @@ module sde_c2h_buf #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact logic [31:0] buf_in_pkt_cnt; logic [31:0] buf_out_pkt_cnt; logic [BUF_ADDR_WIDTH:0] buf_dm_num_bytes_q; - + // Error detection // if buf_dm_num_bytes decreases by 24K, thats an error always @(posedge clk) if (!rst_n) begin buf_cfg_in_pkt_cnt <= 0; buf_cfg_out_pkt_cnt <= 0; - + buf_cfg_num_bytes <= 0; // buf_cfg_num_bytes_eop <= 0; // buf_cfg_num_bytes_no_eop <= 0; end else begin - buf_cfg_in_pkt_cnt <= cfg_buf_clr_in_pkt_cnt ? 0 : + buf_cfg_in_pkt_cnt <= cfg_buf_clr_in_pkt_cnt ? 0 : (axis_buf_valid & axis_buf_last & buf_axis_ready) ? buf_cfg_in_pkt_cnt + 1 : buf_cfg_in_pkt_cnt; buf_cfg_out_pkt_cnt <= cfg_buf_clr_out_pkt_cnt ? 0 : aux_ft_ff_valid & aux_ft_ff_pop ? buf_cfg_out_pkt_cnt + 1 : buf_cfg_out_pkt_cnt; - + buf_cfg_num_bytes <= buf_dm_num_bytes; // buf_cfg_num_bytes_eop <= num_bytes_eop; // buf_cfg_num_bytes_no_eop <= num_bytes_no_eop; end // else: !if(!rst_n) - + `ifndef NO_SDE_DEBUG_ILA - + // ILA Signals ila_sde_c2h_buf SDE_C2H_BUF_ILA ( .clk (clk), - + // 0 .probe0(buf_full ), .probe1(buf_wr_ptr_qq ), @@ -409,7 +412,7 @@ module sde_c2h_buf #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact .probe13(buf_cfg_num_bytes_err ), .probe14(aux_ram_oflow ), .probe15(buf_oflow ), - + .probe16(buf_in_pkt_cnt ), .probe17(buf_out_pkt_cnt) @@ -417,7 +420,5 @@ module sde_c2h_buf #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact `endif // `ifndef NO_SDE_DEBUG_ILA - -endmodule // sde_c2h_buf - +endmodule // sde_c2h_buf diff --git a/hdk/cl/examples/cl_sde/design/sde_c2h_cfg.sv b/hdk/cl/examples/cl_sde/design/sde_c2h_cfg.sv index 1c0d99993..4b282cb17 100644 --- a/hdk/cl/examples/cl_sde/design/sde_c2h_cfg.sv +++ b/hdk/cl/examples/cl_sde/design/sde_c2h_cfg.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016-2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + // C2H Config Access @@ -33,7 +36,7 @@ module sde_c2h_cfg #(parameter bit DESC_TYPE = 0, input desc_ooo_error, input desc_unalin_error, - + // Config to Desc output logic cfg_desc_clr_cdt_consumed, output logic cfg_desc_clr_cdt_limit, @@ -46,7 +49,7 @@ module sde_c2h_cfg #(parameter bit DESC_TYPE = 0, output logic [19:0] cfg_wc_tick_cnt, output logic [3:0] cfg_wc_to_cnt, output logic [5:0] cfg_wc_cnt_minus1, - + input [31:0] desc_cfg_cdt_consumed, input [31:0] desc_cfg_cdt_limit, input [31:0] desc_cfg_desc_cnt, @@ -67,7 +70,7 @@ module sde_c2h_cfg #(parameter bit DESC_TYPE = 0, input dm_cfg_bresp_err, input dm_cfg_desc_len_err, - + // Config to WB output logic cfg_wb_desc_cdt_en, output logic cfg_wb_desc_cnt_en, @@ -83,8 +86,8 @@ module sde_c2h_cfg #(parameter bit DESC_TYPE = 0, input wb_cfg_md_bresp_err , input wb_cfg_sts_bresp_err, - output logic cfg_wb_desc_error, - output logic cfg_wb_dm_error, + output logic cfg_wb_desc_error, + output logic cfg_wb_dm_error, output logic cfg_wb_wb_error, input [31:0] wb_cfg_status_dw, @@ -97,10 +100,10 @@ module sde_c2h_cfg #(parameter bit DESC_TYPE = 0, input [15:0] buf_cfg_buf_rd_addr, input buf_cfg_aux_fifo_oflow, input buf_cfg_aux_fifo_uflow, - input buf_cfg_aux_fifo_full , + input buf_cfg_aux_fifo_full , input buf_cfg_aux_fifo_empty, input [15:0] buf_cfg_aux_ram_wr_ptr, - input [15:0] buf_cfg_aux_ram_rd_ptr, + input [15:0] buf_cfg_aux_ram_rd_ptr, input [15:0] buf_cfg_num_bytes, input [31:0] buf_cfg_in_pkt_cnt, input [31:0] buf_cfg_out_pkt_cnt, @@ -114,14 +117,14 @@ module sde_c2h_cfg #(parameter bit DESC_TYPE = 0, localparam DESC_WIDTH_DW = DESC_WIDTH >> 5; localparam DESC_WIDTH_DW_MINUS1 = DESC_WIDTH_DW - 1; - + // Address range is 1.5KB (0x000 - 0x600) - + ///////////////////////////////////////////////// // C2H Global Control and Status (0x0000 - 0x00FC) ///////////////////////////////////////////////// // No registers yet - + ///////////////////////////////////////////////// // Desc Config and Status (0x0100 - 0x01FC) ///////////////////////////////////////////////// @@ -141,7 +144,7 @@ module sde_c2h_cfg #(parameter bit DESC_TYPE = 0, // 0x10 : Desc Address Registers (RW) // 15:0 - Desc RAM Address (RW) // 31:16 - Desc DW Index (W0C) (Auto increment) - + // 0x14 : Desc Read/Write Data (RW) // 0x18 : Desc Status @@ -156,7 +159,7 @@ module sde_c2h_cfg #(parameter bit DESC_TYPE = 0, // 0 - Descriptor Type (0 - Regular, 1 - Compact) (RO) // 15:1 - RSVD // 31:16 - Descriptor RAM Depth (Maximum number of descriptors) (RO) - + ///////////////////////////////////////////////// // Data Mover Config and Status (0x0200 - 0x02FC) ///////////////////////////////////////////////// @@ -167,7 +170,7 @@ module sde_c2h_cfg #(parameter bit DESC_TYPE = 0, // 0 - BRESP Error (RW1C) // 1 - Descriptor length Error (RW1C) // 31:2 - RSVD - + ///////////////////////////////////////////////// // Write Back Config and Status (0x0300 - 0x34FC) ///////////////////////////////////////////////// @@ -182,7 +185,7 @@ module sde_c2h_cfg #(parameter bit DESC_TYPE = 0, // 7 - Metadata Write-Pointer Write-Back Coalescing Enable // 13:8 - Write-Back Coalescing Count Minus 1 // 31:14 - RSVD - + // 0x04 : Status Write-Back Address Low (RW) // 0x08 : Status Write-back Address High (RW) @@ -193,15 +196,15 @@ module sde_c2h_cfg #(parameter bit DESC_TYPE = 0, // 31:24 - RSVD // 0x10 : TODO - Metadata Coalescing Control & Status Register (RW) - TODO - + // 0x14 : TODO - Metadata Write-Pointer Coalescing Control & Status Register (RW) - TODO - + // 0x18 : Metadata Ring Write-Back Base Address Low (RW) - + // 0x1C : Metadata Ring Write-Back Base Address High (RW) - + // 0x20 : Metadata Ring Size in Bytes (Should be integer multiple of WB size) (RW) - + // 0x24 : Metadata Read Pointer (RW) // 0x28 : Metadata Write Pointer (RWOC) @@ -210,13 +213,13 @@ module sde_c2h_cfg #(parameter bit DESC_TYPE = 0, // 0 - BRESP Error for Status Write // 1 - BRESP Error for Metadata Write // 31:2 - RSVD - + // 0x30 : Status DW // 0 - Desc Error // 1 - Data Mover Error // 2 - Write-Back Error // 31:3 - RSVD - + ///////////////////////////////////////////////// // Buffer Config and Status (0x0400 - 0x04FC) ///////////////////////////////////////////////// @@ -225,7 +228,7 @@ module sde_c2h_cfg #(parameter bit DESC_TYPE = 0, // 0x04 : Buf Status // 0 - Buffer Overflow (RW1C) - // 1 - Buffer Underflow (RW1C) + // 1 - Buffer Underflow (RW1C) // 2 - Aux FIFO Overflow (RW1C) // 3 - Aux FIFO Underflow (RW1C) // 4 - Buffer Full (RO) @@ -233,7 +236,7 @@ module sde_c2h_cfg #(parameter bit DESC_TYPE = 0, // 6 - Aux FIFO Full (RO) // 7 - Aux FIFO Valid (RO) // 31:8 - RSVD - + // 0x08 : Input Packet Count (RW0C) // 0x0C : Ouput Packet Count (RW0C) @@ -251,12 +254,12 @@ module sde_c2h_cfg #(parameter bit DESC_TYPE = 0, // 0x18 : Number of Bytes // 15:0 - Buffer Number of Bytes (RO) // 31:16 - RSVD - + ///////////////////////////////////////////////// // AXIS Config and Status (0x0500 - 0x05FC) ///////////////////////////////////////////////// // 0x00 : Packet Count (RW0C) - + logic cfg_wr_q; logic cfg_rd_q; logic cfg_wr_re; @@ -282,7 +285,7 @@ module sde_c2h_cfg #(parameter bit DESC_TYPE = 0, logic [31:0] rdata_range_4; logic [31:0] rdata_range_5; - + always @(posedge clk) if (!rst_n) begin cfg_wr_q <= 0; @@ -293,10 +296,10 @@ module sde_c2h_cfg #(parameter bit DESC_TYPE = 0, cfg_rd_q <= c2h_ps_cfg_rd_req; end assign cfg_wr_re = ~cfg_wr_q & c2h_ps_cfg_wr_req; - assign cfg_rd_re = ~cfg_rd_q & c2h_ps_cfg_rd_req; + assign cfg_rd_re = ~cfg_rd_q & c2h_ps_cfg_rd_req; assign cfg_wr_fe = cfg_wr_q & ~c2h_ps_cfg_wr_req; assign cfg_rd_fe = cfg_rd_q & ~c2h_ps_cfg_rd_req; - + // Decode Address ranges assign dec_range_0 = (c2h_ps_cfg_addr >= 16'h0000) & (c2h_ps_cfg_addr < 16'h0100); assign dec_range_1 = (c2h_ps_cfg_addr >= 16'h0100) & (c2h_ps_cfg_addr < 16'h0200); @@ -304,7 +307,7 @@ module sde_c2h_cfg #(parameter bit DESC_TYPE = 0, assign dec_range_3 = (c2h_ps_cfg_addr >= 16'h0300) & (c2h_ps_cfg_addr < 16'h0400); assign dec_range_4 = (c2h_ps_cfg_addr >= 16'h0400) & (c2h_ps_cfg_addr < 16'h0500); assign dec_range_5 = (c2h_ps_cfg_addr >= 16'h0500) & (c2h_ps_cfg_addr < 16'h0600); - + always @(posedge clk) if (!rst_n) begin c2h_ps_cfg_ack <= 0; @@ -325,20 +328,20 @@ module sde_c2h_cfg #(parameter bit DESC_TYPE = 0, dec_range_4 ? rdata_range_4 : dec_range_5 ? rdata_range_5 : 32'hbaad_3600; end // else: !if(!rst_n) - + ///////////////////////////////////////////////// // Range 0 (0x0000 - 0x00FC) ///////////////////////////////////////////////// // TODO: No registers in this range yet assign ack_range_0 = 1; assign rdata_range_0 = 32'hbaad_3000; - + ///////////////////////////////////////////////// // Range 1 (0x0100 - 0x01FC) ///////////////////////////////////////////////// logic ack_wr_range_1; logic ack_rd_range_1; - + logic clr_desc_ram_idx; logic inc_desc_ram_idx_wr; logic inc_desc_ram_idx_rd; @@ -361,7 +364,7 @@ module sde_c2h_cfg #(parameter bit DESC_TYPE = 0, logic clr_desc_oflow; logic clr_desc_ooo_error; logic clr_desc_unalin_error; - + assign ack_range_1 = c2h_ps_cfg_wr_req ? ack_wr_range_1 : ack_rd_range_1; // Register Writes @@ -373,7 +376,7 @@ module sde_c2h_cfg #(parameter bit DESC_TYPE = 0, end else if (c2h_ps_cfg_wr_req & dec_range_1) begin ack_wr_range_1 <= 0; - case (c2h_ps_cfg_addr[7:0]) + case (c2h_ps_cfg_addr[7:0]) 8'h10 : begin ack_wr_range_1 <= 1; cfg_desc_ram_addr <= c2h_ps_cfg_wdata; @@ -405,7 +408,7 @@ module sde_c2h_cfg #(parameter bit DESC_TYPE = 0, assign cfg_desc_type = DESC_TYPE; assign cfg_desc_ram_depth = DESC_RAM_DEPTH; - + // Read data and ack always @(posedge clk) if (!rst_n) begin @@ -459,19 +462,19 @@ module sde_c2h_cfg #(parameter bit DESC_TYPE = 0, assign inc_desc_ram_idx_rd = cfg_rd_fe & dec_range_1 & (c2h_ps_cfg_addr[7:0] == 8'h14); assign inc_desc_ram_idx = cfg_rd_q ? inc_desc_ram_idx_rd : inc_desc_ram_idx_wr; - always @(posedge clk) + always @(posedge clk) if (!rst_n) begin desc_ram_idx <= 4'd0; cfg_desc_ram_rd_dw <= 32'd0; cfg_desc_ram_data_q <= '{default:'0}; - + cfg_desc_ram_wr_ack <= 0; cfg_desc_ram_rd_ack <= 0; cfg_desc_ram_rd_ack_q <= 0; - + cfg_desc_ram_addr_reg_wr <= 0; cfg_desc_ram_data_reg_wr <= 0; - + cfg_desc_ram_data_reg_wr_last <= 0; cfg_desc_ram_wr_req <= 0; cfg_desc_ram_rd_req <= 0; @@ -482,29 +485,29 @@ module sde_c2h_cfg #(parameter bit DESC_TYPE = 0, inc_desc_ram_idx ? desc_ram_idx + 4'd1 : desc_ram_idx; for (int dw_idx = 0; dw_idx < DESC_WIDTH_DW; dw_idx++) - if (desc_ram_idx == dw_idx) + if (desc_ram_idx == dw_idx) cfg_desc_ram_rd_dw <= cfg_desc_ram_data_q[32*dw_idx +: 32]; - + if (desc_cfg_ram_ack) cfg_desc_ram_data_q <= desc_cfg_ram_rdata; - else + else for (int dw_idx = 0; dw_idx < DESC_WIDTH_DW; dw_idx++) - if (desc_ram_idx == dw_idx) + if (desc_ram_idx == dw_idx) cfg_desc_ram_data_q[32*dw_idx +: 32] <= cfg_desc_ram_data_reg_wr ? cfg_desc_ram_wr_dw : cfg_desc_ram_data_q[32*dw_idx +: 32]; - - + + cfg_desc_ram_wr_ack <= (desc_ram_idx == DESC_WIDTH_DW_MINUS1) ? desc_cfg_ram_ack : 1'b1; cfg_desc_ram_rd_ack <= (desc_ram_idx == 0) ? desc_cfg_ram_ack : 1'b1; cfg_desc_ram_rd_ack_q <= cfg_desc_ram_rd_ack; - + cfg_desc_ram_addr_reg_wr <= cfg_wr_re & dec_range_1 & (c2h_ps_cfg_addr[7:0] == 8'h10); cfg_desc_ram_data_reg_wr <= cfg_wr_re & dec_range_1 & (c2h_ps_cfg_addr[7:0] == 8'h14); - + cfg_desc_ram_data_reg_wr_last <= cfg_wr_re & dec_range_1 & (c2h_ps_cfg_addr[7:0] == 8'h14) & (desc_ram_idx == DESC_WIDTH_DW_MINUS1); cfg_desc_ram_wr_req <= cfg_desc_ram_data_reg_wr_last; cfg_desc_ram_rd_req <= cfg_rd_re & dec_range_1 & (c2h_ps_cfg_addr[7:0] == 8'h14) & (desc_ram_idx == 0); - + end // else: !if(!rst_n) assign cfg_desc_ram_wdata = cfg_desc_ram_data_q; @@ -522,7 +525,7 @@ module sde_c2h_cfg #(parameter bit DESC_TYPE = 0, cfg_desc_unalin_error <= desc_unalin_error ? 1'b1 : clr_desc_unalin_error ? 1'b0 : cfg_desc_unalin_error; end // else: !if(!rst_n) - + ///////////////////////////////////////////////// // Range 2 (0x0200 - 0x02FC) ///////////////////////////////////////////////// @@ -545,7 +548,7 @@ module sde_c2h_cfg #(parameter bit DESC_TYPE = 0, end else if (c2h_ps_cfg_wr_req & dec_range_2) begin ack_wr_range_2 <= 0; - case (c2h_ps_cfg_addr[7:0]) + case (c2h_ps_cfg_addr[7:0]) 8'h00 : begin ack_wr_range_2 <= 1; cfg_dm_ctl_reg0 <= c2h_ps_cfg_wdata; @@ -605,8 +608,8 @@ module sde_c2h_cfg #(parameter bit DESC_TYPE = 0, logic cfg_wb_sts_bresp_err; logic clr_wb_md_bresp_err; logic clr_wb_sts_bresp_err; - - + + assign ack_range_3 = c2h_ps_cfg_wr_req ? ack_wr_range_3 : ack_rd_range_3; // Register Writes @@ -623,7 +626,7 @@ module sde_c2h_cfg #(parameter bit DESC_TYPE = 0, end else if (c2h_ps_cfg_wr_req & dec_range_3) begin ack_wr_range_3 <= 0; - case (c2h_ps_cfg_addr[7:0]) + case (c2h_ps_cfg_addr[7:0]) 8'h00 : begin ack_wr_range_3 <= 1; cfg_wb_ctl_reg0 <= c2h_ps_cfg_wdata; @@ -660,7 +663,7 @@ module sde_c2h_cfg #(parameter bit DESC_TYPE = 0, ack_wr_range_3 <= 1; endcase // case (c2h_ps_cfg_addr[7:0]) end // if (c2h_ps_cfg_wr_req & dec_range_2) - + // Register Reads always @(posedge clk) if (!rst_n) begin @@ -731,7 +734,7 @@ module sde_c2h_cfg #(parameter bit DESC_TYPE = 0, assign clr_wb_sts_bresp_err = cfg_wr_re & dec_range_3 & (c2h_ps_cfg_addr[7:0] == 8'h2C) & c2h_ps_cfg_wdata[0]; assign clr_wb_md_bresp_err = cfg_wr_re & dec_range_3 & (c2h_ps_cfg_addr[7:0] == 8'h2C) & c2h_ps_cfg_wdata[1]; - + assign cfg_wb_desc_cnt_en = cfg_wb_ctl_reg0[0]; assign cfg_wb_pkt_cnt_en = cfg_wb_ctl_reg0[1]; assign cfg_wb_desc_cdt_en = cfg_wb_ctl_reg0[2]; @@ -763,7 +766,7 @@ module sde_c2h_cfg #(parameter bit DESC_TYPE = 0, logic ack_wr_range_4; logic ack_rd_range_4; logic [31:0] cfg_buf_ctl_reg0; - + assign ack_range_4 = c2h_ps_cfg_wr_req ? ack_wr_range_4 : ack_rd_range_4; // Register Writes @@ -774,7 +777,7 @@ module sde_c2h_cfg #(parameter bit DESC_TYPE = 0, end else if (c2h_ps_cfg_wr_req & dec_range_4) begin ack_wr_range_4 <= 0; - case (c2h_ps_cfg_addr[7:0]) + case (c2h_ps_cfg_addr[7:0]) 8'h00 : begin ack_wr_range_4 <= 1; cfg_buf_ctl_reg0 <= c2h_ps_cfg_wdata; @@ -856,7 +859,7 @@ module sde_c2h_cfg #(parameter bit DESC_TYPE = 0, else begin cfg_axis_clr_pkt_cnt <= cfg_wr_re & dec_range_5 & (c2h_ps_cfg_addr[7:0] == 8'h00) & (c2h_ps_cfg_wdata == 32'd0); end - + // Read data and ack always @(posedge clk) if (!rst_n) begin @@ -890,5 +893,5 @@ module sde_c2h_cfg #(parameter bit DESC_TYPE = 0, cfg_wb_dm_error <= cfg_dm_bresp_err | cfg_dm_desc_len_err; cfg_wb_wb_error <= cfg_wb_sts_bresp_err | cfg_wb_md_bresp_err; end - + endmodule // sde_c2h_cfg diff --git a/hdk/cl/examples/cl_sde/design/sde_c2h_data.sv b/hdk/cl/examples/cl_sde/design/sde_c2h_data.sv index 7c61f0d11..4954fd7c5 100644 --- a/hdk/cl/examples/cl_sde/design/sde_c2h_data.sv +++ b/hdk/cl/examples/cl_sde/design/sde_c2h_data.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016-2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + // C2H Data Mover @@ -105,16 +108,16 @@ module sde_c2h_data #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact localparam PCIM_MAX_WR_SIZE_BYTES_USER = PCIM_MAX_WR_SIZE == 0 ? 512 : PCIM_MAX_WR_SIZE == 1 ? 1024 : PCIM_MAX_WR_SIZE == 2 ? 2048 : 4096; - + localparam PCIM_MAX_WR_SIZE_BYTES_DATA_WIDTH = PCIM_DATA_WIDTH_BYTES == 64 ? 4096 : PCIM_DATA_WIDTH_BYTES == 32 ? 4096 : PCIM_DATA_WIDTH_BYTES == 16 ? 4096 : PCIM_DATA_WIDTH_BYTES == 8 ? 2048 : PCIM_DATA_WIDTH_BYTES == 4 ? 1024 : PCIM_DATA_WIDTH_BYTES == 2 ? 512 : 256; - + localparam PCIM_MAX_WR_SIZE_BYTES = PCIM_MAX_WR_SIZE_BYTES_DATA_WIDTH > PCIM_MAX_WR_SIZE_BYTES_USER ? PCIM_MAX_WR_SIZE_BYTES_USER : PCIM_MAX_WR_SIZE_BYTES_DATA_WIDTH; - + // Request FSM typedef enum logic [2:0] {REQ_IDLE = 0, REQ_GET_DESC = 1, @@ -171,7 +174,7 @@ module sde_c2h_data #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact logic dp_wb_ff_full; logic bresp_prealloc_avail; - + logic [BUF_ADDR_WIDTH:0] buf_dm_num_bytes_q; logic buf_dm_aux_valid_q; logic [BUF_AUX_WIDTH-1:0] buf_dm_aux_data_q ; @@ -282,11 +285,11 @@ module sde_c2h_data #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact //Optimize// curr_desc_dest_addr <= curr_desc_dest_addr; curr_desc_dest_addr <= curr_desc_dest_addr_d; // curr_desc_max_minus_dest_addr <= 13'h1000 - curr_desc_dest_addr_d[11:0]; - curr_desc_max_minus_dest_addr <= (PCIM_MAX_WR_SIZE_BYTES == 4096) ? 13'h1000 - curr_desc_dest_addr_d[11:0] : - (PCIM_MAX_WR_SIZE_BYTES == 2048) ? 13'h0800 - curr_desc_dest_addr_d[10:0] : - (PCIM_MAX_WR_SIZE_BYTES == 1024) ? 13'h0400 - curr_desc_dest_addr_d[ 9:0] : + curr_desc_max_minus_dest_addr <= (PCIM_MAX_WR_SIZE_BYTES == 4096) ? 13'h1000 - curr_desc_dest_addr_d[11:0] : + (PCIM_MAX_WR_SIZE_BYTES == 2048) ? 13'h0800 - curr_desc_dest_addr_d[10:0] : + (PCIM_MAX_WR_SIZE_BYTES == 1024) ? 13'h0400 - curr_desc_dest_addr_d[ 9:0] : (PCIM_MAX_WR_SIZE_BYTES == 512) ? 13'h0200 - curr_desc_dest_addr_d[ 8:0] : 13'h0100 - curr_desc_dest_addr_d[ 7:0]; - + // Length and Decrement after every Txn if ((req_state == REQ_IDLE) && desc_dm_desc_valid) curr_desc_len <= desc_dm_desc_in.len; @@ -689,7 +692,7 @@ module sde_c2h_data #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact // Case 1 - For all beats - Save (A - R) Bytes from 3 // Number of Bytes - assign stg4_dp_num_bytes_case1 = pl3_dp_first & pl3_dp_last ? (pl3_dp_num_bytes - curr_txn_num_bytes_fo) : + assign stg4_dp_num_bytes_case1 = pl3_dp_first & pl3_dp_last ? (pl3_dp_num_bytes - curr_txn_num_bytes_fo) : pl3_dp_first ? min_bytes_2(pl3_dp_num_bytes, curr_txn_num_bytes_sav) : pl3_dp_num_bytes - curr_txn_num_bytes_dw_minus_sav; @@ -1164,16 +1167,16 @@ module sde_c2h_data #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact logic bresp_prealloc_avail_cnt_inc; logic bresp_prealloc_avail_cnt_dec; logic [7:0] bresp_prealloc_avail_cnt; - + assign bresp_prealloc_avail_cnt_dec = (req_state == REQ_ADDR) & (req_state_next != REQ_ADDR); assign bresp_prealloc_avail_cnt_inc = dp_bresp_ff_pop; - + always @(posedge clk) if (!rst_n) bresp_prealloc_avail_cnt <= DP_DATA_BRESP_FIFO_DEPTH; else - bresp_prealloc_avail_cnt <= bresp_prealloc_avail_cnt_inc & ~bresp_prealloc_avail_cnt_dec ? bresp_prealloc_avail_cnt + 1 : - ~bresp_prealloc_avail_cnt_inc & bresp_prealloc_avail_cnt_dec ? bresp_prealloc_avail_cnt - 1 : + bresp_prealloc_avail_cnt <= bresp_prealloc_avail_cnt_inc & ~bresp_prealloc_avail_cnt_dec ? bresp_prealloc_avail_cnt + 1 : + ~bresp_prealloc_avail_cnt_inc & bresp_prealloc_avail_cnt_dec ? bresp_prealloc_avail_cnt - 1 : bresp_prealloc_avail_cnt; assign bresp_prealloc_avail = (bresp_prealloc_avail_cnt > 0); @@ -1315,4 +1318,3 @@ module sde_c2h_data #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact endmodule // sde_c2h_data - diff --git a/hdk/cl/examples/cl_sde/design/sde_desc.sv b/hdk/cl/examples/cl_sde/design/sde_desc.sv index 310f9c934..74c749c5e 100644 --- a/hdk/cl/examples/cl_sde/design/sde_desc.sv +++ b/hdk/cl/examples/cl_sde/design/sde_desc.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016-2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,7 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ // Module is common for H2C and C2H @@ -61,7 +63,7 @@ module sde_desc #(parameter bit H2C_N_C2H = 0, // 1 - H2C, 0 - C2H output logic desc_cfg_uflow, output logic desc_cfg_full, output logic desc_cfg_empty, - + // Descriptor to Data Mover output logic desc_dm_empty, input dm_desc_pop, @@ -69,7 +71,7 @@ module sde_desc #(parameter bit H2C_N_C2H = 0, // 1 - H2C, 0 - C2H output logic desc_dm_desc_valid, input dm_desc_cnt_inc, - + // Descriptor to Write Back Block output logic desc_wb_limit_req, output logic [31:0] desc_wb_limit, @@ -82,21 +84,21 @@ module sde_desc #(parameter bit H2C_N_C2H = 0, // 1 - H2C, 0 - C2H output logic [PCIM_ADDR_WIDTH-1:0] desc_pm_araddr, output logic [PCIM_LEN_WIDTH-1:0] desc_pm_arlen, input pm_desc_arready, - + // Read Data from PCIM input pm_desc_rvalid, input [1:0] pm_desc_rresp, input [PCIM_DATA_WIDTH-1:0] pm_desc_rdata, input pm_desc_rlast, output logic desc_pm_rready - + ); localparam DESC_RAM_WIDTH = ~DESC_TYPE & H2C_N_C2H ? $bits(sde_pkg::h2c_reg_sav_desc_t) : DESC_TYPE & H2C_N_C2H ? $bits(sde_pkg::h2c_comp_sav_desc_t) : ~DESC_TYPE & ~H2C_N_C2H ? $bits(sde_pkg::c2h_reg_sav_desc_t) : $bits(sde_pkg::c2h_comp_sav_desc_t); - + logic ps_desc_wr_req_q = 0; logic [DESC_RAM_WIDTH-1:0] ps_desc_wdata_q = 0; logic cfg_desc_ram_wr_req_q = 0; @@ -106,14 +108,14 @@ module sde_desc #(parameter bit H2C_N_C2H = 0, // 1 - H2C, 0 - C2H logic cfg_desc_ram_rd_req_winner_q = 0; logic cfg_desc_ram_wr_req_winner; logic cfg_desc_ram_rd_req_winner; - + logic desc_ram_wr; logic [DESC_RAM_WIDTH-1:0] desc_ram_wdata; logic [DESC_ADDR_WIDTH-1:0] desc_ram_waddr; logic desc_ram_rd; logic [DESC_RAM_WIDTH-1:0] desc_ram_rdata; logic [DESC_ADDR_WIDTH-1:0] desc_ram_raddr; - + logic [DESC_ADDR_WIDTH-1:0] desc_ram_wr_ptr; logic desc_ram_wr_ptr_msb; logic [DESC_ADDR_WIDTH-1:0] desc_ram_rd_ptr; @@ -125,13 +127,13 @@ module sde_desc #(parameter bit H2C_N_C2H = 0, // 1 - H2C, 0 - C2H logic desc_ram_pop; logic desc_ram_empty; logic desc_ram_full; - + logic desc_ram_oflow; logic desc_fifo_uflow; - + logic [DESC_RAM_WIDTH-1:0] desc_dm_desc_ff_out; logic [DESC_WIDTH-1:0] desc_dm_desc_ff_out_from_sav; - + // Pipeline the data into the descriptor RAM always @(posedge clk) if (!rst_n) begin @@ -151,10 +153,10 @@ module sde_desc #(parameter bit H2C_N_C2H = 0, // 1 - H2C, 0 - C2H else ps_desc_wdata_q <= ps_desc_wdata; end - + // PCIS has highest priority for write path assign ps_desc_ack = 1; - + // CSR Path to the Desc RAM always @(posedge clk) if (!rst_n) begin @@ -164,19 +166,19 @@ module sde_desc #(parameter bit H2C_N_C2H = 0, // 1 - H2C, 0 - C2H cfg_desc_ram_wdata_q <= 0; cfg_desc_ram_rd_req_winner_q <= 0; desc_cfg_ram_ack <= 0; - + end else begin - cfg_desc_ram_wr_req_q <= ~cfg_desc_ram_wr_req_q & cfg_desc_ram_wr_req ? 1'b1 : + cfg_desc_ram_wr_req_q <= ~cfg_desc_ram_wr_req_q & cfg_desc_ram_wr_req ? 1'b1 : cfg_desc_ram_wr_req_q & cfg_desc_ram_wr_req_winner ? 1'b0 : cfg_desc_ram_wr_req_q; - - cfg_desc_ram_rd_req_q <= ~cfg_desc_ram_rd_req_q & cfg_desc_ram_rd_req ? 1'b1 : + + cfg_desc_ram_rd_req_q <= ~cfg_desc_ram_rd_req_q & cfg_desc_ram_rd_req ? 1'b1 : cfg_desc_ram_rd_req_q & cfg_desc_ram_rd_req_winner ? 1'b0 : cfg_desc_ram_rd_req_q; cfg_desc_ram_addr_q <= cfg_desc_ram_addr; - + // cfg_desc_ram_wdata_q <= cfg_desc_ram_wdata; if (~DESC_TYPE & H2C_N_C2H) cfg_desc_ram_wdata_q <= h2c_cnv_desc_reg2sav(cfg_desc_ram_wdata); @@ -186,11 +188,11 @@ module sde_desc #(parameter bit H2C_N_C2H = 0, // 1 - H2C, 0 - C2H cfg_desc_ram_wdata_q <= c2h_cnv_desc_reg2sav(cfg_desc_ram_wdata); else if (DESC_TYPE & ~H2C_N_C2H) cfg_desc_ram_wdata_q <= c2h_cnv_desc_comp2sav(cfg_desc_ram_wdata); - else + else cfg_desc_ram_wdata_q <= cfg_desc_ram_wdata; - + cfg_desc_ram_rd_req_winner_q <= cfg_desc_ram_rd_req_winner; - + desc_cfg_ram_ack <= cfg_desc_ram_wr_req_q ? cfg_desc_ram_wr_req_winner : cfg_desc_ram_rd_req_winner_q; @@ -214,15 +216,15 @@ module sde_desc #(parameter bit H2C_N_C2H = 0, // 1 - H2C, 0 - C2H assign desc_ram_wdata = ps_desc_wr_req_q ? ps_desc_wdata_q : cfg_desc_ram_wdata_q; assign cfg_desc_ram_wr_req_winner = cfg_desc_ram_wr_req_q & ~ps_desc_wr_req_q; - + // Arbitrate between cfg read access and pcis reads assign desc_ram_rd = desc_ram_pop || cfg_desc_ram_rd_req_q; - assign desc_ram_raddr = cfg_desc_ram_rd_req_winner ? cfg_desc_ram_addr_q : + assign desc_ram_raddr = cfg_desc_ram_rd_req_winner ? cfg_desc_ram_addr_q : desc_ram_rd_ptr; assign cfg_desc_ram_rd_req_winner = cfg_desc_ram_rd_req_q & ~desc_ram_pop; - + // Desc RAM - Using 2 port RAM (1w1r) - bram_1w1r #(.WIDTH(DESC_RAM_WIDTH), + bram_1w1r #(.WIDTH(DESC_RAM_WIDTH), .ADDR_WIDTH(DESC_ADDR_WIDTH), .DEPTH (DESC_RAM_DEPTH) ) DESC_RAM (.clk (clk), @@ -238,7 +240,7 @@ module sde_desc #(parameter bit H2C_N_C2H = 0, // 1 - H2C, 0 - C2H // FLow-through FIFO logic - need to read 1 desc per clock localparam DESC_RAM_DEPTH_MINUS1 = DESC_RAM_DEPTH - 1; - + ft_fifo #(.FIFO_WIDTH(DESC_RAM_WIDTH) ) DESC_FT_FIFO (.clk (clk), .rst_n (1'b1), @@ -246,7 +248,7 @@ module sde_desc #(parameter bit H2C_N_C2H = 0, // 1 - H2C, 0 - C2H .ram_fifo_empty (desc_ram_empty), .ram_fifo_data (desc_ram_rdata), .ram_pop (desc_ram_pop), - + .ft_pop (dm_desc_pop), .ft_valid (desc_dm_desc_valid), .ft_data (desc_dm_desc_ff_out) @@ -257,19 +259,19 @@ module sde_desc #(parameter bit H2C_N_C2H = 0, // 1 - H2C, 0 - C2H (~DESC_TYPE & ~H2C_N_C2H) ? c2h_cnv_desc_sav2reg(desc_dm_desc_ff_out) : ( DESC_TYPE & ~H2C_N_C2H) ? c2h_cnv_desc_sav2comp(desc_dm_desc_ff_out) : desc_dm_desc_ff_out; - - assign desc_dm_desc = (~DESC_TYPE & H2C_N_C2H) ? sde_pkg::h2c_cnv_desc_reg2comm (desc_dm_desc_ff_out_from_sav) : - ( DESC_TYPE & H2C_N_C2H) ? sde_pkg::h2c_cnv_desc_comp2comm(desc_dm_desc_ff_out_from_sav) : + + assign desc_dm_desc = (~DESC_TYPE & H2C_N_C2H) ? sde_pkg::h2c_cnv_desc_reg2comm (desc_dm_desc_ff_out_from_sav) : + ( DESC_TYPE & H2C_N_C2H) ? sde_pkg::h2c_cnv_desc_comp2comm(desc_dm_desc_ff_out_from_sav) : (~DESC_TYPE & ~H2C_N_C2H) ? sde_pkg::c2h_cnv_desc_reg2comm (desc_dm_desc_ff_out_from_sav) : sde_pkg::c2h_cnv_desc_comp2comm (desc_dm_desc_ff_out_from_sav); - - assign desc_ram_wr_ptr_next = (desc_ram_wr_ptr == DESC_RAM_DEPTH_MINUS1) ? ({DESC_ADDR_WIDTH{1'b0}}) : + + assign desc_ram_wr_ptr_next = (desc_ram_wr_ptr == DESC_RAM_DEPTH_MINUS1) ? ({DESC_ADDR_WIDTH{1'b0}}) : desc_ram_wr_ptr + 1; assign desc_ram_wr_ptr_msb_next = (desc_ram_wr_ptr == DESC_RAM_DEPTH_MINUS1) ? ~desc_ram_wr_ptr_msb : desc_ram_wr_ptr_msb; - + assign desc_ram_rd_ptr_next = (desc_ram_rd_ptr == DESC_RAM_DEPTH_MINUS1) ? ({DESC_ADDR_WIDTH{1'b0}}) : desc_ram_rd_ptr + 1; assign desc_ram_rd_ptr_msb_next = (desc_ram_rd_ptr == DESC_RAM_DEPTH_MINUS1) ? ~desc_ram_rd_ptr_msb : desc_ram_rd_ptr_msb; - + always @(posedge clk) if (!rst_n) begin desc_ram_wr_ptr <= 0; @@ -286,7 +288,7 @@ module sde_desc #(parameter bit H2C_N_C2H = 0, // 1 - H2C, 0 - C2H desc_ram_empty <= ps_desc_wr_req_q && ~desc_ram_pop ? 1'b0 : ~ps_desc_wr_req_q && desc_ram_pop ? ({desc_ram_wr_ptr_msb, desc_ram_wr_ptr} == {desc_ram_rd_ptr_msb_next, desc_ram_rd_ptr_next}) : desc_ram_empty; - desc_ram_full <= ps_desc_wr_req_q && ~desc_ram_pop ? (desc_ram_wr_ptr_msb_next != desc_ram_rd_ptr_msb) && (desc_ram_wr_ptr_next == desc_ram_rd_ptr) : + desc_ram_full <= ps_desc_wr_req_q && ~desc_ram_pop ? (desc_ram_wr_ptr_msb_next != desc_ram_rd_ptr_msb) && (desc_ram_wr_ptr_next == desc_ram_rd_ptr) : ~ps_desc_wr_req_q && desc_ram_pop ? 1'b0 : desc_ram_full; desc_ram_oflow <= desc_ram_full & ps_desc_wr_req_q; desc_fifo_uflow <= ~desc_dm_desc_valid & dm_desc_pop; @@ -295,7 +297,7 @@ module sde_desc #(parameter bit H2C_N_C2H = 0, // 1 - H2C, 0 - C2H assign desc_cfg_uflow = desc_fifo_uflow; assign desc_cfg_empty = ~desc_dm_desc_valid; assign desc_cfg_full = desc_ram_full; - + always_comb begin desc_cfg_wr_ptr = 0; desc_cfg_wr_ptr = desc_ram_wr_ptr; @@ -304,12 +306,12 @@ module sde_desc #(parameter bit H2C_N_C2H = 0, // 1 - H2C, 0 - C2H desc_cfg_rd_ptr = desc_ram_rd_ptr; desc_cfg_rd_ptr[15] = desc_ram_rd_ptr_msb; end - + logic [31:0] cdt_consumed = 0; logic [31:0] cdt_limit = 0; - + // Credit Management - + always @(posedge clk) if (!rst_n) begin cdt_consumed <= 0; @@ -318,18 +320,18 @@ module sde_desc #(parameter bit H2C_N_C2H = 0, // 1 - H2C, 0 - C2H else begin // Consumed // Will be incremented on every write from PCIS - cdt_consumed <= cfg_desc_clr_cdt_consumed ? 0 : + cdt_consumed <= cfg_desc_clr_cdt_consumed ? 0 : ps_desc_wr_req_q ? cdt_consumed + 1 : cdt_consumed; - + // Limit // Will be incremented on every pop of the descriptor from PCIS - cdt_limit <= cfg_desc_clr_cdt_limit ? DESC_RAM_DEPTH : + cdt_limit <= cfg_desc_clr_cdt_limit ? DESC_RAM_DEPTH : dm_desc_pop ? cdt_limit + 1 : cdt_limit; - + end // else: !if(!rst_n) assign desc_cfg_cdt_consumed = cdt_consumed; assign desc_cfg_cdt_limit = cdt_limit; - + logic [31:0] num_compl_desc; // Credit counters always @(posedge clk) @@ -389,13 +391,13 @@ module sde_desc #(parameter bit H2C_N_C2H = 0, // 1 - H2C, 0 - C2H out_desc.dest_addr = in_desc_reg.dest_addr; out_desc.len = in_desc_reg.len; - c2h_cnv_desc_reg2sav = out_desc; + c2h_cnv_desc_reg2sav = out_desc; endfunction // c2h_cnv_desc_reg2sav - + function logic [DESC_WIDTH-1:0] h2c_cnv_desc_sav2reg (input [DESC_RAM_WIDTH-1:0] in_desc); sde_pkg::h2c_reg_desc_t out_desc; sde_pkg::h2c_reg_sav_desc_t in_desc_sav; - + out_desc = '{default:'0}; in_desc_sav = '{default:'0}; @@ -413,7 +415,7 @@ module sde_desc #(parameter bit H2C_N_C2H = 0, // 1 - H2C, 0 - C2H function logic [DESC_WIDTH-1:0] c2h_cnv_desc_sav2reg (input [DESC_RAM_WIDTH-1:0] in_desc); sde_pkg::c2h_reg_desc_t out_desc; sde_pkg::c2h_reg_sav_desc_t in_desc_sav; - + out_desc = '{default:'0}; in_desc_sav = '{default:'0}; @@ -454,13 +456,13 @@ module sde_desc #(parameter bit H2C_N_C2H = 0, // 1 - H2C, 0 - C2H out_desc.dest_addr = in_desc_comp.dest_addr; out_desc.len = in_desc_comp.len; - c2h_cnv_desc_comp2sav = out_desc; + c2h_cnv_desc_comp2sav = out_desc; endfunction // c2h_cnv_desc_comp2sav - + function logic [DESC_WIDTH-1:0] h2c_cnv_desc_sav2comp (input [DESC_RAM_WIDTH-1:0] in_desc); sde_pkg::h2c_comp_desc_t out_desc; sde_pkg::h2c_comp_sav_desc_t in_desc_sav; - + out_desc = '{default:'0}; in_desc_sav = '{default:'0}; @@ -477,7 +479,7 @@ module sde_desc #(parameter bit H2C_N_C2H = 0, // 1 - H2C, 0 - C2H function logic [DESC_WIDTH-1:0] c2h_cnv_desc_sav2comp (input [DESC_RAM_WIDTH-1:0] in_desc); sde_pkg::c2h_comp_desc_t out_desc; sde_pkg::c2h_comp_sav_desc_t in_desc_sav; - + out_desc = '{default:'0}; in_desc_sav = '{default:'0}; @@ -489,17 +491,7 @@ module sde_desc #(parameter bit H2C_N_C2H = 0, // 1 - H2C, 0 - C2H c2h_cnv_desc_sav2comp = out_desc; endfunction // c2h_cnv_desc_sav2comp - - - -endmodule // sde_desc - - - - - - - +endmodule // sde_desc diff --git a/hdk/cl/examples/cl_sde/design/sde_h2c.sv b/hdk/cl/examples/cl_sde/design/sde_h2c.sv index 55af0e3e6..22628b81f 100644 --- a/hdk/cl/examples/cl_sde/design/sde_h2c.sv +++ b/hdk/cl/examples/cl_sde/design/sde_h2c.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016-2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,20 +13,22 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + // H2C Top Level module sde_h2c #(parameter bit H2C_DESC_TYPE = 0, // 0 - Regular, 1 - Compact parameter H2C_DESC_WIDTH = H2C_DESC_TYPE ? 128 : 256, - + parameter H2C_DESC_RAM_DEPTH = 64, - + parameter H2C_PCIM_DM_ARID = 0, // This is the ARID used for write accesses from Data Mover parameter H2C_PCIM_WB_AWID = 1, // This is the AWID used for write accesses from Write Back Block parameter H2C_PCIM_DESC_ARID = 2, // This is the ARID used for read access from the H2C Desc Block parameter PCIM_NUM_OT_RD = 32, // Number of outstanding PCIM reads - + parameter H2C_PCIM_MAX_RD_SIZE = 0, // 0 - 512B, 1 - 1KB, 2 - 2KB, 3 - 4KB parameter PCIM_DATA_WIDTH = 512, @@ -35,7 +38,7 @@ module sde_h2c #(parameter bit H2C_DESC_TYPE = 0, // 0 - Regular, 1 - Compact parameter H2C_AXIS_DATA_WIDTH = 512, parameter H2C_USER_BIT_WIDTH = H2C_DESC_TYPE ? 1 : 64, - + parameter H2C_BUF_DEPTH = 512, parameter H2C_BUF_AUX_DEPTH = 64 @@ -48,7 +51,7 @@ module sde_h2c #(parameter bit H2C_DESC_TYPE = 0, // 0 - Regular, 1 - Compact input h2c_ps_desc_wr_req, input [H2C_DESC_WIDTH-1:0] h2c_ps_desc_wdata, output logic h2c_ps_desc_ack, - + // PCIS to H2C CSR input h2c_ps_cfg_wr_req, input h2c_ps_cfg_rd_req, @@ -81,7 +84,7 @@ module sde_h2c #(parameter bit H2C_DESC_TYPE = 0, // 0 - Regular, 1 - Compact output logic [PCIM_LEN_WIDTH-1:0] h2c_dm_pm_arlen, output logic [PCIM_ID_WIDTH-1:0] h2c_dm_pm_arid, input h2c_pm_dm_arready, - + // Read Data to PCIM input h2c_pm_dm_rvalid, input [1:0] h2c_pm_dm_rresp, @@ -96,7 +99,7 @@ module sde_h2c #(parameter bit H2C_DESC_TYPE = 0, // 0 - Regular, 1 - Compact output logic [PCIM_LEN_WIDTH-1:0] h2c_wb_pm_awlen, output logic [PCIM_ID_WIDTH-1:0] h2c_wb_pm_awid, input h2c_pm_wb_awready, - + // Write Data to PCIM output logic h2c_wb_pm_wvalid, output logic [PCIM_DATA_WIDTH-1:0] h2c_wb_pm_wdata, @@ -123,21 +126,21 @@ module sde_h2c #(parameter bit H2C_DESC_TYPE = 0, // 0 - Regular, 1 - Compact localparam BUF_ADDR_RAM_IDX_WIDTH = $clog2(H2C_BUF_DEPTH); localparam BUF_AUX_RAM_ADDR_WIDTH = $clog2(H2C_BUF_AUX_DEPTH); localparam BUF_ADDR_WIDTH = PCIM_ADDR_BYTE_IDX_WIDTH + BUF_ADDR_RAM_IDX_WIDTH; - + logic desc_dm_empty; logic dm_desc_pop; sde_pkg::comm_desc_t desc_dm_desc; logic desc_dm_desc_valid; logic dm_desc_cnt_inc; - + // Descriptor to Write Back Block logic desc_wb_limit_req; logic [31:0] desc_wb_limit; logic desc_wb_cnt_req; logic [31:0] desc_wb_cnt; - // Data Mover to Buffer + // Data Mover to Buffer // logic [BUF_ADDR_RAM_IDX_WIDTH-1:0] dm_buf_wr_ptr; logic [BUF_ADDR_WIDTH-1:0] dm_buf_wr_byte_addr; logic dm_buf_wr_ptr_msb; @@ -146,7 +149,7 @@ module sde_h2c #(parameter bit H2C_DESC_TYPE = 0, // 0 - Regular, 1 - Compact logic [BUF_AUX_RAM_ADDR_WIDTH-1:0] dm_buf_aux_wr_ptr; logic dm_buf_aux_wr_ptr_msb; logic buf_dm_aux_full; - + logic dm_buf_wr ; logic [PCIM_DATA_WIDTH-1:0] dm_buf_data; logic dm_buf_eop ; @@ -159,10 +162,10 @@ module sde_h2c #(parameter bit H2C_DESC_TYPE = 0, // 0 - Regular, 1 - Compact logic [H2C_USER_BIT_WIDTH-1:0] buf_axis_user; logic buf_axis_last; logic axis_buf_ready; - + logic axis_wb_pkt_cnt_req; logic [31:0] axis_wb_pkt_cnt; - + // Cfg block signals logic cfg_desc_clr_desc_cnt; logic cfg_desc_clr_cdt_limit; @@ -183,17 +186,17 @@ module sde_h2c #(parameter bit H2C_DESC_TYPE = 0, // 0 - Regular, 1 - Compact logic dm_cfg_rresp_err; logic dm_cfg_desc_len_err; - + logic cfg_wb_desc_cdt_en; logic cfg_wb_desc_cnt_en; logic cfg_wb_pkt_cnt_en; logic [47:0] cfg_wb_status_addr; - - logic cfg_wb_desc_error; - logic cfg_wb_dm_error ; + + logic cfg_wb_desc_error; + logic cfg_wb_dm_error ; logic cfg_wb_wb_error ; logic [31:0] wb_cfg_status_dw ; - + logic cfg_desc_cdt_wc_en; logic cfg_desc_cnt_wc_en; logic cfg_pkt_cnt_wc_en; @@ -203,7 +206,7 @@ module sde_h2c #(parameter bit H2C_DESC_TYPE = 0, // 0 - Regular, 1 - Compact logic cfg_axis_clr_pkt_cnt; logic [31:0] axis_cfg_pkt_cnt; - + logic desc_cfg_oflow; logic desc_cfg_uflow; logic desc_cfg_full ; @@ -219,10 +222,10 @@ module sde_h2c #(parameter bit H2C_DESC_TYPE = 0, // 0 - Regular, 1 - Compact logic [15:0] buf_cfg_buf_rd_ptr; logic buf_cfg_aux_fifo_oflow; logic buf_cfg_aux_fifo_uflow; - logic buf_cfg_aux_fifo_full ; + logic buf_cfg_aux_fifo_full ; logic buf_cfg_aux_fifo_empty; logic [15:0] buf_cfg_aux_ram_wr_ptr; - logic [15:0] buf_cfg_aux_ram_rd_ptr; + logic [15:0] buf_cfg_aux_ram_rd_ptr; logic [15:0] buf_cfg_dm_wr_ptr; logic [15:0] buf_cfg_dm_aux_wr_ptr; logic [15:0] buf_cfg_num_free_slots; @@ -234,11 +237,11 @@ module sde_h2c #(parameter bit H2C_DESC_TYPE = 0, // 0 - Regular, 1 - Compact // Generate local copy of Reset logic sync_rst_n; always @(posedge clk) - if (!rst_n) + if (!rst_n) sync_rst_n <= 0; else sync_rst_n <= rst_n; - + // H2C CSR Block sde_h2c_cfg #( .DESC_TYPE (H2C_DESC_TYPE), @@ -248,7 +251,7 @@ module sde_h2c #(parameter bit H2C_DESC_TYPE = 0, // 0 - Regular, 1 - Compact SDE_H2C_CFG (.clk (clk), .rst_n (sync_rst_n), - + .h2c_ps_cfg_wr_req (h2c_ps_cfg_wr_req), .h2c_ps_cfg_rd_req (h2c_ps_cfg_rd_req), .h2c_ps_cfg_addr (h2c_ps_cfg_addr ), @@ -262,20 +265,20 @@ module sde_h2c #(parameter bit H2C_DESC_TYPE = 0, // 0 - Regular, 1 - Compact .cfg_desc_clr_desc_cnt (cfg_desc_clr_desc_cnt ), .cfg_desc_clr_cdt_limit (cfg_desc_clr_cdt_limit ), .cfg_desc_clr_cdt_consumed (cfg_desc_clr_cdt_consumed), - + .desc_cfg_cdt_consumed (desc_cfg_cdt_consumed), .desc_cfg_cdt_limit (desc_cfg_cdt_limit ), .desc_cfg_desc_cnt (desc_cfg_desc_cnt ), .desc_cfg_wr_ptr (desc_cfg_wr_ptr ), .desc_cfg_rd_ptr (desc_cfg_rd_ptr ), - + .cfg_desc_ram_wr_req (cfg_desc_ram_wr_req), .cfg_desc_ram_rd_req (cfg_desc_ram_rd_req), .cfg_desc_ram_addr (cfg_desc_ram_addr ), .cfg_desc_ram_wdata (cfg_desc_ram_wdata ), .desc_cfg_ram_ack (desc_cfg_ram_ack ), .desc_cfg_ram_rdata (desc_cfg_ram_rdata ), - + .desc_cfg_oflow (desc_cfg_oflow), .desc_cfg_uflow (desc_cfg_uflow), .desc_cfg_full (desc_cfg_full ), @@ -283,12 +286,12 @@ module sde_h2c #(parameter bit H2C_DESC_TYPE = 0, // 0 - Regular, 1 - Compact .dm_cfg_rresp_err (dm_cfg_rresp_err), .dm_cfg_desc_len_err (dm_cfg_desc_len_err), - + .cfg_wb_desc_cdt_en (cfg_wb_desc_cdt_en ), .cfg_wb_desc_cnt_en (cfg_wb_desc_cnt_en ), .cfg_wb_pkt_cnt_en (cfg_wb_pkt_cnt_en ), .cfg_wb_status_addr (cfg_wb_status_addr ), - + .cfg_desc_cdt_wc_en (cfg_desc_cdt_wc_en ), .cfg_desc_cnt_wc_en (cfg_desc_cnt_wc_en ), .cfg_pkt_cnt_wc_en (cfg_pkt_cnt_wc_en ), @@ -296,10 +299,10 @@ module sde_h2c #(parameter bit H2C_DESC_TYPE = 0, // 0 - Regular, 1 - Compact .cfg_wc_to_cnt (cfg_wc_to_cnt ), .cfg_wc_cnt_minus1 (cfg_wc_cnt_minus1 ), - .wb_cfg_sts_bresp_err (wb_cfg_sts_bresp_err), + .wb_cfg_sts_bresp_err (wb_cfg_sts_bresp_err), - .cfg_wb_desc_error (cfg_wb_desc_error), - .cfg_wb_dm_error (cfg_wb_dm_error ), + .cfg_wb_desc_error (cfg_wb_desc_error), + .cfg_wb_dm_error (cfg_wb_dm_error ), .cfg_wb_wb_error (cfg_wb_wb_error ), .wb_cfg_status_dw (wb_cfg_status_dw ), @@ -311,10 +314,10 @@ module sde_h2c #(parameter bit H2C_DESC_TYPE = 0, // 0 - Regular, 1 - Compact .buf_cfg_buf_rd_ptr (buf_cfg_buf_rd_ptr ), .buf_cfg_aux_fifo_oflow (buf_cfg_aux_fifo_oflow ), .buf_cfg_aux_fifo_uflow (buf_cfg_aux_fifo_uflow ), - .buf_cfg_aux_fifo_full (buf_cfg_aux_fifo_full ), + .buf_cfg_aux_fifo_full (buf_cfg_aux_fifo_full ), .buf_cfg_aux_fifo_empty (buf_cfg_aux_fifo_empty ), .buf_cfg_aux_ram_wr_ptr (buf_cfg_aux_ram_wr_ptr ), - .buf_cfg_aux_ram_rd_ptr (buf_cfg_aux_ram_rd_ptr ), + .buf_cfg_aux_ram_rd_ptr (buf_cfg_aux_ram_rd_ptr ), .buf_cfg_dm_wr_ptr (buf_cfg_dm_wr_ptr ), .buf_cfg_dm_aux_wr_ptr (buf_cfg_dm_aux_wr_ptr ), .buf_cfg_num_free_slots (buf_cfg_num_free_slots ), @@ -327,41 +330,41 @@ module sde_h2c #(parameter bit H2C_DESC_TYPE = 0, // 0 - Regular, 1 - Compact .axis_cfg_pkt_cnt (axis_cfg_pkt_cnt ) ); - - + + // H2C Descriptor - sde_desc + sde_desc #(.H2C_N_C2H (1), - + .DESC_TYPE (H2C_DESC_TYPE), .DESC_RAM_DEPTH (H2C_DESC_RAM_DEPTH), - + .PCIM_DATA_WIDTH (PCIM_DATA_WIDTH ), .PCIM_ID_WIDTH (PCIM_ID_WIDTH ), .PCIM_LEN_WIDTH (PCIM_LEN_WIDTH ), .PCIM_ADDR_WIDTH (PCIM_ADDR_WIDTH ), .PCIM_DESC_ARID (H2C_PCIM_DESC_ARID) - ) - SDE_H2C_DESC + ) + SDE_H2C_DESC (.clk (clk), .rst_n (sync_rst_n), - + .ps_desc_wr_req (h2c_ps_desc_wr_req), .ps_desc_wdata (h2c_ps_desc_wdata), .ps_desc_ack (h2c_ps_desc_ack), - + .cfg_desc_ram_wr_req (cfg_desc_ram_wr_req), .cfg_desc_ram_rd_req (cfg_desc_ram_rd_req), .cfg_desc_ram_addr (cfg_desc_ram_addr ), .cfg_desc_ram_wdata (cfg_desc_ram_wdata ), .desc_cfg_ram_ack (desc_cfg_ram_ack ), .desc_cfg_ram_rdata (desc_cfg_ram_rdata ), - + .cfg_desc_clr_desc_cnt (cfg_desc_clr_desc_cnt ), .cfg_desc_clr_cdt_limit (cfg_desc_clr_cdt_limit ), .cfg_desc_clr_cdt_consumed (cfg_desc_clr_cdt_consumed), - + .desc_cfg_cdt_consumed (desc_cfg_cdt_consumed), .desc_cfg_cdt_limit (desc_cfg_cdt_limit ), .desc_cfg_desc_cnt (desc_cfg_desc_cnt ), @@ -379,8 +382,8 @@ module sde_h2c #(parameter bit H2C_DESC_TYPE = 0, // 0 - Regular, 1 - Compact .desc_dm_desc_valid (desc_dm_desc_valid), .dm_desc_cnt_inc (dm_desc_cnt_inc), - - .desc_wb_limit_req (desc_wb_limit_req), + + .desc_wb_limit_req (desc_wb_limit_req), .desc_wb_limit (desc_wb_limit), .desc_wb_cnt_req (desc_wb_cnt_req), .desc_wb_cnt (desc_wb_cnt), @@ -389,7 +392,7 @@ module sde_h2c #(parameter bit H2C_DESC_TYPE = 0, // 0 - Regular, 1 - Compact .desc_pm_araddr (h2c_desc_pm_araddr ), .desc_pm_arlen (h2c_desc_pm_arlen ), .pm_desc_arready (h2c_pm_desc_arready), - + .pm_desc_rvalid (h2c_pm_desc_rvalid), .pm_desc_rresp (h2c_pm_desc_rresp ), .pm_desc_rdata (h2c_pm_desc_rdata ), @@ -397,41 +400,41 @@ module sde_h2c #(parameter bit H2C_DESC_TYPE = 0, // 0 - Regular, 1 - Compact .desc_pm_rready (h2c_desc_pm_rready) ); - + // H2C Data Mover - sde_h2c_data + sde_h2c_data #(.DESC_TYPE (H2C_DESC_TYPE), .PCIM_NUM_OT_RD (PCIM_NUM_OT_RD), .PCIM_DM_ARID (H2C_PCIM_DM_ARID), .PCIM_MAX_RD_SIZE (H2C_PCIM_MAX_RD_SIZE), - + .PCIM_DATA_WIDTH (PCIM_DATA_WIDTH ), .PCIM_ID_WIDTH (PCIM_ID_WIDTH ), .PCIM_LEN_WIDTH (PCIM_LEN_WIDTH ), .PCIM_ADDR_WIDTH (PCIM_ADDR_WIDTH ), - + .BUF_DEPTH (H2C_BUF_DEPTH), .BUF_AUX_DEPTH (H2C_BUF_AUX_DEPTH), .USER_BIT_WIDTH (H2C_USER_BIT_WIDTH) ) - SDE_H2C_DATA + SDE_H2C_DATA (.clk (clk), .rst_n (sync_rst_n), - // TODO - CSRs + // TODO - CSRs .dm_cfg_rresp_err (dm_cfg_rresp_err), .dm_cfg_desc_len_err (dm_cfg_desc_len_err), - + .desc_dm_empty (desc_dm_empty), .dm_desc_pop (dm_desc_pop), .desc_dm_desc (desc_dm_desc), .desc_dm_desc_valid (desc_dm_desc_valid), .dm_desc_cnt_inc (dm_desc_cnt_inc), - + .dm_pm_arvalid (h2c_dm_pm_arvalid), .dm_pm_araddr (h2c_dm_pm_araddr ), .dm_pm_arlen (h2c_dm_pm_arlen ), @@ -442,16 +445,16 @@ module sde_h2c #(parameter bit H2C_DESC_TYPE = 0, // 0 - Regular, 1 - Compact .pm_dm_rdata (h2c_pm_dm_rdata ), .pm_dm_rlast (h2c_pm_dm_rlast ), .dm_pm_rready (h2c_dm_pm_rready), - + // .dm_buf_wr_ptr (dm_buf_wr_ptr), .dm_buf_wr_byte_addr (dm_buf_wr_byte_addr), .dm_buf_wr_ptr_msb (dm_buf_wr_ptr_msb), .buf_dm_num_bytes (buf_dm_num_bytes), - + .dm_buf_aux_wr_ptr (dm_buf_aux_wr_ptr), .dm_buf_aux_wr_ptr_msb (dm_buf_aux_wr_ptr_msb), .buf_dm_aux_full (buf_dm_aux_full), - + .dm_buf_wr (dm_buf_wr ), .dm_buf_data (dm_buf_data), .dm_buf_eop (dm_buf_eop ), @@ -467,7 +470,7 @@ module sde_h2c #(parameter bit H2C_DESC_TYPE = 0, // 0 - Regular, 1 - Compact .DESC_RAM_DEPTH (H2C_DESC_RAM_DEPTH), .PCIM_WB_AWID (H2C_PCIM_WB_AWID), - + .PCIM_DATA_WIDTH (PCIM_DATA_WIDTH ), .PCIM_ID_WIDTH (PCIM_ID_WIDTH ), .PCIM_LEN_WIDTH (PCIM_LEN_WIDTH ), @@ -482,11 +485,11 @@ module sde_h2c #(parameter bit H2C_DESC_TYPE = 0, // 0 - Regular, 1 - Compact .cfg_wb_pkt_cnt_en (cfg_wb_pkt_cnt_en), .cfg_wb_md_ptr_en (1'b0), .cfg_wb_status_addr (cfg_wb_status_addr), - + .cfg_desc_clr_desc_cnt (cfg_desc_clr_desc_cnt ), .cfg_desc_clr_cdt_limit (cfg_desc_clr_cdt_limit), .cfg_axis_clr_pkt_cnt (cfg_axis_clr_pkt_cnt), - + .cfg_desc_cdt_wc_en (cfg_desc_cdt_wc_en ), .cfg_desc_cnt_wc_en (cfg_desc_cnt_wc_en ), .cfg_pkt_cnt_wc_en (cfg_pkt_cnt_wc_en ), @@ -494,16 +497,16 @@ module sde_h2c #(parameter bit H2C_DESC_TYPE = 0, // 0 - Regular, 1 - Compact .cfg_wc_tick_cnt (cfg_wc_tick_cnt ), .cfg_wc_to_cnt (cfg_wc_to_cnt ), .cfg_wc_cnt_minus1 (cfg_wc_cnt_minus1 ), - + .wb_cfg_md_bresp_err (), - .wb_cfg_sts_bresp_err (wb_cfg_sts_bresp_err), + .wb_cfg_sts_bresp_err (wb_cfg_sts_bresp_err), - .cfg_wb_desc_error (cfg_wb_desc_error), - .cfg_wb_dm_error (cfg_wb_dm_error ), + .cfg_wb_desc_error (cfg_wb_desc_error), + .cfg_wb_dm_error (cfg_wb_dm_error ), .cfg_wb_wb_error (cfg_wb_wb_error ), .wb_cfg_status_dw (wb_cfg_status_dw ), - .desc_wb_limit_req (desc_wb_limit_req), + .desc_wb_limit_req (desc_wb_limit_req), .desc_wb_limit (desc_wb_limit), .desc_wb_cnt_req (desc_wb_cnt_req), @@ -515,7 +518,7 @@ module sde_h2c #(parameter bit H2C_DESC_TYPE = 0, // 0 - Regular, 1 - Compact .axis_wb_pkt_cnt_req (axis_wb_pkt_cnt_req), .axis_wb_pkt_cnt (axis_wb_pkt_cnt), - + .wb_pm_awvalid (h2c_wb_pm_awvalid), .wb_pm_awaddr (h2c_wb_pm_awaddr ), .wb_pm_awlen (h2c_wb_pm_awlen ), @@ -531,16 +534,16 @@ module sde_h2c #(parameter bit H2C_DESC_TYPE = 0, // 0 - Regular, 1 - Compact .wb_pm_bready (h2c_wb_pm_bready ) ); - + // H2C Buffer sde_h2c_buf #(.DESC_TYPE (H2C_DESC_TYPE), .PCIM_DATA_WIDTH (PCIM_DATA_WIDTH ), - + .BUF_DEPTH (H2C_BUF_DEPTH), .BUF_AUX_DEPTH (H2C_BUF_AUX_DEPTH), - + .USER_BIT_WIDTH (H2C_USER_BIT_WIDTH) ) @@ -556,10 +559,10 @@ module sde_h2c #(parameter bit H2C_DESC_TYPE = 0, // 0 - Regular, 1 - Compact .buf_cfg_buf_rd_ptr (buf_cfg_buf_rd_ptr ), .buf_cfg_aux_fifo_oflow (buf_cfg_aux_fifo_oflow ), .buf_cfg_aux_fifo_uflow (buf_cfg_aux_fifo_uflow ), - .buf_cfg_aux_fifo_full (buf_cfg_aux_fifo_full ), + .buf_cfg_aux_fifo_full (buf_cfg_aux_fifo_full ), .buf_cfg_aux_fifo_empty (buf_cfg_aux_fifo_empty ), .buf_cfg_aux_ram_wr_ptr (buf_cfg_aux_ram_wr_ptr ), - .buf_cfg_aux_ram_rd_ptr (buf_cfg_aux_ram_rd_ptr ), + .buf_cfg_aux_ram_rd_ptr (buf_cfg_aux_ram_rd_ptr ), .buf_cfg_dm_wr_ptr (buf_cfg_dm_wr_ptr ), .buf_cfg_dm_aux_wr_ptr (buf_cfg_dm_aux_wr_ptr ), .buf_cfg_num_free_slots (buf_cfg_num_free_slots ), @@ -567,12 +570,12 @@ module sde_h2c #(parameter bit H2C_DESC_TYPE = 0, // 0 - Regular, 1 - Compact .buf_cfg_out_pkt_cnt (buf_cfg_out_pkt_cnt ), .cfg_buf_clr_in_pkt_cnt (cfg_buf_clr_in_pkt_cnt ), .cfg_buf_clr_out_pkt_cnt (cfg_buf_clr_out_pkt_cnt), - - .buf_axis_valid (buf_axis_valid ), - .buf_axis_data (buf_axis_data ), - .buf_axis_keep (buf_axis_keep ), - .buf_axis_user (buf_axis_user ), - .buf_axis_last (buf_axis_last ), + + .buf_axis_valid (buf_axis_valid ), + .buf_axis_data (buf_axis_data ), + .buf_axis_keep (buf_axis_keep ), + .buf_axis_user (buf_axis_user ), + .buf_axis_last (buf_axis_last ), .axis_buf_ready (axis_buf_ready ), // .dm_buf_wr_ptr (dm_buf_wr_ptr), @@ -591,8 +594,8 @@ module sde_h2c #(parameter bit H2C_DESC_TYPE = 0, // 0 - Regular, 1 - Compact .dm_buf_num_bytes_minus1 (dm_buf_num_bytes_minus1) ); - - + + // H2C AXI-Stream Interface sde_h2c_axis #(.DESC_TYPE (H2C_DESC_TYPE), @@ -609,19 +612,19 @@ module sde_h2c #(parameter bit H2C_DESC_TYPE = 0, // 0 - Regular, 1 - Compact // TODO - CSRs .cfg_axis_clr_pkt_cnt (cfg_axis_clr_pkt_cnt), .axis_cfg_pkt_cnt (axis_cfg_pkt_cnt), - + .h2c_axis_valid (h2c_axis_valid ), - .h2c_axis_data (h2c_axis_data ), - .h2c_axis_keep (h2c_axis_keep ), - .h2c_axis_user (h2c_axis_user ), - .h2c_axis_last (h2c_axis_last ), + .h2c_axis_data (h2c_axis_data ), + .h2c_axis_keep (h2c_axis_keep ), + .h2c_axis_user (h2c_axis_user ), + .h2c_axis_last (h2c_axis_last ), .h2c_axis_ready (h2c_axis_ready ), - - .buf_axis_valid (buf_axis_valid ), - .buf_axis_data (buf_axis_data ), - .buf_axis_keep (buf_axis_keep ), - .buf_axis_user (buf_axis_user ), - .buf_axis_last (buf_axis_last ), + + .buf_axis_valid (buf_axis_valid ), + .buf_axis_data (buf_axis_data ), + .buf_axis_keep (buf_axis_keep ), + .buf_axis_user (buf_axis_user ), + .buf_axis_last (buf_axis_last ), .axis_buf_ready (axis_buf_ready ), .axis_wb_pkt_cnt_req (axis_wb_pkt_cnt_req), diff --git a/hdk/cl/examples/cl_sde/design/sde_h2c_axis.sv b/hdk/cl/examples/cl_sde/design/sde_h2c_axis.sv index dadf0eb54..80d0d0786 100644 --- a/hdk/cl/examples/cl_sde/design/sde_h2c_axis.sv +++ b/hdk/cl/examples/cl_sde/design/sde_h2c_axis.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016-2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,7 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ // H2C AXI-Stream Interface @@ -20,7 +22,7 @@ module sde_h2c_axis #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact parameter PCIM_DATA_WIDTH = 512, parameter AXIS_DATA_WIDTH = 512, - + parameter USER_BIT_WIDTH = DESC_TYPE ? 1 : 64 ) @@ -38,7 +40,7 @@ module sde_h2c_axis #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact output logic [USER_BIT_WIDTH-1:0] h2c_axis_user, output logic h2c_axis_last, input h2c_axis_ready, - + // AXI-S Interface to Buf input buf_axis_valid, input [PCIM_DATA_WIDTH-1:0] buf_axis_data, @@ -50,10 +52,10 @@ module sde_h2c_axis #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact // AXI-S Interface to Write Back block for packet Count Update output logic axis_wb_pkt_cnt_req, output logic [31:0] axis_wb_pkt_cnt - - + + ); - + // Do any width conversoin necessary @@ -75,14 +77,12 @@ module sde_h2c_axis #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact end else begin axis_wb_pkt_cnt_req <= h2c_axis_valid & h2c_axis_ready & h2c_axis_last; - axis_pkt_cnt <= cfg_axis_clr_pkt_cnt ? 0 : + axis_pkt_cnt <= cfg_axis_clr_pkt_cnt ? 0 : h2c_axis_valid & h2c_axis_ready & h2c_axis_last ? axis_pkt_cnt + 1 : axis_pkt_cnt; end - + assign axis_wb_pkt_cnt = axis_pkt_cnt; assign axis_cfg_pkt_cnt = axis_pkt_cnt; endmodule // sde_h2c_axis - - diff --git a/hdk/cl/examples/cl_sde/design/sde_h2c_buf.sv b/hdk/cl/examples/cl_sde/design/sde_h2c_buf.sv index 6abe90a64..df728c2c4 100644 --- a/hdk/cl/examples/cl_sde/design/sde_h2c_buf.sv +++ b/hdk/cl/examples/cl_sde/design/sde_h2c_buf.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016-2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,11 +13,13 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + // H2C Buffer module sde_h2c_buf #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact - + parameter PCIM_DATA_WIDTH = 512, parameter PCIM_ADDR_BYTE_IDX_WIDTH = $clog2(PCIM_DATA_WIDTH>>3), @@ -28,7 +31,7 @@ module sde_h2c_buf #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact parameter BUF_AUX_RAM_ADDR_WIDTH = $clog2(BUF_AUX_DEPTH), parameter USER_BIT_WIDTH = DESC_TYPE ? 1 : 64, - + // These are internal FIFOs - Dont change unless absolutely required parameter OP_OUTPUT_FIFO_DEPTH = 3 @@ -47,10 +50,10 @@ module sde_h2c_buf #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact output logic [15:0] buf_cfg_buf_rd_ptr, output logic buf_cfg_aux_fifo_oflow, output logic buf_cfg_aux_fifo_uflow, - output logic buf_cfg_aux_fifo_full , + output logic buf_cfg_aux_fifo_full , output logic buf_cfg_aux_fifo_empty, output logic [15:0] buf_cfg_aux_ram_wr_ptr, - output logic [15:0] buf_cfg_aux_ram_rd_ptr, + output logic [15:0] buf_cfg_aux_ram_rd_ptr, output logic [15:0] buf_cfg_dm_wr_ptr, output logic [15:0] buf_cfg_dm_aux_wr_ptr, output logic [15:0] buf_cfg_num_free_slots, @@ -58,7 +61,7 @@ module sde_h2c_buf #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact output logic [31:0] buf_cfg_out_pkt_cnt, input cfg_buf_clr_in_pkt_cnt, input cfg_buf_clr_out_pkt_cnt, - + // AXI-S Interface to Buf output logic buf_axis_valid, output logic [PCIM_DATA_WIDTH-1:0] buf_axis_data, @@ -66,8 +69,8 @@ module sde_h2c_buf #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact output logic [USER_BIT_WIDTH-1:0] buf_axis_user, output logic buf_axis_last, input axis_buf_ready, - - + + // Buf to Data Mover // input logic [BUF_ADDR_RAM_IDX_WIDTH-1:0] dm_buf_wr_ptr, input logic [BUF_ADDR_WIDTH-1:0] dm_buf_wr_byte_addr, @@ -91,7 +94,7 @@ module sde_h2c_buf #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact localparam BUF_SIZE_BYTES = BUF_DEPTH * (PCIM_DATA_WIDTH>>3); localparam BUF_DEPTH_MINUS1 = BUF_DEPTH - 1; localparam BUF_RAM_ADDR_WIDTH = BUF_ADDR_RAM_IDX_WIDTH; - + logic buf_wr_en; logic buf_rd_en; logic [BUF_ADDR_RAM_IDX_WIDTH-1:0] buf_wr_ptr; @@ -106,18 +109,18 @@ module sde_h2c_buf #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact logic buf_full; logic buf_uflow; logic buf_oflow; - + assign buf_wr_en = dm_buf_wr; - + // Manage read and write addresses - assign buf_wr_ptr_next = (buf_wr_ptr == BUF_DEPTH_MINUS1) ? ({BUF_ADDR_RAM_IDX_WIDTH{1'b0}}) : + assign buf_wr_ptr_next = (buf_wr_ptr == BUF_DEPTH_MINUS1) ? ({BUF_ADDR_RAM_IDX_WIDTH{1'b0}}) : buf_wr_ptr + 1; assign buf_wr_ptr_msb_next = (buf_wr_ptr == BUF_DEPTH_MINUS1) ? ~buf_wr_ptr_msb : buf_wr_ptr_msb; - - assign buf_rd_ptr_next = (buf_rd_ptr == BUF_DEPTH_MINUS1) ? ({BUF_ADDR_RAM_IDX_WIDTH{1'b0}}) : + + assign buf_rd_ptr_next = (buf_rd_ptr == BUF_DEPTH_MINUS1) ? ({BUF_ADDR_RAM_IDX_WIDTH{1'b0}}) : buf_rd_ptr + 1; assign buf_rd_ptr_msb_next = (buf_rd_ptr == BUF_DEPTH_MINUS1) ? ~buf_rd_ptr_msb : buf_rd_ptr_msb; - + always @(posedge clk) if (!rst_n) begin buf_wr_ptr <= 0; @@ -160,7 +163,7 @@ module sde_h2c_buf #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact logic buf_ram_rd; logic [BUF_ADDR_RAM_IDX_WIDTH-1:0] buf_ram_raddr; logic [PCIM_DATA_WIDTH-1:0] buf_ram_rdata; - + // Buffer BRAM assign buf_ram_wr = buf_wr_en; assign buf_ram_waddr = buf_wr_ptr; @@ -168,9 +171,9 @@ module sde_h2c_buf #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact assign buf_ram_rd = buf_rd_en; assign buf_ram_raddr = buf_rd_ptr; - + // Desc RAM - Using 2 port RAM (1w1r) - bram_1w1r #(.WIDTH(PCIM_DATA_WIDTH), + bram_1w1r #(.WIDTH(PCIM_DATA_WIDTH), .ADDR_WIDTH(BUF_RAM_ADDR_WIDTH), .DEPTH(BUF_DEPTH) ) BUF_RAM (.clk (clk), @@ -201,7 +204,7 @@ module sde_h2c_buf #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact logic aux_ram_pop; logic aux_ram_oflow; logic aux_fifo_uflow; - + logic aux_ft_ff_pop; logic aux_ft_ff_valid; logic [BUF_AUX_RAM_WIDTH-1:0] aux_ft_ff_data; @@ -217,18 +220,18 @@ module sde_h2c_buf #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact logic [BUF_ADDR_RAM_IDX_WIDTH-1:0] aux_out_eop_wr_ptr; logic [PCIM_ADDR_BYTE_IDX_WIDTH-1:0] aux_out_num_bytes_minus1; logic aux_out_valid; - + logic op_stall; - - // AUX FT FIFO + + // AUX FT FIFO assign aux_ram_wr = buf_wr_en & dm_buf_eop; assign aux_ram_waddr = aux_ram_wr_ptr; - assign aux_ram_wdata = DESC_TYPE ? {buf_wr_ptr, dm_buf_num_bytes_minus1} : + assign aux_ram_wdata = DESC_TYPE ? {buf_wr_ptr, dm_buf_num_bytes_minus1} : {dm_buf_user, buf_wr_ptr, dm_buf_num_bytes_minus1}; assign aux_ram_rd = aux_ram_pop; assign aux_ram_raddr = aux_ram_rd_ptr; - + // AUX RAM bram_1w1r #(.WIDTH(BUF_AUX_RAM_WIDTH), .ADDR_WIDTH(BUF_AUX_RAM_ADDR_WIDTH), @@ -238,13 +241,13 @@ module sde_h2c_buf #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact .ena (aux_ram_wr), .addra (aux_ram_waddr), .da (aux_ram_wdata), - + .enb (aux_ram_rd), .addrb (aux_ram_raddr), .qb (aux_ram_rdata) ); - // Flow-through FIFO + // Flow-through FIFO ft_fifo #(.FIFO_WIDTH(BUF_AUX_RAM_WIDTH) ) AUX_FT_FIFO (.clk (clk), .rst_n (1'b1), @@ -252,7 +255,7 @@ module sde_h2c_buf #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact .ram_fifo_empty (aux_ram_empty), .ram_fifo_data (aux_ram_rdata), .ram_pop (aux_ram_pop), - + .ft_pop (aux_ft_ff_pop), .ft_valid (aux_ft_ff_valid), .ft_data (aux_ft_ff_data) @@ -261,11 +264,11 @@ module sde_h2c_buf #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact assign aux_ram_wr_ptr_next = (aux_ram_wr_ptr == BUF_AUX_RAM_DEPTH_MINUS1) ? ({BUF_AUX_RAM_ADDR_WIDTH{1'b0}}) : aux_ram_wr_ptr + 1; assign aux_ram_wr_ptr_msb_next = (aux_ram_wr_ptr == BUF_AUX_RAM_DEPTH_MINUS1) ? ~aux_ram_wr_ptr_msb : aux_ram_wr_ptr_msb; - + assign aux_ram_rd_ptr_next = (aux_ram_rd_ptr == BUF_AUX_RAM_DEPTH_MINUS1) ? ({BUF_AUX_RAM_ADDR_WIDTH{1'b0}}) : aux_ram_rd_ptr + 1; assign aux_ram_rd_ptr_msb_next = (aux_ram_rd_ptr == BUF_AUX_RAM_DEPTH_MINUS1) ? ~aux_ram_rd_ptr_msb : aux_ram_rd_ptr_msb; - + always @(posedge clk) if (!rst_n) begin aux_ram_wr_ptr <= 0; @@ -286,7 +289,7 @@ module sde_h2c_buf #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact aux_ram_full <= ~aux_ram_wr && aux_ram_pop ? 1'b0 : aux_ram_wr && ~aux_ram_pop ? (aux_ram_wr_ptr_msb_next != aux_ram_rd_ptr_msb) && (aux_ram_wr_ptr_next == aux_ram_rd_ptr) : aux_ram_full; - + aux_ram_oflow <= aux_ram_full & aux_ram_wr; aux_fifo_uflow <= ~aux_ft_ff_valid & aux_ft_ff_pop; end // else: !if(!rst_n) @@ -300,7 +303,7 @@ module sde_h2c_buf #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact buf_cfg_aux_ram_wr_ptr = 0; buf_cfg_aux_ram_wr_ptr = aux_ram_wr_ptr; buf_cfg_aux_ram_wr_ptr[15] = aux_ram_wr_ptr_msb; - + buf_cfg_aux_ram_rd_ptr = 0; buf_cfg_aux_ram_rd_ptr = aux_ram_rd_ptr; buf_cfg_aux_ram_rd_ptr[15] = aux_ram_rd_ptr_msb; @@ -310,7 +313,7 @@ module sde_h2c_buf #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact aux_out_eop_wr_ptr, aux_out_num_bytes_minus1} = aux_ft_ff_data; assign aux_out_valid = aux_ft_ff_valid; - + // Output Pipeline // Stage 0 // Read data from Buffer when buffer is not empty and no output stall @@ -320,7 +323,7 @@ module sde_h2c_buf #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact logic [BUF_ADDR_RAM_IDX_WIDTH-1:0] stg0_op_buf_rd_addr; logic pl0_op_valid; logic [BUF_ADDR_RAM_IDX_WIDTH-1:0] pl0_op_buf_rd_addr; - + assign stg0_op_valid = buf_rd_en; assign stg0_op_buf_rd_addr = buf_rd_ptr; @@ -348,7 +351,7 @@ module sde_h2c_buf #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact logic pl1_op_ovf; logic [PCIM_DATA_WIDTH-1:0] pl1_op_ovf_data; logic [BUF_ADDR_RAM_IDX_WIDTH-1:0] pl1_op_ovf_buf_rd_addr; - + assign stg1_op_valid = pl0_op_valid || pl1_op_ovf; assign stg1_op_data = pl1_op_ovf ? pl1_op_ovf_data : buf_ram_rdata; assign stg1_op_buf_rd_addr = pl1_op_ovf ? pl1_op_ovf_buf_rd_addr : pl0_op_buf_rd_addr; @@ -357,7 +360,7 @@ module sde_h2c_buf #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact ~op_stall ? 1'b0 : pl1_op_ovf; assign stg1_op_ovf_data = pl0_op_valid & op_stall ? buf_ram_rdata : pl1_op_ovf_data; assign stg1_op_ovf_buf_rd_addr = pl0_op_valid & op_stall ? pl0_op_buf_rd_addr : pl1_op_ovf_buf_rd_addr; - + always @(posedge clk) if (!rst_n) begin pl1_op_valid <= 0; @@ -403,7 +406,7 @@ module sde_h2c_buf #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact stg2_op_keep_last[byte_idx] = 1; end assign stg2_op_keep = stg2_op_eop ? stg2_op_keep_last : ({PCIM_DATA_WIDTH_BYTES{1'b1}}); - + assign aux_ft_ff_pop = aux_ft_ff_valid & stg2_op_valid & stg2_op_eop & ~op_stall; always @(posedge clk) @@ -423,21 +426,21 @@ module sde_h2c_buf #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact end // else: !if(!rst_n) // Output FIFO - localparam OP_OUTPUT_FIFO_WIDTH = DESC_TYPE ? PCIM_DATA_WIDTH + 1 + PCIM_DATA_WIDTH_BYTES : + localparam OP_OUTPUT_FIFO_WIDTH = DESC_TYPE ? PCIM_DATA_WIDTH + 1 + PCIM_DATA_WIDTH_BYTES : PCIM_DATA_WIDTH + 1 + PCIM_DATA_WIDTH_BYTES + USER_BIT_WIDTH; localparam OP_OUTPUT_FIFO_DEPTH_MINUS1 = OP_OUTPUT_FIFO_DEPTH - 1; - + logic op_out_ff_push; logic [OP_OUTPUT_FIFO_WIDTH-1:0] op_out_ff_push_data; logic op_out_ff_pop; logic [OP_OUTPUT_FIFO_WIDTH-1:0] op_out_ff_pop_data; logic op_out_ff_full; logic op_out_ff_valid; - + assign op_out_ff_push = pl2_op_valid & ~op_stall; assign op_out_ff_push_data = DESC_TYPE ? {pl2_op_data, pl2_op_eop, pl2_op_keep} : {pl2_op_user, pl2_op_data, pl2_op_eop, pl2_op_keep}; - + flop_fifo #(.WIDTH(OP_OUTPUT_FIFO_WIDTH), .DEPTH(OP_OUTPUT_FIFO_DEPTH) ) OP_OUTPUT_FIFO (.clk (clk), @@ -463,7 +466,7 @@ module sde_h2c_buf #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact {buf_axis_data, buf_axis_last, buf_axis_keep} = op_out_ff_pop_data; else {buf_axis_user, buf_axis_data, buf_axis_last, buf_axis_keep} = op_out_ff_pop_data; - + // Logic to compute num_bytes for dm // Difference between dm_buf_wr_byte_addr and buf_rd_ptr logic [BUF_ADDR_RAM_IDX_WIDTH-1:0] buf_wr_ptr_in; @@ -488,15 +491,15 @@ module sde_h2c_buf #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact assign buf_ptr_eq = (buf_wr_ptr_in == buf_rd_ptr); assign buf_ptr_msb_eq = (buf_wr_ptr_msb_in == buf_rd_ptr_msb); - - // When pointers are not equal, for example - + + // When pointers are not equal, for example - // For case where rd_ptr is greater than wr_ptr, the actual ptr difference is // ptr_diff = rd_ptr - wr_ptr. // But the wr_ptr will not move even if the data mover writes less than 0x40 bytes. // Say, if the wr_byte_addr is at 0x10, the number of free bytes is equal to 0x30. // But the logic will report 0x40 with above logic. Therefore, subtracting by 1 to be safe. // ptr_diff = rd_ptr - wr_ptr - 1 - // When this is done, if the wr_byte_addr is 0x10, the number of free bytes reported will be 0x0 + // When this is done, if the wr_byte_addr is 0x10, the number of free bytes reported will be 0x0 assign buf_free_slots = buf_ptr_eq & buf_ptr_msb_eq ? BUF_DEPTH_MINUS1 : buf_ptr_eq & ~buf_ptr_msb_eq ? 0 : buf_ptr_diff - 1; @@ -507,7 +510,7 @@ module sde_h2c_buf #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact logic [BUF_ADDR_WIDTH-1:0] buf_rd_byte_addr; logic [BUF_ADDR_WIDTH:0] buf_rd_byte_addr_plus_depth; logic [BUF_ADDR_WIDTH:0] buf_byte_addr_diff; - + assign buf_wr_byte_addr = dm_buf_wr_byte_addr; assign buf_rd_byte_addr = {buf_rd_ptr, {PCIM_ADDR_BYTE_IDX_WIDTH{1'b0}}}; assign buf_rd_byte_addr_plus_depth = {buf_rd_ptr_plus_depth, {PCIM_ADDR_BYTE_IDX_WIDTH{1'b0}}}; @@ -516,7 +519,7 @@ module sde_h2c_buf #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact assign buf_dm_num_bytes = (buf_wr_byte_addr == buf_rd_byte_addr) & buf_ptr_msb_eq ? BUF_SIZE_BYTES : (buf_wr_byte_addr == buf_rd_byte_addr) & ~buf_ptr_msb_eq ? 0 : buf_byte_addr_diff; - + // Logic to compute aux fifo full assign buf_dm_aux_full = (dm_buf_aux_wr_ptr == aux_ram_rd_ptr) && (dm_buf_aux_wr_ptr_msb != aux_ram_rd_ptr_msb); @@ -540,22 +543,22 @@ module sde_h2c_buf #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact buf_cfg_num_free_slots = 0; buf_cfg_num_free_slots = buf_free_slots_q; end // always_comb - + always @(posedge clk) if (!rst_n) begin buf_cfg_in_pkt_cnt <= 0; buf_cfg_out_pkt_cnt <= 0; end else begin - buf_cfg_in_pkt_cnt <= cfg_buf_clr_in_pkt_cnt ? 0 : + buf_cfg_in_pkt_cnt <= cfg_buf_clr_in_pkt_cnt ? 0 : dm_buf_wr & dm_buf_eop ? buf_cfg_in_pkt_cnt + 1 : buf_cfg_in_pkt_cnt; buf_cfg_out_pkt_cnt <= cfg_buf_clr_out_pkt_cnt ? 0 : buf_axis_valid & buf_axis_last & axis_buf_ready ? buf_cfg_out_pkt_cnt + 1 : buf_cfg_out_pkt_cnt; end // else: !if(!rst_n) `ifndef NO_SDE_DEBUG_ILA - - + + ila_sde_h2c_buf ILA_SDE_H2C_BUF ( .clk (clk), @@ -590,7 +593,7 @@ ila_sde_h2c_buf ILA_SDE_H2C_BUF .probe22(aux_ram_rd_ptr_msb), .probe23(op_out_ff_full), - // 24 - 31 + // 24 - 31 .probe24(op_out_ff_valid), .probe25(buf_wr_ptr_in_plus_depth), .probe26(buf_rd_ptr_plus_depth), @@ -600,5 +603,5 @@ ila_sde_h2c_buf ILA_SDE_H2C_BUF ); `endif // `ifndef NO_SDE_DEBUG_ILA - + endmodule // sde_h2c_buf diff --git a/hdk/cl/examples/cl_sde/design/sde_h2c_cfg.sv b/hdk/cl/examples/cl_sde/design/sde_h2c_cfg.sv index 33521ccf7..e4b4056a0 100644 --- a/hdk/cl/examples/cl_sde/design/sde_h2c_cfg.sv +++ b/hdk/cl/examples/cl_sde/design/sde_h2c_cfg.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016-2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + // H2C Config Access @@ -33,7 +36,7 @@ module sde_h2c_cfg #(parameter bit DESC_TYPE = 0, input desc_ooo_error, input desc_unalin_error, - + // Config to Desc output logic cfg_desc_clr_cdt_consumed, output logic cfg_desc_clr_cdt_limit, @@ -45,7 +48,7 @@ module sde_h2c_cfg #(parameter bit DESC_TYPE = 0, output logic [19:0] cfg_wc_tick_cnt, output logic [3:0] cfg_wc_to_cnt, output logic [5:0] cfg_wc_cnt_minus1, - + input [31:0] desc_cfg_cdt_consumed, input [31:0] desc_cfg_cdt_limit, input [31:0] desc_cfg_desc_cnt, @@ -66,19 +69,19 @@ module sde_h2c_cfg #(parameter bit DESC_TYPE = 0, input dm_cfg_rresp_err, input dm_cfg_desc_len_err, - + output logic cfg_wb_desc_cdt_en, output logic cfg_wb_desc_cnt_en, output logic cfg_wb_pkt_cnt_en, output logic [47:0] cfg_wb_status_addr, - + input wb_cfg_sts_bresp_err, - output logic cfg_wb_desc_error, - output logic cfg_wb_dm_error, + output logic cfg_wb_desc_error, + output logic cfg_wb_dm_error, output logic cfg_wb_wb_error, input [31:0] wb_cfg_status_dw, - + // Config Buf input buf_cfg_buf_oflow, input buf_cfg_buf_uflow, @@ -88,10 +91,10 @@ module sde_h2c_cfg #(parameter bit DESC_TYPE = 0, input [15:0] buf_cfg_buf_rd_ptr, input buf_cfg_aux_fifo_oflow, input buf_cfg_aux_fifo_uflow, - input buf_cfg_aux_fifo_full , + input buf_cfg_aux_fifo_full , input buf_cfg_aux_fifo_empty, input [15:0] buf_cfg_aux_ram_wr_ptr, - input [15:0] buf_cfg_aux_ram_rd_ptr, + input [15:0] buf_cfg_aux_ram_rd_ptr, input [15:0] buf_cfg_dm_wr_ptr, input [15:0] buf_cfg_dm_aux_wr_ptr, input [15:0] buf_cfg_num_free_slots, @@ -106,14 +109,14 @@ module sde_h2c_cfg #(parameter bit DESC_TYPE = 0, localparam DESC_WIDTH_DW = DESC_WIDTH >> 5; localparam DESC_WIDTH_DW_MINUS1 = DESC_WIDTH_DW - 1; - + // Address range is 1.5KB (0x000 - 0x600) - + ///////////////////////////////////////////////// // H2C Global Control and Status (0x0000 - 0x00FC) ///////////////////////////////////////////////// // No registers yet - + ///////////////////////////////////////////////// // Desc Config and Status (0x0100 - 0x01FC) ///////////////////////////////////////////////// @@ -133,9 +136,9 @@ module sde_h2c_cfg #(parameter bit DESC_TYPE = 0, // 0x10 : Desc Address Registers (RW) // 15:0 - Desc RAM Address (RW) // 31:16 - Desc DW Index (W0C) (Auto increment) - + // 0x14 : Desc Read/Write Data (RW) - + // 0x18 : Desc Status // 0 - Desc Overflow (RW1C) // 1 - Desc Out of Order Error (RW1C) @@ -148,7 +151,7 @@ module sde_h2c_cfg #(parameter bit DESC_TYPE = 0, // 0 - Descriptor Type (0 - Regular, 1 - Compact) (RO) // 15:1 - RSVD // 31:16 - Descriptor RAM Depth (Maximum number of descriptors) (RO) - + ///////////////////////////////////////////////// // Data Mover Config and Status (0x0200 - 0x02FC) ///////////////////////////////////////////////// @@ -159,7 +162,7 @@ module sde_h2c_cfg #(parameter bit DESC_TYPE = 0, // 0 - RRESP Error (RW1C) // 1 - Descriptor length Error (RW1C) // 31:2 - RSVD - + ///////////////////////////////////////////////// // Write Back Config and Status (0x0300 - 0x34FC) ///////////////////////////////////////////////// @@ -174,7 +177,7 @@ module sde_h2c_cfg #(parameter bit DESC_TYPE = 0, // 7 - RSVD // 13:8 - Write-Back Coalescing Count Minus 1 // 31:14 - RSVD - + // 0x04 : Status Write-Back Address Low (RW) // 0x08 : Status Write-back Address High (RW) @@ -187,13 +190,13 @@ module sde_h2c_cfg #(parameter bit DESC_TYPE = 0, // 0x10 : Write Back Status Register // 0 - BRESP Error for Status Write // 31:1 - RSVD - + // 0x14 : Status DW // 0 - Desc Error // 1 - Data Mover Error // 2 - Write-Back Error // 31:3 - RSVD - + ///////////////////////////////////////////////// // Buffer & SPB Config and Status (0x0400 - 0x04FC) ///////////////////////////////////////////////// @@ -201,12 +204,12 @@ module sde_h2c_cfg #(parameter bit DESC_TYPE = 0, // 31:0 - RSVD (RW) // 0x04 : Buf Status - // 0 - Buffer Full (RO) - // 1 - Buffer Empty (RO) - // 2 - Aux FIFO Full (RO) + // 0 - Buffer Full (RO) + // 1 - Buffer Empty (RO) + // 2 - Aux FIFO Full (RO) // 3 - Aux FIFO Valid (RO) // 31:4 - RSVD - + // 0x08 : Input Packet Count (RW0C) // 0x0C : Ouput Packet Count (RW0C) @@ -224,18 +227,18 @@ module sde_h2c_cfg #(parameter bit DESC_TYPE = 0, // 0x18 : Number of Bytes // 15:0 - Buffer Number of Free Entries (RO) // 31:16 - RSVD - + // 0x1C : Data Mover In Buffer Pointers (RO) // 14:0 - Buffer Write Pointer // 15 - Buffer Write Pointer MSB // 30:16 - Aux FIFO Write Pointer // 31 - Aux FIFO Write Pointer MSB - + ///////////////////////////////////////////////// // AXIS Config and Status (0x0500 - 0x05FC) ///////////////////////////////////////////////// // 0x00 : Packet Count (RW0C) - + logic cfg_wr_q; logic cfg_rd_q; logic cfg_wr_re; @@ -261,7 +264,7 @@ module sde_h2c_cfg #(parameter bit DESC_TYPE = 0, logic [31:0] rdata_range_4; logic [31:0] rdata_range_5; - + always @(posedge clk) if (!rst_n) begin cfg_wr_q <= 0; @@ -275,7 +278,7 @@ module sde_h2c_cfg #(parameter bit DESC_TYPE = 0, assign cfg_rd_re = ~cfg_rd_q & h2c_ps_cfg_rd_req; assign cfg_wr_fe = cfg_wr_q & ~h2c_ps_cfg_wr_req; assign cfg_rd_fe = cfg_rd_q & ~h2c_ps_cfg_rd_req; - + // Decode Address ranges assign dec_range_0 = (h2c_ps_cfg_addr >= 16'h0000) & (h2c_ps_cfg_addr < 16'h0100); assign dec_range_1 = (h2c_ps_cfg_addr >= 16'h0100) & (h2c_ps_cfg_addr < 16'h0200); @@ -283,7 +286,7 @@ module sde_h2c_cfg #(parameter bit DESC_TYPE = 0, assign dec_range_3 = (h2c_ps_cfg_addr >= 16'h0300) & (h2c_ps_cfg_addr < 16'h0400); assign dec_range_4 = (h2c_ps_cfg_addr >= 16'h0400) & (h2c_ps_cfg_addr < 16'h0500); assign dec_range_5 = (h2c_ps_cfg_addr >= 16'h0500) & (h2c_ps_cfg_addr < 16'h0600); - + always @(posedge clk) if (!rst_n) begin h2c_ps_cfg_ack <= 0; @@ -296,7 +299,7 @@ module sde_h2c_cfg #(parameter bit DESC_TYPE = 0, dec_range_3 ? ack_range_3 : dec_range_4 ? ack_range_4 : dec_range_5 ? ack_range_5 : 1'b1); - + h2c_ps_cfg_rdata <= dec_range_0 ? rdata_range_0 : dec_range_1 ? rdata_range_1 : dec_range_2 ? rdata_range_2 : @@ -304,20 +307,20 @@ module sde_h2c_cfg #(parameter bit DESC_TYPE = 0, dec_range_4 ? rdata_range_4 : dec_range_5 ? rdata_range_5 : 32'hbaad_3600; end // else: !if(!rst_n) - + ///////////////////////////////////////////////// // Range 0 (0x0000 - 0x00FC) ///////////////////////////////////////////////// // TODO: No registers in this range yet assign ack_range_0 = 1; assign rdata_range_0 = 32'hbaad_3000; - + ///////////////////////////////////////////////// // Range 1 (0x0100 - 0x01FC) ///////////////////////////////////////////////// logic ack_wr_range_1; logic ack_rd_range_1; - + logic clr_desc_ram_idx; logic inc_desc_ram_idx_wr; logic inc_desc_ram_idx_rd; @@ -352,7 +355,7 @@ module sde_h2c_cfg #(parameter bit DESC_TYPE = 0, end else if (h2c_ps_cfg_wr_req & dec_range_1) begin ack_wr_range_1 <= 0; - case (h2c_ps_cfg_addr[7:0]) + case (h2c_ps_cfg_addr[7:0]) 8'h10 : begin ack_wr_range_1 <= 1; cfg_desc_ram_addr <= h2c_ps_cfg_wdata; @@ -438,19 +441,19 @@ module sde_h2c_cfg #(parameter bit DESC_TYPE = 0, assign inc_desc_ram_idx_rd = cfg_rd_fe & dec_range_1 & (h2c_ps_cfg_addr[7:0] == 8'h14); assign inc_desc_ram_idx = cfg_rd_q ? inc_desc_ram_idx_rd : inc_desc_ram_idx_wr; - always @(posedge clk) + always @(posedge clk) if (!rst_n) begin desc_ram_idx <= 4'd0; cfg_desc_ram_rd_dw <= 32'd0; cfg_desc_ram_data_q <= '{default:'0}; - + cfg_desc_ram_wr_ack <= 0; cfg_desc_ram_rd_ack <= 0; cfg_desc_ram_rd_ack_q <= 0; - + cfg_desc_ram_addr_reg_wr <= 0; cfg_desc_ram_data_reg_wr <= 0; - + cfg_desc_ram_data_reg_wr_last <= 0; cfg_desc_ram_wr_req <= 0; cfg_desc_ram_rd_req <= 0; @@ -461,32 +464,32 @@ module sde_h2c_cfg #(parameter bit DESC_TYPE = 0, inc_desc_ram_idx ? desc_ram_idx + 4'd1 : desc_ram_idx; for (int dw_idx = 0; dw_idx < DESC_WIDTH_DW; dw_idx++) - if (desc_ram_idx == dw_idx) + if (desc_ram_idx == dw_idx) cfg_desc_ram_rd_dw <= cfg_desc_ram_data_q[32*dw_idx +: 32]; - + if (desc_cfg_ram_ack) cfg_desc_ram_data_q <= desc_cfg_ram_rdata; - else + else for (int dw_idx = 0; dw_idx < DESC_WIDTH_DW; dw_idx++) - if (desc_ram_idx == dw_idx) + if (desc_ram_idx == dw_idx) cfg_desc_ram_data_q[32*dw_idx +: 32] <= cfg_desc_ram_data_reg_wr ? cfg_desc_ram_wr_dw : cfg_desc_ram_data_q[32*dw_idx +: 32]; - - + + cfg_desc_ram_wr_ack <= (desc_ram_idx == DESC_WIDTH_DW_MINUS1) ? desc_cfg_ram_ack : 1'b1; cfg_desc_ram_rd_ack <= (desc_ram_idx == 0) ? desc_cfg_ram_ack : 1'b1; cfg_desc_ram_rd_ack_q <= cfg_desc_ram_rd_ack; - + cfg_desc_ram_addr_reg_wr <= cfg_wr_re & dec_range_1 & (h2c_ps_cfg_addr[7:0] == 8'h10); cfg_desc_ram_data_reg_wr <= cfg_wr_re & dec_range_1 & (h2c_ps_cfg_addr[7:0] == 8'h14); - + cfg_desc_ram_data_reg_wr_last <= cfg_wr_re & dec_range_1 & (h2c_ps_cfg_addr[7:0] == 8'h14) & (desc_ram_idx == DESC_WIDTH_DW_MINUS1); cfg_desc_ram_wr_req <= cfg_desc_ram_data_reg_wr_last; cfg_desc_ram_rd_req <= cfg_rd_re & dec_range_1 & (h2c_ps_cfg_addr[7:0] == 8'h14) & (desc_ram_idx == 0); - + end // else: !if(!rst_n) assign cfg_desc_ram_wdata = cfg_desc_ram_data_q; - + always @(posedge clk) if (!rst_n) begin cfg_desc_oflow <= 0; @@ -513,7 +516,7 @@ module sde_h2c_cfg #(parameter bit DESC_TYPE = 0, logic clr_cfg_dm_rresp_err; logic cfg_dm_desc_len_err; logic clr_cfg_dm_desc_len_err; - + assign ack_range_2 = h2c_ps_cfg_wr_req ? ack_wr_range_2 : ack_rd_range_2; // Register Writes @@ -524,7 +527,7 @@ module sde_h2c_cfg #(parameter bit DESC_TYPE = 0, end else if (h2c_ps_cfg_wr_req & dec_range_2) begin ack_wr_range_2 <= 0; - case (h2c_ps_cfg_addr[7:0]) + case (h2c_ps_cfg_addr[7:0]) 8'h00 : begin ack_wr_range_2 <= 1; cfg_dm_ctl_reg0 <= h2c_ps_cfg_wdata; @@ -582,7 +585,7 @@ module sde_h2c_cfg #(parameter bit DESC_TYPE = 0, logic clr_wb_sts_bresp_err; logic cfg_wb_sts_bresp_err; - + assign ack_range_3 = h2c_ps_cfg_wr_req ? ack_wr_range_3 : ack_rd_range_3; // Register Writes @@ -596,7 +599,7 @@ module sde_h2c_cfg #(parameter bit DESC_TYPE = 0, end else if (h2c_ps_cfg_wr_req & dec_range_3) begin ack_wr_range_3 <= 0; - case (h2c_ps_cfg_addr[7:0]) + case (h2c_ps_cfg_addr[7:0]) 8'h00 : begin ack_wr_range_3 <= 1; cfg_wb_ctl_reg0 <= h2c_ps_cfg_wdata; @@ -617,7 +620,7 @@ module sde_h2c_cfg #(parameter bit DESC_TYPE = 0, ack_wr_range_3 <= 1; endcase // case (h2c_ps_cfg_addr[7:0]) end // if (h2c_ps_cfg_wr_req & dec_range_2) - + // Register Reads always @(posedge clk) if (!rst_n) begin @@ -656,9 +659,9 @@ module sde_h2c_cfg #(parameter bit DESC_TYPE = 0, end endcase // case (h2c_ps_cfg_addr[7:0]) end // else: !if(!rst_n) - + assign clr_wb_sts_bresp_err = cfg_wr_re & dec_range_3 & (h2c_ps_cfg_addr[7:0] == 8'h10) & h2c_ps_cfg_wdata[0]; - + assign cfg_wb_desc_cnt_en = cfg_wb_ctl_reg0[0]; assign cfg_wb_pkt_cnt_en = cfg_wb_ctl_reg0[1]; assign cfg_wb_desc_cdt_en = cfg_wb_ctl_reg0[2]; @@ -696,7 +699,7 @@ module sde_h2c_cfg #(parameter bit DESC_TYPE = 0, end else if (h2c_ps_cfg_wr_req & dec_range_4) begin ack_wr_range_4 <= 0; - case (h2c_ps_cfg_addr[7:0]) + case (h2c_ps_cfg_addr[7:0]) 8'h00 : begin ack_wr_range_4 <= 1; cfg_buf_ctl_reg0 <= h2c_ps_cfg_wdata; @@ -782,7 +785,7 @@ module sde_h2c_cfg #(parameter bit DESC_TYPE = 0, else begin cfg_axis_clr_pkt_cnt <= cfg_wr_re & dec_range_5 & (h2c_ps_cfg_addr[7:0] == 8'h00) & (h2c_ps_cfg_wdata == 32'd0); end - + // Read data and ack always @(posedge clk) if (!rst_n) begin @@ -816,5 +819,5 @@ module sde_h2c_cfg #(parameter bit DESC_TYPE = 0, cfg_wb_dm_error <= cfg_dm_rresp_err | cfg_dm_desc_len_err; cfg_wb_wb_error <= cfg_wb_sts_bresp_err; end - + endmodule // sde_h2c_cfg diff --git a/hdk/cl/examples/cl_sde/design/sde_h2c_data.sv b/hdk/cl/examples/cl_sde/design/sde_h2c_data.sv index 70e4f5ea6..343075f46 100644 --- a/hdk/cl/examples/cl_sde/design/sde_h2c_data.sv +++ b/hdk/cl/examples/cl_sde/design/sde_h2c_data.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016-2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,7 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ // H2C Data Mover @@ -22,13 +24,13 @@ module sde_h2c_data #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact parameter PCIM_DM_ARID = 0, // This is the ID used for read accesses from Data Mover parameter PCIM_MAX_RD_SIZE = 0, // 0 - 512B, 1 - 1KB, 2 - 2KB, 3 - 4KB - + parameter PCIM_DATA_WIDTH = 512, parameter PCIM_ID_WIDTH = 3, parameter PCIM_LEN_WIDTH = 8, parameter PCIM_ADDR_WIDTH = 64, parameter PCIM_ADDR_BYTE_IDX_WIDTH = $clog2(PCIM_DATA_WIDTH>>3), - + parameter BUF_DEPTH = 512, parameter BUF_ADDR_RAM_IDX_WIDTH = $clog2(BUF_DEPTH), parameter BUF_ADDR_WIDTH = PCIM_ADDR_BYTE_IDX_WIDTH + BUF_ADDR_RAM_IDX_WIDTH, @@ -41,18 +43,18 @@ module sde_h2c_data #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact // These are internal FIFOs - Dont change unless absolutely required parameter RD_TXN_TRK_FIFO_DEPTH = PCIM_NUM_OT_RD, parameter DP_DATA_OUTPUT_FIFO_DEPTH = 3 - - + + ) ( input clk, input rst_n, - + // CSR to Data Mover //TODO output logic dm_cfg_rresp_err, output logic dm_cfg_desc_len_err, - + // Desc to Data Mover input desc_dm_empty, output logic dm_desc_pop, @@ -81,11 +83,11 @@ module sde_h2c_data #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact output logic [BUF_ADDR_WIDTH-1:0] dm_buf_wr_byte_addr, output logic dm_buf_wr_ptr_msb, input [BUF_ADDR_WIDTH:0] buf_dm_num_bytes, - + output logic [BUF_AUX_RAM_ADDR_WIDTH-1:0] dm_buf_aux_wr_ptr, output logic dm_buf_aux_wr_ptr_msb, input buf_dm_aux_full, - + output logic dm_buf_wr, output logic [PCIM_DATA_WIDTH-1:0] dm_buf_data, output logic dm_buf_eop, @@ -93,7 +95,7 @@ module sde_h2c_data #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact output logic [PCIM_ADDR_BYTE_IDX_WIDTH-1:0] dm_buf_num_bytes_minus1 ); - + localparam PCIM_DATA_WIDTH_BYTES = PCIM_DATA_WIDTH >> 3; localparam BUF_SIZE_BYTES = BUF_DEPTH * (PCIM_DATA_WIDTH>>3); localparam BUF_DEPTH_MINUS1 = BUF_DEPTH - 1; @@ -101,17 +103,17 @@ module sde_h2c_data #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact localparam PCIM_MAX_RD_SIZE_BYTES_USER = PCIM_MAX_RD_SIZE == 0 ? 512 : PCIM_MAX_RD_SIZE == 1 ? 1024 : PCIM_MAX_RD_SIZE == 2 ? 2048 : 4096; - + localparam PCIM_MAX_RD_SIZE_BYTES_DATA_WIDTH = PCIM_DATA_WIDTH_BYTES == 64 ? 4096 : PCIM_DATA_WIDTH_BYTES == 32 ? 4096 : PCIM_DATA_WIDTH_BYTES == 16 ? 4096 : PCIM_DATA_WIDTH_BYTES == 8 ? 2048 : PCIM_DATA_WIDTH_BYTES == 4 ? 1024 : PCIM_DATA_WIDTH_BYTES == 2 ? 512 : 256; - + localparam PCIM_MAX_RD_SIZE_BYTES = PCIM_MAX_RD_SIZE_BYTES_DATA_WIDTH > PCIM_MAX_RD_SIZE_BYTES_USER ? PCIM_MAX_RD_SIZE_BYTES_USER : PCIM_MAX_RD_SIZE_BYTES_DATA_WIDTH; - - + + // Request FSM typedef enum logic [2:0] {REQ_IDLE = 0, REQ_GET_DESC = 1, @@ -164,18 +166,18 @@ module sde_h2c_data #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact logic curr_txn_space_avail; logic desc_req_done; logic rd_txn_trk_ff_full; - + logic rd_txn_done; logic data_rx_desc_done; logic data_rx_done_w_eop; - + // REQ FSM always @(posedge clk) - if (!rst_n) + if (!rst_n) req_state <= REQ_IDLE; else req_state <= req_state_next; - + // IDLE -> GET_DESC when desc_dm_desc_valid is true. // GET_DESC -> WAIT_DATA immediately. Here flop the required bits // ADDR : Send araddr, arlen, arid - wait until Grant - Also start data fetch from RAM @@ -207,7 +209,7 @@ module sde_h2c_data #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact req_state_next = REQ_WAIT_DATA; else req_state_next = REQ_ADDR; - + default: req_state_next = req_state; @@ -224,7 +226,7 @@ module sde_h2c_data #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact logic [12:0] curr_desc_max_minus_dest_addr; assign curr_desc_src_addr_d = ((req_state == REQ_IDLE) && desc_dm_desc_valid) ? desc_dm_desc_in.src_addr : desc_req_done ? curr_desc_src_addr + curr_txn_num_bytes : curr_desc_src_addr; - + // Save the descriptor and descriptor related stuff always @(posedge clk) if (!rst_n) begin @@ -251,16 +253,16 @@ module sde_h2c_data #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact //Optimize//else //Optimize// curr_desc_src_addr <= curr_desc_src_addr; curr_desc_src_addr<= curr_desc_src_addr_d; - - // curr_desc_max_minus_dest_addr <= (PCIM_MAX_RD_SIZE == 3) ? 13'h1000 - curr_desc_src_addr_d[11:0] : - // (PCIM_MAX_RD_SIZE == 2) ? 13'h0800 - curr_desc_src_addr_d[10:0] : + + // curr_desc_max_minus_dest_addr <= (PCIM_MAX_RD_SIZE == 3) ? 13'h1000 - curr_desc_src_addr_d[11:0] : + // (PCIM_MAX_RD_SIZE == 2) ? 13'h0800 - curr_desc_src_addr_d[10:0] : // (PCIM_MAX_RD_SIZE == 1) ? 13'h0400 - curr_desc_src_addr_d[ 9:0] : 13'h0200 - curr_desc_src_addr_d[8:0]; - - curr_desc_max_minus_dest_addr <= (PCIM_MAX_RD_SIZE_BYTES == 4096) ? 13'h1000 - curr_desc_src_addr_d[11:0] : - (PCIM_MAX_RD_SIZE_BYTES == 2048) ? 13'h0800 - curr_desc_src_addr_d[10:0] : - (PCIM_MAX_RD_SIZE_BYTES == 1024) ? 13'h0400 - curr_desc_src_addr_d[ 9:0] : + + curr_desc_max_minus_dest_addr <= (PCIM_MAX_RD_SIZE_BYTES == 4096) ? 13'h1000 - curr_desc_src_addr_d[11:0] : + (PCIM_MAX_RD_SIZE_BYTES == 2048) ? 13'h0800 - curr_desc_src_addr_d[10:0] : + (PCIM_MAX_RD_SIZE_BYTES == 1024) ? 13'h0400 - curr_desc_src_addr_d[ 9:0] : (PCIM_MAX_RD_SIZE_BYTES == 512) ? 13'h0200 - curr_desc_src_addr_d[ 8:0] : 13'h0100 - curr_desc_src_addr_d[ 7:0]; - + // Length and Decrement after every Txn if ((req_state == REQ_IDLE) && desc_dm_desc_valid) curr_desc_len <= desc_dm_desc_in.len; @@ -286,16 +288,16 @@ module sde_h2c_data #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact curr_desc_num_bytes <= curr_desc_num_bytes; end // else: !if(!rst_n) - - + + // Max Number of bytes // If source is SPB, the maximum bytes is 4K - //Optimize//assign curr_txn_max_bytes = (PCIM_MAX_RD_SIZE == 3) ? 13'h1000 - curr_desc_src_addr[11:0] : - //Optimize// (PCIM_MAX_RD_SIZE == 2) ? 13'h0800 - curr_desc_src_addr[10:0] : + //Optimize//assign curr_txn_max_bytes = (PCIM_MAX_RD_SIZE == 3) ? 13'h1000 - curr_desc_src_addr[11:0] : + //Optimize// (PCIM_MAX_RD_SIZE == 2) ? 13'h0800 - curr_desc_src_addr[10:0] : //Optimize// (PCIM_MAX_RD_SIZE == 1) ? 13'h0400 - curr_desc_src_addr[ 9:0] : 13'h0200 - curr_desc_src_addr[8:0]; assign curr_txn_max_bytes = curr_desc_max_minus_dest_addr; - // Number of bytes in the transaction + // Number of bytes in the transaction //Optimize//assign curr_txn_min_num_bytes = min_bytes_2 (curr_desc_len, curr_txn_max_bytes); assign curr_txn_min_num_bytes = (curr_desc_len[31:13] != 0) ? curr_txn_max_bytes : (curr_desc_len[12:0] > curr_txn_max_bytes[12:0]) ? curr_txn_max_bytes : curr_desc_len; @@ -316,35 +318,35 @@ module sde_h2c_data #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact assign buf_dm_num_bytes_ext = buf_dm_num_bytes; assign curr_txn_buf_space_avail = (buf_dm_num_bytes_ext >= curr_txn_min_num_bytes); end - + // Space Available assign curr_txn_space_avail = curr_txn_aux_space_avail & curr_txn_buf_space_avail; assign curr_buf_byte_wr_addr_plus_txn_num_bytes = curr_buf_byte_wr_addr + curr_txn_num_bytes; assign curr_buf_byte_wr_addr_plus_txn_num_bytes_rovr = curr_buf_byte_wr_addr_plus_txn_num_bytes - BUF_SIZE_BYTES; - + assign curr_buf_byte_wr_addr_next = curr_buf_byte_wr_addr_plus_txn_num_bytes >= BUF_SIZE_BYTES ? curr_buf_byte_wr_addr_plus_txn_num_bytes_rovr : curr_buf_byte_wr_addr_plus_txn_num_bytes; assign curr_buf_byte_wr_addr_msb_next = curr_buf_byte_wr_addr_plus_txn_num_bytes >= BUF_SIZE_BYTES ? ~curr_buf_wr_ptr_msb : curr_buf_wr_ptr_msb; - - assign curr_buf_ram_wr_addr_next = (curr_buf_byte_wr_addr_next[PCIM_ADDR_BYTE_IDX_WIDTH-1:0] == ({PCIM_ADDR_BYTE_IDX_WIDTH{1'b0}})) ? curr_buf_byte_wr_addr_next[PCIM_ADDR_BYTE_IDX_WIDTH +: BUF_ADDR_RAM_IDX_WIDTH] : - curr_buf_byte_wr_addr_next[PCIM_ADDR_BYTE_IDX_WIDTH +: BUF_ADDR_RAM_IDX_WIDTH] == BUF_DEPTH_MINUS1 ? ({BUF_ADDR_RAM_IDX_WIDTH{1'b0}}) : + + assign curr_buf_ram_wr_addr_next = (curr_buf_byte_wr_addr_next[PCIM_ADDR_BYTE_IDX_WIDTH-1:0] == ({PCIM_ADDR_BYTE_IDX_WIDTH{1'b0}})) ? curr_buf_byte_wr_addr_next[PCIM_ADDR_BYTE_IDX_WIDTH +: BUF_ADDR_RAM_IDX_WIDTH] : + curr_buf_byte_wr_addr_next[PCIM_ADDR_BYTE_IDX_WIDTH +: BUF_ADDR_RAM_IDX_WIDTH] == BUF_DEPTH_MINUS1 ? ({BUF_ADDR_RAM_IDX_WIDTH{1'b0}}) : curr_buf_byte_wr_addr_next[PCIM_ADDR_BYTE_IDX_WIDTH +: BUF_ADDR_RAM_IDX_WIDTH] + 1; - assign curr_buf_ram_wr_addr_msb_next = curr_buf_byte_wr_addr_plus_txn_num_bytes >= BUF_SIZE_BYTES ? ~curr_buf_wr_ptr_msb : - ((curr_buf_byte_wr_addr_next[PCIM_ADDR_BYTE_IDX_WIDTH +: BUF_ADDR_RAM_IDX_WIDTH] == BUF_DEPTH_MINUS1) && - (curr_buf_byte_wr_addr_next[PCIM_ADDR_BYTE_IDX_WIDTH-1:0] != ({PCIM_ADDR_BYTE_IDX_WIDTH{1'b0}}))) ? ~curr_buf_wr_ptr_msb : + assign curr_buf_ram_wr_addr_msb_next = curr_buf_byte_wr_addr_plus_txn_num_bytes >= BUF_SIZE_BYTES ? ~curr_buf_wr_ptr_msb : + ((curr_buf_byte_wr_addr_next[PCIM_ADDR_BYTE_IDX_WIDTH +: BUF_ADDR_RAM_IDX_WIDTH] == BUF_DEPTH_MINUS1) && + (curr_buf_byte_wr_addr_next[PCIM_ADDR_BYTE_IDX_WIDTH-1:0] != ({PCIM_ADDR_BYTE_IDX_WIDTH{1'b0}}))) ? ~curr_buf_wr_ptr_msb : curr_buf_wr_ptr_msb; - + assign curr_txn_num_bytes_adj = curr_txn_min_num_bytes + curr_desc_src_addr[PCIM_ADDR_BYTE_IDX_WIDTH-1:0]; assign curr_buf_aux_wr_ptr_next = (curr_buf_aux_wr_ptr == ({BUF_AUX_RAM_ADDR_WIDTH{1'b1}})) ? 0 : curr_buf_aux_wr_ptr + 1; assign curr_buf_aux_wr_ptr_msb_next = (curr_buf_aux_wr_ptr == ({BUF_AUX_RAM_ADDR_WIDTH{1'b1}})) ? ~curr_buf_aux_wr_ptr_msb : curr_buf_aux_wr_ptr_msb; - + assign curr_txn_arlen_2_extra_beats = (curr_txn_min_num_bytes[PCIM_ADDR_BYTE_IDX_WIDTH-1:0] + curr_desc_src_addr[PCIM_ADDR_BYTE_IDX_WIDTH-1:0]) > PCIM_DATA_WIDTH_BYTES; assign curr_txn_arlen_1_extra_beat = (|curr_txn_min_num_bytes[PCIM_ADDR_BYTE_IDX_WIDTH-1:0] || |curr_desc_src_addr[PCIM_ADDR_BYTE_IDX_WIDTH-1:0]); - // Save details to be used by the Txn transfered by the Data Transfer Pipe + // Save details to be used by the Txn transfered by the Data Transfer Pipe always @(posedge clk) if (!rst_n) begin curr_buf_byte_wr_addr <= '{default:'0}; @@ -352,7 +354,7 @@ module sde_h2c_data #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact curr_buf_aux_wr_ptr <= '{default:'0}; curr_buf_aux_wr_ptr_msb <= 0; - + curr_txn_src_addr <= '{default:'0}; curr_txn_num_bytes <= '{default:'0}; end @@ -385,7 +387,7 @@ module sde_h2c_data #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact curr_txn_src_addr <= curr_desc_src_addr; else curr_txn_src_addr <= curr_txn_src_addr; - + // Number of bytes per txn if ((req_state == REQ_WAIT_DATA) && ~rd_txn_trk_ff_full) //Optimize// curr_txn_num_bytes <= min_bytes_3 (curr_desc_len, curr_txn_max_bytes, buf_dm_num_bytes); @@ -394,14 +396,14 @@ module sde_h2c_data #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact curr_txn_num_bytes <= curr_txn_num_bytes; if ((req_state == REQ_WAIT_DATA) && ~rd_txn_trk_ff_full) - //Optimize//curr_txn_arlen <= (|curr_txn_num_bytes_adj[PCIM_ADDR_BYTE_IDX_WIDTH-1:0]) ? (curr_txn_num_bytes_adj >> PCIM_ADDR_BYTE_IDX_WIDTH) : + //Optimize//curr_txn_arlen <= (|curr_txn_num_bytes_adj[PCIM_ADDR_BYTE_IDX_WIDTH-1:0]) ? (curr_txn_num_bytes_adj >> PCIM_ADDR_BYTE_IDX_WIDTH) : //Optimize// (curr_txn_num_bytes_adj >> PCIM_ADDR_BYTE_IDX_WIDTH) - 1; curr_txn_arlen <= curr_txn_arlen_2_extra_beats ? (curr_txn_min_num_bytes[12:PCIM_ADDR_BYTE_IDX_WIDTH] + 1) : curr_txn_arlen_1_extra_beat ? curr_txn_min_num_bytes[12:PCIM_ADDR_BYTE_IDX_WIDTH] : (curr_txn_min_num_bytes[12:PCIM_ADDR_BYTE_IDX_WIDTH] - 1); else curr_txn_arlen <= curr_txn_arlen; - + end // else: !if(!rst_n) // PCIM AR Interface @@ -422,7 +424,7 @@ module sde_h2c_data #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact assign dm_buf_aux_wr_ptr = curr_buf_aux_wr_ptr; assign dm_buf_aux_wr_ptr_msb = curr_buf_aux_wr_ptr_msb; - + // Read Track FIFO - Used to save AXI TXN Information localparam RD_TXN_TRK_FIFO_WIDTH = $bits(rd_txn_trk_t); localparam RD_TXN_TRK_FIFO_DEPTH_MINUS1 = RD_TXN_TRK_FIFO_DEPTH - 1; @@ -433,7 +435,7 @@ module sde_h2c_data #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact logic [RD_TXN_TRK_FIFO_WIDTH-1:0] rd_txn_trk_ff_data_out; rd_txn_trk_t rd_txn_trk_ff_push_data, rd_txn_trk_ff_pop_data; logic [$clog2(RD_TXN_TRK_FIFO_DEPTH) : 0] rd_txn_trk_ff_cnt; - + assign rd_txn_trk_ff_push = dm_pm_arvalid & pm_dm_arready; assign rd_txn_trk_ff_push_data.txn_src_addr = curr_txn_src_addr[0 +: PCIM_ADDR_BYTE_IDX_WIDTH]; assign rd_txn_trk_ff_push_data.desc_spb = curr_desc.spb; @@ -442,9 +444,9 @@ module sde_h2c_data #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact assign rd_txn_trk_ff_push_data.txn_num_bytes = curr_txn_num_bytes[12:0]; assign rd_txn_trk_ff_push_data.txn_arlen = curr_txn_arlen; assign rd_txn_trk_ff_push_data.desc_user = curr_desc.user; - + // Read Transaction Track FIFO - + ram_fifo_ft #(.WIDTH (RD_TXN_TRK_FIFO_WIDTH), .PTR_WIDTH ($clog2(RD_TXN_TRK_FIFO_DEPTH)), .WATERMARK (RD_TXN_TRK_FIFO_DEPTH_MINUS1), @@ -459,7 +461,7 @@ module sde_h2c_data #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact .wmark (rd_txn_trk_ff_full) ); - + assign rd_txn_trk_ff_pop = rd_txn_done; assign rd_txn_trk_ff_pop_data = rd_txn_trk_ff_data_out; @@ -475,25 +477,25 @@ module sde_h2c_data #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact // Align Pipe logic dp_stall; logic fetch_stall; - + // Stage 2 - Mux the SPB Read Pipe or from PCIM // TODO: Not supporting SPB now logic stg2_dp_valid; logic [PCIM_DATA_WIDTH-1:0] stg2_dp_data; logic [1:0] stg2_dp_resp; logic stg2_dp_rlast; - + logic pl2_dp_valid; logic [PCIM_DATA_WIDTH-1:0] pl2_dp_data; logic [1:0] pl2_dp_resp; logic pl2_dp_rlast; - + assign stg2_dp_valid = pm_dm_rvalid; assign stg2_dp_data = pm_dm_rdata ; assign stg2_dp_resp = pm_dm_rresp ; assign stg2_dp_rlast = pm_dm_rlast ; assign dm_pm_rready = ~dp_stall; - + always @(posedge clk) if (!rst_n) begin pl2_dp_valid <= 0; @@ -522,7 +524,7 @@ module sde_h2c_data #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact logic [PCIM_DATA_WIDTH-1:0] stg3_dp_data; logic stg3_dp_valid; logic stg3_dp_desc_last_txn; - + logic pl3_dp_valid; logic [PCIM_DATA_WIDTH-1:0] pl3_dp_data; logic [1:0] pl3_dp_resp; @@ -534,30 +536,30 @@ module sde_h2c_data #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact logic pl3_dp_desc_last_txn; assign stg3_dp_valid = pl2_dp_valid; - - assign stg3_dp_num_bytes_first_slice = rd_txn_trk_ff_pop_data.desc_spb ? PCIM_DATA_WIDTH_BYTES: + + assign stg3_dp_num_bytes_first_slice = rd_txn_trk_ff_pop_data.desc_spb ? PCIM_DATA_WIDTH_BYTES: PCIM_DATA_WIDTH_BYTES - (rd_txn_trk_ff_pop_data.txn_src_addr[0 +: PCIM_ADDR_BYTE_IDX_WIDTH]); assign stg3_dp_num_bytes_last_slice = pl3_dp_num_bytes_remain; assign stg3_dp_first = pl3_dp_num_bytes_remain == 0; - + assign stg3_dp_last = (rd_txn_trk_ff_pop_data.txn_num_bytes <= stg3_dp_num_bytes_first_slice) || (pl3_dp_num_bytes_remain == stg3_dp_num_bytes_in); assign stg3_dp_eop = stg3_dp_last & rd_txn_trk_ff_pop_data.txn_eop; - + assign stg3_dp_num_bytes = ~stg3_dp_valid ? 0 : - stg3_dp_first ? min_bytes_2 (stg3_dp_num_bytes_first_slice, rd_txn_trk_ff_pop_data.txn_num_bytes) : + stg3_dp_first ? min_bytes_2 (stg3_dp_num_bytes_first_slice, rd_txn_trk_ff_pop_data.txn_num_bytes) : min_bytes_2(pl3_dp_num_bytes_remain, PCIM_DATA_WIDTH_BYTES); assign stg3_dp_num_bytes_in = stg3_dp_first ? min_bytes_2 (stg3_dp_num_bytes_first_slice, rd_txn_trk_ff_pop_data.txn_num_bytes) : min_bytes_2(pl3_dp_num_bytes_remain, PCIM_DATA_WIDTH_BYTES); - - assign stg3_dp_num_bytes_remain = ~stg3_dp_valid ? pl3_dp_num_bytes_remain : - stg3_dp_first ? rd_txn_trk_ff_pop_data.txn_num_bytes - stg3_dp_num_bytes_in : + + assign stg3_dp_num_bytes_remain = ~stg3_dp_valid ? pl3_dp_num_bytes_remain : + stg3_dp_first ? rd_txn_trk_ff_pop_data.txn_num_bytes - stg3_dp_num_bytes_in : pl3_dp_num_bytes_remain - stg3_dp_num_bytes_in; - + assign stg3_dp_data = stg3_dp_first ? (pl2_dp_data >> ({rd_txn_trk_ff_pop_data.txn_src_addr[0 +: PCIM_ADDR_BYTE_IDX_WIDTH], 3'd0})) : pl2_dp_data; - + always @(posedge clk) if (!rst_n) begin pl3_dp_valid <= 0; @@ -616,7 +618,7 @@ module sde_h2c_data #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact logic [PCIM_ADDR_BYTE_IDX_WIDTH+1:0] stg4_dp_num_bytes; logic stg4_dp_eop; logic [USER_BIT_WIDTH-1:0] stg4_dp_user; - + logic pl4_dp_valid; logic [PCIM_DATA_WIDTH-1:0] pl4_dp_data; logic pl4_dp_last; @@ -625,15 +627,15 @@ module sde_h2c_data #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact logic [PCIM_ADDR_BYTE_IDX_WIDTH:0] pl4_dp_num_bytes; logic [PCIM_ADDR_BYTE_IDX_WIDTH:0] pl4_dp_num_bytes_remain; logic [PCIM_ADDR_BYTE_IDX_WIDTH-1:0] pl4_dp_num_bytes_minus1; - + assign stg4_dp_num_bytes_comb = pl3_dp_num_bytes + pl4_dp_num_bytes; assign stg4_dp_num_bytes_gt_64 = stg4_dp_num_bytes_comb > PCIM_DATA_WIDTH_BYTES; assign stg4_dp_num_bytes_lt_64 = stg4_dp_num_bytes_comb < PCIM_DATA_WIDTH_BYTES; assign stg4_dp_num_bytes_eq_64 = stg4_dp_num_bytes_comb == PCIM_DATA_WIDTH_BYTES; - assign stg4_dp_copy = (pl4_dp_valid & pl4_dp_eop) || + assign stg4_dp_copy = (pl4_dp_valid & pl4_dp_eop) || (pl3_dp_valid & ~pl3_dp_eop & ~pl4_dp_valid & stg4_dp_num_bytes_lt_64); - + assign stg4_dp_clear = (~pl3_dp_valid & pl4_dp_valid & ~pl4_dp_eop & stg4_dp_num_bytes_eq_64) || (pl3_dp_valid & ~pl3_dp_eop & pl4_dp_valid & ~pl4_dp_eop & stg4_dp_num_bytes_eq_64) || (pl3_dp_valid & pl3_dp_eop & pl4_dp_valid & ~pl4_dp_eop & (stg4_dp_num_bytes_lt_64 || stg4_dp_num_bytes_eq_64)); @@ -643,47 +645,47 @@ module sde_h2c_data #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact assign stg4_dp_save_ovf = (pl3_dp_valid & ~pl3_dp_eop & pl4_dp_valid & ~pl4_dp_eop & stg4_dp_num_bytes_gt_64) || (pl3_dp_valid & pl3_dp_eop & pl4_dp_valid & ~pl4_dp_eop & stg4_dp_num_bytes_gt_64); - // Valid + // Valid assign stg4_dp_valid = stg4_dp_copy ? pl3_dp_valid : stg4_dp_clear ? 1'b0 : stg4_dp_accm || stg4_dp_save_ovf ? 1'b1 : pl4_dp_valid; - + // Overflow and Accumulate always_comb begin stg4_dp_data_accm_plus_ovf = '{default:'0}; for (int byte_idx = 0; byte_idx < (2*PCIM_DATA_WIDTH_BYTES); byte_idx++) if (byte_idx <= pl4_dp_num_bytes_minus1) stg4_dp_data_accm_plus_ovf [byte_idx*8 +: 8] = pl4_dp_data[byte_idx*8 +: 8]; - else + else stg4_dp_data_accm_plus_ovf [byte_idx*8 +: 8] = pl3_dp_data[(byte_idx - pl4_dp_num_bytes)*8 +: 8]; end // Accumulate assign stg4_dp_data_accm = stg4_dp_data_accm_plus_ovf[0 +: PCIM_DATA_WIDTH]; - + // Save Overflow assign stg4_dp_data_ovf = stg4_dp_data_accm_plus_ovf[PCIM_DATA_WIDTH +: PCIM_DATA_WIDTH]; // Data - assign stg4_dp_data = stg4_dp_copy ? pl3_dp_data : + assign stg4_dp_data = stg4_dp_copy ? pl3_dp_data : stg4_dp_accm ? stg4_dp_data_accm : stg4_dp_save_ovf ? stg4_dp_data_ovf : pl4_dp_data; // Number of bytes assign stg4_dp_num_bytes = stg4_dp_copy ? pl3_dp_num_bytes : - stg4_dp_clear ? 0 : - stg4_dp_accm ? stg4_dp_num_bytes_comb : + stg4_dp_clear ? 0 : + stg4_dp_accm ? stg4_dp_num_bytes_comb : stg4_dp_save_ovf ? stg4_dp_num_bytes_comb - PCIM_DATA_WIDTH_BYTES : pl4_dp_num_bytes; // EOP assign stg4_dp_eop = stg4_dp_copy ? pl3_dp_eop : - stg4_dp_clear || stg4_dp_accm ? 0 : + stg4_dp_clear || stg4_dp_accm ? 0 : stg4_dp_save_ovf ? pl3_dp_eop : pl4_dp_eop; // User Bits assign stg4_dp_user = stg4_dp_copy || stg4_dp_save_ovf ? pl3_dp_user : pl4_dp_user; - + always @(posedge clk) if (!rst_n) begin pl4_dp_valid <= 0; @@ -701,7 +703,7 @@ module sde_h2c_data #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact pl4_dp_num_bytes <= ~dp_stall ? stg4_dp_num_bytes : pl4_dp_num_bytes; pl4_dp_num_bytes_minus1 <= ~dp_stall ? (stg4_dp_num_bytes - 1) : pl4_dp_num_bytes_minus1; end - + // Stage 5 - Align logic stg5_dp_send_from_3; logic stg5_dp_send_from_4; @@ -721,19 +723,19 @@ module sde_h2c_data #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact logic [USER_BIT_WIDTH-1:0] pl5_dp_user; logic [PCIM_ADDR_BYTE_IDX_WIDTH:0] pl5_dp_num_bytes; logic [PCIM_ADDR_BYTE_IDX_WIDTH:0] pl5_dp_num_bytes_minus1; - - assign stg5_dp_send_from_3 = (pl3_dp_valid & ~pl3_dp_eop & ~pl4_dp_valid & stg4_dp_num_bytes_eq_64) || + + assign stg5_dp_send_from_3 = (pl3_dp_valid & ~pl3_dp_eop & ~pl4_dp_valid & stg4_dp_num_bytes_eq_64) || (pl3_dp_valid & pl3_dp_eop & ~pl4_dp_valid & (stg4_dp_num_bytes_lt_64 || stg4_dp_num_bytes_eq_64)); - - assign stg5_dp_send_from_4 = (~pl3_dp_valid & pl4_dp_valid & ~pl4_dp_eop & stg4_dp_num_bytes_eq_64) || + + assign stg5_dp_send_from_4 = (~pl3_dp_valid & pl4_dp_valid & ~pl4_dp_eop & stg4_dp_num_bytes_eq_64) || (pl4_dp_valid & pl4_dp_eop); - - assign stg5_dp_send_comb = (pl3_dp_valid & ~pl3_dp_eop & pl4_dp_valid & ~pl4_dp_eop & (stg4_dp_num_bytes_gt_64 | stg4_dp_num_bytes_eq_64)) || + + assign stg5_dp_send_comb = (pl3_dp_valid & ~pl3_dp_eop & pl4_dp_valid & ~pl4_dp_eop & (stg4_dp_num_bytes_gt_64 | stg4_dp_num_bytes_eq_64)) || (pl3_dp_valid & pl3_dp_eop & pl4_dp_valid & ~pl4_dp_eop); - - assign stg5_dp_bubble = (~pl3_dp_valid & ~pl4_dp_valid) || - (~pl3_dp_valid & pl4_dp_valid & ~pl4_dp_eop & stg4_dp_num_bytes_lt_64) || - ( pl3_dp_valid & ~pl3_dp_eop & ~pl4_dp_valid & stg4_dp_num_bytes_lt_64) || + + assign stg5_dp_bubble = (~pl3_dp_valid & ~pl4_dp_valid) || + (~pl3_dp_valid & pl4_dp_valid & ~pl4_dp_eop & stg4_dp_num_bytes_lt_64) || + ( pl3_dp_valid & ~pl3_dp_eop & ~pl4_dp_valid & stg4_dp_num_bytes_lt_64) || ( pl3_dp_valid & ~pl3_dp_eop & pl4_dp_valid & ~pl4_dp_eop & stg4_dp_num_bytes_lt_64); // Valid @@ -741,7 +743,7 @@ module sde_h2c_data #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact stg5_dp_send_from_4 ? pl4_dp_valid : stg5_dp_send_comb ? 1'b1 : stg5_dp_bubble ? 0 : pl5_dp_valid; - + // Data assign stg5_dp_data = stg5_dp_send_from_3 ? pl3_dp_data : stg5_dp_send_from_4 ? pl4_dp_data : @@ -752,16 +754,16 @@ module sde_h2c_data #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact assign stg5_dp_num_bytes = stg5_dp_send_from_3 ? pl3_dp_num_bytes : stg5_dp_send_from_4 ? pl4_dp_num_bytes : stg5_dp_send_comb ? min_bytes_2 (stg4_dp_num_bytes_comb, PCIM_DATA_WIDTH_BYTES) : - stg5_dp_bubble ? 0 : + stg5_dp_bubble ? 0 : pl5_dp_num_bytes; assign stg5_dp_num_bytes_minus1 = stg5_dp_num_bytes - 1; - + // EOP assign stg5_dp_eop = stg5_dp_send_from_3 ? pl3_dp_eop : stg5_dp_send_from_4 ? pl4_dp_eop : - stg5_dp_send_comb ? pl3_dp_eop & ~stg4_dp_num_bytes_gt_64 : + stg5_dp_send_comb ? pl3_dp_eop & ~stg4_dp_num_bytes_gt_64 : stg5_dp_bubble ? 0 : pl5_dp_eop; // User Bits @@ -785,10 +787,10 @@ module sde_h2c_data #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact pl5_dp_num_bytes <= ~dp_stall ? stg5_dp_num_bytes : pl5_dp_num_bytes; pl5_dp_num_bytes_minus1 <= ~dp_stall ? stg5_dp_num_bytes_minus1 : pl5_dp_num_bytes_minus1; end // else: !if(!rst_n) - + localparam DP_DATA_OUTPUT_FIFO_DEPTH_MINUS1 = DP_DATA_OUTPUT_FIFO_DEPTH - 1; localparam DP_DATA_OUTPUT_FIFO_WIDTH = PCIM_DATA_WIDTH + PCIM_ADDR_BYTE_IDX_WIDTH + USER_BIT_WIDTH + 1; - + logic dp_data_out_ff_push; logic dp_data_out_ff_pop; logic [DP_DATA_OUTPUT_FIFO_WIDTH-1:0] dp_data_out_ff_push_data; @@ -796,13 +798,13 @@ module sde_h2c_data #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact logic dp_data_out_ff_full; logic dp_data_out_ff_valid; logic [$clog2(DP_DATA_OUTPUT_FIFO_DEPTH):0] dp_data_out_ff_cnt; - + assign dp_data_out_ff_push = pl5_dp_valid & ~dp_stall; assign dp_data_out_ff_push_data = {pl5_dp_data, pl5_dp_eop, pl5_dp_user, pl5_dp_num_bytes_minus1[PCIM_ADDR_BYTE_IDX_WIDTH-1:0]}; - + // Output fifo for Write Data flop_fifo #(.WIDTH(DP_DATA_OUTPUT_FIFO_WIDTH), .DEPTH(DP_DATA_OUTPUT_FIFO_DEPTH) @@ -818,15 +820,15 @@ module sde_h2c_data #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact .watermark (dp_data_out_ff_full), .data_valid (dp_data_out_ff_valid) ); - + // Back-pressure to Data Pipeline assign dp_stall = dp_data_out_ff_full; assign dp_data_out_ff_pop = dp_data_out_ff_valid; - + assign dm_buf_wr = dp_data_out_ff_valid; assign {dm_buf_data, - dm_buf_eop, + dm_buf_eop, dm_buf_user, dm_buf_num_bytes_minus1} = dp_data_out_ff_pop_data; @@ -836,10 +838,10 @@ module sde_h2c_data #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact else dp_data_out_ff_cnt <= (dp_data_out_ff_push & ~dp_data_out_ff_pop) ? dp_data_out_ff_cnt + 1 : (~dp_data_out_ff_push & dp_data_out_ff_pop) ? dp_data_out_ff_cnt - 1 : dp_data_out_ff_cnt; - + // Descriptor data transfer is done assign dm_desc_cnt_inc = data_rx_desc_done; - + // Error detection always @(posedge clk) if (!rst_n) begin @@ -850,7 +852,7 @@ module sde_h2c_data #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact dm_cfg_rresp_err <= pl2_dp_valid & (pl2_dp_resp != 2'd0) & pl2_dp_rlast; dm_cfg_desc_len_err <= dm_desc_pop & (desc_dm_desc_in.len == 0); end - + function logic [31:0] min_bytes_2 (input logic [31:0] inp1, input logic [31:0] inp2); min_bytes_2 = inp1 > inp2 ? inp2 : inp1; endfunction // min_bytes_2 @@ -864,7 +866,7 @@ module sde_h2c_data #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact logic data_rx_desc_done_q; logic data_rx_desc_done_err; - + always @(posedge clk) if (rst_n) begin data_rx_desc_done_q <= 0; @@ -874,22 +876,22 @@ module sde_h2c_data #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact data_rx_desc_done_q <= data_rx_desc_done; data_rx_desc_done_err <= data_rx_desc_done_q & data_rx_desc_done; end - + always @(posedge clk) if (rst_n) assert (data_rx_desc_done_err != 1'b1) else begin $display("%m : *** ERROR ***: data_rx_desc_done_err asserted more than 1 clock. @%0t", $time); $finish; end - + //synopsys translate_on `ifndef NO_SDE_DEBUG_ILA - - ila_sde_h2c_dm SDE_H2C_DM_ILA - ( + + ila_sde_h2c_dm SDE_H2C_DM_ILA + ( .clk(clk), - + // 0 - 7 .probe0(desc_dm_empty), .probe1(dm_desc_pop), @@ -900,7 +902,7 @@ module sde_h2c_data #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact .probe6(dm_pm_arlen), .probe7(pm_dm_arready), - // 8 - 15 + // 8 - 15 .probe8(pm_dm_rvalid), .probe9(pm_dm_rlast), .probe10(dm_pm_rready), @@ -953,15 +955,10 @@ module sde_h2c_data #(parameter bit DESC_TYPE = 0, // 0 - Regular, 1 - Compact // 48-55 .probe48(dp_data_out_ff_valid), .probe49(dp_data_out_ff_cnt) - + ); `endif // `ifndef NO_SDE_DEBUG_ILA - - -endmodule // sde_h2c_data - - - +endmodule // sde_h2c_data diff --git a/hdk/cl/examples/cl_sde/design/sde_pkg.sv b/hdk/cl/examples/cl_sde/design/sde_pkg.sv index 6cb382de4..88cea24c2 100644 --- a/hdk/cl/examples/cl_sde/design/sde_pkg.sv +++ b/hdk/cl/examples/cl_sde/design/sde_pkg.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016-2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,7 +13,7 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. - +// ============================================================================ package sde_pkg; @@ -45,7 +46,7 @@ package sde_pkg; logic [31:0] len; } c2h_reg_desc_t; - // C2H Compact Mode Descriptor + // C2H Compact Mode Descriptor typedef struct packed { logic [47:0] rsvd; logic [47:0] dest_addr; @@ -64,7 +65,7 @@ package sde_pkg; logic [31:0] len; logic desc_type; } c2h_if_desc_t; - + // C2H Intermediate Format Descriptor Definition - Used in Descritor Engine typedef struct packed { logic [63:0] dest_addr; @@ -101,7 +102,7 @@ package sde_pkg; out_desc.h2c = 0; out_desc.desc_type = 1; - + out_desc.dest_addr = in_desc.dest_addr; out_desc.len = in_desc.len; @@ -111,27 +112,27 @@ package sde_pkg; // function c2h_reg_desc_t c2h_cnv_desc_comm2reg(comm_desc_t in_desc); // c2h_reg_desc_t out_desc; // out_desc = '{default:'0}; -// +// // out_desc.desc_type = in_desc.desc_type; // out_desc.dest_addr = in_desc.dest_addr; // out_desc.wb_addr = in_desc.wb_addr; // out_desc.len = in_desc.len; -// +// // c2h_cnv_desc_comm2reg = out_desc; // endfunction // c2h_cnv_desc_comm2reg -// +// // function c2h_comp_desc_t c2h_cnv_desc_comm2comp(comm_desc_t in_desc); // c2h_comp_desc_t out_desc; // out_desc = '{default:'0}; -// +// // out_desc.desc_type = in_desc.desc_type; // out_desc.dest_addr = in_desc.dest_addr; // out_desc.wb_addr = in_desc.wb_addr; // out_desc.len = in_desc.len; -// +// // c2h_cnv_desc_comm2comp = out_desc; // endfunction // c2h_cnv_desc_comm2comp - + function c2h_if_desc_t c2h_cnv_desc_comm2if(comm_desc_t in_desc); c2h_if_desc_t out_desc; out_desc = '{default:'0}; @@ -142,8 +143,8 @@ package sde_pkg; c2h_cnv_desc_comm2if = out_desc; endfunction // c2h_cnv_desc_reg2comm - - + + /////////////////////////////////////////////////////////////// // H2C Descriptors /////////////////////////////////////////////////////////////// @@ -179,7 +180,7 @@ package sde_pkg; logic [31:0] len; } h2c_reg_desc_t; - // H2C Compact Mode Descriptor + // H2C Compact Mode Descriptor typedef struct packed { logic [45:0] rsvd; logic spb; @@ -207,7 +208,7 @@ package sde_pkg; logic [31:0] len; } h2c_reg_sav_desc_t; - // H2C Compact Mode Descriptor + // H2C Compact Mode Descriptor typedef struct packed { logic spb; logic eop; @@ -236,7 +237,7 @@ package sde_pkg; out_desc.h2c = 1; out_desc.desc_type = 1; - + out_desc.src_addr = in_desc.src_addr; out_desc.len = in_desc.len; out_desc.eop = in_desc.eop; @@ -281,7 +282,7 @@ package sde_pkg; //------------------------|-----------|-----------|-----------|-----------|-----------|-----------| // Total Bits | 128 | | | 64 | | | //------------------------|-----------|-----------|-----------|-----------|-----------|-----------| - + // C2H Reg Mode Write-Back Metadata Definition (Including RSVD bits) typedef struct packed { logic [63:0] user; @@ -291,7 +292,7 @@ package sde_pkg; logic [31:0] len; } c2h_reg_wb_t; - // C2H Compact Mode Descriptor + // C2H Compact Mode Descriptor typedef struct packed { logic [29:0] rsvd; logic eop; @@ -316,8 +317,8 @@ package sde_pkg; virtual class RR_ARB #(parameter WINNER_WIDTH=2, parameter REQ_WIDTH = 32'h1 << WINNER_WIDTH ); - - static function logic [WINNER_WIDTH-1:0] do_arb (logic [REQ_WIDTH-1:0] req, + + static function logic [WINNER_WIDTH-1:0] do_arb (logic [REQ_WIDTH-1:0] req, logic [WINNER_WIDTH-1:0] curr_winner); logic [WINNER_WIDTH-1:0] start_idx; @@ -327,7 +328,7 @@ package sde_pkg; logic [WINNER_WIDTH-1:0] winner; start_idx = (curr_winner >= (REQ_WIDTH-1)) ? 0 : curr_winner + 1; - + req_req = {2{req}}; req_shifted = req_req >> start_idx; @@ -348,8 +349,6 @@ package sde_pkg; endfunction // do_arb endclass // RR_ARB - - + + endpackage // sde_pkg - - diff --git a/hdk/cl/examples/cl_sde/design/sde_pm.sv b/hdk/cl/examples/cl_sde/design/sde_pm.sv index 5a1085f3b..3fa5ab189 100644 --- a/hdk/cl/examples/cl_sde/design/sde_pm.sv +++ b/hdk/cl/examples/cl_sde/design/sde_pm.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016-2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + // PCIM Interface @@ -20,7 +23,7 @@ module sde_pm #(parameter PCIM_DATA_WIDTH = 512, parameter PCIM_LEN_WIDTH = 8, parameter PCIM_ADDR_WIDTH = 64, parameter PCIM_ADDR_BYTE_IDX_WIDTH = $clog2(PCIM_DATA_WIDTH>>3), - + // IDs for Write Channels parameter C2H_PCIM_DM_AWID = 0, parameter C2H_PCIM_WB_AWID = 1, @@ -32,10 +35,10 @@ module sde_pm #(parameter PCIM_DATA_WIDTH = 512, parameter H2C_PCIM_DM_ARID = 2, // These are internal FIFOs - Dont change unless absolutely required - parameter PM_WR_WINNER_FIFO_DEPTH = 32 - + parameter PM_WR_WINNER_FIFO_DEPTH = 32 + ) - ( + ( input clk, input rst_n, @@ -46,7 +49,7 @@ module sde_pm #(parameter PCIM_DATA_WIDTH = 512, input [31:0] pm_ps_cfg_wdata, output pm_ps_cfg_ack, output [31:0] pm_ps_cfg_rdata, - + // PCIM Interface output logic pcim_awvalid, @@ -55,25 +58,25 @@ module sde_pm #(parameter PCIM_DATA_WIDTH = 512, output logic [PCIM_LEN_WIDTH-1:0] pcim_awlen, output logic [2:0] pcim_awsize, input pcim_awready, - + output logic pcim_wvalid, output logic [PCIM_DATA_WIDTH-1:0] pcim_wdata, output logic [(PCIM_DATA_WIDTH>>3)-1:0] pcim_wstrb, output logic pcim_wlast, input pcim_wready, - + input logic pcim_bvalid, input logic [PCIM_ID_WIDTH-1:0] pcim_bid, input logic [1:0] pcim_bresp, output logic pcim_bready, - + output logic pcim_arvalid, output logic [PCIM_ID_WIDTH-1:0] pcim_arid, output logic [PCIM_ADDR_WIDTH-1:0] pcim_araddr, output logic [PCIM_LEN_WIDTH-1:0] pcim_arlen, output logic [2:0] pcim_arsize, input pcim_arready, - + input pcim_rvalid, input [PCIM_ID_WIDTH-1:0] pcim_rid, input [PCIM_DATA_WIDTH-1:0] pcim_rdata, @@ -105,7 +108,7 @@ module sde_pm #(parameter PCIM_DATA_WIDTH = 512, input [PCIM_LEN_WIDTH-1:0] c2h_dm_pm_awlen, input [PCIM_ID_WIDTH-1:0] c2h_dm_pm_awid, output logic c2h_pm_dm_awready, - + // Write Data to PCIM input c2h_dm_pm_wvalid, input [PCIM_DATA_WIDTH-1:0] c2h_dm_pm_wdata, @@ -125,7 +128,7 @@ module sde_pm #(parameter PCIM_DATA_WIDTH = 512, input [PCIM_LEN_WIDTH-1:0] c2h_wb_pm_awlen, input [PCIM_ID_WIDTH-1:0] c2h_wb_pm_awid, output logic c2h_pm_wb_awready, - + // Write Data to PCIM input c2h_wb_pm_wvalid, input [PCIM_DATA_WIDTH-1:0] c2h_wb_pm_wdata, @@ -152,7 +155,7 @@ module sde_pm #(parameter PCIM_DATA_WIDTH = 512, output logic [PCIM_DATA_WIDTH-1:0] h2c_pm_desc_rdata, output logic h2c_pm_desc_rlast, input h2c_desc_pm_rready, - + // H2C Data Mover to PCIM Interface // Read Address to PCIM input h2c_dm_pm_arvalid, @@ -167,7 +170,7 @@ module sde_pm #(parameter PCIM_DATA_WIDTH = 512, output logic h2c_pm_dm_rlast, input h2c_dm_pm_rready, - + // H2C Write-Back Block to PCIM Interface // Write Address to PCIM input h2c_wb_pm_awvalid, @@ -175,7 +178,7 @@ module sde_pm #(parameter PCIM_DATA_WIDTH = 512, input [PCIM_LEN_WIDTH-1:0] h2c_wb_pm_awlen, input [PCIM_ID_WIDTH-1:0] h2c_wb_pm_awid, output logic h2c_pm_wb_awready, - + // Write Data to PCIM input h2c_wb_pm_wvalid, input [PCIM_DATA_WIDTH-1:0] h2c_wb_pm_wdata, @@ -187,12 +190,12 @@ module sde_pm #(parameter PCIM_DATA_WIDTH = 512, output logic h2c_pm_wb_bvalid, output logic [1:0] h2c_pm_wb_bresp, input h2c_wb_pm_bready - + ); localparam PCIM_AXSIZE = PCIM_ADDR_BYTE_IDX_WIDTH; localparam WR_WINNER_WIDTH = 2; - + logic [WR_WINNER_WIDTH-1:0] wr_arb_out; logic wr_do_arb; @@ -213,16 +216,16 @@ module sde_pm #(parameter PCIM_DATA_WIDTH = 512, // assign wr_arb_out = sde_pkg::RR_ARB#(.WINNER_WIDTH(WR_WINNER_WIDTH), // .REQ_WIDTH(3))::do_arb({h2c_wb_pm_awvalid, c2h_wb_pm_awvalid, c2h_dm_pm_awvalid}, // wr_winner); - + // Save the winner always @(posedge clk) - if (!rst_n) + if (!rst_n) wr_winner <= 0; else wr_winner <= ~aw_pipe_stall ? wr_arb_out : wr_winner; assign aw_pipe_stall = pcim_awvalid & ~pcim_awready & ~pm_wr_winner_ff_full; - + always @(posedge clk) if (!rst_n) begin pcim_awvalid <= 0; @@ -248,14 +251,14 @@ module sde_pm #(parameter PCIM_DATA_WIDTH = 512, end // else: !if(~aw_pipe_stall) end // else: !if(!rst_n) assign pcim_awsize = PCIM_AXSIZE; - + assign c2h_pm_dm_awready = (wr_arb_out == 0) & ~aw_pipe_stall; assign c2h_pm_wb_awready = (wr_arb_out == 1) & ~aw_pipe_stall; assign h2c_pm_wb_awready = (wr_arb_out == 2) & ~aw_pipe_stall; assign wr_do_arb = (h2c_wb_pm_awvalid | c2h_wb_pm_awvalid | c2h_dm_pm_awvalid) & ~aw_pipe_stall; - - + + localparam PM_WR_WINNER_FIFO_DEPTH_MINUS1 = PM_WR_WINNER_FIFO_DEPTH - 1; localparam PM_WR_WINNER_FIFO_WIDTH = WR_WINNER_WIDTH; @@ -268,8 +271,8 @@ module sde_pm #(parameter PCIM_DATA_WIDTH = 512, logic requester_wvalid; logic requester_wlast; logic requester_wready; - - + + flop_fifo #(.WIDTH(PM_WR_WINNER_FIFO_WIDTH), .DEPTH(PM_WR_WINNER_FIFO_DEPTH) ) PM_WR_WINNER_FIFO (.clk (clk), @@ -283,16 +286,16 @@ module sde_pm #(parameter PCIM_DATA_WIDTH = 512, .half_full (), .watermark (pm_wr_winner_ff_full), .data_valid (pm_wr_winner_ff_valid) - + ); assign pm_wr_winner_ff_push = pcim_awvalid & pcim_awready & ~pm_wr_winner_ff_full; assign pm_wr_winner_ff_pop = requester_wvalid & requester_wlast & ~wdata_pipe_stall & pm_wr_winner_ff_valid; - + // Write Data Channel Pipeline - + assign wdata_pipe_stall = pcim_wvalid & ~pcim_wready; - + // Pop Winner from FIFO and Send Write Data // FIFO output is valid, means that there is write data to be sent always @(posedge clk) @@ -320,13 +323,13 @@ module sde_pm #(parameter PCIM_DATA_WIDTH = 512, end // else: !if(!rst_n) assign requester_wvalid = pm_wr_winner_ff_valid & ((pm_wr_winner_ff_pop_data == 0) ? c2h_dm_pm_wvalid : - (pm_wr_winner_ff_pop_data == 1) ? c2h_wb_pm_wvalid : + (pm_wr_winner_ff_pop_data == 1) ? c2h_wb_pm_wvalid : h2c_wb_pm_wvalid); assign requester_wlast = pm_wr_winner_ff_valid & ((pm_wr_winner_ff_pop_data == 0) ? c2h_dm_pm_wlast : - (pm_wr_winner_ff_pop_data == 1) ? c2h_wb_pm_wlast : + (pm_wr_winner_ff_pop_data == 1) ? c2h_wb_pm_wlast : h2c_wb_pm_wlast); assign requester_wready = ~wdata_pipe_stall; - + assign c2h_pm_dm_wready = pm_wr_winner_ff_valid & (pm_wr_winner_ff_pop_data == 0) & requester_wready; assign c2h_pm_wb_wready = pm_wr_winner_ff_valid & (pm_wr_winner_ff_pop_data == 1) & requester_wready; assign h2c_pm_wb_wready = pm_wr_winner_ff_valid & (pm_wr_winner_ff_pop_data == 2) & requester_wready; @@ -336,7 +339,7 @@ module sde_pm #(parameter PCIM_DATA_WIDTH = 512, logic c2h_wb_bresp_pipe_stall; logic h2c_wb_bresp_pipe_stall; logic [1:0] pcim_bresp_q; - + // C2H DM BRESP Pipe assign c2h_dm_bresp_pipe_stall = c2h_pm_dm_bvalid & ~c2h_dm_pm_bready; always @(posedge clk) @@ -354,7 +357,7 @@ module sde_pm #(parameter PCIM_DATA_WIDTH = 512, // c2h_pm_dm_bresp <= c2h_pm_dm_bresp; end end // else: !if(!rst_n) - + // C2H WB BRESP Pipe assign c2h_wb_bresp_pipe_stall = c2h_pm_wb_bvalid & ~c2h_wb_pm_bready; always @(posedge clk) @@ -390,16 +393,16 @@ module sde_pm #(parameter PCIM_DATA_WIDTH = 512, // h2c_pm_wb_bresp <= h2c_pm_wb_bresp; end end // else: !if(!rst_n) - + always @(posedge clk) - if (!rst_n) + if (!rst_n) pcim_bresp_q <= 0; else if (((pcim_bid == C2H_PCIM_DM_AWID) & ~c2h_dm_bresp_pipe_stall) || ((pcim_bid == C2H_PCIM_WB_AWID) & ~c2h_wb_bresp_pipe_stall) || ((pcim_bid == H2C_PCIM_WB_AWID) & ~h2c_wb_bresp_pipe_stall)) pcim_bresp_q <= pcim_bresp; - + assign c2h_pm_dm_bresp = pcim_bresp_q; assign c2h_pm_wb_bresp = pcim_bresp_q; assign h2c_pm_wb_bresp = pcim_bresp_q; @@ -411,8 +414,8 @@ module sde_pm #(parameter PCIM_DATA_WIDTH = 512, assign pcim_bready = (pcim_bid == C2H_PCIM_DM_AWID) ? ~c2h_dm_bresp_pipe_stall : (pcim_bid == C2H_PCIM_WB_AWID) ? ~c2h_wb_bresp_pipe_stall : (pcim_bid == H2C_PCIM_WB_AWID) ? ~h2c_wb_bresp_pipe_stall : 1'b0; - - + + // Do Round Robin among those requesting read on AR Channel // Round Robin arbiter localparam RD_WINNER_WIDTH = 2; @@ -427,21 +430,21 @@ module sde_pm #(parameter PCIM_DATA_WIDTH = 512, ); logic [RD_WINNER_WIDTH-1:0] rd_winner; logic ar_pipe_stall; -// +// // assign rd_arb_out = sde_pkg::RR_ARB#(.WINNER_WIDTH(RD_WINNER_WIDTH), // .REQ_WIDTH(3))::do_arb({c2h_desc_pm_arvalid, h2c_desc_pm_arvalid, h2c_dm_pm_arvalid}, // rd_winner); - - + + // Save the winner always @(posedge clk) - if (!rst_n) + if (!rst_n) rd_winner <= 0; else rd_winner <= ~ar_pipe_stall ? rd_arb_out : rd_winner; assign ar_pipe_stall = pcim_arvalid & ~pcim_arready; - + always @(posedge clk) if (!rst_n) begin pcim_arvalid <= 0; @@ -473,7 +476,7 @@ module sde_pm #(parameter PCIM_DATA_WIDTH = 512, assign c2h_pm_desc_arready = (rd_arb_out == 2) & ~ar_pipe_stall; assign rd_do_arb = (c2h_desc_pm_arvalid | h2c_desc_pm_arvalid | h2c_dm_pm_arvalid) & ~ar_pipe_stall; - + // For the read data, look at ID and send to appropriate requester logic c2h_desc_rresp_pipe_stall; @@ -482,7 +485,7 @@ module sde_pm #(parameter PCIM_DATA_WIDTH = 512, logic [1:0] pcim_rresp_q; logic [PCIM_DATA_WIDTH-1:0] pcim_rdata_q; logic pcim_rlast_q; - + // C2H DM RRESP Pipe assign c2h_desc_rresp_pipe_stall = c2h_pm_desc_rvalid & ~c2h_desc_pm_rready; always @(posedge clk) @@ -506,7 +509,7 @@ module sde_pm #(parameter PCIM_DATA_WIDTH = 512, // c2h_dm_desc_rlast <= c2h_dm_desc_rlast; end end // else: !if(!rst_n) - + // C2H WB RRESP Pipe assign h2c_desc_rresp_pipe_stall = h2c_pm_desc_rvalid & ~h2c_desc_pm_rready; always @(posedge clk) @@ -554,7 +557,7 @@ module sde_pm #(parameter PCIM_DATA_WIDTH = 512, // h2c_dm_dm_rlast <= h2c_dm_dm_rlast; end end // else: !if(!rst_n) - + always @(posedge clk) if (!rst_n) begin pcim_rresp_q <= 0; @@ -569,7 +572,7 @@ module sde_pm #(parameter PCIM_DATA_WIDTH = 512, pcim_rdata_q <=pcim_rdata; pcim_rlast_q <= pcim_rlast; end - + assign c2h_pm_desc_rresp = pcim_rresp_q; assign h2c_pm_desc_rresp = pcim_rresp_q; assign h2c_pm_dm_rresp = pcim_rresp_q; @@ -585,19 +588,16 @@ module sde_pm #(parameter PCIM_DATA_WIDTH = 512, // assign c2h_pm_desc_rid = C2H_PCIM_DESC_ARID; // assign h2c_pm_desc_rid = H2C_PCIM_DESC_ARID; // assign h2c_pm_dm_rid = H2C_PCIM_DM_ARID; - + assign pcim_rready = (pcim_rid == C2H_PCIM_DESC_ARID) ? ~c2h_desc_rresp_pipe_stall : (pcim_rid == H2C_PCIM_DESC_ARID) ? ~h2c_desc_rresp_pipe_stall : (pcim_rid == H2C_PCIM_DM_ARID) ? ~h2c_dm_rresp_pipe_stall : 1'b0; - + // Local Config Registers // TODO: // Temporarily no registers assign pm_ps_cfg_ack = 1; assign pm_ps_cfg_rdata = 32'hbaad_1000; - -endmodule // sde_pm - - +endmodule // sde_pm diff --git a/hdk/cl/examples/cl_sde/design/sde_ps.sv b/hdk/cl/examples/cl_sde/design/sde_ps.sv index e5646deea..28d940555 100644 --- a/hdk/cl/examples/cl_sde/design/sde_ps.sv +++ b/hdk/cl/examples/cl_sde/design/sde_ps.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016-2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,12 +13,14 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + // Data Engine PCIS Interface module sde_ps #(parameter bit C2H_ONLY = 0, parameter bit H2C_ONLY = 0, - + parameter PCIS_DATA_WIDTH = 512, parameter PCIS_ID_WIDTH = 5, parameter PCIS_LEN_WIDTH = 8, @@ -25,9 +28,9 @@ module sde_ps #(parameter bit C2H_ONLY = 0, parameter bit C2H_DESC_TYPE = 0, parameter C2H_DESC_WIDTH = C2H_DESC_TYPE ? 128 : 256, - + parameter PCIS_VALID_ADDR_WIDTH = 14, // This represents the address bits required for the 16KB window - + parameter C2H_PCIS_DESC_APERTURE = 14'h1000, parameter H2C_PCIS_DESC_APERTURE = 14'h1000, parameter H2C_PCIS_PKT_APERTURE = 14'h1000, @@ -36,11 +39,11 @@ module sde_ps #(parameter bit C2H_ONLY = 0, parameter PM_PCIS_CFG_APERTURE = 14'h0200, parameter C2H_PCIS_CFG_APERTURE = 14'h0600, parameter H2C_PCIS_CFG_APERTURE = 14'h0600, - + parameter bit H2C_DESC_TYPE = 0, parameter H2C_DESC_WIDTH = H2C_DESC_TYPE ? 128 : 256, - - + + parameter H2C_PKT_SIZE_BYTES = 64, parameter H2C_PKT_WIDTH = H2C_PKT_SIZE_BYTES*8, @@ -84,22 +87,22 @@ module sde_ps #(parameter bit C2H_ONLY = 0, output logic c2h_sync_rst_n, output logic h2c_sync_rst_n, output logic pm_sync_rst_n, - + // PCIS to C2H Descriptor output logic c2h_ps_desc_wr_req, output logic [C2H_DESC_WIDTH-1:0] c2h_ps_desc_wdata, input c2h_ps_desc_ack, - + // PCIS to H2C Descriptor output logic h2c_ps_desc_wr_req, output logic [H2C_DESC_WIDTH-1:0] h2c_ps_desc_wdata, input h2c_ps_desc_ack, - + // PCIS to H2C Small Pkt Buffer output logic h2c_ps_pkt_wr_req, output logic [H2C_PKT_WIDTH-1:0] h2c_ps_pkt_wdata, input h2c_ps_pkt_ack, - + // PCIS to PM Config Interface output logic pm_ps_cfg_wr_req, output logic pm_ps_cfg_rd_req, @@ -107,7 +110,7 @@ module sde_ps #(parameter bit C2H_ONLY = 0, output logic [31:0] pm_ps_cfg_wdata, input pm_ps_cfg_ack, input [31:0] pm_ps_cfg_rdata, - + // PCIS to C2H Config Interface output logic c2h_ps_cfg_wr_req, @@ -120,7 +123,7 @@ module sde_ps #(parameter bit C2H_ONLY = 0, output logic c2h_desc_ooo_error, output logic c2h_desc_unalin_error, - + // PCIS to H2C Config Interface output logic h2c_ps_cfg_wr_req, output logic h2c_ps_cfg_rd_req, @@ -128,11 +131,11 @@ module sde_ps #(parameter bit C2H_ONLY = 0, output logic [31:0] h2c_ps_cfg_wdata, input h2c_ps_cfg_ack, input [31:0] h2c_ps_cfg_rdata, - + output logic h2c_desc_ooo_error, output logic h2c_desc_unalin_error - + ); // Remove these flops to save area (but timing will be tight) @@ -142,7 +145,7 @@ module sde_ps #(parameter bit C2H_ONLY = 0, logic pcis_wlast_q; logic pcis_wvalid_q; logic pcis_wready_q; - + // PCIS FSM typedef enum logic [3:0] { PCIS_REQ_IDLE = 4'd0, @@ -172,11 +175,11 @@ module sde_ps #(parameter bit C2H_ONLY = 0, logic pcis_req_h2c_cfg; logic pcis_req_rd_dummy; logic pcis_req_wr_dummy; - + logic c2h_pcis_desc_wready; logic h2c_pcis_desc_wready; logic h2c_pcis_pkt_wready; - + logic pm_pcis_cfg_wready; logic pm_pcis_cfg_rvalid; logic [31:0] pm_pcis_cfg_rdata; @@ -192,14 +195,14 @@ module sde_ps #(parameter bit C2H_ONLY = 0, logic h2c_pcis_cfg_wready; logic h2c_pcis_cfg_rvalid; logic [31:0] h2c_pcis_cfg_rdata; - + logic ps_ps_cfg_wr_req; logic ps_ps_cfg_rd_req; logic [15:0] ps_ps_cfg_addr; logic [31:0] ps_ps_cfg_wdata; logic ps_ps_cfg_ack; logic [31:0] ps_ps_cfg_rdata; - + localparam WR_CH_IN_FIFO_WIDTH = PCIS_DATA_WIDTH + 1 + (PCIS_DATA_WIDTH>>3); localparam WR_CH_IN_FIFO_DEPTH_MINUS1 = WR_CH_IN_FIFO_DEPTH - 1; logic [WR_CH_IN_FIFO_WIDTH-1:0] wr_ch_in_ff_pop_data; @@ -227,35 +230,35 @@ module sde_ps #(parameter bit C2H_ONLY = 0, // .watermark (wr_ch_in_ff_full), // .data_valid (wr_ch_in_ff_valid) // ); -// +// // assign wr_ch_in_ff_pop = wr_ch_in_ff_valid & pcis_wready_q; // assign {pcis_wlast_q, pcis_wstrb_q, pcis_wdata_q} = wr_ch_in_ff_pop_data; // assign pcis_wvalid_q = wr_ch_in_ff_valid; // assign pcis_wready = ~wr_ch_in_ff_full; assign {pcis_wvalid_q, pcis_wlast_q, pcis_wstrb_q, pcis_wdata_q} = {pcis_wvalid, pcis_wlast, pcis_wstrb, pcis_wdata}; - assign pcis_wready = pcis_wready_q; - + assign pcis_wready = pcis_wready_q; + always @(posedge clk) if (!rst_n) pcis_req_state <= PCIS_REQ_IDLE; - else + else pcis_req_state <= pcis_req_state_next; always_comb begin pcis_req_state_next = pcis_req_state; case (pcis_req_state) - + PCIS_REQ_IDLE: if (pcis_awvalid || pcis_arvalid) pcis_req_state_next = PCIS_REQ_AW_AR; else pcis_req_state_next = PCIS_REQ_IDLE; - + PCIS_REQ_AW_AR: pcis_req_state_next = PCIS_REQ_DEC; - + PCIS_REQ_DEC: if (pcis_req_c2h_wr_desc || pcis_req_h2c_wr_desc) pcis_req_state_next = PCIS_REQ_WR_DESC; @@ -265,9 +268,9 @@ module sde_ps #(parameter bit C2H_ONLY = 0, pcis_req_state_next = PCIS_REQ_CFG; else if (pcis_req_rd_n_wr) pcis_req_state_next = PCIS_REQ_RESP; - else + else pcis_req_state_next = PCIS_REQ_WR_DUMMY; - + PCIS_REQ_CFG: if ((pcis_req_pm_cfg & ((pcis_req_rd_n_wr & pm_pcis_cfg_rvalid ) || (~pcis_req_rd_n_wr & pm_pcis_cfg_wready ))) || (pcis_req_ps_cfg & ((pcis_req_rd_n_wr & ps_pcis_cfg_rvalid ) || (~pcis_req_rd_n_wr & ps_pcis_cfg_wready ))) || @@ -284,13 +287,13 @@ module sde_ps #(parameter bit C2H_ONLY = 0, pcis_req_state_next = PCIS_REQ_RESP; else pcis_req_state_next = PCIS_REQ_WR_DESC; - + PCIS_REQ_WR_PKT: if (pcis_wvalid_q & pcis_wlast_q & pcis_req_h2c_wr_pkt & h2c_pcis_pkt_wready) pcis_req_state_next = PCIS_REQ_RESP; else pcis_req_state_next = PCIS_REQ_WR_PKT; - + PCIS_REQ_WR_DUMMY: if (pcis_wvalid_q & pcis_wlast_q) pcis_req_state_next = PCIS_REQ_RESP; @@ -307,17 +310,17 @@ module sde_ps #(parameter bit C2H_ONLY = 0, pcis_req_state_next = PCIS_REQ_IDLE; else pcis_req_state_next = PCIS_REQ_RESP; - + default: pcis_req_state_next = pcis_req_state; - + endcase // case pcis_req_state end // else: !if(!rst_n) // Save request info always @(posedge clk) - if (!rst_n) + if (!rst_n) {pcis_req_id, pcis_req_size, pcis_req_len, pcis_req_addr, pcis_req_rd_n_wr} <= '{default:'0}; else begin if ((pcis_req_state == PCIS_REQ_IDLE) && pcis_awvalid) @@ -346,16 +349,16 @@ module sde_ps #(parameter bit C2H_ONLY = 0, localparam PS_PCIS_CFG_ADDR_START = H2C_PCIS_PKT_ADDR_END; localparam PS_PCIS_CFG_ADDR_END = PS_PCIS_CFG_ADDR_START + PS_PCIS_CFG_APERTURE; - + localparam PM_PCIS_CFG_ADDR_START = PS_PCIS_CFG_ADDR_END; localparam PM_PCIS_CFG_ADDR_END = PM_PCIS_CFG_ADDR_START + PM_PCIS_CFG_APERTURE; - + localparam C2H_PCIS_CFG_ADDR_START = PM_PCIS_CFG_ADDR_END; localparam C2H_PCIS_CFG_ADDR_END = C2H_PCIS_CFG_ADDR_START + C2H_PCIS_CFG_APERTURE; - + localparam H2C_PCIS_CFG_ADDR_START = C2H_PCIS_CFG_ADDR_END; localparam H2C_PCIS_CFG_ADDR_END = H2C_PCIS_CFG_ADDR_START + H2C_PCIS_CFG_APERTURE; - + // Decode addresses always @(posedge clk) if (!rst_n) begin @@ -371,24 +374,24 @@ module sde_ps #(parameter bit C2H_ONLY = 0, end else begin if (pcis_req_state == PCIS_REQ_AW_AR) begin - pcis_req_c2h_wr_desc <= ~pcis_req_rd_n_wr && + pcis_req_c2h_wr_desc <= ~pcis_req_rd_n_wr && (pcis_req_addr >= C2H_PCIS_DESC_ADDR_START) && (pcis_req_addr < C2H_PCIS_DESC_ADDR_END); - - pcis_req_h2c_wr_desc <= ~pcis_req_rd_n_wr && + + pcis_req_h2c_wr_desc <= ~pcis_req_rd_n_wr && (pcis_req_addr >= H2C_PCIS_DESC_ADDR_START) && (pcis_req_addr < H2C_PCIS_DESC_ADDR_END); - pcis_req_h2c_wr_pkt <= ~pcis_req_rd_n_wr && + pcis_req_h2c_wr_pkt <= ~pcis_req_rd_n_wr && ((pcis_req_addr >= H2C_PCIS_PKT_ADDR_START) && (pcis_req_addr < H2C_PCIS_PKT_ADDR_END)); pcis_req_ps_cfg <= (pcis_req_addr >= PS_PCIS_CFG_ADDR_START ) && (pcis_req_addr < PS_PCIS_CFG_ADDR_END ); pcis_req_pm_cfg <= (pcis_req_addr >= PM_PCIS_CFG_ADDR_START ) && (pcis_req_addr < PM_PCIS_CFG_ADDR_END ); pcis_req_c2h_cfg <= (pcis_req_addr >= C2H_PCIS_CFG_ADDR_START) && (pcis_req_addr < C2H_PCIS_CFG_ADDR_END); pcis_req_h2c_cfg <= (pcis_req_addr >= H2C_PCIS_CFG_ADDR_START) && (pcis_req_addr < H2C_PCIS_CFG_ADDR_END); - - pcis_req_rd_dummy <= pcis_req_rd_n_wr && + + pcis_req_rd_dummy <= pcis_req_rd_n_wr && ((pcis_req_addr < C2H_PCIS_DESC_ADDR_START) || (pcis_req_addr >= H2C_PCIS_CFG_ADDR_END) || ((pcis_req_addr >= C2H_PCIS_DESC_ADDR_START) && (pcis_req_addr < H2C_PCIS_PKT_ADDR_END))); - + pcis_req_wr_dummy <= ~pcis_req_rd_n_wr && ((pcis_req_addr < C2H_PCIS_DESC_ADDR_START) || (pcis_req_addr >= H2C_PCIS_CFG_ADDR_END)); end // if (pcis_req_state == PCIS_REQ_AW_AR) @@ -403,9 +406,9 @@ module sde_ps #(parameter bit C2H_ONLY = 0, pcis_req_rd_dummy <= pcis_req_rd_dummy ; pcis_req_wr_dummy <= pcis_req_wr_dummy ; end // else: !if(pcis_req_state == PCIS_REQ_AW_AR) - + end // else: !if(!rst_n) - + // AW & AR Channel always @(posedge clk) if (!rst_n) begin @@ -417,7 +420,7 @@ module sde_ps #(parameter bit C2H_ONLY = 0, pcis_arready <= pcis_req_rd_n_wr & (pcis_req_state == PCIS_REQ_AW_AR); end - assign pcis_wready_q = (pcis_req_c2h_wr_desc & c2h_pcis_desc_wready) || + assign pcis_wready_q = (pcis_req_c2h_wr_desc & c2h_pcis_desc_wready) || (pcis_req_h2c_wr_desc & h2c_pcis_desc_wready) || (pcis_req_h2c_wr_pkt & h2c_pcis_pkt_wready) || (pcis_req_ps_cfg & ps_pcis_cfg_wready ) || @@ -425,7 +428,7 @@ module sde_ps #(parameter bit C2H_ONLY = 0, (pcis_req_c2h_cfg & c2h_pcis_cfg_wready) || (pcis_req_h2c_cfg & h2c_pcis_cfg_wready) || pcis_req_wr_dummy; - + // B Channel always @(posedge clk) if (!rst_n) begin @@ -438,14 +441,14 @@ module sde_ps #(parameter bit C2H_ONLY = 0, end assign pcis_bid = pcis_req_id; assign pcis_bresp = 2'b00; - + // R Channel logic [PCIS_LEN_WIDTH-1:0] pcis_req_read_len; logic [31:0] cfg_pcis_rdata; - - assign cfg_pcis_rdata = pcis_req_ps_cfg ? ps_pcis_cfg_rdata : - pcis_req_pm_cfg ? pm_pcis_cfg_rdata : - pcis_req_c2h_cfg ? c2h_pcis_cfg_rdata : + + assign cfg_pcis_rdata = pcis_req_ps_cfg ? ps_pcis_cfg_rdata : + pcis_req_pm_cfg ? pm_pcis_cfg_rdata : + pcis_req_c2h_cfg ? c2h_pcis_cfg_rdata : pcis_req_h2c_cfg ? h2c_pcis_cfg_rdata : 32'hbaad_0000; always @(posedge clk) if (!rst_n) begin @@ -456,19 +459,19 @@ module sde_ps #(parameter bit C2H_ONLY = 0, pcis_req_read_len <= 0; end else begin - pcis_rvalid <= pcis_rvalid && pcis_rready && (pcis_req_read_len == 0) ? 1'b0 : - (pcis_req_state == PCIS_REQ_RESP) && pcis_req_rd_n_wr ? 1'b1 : + pcis_rvalid <= pcis_rvalid && pcis_rready && (pcis_req_read_len == 0) ? 1'b0 : + (pcis_req_state == PCIS_REQ_RESP) && pcis_req_rd_n_wr ? 1'b1 : pcis_rvalid; pcis_rdata <= cfg_pcis_rdata << {pcis_req_addr[5:2], 5'd0}; pcis_rlast <= (pcis_req_state == PCIS_REQ_RESP) && pcis_req_rd_n_wr && (pcis_req_read_len == 0); - + pcis_req_read_len <= pcis_arvalid & pcis_arready ? pcis_arlen : pcis_rvalid & pcis_rready ? pcis_req_read_len - 1 : pcis_req_read_len; end // else: !if(!rst_n) assign pcis_rid = pcis_req_id; assign pcis_rresp = 2'b00; - + // W Channel to C2H Descriptor logic c2h_pcis_req_wr_desc; assign c2h_pcis_req_wr_desc = pcis_req_active & pcis_req_c2h_wr_desc; @@ -493,7 +496,7 @@ module sde_ps #(parameter bit C2H_ONLY = 0, .acc_wdata (c2h_ps_desc_wdata), .acc_ack (c2h_ps_desc_ack) ); - + // W Channel to H2C Descriptor logic h2c_pcis_req_wr_desc; assign h2c_pcis_req_wr_desc = pcis_req_active & pcis_req_h2c_wr_desc; @@ -518,7 +521,7 @@ module sde_ps #(parameter bit C2H_ONLY = 0, .acc_wdata (h2c_ps_desc_wdata), .acc_ack (h2c_ps_desc_ack) ); - + // // W Channel to H2C Pkt Buffer // logic h2c_pcis_req_wr_pkt; // assign h2c_pcis_req_wr_pkt = pcis_req_active & pcis_req_h2c_wr_pkt; @@ -541,11 +544,11 @@ module sde_ps #(parameter bit C2H_ONLY = 0, // .acc_wdata (h2c_ps_pkt_wdata), // .acc_ack (h2c_ps_pkt_ack) // ); -// +// assign h2c_pcis_pkt_wready = 0; assign h2c_ps_pkt_wr_req = 0; assign h2c_ps_pkt_wdata = ({H2C_PKT_WIDTH{1'b0}}); - + // W Channel to PM Cfg // R Channel from PM Cfg always @(posedge clk) @@ -554,7 +557,7 @@ module sde_ps #(parameter bit C2H_ONLY = 0, pm_ps_cfg_rd_req <= 0; pm_ps_cfg_addr <= '{default:'0}; pm_ps_cfg_wdata <= '{default:'0}; - pm_pcis_cfg_wready <= 0; + pm_pcis_cfg_wready <= 0; pm_pcis_cfg_rvalid <= 0; pm_pcis_cfg_rdata <= '{default:'0}; end @@ -570,7 +573,7 @@ module sde_ps #(parameter bit C2H_ONLY = 0, pm_ps_cfg_addr <= ~(pm_ps_cfg_wr_req || pm_ps_cfg_rd_req) ? pcis_req_addr - PM_PCIS_CFG_ADDR_START : pm_ps_cfg_addr; pm_ps_cfg_wdata <= ~(pm_ps_cfg_wr_req || pm_ps_cfg_rd_req) ? (pcis_wdata_q >> {pcis_req_addr[5:2], 5'd0}) : pm_ps_cfg_wdata; - + pm_pcis_cfg_wready <= pm_ps_cfg_wr_req & pm_ps_cfg_ack; pm_pcis_cfg_rvalid <= pm_ps_cfg_rd_req & pm_ps_cfg_ack; @@ -578,7 +581,7 @@ module sde_ps #(parameter bit C2H_ONLY = 0, pm_pcis_cfg_rdata <= pm_ps_cfg_rd_req & pm_ps_cfg_ack ? pm_ps_cfg_rdata : pm_pcis_cfg_rdata; end // else: !if(!rst_n) - + // W Channel to PS Cfg // R Channel from PS Cfg always @(posedge clk) @@ -587,7 +590,7 @@ module sde_ps #(parameter bit C2H_ONLY = 0, ps_ps_cfg_rd_req <= 0; ps_ps_cfg_addr <= '{default:'0}; ps_ps_cfg_wdata <= '{default:'0}; - ps_pcis_cfg_wready <= 0; + ps_pcis_cfg_wready <= 0; ps_pcis_cfg_rvalid <= 0; ps_pcis_cfg_rdata <= '{default:'0}; end @@ -603,7 +606,7 @@ module sde_ps #(parameter bit C2H_ONLY = 0, ps_ps_cfg_addr <= ~(ps_ps_cfg_wr_req || ps_ps_cfg_rd_req) ? pcis_req_addr - PS_PCIS_CFG_ADDR_START : ps_ps_cfg_addr; ps_ps_cfg_wdata <= ~(ps_ps_cfg_wr_req || ps_ps_cfg_rd_req) ? (pcis_wdata_q >> {pcis_req_addr[5:2], 5'd0}) : ps_ps_cfg_wdata; - + ps_pcis_cfg_wready <= ps_ps_cfg_wr_req & ps_ps_cfg_ack; ps_pcis_cfg_rvalid <= ps_ps_cfg_rd_req & ps_ps_cfg_ack; @@ -620,7 +623,7 @@ module sde_ps #(parameter bit C2H_ONLY = 0, c2h_ps_cfg_rd_req <= 0; c2h_ps_cfg_addr <= '{default:'0}; c2h_ps_cfg_wdata <= '{default:'0}; - c2h_pcis_cfg_wready <= 0; + c2h_pcis_cfg_wready <= 0; c2h_pcis_cfg_rvalid <= 0; c2h_pcis_cfg_rdata <= '{default:'0}; end @@ -636,7 +639,7 @@ module sde_ps #(parameter bit C2H_ONLY = 0, c2h_ps_cfg_addr <= ~(c2h_ps_cfg_wr_req || c2h_ps_cfg_rd_req) ? pcis_req_addr - C2H_PCIS_CFG_ADDR_START : c2h_ps_cfg_addr; c2h_ps_cfg_wdata <= ~(c2h_ps_cfg_wr_req || c2h_ps_cfg_rd_req) ? (pcis_wdata_q >> {pcis_req_addr[5:2], 5'd0}) : c2h_ps_cfg_wdata; - + c2h_pcis_cfg_wready <= c2h_ps_cfg_wr_req & c2h_ps_cfg_ack; c2h_pcis_cfg_rvalid <= c2h_ps_cfg_rd_req & c2h_ps_cfg_ack; @@ -644,7 +647,7 @@ module sde_ps #(parameter bit C2H_ONLY = 0, c2h_pcis_cfg_rdata <= c2h_ps_cfg_rd_req & c2h_ps_cfg_ack ? c2h_ps_cfg_rdata : c2h_pcis_cfg_rdata; end // else: !if(!rst_n) - + // W Channel to H2C Cfg // R Channel from H2C Cfg always @(posedge clk) @@ -653,7 +656,7 @@ module sde_ps #(parameter bit C2H_ONLY = 0, h2c_ps_cfg_rd_req <= 0; h2c_ps_cfg_addr <= '{default:'0}; h2c_ps_cfg_wdata <= '{default:'0}; - h2c_pcis_cfg_wready <= 0; + h2c_pcis_cfg_wready <= 0; h2c_pcis_cfg_rvalid <= 0; h2c_pcis_cfg_rdata <= '{default:'0}; end @@ -669,7 +672,7 @@ module sde_ps #(parameter bit C2H_ONLY = 0, h2c_ps_cfg_addr <= ~(h2c_ps_cfg_wr_req || h2c_ps_cfg_rd_req) ? pcis_req_addr - H2C_PCIS_CFG_ADDR_START : h2c_ps_cfg_addr; h2c_ps_cfg_wdata <= ~(h2c_ps_cfg_wr_req || h2c_ps_cfg_rd_req) ? (pcis_wdata_q >> {pcis_req_addr[5:2], 5'd0}) : h2c_ps_cfg_wdata; - + h2c_pcis_cfg_wready <= h2c_ps_cfg_wr_req & h2c_ps_cfg_ack; h2c_pcis_cfg_rvalid <= h2c_ps_cfg_rd_req & h2c_ps_cfg_ack; @@ -681,11 +684,11 @@ module sde_ps #(parameter bit C2H_ONLY = 0, // Local Config Registers // TODO: // Temporarily no registers - + logic ps_ps_cfg_rd_ack; logic ps_ps_cfg_wr_ack; logic cfg_ps_reset; - + assign ps_ps_cfg_ack = ps_ps_cfg_wr_req ? ps_ps_cfg_wr_ack : ps_ps_cfg_rd_ack; ///////////////////////////////////////////////// @@ -701,7 +704,7 @@ module sde_ps #(parameter bit C2H_ONLY = 0, // 15:1 - RSVD // 16 - H2C Present // 31:17 - RSVD - + // Register Writes always @(posedge clk) if (!rst_n) begin @@ -709,7 +712,7 @@ module sde_ps #(parameter bit C2H_ONLY = 0, cfg_ps_reset <= 0; end else if (ps_ps_cfg_wr_req) begin - case (c2h_ps_cfg_addr[8:0]) + case (c2h_ps_cfg_addr[8:0]) 9'h000 : begin ps_ps_cfg_wr_ack <= 1; cfg_ps_reset <= ps_ps_cfg_wdata; @@ -719,7 +722,7 @@ module sde_ps #(parameter bit C2H_ONLY = 0, end endcase // case (c2h_ps_cfg_addr[8:0]) end // if (ps_ps_cfg_wr_req) - + logic [15:0] cfg_c2h_present; logic [15:0] cfg_h2c_present; logic h2c_only; @@ -727,10 +730,10 @@ module sde_ps #(parameter bit C2H_ONLY = 0, assign h2c_only = H2C_ONLY; assign c2h_only = C2H_ONLY; - + assign cfg_c2h_present = {15'd0, ~h2c_only}; assign cfg_h2c_present = {15'd0, ~c2h_only}; - + // Signals based on writes always @(posedge clk) if (!rst_n) begin @@ -765,10 +768,10 @@ module sde_ps #(parameter bit C2H_ONLY = 0, h2c_sync_rst_n <= ~cfg_ps_reset; pm_sync_rst_n <= ~cfg_ps_reset; end // else: !if(!rst_n) - - + + // `ifndef NO_SDE_DEBUG_ILA -// +// // ila_sde_ps SDE_PS_ILA (.clk (clk), // .probe0 (c2h_ps_desc_wr_req ), // .probe1 (c2h_ps_desc_wdata ), @@ -816,11 +819,10 @@ module sde_ps #(parameter bit C2H_ONLY = 0, // .probe43 (pcis_req_wr_dummy ), // .probe44 (c2h_pcis_req_wr_desc ), // .probe45 (h2c_pcis_req_wr_desc ), -// .probe46 (h2c_pcis_req_wr_pkt ) +// .probe46 (h2c_pcis_req_wr_pkt ) // ); -// +// // `endif // `ifndef NO_SDE_DEBUG_ILA - - -endmodule // sde_ps + +endmodule // sde_ps diff --git a/hdk/cl/examples/cl_sde/design/sde_ps_acc.sv b/hdk/cl/examples/cl_sde/design/sde_ps_acc.sv index b4e8b6a17..00f8e15d6 100644 --- a/hdk/cl/examples/cl_sde/design/sde_ps_acc.sv +++ b/hdk/cl/examples/cl_sde/design/sde_ps_acc.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016-2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + // SDE PCIS Accumulator diff --git a/hdk/cl/examples/cl_sde/design/sde_wb.sv b/hdk/cl/examples/cl_sde/design/sde_wb.sv index 12eb10cb2..a394c2cf7 100644 --- a/hdk/cl/examples/cl_sde/design/sde_wb.sv +++ b/hdk/cl/examples/cl_sde/design/sde_wb.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016-2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + // Write Back @@ -20,7 +23,7 @@ module sde_wb #(parameter bit H2C_N_C2H = 0, // 0 - C2H, 1 - H2C parameter PCIM_WB_AWID = 1, // This is the ID used for write accesses from Write Back Block parameter DESC_RAM_DEPTH = 64, - + parameter PCIM_DATA_WIDTH = 512, parameter PCIM_ID_WIDTH = 3, parameter PCIM_LEN_WIDTH = 8, @@ -47,11 +50,11 @@ module sde_wb #(parameter bit H2C_N_C2H = 0, // 0 - C2H, 1 - H2C output logic [15:0] wb_cfg_md_wr_ptr, input cfg_wb_clr_wr_ptr, - input cfg_wb_desc_error, - input cfg_wb_dm_error, + input cfg_wb_desc_error, + input cfg_wb_dm_error, input cfg_wb_wb_error, output logic [31:0] wb_cfg_status_dw, - + input cfg_desc_clr_cdt_limit, input cfg_desc_clr_desc_cnt, input cfg_axis_clr_pkt_cnt, @@ -63,12 +66,12 @@ module sde_wb #(parameter bit H2C_N_C2H = 0, // 0 - C2H, 1 - H2C input [19:0] cfg_wc_tick_cnt, input [3:0] cfg_wc_to_cnt, input [5:0] cfg_wc_cnt_minus1, - + output logic wb_cfg_md_bresp_err, output logic wb_cfg_sts_bresp_err, - + output logic [63:0] wb_cfg_bresp_err_addr, - + // Desc to Write-Back input desc_wb_limit_req, input [31:0] desc_wb_limit, @@ -79,7 +82,7 @@ module sde_wb #(parameter bit H2C_N_C2H = 0, // 0 - C2H, 1 - H2C // AXIS to Write-Back input axis_wb_pkt_cnt_req, input [31:0] axis_wb_pkt_cnt, - + // Data Mover to Write-Block Request input dm_wb_md_req, input sde_pkg::c2h_reg_wb_t dm_wb_md, // Used for C2H Only @@ -91,7 +94,7 @@ module sde_wb #(parameter bit H2C_N_C2H = 0, // 0 - C2H, 1 - H2C output logic [PCIM_LEN_WIDTH-1:0] wb_pm_awlen, output logic [PCIM_ID_WIDTH-1:0] wb_pm_awid, input pm_wb_awready, - + // Write Data to PCIM output logic wb_pm_wvalid, output logic [PCIM_DATA_WIDTH-1:0] wb_pm_wdata, @@ -117,15 +120,15 @@ module sde_wb #(parameter bit H2C_N_C2H = 0, // 0 - C2H, 1 - H2C localparam WB_STATUS_NUM_BYTES = H2C_N_C2H ? (4*4) : (5*4); // 5 DWs for C2H, 4 DWs for H2C localparam MD_PTR_WIDTH = 16; // This dictates the maximum buffer size for Write-Back Metadata - // For example, - // With MD_PTR_WIDTH = 16, the maximum number of metadata entries = 65536. + // For example, + // With MD_PTR_WIDTH = 16, the maximum number of metadata entries = 65536. // for regular type write-back metadata (16B), maximum WB buffer size = 16B * 65536 = 1MB // for compact type write-back metadata (8B) , maximum WB buffer size = 8B * 65536 = 512KB localparam WDATA_TO_SEND_WIDTH = WB_STATUS_NUM_BYTES*8 > WB_MD_WIDTH ? WB_STATUS_NUM_BYTES*8 : WB_MD_WIDTH; localparam WSTRB_TO_SEND_WIDTH = WDATA_TO_SEND_WIDTH >> 3; - - typedef enum logic [REQUESTER_WIDTH-1:0] + + typedef enum logic [REQUESTER_WIDTH-1:0] { WB_STATUS = 0, WB_METADATA = 1 @@ -140,7 +143,7 @@ module sde_wb #(parameter bit H2C_N_C2H = 0, // 0 - C2H, 1 - H2C logic md_wr_ptr_req; logic start_new_req; - + logic bresp_prealloc_avail; logic wr_done; logic do_arb; @@ -201,7 +204,7 @@ module sde_wb #(parameter bit H2C_N_C2H = 0, // 0 - C2H, 1 - H2C logic [MD_PTR_WIDTH:0] md_wr_ptr_plus1_rovr; logic md_ring_full; logic [63:0] md_wr_addr; - + logic [31:0] status_dw; logic [31:0] status_dw_q; logic [31:0] status_dw_sent; @@ -209,57 +212,57 @@ module sde_wb #(parameter bit H2C_N_C2H = 0, // 0 - C2H, 1 - H2C // Status DW Definition // 0 - Descriptor Error // 1 - Data Mover Error - // 2 - Write Back Error + // 2 - Write Back Error assign status_dw = {cfg_wb_wb_error, cfg_wb_dm_error, cfg_wb_desc_error}; assign wb_cfg_status_dw = status_dw; - + if (~H2C_N_C2H) begin - + always @(posedge clk) - if (!rst_n) + if (!rst_n) num_md_in_ring <= 0; else num_md_in_ring <= cfg_wb_md_ring_size >> WB_MD_WIDTH_BYTES_LOG2; - + assign md_wr_ptr_next_inc = md_wr_ptr + 1; assign md_wr_ptr_next_inc_rovr = md_wr_ptr_next_inc - num_md_in_ring; assign md_wr_ptr_next = md_wr_ptr_next_inc >= num_md_in_ring ? md_wr_ptr_next_inc_rovr : md_wr_ptr_next_inc; - + // assign md_wr_ptr_next_plus1 = md_wr_ptr_next + 1; // assign md_wr_ptr_next_plus1_rovr = md_wr_ptr_next_plus1 >= num_md_in_ring ? 0 : md_wr_ptr_next_plus1; - - + + // Move write pointer always @(posedge clk) if (!rst_n) begin md_wr_ptr <= 0; md_wr_ptr_req <= 0; - + // md_ring_full <= 0; end else begin - md_wr_ptr <= cfg_wb_clr_wr_ptr ? 0 : + md_wr_ptr <= cfg_wb_clr_wr_ptr ? 0 : wr_done & (req_winner == WB_METADATA) ? md_wr_ptr_next : md_wr_ptr; md_wr_ptr_req <= wr_done & (req_winner == WB_METADATA); - - // md_ring_full <= wr_done & (req_winner == WB_METADATA) ? (md_wr_ptr_next_plus1_rovr == cfg_wb_md_rd_ptr) : + + // md_ring_full <= wr_done & (req_winner == WB_METADATA) ? (md_wr_ptr_next_plus1_rovr == cfg_wb_md_rd_ptr) : // (md_wr_ptr_plus1 >= num_md_in_ring); end // else: !if(!rst_n) - + assign wb_cfg_md_wr_ptr = md_wr_ptr; - + // assign md_wr_addr = (md_wr_ptr << $clog2(WB_MD_WIDTH_BYTES)) + cfg_wb_md_ring_addr; assign md_wr_addr[WB_MD_WIDTH_BYTES_LOG2-1:0] = cfg_wb_md_ring_addr[WB_MD_WIDTH_BYTES_LOG2-1:0]; assign md_wr_addr[47:WB_MD_WIDTH_BYTES_LOG2] = md_wr_ptr + cfg_wb_md_ring_addr[47:WB_MD_WIDTH_BYTES_LOG2]; assign md_wr_addr[63:48] = 16'd0; - - + + assign md_wr_ptr_plus1 = md_wr_ptr + 1; assign md_wr_ptr_plus1_rovr = (md_wr_ptr_plus1 >= num_md_in_ring) ? 0 : md_wr_ptr_plus1; assign md_ring_full = (md_wr_ptr_plus1_rovr == cfg_wb_md_rd_ptr); end // if (~H2C_N_C2H) - + else begin assign num_md_in_ring = 0; assign md_wr_ptr = 0; @@ -299,7 +302,7 @@ end // if (~H2C_N_C2H) logic [31:0] desc_wb_cnt_diff; logic [31:0] axis_wb_pkt_cnt_diff; logic [MD_PTR_WIDTH-1:0] md_wr_ptr_diff; - + assign cfg_desc_cdt_wc_to_cnt = cfg_desc_cdt_wc_en ? cfg_wc_to_cnt : 0; assign cfg_desc_cnt_wc_to_cnt = cfg_desc_cnt_wc_en ? cfg_wc_to_cnt : 0; assign cfg_pkt_cnt_wc_to_cnt = cfg_pkt_cnt_wc_en ? cfg_wc_to_cnt : 0; @@ -309,17 +312,17 @@ end // if (~H2C_N_C2H) assign cfg_desc_cnt_wc_cnt_m1 = cfg_desc_cnt_wc_en ? cfg_wc_cnt_minus1 : 0; assign cfg_pkt_cnt_wc_cnt_m1 = cfg_pkt_cnt_wc_en ? cfg_wc_cnt_minus1 : 0; assign cfg_md_wr_ptr_wc_cnt_m1 = cfg_md_wr_ptr_wc_en ? cfg_wc_cnt_minus1 : 0; - + assign desc_wb_limit_diff = (desc_wb_limit - desc_wb_limit_q); assign desc_wb_cnt_diff = desc_wb_cnt - desc_wb_cnt_q; assign axis_wb_pkt_cnt_diff = axis_wb_pkt_cnt - axis_wb_pkt_cnt_q; - assign md_wr_ptr_diff = (md_wr_ptr >= md_wr_ptr_q) ? md_wr_ptr - md_wr_ptr_q : + assign md_wr_ptr_diff = (md_wr_ptr >= md_wr_ptr_q) ? md_wr_ptr - md_wr_ptr_q : md_wr_ptr_q - md_wr_ptr; - + always @(posedge clk) if (!rst_n) begin wc_to_tick_cnt <= 0; - + desc_cdt_req_wc_cnt <= 0; desc_cnt_req_wc_cnt <= 0; pkt_cnt_req_wc_cnt <= 0; @@ -332,19 +335,19 @@ end // if (~H2C_N_C2H) end else begin wc_to_tick_cnt <= (wc_to_tick_cnt == 0) ? cfg_wc_tick_cnt : wc_to_tick_cnt - 1; - + desc_cdt_req_wc_cnt <= desc_wb_limit_diff; - + desc_cnt_req_wc_cnt <= desc_wb_cnt_diff; - + pkt_cnt_req_wc_cnt <= axis_wb_pkt_cnt_diff; - + md_wr_ptr_req_wc_cnt <= md_wr_ptr_diff; desc_cdt_req_wc_to_cnt <= desc_wb_limit_wc_req ? 0 : (desc_cdt_req_wc_cnt > 0) & (wc_to_tick_cnt == 0) & (desc_cdt_req_wc_to_cnt < 4'hF) ? desc_cdt_req_wc_to_cnt + 1 : desc_cdt_req_wc_to_cnt; - + desc_cnt_req_wc_to_cnt <= desc_wb_cnt_wc_req ? 0 : (desc_cnt_req_wc_cnt > 0) & (wc_to_tick_cnt == 0) & (desc_cnt_req_wc_to_cnt < 4'hF) ? desc_cnt_req_wc_to_cnt + 1 : desc_cnt_req_wc_to_cnt; @@ -352,19 +355,19 @@ end // if (~H2C_N_C2H) pkt_cnt_req_wc_to_cnt <= axis_wb_pkt_cnt_wc_req ? 0 : (pkt_cnt_req_wc_cnt > 0) & (wc_to_tick_cnt == 0) & (pkt_cnt_req_wc_to_cnt < 4'hF) ? pkt_cnt_req_wc_to_cnt + 1 : pkt_cnt_req_wc_to_cnt; - - md_wr_ptr_req_wc_to_cnt <= md_wr_ptr_wc_req ? 0 : + + md_wr_ptr_req_wc_to_cnt <= md_wr_ptr_wc_req ? 0 : (md_wr_ptr_req_wc_cnt > 0) & (wc_to_tick_cnt == 0) & (md_wr_ptr_req_wc_to_cnt < 4'hF) ? md_wr_ptr_req_wc_to_cnt + 1 : md_wr_ptr_req_wc_to_cnt; - + end // else: !if(!rst_n) assign desc_wb_limit_wc_req = ((desc_cdt_req_wc_to_cnt >= cfg_wc_to_cnt) || (desc_cdt_req_wc_cnt > cfg_desc_cdt_wc_cnt_m1 )) & (desc_cdt_req_wc_cnt > 0); assign desc_wb_cnt_wc_req = ((desc_cnt_req_wc_to_cnt >= cfg_wc_to_cnt) || (desc_cnt_req_wc_cnt > cfg_desc_cnt_wc_cnt_m1 )) & (desc_cnt_req_wc_cnt > 0); assign axis_wb_pkt_cnt_wc_req = ((pkt_cnt_req_wc_to_cnt >= cfg_wc_to_cnt) || (pkt_cnt_req_wc_cnt > cfg_pkt_cnt_wc_cnt_m1 )) & (pkt_cnt_req_wc_cnt > 0); assign md_wr_ptr_wc_req = ((md_wr_ptr_req_wc_to_cnt >= cfg_wc_to_cnt) || (md_wr_ptr_req_wc_cnt > cfg_md_wr_ptr_wc_cnt_m1)) & (md_wr_ptr_req_wc_cnt > 0); - - // Request Pending + + // Request Pending always @(posedge clk) if (!rst_n) begin dm_wb_md_req_pend <= 0; @@ -375,22 +378,22 @@ end // if (~H2C_N_C2H) md_wr_ptr_req_pend <= 0; end else begin - dm_wb_md_req_pend <= wr_done & (req_winner == WB_METADATA) ? 1'b0 : + dm_wb_md_req_pend <= wr_done & (req_winner == WB_METADATA) ? 1'b0 : dm_wb_md_req & ~(md_ring_full & cfg_wb_md_ptr_en) ? 1'b1 : dm_wb_md_req_pend; status_dw_req_pend <= wr_done & (req_winner == WB_STATUS) ? 1'b0 : (status_dw_sent != status_dw) ? 1'b1 : status_dw_req_pend; - desc_cdt_req_pend <= wr_done & (req_winner == WB_STATUS) ? 1'b0 : - desc_wb_limit_wc_req & cfg_wb_desc_cdt_en & (desc_wb_limit_sent != desc_wb_limit) ? 1'b1 : + desc_cdt_req_pend <= wr_done & (req_winner == WB_STATUS) ? 1'b0 : + desc_wb_limit_wc_req & cfg_wb_desc_cdt_en & (desc_wb_limit_sent != desc_wb_limit) ? 1'b1 : desc_cdt_req_pend; - desc_cnt_req_pend <= wr_done & (req_winner == WB_STATUS) ? 1'b0 : - desc_wb_cnt_wc_req & cfg_wb_desc_cnt_en & (desc_wb_cnt_sent != desc_wb_cnt) ? 1'b1 : + desc_cnt_req_pend <= wr_done & (req_winner == WB_STATUS) ? 1'b0 : + desc_wb_cnt_wc_req & cfg_wb_desc_cnt_en & (desc_wb_cnt_sent != desc_wb_cnt) ? 1'b1 : desc_cnt_req_pend; - pkt_cnt_req_pend <= wr_done & (req_winner == WB_STATUS) ? 1'b0 : - axis_wb_pkt_cnt_wc_req & cfg_wb_pkt_cnt_en & (axis_wb_pkt_cnt_sent != axis_wb_pkt_cnt) ? 1'b1 : + pkt_cnt_req_pend <= wr_done & (req_winner == WB_STATUS) ? 1'b0 : + axis_wb_pkt_cnt_wc_req & cfg_wb_pkt_cnt_en & (axis_wb_pkt_cnt_sent != axis_wb_pkt_cnt) ? 1'b1 : pkt_cnt_req_pend; - md_wr_ptr_req_pend <= wr_done & (req_winner == WB_STATUS) ? 1'b0 : - md_wr_ptr_wc_req & cfg_wb_md_ptr_en & (md_wr_ptr_sent != md_wr_ptr) ? 1'b1 : + md_wr_ptr_req_pend <= wr_done & (req_winner == WB_STATUS) ? 1'b0 : + md_wr_ptr_wc_req & cfg_wb_md_ptr_en & (md_wr_ptr_sent != md_wr_ptr) ? 1'b1 : md_wr_ptr_req_pend; end // else: !if(!rst_n) @@ -403,7 +406,7 @@ end // if (~H2C_N_C2H) // Arbitrate between 2 requests // Round Robin arbiter assign requester_arb_in = {dm_wb_md_req_pend, status_req_pend}; - + rr_arb #(.WINNER_WIDTH(REQUESTER_WIDTH), .REQ_WIDTH (NUM_REQUESTER), .DO_ARB_IS_CHANGE_STATE(1)) REQUESTER_RR_ARB (.clk (clk), @@ -413,13 +416,13 @@ end // if (~H2C_N_C2H) .winner (requester_arb_out) ); end // else: !if(H2C_N_C2H) - + assign accept_new_wb_req = ~start_new_req & ~wr_active & ~addr_active & bresp_prealloc_avail; assign new_wb_req = dm_wb_md_req_pend || status_req_pend; - + assign do_arb = ~addr_active & start_new_req; - + always @(posedge clk) if (!rst_n) begin start_new_req <= 0; @@ -427,43 +430,43 @@ end // if (~H2C_N_C2H) req_winner <= requester_t'(0); // status_req_qual <= 0; - + // md_req_qual <= 0; end else begin start_new_req <= accept_new_wb_req & new_wb_req; - - addr_active <= addr_active & addr_done ? 1'b0 : + + addr_active <= addr_active & addr_done ? 1'b0 : start_new_req ? 1'b1 : addr_active; - + req_winner <= start_new_req ? requester_t'(requester_arb_out) : req_winner; // status_req_qual <= start_new_req ? ((desc_cdt_req_pend & (desc_wb_limit_sent != desc_wb_limit)) || // (desc_cnt_req_pend & (desc_wb_cnt_sent != desc_wb_cnt) ) || // (pkt_cnt_req_pend & (axis_wb_pkt_cnt_sent != axis_wb_pkt_cnt)) || -// (md_wr_ptr_req_pend & (md_wr_ptr_sent != md_wr_ptr))) : +// (md_wr_ptr_req_pend & (md_wr_ptr_sent != md_wr_ptr))) : // status_req_qual; // md_req_qual <= start_new_req ? (dm_wb_md_req_pend & ~(md_ring_full & cfg_wb_md_ptr_en)) : md_req_qual; end // else: !if(!rst_n) assign status_req_qual = 1; - + assign md_req_qual = 1; - + assign req_qual = (req_winner == WB_STATUS) ? status_req_qual : md_req_qual; - + assign addr_done = addr_active & (~req_qual || (wb_pm_awvalid && pm_wb_awready)); - + assign addr_pipe_write_addr = (req_winner == WB_STATUS) ? cfg_wb_status_addr : md_wr_addr; assign addr_pipe_num_bytes = (req_winner == WB_METADATA) ? WB_MD_WIDTH_BYTES : WB_STATUS_NUM_BYTES; assign addr_pipe_num_bytes_adj = addr_pipe_num_bytes + addr_pipe_write_addr[PCIM_ADDR_BYTE_IDX_WIDTH-1:0]; - assign addr_pipe_num_beats_minus1 = (|addr_pipe_num_bytes_adj[0 +: PCIM_ADDR_BYTE_IDX_WIDTH]) ? (addr_pipe_num_bytes_adj >> PCIM_ADDR_BYTE_IDX_WIDTH) : + assign addr_pipe_num_beats_minus1 = (|addr_pipe_num_bytes_adj[0 +: PCIM_ADDR_BYTE_IDX_WIDTH]) ? (addr_pipe_num_bytes_adj >> PCIM_ADDR_BYTE_IDX_WIDTH) : (addr_pipe_num_bytes_adj >> PCIM_ADDR_BYTE_IDX_WIDTH) - 1; - - always @(posedge clk) + + always @(posedge clk) if (!rst_n) begin wb_pm_awvalid <= 0; wb_pm_awaddr <= '{default:'0}; @@ -478,7 +481,7 @@ end // if (~H2C_N_C2H) wb_pm_awlen <= addr_active & req_qual ? addr_pipe_num_beats_minus1 : wb_pm_awlen; wb_pm_awid <= PCIM_WB_AWID; end // else: !if(!rst_n) - + // Write Pipe // Decide if data has to be sent // Latch new data to send @@ -491,10 +494,10 @@ end // if (~H2C_N_C2H) wr_active_re_q <= 0; end else begin - wr_active <= wr_active & wr_done ? 1'b0 : + wr_active <= wr_active & wr_done ? 1'b0 : start_new_req ? 1'b1 : wr_active; - + // req_winner <= start_new_req ? 0 : // req_winner; @@ -503,9 +506,9 @@ end // if (~H2C_N_C2H) end // else: !if(!rst_n) assign wr_active_re = wr_active & ~wr_active_q; - + // Write Data FSM - // WR_IDLE + // WR_IDLE // WR_GET_DATA // WR_REQ typedef enum logic [1:0] {WR_IDLE = 0, @@ -513,7 +516,7 @@ end // if (~H2C_N_C2H) WR_REQ = 2} wr_state_t; wr_state_t wr_state, wr_state_next; always @(posedge clk) - if (!rst_n) + if (!rst_n) wr_state <= WR_IDLE; else wr_state <= wr_state_next; @@ -522,7 +525,7 @@ end // if (~H2C_N_C2H) wr_state_next = wr_state; case (wr_state) WR_IDLE : - if (wr_active & req_qual) + if (wr_active & req_qual) wr_state_next = WR_REQ ; // WR_GET_DATA; else wr_state_next = WR_IDLE; @@ -540,14 +543,14 @@ end // if (~H2C_N_C2H) end // always_comb // Data to send - always @(posedge clk) + always @(posedge clk) if (!rst_n) begin status_dw_q <= 0; desc_wb_limit_q <= DESC_RAM_DEPTH; desc_wb_cnt_q <= 0; axis_wb_pkt_cnt_q <= 0; md_wr_ptr_q <= 0; - + // desc_wb_limit_sent <= 0; // desc_wb_cnt_sent <= 0; // axis_wb_pkt_cnt_sent <= 0; @@ -555,18 +558,18 @@ end // if (~H2C_N_C2H) else begin status_dw_q <= (req_winner == WB_STATUS) & wr_active_re & req_qual ? status_dw : status_dw_q; - desc_wb_limit_q <= cfg_desc_clr_cdt_limit ? 0 : + desc_wb_limit_q <= cfg_desc_clr_cdt_limit ? 0 : (req_winner == WB_STATUS) & wr_active_re & req_qual ? desc_wb_limit : desc_wb_limit_q; - desc_wb_cnt_q <= cfg_desc_clr_desc_cnt ? 0 : + desc_wb_cnt_q <= cfg_desc_clr_desc_cnt ? 0 : (req_winner == WB_STATUS) & wr_active_re & req_qual ? desc_wb_cnt : desc_wb_cnt_q; - axis_wb_pkt_cnt_q <= cfg_axis_clr_pkt_cnt ? 0 : + axis_wb_pkt_cnt_q <= cfg_axis_clr_pkt_cnt ? 0 : (req_winner == WB_STATUS) & wr_active_re & req_qual ? axis_wb_pkt_cnt : axis_wb_pkt_cnt_q; - md_wr_ptr_q <= cfg_wb_clr_wr_ptr ? 0 : + md_wr_ptr_q <= cfg_wb_clr_wr_ptr ? 0 : (req_winner == WB_STATUS) & wr_active_re & req_qual ? md_wr_ptr : md_wr_ptr_q; - + // desc_wb_limit_sent <= (req_winner == WB_STATUS) & (wr_state == WR_REQ) & wr_done ? desc_wb_limit_q : // desc_wb_limit_sent; // desc_wb_cnt_sent <= (req_winner == WB_STATUS) & (wr_state == WR_REQ) & wr_done ? desc_wb_cnt_q : @@ -580,28 +583,28 @@ end // if (~H2C_N_C2H) assign desc_wb_cnt_sent = desc_wb_cnt_q; assign axis_wb_pkt_cnt_sent = axis_wb_pkt_cnt_q; assign md_wr_ptr_sent = md_wr_ptr_q; - + assign dm_wb_md_comp = sde_pkg::c2h_conv_wb_reg2comp(dm_wb_md); // assign wr_pipe_num_bytes = (req_winner == WB_METADATA) ? WB_MD_WIDTH_BYTES : 4; // assign wr_pipe_num_bytes_adj = wr_pipe_num_bytes + wr_pipe_lwr_addr; -// assign wr_pipe_num_beats_minus1 = (|wr_pipe_num_bytes_adj[0 +: PCIM_WR_BYTE_IDX_WIDTH]) ? (wr_pipe_num_bytes_adj >> PCIM_WR_BYTE_IDX_WIDTH) : +// assign wr_pipe_num_beats_minus1 = (|wr_pipe_num_bytes_adj[0 +: PCIM_WR_BYTE_IDX_WIDTH]) ? (wr_pipe_num_bytes_adj >> PCIM_WR_BYTE_IDX_WIDTH) : // (wr_pipe_num_bytes_adj >> PCIM_WR_BYTE_IDX_WIDTH) - 1; assign wr_pipe_num_beats_minus1 = addr_pipe_num_beats_minus1; - + // assign wr_pipe_addr = (req_winner == WB_STATUS) ? cfg_wb_status_addr : dm_wb_md_addr; assign wr_pipe_addr = addr_pipe_write_addr; - + assign wr_pipe_lwr_addr = wr_pipe_addr[0 +: PCIM_ADDR_BYTE_IDX_WIDTH]; - - assign wb_wr_max_bytes = wr_active_re_q & req_qual ? (PCIM_DATA_WIDTH_BYTES) - wr_pipe_lwr_addr[0 +: PCIM_ADDR_BYTE_IDX_WIDTH] : + + assign wb_wr_max_bytes = wr_active_re_q & req_qual ? (PCIM_DATA_WIDTH_BYTES) - wr_pipe_lwr_addr[0 +: PCIM_ADDR_BYTE_IDX_WIDTH] : PCIM_DATA_WIDTH_BYTES; assign wb_wr_num_bytes_total = (req_winner == WB_METADATA) ? WB_MD_WIDTH_BYTES : WB_STATUS_NUM_BYTES; assign wb_wr_num_bytes_remain = wb_wr_num_bytes_total - wb_wr_num_bytes_sent; - + assign wb_wr_num_bytes_to_send = wb_wr_num_bytes_remain < wb_wr_max_bytes ? wb_wr_num_bytes_remain : wb_wr_max_bytes; // always_comb begin @@ -612,7 +615,7 @@ end // if (~H2C_N_C2H) // end // end - if (DESC_TYPE) + if (DESC_TYPE) assign wb_wr_md = dm_wb_md_comp; else assign wb_wr_md = dm_wb_md; @@ -620,52 +623,52 @@ end // if (~H2C_N_C2H) assign wb_wr_data_to_send = (req_winner == WB_STATUS) ? {md_wr_ptr_q, axis_wb_pkt_cnt_q, desc_wb_cnt_q, desc_wb_limit_q, status_dw_q} : wb_wr_md; assign wb_wr_strb_to_send = (req_winner == WB_STATUS) ? {WB_STATUS_NUM_BYTES{1'b1}} : {WB_MD_WIDTH_BYTES{1'b1}}; - + always @(posedge clk) if (!rst_n) begin wb_wr_idx <= 0; wb_wr_num_bytes_sent <= 0; - + wb_pm_wvalid <= 0; wb_pm_wdata <= '{default:'0}; wb_pm_wstrb <= '{default:'0}; wb_pm_wlast <= 0; end else begin - wb_wr_idx <= wr_active_re_q & req_qual ? 0 : + wb_wr_idx <= wr_active_re_q & req_qual ? 0 : wb_pm_wvalid & pm_wb_wready ? wb_wr_idx + 1 : wb_wr_idx; wb_wr_num_bytes_sent <= wr_active_re_q & req_qual ? wb_wr_num_bytes_to_send : - wb_pm_wvalid & wb_pm_wlast & pm_wb_wready ? 0 : + wb_pm_wvalid & wb_pm_wlast & pm_wb_wready ? 0 : wb_pm_wvalid & pm_wb_wready ? wb_wr_num_bytes_sent + wb_wr_num_bytes_to_send : wb_wr_num_bytes_sent; - + wb_pm_wvalid <= wb_pm_wvalid & pm_wb_wready & (wb_wr_idx >= wr_pipe_num_beats_minus1) ? 1'b0 : wr_active_re_q & req_qual ? 1'b1 : wb_pm_wvalid; - wb_pm_wdata <= wr_active_re_q & req_qual ? wb_wr_data_to_send << ({wr_pipe_lwr_addr, 3'd0}) : + wb_pm_wdata <= wr_active_re_q & req_qual ? wb_wr_data_to_send << ({wr_pipe_lwr_addr, 3'd0}) : wb_pm_wvalid & pm_wb_wready ? wb_wr_data_to_send >> ({wb_wr_num_bytes_sent, 3'd0}) : wb_pm_wdata; wb_pm_wstrb <= wr_active_re_q & req_qual ? wb_wr_strb_to_send << wr_pipe_lwr_addr : - wb_pm_wvalid & pm_wb_wready ? wb_wr_strb_to_send >> wb_wr_num_bytes_sent : + wb_pm_wvalid & pm_wb_wready ? wb_wr_strb_to_send >> wb_wr_num_bytes_sent : wb_pm_wstrb; - - + + wb_pm_wlast <= wr_active_re_q & req_qual ? (wr_pipe_num_beats_minus1 == 0) : - wb_pm_wvalid & pm_wb_wready ? (wb_wr_idx >= (wr_pipe_num_beats_minus1 - 1)) : + wb_pm_wvalid & pm_wb_wready ? (wb_wr_idx >= (wr_pipe_num_beats_minus1 - 1)) : wb_pm_wlast; end // else: !if(!rst_n) - + assign wr_done = wr_active & (~req_qual || (wb_pm_wvalid && wb_pm_wlast && pm_wb_wready)); assign wb_dm_md_grant = wr_done & (req_winner == WB_METADATA); - + // BRESP track FIFO - // Need room for 2 BRESP + // Need room for 2 BRESP localparam WB_BRESP_TRK_FIFO_DEPTH_MINUS1 = WB_BRESP_TRK_FIFO_DEPTH - 1; localparam WB_BRESP_TRK_FIFO_WIDTH = REQUESTER_WIDTH + PCIM_ADDR_WIDTH; @@ -677,7 +680,7 @@ end // if (~H2C_N_C2H) logic wb_bresp_trk_ff_full; logic [REQUESTER_WIDTH-1:0] wb_bresp_trk_ff_pop_requester; logic [PCIM_ADDR_WIDTH-1:0] wb_bresp_trk_ff_pop_addr; - + flop_fifo_in #(.WIDTH(WB_BRESP_TRK_FIFO_WIDTH), .DEPTH(WB_BRESP_TRK_FIFO_DEPTH) ) WB_BRESP_TRK_FIFO (.clk (clk), @@ -695,7 +698,7 @@ end // if (~H2C_N_C2H) assign wb_bresp_trk_ff_push = wr_active & wr_done & req_qual & ~wb_bresp_trk_ff_full; assign wb_bresp_trk_ff_push_data = {req_winner, wr_pipe_addr}; - + assign wb_bresp_trk_ff_pop = wb_bresp_trk_ff_valid & pm_wb_bvalid; assign {wb_bresp_trk_ff_pop_requester, wb_bresp_trk_ff_pop_addr} = wb_bresp_trk_ff_pop_data; @@ -703,16 +706,16 @@ end // if (~H2C_N_C2H) logic bresp_prealloc_avail_cnt_inc; logic bresp_prealloc_avail_cnt_dec; logic [7:0] bresp_prealloc_avail_cnt; - + assign bresp_prealloc_avail_cnt_dec = start_new_req; assign bresp_prealloc_avail_cnt_inc = wb_bresp_trk_ff_pop; - + always @(posedge clk) if (!rst_n) bresp_prealloc_avail_cnt <= WB_BRESP_TRK_FIFO_DEPTH; else - bresp_prealloc_avail_cnt <= bresp_prealloc_avail_cnt_inc & ~bresp_prealloc_avail_cnt_dec ? bresp_prealloc_avail_cnt + 1 : - ~bresp_prealloc_avail_cnt_inc & bresp_prealloc_avail_cnt_dec ? bresp_prealloc_avail_cnt - 1 : + bresp_prealloc_avail_cnt <= bresp_prealloc_avail_cnt_inc & ~bresp_prealloc_avail_cnt_dec ? bresp_prealloc_avail_cnt + 1 : + ~bresp_prealloc_avail_cnt_inc & bresp_prealloc_avail_cnt_dec ? bresp_prealloc_avail_cnt - 1 : bresp_prealloc_avail_cnt; assign bresp_prealloc_avail = (bresp_prealloc_avail_cnt > 0); @@ -728,54 +731,54 @@ end // if (~H2C_N_C2H) wb_cfg_md_bresp_err <= wb_bresp_trk_ff_pop & (wb_bresp_trk_ff_pop_requester == WB_METADATA) & (pm_wb_bresp != 2'd0); wb_cfg_sts_bresp_err <= wb_bresp_trk_ff_pop & (wb_bresp_trk_ff_pop_requester == WB_STATUS) & (pm_wb_bresp != 2'd0); end // else: !if(!rst_n) - + assign wb_pm_bready = 1; - + //Simulation checks //synopsys translate_off logic [6:0] cfg_wc_cnt; logic wr_done_q; - + assign cfg_wc_cnt = cfg_wc_cnt_minus1 + 1; - + always @(posedge clk) if (rst_n) begin wr_done_q <= wr_done; - + if (cfg_wb_desc_cnt_en & cfg_desc_cdt_wc_en & (desc_wb_limit_q != 32'h0) & ~wr_done_q & ~desc_cdt_req_pend) assert (desc_wb_limit - desc_wb_limit_q <= (cfg_wc_cnt * 2)) else begin $display("%m: *** ERROR ***: Desc Limit Write Coalesce Error. desc_wb_limit = 0x%x, desc_wb_limit_q = 0x%x, cfg_wc_cnt = 0x%x. @ %0t", desc_wb_limit, desc_wb_limit_q, cfg_wc_cnt, $time); $finish; end - + if (cfg_wb_desc_cnt_en & cfg_desc_cnt_wc_en & ~wr_done_q & ~desc_cnt_req_pend) assert (desc_wb_cnt - desc_wb_cnt_q <= (cfg_wc_cnt * 2)) else begin $display("%m: *** ERROR ***: Desc Cnt Write Coalesce Error. desc_wb_cnt = 0x%x, desc_wb_cnt_q = 0x%x, cfg_wc_cnt = 0x%x. @ %0t", desc_wb_cnt, desc_wb_cnt_q, cfg_wc_cnt, $time); $finish; end - + if (cfg_wb_pkt_cnt_en & cfg_pkt_cnt_wc_en & ~wr_done_q & ~pkt_cnt_req_pend) assert (axis_wb_pkt_cnt - axis_wb_pkt_cnt_q <= (cfg_wc_cnt * 2)) else begin $display("%m: *** ERROR ***: AXIS Pkt Count Write Coalesce Error. axis_wb_pkt_cnt = 0x%x, axis_wb_pkt_cnt_q = 0x%x, cfg_wc_cnt = 0x%x. @ %0t", axis_wb_pkt_cnt, axis_wb_pkt_cnt_q, cfg_wc_cnt, $time); $finish; end - + if (cfg_wb_md_ptr_en & cfg_md_wr_ptr_wc_en && (md_wr_ptr >= md_wr_ptr_q) & ~wr_done_q & ~md_wr_ptr_req_pend) assert (md_wr_ptr - md_wr_ptr_q <= (cfg_wc_cnt * 2)) else begin $display("%m: *** ERROR ***: Desc Limit Write Coalesce Error. md_wr_ptr = 0x%x, md_wr_ptr_q = 0x%x, cfg_wc_cnt = 0x%x. @ %0t", md_wr_ptr, md_wr_ptr_q, cfg_wc_cnt, $time); $finish; end - + end // if (rst_n) - + //synopsys translate_on `ifndef NO_SDE_DEBUG_ILA - + ila_sde_wb SDE_WB_ILA - ( + ( .clk(clk), - + // 0 - 7 .probe0(desc_wb_limit_req), .probe1(desc_wb_limit), @@ -785,8 +788,8 @@ end // if (~H2C_N_C2H) .probe5(axis_wb_pkt_cnt), .probe6(dm_wb_md_req), .probe7(wb_dm_md_grant), - - // 8 - 15 + + // 8 - 15 .probe8(wb_pm_awvalid), .probe9(wb_pm_awaddr), .probe10(pm_wb_awready), @@ -825,7 +828,7 @@ end // if (~H2C_N_C2H) .probe37(desc_cdt_req_wc_cnt), .probe38(desc_cnt_req_wc_cnt), .probe39(pkt_cnt_req_wc_cnt), - + // 40-47 .probe40(md_wr_ptr_req_wc_cnt), .probe41(desc_cdt_req_wc_to_cnt), @@ -835,16 +838,16 @@ end // if (~H2C_N_C2H) .probe45(desc_wb_limit_wc_req ), .probe46(desc_wb_cnt_wc_req ), .probe47(axis_wb_pkt_cnt_wc_req), - + // 48-55 .probe48(md_wr_ptr_wc_req ) ); - + `endif // `ifndef NO_SDE_DEBUG_ILA - - - + + + endmodule // sde_wb diff --git a/hdk/cl/examples/cl_sde/software/include/sh_dpi_tasks.h b/hdk/cl/examples/cl_sde/software/include/sh_dpi_tasks.h index 9c7a39127..f74162e62 100644 --- a/hdk/cl/examples/cl_sde/software/include/sh_dpi_tasks.h +++ b/hdk/cl/examples/cl_sde/software/include/sh_dpi_tasks.h @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + #ifndef SH_DPI_TASKS #define SH_DPI_TASKS diff --git a/hdk/cl/examples/cl_sde/software/runtime/Makefile b/hdk/cl/examples/cl_sde/software/runtime/Makefile index 04f9bd9d4..4b3a74dd9 100644 --- a/hdk/cl/examples/cl_sde/software/runtime/Makefile +++ b/hdk/cl/examples/cl_sde/software/runtime/Makefile @@ -1,6 +1,7 @@ +# ============================================================================= # Amazon FPGA Hardware Development Kit # -# Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Amazon Software License (the "License"). You may not use # this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or # implied. See the License for the specific language governing permissions and # limitations under the License. +# ============================================================================= + export TEST ?= test_sde_loopback diff --git a/hdk/cl/examples/cl_sde/software/src/test_null.c b/hdk/cl/examples/cl_sde/software/src/test_null.c index 708f5fc61..fd202fcda 100644 --- a/hdk/cl/examples/cl_sde/software/src/test_null.c +++ b/hdk/cl/examples/cl_sde/software/src/test_null.c @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,7 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ #include diff --git a/hdk/cl/examples/cl_sde/verif/README.md b/hdk/cl/examples/cl_sde/verif/README.md index 27da2cd5c..0db03cb42 100644 --- a/hdk/cl/examples/cl_sde/verif/README.md +++ b/hdk/cl/examples/cl_sde/verif/README.md @@ -1,8 +1,17 @@ -This readme provides information about the simulation environment for the cl_sde example. For more details about overall HDK simulation environment and CL bringup in simulation please refer to [RTL Simulation Guide for HDK Design Flow](../../../../docs/RTL_Simulation_Guide_for_HDK_Design_Flow.md). +# SDE CL Example Simulation -# SDE CL example simulation +## Table of Contents -The system verilog simulation tests can be run from the [$CL_DIR/verif/scripts](scripts) directory with all supported simulators. You can run each test by setting TEST=. +- [SDE CL Example Simulation](#sde-cl-example-simulation) + - [Table of Contents](#table-of-contents) + - [Overview](#overview) + - [Dump Waves](#dump-waves) + +## Overview + +This readme provides information about the simulation environment for the `cl_sde` example. For more details about overall HDK simulation environment and CL bringup in simulation please refer to [RTL Simulation Guide for HDK Design Flow](../../../../docs/RTL_Simulation_Guide_for_HDK_Design_Flow.md). + +The system verilog simulation tests can be run from the `$CL_DIR/verif/scripts/` directory with all supported simulators. You can run each test by setting `TEST=\`. ```bash cd aws-fpga @@ -11,6 +20,7 @@ cd hdk/cl/examples/cl_sde export CL_DIR=$(pwd) cd ${CL_DIR}/verif/scripts ``` + Run the tests ```bash @@ -24,6 +34,6 @@ make TEST=test_simple_h2c QUESTA=1 make TEST=test_simple_c2h QUESTA=1 ``` -# Dump Waves +## Dump Waves For information about how to dump waves with XSIM or VCS, please refer to [debugging-custom-logic-using-the-aws-hdk](../../../../docs/RTL_Simulation_Guide_for_HDK_Design_Flow.md#debugging-custom-logic-using-the-aws-hdk) diff --git a/hdk/cl/examples/cl_sde/verif/scripts/Makefile b/hdk/cl/examples/cl_sde/verif/scripts/Makefile index 71fb01491..8026c7749 100644 --- a/hdk/cl/examples/cl_sde/verif/scripts/Makefile +++ b/hdk/cl/examples/cl_sde/verif/scripts/Makefile @@ -1,6 +1,7 @@ +# ============================================================================= # Amazon FPGA Hardware Development Kit # -# Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Amazon Software License (the "License"). You may not use # this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or # implied. See the License for the specific language governing permissions and # limitations under the License. +# ============================================================================= + ifndef HDK_COMMON_DIR $(error Environment variable HDK_COMMON_DIR not set. Please source hdk_setup.sh) diff --git a/hdk/cl/examples/cl_sde/verif/scripts/Makefile.tests b/hdk/cl/examples/cl_sde/verif/scripts/Makefile.tests index 6eaf62c08..067a09d91 100644 --- a/hdk/cl/examples/cl_sde/verif/scripts/Makefile.tests +++ b/hdk/cl/examples/cl_sde/verif/scripts/Makefile.tests @@ -1,3 +1,21 @@ +# ============================================================================= +# Amazon FPGA Hardware Development Kit +# +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# +# Licensed under the Amazon Software License (the "License"). You may not use +# this file except in compliance with the License. A copy of the License is +# located at +# +# http://aws.amazon.com/asl/ +# +# or in the "license" file accompanying this file. This file is distributed on +# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or +# implied. See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================= + + test_simple_h2c: TEST=test_simple_h2c test_simple_h2c: all diff --git a/hdk/cl/examples/cl_sde/verif/scripts/top.questa.f b/hdk/cl/examples/cl_sde/verif/scripts/top.questa.f index 8bdeb5ee1..e019f523d 100644 --- a/hdk/cl/examples/cl_sde/verif/scripts/top.questa.f +++ b/hdk/cl/examples/cl_sde/verif/scripts/top.questa.f @@ -1,6 +1,7 @@ +# ============================================================================= # Amazon FPGA Hardware Development Kit # -# Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Amazon Software License (the "License"). You may not use # this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or # implied. See the License for the specific language governing permissions and # limitations under the License. +# ============================================================================= + +define+CL_NAME=cl_sde +define+NO_SDE_DEBUG_ILA diff --git a/hdk/cl/examples/cl_sde/verif/scripts/top.vcs.f b/hdk/cl/examples/cl_sde/verif/scripts/top.vcs.f index 8bdeb5ee1..e019f523d 100644 --- a/hdk/cl/examples/cl_sde/verif/scripts/top.vcs.f +++ b/hdk/cl/examples/cl_sde/verif/scripts/top.vcs.f @@ -1,6 +1,7 @@ +# ============================================================================= # Amazon FPGA Hardware Development Kit # -# Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Amazon Software License (the "License"). You may not use # this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or # implied. See the License for the specific language governing permissions and # limitations under the License. +# ============================================================================= + +define+CL_NAME=cl_sde +define+NO_SDE_DEBUG_ILA diff --git a/hdk/cl/examples/cl_sde/verif/scripts/top.xsim.f b/hdk/cl/examples/cl_sde/verif/scripts/top.xsim.f index 2447c4a76..b6df94a4c 100644 --- a/hdk/cl/examples/cl_sde/verif/scripts/top.xsim.f +++ b/hdk/cl/examples/cl_sde/verif/scripts/top.xsim.f @@ -1,6 +1,7 @@ +# ============================================================================= # Amazon FPGA Hardware Development Kit # -# Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Amazon Software License (the "License"). You may not use # this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or # implied. See the License for the specific language governing permissions and # limitations under the License. +# ============================================================================= + -define CL_NAME=cl_sde -define NO_SDE_DEBUG_ILA diff --git a/hdk/cl/examples/cl_sde/verif/scripts/waves.tcl b/hdk/cl/examples/cl_sde/verif/scripts/waves.tcl index 4b14d0da6..584895d66 100644 --- a/hdk/cl/examples/cl_sde/verif/scripts/waves.tcl +++ b/hdk/cl/examples/cl_sde/verif/scripts/waves.tcl @@ -1,6 +1,7 @@ +# ============================================================================= # Amazon FPGA Hardware Development Kit # -# Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Amazon Software License (the "License"). You may not use # this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or # implied. See the License for the specific language governing permissions and # limitations under the License. +# ============================================================================= + set curr_wave [current_wave_config] if { [string length $curr_wave] == 0 } { @@ -23,5 +26,5 @@ if { [string length $curr_wave] == 0 } { } } -run 200 us +run 200 us quit diff --git a/hdk/cl/examples/cl_sde/verif/tests/test_base.inc b/hdk/cl/examples/cl_sde/verif/tests/test_base.inc index 7f00e2d3c..f9902f1de 100644 --- a/hdk/cl/examples/cl_sde/verif/tests/test_base.inc +++ b/hdk/cl/examples/cl_sde/verif/tests/test_base.inc @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + `include "common_base_test.svh" @@ -102,11 +105,11 @@ int cfg_err_cnt_finish = 1; //How many errors before kill simulatino bit cfg_perf_mon; logic [5:0] cfg_wc_cnt = 6'd0; -logic cfg_md_wr_ptr_wc_en = 1; -logic cfg_pkt_cnt_wc_en = 1; -logic cfg_desc_cnt_wc_en = 1; -logic cfg_desc_cdt_wc_en = 1; -logic [3:0] cfg_wc_to_cnt = 4'd0; +logic cfg_md_wr_ptr_wc_en = 1; +logic cfg_pkt_cnt_wc_en = 1; +logic cfg_desc_cnt_wc_en = 1; +logic cfg_desc_cdt_wc_en = 1; +logic [3:0] cfg_wc_to_cnt = 4'd0; logic [19:0] cfg_wc_to_rsln = 20'd0; logic [3:0] cfg_wc_cnt_min = 6'd0; @@ -165,14 +168,14 @@ begin if (exp_c2h_pkt_q.size()==0) begin $display($time,,,"TB_C2H_AutoCheck: ***FATAL*** Got a C2H packet in host, but expect queue is empty"); - end + end else begin cur_c2h_stream_pkt = exp_c2h_pkt_q.pop_front(); cur_c2h_stream_pkt_user = exp_c2h_pkt_user_q.pop_front(); $display($time,,,"C2H Auto Check, RXPkt:Length=0x%0x, Data=0x%0x, ExpQ:Length=0x%0x, ExpQ:Data=0x%0x, ExpQ:User=0x%x", cur_c2h_host_pkt.data.size(), {cur_c2h_host_pkt.data[3], cur_c2h_host_pkt.data[2], cur_c2h_host_pkt.data[1], cur_c2h_host_pkt.data[0]}, cur_c2h_stream_pkt.data.size(), {cur_c2h_stream_pkt.data[3], cur_c2h_stream_pkt.data[2], cur_c2h_stream_pkt.data[1], cur_c2h_stream_pkt.data[0]}, cur_c2h_host_pkt_user); - c2h_err_cnt += cur_c2h_host_pkt.compare(cur_c2h_stream_pkt); + c2h_err_cnt += cur_c2h_host_pkt.compare(cur_c2h_stream_pkt); if ((cfg_desc_type==0) && (cur_c2h_stream_pkt_user != cur_c2h_host_pkt_user)) begin @@ -183,7 +186,7 @@ begin //begin // $display($time,,,"C2H Auto Check: user OK. Expected=0x%x, Actual=0x%x", cur_c2h_stream_pkt_user, cur_c2h_host_pkt_user); //end - + end end end @@ -196,7 +199,7 @@ end //--------------------------------- //Auto checking of H2C packets -always +always begin:h2c_auto_check logic[31:0] rdata; automatic logic[15:0] srm_inp_wr_ptr = 0; @@ -213,7 +216,7 @@ begin:h2c_auto_check logic[63:0] exp_rx_user; - + logic[(1 + 64 + 64 + 512)-1:0] ins_fifo_data; @@ -309,15 +312,15 @@ begin:h2c_auto_check srm_inp_rd_ptr = (srm_inp_rd_ptr + 1) & ((1 << `SRM_PATH.INP_PTR_WIDTH) - 1); end end - end + end end end // End H2C self checking //---------------------------- - + //----------------------------------------------------------------------------------------------- -// Random descriptor class, this will randomize offset/length of descriptor based on +// Random descriptor class, this will randomize offset/length of descriptor based on // test setup. //----------------------------------------------------------------------------------------------- class rnd_desc; @@ -329,13 +332,13 @@ class rnd_desc; int max_offset; int min_length; int max_length; - + int page_size; int pkt_length; int accum_length; - constraint default_c { + constraint default_c { offset + length <= page_size; offset + length <= pkt_length - accum_length; offset >= min_offset; @@ -348,7 +351,7 @@ class rnd_desc; eop == ((accum_length + length) == pkt_length); } - + function new (int min_offset=cfg_desc_offset_min, int max_offset=cfg_desc_offset_max, int min_length=cfg_desc_length_min, int max_length=cfg_desc_length_max, int page_size=cfg_page_size, int pkt_length=0, int accum_length=0); @@ -368,7 +371,7 @@ class rnd_desc; endclass //---------------------------------------- -// Thread to send H2C packets +// Thread to send H2C packets //---------------------------------------- task post_h2c_desc_thread; @@ -437,7 +440,7 @@ begin end $display($time,,,"TX_PKT[%0d]: Length=0x%0x (%0d), User=0x%x", pkt_count, cur_pkt_length, cur_pkt_length, cur_pkt_user); - + desc_count = 0; accum_length = 0; @@ -445,7 +448,7 @@ begin rd.accum_length = accum_length; //Create descriptors for the packet. Accum length of the descriptors until satisfy packet length - while (accum_length> 1)-1)]; assign watermark = fifo_valid[cfg_watermark]; - -endmodule - +endmodule diff --git a/hdk/common/lib/flop_fifo_in.sv b/hdk/common/lib/flop_fifo_in.sv index 165cbd389..7551b3920 100644 --- a/hdk/common/lib/flop_fifo_in.sv +++ b/hdk/common/lib/flop_fifo_in.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,7 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ // flop_fifo_in : Flops the input data right away @@ -61,13 +63,13 @@ module flop_fifo_in #(// -------------------------------------------------- localparam LESS_RST_LOCAL = 1; `else localparam LESS_RST_LOCAL = LESS_RST; -`endif - +`endif + // For every push, keep pushing data into the ff_fifo array // For pop's there is no change generate if (LESS_RST_LOCAL == 1) begin - + always @(posedge clk) begin for (int i = 0; i < DEPTH; i++) begin if (push) begin @@ -81,9 +83,9 @@ module flop_fifo_in #(// -------------------------------------------------- end // for (int i = 0; i < DEPTH; i++) end // always @ (posedge clk) end // if (LESS_RST_LOCAL == 1) - + else begin - + always @(posedge clk or negedge rst_n) if (!rst_n) begin ff_fifo <= '{default:'0}; @@ -103,18 +105,18 @@ module flop_fifo_in #(// -------------------------------------------------- ff_fifo[i] <= ff_fifo[i]; end // for (int i = 0; i < DEPTH; i++) end // else: !if(!rst_n) - + end // if !(LESS_RST_LOCAL == 1) endgenerate - + // For push & ~pop, valid[0] gets 1. every thing else shifts. // For ~push & pop, the most significant valid gets invalidated // For push & pop, valid array stays the same generate - + if (LESS_RST_LOCAL == 1) begin - + always @(posedge clk) if (!rst_n || !sync_rst_n) begin ff_valid <= '{default:'0}; @@ -139,9 +141,9 @@ module flop_fifo_in #(// -------------------------------------------------- end // else: !if(!rst_n) end // if (LESS_RST_LOCAL == 1) - + else begin - + always @(posedge clk or negedge rst_n) if (!rst_n) begin ff_valid <= '{default:'0}; @@ -171,16 +173,16 @@ module flop_fifo_in #(// -------------------------------------------------- end // else: !if(LESS_RST_LOCAL == 1) endgenerate - + // Output data is the most significant data (oldest data) always_comb begin ss_pop_data = ({WIDTH{1'b0}}); for (int i = 0; i < DEPTH; i++) begin - if (ff_valid[i]) + if (ff_valid[i]) ss_pop_data = ff_fifo[i]; end end - + // Data is valid as long as entry 0 is valid assign ss_data_valid = ff_valid[0]; @@ -198,7 +200,7 @@ module flop_fifo_in #(// -------------------------------------------------- end ff_pop_data <= ss_pop_data; end - + end // if (LESS_RST_LOCAL == 1) else begin @@ -232,5 +234,3 @@ module flop_fifo_in #(// -------------------------------------------------- assign watermark = ff_valid[cfg_watermark]; endmodule // epipe_flop_fifo - - diff --git a/hdk/common/lib/ft_fifo.v b/hdk/common/lib/ft_fifo.v index 146d312b4..eb03407d9 100644 --- a/hdk/common/lib/ft_fifo.v +++ b/hdk/common/lib/ft_fifo.v @@ -1,28 +1,24 @@ -//---------------------------------------------------------------------------------- -//Copyright (c) 2014 +// ============================================================================ +// Amazon FPGA Hardware Development Kit // -//Permission is hereby granted, free of charge, to any person obtaining a copy -//of this software and associated documentation files (the "Software"), to deal -//in the Software without restriction, including without limitation the rights -//to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -//copies of the Software, and to permit persons to whom the Software is -//furnished to do so, subject to the following conditions: +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // -//The above copyright notice and this permission notice shall be included in -//all copies or substantial portions of the Software. +// Licensed under the Amazon Software License (the "License"). You may not use +// this file except in compliance with the License. A copy of the License is +// located at // -//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -//IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -//FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -//AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -//LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -//OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -//THE SOFTWARE. -//---------------------------------------------------------------------------------- +// http://aws.amazon.com/asl/ +// +// or in the "license" file accompanying this file. This file is distributed on +// an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or +// implied. See the License for the specific language governing permissions and +// limitations under the License. +// ============================================================================ + //------------------------------------------------------------------------------ -// Description : -// +// Description : +// // This is a flow-through FIFO that converts a RAM-based FIFO (1 clock // latency on the RAM) to what looks like a flop based FIFO. There is // no delay between pop and getting the next data. This sometimes simplifies @@ -49,7 +45,7 @@ module ft_fifo ( parameter FIFO_WIDTH = 32; parameter LESS_RST = 0; - + input clk; //Global clock input rst_n; //Global reset @@ -79,20 +75,20 @@ assign ram_pop = !ram_fifo_empty && (!ft1_valid||ft_pop) && (!ft0_valid||!ram_po if (LESS_RST == 1) begin always @(posedge clk) - ram_pop_q <= ram_pop; + ram_pop_q <= ram_pop; end else begin - + always @(negedge rst_n or posedge clk) if (!rst_n) - ram_pop_q <= 0; + ram_pop_q <= 0; else - ram_pop_q <= ram_pop; + ram_pop_q <= ram_pop; end // else: !if(LESS_RST) endgenerate - + assign nxt_ft0 = (ram_pop_q && !ft0_valid)? {1'b1, ram_fifo_data}: ft0; assign nxt_ft1 = (ram_pop_q && ft0_valid )? {1'b1, ram_fifo_data}: ft1; @@ -100,7 +96,7 @@ always @(negedge rst_n or posedge clk) if (!rst_n) begin ft0[FIFO_WIDTH] <= 'h0; - ft1[FIFO_WIDTH] <= 'h0; + ft1[FIFO_WIDTH] <= 'h0; end else if (!sync_rst_n) begin @@ -113,14 +109,14 @@ always @(negedge rst_n or posedge clk) ft1[FIFO_WIDTH] <= 'h0; end else - begin + begin ft0[FIFO_WIDTH] <= nxt_ft0[FIFO_WIDTH]; ft1[FIFO_WIDTH] <= nxt_ft1[FIFO_WIDTH]; end generate if (LESS_RST == 1) begin - + always @(posedge clk) if (ft_pop) begin @@ -128,20 +124,20 @@ always @(negedge rst_n or posedge clk) ft1[FIFO_WIDTH-1:0] <= ft1[FIFO_WIDTH-1:0]; end else - begin + begin ft0[FIFO_WIDTH-1:0] <= nxt_ft0[FIFO_WIDTH-1:0]; ft1[FIFO_WIDTH-1:0] <= nxt_ft1[FIFO_WIDTH-1:0]; end end // if (LESS_RST) - + else begin - + always @(negedge rst_n or posedge clk) if (!rst_n) begin ft0[FIFO_WIDTH-1:0] <= 'h0; - ft1[FIFO_WIDTH-1:0] <= 'h0; + ft1[FIFO_WIDTH-1:0] <= 'h0; end else if (!sync_rst_n) begin @@ -154,16 +150,15 @@ always @(negedge rst_n or posedge clk) ft1[FIFO_WIDTH-1:0] <= ft1[FIFO_WIDTH-1:0]; end else - begin + begin ft0[FIFO_WIDTH-1:0] <= nxt_ft0[FIFO_WIDTH-1:0]; ft1[FIFO_WIDTH-1:0] <= nxt_ft1[FIFO_WIDTH-1:0]; end end // else: !if(LESS_RST) endgenerate - - + + assign {ft_valid, ft_data} = ft0; endmodule - diff --git a/hdk/common/lib/ft_fifo_p.v b/hdk/common/lib/ft_fifo_p.v index e92a442a2..59a5f4fb1 100644 --- a/hdk/common/lib/ft_fifo_p.v +++ b/hdk/common/lib/ft_fifo_p.v @@ -1,28 +1,24 @@ -//---------------------------------------------------------------------------------- -//Copyright (c) 2014 +// ============================================================================ +// Amazon FPGA Hardware Development Kit // -//Permission is hereby granted, free of charge, to any person obtaining a copy -//of this software and associated documentation files (the "Software"), to deal -//in the Software without restriction, including without limitation the rights -//to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -//copies of the Software, and to permit persons to whom the Software is -//furnished to do so, subject to the following conditions: +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // -//The above copyright notice and this permission notice shall be included in -//all copies or substantial portions of the Software. +// Licensed under the Amazon Software License (the "License"). You may not use +// this file except in compliance with the License. A copy of the License is +// located at // -//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -//IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -//FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -//AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -//LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -//OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -//THE SOFTWARE. -//---------------------------------------------------------------------------------- +// http://aws.amazon.com/asl/ +// +// or in the "license" file accompanying this file. This file is distributed on +// an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or +// implied. See the License for the specific language governing permissions and +// limitations under the License. +// ============================================================================ + //------------------------------------------------------------------------------ -// Description : -// +// Description : +// // This is a flow-through FIFO that converts a RAM-based FIFO (2 clock // latency on the RAM) to what looks like a flop based FIFO. There is // no delay between pop and getting the next data. This sometimes simplifies @@ -52,7 +48,7 @@ module ft_fifo_p ( parameter FIFO_WIDTH = 32; parameter LESS_RST = 0; - + input clk; //Global clock input rst_n; //Global reset @@ -98,40 +94,40 @@ always @(negedge rst_n or posedge clk) endcase end - generate + generate if (LESS_RST == 1) begin always @(posedge clk) begin - ram_pop_q <= ram_pop; + ram_pop_q <= ram_pop; ram_pop_qq <= ram_pop_q; end end // if (LESS_RST) - + else begin - + always @(negedge rst_n or posedge clk) if (!rst_n) begin - ram_pop_q <= 0; + ram_pop_q <= 0; ram_pop_qq <= 0; end else begin - ram_pop_q <= ram_pop; + ram_pop_q <= ram_pop; ram_pop_qq <= ram_pop_q; end - + end // else: !if(LESS_RST) endgenerate - + assign nxt_ft0 = (ram_pop_qq && !ft0_valid)? {1'b1, ram_fifo_data}: ft0; assign nxt_ft1 = (ram_pop_qq && ft0_valid && !ft1_valid )? {1'b1, ram_fifo_data}: ft1; assign nxt_ft2 = (ram_pop_qq && ft1_valid && !ft2_valid )? {1'b1, ram_fifo_data}: ft2; generate - + if (LESS_RST == 1) begin @@ -139,8 +135,8 @@ assign nxt_ft2 = (ram_pop_qq && ft1_valid && !ft2_valid )? {1'b1, ram_fifo_data} if (!rst_n) begin ft0[FIFO_WIDTH] <= 'h0; - ft1[FIFO_WIDTH] <= 'h0; - ft2[FIFO_WIDTH] <= 'h0; + ft1[FIFO_WIDTH] <= 'h0; + ft2[FIFO_WIDTH] <= 'h0; end else if (!sync_rst_n) begin @@ -155,12 +151,12 @@ assign nxt_ft2 = (ram_pop_qq && ft1_valid && !ft2_valid )? {1'b1, ram_fifo_data} ft2[FIFO_WIDTH] <= 'h0; end else - begin + begin ft0[FIFO_WIDTH] <= nxt_ft0[FIFO_WIDTH]; ft1[FIFO_WIDTH] <= nxt_ft1[FIFO_WIDTH]; ft2[FIFO_WIDTH] <= nxt_ft2[FIFO_WIDTH]; end - + always @(posedge clk) if (qual_ft_pop) begin @@ -169,22 +165,22 @@ assign nxt_ft2 = (ram_pop_qq && ft1_valid && !ft2_valid )? {1'b1, ram_fifo_data} ft2[FIFO_WIDTH-1:0] <= ft2[FIFO_WIDTH-1:0]; end else - begin + begin ft0[FIFO_WIDTH-1:0] <= nxt_ft0[FIFO_WIDTH-1:0]; ft1[FIFO_WIDTH-1:0] <= nxt_ft1[FIFO_WIDTH-1:0]; ft2[FIFO_WIDTH-1:0] <= nxt_ft2[FIFO_WIDTH-1:0]; end end // if (LESS_RST) - + else begin always @(negedge rst_n or posedge clk) if (!rst_n) begin ft0 <= 0; - ft1 <= 0; - ft2 <= 0; + ft1 <= 0; + ft2 <= 0; end else if (!sync_rst_n) begin @@ -199,7 +195,7 @@ assign nxt_ft2 = (ram_pop_qq && ft1_valid && !ft2_valid )? {1'b1, ram_fifo_data} ft2 <= 0; end else - begin + begin ft0 <= nxt_ft0; ft1 <= nxt_ft1; ft2 <= nxt_ft2; @@ -208,7 +204,7 @@ assign nxt_ft2 = (ram_pop_qq && ft1_valid && !ft2_valid )? {1'b1, ram_fifo_data} end // else: !if(LESS_RST) endgenerate - + assign {ft_valid, ft_data} = ft0; @@ -220,7 +216,7 @@ assign {ft_valid, ft_data} = ft0; `ifdef DESIGN_ERROR `include "design_error.inc" reg[1:0] num_valid_q; - + always @(posedge clk) begin if (!ft0_valid && ft_pop) begin @@ -241,4 +237,3 @@ end //synopsys translate_on endmodule - diff --git a/hdk/common/lib/hbm_wrapper.sv b/hdk/common/lib/hbm_wrapper.sv index 9b68f0364..08413d9a2 100644 --- a/hdk/common/lib/hbm_wrapper.sv +++ b/hdk/common/lib/hbm_wrapper.sv @@ -1,7 +1,7 @@ -//------------------------------------------------------------------------------------------------------------------------------- +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -13,9 +13,9 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. -// Restricted NDA Material -//------------------------------------------------------------------------------------------------------------------------------- -//=============================================================================================================================== +// ============================================================================ + + // HBM Wrapper // - Wrapper for HBM IP // - Implements an MMCM to generate 100MHz and 450MHz clock for the HBM IP. @@ -35,8 +35,6 @@ // // Poll for lock // poll bits[3:1] = 3'b111 @ addr 0x00 // -// -//=============================================================================================================================== module hbm_wrapper #( diff --git a/hdk/common/lib/interfaces.sv b/hdk/common/lib/interfaces.sv index 9dca2718f..ca0679b1b 100644 --- a/hdk/common/lib/interfaces.sv +++ b/hdk/common/lib/interfaces.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,7 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ // Interfaces diff --git a/hdk/common/lib/lib_pipe.sv b/hdk/common/lib/lib_pipe.sv index 41466ee20..ffc39c59b 100644 --- a/hdk/common/lib/lib_pipe.sv +++ b/hdk/common/lib/lib_pipe.sv @@ -1,24 +1,20 @@ -//---------------------------------------------------------------------------------- -//Copyright (c) 2014 +// ============================================================================ +// Amazon FPGA Hardware Development Kit // -//Permission is hereby granted, free of charge, to any person obtaining a copy -//of this software and associated documentation files (the "Software"), to deal -//in the Software without restriction, including without limitation the rights -//to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -//copies of the Software, and to permit persons to whom the Software is -//furnished to do so, subject to the following conditions: +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // -//The above copyright notice and this permission notice shall be included in -//all copies or substantial portions of the Software. +// Licensed under the Amazon Software License (the "License"). You may not use +// this file except in compliance with the License. A copy of the License is +// located at // -//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -//IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -//FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -//AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -//LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -//OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -//THE SOFTWARE. -//---------------------------------------------------------------------------------- +// http://aws.amazon.com/asl/ +// +// or in the "license" file accompanying this file. This file is distributed on +// an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or +// implied. See the License for the specific language governing permissions and +// limitations under the License. +// ============================================================================ + //simple pipeline diff --git a/hdk/common/lib/macros.svh b/hdk/common/lib/macros.svh index 83b0d5f46..bb6045502 100644 --- a/hdk/common/lib/macros.svh +++ b/hdk/common/lib/macros.svh @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + `ifndef _MACROS_SVH_ `define _MACROS_SVH_ @@ -596,7 +599,7 @@ ``master``user = ``slave``user; \ \ ``slave``ack = ``master``ack; \ - ``slave``rdata = ``master``rdata; + ``slave``rdata = ``master``rdata; //bus_name is the port on the instace, if_name is the interface name to connect to `define EXP_CONNECT_AXI_BUS(port_name, if_name) \ diff --git a/hdk/common/lib/ram_fifo_ft.sv b/hdk/common/lib/ram_fifo_ft.sv index 23322cd82..62a3891c4 100644 --- a/hdk/common/lib/ram_fifo_ft.sv +++ b/hdk/common/lib/ram_fifo_ft.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,7 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ //-------------------------------------------------------------------------------------------- @@ -35,7 +37,7 @@ module ram_fifo_ft #(parameter WIDTH=32, parameter PTR_WIDTH=7, parameter WATERM output logic oflow, output logic empty //Because of ft_fifo empty is different than !valid. Should only be used - // to see if FIFO is not + // to see if FIFO is not ); parameter[31:0] NUM_LOC = 1'b1 << PTR_WIDTH; @@ -48,7 +50,7 @@ logic[PTR_WIDTH:0] wptr = 0; logic[PTR_WIDTH:0] rptr = 0; logic[PTR_WIDTH:0] num_entries; //Tracks entries in the combined RAM/FT FIFOs -logic[PTR_WIDTH:0] num_entries_nxt; +logic[PTR_WIDTH:0] num_entries_nxt; wire[PTR_WIDTH:0] ptr_diff = wptr - rptr; @@ -74,7 +76,7 @@ always_comb begin if (!rst_n) num_entries_nxt = 0; - else + else num_entries_nxt = num_entries + (push & !fifo_full) - (pop & valid); end @@ -111,7 +113,7 @@ ft_fifo_p #(.FIFO_WIDTH(WIDTH), .LESS_RST(LESS_RST)) FT_FIFO ( .ft_pop(pop), .ram_pop(ram_pop), - + .ft_valid(valid), .ft_data(pop_data) ); @@ -128,11 +130,11 @@ ft_fifo #(.FIFO_WIDTH(WIDTH), .LESS_RST(LESS_RST)) FT_FIFO ( .ft_pop(pop), .ram_pop(ram_pop), - + .ft_valid(valid), .ft_data(pop_data) ); - + always @(negedge rst_n or posedge clk) if (!rst_n) oflow <= 0; @@ -140,5 +142,3 @@ always @(negedge rst_n or posedge clk) oflow <= 1; endmodule - - diff --git a/hdk/common/lib/rr_arb.sv b/hdk/common/lib/rr_arb.sv index 42df12a23..e3f985308 100644 --- a/hdk/common/lib/rr_arb.sv +++ b/hdk/common/lib/rr_arb.sv @@ -1,24 +1,20 @@ -//---------------------------------------------------------------------------------- -//Copyright (c) 2014 +// ============================================================================ +// Amazon FPGA Hardware Development Kit // -//Permission is hereby granted, free of charge, to any person obtaining a copy -//of this software and associated documentation files (the "Software"), to deal -//in the Software without restriction, including without limitation the rights -//to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -//copies of the Software, and to permit persons to whom the Software is -//furnished to do so, subject to the following conditions: +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // -//The above copyright notice and this permission notice shall be included in -//all copies or substantial portions of the Software. +// Licensed under the Amazon Software License (the "License"). You may not use +// this file except in compliance with the License. A copy of the License is +// located at // -//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -//IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -//FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -//AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -//LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -//OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -//THE SOFTWARE. -//---------------------------------------------------------------------------------- +// http://aws.amazon.com/asl/ +// +// or in the "license" file accompanying this file. This file is distributed on +// an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or +// implied. See the License for the specific language governing permissions and +// limitations under the License. +// ============================================================================ + //------------------------------------------------------------- // This is a simple round robin arbiter. Runs every clock @@ -39,7 +35,7 @@ module rr_arb #( parameter WINNER_WIDTH=3, //Number of bi -wire[WINNER_WIDTH-1:0] hi_pri; //Next hi priority +wire[WINNER_WIDTH-1:0] hi_pri; //Next hi priority wire[REQ_WIDTH-1:0] req_shifted; //Shift request based on hi_pri reg[WINNER_WIDTH-1:0] winner_q; @@ -90,5 +86,3 @@ always_ff @(negedge rst_n or posedge clk) assign hi_pri = (winner_q==(REQ_WIDTH-1))? 0: winner_q + 1; endmodule - - diff --git a/hdk/common/lib/srl_fifo.sv b/hdk/common/lib/srl_fifo.sv index ac227f63d..99fa82560 100644 --- a/hdk/common/lib/srl_fifo.sv +++ b/hdk/common/lib/srl_fifo.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,7 +13,7 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. - +// ============================================================================ // Descriptions: @@ -157,6 +158,3 @@ module srl_fifo #(parameter WIDTH = 64, endmodule // srl_fifo - - - diff --git a/hdk/common/lib/xpm_fifo.sv b/hdk/common/lib/xpm_fifo.sv index 294153f73..33f295fbb 100644 --- a/hdk/common/lib/xpm_fifo.sv +++ b/hdk/common/lib/xpm_fifo.sv @@ -1,12 +1,24 @@ -//============================================================================= -// Copyright 2022 Amazon.com, Inc. or its affiliates. -// All Rights Reserved Worldwide. -// Amazon Confidential information -// Restricted NDA Material -//============================================================================= +// ============================================================================ +// Amazon FPGA Hardware Development Kit +// +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// +// Licensed under the Amazon Software License (the "License"). You may not use +// this file except in compliance with the License. A copy of the License is +// located at +// +// http://aws.amazon.com/asl/ +// +// or in the "license" file accompanying this file. This file is distributed on +// an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or +// implied. See the License for the specific language governing permissions and +// limitations under the License. +// ============================================================================ + // Synchronous clock FIFO + module xpm_fifo #( parameter DATA_WIDTH = 32, diff --git a/hdk/common/shell_stable/build/constraints/bitstream_physical.xdc b/hdk/common/shell_stable/build/constraints/bitstream_physical.xdc index 148f368ff..47a9ed6e9 100644 --- a/hdk/common/shell_stable/build/constraints/bitstream_physical.xdc +++ b/hdk/common/shell_stable/build/constraints/bitstream_physical.xdc @@ -1,8 +1,18 @@ # ============================================================================= -# Copyright 2021 Amazon.com, Inc. or its affiliates. -# All Rights Reserved Worldwide. -# Amazon Confidential information -# Restricted NDA Material +# Amazon FPGA Hardware Development Kit +# +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# +# Licensed under the Amazon Software License (the "License"). You may not use +# this file except in compliance with the License. A copy of the License is +# located at +# +# http://aws.amazon.com/asl/ +# +# or in the "license" file accompanying this file. This file is distributed on +# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or +# implied. See the License for the specific language governing permissions and +# limitations under the License. # ============================================================================= diff --git a/hdk/common/shell_stable/build/constraints/cl_ddr_timing_aws.xdc b/hdk/common/shell_stable/build/constraints/cl_ddr_timing_aws.xdc index 72bdc673f..e3ff29fef 100644 --- a/hdk/common/shell_stable/build/constraints/cl_ddr_timing_aws.xdc +++ b/hdk/common/shell_stable/build/constraints/cl_ddr_timing_aws.xdc @@ -1,3 +1,21 @@ +# ============================================================================= +# Amazon FPGA Hardware Development Kit +# +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# +# Licensed under the Amazon Software License (the "License"). You may not use +# this file except in compliance with the License. A copy of the License is +# located at +# +# http://aws.amazon.com/asl/ +# +# or in the "license" file accompanying this file. This file is distributed on +# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or +# implied. See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================= + + ############################################################################### # This contains the specific constraints required by AWS ############################################################################### diff --git a/hdk/common/shell_stable/build/constraints/cl_pins.xdc b/hdk/common/shell_stable/build/constraints/cl_pins.xdc index 732463845..38c599abe 100644 --- a/hdk/common/shell_stable/build/constraints/cl_pins.xdc +++ b/hdk/common/shell_stable/build/constraints/cl_pins.xdc @@ -1,8 +1,18 @@ # ============================================================================= -# Copyright 2021 Amazon.com, Inc. or its affiliates. -# All Rights Reserved Worldwide. -# Amazon Confidential information -# Restricted NDA Material +# Amazon FPGA Hardware Development Kit +# +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# +# Licensed under the Amazon Software License (the "License"). You may not use +# this file except in compliance with the License. A copy of the License is +# located at +# +# http://aws.amazon.com/asl/ +# +# or in the "license" file accompanying this file. This file is distributed on +# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or +# implied. See the License for the specific language governing permissions and +# limitations under the License. # ============================================================================= diff --git a/hdk/common/shell_stable/build/constraints/mmcm_cascade.xdc b/hdk/common/shell_stable/build/constraints/mmcm_cascade.xdc index 875e71534..2ba2fb3ae 100644 --- a/hdk/common/shell_stable/build/constraints/mmcm_cascade.xdc +++ b/hdk/common/shell_stable/build/constraints/mmcm_cascade.xdc @@ -1,10 +1,21 @@ # ============================================================================= -# Copyright 2021 Amazon.com, Inc. or its affiliates. -# All Rights Reserved Worldwide. -# Amazon Confidential information -# Restricted NDA Material +# Amazon FPGA Hardware Development Kit +# +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# +# Licensed under the Amazon Software License (the "License"). You may not use +# this file except in compliance with the License. A copy of the License is +# located at +# +# http://aws.amazon.com/asl/ +# +# or in the "license" file accompanying this file. This file is distributed on +# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or +# implied. See the License for the specific language governing permissions and +# limitations under the License. # ============================================================================= + ############################################################################### # Need this as a workaround for MMCM cascading when using AWS_CLK_GEN IP ############################################################################### diff --git a/hdk/common/shell_stable/build/constraints/small_shell_level_1_fp_cl.xdc b/hdk/common/shell_stable/build/constraints/small_shell_level_1_fp_cl.xdc index 9e2f9f2e6..1d7fa1ca2 100644 --- a/hdk/common/shell_stable/build/constraints/small_shell_level_1_fp_cl.xdc +++ b/hdk/common/shell_stable/build/constraints/small_shell_level_1_fp_cl.xdc @@ -1,8 +1,18 @@ # ============================================================================= -# Copyright 2021 Amazon.com, Inc. or its affiliates. -# All Rights Reserved Worldwide. -# Amazon Confidential information -# Restricted NDA Material +# Amazon FPGA Hardware Development Kit +# +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# +# Licensed under the Amazon Software License (the "License"). You may not use +# this file except in compliance with the License. A copy of the License is +# located at +# +# http://aws.amazon.com/asl/ +# +# or in the "license" file accompanying this file. This file is distributed on +# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or +# implied. See the License for the specific language governing permissions and +# limitations under the License. # ============================================================================= diff --git a/hdk/common/shell_stable/build/constraints/xdma_shell_level_1_fp_cl.xdc b/hdk/common/shell_stable/build/constraints/xdma_shell_level_1_fp_cl.xdc index 24779b6e0..b016e35fd 100644 --- a/hdk/common/shell_stable/build/constraints/xdma_shell_level_1_fp_cl.xdc +++ b/hdk/common/shell_stable/build/constraints/xdma_shell_level_1_fp_cl.xdc @@ -1,8 +1,18 @@ # ============================================================================= -# Copyright 2021 Amazon.com, Inc. or its affiliates. -# All Rights Reserved Worldwide. -# Amazon Confidential information -# Restricted NDA Material +# Amazon FPGA Hardware Development Kit +# +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# +# Licensed under the Amazon Software License (the "License"). You may not use +# this file except in compliance with the License. A copy of the License is +# located at +# +# http://aws.amazon.com/asl/ +# +# or in the "license" file accompanying this file. This file is distributed on +# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or +# implied. See the License for the specific language governing permissions and +# limitations under the License. # ============================================================================= diff --git a/hdk/common/shell_stable/build/scripts/aws_build_dcp_from_cl.py b/hdk/common/shell_stable/build/scripts/aws_build_dcp_from_cl.py index 4791cbfb4..9d4357808 100755 --- a/hdk/common/shell_stable/build/scripts/aws_build_dcp_from_cl.py +++ b/hdk/common/shell_stable/build/scripts/aws_build_dcp_from_cl.py @@ -1,8 +1,9 @@ #!/usr/bin/env python3 +# ============================================================================= # Amazon FPGA Hardware Development Kit # -# Copyright 2022 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Amazon Software License (the "License"). You may not use # this file except in compliance with the License. A copy of the License is @@ -14,6 +15,8 @@ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or # implied. See the License for the specific language governing permissions and # limitations under the License. +# ============================================================================= + from optparse import OptionParser import datetime diff --git a/hdk/common/shell_stable/build/scripts/aws_clock_properties.tcl b/hdk/common/shell_stable/build/scripts/aws_clock_properties.tcl index 43b70c35a..ef49af3dc 100755 --- a/hdk/common/shell_stable/build/scripts/aws_clock_properties.tcl +++ b/hdk/common/shell_stable/build/scripts/aws_clock_properties.tcl @@ -1,6 +1,7 @@ +# ============================================================================= # Amazon FPGA Hardware Development Kit # -# Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Amazon Software License (the "License"). You may not use # this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or # implied. See the License for the specific language governing permissions and # limitations under the License. +# ============================================================================= + ##################################################################### # diff --git a/hdk/common/shell_stable/build/scripts/aws_gen_clk_constraints.tcl b/hdk/common/shell_stable/build/scripts/aws_gen_clk_constraints.tcl index faf27335c..0daa82e8b 100755 --- a/hdk/common/shell_stable/build/scripts/aws_gen_clk_constraints.tcl +++ b/hdk/common/shell_stable/build/scripts/aws_gen_clk_constraints.tcl @@ -1,6 +1,7 @@ +# ============================================================================= # Amazon FPGA Hardware Development Kit # -# Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Amazon Software License (the "License"). You may not use # this file except in compliance with the License. A copy of the License is @@ -12,6 +13,7 @@ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or # implied. See the License for the specific language governing permissions and # limitations under the License. +# ============================================================================= # Clock Group A diff --git a/hdk/common/shell_stable/build/scripts/build_all.tcl b/hdk/common/shell_stable/build/scripts/build_all.tcl index 4c56f5c68..42fccf028 100644 --- a/hdk/common/shell_stable/build/scripts/build_all.tcl +++ b/hdk/common/shell_stable/build/scripts/build_all.tcl @@ -1,6 +1,7 @@ +# ============================================================================= # Amazon FPGA Hardware Development Kit # -# Copyright 2022 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Amazon Software License (the "License"). You may not use # this file except in compliance with the License. A copy of the License is @@ -12,6 +13,7 @@ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or # implied. See the License for the specific language governing permissions and # limitations under the License. +# ============================================================================= ############################################################################### diff --git a/hdk/common/shell_stable/build/scripts/build_level_1_cl.tcl b/hdk/common/shell_stable/build/scripts/build_level_1_cl.tcl index fd295edcd..cb60d403e 100644 --- a/hdk/common/shell_stable/build/scripts/build_level_1_cl.tcl +++ b/hdk/common/shell_stable/build/scripts/build_level_1_cl.tcl @@ -1,6 +1,7 @@ +# ============================================================================= # Amazon FPGA Hardware Development Kit # -# Copyright 2022 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Amazon Software License (the "License"). You may not use # this file except in compliance with the License. A copy of the License is @@ -12,6 +13,7 @@ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or # implied. See the License for the specific language governing permissions and # limitations under the License. +# ============================================================================= # Common CL Implementation Tcl Script diff --git a/hdk/common/shell_stable/build/scripts/check_ddr_bram.tcl b/hdk/common/shell_stable/build/scripts/check_ddr_bram.tcl index 2705c1e82..4de00ab8b 100644 --- a/hdk/common/shell_stable/build/scripts/check_ddr_bram.tcl +++ b/hdk/common/shell_stable/build/scripts/check_ddr_bram.tcl @@ -1,6 +1,7 @@ +# ============================================================================= # Amazon FPGA Hardware Development Kit # -# Copyright 2022 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Amazon Software License (the "License"). You may not use # this file except in compliance with the License. A copy of the License is @@ -12,6 +13,7 @@ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or # implied. See the License for the specific language governing permissions and # limitations under the License. +# ============================================================================= # Check if the tool loaded calibration_ddr.elf file into DDR Controller BRAMs diff --git a/hdk/common/shell_stable/build/scripts/ddr_io_train.tcl b/hdk/common/shell_stable/build/scripts/ddr_io_train.tcl index 3be8b0cdd..c854f7e84 100644 --- a/hdk/common/shell_stable/build/scripts/ddr_io_train.tcl +++ b/hdk/common/shell_stable/build/scripts/ddr_io_train.tcl @@ -1,8 +1,18 @@ # ============================================================================= -# Copyright 2021 Amazon.com, Inc. or its affiliates. -# All Rights Reserved Worldwide. -# Amazon Confidential information -# Restricted NDA Material +# Amazon FPGA Hardware Development Kit +# +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# +# Licensed under the Amazon Software License (the "License"). You may not use +# this file except in compliance with the License. A copy of the License is +# located at +# +# http://aws.amazon.com/asl/ +# +# or in the "license" file accompanying this file. This file is distributed on +# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or +# implied. See the License for the specific language governing permissions and +# limitations under the License. # ============================================================================= diff --git a/hdk/common/shell_stable/build/scripts/encrypt.tcl b/hdk/common/shell_stable/build/scripts/encrypt.tcl index c767ed0c1..4792e482b 100644 --- a/hdk/common/shell_stable/build/scripts/encrypt.tcl +++ b/hdk/common/shell_stable/build/scripts/encrypt.tcl @@ -1,6 +1,7 @@ +# ============================================================================= # Amazon FPGA Hardware Development Kit # -# Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Amazon Software License (the "License"). You may not use # this file except in compliance with the License. A copy of the License is @@ -12,6 +13,7 @@ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or # implied. See the License for the specific language governing permissions and # limitations under the License. +# ============================================================================= # Remove any previously encrypted files, that may no longer be used diff --git a/hdk/common/shell_stable/build/scripts/placement_fix_v22_1.tcl b/hdk/common/shell_stable/build/scripts/placement_fix_v22_1.tcl index 1bad020b0..204fe6874 100644 --- a/hdk/common/shell_stable/build/scripts/placement_fix_v22_1.tcl +++ b/hdk/common/shell_stable/build/scripts/placement_fix_v22_1.tcl @@ -1,10 +1,21 @@ # ============================================================================= -# Copyright 2021 Amazon.com, Inc. or its affiliates. -# All Rights Reserved Worldwide. -# Amazon Confidential information -# Restricted NDA Material +# Amazon FPGA Hardware Development Kit +# +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# +# Licensed under the Amazon Software License (the "License"). You may not use +# this file except in compliance with the License. A copy of the License is +# located at +# +# http://aws.amazon.com/asl/ +# +# or in the "license" file accompanying this file. This file is distributed on +# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or +# implied. See the License for the specific language governing permissions and +# limitations under the License. # ============================================================================= + # This is a workaround for Vivado 2022.1 placement hang issue set DDR_CELL [get_cells WRAPPER/CL/SH_DDR/genblk1.IS_DDR_PRESENT.DDR4_0] if {$DDR_CELL != ""} { diff --git a/hdk/common/shell_stable/build/scripts/synth_cl_footer.tcl b/hdk/common/shell_stable/build/scripts/synth_cl_footer.tcl index 0b076233d..2b5f5a054 100644 --- a/hdk/common/shell_stable/build/scripts/synth_cl_footer.tcl +++ b/hdk/common/shell_stable/build/scripts/synth_cl_footer.tcl @@ -1,6 +1,7 @@ +# ============================================================================= # Amazon FPGA Hardware Development Kit # -# Copyright 2022 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Amazon Software License (the "License"). You may not use # this file except in compliance with the License. A copy of the License is @@ -12,6 +13,7 @@ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or # implied. See the License for the specific language governing permissions and # limitations under the License. +# ============================================================================= # Common CL Synthesis Tcl Script Footer diff --git a/hdk/common/shell_stable/build/scripts/synth_cl_header.tcl b/hdk/common/shell_stable/build/scripts/synth_cl_header.tcl index c1d8c5f1f..c4874304f 100644 --- a/hdk/common/shell_stable/build/scripts/synth_cl_header.tcl +++ b/hdk/common/shell_stable/build/scripts/synth_cl_header.tcl @@ -1,6 +1,7 @@ +# ============================================================================= # Amazon FPGA Hardware Development Kit # -# Copyright 2022 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Amazon Software License (the "License"). You may not use # this file except in compliance with the License. A copy of the License is @@ -12,6 +13,7 @@ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or # implied. See the License for the specific language governing permissions and # limitations under the License. +# ============================================================================= # Common CL Synthesis Tcl Script Header diff --git a/hdk/common/shell_stable/design/interfaces/cl_ports.vh b/hdk/common/shell_stable/design/interfaces/cl_ports.vh index 27b8381dd..f4f963d93 100644 --- a/hdk/common/shell_stable/design/interfaces/cl_ports.vh +++ b/hdk/common/shell_stable/design/interfaces/cl_ports.vh @@ -1,9 +1,19 @@ -//============================================================================= -// Copyright 2022 Amazon.com, Inc. or its affiliates. -// All Rights Reserved Worldwide. -// Amazon Confidential information -// Restricted NDA Material -//============================================================================= +// ============================================================================ +// Amazon FPGA Hardware Development Kit +// +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// +// Licensed under the Amazon Software License (the "License"). You may not use +// this file except in compliance with the License. A copy of the License is +// located at +// +// http://aws.amazon.com/asl/ +// +// or in the "license" file accompanying this file. This file is distributed on +// an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or +// implied. See the License for the specific language governing permissions and +// limitations under the License. +// ============================================================================ //---------------------------------------- diff --git a/hdk/common/shell_stable/design/interfaces/unused_apppf_irq_template.inc b/hdk/common/shell_stable/design/interfaces/unused_apppf_irq_template.inc index d02ebe062..884dd26af 100644 --- a/hdk/common/shell_stable/design/interfaces/unused_apppf_irq_template.inc +++ b/hdk/common/shell_stable/design/interfaces/unused_apppf_irq_template.inc @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,7 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ //------------------------------------ @@ -19,4 +21,3 @@ //------------------------------------ assign cl_sh_apppf_irq_req = 16'b0; - diff --git a/hdk/common/shell_stable/design/interfaces/unused_cl_sda_template.inc b/hdk/common/shell_stable/design/interfaces/unused_cl_sda_template.inc index 20d89b14a..e76fe4603 100644 --- a/hdk/common/shell_stable/design/interfaces/unused_cl_sda_template.inc +++ b/hdk/common/shell_stable/design/interfaces/unused_cl_sda_template.inc @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + // PCIe Slave (sda) Interface from SH to CL assign cl_sda_awready = 1'b0; diff --git a/hdk/common/shell_stable/design/interfaces/unused_ddr_template.inc b/hdk/common/shell_stable/design/interfaces/unused_ddr_template.inc index 81a9fac19..00ca7f5d9 100644 --- a/hdk/common/shell_stable/design/interfaces/unused_ddr_template.inc +++ b/hdk/common/shell_stable/design/interfaces/unused_ddr_template.inc @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + // Only the DDR pins are connected. The AXI and stats interfaces are tied-off. diff --git a/hdk/common/shell_stable/design/interfaces/unused_dma_pcis_template.inc b/hdk/common/shell_stable/design/interfaces/unused_dma_pcis_template.inc index 471309eac..28e4a5f30 100644 --- a/hdk/common/shell_stable/design/interfaces/unused_dma_pcis_template.inc +++ b/hdk/common/shell_stable/design/interfaces/unused_dma_pcis_template.inc @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,7 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ // PCIe Slave (pcis) Interface from SH to CL @@ -34,4 +36,3 @@ // CL DMA Full Signals assign cl_sh_dma_wr_full = 1'b0; assign cl_sh_dma_rd_full = 1'b0; - diff --git a/hdk/common/shell_stable/design/interfaces/unused_flr_template.inc b/hdk/common/shell_stable/design/interfaces/unused_flr_template.inc index 54240f101..8e1dd1381 100644 --- a/hdk/common/shell_stable/design/interfaces/unused_flr_template.inc +++ b/hdk/common/shell_stable/design/interfaces/unused_flr_template.inc @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,7 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ - assign cl_sh_flr_done = 1'b0; + assign cl_sh_flr_done = 1'b0; diff --git a/hdk/common/shell_stable/design/interfaces/unused_pcim_template.inc b/hdk/common/shell_stable/design/interfaces/unused_pcim_template.inc index 8d9179673..b713e0d18 100644 --- a/hdk/common/shell_stable/design/interfaces/unused_pcim_template.inc +++ b/hdk/common/shell_stable/design/interfaces/unused_pcim_template.inc @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + // PCIe Master (pcim) Interface from CL to SH assign cl_sh_pcim_awid = 16'b0; @@ -36,4 +39,3 @@ assign cl_sh_pcim_arvalid = 1'b0; assign cl_sh_pcim_rready = 1'b0; - diff --git a/hdk/common/shell_stable/design/interfaces/unused_sh_ocl_template.inc b/hdk/common/shell_stable/design/interfaces/unused_sh_ocl_template.inc index 421cf2006..85ccf6384 100644 --- a/hdk/common/shell_stable/design/interfaces/unused_sh_ocl_template.inc +++ b/hdk/common/shell_stable/design/interfaces/unused_sh_ocl_template.inc @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + // PCIe Slave (ocl) Interface from SH to CL assign cl_ocl_awready = 1'b0; diff --git a/hdk/common/shell_stable/design/sh_ddr/sh_ddr.stub.sv b/hdk/common/shell_stable/design/sh_ddr/sh_ddr.stub.sv index 2c2743130..6ea929571 100644 --- a/hdk/common/shell_stable/design/sh_ddr/sh_ddr.stub.sv +++ b/hdk/common/shell_stable/design/sh_ddr/sh_ddr.stub.sv @@ -1,7 +1,7 @@ -//------------------------------------------------------------------------------ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -13,8 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. -// Restricted NDA Material -//------------------------------------------------------------------------------ +// ============================================================================ + module sh_ddr #( diff --git a/hdk/common/shell_stable/design/sh_ddr/sim/axi4_slave_bfm.sv b/hdk/common/shell_stable/design/sh_ddr/sim/axi4_slave_bfm.sv index e0520d4e0..e9bacd9d4 100755 --- a/hdk/common/shell_stable/design/sh_ddr/sim/axi4_slave_bfm.sv +++ b/hdk/common/shell_stable/design/sh_ddr/sim/axi4_slave_bfm.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,13 +13,15 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + module axi4_slave_bfm #( parameter ECC_EN = 0, parameter ECC_ADDR_HI = 'h410, parameter ECC_ADDR_LO = 'h400, parameter RND_ECC_EN = 0, parameter RND_ECC_WEIGHT = 100) ( input clk_core, input rst_n, - + //------------------------------------------------------ // DDR-4 Interface from CL (AXI-4) //------------------------------------------------------ @@ -67,7 +70,7 @@ module axi4_slave_bfm #( parameter ECC_EN = 0, parameter ECC_ADDR_HI = 'h410, pa AXI_Command cl_sh_rd_cmds[$]; AXI_Command sh_cl_rd_data[$]; AXI_Command sh_cl_b_resps[$]; - + logic [31:0] model_memory[*]; int wr_cmd_cnt[0:3]; @@ -139,15 +142,15 @@ module axi4_slave_bfm #( parameter ECC_EN = 0, parameter ECC_ADDR_HI = 'h410, pa automatic int awready_cnt = 0; `else int awready_cnt = 0; -`endif +`endif if (cl_sh_ddr_awvalid && sh_cl_ddr_awready) begin cmd.addr = cl_sh_ddr_awaddr; cmd.id = cl_sh_ddr_awid; cmd.len = cl_sh_ddr_awlen; cmd.size = cl_sh_ddr_awsize; cmd.last = 0; - - cl_sh_wr_cmds.push_back(cmd); + + cl_sh_wr_cmds.push_back(cmd); sh_cl_b_resps.push_back(cmd); mem_wr_que.push_back(cmd); end @@ -171,10 +174,10 @@ module axi4_slave_bfm #( parameter ECC_EN = 0, parameter ECC_ADDR_HI = 'h410, pa `ifdef QUESTA_SIM automatic int wready_cnt = 0; automatic int wready_nonzero_wait = 0; -`else +`else int wready_cnt = 0; int wready_nonzero_wait = 0; -`endif +`endif if (sh_cl_ddr_wready && cl_sh_ddr_wvalid) begin wr_data.data = cl_sh_ddr_wdata; wr_data.strb = cl_sh_ddr_wstrb; @@ -184,9 +187,9 @@ module axi4_slave_bfm #( parameter ECC_EN = 0, parameter ECC_ADDR_HI = 'h410, pa if (wr_data.last == 1) wr_last_cnt += 1; - + end // if (sh_cl_ddr_wready && cl_sh_ddr_wvalid) - + if ((cl_sh_wr_data.size() > 64) || (wready_cnt > 0)) begin sh_cl_ddr_wready <= 1'b0; wready_cnt--; @@ -224,7 +227,7 @@ module axi4_slave_bfm #( parameter ECC_EN = 0, parameter ECC_ADDR_HI = 'h410, pa end else sh_cl_ddr_bvalid <= 1'b0; - + end // always @ (posedge clk_core) // @@ -233,7 +236,7 @@ module axi4_slave_bfm #( parameter ECC_EN = 0, parameter ECC_ADDR_HI = 'h410, pa always @(posedge clk_core) begin AXI_Command cmd; -`ifdef QUESTA_SIM +`ifdef QUESTA_SIM automatic int arready_cnt = 0; `else int arready_cnt = 0; @@ -260,14 +263,14 @@ module axi4_slave_bfm #( parameter ECC_EN = 0, parameter ECC_ADDR_HI = 'h410, pa end // always @ (posedge clk_core) - + //================================================= // // cl->sh PCIeM Interface // //================================================= - - + + always @(posedge clk_core) begin if (mem_wr_que.size() > 0) begin @@ -287,13 +290,13 @@ module axi4_slave_bfm #( parameter ECC_EN = 0, parameter ECC_ADDR_HI = 'h410, pa word = model_memory[{wr_addr[63:2], 2'b00}]; else word = 32'hffff_ffff; // return a default value - - + + for(int j=0; j<4; j++) begin logic [7:0] c; int index; index = j + (i * 4); - + if (cl_sh_wr_data[0].strb[index]) begin c = cl_sh_wr_data[0].data >> (index * 8); //FIX partial DW order word = {c, word[31:8]}; @@ -302,7 +305,7 @@ module axi4_slave_bfm #( parameter ECC_EN = 0, parameter ECC_ADDR_HI = 'h410, pa end // for (int j=0; j<4; j++) model_memory[{wr_addr[63:2], 2'b00}] = word; - + wr_addr += 4; end if (cl_sh_wr_data[0].last == 1) begin @@ -311,9 +314,9 @@ module axi4_slave_bfm #( parameter ECC_EN = 0, parameter ECC_ADDR_HI = 'h410, pa if (debug) begin $display("[%t] - DEBUG reseting...", $realtime); end - + end - + cl_sh_wr_data.pop_front(); end // if (cl_sh_wr_data.size() > 0) end // if (mem_wr_que.size() > 0) @@ -324,7 +327,7 @@ module axi4_slave_bfm #( parameter ECC_EN = 0, parameter ECC_ADDR_HI = 'h410, pa // logic first_rd_beat; logic [63:0] rd_addr, rd_addr_t; - + always @(posedge clk_core) begin AXI_Command rd_cmd; logic [511:0] beat; @@ -338,7 +341,7 @@ module axi4_slave_bfm #( parameter ECC_EN = 0, parameter ECC_ADDR_HI = 'h410, pa sh_cl_ddr_rlast <= (sh_cl_rd_data[0].len == 0) ? 1'b1 : (sh_cl_rd_data[0].len == 1) && sh_cl_ddr_rvalid && cl_sh_ddr_rready ? 1'b1 : 1'b0; - + if (first_rd_beat == 1'b1) begin rd_addr = sh_cl_rd_data[0].addr; first_rd_beat = 1'b0; @@ -346,19 +349,19 @@ module axi4_slave_bfm #( parameter ECC_EN = 0, parameter ECC_ADDR_HI = 'h410, pa if (!sh_cl_ddr_rvalid || (sh_cl_ddr_rvalid && cl_sh_ddr_rready)) begin - beat = {512{1'b1}}; + beat = {512{1'b1}}; for(int i=rd_addr[5:2]; i<16; i++) begin logic [31:0] c; if (debug) begin $display("[%t] : DEBUG reading addr 0x%016x", $realtime, rd_addr); end - + if (model_memory.exists({rd_addr[63:2], 2'b00})) c = model_memory[{rd_addr[63:2], 2'b00}]; else c = 32'hffffffff; - + beat = {c, beat[511:32]}; rd_addr +=4; end @@ -372,7 +375,7 @@ module axi4_slave_bfm #( parameter ECC_EN = 0, parameter ECC_ADDR_HI = 'h410, pa end else begin sh_cl_ddr_rvalid <= 1'b0; - sh_cl_ddr_rlast <= 1'b0; + sh_cl_ddr_rlast <= 1'b0; first_rd_beat = 1'b1; end @@ -384,11 +387,11 @@ module axi4_slave_bfm #( parameter ECC_EN = 0, parameter ECC_ADDR_HI = 'h410, pa end else begin - sh_cl_rd_data[0].len--; + sh_cl_rd_data[0].len--; end end - + end // always @ (posedge clk_core) function void axi_mem_bdr_write(input longint unsigned addr, byte d); @@ -399,7 +402,7 @@ module axi4_slave_bfm #( parameter ECC_EN = 0, parameter ECC_ADDR_HI = 'h410, pa end else t = 32'hffff_ffff; - + t = t & ~(32'h0000_00ff << (addr[1:0] * 8) ); t = t | ({24'h000000, d} << (addr[1:0] * 8) ); model_memory[{addr[63:2], 2'b00}] = t; @@ -418,5 +421,5 @@ module axi4_slave_bfm #( parameter ECC_EN = 0, parameter ECC_ADDR_HI = 'h410, pa d = 'hff; return d; endfunction // axi_mem_bdr_read - + endmodule diff --git a/hdk/common/shell_stable/design/sh_ddr/sim/axi_bfm_defines.svh b/hdk/common/shell_stable/design/sh_ddr/sim/axi_bfm_defines.svh index e8e8209dc..6b773f8e7 100755 --- a/hdk/common/shell_stable/design/sh_ddr/sim/axi_bfm_defines.svh +++ b/hdk/common/shell_stable/design/sh_ddr/sim/axi_bfm_defines.svh @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,7 +13,7 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. - +// ============================================================================ typedef struct { @@ -23,11 +24,10 @@ typedef struct { logic [1:0] resp; logic last; } AXI_Command; - + typedef struct { logic [511:0] data; logic [63:0] strb; logic [15:0] id; logic last; } AXI_Data; - diff --git a/hdk/common/shell_stable/design/sh_ddr/sim/axi_mem_model.sv b/hdk/common/shell_stable/design/sh_ddr/sim/axi_mem_model.sv index fa4b9f6b9..fa4ece3ce 100755 --- a/hdk/common/shell_stable/design/sh_ddr/sim/axi_mem_model.sv +++ b/hdk/common/shell_stable/design/sh_ddr/sim/axi_mem_model.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,12 +13,15 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + + module axi_mem_model #( parameter NUM_MEM = 3, parameter ECC_EN = 0, parameter ECC_ADDR_HI = 'h410, parameter ECC_ADDR_LO = 'h400, parameter RND_ECC_EN = 0, parameter RND_ECC_WEIGHT = 100) ( input clk_core, input rst_n, - + input[15:0] cl_sh_ddr_awid[NUM_MEM-1:0], input[63:0] cl_sh_ddr_awaddr[NUM_MEM-1:0], input[7:0] cl_sh_ddr_awlen[NUM_MEM-1:0], @@ -79,7 +83,7 @@ module axi_mem_model #( parameter NUM_MEM = 3, parameter ECC_EN = 0, parameter E .cl_sh_ddr_wlast(cl_sh_ddr_wlast[gi]), .cl_sh_ddr_wvalid(cl_sh_ddr_wvalid[gi]), .sh_cl_ddr_wready(sh_cl_ddr_wready[gi]), - + .sh_cl_ddr_bid(sh_cl_ddr_bid[gi]), .sh_cl_ddr_bresp(sh_cl_ddr_bresp[gi]), .sh_cl_ddr_bvalid(sh_cl_ddr_bvalid[gi]), diff --git a/hdk/common/software/include/cl_utils.h b/hdk/common/software/include/cl_utils.h index 3545afdd4..8d611d5da 100644 --- a/hdk/common/software/include/cl_utils.h +++ b/hdk/common/software/include/cl_utils.h @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,7 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ void sv_printf(char *msg); diff --git a/hdk/common/software/include/fpga_pci_sv.h b/hdk/common/software/include/fpga_pci_sv.h index 0de0bc983..8c998434f 100644 --- a/hdk/common/software/include/fpga_pci_sv.h +++ b/hdk/common/software/include/fpga_pci_sv.h @@ -1,20 +1,23 @@ -/* - * Copyright 2015-2017 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may - * not use this file except in compliance with the License. A copy of the - * License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file is distributed - * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either - * express or implied. See the License for the specific language governing - * permissions and limitations under the License. - */ +// ============================================================================ +// Amazon FPGA Hardware Development Kit +// +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// +// Licensed under the Amazon Software License (the "License"). You may not use +// this file except in compliance with the License. A copy of the License is +// located at +// +// http://aws.amazon.com/asl/ +// +// or in the "license" file accompanying this file. This file is distributed on +// an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or +// implied. See the License for the specific language governing permissions and +// limitations under the License. +// ============================================================================ + /* - * This file is a SV wrapper header file for fpga_pci.h. + * This file is a SV wrapper header file for fpga_pci.h. */ #ifndef FPGA_PCI_SV_H_ #define FPGA_PCI_SV_H_ diff --git a/hdk/common/software/include/pcie_utils.h b/hdk/common/software/include/pcie_utils.h index 5e079bdc6..8d68bab72 100644 --- a/hdk/common/software/include/pcie_utils.h +++ b/hdk/common/software/include/pcie_utils.h @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,7 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ #include diff --git a/hdk/common/software/include/xdma_utils.h b/hdk/common/software/include/xdma_utils.h index 46fb237fd..3efa02c78 100644 --- a/hdk/common/software/include/xdma_utils.h +++ b/hdk/common/software/include/xdma_utils.h @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,7 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ #include diff --git a/hdk/common/software/src/cl_utils.c b/hdk/common/software/src/cl_utils.c index 29527a66b..b9d2d1667 100644 --- a/hdk/common/software/src/cl_utils.c +++ b/hdk/common/software/src/cl_utils.c @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,41 +13,41 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ #include #include #include -void +void sv_printf(char *msg) { printf("%s\n", msg); } -void +void sv_map_host_memory(uint8_t *memory) { // Does nothing on EC2 instance } -void +void cl_peek(uint64_t addr, uint32_t *data) { *data = peek((uint32_t) (addr & 0xffffffff)); } -void +void cl_poke(uint64_t addr, uint32_t data) { poke((uint32_t) (addr & 0xffffffff), data); } -void +void sv_pause(uint32_t x) { usleep(x); } - diff --git a/hdk/common/software/src/fpga_pci_sv.c b/hdk/common/software/src/fpga_pci_sv.c index 88b922ad5..1244406c4 100644 --- a/hdk/common/software/src/fpga_pci_sv.c +++ b/hdk/common/software/src/fpga_pci_sv.c @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + #include diff --git a/hdk/common/software/src/main.c b/hdk/common/software/src/main.c index 8827b6a31..ca53f249b 100644 --- a/hdk/common/software/src/main.c +++ b/hdk/common/software/src/main.c @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + #include #include diff --git a/hdk/common/software/src/pcie_utils.c b/hdk/common/software/src/pcie_utils.c index 1dab67703..68ce9d965 100644 --- a/hdk/common/software/src/pcie_utils.c +++ b/hdk/common/software/src/pcie_utils.c @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + #include #include @@ -132,7 +135,7 @@ pcie_find_all(char *ids[], int max) } } } - closedir(d); + closedir(d); return count; } @@ -158,7 +161,7 @@ pcie_find_first(void) return de.d_name; } } - closedir(d); + closedir(d); return NULL; } @@ -173,7 +176,7 @@ pcie_mmap(char *id, bool verify) if (fd < 0) { return false; } - + lseek(fd, 0x10, SEEK_SET); read(fd, &t_bar0, sizeof(t_bar0)); if (t_bar0 == 0) { @@ -195,7 +198,7 @@ pcie_mmap(char *id, bool verify) perror("/dev/mem"); return false; } - + t_base = (uintptr_t) mmap(0, MAP_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, t_bar0); if (t_base == (uintptr_t) MAP_FAILED) { perror("mmap"); diff --git a/hdk/common/software/src/sh_dpi_tasks.c b/hdk/common/software/src/sh_dpi_tasks.c index cff043434..58afa2682 100644 --- a/hdk/common/software/src/sh_dpi_tasks.c +++ b/hdk/common/software/src/sh_dpi_tasks.c @@ -1,17 +1,20 @@ -/* - * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may - * not use this file except in compliance with the License. A copy of the - * License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file is distributed - * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either - * express or implied. See the License for the specific language governing - * permissions and limitations under the License. - */ +// ============================================================================ +// Amazon FPGA Hardware Development Kit +// +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// +// Licensed under the Amazon Software License (the "License"). You may not use +// this file except in compliance with the License. A copy of the License is +// located at +// +// http://aws.amazon.com/asl/ +// +// or in the "license" file accompanying this file. This file is distributed on +// an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or +// implied. See the License for the specific language governing permissions and +// limitations under the License. +// ============================================================================ + #include @@ -25,20 +28,20 @@ uint8_t host_memory_getc(uint64_t addr) { return *(uint8_t *)addr; } -void cosim_printf(const char *format, ...) -{ - static char sv_msg_buffer[256]; - va_list args; +void cosim_printf(const char *format, ...) +{ + static char sv_msg_buffer[256]; + va_list args; - va_start(args, format); - vsprintf(sv_msg_buffer, format, args); + va_start(args, format); + vsprintf(sv_msg_buffer, format, args); #ifdef SV_TEST - sv_printf(sv_msg_buffer); + sv_printf(sv_msg_buffer); #else - printf(sv_msg_buffer); + printf(sv_msg_buffer); #endif - va_end(args); + va_end(args); } void int_handler(uint32_t int_num) diff --git a/hdk/common/software/src/test_null.c b/hdk/common/software/src/test_null.c index b481d2a2e..4e0d4834a 100644 --- a/hdk/common/software/src/test_null.c +++ b/hdk/common/software/src/test_null.c @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,7 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ #include diff --git a/hdk/common/software/src/xdma_utils.c b/hdk/common/software/src/xdma_utils.c index 8cb96fe2d..dfa20f997 100644 --- a/hdk/common/software/src/xdma_utils.c +++ b/hdk/common/software/src/xdma_utils.c @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + #include "xdma_utils.h" @@ -27,9 +30,9 @@ void que_buffer_to_cl(int chan, uint8_t *buf, size_t len) { // setup descriptor table if this is first call if (h2c_desc_index == 0) { h2c_desc_table = (XDMA_DESC *)memalign(4096, 4096); // allocate 4k aligned to a 4k boundary - + sv_map_host_memory(h2c_desc_table); - + } h2c_desc_table[h2c_desc_index].header.word = 0; // make sure reserved bits and unused bits are 0 diff --git a/hdk/common/verif/include/aws_clk_gen_utils.svh b/hdk/common/verif/include/aws_clk_gen_utils.svh index 1d297753a..40fbcaa07 100644 --- a/hdk/common/verif/include/aws_clk_gen_utils.svh +++ b/hdk/common/verif/include/aws_clk_gen_utils.svh @@ -1,3 +1,20 @@ +// ============================================================================ +// Amazon FPGA Hardware Development Kit +// +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// +// Licensed under the Amazon Software License (the "License"). You may not use +// this file except in compliance with the License. A copy of the License is +// located at +// +// http://aws.amazon.com/asl/ +// +// or in the "license" file accompanying this file. This file is distributed on +// an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or +// implied. See the License for the specific language governing permissions and +// limitations under the License. +// ============================================================================ + // START SDA OFFSETS diff --git a/hdk/common/verif/include/cl_common_defines.vh b/hdk/common/verif/include/cl_common_defines.vh index 18bec62d6..207ce42e7 100644 --- a/hdk/common/verif/include/cl_common_defines.vh +++ b/hdk/common/verif/include/cl_common_defines.vh @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,7 +13,7 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. - +// ============================================================================ int error_count = 0; diff --git a/hdk/common/verif/include/common_base_test.svh b/hdk/common/verif/include/common_base_test.svh index 3947a0bf3..1ecbca75d 100644 --- a/hdk/common/verif/include/common_base_test.svh +++ b/hdk/common/verif/include/common_base_test.svh @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,7 +13,7 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. - +// ============================================================================ `define DDR_CHANNEL 0 `define HBM_CHANNEL 1 @@ -25,15 +26,7 @@ `define _64_GB 64'h0010_0000_0000 -`ifdef USE_32GB_DDR_DIMM - `define AWS_SIM_32GB_DDR -`elsif USE_AP_32GB_DDR_DIMM - `define AWS_SIM_32GB_DDR -`elsif USE_64GB_DDR_DIMM - `define AWS_SIM_64GB_DDR -`elsif USE_AP_64GB_DDR_DIMM - `define AWS_SIM_64GB_DDR -`endif +`define AWS_SIM_64GB_DDR int error_count = 0; @@ -63,4 +56,3 @@ task compare_data(logic [511:0] act_data, exp_data, logic [63:0] addr); $display("[%t]: Data Matched Addr: %0h. Actual Data:%0h <==> Expected Data: %0h", $realtime, addr, act_data, exp_data); end endtask - diff --git a/hdk/common/verif/include/sh_dpi_tasks.svh b/hdk/common/verif/include/sh_dpi_tasks.svh index 3dd6fc34f..44f70617f 100755 --- a/hdk/common/verif/include/sh_dpi_tasks.svh +++ b/hdk/common/verif/include/sh_dpi_tasks.svh @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + `ifndef SV_SH_DPI_TASKS `define SV_SH_DPI_TASKS @@ -33,7 +36,7 @@ import tb_type_defines_pkg::*; `endif `endif - + export "DPI-C" task sv_printf; export "DPI-C" task sv_map_host_memory; export "DPI-C" task cl_peek; @@ -46,10 +49,10 @@ import tb_type_defines_pkg::*; export "DPI-C" task sv_fpga_start_buffer_to_cl; export "DPI-C" task sv_fpga_start_cl_to_buffer; `endif - + static int h2c_desc_index = 0; static int c2h_desc_index = 0; - + task sv_printf(input string msg); $display("%S", msg); endtask @@ -61,7 +64,7 @@ import tb_type_defines_pkg::*; task cl_peek(input longint unsigned addr, output int unsigned data); tb.card.fpga.sh.peek(.addr(addr), .data(data), .intf(AxiPort::PORT_OCL)); endtask - + task cl_poke(input longint unsigned addr, int unsigned data); tb.card.fpga.sh.poke(.addr(addr), .data(data), .intf(AxiPort::PORT_OCL)); endtask @@ -69,7 +72,7 @@ import tb_type_defines_pkg::*; task sv_int_ack(input int unsigned int_num); tb.card.fpga.sh.set_ack_bit(int_num); endtask - + task sv_pause(input int x); repeat (x) #1us; endtask @@ -77,11 +80,11 @@ import tb_type_defines_pkg::*; task sv_fpga_pci_peek(input int handle, input longint unsigned offset, output int unsigned value); tb.card.fpga.sh.peek(.addr(offset), .data(value), .intf(AxiPort::PORT_OCL)); endtask - + task sv_fpga_pci_poke(input int handle, input longint unsigned addr, int unsigned data); tb.card.fpga.sh.poke(.addr(addr), .data(data), .intf(AxiPort::PORT_OCL)); - endtask - + endtask + function void hm_put_byte(input longint unsigned addr, byte d); if (tb.use_c_host_memory) host_memory_putc(addr, d); @@ -93,7 +96,7 @@ import tb_type_defines_pkg::*; end else t = 32'hffff_ffff; - + t = t & ~(32'h0000_00ff << (addr[1:0] * 8) ); t = t | ({24'h000000, d} << (addr[1:0] * 8) ); tb.sv_host_memory[{addr[63:2], 2'b00}] = t; @@ -115,7 +118,7 @@ import tb_type_defines_pkg::*; d = 'hff; end end - + return d; endfunction @@ -222,7 +225,7 @@ end for (int i = 0 ; i < buf_size ; i++) begin tb.hm_put_byte(.addr(host_memory_buffer_address), .d(tb.host_memory_getc(host_memory_ptr))); if(debug) begin - $display("[%t] : host_memory_address = %0x wr_buffer[%d] = %0x", $realtime, host_memory_buffer_address, i, tb.host_memory_getc(host_memory_ptr)); + $display("[%t] : host_memory_address = %0x wr_buffer[%d] = %0x", $realtime, host_memory_buffer_address, i, tb.host_memory_getc(host_memory_ptr)); end host_memory_ptr++ ; host_memory_buffer_address++; @@ -235,13 +238,13 @@ end #10ns; timeout_count++; end while ((status[chan] != 1) && (timeout_count < 4000)); // UNMATCHED !! - + if (timeout_count >= 4000) begin $display("[%t] : *** ERROR *** Timeout waiting for dma transfers to cl", $realtime); error_count++; end endtask // sv_fpga_start_buffer_to_cl - + //DPI task to transfer CL to HOST data. task sv_fpga_start_cl_to_buffer(input int slot_id = 0, input int chan, input int buf_size, input longint unsigned rd_buffer_addr, input longint unsigned cl_addr); int timeout_count, status, error_count; @@ -260,7 +263,7 @@ end for (int i = 0 ; i < buf_size ; i++) begin tb.hm_put_byte(.addr(host_memory_buffer_address + i), .d(tb.host_memory_getc(host_memory_ptr))); if(debug) begin - $display("[%t] : host_memory_address = %0x rd_buffer[%d] = %0x", $realtime, host_memory_buffer_address + i, i, tb.host_memory_getc(host_memory_ptr)); + $display("[%t] : host_memory_address = %0x rd_buffer[%d] = %0x", $realtime, host_memory_buffer_address + i, i, tb.host_memory_getc(host_memory_ptr)); end host_memory_ptr++ ; end @@ -274,7 +277,7 @@ end #10ns; timeout_count++; end while ((status[chan] != 1) && (timeout_count < 4000)); // UNMATCHED !! - + if (timeout_count >= 4000) begin $display("[%t] : *** ERROR *** Timeout waiting for dma transfers from cl", $realtime); error_count++; @@ -284,15 +287,15 @@ end for (int i = 0 ; i < buf_size ; i++) begin tb.host_memory_putc(host_memory_ptr, tb.hm_get_byte(host_memory_buffer_address + i)); if(debug) begin - $display("[%t] : host_memory_address = %0x rd_buffer[%d] = %0x", $realtime, host_memory_buffer_address + i, i, tb.hm_get_byte(host_memory_buffer_address + i)); + $display("[%t] : host_memory_address = %0x rd_buffer[%d] = %0x", $realtime, host_memory_buffer_address + i, i, tb.hm_get_byte(host_memory_buffer_address + i)); end host_memory_ptr++ ; end endtask // sv_fpga_start_cl_to_buffer `endif - - task power_up(input int slot_id = 0, + + task power_up(input int slot_id = 0, ClockRecipe::A_RECIPE clk_recipe_a = ClockRecipe::A0, ClockRecipe::B_RECIPE clk_recipe_b = ClockRecipe::B0, ClockRecipe::C_RECIPE clk_recipe_c = ClockRecipe::C0); @@ -372,11 +375,11 @@ end // //================================================= task poke(input int slot_id = 0, - logic [63:0] addr, - logic [511:0] data, - logic [5:0] id = 6'h0, - DataSize::DATA_SIZE size = DataSize::UINT32, - AxiPort::AXI_PORT intf = AxiPort::PORT_DMA_PCIS); + logic [63:0] addr, + logic [511:0] data, + logic [5:0] id = 6'h0, + DataSize::DATA_SIZE size = DataSize::UINT32, + AxiPort::AXI_PORT intf = AxiPort::PORT_DMA_PCIS); `SLOT_MACRO_TASK(poke(.addr(addr), .data(data), .id(id), .size(size), .intf(intf))) endtask @@ -389,10 +392,10 @@ end // //================================================= task poke_pcis(input int slot_id = 0, - logic [63:0] addr, - logic [511:0] data, - logic [63:0] strb, - logic [5:0] id = 6'h0); + logic [63:0] addr, + logic [511:0] data, + logic [63:0] strb, + logic [5:0] id = 6'h0); `SLOT_MACRO_TASK(poke_pcis(.addr(addr), .data(data), .id(id), .strb(strb))) endtask @@ -409,8 +412,8 @@ end // //========================================================================== task poke_pcis_wc(input int slot_id = 0, - input logic [63:0] addr, - logic [31:0] data [$], + input logic [63:0] addr, + logic [31:0] data [$], logic [5:0] id = 6'h0, logic [2:0] size = 3'd6 ); @@ -436,11 +439,11 @@ end // //================================================= task peek(input int slot_id = 0, - logic [63:0] addr, - output logic [511:0] data, - input logic [5:0] id = 6'h0, - DataSize::DATA_SIZE size = DataSize::UINT32, - AxiPort::AXI_PORT intf = AxiPort::PORT_DMA_PCIS); + logic [63:0] addr, + output logic [511:0] data, + input logic [5:0] id = 6'h0, + DataSize::DATA_SIZE size = DataSize::UINT32, + AxiPort::AXI_PORT intf = AxiPort::PORT_DMA_PCIS); `SLOT_MACRO_TASK(peek(.addr(addr), .data(data), .id(id), .size(size), .intf(intf))) endtask @@ -453,8 +456,8 @@ end // //================================================= task peek_pcis(input int slot_id = 0, - logic [63:0] addr, - output logic [511:0] data, + logic [63:0] addr, + output logic [511:0] data, input logic [5:0] id = 6'h0); `SLOT_MACRO_TASK(peek_pcis(.addr(addr), .data(data), .id(id))) endtask @@ -508,9 +511,9 @@ end // //================================================= task poke_ocl(input int slot_id = 0, - logic [63:0] addr, - logic [31:0] data, - logic [5:0] id = 6'h0); + logic [63:0] addr, + logic [31:0] data, + logic [5:0] id = 6'h0); `SLOT_MACRO_TASK(poke(.addr(addr), .data({32'h0, data}), .id(id), .size(DataSize::UINT32), .intf(AxiPort::PORT_OCL))) endtask @@ -526,9 +529,9 @@ end // //================================================= task peek_ocl(input int slot_id = 0, - logic [63:0] addr, - output logic [63:0] data, - input logic [5:0] id = 6'h0); + logic [63:0] addr, + output logic [63:0] data, + input logic [5:0] id = 6'h0); logic [63:0] tmp; `SLOT_MACRO_TASK(peek(.addr(addr), .data(tmp), .id(id), .size(DataSize::UINT32), .intf(AxiPort::PORT_OCL))) data = {32'h0, tmp[31:0]}; @@ -546,8 +549,8 @@ end // //================================================= task poke_sda(input int slot_id = 0, - logic [63:0] addr, - logic [31:0] data, + logic [63:0] addr, + logic [31:0] data, logic [5:0] id = 6'h00); `SLOT_MACRO_TASK(poke(.addr(addr), .data({32'h0, data}), .id(id), .size(DataSize::UINT32), .intf(AxiPort::PORT_SDA))) endtask @@ -564,9 +567,9 @@ end // //================================================= task peek_sda(input int slot_id = 0, - logic [63:0] addr, - output logic [63:0] data, - input logic [5:0] id = 6'h0); + logic [63:0] addr, + output logic [63:0] data, + input logic [5:0] id = 6'h0); logic [63:0] tmp; `SLOT_MACRO_TASK(peek(.addr(addr), .data(tmp), .id(id), .size(DataSize::UINT32), .intf(AxiPort::PORT_SDA))) @@ -574,13 +577,13 @@ end endtask function bit is_dma_to_cl_done(input int slot_id = 0, input int chan); - `SLOT_MACRO_FUNC(is_dma_to_cl_done(chan)) + `SLOT_MACRO_FUNC(is_dma_to_cl_done(chan)) endfunction // is_dma_to_cl_done function int get_ecc_err_cnt(input int slot_id = 0); - `SLOT_MACRO_FUNC(get_ecc_err_cnt()) + `SLOT_MACRO_FUNC(get_ecc_err_cnt()) endfunction // is_dma_to_cl_done - + function bit is_dma_to_buffer_done(input int slot_id = 0, input int chan); `SLOT_MACRO_FUNC(is_dma_to_buffer_done(chan)) endfunction // is_dma_to_buffer_done @@ -588,7 +591,7 @@ end function bit is_ddr_ready(input int slot_id = 0); `SLOT_MACRO_TASK(is_ddr_ready()) endfunction // is_dma_to_buffer_done - + task poke_stat(input int slot_id = 0, input logic [7:0] addr, string intf, logic[31:0] data); `SLOT_MACRO_TASK(poke_stat(.addr(addr), .intf(intf), .data(data))) @@ -635,7 +638,7 @@ end task wait_clock( input int count, int slot_id = 0 - ); + ); `SLOT_MACRO_TASK(wait_clock(.count(count))) endtask : wait_clock @@ -650,7 +653,7 @@ end function void set_chk_clk_freq(input int slot_id = 0, logic chk_freq = 1'b1); `SLOT_MACRO_TASK(set_chk_clk_freq(chk_freq)) endfunction // chk_clk_freq - + //================================================= // // chk_prot_err_stat @@ -674,7 +677,7 @@ end function logic chk_clk_err_cnt(input int slot_id = 0); `SLOT_MACRO_FUNC(chk_clk_err_cnt()); endfunction // chk_clk_err_cnt - + //================================================= // // get_global_counter_0 @@ -698,5 +701,5 @@ end function logic [63:0] get_global_counter_1(input int slot_id = 0); `SLOT_MACRO_FUNC(get_global_counter_1()); endfunction // get_global_counter_1 - + `endif diff --git a/hdk/common/verif/models/base/gen_buf_t.sv b/hdk/common/verif/models/base/gen_buf_t.sv index addd93f87..5cf133dfc 100644 --- a/hdk/common/verif/models/base/gen_buf_t.sv +++ b/hdk/common/verif/models/base/gen_buf_t.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,7 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ //************************************************************************************* @@ -27,7 +29,7 @@ `define __DEFINED_GEN_BUF_T__ class gen_buf_t; - + logic[7:0] data[$]; bit print_ok_compare = 0; @@ -35,11 +37,11 @@ //Input size of buffer in bytes -- assume address of all f's is "null" function new (); endfunction - + //Initialization with incrementing data. Note this assumes empty array (queue), and adds entries to the array virtual function void init_inc(input[31:0] first_data, input int length = 4); bit[31:0] tmp_data; - + tmp_data = first_data; for (int i=0; i> 4; data_fp[i+1][(j*4+3) -: 4] = data_t[3:0];//7-4 data_t = data >> 8; data = data_t; end // for (int j=0; j<8; j++) - + $fdisplay(fp[i], "%0h %0h %0h %0h %h", bank_group_a, bank_a, row_a, col_a, data_fp[i] [31:0]); $fdisplay(fp[i+1], "%0h %0h %0h %0h %h", bank_group_a, bank_a, row_a, col_a, data_fp[i+1][31:0]); @@ -204,14 +207,14 @@ $fdisplay(fp[i+1], "%0h %0h %0h %0h %h", bank_group_b, bank_b, row_b, col_b, data_fp[i+1][31:0]); end - //ECC + //ECC $fdisplay(fp[14], "%0h %0h %0h %0h %h", bank_group_a, bank_a, row_a, col_a, 'h0); $fdisplay(fp[15], "%0h %0h %0h %0h %h", bank_group_a, bank_a, row_a, col_a, 'h0); //ECC $fdisplay(fp[14], "%0h %0h %0h %0h %h", bank_group_b, bank_b, row_b, col_b, 'h0); $fdisplay(fp[15], "%0h %0h %0h %0h %h", bank_group_b, bank_b, row_b, col_b, 'h0); - + for (int i=16; i<18; i=i+2) begin data_t = data; //Each device is 32-bits wide. 64-bit data is loaded as below. @@ -230,13 +233,13 @@ $fdisplay(fp[i], "%0h %0h %0h %0h %h", bank_group_b, bank_b, row_b, col_b, data_fp[i] [31:0]); $fdisplay(fp[i+1], "%0h %0h %0h %0h %h", bank_group_b, bank_b, row_b, col_b, data_fp[i+1][31:0]); end // for (int i=16; i<18; i=i+2) - + for (int i=8; i<13; i=i+2) begin data_t = data; //Each device is 32-bits wide. 64-bit data is loaded as below. for (int j=0; j<8; j++) begin data_fp[i][(j*4+3) -: 4] = data_t[3:0]; - + data_t = data >> 4; data_fp[i+1][(j*4+3) -: 4] = data_t[3:0]; @@ -249,13 +252,13 @@ $fdisplay(fp[i], "%0h %0h %0h %0h %h", bank_group_b, bank_b, row_b, col_b, data_fp[i] [31:0]); $fdisplay(fp[i+1], "%0h %0h %0h %0h %h", bank_group_b, bank_b, row_b, col_b, data_fp[i+1][31:0]); end // for (int i=8; i<13; i=i+2) - + endtask // write_bdr_ld_data_to_file task write_bdr_ld_raw_data_to_file(int ddr_file, logic [16:0] row_a, logic [1:0] bank_a, logic [9:0] col_a, logic [1:0] bank_group_a, logic [31:0] data); $fdisplay(ddr_file, "%0d %0d %0d %0d %h", bank_group_a, bank_a, row_a, col_a, data); endtask // write_bdr_ld_raw_data_to_file - + task ddr_bdr_ld(string file_name); logic [63:0] addr; logic [511:0] data; @@ -265,9 +268,9 @@ // Line buffer reg [12*100:1] line; int c; - + axi_fp = $fopen(file_name, "r"); - + for (int i=0; i<18; i++) begin ddr_name[i] = $sformatf("ddr4_ddr_%0d.mem", i); $display("ddr_name is %0s \n", ddr_name[i]); @@ -276,7 +279,7 @@ $display("Could not open file %s", ddr_name[i]); end end - //Config information for memory. + //Config information for memory. for (int i=0; i<18; i++) begin write_cfg_info_to_file(fp[i]); end @@ -297,7 +300,7 @@ end device_bdr_ld(); endtask // ddr_bdr_ld - + task device_bdr_ld(); for (int i=0; i<18; i++) begin ddr_name[i] = $sformatf("ddr4_ddr_%0d.mem", i); @@ -326,4 +329,3 @@ endtask // device_bdr_ld `endif//NO_DDR - diff --git a/hdk/common/verif/models/sh_bfm/axi_bfm_defines.svh b/hdk/common/verif/models/sh_bfm/axi_bfm_defines.svh index e8e8209dc..6b773f8e7 100644 --- a/hdk/common/verif/models/sh_bfm/axi_bfm_defines.svh +++ b/hdk/common/verif/models/sh_bfm/axi_bfm_defines.svh @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,7 +13,7 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. - +// ============================================================================ typedef struct { @@ -23,11 +24,10 @@ typedef struct { logic [1:0] resp; logic last; } AXI_Command; - + typedef struct { logic [511:0] data; logic [63:0] strb; logic [15:0] id; logic last; } AXI_Data; - diff --git a/hdk/common/verif/models/sh_bfm/axil_bfm.sv b/hdk/common/verif/models/sh_bfm/axil_bfm.sv index dcf17dc82..9baa44ff6 100644 --- a/hdk/common/verif/models/sh_bfm/axil_bfm.sv +++ b/hdk/common/verif/models/sh_bfm/axil_bfm.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,13 +13,15 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ -module axil_bfm + +module axil_bfm ( input axil_clk, input axil_rst_n, output logic axil_awvalid, - output logic [31:0] axil_awaddr, + output logic [31:0] axil_awaddr, input axil_awready, //Write data @@ -26,34 +29,34 @@ module axil_bfm output logic [31:0] axil_wdata, output logic [3:0] axil_wstrb, input axil_wready, - + //Write response input axil_bvalid, input [1:0] axil_bresp, output logic axil_bready, - + //Read address output logic axil_arvalid, output logic [31:0] axil_araddr, input axil_arready, - + //Read data/response input axil_rvalid, input [31:0] axil_rdata, input [1:0] axil_rresp, - + output logic axil_rready ); `include "axi_bfm_defines.svh" - + AXI_Command axil_wr_cmds[$]; AXI_Data axil_wr_data[$]; AXI_Command axil_rd_cmds[$]; AXI_Data axil_rd_data[$]; AXI_Command axil_b_resps[$]; - + bit debug; initial begin @@ -82,10 +85,10 @@ module axil_bfm if (axil_wr_cmds.size() != 0) begin axil_awaddr <= axil_wr_cmds[0].addr[31:0]; - + axil_awvalid <= !axil_awvalid ? 1'b1 : !axil_awready ? 1'b1 : 1'b0; - + if (axil_awready && axil_awvalid) begin if (debug) begin $display("[%t] : DEBUG popping cmd fifo - %d", $realtime, axil_wr_cmds.size()); @@ -109,17 +112,17 @@ module axil_bfm axil_wdata <= axil_wr_data[0].data[31:0]; axil_wstrb <= axil_wr_data[0].strb[3:0]; - + axil_wvalid <= !axil_wvalid ? 1'b1 : !axil_wready ? 1'b1 : 1'b0; - + if (axil_wready && axil_wvalid) begin if (debug) begin $display("[%t] : DEBUG popping wr data fifo - %d", $realtime, axil_wr_data.size()); end axil_wr_data.pop_front(); end - + end else axil_wvalid <= 1'b0; @@ -152,10 +155,10 @@ module axil_bfm if (axil_rd_cmds.size() != 0) begin axil_araddr <= axil_rd_cmds[0].addr[31:0]; - + axil_arvalid <= !axil_arvalid ? 1'b1 : !axil_arready ? 1'b1 : 1'b0; - + if (axil_arready && axil_arvalid) begin if (debug) begin $display("[%t] : DEBUG popping cmd fifo - %d", $realtime, axil_rd_cmds.size()); @@ -186,19 +189,19 @@ module axil_bfm $display("[%t] - DEBUG read data [%2d]: 0x%08h", $realtime, i, axil_rdata[(i*32)+:32]); end end - + axil_rd_data.push_back(data); end end - + task poke(input logic [31:0] addr, logic [31:0] data, int size = 2); AXI_Command axi_cmd; AXI_Data axi_data; - logic [1:0] resp; + logic [1:0] resp; logic [63:0] strb; axi_cmd.addr[31:0] = addr; @@ -222,19 +225,19 @@ module axil_bfm axi_data.last = 1'b1; #20ns axil_wr_data.push_back(axi_data); - + while (axil_b_resps.size() == 0) #20ns; - + resp = axil_b_resps[0].resp; axil_b_resps.pop_front(); - + endtask // poke task peek(input logic [31:0] addr, output logic [31:0] data, input int size = 2); AXI_Command axi_cmd; logic [31:0] mask; - + axi_cmd.addr[31:0] = addr; axi_cmd.len = 0; @@ -257,7 +260,7 @@ module axil_bfm data &= mask; axil_rd_data.pop_front(); - + endtask // peek diff --git a/hdk/common/verif/models/sh_bfm/axis_bfm.sv b/hdk/common/verif/models/sh_bfm/axis_bfm.sv index a094dfd64..46dee0058 100644 --- a/hdk/common/verif/models/sh_bfm/axis_bfm.sv +++ b/hdk/common/verif/models/sh_bfm/axis_bfm.sv @@ -1,7 +1,7 @@ -//------------------------------------------------------------------------------ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -13,16 +13,17 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. -//------------------------------------------------------------------------------ +// ============================================================================ + `include "anp_base_macros.svh" //------------------------------------------------------------------------------ // Module: axis_bfm // Main AXIS BFM module. Both of Master and Slave mode are implemented. -// Shall set the IS_MASTER parameter as below to selet the mode during +// Shall set the IS_MASTER parameter as below to selet the mode during // instantiation. -// Master mode -> IS_MASTER=1 +// Master mode -> IS_MASTER=1 // Slave mode -> IS_MASTER=0 //------------------------------------------------------------------------------ module axis_bfm #( @@ -36,7 +37,7 @@ module axis_bfm #( input wire axis_clk, input wire axis_rst_n, inout wire axis_valid, - inout wire [DATA_WIDTH-1:0] axis_data, + inout wire [DATA_WIDTH-1:0] axis_data, inout wire axis_last, inout wire [KEEP_WIDTH-1:0] axis_keep, inout wire [USER_WIDTH-1:0] axis_user, @@ -49,7 +50,7 @@ module axis_bfm #( // Local variables //--------------------------------------------------------------------------- logic m_axis_valid; - logic [DATA_WIDTH-1:0] m_axis_data; + logic [DATA_WIDTH-1:0] m_axis_data; logic m_axis_last; logic [KEEP_WIDTH-1:0] m_axis_keep; logic [USER_WIDTH-1:0] m_axis_user; @@ -123,7 +124,7 @@ module axis_bfm #( //--------------------------------------------------------------------------- // Drive Output signals //--------------------------------------------------------------------------- - generate + generate if (IS_MASTER == 1) begin : MASTER_MODE assign axis_valid = m_axis_valid; @@ -146,13 +147,13 @@ module axis_bfm #( generate if (IS_MASTER) begin : MASTER - - initial + + initial begin : READ_TEXT_STIMULUS string fname; - + wait (mbx_created_e.triggered); - + if (FILE_NAME == "") begin fname = {hdl_path, ".in"}; end @@ -164,7 +165,7 @@ module axis_bfm #( if (fp_i != 0) begin : OPENED read_file = 1; `anp_info( - {"read_stim: Driving master packet using stimulus file ", fname}, + {"read_stim: Driving master packet using stimulus file ", fname}, MSG_ID) axis_bfm_pkg::read_stim( @@ -173,17 +174,17 @@ module axis_bfm #( .msg_id (MSG_ID)); end : OPENED - + stim_done = 1; `anp_info("drive_stim: Done", MSG_ID) end : READ_TEXT_STIMULUS - - initial + + initial begin : DRIVE_TEXT_STIMULUS string fname; - + wait_out_of_reset($sformatf("drive_stim(%0d)", `__LINE__)); - + forever begin axis_bfm_pkt pkt; stim_mbx.get(pkt); @@ -191,7 +192,7 @@ module axis_bfm #( wait_clock(pkt.delay); drive_packet(pkt.data); end - + end : DRIVE_TEXT_STIMULUS end : MASTER @@ -313,10 +314,10 @@ module axis_bfm #( delay++; end - `anp_debug($sformatf("monitor_packet: Looking for next packet#%0d", + `anp_debug($sformatf("monitor_packet: Looking for next packet#%0d", packets), MSG_ID) - while ((axis_valid & axis_ready & axis_last) !== 1'b1) + while ((axis_valid & axis_ready & axis_last) !== 1'b1) begin : SAMPLE if ((axis_valid & axis_ready) === 1'b1) begin sampling <= 1; @@ -325,7 +326,7 @@ module axis_bfm #( pkt.data.push_back(axis_data[i*8+:8]); end end - `anp_debug($sformatf("monitor_packet: Sampling packet#%0d", + `anp_debug($sformatf("monitor_packet: Sampling packet#%0d", packets), MSG_ID) @ (posedge axis_clk); #1ns; @@ -355,7 +356,7 @@ module axis_bfm #( pkt.dump(fp_o, delay); end - `anp_info($sformatf("monitor_packet: Complete Sampling packet#%0d. %0s", + `anp_info($sformatf("monitor_packet: Complete Sampling packet#%0d. %0s", packets, pkt.print), MSG_ID) packets++; @@ -394,7 +395,7 @@ module axis_bfm #( drive_mbx .get(exp); monitor_mbx.get(act); void'(exp.compare( - .rhs (act), + .rhs (act), .message ($sformatf("%0s-SELF-CHECK Pkt-%0d", MSG_ID, packets)))); packets++; end @@ -402,4 +403,3 @@ module axis_bfm #( end endmodule : axis_bfm - diff --git a/hdk/common/verif/models/sh_bfm/axis_bfm_pkg.sv b/hdk/common/verif/models/sh_bfm/axis_bfm_pkg.sv index 89b7670f0..db0a69c56 100644 --- a/hdk/common/verif/models/sh_bfm/axis_bfm_pkg.sv +++ b/hdk/common/verif/models/sh_bfm/axis_bfm_pkg.sv @@ -1,7 +1,7 @@ -//------------------------------------------------------------------------------ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -13,7 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. -//------------------------------------------------------------------------------ +// ============================================================================ + `include "anp_base_macros.svh" @@ -47,11 +48,11 @@ package axis_bfm_pkg; //--------------------------------------------------------------------------- // Function: read_stim - // Common function to read the stimulus file that matched the AXIS packet + // Common function to read the stimulus file that matched the AXIS packet // stimulus format //--------------------------------------------------------------------------- task automatic read_stim( - axis_mbx_t mbx_h, + axis_mbx_t mbx_h, int fp, string msg_id ); @@ -60,11 +61,11 @@ package axis_bfm_pkg; int delay; _eof = 0; - + while (!_eof) begin string _line; int _line_ret; - + _line_ret = $fgets(_line, fp); _eof = $feof(fp); @@ -102,7 +103,7 @@ package axis_bfm_pkg; else if (first != "SOP" && first != "IDLE") begin int str_len; str_len = first.len(); - + if (str_len % 2) begin `anp_fatal({ "read_stim: Detected HEX data length which is not aligned with format. ", @@ -114,7 +115,7 @@ package axis_bfm_pkg; int data_value; data_value = first.substr(b, b+1).atohex(); data_tmp.push_back(data_value); - `anp_debug($sformatf("read_stim: Pushed 0x%02H into data_tmp. data_tmp.size=%0d", + `anp_debug($sformatf("read_stim: Pushed 0x%02H into data_tmp. data_tmp.size=%0d", data_value, data_tmp.size()), msg_id) end @@ -221,7 +222,7 @@ package axis_bfm_pkg; end else begin `anp_info($sformatf( - "compare: (%0s) Passed! PacketLength=%0d", + "compare: (%0s) Passed! PacketLength=%0d", message, rhs_size)) end return result; @@ -239,4 +240,3 @@ package axis_bfm_pkg; endclass : axis_bfm_pkt endpackage : axis_bfm_pkg - diff --git a/hdk/common/verif/models/sh_bfm/axis_sim/clean.sh b/hdk/common/verif/models/sh_bfm/axis_sim/clean.sh index a44211034..d126450bd 100755 --- a/hdk/common/verif/models/sh_bfm/axis_sim/clean.sh +++ b/hdk/common/verif/models/sh_bfm/axis_sim/clean.sh @@ -1,5 +1,23 @@ #!/bin/bash +# ============================================================================= +# Amazon FPGA Hardware Development Kit +# +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# +# Licensed under the Amazon Software License (the "License"). You may not use +# this file except in compliance with the License. A copy of the License is +# located at +# +# http://aws.amazon.com/asl/ +# +# or in the "license" file accompanying this file. This file is distributed on +# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or +# implied. See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================= + + rm -rf csrc rm -rf *.out rm -rf *.in @@ -10,4 +28,3 @@ rm -rf *.vpd rm -rf passed rm -rf failed rm -rf DVEfiles - diff --git a/hdk/common/verif/models/sh_bfm/axis_sim/genstim.sh b/hdk/common/verif/models/sh_bfm/axis_sim/genstim.sh index c4c2834ff..35fb13adb 100755 --- a/hdk/common/verif/models/sh_bfm/axis_sim/genstim.sh +++ b/hdk/common/verif/models/sh_bfm/axis_sim/genstim.sh @@ -1,5 +1,23 @@ #!/bin/bash +# ============================================================================= +# Amazon FPGA Hardware Development Kit +# +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# +# Licensed under the Amazon Software License (the "License"). You may not use +# this file except in compliance with the License. A copy of the License is +# located at +# +# http://aws.amazon.com/asl/ +# +# or in the "license" file accompanying this file. This file is distributed on +# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or +# implied. See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================= + + ./runme.sh +GEN_STIM +AXIS_DUMP_PACKET +AXIS_DUMP_PACKET_WITH_IDLE +ntb_random_seed=9 +PACKETS=50 +MIN_LEN=20 +MAX_LEN=1516 cp -rf master.out $CL_DIR/verif/scripts/stimulus/mac0_tx.in @@ -10,4 +28,3 @@ cp -rf master.out $CL_DIR/verif/scripts/stimulus/mac1_tx.in cp -rf master.out $CL_DIR/verif/scripts/stimulus/h2c.in ./clean.sh - diff --git a/hdk/common/verif/models/sh_bfm/axis_sim/runme.sh b/hdk/common/verif/models/sh_bfm/axis_sim/runme.sh index fc4b7deb0..5daa8280a 100755 --- a/hdk/common/verif/models/sh_bfm/axis_sim/runme.sh +++ b/hdk/common/verif/models/sh_bfm/axis_sim/runme.sh @@ -1,5 +1,23 @@ #!/bin/bash +# ============================================================================= +# Amazon FPGA Hardware Development Kit +# +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# +# Licensed under the Amazon Software License (the "License"). You may not use +# this file except in compliance with the License. A copy of the License is +# located at +# +# http://aws.amazon.com/asl/ +# +# or in the "license" file accompanying this file. This file is distributed on +# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or +# implied. See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================= + + vcs -R -sverilog +vcs+lic+wait\ -timescale=1ns/1ns\ -debug_access+all\ @@ -12,5 +30,4 @@ vcs -R -sverilog +vcs+lic+wait\ +ANP_MSG_SHOW_FILE_INFO\ +AXIS_DUMP_MONITORED_PACKET\ -l sim.log\ - $* - + $* diff --git a/hdk/common/verif/models/sh_bfm/axis_sim/test.sv b/hdk/common/verif/models/sh_bfm/axis_sim/test.sv index fae2576c4..83c4367fe 100644 --- a/hdk/common/verif/models/sh_bfm/axis_sim/test.sv +++ b/hdk/common/verif/models/sh_bfm/axis_sim/test.sv @@ -1,3 +1,21 @@ +// ============================================================================ +// Amazon FPGA Hardware Development Kit +// +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// +// Licensed under the Amazon Software License (the "License"). You may not use +// this file except in compliance with the License. A copy of the License is +// located at +// +// http://aws.amazon.com/asl/ +// +// or in the "license" file accompanying this file. This file is distributed on +// an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or +// implied. See the License for the specific language governing permissions and +// limitations under the License. +// ============================================================================ + + module test(); import axis_bfm_pkg::*; @@ -9,12 +27,12 @@ module test(); logic axis_clk; logic axis_rst_n; wire axis_valid; - wire [DATA_WIDTH-1:0] axis_data; + wire [DATA_WIDTH-1:0] axis_data; wire axis_last; wire [KEEP_WIDTH-1:0] axis_keep; wire [USER_WIDTH-1:0] axis_user; wire axis_ready; - + axis_bfm #( .FILE_NAME ("master"), .DATA_WIDTH (DATA_WIDTH), @@ -70,7 +88,7 @@ module test(); for (int i = 0; i < size; i++) begin if (i < size) data[i] = tmp_data[8*i[1:0]+:8]; if (i[1:0] == 2'b11) tmp_data++; - end + end c.data = data; master.drive_packet(c.data); end @@ -91,4 +109,3 @@ module test(); final anp_base_pkg::end_of_test(); endmodule : test - diff --git a/hdk/common/verif/models/sh_bfm/axis_sim/testme.sh b/hdk/common/verif/models/sh_bfm/axis_sim/testme.sh index 066093768..af6d0c534 100755 --- a/hdk/common/verif/models/sh_bfm/axis_sim/testme.sh +++ b/hdk/common/verif/models/sh_bfm/axis_sim/testme.sh @@ -1,5 +1,23 @@ #!/bin/bash +# ============================================================================= +# Amazon FPGA Hardware Development Kit +# +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# +# Licensed under the Amazon Software License (the "License"). You may not use +# this file except in compliance with the License. A copy of the License is +# located at +# +# http://aws.amazon.com/asl/ +# +# or in the "license" file accompanying this file. This file is distributed on +# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or +# implied. See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================= + + ./runme.sh\ +AXIS_CHECK_DRIVE_AND_MONITOR +AXIS_RAND_READY\ +GEN_STIM +AXIS_DUMP_PACKET +AXIS_DUMP_PACKET_WITH_IDLE\ @@ -11,4 +29,3 @@ cp -rf master.out master.in +AXIS_CHECK_DRIVE_AND_MONITOR +AXIS_RAND_READY ./clean.sh - diff --git a/hdk/common/verif/models/sh_bfm/sh_bfm.sv b/hdk/common/verif/models/sh_bfm/sh_bfm.sv index 48a8ac3fe..1cf83eb9f 100644 --- a/hdk/common/verif/models/sh_bfm/sh_bfm.sv +++ b/hdk/common/verif/models/sh_bfm/sh_bfm.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + `ifndef TB_TOP `define TB_TOP tb diff --git a/hdk/common/verif/models/sh_bfm/sh_bfm_defines.svh b/hdk/common/verif/models/sh_bfm/sh_bfm_defines.svh index 1d523ac0e..1ec01f9ca 100644 --- a/hdk/common/verif/models/sh_bfm/sh_bfm_defines.svh +++ b/hdk/common/verif/models/sh_bfm/sh_bfm_defines.svh @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + `ifndef SH_BFM_DEFINES `define SH_BFM_DEFINES diff --git a/hdk/common/verif/models/stream_bfm/stream_bfm.sv b/hdk/common/verif/models/stream_bfm/stream_bfm.sv index 2ca02d36a..7c92edf9f 100644 --- a/hdk/common/verif/models/stream_bfm/stream_bfm.sv +++ b/hdk/common/verif/models/stream_bfm/stream_bfm.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + //Note KEEP_WIDTH is same as number of bytes in data bus module stream_bfm #(parameter DATA_WIDTH=512, parameter KEEP_WIDTH=DATA_WIDTH/8, parameter USER_WIDTH=64)( @@ -24,13 +27,13 @@ module stream_bfm #(parameter DATA_WIDTH=512, parameter KEEP_WIDTH=DATA_WIDTH/8, input ins_last, input[USER_WIDTH-1:0] ins_user, output logic ins_ready, - + output logic[DATA_WIDTH-1:0] ots_data, output logic[KEEP_WIDTH-1:0] ots_keep, output logic[USER_WIDTH-1:0] ots_user, output logic ots_valid, output logic ots_last, - input ots_ready + input ots_ready ); gen_buf_t tx_pkt_q[$]; @@ -86,14 +89,14 @@ endfunction // Get RX Packet Queue size //---------------------------------- function int get_rx_pkt_q_size(); - get_rx_pkt_q_size = rx_pkt_q.size(); + get_rx_pkt_q_size = rx_pkt_q.size(); endfunction //---------------------------------- // Get TX Packet Queue size //---------------------------------- function int get_tx_pkt_q_size(); - get_tx_pkt_q_size = tx_pkt_q.size(); + get_tx_pkt_q_size = tx_pkt_q.size(); endfunction //--------------------------------------- @@ -121,7 +124,7 @@ endfunction //---------------------------------------------------------------------- //---------------------------------------------------------------------- -// BFM functionality +// BFM functionality //---------------------------------------------------------------------- //---------------------------------------------------------------------- @@ -150,7 +153,7 @@ task tx_pkt_thread; for (int i=0; i<4; i++) if (cur_pkt.data.size() > i) data[8*i+:8] = cur_pkt.data[i]; - + num_phases = cur_pkt.data.size()/(KEEP_WIDTH); if ((cur_pkt.data.size() % KEEP_WIDTH) != 0) begin @@ -208,7 +211,7 @@ task rx_pkt_thread; gen_buf_t cur_pkt; - bit pkt_inp; + bit pkt_inp; logic[31:0] tmp_data; @@ -222,7 +225,7 @@ task rx_pkt_thread; //If not currently receiving a packet create a new packet if (!pkt_inp) begin - cur_pkt = new(); + cur_pkt = new(); pkt_inp = 1; end @@ -238,10 +241,10 @@ task rx_pkt_thread; rx_pkt_q.push_back(cur_pkt); rx_pkt_user_q.push_back(ins_user); end - + pkt_inp = 0; - - //Get first DW of data for display + + //Get first DW of data for display tmp_data = 0; for (int i=0; i<4; i++) if (cur_pkt.data.size() > i) @@ -265,7 +268,7 @@ task ins_bp_thread; int dly; - forever + forever begin while (!ins_bp_en) @(posedge clk); @@ -284,7 +287,7 @@ task ins_bp_thread; end endtask - + //-------------------------------------------------------------------------- // Reaset thread //-------------------------------------------------------------------------- @@ -305,7 +308,7 @@ endtask initial begin - fork + fork rst_thread; tx_pkt_thread; rx_pkt_thread; @@ -314,4 +317,3 @@ begin end endmodule - diff --git a/hdk/common/verif/packages/anp_base_macros.svh b/hdk/common/verif/packages/anp_base_macros.svh index 57c52fc32..68c99ef12 100644 --- a/hdk/common/verif/packages/anp_base_macros.svh +++ b/hdk/common/verif/packages/anp_base_macros.svh @@ -1,7 +1,7 @@ -//------------------------------------------------------------------------------ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -13,7 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. -//------------------------------------------------------------------------------ +// ============================================================================ + `ifndef __ANP_BASE_MACROS_SVH__ `define __ANP_BASE_MACROS_SVH__ @@ -118,4 +119,3 @@ `define anp_base_urm_cov_parg(MSG_ID=msg_id) `endif//__ANP_BASE_MACROS_SVH__ - diff --git a/hdk/common/verif/packages/anp_base_pkg.sv b/hdk/common/verif/packages/anp_base_pkg.sv index 800bf8cfc..d04ef2c85 100644 --- a/hdk/common/verif/packages/anp_base_pkg.sv +++ b/hdk/common/verif/packages/anp_base_pkg.sv @@ -1,7 +1,7 @@ -//------------------------------------------------------------------------------ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -13,7 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. -//------------------------------------------------------------------------------ +// ============================================================================ + package anp_base_pkg; @@ -64,5 +65,3 @@ package anp_base_pkg; endfunction : end_of_test endpackage : anp_base_pkg - - diff --git a/hdk/common/verif/scripts/cl_ports_gen.pl b/hdk/common/verif/scripts/cl_ports_gen.pl index 8a891816a..09bda7f78 100755 --- a/hdk/common/verif/scripts/cl_ports_gen.pl +++ b/hdk/common/verif/scripts/cl_ports_gen.pl @@ -1,8 +1,9 @@ #!/usr/bin/env perl -#------------------------------------------------------------------------------- + +# ============================================================================= # Amazon FPGA Hardware Development Kit # -# Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Amazon Software License (the "License"). You may not use # this file except in compliance with the License. A copy of the License is @@ -14,7 +15,8 @@ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or # implied. See the License for the specific language governing permissions and # limitations under the License. -#------------------------------------------------------------------------------- +# ============================================================================= + #=============================================================================== # Perl libs to be used in this script. diff --git a/hdk/common/verif/scripts/compile_cl_ips.py b/hdk/common/verif/scripts/compile_cl_ips.py index bd59629f1..e9fb75886 100755 --- a/hdk/common/verif/scripts/compile_cl_ips.py +++ b/hdk/common/verif/scripts/compile_cl_ips.py @@ -1,8 +1,9 @@ #!/usr/bin/env python3 +# ============================================================================= # Amazon FPGA Hardware Development Kit # -# Copyright 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Amazon Software License (the "License"). You may not use # this file except in compliance with the License. A copy of the License is @@ -14,6 +15,8 @@ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or # implied. See the License for the specific language governing permissions and # limitations under the License. +# ============================================================================= + import os import sys diff --git a/hdk/common/verif/scripts/convert_eth_stim_type0.pl b/hdk/common/verif/scripts/convert_eth_stim_type0.pl index 54843f711..2371cbcc3 100755 --- a/hdk/common/verif/scripts/convert_eth_stim_type0.pl +++ b/hdk/common/verif/scripts/convert_eth_stim_type0.pl @@ -1,8 +1,9 @@ #!/usr/bin/env perl -#------------------------------------------------------------------------------- + +# ============================================================================= # Amazon FPGA Hardware Development Kit # -# Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Amazon Software License (the "License"). You may not use # this file except in compliance with the License. A copy of the License is @@ -14,7 +15,8 @@ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or # implied. See the License for the specific language governing permissions and # limitations under the License. -#------------------------------------------------------------------------------- +# ============================================================================= + #=============================================================================== # Perl libs to be used in this script. @@ -131,4 +133,3 @@ sub debug { my $s = shift; print "-D- $s\n" if defined $ENV{DEBUG_PRINT}; } - diff --git a/hdk/common/verif/scripts/convert_eth_stim_type1.pl b/hdk/common/verif/scripts/convert_eth_stim_type1.pl index d29fb1128..9ef3ce004 100755 --- a/hdk/common/verif/scripts/convert_eth_stim_type1.pl +++ b/hdk/common/verif/scripts/convert_eth_stim_type1.pl @@ -1,8 +1,9 @@ #!/usr/bin/env perl -#------------------------------------------------------------------------------- + +# ============================================================================= # Amazon FPGA Hardware Development Kit # -# Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Amazon Software License (the "License"). You may not use # this file except in compliance with the License. A copy of the License is @@ -14,7 +15,8 @@ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or # implied. See the License for the specific language governing permissions and # limitations under the License. -#------------------------------------------------------------------------------- +# ============================================================================= + #=============================================================================== # Perl libs to be used in this script. @@ -135,4 +137,3 @@ sub debug { my $s = shift; print "-D- $s\n" if defined $ENV{DEBUG_PRINT}; } - diff --git a/hdk/common/verif/scripts/generate_sim_file_list.py b/hdk/common/verif/scripts/generate_sim_file_list.py index 18181d808..828fc2bf1 100755 --- a/hdk/common/verif/scripts/generate_sim_file_list.py +++ b/hdk/common/verif/scripts/generate_sim_file_list.py @@ -1,13 +1,22 @@ #!/usr/bin/env python3 # ============================================================================= -# Copyright 2023 Amazon.com, Inc. or its affiliates. -# All Rights Reserved Worldwide. -# Amazon Confidential information -# Restricted NDA Material +# Amazon FPGA Hardware Development Kit +# +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# +# Licensed under the Amazon Software License (the "License"). You may not use +# this file except in compliance with the License. A copy of the License is +# located at +# +# http://aws.amazon.com/asl/ +# +# or in the "license" file accompanying this file. This file is distributed on +# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or +# implied. See the License for the specific language governing permissions and +# limitations under the License. # ============================================================================= - import os import fileinput from glob import glob @@ -29,7 +38,7 @@ def get_generated_file_list(cl_dir, simulator): all_file_objects: list[str] = glob(f'{cl_dir}/design/**', recursive=True) all_file_paths = [obj for obj in all_file_objects if os.path.isfile(obj)] all_dir_paths = [obj for obj in all_file_objects if os.path.isdir(obj)] - + generated_file_list = [''] for dir_path in all_dir_paths: generated_file_list.append(INCLUDE_SYNTAX[simulator.lower()] + dir_path.replace(cl_dir, '$CL_DIR')) @@ -51,7 +60,7 @@ def update_sim_file_list(cl_dir, simulator, generated_file_list): print(line, end='') for generated_line in generated_file_list: print(generated_line, end='\n') - + if IN_GENERATE_BLOCK and "END AUTO-GENERATE" in line: IN_GENERATE_BLOCK = False diff --git a/hdk/common/verif/scripts/log_regression_results.py b/hdk/common/verif/scripts/log_regression_results.py index 57dbe97ce..e5809829e 100755 --- a/hdk/common/verif/scripts/log_regression_results.py +++ b/hdk/common/verif/scripts/log_regression_results.py @@ -1,8 +1,9 @@ #!/usr/bin/env python3 +# ============================================================================= # Amazon FPGA Hardware Development Kit # -# Copyright 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Amazon Software License (the "License"). You may not use # this file except in compliance with the License. A copy of the License is @@ -14,6 +15,7 @@ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or # implied. See the License for the specific language governing permissions and # limitations under the License. +# ============================================================================= import os @@ -90,7 +92,7 @@ def warn_of_test_count_mismatch(self) -> None: num_test_results: int = len(self.test_results.values()) if num_test_results != len(expected_test_list): found_tests: List[str] = list(self.test_results.keys()) - raise Exception(f""" + print(f""" WARNING: Found {num_test_results} test results in 'sim' directory, but found {len(expected_test_list)} in {self.makefile_testlist_path}. EXPECTED: {expected_test_list} diff --git a/hdk/common/verif/tb/filelists/cl_verif_files.vh b/hdk/common/verif/tb/filelists/cl_verif_files.vh index 9f4616bd6..1eeac7f2f 100644 --- a/hdk/common/verif/tb/filelists/cl_verif_files.vh +++ b/hdk/common/verif/tb/filelists/cl_verif_files.vh @@ -1,7 +1,7 @@ -//------------------------------------------------------------------------------ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -13,7 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. -//------------------------------------------------------------------------------ +// ============================================================================ + // File: cl_verif_files.vh // File that includes all of the CL common testbench sources. @@ -33,4 +34,3 @@ `include "verif/tb/sv/tb.sv" `endif//__CL_VERIF_FILES_VH__ - diff --git a/hdk/common/verif/tb/filelists/tb.questa.f b/hdk/common/verif/tb/filelists/tb.questa.f index 2856c6933..be93482e8 100644 --- a/hdk/common/verif/tb/filelists/tb.questa.f +++ b/hdk/common/verif/tb/filelists/tb.questa.f @@ -1,6 +1,7 @@ +# ============================================================================= # Amazon FPGA Hardware Development Kit # -# Copyright 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Amazon Software License (the "License"). You may not use # this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or # implied. See the License for the specific language governing permissions and # limitations under the License. +# ============================================================================= + +define+QUESTA_SIM +define+CARD_1=card diff --git a/hdk/common/verif/tb/filelists/tb.vcs.f b/hdk/common/verif/tb/filelists/tb.vcs.f index 3c09ec1d1..dd9f598ba 100644 --- a/hdk/common/verif/tb/filelists/tb.vcs.f +++ b/hdk/common/verif/tb/filelists/tb.vcs.f @@ -1,6 +1,7 @@ +# ============================================================================= # Amazon FPGA Hardware Development Kit # -# Copyright 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Amazon Software License (the "License"). You may not use # this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or # implied. See the License for the specific language governing permissions and # limitations under the License. +# ============================================================================= + +define+VCS_SIM +define+CARD_1=card diff --git a/hdk/common/verif/tb/filelists/tb.xsim.f b/hdk/common/verif/tb/filelists/tb.xsim.f index 72f0ef27f..3bc30764b 100644 --- a/hdk/common/verif/tb/filelists/tb.xsim.f +++ b/hdk/common/verif/tb/filelists/tb.xsim.f @@ -1,6 +1,7 @@ +# ============================================================================= # Amazon FPGA Hardware Development Kit # -# Copyright 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Amazon Software License (the "License"). You may not use # this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or # implied. See the License for the specific language governing permissions and # limitations under the License. +# ============================================================================= + -define VIVADO_SIM -define CARD_1=card diff --git a/hdk/common/verif/tb/scripts/Makefile b/hdk/common/verif/tb/scripts/Makefile index 548a15236..3252237f8 100644 --- a/hdk/common/verif/tb/scripts/Makefile +++ b/hdk/common/verif/tb/scripts/Makefile @@ -1,7 +1,7 @@ -#------------------------------------------------------------------------------- +# ============================================================================= # Amazon FPGA Hardware Development Kit # -# Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Amazon Software License (the "License"). You may not use # this file except in compliance with the License. A copy of the License is @@ -13,7 +13,8 @@ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or # implied. See the License for the specific language governing permissions and # limitations under the License. -#------------------------------------------------------------------------------- +# ============================================================================= + include $(HDK_COMMON_DIR)/verif/tb/scripts/Makefile.ip_gen models: $(HDK_COMMON_DIR)/verif/scripts/.done diff --git a/hdk/common/verif/tb/scripts/Makefile.common.inc b/hdk/common/verif/tb/scripts/Makefile.common.inc index e1e920fa2..9c9fc0397 100644 --- a/hdk/common/verif/tb/scripts/Makefile.common.inc +++ b/hdk/common/verif/tb/scripts/Makefile.common.inc @@ -1,7 +1,7 @@ -#------------------------------------------------------------------------------- +# ============================================================================= # Amazon FPGA Hardware Development Kit # -# Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Amazon Software License (the "License"). You may not use # this file except in compliance with the License. A copy of the License is @@ -13,9 +13,10 @@ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or # implied. See the License for the specific language governing permissions and # limitations under the License. -#------------------------------------------------------------------------------- +# ============================================================================= -all: change_simulated_dimm_size make_sim_dir compile run + +all: make_sim_dir compile run define \n @@ -39,9 +40,7 @@ help: ## Display this help $(info $(\t)QUESTA - Set this to use the Modelsim Questa simulator) $(info ) $(info SH_DDR Configuration: "make USE_64GB_DDR_DIMM=1") - $(info $(\t)USE_32GB_DDR_DIMM (DEFAULT) - Set this to use a 32GB DDR DIMM for simulations) - $(info $(\t)USE_64GB_DDR_DIMM - Set this to use a 64GB DDR DIMM for simulations) - $(info $(\t)USE_AP_32GB_DDR_DIMM - Set this to use a 32GB DDR DIMM with user-controlled Auto Precharge for simulations) + $(info $(\t)USE_64GB_DDR_DIMM (DEFAULT) - Set this to use a 64GB DDR DIMM for simulations) $(info $(\t)USE_AP_64GB_DDR_DIMM - Set this to use a 64GB DDR DIMM with user-controlled Auto Precharge for simulations) $(info $(\n)) @@ -89,28 +88,12 @@ PLUSARGS += +plusarg_save +timeout=1ms DDR4_RDIMM_WRAPPER = $(HDK_COMMON_DIR)/verif/models/ddr4_rdimm_wrapper/ddr4_rdimm_wrapper.sv DIMM_REPLACEMENT = "NONE" -ifeq ($(USE_64GB_DDR_DIMM), 1) - DEFAULT_DEFINES += $(call define, USE_64GB_DDR_DIMM=1) - DIMM_REPLACEMENT = sed -i s/_8G/_16G/g $(DDR4_RDIMM_WRAPPER) +ifeq ($(USE_AP_64GB_DDR_DIMM), 1) + DEFAULT_DEFINES += $(call define, USE_AP_64GB_DDR_DIMM=1) else - ifeq ($(USE_AP_64GB_DDR_DIMM), 1) - DEFAULT_DEFINES += $(call define, USE_AP_64GB_DDR_DIMM=1) - DIMM_REPLACEMENT = sed -i s/_8G/_16G/g $(DDR4_RDIMM_WRAPPER) - else - ifeq ($(USE_AP_32GB_DDR_DIMM), 1) - DEFAULT_DEFINES += $(call define, USE_AP_32GB_DDR_DIMM=1) - DIMM_REPLACEMENT = sed -i s/_16G/_8G/g $(DDR4_RDIMM_WRAPPER) - else - DEFAULT_DEFINES += $(call define, USE_32GB_DDR_DIMM=1) - DIMM_REPLACEMENT = sed -i s/_16G/_8G/g $(DDR4_RDIMM_WRAPPER) - endif - endif + DEFAULT_DEFINES += $(call define, USE_64GB_DDR_DIMM=1) endif -change_simulated_dimm_size: - $(DIMM_REPLACEMENT) - echo "Updating simulated DIMM configuration: $(DIMM_REPLACEMENT)" - # Simulation variables and directory name changes ifeq ($(C_TEST),test_null) diff --git a/hdk/common/verif/tb/scripts/Makefile.header.inc b/hdk/common/verif/tb/scripts/Makefile.header.inc index fa7c1f7c2..f08622765 100644 --- a/hdk/common/verif/tb/scripts/Makefile.header.inc +++ b/hdk/common/verif/tb/scripts/Makefile.header.inc @@ -1,3 +1,21 @@ +# ============================================================================= +# Amazon FPGA Hardware Development Kit +# +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# +# Licensed under the Amazon Software License (the "License"). You may not use +# this file except in compliance with the License. A copy of the License is +# located at +# +# http://aws.amazon.com/asl/ +# +# or in the "license" file accompanying this file. This file is distributed on +# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or +# implied. See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================= + + ifndef VIVADO_TOOL_VERSION $(error Environment variable VIVADO_TOOL_VERSION not set. Please source hdk_setup.sh) else diff --git a/hdk/common/verif/tb/scripts/Makefile.ip_gen b/hdk/common/verif/tb/scripts/Makefile.ip_gen index 1579f4830..d6eba4a3b 100644 --- a/hdk/common/verif/tb/scripts/Makefile.ip_gen +++ b/hdk/common/verif/tb/scripts/Makefile.ip_gen @@ -1,7 +1,7 @@ -#------------------------------------------------------------------------------- +# ============================================================================= # Amazon FPGA Hardware Development Kit # -# Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Amazon Software License (the "License"). You may not use # this file except in compliance with the License. A copy of the License is @@ -13,7 +13,8 @@ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or # implied. See the License for the specific language governing permissions and # limitations under the License. -#------------------------------------------------------------------------------- +# ============================================================================= + # # Command wrapper API source diff --git a/hdk/common/verif/tb/scripts/Makefile.questa.inc b/hdk/common/verif/tb/scripts/Makefile.questa.inc index 263a0bada..081e33036 100644 --- a/hdk/common/verif/tb/scripts/Makefile.questa.inc +++ b/hdk/common/verif/tb/scripts/Makefile.questa.inc @@ -1,6 +1,7 @@ +# ============================================================================= # Amazon FPGA Hardware Development Kit # -# Copyright 2022 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Amazon Software License (the "License"). You may not use # this file except in compliance with the License. A copy of the License is @@ -12,6 +13,7 @@ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or # implied. See the License for the specific language governing permissions and # limitations under the License. +# ============================================================================= clean: diff --git a/hdk/common/verif/tb/scripts/Makefile.vcs.inc b/hdk/common/verif/tb/scripts/Makefile.vcs.inc index 7111238a9..f99cb0df9 100644 --- a/hdk/common/verif/tb/scripts/Makefile.vcs.inc +++ b/hdk/common/verif/tb/scripts/Makefile.vcs.inc @@ -1,6 +1,7 @@ +# ============================================================================= # Amazon FPGA Hardware Development Kit # -# Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Amazon Software License (the "License"). You may not use # this file except in compliance with the License. A copy of the License is @@ -12,6 +13,7 @@ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or # implied. See the License for the specific language governing permissions and # limitations under the License. +# ============================================================================= clean: @@ -47,4 +49,3 @@ ifeq ($(TEST),test_null) else cd $(SIM_DIR) && ./simv -l $(TEST).log $(PLUSARGS) +ntb_random_seed_automatic +vpdfile+$(TEST).vpd | $(FILTER_OUT_HBM_META_INJECTIONS) endif - diff --git a/hdk/common/verif/tb/scripts/Makefile.xsim.inc b/hdk/common/verif/tb/scripts/Makefile.xsim.inc index c6a08d224..43ccb6780 100644 --- a/hdk/common/verif/tb/scripts/Makefile.xsim.inc +++ b/hdk/common/verif/tb/scripts/Makefile.xsim.inc @@ -1,6 +1,7 @@ +# ============================================================================= # Amazon FPGA Hardware Development Kit # -# Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Amazon Software License (the "License"). You may not use # this file except in compliance with the License. A copy of the License is @@ -12,6 +13,7 @@ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or # implied. See the License for the specific language governing permissions and # limitations under the License. +# ============================================================================= clean: diff --git a/hdk/common/verif/tb/scripts/simapi.sh b/hdk/common/verif/tb/scripts/simapi.sh index 7b32515ea..c651f4a9e 100755 --- a/hdk/common/verif/tb/scripts/simapi.sh +++ b/hdk/common/verif/tb/scripts/simapi.sh @@ -1,8 +1,9 @@ #!/bin/bash -#------------------------------------------------------------------------------- + +# ============================================================================= # Amazon FPGA Hardware Development Kit # -# Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Amazon Software License (the "License"). You may not use # this file except in compliance with the License. A copy of the License is @@ -14,7 +15,8 @@ # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or # implied. See the License for the specific language governing permissions and # limitations under the License. -#------------------------------------------------------------------------------- +# ============================================================================= + if [ ! -z "$SIMSCR_DEBUG" ] then @@ -136,4 +138,3 @@ function post_ip_gen () { . $dir/post_gen.sh rm -f $dir/post_gen.sh } # post_ip_gen - diff --git a/hdk/common/verif/tb/sv/dma_classes.sv b/hdk/common/verif/tb/sv/dma_classes.sv index e69a60b8a..66fc9144d 100644 --- a/hdk/common/verif/tb/sv/dma_classes.sv +++ b/hdk/common/verif/tb/sv/dma_classes.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + // This has DMA helper classes //-------------------------------------- @@ -1347,4 +1350,3 @@ task post_c2h_desc_thread(input int max_num_desc=64); endtask endclass - diff --git a/hdk/common/verif/tb/sv/tb.sv b/hdk/common/verif/tb/sv/tb.sv index 277fdac69..f66e07ba4 100644 --- a/hdk/common/verif/tb/sv/tb.sv +++ b/hdk/common/verif/tb/sv/tb.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,6 +13,8 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + module tb(); import "DPI-C" function string getenv(input string env_name); diff --git a/hdk/common/verif/tb/sv/tb_type_defines_pkg.sv b/hdk/common/verif/tb/sv/tb_type_defines_pkg.sv index 24827a1bb..fb71ad707 100644 --- a/hdk/common/verif/tb/sv/tb_type_defines_pkg.sv +++ b/hdk/common/verif/tb/sv/tb_type_defines_pkg.sv @@ -1,6 +1,7 @@ +// ============================================================================ // Amazon FPGA Hardware Development Kit // -// Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Amazon Software License (the "License"). You may not use // this file except in compliance with the License. A copy of the License is @@ -12,31 +13,34 @@ // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or // implied. See the License for the specific language governing permissions and // limitations under the License. +// ============================================================================ + + `define MAXWAITS 100000 package tb_type_defines_pkg; // clk_main_a0 clk_extra_a1 clk_extra_a2 clk_extra_a3 // Recipe A0 (Default) 125 62.5 187.5 250 // Recipe A1 250 125 375 500 // Recipe A2 15.625 15.625 125 62.5 -// Recipe A3 62.5 31.25 250 125 -// Recipe A4 225 112.5 337.5 450 -// Recipe A5 200 100 300 400 - -// clk_extra_b0 clk_extra_b1 -// Recipe B0 (Default) 250 125 -// Recipe B1 125 62.5 +// Recipe A3 62.5 31.25 250 125 +// Recipe A4 225 112.5 337.5 450 +// Recipe A5 200 100 300 400 + +// clk_extra_b0 clk_extra_b1 +// Recipe B0 (Default) 250 125 +// Recipe B1 125 62.5 // Recipe B2 450 225 // Recipe B3 250 62.5 // Recipe B4 300 75 // Recipe B5 400 100 // Recipe B6 350 87.5 - -// clk_extra_c0 clk_extra_c1 -// Recipe C0 (Default) 300 400 -// Recipe C1 150 200 + +// clk_extra_c0 clk_extra_c1 +// Recipe C0 (Default) 300 400 +// Recipe C1 150 200 // Recipe C2 75 100 // Recipe C3 200 266.67 - + virtual class ClockRecipe; typedef enum integer {A0=0, A1=1, A2=2, A3=3, A4=4, A5=5} A_RECIPE; typedef enum integer {B0=0, B1=1, B2=2, B3=3, B4=4, B5=5, B6=6} B_RECIPE; @@ -46,9 +50,9 @@ package tb_type_defines_pkg; virtual class DataSize; typedef enum integer {UINT8=0, UINT16=1, UINT32=2, UINT64=3, UINT128=4, UINT256=5, UINT512=6} DATA_SIZE; endclass // DataSize - + virtual class AxiPort; typedef enum integer {PORT_DMA_PCIS=0, PORT_SDA=1, PORT_OCL=2, PORT_BAR1=3} AXI_PORT; endclass // AxiPort - + endpackage diff --git a/hdk/docs/AWS_CLK_GEN_spec.md b/hdk/docs/AWS_CLK_GEN_spec.md index 059a5c380..b8aad494a 100644 --- a/hdk/docs/AWS_CLK_GEN_spec.md +++ b/hdk/docs/AWS_CLK_GEN_spec.md @@ -1,8 +1,8 @@ -# AWS_CLK_GEN - CL Clock Generator Block +# AWS_CLK_GEN - CL Clock Generator ## Table of Contents -- [AWS\_CLK\_GEN - CL Clock Generator Block](#aws_clk_gen---cl-clock-generator-block) +- [AWS\_CLK\_GEN - CL Clock Generator](#aws_clk_gen---cl-clock-generator) - [Table of Contents](#table-of-contents) - [Introduction](#introduction) - [Architecture Overview](#architecture-overview) @@ -17,13 +17,13 @@ F1 Shell provides eight clocks to the CL and supports multiple [clock recipes](https://github.com/aws/aws-fpga/blob/master/hdk/docs/clock_recipes.csv) to choose from at the time of CL builds. It also allows to scale clock frequencies during runtime (or after AFI/bitstream is loaded into FPGA) using [dynamic_clock_config](https://github.com/aws/aws-fpga/blob/master/hdk/docs/dynamic_clock_config.md). While this architecture provides multiple clock choices for customer designs, it locks up the global clock routing resources in the CL region. This can pose limitations for customers who do not require all the clocks provided from Shell to the CL. -Therefore, F2 Shell provides only two clocks - `clk_main_a0` and `clk_hbm_ref` - to the CL resulting in efficient use of global routing resources. The `clk_main_a0` is currently a fixed frequency 250MHz clock (:exclamation: multiple clock recipes support and dynamic scaling of frequency as F1 using the SW APIs are coming soon). The `clk_hbm_ref` is a fixed frequency 100MHz clock which can be used by customer as a reference clock for their MMCMs. This scheme provides flexibility for customers to devise their own clocking mechanisms with desired number of clocks. +Therefore, F2 Shell provides only two clocks - `clk_main_a0` and `clk_hbm_ref` - to the CL resulting in efficient use of global routing resources. The `clk_main_a0` is currently a fixed frequency 250MHz clock (:exclamation: dynamic scaling of frequency as F1 using the SW APIs will be added in a future release). The `clk_hbm_ref` is a fixed frequency 100MHz clock which can be used by customer as a reference clock for their MMCMs. This scheme provides flexibility for customers to devise their own clocking mechanisms with desired number of clocks. -In order to provide F1’s clock recipes in F2, as well as support Vitis development in F2, AWS offers Clock Generator Block called as AWS_CLK_GEN. AWS_CLK_GEN block provides various clocks to the CL design and supports dynamic frequency scaling. The Vitis XSA for F2 relies on AWS_CLK_GEN IP for all the clocking needs in the design. This document details the Microarchitecture Specifictaion for AWS_CLK_GEN IP. +In order to provide F1’s clock recipes in F2, as well as support Vitis development in F2, AWS offers the Clock Generator (AWS_CLK_GEN) IP. AWS_CLK_GEN provides various clocks to the CL design and supports dynamic frequency scaling. The Vitis XSA for F2 relies on AWS_CLK_GEN for all the clocking needs in the design. This document details the Microarchitecture Specification for AWS_CLK_GEN. -:warning: The AWS_CLK_GEN block instantiation **must** be named to `AWS_CLK_GEN` and located in the CL top module. +:warning: The AWS_CLK_GEN instantiation **must** be named to `AWS_CLK_GEN` and located in the CL top module. -:warning: The AWS_CLK_GEN block is optional for CL designs that do not require same clocking scheme as F1. This block is not required if the CL designs use only `clk_main_a0` and/or `clk_hbm_ref`. +:warning: The AWS_CLK_GEN is optional for CL designs that do not require same clocking scheme as F1. This block is not required if the CL designs use only `clk_main_a0` and/or `clk_hbm_ref`. ## Architecture Overview @@ -35,7 +35,7 @@ Figure 1 below shows an overview of the AWS_CLK_GEN IP. It primarily consists of 3. AXI-Lite address decoder. -4. AXI-Lite clock convertor. +4. AXI-Lite clock converter. 5. AXI-Lite interface to connect to the AWS Shell or user defined address space. @@ -43,9 +43,9 @@ Figure 1 below shows an overview of the AWS_CLK_GEN IP. It primarily consists of ## Clock and Reset -The AWS_CLK_GEN block requires following primary clocks and resets as inputs: +The AWS_CLK_GEN IP requires following primary clocks and resets as inputs: -1. clk_hbm_ref : This is fixed frequency 100MHz clock from the Shell. This is used as primary clock for the entire AWS_CLK_GEN IP block including the MMCMs and AWS_REGS. +1. clk_hbm_ref : This is fixed frequency 100MHz clock from the Shell. This is used as primary clock for the entire IP block including the MMCMs and AWS_REGS. 2. clk_main_a0 : This is interface clock from Shell whose frequency is scaled by the Shell but maxes out at 250MHz. 3. rst_main_n : Active low reset from Shell. @@ -53,12 +53,12 @@ The AWS_CLK_GEN block requires following primary clocks and resets as inputs: | **Port Name** | **Direction** | **Description** | |--------------------|------------------------------|-----------------------------------------------------------------------------------------------------------------------------------| -| i_clk_hbm_ref | input | HBM ref clock from Shell. Fixed Frequency of 100MHz. | -| i_clk_main_a0 | input | clk_main_a0 from Shell | -| i_rst_main_n | input | rst_main_n from Shell sync'ed to clk_main_a0 from Shell | -| s_sh_cl_cctrl_axil | AXI-L Consumer (s) interface | AXI-Lite interface to access address space of the IP. Recommend connecting this interface to AXI-Lite on PF1-BAR4 from the Shell. | -| clk_hbm_ref | output | pass through of input clk_hbm_ref from Shell. | -| clk_main_a0 | output | pass through of input clk_main_a0 from Shell. | +| i_clk_hbm_ref | input | HBM ref clock from the Shell. Fixed frequency of 100MHz. | +| i_clk_main_a0 | input | clk_main_a0 from the Shell | +| i_rst_main_n | input | rst_main_n from Shell sync'ed to clk_main_a0 | +| s_sh_cl_cctrl_axil | AXI-L Consumer interface | AXI-Lite interface to access address space of the IP. Recommend connecting this interface to AXI-Lite on PF1-BAR4 from the Shell. | +| clk_hbm_ref | output | Pass-through of input clk_hbm_ref from the Shell. | +| clk_main_a0 | output | Pass-through of input clk_main_a0 from the Shell. | | clk_extra_a1 | output | Max frequency = 125 MHz | | clk_extra_a2 | output | Max frequency = 375 MHz | | clk_extra_a3 | output | Max frequency = 500 MHz | @@ -92,30 +92,30 @@ The AXI-Lite address space is decoded as shown in the table below: **NOTES**: -1. Refer to the clkgen CLIs in [FPGA Management Tools](./../../sdk/userspace/fpga_mgmt_tools/README.md) for setting the output clock frequency of AWS_CLK_GEN IP. +1. Refer to the `_clkgen` CLIs in [FPGA Management Tools](./../../sdk/userspace/fpga_mgmt_tools/README.md) for setting the output clock frequencies of AWS_CLK_GEN IP. 2. Write access to undefined address space is ignored. Reading from undefined address space returns 0xDEAD_DEC0. Reading from undefined address space within MMCM results in MMCM’s default behavior. AWS_CLK_GEN IP does not have any protection against illegal use of MMCMs. User discretion is recommended regarding such accesses. ## Register Definitions -Following registers are housed inside AWS_CLK_REGS block and are accessible from the AXIL interface from base address = BASE_REG as described in [Address Space](#ancAddressSpace) +Following registers are housed inside AWS_CLK_REGS component and are accessible from the AXIL interface from base address = `BASE_REG` as described in [Address Space](#ancAddressSpace) -| **Address offset** | **Register Name** | **Bits** | **Access** | **Default Value** | **Description** | +| **Address Offset** | **Register Name** | **Bits** | **Access** | **Default Value** | **Description** | |--------------------|-------------------|----------|------------|-------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| 0x00 | ID_REG | 31:0 | RO | 0x9048_1D0F | 32 bit value to uniquely identify AWS_CLK_GEN IP | +| 0x00 | ID_REG | 31:0 | RO | 0x9048_1D0F | 32-bit value to uniquely identify the AWS_CLK_GEN IP | | 0x04 | VER_REG | 31:0 | RO | 0x0201_0000 | Version Register | | 0x08 | BUILD_REG | 31:0 | RO | 0x0923_2223 | build timestamp in 0xMM_DD_YY_HH format | | | | | | | | | 0x0C | CLKS_AVAIL_REG | 31:9 | RO | 0x0 | Reserved | -| | | 8 | RO | 0x1 | 1 = clk_hbm_axi available \| 0 = clock unavilable | -| | | 7 | RO | 0x1 | 1 = clk_extra_c1 available \| 0 = clock unavilable | -| | | 6 | RO | 0x1 | 1 = clk_extra_c0 available \| 0 = clock unavilable | -| | | 5 | RO | 0x1 | 1 = clk_extra_b1 available \| 0 = clock unavilable | -| | | 4 | RO | 0x1 | 1 = clk_extra_b0 available \| 0 = clock unavilable | -| | | 3 | RO | 0x1 | 1 = clk_extra_a3 available \| 0 = clock unavilable | -| | | 2 | RO | 0x1 | 1 = clk_extra_a2 available \| 0 = clock unavilable | -| | | 1 | RO | 0x1 | 1 = clk_extra_a1 available \| 0 = clock unavilable | -| | | 0 | RO | 0x1 | 1 = clk_main_a0 available \| 0 = clock unavilable | +| | | 8 | RO | 0x1 | 1 = clk_hbm_axi available \| 0 = clock unavailable | +| | | 7 | RO | 0x1 | 1 = clk_extra_c1 available \| 0 = clock unavailable | +| | | 6 | RO | 0x1 | 1 = clk_extra_c0 available \| 0 = clock unavailable | +| | | 5 | RO | 0x1 | 1 = clk_extra_b1 available \| 0 = clock unavailable | +| | | 4 | RO | 0x1 | 1 = clk_extra_b0 available \| 0 = clock unavailable | +| | | 3 | RO | 0x1 | 1 = clk_extra_a3 available \| 0 = clock unavailable | +| | | 2 | RO | 0x1 | 1 = clk_extra_a2 available \| 0 = clock unavailable | +| | | 1 | RO | 0x1 | 1 = clk_extra_a1 available \| 0 = clock unavailable | +| | | 0 | RO | 0x1 | 1 = clk_main_a0 available \| 0 = clock unavailable | | | | | | | | | 0x10 | G_RST_REG | 31:0 | RW | 0x0 | Write 0xFFFF_FFFF to globally reset AWS_CLK_GEN IP. Following blocks are affected: - Assert reset to all MMCMs - Assert reset to SYS_RST and its output to CL Write 0x0000_0000 to de-assert global resets | | | | | | | | @@ -146,7 +146,7 @@ Following registers are housed inside AWS_CLK_REGS block and are accessible from | | | 1 | RO | 0x0 | Reserved | | | | 0 | RO | 0x0 | 1 = MMCM_BASE_A locked | -*NOTE*: Write access to undefined address space is ignored. Reading from undefined address space returns 0xDEAD_DEC0. +**NOTE**: Write access to undefined address space is ignored. Reading from undefined address space returns `0xDEAD_DEC0`. ## Clock Recipes User Guide diff --git a/hdk/docs/AWS_Shell_ERRATA.md b/hdk/docs/AWS_Shell_ERRATA.md index 21f509a40..1821e0084 100644 --- a/hdk/docs/AWS_Shell_ERRATA.md +++ b/hdk/docs/AWS_Shell_ERRATA.md @@ -17,7 +17,6 @@ ## Unsupported Features -- End-to-End virtual ethernet example with live traffic currently not supported in F2 - HBM metrics not yet supported ## Known Bugs/Issues diff --git a/hdk/docs/AWS_Shell_Interface_Specification.md b/hdk/docs/AWS_Shell_Interface_Specification.md index 8f5dacd87..6b6fc26ff 100644 --- a/hdk/docs/AWS_Shell_Interface_Specification.md +++ b/hdk/docs/AWS_Shell_Interface_Specification.md @@ -16,19 +16,19 @@ - [DDR4 AXI](#ddr4-axi) - [DMA](#dma) - [Interfaces between Shell and CL](#interfaces-between-shell-and-cl) - - [CL/Shell AXI Interfaces (AXI-4 and AXI-Lite)](#clshell-axi-interfaces-axi-4-and-axi-lite) + - [CL/Shell AXI Interfaces](#clshell-axi-interfaces) - [Clocks and Reset](#clocks-and-reset) - [Clocks](#clocks) - [Reset](#reset) - - [PCIS Interface -- AXI-4 for Inbound PCIe Transactions (Shell is Requester, CL is Completer, 512-bit)](#pcis-interface----axi-4-for-inbound-pcie-transactions-shell-is-requester-cl-is-completer-512-bit) + - [PCIS Interface](#pcis-interface) - [PCIS Interface Timeout Details](#pcis-interface-timeout-details) - - [PCIM interface -- AXI-4 for Outbound PCIe Transactions (CL is Requester, Shell is Completer, 512-bit)](#pcim-interface----axi-4-for-outbound-pcie-transactions-cl-is-requester-shell-is-completer-512-bit) + - [PCIM interface](#pcim-interface) - [Outbound PCIe AXI-4 Interface Restrictions](#outbound-pcie-axi-4-interface-restrictions) - [Byte Enable Rules](#byte-enable-rules) - [AXI4 Error Handling for CL outbound Transactions](#axi4-error-handling-for-cl-outbound-transactions) - - [AXI-Lite Interfaces for Register Access -- (SDA, OCL)](#axi-lite-interfaces-for-register-access----sda-ocl) - - [AXI Completer (AXI-Lite/PCIS) CL Error Reporting](#axi-completer-axi-litepcis-cl-error-reporting) - - [Accessing Aligned/Unaligned Addresses from PCIe (Shell is Requester, CL is Completer)](#accessing-alignedunaligned-addresses-from-pcie-shell-is-requester-cl-is-completer) + - [SDA/OCL AXI-Lite Interfaces for Register Access](#sdaocl-axi-lite-interfaces-for-register-access) + - [CL AXI Completer Error Reporting](#cl-axi-completer-error-reporting) + - [Accessing Aligned/Unaligned Addresses from PCIe](#accessing-alignedunaligned-addresses-from-pcie) - [Interrupts](#interrupts) - [HBM Monitor Interface](#hbm-monitor-interface) - [Miscellaneous Signals](#miscellaneous-signals) @@ -88,8 +88,8 @@ The following diagram and table summarize the various interfaces between the She | OCL | The OCL Interface is an AXI-Lite interface associated with AppPF and BAR0. Please refer to the [AXI-Lite Interfaces](#axi-lite-interfaces-for-register-access----sda-ocl) for more information. | | Miscellaneous | There are various generic signals, such as ID's, status, counters, etc., between the Shell and CL that are described in the [Miscellaneous Signals](#miscellaneous-signals) section. | | SDA | The SDA Interface is an AXI-Lite interface associated with MgmtPF and BAR4. Please refer to the [AXI-Lite Interfaces](#axi-lite-interfaces-for-register-access----sda-ocl) for more information. | -| HBM MON APB | The HBM monitor interfaces. Customers using HBM IP are required to connect these interfacse to the HBM IP. Refer to the [HBM monitor interface](#hbm-monitor-interface) for more information| -| DDR4 Stats | This is the control interface from the Shell to the DDR4 Controller in the CL. Shell uses this interface to calibrate the DDR core. Refer to the [DDR4 DRAM](#ddr4-dram) section for more information. Refer to [HBM Monitor Interface](#hbm-monitor-interface) section for more information. | +| HBM MON APB | The HBM monitor interfaces. Customers using HBM IP are required to connect these interfaces to the HBM IP. Refer to the [HBM monitor interface](#hbm-monitor-interface) for more information.| +| DDR4 Stats | This is the control interface from the Shell to the DDR4 Controller in the CL. Shell uses this interface to calibrate the DDR core. Refer to the [DDR4 DRAM](#ddr4-dram) section for more information.| | Interrupts | There are 16 user interrupts available. Refer to the [Interrupts](#interrupts) section for more information. | ## External FPGA Interfaces @@ -146,9 +146,9 @@ The Developer can write drivers for the AppPF or leverage the reference driver p The PCIe interface connecting the FPGA to the instance is in the Shell, and the CL can access it through two AXI-4 interfaces: -- [PCI Completer (PCIS)](#pcis-interface----axi-4-for-inbound-pcie-transactions-shell-is-requester-cl-is-completer-512-bit) +- [PCI Completer (PCIS)](#pcis-interface) -- [PCI Requester (PCIM)](#pcim-interface----axi-4-for-outbound-pcie-transactions-cl-is-requester-shell-is-completer-512-bit) +- [PCI Requester (PCIM)](#pcim-interface) ### DDR4 DRAM @@ -179,9 +179,9 @@ There is an integrated DMA controller inside the XDMA Shell (Xilinx DMA, not sup ## Interfaces between Shell and CL -### CL/Shell AXI Interfaces (AXI-4 and AXI-Lite) +### CL/Shell AXI Interfaces -All interfaces use the AXI-4 or AXI-Lite protocol. The AXI-L buses are for register access use cases, and can access lower speed control interfaces that use the AXI-Lite protocol. +All AXI interfaces use the AXI-4 or AXI-Lite protocol. The AXI-L buses are for register access use cases, and can access lower speed control interfaces that use the AXI-Lite protocol. For bulk data transfer, wide AXI-4 buses are used. AXI-4 on the CL/Shell interfaces have the following restrictions: @@ -211,23 +211,22 @@ The Shell provides 250MHz `clk_main_a0` and 100MHz `hbm_ref_clk` from shell-to-C Please note that the extensive list of clocks and resets, as compared to F1 shell, are removed from Shell-CL interface. This improves overall routability for the CL designs that do not require all those multiple clocks from the Shell. However, AWS offers [AWS_CLK_GEN](./AWS_CLK_GEN_spec.md) IP that supports multiple clocks, resets and clock recipes similar to F1. The AWS_CLK_GEN IP can be optionally instantiated in the CL for an easier migration of designs from F1 involving multiple clocks. [CL_MEM_PERF](./../cl/examples/cl_mem_perf/design/cl_mem_perf.sv) demonstrates integration of [AWS_CLK_GEN IP](../common/lib/aws_clk_gen.sv) into CL design. -Please refer to [Clock_Recipes_User_Guide.md](./Clock_Recipes_User_Guide.md) for details on supported clock recipes in F2, dynamic clock reconfiguration and specifying clock recipes during the build time. +Please refer to the [Clock_Recipes_User_Guide.md](./Clock_Recipes_User_Guide.md) for details on supported clock recipes in F2, dynamic clock reconfiguration and specifying clock recipes during the build time. -Similar to F1, the `clk_main_a0` in F2 also supports multiple clock recipes and the frequency can be scaled using SW APIs at the time of AFI loads. +Similar to F1, the `clk_main_a0` in F2 also supports multiple clock recipes and the frequency can be scaled using SW APIs at the time of AFI loads (this feature is currently not available and will be added in a future +release). #### Reset The shell provides an active-low reset signal synchronous to clk_main_a0: rst_main_n. This is an active low reset signal, and combines the board reset and PCIe link-level reset conditions. -### PCIS Interface -- AXI-4 for Inbound PCIe Transactions (Shell is Requester, CL is Completer, 512-bit) +### PCIS Interface -This AXI-4 bus is used for: +This an 512-bit wide AXI-4 interface for Inbound PCIe Transactions (Shell is Requester, CL is Completer). It is used for: - PCIe transactions initiated by the instance and targeting AppPF BAR4 (PCIS) - DMA transactions (if enabled) (XDMA) -It is a 512-bit wide AXI-4 interface. - A read or write request on this AXI-4 bus that is not acknowledged by the CL within a certain time window, will be internally terminated by the Shell. If the time-out error happens on a read, the Shell will return `0xFFFFFFFF` data back to the instance. This error is reported through the Management PF and can be retrieved by the AFI Management Tools metric reporting APIs. The AXI ID can be used to determine the source of the transaction: @@ -247,15 +246,16 @@ The PCIS interface multiplexes the XDMA requests and PCIS requests. Each type o Transactions on the PCIS interface must complete before the associated timeout time or the SH will timeout the transactions and complete the transactions on behalf of the CL (BVALID/RVALID). Each "issued" transaction has an independent timeout counter. For example if 4 transactions are issued from the PCIS interface "simultaneously" (i.e. back-to-back cycles), then all 4 must complete within 8us. A transaction is considered "issued" when the AxVALID is asserted for the transaction by the Timeout Detection block. AxREADY does not have to be asserted for the transaction to be considered "issued". Note there is a 16 deep clock crossing FIFO between the Timeout Detection block and the CL logic. So if the CL is asserting backpressure (de-asserting AxVALID) there can still be 16 transactions issued by the Timeout Detection block. The SH supports a maximum of 32 transactions outstanding for each type (read/write). It is advisable for the CL to implement enough buffering for 32 transactions per type so that it is aware of all issued transactions. -Once a transaction is issued, it must fully be completed within the timeout time (Address, Data, Ready). Any transaction that does not completed in time will be terminated by the shell. This means write data will be accepted and thrown away, and default data (0xffffffff) will be returned for reads. +Once a transaction is issued, it must fully be completed within the timeout time (Address, Data, Ready). Any transaction that does not completed in time will be terminated by the shell. This means write data will be accepted and thrown away, and default data `0xFFFFFFFF` will be returned for reads. If a timeout occurs, the Shell will timeout all further transactions in 16ns for a moderation time (4ms). -**WARNING**: If a timeout happens the DMA/PCIS interface may no longer be functional and the AFI/Shell must be re-loaded. This can be done by adding the "-F" option to fpga-load-local-image. +**WARNING**: If a timeout happens, the DMA/PCIS interface may no longer be functional and the AFI/Shell must be re-loaded. This can be done by adding the "-F" option to `fpga-load-local-image`. -### PCIM interface -- AXI-4 for Outbound PCIe Transactions (CL is Requester, Shell is Completer, 512-bit) +### PCIM interface -This is a 512-bit wide AXI-4 interface for the CL to initiate cycles to the PCIe bus. This can be used, for example, to push data from the CL to instance memory, or read from the instance memory. +This is an 512-bit wide AXI-4 interface for Outbound PCIe Transactions (CL is +Requester, Shell is Completer). It is used by the CL to initiate cycles to the PCIe bus, for example, to push data from the CL to instance memory, or read from the instance memory. :warning: **The CL must use physical addresses, and developers must be careful not to use userspace/virtual addresses.** @@ -313,50 +313,51 @@ Transactions on AXI4 interface will be terminated and reported as SLVERR on the :warning: **If a timeout occurs, the PCIM bus will no longer be functional. This can be cleared by clearing/re-loading the AFI.** -### AXI-Lite Interfaces for Register Access -- (SDA, OCL) +### SDA/OCL AXI-Lite Interfaces for Register Access -There are three AXI-L requester interfaces (Shell is requester) that can be used for register access interfaces. Each interface is sourced from a different PCIe PF/BAR. Breaking this into multiple interfaces allows for different software entities to have a control interface into the CL: +There are two AXI-L requester interfaces (Shell is Requester) that can be used for register access interfaces. Each interface is sourced from a different PCIe PF/BAR. Breaking this into multiple interfaces allows for different software entities to have a control interface into the CL: -- SDA AXI-L: Associated with MgmtPF, BAR4. If the developer is using AWS OpenCL runtime Lib (as in SDAccel case), this interface will be used for performance monitors etc. -- OCL AXI-L: Associated with AppPF, BAR0. If the developer is using AWS OpenCL runtime lib(as in SDAccel case), this interface will be used for openCL Kernel access +- OCL AXI-L: Associated with AppPF, BAR0. If the developer is using AWS OpenCL runtime lib(as in SDAccel case), this interface will be used for OpenCL Kernel access -Please refer to [PCI Address map](./AWS_Fpga_Pcie_Memory_Map.md) for a more detailed view of the address map. +- SDA AXI-L: Associated with MgmtPF, BAR4. If the developer is using AWS OpenCL runtime Lib (as in SDAccel case), this interface will be used for performance monitors etc. This interface is also used for accessing the [AWS_CLK_GEN IP](./AWS_CLK_GEN_spec.md) for CL clock management. + +Please refer to [PCI Address Map](./AWS_Fpga_Pcie_Memory_Map.md) for a more detailed view of the address map. -#### AXI Completer (AXI-Lite/PCIS) CL Error Reporting +#### CL AXI Completer Error Reporting -Each AXI (AXI-4/AXI-L) transaction is terminated with a response (BRESP/RRESP). The AXI responses may signal an error such as Completer Error, or Decode Error. PCIe also has error reporting for non-posted requests (Unsupported Requests/Completer Abort). The shell does not propagate the AXI-4 error responses to the PCIe bus. All PCIe cycles are terminated with non-errored responses. The AXI-4 errors are reported through the Management PF and can be retrieved by the AFI Management Tools metric reporting APIs. +Each AXI (AXI-4/AXI-L) transaction is terminated with a response (BRESP/RRESP). The AXI responses may signal an error such as Completer Error, or Decode Error. PCIe also has error reporting for non-posted requests (Unsupported Requests/Completer Abort). The shell does not propagate the AXI-4 error responses to the PCIe bus. All PCIe cycles are terminated with non-error responses. The AXI-4 errors are reported through the Management PF and can be retrieved by the AFI Management Tools metric reporting APIs. -### Accessing Aligned/Unaligned Addresses from PCIe (Shell is Requester, CL is Completer) +### Accessing Aligned/Unaligned Addresses from PCIe -The Shell supports DW aligned and unaligned transfers from PCIe (address is aligned/not aligned to DW-4byte boundary) +The Shell (Requester) supports DW aligned and unaligned transfers from PCIe (address is aligned/unaligned to DW-4byte boundary) -Following are a few examples of how aligned and Unaligned access from PCIe to CL on PCIS interface work: +Following are a few examples of how aligned and unaligned access from PCIe to CL on PCIS interface work: 1) Writing 8 bytes to DW aligned address through PCIe on AXI4 Interface(PCIS 512-bit interface): If the transaction on the PCIe is as follows: - Addr : 0x0000002000000000 - dw_cnt : 2 - first_be : 4’b1111 - last_be : 4’b1111 + - Addr : 0x0000002000000000 + - dw_cnt : 2 + - first_be : 4’b1111 + - last_be : 4’b1111 Then the transaction on the AXI4 interface will have the following AXI attributes: - awaddr 64’h0000_0000_0000_0000 - awlen = 0 - wstrb = 64’h0000_0000_0000_00ff + - awaddr 64’h0000_0000_0000_0000 + - awlen = 0 + - wstrb = 64’h0000_0000_0000_00ff - 2) Writing 8 bytes to DW un-aligned address on AXI4 Interface(PCIS 512-bit interface): + 2) Writing 8 bytes to DW unaligned address on AXI4 Interface(PCIS 512-bit interface): If the transaction on the PCIe is as follows: - Addr : 0x0000002000000001 - dw_cnt : 3 - first_be : 4’b1110 - last_be : 4’b0001 + - Addr : 0x0000002000000001 + - dw_cnt : 3 + - first_be : 4’b1110 + - last_be : 4’b0001 Then the transaction on the AXI4 interface will have the following AXI attributes: - awddr = 64’h0000_0000_0000_0001 - awlen = 0 - wstrb = 64’h0000_0000_0000_01fe + - awaddr = 64’h0000_0000_0000_0001 + - awlen = 0 + - wstrb = 64’h0000_0000_0000_01fe The addresses for the Read transactions will work similar to writes. @@ -364,9 +365,9 @@ The addresses for the Read transactions will work similar to writes. If a transaction from PCIe is initiated on AXI-Lite (SDA/OCL) interfaces with dw_cnt greater than 1, i.e. >32bits, the transaction is split into multiple 32-bit transactions by the Shell. -Following are a few examples of how aligned and Unaligned access from PCIe to CL on SDA/OCL/BAR1 AXI-Lite interfaces work: +Following are a few examples of how aligned and Unaligned access from PCIe to CL on SDA/OCL AXI-Lite interfaces work: -1. Writing 8 bytes to DW aligned address on AXI Lite interface (SDA/OCL/BAR1 32-bit interface): +1. Writing 8 bytes to DW aligned address on AXI Lite interface (SDA/OCL 32-bit interface): If the transaction on the PCIe is as follows: Addr : 0x0000000002000000 @@ -377,31 +378,36 @@ Following are a few examples of how aligned and Unaligned access from PCIe to CL Then the transaction on the AXI-Lite interface will be split and will have the following AXI attributes: Transaction is split into 2 transfers. - 1st transfer awaddr = 32’h0000_0000 - wstrb = 4’hf + 1st transfer + - awaddr = 32’h0000_0000 + - wstrb = 4’hf - 2nd transfer awaddr = 32’h0000_0004 - wstrb = 4’hf + 2nd transfer + - awaddr = 32’h0000_0004 + - wstrb = 4’hf -2. Writing 64 bits to DW un aligned address on AXI Lite interface (SDA/OCL/BAR1 32-bit interface): +1. Writing 64 bits to DW unaligned address on AXI Lite interface (SDA/OCL 32-bit interface): - If the transaction on the PCIe is as follows: - Addr : 0x0000000002000001 - dw_cnt : 3 - first_be : 4’b1110 - last_be : 4’b0001 + If the transaction on the PCIe is as follows: + -Addr : 0x0000000002000001 + -dw_cnt : 3 + -first_be : 4’b1110 + -last_be : 4’b0001 Transaction on AXI-Lite interface will be split and will have the following AXI attributes: Transaction is split into 3 transfers. - 1st transfer awaddr = 32’h0000_0001 - wstrb = 4’he + 1st transfer + - awaddr = 32’h0000_0001 + - wstrb = 4’he - 2nd transfer awaddr = 32’h0000_0004 - wstrb = 4’hf + 2nd transfer + - awaddr = 32’h0000_0004 + - wstrb = 4’hf - 3rd transfer awaddr = 32’h0000_0008 - wstrb = 4’h1 + 3rd transfer + - awaddr = 32’h0000_0008 + - wstrb = 4’h1 The transaction splitting and addresses for the Read transactions will work similar to writes. @@ -424,7 +430,7 @@ When the interfaces are connected to the HBM IP properly, the shell monitors the The active-low `hbm_apb_preset` signal connected to each HBM rack remains at logic-high during power-on and normal operation. This allows the HBM to initialize and communicate with the rest of the CL logic. If an HBM access violation (i.e., an APB transaction to an undefined address space) occurs, the shell will pull the `hbm_apb_preset` signal low to force a reset of the HBM rack. Subsequent usage of this rack is blocked. The customer must reload the AFI to get it recovered from this blocked state. -These steps must be followed to properly conect the monitor interfaces to HBM: +These steps must be followed to properly connect the monitor interfaces to HBM: 1. Expose the HBM monitor I/Os on the HBM IP by running the following Tcl commands in the Vivado IP management project: @@ -434,9 +440,9 @@ These steps must be followed to properly conect the monitor interfaces to HBM: true ``` - **NOTE:** This step can be skipped if the customer uses the `CL_HBM` IP from the [CL examples](./../README.md#cl-examples). This IP has the `MON_APB` interface enabled and is ready to be integrated to a customer design as-is. + **NOTE:** This step can be skipped if the customer uses the `CL_HBM` IP from the [CL examples](./../../hdk/common/ip/cl_ip/). This IP has the `MON_APB` interface enabled and is ready to be integrated to a customer design as-is. -2. Connect the HBM monitor interface from the shell to the HBM IP. The customer can leave the interface floating if the corresponding HBM rack is not used. For example, the `hbm_apb_p_1` signals can be left unconnected if HBM 1 is unused. +2. Connect the HBM monitor interface from the shell to the HBM IP. The customer can leave the interface floating if the corresponding HBM rack is not used. For example, the `hbm_apb_p_1` signals can be left unconnected if HBM rack 1 is unused. 3. All the HBM monitor interfaces are synchronized to the 100MHz `clk_hbm_ref` clock. @@ -529,45 +535,46 @@ It is ideal to place logic that interfaces to the shell in the same SLR as the S - MID SLR: - PCIM - OCL - - BAR1 - SDA - MID/BOTTOM - - HBM Mon APB + - HBM MON APB -Please see [shell_floorplan.md](./shell_floorplan.md) for additional details on Shell-CL interface placements in SMALL_SHELL. +Please see the [Shell Floorplan](./shell_floorplan.md) for additional details on Shell-CL interface placements in SMALL_SHELL. For the interfaces that are in both the MID/BOTTOM the recommendation is to use flops for pipelining, but don’t constrain to an SLR. You can constrain logic to a particular SLR by creating PBLOCKs (one per SLR), and assigning logic to the PBLOCKs (refer to cl_dram_hbm_dma example [small_shell_cl_pnr_user.xdc](../cl/examples/cl_dram_hbm_dma/build/constraints/small_shell_cl_pnr_user.xdc)). Dataflow should be mapped so that SLR crossing is minimized (for example a pipeline should be organized such that successive stages are mostly in the same SLR). -Here’s an example post on the Xilinx forum which points to some documentation related to solving this: - - -There are some good timing closure tips in this methodology doc pointed to by the Xilinx forum post: - +There are some good timing closure tips in this [UltraFast Design Methodology Guide](https://docs.amd.com/r/2024.1-English/ug949-vivado-design-methodology/Introduction) ### Logic Levels You can report all paths that are greater than a certain number of logic levels. This can be used to iterate on timing in synthesis rather than waiting for place and route. For example at 250MHz a general rule of thumb is try to keep logic levels to around 10. The following commands report on all paths that have more than 10 logic levels: -- report_design_analysis -logic_level_distribution -of [get_timing_paths -max_paths 10000 -filter {LOGIC_LEVELS > **10**}] -- foreach gtp [get_timing_paths -max_paths 5000 ?nworst 100 -filter {LOGIC_LEVELS > **10**}] {puts "[get_property STARTPOINT_PIN $gtp] [get_property ENDPOINT_PIN $gtp] [get_property SLACK $gtp] [get_propert LOGIC_LEVELS $gtp]"} +``` Tcl +report_design_analysis -logic_level_distribution -of [get_timing_paths -max_paths 10000 -filter {LOGIC_LEVELS > **10**}] + +foreach gtp [get_timing_paths -max_paths 5000 ?nworst 100 -filter {LOGIC_LEVELS > **10**}] { + puts "[get_property STARTPOINT_PIN $gtp] + [get_property ENDPOINT_PIN $gtp] [get_property SLACK $gtp] + [get_propert LOGIC_LEVELS $gtp]" +``` ### Reset Reset fanout can be minimized in an FPGA. This helps with routing congestion. Flops can be initialized in their declaration and generally do not require resets: ```verilog - logic[3:0] my_flops = 4’ha; + logic[3:0] my_flops = 4'ha; ``` If logic must have a reset, use synchronous resets rather than asynchronous resets: ```verilog always @(posedge clk) - if (reset) - my_flop <= 4’ha; - else - my_flop <= nxt_my_flop; + if (reset) + my_flop <= 4'ha; + else + my_flop <= nxt_my_flop; ``` If there is still significant fanout of reset, it should be replicated and pipelined. For example each major block could have its own pipelined version of reset. @@ -591,4 +598,4 @@ Vivado has some nice analysis capabilities: - physical implementation analysis (placement, routing) - linked timing/schematic/physical views - +Refer to [Vivado Design Suite User Guide](https://docs.amd.com/r/en-US/ug906-vivado-design-analysis/Routing-Analysis) for more information. diff --git a/hdk/docs/Clock_Recipes_User_Guide.md b/hdk/docs/Clock_Recipes_User_Guide.md index 69c1d5851..4c04f62e0 100644 --- a/hdk/docs/Clock_Recipes_User_Guide.md +++ b/hdk/docs/Clock_Recipes_User_Guide.md @@ -5,7 +5,7 @@ - [F2 Clock Recipes User Guide](#f2-clock-recipes-user-guide) - [Table of Content](#table-of-content) - [Introduction](#introduction) - - [F2 Clock Recipe Table](#f2-clock-recipe-table) + - [F2 Clock Recipe Tables](#f2-clock-recipe-tables) - [How to Specify Clock Recipe During Build Time](#how-to-specify-clock-recipe-during-build-time) - [How to Dynamically Configure Clocks during Runtime](#how-to-dynamically-configure-clocks-during-runtime) - [Clock Consideration When Porting CL Designs from F1 into F2](#clock-consideration-when-porting-cl-designs-from-f1-into-f2) @@ -13,26 +13,26 @@ ## Introduction -F2 Shell offers two clocks - `clk_main_a0` and `clk_hbm_ref` to the CL. This is different from F1 Shell, which offers total of 8 clocks from Shell to the CL as described in [F1 Shell Interface Spec](https://github.com/aws/aws-fpga/blob/master/hdk/docs/AWS_Shell_Interface_Specification.md#clocks). Offering fewer clocks from the Shell to CL is beneficial because it does not lock up the routing resources for customers who do not require all the clocks from Shell. +F2 Shell offers two clocks - `clk_main_a0` and `clk_hbm_ref` to the CL. This is different from F1 Shell, which offers total of 8 clocks from Shell to the CL as described in [F1 Shell Interface Spec](https://github.com/aws/aws-fpga/blob/master/hdk/docs/AWS_Shell_Interface_Specification.md#clocks). Offering fewer clocks from the Shell to CL is beneficial because it does not lock up the routing resources for customers who do not require all the clocks from the Shell. The `clk_main_a0` defaults to 250MHz. Dynamic reconfiguration of the frequency for `clk_main_a0` is currently NOT supported. However, this will be supported in future. The `clk_hbm_ref` is a fixed frequency 100MHz clock required for the HBM IP to clock the APB interface. -F2 Developer Kit provides a clocking IP [AWS_CLK_GEN](./AWS_CLK_GEN_spec.md) for customers who desire to have same clocks and clock recipe support as F1. [Table](./Clock_Recipes_User_Guide.md#f2-clock-recipe-table) shows the clock recipes supported in F2. +F2 Developer Kit provides a clocking IP [AWS_CLK_GEN](./AWS_CLK_GEN_spec.md) for customers who desire to have same clocks and clock recipe support as F1. [Table](./Clock_Recipes_User_Guide.md#f2-clock-recipe-table) below shows the clock recipes supported in F2. -## F2 Clock Recipe Table +## F2 Clock Recipe Tables | **Clock Group A** | | | | | | |---------------------------|------------------|------------------|------------------|------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **Recipe Number** | **clk_main_a0** | **clk_extra_a1** | **clk_extra_a2** | **clk_extra_a3** | **Notes** | -| A0 | 250 | 62.5 | 187.5 | 250 | AWS_CLK_GEN is not required in the CL design for clk_main_a0 recipes. clk_extra_a0/a1/a2 clocks require AWS_CLK_GEN block instantiated in CL design. | +| A0 | 250 | 62.5 | 187.5 | 250 | AWS_CLK_GEN is not required in the CL design for clk_main_a0 recipes. clk_extra_a0/a1/a2 clocks require AWS_CLK_GEN IP instantiated in CL design. | | A1 | 250 | 125 | 375 | 500 | | | A2 | 250 | 15.625 | 125 | 62.5 | | | | | | | | | | **Clock Group B** | | | | | | | **Recipe Number** | **clk_extra_b0** | **clk_extra_b1** | | | **Notes** | -| B0 | 250 | 125 | | | clk_extra_b0/b1 require AWS_CLK_GEN block instantiated in the CL design. | +| B0 | 250 | 125 | | | clk_extra_b0/b1 require AWS_CLK_GEN IP instantiated in the CL design. | | B1 | 125 | 62.5 | | | | | B2 | 450 | 225 | | | | | B3 | 250 | 62.5 | | | | @@ -56,7 +56,7 @@ F2 Developer Kit provides a clocking IP [AWS_CLK_GEN](./AWS_CLK_GEN_spec.md) for | | | | | | | | **Reference Clock Group** | | | | | | | **Recipe Number** | **clk_hbm_ref** | | | | **Notes** | -| - | 100 | | | | Fixed frequency 100MHz reference clock from Shell for HBM. | +| - | 100 | | | | Fixed frequency 100MHz reference clock from the Shell for HBM IP. | **NOTE:** `clk_main_a0` supports A0, A1 and A2 clock recipes without requiring AWS_CLK_GEN IP instantiated in the CL design. All other clocks and their respective clock recipes require AWS_CLK_GEN IP instantiated in the CL design and interfaced to the SDA interface from the Shell. [CL_MEM_PERF](./../cl/examples/cl_mem_perf/design/cl_mem_perf.sv) demonstrates how [AWS_CLK_GEN](./../common/lib/aws_clk_gen.sv) is integrated into CL design. @@ -71,9 +71,9 @@ cd $CL_DIR/build/scripts/ ./aws_build_dcp_from_cl.py --cl=cl_mem_perf --clock_recipe_a=A0 --clock_recipe_b=B3 --clock_recipe_c=C3 --clock_recipe_hbm=H4 ``` -When the clock_recipe switch is not explicitly specified, `aws_build_dcp_from_cl.py` defaults to `--clock_recipe_a=A1 --clock_recipe_b=B2 --clock_recipe_c=C0 --clock_recipe_hbm=H2` +When the clock recipe options are not explicitly specified, `aws_build_dcp_from_cl.py` defaults to `--clock_recipe_a=A1 --clock_recipe_b=B2 --clock_recipe_c=C0 --clock_recipe_hbm=H2` -**NOTE:** If AWS_CLK_GEN IP is not instantiated in the CL design, the recipes for AWS_CLK_GEN clocks will be ignored. Users may see CRITICAL WARNING related to missing AWS_CLK_GEN block during builds. +**NOTE:** If AWS_CLK_GEN IP is not instantiated in the CL design, the recipes for AWS_CLK_GEN clocks will be ignored. Users may see CRITICAL WARNING related to missing AWS_CLK_GEN instantiation during builds. ## How to Dynamically Configure Clocks during Runtime @@ -81,7 +81,7 @@ Support for SW API to do clock frequency dynamic configuration is available usin ## Clock Consideration When Porting CL Designs from F1 into F2 -1. The `clk_main_a0` is now fixed at 250MHz. It does not support clock recipes or dynamic frequecny reconfiguration. However, the will be supported in future. +1. The `clk_main_a0` is now fixed at 250MHz. It does not support clock recipes or dynamic frequency reconfiguration. However, they will be supported in future. 2. F1 designs that relied on additional clocks such as `clk_extra_*` will now have two options in F2: diff --git a/hdk/docs/Supported_DDR_Modes.md b/hdk/docs/Supported_DDR_Modes.md index d950a3e01..0a7a253ae 100644 --- a/hdk/docs/Supported_DDR_Modes.md +++ b/hdk/docs/Supported_DDR_Modes.md @@ -1,9 +1,9 @@ # Supported DDR configurations in [sh_ddr.sv](./../common/shell_stable/design/sh_ddr/sh_ddr.stub.sv) -## Table of Content +## Table of Contents - [Supported DDR configurations in sh\_ddr.sv](#supported-ddr-configurations-in-sh_ddrsv) - - [Table of Content](#table-of-content) + - [Table of Contents](#table-of-contents) - [Overview](#overview) - [Required RTL Modifications](#required-rtl-modifications) - [Required Verification Modifications](#required-verification-modifications) @@ -14,7 +14,7 @@ The [sh_ddr.sv](./../common/shell_stable/design/sh_ddr/sh_ddr.stub.sv) now supports following configurations for DDR Controller IPs: - DDR Core for 64 GB DIMM. -- DDR Core for 64 GB DIMM with user-controlled Auto-Precharge mode. This feature allows user designs to issue DDR Auto-Precharge command by asserting `cl_sh_ddr_axi_awuser=1` or `cl_sh_ddr_axi_aruser=1` alongside their corresponding valid control signals. Please refer to [PG150-User Guide](https://www.xilinx.com/content/dam/xilinx/support/documents/ip_documentation/ultrascale_memory_ip/v1_4/pg150-ultrascale-memory-ip.pdf) for details on user-controlled (app_autoprecharge) Auto-Precharge mode. +- DDR Core for 64 GB DIMM with user-controlled Auto-Precharge mode. This feature allows user designs to issue DDR Auto-Precharge command by asserting `cl_sh_ddr_axi_awuser=1` or `cl_sh_ddr_axi_aruser=1` alongside their corresponding valid control signals. Please refer to [PG150-User Guide](https://www.xilinx.com/content/dam/xilinx/support/documents/ip_documentation/ultrascale_memory_ip/v1_4/pg150-ultrascale-memory-ip.pdf) for details on user-controlled (app_auto-precharge) Auto-Precharge mode. - If DDR core is not required in the CL design, then users still have to instantiate `sh_ddr.sv` in top level CL, with parameter tied off to `.DDR_PRESENT(0)`. Failing to do so may result in errors during synthesis/implementation. ## Required RTL Modifications diff --git a/hdk/docs/Virtual_JTAG_XVC.md b/hdk/docs/Virtual_JTAG_XVC.md index 9a023fc0d..eec56ff0a 100644 --- a/hdk/docs/Virtual_JTAG_XVC.md +++ b/hdk/docs/Virtual_JTAG_XVC.md @@ -18,7 +18,7 @@ Amazon EC2 F2 instances offer debugging capabilities through Virtual JTAG. This The Virtual JTAG solution consists of three main elements: -- [A] Debug cores and a debug bridge that must be implemented and connected properly in the CL design. Refer to the [cl_dram_hbm_dma](../cl/examples/cl_dram_hbm_dma) example design for details. +- [A] Debug cores and a debug bridge that must be implemented and connected properly in the CL design. Refer to the [cl_dram_hbm_dma](../cl/examples/cl_dram_hbm_dma/README.md) example design for details. - [B] A Virtual-JTAG service acting as an XVC server that runs on the target F2 instance. - [C] A local or remote Vivado application for interactive debugging. @@ -117,7 +117,7 @@ To begin debugging a CL design, the developer must first install the XVC driver ## Connect to target FPGA via Virtual JTAG -With a XVC server up and running, a Virutal JTAG cable connection to the target FPGA is ready to be built in Vivado. +With a XVC server up and running, a Virtual JTAG cable connection to the target FPGA is ready to be built in Vivado. - Prior to executing Vivado, verify that the `.LTX` probe file from the CL design DCP tarball is saved on the instance. @@ -146,11 +146,11 @@ With a XVC server up and running, a Virutal JTAG cable connection to the target ![vjtag_4](./images/VJTAG_images/vjtag_4.jpg) -- The debug bridge in the target design should be detected and listed in "Hardware Targets". Click "Next" and "Finish" to finish setting up the Virutal JTAG connection. +- The debug bridge in the target design should be detected and listed in "Hardware Targets". Click "Next" and "Finish" to finish setting up the Virtual JTAG connection. ![vjtag_5](./images/VJTAG_images/vjtag_5.jpg) -- All the debug cores embedded in the CL design should be now listed under `debug_bridge_0`. Highlight `debug_bridge_0` and add the CL design `.LTX` probe file to "Probes file" in the "Hardware Device Properties" window. After the probe file gets loaded, the waveform and configuration windows will be avaliable for each debug core in Vivado. The CL design at this point is ready to be debugged. +- All the debug cores embedded in the CL design should be now listed under `debug_bridge_0`. Highlight `debug_bridge_0` and add the CL design `.LTX` probe file to "Probes file" in the "Hardware Device Properties" window. After the probe file gets loaded, the waveform and configuration windows will be available for each debug core in Vivado. The CL design at this point is ready to be debugged. ![vjtag_6](./images/VJTAG_images/vjtag_6.jpg) @@ -184,7 +184,7 @@ The [CL_Debug_Bridge](./../common/ip/cl_ip/cl_ip.srcs/sources_1/ip/cl_debug_brid ); ``` -All debug cores within the Compute Logic (CL) must be connected to the `CL_Debug_Bridge`. These connections can be automatically inserted during the design synthesis process. For an example implementation, please refer to the [synth_cl_dram_hbm_dma.tcl script](./../cl/examples/cl_dram_hbm_dma/build/scripts/synth_cl_dram_hbm_dma.tcl) in the cl_dram_hbm_dma example. +All debug cores within the CL must be connected to the `CL_Debug_Bridge`. These connections can be automatically inserted during the design synthesis process. For an example implementation, please refer to the [synth_cl_dram_hbm_dma.tcl script](./../cl/examples/cl_dram_hbm_dma/build/scripts/synth_cl_dram_hbm_dma.tcl) in the cl_dram_hbm_dma example. ``` bash AWS FPGA: (12:35:47): Connecting debug network @@ -206,7 +206,7 @@ connect_debug_cores: Time (s): cpu = 00:00:07 ; elapsed = 00:00:07 . Memory (MB) **Q: Do I need full Vivado installation to run Virtual JTAG debug on a F2 instance?** -A: No. If you are utilizing the AWS FPGA developler AMI, you can leverge the built-in Vivado. If you using a different runtime AMI, you can download the standalone Vivado Lab Solutions from [AMD website](https://www.xilinx.com/support/download/index.html/content/xilinx/en/downloadNav/vivado-design-tools.html) and use that for free. +A: No. If you are utilizing the AWS FPGA developer AMI, you can leverage the built-in Vivado. If you using a different runtime AMI, you can download the standalone Vivado Lab Solutions from [AMD website](https://www.xilinx.com/support/download/index.html/content/xilinx/en/downloadNav/vivado-design-tools.html) and use that for free. **Q: Do I need a Vivado license to use Virtual JTAG and Xilinx VIO/LIA debug capabilities?** diff --git a/release_version.txt b/release_version.txt index aec47f042..e9c9ad360 100644 --- a/release_version.txt +++ b/release_version.txt @@ -1 +1 @@ -RELEASE_VERSION=2.0.0 +RELEASE_VERSION=2.0.1 diff --git a/sdk/apps/virtual-ethernet/doc/SDE_HW_Guide.md b/sdk/apps/virtual-ethernet/doc/SDE_HW_Guide.md index 7217b52d4..7902db7c8 100644 --- a/sdk/apps/virtual-ethernet/doc/SDE_HW_Guide.md +++ b/sdk/apps/virtual-ethernet/doc/SDE_HW_Guide.md @@ -40,16 +40,16 @@ # Overview -The Streaming Data Engine (SDE) provides high-performance packet streaming connectivity between the Custom Logic (CL) and the host application. The SDE provides a streaming interface to the CL and uses the shell's PCIM AXI4 interface to move packets between the CL and the host application. The SDE is a parametrizable, soft IP block that is intended to be instanciated within the CL. Each instance of the SDE provides two AXI streaming compliant interfaces viz. one Card-to-Host (C2H) and one Host-to-Card (H2C) channel. +The Streaming Data Engine (SDE) provides high-performance packet streaming connectivity between the Custom Logic (CL) and the host application. The SDE provides a streaming interface to the CL and uses the shell's PCIM AXI4 interface to move packets between the CL and the host application. The SDE is a parameterizable, soft IP block that is intended to be instantiated within the CL. Each instance of the SDE provides two AXI streaming compliant interfaces viz. one Card-to-Host (C2H) and one Host-to-Card (H2C) channel. # Feature List 1. High Performance PPS for C2H and H2C. 2. 12GB/s Bandwidth per channel for C2H and H2C (4KB packet at 250MHz). 3. AXI Stream compliant on the CL facing side. -4. AXI Stream supports parametrizable data widths 64, 128, 256 and 512 bits (Current version supports 512 bits only). +4. AXI Stream supports parameterizable data widths 64, 128, 256 and 512 bits (Current version supports 512 bits only). 5. AXI4 complaint on the shell facing side. -6. AXI4 supports parametrizable data widths 64, 128, 256 and 512 bits (Current version supports 512 bits only). +6. AXI4 supports parameterizable data widths 64, 128, 256 and 512 bits (Current version supports 512 bits only). 7. User bits on the RX and TX streaming interfaces. 8. Multiple descriptor types (Normal and Compact). 9. Multiple descriptors per packet. @@ -1288,7 +1288,7 @@ Design parameters C2H_ONLY and H2C_ONLY can be used to get what is required and With the current version of the SDE, if more than 1 full duplex channel is needed, multiple SDEs have to be instanced and AXI crossbars have to be used to connect the PCIS and PCIM buses to/from the corresponding SDEs. Similarly, if more than 1 C2H or more than 1 H2C channel is required, multiple SDEs have to be used. ### Q. Is there a maximum number of SDEs that can be instanced in a CL? -There is no theoritecal maximum. There is a practical limitation based on the number of resources in the CL. +There is no theoretical maximum. There is a practical limitation based on the number of resources in the CL. ### Q. What kind of software/Driver is required to use the SDE. A userspace or kernel poll-mode driver is required to use the SDE. @@ -1322,7 +1322,7 @@ The maximum throughput for H2C is 12 GB/s and the maximum throughput for C2h is 4KB is the minimum packet size required for maximum throughput. ### Q. My application uses PCIS and PCIM interfaces for other purposes in the CL. Can I still use the SDE? -Yes, the SDE can still be used. However, appropriate AXI Crossbars/Fabric needs to be used in the CL in order to provide connectivity for PCIS and PCIM buses to the SDE. Additionally, address and ARID/AWIDs should be appropriately configured/parametrized in the software and the SDE respectively. +Yes, the SDE can still be used. However, appropriate AXI Crossbars/Fabric needs to be used in the CL in order to provide connectivity for PCIS and PCIM buses to the SDE. Additionally, address and ARID/AWIDs should be appropriately configured/parameterized in the software and the SDE respectively. ### Q. My accelerator/CL cannot transmit/receive data at 512bits per clock. Can SDE transmit/receive less than 512 bits per clock on the H2C/C2H Streaming Interfaces? The current version of the SDE can only transmit/receive data at 512 bits per clock. The CL developer can use Xilinx AXI-S width converters to achieve width conversion from any bit width to 512 bits. @@ -1339,6 +1339,3 @@ AWS only supports SDE implemented at a maximum of 250MHz. ### Q. Should the SDE be constrained to a single SLR? AWS recommends that the all the logic in the SDE be constrained to a single SLR. Additionally, AWS recommends adding pipelining on the PCIM and PCIS interfaces from the shell leading up to the SDE. - - - diff --git a/sdk/apps/virtual-ethernet/doc/Virtual_Ethernet_Application_Guide.md b/sdk/apps/virtual-ethernet/doc/Virtual_Ethernet_Application_Guide.md index e2e2b986b..070ef0689 100644 --- a/sdk/apps/virtual-ethernet/doc/Virtual_Ethernet_Application_Guide.md +++ b/sdk/apps/virtual-ethernet/doc/Virtual_Ethernet_Application_Guide.md @@ -143,13 +143,13 @@ The number of supported TX and RX descriptors per SPP queue pair is parameterize The SDE may be built with regular or compact descriptor types (see the C2H_DESC_TYPE and H2C_DESC_TYPE in the Design Parameters section [here](./SDE_HW_Guide.md)). The SPP PMD also supports regular or compact descriptor types at compile time via the SPP_USE_COMPACT_DESCS define within spp_defs.h. The default descriptor type for the SDE and SPP is `regular` to support the full 64-bit DMA addressing. If there is a mismatch between the SDE and SPP descriptor type build options, the SPP driver will log an error similar to the following: -Mismatched build options: SDE descriptor type is `regular`, SPP PMD decriptor type is `compact`. +Mismatched build options: SDE descriptor type is `regular`, SPP PMD descriptor type is `compact`. ``` PMD: spp_dev_cap_get(): SDE C2H Desc Info(0x00400000), type=regular, is not supported ``` -Mismatched build options: SDE descriptor type is `compact`, SPP PMD decriptor type is `regular`. +Mismatched build options: SDE descriptor type is `compact`, SPP PMD descriptor type is `regular`. ``` PMD: spp_dev_cap_get(): SDE C2H Desc Info(0x00800001), type=compact, is not supported diff --git a/sdk/userspace/fpga_mgmt_tools/README.md b/sdk/userspace/fpga_mgmt_tools/README.md index ffac1b1d5..4808dfd7e 100644 --- a/sdk/userspace/fpga_mgmt_tools/README.md +++ b/sdk/userspace/fpga_mgmt_tools/README.md @@ -18,7 +18,7 @@ AWS provides the following set of command-line tools for Amazon FPGA Image (AFI) * Starts a Virtual JTAG XVC server, to debug tools like Vivado Lab Edition Hardware Manager to access debug cores inside the AFI. Please refer to [Virtual JTAG userguide](../../../hdk/docs/Virtual_JTAG_XVC.md). * **`fpga-get-virtual-led`** - * Returns a bit-map representating the state (1/0) the Virtual LEDs exposed by the Custom Logic (CL) part of the AFI. + * Returns a bit-map representing the state (1/0) the Virtual LEDs exposed by the Custom Logic (CL) part of the AFI. * **`fpga-get-virtual-dip-switch`** * Returns a bit-map representing the current setting for the Virtual DIP Switches that drives the Custom Logic (CL) part of the AFI. @@ -89,7 +89,7 @@ sudo fpga-describe-local-image-slots -H * The DeviceId is the PCIe Configuration space Device ID, with 0x9048 being the default. -* The DBDF is the common PCIe bus topology representating the Domain:Bus#:Device#:Function#. +* The DBDF is the common PCIe bus topology representing the Domain:Bus#:Device#:Function#. ** NOTE: ** *While each FPGA has more than one PCIe Physical Function, the AFI Management Tools will present the VendorId and DeviceId of the first PF only*. @@ -111,7 +111,7 @@ sudo fpga-describe-local-image -S 0 -H ### Synchronous AFI Load and Clear Operations #### Synchronously Loading an AFI to a Specific FPGA Slot -To load the AFI, use the FPGA slot number and Amazon Global FPGA Image ID parameters (see FAQ for AGFI). In synchronous mode, this command will wait for the AFI to transition to the "loaded" state, perform a PCI device remove and recan in order to expose the unique AFI Vendor and Device Id, and display the final state for the given FPGA slot number. +To load the AFI, use the FPGA slot number and Amazon Global FPGA Image ID parameters (see FAQ for AGFI). In synchronous mode, this command will wait for the AFI to transition to the "loaded" state, perform a PCI device remove and rescan in order to expose the unique AFI Vendor and Device Id, and display the final state for the given FPGA slot number. ```bash sudo fpga-load-local-image -S 0 -I agfi-0fedcba9876543210 -H @@ -126,7 +126,7 @@ sudo fpga-load-local-image -S 0 -I agfi-0fedcba9876543210 -H #### Synchronously Clearing the FPGA Image on Specific Slot -The following command will clear the FPGA image, including internal and external memories. In synchronous mode, this command will wait for the AFI to transition to the "cleared" state, perform a PCI device remove and recan in order to expose the default AFI Vendor and Device Id, and display the final state for the given FPGA slot number. +The following command will clear the FPGA image, including internal and external memories. In synchronous mode, this command will wait for the AFI to transition to the "cleared" state, perform a PCI device remove and rescan in order to expose the default AFI Vendor and Device Id, and display the final state for the given FPGA slot number. ```bash sudo fpga-clear-local-image -S 0 -H @@ -150,7 +150,7 @@ sudo fpga-load-local-image -S 0 -I agfi-0fedcba9876543210 -A #### Describing the AFI content loaded on a specific FPGA slot after an asynchronous AFI load -Displays the current state for the given FPGA slot number. The output shows the FPGA in the “loaded” state after the FPGA image "load" operation. **_The "-R" option performs a PCI device remove and recan in order to expose the unique AFI Vendor and Device Id._** +Displays the current state for the given FPGA slot number. The output shows the FPGA in the “loaded” state after the FPGA image "load" operation. **_The "-R" option performs a PCI device remove and rescan in order to expose the unique AFI Vendor and Device Id._** ```bash sudo fpga-describe-local-image -S 0 -R -H @@ -173,7 +173,7 @@ sudo fpga-clear-local-image -S 0 -A #### Describing the AFI content loaded on a specific FPGA slot after an asynchronous AFI clear -The following command displays the current state for the given FPGA slot number. It shows that the FPGA is in the “cleared” state after the FPGA image "clear" operation. **_The "-R" option performs a PCI device remove and recan in order to expose the default AFI Vendor and Device Id._** +The following command displays the current state for the given FPGA slot number. It shows that the FPGA is in the “cleared” state after the FPGA image "clear" operation. **_The "-R" option performs a PCI device remove and rescan in order to expose the default AFI Vendor and Device Id._** ```bash sudo fpga-describe-local-image -S 0 -R -H diff --git a/sdk/userspace/fpga_mgmt_tools/src/fpga_local_cmd_parse.c b/sdk/userspace/fpga_mgmt_tools/src/fpga_local_cmd_parse.c index 4d5fe9f96..eb5658afe 100644 --- a/sdk/userspace/fpga_mgmt_tools/src/fpga_local_cmd_parse.c +++ b/sdk/userspace/fpga_mgmt_tools/src/fpga_local_cmd_parse.c @@ -97,7 +97,7 @@ static const char *describe_afi_usage[] = { " Examples: FPGA PCI and DDR metrics.", " -L, --clear-cache", " Return FPGA image hardware metrics (clear afi cache on read).", - " Examples: agfi-", + " Examples: FPGA status bits and DDR metrics.", " -R, --rescan", " Rescan the AFIDEVICE to update the per-AFI PCI VendorId and", " DeviceId that may be dynamically modified due to a", diff --git a/shared/bin/check_doc_links.py b/shared/bin/check_doc_links.py new file mode 100644 index 000000000..410f4d151 --- /dev/null +++ b/shared/bin/check_doc_links.py @@ -0,0 +1,176 @@ +#!/usr/bin/env python3 + +# ============================================================================= +# Amazon FPGA Hardware Development Kit +# +# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# +# Licensed under the Amazon Software License (the "License"). You may not use +# this file except in compliance with the License. A copy of the License is +# located at +# +# http://aws.amazon.com/asl/ +# +# or in the "license" file accompanying this file. This file is distributed on +# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or +# implied. See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================= + +from codecs import strict_errors +from collections import defaultdict +from email.policy import default +import os +import pathlib +import glob +import re +import requests +import signal +import subprocess +import sys +from termcolor import colored +from time import sleep +from typing import Dict, List, Match + +def get_repo_root_dir() -> str: + repo_root_dir = subprocess.run("git rev-parse --show-toplevel".split(), capture_output=True, cwd=os.path.dirname(__file__), check=True).stdout.decode("utf-8").strip() + return repo_root_dir + + +def get_link_to_self_html(rst_f: str) -> str: + repo_root_dir = get_repo_root_dir() + rst_to_html = rst_f.replace(".rst", ".html") + rst_to_html = rst_to_html.replace("docs-rtd/source/", "") + rst_to_html = rst_to_html.replace(f"{repo_root_dir}", ".") + return rst_to_html + + +def perform_request(link_body: str, rst_f: str, preamble: str) -> int: + default_request = "http://localhost:3000" + is_external_link = link_body.startswith("http") + is_internal_section_link = link_body.startswith("#") + try: + if is_external_link: + response = requests.get( + link_body, + timeout=2, + headers={"User-Agent": "Mozilla/5.0"}, + allow_redirects=True + ) + elif is_internal_section_link: + link_to_self = get_link_to_self_html(rst_f) + internal_link = f"{link_to_self}{link_body}" + response = requests.head(f"{default_request}/{internal_link}") + else: + file_or_directory_link = f"{default_request}/{link_body}" + response = requests.head(file_or_directory_link) + + return_code = response.status_code + if return_code != 200: + raise requests.RequestException(response) + print(preamble + colored(f" OK, {return_code}", "green")) + return 0 + except requests.RequestException as re: + return_code = 404 + print(preamble + colored(f"ERROR, {return_code}", "red")) + return 1 + + +def navigate_to_rtd_build_html_dir() -> None: + repo_root_dir = get_repo_root_dir() + rtd_build_html_dir = "docs-rtd/build/html" + os.chdir(f"{repo_root_dir}/{rtd_build_html_dir}") + + +def check_links(files_links_dict: Dict[str, List[List[str]]]) -> None: + navigate_to_rtd_build_html_dir() + print(os.getcwd()) + link_server = subprocess.Popen( + [sys.executable, "-m", "http.server", "3000"], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + ) + sleep(1) + + total_links_in_error = 0 + try: + for rst_f, link_info in files_links_dict.items(): + print(f"Now testing links from: {rst_f}") + for link in link_info: + link_text = link[0] + link_body = link[1] + skip_link = any([ + "mailto" in link_body, + "|" in link_body + ]) + if skip_link: + continue + preamble = f"\t{link_text}, {link_body}: " + total_links_in_error += perform_request(link_body, rst_f, preamble) + print() + finally: + link_server.send_signal(signal.SIGTERM) + print("Shutting down http server") + print(f"Total Links in Error: {total_links_in_error}") + link_server.wait() + + +def get_link_text_and_link(link_match: Match[str]) -> List[str]: + link_text = "".join([f"{word} " if word != "|" else "" for word in link_match.group(1).split()]).strip() + link_body = "".join([word if word != "|" else "" for word in link_match.group(2).split()]) + link_text_link_body = [link_text, link_body] + return link_text_link_body + + +def process_file(rst_f: str, files_links_dict: Dict[str, List[List[str]]]) -> None: + # Link looks like `Text that you would click on `__ + # Emphasized text is ``text``, so we don't want to be tricked by this. + ignore_double_backtick = r"(?]+)>`__" + link_pattern_regex = r''.join([ + ignore_double_backtick, + back_tick_that_starts_link, + gets_link_text, + gets_actual_link + ]) + compiled_link_pattern = re.compile(link_pattern_regex, re.DOTALL) + + file_contents = "" + with open(rst_f, "r", encoding="utf-8") as f: + file_contents = f.read() + + for link_match in compiled_link_pattern.finditer(file_contents): + files_links_dict[rst_f].append( + get_link_text_and_link(link_match) + ) + + +def get_links_from_files(rst_files: List[str]) -> Dict[str, List[List[str]]]: + files_links_dict: Dict[str, List[List[str]]] = defaultdict(list) + for rst_f in rst_files: + process_file(rst_f, files_links_dict) + return files_links_dict + + +def navigate_to_rtd_sources_dir() -> None: + repo_root_dir = get_repo_root_dir() + rtd_sources_dir = "docs-rtd/source" + os.chdir(f"{repo_root_dir}/{rtd_sources_dir}") + + +def gather_file_names() -> List[str]: + navigate_to_rtd_sources_dir() + rst_file_ext = ".rst" + rst_files = glob.glob(os.getcwd() + f"/**/*{rst_file_ext}", recursive=True) + return rst_files + + +def main(): + rst_files = gather_file_names() + files_links_dict = get_links_from_files(rst_files) + check_links(files_links_dict) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/vitis/README.md b/vitis/README.md index 8d93e9cdf..e7b3fb8a0 100644 --- a/vitis/README.md +++ b/vitis/README.md @@ -7,7 +7,7 @@ This quick start guide will utilize a simple `hello_world` Vitis example to get 1. [Overview](#1-overview) 2. [Prerequisites](#2-prerequisites) * 2.1 [AWS Account and F2/EC2 Instances](#21-aws-account-and-f2ec2-instances) - * 2.2 [Github and Environment Setup](#22-github-and-environment-setup) + * 2.2 [GitHub and Environment Setup](#22-github-and-environment-setup) 3. [Design Emulation and Synthesis](#3-emulating-your-code) * 3.1 [Emulate the code](#31-emulation) * 3.1.1 [Hardware Emulation](#311-hardware-hw-emulation) @@ -30,7 +30,7 @@ This quick start guide will utilize a simple `hello_world` Vitis example to get * FPGA developer AMI (2024.1) - available for on-cloud F2 development with AMD tools pre-installed and free to use on AWS EC2 for F2 development. Customers can use this AMI to design, simulate, and build their designs. Given the large size of the FPGA used for F2, AMD tools work best with at least 4 vCPU's and 32GiB Memory. We recommend Compute Optimized and Memory Optimized instance types to successfully run the synthesis of acceleration code. Developers may start coding and run simulations on low-cost General Purpose instances types. Launch an instance using a pre-installed with Vitis and required licenses. -## 2.2 Github and Environment Setup +## 2.2 GitHub and Environment Setup * Clone this github repository, export your AWS IAM credentials, and source the *vitis_setup.sh* script: ``` cd aws-fpga @@ -62,7 +62,7 @@ INFO: Vitis Setup PASSED. # 3. Emulating Your Code -This section will walk you through creating, emulating, and compiling your host application and FPGA binary. FPGA binaries are used to create an AFI (Amazon FPGA Image) for use alongside the XRT. +Vitis hardware emulation is a cycle-accurate emulation of your accelerator design. This section will walk you through the emulation process. ## 3.1 Emulation @@ -88,7 +88,7 @@ Prior to starting a hardware emulation run, run the `hw_file_check` command to i The most critical file in each example directory is the `Makefile`. Some examples will have sub-examples, whose `Makefiles` are located in the associated subdirectory. -Note the presence of the `Makefile` in this subdirectory. Some examples will hav sub-examples, whose `Makefiles` are located in the associated subdirectory. +Note the presence of the `Makefile` in this subdirectory. Some examples will have sub-examples, whose `Makefiles` are located in the associated subdirectory. > [!WARNING] > A Makefile is required in order to run hardware emulation for all designs/examples diff --git a/vitis/tools/create_vitis_afi.sh b/vitis/tools/create_vitis_afi.sh deleted file mode 100755 index dc2f007bb..000000000 --- a/vitis/tools/create_vitis_afi.sh +++ /dev/null @@ -1,287 +0,0 @@ -#!/bin/bash - -# Amazon FPGA Hardware Development Kit -# -# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. -# -# Licensed under the Amazon Software License (the "License"). You may not use -# this file except in compliance with the License. A copy of the License is -# located at -# -# http://aws.amazon.com/asl/ -# -# or in the "license" file accompanying this file. This file is distributed on -# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or -# implied. See the License for the specific language governing permissions and -# limitations under the License. - -set -e - -script=${BASH_SOURCE[0]} -full_script=$(readlink -f $script) -script_name=$(basename $full_script) - -if ! source $AWS_FPGA_REPO_DIR/shared/bin/set_common_functions.sh; then - echo "Couldn't set up common functions from withn sub-shell!" - exit 1 -fi - -if [[ -z $AWS_FPGA_REPO_DIR ]]; then - err_msg "\$AWS_FPGA_REPO_DIR not set! Please source vitis_setup.sh from this repository's root directory" - exit 1 -fi - -script_dir=$(dirname $full_script) -debug=0 - -function usage { - echo "USAGE: $script_name [-h|-help] [-s3_bucket=] [-s3_dcp_key=] [-s3_logs_key=] [-xclbin=] [-o=] [-aws_profile_name=]" -} - -function help { - info_msg "$script_name" - info_msg " " - info_msg "Vitis AFI Creation" - info_msg " " - info_msg "create_vitis_afi.sh assumes you have:" - info_msg " (*) Read the README on Github and understand the Vitis workflow (Vitis/README.md)" - info_msg " (*) Generated an XCLBIN using the Vitis Build flow" - info_msg " (*) Ready to create an AFI and test on F2. Your kernel has been validated using HW Emulation." - info_msg "create_vitis_afi.sh will:" - info_msg " (1) Extract three parts from your XCLBIN: DCP (.dcp) , clocks data(.json) and build metadata (.json)" - info_msg " (2) Generate a Manifest file for AFI creation that sets the clocks based on your achieved target freq from your build" - info_msg " (3) Prepare tar file for AFI creation process" - info_msg " (4) Call aws ec2 create-fpga-image" - info_msg " (5) Create new XCLBIN (called AWSXCLBIN) using Metadata and AGFI-ID" - echo " " - usage -} - -if [ -z "$1" ]; then - err_msg "Invalid usage" - usage - exit 1 -fi - -while [ "$1" != "" ]; do - PARAM=$(echo $1 | awk -F= '{print $1}') - VALUE=$(echo $1 | awk -F= '{print $2}') - case $PARAM in - -h | --help) - help - exit - ;; - -xclbin) - xclbin=$VALUE - ;; - -o) - awsxclbin=$VALUE - ;; - -aws_profile_name) - aws_profile_name=$VALUE - ;; - -s3_bucket) - s3_bucket=$VALUE - ;; - -s3_logs_key) - s3_logs=$VALUE - ;; - -s3_dcp_key) - s3_dcps=$VALUE - ;; - *) - err_msg "Unknown parameter \"$PARAM\"" - usage - exit 1 - ;; - esac - shift -done - -if [ -z "$RELEASE_VER" ]; then - err_msg "Env variable RELEASE_VER not set, did you source vitis_setup.sh?" - exit 1 -fi - -if [[ -e "$xclbin" ]]; then - info_msg "Found xclbin '$xclbin'" -else - err_msg "File '$xclbin' not found" - exit 1 -fi - -stripped_xclbin=$(basename $xclbin) -ext_xclbin=${stripped_xclbin##*.} -stripped_xclbin=${stripped_xclbin%.*} - -info_msg "$stripped_xclbin" - -if [ -z "$awsxclbin" ]; then - awsxclbin=$stripped_xclbin -fi - -if [ "$awsxclbin" != "$stripped_xclbin" ]; then - warn_msg "$awsxclbin does not match $stripped_xclbin" - warn_msg "For github examples, -o must be equal to $stripped_xclbin" -fi - -if [[ -e "$awsxclbin" ]]; then - err_msg "File '$awsxclbin' already exists" - exit 1 -fi - -if [ ":$s3_bucket" == ":" ]; then - err_msg "Invalid s3_bucket" - usage - exit 1 -fi - -# s3 logs is not required -# s3 dcp key is required -if [ -z "$s3_dcps" ]; then - err_msg "Invalid s3_dcps key" - usage - exit 1 -fi - -timestamp=$(date +"%Y_%m_%d-%H%M%S") - -#Steps -#1. Strip XCLBIN to get DCP for ingestion -#2. Create Manifest file -#3. Prepare ingestion tar file -#4. Call create-fpga-image -#5. Manipulate the AFI ID -#6. Create awsxclbin - -#STEP 1 -#Strip XCLBIN to get DCP for ingestion -#/opt/xilinx/xrt/bin/xclbinsplit -o ${timestamp} $xclbin -/opt/xilinx/xrt/bin/xclbinutil --dump-section BUILD_METADATA:JSON:${timestamp}_build.json --dump-section CLOCK_FREQ_TOPOLOGY:JSON:${timestamp}_clocks.json --dump-section BITSTREAM:RAW:${timestamp}_SH_CL_routed.dcp -i $xclbin - -if [[ -e "${timestamp}_SH_CL_routed.dcp" ]]; then - info_msg "Split DCP from xclbin: ${timestamp}_SH_CL_routed.dcp" -else - err_msg "File ${timestamp}_SH_CL_routed.dcp not found" - exit 1 -fi - -if [[ -e "${timestamp}_build.json" ]]; then - info_msg "The build Metadata from xclbin: ${timestamp}_build.json" -else - err_msg "File ${timestamp}_build.json not found" - exit 1 -fi - -if [[ -e "${timestamp}_clocks.json" ]]; then - info_msg "The clocks Metadata from xclbin: ${timestamp}_clocks.json" -else - err_msg "File ${timestamp}_clocks.json not found" - exit 1 -fi - -if [[ -d "to_aws" ]]; then - err_msg "Directory to_aws already exists" - exit 1 -fi - -mkdir to_aws -cp ${timestamp}_SH_CL_routed.dcp ./to_aws/ - -#STEP 2 -# Create Manifest file -build_dir_name=$(dirname "${xclbin}") -strategy=DEFAULT -hdk_version=$(grep 'HDK_VERSION' $script_dir/../../hdk/hdk_version.txt | sed 's/=/ /g' | awk '{print $2}') -shell_version=0x10162423 -tool_version=v$RELEASE_VER -device_id=0xF010 -vendor_id=0x1D0F -subsystem_id=0x1D51 -subsystem_vendor_id=0xFEDD - -# Get XSA info from build metadata -vendor=$(echo $(grep -A 6 dsa ./${timestamp}_build.json | grep vendor | sed 's/.*: "//g' | sed 's/",//')) -board_id=$(echo $(grep -A 6 dsa ./${timestamp}_build.json | grep board_id | sed 's/.*: "//g' | sed 's/",//')) -plat_name=$(echo $(grep -A 6 dsa ./${timestamp}_build.json | grep name | sed 's/.*: "//g' | sed 's/",//')) -major=$(echo $(grep -A 6 dsa ./${timestamp}_build.json | grep major | sed 's/.*: "//g' | sed 's/",//')) -minor=$(echo $(grep -A 6 dsa ./${timestamp}_build.json | grep minor | sed 's/.*: "//g' | sed 's/",//')) - -# Get clock info from clock metadata -read -a clock_main_a0 <<<"$(echo $(grep -B 1 SYSTEM ${timestamp}_clocks.json | grep -o -e '[0-9]*'))" -clock_main_a0=$(echo ${clock_main_a0[0]}) -clock_extra_b0=$(echo $(grep -B 2 DATA_CLK ${timestamp}_clocks.json | grep freq | grep -o -e '[0-9]*')) -clock_extra_c0=$(echo $(grep -B 2 KERNEL_CLK ${timestamp}_clocks.json | grep -o -e '[0-9]*')) - -if [[ "$vendor" != "xilinx" && "$board_id" != "aws-vu47p-f2" && "$plat_name" != "xdma-shell-v10162423" && "$major" != "202410" && "$minor" != "1" ]]; then - err_msg "Platform ${vendor}_${board_id}_${plat_name}_${major}_${minor} used to create xclbin is not correct, you should be using xilinx_aws-vu47p-f2_xdma-shell-v10162423_202410_1" - exit -fi - -# Write Manifest File here -hash=$(sha256sum to_aws/${timestamp}_SH_CL_routed.dcp | awk '{ print $1 }') -manifest_file="${timestamp}_manifest.txt" -exec 3<>$manifest_file -echo "manifest_format_version=2" >&3 -echo "pci_vendor_id=$vendor_id" >&3 -echo "pci_device_id=$device_id" >&3 -echo "pci_subsystem_id=$subsystem_id" >&3 -echo "pci_subsystem_vendor_id=$subsystem_vendor_id" >&3 -echo "dcp_hash=$hash" >&3 -echo "shell_version=$shell_version" >&3 -echo "dcp_file_name=${timestamp}_SH_CL_routed.dcp" >&3 -echo "hdk_version=$hdk_version" >&3 -echo "tool_version=$tool_version" >&3 -echo "date=$timestamp" >&3 -echo "clock_main_a0=$clock_main_a0" >&3 -echo "clock_extra_b0=$clock_extra_b0" >&3 -echo "clock_extra_c0=$clock_extra_c0" >&3 -exec 3>&- -exec 3>&- - -if [[ -e "$manifest_file" ]]; then - info_msg "Generated manifest file '$manifest_file'" -else - err_msg "File '$manifest_file' not found" - exit 1 -fi - -cp $manifest_file to_aws/$manifest_file - -#STEP 3 -#Prepare ingestion -tar -cf ${timestamp}_Developer_Vitis_Kernel.tar to_aws/${timestamp}_SH_CL_routed.dcp to_aws/${timestamp}_manifest.txt - -#STEP 4 -#Call create-fpga-image -profile_text="" -if [ "$aws_profile_name" != "" ]; then - profile_text="--profile ${aws_profile_name}" -fi - -log_storage_text="" -if [ "${s3_logs}" != "" ]; then - log_storage_text="--logs-storage-location Bucket=${s3_bucket},Key=${s3_logs}" -fi - -if ! aws s3 ${profile_text} cp ${timestamp}_Developer_Vitis_Kernel.tar s3://${s3_bucket}/${s3_dcps}/; then - err_msg "Couldn't copy files to s3://${s3_bucket}/${s3_dcps}/" - exit 1 -fi - -if ! aws ec2 ${profile_text} create-fpga-image --name ${stripped_xclbin} --description ${stripped_xclbin} --input-storage-location Bucket=${s3_bucket},Key=${s3_dcps}/${timestamp}_Developer_Vitis_Kernel.tar ${log_storage_text} >${timestamp}_afi_id.txt; then - err_msg "Failed to create AFI from .xclbin file!" - exit 1 -fi - -#STEP 5 -#Manipulate the AFI ID -test=$(grep agfi ${timestamp}_afi_id.txt | awk -F: '{print $2}' | sed 's/ \"//g' | sed 's/\".*//g' | sed ':a;N;$!ba;s/\n/ /g') -echo -n $test >${timestamp}_agfi_id.txt -echo ${timestamp}_agfi_id.txt - -#STEP 6 -#Create .awsxclbin -if [[ "$RELEASE_VER" == "2024.1" ]]; then - /opt/xilinx/xrt/bin/xclbinutil -i $xclbin --remove-section PARTITION_METADATA --replace-section BITSTREAM:RAW:${timestamp}_agfi_id.txt -o ${awsxclbin}.awsxclbin -fi diff --git a/vitis_setup.sh b/vitis_setup.sh index a91f9f9b9..4fa3c6128 100644 --- a/vitis_setup.sh +++ b/vitis_setup.sh @@ -347,6 +347,113 @@ function setup_xsa { } +function xrt_install_check { + + xrt_path=/opt/xilinx/xrt + if [[ -n $(lsmod | grep "xocl") ]]; then + info_msg "###############################################################################" + info_msg "# XRT install detected! #" + info_msg "# If XRT was installed using the devkit, run 'source /opt/xilinx/xrt/setup.sh #" + info_msg "# Otherwise, please source your XRT setup script, 'setup.sh' #" + info_msg "# To reinstall, run 'install_xrt -f'! #" + info_msg "###############################################################################" + return 2 + fi + info_msg "###########################################################################" + info_msg "# No XRT install detected! #" + info_msg "# To install the XRT for Vitis runtime support, run 'install_xrt' #" + info_msg "###########################################################################" + return 0 +} + +function install_xrt { + xrt_path=/opt/xilinx/xrt + xrt_dpkg_install_path=$xrt_path/XRT/build/Release + + xrt_repo_name=XRT + xrt_repo_url=https://github.com/Xilinx/XRT.git + xrt_branch=2024.1 + xrt_2024_1_working_commit_hash=ea9e7d2d88719e08575dca15d2ca2c1ce624e800 + xrt_deps_script_path=src/runtime_src/tools/scripts/xrtdeps.sh + xrt_build_script_run="build/build.sh -noert" + xrt_build_release_dir="build/Release" + xrt_setup_script_path=$xrt_path/setup.sh + + if [[ -z $AWS_FPGA_REPO_DIR ]]; then + err_msg "\$AWS_FPGA_REPO_DIR not defined when trying to install XRT!" + cd $AWS_FPGA_REPO_DIR && return 1 + fi + + xrt_install_check + if [[ $? -eq 0 || $1 == "-f" || $1 == "--force" ]]; then + if [[ -n $(echo $PATH | grep "cmake-3.3.2") ]]; then + export PATH="/usr/bin:$PATH" + fi + + cd $HOME + if [[ ! -d $xrt_repo_name ]]; then + info_msg "Cloning XRT repo into home directory: $HOME" + info_msg "This directory may be moved to any destination, once the XRT install is complete!" + if ! git clone $xrt_repo_url --recurse-submodules; then + err_msg "Couldn't clone XRT repository!" + cd $AWS_FPGA_REPO_DIR && return 1 + fi + else + info_msg "XRT repo found in $HOME" + fi + + cd $xrt_repo_name + if ! git fetch; then + err_msg "Couldn't fetch updated references for XRT repo!" + cd $AWS_FPGA_REPO_DIR && return 1 + fi + + if ! git checkout $xrt_branch; then + err_msg "Couldn't checkout branch: $xrt_branch!" + cd $AWS_FPGA_REPO_DIR && return 1 + fi + + if ! git checkout $xrt_2024_1_working_commit_hash; then + err_msg "Couldn't checkout compatible commit: $xrt_2024_1_working_commit_hash!" + cd $AWS_FPGA_REPO_DIR && return 1 + fi + + if ! sudo ./$xrt_deps_script_path; then + err_msg "Couldn't install XRT dependencies!" + cd $AWS_FPGA_REPO_DIR && return 1 + fi + + if ! ./$xrt_build_script_run; then + err_msg "Couldn't build XRT dpkgs!" + cd $AWS_FPGA_REPO_DIR && return 1 + fi + + cd $xrt_build_release_dir + + # Base XRT install first + for file in $(ls *amd64-xrt.deb); do + sudo dpkg -i $file + done + + # AWS extension install + for file in $(ls *amd64-aws.deb); do + sudo dpkg -i $file + done + + if ! source $xrt_setup_script_path; then + err_msg "Couldn't setup XRT after install!" + cd $AWS_FPGA_REPO_DIR && return 1 + fi + + info_msg "XRT installation complete!" + cd $AWS_FPGA_REPO_DIR + return 0 + fi + info_msg "XRT already installed!" + info_msg "Nothing to do!" + return 0 +} + function hw_file_check { required_files=("Makefile" "README.rst" "description.json" "details.rst" "makefile_us_alveo.mk" "qor.json" "utils.mk" "xrt.ini") missing_a_file=0 @@ -385,9 +492,10 @@ if [[ ! -e vitis/aws_platform/$xsa_name/$platform_file_name ]]; then fi fi -# Make the Vitis AFI creation a little easier. -if [[ -z $(cat ~/.bashrc | grep "create_vitis_afi") ]]; then - alias create_vitis_afi='${AWS_FPGA_REPO_DIR}/vitis/tools/create_vitis_afi.sh' +xrt_install_check +if [[ $? -eq 1 ]]; then + err_msg "!!! Vitis Setup FAILED !!!" + return $? fi info_msg "Vitis Setup PASSED"

  • lNi_K zCA!Pt5{8B3p$igyE7r#&T%Xv7p=YA*OrV{@ybqa$LP0bFN1VcX%M1wtJMg?&KZ$yp z8PY&kX|g`loCFlpK-A2U`Z462yiw00t3ifdzK8oY)D}Y3f2wl_%fD_EVkwXARUlM( zB*>U8=L!?x9p!8X!H#CUR4{foMtM+AzRmqU@rGOShP$w=d0Fr@a@c%Wp*wrmakcxY zT9*YojavEiC=7gruF523=WLob1N0s$a7yma(AvPhzkBL7d5k>zF81jAgi~#brUwNK zE}Fd#+yR)qdN7Dh!-vBsvTBtXs4(mf4!pNaWT&r%i68HPH5BMd5N)U0JX*7mL4P>E zu|;UbW>!tLKdBGfwJF{{$|z(DtapPm0iplc)}BAIVVcm|By1<7JVIUiALPAfP*dyM zH;NS%F-lbsq9Cx5W}zr0QBeUSVxvZgiUo)P6_6l-C`fOD8=|lU6=_l;5C|m_=_(?f zNCJceMJa)V5|^axbNheJb3UB&<;=X#yfbIcCq`y4$;!H~bzQ%9C0Zk2K^|7wNF~gr znSD&iZ^pBsy20G!Ws`s3n1+XG)(B=@&9*8-#tyk7nnV#GtecKBBE)~hT<^Q%*gG4y zgUowPCCN*k5vIB7r`O&(M)d|`au6zatF7is?43N{G+WiLx5|~jM^1jvocNSYsY>*lW zgvW_RYg<3Bv2XGmI5hDS#tIoPOrZNZeWi1M{imZqIRk5J-sucK`uBkK(X!5oY)6;H zQ-=|aeW#O#jiE@jk&5a>Xgg2d2 zLeda2y#U?r$*m;v4vTEWrqCLoM%y&gsEYy9wQ8^t>hz%4y_DsK{uAq%+M<@xDSvgL z^U^@DdPZ%noK9QozVI?8>Otm<{5KCGav`95S(ZGJs{bo<_0mj)fhZ!k+}CAnm*a)w z6|^BriIKwM9qOQ&x&$GY=xE{i?7VA&bOjsct{oZTe(LDK-Jzm05g*xdjaGh`4d(-9 zyA|+>j7_O_MtT_+2?DiD*ISyuTi^T!@KTwYWs4AF^f^H zxqR@%N^O*b)`f_S#ae@6B-co>1HPJO#@B20n5(!G_}bG~rBS115QnTWEWJ`gcRc3a z@0RKG78P=}qPkL#`Oled+5UfJ6#kXDZo*V_mQ>;z4~X@ioZ`2qg}#}x%*o@*TeW(0 zMR&5?4Yzr@vmtjCPZ+wcv6_li9x}c`t*ffZf$dd!a+(_Y0PzA8hEsSG?tBM34!*&9 zf3asGeHGI;Qe;0svv~89de$K%u&7D+fo#&J9)7a@=P>17pZoD%1N12=q0{s#5`g|U zF_1pF37*<$3c8;e-oaMQO?{1uo)ry4H0Kvs1ib&tvn?3~(-%fPN2ZzK8SfrdsQFFXX)yMFhOcGK^X^>7&-7>f{{j7Zh}d9@KYSYEVz7> zIhw87Gfwpl*ixqE=x-9q+Ay4nO^PNX1%1c$4q6=2hi5iC>sd1`uPB_8JX=nU&as5r!ru7R ztEBN6r?Nc-M)WuWvc$)uEGA>~!7~Bsrw4BFmSt;#sI^LRyq+6;D zDt&pxhpdj-3bM2hzJ=xr1OzJg&--ojBjv0Y=ztvohVwjQ=gGF<~y_|YXhROs{I zRo~p5zM&L6OA}alSUhl3vw4mp2ZEubz>JvS0>-x3}T>0Txe!yYvJ=nL7TYKDfd{5sAM}om|C*&yjC5!?X`)=u%+^T}-91$;o zYZ1E~Am@aPH$y+y9cpH{R@7EwDOgYBxzO*?-;No5zGIl+_Uv)d=2bu8lmOlnk#)qU z`{3KK5oEhHB%%dfqg}bN6i4_eI-~me8Ps2DliygrOwV_t-zw0}4L>rj>_4`{qLOq3 zq1y|jBNtngz*ebb^Sx2{6FwW)V6eNY=ZXn_>i0oAFX`xu|xLR=&53-?xs%Xy{e@z{el%KkL80Pf&56NT1^bZyehN8=n3R z^ma8)vjTu#CRGwP_5>%^nN@^@6dn!K%^+?`4lDBI+J<;vFZt+Sf1S7dHfDmSa*uj` zzhJIRuxW_cT;I)QO%m#(jSLzN-29HN_M3T>iXR87@>3sLoDs zk<30P4PeicYp!?BX((dPFmJqkb=tJd!Qm|}rvGdWwV|$te%+^3ml|U~f732zG(Tg9 z?04D!>L(@D$noslO}C`R^jPtlS6&gHRdeOURv~%p5h!wcj?rQ1m4Kv>ag&vx$3vU; zaRVw(*f2jcw$Oc&j+I&T$bn&zC3!V3-9T^{pzVjnid6+DbOZlnK1VntzRo4b->dQ@ zAcxM-3)_mO?~i1X&bf_v9y~HMvGa~WVxvtY3ga@f0-PPy@{ z+^^m|_m!lkd2a4kQ^c-;a)K36K5sO>`rVc>ru_LY%)hJ~>g4-|^H>gw@oC1p)4+ca z%cEjNN(8O93@~Rn4-k%WlU-3glxH|=i&A`K^B0`!`O1FBF7A}e!cFj6IK`H$i!7&N z>l;HuM-Rq0Atj}RRif~S0r*>!R{HS2GSaQ7u`BT8MlD~D?nh!ebh=vo`QGkRgG*Dm zMz)X)*=c8?pB9kdS4CPUdz0CIE>-|{@%zuY{acbvv)}}1_>RH()TA^NJ&PsK&8 z>`O_(2`nd9acYH9EdMPl{O`U_qvvT~HNWU6)+W_7{W!boy2#BZD z^tgMEM@^}k>lsTtq^oy6#>)Y>_SX(-FS*L+*Nu*|bvbhecum!~k6LG*uWu0Dmwp`6 zkmQwvRYa(^P(e+uB(whSt!`tN+W+Nbg=7363wBoBYza{ z$2t{haE0TEu%{%uxI8(TfDe}IEXvw(^MX$G=X(yyA7ts^F)!T&8>dL#L?}x?0}NGV z-ksFuWj1JikUV|Y$FjKhRVu2dI{P=ba)|bHshIqN-v6qmHqz?Z_qejpP70k$G4S3M z@k4&VY>4Or9yLL2Nri=znyK*3jc~EEfZWOkatvN#E5je$bo;0R?eJKUwrC#<83kAd#?=FMI7y<8ui{!_|7x3cF8dtFd-Xzhi^d{9O43QM5-5f#KI`Q>?> zT;(Z`kk~^0GWpTGQ2@7(a(FrHx!Hwt;rH;3eU;PQ!s6ukl%V+Iw^`{P50KjlR-jE_ zK%!7kh53C5GryXMO{9sF&wY#7P>CHSqOQl+{Z`l{bFh31_|8bja zZ6P>v>UCf$d6qt&m$NsjDdMjNC{%Pxyb1cwtt&G$CCdLqZ0z^iXauxL+x%)QjWfcE zDPH=6`O*(DE7En13zyv=Io0bO*xP1;6g-h`@CMwA71(`Dd^84!@+8sV#Hu!zbN z7(zWJowIv^u>TDdVBh$aQ6e;%W%EYQ|M(D}%R~Attekq_}x%y z@iXrjhjTpX=iW*8JqgI(6==g4l&;b7L})?M`tk7cF(4aCwR?j)hhoXLIBMM3QRId3+uT2*S{s%pm$vrot8lPd8@@Gyk#iV&#_3LAS5Y5E zXyVi7TfmJ5{mr~lFTCyHs5AG>o6{BIYJP2$HL`(QTigG_A!pl8u2HkTxA!0CacgcI zD9Has8}gmrJIUfp{+l+$wjDrw;l2KwHdM|Ze9`E5_dm2@pS8vMRzMp%zpVY}CxkIm z$LHIS@tAE9>+vGaEf42zu|Yr_od0;5??-*&9-8Gm6kGC>A%ClfSw>AAx#A;|ETmt6Qp5;CSyC)E6R0=Whr|%{^ZgK-Q7sHFMOr!tTFkf8l_R={6~wlA zrpfynA?ZH*fweLjdg2r*(L@1=wPZ*6D~C*rWTr0u{q1yZY#oVrxyagBjw} z)pSLsS%r)FLTUY-$zTIRe^tP#&n}AmpoA9bMwaLhcr(R?)AX$o+5}HNIVPej|7V&T z3p10&6UGH&yA5~;-F$~cIIstm)s-`5l(wDwxlGAvg@}2oxkK`>Q6EwihCyh4NE3Z4 z<@KO+m0!&w;n2W50ck4inR2;r))6~S9pYWM5WQ@WRya2D%ot~E`eE!_n-=T!9h$;} zFxh4d^q1;;lZ2dIn9Z1X?5H_rpYBnvEzWyqeHJzZv9qzS?7Jc@#Fgn!UhCo-Ih-HW z^{!&!#xsA;4M6NYgsX`SM7H9C)ll6yI;@uBcyj)1tW(a^HW%s8r#Y+}nU`gerdvU` zj~-2K-j7anc=h*XgzO}&oeXJ9p9=!V8INd2h2oop(|kMxRNmc{#Bd zRy1n!F2Sq)ZQB*Devss*E_yJ07Q3!t*7a!yes1MW@eo-PvhjviS_;nz8Fyn!^?KG>Y`L@4qri$N=(Y@vVBv z(_qgqFvO*Z9ZMh=;#Ss-+P#NGKg~5&7pmo~{z6}*Sk{n@ez3T;@9N$@y5!6D4cD3+ zIlbm%;7#HBc+p{kA#@JFri?`Tjns{h>-!vY0sDDqG4O-!)E3z~BLZ83i}Op|yNH#( z-_i!>&fBqfDdZi#{|7b-lcdr8;Za^|88ibfEE%CZXcm4`s#}Fm?|8q+^jjgtwPwx+ z1p69S&;0Z+D~w^!2D&p_u3oL$&zf5NY8T+ICG&etTQ0yjm{}7-H%K4|6cV8{ehD{L ztnai5=qa%9WSY&3F)t7#uux{^UQV;DK;sjL+UKi9>+)L}w&zIK8((g~Dt|(mO#SIT z1#oU|bM9)}3HnCx2EkQnPTf3}UBIBB1)Fw|ZyAMr+^kYFbBnZc93^~q<8U46EJlAK zMTh#&NN6Td+YtOfBXVClz}Aqe5WM=VJp}>HHDl&bKL;HU%N#4aIo{dYS0*;VZYeLy ztPg`8PCD9mm5wxcIS`HLnQ12tTMWR6j)4+63|>q4xYHIChn&!;+%Lv~9VA9qLkSu- z9kFKH{rA8W3$i7Ytmt=L^;&j2qukQhE1bFZaCqGOJ$x75RhS3y1P5k>E>L>?ywEEb zyYihs!BJSbtpX{gNcv#aWDG{!s`TRg>O{>~E_O?G4ntm{%|mLo3v z!Yf?ckZXWwIHJ$`aFMS^dm50mX_`Q(6Gk4B?xn^z2MOoA$%YlaS@&D+=H3Xm#XRpd zHfhbQ>FL;!K6lbrc1j`xyoS5QSb=NDe6%Gsh2|aLiwn6jfl-J2O{?teyT~y#yJBCJ za$8z#S6JAgv8x+g{;qI7v0Jr6x&^?jClD$G%tG~AJ~@HnsEy{A{YVjO69c{F|CJHz zQ}zEY5^*cziw~ z;*WfSIDy#;6*wMPY_jMsO~fe7gxv2Md@*pL^$zQIQNW%U^{B#(v&vbjO)daxeFVlQ zm@?i3JY-vPRmEo;q^*357Ef1>#RIan(bbhL^w&OW^}Yg|!Lb*=LW+Y+-e)-`qQ^W~ zZnir+O=E^1rM;HXY*G~~X*V&EvDTndRTj%~$!j1g5S;@^r%n4!vhfdRI(Vg;6-NVG zkty?DUT8roPvg{%TX~D~FBkSCeGC?c-F;&5SyKkwUYSsTbAaH28#DoGZhPg-UGe2U z0Dr?dyyrO?Vcgw1^U+JVi>zn2Os@5-=qUK9{ljqec$^@2w%OtAt7fpYsu>AsgPtP{ z6Zb2VNd+36P1Bm-iTX%k5mf^Pk0YVuODH2(j<6!Q+|ASLtGvfDxv@9IbpPm^OCBF} zN>}g6)HB!{q=kq*5}ZLfkrkh} zJln^sM#G@vZc10twE2Bs>6d|mgilUdD**_HwV8AuD(t`tU;|iOQi}AD^gVrz z)J%N7Q92+%CIPzSCVFt*x@cTo4(N2!8@rcMkCYd@x$LJi)2f=A3me|}{55AbNlhUtR z*Pi}H?5?4ui)P=L``%a|+f{eqB;o;NB|7Fwu$L4|b;U|UOK@ep_gTJ6#!Juq9I7N` z#hDkA7gEv`@W!{#_ZP^)m`c8~w^MnsRnW0{9gZ9Fl%6Z?!MyDdn>exb00+QxluaO3 zP{2l3FoQoLwa9t@K;!9tzq8=1*Nb_!lBgonteD&%ws*c=`p{?l?ZfFuz}ICOF)*eo zsUtg+9xMwir|HSFqKb{Neu^(Ck1Wm37@7=0a9))aAt!B0q`&{_w z{RWC?7V${w`OiB)9ul3JxnEQDrX|Q5rbOzLxv;Ku1AP}k8=MDgaJs0~P--Zygn;Ci zznp+WM@>u{0%E<^fD7t$ymBxCj#c&e9zDo=Fi7?g@l*qCHJJHrrRg5;wH&VAt$ZQ- zf&hq=$VY?|(gCPKuZ_J5Dv>I{Adi}{jeMt;Ssx;czVMf?$7~JVH};(LvGm zK7~fj8XensJ@RA{?LepEo@D;|WH7o)Akms>wu-f_z^dgJMnxC;o323Va$z@9_u=m` zf8xDNHdIqqP}l>bPTTq)^{sb2zh3oB>gPL@1Cl1uege3HF~QIYSWC(C3!;Ft^@G9m zt<$7V+2JeM&H~N+;1WzVZQb|(c)R!2L{Dbfzu1s!`lZa^0f8>MDYlbPtk((X;BJgU z-gHt1v|cYl4<89Ic6hwCNqCv3hbP*H*-l~jnw8fTXtz!k=+sj8#kk!2`}6w^C0rO2 zm<}HTv4tydm7w!I)1q}g+QlQbIoV~XyM?$Z*lJ^Lho(83BRS}r!Z`Ch_^aEcY1fd- zDWT(*)Q}qIODArRw*$+8qzrU3%9Nj^CWu>LXkOLKNtRSb#sLd(1E zyy-5OzJEH|kdLjun&|CYT<7MpO{;r*;KAMdU3=i`rR%`$05%N@ygS&;Tqc}Pv3ACB z1GGOZG`0xCVW)a&$t-r)sN~s?dFIo_dpIkLx3YA`q-+#@{0&jg`Y5;)_1YSZfkt5s z*v=(Yoo+M$?6$^q{qX}oT~!gAMMnp6hHv?oFR!n;NU2+x`&O00bhv8%>L|XKg`AQQ zjuu9=B9v*8)Cir3_C`yF@qCa|{I3XP__38{)2jMNMn`>4ei3RX;wEz|$}cNES||AW zy(D|@RkXLOCWJ)(#Q<58W}^#S)dZ;$n6lXMz$*yZzD|5!|E`>b<6310XinSO_v&s4 zKIk1FOyrmzI2sxn5O@ps&0=fo=95lGKwtg{ZzbJ2e^9y=3Dhp{!67J-Zq0>UzxDy7 zg-9hyDZbiuYB4M-E zI4&^`zNsJv8H?GX&7X_MZi(XZEPrCWriQ2twdncbbcY`ezGn90C^x&mGs}eWlPdtb z+^){e{YvD3#<#h-kIuOReuB3XohqpU$cUKDPXbRX@H;TyZOF}#Buff~-BmvV8ocFo15G^;pF#OUkFbgu%>EUv0p(dnFkI4j_=BP+3* zn*^t8ymm3f&ZSJkF}^iu^#5Una(~ z|7_?UXR3pI-|vF+NmpewWLtAt$cd0hAV7W@u~Cv1QZ&_bLIcPdQMZD+j_)X+HR4?}5BPqXi}FSu6(kDpLxmG? zW-f=sGvQO)>RqD1*XWW_4u!e)2YagEE{IU47;{UBCDAom8pk?kL-Zx-#XI}#g10X^ z_@I4cJH%^5Kz`K3-Vr1pcveuBKi|S$2cojr+pG`2>UeE!`T738GKuR;guP*J)Q64c zZk?UUdPt2lGG|_c-+Nz(9v=KN0d}y z6x@@xg+D!9;@{BYf~Iyi^co|nd0AXJA7jp+X{y&~UMF=8u59_APwvJ_3?$!`lkyz2 z+*<`YDHTPYGeeJ|sCKV|IVgGa&^a1?>x^Yg?GS&MDJkG`-PUm)swjo}?^tEuawv%a zTF|vbfGu&JA+OBK|0E4%l@+|?8fBH}#c7KWRLzXdTc=jm)fD?zw8%H+dvj)tjN7G$ zwCtsWID;E@H?xkwfV|en^CnQqAy(lhT9H)+PkhPZV{btM#vM-b0ZF9C*vx*k{m|Ld zU4}9zjNTu=dn0b0o^dWd2(E(A$NvWjPyl|?{P6!m0$l6I$f4gI{(}T~g~bzUodFV{ zZT_|Qc}4Wvan~2FpWzgXCg8@z3tU^+@?Mubj*dI7X;qQx3pQ_=^RHGf+t@c_M@e>8 z>QK6$)l`hSP2JQ~s$K1KGjc9)t8C{=Ea=KxF>47Mu}GfHxQ(k+Asp8H7Qe_nj!;)Q z@D;!2*uXU!-f@X)nSd$|Pd705aGhkIGKVI;&Adi=a0z`x`mprB8rVPc^O!btq6C7q zodrr5U_vG+mf%@xXdjoA`M9#BVTuT&AFNn{%+)1(2TT_H(`#oqoHnGCe(?wJ=9zp& zwt-dm3ABJv4or=S#~z2?jh6((M%Ykjeem=3wLM0d^M3^;K6*!SL_h@AQ*Frh_rP%Lz!k>~u- z;H@)x1swsmqa15*Y`xT4)uFxq!5X$yJ!1G@8Fd<{0)Jc)vx#M5xM2Mgj*~n@JTbr% zpRi``Pgax8cs?3)`i@n+WR}eD-;LTZQ6;)`H$HjfYyDDS{` zyH~l(&0QE*eczox+>B7cGdu>D9rv0fuocWaQLW6H{BMp$zAp7;1N)g%{LsBZSO_kE zN;qU0v7~YUW9KW3SCNbVwrkCIAkglVZrUw4D9rAsIZu#d*z$ABiB2*1GRJlbLSll# zvK^M6O0|AZ*SE*wLW(_o&5cxJxf>S8uJfvQ-;3$Hj&;|{T?3Brgg~_&$v+{Yvs{IK z&=W3sli!MKb1_1DO0BCaC04hjI8;rEBoqM1&&|_!=0{x$ic*oV*}ma&`k{qFhIG5M zNxD~(8N@qg@|E2V>eg5lM`GUMOlqsQovE14l0HXFS)U+eTGSt|8(g*u_17LOfBu8%Ep1Kc$D18F}9jt$2 z!#}dHqx~!Dz(fDl&&M^JM3*9ZNSIYd1Qn_WETOQ^+L23!`H;MJ@!3MFme*ZCV6382 zfw3zd+0%t1n)R_x4Y^PccC5-6Xxf!<3e3$+b?GL3ewFYxRLFITZqx@Od^Hg|MliTC zL06n!aZWlg|}vxZ(0@8xN^R@s-gk}Mo=m$sYN z90IFi|6GQN!srMycW9=)CJjqeN5H0X<(B0dB4r#{qopC-}+m3jt@Uumzw@OdwNfT=TU!gNgVEGJebtm*_C<;v@0T~uhPK^{M=k8y2p5l zg;RA(k+r;Lx%S*8yEkr^P6!_?qKe;5jG#>K9);yz$#c-5{BT72Ex{t$>#UtQsY!GN zx{pcxFBOuemY{kx=UHLLjXA;8m}<|Xl7eB9{)Q~q+IsrHjld1*`oZfdi~hT-BVA^^LTulKp0h)%A<5|%;3 zS$Y>1Wan8r>|tQ78@;mq7>X#&`55QGA75!YE9P-NsRwtBc!m;40Nhz{^pI=&=g z|Jah|UNb_}N>|z+nCx=kl~>EnB%hJ{YmS@nMPhU=p0JoJ3G zy_ESO1xujM?&8nSV))ry*Y;8ER!y^^jwbN=2oBIQuDmAu3~6MSg+|s=^#=~?95MXZq(p2nrFgL-5O$B!Meg|+QD@zR?M=& zW>j!U$bpjPJ&BI}MghTkR11}^do?jb`gu7%$pjhV_>+jeeG#jCiB*M<5PO(tpDYG= z6I;Yeg4thLawDUDS+cQZWZd})`)dQc9rvzW95hLE2-Ym#R6*5J*!}oY_`foF1SNq> zvFMT?n?h<;PjoOc4S-D#Cqo_f+N9diXgiePWQd zzK{iJhC2|3QYL(@bhnSDDc~Z;%WRu-^aSN34({Olm3tZCCUNDsV5`AuZ0&N)fP%hG zRmEa;XJ=5a`<3dN+Ndx4Tba>>Ccc&MH=y!B+H%a8=}<5%77Q%0QiQK7lk||b`({AM zYkaJobf|*Pu>Om=JcIE&mxvwJvmel+*Vgo>rWLhoSEFjryDLsf)c;gVQ#NzLMUuDd z1mMmg(-Kj2Wko-krbt+cN#zjD^>zD}L<0gfbc@l)=o|I#%(wiqSgo6(IX3iVh}|t! zCN?2~u=l_KL5K4jOy0!vd}I^L5ral3%L&0frf1I|D z1UX?BcFgU;=BEV7{4@f~DUx%mEZUG;Atzy<;AS)d)FGG{IfU4az5nZx_;8UAouB09 zQ*|VcDkQ(brguvU6~{WSon_TYKh?WU)LDsBqNE$&i7tx6C2v4*6v|EVLTu&BLDA*$ z13-;)=^n}4GP?ZX8=tH*4TZKPO@W35HePb!=dKJW9C(}G>Yo<*Mneor7)-3#!5yG) zUM5E(Yi@!RDS<&tgjNHEv5b|hu^puC<|d=sR8;SU++)6LufTB)NbXm{{yKin!xpDO zyMu1Ree*zf;JhC4Z%Q{VB4_(S0ZC01Aqd9>>q%UbB-g9|%GeE=%}DG(O}IBLufRan zJnblDk0wrCt)*fMLO0_~PZ~IEjA6>Z(0nNJ7rR3uzR7W52_!%ANR6H7)e(>%i7mKB z7H)mz0sdqh;T(A?3n4P74VJrDl{spnLps3nEKS;qJF=brHew)mC-_YNAlA;%RScKt zJc$=;wmu>{FBD*p(ji7LHm=mP49Q!!2Nh5=t*Rnq`=k+ytl8%0EAsXU01*B}cn1=R zobVL5QO5`8p=C;C8*z$;7V(&rIGFyA-O1@Lkv8-E)9z-8}=UHkv0_0APeh;(4+91$h zalEmG<(ty}z`q;}FK1nbJx2O=19Q`Si^x-(qt}wG?#v(@<;=&y<*hX)a(4o0Cyo?r zDw2e`^#G-!VRB|(v173bb7}Mx(vaCicr5po!Sf2bV2#8KOTT&?f_Meu?E<@pVrR}M zvelz(?jeV*&0Bx&IKi zMIar(0IMxBXhLcbI=l6b^%wLLoL@{=`T!fSu*3$->ua{I4Vp(NOS{~)YtztO2AYiD zQR8|5l$bD?%`YT)3tVS^mlDkQ#H2<&hIpibg zSa=MsoP=Q{%rNc^6&Pro+_41R%IXXCz$)G?3B`t}wJgi>6QFu8`@*Mm*{xo zyDD0w{@BLjm27!Stz@Ni!wZc+N$c&Uxn#H`rx6%Kgji_ZIB~fDJykX2zTN|CWC1?F zDM!+WD#its`0%cVW|=0dx!5<|O?#F3aZ_HxPcxG((A*DhPBOO(*-E_5Z_CUmW@3IK zy_2P*#9*^0!(-t^x#lJnZR-ZSPDMTmCkH;ha{9sj|Hpp5|NFka|Bw88=erJZEEvei zc;b@&-Zs}-upA0JMV9Ab(r6vG7jl}K;1}ysC1Gt~by~tAQIYu3o&QS=)MLj-Twnjc zUTx6-Kc=g*q{kul*6{9xC@qwJd&-uCKHpSWArEGsjS z^x*a#%xXwh$QQUKMI894rulNb1Z5K2XeJ=XH)=qE9;vRO)z8d82b}E6EBJ*nKgVLZ z)%7f|3b6Lb`1}R&*=r1Gc@FoB^nhRjus^$prkHiV=|0jAZ)+-n|AaU^;r7eB=H3tG zg@7pH6<91Vi*#NWAQ-J(=Lv7#AJP5QIp}l_~K5Zj|0mJ zR~qQG)k$N>j7=MOk7VGx2)dw+uEZBhSNXCj7~Tm!v%fh@FCGD#rmHReWo<-8#?9sT zm>S>^(<@^<|0Rir(R__xX5`qRZ?!Qli&0%0k~fbL`6Q_vMz$4Ks>ZVQjqAW$cLTi-^w{xV5w34NMJ>=DNm~Ss(lZ0q(-cLy?`Q2jDLKh(Yt` z-X+I`A?eJoUDl2_i&y~%hFO(obdn5S?db!w&qV@Yv1r>w;e=g$yV+ka0qE(Dpo5Cp zvFMmLt;X`nQs}x~1ff4Q4(Qki=tx@6cdu(W>K$?@^QZ2I@$^ux5T;~XCjA6@@Q{?o ztpsBMxeZHC^x6eRt0!p3^@~ShYz|C!p6WM^>ygKt?{ms9d-v$ftAlr&&*|Sg;nPD9$J60RqE^iB;r;mj|t37Om{0n0bycz6eh|DJYEX5}#*}VjzqMf0P|J(U@hh zpW@9{(%=H`K0TYO@It|~U*V zwjyIG{@k3Qba2DAOW`@^dqaC4q~k{N*1G{){a^uT{v#$e=-zowTDB}#VauqkX z4bF<`7rG5bC{1}_VuE4He$pLO!DcVLtVuw<=qy6*%pL4AmZ#5|JU5A)C$y?|eb;GS zYx?>_ksqAzj)S)l`L#g-+W>G%9n%GI;6N6^-s;U~$B41m^68q}5b`6s>|kp=4*T7w z{s}60t${MF{vXY2A(u}#uRSP1fayr(VNtGP{ptF>kX@P&WqBV32T%1k>iGch zr*WqT9@7@FiZ4y&LbE0`2Vc$HEf2XH=XpGTv*(TzsBi>YvB1l*ROju$l^SYl_&+O2 zNm}Gx5E|gF=Kv)&!DqG-lzPMl6EMx`+^ss$og4LfiA0LE@|`zLFD>G~WtwblDzu)z zmE~c5YbJk(>bVQIycZrekjYYGX&XikaRBOQ*F*?ZUcMQg9y98r=@o9A{T@xM@+WM2 z<27SxBYE?2bDTeJS+3v8=tB+@qq`@4eQK9O1V+$3yQ)l#fKXf~Rd5ERW?*J$)3?UT zwxXQ2b_KuiT@l~^=e{F7)_+~3hL+97eB7qPWo6@y6$?69mp+3V8f1)MnOpU)j zeKbtf`}?sKoG1XKK5D|G)y7U3QXxr1C^GR(6Xu#G4^ryTM4OkE=JwPhy``7?@{`Nk z-ldc-q7F{?9PzGk*mUY>=ZQvpKJo?;(xbO}9t1>Y#LEeyCcfl7M%gskwc~yQKJ~Pv z#+MpXvIZ21yBj8dQlBz2sxN83|b)}(bTLYc|a*&RnLmYfpRQu4Uu zjgXZaKP1jHk*)|uEPCdkp6<$G*r$J-Jx39VO5A@?(NpqM`(7V#R4T#U{iyHOL_8w6 zkz53&HrE4dSh&ahkp?;?YfS!3)8()deVt<^)&{{!!b!LIEs;LgGJLGuvTyQp8q4Zaqzy;h0QO^XK_A0B}} zMppiaMPlou2gQNXeu%>*$K~>i|448)2%|XN+m3SH8JrrF_H#V7o#TTIx(>D^hN-Yd z&p5F?Ca&G-czT05V+?3|B*pmh8Mrq&cTJa5MjX0&@?4gsJDqp-dUq>LwlQQtYNt^!~bfn?cuweJgxmeK-2<_Bxr-K99ibWGci@gtgjzWe*(Rmo@_b!U(4d(G{j2F&|e z=zN zYflOeG2z@tUczklz#r9#Ha5Kemek$L^Uxof{1UWid?RzWV%%mVQEUVrMh39eZqQyw ztg~Q`u<;g2t(+PtED?2P$E*1kWJLZ)1?6Tm5yKqa04AHu_S_?2HXna+a7NRpSE>@x zWob?Z<^ZY6k5+k$<6!u5JUN4+Q{MKL1z4j(l`agU0`Ah8Don$AZ&Qn{Gza{Rbz=J7 zGsIRpwK4Ctlyy$}A*i zoA{=w1mYu0;LHgyTu^?bSljxRdH5mVeZaPc(+T<&0I3+kHR)?@9UTy+DHji z=@Mcnl+arv-PX?}lRc}x!E2m&>P6B|#H#iRL3YcSa)aOtRe3BU?`Mu?RbAvKM<;g% znYZ-L^6SV*WlMk(m2|tbzmc=~#Otr$k68c|Q~_|9Fy;g}I8sgMyojS3+tHc|hlYq7 z&{MxOjWdy3o^pE4YHQ?~gLBx1%!b1DXmr3nkVip^waEBO6FlC)C_-d1!x$5XwPJ={oS zMs!HXzRHZWAGcDw7HFf{V#;U|@6tHoUl|h+Nbw(W=wG>;tV91>8w&UV&wP#lOB!n9 z3itubl;{5?4c$(@wqSS#NJH(gKpM)Y_WvtW#b|QcB<&)~&|n}oQiVG=4{~Q?m%8Pr z7TNUoK_Z(?;aXES zvbgS!1Fj1lx2&J)0sX)5ir`NojgzppLXv^7BDf1=+d~N_#!E)ecdOB>l zv(0gWtRi*-lgOw)t3~Lg+P4hT=q~i~^!2!&M@i48)OdtHc@~iSG5i=e(DYX__STKG zq;2DCz)k3bOaZMwLR+i@se&T<$kl5XWLG980?hfcnVbaCgO%>6_SF5=O1j-u$hHmf zGkIOz_q|_3#}(~fz8U)az1EX)*gEL|k%9!N8nCa+QUg50p7fppDg%NnSl!)XF3;r! zw$!_1a3mhxrxEa6+YFD$#cS#W z9SLQ@#8t$rU9TXXKhB@#zD}A@3}!SNRpAA6ZDd;#4 zn;KK@!8Eg#XxKc$v0mEI5-4VdYgW_?Z&RaXF|A!)>Z7_}cY52z$GNv@kiTaBmDeA% zoMiI##n)9m5g&+@*c9M!+H>0?6&CS2au4$V)* zb|yO24CMDd8~Up?eqGnB%9}46G8=bE-V%L@On7rWyMxX=_@2Ja`Y0!Li}Z`@z0BK? z9;&z0Oygi{pO58Q&4Ys}g+-19o}RuHe)ogF_U+2hi!?Yq?htj!F;F8vB3FD+l0h@z zlQ{D&CNa`20@b+P6bO6o*MgIff=*Q!b-Esk4K}a;s314xKWB1np!}aVrp)yGPKEa| zpqB>XO1=|Omf#N+mf#ouw4^N&a6y33LaeJP-}@!AQB&X~G-bsKU%Ofcw|&mV)ohz$ zralRTv4VbHrDO-~fAawLz!1a$%qKP)NM4$<<2(i#tw81>Csiq%Z!StE#h8xTy-y6e zQabW8t)L{(gap2nV278hSr__0dzdAUj%MU{tGP9%CEjAL+E*fHA_7}yvBC&7XIznm5n89^UTw4{;KI~(^ZY= zU62(kT@cRo{ws4iAR25;sh)hE@23`8nFp@i}MhK+#)`*oiOUIDtW9BYvj!SH%9IvH7zD)$-?mS{jl(@<$kz zZ8)X$FG8XD{Nc#<;mK!ZW!edfhWXa*?LT{GuaYSpMQ`7tR-?2&3eihr2>=5jx$EM{d`2O$q}( z1|<`aQwFC0CWN$$i}^p;dk>%{*S>EMD=HvL6%bHqBJHRYrA1Vl5m8X8Ax9ArFhryU z2}DJD6A(~15)mni5Gf(lM7oNIbOm|GT@DLFwQfS0Wy0mD(;GP?-!`L80JUbwc zW>E$1WGBA~lzRx@0;`e$(&7U$;P|N<; z86%FpCl0%EP;d0Trq430XqY0fzTC$Sa)WxqPqOpc6^=2bu+%Y!bvR==@+X)8YbDZ- zeTXH5T3r=(vG|?!a~<5xB=S5z)Cje7!EC#i$h(n;;eUsJB{AU1k1_Jx-84#E&Y^DI zVwjRS@MA*8=|6yPDsHi}TY~rp87)s^rC}c)p4*%97SeIX43 zMOIP^hMe6BCk%q9a2LO4<90d~aD=1z0)P%?D~gI+Z85xxx!Z@fOM_{QdDS|m`$L8& zlRTie$K>mkzYOgLdPCdzy9a^S14Kv<0BKtR$HFneRK{CDvWB7hVuI(eAs41$!RQ>- zK&V8P^_DD_`W{Cdylfd<)D?me_QM{VlJ&{R{tofP4XZ9p1h+z@0G}tg1t*EV$TUdM zEs;B4UC-2gV65o*;d?=!T2pR~l5h2H|Q{8K2M3F$}# z*L|{BXCIt=eJnrAl1dWw2KuF9hDMKBwdVO#P3AG5P8#1-x%tlNrC`+(gVG#%3v1BvR_kRmPa(-r5XxuyXW}#-UFLxDHHToUKUrw zZvqY)CVWN4&e-6f_0>7PT(4GTv9s@+^N9th68Fu1Nw-i+^}C~Ld;Z$O5TrW-#ScZ= zG9573hF2#rt=N5N+4x4&J>7w}bWu@McymjS_k*q^J&m!G(9mMnPE+P&Sr67K3yM?8 z6*ouS%AoaVSfua;`XCdz@JdKKa=5omkzohf3SucmQDY;K@`%Y zoM{^Mdd4@Hf$mGF8mvag|`W_5P|n^q+DD9UKNKi|B8f~ zTkRkb#vl?BV2j&Ve%CZM0~)sbz4UV=220R})EiN(0hqp5eQ~yK^hF{RXiGMn*mZYG zWV_X?ZFHUiK&*hO#7}G_X(;PoRf!j1i}mS5{6|@WrC8xQ>iZvMiH_&2WKfm}`n>uV zsY{e=tig)ry(I2L0W`k|Q?yOt5Ig=g`YOYrZc?8e7*;Uk<)R<0kW1yk+gwbD*iu(7 zb-ljYu$)NKlz<8wKh1)9jbH9n3KzwH3!Eb(A3`dK>I)DFQq@mqKw1tcIe7sjs53$7 zKD=zbMT!@JKsK(+##V&{pYS!k8^l_8G&My$#0I^x>D1`SMZ3!s0 z;=EE#jE8L!MG9@k%z^Jm9b3PeZ9j;H+@KDv(LI}b<}|`L9t;5>VzB$$!WhJbaMll} z4tLF+v=FyzgpG)HfNG_*;fCGMvnznfODkOPRljaAQp~%oojUYWRK{sYFAt`dU>NXy ze!ux!&4N=ivG0+i?>dpfZs-(SQ3ywe-|{s4o7*v@Jc>ZWB!+7*1dS_}Gl-c*sHHH& zm4yqvTJmqwwerh*7ys!%^P%(7;x7v8eO%pj6aG$Cc=Q$&1rmM>2-K@EY|pSWCqX@k z;gKKNkeP6U^mqndlloqu`qp#OAlHU8O&63tg7iknE+B5O;SIUOiNd zJa0!f6PnkL5^}^hc)bdBbxbUIy~=~IglZW}$$?=L02{YYS5eN#@cjmnG$~{q5JVc7 z&KdaDA)STZxLSK)g&weQ;BcylwhRsGUw&rLAZliAlQq4mMQe%%tZ5IbMtt3DDu_9j zb#P+}^T2tje`%W3r=z-(dep(St|PWo{!rXeC9gf_B(5B@c%{&29>UL`5Tz@|Juqn1 zp*J{)E+RDSdr0MnYew>67%v+S1G29c3wvUEWHB68nH`-j-`X_s>jnJGE78e#)_qWy zSPAcw9^cQ_(`o;V&>o@UqPt>E4aU4=1E795@!9~B)nY-Y0@>jMxaS(A=!|v?MtkxEQ|i%n?0$U8YZq6y zg$zUVW1$6&Ct1+hLlw2LH}=(^?3_{5q4O~O-DR9p>~@wr`x@sk`^S83*W++;FZfVK zP%li=-rGTh3d&hRpC#8mSc+p$+V*+g_Hp;6-AjtRDq*rUyydA6UkKYok|C<025FL` zTA^yT)ageQScdhv3o65SCYEyGh;^P+1n9KOOv&+}bJCF4dufvyAV1{j7a zv^_A&+{zAa%Q9$ssd0h1oP@rXkMeAOaBy5L%jSqJ9VzIFqMcsG>-C&xjp)|o$EL~~ zF7Qt1CK#k2&Vg)tO>CB!HQ_snlI+Y0+on+41E^)1K}(4}HS$|T2<`Bjxeec3>g4>4x#8&Ww;YeJJuOH4wt&jP?#;Tr@!>q~ z$zDyohyx81WqPc?9^kr0*m&59)RRAe^Ucz5qQ6cGGTURhb=RG3 zAOw$t0|Q8Tt_bkI9Bk8x!VVGj>lyD|lAlyw8*s0UZXqfeHqGkfkBl|@e)hS$5y^j| zge^Yiv8n9yef41g$Mp{l@!U?x_}(FL0$`S!U%_@cOle=iUO90n3K|#!d9HzEYddl! z#M>a{g-i3#hg69Gk<{dt7Zp-VD-xJswZm`1{NE zZB-Abi&+w>$r8$U!Y%da#TJHWfB}ugY)T3~giAu)vC*V5>6k#^Ax^c8A}V5=A9##4 zw3g3{k-Mlb&o#YY{WQ=ienB%(J%7hxbI#d3#PO)uhsN7jp6q-8JE180VmzVAv5I2# z!4nh-wuW0>e<3@TI>Qdd4Z&PS=LV`MLkQ$+_RW<$Z=yC9$H!drd!23MQ&!)PqguO2 z{B{z6NKR1LYL}VVq!O+fQ`D7h=0!sad5bwI%>!CWoG(#fe0;WitXVjj=t_sJ_1?=^ zKKUVQ;{5HW$$Aaj8X@I^iN>O|;^p`aTq|ZD`W!pbi^_wVG1_pGuJXsAFfo%W^qHEi zU1sIqBm3+}ot>>ubgE|}K3J&|R#kMqqqTTx7%H6KJOC+c?TY{Dgx^MW4v@ERb5X*0 zECjohtO*k~e%PfMnZJd>I`lY~mUW}%&uP>rIX~aF0QCHM?=VPg9HxTQ3W))}&YSGo z!wlQT<>(D$3r5C!(DYDN^EI1eEQE(g{KekEi#1Uz(?GJw9pf>(fS0Cmq&rInueyiYTSwc-30-$Vf(Vh%a5&&%f3(A&3qUi_$DU1IOWgBrZ3kHF`>n4) z=96E&$^#g*<%wlcZV+Rpbxf%}=U8+zUySL1pG2rNp6(erOBh6(Bj27Yf`yb6$~$v^ z>4h#NtN)aWJAJ$5&WAUChXj*B{&{3GXp{`^0ctLd2#fD9cCk$b7}-Xej@-O7P6N(< zHAEIFb`1(lS)O_XP%(6)s&qS{hN>@v(i-RtI7ne7h$`%0aHv1hAs%6uk6f$kT?3WG z`13tTdav9=2 zr(Pq(NB2XeVHZoj1fQ6ckB;A?-j`ch<$Ak@urGumkrbG&^*&>S!dFMDZPKMaW>SR0 z_1K;ln9)&zwi@&-3xem~+#7yBtST(0N4_PCFQ$u`j~4nA-T1Wg;VIEam`Xx3j;sVk z5%R2ok_`<87G&sY8lRxeQRMZ4jkRfpFUL;C2@xKA0CqaZn}g2 znNr@hNaDQ(jh=2sZxd-RU_Tls({7h%+@r~~87~e7J#t0il5j1w zIqc*`7{slXsX!>WlRCTgYh}Tg4gNUqXK{q@y8)?%J8>5%tw+L1sO1U3!cgK~1n5_a zcIBKmB&HQntXV#;LY>-_3)N*G{(7E|ugW+o8|3t3T-#SI{krs)Gmw1% zrbA)%4&X|OV*EDjKK?PTS)ZQCF^XdYMwV@B&OpY!&+SE@d(|9dY_zi>7ZudB-r2pZ z2gh6cAwzfITY`@DxHPo*1hNDd`zO0VKA^A$+^)W?LpI;agq=81;%L)XZx%8+CfJ0d zom$g!8?Y!t$j(^eGn?;^*arHX&}(iix)3GT5p0$JmyI9^gwr2j{R3rzlgL<%O!y&G zbL$5$`#D*`7~iSxH4sCJHU|fKhTgk7Xwg%-;Kk*-)R@@%gHKy0^!DiabFa z2hzO8qsEX)_#QULmKojF73)$MLsT1^B{9-aNlRf;KE-soGuGw>ku25jZz)nwZ{>ve zmfYz5K3=)1(%UKA(=wrWCcH@jsDn*XqKT?~^{zB1NdaX?X%Q8D#Puj@^g@QxU;@J~ zR>&W&LZL>E@f-{2tme|8%ExlW2M|k2tCQ)zrKVT_bN~SDy-dX?Tq9oWyLl2LeZJfa z?%i8b&p{Y;l+_VAHk>5|^NO&{#ST?DgOiO4kdSJB5R;qAqI#+DNMB&%ii>eO1Y9Qc zMn+W&X;!*L+OHE+B+kUY@!CMt#9qkULG=nY^7!)P8W64kNC;i_iwUF@8I`ka*=>9{ zIP5KKF6i(i!fig(TC;>!_Y7LLcmw)k#^-iq7PPYRg-3#`uK&Z(9pQhYd|1B#ISZFG zzK6lWGS)BHM!6ZWAJLMdrDVA|ho1YC%@f551LPIw%0~rq9#yF`X0>sGuq!|A7#0I%_^y5gD%e8*kQN(+(*=cASYD z!riI5_AeVh|NN5dI!nKUQF3zkz%Doe=SqN0mC9UiRV*J*%VVqa4?CkUu7d#$LKm1V zvi$>C)mVQYFKsNX%){f*_vOUapY(wa>>bb!6=e1pn@82Vi59?#DlPT zwOT=ha!%Fhs$zNLD9wJ0@x!<-WN=O|*gQkSRjoY!{0kf4tvXWw;iY#J;8 zAOT+pReXsl`iQTN>en(>0WUf4|l_d1G3_M7zTGe`4r%ZEdsy$+(X2$GgWv~M|M&J+u*9j{`6<_8Lt#Xsu z7HG9nRG#NB%XbyXA-_k4cVUkQh4A4oqK50-=@hmX!@h~MhwH@@YIjqpuFG1cImR4f zsupDKO+4s$*~=yT>05!Tc4cy5`qGCx2wC5PcN~j<1g>@o*!p;jE&^{DOcVfZ$MQDO zv$r?T(L86647+nKbs2r)T($e+&o+ zS6&aSWz+Za&@W_FSMLTM)heZS9M+g_s_WfbW8nZf zmOOcuSDLrkTUK3e4$74ENRGZs{k}IL%Y$2s9%OlTbx#xT;PQL5#=S&lurk70Q<1KB z1ih^NEsGtZsd=4gO$K~DVT|+_i(Bl01+P9DO5`^l)^w^@JTx&KR5aN0nYK@@8c$MjxtS2h&P0%+z){6(kD_3@C zBde8;TmJ?!8X$aOoIqxIRMqx1rx-r zXZd18(|2Ne;cV8^j5f~2nrwSggQ2phPapuX7-y7z-qE!PvfOaL+pY$s7$^g_~@?0+rbKASiM{6p(x!7r5A0e^oH2ej=*c9Ls zxc^Jcs`5)<2a)_ZN0Ns%l_7IaFw$Gc)~thzyn{0bLBS34c7EL-J};dXVlAPeH8#~U zxc8~K#Qw_2!*NH`l`ij%umh`w72IkfM@0hQ421P9{p~!7%oy?QDZy0SE{|Rul$MLm z^!I0VogkYOb|#He%Z=*|UO6U@a!)Y>jrOiLg85V}Jk{0zSdFs*TX4L%toUk~S8oXv7bM@*Ce z#T)&7vpEL+flv_>*Di6nmQ&70@Xnnm63=R97R29IyrI@yV>JGQ8!|Fh(b4BlBBP$db~GDVG(E zQ1j|gQbngk&?=vV)&-jrJThFD9SJB}*I}K(OpTU(s5EEiZ!krj%kn*v>3vAgl_$=CRk zqQh@$s%k0-H6to@uFxZh48h1ORZyU1>Tsn+sY?+YJxgXNw4C99FCn!Q19PEJ&&fJv z##V1>!@CbgGYeY{q`oJA81YIP_ZK-eD#s>&JF23his=QohY{8*29BQ0F$O?bMee~W z?5#fSpD=yPUYxys?^JEK&XVrP+q=jsmtjMn{d|;$N1xNY=;YI~M_(lP%xrXleIFf!5Fz#S*$cGrJ6H2VT(ay&O7psO}y;a>GSck>K$FGlC_1fsZmpo##Qg@;ec~E~~_Pjo$ zd8?(E01z0z%BMgiKoEh6!|Yp2-itQrsXsS?ji89GQGlIle<|8bFX~;^wMFum4yhM~ zr7!$NroLXDt*BLLD$X+UBNGeK3MHO*NIU?mg&eqFvugi2$?mMt@o&9n!Ef3~L+9GCl~{T% z_|{F0mo5Vrr32K=KxD^n;T*g?EnY>oU6g~H$e|O7 zh*Z@dD<46Y@{vM-a8-W`$X5b2gx8`%A*TA#t#0Z)#^wdQx?q-RB$b0IebvuhK76Bw zbJwsi8oTIcJ>AH|MQIK=nxVlOw&9Vu!5kQ-367Xh+=IG0FKh8^aNxmp(-TQE*Sc{( zMzt!j2Zpp_>KLqiC12~qkF~BGN+mNDY#2=h6T!vL9K(4-3?0uLVG)_|2yL#sPMr1{ zZ<`gN4|k~V7BLxG6{peppsz9TeiquL$-Hp*^Q~gxa`V?Nqt|g+v{NRa>Q$z!Ak4hB zo>T~qC|Iy-6@#Bo#q9BxZP^H%8jRHKyhi`=QZqkPWW6V|ybM$6<9YRER=?1vHdn0i zwi(_w)+7)WA+gokYB-mm4BGNFW_n>_VAn2Jlzwwd^1G7tI2C4Cdla2c1u8joVFv@* z?8BC+yL!HKH(BodWCsK$;^6q;cH|>UMdErZ=(p?y3Q|AEbgso;s;?g4B9MjbW8>sN z$0R;1C{(u&>gfqpap>96;jMXOU)a<5`Bk1cf4Bd{EZE91^5I{I5OxW3TPuKzlolJr zylSYa?OAJZG#m8nFBr_W>(yREoV=83lu~?w@OI`G(^C1$Yl{!diM$ABUVDdqv2wXa`Kg} z<2`bs`Xko@tE0qkBdikLGh}XRC;tQ|;2L7n_P*EH&- zb$SJC@6CeuHA|Sq4#iYo-m(fT^F|^jHd*QN6tp4pc06%P`mPW^r6|F^2EC3vD4?;hA;2}`y>aC4k!Lh5TxN%I{^G*=!;f)c zn-Zs5XV;t84ILufU!(jxyMLNWN%O)~t2}iBGP7 z#3|$}Pmep()%4Rodc?soYy;58Tp8etc^m#BvDcXzt%i>Ar9VM^d*6_^&MRl@cQEe{ zdUc(uh52`?Wb5rl+NV^qN8n8ZDXt@pyP+ue82=3{SNz063%NZG9WsdoDXwH7Mh+Fx zRF2ZQ#5_anUgH4P{hW00l`%?b+D_~nmpRtDLDzO6lf{hG@ndGvDY{y+AAnXXO^tp7 z#KMA1d7zH8on6-omqtS-MJ2t)w|}p{ubZg4+@e3ODrLx9s=HBW=I&lFX8>_ewl1%X zT3Xt2qtM$R)6U!A_7`q0vq0(T3L~S4>faD&dNP5c(#?sp#>W(bO z{zZ8=EawA#9zcgU^&m?Uf)S`pL(`{rp>pwRtG$bZsW2X-5R?uK$47vdQ)At7LXKXJ z&R*DTW{yZ7ebHE_z>R&@MmXIpuk__B7nfGa)?$;yuO~;kBr;A|-<7@6y-Md7$%)Jx3U1xJ_HuB}I4&Xl=9!xOE-QVv0^$0Ih6 z-cM9Hm5_Baeq7q}tC0#HQ3G*!_5xf4?EqZQw>3SmNXx%&o$n11M$02o!vxkV$Z+$^JZS{@ls|g=TBetVkfIlhUSLpk6mP7>*j+9CSxThux`#t++Vrd~+H` zg6(M0|1;owsZxDU27jYRy>!Pvj4pqPfhI?!s@0OJWwMWE(k}NEe)@k00zFiVcVi1O zp>3qSX!B4n6;jO42KfNj4&46F+Ig7b%Js7OS{vSb(89ShPfj1u<%FIhxEY5UKQDP5 zK?iFUwEob$8AepkDB>QpRvEv8(H^l@tR-$$v3d&&xVLEa9rbRvzHTlZ$AF}7LmguG z?+EmwF}ysctuxydR8AUsiTPexI9C0@NI)@;u8zCG(Q9a%oW4F1mi)CQ`OZpSHQ_Gy zB#>(SKdF5T3apWvpfO8!2Msh&#t$=1#`C;zWG@%r7r8~KO5TaVi{hVpV#vO)Fko$UJL9~I<;f{ilp;7#ok)d&O-9&`s zGlHGXkr5v0T{t-H^)SOmG@Zpj|03^VDmIqH$ijHTG(W_%F;v5PB9X)~dVUc)1ueR$ zMQBxRxhgun@9X#@&e`y;2N3#}yxC)bc|q0Lhk{1pSIb*72{LGt~EOTZy0v{wr#XW^_$Z;SDm46o(ZvZtUDy~NE8honn<|5^D0j$xia++|;VEnRbGLTh=tK#|0nafjy-uShS)jcR zTFK4CQw-ordqXi1G1H3|xxF&zmLt?~NoKPDu1@7t-28kG`CbO=a!JvnLlsg3b+3>( zt{Sz(s4*OzEAn}tgY|%7naDq4@UbpT0Q2J`iO#@4WrFyZGdrfUEHf-Rj82MK3AQMl z=GA~A-!3-2D7;gg?fQ*bIev^$l|mgeppRgxbanQ*b_AN@Wvvz|_Bo8&aGT?N-QvRSF`fp}wNiYox4LiYU zCOn;==hI242q`1iTPkr;m508Pt&Evz7|(LM1c(R7v~m#7*eTFHd$h8 z!IsJQ;)`}0Uz-#aL?NBB+m7{m2j@uD)|Mx+Ho61G24oTaWB*i@DBHP>H=jPMnO~(! zMMto1^Qr;P&wzDnApB%_f4De<*GFPhD>HUJCu=uoeT_1)Z0}_|XIw?dwkpM2TOV=t z63o`ll`y>p3R@W#+txS}!J9piEezQ5Bec90QV?t@*RP$ANra>Vr8*wT0V|@WMeVw z$GDPf$#H7$>r}XgL%Oz|mJN<(deP6&Sk>tVkiO9jAKyrB2F*5j|N8(%(IIn2URy2Z ziMAd_8ueOKgdKEhxza|%Nt&FLt5x6Sxj)QC^Kg=o&#*`BUq6)XKC6(vDoTTWQ*keU z5K}hT1nAP#aQwU3tf*{YV&J9_XDfs%;BdrNgOhbBqTcf&2?GOJ1K9x|Mz#JK%xM3L ze`a;~(G;q^cf)`y9@@MCkN)YCy&UJJ*M|-+V)vsl$jR);Zb#=21CHn8nZ*uM`{Ld zF_j<0NU@#{g;bG?OIrTQKIwhl=irBq{Q>tx2@5|!cuNp$Opf3i5!r#XPHEbX@!Y}? zx4X4!%@j$W43Qa&a$I^?0cc^S-MGGUr2vuq?5<&XGRQ;nyiE@>N?%av?hbW>ON&~E z30QlQlh{1V>Zyk933BU>>I^%f>Zk*+g)g<3HzhweRR>=i>2G+FDY#TV6E_hIh!qD= z*;iMH!^I2Xvb}gAPVy1GD2P5SG&r4gK2~w#=g1Z5|sSb%`DJeD?fT<(X{`)^T^x=+9fLYEmWm= z{4Xe>B4?h$+8~`W71<0IC{*7(+z7jUQY|rDneEf&_#l5KuKqM_K~!jLj(<4K;ZaF} zY(mDy4*ZX9Wz*|_HEBB>Et!bwzv^=SgMjE$Q*r+IxGr0TDb%LKdezTY@dgKJlO!Zj z_oYxvj%ZKibFPIHOUUXb16B6Iw`3|~erdcjKyg1*zsiHu>wY`wir)+y=;LC1bw(;0 z-2|AP&CAJJ@5X>AO<`LRS2ExEj*Bn0Xr3rqF;Fk*Mf=&kI3QtT%Aal=M;w!PyzF-? z^~Ahm%W$(+4T#&QgPQ=BoR{xSD>#?fK$)u2Gn49y*)dE;+h^Mj+|>$*@qN{h65hTe zF(2Ove)9hrG$52+AHTqQD*o5deJ?n}s%v-~bt!ogiX3jg2+r4Y#cWcmi$Q|cPuvc# z4To$@E_^nligmBO;C7SM&8mz8rFOL4uV1LzKrdVH#ztcS3x%OWGiXI7Qv~X-6tQuW z?TO(ME@)-uPC_B-%X%xAFw-fMA}4H2$pdrl{W`Y@4UEwYb%b$dM@Zq^oCM2$D81T( zP#f9>VNbs0k75}g9RZ07hHC>zWSe&&W?gs#&XQuLf+4Bm+6Hfh5MY{Mbm&Zdnz zQ+$q0UXXp_x;Crj@uGQT=x)0EItR;E5sU_dBU#=ZfK9}TmFPJzOS)Q2f?YDgr0r?} z@c)g~&5G*2Lwy0E#floxIP#e8h^woskE;XWu?G;&Vb~}R$yzS9ZU>u1B8EmtG&Y;0 zJ5m$J3*XKWYMbT;dalnuNDv<`nfl_Dp?_Srs>&cZ=$`VG_APPL@jC_8R<~oe4f4g= z!R_Ju*v?ekZUA~y1Uvz?p0#2P8@L!cNL{E{3QY0 znb&awNB@f+Q%jH^5C|_6EV^84hhzVvLWY17kiU4SiCGxe;ca)!W@qy+bVZXUFdM40 z2Bl`oia^<>mwBmOdeNf zi?YvQsP5jR8@~loqB#b(93%w@H$n857aK6a{0cfGc$&X1r%_d^3J${`z)=Yg-|IrY z+fNS|Go7AZ=(sZNdL0_{!LnYSK2>k8-=km3Ersd}77xRPLIckaA;0_o3nyGns7c*C2RrTgV}%uB>Sl@< zS@)}Ys6YD}M4I$r%uLhdD!AFC%YtU+pjkXp{#&3cvV8``5eM@)LGWLUYA#4-CZBEj ze&sr-zAchgseZozVW9mee=L)a)`pxSv8MzABpe~UIvp>B*BpTcKjAFl~()*&b^=f=dynW`OlR4vw;3=7k@U#KPS+i^Y%}4@&D~uDx2%Z zOln|onn1~$5Tz?blJJ(j{hYAR%R$8hIm)>GDZA(H>Ye>XQyW`KV zT&qF84(ep{zynOIv28M4V>SYrDd_+A z!S~_r0xQ3~i9QckeE${^c(5Ez`mx0wqybFK?2&p(3uVOt4FdmdzXiGtBbjf_E6pV>C5s#?!DyfK>^s9F$6h~-duOtZFOG|XuNgXHCSW)K zw>=}zll+Kj3S@NfqoF!nAw1AF1(1&?3)D>B-V8Wf+6P$qd>6!+-&16~M1$&9ZV$*T zw$d?dU@!8YZ-CN$U688=7beXHfV}2o9h|S4%)UgF!F-1N=z8V-`A~mG>d&0|v-zIN`^`1ZGT(FN6JTpWrFGPIxsIhC!09qNGTOX6Pl%JCc zZpb;c|CDgl{}#CP9W-JZlxPo+E*jbHjX6p$CRUH|SWa9Qw!BYWE* zhYOy+3;rJbFUw#J6$LS$T4`OJJ?*~*-sq=KD;#ELGD%Q&3SvS8c%93C>N`|lS6Q8T zy*dWpklpg+Q-n=e()j(S@4oF6?flqP$Ts3z=tyCP93Z^ImG3qHwApAmZbL087Zq8M zT`;eIKUeMR3E1bmvsc}BoQWjdib(xS^ptc9u8NdKn7py33HY}RoBn)&E-_0o)9|X+H@e$ zAxQ9_K@o;6RVUF@39a~DuFY=P*$X#O6W}Uc7NVSE_45=}OY_~QcsYx*qCKUYSgo1| zR|`gw1E0C%%n7o?io3PHbAt{W7OrlB?lt|$Py;Zo?c57-G^F4dm_r`w)0zXTuBV(W zt~6bY>6CkT!D@>IkX4f`2JJanw*SZ4oAcu;FD8?$w_i~{ZtbUAzR${v7U^a!C-Ac9 z{k`37TX2eONe0%H9THeHpQB8OGODZADna-4<3(UoNh2ZK@f`6z(`OxyHVUO>`X2A+ zdNHs`Xm@Hc%;+N_{Ct_4rB)vVfwkdWt9B5PCYPj4M^7IcNx2_HpAhq&DQy06UVFKd z=f!^zWFpjTs`|a&J-3kt5g8RKHhOyD)Q(G6)BpbR@kIHDW8nFznLr$~3y{S2^R{f3XrPpcgi{s+O`!456u{>AnO zBv@-*|FIG}?=z|(>j$E?CiT`%*Mu*Nk{@s1clzf?PGM-fsc0Y9hNifCen3>rGS?dy zc28OPq{Tqyz8in-(yF~?{PZu;(;sv5I}4g!FK`x+>GbtyU9C9bIhTHH1ls;kgj?1r zk5Z1R`+EbW zwo{2>2F~d{dSqEE)^WAzgARFY`_@`aTQGAVH6v}#r63!5Cgc1=b(?W4eb zn-Jd@%yw!rzs?n^bhW z!tQ>qw4a8VLWze-_Jusn#{ufqp$XIV!PgkJtrQuqK{W##muXo}tO%8Puh8RM5asn= z)w=nj?9s2*N*3>~oR2h9^S^g2luMe}7$IC?@#|cd2i-FCe&X0F0Mw;GBlo9q@+4sbh~SQ1zMIOvE#=-`+&3>=Ms9~_kad9m;S&!`KoG9sY_bE ziXl}gH=q9H6nj?L-OFwt~UHquPogg z+ikuZw@M#M_#vwkewwS(%l(_bt*#Fic(gRPJl*^~UD#22SF)J(sf4B|^T6SnHd;`^ zha*H+V2;|$%yeUW1*;xJG-g+*hNtgX#xNsZ4lNZFCax04l!G1==n@ zfGZetZdw&na#l-Bfl3OWeH`*pP5zzyFG&I@*zrBu#{1O(c%u=MpM*Kbo?~>meE+Ex z7$`1msC%XJfv?sy;b`jPE8QOEUSb#b%eBc|Pf%AaNSjP<;$XI2M_bnSWsO)>R6|{3 zwY6rVoK%CI`jsOm#g(K2sZZ}U5|{O66!#Oi`P^CR6`9(R`nK0+P?v7e?ASZeUs;n%BhTw)sJk1bceh=8ByT2oq+Vze z+oXl0?Ja(d!ZsIn*7k_a@2oP+UrH)(4F(u1ud=VN-o}QXeV?#fP;ff{Mm;h%kd8o0 zzF}Y5H5sWpVueUQ?0Ki}eC`>04dW-m_h9h~GrAd_q=k*%74@a0(zv6qw*GniUmkPuw`V%FKPLf;^pFzqJv_DWFy?474Z)slBp);J1<5~$GX<4?X+W!5Q|N;%KPUZCNM@U%0gK&?evbbu9w6>!w|&P{ zhO2|C$btSx<1-33+LD#r3fb7^1!teg1|C`qU8Mivs(Js5PbILX2t@KQYdd>L3=ac< z0PEf)hwvYg9r?lq;A0!EF8}AN{^yVN&_s}9NyGBCRN}ZYHopZv1^gL}Kcn#IN8I3>Ho-W9mSNyTkWQKnn5X-bi0n6UAR{+rz&k3%9m53CUe!7 z*)Z(i{g84J)fn(CLZ(8lgynH;`C=IMdF~i7h*A+oTCXGg!ruN>Pdd4NjS<~~WGhRh zFy$tvNNq4Ej6r%?h+4hCq!$qUCPsX^o2$1kJcv_D&Jx0`;kXnY<#>k zp1vq}ygRqJ)k@XX(D#KSl3Cl*WzPE1=+A@yv=kL**P!wC}F*e->#0;Nk8G8gy2vMZRU7Q>9 zMo^DMJk}1BG?`40YLce8=Oi2*f`X+!`AXPo>WGkCgR#3X2p~0&U^kRH#-n z7e5x~9WDiz8TE=)j9%6&Ibbk?cy;4=!~RB1N2%!zpHr3VHH1*qlH2V_6;NS~0xh+K za4=|+fXiXP?H6S`EBbPzd6%$^OkVt#RT91H8_;R6sVDvNuw3ME)VaPuh0Lf${RY#X z1EmJNr6mTp4w%ZOog*aMSJg2k%E!irJKx1#=ql9W_4ofcUh>Q!R>@q>&3e17#76}% zX4`?l$>T@th)KtfkcZ{y`;7KDO*}l7DBYukXC}S%@bD-=MYKd%8YZskvp#&&nHa4i z^jhkY1MvynA6>>BlU(f~b=>Q`cSKDfEnZ8M<9Ce9umj(rGMmFsFo=W__=404ug|R0 zmArG-m13BDZ-<_+tRAD8)Sq@_XY98s&e3Q2O@|p27P$4uFh&~dHrsjg<^gwy`qH$K zpU%?J;kYlF%90rCqpR7ABm6NIwn5*Rr1Nt8<~ml|bPM_tGnjrFyh9S(1GqPw0~JXl z=)jtY>!p6(kU$7s{-j%7k8h#WsyW7!1%1Zi4Sey97UDD>AtfqAk*f zw{v}%dCdw(8+uCkM^S~1VrQ@%j^I%E7>5KwcEM)2#|^md>)fL_wl!(G2-Eb56Ffwk4*;(tExI|r1lj}PLB9ny z5K};)^w_VHAF&L}u3ctk@p?*tUP;Ky;L|h6}x|q}jt!v0~!r8INcRZ>%9!;NRTaEAkN(1`2WVoW~ zZZLF{J-Q}Pvp!&UfOef|u;*Z!Wh>6Hs_){DBm8b(WaUq~W_!_nL9_QTb~82q2+Ku>!Zo|I)6_nqrEA77yBg+?FytUyLPhEsBo6fNWDtf zo7S-R^B6{&H47ofIXV|?FyKfb8{{tDSn=)343vArx3cTA1qKBsY>@cH|$>~AbB$VFlq|4R+2s!!`pO^CZkc}{40D)~-*+EFXY zXW~(?i|K?b@q6HVO?AB}l{2lbF#lE{CrL*iclQX%N4X6Qp8ZZo%LHs>WbW$Gnd$4~ zBH!BjnQXX?eIZ=Afap6LCxS$u1dG~jPGKiItQd7u1}#YS;lW!Kb`MSizeFJf)#Nx8 zh!^jykcIkY20Pl1j#l13)7yb&G|MFBR#}Q?KNYPE-x1z(4}FViN@6Uu@b?Z971*Ta zpeot)=?I!s?{qD{v)^r6!w8>!p`lOntG|s$@IKqh-QBO;m93J+Kd;(0DUK-7f*LsC zTzlRNqWX|mkehICAT&($BRTzzUAv!Yp-1lAgKveNMK-!^(luG~*F1Y~R3%uk1`L)D z3Hi$ND;evJkVQrE=G|8Yv#_8kz8fCNJxwJoE~_C^z~0ImFAJOr83BvVh~s#>ODibk z^ymm9M|6@jl+71c+{N|nUgX-ae8 zDb2qgb*i8%<(O`0{6lm<15AeEB5%l6;(>)#?lER&3rP``N!5;LLR&VF&0{BI5CPdH zc4N*0hzlD-)+&8-0T~YZt1!1ORXyR0bm8$OEW>_z_!3;8i+Ng4sHoCCkc#`z5tK6Y zxoDRE-`YF#x1{ntj$2kvxsXfdl2U4FxlOrMl2ndcMrviIhD@0n5|U$vmP%u}Wyz>l zx#}b}=Dy{EniA%I9miZy88AVhEK%e@4Uq!f(_e6ZzR%-7aGvv=^F5!>`}29;=k-3& zdOx6JR>N1ay{3gVhfdkPZ_1&1f;Bl{%AUXtiYYQ0z9$bM0PEb; zOyJKo4$r%P9jCuUdLg@ONe^gwzzLa0Gxk?@>6)<-8j~Xi*Bmzcq_&C)aveUH@cAnb zqVACUhjIpBr!O3ZsaK=J&nbC*k*Hlq^wOp+W-$yEww4J=+_jt0I(n6yboB96L++RTOh z+tA~u_^*z@C#Cu!z=r3#QUIWaz&20-d^j%~6l*PW2Xh;^#wK7IN!{Hhy_nF*$|en$ z?Y9}(`=1BnZL{99^s@{-9^53HBSe9Je*)w1Ew}vBNhM_IY8_5ms=x(HQb!eajWHx0 zR167p#z8=&W4khGHFexLDIlrr@(Hin^4`z5zd>A#)Jzt*4p!Sf#3G^Z#rK{9TD=L) zV1@&bhFa?2h(#ZuHbOE}iCSaA$c}iCi|}Vnk+zaKk?1x&`H^NX!}9HHdg+*1nh|k` z@f#YrF04U?TbABPn-LAQM34iE+ugg?p-B=DK`SId{!i1!m5*lIvlHO!q1}F1frPBLtS3P z`b6895|I?78LMk!%ERm%QZ$K~!b)mNP=jqaZxL}!@^^^e6({XKzZ|GTr<;SqCdYjz z8Suxkb`OX44BMP9zo`_| zzHM0dOt^W@+e5vmBTfgOx)ZE`D7m%_%Y*2R0i}U6FvALryDIVZ+To9Q{7%6gwcF;po`It73D6{^_)N~qV z#YMO+hz77>gQmy3W{msGpdByhLXpS`X=Y$a4j~Im(y2z+qS%H7?U;g)n9aOv=?(g) zPRP1JQ%;&S8q{fhcWXWB6Cu4FN;esbC(1YxT8i&2aS?8FuN%pi>1r5INgyk));S)09y0goDAA)3fMe~i4=v`x}G!;`}m?M+H+c`%L` z?f}HraUu8be7e3?Sd{^T)Kxau4zZzhN=4DMeRp-253#!b6x+@1rPaQaw>f9sU- zUV?T^$+nIKoba(~fPR?{X-Mj71kEZ>^BrUtT!};1`L?h7)Bie;&ZjoJpP8W4lwCUU z<9Ey2)*t{fK+J?{CIFT{~(M7K!p24Icv+zf%DtM8@VznV6k*o$g07P){51k#hC7%X*vYip%`pYp<2)|Rgs}3vkp6yKJK^CfZNyg>k^D-^9C*wq=^CiK#sa($i($u?|l= z={#y_KWEO=oSqE3H6QhZ=qX0ibG30*7-Yy9DLvccW_8!9y?_nBL1Y^DLffPJjUgGS zuB9szOhF#9`1XI+S7NW0o}FoM8Md_`T>r=*t>H^MUv;o(lRI?>bs=hG<#x(K4u-Qw z;BGWaXk8R%5@9wxS=friPih0zToxz(fpCMwWv4Rg$Li)4&xMJEHtJL2)_U!GnnH7_ ze6~_7tpmCT$*S(=*WLHh+jcP`TCPn{LhSW<5*u~Dctu`4C&$;pDo;6X_mx69G>81_ z({mS+ju(al1U9M2VE`f98O;1iRTY!&JCk=H6T{uWAc(i2A%eBuR&hp^BCj(1q-l0i zjc42*QufV^AENF~*m3j+sGD(?;33dlKkEy455iSxjv&#zC%b_f{9X`RS%Y3!?>6zc z%rNVu6jv~euyrh7yT(eJa^D>;>j*lVcJ#JR`swkej42feUUnZm z)_Y$9T8(Afau&P?LAdT4dfyk*LkyVnA0cR02Fo&^hW!2Qp_97hP(N$hx?x@VSx8Mi-@I+;SK>V-*?;tqP1 zzPpXBewg#Swd!UnNt&+62S-Sho;+cu=Q^C}$lu!3kBA;nYUcE^{yNr?@rQVS4bq(_ z_<)$UWe9IOY!#Mr*pJS9acQ-!Sqv*Muv)?~qZi0>NB@;!;DatJsbY<8q~@2#!H**mh- z5AE3gbUVzqQs&>6f9YhspabnvlVDQ#+^3nEKf3Q@ZFByqM&z8qPZy*1ZpO%sZ4|FR zLwCk>kq5#YbeFsGQ`-4~IcLk1Obv1ImS0OxPfgU=>FCW@BMaY|LrAf9;KD)z0v@N7 zT1vy@^Rg#E@Q@Uxo2n@zUI0khPUDU%ciMB3?9%_~d1CBoMS^MMTgv7q+h4qWbOG>b zss}eSOW=${Tst!U5Go56aO4H39|BK6@!)mo@P#Vq=Qy$+9B7*9`3izc?nKM=_{v;I zUZ!%_8u+xQ3B70GANlUqU;=L)L4ru$=c$qc z?#Li#z#jZNVR9%L^kww*Tm&7_AX;VPzBiut#yQ#eE;s7QM*ZICI~)CSL!WHustp~x zp}#lghK)IGW4`=3W!LP zUM12+1f)wSApvPp5=y*4%K!4rGc)h=%zQKRe($&bYrX69>Iyf>x##S?&p!L?{oDJ5 z`HeXa>^yVY_%y(>jRi1*{sBxPFmnp!<_rL)roesx0JZ}hECK*4bjJey16afX_TTOS z;1Y|(-|ih)_Ws^x8vtw*{CoQdH-PQ;_E4X{UC=07J#CE!{oVc;063vLwu6TcABt!B z%RS3BRv;n#w|fETyDu;Q+UC%~gD+YB-uugKf9;)p>?P}8?^&xeIeu>gJ-l`4TN)S} zLw_wDZ(YCcu-;_N!}XY8^SMZE*6`X+tC9GnN-FUb3>jY~$#3-Py&} z&E5C5pML-<@Xq}QVc`*x52F$ipCl!xJbjk>IwLddP4?TIcf}>8W#tu>Rn-lRP0cN> zpV~h6^!D`+41OEJ6G;=3->0T$X6Go&E30eNpWyn&7GIFm{=ydY`WMdr#1}ur*ETjb zRyNKpzF4*eY%$Ky#x8S+LqOl0^Qw=a?BRRcg-*o3Dyrv_Q?nooU%S=KEh4W@RG@6J z_8Vva8DpXUuQ>Y~V}Ivs7%%|-!qqkwh}v!2ps8YoE;bIft&4+`e%{(Xk-nF8-3tk-!5Lh4gg7bF&9Xu9@7&~=fR7N4!hxU(EHNT*Q5aC82eWR5 zEJKhZUF$H^*g-~j=h6b-0=0t)5LQ-j{(+r$21l3x2ioi%h$Gfv^MAxD)QldhEe1GK z2TFAHoH+nONdT||MY@YfW&+@SXutp_U_fX_(8OmEwCoJV?p7ucYR?3|{-l^eJyk<5 z`+oc!oREIyGhr5)S{R`*aCkOV$$;&W6JyF)KKy9vWx)*W7@PeNx6t@D<9%e`^Oa;| zlf6=7s^G5D4!1X zUy#TIKHou*crl;?feyn6LG$C0$pn_uaXGL@V~YJ~IGJ#Mpj3w94G_iPSN3CX6Y{d%Qg|7*3IVcyP z{g4j}Dp=8l5Dy8URu5v`9NAB3a&`iP3aSM%-3CwYys5uD{Hid%)@OnTcMk!VBQt^K zBVp5_XmhXW)3ssS+C74S5o!;Xw1QgxHu0Prps_|Xc%jWY^zu2Q`;dJDFfh$ZdKX0LfZ5w(tEaC1^z zNQ95DFdM~I)$r>3wzKIHgRAShCa$}qt_Eb7?vA?7aWddEZ(I1I93T;L)yO*k)JvNA z=VZ`jz`;#R^cl*zXPc)%Mmw@!2J|E|j;ZPQOng-gZCExn&AK~g%J(z=KxB9FH~o<; z_)B^IRZI+S{1uh31Ku(w&_|Oy*7Z<#U+_z7Hyg~bRY_CoMTX-vJb`cgQd^z;j|L9>HsnTe?ZvYb3qbKjw)vQHqWFv-PJQ@K~6d?jZ2 zu--v`r!a&z+L?|EQAVHZt(7XIDUds}h=m*kno;j<35-DgyfQsY$hX#N=ZE*wPUh|R z%ZfkF?_N0aiE~=@zu|Ljnkv$SV%aDF&2^o!5BgAN8 zgv8-iHrDm8|9p!6smp0}8-Y)wRt_RuRKpljANo0xNO4ips)?t1X=Z-ehLY1KEbLWH zpGlwTIt+{F4pUm$@hW#HM38otUZ5L5jEhE;j6EYQDA#(BSM18)M>JQ*yl#m&TdlA4 zoP0W5q$*0|YABo2W7}8qtd!~hmOfd4Qk&PoCE`*eG8!pRr+|v`jvV76f1np&$4C7Z zWQ(f?y|XM5@D1Tf{GyrY0xK-e1fxw!j=h4qg;uVb~zZmyw`m^aPwHh$Ma=Tu>z=nr@*D!K>G0 zRo?X4@&sEMUbdDs)|PRdx?9EV9C!87)#`(|V;I#k#ynhtu?4GU*B6SQg((mCN8KEh zyO(YURlc$R^mVM^>-*jJTf}hCDN5I|+e`i5-DXsVevO%isDoT-;Q1 zepg?ZUE;k~R(WjBTO1Ki9;CD8W0ra_6mIDIXNOKyMg_Ifrywp%c{)b$L8 zSgy?q1B$h{AavHn#hZ3Vb=dz-Aj7%i8$(sG@JIm@VDK{mKFn9`K?Yrs2?!d}i z;H6(7eZ!2g=k77b#*H0`#9)!ZM!cjfkI9iH^WE}9!6z)qlPk8uM9AO!7ep=! zSw%on|Kp56K>?-_xw@l_3E&{bZ~DqvY3=}L0^6a9!p%r|Fo6&VNq(5|C*qDv6HlQq zf21%DG^A-Tf#W}ro2yuwDG(I)i=tmL`v0vSb=?V$3ok5K%EuHhSk7BU`hI^k`n2aP zeN2yWsOwDMKV5iI^n1k6W=zS#t)s0^UN8Y}6~AULrnDPu+)*&-6Pa=u&rNA5n2?P&;Cm^_E<=RiWSTJ5T0 z`q~^qs7?~)GQrsx<4bgT6rb5c(|0@;_UX~R-LZcAFLSYR+AUh>Hv&F($bW6)Q7T~& zWcd@6Argj^F4ALGhez#DzBbPmRaH}6&t)AbJbc!!Z8Fdn=l_tAySP^>u%MB$VF3>|&LA|G3%ySqiM* zUzjks(#V$P6dL0wawnLK7o%N<$DB(N9)VvGuSPuW@$~S2oSV*F8sRE0W7mHaG5!?J z$^?kAWqoOqm$VoBa9j^`5VwcEar&+pnbGV1Ga|3BE2H3~zT zq+t|HLo_B_?+7I>s%$u4%{tD$r)=}bOqx}%x6DQBj@s^zk#Ap0DxDswk*;hJ!jaA5 z!hC7m6vdB&6!^oPs7@xZX@VRSSVk;(o_3bI)vk1+d;JDrx$BY2NbEF1|KH0ZjHW}s zTelNLd~_jN#cFtZlSIQvCKpP2(3ZNQ{>exu-lDSVQ{FoU@RI^2P9YkW^%(NGuA!gA zu%*~F?+4lDWXSf#=8H5Jls?NSPcym8K2pA;h$B)*wq{W^1$cD35cB5=fY9texhyYv zF@lT^2R;fWjv+xa87xz_2(~1Kjut#$IDD|$mJ#*BWC6{)Z5o3Gi$H%x=bQ%s4)yg27`? zwq^p~pfLZ9)M;G*V5bJ-JeKSk4}l!)IiLz=9;%M&70E!(wN8rz-&SHm4luefWOD>R ziV0Bd2bh3soCpmGdXSW@&VnAk6Sf2{(CmzxUyKMz!f4S+^dK(sy4ysV|3PCOg*0Qi zy=uo%h=MWM0q;^X7{No^>xED52;R0`{gOxw_lUi&`{k>VUGfJb9>=`9o_wTU&iCD9 z+!q*t5+z|CVXoDffr{A3I!Um#A=wH6%OuOEAM7`bm@KUr%F>9ePUvZMsHxQX#D47& z;!FMIe&5}|+K;8-J&@yse5AK$c1-jA0Q#!0Xj8sgeF*I9ZJxc(xED+4qgn2r+-jve z^L(Cpd+({Nc_9}ig#ILKt~84rTA@CKa?=ZZM7pgzEqj+JsM%oKjn{K~Nr*hnT zT)Fl4Z;T6x`Uh^+t84A-@K%4{#{2g3WCCX^wiH1V>^%#vxsi+)%SI6kso70ZS|s+Q zy0TZcKkl4pzy2COb884`Jz~T@DL8DP=4Gs$6=iHbaph|`CJS-BaA@-^JxvcjhC0yz zgW=nA<^09k;c3ed#?c-g`MhwEk(2m z!{@H7D^}D5dJ*juxt;pDFNAA^W(#_dQ_j36mq!=awol}0R#x^EXefO+$Cb>%!1p{h z^h!RM%p&jEd+RtJmW67h&i0~N=t)EvFACX&5cm5|zAb&YZ;>JGHn8jlVPPfLWvU;H z5?&*QC!_p}O3JHhs^VqPoPZ8!*4l=+!2~!%`s-xDj7@dW;QWV@{@P=&U9~JnW;Rae zxcSf%HRwGiH+oUHla+BV&KPAH=ZCCbKD}T6SlCiM3_nOZm(97rNB+@5Am`|MlFT>_ zh)99i>gk9ZWswgyJe$8H-wDgqtS)Wy(6z81ZIkrIU|3J7d#HQL8}61qL?nQFkuCYG zR97&7RJrOACk>WdBv&->nO%w<>+Jki1I{sQm8xh%emqBPjKA;+*Y0C8A0BBFtTFal zrl(QW8ml{~6~s+G7t7v)+d*kHs5i+C3$Hw)t>O*T4?mSp6_j^ca1<&&ZKPwL!p6Ar z4XPs4rRft1VK(0PY85A@rdnJv{+J{!nW?NA%48Rl|2 za-Xb~Vq6bqN8HX~R7lHkbIPTk)p`CD<%Q-s3r)??h(Q>ke~E3#Jqy7Ke`Kc2K`onY~$ zv!Oa}mv!~I&E(!>@|?}#UW_E|hI2s(8jKHw98(@n27ecLqV_uEk`~hTAjlBt+2BD> z6Qzn$m!46PO468NT3iJLw&51Aj+=^jCJ->~I8|WST6Y+%#+7lzQM^q-wTTz!2o2iM z*joIhX^kfc=S^*v&OY-Z1=93+Kizf9a5wQPKKN9GzgYMPf!xRhM4*MK0J+7M43R>b z4Gy$Mkc*(miP0FbiCjQw9U6r95(*KRSJ>3PU- zIK+OGCk-wVpX+MV)nq0%SGNzm#}}LQssQVGQys~Rik&tUR2v(arH1NQPZm||{^BL? z#`+*p(5NcM2M@_?4TvEK&k**_?&v^$Of4BKZQKD1^7)F9UOq{`z(`m;B{dO^A-1Q(= zBh2%SjZwOasotPNn$f1C2|Zs2^Li+on%~A~-|ji_*jZlhPDu57OPx*})nXG~KcokD zONA`Q+7I}yAJSUg8bux}*6!lTMFF|;&WHBKkM9dm2qU%Xss^~oQz9Om^}l-!)7TgS z;kym>kgE7Hb{2|Z8lcJ$t~lCm1R3hextShDubB!?`P_=7G6A^-CO}c$bos_;qvA%_ zzpdv=oPg?v9;39ZC}}er5sg?Ww~$?CQg$>QY1Qi91=~}e?mXE=Cv?-=y!G0Sk)o{^ zJ6=|Z?kM_1sk~B$7>DYl_h^Nqr8bYdV?|`s>hZBJ-hwR{@l(EUQL+uw&E)}FTCxli zl*T}!cRaP@yR?az%Ik{9%|bJ?yc7x(U`04B;k{eMgQ;m0RT3u^(fCd85GuOmG3dzP zZ?5Pc=!|*VO zvD+t4p8Y9$KsE{?tE|{$a_4#sufXi^o@J??qh`E}u{+uKX#xy&dWO2ap=m7=hJxGG zepUY<5U9a-7%4S3m>OJ`v9B^=YB9(_^884v)bqn7jq*jO7qs!VG}8&pP&pH5g_EBK z*HkzQr-Qzni?XNwrCh zY!p6R z#c9H~pn0ktlC7&uVKea=SdiAV0!+IIhwe3EDDt{i5C$NoURZ*9dzuAt9T z44b>62UbvNEd$URfe~D#CF0IikiWOy_jc)^0Yxl)VaWr1vb722Axt z!%4MN3Q4iiTCXwN7QEB0 z-&5MrYeI$Zk+3z%LC-qJXKk9Mr)1O@4gN%4SrM)nIcLYZK-h9yTDLrymoN#ik>b*X zfYr&+_K}mL`D)9@v?->Y5h1;~YOUTo9=@B?f3^R!h?#bag2H{(f(| zY=TAol;)r)HW2t{8RCPrTqM!KeCPh#RT@FYwWFF$;4CULRH9uB(N9pzeb^$#aUs-W z3ipWc9v6*q4K_2Ph_;OS){pJ!vovG0_hHI(ccs3_$~5s&51rO8>r-8P-K&}vbye!i zAnW-kVt)SR@gdlgap{%pkWmbqUsqVjKJWvv`z>L%PO5jc<5K6S=YZ0Jf3ICh_z#oB zv*phwlD!wWoHa$FWt)1D&C10wl++0vk%)sqZqgNK|2qmTCaXs{;?@dnW$c85rkIjz zj0VQ&ieCG7$F5CGJhc6RDfE(gjMFA^kv5O+U!TpTsZk2=*U8ZoK|UywAqF(T#fE5{ zy)=!NV1-q2MNg@zU~_6n(zTS0v*pX~;xVNuzO&UG`K6Rh-y3BD4vli!BSLBOX5dvO z5RD-xKy>Vb97ZdKGLm)x4q8J=W+rg8kzPo}LjIv=@cm88u4P6ey@-(lrO6TQ%S@n~ z(Ook267~*9%+=f4$049Otc-fha8rvR2nSE-;#5=-n+6O47fV6vP#DI?CrvxKdLVX*dL45_Z3OYMOtUNDyuFz2@V_H zh#xHtJ(7N_!^9OJVL&8GFfu$XdhfAJsc@NK!5iJu>AzlSMVf zjFG-V4V}mW7mxPH#qze>0$Q;=H}<1HH`kqqz1xbuJm6b_*j-&OOthX%55ipu8G2_# zb0G^A(a`%NRsFq^L|A3_BI&-R?HlLqa!!5f6RvV6nv}S)jbN`C*GSNYZqvGtq zXTIJUApC3vWii`R*4jk5?+)^=O6jQD`SiJym1rZ?v2|iNkJ}?^468_}>)5_qkX7-3 z$4aY{8EM40yCK4qGpL%Al@Yek^gmiPx-Ib|Sel+3bhJOuFWB+ira_zIu_k$4Z*HD@ zvWW*Aoi&p-_kk`G*hacmJ$^8ZWHM|kA1osBIbwOg1k&JhC{G+O%Zewsq&ht8~bvkv=u(R-3FIdc`L z7HDu>2uibV8qO*$ajLUz12_b;=71c{1gp=uk|mm;OFfpa7LgCSkjk>}mDze?8V2lvAvr2=?7=2;+XN&UJMq_H$ zWi6HDQ_Q_C$k_S-plTHDIwfEN){G3RuFE33wCYKelU<^0t&*n}z4=VNEPkBrQ-8C9 zj@xN`Sl-~gTFEKiWq$rsG0*M+QUUda;9hSif_ubJA^XQ%A1@Sh)rK`;7hs@4tx29+ zk$#p3c4%fLZm*$kg+I={G|INdtYX-P{(4OFc3T5>8;F45rQH-$T>VmnjYk>dtY{c>Fp28445oR7YQ=jnW9nu(m>QOZn>L1lJwkP2@EFq>W)Ob?{Q-7#dZF4WG zq7k3;U~EU<4Vo0Sw8u}!jLq7uPAQ!$!CEHTe89q(y*0&Kv+a6$X-WE&QTOEITrc|S1-?;&dp~6gL9Z!U7|# z_$}|n4hxNAE)1L~6EG&`n_AiTlqzv)*x#B{(y=b8a~pMx3E0VTIg(ZW?%_MB0H|gk zJ)RO#xAPl>4XI=afZuomuhePDhakQyohnxyP0LAjX7s&N)%z-%fZYDw2L@Ot2z zdXX4O^AB0H00+krwKYpvvL^f5nEt1hz~Kq)#oSFbFj-=ztcI|o)9*;CL=G>NbeX^U z{%&aVGI)Of(^N(6Q3@x7QmpbIcxUuvdtMd458EB8h7t6PJrpM9B0s((Gx5048ceZS zZ!hKK*uepB^&_-H@}^D$gE7}7HS;|sTc{UDRWw(feZHpEzs>0Jvk~xv2hJVBv~1w!i4+kDSDIt4 z>)@@+M#cCMo*7bAdHiMMZM9a}c0sRG@-1`c4&K^79fdx%sfC*U1Z}wZl}4M^p@2Yy zSHi$VJ0WHm-7p;BDb{KSI|IZnkwl|pDd%#DNZ8ZeH6JM2ZkmHyCv2a-y4X#^xwxVy zJN?zK%AqcZ2<+^@g`8yU9i$zlOnGWkUJ@{ws5@gT=BOcMen$6OTJ$b|r=Vo|hy>wU zQKL@V_hv2Acc^x1@ZbT}+xZ@rY4#8o|jAv%{1M3a;}95`;j_{0ic#gJkh z16bnap5*xP)yP=C76HbS#AcLU4E`qH*LYimpaaUoJUl3@CSE18?3sg~{?7RO2|SS> zkGDR4sp8WN_~R8H*4mR0a1RlGU%ajB20Q+n8S8Lug_gjvJT2LiPtQISxPLSEeWQ#H z*NE2LbTKl4`Vfk~qi9-w6ET*?rHqd1ZdHvJM>P7gUN4poRkNxNtMEqg%qNqKJd;I` z=?9VScTROZ!nq803D|<4S1ie^)gLmQ_o}9QI9ElfRSFv$kG%`10Pd~8El)>Js1E&X zO!qo;5?+GvyPwezQ(t#svb|i)AZ&mJX_8=C5sK&t4(t?oV?=*|RX|n-FeqH4(P} z{lo&hTR+YP5m!z4Sja^?P)CUdgO&9LgN0XY-zF@wRbIScav9{3UA7kRZQ(Gx1Y@@q z);jmVtEX<(ZN;N127OBV(A3*`TtVxC*7Ln9VIhIEoe<0!7XsD7h?ik_!98MrQWDL2 z@{hK!){JT|9+LXpbUguHs;A8}d#G~FFx!L=>&u@S z&b=0;xN?(rF%j2HF)M?|hJEKb4SplR_YCjZV==~m?XfVOAwx5w7>3uHdA~%3jE!Nm zM@%-q4p(^H4BU~i%O;nIiIP^vUWy%TPCjJlebgvEzx9hke7}|dEUdk)lSQ3nHDF6n zj_VB>#>ZVYn1KFqiS(Npox+ni0bQ4%@eb)>%i;@qo}W*A|60eN^ialNk5Mc9pzxFk zPI6I2LrLdCf}G?ae`berMM93Cq?*^J!FZfc>?+He*;c>4+94%x+`p#9sF0MN_LnC= zYAOma!mg|dhK8%Zf922K!NTdQl+RF?qT#vwaqHW`3vcpu&&|9 zz_I8~p}>aP`v#P?u7@;B8q&@kr?K41%9_Q%@Rwg6y~99wI}L)YOwSRT1XK`%Q)( zv6*bY>3di(#kHlS>$4~a4pmFEow&6D8t=7=N&D6rzURgDJ6=<*Tg+a4Xqeji4P&EF z6TUq)@SE)J17BJJmcB$g=c(U>ff6okMR0fIj#_t$>!6-I&90X{@!_=gBPOup&d=sM zoMB}z9IbnY&HERUzn+RQ;yv0g-+c-Rgm5)~{E-=olZrc_x8na)UQ@(hn15!xtW_dgEdGoI$aU z-8D;@`NsD@C#8ozy@VmR`YJFx`Jr#|_EQy&x5+%&$DLxhWX#q#Ci({MJqdgl9Jl(C zuj`2UGUZ{`BDFOHH(e*03Et(K31&XhdTT|*ZLxk_;;;9u*d~$39@H^OKgVPJwLkZMMBh`!D_l9}n{eIE=iBPUZmE;} zwzekfUkk*EO$n0e)_d(XZ@%=o1lbV=)SVE7p>Np~@4W}G$QgIDztRh>#J|!0>;5lu z_)8A|6FIQA+n<=)!0QZ4=~$$TJ<+{om_1Uh{r=PStNd*IpLUN&VLPEJ_8Gx<&^e&$ zA50*|>Z`N_N(sw%*?)=&Brh8>_sk*ly>#%V`X51UVGW zV~Z*)^}I4XGTPz#R)CK7$+cFL$KfSmP=#Y0|m>wVc zIK?56++ z(zp2`X`=QR$~)Z!GsZpbLIzI(4(z|9+JqSnpsIpLiBN+32WhE!i5+Eil2Y~xM_zoD z=Rwuftp4!UD03w*E7i&5X}PK3Qe^Q${EnOLSa=^|{3U`%1$s?}DsT(A<`}|hO#|W= z#0x%nzXf9@j@j!G_$I04c!#HtyHsBJN?vj%F^)QwY%08HE^BxO9eiT-{?`)f4v`EQ z#uZ^&5ZoZP6}i1m6{XZ{qZsPR4xQXDdJbQ&zLB_2s)sqZF{O%42jONy5Z#; zb^~5ExS&r&4w;OL#?`5e=D#V-2i58wWGVUC5e{q0DrGuIzG1Ecw!q6$*Q^q@XFaBD5FwxktX+{eQVFGmIMj>`_#h&qu;z)F^$N+7dY_uMh=6*o5>Op1m0q4gI zd4{*F#q57l~%jO6@Sp@w<~3c4YoNPs8S7$ad8H>1K~;d zhMRzgq0J@=A0S0*g-Q8>^_rnj*@#VeT;Vr@&8$e4LSpBKWU&{@uZMUG>nw81wT?EF z!|+|yMv#3|m?lm^v=qkT*WO^=h;gtvJ$X;vQQK2*k@(s0U6Uq93idoORT{Ck!MA9= zD{KD3FT%IqiM6x#zbd%&A7xgT3ED!uy0pT#S<@`QeI!q%7HP45T|&{^hQg$FSXgVk zoPlDJ4{NPi@debdhg3n9+3u)SZUFo@s=9b)FDnuE#~Jyv;uKcxeF+Pv{VVb&U*FY} z_@f|sHy%)36>vqk@<+vr&yFQEnTPvxzpQByx(=atw>%c#EyH88;e1|Z^kcJ3V8ee3EYGqu>vvYIhnl-FWmTuKcofh&p=HA6)IPmjXPhsc5w4J6F@K^19$)n zYUx6?5}}{bQi#8O4`2Df1Z;r8-xB2bIaIvBQ9~YJc{3+{jH35KA?f?~ ziZr1CZRcng$*F@A9wCgArW0~|fAmRWjynY4ei*)3+8FdlMu$shyf}lVxOW^=eHVYmfHc!yp$f}_VwLRW`rw0}W&&IEQdOB?8o96%I z3a@9B;YiRvgbkxf?<=B<3B0TAB|&(QB@xLsX9KaIE>>%vJAA^X>r5y~;!@Sq$HHfO ziw(s?Z!H?jumFPqv zZ^ffh%>2w^X8CoU@ZRM^t3D%`{RFi;@PWk6pLCDUIxrS8uAxxajnWn*l8N^mu@Jtf zUnO;X*HO+_tGhR&HaJh!_D%K>wR;{^19|sgpD!DWN#4HU6zrD%y9~c_RHSRMo_BCC z<;yIwRZNqW6FNKL%kq(CYQ9qWW1}Z`fwA;lV_Ux#t*s;r{qbdK9mt`-Gb;L^Pbv=e7-}R@-Ze*El zFv+Ovd3tdh4JW>_XQS&}zl_MnbN-RjJI0IO-h`bUzu%?t0v4fr$oue!?d(8~?9R{a z0^7Dv?mRvo1uXnN^y70ZiUY;yCCtE+j-`#SoJq8R6wCw92)dpkOT- zvv%KO(qCjXc&>hut9bOH`P%ur>CZm0rtc@GLCo@bm%^a7bA?#68ICkopq|eqd|;l( zyUwrEF0MK~1A^jbu^zt(ES#;P%s{I6fV=TEA>eSJV(ir2Bk%}F9jV6Bz`zw-li}n3 zH+C5(77*uxu*fek+uzqzgHwguz-;{4cia)Xy?`}ftv;s~V)m{^@=YPw8JY~F&)?7h zrK<@GLm9MUVT2|d#>)zdTRiC1BBrXovfQ<=`q1gj%vRaM(>jTOBO7)kQA_uCg{x3) zY3Fj#7%vz!zzRoP%&ERLhfySmF*Ipsp?(u+r$NUIHv(^&H>aBeU;lXbn!W9*P}{1! zH`NKkH}l@NC^v08)+QlvemR&4eWQ_E>{WNvkvcBckS$!N?NIoK_ z(Y?NEkaZM!5M=H>fC+4%DAMdyLj zKQ2C6e|LI5XW>ymM(0G~kMmz-DkB?j=E`ba^wOs(K}#(83OT?3k&A85f^O^c5?ceg zoaOV<;%DQN>({NSCRgh>T?wBhU1@CEXLbj0v^80=|QakKM3C;&9rAK7_ui zf){H%f|PcjdTzYas|K)RoVcsa@ti*j`4@%Ai`UAbyXkIClrEx0JdE)wZw$0Gdg?rN zVe{0;gSV%4FNCGBv3H$yJX+t@b_{bLt>)tC<}LhePY)icYu3HEr$tNkrz7jVINa*y z=$9g!FA0X~u0QrRh6CYJN7p6>vIW9etnNZ#{Q@fuGV3`aH#w9Pq1EYjb}VA;<&FRn zEHY0Wx1-DDmbkHZ{CK#+_h(NX^czpdd>k-?Om@%u zh#%dR)%Gt`y!~BgKmDfhzj3d@_}v62o})lXgeHc3d36yk)wUg+s@RD?JG)minexcA zqz(CkJ7Mu%Cc0^dNB7o)alhFTtVSHKy&L{g1To*zq^wV&cQx0;dJ=1vaxv=i1iO@+ z1Sxj-ac28I^WE3mw#h}R-lkug&?i%00u^HILz%`e9j z0#EBrus$7zpZd)dNJD1xxU?b(xxF#iZK80e)Y0jF;W1Mci$}}y4;=x+@=rR*4myxz9X4XS_|(|oy~nVa(^G58jW8mKk^d?O+?1lAgsv$=ShAv{y2Ew z-}Zv7MXLxY$5##4!ywyP}t+|(UwcXa(sthJ=oqz-CxqW#;R zWawn|ZC_8xnEg#?HJ>8;hVUy|j`I6MgYF(vT1zDUY$=SmBYL;g6n3$?GHR}~0ne2< zZ>3yrG;#52Qsn(m*zU(cR#1wF2P)WefxH1b%sBfN67doyM~~7_6>`UNukpl*faeD5 z2jwm%UHaTpzq%T)`_$-3%VdJFLcndA;|s`xpqVZGT?oMFLBKuH3S_k==|iPp{DeKi zfxHxXwSQGf3NVC93R}Xmoas|gIin{jYPrF?R9)P@FLyhESFOmpi-08K7$TUiwN?hO zg(V?~7#ajPV1LBXfUT(i0t;=0W(0Ybu8eNvHobkIpb=RwkyIF|$5jNf5SQ-TyvZLo z(%q?H3!Tf{Q)T;9gAdU{9fUGf&U0T!GoH>b#VskH4LJCv?&L!V#He5ThM7>UU*ZNQ zh!J76YDD^pUWVADWlj} zY)jEhx&kOnQ6i2d22da;zJbfnu@HQq3o8_{ej$P&cAlkSS@d@m8omT%R7df@P)XD9*pG;Gay!Rh8p4hOn*FH>J= zn(m+5h1Md{6&BD>K6swiiT825g$Z7nMtL z3D>;}RRh-J6+TRdd)Fd3hn7~A4V!#Nnsx8A6umj4CX#*QQ+H=1B2qh;klGEP3s~7X)?>Vhp{}3QXTnEG#|Ii>q!nO%U+Bzp%?yi z`7_B57;*&^F&4LeT!MfgWpH1{5DL*Kj!dH}%bo0&@10kst&6+q=Ax8)W~H`+S2x`l!vyjR_iEAlV^;OrXab<81j5c#PMk92H_yf76Sg3b;#p87GE+Bi(+VjmS_9wcA-+28bZ{` zFNXTnd1l`DxKZDS@dljdYm>K-Q@mJnW;L*)9s1lMn{Vjxl z>M((Mf!>_^dR?yhi&Otam)1m3Rym?;Dg{9O1+K{jB^&s7l#caehmwfhw3hloI*K z!FT9sp=}3fCLR>ElVBJkN>x{h6l`$T)8d$Rv&!um?}F8~yy@f>GagA%g^^Dx8PA*o z#WGzg98%PxLdOVE_O-O8oX){pj6A{&<^qQNwoVB1wGjHPxN#u_?G*e^?=ia7b%mQo zsKf?bMHfwQh1eQH^A6hjnIzNhT7B}$#rJ&$1!xzkv9fHF0+rH%okK=a|>%3?HHmt8p;*CLT=S~ z?Ztpmh(CY8@W8niKEenfToB+M+-{Jo^u|{wX3BrovASj;ekBiWnN$m)Qo_amQ9zwRFY8$tH*)hf5TPiX3p-1YCNF zR-uqkipccNOWyqq;o?*ILBfDWg4KB^T!XYmIXIYg>(~2BSLXknZR(n4H!59 zmjJi5eoR*&YeFURe5k}GEi1hvk4l$2eK3@wtYFuXc@^u0QLQ(|jzVi$R3-8kWVTuSe;Y8{S`a4}W z5?lbx7!PPbfG1X=WB7;hkNlTfWE34{L_H?X_yI58he!S>Y7vJjAa+32A zY%z3*J#Nz`r1?B!3%1XCh$#|LhAs+QGG+txQ8 zT;h2Bx}$w(oGlL@Nv@2Gz?FM1AjaXLm}0~EGKvT3T!rt%3lCCC15U)&L-k#o^ea-_ zHgJk3EoZz&@qA@C=$sCMw@FYygmV>=#UKG-BhXE@Q*8EIn!5*e0A6r<@sSO>-! z_bzZh?4hm{lu^;5h%Sh|LEDt~)Jf8WzFLJs@2X`y z9fvpOwnIgh`Kf!X@8<>Zu*G6?E-_>%T?@WYKeF^JJt3M=KiXb34B?V5*tiqr(lEwJ zVJC!5_IuHcui%ru3|fh#l*4>b4s7M6f@20Qyf>QT?Z@1EG-lc=TeyE#Oc%a+lydI1 z)vcaE8m{6wNHEgteD)UH`l6$dkV70)oDx&vMH@!JbqiDzg@H)F)r&<<)Hl25zjw zhB{}D2GCR)hN~KXUb_FdmZxAeeoK-|Q(QE>1QAnfK0(;&Zj%KWD72LuaY3#r;MN!_ ztx;R!!$5nmoSjE_@^?QTf0#@xiA1^>YHgTm3H~4U-UF)1wb>ty1yKJGeYVG9XgQXt>D;$qsiLm=zvT`c<8OpSe@ULkF zpg>A5d@queL?GSu3pZqUf^$hZP}BnPlg$$lP}H?P;2q&k%fgdZ5N$Tw*){b=l6d zDBM$84eq$ZQKp@3oj90IzCwuE(EitSeu9cX_2NM1I247|rixew)SiZRkpbA+h|6){ zDwnrMUtX26m)pzJ8H#htr3nV%4CS+L4bCS>JH{H7s>LYCG3OXcxL$Z^Q=}|z6V`&> zYBw4%iWm?hLpM6y%@)VHnX0rr**WVD>|p<7EVq$I;FHHA^N@3$!$vR56x*Pg z**1`bCq%FIv5tTR)}~~z1N|hyQ4`qcF<@Q)@`*H+KobK;&ro(Byg0fZ5t!5)j+Jmx z3eY$<=%iHUSqhq=T}&9^D~%m6)Y4Bdgf5o}Uo1HAxUsa1XR~=uMXFM%yjHA{DAt!n z&^Qj&NCHGcPf~sk3BE&jY%#E+DT1k@u)TyghweFGU{Y0F=A3a)U=SnGIW)B)@fIc0 z*Bv{ubh`fT>q~A^5eR~IC;K3z7uop2^ET`8e<1chA%EG6_L2qg5l)1DVtv{UHbKM>Q+=%Elb2*E;W6hcKN)RSte4xdA}A9 zX_{=u0LG&Yx09*TuBJ{Z2*#;X^OMI~Y#NmC;+={ zDCNi^hy)@AkBDPDv}u}BGAo&t1q`}1C}=DM`xDPVrc{1j*6{m%_^b2E#ggoc&t7DG zE?N3b-`FrW75u`_-o}4aSgAai6HwOcVO~zl|7ihhRwlP{a z9SRsQD4$OI7p%R1aKEoG^cg=P+F{kI_TLevwr?4Io$PCChiI`2KGV$Oh(P#?G-y`L z0m2=;x_^0Z9jqGSqqs^*uf`K9Ck)3DPo(bjPxunE^m)-2+ zSX?)Td43?iDL%{mob7`T@{PnEpTF`sAWCKT8GYG;!gz7~G{#DSU}#?aqDvVRofIIndIoa_gCz^<)w!h%5=R+d(#e8(B@=hBOg1 zwa_tep(W?S-O9u}pvxfoOYB+6=fYRxr3|m!=_bGEB@BbZ?uDz90X15NlJ9jZ97)Nnm z@w*80@YgeV{?h6SdfDAIjg!gOd_43N1HExyWfp{2r;dI-vm;F8RJfVVt@AImZ*hK0 zl78+Mq?6~=Y_wqX9TubJRc|I+0_}iesDOS%AA)AaN@3o6jy0egk>-+Ryy~oZMYnV! zWLI6ZF2@qDwfK_|-g5v_@{ri)XS zRwLF{pA=iV>mwg@w4R7Axh7x2ryBy=1eQZKMs)DUtCxA0NOgd|ZDD1AOaziRfTpg} zqCv8xiMR*>-WIKCSTOE}6|B~Yl~fm&NACiCov4F`x5wTa*uM9;>#ASRG05TTFMa$i zAO|jJi@6V~T3~74VMn+^?ie@`088l69vWF_Hlt93|t(gub_mC20$pG0($42ZpgH z_u=j`q7}!GdkCY?2=B5RFhcaErnEiGgRERXDvvRRoj2y4)rG+~yfGrVpPC8vxmC7# zz}I{KWS+GcM*etJ`^RsYe&yOc5pt*B%t=EJ{k#|&m_?3yGZ|I^39+PMLGNbpvA=wW z6-!18j=>u++k7ByE-w=Soel?Fr>mDhsN{&ul!m*8B|+Uy z6hyur-eotY{s`A7frmf`;DLDT0w8uY{VZY3#t%+2>cclru$luI7hB(Ry zxDZ`0>rrvPE#7ZNFBpKm1t^jz`5`-4D4YF(PK%aqF4hl;u+ z-{Z@>5hXjYGX=5*u6D6Y&UJ@$4RR#q>)RV`JeI}>yw_;FtYna0h^xaZQ@In$T*lB` zpy_C2|J(*T)FVY2m8d6kAnjIV*PDXtRn^g7LhTxcI^hb%Pl;khe*W6$UE1l!uiQEpAB1t?TgL$;%<;V z)M_$s#ng}%B(C&Snxv;)yO*cToZW~lnj}PkxeU5p3Sb;e!F+X-$ zbZu*Y^Jr@gLWthml(y3yGq1WBazA!Xg=w<3j};TU`+r-zX$por_>@ zhL}Jb^&AjjvX~NV-Dc|@tT2H1!UQ9QN}y=m4oWW#3h`*sA4gS~Ey{jPW)*mC9vE^u z<(PNsZNQ~e*v%xGh%NE&}9xx#zSSx=FC>Hb_P8*0pB6|~p{Ts69#2GCA>PNp*DqJM^uuzf9BjLmx<*RBfLvyv~S=|xXDav7F>o^pV2wqME9avaya z|M#!CLGHQ+$Pqz#y+`m>m6peQ%o-Eb14T<^v<}unN zpLF<=Of{$o`yc^Gi)P)df&L(D9NDK!bD;;42%O$fqlv}vYHuAQxtYM@96e@bhtyO-?(mT0I7pmP@BT zd0Dyf&Pmvo!B;Qx)$C(4V+*qBKekIKbsI-z#Sh~m^&$+K%QpnV@g25g4qivt#1Bww zD_EHQmw__*^H+yiga-ionD)=hkiC}4YzSEIBJk2;K%2llkUOBqm$mmp`Q=K$mHA_D z2GiJE*f<<8^oL%AfsBgPUCjEAFJoJOC@32`arwtr5E!!W4~md7W;G#I#N0L&4xi~?U?2JGP2e_3~9E)D`WVkUq+2Vq8$)6>8x?38*D zz1n*e5c?gr4)B`mdwxCDueJImfxq_EFKzKlv;Y6bUM<5zHMUVXBZGdg;LqEga3cS= zrO-Dw@yk!3?aNSi8Z9wtWmYQ3(k}MpMD8N1A6R!Wtd_qc0;J<(2}@@H_>A)$J?=Ro zs7k+6WS_!4gZ*-X^|kV8vKRa&Fk{xMS{8KkQL?>NyPEzXXKC`L2gM0(>yn?gh#I)S z6?7RX>Zjt;v|q%H?~1IfAg-U-aG~kE58hh(!w-K*sK*fofBbw;?eF0_Ik}N_(G^A1 z$@42SDAEWx)YMkbFuEZ<(A%E3I4s-rz2|=`&Jr{Rt-S&#Hr#DyMiiJ-Ok#smPS$z0 z9ZmzPF=wkYFS1^sNIdg|Tr+RgI?vvzdgnyXT+a@1Orb%JSCd?m>q#@0@H^IK%YhqB z>>ULFi*||%k#|s!FlZk137TmI^O#zNby0S9{Ow~sM&W8_ZuE<^Yx7`sS)>VIfM|_sGYS7eJ1ywbE}Kw z05lqjd^cS`mlkaTPOH74?t^*Kb=L5*3M&=gj}bhOdY2*RLfev!*>Lk239lQPYU8U1 z#-%-^OG{(gFQW+`hp?PjtP*{ z7)mo~Tv_x_RMiFx%mb`iszgtfRATBe&~D^KqH$ZnqQXq9vc&H?Ben_hpLQ;cv_&>t z4Z22!hY<=3BG@O`9q_$X_Z$&SF@Pr&t2M#zqS`to?wb)k+P+YAzQtqz=BqLIR?#e2 z(y^U2J{YyqLZQR4p!*6kfXIn-#srt8Z6!FNLx{kKEM;nCIHCC^dYH#--pmMCv<78S z7b-lQ4Vp!gbMoe8tKJ`WR_>Q2Pc0Sf*!jU=5A&9SqaJ1u4BSMktKl6;K_Wb7US{Pd zcFXu!R;)Sd=A|+KHrYc>ehkA+@2$HJMO2BrLOBg+_`>tuFJTNxoid|BN76v<>}lE@oyTNL8L86fw*PXOE`g$j|_76880tv z8|y7`Zn=2ywDQd`LG=8kVTnq?OIj83lT+%MOfo~A{V8n^en0T^-$8W-NG_B^8G2{_ z?L{ow-htNMWOGmQQAxOTztIzhWUQ6(Dz^90#|}MdeFNDwA%==`s?7Wf1WntmvFHq8 zu7QT;tE^s+*ZS6F)v=v;7JCiMuasvfF%9T3xl9qd86PGv81W zSX%me!@W#yz4CC>>OtY|q1RvE?6ULcTX&{}k4lo8l$wbCSLk30OwYX9F-kM4A{o`0 zistI4>(@jFmsp+NLJC)x9b}jnzkm6D4=O+F9$(k#r5gN*mwdBh*-Q3EXg_W*yB1xD z3}nhvG7PC2B9|lA}RA@J*q0evFq56`z?Zk?J7SL$b5I zm-%)j&LFL{#b>p%aD_mudTZwW3E_}JE<%qC&$uMUP8n9p;OML*f(zy$RH77)btVBU z89Ow0fbNV+)bChS$g|+qQFj{XHSEB+E|8h2yF80#-whbP%QTzdD(}wRu3j-do>-%5 z#695sd9G1d{JuIn)NRb!dAjQmf2Tu2_`cRxy2tz??e|)q>#*E>Q#+pPSESIU;w@FQgZ~cjn<~%0q_aOSFwu z#iCTXnjIEKJ64)~pG37;dHY^`pT>{B>bc;3U#Y{dm_W=YcFwE3zaYaJ2zANooKLOv zFfvpsZJO}{CqK|EfH0O803TDTgNJAcQ{llGUFq#i{%@{bYvxB z$F@ev3=U^Szzklg=~OcAvg_Fblv@E*k$R#amiHfMStoWww``T>4eo?2ngFjQE5YlT zE;8ou4n#uByC@OPFlG{_k3oA&@65rTucA{)WK4swKtw){XK>KMduh7PROQizQIMLc z2b6~*q8uKhW^xah6js&l>AmG`cX?Xj4K0D41!}jNi3gc_3}+(Nl>!AZ4aRu3dlN{- zqC2{5Dc333jVF*Tq3ZqnqUutrUvAyeG>CgCj%E;3P7WK=I&`vvi(5B2zLjdyug=C~ z8{FsO2%j{U!M;EPWQxF%F0zP+*n#!HA#TP7sjAHIo)O9gAj7 zeXYe4FjBaM5gwKE8P4IMJL|UIo}0Sx?ZIT=O(!CVNzW&yGo?B;)ST1yW5w)7U7RN0 z6fg1`<@GmZ4i7zlqHt-r_{9$KZ9~ffw<6t8BiTZ z-zZk`XWbR8Szy8j%)R-7j~?d?89bYqFirX z^j3Oht=DCgGrvVj=|lY9+uWHvxyj$9;IHq}b%}~yaZ<8^}RLb~e zhw1D_R#x#M;a+O0XhiHqi)BUMtQQuJdHIX^xzA~wVaOk1QX{(SEj@DF2#86Cn)++U z4D-TngoiWAS2{&8b>y(u{-yKps>@@Sy0^Y=P_q0@{^_0rMtg7|@>+;~gqLojz#Gtj z7caf1P{}B93VEc=e)pSRrRUsL=h`RtJw3Wt=jPeuXDVdQI|W}``#NbF^qJ9u5W@B< zH&AMFe_+j&a;>aUB)sLKZ?cSzfeWeuFI7}k_&&(&dhwUUBxsE*E z&u?58Cb?R4aj0r>T{NCBCbW1tPnR$%XQn%i5YJVjp4odA6rsO#cdxZe+T~7}SU9sd zpt=j}77(l|Cy<^INZ0AkY<>aOP7pQkAq*mCHM&8`gth$ua-6tEoCPf@uwcko(iqYX zd`ZKw3X2cgTd~rx*Iv>C*t{(LHA6yK5x%4{m8a0!vcKWZjElmc%p&gda{tGAAKIiX z%+{aI8cpky9V;FYFcPndD^p3QQLO?=Wp_|-?Q4VU_`lNHaYx#~txB1%S-x(& zcu`uaGUWL+-ez3sA@dYthY39o-D0?%?^?>}(W6@CSF<@dq^jMSgn}jIxl7r?`fl+f zN$AguMv}ewgpNf_4YIg(o(MWj=@d{fU=RbG+dH6v4QJ@mUIxFM?J2t-pV%*9Cdtq) zHdbi&xgytebVcMq;2H6q^>keZn*9kX<_wjjU_L-$8obofcP_Vki_E?W52t3`J6I?u zrr(Zg7JGAJLR(g+?MsHT7%~o7h?uWoob$GxrkT+Z<4AunvhM~f8F*h%NtK;w#!Dl+ z9M_J8m1ufgR{k7~J(xP9h-xiG^{u;X6JMU{>z*V~3=zR;f*R7y1FX>1eU#mUq^Uqk z;&0`>3u>r)Q0AwDtED;5hs<;;Y)ud{q&V}~4H;vmmA1pXPn&l4?wz;kJRu{V*;TrX z9%0TG&p?EVmuO9$yAg|+MO_AME^pl={8~$|0eglnNqfplW=nuF5jHpT3_XBUu*dsH zJ*)$}t8Hc2qG!>#kRhJC6?{+{rjvv?e#>lPB*5lz_Evx0|I21Y5J|0n*sKtn&g(sB zgMZkp?oQWOp&OMawZ+cMOh%1yMp;!Jw2OGCm4gJ~dx{YPY#u^wr0=MGAYRoQRbMIq z2eHYLv7)NjxgSC2FvP%{g_W7?4%<$JzA8;5Ehb5|tgMS8U(eAsJ9TPA@jaN|=gW%I zIE28Ef(+ z!D``1zG#HVIQuz)}U(6qWT)<@mbX%A*lJIgX$zrP+nO5#B}PhKa#gO}BK1 z``Ze}F!R;HW@)-%$2u?UexbcLx8*>Q{!I-`KUwU3Iq#FB2%^@MCw$i`QHY*FA_OxH zsUn&n+kvWAiAr|#cYq;z>MWf9DbF-TTLTB*;6G+rqOEV zue^2Z_Ic;SMP^UV-ZA3tuFh2P`{HR*x=od+p?N5P|J~=KrBPFsYT*-GgoPM|YO;d;xHt^DiT=xLnJ`PbgwF?6>^(rYM*B;9@_$ zWfKgz)JHB1L>w8h#XoT=AuN4LYj!O4(HB;h+y0fn`d#BBUBHy`M)E?JNA7mKu%q?P z?xU3Qw&~=rofbyLS|@Oa%68Jc3{D#&6g(5J_>U(k1=Y7^_+uRkJcv)jtSmq7d}8rB z{vx*5(kJz|L1gu$hWxv?SW9{q3GooxRni(Rs*?PvqnJxicDn9JRWfJuew@vbr*^k> z_a=x;*j>8oT!Y`j+*VG%LEX!3{2itrc(_At6DgXjZ=|?=_)A`PGuCy~yy}&$T^&lE z5V!O5xs(SvS3wi)Ktt*l_Q7!g@JBF^?BfM=Q*3&P&0gr+i!1 znjrrH`-ivL60_FwZFx+kS6^Jn9_Ah*?(b6VWOwQ+Kh~Mw<+?L>-;&bv#;77{00|MS zhIAQg-9yhl|F)yRW!rO%kDK2vlcfRv(5*9KXG}thDftxrsjEWG`B;&$BIXV1wXz_l z8ws&{uHwKaZdUb#%JsGhs>Hj5^Vs6O=w`Rqxh$hsgH705?|0tR+;U!A=8%U}<=w#``4|f%<-G=oUe|sA z%VGqw)E7bV#tu`~Cj2lDEqH^V%2r=nC(IIj)^O7;ok`3x>O63zcK7fE3KRW{XAGMf zhm|g&_iDa!Y!OVp+Woxi#XT++BIJ;l+3ZAF7vfLs#9Xf_ZM}n7kZhu4_{8WL&VYkF}*7@BmRn$E5 zsiERYHRJ9;rZEO*#|Tw4ZZ+3F`UPKdxl)SFV}ziq!hNuUtaRL7CazPF+koU+;`kb} z8y>Q-(&qRg-wcmYYZHI-_S4b6e6@sx;V89_A=g#>=U0~t=BKm401g#o2=*XY6rSN3 zvH9W}`>#Szm}7(X$?G!nN^R$_l4E`1A~OrEv&m z>(j6AZzb4RD^6c-$a2}cK%B(_0=9dF6TS)fe23xSOsT)zbS;mshMfxxNLuuQZVdbR zCGf8fMhwN2d3Xd=7N=WHv*-{gSKG5F0JX_3vzbV`=}7VAf4fBU*A;)|Re?-5!LAiH zN90>+jTWA+%hOnEQjsY#cN{sAc0S6`qNBh5`HLX(3;8CYefm4a0*~m9Pu*r`v>V=O zP%JSyLy-|ATN_M7KO~TLQ@vQ57mA%-&5Kqb^b+|__g!nk+7@Uo35RO!K7Etg(17|qnD|y8us(H z!9jxs-5LPb`xC7o_5Nq7(D&PQ{~(=nBT$PC{g1Ag{(|N%@mBO%rMvHlWlss_O_ife z_UY}~MHZGP4}Fe25xD=^F;6j(D0k>5Hu}wJE8qDdzIZ$jgeThlKB8y&;cN(54(EVs z4~{KvaEw62U|`OXf4vH^YMsbrLU-Z+bDF10);_pMUZIwx)mIzTJRb6nyZC5uV774P z^IF@vnws;|QnuPhbUCg)SRd?~F8+`EG|yU;_WF31kH$4SzuP6AR`G-Fj=6hB52y?j z{mTt&f}X8Ltkc;O$km;}Om^bXzm%`&KOUIp*9CvG3x9Fxmn{7k3i_95{1S~{qVewz z%dh?LYd`$j55M-qKiueFUgh7N?S84sU#jx|v#Jsbo`eVu&;#}RPhCw9z>y~kS}?WW zVN<^SqFP2Wv}bX5r%Kr%nkE0ejSWGgz3}ymgb%HZr-W5_*Bt9QUe4$>G!&4XIsVOs!je>|Sj#N3}j12L^&A6$dA0_!bA5(dX<0-Kj-ev$sfuZV#p z!v_RtG&GeuF?7417A?=Z;yPFsF##6^UGETdV|Z!72Sgu(&09b=qFbXW@lZXHoN7b^ z^N&vN@cq%Y&w!Od7GV-r-}!hCFR!HYlrx77*bh~L+1minzDa7?1F^Av7ETudB?AWv zB0V6w6z6tu-f`{W-=^i0`S+LNIl3(82_MBFRo z!hatjVp8)2N!T3#dZ*6{!b@OL)TSDvZQixBbLMnA56E$h5!|k5rVzQ!@T8?kz$>T1 z{+B7v!T^7CyU6m*UBQo$zmFe+r>FkRpC>*QiL9+2JWOtY{Espn^8hU~n{`0q_b&TO z8Vq?WS2|Dk10+nwUh&PDWgnt6mcRHUQ<|7{^m%qm=8)4Kb4|Ac^>NaTiPDo#rqsW+ z&`fKi>Bn^EuTcqXJ|*UH(1RMlb!wN`U?RXHF}6f62u6YT@|6q&mPesq+B`#qt${6& zhgT9CV1BJrv*;DxE+pkN#8%e*d10~6qpkm792HK(P}azHl;wIai?xSXD-XqlK-rW` zCnbxh?0YUJsD|7x6ZvwT_f1Qe))Y?SgnexV#?GbwqQ?kebS?(yLuAs(ORf|uR}(ojx6c- zgbQcrG?X?AL75r?Onr)JBNUW+kX}dWSz{Q~rJm@NQA|0$*bFAInxpHBY9tenXNKaH zOa^A(l-I%TN^Pn5NxU*zx(MIIUO}U`L5auRFe%utZ~vVe6r&JG0Bc7g3Zv+pq_uzr zrkT8x4i_l&0!>edEQvLXiT zrs6$mN~MK`pC(%bw~}LUrq=hVo!J){9BAmc&IyJB0&8K^6Wm?_12 zYORJ}L7B+%n$ZQ{-pBMrS{OC$q09*dB0pWBAfyD9!Iz(CgDZ=0`Ebcq+#?kGzV38~ z{;6HTkiK(|)j8{tOE5gBwfBKm_ML^_Ha$F!N=`OBt}J8g(D!-U z)yHlDGgf|X8lc$qu^P162Yr({D~e$iy@6VXh--sTBz#b%iOB*OCBHIykIVi|S--yf z#g|_)@oPW)(gnYC?kX$pu3GqJB48=CyRlb~1YZ|)0X=D; zjUDMcw+kqo1#5KhGo9yq`+s^SML-`R9pDrAwz75t;D#iTuGqxBQb3VsPhnWPtDtLu z89My(C#8^;^Dm6QwpnvrlGBsf2HU@BT@swl?y{nB5^N%zVq_G8EVQqgBg-37;o-gvV8xTm+rR~Li#o@yS42&Var-p_3K*;oxxE%lTM0B&MgcAP|f-{mN3Sdmr zjpJ;V5*;*_-A*HXhiNFm*JcQ{50D8hDE5w1fW+O@>2QtR!%QbC?&-MU6;fFv7f*;v zYs4z@pmz|OoF`XjTwZRL#}ua_Ud)(o9&i|sbg}Ojcw(cwG+~3j#{|&PhfYibO5%Jw z!y5OMxVK8{r8z);>3YvKZP4OhIX*-Y=gIO7v>caB@58Q@4!i9Z$_zd5`~w$4JbIv& zt_vXi>r^lshG57Boto7_HCbz96KexQN#~h{Mj__DPTJTz`V2#mo;%K+=(itk3qBEHE7F6%!?vw5-8AIs zIn*m8>*`TD7DcM|((WeMqsGdFua!M?$)Iu*Lp-=tlewH7T_hqUsuQHqr=`2?uC2>- z@@B6BWciDo!4AQ&-P}Lsl*J?1yAt3^2h34LsbqPuM3^Fr;ACh|Noe*jQKOVkZOu zA<>|}((Y zr<3@y)Ls(`#rb3Yk*ezwU>I()bBNiE8wuhu_-R%MbgOy`O^cPtJjKxPMr(JfDcL+{ zm6{c&2v5;ypPR^Q_pBAGyeuBYT3N0eD(k$D`@GyIWWr@@R~9~x{+Ve%uk)_^(l&qh z0HR?4W%|e$4FE_Y(To)$z^{l6fD0Uyx4gfs+W%<;R6*lk zgU8_eu+m)sZ5!@8mz!I2z}h<5gD>UNxmon>BD?*3TTkE5Ids=~xyHUQ!!1Dr?L|tS(U{I$))t$3u$da~g9;#^l0V z?x*IKvfUE+nXjitDi{B5MS0@D>CKi60&Oc7Tp$W0@Es=B+sXIt?{^Ya3NC~f#X3@( zLb0l&p+J$)gRC?Rd_xMzE`;%c?jv_hOu5(m5BPU>RG=Rw>DK$OkI_NXqG+rd`(QXK zTtBKuNH)FV7URf;{Civ{;Xe2Mdm~1Bdk8;oh@WNYEL@4*DY}=c8>PYJgcqjRrO|@2 zPLvvJxr(1JTNk+Wxz0V}wZ>J+xQ*UOtQi$fmK-nGJZlZ7G}R@yz^_#Xe+sx1ZCYr4 zSfo2jNWuh0p4cqC_%FnL9W^dcL*!%Ps1|hj#@iKM{_c|o4_t;V7TDw`{+~EMpD*;a z3tix8rt$nN=|3&)CC*mD)?#!hj<+qFB3TbVvOv_aE$dhnJa1B2%(b*0!}Ff{U_Z?j z)Fb402eZ!#5LXuw?1#>8e`bK?TG&dSaZ_Dl;mDxDPC@ZaDLW&`YPMl8#?kj_qR>ZC zDlCIa4lMwA-`1l?(bPhu&ZU9BN0XbUeL0hpEts z6*SOY^b>l$T#}k4tWG1@51cd7 zH-|B)toH=xlq;jr;TmxES3CzQ94)}KDzEHRaIuieNR?3;K)o#&Hdeo;rP zI`+poM6z#El>*raE36eIu?C93AL|xrxaTzB(U_7mIO{ev=$O#i;O8dMP<5x@Oy26_ zfNy_V$(y#2Te4vvd-s_7o!FYiVSMq^%U)j@kuql{vy`AfJ*L+nU9wI?I?cv|Qh~Uk z!N%>*=39+YA3ZT0AKZl$uC$yA{SG^L3iVQIIVDwN{WvDZxSC4$!o5x3moEA3E(Z*($i{4D%sxBe_! zM46m7v9+WtNWAInIr(LBATme2<=)8c-oDjsR$3A?1bCbp z4SF_4eurf)U*go&=A)!VFmNF?&fi##_L5w}mmYl((_`W8J z-T@w!j9ofUmxVNFZ)w=dT)}+#4vWOiGNnOFh#RC<1_#JGealMUjaQ}HcG-3Ahsz0$ zKS}L-{9bTveK)kT(sHtZ8QDu*odyot^H!^aFwiCH-(RK?SR6e*lX-$}l|zrdOi*!e z-T&D9OHLIlE9NOoP>ink>BATvJ8+x{JvTG#VHx#Bnv{T$P35EVcz1ZN`W zcHjiqhXXz-ak4kT*~qi|+CjdqRtQukY;bFW&U?C`2WbaXEAWpGYX11(($7Xa-1NWK9)r*HsJuRxOEpse^2;>RZJcI_%V%D0HDyR2=GKhaQaq=&Vm_fYyBI2ivOff54=bJJH6^Z=>0+6 z!oUzbG6u=81~6td;G1f`M^eBuQ#W9#VZnb8=k!nF;@EqB?5sa%y$@(j{|9BmCGU|U zM<7}?oD$?sU8; zB<-R?tZk#f_K1Nzn0Xg_+C2fauIKhMIycm9tL5{dKx@jLXzI^)kZm$hqdNy0Ws z;Pn(X&3lZA9;RO|&>c%I5MnCyqBJYJ&ap}b{9RqLZ3TJWg$&SVKP<0LgV-49a2uG8 zO=PnR=)kn^*zFGriF&@n)>fg$2O9Qo=@@EUO&Xv3BLB=9)jNp$!gj^vfr+x`=_hHq)d07b#@sD4d${HHeIPDF6~NW6A;Li7y2b*T&ybw z?fHme6ld2$hGm0`Naih_d8PB$uHKKm@4l6KAsj{N+G)&HX=`jAV!mhBJMq+NJ@K?F z#!#(RI+#dKV6o8Dbe<T=kZm8bD<3AXTGlM?}L7drQn$lZn-e zU#1sN&GPB)%y>Jo5r;xj9)E)`voPRvY07i}MmYE^h?mVlj19v0Sw1xz&=NE%7aWZ4 z0nck&g-TsAiqc(=z_@w2h~M4(Chy1|&C!QDCWPbIdk=15L!bz1aTfTtFq{ZzVyz7V z<|%Lx^&~ej&~y>2HmsW+2_B5&ElgTA?3yQG$cEBahK26FF4S2zkk2$c5PrgOua5Wb zP03_LKb$5+MSLKir%%&@=>9%b-$wp2xt1(vmAtnPT~w6E9VWuWrasTVIYzaz%oAhdS6^B_GZ0pOv2Rx$3sqes9 z0{Cs2ly1VGB}q}(87CZ?GG19~@_6B{_*t{jU8z22V167v(|Vt<*C~y;SLSV7B zNhLn`bA+mkWx|2DzD+IO(>0)lMNQgnwLDC{uSd#_J2eyNp>xEQ79L|{)zI1|=NY3v z|3?Zxi5hpBJ2qMR45t^AcUgmyvSJMGY!%IeeWs`kTbX?H{KD9_qHW zZJWeqfEcHA<62T<8CAfl+ob?&Od4-b89&qe4(HhBNxE9}oKuZ3!Ju-g29qcN_iy5Y3 z%JKp3Vfs!wftF1_MwK2zN6mYrZF2+;G1u0>p_cvLZsHL-2mQb4o@r8~RjCkz@<;~0 zzLgH+5ggad_rN$|Fdo>|w4Z5Pl4lF4jyJJ3nSO_D243QL{6_UCw;V&8ax^r<$!*>A zbOL|d=cn8ywhe!9ia>^#dS15LR80CT9KS-bClo7)8z-8_lpN`4fv zIbnI9xa|3@)9Ig@y1M>C$jz{(pYNp06j$M7eusheA_8qE4C{LV1nY0a^TBDUH_(4A z2Ruoj*M^Mi+-0gjAnt&9)7H5>rx+jVkSu**q)#N&Ur6ZanL$@??udtSJlfPN4Qsfq zl!I%b3g3EAnI~&p3)a-;o*D}_+iZR1wKXEbzsod=Y1O09+&X|EWuErBtl#4E3j3-i zni;TAElsSlBN@s!vW2QB`33JaJ(CR%*JT{r6_q*RsqpxO|6`7~(M&8pOAXn3*+a_fUoHO(bi$*U z^y(i0Z4e;+IU zd))CovthAPJ2P!3V!dH>y>ZOGZ#d<*l&B2IEyuCqQ-V~(P^4O$(SFRyBc>AlLSomi zh1S$;y_dQ+2Gyistf&W4I`)W86Bu637=W=W=;N``8@#M!>*n(BI^TRL&az4415Qn%o#M^l8G z-Gc;Wy4lky_l|1`-M${bdo(8Iu}T=d=wGwei{4zDWFN_t_aRxK?>r=*PS6V0F$PU{ zJ`P1}+4WFPnQtkZDHR}=9V5=X`+WB_{uTS(yI`RC^#Ax}8jsa^N0rU>a(U@( zaSc`E=yT%K$A+7+X3XlaiM!kMgbvDE=UO|DN1{wAv^={42io4*y$vp2!s5;`Q+kuP zhrgYX1S!8{_HL|Uz!)LO)M$^9-MENB)7!4%Y|n-_?|7$_)v?u?eCkUaeukshD#P{5 zi>sbyJNpj4(o(X@k%nnJa4!f|GZ@8)(B;R1{Hb*$zO2=$60u}xFUnGPqQMU%?`nVL z8D|8GczY)U^P#{^Bk`Wky{!q2Q?yyTsLLg_pQL$X7Pw(pMXDq%koA)3%h0C>(_C3` z^Hr)CN&gjw>hQg*RK$RINGlF+S6zH+Q10z8`~*2w{=s&U_pQN1%9Yj~29)JGQzV}n zA{P`_b|DgxlU@~d3YHp0pSRK00n2|r8kG|s# z`oxH6ca>(YbLxpC!F*fL(esi&&%n{Lm@XB=BkQ*mmHQhxg-E*8;s=rFpi<6MimbQXij}orUquSX+uwS8JV;1+EY}LE(Zg+d89?$w>vk}; zUk`g1euo)%K=I zrpUMkff1RC9!0|=T$NnSE!zCbV~H2N`X}TXf4_Y6TF|I2>^@Z2N|&6_;Gjy@8Sw!N zq-#S<+vGIRSa5H5O8UTzNpHt&&y35v!^NlG91)Ma^Hnm28gzTp1D;GaFRsIyi@r`V zUK~f%onN>a)Mu?N@iK!a?w*U6{bNe2piRjW|Hpz9Z^d=gC=Xp4w6DZ4WRX#_?tV%a z=#km8Nw!KV9`*8hDLu)rhPU%Cbnkj`?!n$i>rwn?cYM4qz0ypBSWh96HdC4ERR{bZ z0ziH1dsL&$mf0;6KJbBH4Qt}5wRLD@sIr;^>oZ2Ai}yajqA3VcL7gg**T-6%?tGk; zT+iG0px0!?_aa4)Gi}X4=_9t|a-r_7&u29PsIAQXN}~ec=AlW^bt$)Gtj!cu87>Hu zp1k?B84JJ3{>ulhv{ao@zAl(~`}IY^fJ;sU%4Kvv<6M`_N~D{jfoeI^Udca6=z4^L z#iMN}mo+5Ll!!X<9{O}RxY=5LoIpPc53agQEke_iGn`d^6SfaqJ+o@1-+6`767=qV zY=lp{_Q4n{Sd99qPmJmZ9)QcVX`oRKYD19}? zMYD^yYI6BNN#^Yq0>}gRPBiUgJ6md|qAchry}%bFk2T<%ZT8JE_+)((ZQRVdhS{mz)g@ez)(kfXn2|B1H8hes8LNYoRApx_IWm zExcv*k7T!l7xeCQ4CAn5$n~gYgM=MMA=`e(-%d3oRW!v-KUCT>`5l&j=D>2t1NDG0 zdvXhY9u%p=*X^^Eh=)^xPCT#P(kr&=~Xt^HtQ(wRq3GezihCViCGUVwxQ|yt>lX8W<6XoVbr8$aI*n})^ zxITruHw@!GtZRUBG120#4SXMrO}5^*gp4bRptSqX|lNvdkg&h@D7QLznWEV(#&&d>c~PywG@x>exqsqUaq{^`41-B&#M! z%hroF(y~zvNNESBnA1v_p*LowcVS%Cd@rCHxEj)C6v0VXHK%s-KhY-e;M)cl6Q9FeU63rF~Jjf_z=-zuA)c=OgNIFpMyJwz1gcF)iVCd#?S^`(wiZ0|Abdk;JY%r zqdlrU?@duRxA7}n8*KD~Y5DPT&P$Lg7lR0bcmeM+%Y==(v5{)u{PUE-5b?Lp1t(q{ zLmYZiPtDzSc#Hdh)RuOn{obTOWmnlur9zV?6+%oq*$gHZGBRem2qBch zl`bX;$!5YZ*-rMAB>T+7m=W0xGh%!*GvD5``}h3uto1(cAMg9zYdycU-g~viip6)% zInU!fHlO2j97m1i>Tu*ts#qC4)5lAgQ<=&ri7jx)=I1?;>8drlmc2=?tlXlzp+4-z zgXb!19Fw)pjUp`xJg=GQUo!HlqGafr_$b9MA{kcxFs&y-l>emq!2^{lz}+LY%-0qL zh?8sb+xzcWG}%kvNOYc)PJXUeAf5Rf!bdsv5qgfg`z*9ob{Q_-WLn&!8U5s|zuBR? z|M8WsckfFM55RIE0>#m$`klhu)&yR-zkFji79U#Bo|jx^7opJTmSB6`Ws6;)wr$b9 zgM%q8H%}19VkL?t7<7^=rPVxnTT^f_XRB_)+0N&!%l~}X`9t9aE0$%^djF=9oN}1X zmQjL>P*$W~Bgmh@@;H%dM{9(6xnU((9%lRHE+6N>ubANSmvMPMIj9W?j+X6#HQgs= zEY0nKE_f)B-A}BlCFBuf8RO-CDHfLy)!yqR;C?9VP{J`_kS31d$3l&$mP;Y&#kl! zvMRY5xdrVL;l=w@EXLN?WFZEg@!AuT#BTqKh9{>}yeKy|dl#otfg` zRhw>D4Xh6T<)|RPjk$s3Rx-gOs7;nm#szV~45f<`KE4n4-JE%S!)5S=W2n>Lx?3DQ z=qr}y8j;9Lq;rs04(Vu3H_h12#Le?b5p8tSrQ?6ve9Zn^=F8Vu-MvRg57KOCX3$YC zLWL;H%}N}hsZaax46qo6%KX%RR)Wqy+qWZ9Xj;dVeE&K0e(UH#&4)+8K#+giYg=;i zLWFg*=9+$Ed##fM!=mp=?2c8>{>h$izg+N^q`3uo3}Nz{)8;p91^MI>Q>@df7>S*| zAW$&*xg=IBCEU?O-uNa>v8p3aEIvcfz^E0Of5%Jjg&?%C{>3 zV*;?%#I8G*Wz4slOb!oxy@USM`@ewIJYlW2ZNuh*-g7UnU%9!}_MO&y!h;i(M>Z0* z(O)uq2B59KWP;4#oaIbP(Lgf#8%5A21&{AaTUap(m|5P)AEN-HA*cVV-%|K*j7FUz zUSM+FHlJOC25b*m3B(4WX70aQ&1eE>t(5~yQIJ#1<`n=STPp(Vv;wPNnxuf*DjPcD zr|>sGhJlq!PsscZ-z@>UmB^GX<3MYsP5hNG$sa&DfQS?A=Wqn@1^%;w{~zoDaKyZt z)RZ~=qk>PpZ2eOM88PE`{=RhWOtrScRwv|N-@={y(Sj0*$#ggn`~jTgRy`id2JF`J z0w#0$M$X(XnSIkGiy}{%z!aivQ_2o)_1D_&IjRhq(Vg?hYqM_u^H1Psxdd356H`Z^ z2o3}5k~9!_Lgpse+yD8g$&fQyZ4vlmZ>MRnxjPVH;N~{g2nLGhU|DyHkcH;DL-_tB zKy4{uLj2IpXJrvU?&q337)(eb1f($mkQp7yrMYn=8>#^+RPoi}$TqY@kEw7Qln{=D z4E&PO$obDQ{<9nZk&XY{l>g|B|7g*FlTD$0qJBw89uzl?P&!|@qlaj{Q<5_2J%E$1 zmjdT}c>&~=jsmCD`~QGb+V{V3O8-BTMt1|E;=kvGNVM7=B)%Zor%hexu>K`u&u|pE zle~o1R8~G0P+IdlY#37OlA3|R$18xNOh>gc<=_sA3>Z3a0-740ojWd&ja@`5`fj|q z!!E?2B-LN1w?OWlFz3|!t!p)ppZl`f`_um7fTr`?#k+`6q8q~WSSuax+j9w$^MS<^88_~ewDaBUHFNSC@+LI3dL2A_ zH=YPMr(mi0=bR|cap#jSE0@AYDH3I*XtVSmc+V6^mb{NREk-$m(WYjSoo1VSGNQ** zfuKRQH|CA!_?c%|EO+!N@%fQ9kvM@eRQ4`VU5|yU0j;X+1hb!So$0oDLm^m?B;JnyyBFPRg43x_0_Y<6vBt0mRf;TEIv$L_gaTx5s^0=V zg8hrK3hj#+?BT5`=5eCbN}>&zaUtmV0oQZ@ZUP_m-S*f^Jw@ssDdQ+p)~>7%ZSbav zbBA`h?I9%u=`=>5#kwR_>1!rPn{TCf<6^BgLXM$ezAAHTy^b$)vxNz-&fK}jxY(+7 zx@CppsD1xPU6tFkH~pu7SH>K+vX>PeMrvj#ZLieQ1aoN*QyLs4szNZpQ%+9^HhjK* zop8;gP(j+9O*wtwO!})1e1RRs(`2ZjTK7y62NSQo0%KQFLMpa9_1^naQB7TxXjxhX zvX-%E?x|lgEe3#TVIwg_#Mf_wJONLVa}@?H%kM^Y{*pQKOXj>;=C_~dDRd|^bh)Js zy^q`hCVtcS2(cxl;VPJ8LrG!*O1j}9EtW|)$p35Bn5sA#nzm-Z=27FaV_)h=wamJf zUe!hy&rLtqeCnUwQI;K=thlxlGCQEkieyOGGa&kbVosN^%$tL3!zi%Z%47dx8ccmZ@@WOs6gf|iR1PI3w zq*I!|^M`FjSjmoR5;#HO+&3o6s*BkUlD4Ypi5#n214oPghjeTpd3KZ6K(WnBx713Q zyfuQXCk2^%8gFNjkTdts}lU2 zcEXo2K)68qKeAAAx?vV#Gj6Ldb>oT7SQCvMJs0b<%!gJs z@e3>;n|>ZNKH4TCKM9kW=Q1jucvkI`q1X(|fJZ$ew@_8cd!{L?t(1rfjzU~q?S5V% zb@g<=t8UCWx#G#?klyQz(iA=Q8;{Fc!v7Sybc~(3`lO|H9DN5pQiu~=qTR)T zl=e)fFrgKUkg2T7B|ha58l_H6O*{o0rZ-pcErUJmqBEOjvOBsW^;53DXVA|1i*7je zm&eapJX{@llX-;FumkPcnZyAJB8f40q3q?w2v|iIB-7O(b`xjPX$kH3xq?y_kuojS zbRp5qK2U}*WsYqh6CP5V5%vh@>@Vg>w5A#OU`UBBWCNu1Q#N<#0_6&E%94WV zq0=@_q!1%D0(D~gc_Z#@U)vsIqrporZWV4*!YE5Rza2d&yC8i94>QYd#qrRIWTjq- z^O!HPyfW3NSaK|3#w<~qd?n)AuH02McUK35vaEO3_@Dk{%GWw1XRjw(ls>9pZjx*U zGQne-os~WhF03PPXK+_)ar^{%^(~8g#=c&b_b==A9%Bbz399j4-QWNAWab`ZwB-u!VG7n!SM9=)=-&#ICjzgmYsUMZ}mU*GJ9u zn+Qt2tXebY{p^({MU|Ca7<#1Y#^=XNRQAcW1gu#8CG)>2?^J=TM0ur1A1W7O-Jm^! zr_HXkc!@nXS@{x#@+j-FFe~;&e__=XwXZD6(W$%t@FLqdH%*V79{-83H)!)GgYWx) z$s9ZYF5O}D$g5v6N(Pi01%UTJSql}mfN#laBuaPfHKA&&Yku>lAZ~|^ExjL=pR{yD zAoj(2D$q^sHwH?nc^*eB-uUxxxCER=G61$-ja%9vsPl2HK0Prm0E4Df{LIBrDkq%Z_!OY-0o54D~wD5jJT!y^eY6(z%(`z#lulU0=xo*A(2p*ZC3@0rJ8@XPCTa zKE_Es3DhQ^S%1n~;da#NvM ztIO!UA#aLzMObyiV>88G)faZ{9)FXho*tu1();k>^t%_Y6W_5YDX2kE*U2v;ZInKu zp+}zL=mT$)?;+KV6OoSf^lr(~JQB9L%L<9_S9OkccwO5Y?7&kG19|?A-ELp}gZ+Yv?2!?u$->gn?#mY*6)Q|1~_Xhl%EetHr5Erh&30mnmG59{v-## zfl|A?W|Gmm>NNG>2;rIj_-^j1r*;n_C_)Y_XCl^wKf-&f1XIB)!$w^dScIxwPdn^)SXJ~`C1uK~aP#xP zh};IH108=ddcGD{fBmfh_x+aw%vuleN0EbM$|m3H&SnBoi(ZvATq=S{a2=>{^A5oT zhOBO6`&618=s%2^5wh;FXSZDYmlxB2Shir1wb7$ z`bp>Y)ox@{u4KD;wCPvIz2vyM+530}5nsP9r@zTCf65@HtbGxd?P9S~WGqd$GAHc@ z>v;{ckaTA90_rtUm)9xLqd_N3P!(?N(rjr|P6s|h{P&no_WTV`ET>IVGG>M{`ME-D z3%T*;BuZ@25%7RSl8(FTDbPuWynCwNSon%KW^p2KGEHqYAmc5(__1K%@xkZm+1PW@ zY6If^2G6SP?dOV>S?@i)?yp?d6y{4d<3*MN-6l@-FB!!OtkMvNMe?BoO2AvuVXMS~ zX|+#Pz9JlJ4c>omYk$Ov=kdKo@&UfAzzbUg zm5*>(h}LT7=mkFZXe8{-_oF2gx4d)1%QMoJhX&f+x2LI3j=5Yr&LJGgAD6vD8F`9C z1{>IjPDv|JwTMxiD$9pjPK&8mf@&JbibBiII~MNQ?k-0)bCl=)39;Pb-fU<#=sx*l z*o|&@?H~P_=p7_QC}tvESsEGT(0s-bEA#@_^QOVCP! zyTj#QBn5AHj(2;>dlPwfEn8&~S!S1ZlQ6txO%c`^;rw+yVT-D#u7Sf~{`QLE#1?>lLgd-Oz4Yz-LETy3mNhwtu>ovWYAr+piof@ z2gRGg@-z?y0RPZ{ilEGwCI8=lbO${!_5bkO%&s5sT0OCY8D;Q@2~GT=pNl zY3J(F$`tRS?0Mc32|N9$qF?;UuT5*)#?Uh4PBi0WW;m$O!>PjBBnpHU#&YMHIuT#- z!#nz5HFoFff!G|n4b{x_=G3s3nZqS^OVEz8c7J_;eA&T(+Hupj$if9@9-<8e?WNwU zKn`9T1#@u0_?>z!(ni2oAt?)0n}5m30?$A2#YGycm@c;YD2&LMcBsT;T8(3{6_ZP_ z{YRX40%^5Nr5HG1KvS+h54ngfp}95~*-O?S9TB2q$eSphlt#*^f~;-K=y3r@R22A? zdJq$$u=xGU%#9crL|F&Amu4!12PDf4!9B}MGo4)Y3gSTXe&XRd z+a3#hUWXaR&R79?eqe_kUw`aYCd$xr{zgUG*o?p7v$B|}Jpp5p+x6POb!o7q;0X!L z3QiMEiCE6#G`Ty!Rhr1!D>RJ58!Tkt-8`&c;4{)P9-gc`oRzb?iXQ*zAT7gTv*M*R zytV$SeKKM=9*P=W;xlAt7GFZKjzZNYq}o)LtiUmwDa0oFjr3%9(ZerZRt-JBWsblP zQJ*L_xQI2HOmlv9W@5(y_Y?Y?sDiVcBzUhh12{R;l!SW4>Kb}lPiy_k*R`f<;Zuxr zlNq$Qg&K`xTl{y#@O;LyKJmOCYQ=rmAAPSG&?sZYd0ww2$mcWGROJ(yr-Wd9sTvg8 zriq|;)4mBDn?Xru(Xi`uPp40w{i+N{spy|lcX!uIZ#{S-<%*3KOEIhgKmK=E3#g+s zi6s;`!c-#0j-~_8O%2j^6QpvYwREWwxYs}^Rr%=g^~{Q8^a=81(h2aWCqpF5exm{?CTUz4ek+U|4HwQjLlEh(3BE#KIQ;Y=CqK0biCMJS%- zVM5)^(-S)9m?ODNM1ZcqCI&{5&_ddM3+K^x?B@4gT)yU~cSEioke)+D_hOA6`)R@# z<7pp%!xBw2-SYbvFMKE_{K@sSF2f^en+e)S1azC)*a^8(1aXwcYUnSJE5=In5s(v7 zP>L?w4wS7ItVl4Q@i=MKC(RcT_-H7V;!W|AM)7~iRR0i37AKIEZG3-WsOUPBAiy+I z+NbnSJSAkEf0$sxitJUZQu{I zHny_5D&|5*^S&knde5B*V5`VyiMp`dpg=U;;ykPgf#~58&$$7QLBv$2x5V~J@VPEJ zg~U*s@Q}I{!EEUHgqX|(P#W~*1ux+$dlt|Es6?`AQ^ol znrP`GrY98`$juAbB+BM`HKKDfh*<^(nPnE%uO|9KGfJqULm52I%s|lbAJ*SKcIcDc zO5SfNoTTK#0o)&|Gu~7;m?c z3SC4BiqPDvlJ&ORgT-!DUnX2agL}4>}vY zC#-*q%wKT6Lo$|T8&mEh{|F$Pkq&T#0mT zb`i09id7_wv8560bMG(z$I@7h1@gUgz(!ag^V;m!vBYSzfyU zQAS-zp{PWED@{}r+uU4_vk9@uW60=0WuZ#(3n;W%bA7*LD^H#&4<$6!@1|qyv8Q|aihC;2j|^IhgjjqaA%qZ! z542D^YT;L==yGA@O{zIdP}q%A&YVFHuR%I0W*DV* z-C&&cp~R{^zf&!2&$U2i>>ZuMBlPro5V#(YhEzn$V!!D zE=~iYaw&H#5IowwEG+>;blk{|c!Sk{@jA0_w7SaFAS@)r-_s|^$I~yJfuRKYCafNN zkoYZQet3@s=%4jVhGCivhM7Z34GB5E^&5n1Xu?0fza?u4W*I>DQ}S^w+@~BxoAnG+ zwZ~}=VU-T9Lk2DM>PWxGZWe(b=j&d|au%G&WWl6be+fZ|n868u#ob?rMCQIc@?AdKt*-5k^VFL%G zS-8D2?S>-=_7o6R5Pd{u5S1D=_e0UbWqTV(p;x0GE*iIy;kce%tHzevLB?gd#U+YUXS|&zT3UR*~5h zC5vz&QxqdmZRW&SX?2lM0z$LW#f#JZ4_tlaL-GDOK8KSZiOl82{4?Xr-#C~M-!#z* z*RJfi#^E@voMwvP9B>;@0$QSlwfHz--q4!x%(X;4oKSN3#%q=VzrQqx=)T?GzUZl4 zUxj=~+SjkF{PZxB(uXBVABGEzj{nQ4xk;n}WJWgD1i6-ov4;$VdKZPbX7xJ9S`#ii z0)2+jiwd^XT)XQ{|95dfjz1yy%lH&)#fD;&wC9Gpwyqu5b!?~*>bJdH;(0ZpV>AsQ zPhjwzs(8%!0kSTmr*=cNV`>^R-)3aGN*_!|J0DIV{ zhD__iJwPKUBQJ+{KpgQgl8PX?0U2$zw^yPhG;gfm)feKHFzu$H=lD4Uhrl1cksRh9 z?*G#FR{06(Lz9+|w_gOZFWJtURF#^^mGc1-$<60S=SZBO{GgF!ISAQ;fy^Eab1^w$t0L$+B9V; z_e!jDCe3b3hoWB$Z1hP}_`}`fy`sv+?f8Pr48;#ejvLu;K6-C>qUs71HNph8kB=B7 z3=%{qq`4N30M%($+mI{tYF075JrGMTG?$;Wu+z*QsdIC@GwGwupQM*k&&LlwPg@@U z&%;3)5g*DrXe5nWt9+fmEEY5Fgfx^AKJi~e0d3x;K zix>GHE0@ZA^b{u*4f9R9dZUX}vhS9?m=Ms=UjG%9gpBab&QZAo&GG~l4(Ui8bj2+4 zTle^Aa82gb-MiKW_n&0Vepovmbv9Me$PS&XsxTnsHSDkAh4zwCKwYB@xV0Rg!VlowqCniDjr|(U}wWN&~MP^ z`)}mb&j86|w3t&@5uM+{dnxPl3JbkevP{G#Mb*mvv}}9J3TfV#fET^~q=W>_8>^m( zYyMvPul?e~){Cg#GRtth}@ssdQXR=jtIy z*G=dgyO4Q?xC?KMCk^zQF4>1&u4D|%Y22q7$rES4CGi~t^-tZrxRSrDCy2rR>x_An zFZmwQ=b&Q_IAWwi0Dz35Yz2j%^k+=YJ{Q;s)-mto6ihZ zxXZSr^%od@!S8=3a_(oihV+T3fDX_8+Egu{PyAk)cF1At$yv((UbJ^7f(d+Ik`K_c zl_X0DDKz5I?gD)KE>*DtCr8>?(`_Ijj3(-yDy#l%{ALl4!HfP`L9R~x>SW4r=zJ+} zzI6;>FiBZ1Cxb?@66JF4+*{x_Qk6+MG|5gV^%Zn}BzpKEVU)7X=dfdH|6jRng|2Qm z`iT5uZvd~fqB<$!h|8BwgCcZo@caj(JHPdb4Dl%}w?|Okh~7lrL$q-f(BgBzQ8ggx zcB4$yh?q^;-u<7wZ!OPvjH~|@6h7{DX{{vDiZwO9^}N}}ruCIQ*wJOe@1@LUa&an9 z?5GzIIGlWmWWS*Qmkh6^@(C|^h8W!y`j*)IIHlPG{>>e zcut|?`CbpU+r?op6(OwPRci9-s-88u`cGVT&{LFSCRWbxW7OEiv$V*Q*EXOv`?x`g=6XGbW9~X)0XA*4Q^!XJTTQdFXnRRL}yZnnE zbojpNC`eDiyxDR5K>G3DQJVk(^yCA9E}tOKJqAeyQ=N|83sNus+4j8Y$^$;tB~K~& zUol=0*TVdF4=HzKepPb&_^d4KVW~|p>-&6E6S4v;*__OaZ3OejalE;xTAX0uI9>XJ zZ+twZ@khh$TuFvy-}k!&(uokQObdHI!yWiUE8FaQElM_<+pFzdcX-N3ho3WdTbYpu znMm?FxEl<%-E<}k*>7Ra6=T=sw_p}uSJCULs-f5d43~p=&xI6bx|$SyMdj@UE#dmb z3JEsf>;g@>?y_x2RzB~adTr=Ym_W=!g58YLTnFuc^#uxV9@c@9^EwLL+Z;d;9U9$DS`w+?B!eF)X=}vVFb$sz2TDkf~iBD}cg8j9}&AcBG&mxw*o9Z%>n2 zXf%au(6?wHH)|hsD!x%2TX_lV6|{a+dxT%<8lq>?kO#4`tXY25@7Mw!LMmB!ip{(^ zN+i?>N=>5CKWBj#H1^C`nRN4aR6n&A65J z^R_FN!F|3=Y3hYlD2+Yf9s{cPKr?8TL*ZVgG`{|w|B^lgZ35APM`4_+^ZP|KKDwL& zu77i(*jkL9K@y|`RK|DOWynk%OmrU2Z*`||^Z$~p9(CXj$v3Oz-|cB#QggN8vWJ3> zuSXR>yK<<0(@}kAl~x#kkp8`z5l)=-xDl-*BPIho2n03&9>_=r32+mVj@9n0xfaa> zb-$g-jZmjMBXTWWZ0Y6P<5$vBG;XA5u*kY(GEz|)7hPBXURPx@$WxRQ#Y5c($&%yJ zH|Iwf4M;#qZ`_j)W(QLOc^bF+e_$ER*L@~9Wvpd#tm}pC0b`Y~{q-EPX4UZ>hiyXX z4#xMo@7=NbCG(uQg`^?A0Mae;98n}xBR)rDHn?({ID=)gQWG{p4l-PBa_Kkllc28f zv~^xAk#|)w7^!ET?bu|uxlrpaJdZNle;Y82QTK6-fte<;KFL#>3-7@I#pD8Z`8+TJ z_i9~U_*6S)<;aRo7QSFv_SHpy?774gb(C{cFkeQyUT7ZC!^0^jp2<#1m47yj0=E?g zCse80K-2Wafuo7@w~)=fL?llkS3nPr%c#fG%bWDbLz^9<<5-6U&Zm3B%qB}Sper+^e8tzKaH-u*kmG&6=mk8vx={VChuIW z^*dZ2lWibCdR|SOB&3p+G7)nGvJ>i^66Cjv>pVCOng{#ng?jEQFC^R1tC%kD%=j-^ zCnE6poy)}9(nz2SKk#YtC*hQ1(R;Wf= z2tW(j`zHJy>JduK)Io>$e_A|L?j7i-_?5=s#R$GR236tOJf~?ZcN;NS18VF9OQOe7 z0F5!`#KI=?zwF@x-{fRjqCo1z!AA`BAiF zWMfhYkd)-#>)F5@c}0=8+CkbuVeS0Av)PhE)nd!pWL_rDHfF%S&v;MBZsVUJuQ|Rx ze#UI?67Aj>j~tU)ox7XUZ=Ntdiyf0Px!6RqvM|3Dv=mepEY^KpBCn-)=k+eGKJIU6 zSm9uia9PKBC+;X=vzfEXY!HHqFu)w*0kLmJFpX*4tV!eW(5{dMKpn& znkk8fASoE4GVMBC!4;0){d}(HWL0%dYl z&wk?tBM8L8tjb=NNdG1VE=i&nrXb07Cg(fkfa%w@yyx2xoIPq`&Z0 zSuzFezL36zAv^s)>*~IxH1;#r3fFCNc>5bVMRt)*AZK?-%p(kTcMtPJm~s%sTB!4N z_MU;q0IsT+@84~@;nIiX+%ujEYA>Dc7w*?rng?K(=Wm~0s5-MGz>4C5-k4zvrg^e) z609Jhv5evkH688N4=~0mOjnm=1^8KTU%FcxeE-7B=!e1Y-bycZWqn8vyyJ32mcOX{ z^Dj`D*Kh$=A$O9^0ihvw5gCiyXo2NY@8Sk=0_yLFZGQuZ7t+FQp}LyMBPbM~Z|$q6NXS5+#J_jr18w_qTPRs2~-gp0mlPd+OOQ zicDcr6?^<(W+hGICLYvD0}My9v9d`7ba3S6Dcozoe937D^)M19!Zpu*UF%qDAD!=? z_0Rn{U}RLb`@*H4fos@`H>-4>Fdq@V$iwRv#W)~-#>|mCYI$-ihuzuG2|P@O)uGag z1cw2F-$>kxL!V?apZb0yko-<3HeWw0JDV&)ngFpymm{RXLh5|i^in6R5co^x@n+Kc zUoursL3O*r8Rkm#$j=mo*qKI~C5e}Wep?D?zrQ=Mu15Zk2CPx%pCLH^NsQhFv$%gBWZDLs!hdy)XuuLURtKaEgwNxsx~y~|>|$mpfp)V_+k%-p;esty&KtbM{?y4FSpie5i# z+c|>VM=}IALcamHT6b`YR-5q4v?g~wH{tgt_iJ2$uzRe4aQQ^5DbId>+Sa*6?2dWv z?3i=>p=*`p>1XI)yXT@i2U!Epq|cZm_dPa1Z1F{q`w+!vjB??Ee92k(!=sA~peqwm zEg8e9LHUDidF`grufDb`vVK-Ra4S3d(q-z_=b@85Yh85GRDk5OfTA-4A8i$c`yHix zmV^liryxh6DKfHN3wpv;7h_edd3y5BpPkk&;=^104J|X$Qbp5t+-U!j1@ZT5s;p7R zP$YvRAA*X%&HPJ01d({#^f$R#$!=U))^xmgykCEN^L_1knr>OoSbFf$tqj+;()UN- z?7k)QbLA;e0cuXv6_o;8M~&vFFiRz?g?f%%wbneWeCIRv5T~T@g$sLf-Zb--@yp77 zR&;LSebonF2ZwDH54m>ZU2Z70Od!k9GmD@Nen5pV|1QaeH>B5GzqP;C5j0fyHWg*) zv;1KyAR8K%Qi|Ms3e>pt(`p z`pL797dJGTAi=$wgw=&6B^A74MfJ7U-}vh_XXtlb#N^-!oB!N9Sj2ds(^B!($o=@$ zxDqQ0^gBQORS=ql<^o+5-NNmZ0}VvU%Dy-iLp0ZgD8@ih-&`gfS;(aGIUG+OyE5j|tIvK3EHIi8u8b@-;rQ*D}}(KrGTARp44~5=`3*5Tbk$T11Jj z)#VY;@5Cno`TWFUyN1_0cD+SJ4oDkH+uDDa@gr)~e?-CS#Na~&Mu|Q`%hdAxcw_8p zm+8=YIZfkA>Ra?i<2g+h%b@O~3WIg)W&ZYDt@IamoA z6kqbC3N8?kaOeD_CX&jviXNe@#cw*ZTw6MIE5)~*7-?3O)D`@ESK2tQ#b7Mb{^-?6 zfB|WTriA&A%1ofW5nryss?_^rU8o6Gq=E^K7qgTFv9VT7I>{`*HpvdxyuyN?p~A2( zDbv0e&@=1XUQYgu>MT>T{*IznqaIjopfsojQ=-j=_YD|#ZX`N4{eakxkXPZ*WY#)? zBQ2V)=Tg6o7~}3I@1_@C;E85!GQNq?>Ff9?Jf-QNedJ0x13i+#sdVORM2PppAJWit zN>pu~Hg6z0*izL-Xu`So)KRFJQ{2FPAL2tWF-Mhexl&mdd!{x^FS^gLHIuI@)*{`YL%3onzu_!|a*etu zX!h7up_hMYXvpVwVv4k^fj?J7JzKXW3sY#0o1h9k>S{^jy3KP&arTrDOnQ-;Yy+Z*Y z&t-rjbuQFAMO5y18LL>{grveO%D*J#9a5uSmt<581chLn97X*C`l01j06{q-bSjkQ z5H@6og79WG>Soe%`WL$RZ%?Fm^=q+vLpYvr!1leC=3k&8j<#x4JreF+=CtiLv_eiT zpZuL;;%zg#4Ge_gT-)u4u_4yfpDZ_G>ewKl3?TNk?PU2eUb~*U95Z!DJ8~S!1Pz@D zgVQ`}n>rx)8A5x2Zf$^fL0-H93wtk63{#G;RMjLW7fj3_HK41-JlXxx_3673hBm%+ zh1045>Ljj$*+x(&_gfi527($cO4N3zUTvz{EVkB;7q>VajuG{RgquekJJCb0jO!m~ zW9jv!S@Za(?T6&-_Oh%)^mpt5DKUV~r;Dh+mDwr?DimLXzhrF`z&WV97I+?N!^A#s zSU29Jt{SJxA(Hz)iN-;BQn%m2wE7;vJCo+@d}N$UUFla>cu?)mME5y{k!Ru!MnzQ9=x5tBJwN1}mg+;C}s9cj#o3O<OjWBOflZ`X1 z4ZUStr?#acHokcfBhA|x`4eTJjrVp8*mx#I3t%K-B-{!!&A{+8h_u5*$8WEtWkZvMTHuv!@a)U^~7%jU2#Gj3lm;e2mSEkFJ|IsZN= zC{Mq7o2Gq@n^Ez51z>I(=b#-QH4)Hip*B~A`ATBaUBT2OneqYAw^zIgW0umz)0oMfS+k9H*A0|krr0)I6ZL>S zo+X-#jzD~&IX814)&g@=VAkSp9BjZ+%Pt*QVX# z6MeC)S$VcwSjtH|8EHM_mM1yiZL#iJz69SNOxsAzK%4Q?mv=oeO}=7!{TedW%W^hb z-|gz|;_4~;S^325NZ?JBC(rB$)r7x5pd}{{@1^o7kON1KX0?^lmi$m!AY#rS7v>hb zBd7$C?sD?*_f9Zq%7Xb1@JvAt=LrfFzd&!0f(i=Ph0=IPG$)RiGWc0GgMblv{+CRA z)VogU!7!@dPy9II4i$9CVIg^Q(PSlJ_(*zVIP;#_?c@gV#w4sTDZhvq-*mbBT0(%c-T4pQNC5jaBg3~ zkKEu*g%m!g^7n9GFd#_E5GCu0&BPR`Iee7qKhNwU50sD7C<4Oo&%8EWqL&Q4A_L1H z2he+3A{p>~+LAg!j-v4jP=vb6h~?2SX*#TkSOl$PpNa^JKI8Bl$RA^2`Kpn*!Ih(o z=DChb4qw#?iGPFg z_aC?0stedoitzAq(j&3Ijd+L8ZA7f3w}xJhw|8#Y=woHrr(IQu;71^z5_POz~5{uAj1j$qx% zs)(YW>Y?wcRq=D1W zS5P#F#v`DeqGU1lB2+#8qnYI_ieU(yZK2#e7GR&4)@y%G@i%Ykw^Dz4rkCDc;7H(? z_#4b3NkJ~1tIAIb57(}Eu?&33J<`XOqRgl}0 zwZ;E!MGt?N=kRy&sL%E4nwrcpujV+Jm|+AUt&zV+F}Vd`)u(_QbHUsk@ZaBJl|Rqq zT7mG3YcBR;0W(Me4Jwrf$0;{}!6A>r=z6vYyTB<6vvB78t2&J!WQ*=X`8=~87|@e$ zkoI)fIs&Ytsd*mXKkv(M&Qi~CGjAWHKip_*+}~>uQ1t8}A+Ih>Wvk|ggF0bXWWK}O zC=F-;x_BHc6}BdiifhbkE5%(;T2pOq=SmD-7c_h@mL{1#gmjr5(#cX*(i&n`7Fq&0hLWO{4m{c`{Ut{&Im5F z7^aDzUb^Ro8_LU(x5q0yUv2GQjYSWjM@p$m7V2VE$$n{B{VvH~5Isg2a}pV3)lxwS z^PVKsC(rdQtMC4D;@EK2OUw;};A!=6H>bkX~BNsHuqGnBi07CXTMi zVCmSEXv;{EP^ka~t7(fa3Q;p%!p;jI8sr`p6wk$wtP8x)QoIOo4?WziYKHqJoKyb& zV`#Ka%J=r4*2Zsim$@+F&`xn5CLd#0%y$vSKjI@T7HfCBwPIygWw5{$n63@M%J4W@0f&;Kyru2Z)- z{A^%v+M{E$1Bu9V{TsvPE{b7>^&Dv;(+^Zr3`^sJDJ&Y-D~7KhQs>*_7^$)0hfCyl ztlFoCL4j9{S338kh_)8F&JQ-5i3A^X7iK%XZf9{Ic zG>5?KJmYrH=fpc~S14t`L9n5MnC{wC5q;m(A>y^c;#h87-8|diO}HaqCEUFeaTHLp z8-$#DOwVM8x) zMa>(J2K`|mjV}HXkh;?j_u;ze-$hJ)FX2zfbpbRhJ)&9DGPcM= z(DD|Jqj*d6Q$34_RnRMOp>q%ekmV+$LgFW4%ESsGUZCCL`U^i6mt_FS)$w`LQbz*rwMw zcayxt0*^v!1ty5_>ZsXZk&~^vfs2>L9`KYVX&HGHrSZ2@kS?~K^gzJx0KbZI*9<@~ z^=sYnd{rxDvDcTycE71gj#pJOzdY<#w=|DEZuKYj?%*g;f*^M*_9kkdp@93M2y3_! z+gqty;eEt>?r`dAYP0-wqE%n55jvh!<~K)Y<24SnVG~ZqvwRjNH0K-`3K1r?j1QHM zs1<05Y6@b|jOUdEBPG^?*vRMUT!s8tPOGUIWzz!R3|Cj(%h&2PSt~*1dbl>3ma0&_ zf|S|}*pv1VrqkiXk1tQiM63{+!E3t&ORXSwi=*6NB8c6yO~>mYykL|oiZjj0bMc*b zc`x_`iyeAssO&0hua_->CcS!LH$+`0^c`%UK0a+h%Ll<@@)v@QG>OUG(|7qbM9H1f z+$~;z-c52)aDos6@l?*o6x@}t20HwH>* zb%SuOl~O+U)(v})tRVfT*Z|qQoL0b_s6~f_2QLS!wanc1eEtO&_q=DJy#^mQR+Z89 z!i!iu`egKHJry8-LBJ$cLFS-_<>GIDhffuBP*}(bX23ki_tiIW6Vc67%6mfDoR~6L zKf@+5%`%5w@2F5pIV}g_9TM^*Sj9%<97#U>Gd=4}biREaRCu)S`salXdA`%_0e0@) zu$z;^Bt2A0F%JmH76#~$vVIQO{ zx|G7*ZjWzcdHlsIb{3x;);Kl?ZyH*|)mTK8`Yi4HVAU0JMN|_h>L0%TFojHoK%BQ) z5qdB9?gsIB8Y{V$c{v~#7Fc7z_OZo~Fh z0%i^q6qxt@$&I z3@d7oPmx_Eh|_xR8~OZM`?~(Lpd#lIMs^%A13b7@`5@!#2#TL&;9YQc*`$NSUXWEN zly_tHko6&1`+*sg1O#&0`EYjn`On(531Xvj5tU}XmACH_u8-sGR8EARkdnKZcuLZ+ zskDgXBXHw}HsbinD@Z1N!2|^HQH#=azbKvmYD#o#`EEkKkH1oJMWt#W2P=1KS!1QB@;k_+&F@Kl1U!qHUk^{rrxhZNOaW9*bE>w2EgMbixtA9T5liv zA_tenEFWam9#Jw~T7oz*tm`WStZFRtwQLeB2epkb60Fujw8r{vQQVSLp1+byw|}j= zMqX;f72eSK(|v@i-NnY!(_84YUGC-|=sq#ec!$g`JuPT{g!xRwi`MoAQ`x>)*4%}G zTJ(7C&=7BE(nB@MPI#+8ql2DSI$1qlL%6AQq1!<5|6=b=pqk3ov|$t#5itq^$`l0z z6#*wenW7>fBF3SZg@{NoL`YdoL53*GAP7+qP!OUbpfZFZfHFm95doPY2q8gc0tsL^ zlH~YptGfHIzJ0s<_J8l{?|y65axuA9l5_Ui`yHP5d7sxrr!*2BVHIR(WbUn+)br&H z%6)!Nm`h@lnuai3U$9{|(t^+R@-;?Y27Bb8bMfg~8)@O)-rg+VD!u0FrqE@XK63W( zlXiu?7h)3IHIF}BI{_m=Mdn0s0Pk$@MRqa>K|rt;LGos|N5M!4$@ChoVk-P>sLn&3 zp5C1s-0y76wW9_X4GnH%@Xq}pj2HLDa+2#nM-qZDPt&rd^uarA z@q{yF9HZ>Z&opp;kMc4c1{hY+LP|*^`cF64uYPa`U2e2PkcPU9izaL^+61@JMd3X^ z$^gJdZybAFqw~No6CdiO#xp)$%mztb1dBCy!RstfMw!*>v+Luv!s;4{!K^chlgKg@ z3uu;Y1gYlw64C%)-4#4g-9ZvBfQh(EWr(x$%KC$Eam{){8(tFXKTNbQ?wf_%40u7< z=HLdN(SXr0K?!xF&<0aPZZJfF`qaq$hN*N_TqFn2h1;39dPC&93Ma0|)8dZYtI8Lm zc^3k`G?V;oi0HC`?LoC_#>W&v6@pNsMj_B{G&S_;rmJ>RDcaQNa-Mc*_;%Wr8J}mk+gD+nQU8A|u!+rPg z5uDY$roJ15uwZ2@!)wDhmWseYcn4blVEev;(CG#J$KIOx*yS#{^4_@U)Ks zNhgM!Q#wakek+C?9@9UA?K09A6}o5YMo3nMW~95fowmYhaU?oSdxyDCNXYevC50s? z`eYLBq}Z}XA3P5WJaJ+K`4ClL!`~89Lob+!ToBQCEhy6a9qHmsNrpH0e%l?5CZ^oVdpg_=0Keo>HJ%-Y18F#_firY+G0J# z^Xgg!vDtKcjJe9Pzl6n3_q>zwreZ=N1O~ldj+s_ghuFfG0E}LZy~}mF7^!Qp>ZDRv z-J(6cf0px@6WbH}W&TyW)I_SL#?JKJ8U_#7nZ{l5zs&`CWtay*_)4wF4TD~84L`8c z;$ZcWstuoX60on0v*{4hw!5T4KQ#tR*P+2QZ0cnEc%yrwN|=nX+I%tcJ+f4*shvh* z1~ly^{EQ4s!gzP&S8MBr`Qh{Vt^o|u?9xcalF{z6lHzV(LnTYo#({jX&#ikuTm0HJ z81w7A>kT#y4+?zLk!L`Dh2V+~Q&bkbq`ST0CH-j7`i!? z+#l9?l}(#kQHXn-Jw=p7XWOF#a+~GRhHom8g@nHnxZ4B~ON9OzSR&0@3=z5F^o&U? zX!sE+tg(lbPcQg>7c!_{s7=;g4v^W`cTglA+k4B!wtoK!I5-)(;~!B{>W7TMLBGwB zX~IMdBfE_x_`02yHlyNh%=}Dt8jFJ1)<2ytubWgZHB4Ri$|J8%)FDlqwX+OMTCyd3 z-ENEV&~7asM1vsb9}!)-(?_nr9e2#L%vE}IIfLfc+Si-cKg2h2B?UzU4-&vuN)dJLMj%=T zvEWgTPlLT?;>)RDA#&>~J;!V}lAj?cR2l=81f@Gv5pL6Ut#l+0MqhYio2 z#0E9zY7B)}x0EirNr&Fz?c`q*Q7}kNl8L9;eXXw>F3yRw-`e<_(c3!WHBOXyP5Hh!N|w6tKy^PLe1g zLtWFWYY&%}cWK~)b+e#fZ5c^uLzQILTW`#rcD(MqbD+So{aX$1B3w%-J(~gea@U|t z-U7<}+vOYBaJvo1JLi>q(happgAgnez0G}j#V>96 znTkD3T>Io)f8hT9_O*i!o-$KwIniqlneBXYY!d|~-TL+}5@RF^cQfJHasQg`B9srqgx1+mOxB9pWk{_WH)aG~DeE1fG zVItN5(`t$G0LB1r#jJ-7+)=B%B&`HbHTg$fMif?$Hgu@mqh+P~53kZ-&Dzdl#tbZIyf+k?G?VLj+y0FiyS#$t zItOcc*_~cr$9lE2c{%#mJ+9EMk`J2h%c=-mb1rao;AzuU?NcPSv85skvenC#Z3j28 zW*YoqHHr)`26-3chhPcFV54@p-hlaZm>=YjNEW0c$Uz0v65@nMa&?tQ@Tyx-6NHb_!76OcX za8SZb_*(!QL!{Ay3JQRnSKZaxLv*9uU@c~>TV1(pRW8j}){x?n=|I;ZUEgOPl3D)Q zB4q7{p*9t_Sg#cQQz2oCTzA2%%I!=;3npTg!;!14R^*7p88y7bk7-jyhq1EO8TkXY zgJ2`kWc@1bS+Q-T2?zU{jin32P7Py&?_9RDav$ec1ODtyqhlZj-V51*NEd`vnW2=#)^lE;0+PW{u~=myT9<4|g~C9K4kI!eUG=Xm|8! zO~AZ+ig=HN{Ii>I&=~>)1Q+2$--VW8M0;Y5YLU9%~wGI77oFEfm%!e zDODHsiyW7(E|6gb8F_-ZW}uII3S#jL`4>5|;Krq?6nN`&_1-?di!GJ%R@nMWa;u{@DjFkbIrz-s_46P9*SptwaZi5r9C<*+2P@VOWLz#!?&1Px2ao~ zh=Y-JBnql-H-!wD`hk2K@79zP5O~;Tk>GY#%fQg^i4qO}f~QhupL+jq$A%HFESpT9=>KD zWHDjt?6+9@a;0%j8k#!*6m2-QZCH#%gGl~s$al*-3zol0-7+hRL(qP(@( zKGw{}IZz2hKbCqrX8lr(sfVVRgEOmvJSo_^iY?OEJ}}RXW6Rt!QgZ@U3FXI9uY-4R zN)unUWV^4-O;TbHHKg2$N&A&%RaV6_3U1CP=UP7GE-%N((h= zLj5xJR5qF(UQDP(GGZ?>1oL%6N{&S!5B8UwYR?)h9mtaS9Fne-EpbNCl6v^@uAG^b z-NNq-jsoC$3)oH5 z%Iiz?Flx@G6c)U#NZS1+=}N4RcoXaE)>V-3$b3JV+bnooeF$!%i)a5(S`?ETnW#lc zVePHcG8-7XihHh6G8m5jedcd_{oFNQL||qo&)m5BtFeo-!pG#jiy}{&Flhb`aPa;4 zS0SG~z9^eZz;ZlBFki}_{n{$<11o8Z-%`0F$&83 zW#m|Ltv3f?a>p@b)IT5#00p%=EkK%)YOkRW_%KlXU8rlo3SePSUOdf1BnwKoh>f0# za=dh(kYvIj+_juFIQH$*+@j1pcrFXKN3v&IndJT;?&UX-A@2;dGCwL(LlD7-@OM6k zJlo%qUwH<|uKoB5>xIjy$;x`BQ>c;oD7x9{L+uCYo1ZNM*UYx4D2U8T@l^T#&=xkj zmc)JpQLQ5D`{2FR9GO@Zj#5wspo`M8su&eV4+k>hXmWDmzdC%IT^bm5cuBd-n)S9Hwmm6b4O7`?>G!JjNlbJ- zktV}z$Oeo9eCK?PjI3dA0;A)_q^vw)(^ttn_fO(S=kw<^pNCjm-2E!7nYAl@d*vg= zt}CZNQ`1vK6v_=b5IL$=hapz$2{Mfgf=^O7)Tqh;1~BaI2SJfz8-N;hP@6tackL*? zn?LVu@G2tvZSVLv^Ss`NncWem^6~&JynrzBm;eq-(l^(6++mqnl}ox- z)E(NcL}6cZqoFV_pZ^=BnF_ee80Fu%%fW6gc;~_yB4R2Lu1*A>cY#o|_J_7mDY3~b zfSU|jIkti@-C`6cAxP#~T!4pq_wnZo2OF@6IWOF^aR0iE9t);#2NRN1?jy!UU}a!p zavZ-4wE*a;vV?yFT)oMUXdQ&e0sO6_+_-LnJDH|_eo-~SuR7tyV6m9E(z^qDysq7O zvU_?iG!VJ3J^?cgOxEVNgqjVg$q2$&D-#LZfg<-`{Ld$mZ-H1 z9#g;W=msfl)FmL9h+Hy8EsS#j{I+if9C5A#&?8#|H_%u6Y7Jy?-9G_W%0@?2_Xtw6 z1h1Kk%{2U6#uH1s&bX&c}p==`#yWT;+EDq2)-TK<^}q(}8*QoAlCm zp=K&XfUA^N1i%ns{+=;$e|)WtIRp7^n-^GT!is3V_g_$)g@RlOHw_8Y2Jl^o@cq+2 zDXaN!)maj50>M8fEL{qm&sF$Qt}myjVJPeFD3I@+4wdUxEAWk*R(G_fS=c#AKTt7A zyl~=NrT4Rf(*?{oh&VzKvW84UHDK8H`Ho@p7bvMUPJ7sE#~&p;((qow$yBG)!rphR zePeeDn1mP6?jO{fd!i49{1$k6P}%0F$Z}$MumfX0mLv^ye$Q8MP<0NVkin&qqWv89 zcvFa*re8`!G>y#gyvpQ0SB+sNydqce%Dz`&LCV?&l!6^b=v#tO>|Mkk{MlBUCcW_N z)bW`cpZ)jKhXUgdkyBE=HN5uzqDbu@Q4@&l-X)qeZVMD)F?5! z(u#vR)f=pyi!R|a8S(7F8wX|l{2X0vw0Y29yluB4L zpNGvN_qT3IA8B0%Va76!xtpdCVM1@|p0Jgg>5BWBmeB&EDIi=*=EB0Wh+wQa16P2RD{- z7fgO%0G2vW5f}`LSsZ^0C&-x76kQFZS%HV(KGd_WV(6#-^mtbL(Wu3sT#ln@FArT_ zn#N*f4I1WD`V5+=oV}MFfO;AFjujA z%%b`H)1VfQ;749p-df02*lIbKM618aj`|QE2xox&xDyH@^MP6!PajWWip1iA!Th>< zne@GdVR9`RdNZ{tt>eY0D5Jg%rzx&=pT|DE+!jC4suZ^JaoLfkaTQVq*dy;0f4?V? zz=W;=l^|jhIhwH90Edd97Sm9hKTlhipUugz%(x^rq%(TPQM&zXVaeO#>hu1|N*&oL zCb61M_?;2kRuBV`T$S70U!WEa0@#))z>V%>Mn=QC?A`rk!|5>-T`Bq&7(`4VRy?*E z0Et{~hh*TP_jeWh67M~dFaQ`A4w(3d$dUlQ1e!6=Lcio+*c|KtC9-EuLIWPopmkiV z);{l{eJC05X=$Pyf^(4ei{gQXwQ2oDNyF+Dc;z_X``$yd|8hHj?<4vq3~$R}xbbz+ zd>s-uB1b?LByv%ZS!F+gp$PX3atW;YqCkBB&4B|2=wx;PiqZY}L(bZ?DY+pSB)Y(r zs~btrFNvuTE?ey$U) zAs|3&vm5c(KtlE(9?;)&M@xvigu*!@#{pp1v3#phq7*9PqE)9KkGeJ_tJiVEjLoO4 zu<_b?-`*lmoobVY%ohO5D6B3mPO{Z)SrZXNrG)&5dx4zie5B%D$Y!L1z7gM4zZ|Mr zQO*&G@{5`$3*S{L>GgA{I??+cmvnK=*5R|6>!xj5iK|(s`nHhYDeeL%$DD82SH07W zJVgNBz`a@=$TyIr<=*+<$V-6y_$FRKikUl5?ggpmc;anOV}rDBR!KjfHci>h{3ZOi zc=M*gDzNL}4p^Fhv6t^W0)W-chucM<+YL5Ghb!6gHxgfcqL$46>`;*u;a{xRP*u_Z zVFzZPc4rhP*{Pa^=VhmeOd5#;1xhJMhLenel1B)NP&X9d$XWM_SN1TZ@JW4 zCpYtG>oKi+7h5zMnhR1E9FGF|Gp7F4$Ikd_U{8#MfG&q5nelTWfFpMal7o*j$x?U> zyfuKkFS;j#M4VMJ=eRoXqW2SS-Pq?t2YnBf)+ai(V%nt>U*{p!m^PwBEG8+)sI``B+56OprGQdRZm{zUEoIa)g`4T-=~k+=2*OR1K; zhT?-TIu@}u4sUr@g0a^6*u!0?Yc8nJ)r6bul9Fh4%fjrLf>%}Gh=hjw_bl5(bhYxdbvxls=nA#t>FAI) zDqbxh9RhkoT>79=>gL#95S!y11J_rmINqOsz@6v{&BDfj|nyE1|~p1M^f;- z@;Fb2Z}OvoT9WU`&Lz=|5TE>le)Jrt%q3>0Vi8BCrHd`xxbL5p6i|5zLl14N3zaTi zUFQPUf~EYsf8m`z&QY(skz9|Eg)C}G+q_hPijyLHXe==^KPN~vO**NJ?4$9JcJE+j zUfzqJhsECKx;eO7#CT++O#P0v-869i?a+Ru#tk2UhDNl0xEE28deSVH6B$`)_{zR1 z6D#S#Wxl_perez{#-r?z?F*fROH(rbl8;8hdphyG&XbCIzXdYKATQ25!@KyUXCVNb zDCj{HLnVH@vt3^3&@(&e2D%_AJjuY`wn6Dzi;kL`%R?n?ARF_KaJQg}nZeVWRt9AM zRGvRHSd$#OswY&1=3%WfEZ>XU(Osgy{qSUX3HO;wQnF2w&V}hh2af_vth2!b^K}WX z1`8#16lv;j{ubyo^Cfv^f~WAFAwHIk12F_r)Bv3WS)i}? zJJurufBfsZu3nvo+I6SbW$v|5DL&Y3c{eWuzCpi6hf6KU-y7gW1BjVt3he zRzkf1qd92XJTZ7__Mow0dXC%6sRdVNY`lL7?~K0P&XgnLZ_Gn6-PDm34C05u69ok- z7wFa~Caf=XGutY%?tKQkWGs=DHy`O6pp`W^L<7?RN-E>~Wu7<;t?!-GsQ<7~UM=!F z*w;XZRDm}k-K&-do4~*%7yr5)mY{Ed(6!Iuc852PHkRPdlvb86bbM8JG&SBe)txtw zv#h)HxgC|Na$vg@HE2Bj9}&2~zd_PMoa9*sx8@*%BLBJhaHjx}14pvM3GS$f0L;cpFca5B za%gHLE$!>==Z?0XH%vb3u7rFs^0W}M@Cd|-*Q#(V*2Hczf1ad@AMD=^@K=-@xqsOV z66K&9sPcX&d3;XO@P1BPVupuoV>T0;YG?4?cYBGb*GB1H>r(%uM~y0${ry;-R!Ph7SWt_%vhKBVA4U|m+`j*!kh+0sU z(rGu#3~QUUv%pCWRc>k0JEiL_!2A)M7bAfdx8DLE06z-D(x`;-I?#%PflLUDEeoaJ z^x;+ki8qwWZ>R8w-I95)LB=2tY^WYAji)lC6WP?09GmD$jhA>Fm}SDzIu4{~L&U4e znKR|RnJ+zcO*Oa+_Lg2s)5%GeUIAX$w^Euz z7`!shU?WPda_x`g?bZ$`L6APYpS>JeqHepCcg4%-vz=HtHdQ}{r8AD*8qtYOQ<|&w zk>6Zij+Xss^n0;_(>H6yE@q0<;fMq=zcgd37_{JdD8Pb6RqnTJXvK0_8`|qSL+()a z6*4;;_sF!_73%BDKifh+&hFw~xy`_^5FD{ldSs;sQ#8+Lmt)PV=}_r6jz=l(B}euh z797Cs@GEpQan&imw%a9W;`Tn)*t)$oKaT0RD2Ty!OLE^3Xfww-*-?jcDnQOYH7wV| z*Y_^>nWW|ACunABr?yY@w}i+SSiHV;M5pY&`u#8yzqJkkosJ-|Ewv)4;szeC`j6ubOxIe8U5?h+qW+3v}awq^x1>x z=iOVzoyi{F{_&7D1;>p7^6o@{@X=+0acp#xY&Oe|sTHLt3bdX%uP1(pL^W5MWYM8M zvmh^{zEij6vkE9)8wIa>#a^bKi5s3r-#%MzflkZ#5c*vR_*o%*3sX43>B4EMYqxhW&r7$ZkW$Fg4)anpDGo_yX(&4A9%@%51X6CS z-754)201Ei@lSm)syou1( zf54a2AKLb@srd=DsD=H5zyN<2T9Q1bIDi>JVCFgC`!VGAj{i--Ye9?{>m)^i7&7l1 zDuUjW99??()plNC%QaGK{8bCr`_-erw%`nMww=8aZ6>n5UviXM+k#$CjjMFXwa4Sm zI9h{zOL9hL^FRg=Ts%a3|GJHLcD(GtC%5az<5#^GQly%=P3e^;lBcX`bKyQxtk_v| z!>amCD$%wtRz2wGPIPtMk+b@^h|*g?HRGRPBkuV*qEE2n-eymi(NwBUGjMJ`@(VPJ zB*z4$1MY*r9-)oMzfy=5^51In2#*^Ls3B~dvQMvIAY~@Y^WyHxkY0Yaqt_T%KX6VB zZi}j2V0QGn-2MY^ z_HH93R*AcNf(#zyn}ic(oU>I-$GuHwDk(B-r%O)8@)ES9yK9=2k61@h*!k?!<3DY0 z(LAQVqF%49MbjOrP8^-z6s%XtkxnlgR__|T&`D?gvOZtwpz+pKqW2G#bXlhU5?y;< z{t-$OQTAz-$<}j!?MtMAF0JXsqI#ktbafBzyB^bOysv)my{SG&^JQ{Ap#6SAO{~yi zm<;s+>V)jG=uyxG?jb*|U z0^g{<}{=75S3CabsWz!+yGH6o7@oFab~q=BI%aACi5461gbAeHS9w@UfA9 z_yFP`KUnz9j~MJ2xat`KZ-qK)##hl3;e#1a--YNs;7%E!i|F4zB;((G`k(jr=kxn> zfBt#?{ZDXB6my!Y!>x1V)YDlQ>d87uslcgfd_;4R`aXIu_>K{`wBd! zUJkbhD7-FLQVvN|wY_U1ny7#9joJhv60|?SJBLGC$_T}A*&|-4I@$c>5y8b;HdfpR zx2vS5ff?xJS6F8DC6mTwx`1^~t_&?o~L<75cB?5OvK zrP*^O*_O{uatDTJb}i4-yzA*vCwr~CU;TqM_8YetFe zKwdkKIryX3sB9K!5#6SNLCPQ#jS1aY4H2FWX~Y3kIpjv8qvD6DkEaXTZxnA+y8oE5 zN}*12@Abv}Ur>w@Q~{2^cOG&=vMYjx0pe%FC39u?DoA#`2YrA*OGnd;nz&R{GY_4> zqpJ}fkMRfn7mpz?bzl++1S?$m==;y!(QbCo9hy#?OobN(bi-KY7EkPj_D@N|0VEAWnNEaa-lca#h9_uVI z#5z{8yHk$A&4r!MBwO}zrf+~=z>17b?@M3llQeE^I4vTyG9C?)xK{F$!106J`%ZyhI1R&zfi>=GyA3f!;|2d`-rTU zZ~c(OD1h&7Wy8EQ~B zMkI*sE5i8=$gR7!XWdQ1xoG|eK{j=Sj48m)HuDs*q%sk{n!QcE)>`+Jyix!XZMDwM z_Uw~M$!sx!Bfa2c`Gc35Hj+G(kVj6HzF%PNtrY0yhSKPT>N zH!5VYlxAETx;^=97cOtsPq2O8KFd3L;f*9`F4paqOFW9wIC(GqC+}yaq5YtY)7*X= z5I<50rRi^Z(!rse_~3&j9n}Z3S=u4Ikw(*ND3!5~&L#%`3MB@NA|x~fU$Yw( z^xA(4vpwA5vX}C>qN=3)ZOYX|&G?Qr$?>zBTLcdPf24`dmr~>E0Q$rm(BCLR^=QAD zg1O@-u&UkxwSC~#CZ!_?YdwZHbT7#XzeqJNiHWrw;T-bpsJq&%f7gJdw=E+oRojZ( zhZ;a|bpT}z2*n6^PVfLm!ax~|ea<&2VQUb>_$TH)40{^#Ntx^Y++F(TeQ-#cbLrv* ztJt62GcL<36$l;xs$v4Ee-IXR;JE~^HRxQW6^4gZ!KW{IZ8_+xiMWzuBDHKl{Zlk9w6bl8=%x5`!$b;!rW$g^7&g zYcLQJ{L^ei^b%&H9hB@?@Cj@st*ovWx2}X)o(RIXsk{kyjJZSncwy}LI;y4nQ^dGK zEk?$`hI0`Xb>pEzn^6VeZG-{CFFIYQvszx42*zZz2GoTraik(*7+sgkpR62oLi=Q- zoo<^uB0J1nO8sd^C2m6Sq^}04h#Gl>VP7D`0WoR9$Ws)@7|OQlgAEC_ufVQD!IF;X z+WXiPGGD1rRPc;Tn$>^UnFqJahRz6V9&bid58Qx%6w7On(C+!!G(Q*K&!P1sMWgL} z{Z614P7b>P#)&=(7SC#V;j!GRJ$Fx~^XvnU*Pm@|QC#d4$$eq;jd@t6rXb1%0-Z#h3GH@eK1Z08oSC+eyYOw+d<;n9%3Fz?G9 zunG_YYW53wiNC?^@b>n~JG^RBjLY_}yu1vLl-bXYC8bRfTBL7OB}z*z26Nc zp7f@;)wbVNl!b1whi5P$`yh-B`#Ds6!pj~}&??`XQq?*isX0r|OH8*j`I78ES6aKf zJ@wbiKX$8;8aOjP&_!+v(AcvZF;wQZb@_^`Gbz1gGQ)dr*ZtD4HeuRk`QYc)!!h1# z-&Q?oneaq-8{E}$3W$0%V9vYp|A3qPS6BYSUH+!Bu83Ni+6*kGNob_a1aa2vyAYtV z{O&MkmVpFO$bV8H`)gIR|MLGF)$S0!ID;bAt?xpUs&C7u3;-!h8L&n{!^QE#t5}J! z&{x1;k%EPmR(avZs(;-nf9+>J0d)B!Vc1$zj%$5Z z=J`e7sS-{LO-zE|N`0}3t2D|DWkbltDH-%Kc1e$FK)qrB@*oucNBav<-gg(Cq3!;c zmZZP;=fB%W+O2(mY=?P@xJG7+ke4Cw{VC#m&p+v|`k%#N&Y9r2-XRbdwV&CofV|8M zG(#V<|4$SAe<;)A?`4YoSFg80<%8BSEl6f5KkTg_0JbB%qh<>EECIrZ)VI;U7+nvd zd(J-xg!j)ny8eIHRINUm8Mi*gyCM) zChV3Ye-v{Ome=+HgjZ^8zJW0NwmnBY$18rg*X&}~{Y~l@Yh?{5A}iH0CuKn!h3A_> zO4zU+_jMpqVyzqP*-zfeM}$`OZxBjpYpVBH9c%1R9*<$V_a5mcx$gcF`g5*;Xsw_f zGyGj>v4tuqBDeZ{;h&90$w4&jZcRTa$>(Pc>PyX!+CINnyGBGrSmjH+xoR~@kftrL zH}@m08E)UzlmD=^m{ytVI2t$6x=y1h{^gYqU*d&bo`UXYNv@#-9JWk-g5i4-3#W%l zf&hynlnV6(vv?*mE0kX+hu0USTR3=Gd1sg7A7wNvkRPtmkKB2wC8=gjxbm|d{2CrP z;=K7NZcSr(NN;*pz$uZWz;?|iSuUWGtMM$ulrwCXZ$7ASiTClcR|5xWO z+p2k>I|CSVgL}KkAC3R}d%B4_ZPb)Q_~f*_2=d<8^Wefu$v05*eSpG2PNTY660GAL z-D-4;oBgnv8o6Aux(t5w?c(v6>t9}PD|)MPvwukc0$TDM0X2r=EKJI^B0Kqv zR&D1SzjR+Y?6XZa(0lcpFY7j+`su-E;kMnvS&Ny5+B_0(4hid8yWBqiIQYGGYEgFi zqf_67I{eu5T7&|Y*83_aSQNVDDi2yNQZqKEt!u%?n6+qhlAmV}pQj5~g@lj98XkVE z9jl}3b_(|)jQ;h5GUSsE-u=INHvCu+KqiB@cAL=#Flq?G@laTv|o-So?$=652Kx<4MvUt2ve4q|`k5Na#fKW>QIPEy2U)ewn;Z0cQU z7~GfKVax10Tk+V*&h4Sp`(siv!v3GH%DYYCAhn5lQZ!W&Y(v*j!isZFAZB_G$%v7itHvF!uv>bG2e9 z4MV{-XszSRL3^^XN=?kryio-UQ%?8?`$2s(HwM?OO7Y^!E3xU@m3D?{eOzxp%NOJM z;UnLr3{BkR%P|~-n#$XwLzVGl#!{QjNh?=`hxzwM!l>+k~pHF+Sc#=>hzMFUC-YVkP z$4xCxX$-{Rho%OfVCg8llP#6;%T!9+i<^!)a;siAh=q|3yB9t7p-6OuPyf1GcpgzW zO<&qp#RnPE=ucqF{?YEdA40(!F4H9k8wneBeq!+r^UW9vZg!pXzE%ER_6skH!rz<2 z%@4y|8`;mk$orAc5@<0^C{ff%k{*V2{MCUz19OpZ%1nYrFQ%=s^1z8Ai?TI07ep=} zxQ|fI6AF$0{e)EgenK*4Z`#C?kA+4c_FE(8;;m93NGO7zdNGf0t%*boj?Sf4&p*qVyIs5DnVuSZVNVO zm0AZiF}%zy%Q;QqIMogVEA81sr5PdF_S;G3o)QQ}UlgSh)Y}D2x$` zo0#>dB=X?n3)?y4Cpi@+Dqi=(E}V3IKQgL4yY#y$yDjstmc1^k zFo+HZ27rRY9}Lo8S?+%`W&d|=1>ZzZ>A3gK%A==_$;~z88_#qOQtpeo^yD zz9_cZT6DY6lbeA%%WW)8ge)`g`O^xfhGO;lCyQR~|M*0u;s!g=TK;-M(}}>QXEsfA zicaP$D5z#7AcitXDvnjRDU5gBAlDklL>J9AuOX&f9=L#Lxi@k@G`B;GKso#dr}r%i zVZ^+t{kMXy>ZCrxSTbL1#pd`W7`VHA)DcYQ&7&(na)cl8-oKj^wu#*S=cKURza^SK zlFh&T`X8dZe`i*)ibH1g5=Ip&&Elvo$=STD>M$}1B}{;om19jnw?d-T&icBu20fJRFYCOTL0{b=#h8t z6wBBXjJ5>!gn8134|bY!`Ck_E^Rt>BAAa<1D zv4xB0CSAIDYOwq2=(ML6WHY=P1Qm)TAQ%XuHqPNyUr1Z3<)=_vD35Z%r z*P2^T?%n=c_LujDVqoxM@XZ?pSQvmR^`F*h2RD%6HXrjGbkInwhi{HUvWHV|5T?XT z?rlrpNsBEeYH8WOta)CgRbo5k7Xt9`oHIj4L@|A+S_{KcI< zMYN;uB8B-u0rLNmgDXv%FN{qHeTREM%woWQYNPPwrB^vSrZB`>j069r}wUL;i>55*{@)$pky~veJd01U00{5&hbyY&d4*G zF^yYkKOZNSleTv*;0<=q(2iBl>{PC#o+!V){N@4*{oig4l>8=WHB@%!B44?Ealvo9tVPs|2bUKHw!M`%eX%Jrf%Kg4GkKum9kr;b?v>Ft zzCk&)vg=Fr+itPx3%QHmlFw|9_T~b*6vv zE9^ncl%iUnf!)SmTUUjX{h)aDJC}ECbT&D5o8P?TW~}%xh2f*&dr#n*8CR?@_C^>zJc>Iat((ZB}DneG80I z#!1asr^`@!C@fucH;x(KDW>uB5Gy;}YKN(nsIt^mKd=7JwtH`_ME(uC{#(ol3Q|?8 zA+2^C95Q1Pw|ZV_Io54($U}kEQ{05h_T25_8+)Ng=<3GP2b$I9=Y&>$)l38(ultJx zPgn%kDksqr!Ul(_JsAg`-W;;P$%bEOmwhU+aoxt~H<#BpgsA^5mryY>52=aNI*Qp) zx+`%^!d7TlLD{mR(>KU6=$vFtmi=(8*VyLuqfwCuB)9piydIT*{ebvCz3dggzvWWM z>@HX|hmB$67e1dRu^-?woMP(qT!)jN+j}lgUH8h$TQZfq>($|WtmxF8uOBw@UkjZp z&xS?m?3}Y~QrHr5Ek2<>UB0_gEW7>1)Jkt^z{VSQl58}cPPu6apP05CyDpJva63gH z`5#P~*KFZNEKr1ltK=ZD#loNIXcU6{z0RkZ6 z_Rnc7|4D85-*#EZy`jDIg%bebnBAEH992PVNr>CXXW+WDJxJfisUNB_0&=ASLqTgq zGlP)jVV%^~^wNFsYV;bL?cH9tYJ?Pz?^x`tCb8X{A~g=8#!|iu?G>8d{WsS6|GSWL z@izhiC=s3o^WlAMCjCP3a6MrG2LrcAK2=TiJtxxF{SWAA`_UKoKj>@wYeG&~gFpsB zV#dBPIT!DhSDz%dUn$_~xM}Red&(1Xn~qDtrwME^06S3TOkMpD1NL{&2Lf}{jfI3??X^9OoB}_W(l$Y%c%yj6amC? z$~HhUKoP}7#S#|j;BP7jE*`w(AseaR=E1LY5VgGTncaF$geV}6V))D8?|BeeeDO4D z;*jAW@ar=8>;>(hwOjwZnm^a(Kkl0et$KAr)D-V0{z05%izk=4cW(Q0*~Vv_9L>gdQ|BWM>p?c z=BlFW(EL-pe#p!4Z2xvZ84x}Td{sCRI&N?rknhZ3X&Ww)uR?MqwZM%$Td=ug3vE6PN9M1{XI2mxj(vNU6S;NG{`Q@B z^G&K}cRJ3!SmH^ullVjK06?^N!RYQO8;HL#=(=J{!UtvY*A;dRkx+v(bI zxe$$K4^JtTZhvICCH=@)(%6=FMz;hN`%!L~Enh%o=LxU{3ff%P(8KU&`+Zo(Z*)>Mr8s9*9?;@(aMIu~~1kzh|wg^`n(j7q$ z1TeK~6fQQ+y z-&4bDhh+J#*&Rq~x6Pt4kn!LNz$JO6wu8}&7%6xU+|^6kmMO^6&<-MOhOW$*f65&V zJ9XHi)p?@R!91Eaebm<>N2Rl5%P-5<4a!uC>|4g3f}Z0r7kGfcK2M~n*At5SSYjN> zdcFMO5v_alK`iq~iMxTM2gCN~l*Yvi#bxXY5BvJzow|D0dM#bFOP?nvw0LW}y|FO& z8aOAs5<&(USa>137?vjSceg|4K>XH{T0|`aDownrKa_->0tVm#t|c5WP&q#oIA}mU zG&WQb4da8gc&5SL&;xK&KXWEn;T+{rawM!WL)dDx7T?#j1u}J%G)*|unV*+SGoy5Q zb)Q<6)-(Pbd&nx%3hwgA-u#Vt?MwlBQr3Vj2O9NJL{tgjySi}9>SeQU@xkoc_KTdd za4n6)&e@;wPC%kTl;lR-IIuwZ}W(Y3wHI+4RI$k~A0v zoD!Fi0YzS<6jb!h(dy2GF|S5j4890+$ck8dWn)ncUiH!Q)wR3RI3?SN_fbH7oPS1; z6)KLOU?wi#)m(~IZyesy=ghWjOIw@KoaruY#@ky9H!`t-Uh~Xu%Z!=c0Lhxesv0Mb zM3Qi_2Bdqa;`Ul(kA00j2mQ)jJ`=sN^F{|kZFW59r!Yp| z=%L_uNCJdyNSESdrKuK@Ab_Ka(!+4c9pqv z0f>b)*0(J#@XeZ}NHj~D}hQl)LUc@5jyjY$tJ!EH-ODMJ5OFh8O_|8aC z6X{w2QZo=`FGL`Of8*8idS?!`mGOA0S( zLcza)(2G7(r(btx{$RO2l#RK=WYm%)7#qaXGoB97RI2FKp}A$}uDa}f;?iiqW1;8=*UcrqgqSBuV^D4@YH=NR2?_Tp8OhGgPu> zU`OmwDuu2bbvPJv6_;kBUcKH=-h7&Jt$xOvafM2u%$?khY@L_pi0~!j>Hz6>HMV=9 zO0J8Az3v{w5v`oDY4MBBK65eV>aOUl{s~UQb(zGV*WJAgGwBke`J$rshj#r>og9*N zHAY1~qQUZfp%r01%4=A2^kRZ7hKO{znR7tWthzIGLz|&amRs|ZKhH#EW zq2p!UOH!S-gS|a{Pso^FN7?6y@f+_2uE6ZsqiL_k;T`QPwY~E^%DcAh#ZPxW;!bQ& zn0RsP!X34j1M4z&-+ULP66|$Mkt4#@Ufy3s=ue?MMjZ{b;-tO#egV8=ba#qA9J%XZ zhC5v+svmE9hO^S4M?EK>q0ULP2;D1(o5)ep>MOKLnC#@x`L}ongDs$bo-xFO*DdgD zfc>Vi41+Xk7#l&x83&0rShVD5H;82gtK^pMO5ncs+bovy|1g_^ZJr!)RtskbabGXk0-0W&hwGo3B_XE^7==?7t2=gKs&JF7)k|hPGZ!6 zgge}_giQ>C(S3Zw4&V3N*%q{0YW#z^x8!hotNUoDWQ|!)iQ$dM8|qir^fmV$xyWrh zII47WziWNd_3s#1TKz+atmci86A=i5h?65P^<+`gOO*>{xLQ5v|FrGkL zMc1E8X$|zAGK?%z{v37)(YBeG_u^Ur^y?HZDAV-wtol_col7r4zF+VsR=6CKsY4QxRngOLXFlQf0rD=8m3&qO*aH?mJkK9nt=E!HZ*l3hY^mFfeNbWR*6iX%^?Lm zk>jOhVPb-FJk)-ju5MO;H5KU^5xHwNzN~OZvT)K5QT_@LxLm{EVa~Ahc$ceqAO)~Fp}{6uOkU(6-7)B|2C3P zA`0V)gULzDX08V~nnV4>gP2B)$U;nXIkGue9UZ3Brlzj#rGg2s2w19l)oHO!<(%Fp z-)wxYa!LDM^-(SRGXG`~syTMKO#0s!y1k_B1Ae$ywvL!*T4Q8dlQfNH$Kjo;Nr?G_ ze3j>=rkR55It7I%M!Avhek11U1L;hB(dwwLEk{m}dNj2+o^nZSfbLYmT7q|FI-KK# z#u9Wj&m1jz4n6q=~MK3rj3sV_InIBlvoMM z!R|f}_Tw<7$9OXMXePSKN7fySC<;okt|A~YGB|%u{{=h&DKTZGe{$*7yGFH*wC){c zk0y@JuGOnHY;O5}cEy6=`cf0H&!I+Bvljl5Ecyk9sRb{m4CAYsCd#ZJ$X7U{s`*CLe4C9bqRh1}V2V$<+#m9B?}^=c@eA;eE{5!_a8phDS@i z6ZaRw+N%7ipS`vvj*iaO4(w_@-1`an&5z&TPLwjG6S1RZ9p55zVEo;4?Z$f=27PxxQ#_QXM`<4%cmr^=| z0gK}X5B*cIO!-r-l{45_e!wfoNh*n9Cq)DiwR2$fdToMOyS1tIQcusnHNB?WcC&z>6N;4OyT;ZKcKAm`~ zI0)|*pVXzX>e}M%vODm)*uNYgXg9J15DO^OsK#uZENQw~u0`}BM=(2{vn?`1osw`{ z8&7;?RI&hVBK~gQM1hUYy-s?RBSyXWed>_9GS%e}VuB0$n+PF67TN=S3!NA6G37UM z`gsO)tW0u<4A7_U9$1&+vROjURq40r_eD|e$-ZsJNJ?HYJqJ!7=idZtl}21~xk6 z-)wL>MlfI)uV^=rYVapVeaR-X{M-4xylf{xo##FpzI+jXr*^WUcZ z?XSom!HK+P|7}fhFZ_HWZ{C!DsOG1TwFv;!VgQ=#weS)_048e(KVaErGrgw6lu({F zp%E!f8&c*_BMHm&^FYuQCqoG6W{s32FLYV$t1NX2GhO^<&-&P~5ivDSe1PT4&B;Cl zC+`4+Tys6I?9}`Dy6}1ZpF-FZLW@4!#-BoQLG7U4st7Pu6ZM@R<|>|m0)%%nVsW%+ zE|yiDbRGVxA2st!=5N3QKji+nmbRm z%A9sQ+sIT;-yms;X!>+tpQ(qoAMhvZ@0rP&K#IA&L3 zg-y2FC5M|yoEjVWh$NRQ14ZINfxeMl^>sj>hbuLg0xI*VOL*3E``s#I3FqyHg%4g5 zQu38vTtyS+>l2Vrnk|sfq?d@-MHucN&`lEW%oHZ?ewE)Yp)pEn^-eD-c6Y3}ZC@tC zsZl%Prb&Ay`-4|uI~uAIH>4rv)^)@2sdKvff^O(^Qhmq8_j6|r@Wa2xY6;GC^$$-ree> z&C^&vkgS&~mZ`LJpX1SkKl`6@TrLzj%UM9`Mi~#Xx1Y3-n#4|Jfg#MjF#)>LJi>6gG&~92~KW;b{ zB+afGG39by1O!B_LIJOF7X}&Hrin{EeBH!NwoM`2My=EB>O1e#FL3r1C&`Ldbl3>z z3lZ)U|K#dAZ}ISORkl|&b~x5F#gB(u>aLr@N+L+P1jUw#do zUHLHZUb*wi?6?~52_ywG9nM7DP0Flei7?4`W`ftf=vPljW15FttGC$sb>xe&Q!2-0 zpXm;*%9RFTyN(Wz+TRR00}@f}ed74RtH8y8qXTM0vg3iw*_}k>!XyLmxpjRdt)_V( zfY8N5xD`a&{!ru)N#Uo^rA0Iy$-eKwEg|=y+GzE2<&8?I*ry}qjZlAHUP?x+Frgh; zU5sk~f04wJ$vfU=GIFv(D!JM7n)JJB zQK2ObcoPk{-{xz>u)q#rGLq0ks+=Z)$X@hJ2Z%tnkUuf#=U_3gfvZ{t$>pLrtQ>L3 z6DUD3x*1o%HzMv7^{ZNTeuvu(e+LkJnRQbnIam~r z9P};U!eQJg*8rwt2698A*l6u`9-6Pn4kV4s*bR7LgDZeC(q%!cQ{cP86$=0`@q3#B z#B2ZFok&Dk@wFx{dX+^-nAMN3xpMem<>Kc8KkT!`pB0x;}<5tK&9K$?W3hs%{apzEu|F+umO8Kr4pAXiZxz{XG{(HOs8&^AmltS$s2lmHD z1P=G#7+_9zetuyU)nYm7Y?!qvbi=32(W}qi4bPJIbQ0Y`>JN&-oh36d+D15&1bAUu zCc!$PC8wi0)VO|UeU)otOij4qjms+;Q94bM9>^k6)!HJ96Lzm-2GZi)n81x~?6v$igi7Yf7-qBi!Gcd9~ z&AZ%i^(r^H_>x)1T!v)=W`A#R)Rz2@atlj9)&+oyJuUgrMxvsXS4OwKdvhVmK%-+itSNuw7K&Ep@3C zgK{dyF*vN0ju)bHvBlI&3mJ22V@sOQdH zD!;9CYm>Rz@CsQ57~w`k7&i4INw{1Fj~mRa>_tw~*5lD9@>{f{(Yj`ElT&8p1G}2h zlTE7AkoQaX&!r~0<(O(1XB8B{uIT(WLJ!9W|hyICXY@{ z$DIykcr;S4en!#j%=_-VZ*h*dOoRf#QL={^N@9bs012o^ zzQzk43bF;ITx8yF9Mn{zyP%+Mc^G~WVOZe0M2`E;0ihD;*uybErg|lNtk%Jf8_iz0 z#Ya1F#IS{S;+Sggl1rg&BkRrDc&F5PXW32Ft2W+@-En%SaqPoigQWziiF($b(s(4ZHeNT6H3rJmh+tj*9WuQobuDQW^|;5k0H z+`HFd5YR)%e96Ca@wjh zfL$AC%d0>(nM4o}xI(Tc?(nu+e(3TvEInX7U6Py5B~cuY+*NRBZ0g-xwwSodoEu5a zn?nYy;K*`M2@(kV@DeB)zAXfnRtmbJZZ+&+p=jOmcIK_DW!a;^%rcp|qa3lP>F_^%U@!RSDBWf#Ht3+)X40ZkA?;OCF5#z16+n;Qq2qpCOTno}Oom4I`t<_79Vz%SG5=SiXq1 zsy`Vhbxg|DKJ^Omd*vV-h0(9KNeiGP2Jc5fQIzrKu|37(=>LEA@L^??5E}t4uN5py zg_QOc8R;swA)@Mkbo3tI!Z;ob%06uKjr6c9BBx+%R}Ey#v<#UWUy z4W%8bnK*F>#F|c5OR4JavM{mr@hAZK^rAUn73+^TZRZZBOt*qGBSLW#Lee z?S}!QAPyY`!>W6Um4$3FUsYpCikSBnbd_nt!z_Rv7zs&+QA8q47WgzRya%zgFrf)6 zRK6Jkb*0r1ZuyZ3I?8tGTL9u#KN>aZtz9QdO3WihlfLdwJ5NnGU;5q@f4e|!_V)3I zbH9ON#u>{_X+y9}2hEL!08WXE+*rgjdDqUz_+;3byd9uFkF?q{W3~UP+9Bh$YiFfb zDs5hr-Hep~&G&Pk!wulF6PGPGg49hQa((zpbe&W(7hO0#R~B1jq7gs3cxI+2rdReL zegAK^>otTH?SbAb)LA9Dys{lgbN6xzc&)UXdXC;>*lJg$^xOykBIxOW(j`kdchQ>; z1!GH1%SKR5+~P~3YgD5|*aCoPR$tljR=Y{E&pn}aO4lk^*(yw|^Io5cgya`drCZ12 zYf=79%eWw7Mlg6jU%J779V=!iWltN1t(OSgVEn9wQfoH;5Qo4L&S#}3}&;|2$Mhw?7%G^VK z@{<6)MD3u<7InDwAVU9(69XY2V%dkW0D%Gv$Y9<_76Pn*Ae^VgO1%P1(H#a3@5o%i zXh`ycK^ZM!*=jk0t=t>X>Y=84B~+H|(2OudsA9^{+$eISNY;-Ax1!|U^AdZij3#UM zDo3o{u|nbS^P_i=JBNWt>hduRe}%32ASI~6h(fZTc&^K<#Eo&y@Pu1>lWZzZ&Ci6)eKLPrM4i1DP9jC7~K%!!iKG3hxq zx%mm4$&C$Cr{5S_N4k3^?*90;Vb$S7mD+VQsGyP{&6x@HL$8FUP8N0+T6nbL#E)QT zp?kf&S>C7X)U-^tUw-t9M3nx4J@v=8-*EsitwAJvIrQQ0CP6MukX5QQIGsS6b~u)+ zLjt^7!69VW(2!g}tZSM9sn1WLoJDv+rwK~@%@Mh?x#+v8`@wbQ*i}C0r(^404!Fr^ zO-%SXxhN##_EGRB4_{EbbiY+rti-_g!sCec-Ae?py8op|?baY-`ILdqa4>ez7@Il- zbjo#>g)K9A*lK;N7+2RflSt2}-g{AP0qf1Q2Yl=EKaU#tJUpU%LHM^Lbs3;X03M>E zg)w_O_C9d|9Cee%8PUmM)E zdprUah!lPP7m-U5Q)0a+3Y0DS3VsS@t$B*QMPfUHvZS#fGghF@cAf3qEzI`e!h#R9 z!3;FpqKUpxOMI7DL8Kq4qk?violfqZO!Mon-#vUmEee0OKGZ%gPt$*|tjZR^e#GCp znr9vyEC8Ld!9;(O4AC7aDt)w$;7`ervjFNPUlxuJ2fJ=HFW9dW*we#3*c~0#~&nAAI(i`fx zME+KJP-`59#CZC+E-<2iA;l(HB;GWXW;Si?_ehoK=wzCy7xv~DKMuLgb?<*t-Fx2T zTD4bjB+6?2P2_zf+Y`ahOdKQ$d^x7@6CF^ebX@u=v;zU@3d83b*ciA355k`_f>X4v z@|!3-LBTPiYtBjJ(pop#(zPOT2-}-DBv;tPpTmwguI7P2;PVF$B6nj8=sk`q;~W7$6D9q5DOg-28=$_*l7Wpwa+$?ak=Adu8V;6<>BE{ zr^sHAKVEc+5D68$1e7~n`s6B1EON8&j1-g%s&ORwU}P6cZajdXn0O+8_HFLVl2p~* z&TXEB+55TCpUFUEizZc!NBY0I8zp&RPRZs#jXeHX$tLl5|_XU zucFC8nUy8JTwSW(SvU5(&P}bR399RS6h=qw!UMfu-uK^xe)hEev;%lA*9^qaj=YuuCI+m7ApIhgrj& z3Lvq$<2;Y)Mi@hWI2R7pzQnHI)P!2rmiB0N#Lz;zwb5wutNP^!?hg(NmyO)L`pTyM z4Wex(hOq{;hv+J>s4QoXL1#_PFLjgG>Jtg)@LO|D< zM($I^dO?C2S5;Ue;hM;Fy3`7O0sM)`K8dD}4F*J({ld0p&M#CO1(u0$9QYx)VF#ow zyEb`v?*({b*q`7)k31Kp0%#5|2ds+0UK8Bnl&)B$$=k$ILch`h9C*>=sk>l z#%(_%t∈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 literal 0 HcmV?d00001 diff --git a/docs-rtd/source/_static/VJTAG_images/vjtag_5.jpg b/docs-rtd/source/_static/VJTAG_images/vjtag_5.jpg new file mode 100644 index 0000000000000000000000000000000000000000..829412aaf8c40cfca4903db9badb981df5fe3730 GIT binary patch literal 277270 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 z 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%0AScj+3c|u?dMV*bdy~uA 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%0D&;5 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� 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