From fbc993b8464757abc3b135d171cb3f24c1fcc33f Mon Sep 17 00:00:00 2001 From: FallenSigh Date: Tue, 23 Jun 2026 01:22:45 +0800 Subject: [PATCH] Initial commit: Loongson FPGA SoC project for 2026 CIC-IEC --- .gitignore | 53 + doc/2026集创赛龙芯中科杯初赛.pdf | Bin 0 -> 2206412 bytes doc/matmul_ip_spec.md | 137 + fpga/check_dsp.py | 59 + fpga/create_project.tcl | 24 + fpga/generate_bit.tcl | 26 + fpga/run-linter.py | 288 + fpga/run_impl.tcl | 32 + rtl/config.h | 94 + rtl/ip/APB_UART/URT/raminfr.v | 62 + rtl/ip/APB_UART/URT/uart_defines.h | 119 + rtl/ip/APB_UART/URT/uart_receiver.v | 288 + rtl/ip/APB_UART/URT/uart_regs.v | 711 ++ rtl/ip/APB_UART/URT/uart_rfifo.v | 193 + rtl/ip/APB_UART/URT/uart_sync_flops.v | 76 + rtl/ip/APB_UART/URT/uart_tfifo.v | 129 + rtl/ip/APB_UART/URT/uart_top.v | 107 + rtl/ip/APB_UART/URT/uart_transmitter.v | 281 + rtl/ip/APB_UART/apb_mux2.v | 206 + rtl/ip/APB_UART/axi2apb.v | 674 ++ rtl/ip/APB_UART/axi_uart_controller.v | 356 + rtl/ip/Bus_interconnects/AxiCrossbar_2x8.v | 6331 ++++++++++ rtl/ip/Bus_interconnects/Axi_CDC.v | 1608 +++ rtl/ip/Bus_interconnects/axi2sram_dp.v | 520 + rtl/ip/Bus_interconnects/axi2sram_sp.v | 350 + .../Bus_interconnects/axi2sram_sp_external.v | 380 + rtl/ip/DVI/axi_dvi.v | 258 + rtl/ip/PLL_2019_2/clk_pll_sim_netlist.v | 224 + rtl/ip/PLL_2019_2/clk_pll_sim_netlist.vhdl | 170 + rtl/ip/PLL_2019_2/clk_pll_stub.v | 23 + rtl/ip/PLL_2019_2/clk_pll_stub.vhdl | 32 + rtl/ip/axi_axil_adapter/axi_axil_adapter.v | 223 + rtl/ip/axi_axil_adapter/axi_axil_adapter_rd.v | 507 + rtl/ip/axi_axil_adapter/axi_axil_adapter_wr.v | 570 + rtl/ip/bram0/my_bram0.v | 47 + rtl/ip/cdma/snix_async_fifo.sv | 112 + rtl/ip/cdma/snix_axi_cdma.sv | 219 + rtl/ip/cdma/snix_axi_cdma_csr.sv | 192 + rtl/ip/cdma/snix_axi_mm2mm.sv | 455 + rtl/ip/cdma/snix_axil_cdma_mux.sv | 381 + rtl/ip/cdma/snix_axis_fifo.sv | 113 + rtl/ip/cdma/snix_register_slice.sv | 79 + rtl/ip/cdma/snix_sync_fifo.sv | 130 + rtl/ip/confreg/confreg.v | 421 + rtl/ip/confreg/digitaltube_controller.v | 101 + rtl/ip/confreg/int_ctrl.v | 61 + rtl/ip/confreg/key_debounce.v | 40 + rtl/ip/fft/Butterfly.v | 32 + rtl/ip/fft/DelayBuffer.v | 32 + rtl/ip/fft/FFT1024_32B.v | 89 + rtl/ip/fft/Multiply.v | 35 + rtl/ip/fft/SdfUnit.v | 277 + rtl/ip/fft/Twiddle1024_32B.v | 1064 ++ rtl/ip/fft/axi_fft_wrapper.v | 383 + rtl/ip/matmul/matmul_axi_slave.v | 303 + rtl/ip/open-la500/LICENSE | 127 + rtl/ip/open-la500/README.md | 7 + rtl/ip/open-la500/addr_trans.v | 250 + rtl/ip/open-la500/alu.v | 109 + rtl/ip/open-la500/axi_bridge.v | 317 + rtl/ip/open-la500/btb.v | 238 + rtl/ip/open-la500/csr.h | 73 + rtl/ip/open-la500/csr.v | 856 ++ rtl/ip/open-la500/dcache.v | 651 + rtl/ip/open-la500/div.v | 99 + rtl/ip/open-la500/doc/lacc接口.md | 135 + rtl/ip/open-la500/doc/picture/lacc_inst.png | Bin 0 -> 2925 bytes rtl/ip/open-la500/doc/picture/lacc_read.png | Bin 0 -> 103244 bytes rtl/ip/open-la500/doc/picture/lacc_write.png | Bin 0 -> 90264 bytes rtl/ip/open-la500/doc/picture/框图.svg | 4 + rtl/ip/open-la500/doc/分支预测.md | 94 + rtl/ip/open-la500/doc/前言.md | 17 + rtl/ip/open-la500/doc/设计概述.md | 63 + rtl/ip/open-la500/exe_stage.v | 439 + rtl/ip/open-la500/icache.v | 410 + rtl/ip/open-la500/id_stage.v | 1005 ++ rtl/ip/open-la500/if_stage.v | 357 + rtl/ip/open-la500/lacc_core.v | 53 + rtl/ip/open-la500/lacc_demo.v | 166 + rtl/ip/open-la500/mem_stage.v | 368 + rtl/ip/open-la500/mul.v | 197 + rtl/ip/open-la500/mycpu.h | 32 + rtl/ip/open-la500/mycpu_top.v | 1296 ++ rtl/ip/open-la500/perf_counter.v | 57 + rtl/ip/open-la500/regfile.v | 39 + rtl/ip/open-la500/tlb_entry.v | 235 + rtl/ip/open-la500/tools.v | 167 + rtl/ip/open-la500/wb_stage.v | 324 + rtl/ip/ram_wrap/axi_wrap_ram_dp.v | 247 + rtl/ip/ram_wrap/axi_wrap_ram_sp.v | 244 + rtl/ip/ram_wrap/axi_wrap_ram_sp_external.v | 259 + rtl/ip/ram_wrap/cache_sram.v | 85 + rtl/ip/ram_wrap/fpga_sram_dp.v | 53 + rtl/ip/ram_wrap/fpga_sram_sp.v | 54 + rtl/ip/rst_sync/rst_sync.v | 18 + rtl/soc_top.v | 1684 +++ sdk/axi_ram.mif | 10004 ++++++++++++++++ sdk/hello_world.bin | Bin 0 -> 40012 bytes sdk/software/bsp/common.mk | 82 + sdk/software/bsp/drivers/common_func.c | 20 + sdk/software/bsp/drivers/confreg_time.c | 63 + sdk/software/bsp/drivers/core_time.c | 30 + sdk/software/bsp/drivers/dvi.c | 27 + sdk/software/bsp/drivers/led.c | 28 + sdk/software/bsp/drivers/seg7.c | 17 + sdk/software/bsp/env/convert.c | 103 + sdk/software/bsp/env/script.lds | 182 + sdk/software/bsp/env/start.S | 182 + sdk/software/bsp/env/trap_handler.S | 188 + sdk/software/bsp/include/common_func.h | 99 + sdk/software/bsp/include/confreg_time.h | 22 + sdk/software/bsp/include/core_time.h | 8 + sdk/software/bsp/include/dvi.h | 21 + sdk/software/bsp/include/handler.h | 31 + sdk/software/bsp/include/led.h | 14 + sdk/software/bsp/include/regdef.h | 104 + sdk/software/bsp/include/seg7.h | 17 + sdk/software/bsp/include/uart_print.h | 12 + sdk/software/examples/.gitignore | 56 + sdk/software/examples/asm/Makefile | 11 + sdk/software/examples/asm/user-sample.c | 0 .../examples/c_prg/inner_product/Makefile | 14 + .../c_prg/inner_product/inner_product.c | 446 + .../examples/c_prg/lookup_table/Makefile | 14 + .../c_prg/lookup_table/lookup_table.c | 315 + .../examples/c_prg/loop_induction/Makefile | 14 + .../c_prg/loop_induction/loop_induction.c | 131 + sdk/software/examples/c_prg/memcmp/Makefile | 14 + sdk/software/examples/c_prg/memcmp/memcmp.c | 177 + .../examples/c_prg/minmax_sequence/Makefile | 14 + .../c_prg/minmax_sequence/minmax_sequence.c | 1509 +++ .../examples/c_prg/product_sequence/Makefile | 14 + .../c_prg/product_sequence/product_sequence.c | 169 + sdk/software/examples/coremark/LICENSE.md | 100 + sdk/software/examples/coremark/Makefile | 25 + sdk/software/examples/coremark/README.md | 398 + .../examples/coremark/core_list_join.c | 599 + sdk/software/examples/coremark/core_main.c | 422 + sdk/software/examples/coremark/core_matrix.c | 359 + sdk/software/examples/coremark/core_portme.c | 53 + sdk/software/examples/coremark/core_portme.h | 64 + sdk/software/examples/coremark/core_state.c | 330 + sdk/software/examples/coremark/core_util.c | 249 + sdk/software/examples/coremark/coremark.h | 173 + sdk/software/examples/dhrystone/Makefile | 16 + sdk/software/examples/dhrystone/README.md | 10 + sdk/software/examples/dhrystone/dhry.h | 420 + sdk/software/examples/dhrystone/dhry_1.c | 392 + sdk/software/examples/dhrystone/dhry_2.c | 192 + sdk/software/examples/fireye/A0/A0.c | 35 + sdk/software/examples/fireye/A0/Makefile | 14 + sdk/software/examples/fireye/B2/B2.c | 61 + sdk/software/examples/fireye/B2/Makefile | 14 + sdk/software/examples/fireye/C0/C0.c | 74 + sdk/software/examples/fireye/C0/Makefile | 14 + sdk/software/examples/fireye/D1/D1.c | 76 + sdk/software/examples/fireye/D1/Makefile | 14 + sdk/software/examples/fireye/I2/I2.c | 122 + sdk/software/examples/fireye/I2/Makefile | 14 + sdk/software/examples/hello_world/Makefile | 11 + sdk/software/examples/hello_world/main.c | 36 + sdk/software/examples/int_test/Makefile | 11 + sdk/software/examples/int_test/main.c | 96 + sdk/software/examples/lenet/AccelConvFuncs.c | 179 + sdk/software/examples/lenet/AccelConvFuncs.h | 14 + sdk/software/examples/lenet/Accelop.h | 154 + sdk/software/examples/lenet/ConvFuncs.c | 97 + sdk/software/examples/lenet/ConvFuncs.h | 16 + sdk/software/examples/lenet/Makefile | 11 + sdk/software/examples/lenet/main.c | 160 + sdk/software/examples/lenet/test_image.h | 23 + sdk/software/examples/lenet/weights.h | 62 + sdk/software/examples/matmul_test/Makefile | 11 + sdk/software/examples/matmul_test/main.c | 253 + sdk/software/examples/pinball_game/Makefile | 11 + sdk/software/examples/pinball_game/main.c | 249 + sdk/toolchains | 1 + sim/matmul_flow_tb.v | 396 + sim/mycpu_tb.v | 230 + sim/sram.v | 52 + tools/generate_matmul_testdata.py | 164 + 181 files changed, 51135 insertions(+) create mode 100644 .gitignore create mode 100644 doc/2026集创赛龙芯中科杯初赛.pdf create mode 100644 doc/matmul_ip_spec.md create mode 100644 fpga/check_dsp.py create mode 100644 fpga/create_project.tcl create mode 100644 fpga/generate_bit.tcl create mode 100644 fpga/run-linter.py create mode 100644 fpga/run_impl.tcl create mode 100644 rtl/config.h create mode 100644 rtl/ip/APB_UART/URT/raminfr.v create mode 100644 rtl/ip/APB_UART/URT/uart_defines.h create mode 100644 rtl/ip/APB_UART/URT/uart_receiver.v create mode 100644 rtl/ip/APB_UART/URT/uart_regs.v create mode 100644 rtl/ip/APB_UART/URT/uart_rfifo.v create mode 100644 rtl/ip/APB_UART/URT/uart_sync_flops.v create mode 100644 rtl/ip/APB_UART/URT/uart_tfifo.v create mode 100644 rtl/ip/APB_UART/URT/uart_top.v create mode 100644 rtl/ip/APB_UART/URT/uart_transmitter.v create mode 100644 rtl/ip/APB_UART/apb_mux2.v create mode 100644 rtl/ip/APB_UART/axi2apb.v create mode 100644 rtl/ip/APB_UART/axi_uart_controller.v create mode 100644 rtl/ip/Bus_interconnects/AxiCrossbar_2x8.v create mode 100644 rtl/ip/Bus_interconnects/Axi_CDC.v create mode 100644 rtl/ip/Bus_interconnects/axi2sram_dp.v create mode 100644 rtl/ip/Bus_interconnects/axi2sram_sp.v create mode 100644 rtl/ip/Bus_interconnects/axi2sram_sp_external.v create mode 100644 rtl/ip/DVI/axi_dvi.v create mode 100644 rtl/ip/PLL_2019_2/clk_pll_sim_netlist.v create mode 100644 rtl/ip/PLL_2019_2/clk_pll_sim_netlist.vhdl create mode 100644 rtl/ip/PLL_2019_2/clk_pll_stub.v create mode 100644 rtl/ip/PLL_2019_2/clk_pll_stub.vhdl create mode 100644 rtl/ip/axi_axil_adapter/axi_axil_adapter.v create mode 100644 rtl/ip/axi_axil_adapter/axi_axil_adapter_rd.v create mode 100644 rtl/ip/axi_axil_adapter/axi_axil_adapter_wr.v create mode 100644 rtl/ip/bram0/my_bram0.v create mode 100644 rtl/ip/cdma/snix_async_fifo.sv create mode 100644 rtl/ip/cdma/snix_axi_cdma.sv create mode 100644 rtl/ip/cdma/snix_axi_cdma_csr.sv create mode 100644 rtl/ip/cdma/snix_axi_mm2mm.sv create mode 100644 rtl/ip/cdma/snix_axil_cdma_mux.sv create mode 100644 rtl/ip/cdma/snix_axis_fifo.sv create mode 100644 rtl/ip/cdma/snix_register_slice.sv create mode 100644 rtl/ip/cdma/snix_sync_fifo.sv create mode 100644 rtl/ip/confreg/confreg.v create mode 100644 rtl/ip/confreg/digitaltube_controller.v create mode 100644 rtl/ip/confreg/int_ctrl.v create mode 100644 rtl/ip/confreg/key_debounce.v create mode 100644 rtl/ip/fft/Butterfly.v create mode 100644 rtl/ip/fft/DelayBuffer.v create mode 100644 rtl/ip/fft/FFT1024_32B.v create mode 100644 rtl/ip/fft/Multiply.v create mode 100644 rtl/ip/fft/SdfUnit.v create mode 100644 rtl/ip/fft/Twiddle1024_32B.v create mode 100644 rtl/ip/fft/axi_fft_wrapper.v create mode 100644 rtl/ip/matmul/matmul_axi_slave.v create mode 100644 rtl/ip/open-la500/LICENSE create mode 100644 rtl/ip/open-la500/README.md create mode 100644 rtl/ip/open-la500/addr_trans.v create mode 100644 rtl/ip/open-la500/alu.v create mode 100644 rtl/ip/open-la500/axi_bridge.v create mode 100644 rtl/ip/open-la500/btb.v create mode 100644 rtl/ip/open-la500/csr.h create mode 100644 rtl/ip/open-la500/csr.v create mode 100644 rtl/ip/open-la500/dcache.v create mode 100644 rtl/ip/open-la500/div.v create mode 100644 rtl/ip/open-la500/doc/lacc接口.md create mode 100644 rtl/ip/open-la500/doc/picture/lacc_inst.png create mode 100644 rtl/ip/open-la500/doc/picture/lacc_read.png create mode 100644 rtl/ip/open-la500/doc/picture/lacc_write.png create mode 100644 rtl/ip/open-la500/doc/picture/框图.svg create mode 100644 rtl/ip/open-la500/doc/分支预测.md create mode 100644 rtl/ip/open-la500/doc/前言.md create mode 100644 rtl/ip/open-la500/doc/设计概述.md create mode 100644 rtl/ip/open-la500/exe_stage.v create mode 100644 rtl/ip/open-la500/icache.v create mode 100644 rtl/ip/open-la500/id_stage.v create mode 100644 rtl/ip/open-la500/if_stage.v create mode 100644 rtl/ip/open-la500/lacc_core.v create mode 100644 rtl/ip/open-la500/lacc_demo.v create mode 100644 rtl/ip/open-la500/mem_stage.v create mode 100644 rtl/ip/open-la500/mul.v create mode 100644 rtl/ip/open-la500/mycpu.h create mode 100644 rtl/ip/open-la500/mycpu_top.v create mode 100644 rtl/ip/open-la500/perf_counter.v create mode 100644 rtl/ip/open-la500/regfile.v create mode 100644 rtl/ip/open-la500/tlb_entry.v create mode 100644 rtl/ip/open-la500/tools.v create mode 100644 rtl/ip/open-la500/wb_stage.v create mode 100644 rtl/ip/ram_wrap/axi_wrap_ram_dp.v create mode 100644 rtl/ip/ram_wrap/axi_wrap_ram_sp.v create mode 100644 rtl/ip/ram_wrap/axi_wrap_ram_sp_external.v create mode 100644 rtl/ip/ram_wrap/cache_sram.v create mode 100644 rtl/ip/ram_wrap/fpga_sram_dp.v create mode 100644 rtl/ip/ram_wrap/fpga_sram_sp.v create mode 100644 rtl/ip/rst_sync/rst_sync.v create mode 100644 rtl/soc_top.v create mode 100644 sdk/axi_ram.mif create mode 100755 sdk/hello_world.bin create mode 100644 sdk/software/bsp/common.mk create mode 100644 sdk/software/bsp/drivers/common_func.c create mode 100644 sdk/software/bsp/drivers/confreg_time.c create mode 100644 sdk/software/bsp/drivers/core_time.c create mode 100644 sdk/software/bsp/drivers/dvi.c create mode 100644 sdk/software/bsp/drivers/led.c create mode 100644 sdk/software/bsp/drivers/seg7.c create mode 100644 sdk/software/bsp/env/convert.c create mode 100644 sdk/software/bsp/env/script.lds create mode 100644 sdk/software/bsp/env/start.S create mode 100644 sdk/software/bsp/env/trap_handler.S create mode 100644 sdk/software/bsp/include/common_func.h create mode 100644 sdk/software/bsp/include/confreg_time.h create mode 100644 sdk/software/bsp/include/core_time.h create mode 100644 sdk/software/bsp/include/dvi.h create mode 100644 sdk/software/bsp/include/handler.h create mode 100644 sdk/software/bsp/include/led.h create mode 100644 sdk/software/bsp/include/regdef.h create mode 100644 sdk/software/bsp/include/seg7.h create mode 100644 sdk/software/bsp/include/uart_print.h create mode 100644 sdk/software/examples/.gitignore create mode 100644 sdk/software/examples/asm/Makefile create mode 100644 sdk/software/examples/asm/user-sample.c create mode 100644 sdk/software/examples/c_prg/inner_product/Makefile create mode 100644 sdk/software/examples/c_prg/inner_product/inner_product.c create mode 100644 sdk/software/examples/c_prg/lookup_table/Makefile create mode 100644 sdk/software/examples/c_prg/lookup_table/lookup_table.c create mode 100644 sdk/software/examples/c_prg/loop_induction/Makefile create mode 100644 sdk/software/examples/c_prg/loop_induction/loop_induction.c create mode 100644 sdk/software/examples/c_prg/memcmp/Makefile create mode 100644 sdk/software/examples/c_prg/memcmp/memcmp.c create mode 100644 sdk/software/examples/c_prg/minmax_sequence/Makefile create mode 100644 sdk/software/examples/c_prg/minmax_sequence/minmax_sequence.c create mode 100644 sdk/software/examples/c_prg/product_sequence/Makefile create mode 100644 sdk/software/examples/c_prg/product_sequence/product_sequence.c create mode 100644 sdk/software/examples/coremark/LICENSE.md create mode 100644 sdk/software/examples/coremark/Makefile create mode 100644 sdk/software/examples/coremark/README.md create mode 100644 sdk/software/examples/coremark/core_list_join.c create mode 100644 sdk/software/examples/coremark/core_main.c create mode 100644 sdk/software/examples/coremark/core_matrix.c create mode 100644 sdk/software/examples/coremark/core_portme.c create mode 100644 sdk/software/examples/coremark/core_portme.h create mode 100644 sdk/software/examples/coremark/core_state.c create mode 100644 sdk/software/examples/coremark/core_util.c create mode 100644 sdk/software/examples/coremark/coremark.h create mode 100644 sdk/software/examples/dhrystone/Makefile create mode 100644 sdk/software/examples/dhrystone/README.md create mode 100644 sdk/software/examples/dhrystone/dhry.h create mode 100644 sdk/software/examples/dhrystone/dhry_1.c create mode 100644 sdk/software/examples/dhrystone/dhry_2.c create mode 100644 sdk/software/examples/fireye/A0/A0.c create mode 100644 sdk/software/examples/fireye/A0/Makefile create mode 100644 sdk/software/examples/fireye/B2/B2.c create mode 100644 sdk/software/examples/fireye/B2/Makefile create mode 100644 sdk/software/examples/fireye/C0/C0.c create mode 100644 sdk/software/examples/fireye/C0/Makefile create mode 100644 sdk/software/examples/fireye/D1/D1.c create mode 100644 sdk/software/examples/fireye/D1/Makefile create mode 100644 sdk/software/examples/fireye/I2/I2.c create mode 100644 sdk/software/examples/fireye/I2/Makefile create mode 100644 sdk/software/examples/hello_world/Makefile create mode 100644 sdk/software/examples/hello_world/main.c create mode 100644 sdk/software/examples/int_test/Makefile create mode 100644 sdk/software/examples/int_test/main.c create mode 100644 sdk/software/examples/lenet/AccelConvFuncs.c create mode 100644 sdk/software/examples/lenet/AccelConvFuncs.h create mode 100644 sdk/software/examples/lenet/Accelop.h create mode 100644 sdk/software/examples/lenet/ConvFuncs.c create mode 100644 sdk/software/examples/lenet/ConvFuncs.h create mode 100644 sdk/software/examples/lenet/Makefile create mode 100644 sdk/software/examples/lenet/main.c create mode 100644 sdk/software/examples/lenet/test_image.h create mode 100644 sdk/software/examples/lenet/weights.h create mode 100644 sdk/software/examples/matmul_test/Makefile create mode 100644 sdk/software/examples/matmul_test/main.c create mode 100644 sdk/software/examples/pinball_game/Makefile create mode 100644 sdk/software/examples/pinball_game/main.c create mode 120000 sdk/toolchains create mode 100644 sim/matmul_flow_tb.v create mode 100644 sim/mycpu_tb.v create mode 100644 sim/sram.v create mode 100644 tools/generate_matmul_testdata.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bca1624 --- /dev/null +++ b/.gitignore @@ -0,0 +1,53 @@ +# ======================================== +# Vivado project & IP files (not tracked) +# ======================================== +fpga/.Xil/ +fpga/project/ +*.xpr +*.xci +*.xcix +*.xdc +*.bd +*.dcp +*.jou +*.log +*.backup.jou +*.backup.log +webtalk*.log +webtalk*.jou +*.wdb +*.pb +*.str +vivado_pid*.txt +*.bit + +# ======================================== +# OS generated files +# ======================================== +.DS_Store +.DS_Store? +._* +.Spotlight-V100 +.Trashes +ehthumbs.db +Thumbs.db +desktop.ini + +# ======================================== +# Editor / IDE +# ======================================== +.idea/ +.vscode/ +*.swp +*.swo +*~ +\#*\# +.\#* + +# ======================================== +# Python +# ======================================== +__pycache__/ +*.pyc +*.pyo +*.egg-info/ diff --git a/doc/2026集创赛龙芯中科杯初赛.pdf b/doc/2026集创赛龙芯中科杯初赛.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6a865ad43319555d49f0f19c8ae47f66eede48ab GIT binary patch literal 2206412 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 z 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≪zns4DbGX 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%0DgLU4}#E!w7!8Wo#L6zYU3EhR0Z? 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%0AI6LkipShtO1R6EdfBg%ZhyhjkEn5JAwvK4WxO< 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

}Kx&7f~tA2^?xY1Tw__LNt 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

SMZ^w-3O<{M{s1xp&jGqBQ%TYh`~1n2(-x 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

^dwN(2qq1OQ@d)s$INB70*UEdMYF|$0f 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

j=MN;0Sv%l= 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%0Aa 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 z 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

?8c@4o9Uub>o(-%3jqW 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≠`X^3IWAjl8691|#$f$+ae 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

  • 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 literal 0 HcmV?d00001 diff --git a/rtl/ip/open-la500/doc/picture/lacc_write.png b/rtl/ip/open-la500/doc/picture/lacc_write.png new file mode 100644 index 0000000000000000000000000000000000000000..a5f6864bbb410309e6070748c32ecb056437e1ed GIT binary patch literal 90264 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 + + +

    pc

    pc
    nextpc
    nextpc
    +4
    +4
    btb
    btb
    pre_pc
    pre_pc
    icache
    icache
    tlb
    tlb
    tag&v ram
    tag&v ram
    inst ram
    inst ram
    fetch_pc
    fetch_pc
    vpn
    vpn
    index
    index
    tagcmp
    tagcmp
    ppn
    ppn
    inst
    inst
    decoder
    decoder
    regfile
    regfile
    dcache
    dcache
    tlb
    tlb
    tag&v ram
    tag&v ram
    data ram
    data ram
    data_addr
    data_addr
    vpn
    vpn
    index
    index
    tagcmp
    tagcmp
    ppn
    ppn
    div
    div
    mul
    mul
    data
    data
    btb_op
    btb_op
    axi_bridge
    axi_bridge
    inst_miss
    inst_miss
    data_miss
    data_miss
    AXI
    AXI

    inst

    inst

    op

    op

    rf

    data

    rf...
    es_forward
    es_forward
    alu
    alu

    alu

    res

    alu...

    op

    op
    final
    res
    fina...
    ms_forward
    ms_forward
    right_pc
    right_pc
    csr
    csr
    rd
    rd
    flush_pc
    flush_pc
    fs_stage
    fs_stage
    ds_stage
    ds_stage
    es_stage
    es_stage
    mem_stage
    mem_sta...
    wb_stage
    wb_stage
    Text is not SVG - cannot display
    \ No newline at end of file diff --git a/rtl/ip/open-la500/doc/分支预测.md b/rtl/ip/open-la500/doc/分支预测.md new file mode 100644 index 0000000..20d7d0b --- /dev/null +++ b/rtl/ip/open-la500/doc/分支预测.md @@ -0,0 +1,94 @@ +# 分支预测 +分支预测即根据分支历史,提前预测指令跳转方向及跳转目标。分支预测器种类繁多,例如BTB(Branch Target Buffer)、BHT(Branch History Table)、RAS(Return Address Stack)等,但适用于五级流水的其实并不多。如设计概述中所介绍的,五级流水中,pfs级发出取指请求,fs级取回指令,ds级开始译码,并明确跳转指令的所有信息。也就表示分支预测只有一拍的空间可以利用,且无预译码,可依据的信息只有pc,跳转方向及跳转目标都只能靠猜。适用的实际上仅有BTB。不过对于较为特殊的jirl指令,即寄存器跳转,若直接采用BTB的机制,会使得命中率极低。因此,在BTB的基础上进行改造,由CAM表记录jirl指令的pc,并由RAS机制预测其跳转目标。 + +---- + +接下来介绍分支预测器的具体实现,分为两点:分支预测器的内部实现;分支预测器同流水线的交互。 +## 分支预测器设计 +分支预测器的逻辑可以分为两个部分,由PC进行预测跳转目标及跳转方向的预测部分;根据指令译码结果与分支预测器预测结果的比较,对分支预测器历史信息进行修正的修正部分。 +### 预测部分 +首先来看模块的接口。 +- fetch_pc:取指pc +- fetch_en:取指使能 +- ret_en:预测结果使能 +- ret_pc:预测跳转目标 +- taken:预测跳转方向 +- ret_index:指示当前预测结果的对应项,用于修正 + +btb表有32项,包含四个内容: +- btb_pc:30位,用于和取指pc匹配 +- btb_target:30位,存放跳转目标 +- btb_counter:2位,由最高位指示跳转方向 +- btb_valid:1位,当前项是否有效 + +对于jirl指令的预测逻辑由两部分组成,16项的CAM表以及8项的RAS。 +CAM表包含两个内容: +- ras_pc:30位,用于和取指pc匹配 +- ras_valid:1位,当前项是否有效 + +RAS简单来说就是一个栈。存储30位的跳转目标,由ras_ptr指示栈顶。 + +明确表项内容后,来看预测逻辑。fetch_en以及fetch_pc进入分支预测器时,首先缓存一拍。单看分支预测器,缓存插在什么位置其实都可以,只要有一拍的延迟即可,但考虑到赋值nextpc即fetch_pc的路径非常长,因此将缓存插在靠前的位置。缓存后的信号为fetch_en_r及fetch_pc_r,将其与两个CAM的PC部分,btb_pc和ras_pc进行匹配。该项有效且pc匹配则表示命中。命中项记录在btb_match_rd和ras_match_rd中。 + +两个表中有一项命中,则置起ret_en。若命中在btb CAM表中,ret_pc取对应项的btb_target即可,若命中在ras CAM表中,则取ras栈顶的跳转目标。理论上btb_match_rd和ras_match_rd为one-hot且只会命中在一个表中,因此不必使用优先级逻辑。ret_index同理,而taken在btb_match时,需要看对应项btb_counter最高位,而ras_match时,直接置为1。预测阶段不会对分支预测器的历史信息进行任何修正。 + +### 修正部分 +在ds译码级,汇总分支预测信息以及译码得到的正确分支跳转信息。 +预测信息同上: +- ds_btb_target +- ds_btb_index +- ds_btb_taken +- ds_btb_en + +正确的分支跳转信息如下: +- br_to_btb:表示当前指令是否为分支预测器所覆盖的跳转指令,当前结构的分支预测器覆盖所有跳转指令。 +- br_taken:跳转方向 +- br_target:跳转目标 + +译码级根据以上信息,稍加分析并传递至分支预测器,传递信息包括: +- operate_en:分支预测器修正操作使能。注意该信号需要在ds_ready_go、es_allowin和ds_valid为1时置起且无例外。只有ds当拍允许流动至下一级时才能发出修正操作。对于ds_ready_go,因为流水线中指令寄存器的依赖有可能导致ds阻塞,阻塞时指令所得到的寄存器值是错误的,即译码得到的分支跳转信息也是错误的。而es_allowin的介入使其操作使能仅维持一拍,避免重复操作。 +- operate_pc:修正操作针对的分支指令的pc +- operate_index:修正操作针对的CAM表项 +- pop_ras:为jirl指令时置起 +- push_ras:为bl指令时置起 +- add_entry:当前指令为分支指令但预测器未进行预测时置起。这里与上了一个额外条件br_taken,因为当pc在分支预测器中未命中时,顺序指令,也算是预测为untaken。br_taken不为1时,并不需要在预测器中建项 +- delete_entry:当前指令不为分支指令但预测器进行预测时置起。这种情况出现的概率极低,只有在自修改代码中,可以不用考虑 +- pre_error:当前指令为分支指令且预测器进行预测,但跳转目标不一致时置起 +- pre_right:当前指令为分支指令且预测器进行预测,且跳转目标一致时置起 +- target_error:当前指令为分支指令且预测器进行预测,且跳转目标一致,但跳转目标不一致时置起 +- right_orien:正确的跳转方向 +- right_target:正确的跳转目标 + +分支预测器会根据以上信息进行修正,首先由pop_ras即是否为jirl指令区分当前操作的是BTB部分还是RAS部分,针对BTB部分,操作类型包括: +- 建项:add_entry置起时。使能指定项,并填入operate_pc和right_target,以及初始化btb_counter为2'b10。对于填入项即index的选择,若BTB CAM表中还留有未使能项,则选择其中一项。若所有项都有效则选择btb_counter为2'b00的一项,即大概率不跳转的预测项,因为未在btb中命中的pc即预测为不跳转,两者效果是相同的,只不过该pc若下一次为跳转,则会重新建项,相当于将其btb_counter由2'b00直接转为2'b10,很有可能导致下一次的预测出错。但是这种情况出现的概率肯定比替换掉其他btb_counter的值导致下一次预测错的概率低。若所有项都有效且btb_counter都不为2'b00,则随机选择一项。 +- 修正跳转目标:target_error置起时。重新填入right_target,并初始化btb_counter为2'b10。 +- 修正跳转方向:pre_error或者pre_right置起时。根据right_orien调整btb_counter,若正确的分支方向为taken则累加,若为untaken则递减。 + +针对RAS部分,操作类型包括: +- 建项:add_entry置起时。使能指定项,填入operate_pc即可。相当于预测pc的分支类型。index的选择同BTB部分。 +- 进栈:当push_ras置起且当前RAS非满时,存入当前pc的下一条指令,并将指针上移。即当前为bl函数跳转指令,其返回地址为bl的下一条指令。RAS指针指向的是空项。 +- 出栈:当pop_ras置起且当前RAS非空时,指针直接下移一项即可。 + +## 分支预测器与流水线交互逻辑 + +首先简单介绍取指逻辑,该部分内容会在后续逐步展开。来看几个关键信号,inst_valid指示当前取指pc是否有效,该信号直接送往icache等待接收。inst_valid主要看fs_allowin信号,即pfs指令允许向后流动时,其取指pc即为有效,能够避免相同pc取指请求的重复发出。nextpc即为取指pc,当前仅关注其最为常规的pc来源seq_pc,顺序取指pc。当inst_valid为1时,并不代表取指请求即刻便能发出,还需要等待icache空闲,由inst_addr_ok表示(取指请求的其他去向tlb、btb不需要等待)。当inst_valid && inst_addr_ok为1,取指请求发出,pfs_ready_go置起,pfs向fs流动。 +fetch_en和fetch_pc发送至分支预测器后,下一拍得到预测结果(btb_en/btb_ret_pc/btb_taken)。当btb_en && btb_taken为1时,fetch_btb_target置起,分支跳转,将nextpc纠正至btb_ret_pc。这段逻辑中有一点需要注意,分支预测器返回的结果仅维持一拍,但pfs并不一定能够向后流动,因此需要缓存分支预测器的返回结果,避免信息丢失。分支预测器的返回结果缓存在btb_lock_buffer中,由btb_lock_en指示缓存是否有效。缓存条件即为分支返回结果且pfs无法向后流动(btb_en && !pfs_ready_go),缓存释放条件为下一次取指重新发起。而nextpc的维护以及fs向ds传递分支预测结果时都将采用btb_ret_pc_t、btb_ret_pc_t、btb_ret_pc_t、btb_ret_pc_t信号,由分支预测器返回信息和缓存的信息相或得到,两者同一时刻仅有一个有效。 +译码级,根据译码和分支预测的结果,能够知道下一条指令取指的方向是否正确。取指级有两个方面的工作需要完成:修正分支预测的历史信息;若预测错误则需纠正取指方向。此处主要讲述第二方面的内容。若译码级检测到分支预测错误,则会置起btb_pre_error_flush信号,由该信号修正取指方向,该工作可继续细分为两个内容 +- 取消掉下一条进入译码级的指令,及错误预测导致错误取指的指令 +两种情况需要考虑: + - 当该分支指令向后流动的那一拍,即(btb_pre_error_flush && es_allowin)为1时,若下一拍下一条指令紧接着进入译码级,则可直接取消。不过可以用更粗犷的方法,即下一拍的ds_valid直接为0,无需识别是否有指令进入。 + - 同样的条件,若下一拍无指令进入,即当拍fs_to_ds_valid为0,则置起branch_slot_cancel触发器。该触发器为1时,会等待下一条指令进入,当检测fs_to_ds_valid为1时,将其取消,并恢复branch_slot_cancel至0。 +- 纠正nextpc。当译码级发现分支预测错误,会将正确的跳转目标(btb_pre_error_flush_target)和使能信号(btb_pre_error_flush)通过br_bus传递至取指阶段,修正nextpc。 +需要考虑两个问题: + - 当nextpc修正信息向前传递时,pfs并不一定处于能够取指的状态,例如inst_addr_ok不为1。此时若译码级不阻塞,且pfs不将修正信息存入buffer,会导致信息丢失。 + - 译码级会记录分支预测错误,并取消掉错误预测的分支指令的下一条指令。若pfs在取完预测错误的分支指令后始终处于阻塞状态,之后直接被修正至正确的跳转方向,则会导致正确的指令被取消掉。 + + 针对上述两个问题,可在pfs中构建一个状态机解决。br_target_inst_req_state表示状态。当发现预测错误后,根据流水线状态,进入不同的状态。 + - !fs_valid && !inst_addr_ok:预测错误分支指令取出后未进行任何取指,因为fs级为空,inst_addr_ok从未置起。且当前也不处于可取指的状态。进入br_target_inst_req_wait_slot状态。 + - !inst_addr_ok && fs_valid:已有一条错误取指的指令在fs中,但pfs并不处于能够取指的状态。进入br_target_inst_req_wait_br_target状态。 + - inst_addr_ok && !fs_valid:预测错误分支指令取出后未进行任何取指,当前处于可取指的状态,但当前的指令会在译码级取消。进入br_target_inst_req_wait_br_target状态。 + + br_target_inst_req_wait_slot状态会待取指请求发出后切换至br_target_inst_req_wait_br_target状态,该状态便会将nextpc修正至存储btb_pre_error_flush_target的pc buffer(br_target_inst_req_buffer)。当取指请求再次发出后,状态切换至空状态br_target_inst_req_empty。 + + 构建状态机后,还需要注意一个问题。也许pfs处于即刻能够发出取指请求的状态。可粗略的判断fs级是否有指令,便改变next_pc同时置起inst_valid,即使当前无法取指(inst_addr_ok为0)也没有关系。 + diff --git a/rtl/ip/open-la500/doc/前言.md b/rtl/ip/open-la500/doc/前言.md new file mode 100644 index 0000000..6e49d32 --- /dev/null +++ b/rtl/ip/open-la500/doc/前言.md @@ -0,0 +1,17 @@ +# 前言 +OpenLA500(齐物)是一款实现了`龙芯架构32位精简版指令集(LoongArch32 Reduced)`的处理器核。OpenLA500的架构为经典的单发射静态五级流水,配备两路组相连的指令/数据Cache,32项全相连的tlb实现虚实地址映射,以及BTB及RAS实现分支预测。基本按照国科大体系结构实验课程逐步设计得到。FPGA运行频率为50M。 + +OpenLA500经过全面验证,已处于稳定状态。并于2023年龙芯全流程平台项目中,在SMIC 180um工艺下流片。 + +以下将从8个方面介绍OpenLA500的设计细节。 + +- [设计概述](./设计概述.md):基于顶层框图,介绍各级流水的划分和各级流水之间的交互,以及流水线与其他模块的交互。 +- [分支预测](./分支预测.md):BTB及RAS两个分支预测器的具体设计,以及在流水线中的工作原理。 +- [流水线的发射部分]():流水线发射阶段(译码级)操作数准备、前递网络、阻塞控制的设计。 +- [流水线的执行部分]():alu、mul、div运算部件在流水线中的实现。 +- [MMU]():虚实地址映射逻辑,tlb维护。 +- [例外实现]():流水线中例外的判断及处理。 +- [访存子系统]():指令/数据Cache及AXI总线接口的实现。 +- [调试部分]():UART在线调试系统与OpenLA500的交互逻辑。 + + diff --git a/rtl/ip/open-la500/doc/设计概述.md b/rtl/ip/open-la500/doc/设计概述.md new file mode 100644 index 0000000..f93b5eb --- /dev/null +++ b/rtl/ip/open-la500/doc/设计概述.md @@ -0,0 +1,63 @@ +# 设计概述 +![系统框图](./picture/框图.svg) + +系统框图展示了OpenLA500处理器核的内部结构。指令的执行始终按照取指、译码、执行、访存、写回的顺序进行。各级流水会存储指令执行的中间状态,在完成当前阶段的操作后,将结果存入下一级流水,进行下一个阶段的操作。 + +## 执行流程 + +处理器核内维护`nextpc`信号,表示取指地址。待取指开始时,`fetch_pc`会发往`icache`、`tlb`、`btb`进行不同的工作,以及存入触发器。在下一拍即`fs_stage`取指级,`btb`完成分支预测,将结果直接送往`nextpc`,更改其取指方向。以及由`fetch_pc`以及`tlb`虚实地址翻译的结果,在`icache`指令缓存中得到`inst`指令码,并存入触发器。下一级`ds_stage`译码级在拿到指令码后,便交给`decoder`进行译码。译码后可以得到具体的操作码`op`,以及寄存器号,并可借此在`regfile`寄存器堆或者`csr`控制寄存器中索引到寄存器值`rf_data`。`es_stage`执行级在得到操作码及操作数后,便可送至`alu`运算部件进行简单运算,以及送往`div`除法部件、`mul`乘法部件进行多拍较复杂的运算。此外,由`alu`可以得到访存地址,并发至`tlb`及`dcache`数据缓存完成访存请求的处理,基本同`icache`。在`mem_stage`访存级,可得到访存、乘除法的运算结果,并由`op`选择最终的运算结果`final_res`,并存入触发器。`wb_stage`写回级便会将最终运算结果写回到`regfile`及`csr`。对于`i/dcache`,若取指/访存请求缺失,便会发送请求至`axi_bridge`并通过标准的`AXI3`总线协议与外界通信。 + +--- + +流水级的各阶段需要与其他不同的模块进行交互,确认其任务是否完成。以下针对流水级及各模块进行介绍: + +## 取指阶段 + +### `pfs` +该级流水的主要功能是维护`nextpc`,也就是流水线取指的虚地址。其实从更为严谨的角度来看`pfs`并不应该单独称为一级流水,因为`nextpc`为`wire`类型,或者说`pfs`在正常的执行流程中不会缓存信号,当拍便可获得取指方向。实际上`pfs`为各级能够影响取指地址的流水级的衍生。`nextpc`的维护逻辑可以说是五级流水中最为复杂的一部分,因为`icache`并不是时刻处于就绪的状态,由`inst_addr_ok`信号指示其是否就绪。因此,对于某些特殊情况下出现的转顺即逝的信息,比如流水线刷新等,需要构建状态机缓存信息。待取指方向确认,且`icache`就绪,`pfs`会置起`fetch_en`,紧接着`btb`、`icache`、`tlb`便会接收`pfs`发出的`fetch_pc`,开始相应的操作。 + +### `btb` +分支预测器,根据`PC`直接预测其跳转地址。32项`btb`组织为`CAM`表的形式,由`PC`查询。此外,还包括一个`ras`,组织为一个8项的栈,存储函数调用过程中的返回地址。`btb`分支预测的结果会在下一拍返回,若预测正确则可消除下一拍产生于`fs`级流水的空泡,预测错误不会造成任何性能损失。 + +### `icache` +指令缓存,两路组相连的结构。`fetch_pc`进入`icache`后,首先根据由`fetch_pc`拆解而来的`index`部分,索引出两路的`cache`行。其次再根据`tag`部分与`tlb`翻译得到的物理页号是否相等判断是否有命中项。若命中,下一拍返回`inst_rdata`,若未命中,则进入`icache`处理`miss`请求的状态机,`inst_addr_ok`拉低。等待`miss`请求处理完毕后再接收新的取指请求。替换策略为随机替换。 + +### `tlb` +组织为32项`CAM`表的形式,指令和数据共用,需要两个查询端口。通过`fetch_pc`的虚页号查询是否存在命中项,命中则返回物理页号。若未命中,则会标记该指令存在`tlb`缺失例外,并进入例外处理程序。待对应`tlb`项在页表中找到并由软件填入`tlb`后,重新执行该指令。 + +### `fs` +`fs`取值级便是真正意义上的第一级流水。`fs`级接收`icache`返回的指令码`inst_rdata`,由`inst_data_ok`指示指令码是否就绪。若`icache miss`,`fs`级便会阻塞。额外需要注意一点,`tlb`的读取有一拍的延迟,因为32项的CAM表会有较长的逻辑。因此`tlb`的读取结果是在`fs`级得到,也就表示`tlb`相关的例外判断是在`fs`级完成,而取指请求是在`pfs`级发出。所以`fs`级需要具备中止上一拍`pfs`级发往`icache`的取指请求的能力,体现在`tlb_excp_cancel_req`信号中,`dcache`同理。 + +## 译码阶段 + +### `ds` +译码级,其功能便是将指令码解析为对应的操作码,并根据寄存器号,从`regfile`中取出寄存器值。不过寄存器的最新值可能还未被写入到`regfile`中,因为后续流水线中的指令正在执行,结果未获得或者未写回,而当前指令可能依赖于这些指令的结果。因此译码级与后续流水线构建了前递路径(`es_to_ds_forward_bus/ms_to_ds_forward_bus`),用于前递未写回的结果,或者通知`ds`级结果未获取,需要阻塞。此外,经过译码,已知晓该指令是否为跳转指令,以及是否跳转。也就可以识别分支预测器的预测结果是否正确,`ds`级便可通过`br_bus`对取指方向进行修正,以及更新分支预测器的历史信息。`btb`的预测包括两个方面,该`PC`是否为跳转指令;识别为跳转指令时是否跳转。`ds`级需要鉴别并对分支预测器执行特定的更新操作。 + +## 执行阶段 + +### `es` +执行级,根据译码得到的操作码,送往`alu`、`mul`、`div`进行特定类型的运算。`alu`用于处理较简单的运算,比如加减、移位运算。`mul`为华莱士树实现的乘法部件,拆为两级。`div`为常规的迭代除法部件,需要34个周期得到结果。此外,若为访存指令,执行级便可通过加减运算得到访存地址。同`pfs`等待`dcache`准备就绪,即`data_addr_ok`置起,`es`便可发出`data_fetch`以及`data_addr`,由`tlb`进行虚实地址映射以及`dcache`取回数据。不过需要注意若当前指令或者后续流水线中的指令存在例外,需要及时中止`data_fetch`的置起。 + +## 访存阶段 + +### `dcache` +数据缓存,在`icache`的基础上新增了处理写请求的能力。每个`cache`行新增一个`dirty`位,用于标识该`cache`行是否为脏,在被替换时判断是否需要写回。此外,写请求在命中的情况下,相较于读请求,需要额外的一拍将数据写入到`ram`中。这额外一拍的延迟可以通过构建写请求状态机节省。待确认写请求命中后,进入状态机,使得`dcache`可以继续接收新的请求。不过需要注意规避读写请求同时出现在单端口的`ram`上。 +### `ms` +访存级,等待`dcache`数据返回,由`data_data_ok`指示`data_rdata`是否有效。`ms`级同`fs`级,需要由`tlb_excp_cancel_req`信号取消掉上一拍`es`发往`dcache`的访存请求。写请求不同于读请求需要等待接收数据,待请求发出后,不管命不命中,可继续向后流动。 + +## 写回阶段 + +### `ws` +写回级,此时指令已执行完毕,并得到`result`,需根据执行结果修改处理器状态,包括两个方面:写通用寄存器`regfile`以及状态寄存器`csr`;根据指令触发的例外类型,修改`csr`寄存器,以及清空流水线并调整取指方向至例外入口。 + +--- +## 流水级间交互 + +最理想的情况下,同一时刻五个阶段都处于工作的状态,也就表示同一时刻在处理五条指令。此时,处理器核在通过流水线切分得到较高频率时,带宽仍然保持为1指令/拍。但在实际情况下,如前文所述,并不会如此,各级流水总是会出现阻塞的情况。因此,流水级之间需要交互,避免一级流水的操作还未完成便被上一级覆盖。 + +流水级之间的交互逻辑中,需要维护以下关键信号: + +- `stage_valid`:由触发器维护,表示当前流水级是否在处理指令。 +- `stage_ready_go`:表示流水级是否需要被阻塞。 +- `stage_allowin`:表示当前流水级是否允许上一级流水进入,该信号传递至上一级,与上一级流水交互,两种情况下该信号置起,当前流水无正在处理的指令;或者当前流水级中的指令已处理完毕且下一级流水允许进入。该信号会由最后一级流水向前传递,只要某一流水级阻塞,其`stage_allowin`拉低,同一时刻,前面所有流水级的`stage_allowin`都会拉低(假设所有流水级中都有指令在处理)。 +- `stage_to_nextstage_valid`:表示当前流水级中是否有处理完毕的指令,该信号传递至下一级,与下一级流水交互。下一级流水在收到高电平信号时,且其下一级流水的`stage_allowin`为高电平,则会在下一拍置起下一级流水的`stage_valid`,实现流水级间指令的流动。`stage_to_nextstage_bus`总线信号中传递缓存信号,会随着`stage_to_nextstage_valid`流动。 diff --git a/rtl/ip/open-la500/exe_stage.v b/rtl/ip/open-la500/exe_stage.v new file mode 100644 index 0000000..e95171a --- /dev/null +++ b/rtl/ip/open-la500/exe_stage.v @@ -0,0 +1,439 @@ +`include "mycpu.h" +`include "csr.h" + +module exe_stage( + input clk , + input reset , + //allowin + input ms_allowin , + output es_allowin , + //from ds + input ds_to_es_valid , + input [`DS_TO_ES_BUS_WD -1:0] ds_to_es_bus , + //to ms + output es_to_ms_valid , + output [`ES_TO_MS_BUS_WD -1:0] es_to_ms_bus , + //to ds forward path + output [`ES_TO_DS_FORWARD_BUS -1:0] es_to_ds_forward_bus, + output es_to_ds_valid , + //div_mul + output es_div_enable , + output es_mul_div_sign , + output [31:0] es_rj_value , + output [31:0] es_rkd_value , + input div_complete , +`ifdef HAS_LACC + output es_lacc_req, + output [`LACC_OP_WIDTH-1:0] es_lacc_command, + input lacc_req_ready, + input lacc_data_valid, + input lacc_data_read, + input [31: 0] lacc_data_addr, + input [31: 0] lacc_data_wdata, + input [1: 0] lacc_data_size, + input lacc_rsp_valid, + input [31: 0] lacc_rsp_rdat, + output [6: 0] lacc_req_imm, + output lacc_flush, + input data_data_ok, + output lacc_drsp_valid, +`endif + //exception + input excp_flush , + input ertn_flush , + input refetch_flush , + input icacop_flush , + //idle + input idle_flush , + //tlb/cache ins + output tlb_inst_stall , + //cache ins + output icacop_op_en , + output dcacop_op_en , + output [ 1:0] cacop_op_mode , + //from icache + input icache_unbusy , + //preld ins + output [ 4:0] preld_hint , + output preld_en , + // data cache interface + output data_valid , + output data_op , + output [ 2:0] data_size , + output [ 3:0] data_wstrb , + output [31:0] data_wdata , + input data_addr_ok , + //from csr + input [18:0] csr_vppn , + //to addr trans + output [31:0] data_addr , + output data_fetch , + //from ms + input ms_wr_tlbehi , + input ms_flush +); + +reg es_valid ; +wire es_ready_go ; + +wire [31:0] error_va ; + +reg [`DS_TO_ES_BUS_WD -1:0] ds_to_es_bus_r; +wire [13:0] es_alu_op ; +wire es_src1_is_pc ; +wire es_src2_is_imm ; +wire es_src2_is_4 ; +wire es_gr_we ; +wire es_store_op ; +wire [ 4:0] es_dest ; +wire [31:0] es_imm ; +wire [31:0] es_pc ; +wire [ 3:0] es_mul_div_op ; +wire [ 1:0] es_mem_size ; +wire [31:0] es_csr_data ; +wire [13:0] es_csr_idx ; +wire [31:0] es_csr_result ; +wire [31:0] csr_mask_result; +wire es_res_from_csr; +wire es_csr_we ; +wire es_csr_mask ; +wire es_excp ; +wire excp ; +wire [ 8:0] es_excp_num ; +wire [ 9:0] excp_num ; +wire es_ertn ; +wire es_mul_enable ; +wire div_stall ; +wire es_ll_w ; +wire es_sc_w ; +wire es_tlbsrch ; +wire es_tlbwr ; +wire es_tlbfill ; +wire es_tlbrd ; +wire es_refetch ; +wire es_invtlb ; +wire [ 9:0] es_invtlb_asid ; +wire [18:0] es_invtlb_vpn ; +wire es_cacop ; +wire es_preld ; +wire es_br_inst ; +wire es_icache_miss ; +wire es_idle ; + +wire es_load_op ; + +wire dep_need_stall ; +wire forward_enable ; +wire dest_zero ; + +wire excp_ale ; + +wire es_flush_sign ; +wire [ 3:0] wr_byte_en ; + +wire access_mem ; +wire es_mem_sign_exted; +wire [ 1:0] sram_addr_low2bit; + +wire tlbsrch_stall ; + +wire [31:0] pv_addr ; + +wire [ 4:0] cacop_op ; + +wire dcache_req_or_inst_en; + +wire icacop_inst ; +wire icacop_inst_stall; +wire dcacop_inst ; +wire preld_inst ; + +wire es_br_pre_error ; +wire es_br_pre ; + +// difftest +wire [31:0] es_inst ; +wire [63:0] es_timer_64 ; +wire es_cnt_inst ; +wire [ 7:0] es_inst_ld_en ; +wire [ 7:0] es_inst_st_en ; +wire es_csr_rstat_en ; + +wire [2: 0] data_size_pre; +`ifdef HAS_LACC +wire lacc_stall; +wire [3: 0] lacc_data_mask, lacc_data_byte, lacc_data_half; +wire es_lacc_req_pre; +`endif + +assign { + `ifdef HAS_LACC + es_lacc_command, + es_lacc_req_pre, + `endif + es_csr_rstat_en , //349:349 for difftest + es_inst_st_en , //348:341 for difftest + es_inst_ld_en , //340:333 for difftst + es_cnt_inst , //332:332 for difftest + es_timer_64 , //331:268 for difftest + es_inst , //236:267 for difftest + es_idle , //235:235 + es_br_pre_error , //234:234 + es_br_pre , //233:233 + es_icache_miss , //232:232 + es_br_inst , //231:231 + es_preld , //230:230 + es_cacop , //229:229 + es_mem_sign_exted, //228:228 + es_invtlb , //227:227 + es_tlbrd , //226:226 + es_refetch , //225:225 + es_tlbfill , //224:224 + es_tlbwr , //223:223 + es_tlbsrch , //222:222 + es_sc_w , //221:221 + es_ll_w , //220:220 + es_excp_num , //219:211 + es_csr_mask , //210:210 + es_csr_we , //209:209 + es_csr_idx , //208:195 + es_res_from_csr , //194:194 + es_csr_data , //193:162 + es_ertn , //161:161 + es_excp , //160:160 + es_mem_size , //159:158 + es_mul_div_op , //157:154 + es_mul_div_sign , //153:153 + es_alu_op , //152:139 + es_load_op , //138:138 + es_src1_is_pc , //137:137 + es_src2_is_imm , //136:136 + es_src2_is_4 , //135:135 + es_gr_we , //134:134 + es_store_op , //133:133 + es_dest , //132:128 + es_imm , //127:96 + es_rj_value , //95 :64 + es_rkd_value , //63 :32 + es_pc //31 :0 + } = ds_to_es_bus_r; + +wire [31:0] es_alu_src1 ; +wire [31:0] es_alu_src2 ; +wire [31:0] es_alu_result ; +wire [31:0] exe_result ; + +assign es_to_ms_bus = {es_csr_data , //424:393 for difftest + es_csr_rstat_en , //392:392 for difftest + data_wdata , //391:360 for difftest + es_inst_st_en , //359:352 for difftest + data_addr , //351:320 for difftest + es_inst_ld_en , //319:312 for difftest + es_cnt_inst , //311:311 for difftest + es_timer_64 , //310:247 for difftest + es_inst , //246:215 for difftest + error_va , //214:183 + es_idle , //182:182 + es_cacop , //181:181 + preld_inst , //180:180 + es_br_pre_error , //179:179 + es_br_pre , //178:178 + es_icache_miss , //177:177 + es_br_inst , //176:176 + icacop_op_en , //175:175 + es_mem_sign_exted, //174:174 //only add this, not used. + es_invtlb_vpn , //173:155 + es_invtlb_asid , //154:145 + es_invtlb , //144:144 + es_tlbrd , //143:143 + es_refetch , //142:142 + es_tlbfill , //141:141 + es_tlbwr , //140:140 + es_tlbsrch , //139:139 + es_store_op , //138:138 + es_sc_w , //137:137 + es_ll_w , //136:136 + excp_num , //135:126 + es_csr_we , //125:125 + es_csr_idx , //124:111 + es_csr_result , //110:79 + es_ertn , //78:78 + excp , //77:77 + es_mem_size , //76:75 + es_mul_div_op , //74:71 + es_load_op , //70:70 + es_gr_we , //69:69 + es_dest , //68:64 + exe_result , //63:32 + es_pc //31:0 + }; + +assign es_to_ds_valid = es_valid; + +assign access_mem = es_load_op || es_store_op; + +assign es_flush_sign = excp_flush || ertn_flush || refetch_flush || icacop_flush || idle_flush; + +assign icacop_inst_stall = icacop_op_en && !icache_unbusy; + +assign es_ready_go = (!div_stall && + `ifdef HAS_LACC + !lacc_stall && + `endif +((dcache_req_or_inst_en && data_addr_ok) || !(access_mem || dcacop_inst || preld_inst)) && !tlbsrch_stall && !icacop_inst_stall) || excp; +assign es_allowin = !es_valid || es_ready_go && ms_allowin; +assign es_to_ms_valid = es_valid && es_ready_go; +always @(posedge clk) begin + if (reset || es_flush_sign) begin + es_valid <= 1'b0; + end + else if (es_allowin) begin + es_valid <= ds_to_es_valid; + end + + if (ds_to_es_valid && es_allowin) begin + ds_to_es_bus_r <= ds_to_es_bus; + end +end + +assign es_alu_src1 = es_src1_is_pc ? es_pc : es_rj_value; + +assign es_alu_src2 = (es_src2_is_imm) ? es_imm : + (es_src2_is_4) ? 32'd4 : es_rkd_value; + +assign es_div_enable = (es_mul_div_op[2] | es_mul_div_op[3]) & es_valid; +assign es_mul_enable = es_mul_div_op[0] | es_mul_div_op[1]; + +assign div_stall = es_div_enable & ~div_complete; + +`ifdef HAS_LACC +assign lacc_stall = es_lacc_req & ~lacc_rsp_valid; +assign es_lacc_req = es_lacc_req_pre & es_valid; +assign lacc_req_imm = es_imm[11: 5]; +assign lacc_drsp_valid = es_lacc_req & data_data_ok; +`endif + +alu u_alu( + .alu_op (es_alu_op ), + .alu_src1 (es_alu_src1 ), //bug3 es_alu_src2 + .alu_src2 (es_alu_src2 ), + .alu_result (es_alu_result) + ); + +assign exe_result = `ifdef HAS_LACC + es_lacc_req ? lacc_rsp_rdat : + `endif + es_res_from_csr ? es_csr_data : es_alu_result; + +//forward path +assign dest_zero = (es_dest == 5'b0); +assign forward_enable = es_gr_we & ~dest_zero & es_valid; +assign dep_need_stall = es_load_op | es_div_enable | es_mul_enable; +assign es_to_ds_forward_bus = {dep_need_stall , //38:38 + forward_enable , //37:37 + es_dest , //36:32 + exe_result //31:0 + }; + +assign tlb_inst_stall = (es_tlbsrch || es_tlbrd) && es_valid; + +//csr mask +assign csr_mask_result = (es_rj_value & es_rkd_value) | (~es_rj_value & es_csr_data); +assign es_csr_result = es_csr_mask ? csr_mask_result : es_rkd_value; + +assign error_va = pv_addr; + +//exception +assign excp_ale = access_mem & ((es_mem_size[0] & 1'b0) | + (es_mem_size[1] & es_alu_result[0]) | + (!es_mem_size & (es_alu_result[0] | es_alu_result[1]))) ; + +assign excp = es_excp || excp_ale; +assign excp_num = {excp_ale, es_excp_num}; + +assign sram_addr_low2bit = {es_alu_result[1], es_alu_result[0]}; + +//mem_size[0] byte size [1] halfword size +assign dcache_req_or_inst_en = es_valid && !excp && ms_allowin && !es_flush_sign && !ms_flush; +`ifdef HAS_LACC +assign data_valid = access_mem && dcache_req_or_inst_en || lacc_data_valid; +assign data_op = lacc_data_valid ? !lacc_data_read : + es_store_op && !es_cacop && !es_preld; +decoder_2_4 decoder_lacc_size (lacc_data_addr[1: 0], lacc_data_byte); +assign lacc_data_half[0] = ~(|lacc_data_addr); +assign lacc_data_half[1] = ~lacc_data_addr[1]; +assign lacc_data_half[2] = ^lacc_data_addr; +assign lacc_data_half[3] = lacc_data_addr[1]; +assign lacc_data_mask = lacc_data_size == 2'b00 ? lacc_data_byte : + lacc_data_size == 2'b01 ? lacc_data_half : 4'b1111; +assign data_wstrb = lacc_data_valid ? lacc_data_mask : wr_byte_en; +assign data_size = lacc_data_valid ? lacc_data_size : data_size_pre; +assign data_addr = lacc_data_valid ? lacc_data_addr : + es_tlbsrch ? {csr_vppn, 13'b0} : pv_addr; +`else +assign data_valid = access_mem && dcache_req_or_inst_en; +assign data_op = es_store_op && !es_cacop && !es_preld; +assign data_wstrb = wr_byte_en; +assign data_size = data_size_pre; +assign data_addr = es_tlbsrch ? {csr_vppn, 13'b0} : pv_addr; +`endif + +wire [3:0] es_stb_wen = { sram_addr_low2bit==2'b11 , + sram_addr_low2bit==2'b10 , + sram_addr_low2bit==2'b01 , + sram_addr_low2bit==2'b00} ; + +wire [3:0] es_sth_wen = { sram_addr_low2bit==2'b10 , + sram_addr_low2bit==2'b10 , + sram_addr_low2bit==2'b00 , + sram_addr_low2bit==2'b00} ; + +wire [31:0] es_stb_cont = { {8{es_stb_wen[3]}} & es_rkd_value[7:0] , + {8{es_stb_wen[2]}} & es_rkd_value[7:0] , + {8{es_stb_wen[1]}} & es_rkd_value[7:0] , + {8{es_stb_wen[0]}} & es_rkd_value[7:0]}; + +wire [31:0] es_sth_cont = { {16{es_sth_wen[3]}} & es_rkd_value[15:0] , + {16{es_sth_wen[0]}} & es_rkd_value[15:0]}; + +assign {wr_byte_en, data_size_pre} = ({7{es_mem_size[0]}} & {es_stb_wen, 3'b00}) | + ({7{es_mem_size[1]}} & {es_sth_wen, 3'b01}) | + ({7{!es_mem_size }} & {4'b1111 , 3'b10}) ; + +//assign data_wdata = es_rkd_value; +assign data_wdata = + `ifdef HAS_LACC + lacc_data_valid ? lacc_data_wdata : + `endif + ({32{es_mem_size[0]}} & es_stb_cont ) | + ({32{es_mem_size[1]}} & es_sth_cont ) | + ({32{!es_mem_size }} & es_rkd_value) ; + +assign tlbsrch_stall = es_tlbsrch && ms_wr_tlbehi; + +//invtlb +assign es_invtlb_asid = es_rj_value[9:0]; +assign es_invtlb_vpn = es_rkd_value[31:13]; + +assign pv_addr = es_alu_result; + +//cache ins +assign cacop_op = es_dest; +assign icacop_inst = es_cacop && (cacop_op[2:0] == 3'b0); +assign icacop_op_en = icacop_inst && dcache_req_or_inst_en; +assign dcacop_inst = es_cacop && (cacop_op[2:0] == 3'b1); +assign dcacop_op_en = dcacop_inst && dcache_req_or_inst_en; +assign cacop_op_mode = cacop_op[4:3]; + +//preld ins +assign preld_hint = es_dest; +assign preld_inst = es_preld && ((preld_hint == 5'd0) || (preld_hint == 5'd8))/* && !data_uncache_en*/; //preld must have bug +assign preld_en = preld_inst && dcache_req_or_inst_en; + +assign data_fetch = (data_valid || dcacop_inst || preld_en) && data_addr_ok || ((icacop_inst || es_tlbsrch) && es_ready_go && ms_allowin) + `ifdef HAS_LACC + || lacc_data_valid + `endif +; + +endmodule diff --git a/rtl/ip/open-la500/icache.v b/rtl/ip/open-la500/icache.v new file mode 100644 index 0000000..5f641ae --- /dev/null +++ b/rtl/ip/open-la500/icache.v @@ -0,0 +1,410 @@ +module icache +( + input clk , + input reset , + //to from cpu + input valid , + input op , + input [ 7:0] index , + input [19:0] tag , + input [ 3:0] offset , + input [ 3:0] wstrb , + input [31:0] wdata , + output addr_ok , + output data_ok , + output [31:0] rdata , + input uncache_en , + input icacop_op_en , + input [ 1:0] cacop_op_mode , + input [ 7:0] cacop_op_addr_index , //this signal from mem stage's va + input [19:0] cacop_op_addr_tag , + input [ 3:0] cacop_op_addr_offset, + output icache_unbusy, + input tlb_excp_cancel_req, + //to from axi + output rd_req , + output [ 2:0] rd_type , + output [31:0] rd_addr , + input rd_rdy , + input ret_valid , + input ret_last , + input [31:0] ret_data , + output reg wr_req , + output [ 2:0] wr_type , + output [31:0] wr_addr , + output [ 3:0] wr_wstrb , + output [127:0] wr_data , + input wr_rdy , + //to perf_counter + output cache_miss +); + +reg request_buffer_op ; +reg [ 7:0] request_buffer_index ; +reg [19:0] request_buffer_tag ; +reg [ 3:0] request_buffer_offset ; +reg [ 3:0] request_buffer_wstrb ; +reg [31:0] request_buffer_wdata ; +reg request_buffer_uncache_en ; +reg request_buffer_icacop ; +reg [ 1:0] request_buffer_cacop_op_mode; + +reg [ 1:0] miss_buffer_replace_way ; +reg [ 1:0] miss_buffer_ret_num ; +wire [ 1:0] ret_num_add_one ; + +wire [ 7:0] way_bank_addra [1:0][3:0]; +wire [31:0] way_bank_dina [1:0][3:0]; +wire [31:0] way_bank_douta [1:0][3:0]; +wire way_bank_ena [1:0][3:0]; +wire [ 3:0] way_bank_wea [1:0][3:0]; + +wire [ 7:0] way_tagv_addra [1:0]; +wire [20:0] way_tagv_dina [1:0]; +wire [20:0] way_tagv_douta [1:0]; +wire way_tagv_ena [1:0]; +wire way_tagv_wea [1:0]; + +wire [ 1:0] way_hit ; +wire cache_hit ; + +wire [ 31:0] way_load_word [1:0]; +wire [127:0] way_data [1:0]; +wire [31:0] load_res ; + +wire main_idle2lookup ; +wire main_lookup2lookup; + +wire main_state_is_idle ; +wire main_state_is_lookup ; +wire main_state_is_replace; +wire main_state_is_refill ; + +wire [1:0] way_wr_en; + +wire [31:0] refill_data; + +wire cacop_op_mode0; +wire cacop_op_mode1; +wire cacop_op_mode2; + +wire [1:0] random_val; +wire [3:0] chosen_way; +wire [1:0] replace_way; +wire [1:0] invalid_way; +wire has_invalid_way; +wire [1:0] rand_repl_way; +wire [3:0] cacop_chose_way; +wire cacop_op_mode2_hit_wr; +wire cacop_op_mode2_no_hit; + +reg [ 1:0] lookup_way_hit_buffer; + +wire [ 3:0] real_offset; +wire [19:0] real_tag ; +wire [ 7:0] real_index ; + +wire req_or_inst_valid ; + +localparam main_idle = 5'b00001; +localparam main_lookup = 5'b00010; +localparam main_replace = 5'b01000; +localparam main_refill = 5'b10000; +localparam write_buffer_idle = 1'b0; +localparam write_buffer_write = 1'b1; + +reg [4:0] main_state; + +reg rd_req_buffer; + +genvar i,j; + +//state machine +//main loop +always @(posedge clk) begin + if (reset) begin + main_state <= main_idle; + + request_buffer_op <= 1'b0; + request_buffer_index <= 8'b0; + request_buffer_tag <= 20'b0; + request_buffer_offset <= 4'b0; + request_buffer_wstrb <= 4'b0; + request_buffer_wdata <= 32'b0; + request_buffer_uncache_en <= 1'b0; + + request_buffer_cacop_op_mode <= 2'b0; + request_buffer_icacop <= 1'b0; + + miss_buffer_replace_way <= 2'b0; + + wr_req <= 1'b0; + end + else case (main_state) + main_idle: begin + if (req_or_inst_valid && main_idle2lookup) begin + main_state <= main_lookup; + + request_buffer_op <= op ; + request_buffer_index <= real_index ; + request_buffer_offset <= real_offset; + request_buffer_wstrb <= wstrb; + request_buffer_wdata <= wdata; + + request_buffer_cacop_op_mode <= cacop_op_mode; + request_buffer_icacop <= icacop_op_en ; + end + end + main_lookup: begin + if (req_or_inst_valid && main_lookup2lookup) begin + main_state <= main_lookup; + + request_buffer_op <= op ; + request_buffer_index <= real_index ; + request_buffer_offset <= real_offset; + request_buffer_wstrb <= wstrb; + request_buffer_wdata <= wdata; + + request_buffer_cacop_op_mode <= cacop_op_mode; + request_buffer_icacop <= icacop_op_en ; + end + else if (tlb_excp_cancel_req) begin + main_state <= main_idle; + end + else if (!cache_hit) begin + main_state <= main_replace; + + request_buffer_tag <= real_tag; + request_buffer_uncache_en <= (uncache_en && !request_buffer_icacop); + miss_buffer_replace_way <= replace_way; + end + else begin + main_state <= main_idle; + end + end + main_replace: begin + if (rd_rdy) begin + main_state <= main_refill; + miss_buffer_ret_num <= 2'b0; //when get ret data, it will be sent to cpu directly. + end + end + main_refill: begin + if ((ret_valid && ret_last) || !rd_req_buffer) begin //when rd_req is not set, go to next state directly + main_state <= main_idle; + end + else begin + if (ret_valid) begin + miss_buffer_ret_num <= ret_num_add_one; + end + end + end + default: begin + main_state <= main_idle; + end + endcase +end + +assign real_offset = icacop_op_en ? cacop_op_addr_offset : offset; +assign real_index = icacop_op_en ? cacop_op_addr_index : index ; + +assign real_tag = request_buffer_icacop ? cacop_op_addr_tag : tag ; + +/*====================================main state idle=======================================*/ + +assign req_or_inst_valid = valid || icacop_op_en; + +assign main_idle2lookup = 1'b1; + +assign icache_unbusy = main_state_is_idle; + +//addr_ok logic + +/*===================================main state lookup======================================*/ + +//tag compare +generate for(i=0;i<2;i=i+1) begin:gen_way_hit + assign way_hit[i] = way_tagv_douta[i][0] && (real_tag == way_tagv_douta[i][20:1]); //this signal will not maintain +end endgenerate +assign cache_hit = |way_hit && !(uncache_en || cacop_op_mode0 || cacop_op_mode1 || cacop_op_mode2); //uncache road reuse +//when cache inst op mode2 no hit, main state machine will still go a round. implement easy. + +assign main_lookup2lookup = cache_hit; + +assign addr_ok = ((main_state_is_idle && main_idle2lookup) || (main_state_is_lookup && main_lookup2lookup)) && !icacop_op_en; //request can be get + +//data select +generate for(i=0;i<2;i=i+1) begin: gen_data + assign way_data[i] = {way_bank_douta[i][3],way_bank_douta[i][2],way_bank_douta[i][1],way_bank_douta[i][0]}; + + assign way_load_word[i] = way_data[i][request_buffer_offset[3:2]*32 +: 32]; +end endgenerate + +assign load_res = {32{way_hit[0]}} & way_load_word[0] | + {32{way_hit[1]}} & way_load_word[1] ; + +//data_ok logic + +/*====================================main state miss=======================================*/ + +decoder_2_4 dec_rand_way (.in({1'b0,random_val[0]}),.out(chosen_way)); + +one_valid_n #(2) sel_one_invalid (.in(~{way_tagv_douta[1][0],way_tagv_douta[0][0]}),.out(invalid_way),.nozero(has_invalid_way)); + +assign rand_repl_way = has_invalid_way ? invalid_way : chosen_way[1:0]; //chose invalid way first. + +decoder_2_4 dec_cacop_way (.in({1'b0,request_buffer_offset[0]}),.out(cacop_chose_way)); + +assign replace_way = {2{cacop_op_mode0 || cacop_op_mode1}} & cacop_chose_way[1:0] | + {2{cacop_op_mode2}} & way_hit | + {2{!request_buffer_icacop}} & rand_repl_way; + +/*==================================main state replace======================================*/ + +assign rd_req = main_state_is_replace && !(cacop_op_mode0 || cacop_op_mode1 || cacop_op_mode2); + +/*===================================main state refill======================================*/ + +assign rd_type = request_buffer_uncache_en ? 3'b10 : 3'b100; +assign rd_addr = request_buffer_uncache_en ? {request_buffer_tag, request_buffer_index, request_buffer_offset} : {request_buffer_tag, request_buffer_index, 4'b0}; + +//write process will not block pipeline +assign data_ok = (main_state_is_lookup && (cache_hit || tlb_excp_cancel_req)) || + (main_state_is_refill && ((ret_valid && ((miss_buffer_ret_num == request_buffer_offset[3:2]) || request_buffer_uncache_en))/* || !rd_req_buffer*/)) && + !request_buffer_icacop; //when rd_req is not set, set data_ok directly. +//rdate connect with ret_data dirctly. maintain one clock only + +assign refill_data = ret_data; + +assign way_wr_en = miss_buffer_replace_way & {2{ret_valid}}; //when rd_req is not set, ret_valid and ret_last will not be set. block will not be wr also. + +assign cache_miss = main_state_is_refill && ret_last && !(request_buffer_uncache_en || request_buffer_icacop); + +//add one +assign ret_num_add_one[0] = miss_buffer_ret_num[0] ^ 1'b1; +assign ret_num_add_one[1] = miss_buffer_ret_num[1] ^ miss_buffer_ret_num[0]; + +always @(posedge clk) begin + if (reset) begin + rd_req_buffer <= 1'b0; + end + else if (rd_req) begin + rd_req_buffer <= 1'b1; + end + else if (main_state_is_refill && (ret_valid && ret_last)) begin + rd_req_buffer <= 1'b0; + end +end + +/*==========================================================================================*/ + +//cache ins control signal +assign cacop_op_mode0 = request_buffer_icacop && (request_buffer_cacop_op_mode == 2'b00); +assign cacop_op_mode1 = request_buffer_icacop && ((request_buffer_cacop_op_mode == 2'b01) || (request_buffer_cacop_op_mode == 2'b11)); +assign cacop_op_mode2 = request_buffer_icacop && (request_buffer_cacop_op_mode == 2'b10); + +assign cacop_op_mode2_hit_wr = cacop_op_mode2 && |lookup_way_hit_buffer; +assign cacop_op_mode2_no_hit = cacop_op_mode2 && ~|lookup_way_hit_buffer; + +always @(posedge clk) begin + if (reset) begin + lookup_way_hit_buffer <= 2'b0; + end + else if (cacop_op_mode2 && main_state_is_lookup) begin + lookup_way_hit_buffer <= way_hit; + end +end + +//output +assign rdata = {32{main_state_is_lookup}} & load_res | + {32{main_state_is_refill}} & ret_data ; + +generate +for(i=0;i<2;i=i+1) begin:gen_data_way + for(j=0;j<4;j=j+1) begin:gen_data_bank +/*===============================bank addra logic==============================*/ + + assign way_bank_addra[i][j] = {8{addr_ok}} & real_index | /*lookup*/ + {8{!addr_ok}} & request_buffer_index ; + +/*===============================bank we logic=================================*/ + + assign way_bank_wea[i][j] = {4{main_state_is_refill && + (way_wr_en[i] && (miss_buffer_ret_num == j[1:0]))}} & 4'hf; + +/*===============================bank dina logic=================================*/ + + assign way_bank_dina[i][j] = {32{main_state_is_refill}} & refill_data; + +/*===============================bank ena logic=================================*/ + + assign way_bank_ena[i][j] = (!(request_buffer_uncache_en || cacop_op_mode0)) || main_state_is_idle || main_state_is_lookup; + end +end +endgenerate + +generate +for(i=0;i<2;i=i+1) begin:gen_tagv_way +/*===============================tagv addra logic=================================*/ + + assign way_tagv_addra[i] = {8{addr_ok || (icacop_op_en && + (main_state_is_idle || main_state_is_lookup))}} & real_index | + {8{main_state_is_replace || main_state_is_refill}} & request_buffer_index ; + //{8{(main_state_is_miss && wr_rdy) || + +/*===============================tagv ena logic=================================*/ + + assign way_tagv_ena[i] = (!request_buffer_uncache_en) || main_state_is_idle || main_state_is_lookup; + +/*===============================tagv wea logic=================================*/ + + assign way_tagv_wea[i] = miss_buffer_replace_way[i] && main_state_is_refill && + ((ret_valid && ret_last) || cacop_op_mode0 || cacop_op_mode1 || cacop_op_mode2_hit_wr); //wirte at last 4B + +/*===============================tagv dina logic=================================*/ + + assign way_tagv_dina[i] = (cacop_op_mode0 || cacop_op_mode1 || cacop_op_mode2_hit_wr) ? 21'b0 : {request_buffer_tag, 1'b1}; +end +endgenerate +/*==============================================================================*/ + +generate +for(i=0;i<2;i=i+1) begin:data_ram_way + for(j=0;j<4;j=j+1) begin:data_ram_bank + data_bank_sram u( + .addra (way_bank_addra[i][j]) , + .clka (clk ) , + .dina (way_bank_dina[i][j] ) , + .douta (way_bank_douta[i][j]) , + .ena (way_bank_ena[i][j] ) , + .wea (way_bank_wea[i][j] ) + ); + end +end +endgenerate + +generate +for(i=0;i<2;i=i+1) begin:tagv_ram_way + //[20:1] tag [0:0] v + tagv_sram u( + .addra (way_tagv_addra[i]) , + .clka (clk ) , + .dina (way_tagv_dina[i] ) , + .douta (way_tagv_douta[i]) , + .ena (way_tagv_ena[i] ) , + .wea (way_tagv_wea[i] ) + ); +end +endgenerate + +lfsr lfsr( + .clk (clk ) , + .reset (reset ) , + .random_val (random_val ) +); + +assign main_state_is_idle = main_state == main_idle ; +assign main_state_is_lookup = main_state == main_lookup ; +assign main_state_is_replace = main_state == main_replace; +assign main_state_is_refill = main_state == main_refill ; + +endmodule diff --git a/rtl/ip/open-la500/id_stage.v b/rtl/ip/open-la500/id_stage.v new file mode 100644 index 0000000..93bb028 --- /dev/null +++ b/rtl/ip/open-la500/id_stage.v @@ -0,0 +1,1005 @@ +`include "mycpu.h" + +module id_stage( + input clk , + input reset , + //allowin + input es_allowin , + output ds_allowin , + //from fs + input fs_to_ds_valid, + input [`FS_TO_DS_BUS_WD -1:0] fs_to_ds_bus , + //from es forward path + input [`ES_TO_DS_FORWARD_BUS -1:0] es_to_ds_forward_bus, + input [`MS_TO_DS_FORWARD_BUS -1:0] ms_to_ds_forward_bus, + //to es + output ds_to_es_valid, + output [`DS_TO_ES_BUS_WD -1:0] ds_to_es_bus , + //to fs + output [`BR_BUS_WD -1:0] br_bus , + //exception + input excp_flush , + input ertn_flush , + input refetch_flush , + input icacop_flush , + //idle + input idle_flush , + //tlb ins + input es_tlb_inst_stall, + input ms_tlb_inst_stall, + input ws_tlb_inst_stall, + //interrupt + input has_int , + //csr + output [13:0] rd_csr_addr , + input [31:0] rd_csr_data , + input [ 1:0] csr_plv , + //timer 64 + input [63:0] timer_64 , + input [31:0] csr_tid , + //llbit + input ds_llbit , + //every stage valid sign + input es_to_ds_valid, + input ms_to_ds_valid, + input ws_to_ds_valid, + //from axi + input write_buffer_empty, + //from dcache + input dcache_empty , + //to btb + output btb_operate_en , + output btb_pop_ras , + output btb_push_ras , + output btb_add_entry , + output btb_delete_entry , + output btb_pre_error , + output btb_pre_right , + output btb_target_error , + output btb_right_orien , + output [31:0] btb_right_target , + output [31:0] btb_operate_pc , + output [ 4:0] btb_operate_index , + + //debug + input infor_flag, + input [ 4:0] reg_num, + output [31:0] debug_rf_rdata1, + + //to rf: for write back + input [`WS_TO_RF_BUS_WD -1:0] ws_to_rf_bus + `ifdef DIFFTEST_EN + , + // difftest + output [31:0] rf_to_diff [31:0] + `endif +); + +reg ds_valid ; +wire ds_ready_go; + +reg [`FS_TO_DS_BUS_WD -1:0] fs_to_ds_bus_r; + +wire [31:0] ds_inst; +wire [31:0] ds_pc ; +wire [ 3:0] ds_excp_num; +wire ds_excp; +wire ds_icache_miss; +wire ds_btb_taken; +wire ds_btb_en; +wire [ 4:0] ds_btb_index; +wire [31:0] ds_btb_target; + +assign {ds_btb_target, //108:77 + ds_btb_index, //76:72 + ds_btb_taken, //71:71 + ds_btb_en, //70:70 + ds_icache_miss, //69:69 + ds_excp, //68:68 + ds_excp_num, //67:64 + ds_inst, //63:32 + ds_pc //31:0 + } = fs_to_ds_bus_r; + +wire rf_we ; +wire [ 4:0] rf_waddr; +wire [31:0] rf_wdata; +assign {rf_we , //37:37 + rf_waddr, //36:32 + rf_wdata //31:0 + } = ws_to_rf_bus; + +//wire idle_stall; +wire br_taken; +wire [31:0] br_target; +wire btb_pre_error_flush; +wire [31:0] btb_pre_error_flush_target; + +//wire jirl_br; +wire [13:0] alu_op; +wire [ 3:0] mul_div_op; +wire mul_div_sign; +wire src1_is_pc; +wire src2_is_imm; +wire src2_is_4; +wire load_op; +wire res_from_csr; +wire csr_mask; +wire mem_b_size; +wire mem_h_size; +wire mem_sign_exted; +wire dst_is_r1; +wire dst_is_rj; +wire gr_we; +wire store_op; +wire csr_we; +wire src_reg_is_rd; +wire [1: 0] mem_size; +wire [4: 0] dest; +wire [31:0] rj_value; +wire [31:0] rkd_value; +wire [31:0] ds_imm; + +wire [ 5:0] op_31_26; +wire [ 3:0] op_25_22; +wire [ 1:0] op_21_20; +wire [ 4:0] op_19_15; +wire [ 4:0] rd; +wire [ 4:0] rj; +wire [ 4:0] rk; +wire [11:0] i12; +wire [13:0] i14; +wire [19:0] i20; +wire [15:0] i16; +wire [25:0] i26; +wire [13:0] csr_idx; + +wire [63:0] op_31_26_d; +wire [15:0] op_25_22_d; +wire [ 3:0] op_21_20_d; +wire [31:0] op_19_15_d; +wire [31:0] rd_d; +wire [31:0] rj_d; +wire [31:0] rk_d; + +wire inst_add_w; +wire inst_sub_w; +wire inst_slt; +wire inst_sltu; +wire inst_nor; +wire inst_and; +wire inst_or; +wire inst_xor; +wire inst_lu12i_w; +wire inst_addi_w; +wire inst_slti; +wire inst_sltui; +wire inst_pcaddi; +wire inst_pcaddu12i; +wire inst_andn; +wire inst_orn; +wire inst_andi; +wire inst_ori; +wire inst_xori; +wire inst_mul_w; +wire inst_mulh_w; +wire inst_mulh_wu; +wire inst_div_w; +wire inst_mod_w; +wire inst_div_wu; +wire inst_mod_wu; + +wire inst_slli_w; +wire inst_srli_w; +wire inst_srai_w; +wire inst_sll_w; +wire inst_srl_w; +wire inst_sra_w; + +wire inst_jirl; +wire inst_b; +wire inst_bl; +wire inst_beq; +wire inst_bne; +wire inst_blt; +wire inst_bge; +wire inst_bltu; +wire inst_bgeu; + +wire inst_ll_w; +wire inst_sc_w; +wire inst_ld_b; +wire inst_ld_bu; +wire inst_ld_h; +wire inst_ld_hu; +wire inst_ld_w; +wire inst_st_b; +wire inst_st_h; +wire inst_st_w; + +wire inst_syscall; +wire inst_break; +wire inst_csrrd; +wire inst_csrwr; +wire inst_csrxchg; +wire inst_ertn; +wire inst_cpucfg; + +wire inst_rdcntid_w; +wire inst_rdcntvl_w; +wire inst_rdcntvh_w; +wire inst_idle; + +wire inst_tlbsrch; +wire inst_tlbrd; +wire inst_tlbwr; +wire inst_tlbfill; +wire inst_invtlb; + +wire inst_cacop; +wire inst_valid_cacop; +wire inst_preld; +wire inst_dbar; +wire inst_ibar; + +wire inst_nop; + +`ifdef HAS_LACC +// inst[31: 26] = 6'h30 +// inst[25: 22] = op +// rk rj rd +wire lacc_req, lacc_valid; +`endif + +wire need_ui5; +wire need_si12; +wire need_ui12; +wire need_si14_pc; +wire need_si16_pc; +wire need_si20; +wire need_si20_pc; +wire need_si26_pc; + +wire [ 4:0] rf_raddr1; +wire [31:0] rf_rdata1; +wire [ 4:0] rf_raddr2; +wire [31:0] rf_rdata2; + +wire pipeline_no_empty; +wire dbar_stall; +wire ibar_stall; + +wire rj_eq_rd; +wire rj_lt_rd_sign; +wire rj_lt_rd_unsign; + +wire ms_forward_enable; +wire [ 4:0] ms_forward_reg; +wire [31:0] ms_forward_data; +wire ms_dep_need_stall; +wire es_dep_need_stall; +wire es_forward_enable; +wire [ 4:0] es_forward_reg; +wire [31:0] es_forward_data; +wire rf1_forward_stall; +wire rf2_forward_stall; + +wire excp; +wire [ 8:0] excp_num; +wire inst_valid; +wire excp_ine; +wire excp_ipe; +wire [31:0] csr_data; +wire refetch; +wire flush_sign; + +wire fs_excp; + +wire kernel_inst; + +wire [31:0] rdcnt_result; +wire rdcnt_en; + +reg branch_slot_cancel; + +wire tlb_inst_stall; + +wire br_inst; + +reg br_jirl; + +wire br_need_reg_data; +wire br_to_btb; + +wire inst_need_rj; +wire inst_need_rkd; + +wire [31:0] rj_value_forward_es; +wire [31:0] rkd_value_forward_es; + +// difftest +wire [7:0] inst_ld_en; +wire [7:0] inst_st_en; +wire inst_csr_rstat_en; + +assign br_bus = {btb_pre_error_flush, //32:32 + btb_pre_error_flush_target //31:0 + }; + +assign ds_to_es_bus = { + `ifdef HAS_LACC + ds_inst[22 +: `LACC_OP_WIDTH], + lacc_req, + `endif + inst_csr_rstat_en, // 349:349 for difftest + inst_st_en , // 348:341 for difftest + inst_ld_en , // 340:333 for difftest + (inst_rdcntvl_w | inst_rdcntvh_w | inst_rdcntid_w), //332:332 for difftest + timer_64 , //331:268 for difftest + ds_inst , //267:236 for difftest + inst_idle , //235:235 + btb_pre_error_flush, //234:234 + br_to_btb , //233:233 + ds_icache_miss, //232:232 + br_inst , //231:231 + inst_preld , //230:230 + inst_valid_cacop, //229:229 + mem_sign_exted, //228:228 + inst_invtlb , //227:227 + inst_tlbrd , //226:226 + refetch , //225:225 + inst_tlbfill , //224:224 + inst_tlbwr , //223:223 + inst_tlbsrch , //222:222 + inst_sc_w , //221:221 + inst_ll_w , //220:220 + excp_num , //219:211 + csr_mask , //210:210 + csr_we , //209:209 + csr_idx , //208:195 + res_from_csr , //194:194 + csr_data , //193:162 + inst_ertn , //161:161 + excp , //160:160 + mem_size , //159:158 + mul_div_op , //157:154 + mul_div_sign , //153:153 + alu_op , //152:139 + load_op , //138:138 bug2 load_op + src1_is_pc , //137:137 + src2_is_imm , //136:136 + src2_is_4 , //135:135 + gr_we , //134:134 + store_op , //133:133 + dest , //132:128 + ds_imm , //127:96 + rj_value , //95 :64 + rkd_value , //63 :32 + ds_pc //31 :0 + }; + +assign flush_sign = excp_flush || ertn_flush || refetch_flush || icacop_flush || idle_flush; + +assign fs_excp = fs_to_ds_bus[68]; + +//wait inst will stall at ds. +assign ds_ready_go = !(rf2_forward_stall || rf1_forward_stall/*|| idle_stall*/ || tlb_inst_stall || ibar_stall || dbar_stall) || excp; +assign ds_allowin = !ds_valid || ds_ready_go && es_allowin; +assign ds_to_es_valid = ds_valid && ds_ready_go; +always @(posedge clk) begin //bug1 no reset; branch no delay slot + if (reset || flush_sign) begin + ds_valid <= 1'b0; + end + else begin + if (ds_allowin) begin //bug2 ?? + if ((btb_pre_error_flush && es_allowin) || branch_slot_cancel) begin + ds_valid <= 1'b0; + end + else begin + ds_valid <= fs_to_ds_valid; + end + end + end + + if (fs_to_ds_valid && ds_allowin) begin + fs_to_ds_bus_r <= fs_to_ds_bus; + end +end + +assign op_31_26 = ds_inst[31:26]; +assign op_25_22 = ds_inst[25:22]; +assign op_21_20 = ds_inst[21:20]; +assign op_19_15 = ds_inst[19:15]; + +assign rd = ds_inst[ 4: 0]; +assign rj = ds_inst[ 9: 5]; +assign rk = ds_inst[14:10]; + +assign i12 = ds_inst[21:10]; +assign i14 = ds_inst[23:10]; +assign i20 = ds_inst[24: 5]; +assign i16 = ds_inst[25:10]; +assign i26 = {ds_inst[ 9: 0], ds_inst[25:10]}; + +assign csr_idx = ds_inst[23:10]; + +decoder_6_64 u_dec0(.in(op_31_26 ), .out(op_31_26_d )); +decoder_4_16 u_dec1(.in(op_25_22 ), .out(op_25_22_d )); +decoder_2_4 u_dec2(.in(op_21_20 ), .out(op_21_20_d )); +decoder_5_32 u_dec3(.in(op_19_15 ), .out(op_19_15_d )); + +decoder_5_32 u_dec4(.in(rd ), .out(rd_d )); +decoder_5_32 u_dec5(.in(rj ), .out(rj_d )); +decoder_5_32 u_dec6(.in(rk ), .out(rk_d )); + +assign inst_add_w = op_31_26_d[6'h00] & op_25_22_d[4'h0] & op_21_20_d[2'h1] & op_19_15_d[5'h00]; +assign inst_sub_w = op_31_26_d[6'h00] & op_25_22_d[4'h0] & op_21_20_d[2'h1] & op_19_15_d[5'h02]; +assign inst_slt = op_31_26_d[6'h00] & op_25_22_d[4'h0] & op_21_20_d[2'h1] & op_19_15_d[5'h04]; +assign inst_sltu = op_31_26_d[6'h00] & op_25_22_d[4'h0] & op_21_20_d[2'h1] & op_19_15_d[5'h05]; +assign inst_nor = op_31_26_d[6'h00] & op_25_22_d[4'h0] & op_21_20_d[2'h1] & op_19_15_d[5'h08]; +assign inst_and = op_31_26_d[6'h00] & op_25_22_d[4'h0] & op_21_20_d[2'h1] & op_19_15_d[5'h09]; +assign inst_or = op_31_26_d[6'h00] & op_25_22_d[4'h0] & op_21_20_d[2'h1] & op_19_15_d[5'h0a]; +assign inst_xor = op_31_26_d[6'h00] & op_25_22_d[4'h0] & op_21_20_d[2'h1] & op_19_15_d[5'h0b]; +assign inst_orn = op_31_26_d[6'h00] & op_25_22_d[4'h0] & op_21_20_d[2'h1] & op_19_15_d[5'h0c]; +assign inst_andn = op_31_26_d[6'h00] & op_25_22_d[4'h0] & op_21_20_d[2'h1] & op_19_15_d[5'h0d]; +assign inst_sll_w = op_31_26_d[6'h00] & op_25_22_d[4'h0] & op_21_20_d[2'h1] & op_19_15_d[5'h0e]; +assign inst_srl_w = op_31_26_d[6'h00] & op_25_22_d[4'h0] & op_21_20_d[2'h1] & op_19_15_d[5'h0f]; +assign inst_sra_w = op_31_26_d[6'h00] & op_25_22_d[4'h0] & op_21_20_d[2'h1] & op_19_15_d[5'h10]; +assign inst_mul_w = op_31_26_d[6'h00] & op_25_22_d[4'h0] & op_21_20_d[2'h1] & op_19_15_d[5'h18]; +assign inst_mulh_w = op_31_26_d[6'h00] & op_25_22_d[4'h0] & op_21_20_d[2'h1] & op_19_15_d[5'h19]; +assign inst_mulh_wu = op_31_26_d[6'h00] & op_25_22_d[4'h0] & op_21_20_d[2'h1] & op_19_15_d[5'h1a]; +assign inst_div_w = op_31_26_d[6'h00] & op_25_22_d[4'h0] & op_21_20_d[2'h2] & op_19_15_d[5'h00]; +assign inst_mod_w = op_31_26_d[6'h00] & op_25_22_d[4'h0] & op_21_20_d[2'h2] & op_19_15_d[5'h01]; +assign inst_div_wu = op_31_26_d[6'h00] & op_25_22_d[4'h0] & op_21_20_d[2'h2] & op_19_15_d[5'h02]; +assign inst_mod_wu = op_31_26_d[6'h00] & op_25_22_d[4'h0] & op_21_20_d[2'h2] & op_19_15_d[5'h03]; +assign inst_break = op_31_26_d[6'h00] & op_25_22_d[4'h0] & op_21_20_d[2'h2] & op_19_15_d[5'h14]; +assign inst_syscall = op_31_26_d[6'h00] & op_25_22_d[4'h0] & op_21_20_d[2'h2] & op_19_15_d[5'h16]; +assign inst_slli_w = op_31_26_d[6'h00] & op_25_22_d[4'h1] & op_21_20_d[2'h0] & op_19_15_d[5'h01]; +assign inst_srli_w = op_31_26_d[6'h00] & op_25_22_d[4'h1] & op_21_20_d[2'h0] & op_19_15_d[5'h09]; +assign inst_srai_w = op_31_26_d[6'h00] & op_25_22_d[4'h1] & op_21_20_d[2'h0] & op_19_15_d[5'h11]; +assign inst_idle = op_31_26_d[6'h01] & op_25_22_d[4'h9] & op_21_20_d[2'h0] & op_19_15_d[5'h11]; +assign inst_invtlb = op_31_26_d[6'h01] & op_25_22_d[4'h9] & op_21_20_d[2'h0] & op_19_15_d[5'h13]; +assign inst_dbar = op_31_26_d[6'h0e] & op_25_22_d[4'h1] & op_21_20_d[2'h3] & op_19_15_d[5'h04]; +assign inst_ibar = op_31_26_d[6'h0e] & op_25_22_d[4'h1] & op_21_20_d[2'h3] & op_19_15_d[5'h05]; +assign inst_slti = op_31_26_d[6'h00] & op_25_22_d[4'h8]; +assign inst_sltui = op_31_26_d[6'h00] & op_25_22_d[4'h9]; +assign inst_addi_w = op_31_26_d[6'h00] & op_25_22_d[4'ha]; +assign inst_andi = op_31_26_d[6'h00] & op_25_22_d[4'hd]; +assign inst_ori = op_31_26_d[6'h00] & op_25_22_d[4'he]; +assign inst_xori = op_31_26_d[6'h00] & op_25_22_d[4'hf]; +assign inst_ld_b = op_31_26_d[6'h0a] & op_25_22_d[4'h0]; +assign inst_ld_h = op_31_26_d[6'h0a] & op_25_22_d[4'h1]; +assign inst_ld_w = op_31_26_d[6'h0a] & op_25_22_d[4'h2]; +assign inst_st_b = op_31_26_d[6'h0a] & op_25_22_d[4'h4]; +assign inst_st_h = op_31_26_d[6'h0a] & op_25_22_d[4'h5]; +assign inst_st_w = op_31_26_d[6'h0a] & op_25_22_d[4'h6]; +assign inst_ld_bu = op_31_26_d[6'h0a] & op_25_22_d[4'h8]; +assign inst_ld_hu = op_31_26_d[6'h0a] & op_25_22_d[4'h9]; +assign inst_cacop = op_31_26_d[6'h01] & op_25_22_d[4'h8]; +assign inst_preld = op_31_26_d[6'h0a] & op_25_22_d[4'hb]; +assign inst_jirl = op_31_26_d[6'h13]; +assign inst_b = op_31_26_d[6'h14]; +assign inst_bl = op_31_26_d[6'h15]; +assign inst_beq = op_31_26_d[6'h16]; +assign inst_bne = op_31_26_d[6'h17]; +assign inst_blt = op_31_26_d[6'h18]; +assign inst_bge = op_31_26_d[6'h19]; +assign inst_bltu = op_31_26_d[6'h1a]; +assign inst_bgeu = op_31_26_d[6'h1b]; +assign inst_lu12i_w = op_31_26_d[6'h05] & ~ds_inst[25]; +assign inst_pcaddi = op_31_26_d[6'h06] & ~ds_inst[25]; +assign inst_pcaddu12i = op_31_26_d[6'h07] & ~ds_inst[25]; +assign inst_csrxchg = op_31_26_d[6'h01] & ~ds_inst[25] & ~ds_inst[24] & (~rj_d[5'h00] & ~rj_d[5'h01]); //rj != 0,1 +assign inst_ll_w = op_31_26_d[6'h08] & ~ds_inst[25] & ~ds_inst[24]; +assign inst_sc_w = op_31_26_d[6'h08] & ~ds_inst[25] & ds_inst[24]; +assign inst_csrrd = op_31_26_d[6'h01] & ~ds_inst[25] & ~ds_inst[24] & rj_d[5'h00]; +assign inst_csrwr = op_31_26_d[6'h01] & ~ds_inst[25] & ~ds_inst[24] & rj_d[5'h01]; +assign inst_rdcntid_w = op_31_26_d[6'h00] & op_25_22_d[4'h0] & op_21_20_d[2'h0] & op_19_15_d[5'h00] & rk_d[5'h18] & rd_d[5'h00]; +assign inst_rdcntvl_w = op_31_26_d[6'h00] & op_25_22_d[4'h0] & op_21_20_d[2'h0] & op_19_15_d[5'h00] & rk_d[5'h18] & rj_d[5'h00] & !rd_d[5'h00]; +assign inst_rdcntvh_w = op_31_26_d[6'h00] & op_25_22_d[4'h0] & op_21_20_d[2'h0] & op_19_15_d[5'h00] & rk_d[5'h19] & rj_d[5'h00]; +assign inst_ertn = op_31_26_d[6'h01] & op_25_22_d[4'h9] & op_21_20_d[2'h0] & op_19_15_d[5'h10] & rk_d[5'h0e] & rj_d[5'h00] & rd_d[5'h00]; +assign inst_tlbsrch = op_31_26_d[6'h01] & op_25_22_d[4'h9] & op_21_20_d[2'h0] & op_19_15_d[5'h10] & rk_d[5'h0a] & rj_d[5'h00] & rd_d[5'h00]; +assign inst_tlbrd = op_31_26_d[6'h01] & op_25_22_d[4'h9] & op_21_20_d[2'h0] & op_19_15_d[5'h10] & rk_d[5'h0b] & rj_d[5'h00] & rd_d[5'h00]; +assign inst_tlbwr = op_31_26_d[6'h01] & op_25_22_d[4'h9] & op_21_20_d[2'h0] & op_19_15_d[5'h10] & rk_d[5'h0c] & rj_d[5'h00] & rd_d[5'h00]; +assign inst_tlbfill = op_31_26_d[6'h01] & op_25_22_d[4'h9] & op_21_20_d[2'h0] & op_19_15_d[5'h10] & rk_d[5'h0d] & rj_d[5'h00] & rd_d[5'h00]; +assign inst_cpucfg = op_31_26_d[6'h00] & op_25_22_d[4'h0] & op_21_20_d[2'h0] & op_19_15_d[5'h00] & rk_d[5'h1b]; + +assign inst_valid_cacop = inst_cacop&&(dest[2:0]==3'b0||dest[2:0]==3'b1)&&(dest[4:3]==2'd0||dest[4:3]==2'd1||dest[4:3]==2'd2); +assign inst_nop = inst_cacop&&((dest[2:0]!=3'b0&&dest[2:0]!=3'b1)||(dest[4:3]==2'd3)); + +`ifdef HAS_LACC + assign lacc_req = ds_inst[31] & ds_inst[30] & ~ds_inst[29] & ~ds_inst[28]; + assign lacc_valid = ds_inst[22 +: `LACC_OP_WIDTH] < `LACC_OP_SIZE; +`endif + +assign alu_op[ 0] = inst_add_w | + inst_addi_w | + inst_ld_b | + inst_ld_h | + inst_ld_w | + inst_st_b | + inst_st_h | + inst_st_w | + inst_ld_bu | + inst_ld_hu | + inst_ll_w | + inst_sc_w | + inst_jirl | + inst_bl | + inst_pcaddi | + inst_pcaddu12i | + inst_valid_cacop| + inst_preld ; + +assign alu_op[ 1] = inst_sub_w; +assign alu_op[ 2] = inst_slt | inst_slti; +assign alu_op[ 3] = inst_sltu | inst_sltui; +assign alu_op[ 4] = inst_and | inst_andi; +assign alu_op[ 5] = inst_nor; +assign alu_op[ 6] = inst_or | inst_ori; +assign alu_op[ 7] = inst_xor | inst_xori; +assign alu_op[ 8] = inst_sll_w | inst_slli_w; +assign alu_op[ 9] = inst_srl_w | inst_srli_w; +assign alu_op[10] = inst_sra_w | inst_srai_w; +assign alu_op[11] = inst_lu12i_w; +assign alu_op[12] = inst_andn; +assign alu_op[13] = inst_orn; + +assign mul_div_op[ 0] = inst_mul_w; +assign mul_div_op[ 1] = inst_mulh_w | inst_mulh_wu; +assign mul_div_op[ 2] = inst_div_w | inst_div_wu; +assign mul_div_op[ 3] = inst_mod_w | inst_mod_wu; + +assign mul_div_sign = inst_mul_w | inst_mulh_w | inst_div_w | inst_mod_w; + +assign need_ui5 = inst_slli_w | inst_srli_w | inst_srai_w; +assign need_si12 = inst_addi_w | + inst_ld_b | + inst_ld_h | + inst_ld_w | + inst_st_b | + inst_st_h | + inst_st_w | + inst_ld_bu | + inst_ld_hu | + inst_slti | + inst_sltui | + inst_valid_cacop| + inst_preld ; + +assign need_ui12 = inst_andi | inst_ori | inst_xori + `ifdef HAS_LACC + | lacc_req + `endif + ; +assign need_si14_pc = inst_ll_w | inst_sc_w; +assign need_si16_pc = inst_jirl | + inst_beq | + inst_bne | + inst_blt | + inst_bge | + inst_bltu | + inst_bgeu; + +assign need_si20 = inst_lu12i_w | inst_pcaddu12i; +assign need_si20_pc = inst_pcaddi; +assign need_si26_pc = inst_b | inst_bl; + +assign ds_imm = ({32{need_ui5 }} & {27'b0, rk} ) | + ({32{need_si12 }} & {{20{i12[11]}}, i12} ) | + ({32{need_ui12 }} & {20'b0, i12} ) | + ({32{need_si14_pc}} & {{16{i14[13]}}, i14, 2'b0}) | + ({32{need_si16_pc}} & {{14{i16[15]}}, i16, 2'b0}) | + ({32{need_si20 }} & {i20, 12'b0} ) | + ({32{need_si20_pc}} & {{10{i20[19]}}, i20, 2'b0}) | + ({32{need_si26_pc}} & {{ 4{i26[25]}}, i26, 2'b0}) ; + +assign src_reg_is_rd = inst_beq | + inst_bne | + inst_blt | + inst_bltu | + inst_bge | + inst_bgeu | + inst_st_b | + inst_st_h | + inst_st_w | + inst_sc_w | + inst_csrwr | + inst_csrxchg; + +assign src1_is_pc = inst_jirl | inst_bl | inst_pcaddi | inst_pcaddu12i; + +assign src2_is_imm = inst_slli_w | + inst_srli_w | + inst_srai_w | + inst_addi_w | + inst_slti | + inst_sltui | + inst_andi | + inst_ori | + inst_xori | + inst_pcaddi | + inst_pcaddu12i | + inst_ld_b | + inst_ld_h | + inst_ld_w | + inst_ld_bu | + inst_ld_hu | + inst_st_b | + inst_st_h | + inst_st_w | + inst_ll_w | + inst_sc_w | + inst_lu12i_w | + inst_valid_cacop| + inst_preld ; + +assign src2_is_4 = inst_jirl | inst_bl; + +assign load_op = inst_ld_b | inst_ld_h | inst_ld_w | inst_ld_bu | inst_ld_hu | inst_ll_w; +assign mem_b_size = inst_ld_b | inst_ld_bu | inst_st_b; +assign mem_h_size = inst_ld_h | inst_ld_hu | inst_st_h; +assign mem_sign_exted= inst_ld_b | inst_ld_h; +assign dst_is_r1 = inst_bl; +assign gr_we = ~inst_st_b & + ~inst_st_h & + ~inst_st_w & + ~inst_beq & + ~inst_bne & + ~inst_blt & + ~inst_bge & + ~inst_bltu & + ~inst_bgeu & + ~inst_b & + ~inst_syscall & + ~inst_tlbsrch & + ~inst_tlbrd & + ~inst_tlbwr & + ~inst_tlbfill & + ~inst_invtlb & + ~inst_valid_cacop& + ~inst_preld & + ~inst_dbar & + ~inst_ibar & + ~inst_nop ; + +assign store_op = inst_st_b | inst_st_h | inst_st_w | (inst_sc_w & ds_llbit); + +assign dest = (dst_is_r1) ? 5'd1 : + (dst_is_rj) ? rj : rd; + +assign dst_is_rj = inst_rdcntid_w; + +assign {rdcnt_en, rdcnt_result} = ({33{inst_rdcntvl_w}} & {1'b1, timer_64[31: 0]}) | + ({33{inst_rdcntvh_w}} & {1'b1, timer_64[63:32]}) | + ({33{inst_rdcntid_w}} & {1'b1, csr_tid}); + +assign csr_data = rdcnt_en ? rdcnt_result : + inst_sc_w ? {31'b0, ds_llbit} : rd_csr_data; + +assign res_from_csr = inst_csrrd | inst_csrwr | inst_csrxchg | inst_rdcntid_w | inst_rdcntvh_w | inst_rdcntvl_w | inst_sc_w | inst_cpucfg; +assign csr_we = inst_csrwr | inst_csrxchg; +assign csr_mask = inst_csrxchg; + +assign mem_size = {mem_h_size, mem_b_size}; + +assign inst_need_rj = inst_add_w | + inst_sub_w | + inst_addi_w | + inst_slt | + inst_sltu | + inst_slti | + inst_sltui | + inst_and | + inst_or | + inst_nor | + inst_xor | + inst_andi | + inst_ori | + inst_xori | + inst_mul_w | + inst_mulh_w | + inst_mulh_wu | + inst_div_w | + inst_div_wu | + inst_mod_w | + inst_mod_wu | + inst_sll_w | + inst_srl_w | + inst_sra_w | + inst_slli_w | + inst_srli_w | + inst_srai_w | + inst_beq | + inst_bne | + inst_blt | + inst_bltu | + inst_bge | + inst_bgeu | + inst_jirl | + inst_ld_b | + inst_ld_bu | + inst_ld_h | + inst_ld_hu | + inst_ld_w | + inst_st_b | + inst_st_h | + inst_st_w | + inst_preld | + inst_ll_w | + inst_sc_w | + inst_csrxchg | + inst_valid_cacop| + `ifdef HAS_LACC + lacc_req | + `endif + inst_invtlb ; + +assign inst_need_rkd = inst_add_w | + inst_sub_w | + inst_slt | + inst_sltu | + inst_and | + inst_or | + inst_nor | + inst_xor | + inst_mul_w | + inst_mulh_w | + inst_mulh_wu | + inst_div_w | + inst_div_wu | + inst_mod_w | + inst_mod_wu | + inst_sll_w | + inst_srl_w | + inst_sra_w | + inst_beq | + inst_bne | + inst_blt | + inst_bltu | + inst_bge | + inst_bgeu | + inst_st_b | + inst_st_h | + inst_st_w | + inst_sc_w | + inst_csrwr | + inst_csrxchg | + `ifdef HAS_LACC + lacc_req | + `endif + inst_invtlb ; + + +assign rf_raddr1 = infor_flag?reg_num:rj; +assign rf_raddr2 = src_reg_is_rd ? rd : rk; +regfile u_regfile( + .clk (clk ), + .raddr1 (rf_raddr1), + .rdata1 (rf_rdata1), + .raddr2 (rf_raddr2), + .rdata2 (rf_rdata2), + .we (rf_we ), + .waddr (rf_waddr ), + .wdata (rf_wdata ) + `ifdef DIFFTEST_EN + , + .rf_o (rf_to_diff) + `endif + ); + +assign {es_dep_need_stall, + es_forward_enable, + es_forward_reg , + es_forward_data + } = es_to_ds_forward_bus; + +assign {ms_dep_need_stall, + ms_forward_enable, + ms_forward_reg , + ms_forward_data + } = ms_to_ds_forward_bus; + +//exe stage first forward +assign {rf1_forward_stall, rj_value, rj_value_forward_es} = ((rf_raddr1 == es_forward_reg) && es_forward_enable && inst_need_rj) ? {es_dep_need_stall, es_forward_data, es_forward_data} : + ((rf_raddr1 == ms_forward_reg) && ms_forward_enable && inst_need_rj) ? {ms_dep_need_stall || br_need_reg_data, ms_forward_data, rf_rdata1} : + {1'b0, rf_rdata1, rf_rdata1}; + +assign {rf2_forward_stall, rkd_value, rkd_value_forward_es} = ((rf_raddr2 == es_forward_reg) && es_forward_enable && inst_need_rkd) ? {es_dep_need_stall, es_forward_data, es_forward_data} : + ((rf_raddr2 == ms_forward_reg) && ms_forward_enable && inst_need_rkd) ? {ms_dep_need_stall || br_need_reg_data, ms_forward_data, rf_rdata2} : + {1'b0, rf_rdata2, rf_rdata2}; + +assign rj_eq_rd = (rj_value_forward_es == rkd_value_forward_es); +assign rj_lt_rd_unsign = (rj_value_forward_es < rkd_value_forward_es); //operate "<" has nice timing +assign rj_lt_rd_sign = (rj_value_forward_es[31] && ~rkd_value_forward_es[31]) ? 1'b1 : + (~rj_value_forward_es[31] && rkd_value_forward_es[31]) ? 1'b0 : rj_lt_rd_unsign; + +assign br_taken = ( inst_beq && rj_eq_rd + || inst_bne && !rj_eq_rd + || inst_blt && rj_lt_rd_sign + || inst_bge && !rj_lt_rd_sign + || inst_bltu && rj_lt_rd_unsign + || inst_bgeu && !rj_lt_rd_unsign + || inst_jirl + || inst_bl + || inst_b + ) && ds_valid && !ds_excp; + +assign br_inst = br_need_reg_data || inst_bl || inst_b; + +assign br_to_btb = inst_beq || + inst_bne || + inst_blt || + inst_bge || + inst_bltu || + inst_bgeu || + inst_bl || + inst_b || + inst_jirl; + +assign br_need_reg_data = inst_beq || + inst_bne || + inst_blt || + inst_bge || + inst_bltu || + inst_bgeu || + inst_jirl; + +assign br_target = ({32{inst_beq || inst_bne || inst_bl || inst_b || + inst_blt || inst_bge || inst_bltu || inst_bgeu}} & (ds_pc + ds_imm )) | + ({32{inst_jirl}} & (rj_value_forward_es + ds_imm)) ; + +//assign idle_stall = inst_idle & ds_valid & !has_int; + +assign excp = excp_ipe | inst_syscall | inst_break | ds_excp | excp_ine | has_int; +assign excp_num = {excp_ipe, excp_ine, inst_break, inst_syscall, ds_excp_num, has_int}; + +assign rd_csr_addr = inst_cpucfg ? (rj_value[13:0]+14'h00b0) : csr_idx; + +//when cache operate icache, will refetch inst after this inst. +assign refetch = (inst_tlbwr || inst_tlbfill || inst_tlbrd || inst_invtlb || inst_ibar) && ds_valid; //this inst will change addr trans + +assign tlb_inst_stall = es_tlb_inst_stall || ms_tlb_inst_stall || ws_tlb_inst_stall; + +assign inst_valid = inst_add_w | + inst_sub_w | + inst_slt | + inst_sltu | + inst_nor | + inst_and | + inst_or | + inst_xor | + inst_sll_w | + inst_srl_w | + inst_sra_w | + inst_mul_w | + inst_mulh_w | + inst_mulh_wu | + inst_div_w | + inst_mod_w | + inst_div_wu | + inst_mod_wu | + inst_break | + inst_syscall | + inst_slli_w | + inst_srli_w | + inst_srai_w | + inst_idle | + inst_slti | + inst_sltui | + inst_addi_w | + inst_andi | + inst_ori | + inst_xori | + inst_ld_b | + inst_ld_h | + inst_ld_w | + inst_st_b | + inst_st_h | + inst_st_w | + inst_ld_bu | + inst_ld_hu | + inst_ll_w | + inst_sc_w | + inst_jirl | + inst_b | + inst_bl | + inst_beq | + inst_bne | + inst_blt | + inst_bge | + inst_bltu | + inst_bgeu | + inst_lu12i_w | + inst_pcaddu12i | + inst_csrrd | + inst_csrwr | + inst_csrxchg | + inst_rdcntid_w | + inst_rdcntvh_w | + inst_rdcntvl_w | + inst_ertn | + inst_valid_cacop| + inst_preld | + inst_dbar | + inst_ibar | + inst_tlbsrch | + inst_tlbrd | + inst_tlbwr | + inst_tlbfill | + inst_nop | + inst_cpucfg | + `ifdef HAS_LACC + lacc_req & lacc_valid | + `endif + (inst_invtlb && (rd == 5'd0 || + rd == 5'd1 || + rd == 5'd2 || + rd == 5'd3 || + rd == 5'd4 || + rd == 5'd5 || + rd == 5'd6 )); //invtlb valid op + +assign excp_ine = ~inst_valid; + +assign kernel_inst = inst_csrrd | + inst_csrwr | + inst_csrxchg | + inst_valid_cacop & (rd[4:3] != 2'b10)| + inst_tlbsrch | + inst_tlbrd | + inst_tlbwr | + inst_tlbfill | + inst_invtlb | + inst_ertn | + inst_idle ; + +assign excp_ipe = kernel_inst && (csr_plv == 2'b11); + +//branch slot cancel, need wait next valid inst after branch +//only valid br_taken sign can generate slot_cancel. +always @(posedge clk) begin + if (reset || flush_sign) begin + //flush signal need flush this buffer + branch_slot_cancel <= 1'b0; + end + else if (btb_pre_error_flush && es_allowin && !fs_to_ds_valid) begin + branch_slot_cancel <= 1'b1; + end + else if (branch_slot_cancel && fs_to_ds_valid) begin + branch_slot_cancel <= 1'b0; + end +end + +assign btb_operate_en = ds_valid && ds_ready_go && es_allowin && !ds_excp; +assign btb_operate_pc = ds_pc; +assign btb_pop_ras = inst_jirl; +assign btb_push_ras = inst_bl; +assign btb_add_entry = br_to_btb && !ds_btb_en && br_taken; +assign btb_delete_entry = !br_to_btb && ds_btb_en; +assign btb_pre_error = br_to_btb && ds_btb_en && (ds_btb_taken ^ br_taken); +assign btb_target_error = br_to_btb && ds_btb_en && (ds_btb_taken && br_taken) && (ds_btb_target != br_target); +assign btb_pre_right = br_to_btb && ds_btb_en && !(ds_btb_taken ^ br_taken); +assign btb_right_orien = br_taken; +assign btb_right_target = br_target; +assign btb_operate_index = ds_btb_index; + +assign btb_pre_error_flush = (btb_add_entry || btb_delete_entry || btb_pre_error || btb_target_error) && ds_valid && ds_ready_go && !ds_excp; +assign btb_pre_error_flush_target = br_taken ? br_target : ds_pc + 32'h4; + +//ibar dbar +assign pipeline_no_empty = es_to_ds_valid || ms_to_ds_valid || ws_to_ds_valid || !write_buffer_empty || !dcache_empty; +assign dbar_stall = inst_dbar && pipeline_no_empty; +assign ibar_stall = inst_ibar && pipeline_no_empty; + + +// ll ldw ldhu ldh ldbu ldb +assign inst_ld_en = {2'b0, inst_ll_w, inst_ld_w, inst_ld_hu, inst_ld_h, inst_ld_bu, inst_ld_b}; +// sc(llbit = 1) stw sth stb +assign inst_st_en = {4'b0, ds_llbit && inst_sc_w, inst_st_w, inst_st_h, inst_st_b}; +assign inst_csr_rstat_en = (inst_csrrd || inst_csrwr || inst_csrxchg) && (csr_idx == 14'd5); + +// debug +assign debug_rf_rdata1 = rf_raddr1; + +endmodule diff --git a/rtl/ip/open-la500/if_stage.v b/rtl/ip/open-la500/if_stage.v new file mode 100644 index 0000000..f0684f1 --- /dev/null +++ b/rtl/ip/open-la500/if_stage.v @@ -0,0 +1,357 @@ +`include "mycpu.h" +`include "csr.h" + +module if_stage( + input clk , + input reset , + //allwoin + input ds_allowin , + //brbus + input [`BR_BUS_WD -1:0] br_bus , + //to ds + output fs_to_ds_valid , + output [`FS_TO_DS_BUS_WD -1:0] fs_to_ds_bus , + //exception + input excp_flush , + input ertn_flush , + input refetch_flush , + input icacop_flush , + input [31:0] ws_pc , + input [31:0] csr_eentry , + input [31:0] csr_era , + input excp_tlbrefill , + input [31:0] csr_tlbrentry , + input has_int , + //idle + input idle_flush , + // inst cache interface + output inst_valid , + output inst_op , + output [ 3:0] inst_wstrb , + output [31:0] inst_wdata , + input inst_addr_ok , + input inst_data_ok , + input icache_miss , + input [31:0] inst_rdata , + output inst_uncache_en , + output tlb_excp_cancel_req, + //from csr + input csr_pg , + input csr_da , + input [31:0] csr_dmw0 , + input [31:0] csr_dmw1 , + input [ 1:0] csr_plv , + input [ 1:0] csr_datf , + input disable_cache , + //to btb + output [31:0] fetch_pc , + output fetch_en , + input [31:0] btb_ret_pc , + input btb_taken , + input btb_en , + input [ 4:0] btb_index , + //to addr trans + output [31:0] inst_addr , + output inst_addr_trans_en, + output dmw0_en , + output dmw1_en , + //tlb + input inst_tlb_found , + input inst_tlb_v , + input inst_tlb_d , + input [ 1:0] inst_tlb_mat , + input [ 1:0] inst_tlb_plv +); + +reg fs_valid; +wire fs_ready_go; +wire fs_allowin; +wire to_fs_valid; +wire pfs_ready_go; + +wire [31:0] seq_pc; +wire [31:0] nextpc; + +wire pfs_excp_adef; +wire fs_excp_tlbr; +wire fs_excp_pif; +wire fs_excp_ppi; +reg fs_excp; +reg fs_excp_num; +wire excp; +wire [3:0] excp_num; +wire pfs_excp; +wire pfs_excp_num; + +wire flush_sign; + +reg [31:0] inst_rd_buff; +reg inst_buff_enable; + +wire da_mode; +wire pg_mode; + +wire btb_pre_error_flush; +wire [31:0] btb_pre_error_flush_target; + +wire flush_inst_delay; +wire flush_inst_go_dirt; + +wire fetch_btb_target; + +reg idle_lock; + +wire tlb_excp_lock_pc; + +wire [31:0] btb_ret_pc_t; +wire [ 4:0] btb_index_t; +wire btb_taken_t; +wire btb_en_t; + +wire [31:0] excp_entry; +wire [31:0] inst_flush_pc; + +assign {btb_pre_error_flush, + btb_pre_error_flush_target } = br_bus; + +wire [31:0] fs_inst; +reg [31:0] fs_pc; + +reg [37:0] btb_lock_buffer; +reg btb_lock_en; + +assign fs_to_ds_bus = {btb_ret_pc_t, //108:77 + btb_index_t, //76:72 + btb_taken_t, //71:71 + btb_en_t, //70:70 + icache_miss, //69:69 + excp, //68:68 + excp_num, //67:64 + fs_inst, //63:32 + fs_pc //31:0 + }; + +assign flush_sign = ertn_flush || excp_flush || refetch_flush || icacop_flush || idle_flush; + +assign flush_inst_delay = flush_sign && !inst_addr_ok || idle_flush; +assign flush_inst_go_dirt = flush_sign && inst_addr_ok && !idle_flush; + +//flush state machine +reg [31:0] flush_inst_req_buffer; +reg flush_inst_req_state; +localparam flush_inst_req_empty = 1'b0; +localparam flush_inst_req_full = 1'b1; + +always @(posedge clk) begin + if (reset) begin + flush_inst_req_state <= flush_inst_req_empty; + end + else case (flush_inst_req_state) + flush_inst_req_empty: begin + if(flush_inst_delay) begin + flush_inst_req_buffer <= nextpc; + flush_inst_req_state <= flush_inst_req_full; + end + end + flush_inst_req_full: begin + if(pfs_ready_go) begin + flush_inst_req_state <= flush_inst_req_empty; + end + else if (flush_sign) begin + flush_inst_req_buffer <= nextpc; + end + end + endcase +end + +assign fetch_btb_target = (btb_taken && btb_en) || (btb_lock_en && btb_lock_buffer[37]); + +/* +* idle lock +* when idle inst commit, stop inst fetch until interrupted +*/ +always @(posedge clk) begin + if (reset) begin + idle_lock <= 1'b0; + end + else if (idle_flush && !has_int) begin + idle_lock <= 1'b1; + end + else if (has_int) begin + idle_lock <= 1'b0; + end +end + +/* +* br state machine +* when btb pre error, id stage will cancel one inst. so need confirm useless +* inst (will be canceled) is generated. +*/ +reg [31:0] br_target_inst_req_buffer; +reg [ 2:0] br_target_inst_req_state; +localparam br_target_inst_req_empty = 3'b001; +localparam br_target_inst_req_wait_slot = 3'b010; +localparam br_target_inst_req_wait_br_target = 3'b100; + +always @(posedge clk) begin + if (reset) begin + br_target_inst_req_state <= br_target_inst_req_empty; + end + else case (br_target_inst_req_state) + br_target_inst_req_empty: begin + if (flush_sign) begin + br_target_inst_req_state <= br_target_inst_req_empty; + end + else if(btb_pre_error_flush && !fs_valid && !inst_addr_ok) begin + br_target_inst_req_state <= br_target_inst_req_wait_slot; + br_target_inst_req_buffer <= btb_pre_error_flush_target; + end + else if(btb_pre_error_flush && !inst_addr_ok && fs_valid || btb_pre_error_flush && inst_addr_ok && !fs_valid) begin + br_target_inst_req_state <= br_target_inst_req_wait_br_target; + br_target_inst_req_buffer <= btb_pre_error_flush_target; + end + end + br_target_inst_req_wait_slot: begin + if(flush_sign) begin + br_target_inst_req_state <= br_target_inst_req_empty; + end + else if(pfs_ready_go) begin + br_target_inst_req_state <= br_target_inst_req_wait_br_target; + end + end + br_target_inst_req_wait_br_target: begin + if(pfs_ready_go || flush_sign) begin + br_target_inst_req_state <= br_target_inst_req_empty; + end + end + default: begin + br_target_inst_req_state <= br_target_inst_req_empty; + end + endcase +end + +/* +* btb lock +* btb ret only maintain one clock +* when pfs not ready go, should buffer btb ret +*/ +always @(posedge clk) begin + if (reset || flush_sign || fetch_en) + btb_lock_en <= 1'b0; + else if (btb_en && !pfs_ready_go) begin + btb_lock_en <= 1'b1; + btb_lock_buffer <= {btb_taken, btb_index, btb_ret_pc}; + end +end + +assign btb_ret_pc_t = {32{btb_lock_en}} & btb_lock_buffer[31:0] | btb_ret_pc; +assign btb_index_t = {5{btb_lock_en}} & btb_lock_buffer[36:32] | btb_index; +assign btb_taken_t = btb_lock_en && btb_lock_buffer[37] || btb_taken; +assign btb_en_t = btb_lock_en || btb_en; + +// pre-IF stage +assign pfs_ready_go = (inst_valid || pfs_excp) && inst_addr_ok; +assign to_fs_valid = ~reset && pfs_ready_go; +assign seq_pc = fs_pc + 32'h4; +assign excp_entry = {32{excp_tlbrefill}} & csr_tlbrentry | + {32{!excp_tlbrefill}} & csr_eentry ; + +assign inst_flush_pc = {32{ertn_flush}} & csr_era | + {32{refetch_flush || icacop_flush || idle_flush}} & (ws_pc + 32'h4) ; + +assign nextpc = (flush_inst_req_state == flush_inst_req_full) ? flush_inst_req_buffer : + excp_flush ? excp_entry : + (ertn_flush || refetch_flush || icacop_flush || idle_flush) ? inst_flush_pc : + (br_target_inst_req_state == br_target_inst_req_wait_br_target) ? br_target_inst_req_buffer : + btb_pre_error_flush && fs_valid ? btb_pre_error_flush_target: + fetch_btb_target ? btb_ret_pc_t : + seq_pc ; +/* +*when encounter tlb excp, stop inst fetch until excp_flush. avoid fetch useless inst. +*but should not lock when btb state machine or flush state machine is work. +*/ +assign tlb_excp_lock_pc = tlb_excp_cancel_req && br_target_inst_req_state != br_target_inst_req_wait_br_target && flush_inst_req_state != flush_inst_req_full; + +//when flush_sign meet icache_busy 1, flush_sign's inst valid should not set immediately +assign inst_valid = (fs_allowin && !pfs_excp && !tlb_excp_lock_pc || flush_sign || btb_pre_error_flush) && !(idle_flush || idle_lock); +assign inst_op = 1'b0; +assign inst_wstrb = 4'h0; +assign inst_addr = nextpc; //nextpc +assign inst_wdata = 32'b0; + +assign fs_inst = (inst_buff_enable) ? inst_rd_buff : inst_rdata; + +//inst read buffer use for stall situation +always @(posedge clk) begin + if (reset || (fs_ready_go && ds_allowin) || flush_sign) begin + inst_buff_enable <= 1'b0; + end + else if ((inst_data_ok) && !ds_allowin) begin + inst_rd_buff <= inst_rdata; + inst_buff_enable <= 1'b1; + end +end + +//exception +assign pfs_excp_adef = (nextpc[0] || nextpc[1]); //word align +//tlb +assign fs_excp_tlbr = !inst_tlb_found && inst_addr_trans_en; +assign fs_excp_pif = !inst_tlb_v && inst_addr_trans_en; +assign fs_excp_ppi = (csr_plv > inst_tlb_plv) && inst_addr_trans_en; + +assign tlb_excp_cancel_req = fs_excp_tlbr || fs_excp_pif || fs_excp_ppi; + +assign pfs_excp = pfs_excp_adef; +assign pfs_excp_num = {pfs_excp_adef}; + +assign excp = fs_excp || fs_excp_tlbr || fs_excp_pif || fs_excp_ppi ; +assign excp_num = {fs_excp_ppi, fs_excp_pif, fs_excp_tlbr, fs_excp_num}; + +//addr trans +assign inst_addr_trans_en = pg_mode && !dmw0_en && !dmw1_en; + +//addr dmw trans //TOT +assign dmw0_en = ((csr_dmw0[`PLV0] && csr_plv == 2'd0) || (csr_dmw0[`PLV3] && csr_plv == 2'd3)) && (fs_pc[31:29] == csr_dmw0[`VSEG]) && pg_mode; +assign dmw1_en = ((csr_dmw1[`PLV0] && csr_plv == 2'd0) || (csr_dmw1[`PLV3] && csr_plv == 2'd3)) && (fs_pc[31:29] == csr_dmw1[`VSEG]) && pg_mode; + +//uncache judgement +assign da_mode = csr_da && !csr_pg; +assign pg_mode = csr_pg && !csr_da; + +assign inst_uncache_en = (da_mode && (csr_datf == 2'b0)) || + (dmw0_en && (csr_dmw0[`DMW_MAT] == 2'b0)) || + (dmw1_en && (csr_dmw1[`DMW_MAT] == 2'b0)) || + (inst_addr_trans_en && (inst_tlb_mat == 2'b0)) || + disable_cache; + +//assign inst_uncache_en = 1'b1; //used for debug + +// IF stage +assign fs_ready_go = inst_data_ok || inst_buff_enable || excp; +assign fs_allowin = !fs_valid || fs_ready_go && ds_allowin; +assign fs_to_ds_valid = fs_valid && fs_ready_go; +always @(posedge clk) begin + if (reset || flush_inst_delay) begin + fs_valid <= 1'b0; + end + else if (fs_allowin) begin + fs_valid <= to_fs_valid; + end + + if (reset) begin + fs_pc <= 32'h1bfffffc; //trick: to make nextpc be 0x1c000000 during reset + fs_excp <= 1'b0; + fs_excp_num <= 4'b0; + end + else if (to_fs_valid && (fs_allowin || flush_inst_go_dirt)) begin + fs_pc <= nextpc; + fs_excp <= pfs_excp; + fs_excp_num <= pfs_excp_num; + end +end + +//go btb and tlb +assign fetch_pc = nextpc; +assign fetch_en = inst_valid && inst_addr_ok; + +endmodule diff --git a/rtl/ip/open-la500/lacc_core.v b/rtl/ip/open-la500/lacc_core.v new file mode 100644 index 0000000..4e6b4b3 --- /dev/null +++ b/rtl/ip/open-la500/lacc_core.v @@ -0,0 +1,53 @@ +`include "mycpu.h" +`include "csr.h" + +`ifdef HAS_LACC +module lacc_core( + input clk, + input reset, + + input lacc_flush, + + input lacc_req_valid, + input [`LACC_OP_WIDTH-1: 0] lacc_req_command, + input [6: 0] lacc_req_imm, + input [31: 0] lacc_req_rj, + input [31: 0] lacc_req_rk, + + output lacc_rsp_valid, + output [31: 0] lacc_rsp_rdat, + + // wreq will also send valid sign + output lacc_data_valid, + input lacc_data_ready, + output [31: 0] lacc_data_addr, + output lacc_data_read, + output [31: 0] lacc_data_wdata, + output [1: 0] lacc_data_size, + + input lacc_drsp_valid, + input [31: 0] lacc_drsp_rdata +); + + lacc_demo demo( + .clk(clk), + .reset(reset), + .lacc_flush (lacc_flush), + .lacc_req_valid (lacc_req_valid), + .lacc_req_command(lacc_req_command), + .lacc_req_imm (lacc_req_imm), + .lacc_req_rj (lacc_req_rj), + .lacc_req_rk (lacc_req_rk), + .lacc_rsp_valid (lacc_rsp_valid), + .lacc_rsp_rdat (lacc_rsp_rdat), + .lacc_data_valid(lacc_data_valid), + .lacc_data_ready(lacc_data_ready), + .lacc_data_addr (lacc_data_addr), + .lacc_data_read (lacc_data_read), + .lacc_data_wdata(lacc_data_wdata), + .lacc_data_size (lacc_data_size), + .lacc_drsp_valid(lacc_drsp_valid), + .lacc_drsp_rdata(lacc_drsp_rdata) + ); +endmodule +`endif \ No newline at end of file diff --git a/rtl/ip/open-la500/lacc_demo.v b/rtl/ip/open-la500/lacc_demo.v new file mode 100644 index 0000000..d09a09b --- /dev/null +++ b/rtl/ip/open-la500/lacc_demo.v @@ -0,0 +1,166 @@ + + +module lacc_demo( + input clk, + input reset, + + input lacc_flush, + + input lacc_req_valid, + input [`LACC_OP_WIDTH-1: 0] lacc_req_command, + input [6: 0] lacc_req_imm, + input [31: 0] lacc_req_rj, + input [31: 0] lacc_req_rk, + + output lacc_rsp_valid, + output [31: 0] lacc_rsp_rdat, + + output lacc_data_valid, + input lacc_data_ready, + output [31: 0] lacc_data_addr, + output lacc_data_read, + output [31: 0] lacc_data_wdata, + output [1: 0] lacc_data_size, + + input lacc_drsp_valid, + input [31: 0] lacc_drsp_rdata +); + + wire op_lmadd; + wire op_cfg; + + reg [31: 0] req_addr1, req_addr2, waddr; + reg [6: 0] req_size; + wire [31: 0] nxt_req_addr1, nxt_req_addr2, req_addr1_n4, req_addr2_n4; + wire [31: 0] nxt_waddr, waddr_n4; + wire [6: 0] nxt_req_size, req_size_p1; + wire req_addr1_en, req_addr2_en, req_size_en, waddr_en; + wire req_size_nz = |req_size; + + reg [31: 0] conv_data; + wire [31: 0] add_data; + /********************************* + * func: + * rj and rk are addr + * read from rj and rk and add them + * write back to waddr + * then write add res to rd + **********************************/ + assign op_lmadd = lacc_req_command == 0; + // rj is size of read, rk is waddr + assign op_cfg = lacc_req_command == 1; + + + parameter FSM_WIDTH = 2; + parameter IDLE = 'b0; + parameter REQ_ADDR1 = 'b1; + parameter REQ_ADDR2 = 'd2; + parameter FINAL = 'd3; + reg [FSM_WIDTH-1: 0] state_r; + wire [FSM_WIDTH-1: 0] state_n; + wire [FSM_WIDTH-1: 0] state_final_n; + wire state_idle = state_r == IDLE; + wire state_req_addr1 = state_r == REQ_ADDR1; + wire state_req_addr2 = state_r == REQ_ADDR2; + wire state_final = state_r == FINAL; + wire data_hsk = lacc_data_valid & lacc_data_ready; + wire idle_exit = state_idle & lacc_req_valid & op_lmadd & req_size_nz; + wire req_addr1_exit = state_req_addr1 & data_hsk; + wire req_addr2_exit = state_req_addr2 & data_hsk; + wire final_exit = state_final & data_hsk; + wire exit2idle = final_exit & ~req_size_nz; + + assign state_final_n = ~req_size_nz ? IDLE : REQ_ADDR1; + + wire state_en = idle_exit | req_addr1_exit | req_addr2_exit | final_exit; + assign state_n = {FSM_WIDTH{idle_exit}} & REQ_ADDR1 | + {FSM_WIDTH{req_addr1_exit}} & REQ_ADDR2 | + {FSM_WIDTH{req_addr2_exit}} & FINAL | + {FSM_WIDTH{final_exit}} & state_final_n; + + + + assign req_addr1_en = state_idle & lacc_req_valid & op_lmadd | req_addr1_exit; + assign req_addr2_en = state_idle & lacc_req_valid & op_lmadd | req_addr2_exit; + assign req_size_en = lacc_req_valid & op_cfg | req_addr2_exit; + assign waddr_en = lacc_req_valid & op_cfg | final_exit; + assign req_addr1_n4 = req_addr1 + 4; + assign req_addr2_n4 = req_addr2 + 4; + assign req_size_p1 = req_size - 1; + assign waddr_n4 = waddr + 4; + assign nxt_req_addr1 = {32{lacc_req_valid & state_idle & op_lmadd}} & lacc_req_rj | + {32{req_addr1_exit}} & req_addr1_n4; + assign nxt_req_addr2 = {32{lacc_req_valid & state_idle & op_lmadd}} & lacc_req_rk | + {32{req_addr2_exit}} & req_addr2_n4; + assign nxt_req_size = {7{lacc_req_valid & op_cfg}} & lacc_req_rj | + {7{req_addr2_exit}} & req_size_p1; + assign nxt_waddr = {32{lacc_req_valid & op_cfg}} & lacc_req_rk | + {32{final_exit}} & waddr_n4; + + reg data_req; + wire data_req_en; + wire nxt_data_req; + + assign data_req_en = idle_exit | req_addr1_exit | req_addr2_exit | final_exit; + assign nxt_data_req = ~exit2idle & ~req_addr2_exit; + + reg buffer_valid, wdata_valid, wdata_valid_n; + reg [31: 0] buffer_data; + reg [31: 0] buffer_wdata; + + always @(posedge clk)begin + if(req_addr1_en) req_addr1 <= nxt_req_addr1; + if(req_addr2_en) req_addr2 <= nxt_req_addr2; + if(waddr_en) waddr <= nxt_waddr; + if(~buffer_valid) buffer_data <= lacc_drsp_rdata; + if(buffer_valid & lacc_drsp_valid) begin + buffer_wdata <= lacc_drsp_rdata + buffer_data; + end + wdata_valid_n <= wdata_valid; + if(reset | lacc_flush)begin + req_size <= 7'b0; + state_r <= IDLE; + data_req <= 1'b0; + buffer_valid <= 1'b0; + wdata_valid <= 1'b0; + end + else begin + if(req_size_en) req_size <= nxt_req_size; + if(state_en) state_r <= state_n; + if(data_req_en) data_req <= nxt_data_req; + + if(final_exit) buffer_valid <= 1'b0; + else if(lacc_drsp_valid & ~wdata_valid_n) buffer_valid <= 1'b1; + + if(final_exit) wdata_valid <= 1'b0; + else if(buffer_valid & lacc_drsp_valid) wdata_valid <= 1'b1; + end + end + + assign lacc_data_valid = data_req | wdata_valid; + assign lacc_data_read = ~wdata_valid; + assign lacc_data_addr = {32{state_req_addr1}} & req_addr1 | + {32{state_req_addr2}} & req_addr2 | + {32{state_final}} & waddr; + assign lacc_data_size = 2'b10; + assign lacc_data_wdata = buffer_wdata; + + + assign add_data = conv_data + lacc_drsp_rdata; + + always @(posedge clk)begin + if(idle_exit)begin + conv_data <= 0; + end + else begin + if(lacc_drsp_valid)begin + conv_data <= add_data; + end + end + end + + assign lacc_rsp_valid = exit2idle | lacc_req_valid & state_idle & ((op_lmadd & ~req_size_nz) | op_cfg); + assign lacc_rsp_rdat = conv_data; + + +endmodule \ No newline at end of file diff --git a/rtl/ip/open-la500/mem_stage.v b/rtl/ip/open-la500/mem_stage.v new file mode 100644 index 0000000..ebeacf8 --- /dev/null +++ b/rtl/ip/open-la500/mem_stage.v @@ -0,0 +1,368 @@ +`include "mycpu.h" +`include "csr.h" + +module mem_stage( + input clk , + input reset , + //allowin + input ws_allowin , + output ms_allowin , + //from es + input es_to_ms_valid, + input [`ES_TO_MS_BUS_WD -1:0] es_to_ms_bus , + //to ws + output ms_to_ws_valid, + output [`MS_TO_WS_BUS_WD -1:0] ms_to_ws_bus , + //to ds forward path + output [`MS_TO_DS_FORWARD_BUS-1:0] ms_to_ds_forward_bus, + output ms_to_ds_valid, + //div mul + input [31:0] div_result , + input [31:0] mod_result , + input [63:0] mul_result , + //exception + input excp_flush , + input ertn_flush , + input refetch_flush , + input icacop_flush , + //idle + input idle_flush , + //tlb ins + output tlb_inst_stall, + //to es + output ms_wr_tlbehi , + output ms_flush , + //from cache + input data_data_ok , + input dcache_miss , + input [31:0] data_rdata , + //to cache + output data_uncache_en, + output tlb_excp_cancel_req, + output sc_cancel_req , + //from csr + input csr_pg , + input csr_da , + input [31:0] csr_dmw0 , + input [31:0] csr_dmw1 , + input [ 1:0] csr_plv , + input [ 1:0] csr_datm , + input disable_cache , + input [27:0] lladdr , + // from addr trans for difftest + input [ 7:0] data_index_diff , + input [19:0] data_tag_diff , + input [ 3:0] data_offset_diff , + //to addr trans + output data_addr_trans_en, + output dmw0_en , + output dmw1_en , + output cacop_op_mode_di , + //tlb + input data_tlb_found , + input [ 4:0] data_tlb_index , + input data_tlb_v , + input data_tlb_d , + input [ 1:0] data_tlb_mat , + input [ 1:0] data_tlb_plv , + input [19:0] data_tlb_ppn +); + +reg ms_valid; +wire ms_ready_go; + +wire dep_need_stall; +reg [`ES_TO_MS_BUS_WD -1:0] es_to_ms_bus_r; +wire [ 3:0] ms_mul_div_op; +wire [ 1:0] sram_addr_low2bit; +wire [ 1:0] ms_mem_size; +wire ms_load_op; +wire ms_gr_we; +wire [ 4:0] ms_dest; +wire [31:0] ms_exe_result; +wire [31:0] ms_pc; +wire ms_excp; +wire [ 9:0] ms_excp_num; +wire ms_ertn; +wire [31:0] ms_csr_result; +wire [13:0] ms_csr_idx; +wire ms_csr_we; +wire ms_ll_w; +wire ms_sc_w; +wire ms_store_op; +wire ms_tlbsrch; +wire ms_tlbfill; +wire ms_tlbwr; +wire ms_tlbrd; +wire ms_refetch; +wire ms_invtlb; +wire [ 9:0] ms_invtlb_asid; +wire [18:0] ms_invtlb_vpn; +wire ms_mem_sign_exted; +wire ms_icacop_op_en; +wire ms_br_inst; +wire ms_icache_miss; +wire ms_br_pre; +wire ms_br_pre_error; +wire ms_preld_inst; +wire ms_cacop; +wire ms_idle; +wire [31:0] ms_error_va; + +// difftest +wire ms_cnt_inst ; +wire [63:0] ms_timer_64 ; +wire [31:0] ms_inst ; +wire [ 7:0] ms_inst_ld_en ; +wire [31:0] ms_ld_paddr ; +wire [31:0] ms_ld_vaddr ; +wire [ 7:0] ms_inst_st_en ; +wire [31:0] ms_st_data ; +wire ms_csr_rstat_en ; +wire [31:0] ms_csr_data ; + +assign {ms_csr_data , //424:393 for difftest + ms_csr_rstat_en , //392:392 for difftest + ms_st_data , //391:360 for difftest + ms_inst_st_en , //359:352 for difftest + ms_ld_vaddr , //351:320 for difftest + ms_inst_ld_en , //319:312 for difftest + ms_cnt_inst , //311:311 for difftest + ms_timer_64 , //310:247 for difftest + ms_inst , //246:215 for difftest + ms_error_va , //214:183 + ms_idle , //182:182 + ms_cacop , //181:181 + ms_preld_inst , //180:180 + ms_br_pre_error , //179:179 + ms_br_pre , //178:178 + ms_icache_miss , //177:177 + ms_br_inst , //176:176 + ms_icacop_op_en , //175:175 + ms_mem_sign_exted, //174:174 + ms_invtlb_vpn , //173:155 + ms_invtlb_asid , //154:145 + ms_invtlb , //144:144 + ms_tlbrd , //143:143 + ms_refetch , //142:142 + ms_tlbfill , //141:141 + ms_tlbwr , //140:140 + ms_tlbsrch , //139:139 + ms_store_op , //138:138 + ms_sc_w , //137:137 + ms_ll_w , //136:136 + ms_excp_num , //135:126 + ms_csr_we , //125:125 + ms_csr_idx , //124:111 + ms_csr_result , //110:79 + ms_ertn , //78:78 + ms_excp , //77:77 + ms_mem_size , //76:75 + ms_mul_div_op , //74:71 + ms_load_op , //70:70 + ms_gr_we , //69:69 + ms_dest , //68:64 + ms_exe_result , //63:32 + ms_pc //31:0 + } = es_to_ms_bus_r; + +wire [31:0] mem_result; +wire [31:0] ms_final_result; +wire flush_sign; + +wire [31:0] ms_rdata; +reg [31:0] data_rd_buff; +reg data_buff_enable; + +wire access_mem; + +wire [ 4:0] cacop_op; +wire [ 1:0] cacop_op_mode; + +wire forward_enable; +wire dest_zero; + +wire [31:0] paddr; + +wire [15:0] excp_num; +wire excp; + +wire excp_tlbr; +wire excp_pil ; +wire excp_pis ; +wire excp_pme ; +wire excp_ppi ; + +wire da_mode ; +wire pg_mode ; + +wire sc_addr_eq; + +assign ms_to_ws_bus = {ms_csr_data , //492:461 for difftest + ms_csr_rstat_en, //460:460 for difftest + ms_st_data , //459:428 for difftest + ms_inst_st_en , //427:420 for difftest + ms_ld_vaddr , //419:388 for difftest + ms_ld_paddr , //387:356 for difftest + ms_inst_ld_en , //355:348 for difftest + ms_cnt_inst , //347:347 for difftest + ms_timer_64 , //346:283 for difftest + ms_inst , //282:251 for difftest + data_uncache_en, //250:250 + paddr , //249:218 + ms_idle , //217:217 + ms_br_pre_error, //216:216 + ms_br_pre , //215:215 + dcache_miss , //214:214 + access_mem , //213:213 + ms_icache_miss , //212:212 + ms_br_inst , //211:211 + ms_icacop_op_en, //210:210 + ms_invtlb_vpn , //209:191 + ms_invtlb_asid , //190:181 + ms_invtlb , //180:180 + ms_tlbrd , //179:179 + ms_refetch , //178:178 + ms_tlbfill , //177:177 + ms_tlbwr , //176:176 + data_tlb_index , //175:171 + data_tlb_found , //170:170 + ms_tlbsrch , //169:169 + ms_error_va , //168:137 + ms_sc_w , //136:136 + ms_ll_w , //135:135 + excp_num , //134:119 + ms_csr_we , //118:118 + ms_csr_idx , //117:104 + ms_csr_result , //103:72 + ms_ertn , //71:71 + excp , //70:70 + ms_gr_we , //69:69 + ms_dest , //68:64 + ms_final_result, //63:32 + ms_pc //31:0 + }; + +assign ms_to_ds_valid = ms_valid; + +//cache inst need wait data_data_ok signal +assign ms_ready_go = (data_data_ok || data_buff_enable) || !access_mem || excp || sc_cancel_req; +assign ms_allowin = !ms_valid || ms_ready_go && ws_allowin; +assign ms_to_ws_valid = ms_valid && ms_ready_go; +always @(posedge clk) begin + if (reset || flush_sign) begin + ms_valid <= 1'b0; + end + else if (ms_allowin) begin + ms_valid <= es_to_ms_valid; + end + + if (es_to_ms_valid && ms_allowin) begin + es_to_ms_bus_r <= es_to_ms_bus; + end +end + +assign access_mem = ms_store_op || ms_load_op; + +assign flush_sign = excp_flush || ertn_flush || refetch_flush || icacop_flush || idle_flush; + +assign ms_rdata = data_buff_enable ? data_rd_buff : data_rdata; + +assign sram_addr_low2bit = {ms_exe_result[1], ms_exe_result[0]}; + +wire [7:0] mem_byteLoaded = ({8{sram_addr_low2bit==2'b00}} & ms_rdata[ 7: 0]) | + ({8{sram_addr_low2bit==2'b01}} & ms_rdata[15: 8]) | + ({8{sram_addr_low2bit==2'b10}} & ms_rdata[23:16]) | + ({8{sram_addr_low2bit==2'b11}} & ms_rdata[31:24]) ; + + +wire [15:0] mem_halfLoaded = ({16{sram_addr_low2bit==2'b00}} & ms_rdata[15: 0]) | + ({16{sram_addr_low2bit==2'b10}} & ms_rdata[31:16]) ; + +assign mem_result = ({32{ms_mem_size[0] && ms_mem_sign_exted}} & {{24{mem_byteLoaded[ 7]}}, mem_byteLoaded}) | + ({32{ms_mem_size[0] && ~ms_mem_sign_exted}} & { 24'b0 , mem_byteLoaded}) | + ({32{ms_mem_size[1] && ms_mem_sign_exted}} & {{16{mem_halfLoaded[15]}}, mem_halfLoaded}) | + ({32{ms_mem_size[1] && ~ms_mem_sign_exted}} & { 16'b0 , mem_halfLoaded}) | + ({32{!ms_mem_size}} & ms_rdata ) ; + +assign ms_final_result = ({32{ms_load_op }} & mem_result ) | + ({32{ms_mul_div_op[0]}} & mul_result[31:0] ) | + ({32{ms_mul_div_op[1]}} & mul_result[63:32]) | + ({32{ms_mul_div_op[2]}} & div_result ) | + ({32{ms_mul_div_op[3]}} & mod_result ) | + ({32{!ms_mul_div_op && !ms_load_op}} & (ms_exe_result&{32{!sc_cancel_req}})); + +assign dest_zero = (ms_dest == 5'b0); +assign forward_enable = ms_gr_we & ~dest_zero & ms_valid; +assign dep_need_stall = ms_load_op && !ms_to_ws_valid; +assign ms_to_ds_forward_bus = {dep_need_stall, //38:38 + forward_enable, //37:37 + ms_dest , //36:32 + ms_final_result //31:0 + }; + +//addr trans +assign pg_mode = !csr_da && csr_pg; +//uncache judgement +assign da_mode = csr_da && !csr_pg; + +assign data_addr_trans_en = pg_mode && !dmw0_en && !dmw1_en && !cacop_op_mode_di; + +assign paddr = {data_tlb_ppn, ms_error_va[11:0]}; + +assign sc_addr_eq = (lladdr == paddr[31:4]); +assign sc_cancel_req = (!sc_addr_eq||data_uncache_en) && ms_sc_w && access_mem; + +//addr dmw trans +assign dmw0_en = ((csr_dmw0[`PLV0] && csr_plv == 2'd0) || (csr_dmw0[`PLV3] && csr_plv == 2'd3)) && (ms_error_va[31:29] == csr_dmw0[`VSEG]) && pg_mode; +assign dmw1_en = ((csr_dmw1[`PLV0] && csr_plv == 2'd0) || (csr_dmw1[`PLV3] && csr_plv == 2'd3)) && (ms_error_va[31:29] == csr_dmw1[`VSEG]) && pg_mode; + +assign excp = excp_tlbr || excp_pil || excp_pis || excp_ppi || excp_pme || ms_excp; +assign excp_num = {excp_pil, excp_pis, excp_ppi, excp_pme, excp_tlbr, 1'b0, ms_excp_num}; + +//tlb exception //preld should not generate these excp +assign excp_tlbr = (access_mem || ms_cacop) && !data_tlb_found && data_addr_trans_en; +assign excp_pil = (ms_load_op || ms_cacop) && !data_tlb_v && data_addr_trans_en; //cache will generate pil exception?? +assign excp_pis = ms_store_op && !data_tlb_v && data_addr_trans_en; +assign excp_ppi = access_mem && data_tlb_v && (csr_plv > data_tlb_plv) && data_addr_trans_en; +assign excp_pme = ms_store_op && data_tlb_v && (csr_plv <= data_tlb_plv) && !data_tlb_d && data_addr_trans_en; + +assign tlb_excp_cancel_req = excp_tlbr || excp_pil || excp_pis || excp_ppi || excp_pme; + +assign data_uncache_en = (da_mode && (csr_datm == 2'b0)) || + (dmw0_en && (csr_dmw0[`DMW_MAT] == 2'b0)) || + (dmw1_en && (csr_dmw1[`DMW_MAT] == 2'b0)) || + (data_addr_trans_en && (data_tlb_mat == 2'b0)) || + disable_cache; + +assign ms_flush = (excp | ms_ertn | (ms_csr_we | (ms_ll_w | ms_sc_w) & !excp) | ms_refetch | ms_idle) & ms_valid; + +assign tlb_inst_stall = (ms_tlbsrch || ms_tlbrd) && ms_valid; + +always @(posedge clk) begin + if (reset || (ms_ready_go && ws_allowin) || flush_sign) begin + data_rd_buff <= 32'b0; + data_buff_enable <= 1'b0; + end + else if (data_data_ok && !ws_allowin) begin + data_rd_buff <= data_rdata; + data_buff_enable <= 1'b1; + end +end + +assign ms_wr_tlbehi = ms_csr_we && (ms_csr_idx == 14'h11) && ms_valid; //stall es tlbsrch + +assign cacop_op = ms_dest; +assign cacop_op_mode = cacop_op[4:3]; +assign cacop_op_mode_di = ms_cacop && ((cacop_op_mode == 2'b0) || (cacop_op_mode == 2'b1)); + +reg [ 7:0] tmp_data_index ; +reg [ 3:0] tmp_data_offset ; +always @(posedge clk) begin + tmp_data_index <= data_index_diff; + tmp_data_offset <= data_offset_diff; +end + +assign ms_ld_paddr = {data_tag_diff, tmp_data_index, tmp_data_offset}; + +endmodule diff --git a/rtl/ip/open-la500/mul.v b/rtl/ip/open-la500/mul.v new file mode 100644 index 0000000..9aa9e7e --- /dev/null +++ b/rtl/ip/open-la500/mul.v @@ -0,0 +1,197 @@ +module YDecoder( + input yc, yb, ya, //c -> i+1; b -> i; a -> i-1 + output negx, x, neg2x, _2x + ); + +assign negx = (yc & yb & ~ya) | (yc & ~yb & ya); +assign x = (~yc & ~yb & ya) | (~yc & yb & ~ya); +assign neg2x = (yc & ~yb & ~ya); +assign _2x = (~yc & yb & ya); + +endmodule + + +module BoothBase( + input negx, x, neg2x, _2x, + input InX, + input PosLastX, NegLastX, + output PosNextX, NegNextX, + output OutX + ); + +assign OutX = (negx & ~InX) | (x & InX) | (neg2x & NegLastX) | (_2x & PosLastX); +assign PosNextX = InX; +assign NegNextX = ~InX; + +endmodule + + +module BoothInterBase( + input [2:0] y, + input [63:0] InX, + output [63:0] OutX, + output Carry +); + +wire negx, x, neg2x, _2x; +wire [1:0] CarrySig [64:0]; + +YDecoder uu(.yc(y[2]), .yb(y[1]), .ya(y[0]), .negx(negx), .x(x), .neg2x(neg2x), ._2x(_2x)); + +BoothBase fir(.negx(negx), .x(x), .neg2x(neg2x), ._2x(_2x), .InX(InX[0]), .PosLastX(1'b0), .NegLastX(1'b1), .PosNextX(CarrySig[1][0]), .NegNextX(CarrySig[1][1]), .OutX(OutX[0])); + +generate + genvar i; + for (i=1; i<64; i=i+1) begin: gfor + BoothBase ui( + .negx(negx), + .x(x), + .neg2x(neg2x), + ._2x(_2x), + .InX(InX[i]), + .PosLastX(CarrySig[i][0]), + .NegLastX(CarrySig[i][1]), + .PosNextX(CarrySig[i+1][0]), + .NegNextX(CarrySig[i+1][1]), + .OutX(OutX[i]) + ); + end +endgenerate + +assign Carry = negx || neg2x; + +endmodule + + +module addr( + input A, B, C, + output Carry, S + ); + +assign S = ~A & ~B & C | ~A & B & ~C | A & ~B & ~C | A & B & C; +assign Carry = A & B | A & C | B & C; + +endmodule + + +module WallaceTreeBase( + input [16:0] InData, + input [13:0] CIn, + output [13:0] COut, + output C, S + ); + +//first stage +wire [4:0] FirSig; +addr first1(.A(InData[4]), .B(InData[3]), .C(InData[2]), .Carry(COut[0]), .S(FirSig[0])); +addr first2(.A(InData[7]), .B(InData[6]), .C(InData[5]), .Carry(COut[1]), .S(FirSig[1])); +addr first3(.A(InData[10]), .B(InData[9]), .C(InData[8]), .Carry(COut[2]), .S(FirSig[2])); +addr first4(.A(InData[13]), .B(InData[12]), .C(InData[11]), .Carry(COut[3]), .S(FirSig[3])); +addr first5(.A(InData[16]), .B(InData[15]), .C(InData[14]), .Carry(COut[4]), .S(FirSig[4])); + +//second stage +wire [3:0] SecSig; +addr second1(.A(CIn[2]), .B(CIn[1]), .C(CIn[0]), .Carry(COut[5]), .S(SecSig[0])); +addr second2(.A(InData[0]), .B(CIn[4]), .C(CIn[3]), .Carry(COut[6]), .S(SecSig[1])); +addr second3(.A(FirSig[1]), .B(FirSig[0]), .C(InData[1]), .Carry(COut[7]), .S(SecSig[2])); +addr second4(.A(FirSig[4]), .B(FirSig[3]), .C(FirSig[2]), .Carry(COut[8]), .S(SecSig[3])); + +//third stage +wire [1:0] ThiSig; +addr third1(.A(SecSig[0]), .B(CIn[6]), .C(CIn[5]), .Carry(COut[9]), .S(ThiSig[0])); +addr third2(.A(SecSig[3]), .B(SecSig[2]), .C(SecSig[1]), .Carry(COut[10]), .S(ThiSig[1])); + +//fourth stage +wire [1:0] ForSig; +addr fourth1(.A(CIn[9]), .B(CIn[8]), .C(CIn[7]), .Carry(COut[11]), .S(ForSig[0])); +addr fourth2(.A(ThiSig[1]), .B(ThiSig[0]), .C(CIn[10]), .Carry(COut[12]), .S(ForSig[1])); + +//fifth stage +wire FifSig; +addr fifth1(.A(ForSig[1]), .B(ForSig[0]), .C(CIn[11]), .Carry(COut[13]), .S(FifSig)); + +//sixth stage +addr sixth1(.A(FifSig), .B(CIn[13]), .C(CIn[12]), .Carry(C), .S(S)); + +endmodule + +//------------------------------------------------------------------------------------------------------------------- + +module mul( + input mul_clk, reset, + input mul_signed, + input [31:0] x, y, //x扩展至64位 y扩展至33位 区别有无符号 + output [63:0] result + ); + +wire [63:0] CalX; +wire [32:0] CalY; + +assign CalX = mul_signed ? {{32{x[31]}}, x} : {32'b0, x}; +assign CalY = mul_signed ? {y[31], y} : {1'b0, y}; + +//booth +wire [16:0] Carry; //booth计算得到的进位 +wire [63:0] BoothRes [16:0]; //booth的计算结果 +BoothInterBase fir(.y({CalY[1], CalY[0], 1'b0}), .InX(CalX), .OutX(BoothRes[0]), .Carry(Carry[0])); + +generate + genvar i; + for (i=2; i<32; i=i+2) begin: boothfor + BoothInterBase ai( + .y(CalY[i+1:i-1]), + .InX(CalX<>1]), + .Carry(Carry[i>>1]) + ); + end +endgenerate + +BoothInterBase las(.y({CalY[32], CalY[32], CalY[31]}), .InX(CalX<<32), .OutX(BoothRes[16]), .Carry(Carry[16])); + +reg [16:0] SecStageCarry; +reg [63:0] SecStageBoothRes [16:0]; +integer p; + +always @(posedge mul_clk) begin + if (~reset) begin + SecStageCarry <= Carry; + for(p=0; p<17; p=p+1) begin + SecStageBoothRes[p] <= BoothRes[p]; + end + end +end + +//wallace +wire [13:0] WallaceInter [64:0]; +wire [63:0] COut, SOut; + +WallaceTreeBase firs( + .InData({SecStageBoothRes[0][0], SecStageBoothRes[1][0], SecStageBoothRes[2][0], SecStageBoothRes[3][0], SecStageBoothRes[4][0], SecStageBoothRes[5][0], SecStageBoothRes[6][0], + SecStageBoothRes[7][0], SecStageBoothRes[8][0], SecStageBoothRes[9][0], SecStageBoothRes[10][0], SecStageBoothRes[11][0], SecStageBoothRes[12][0], SecStageBoothRes[13][0], SecStageBoothRes[14][0], + SecStageBoothRes[15][0], SecStageBoothRes[16][0]}), + .CIn(SecStageCarry[13:0]), + .COut(WallaceInter[1]), + .C(COut[0]), + .S(SOut[0]) + ); + +generate + genvar n; + for (n=1; n<64; n=n+1) begin: wallacefor + WallaceTreeBase bi( + .InData({SecStageBoothRes[0][n], SecStageBoothRes[1][n], SecStageBoothRes[2][n], SecStageBoothRes[3][n], SecStageBoothRes[4][n], SecStageBoothRes[5][n], SecStageBoothRes[6][n], + SecStageBoothRes[7][n], SecStageBoothRes[8][n], SecStageBoothRes[9][n], SecStageBoothRes[10][n], SecStageBoothRes[11][n], SecStageBoothRes[12][n], SecStageBoothRes[13][n], SecStageBoothRes[14][n], + SecStageBoothRes[15][n], SecStageBoothRes[16][n]}), + .CIn(WallaceInter[n]), + .COut(WallaceInter[n+1]), + .C(COut[n]), + .S(SOut[n]) + ); + end +endgenerate + +//64bit add +assign result = SOut + {COut[62:0], SecStageCarry[14]} + SecStageCarry[15]; + +endmodule diff --git a/rtl/ip/open-la500/mycpu.h b/rtl/ip/open-la500/mycpu.h new file mode 100644 index 0000000..7a84d1c --- /dev/null +++ b/rtl/ip/open-la500/mycpu.h @@ -0,0 +1,32 @@ +`ifndef MYCPU_H + `define MYCPU_H + +// `define BR_BUS_WD 33 //bug5 32->33 +// `define FS_TO_DS_BUS_WD 109 +// `define DS_TO_ES_BUS_WD 236 +// `define ES_TO_MS_BUS_WD 215 +// `define MS_TO_WS_BUS_WD 218 +// `define WS_TO_RF_BUS_WD 38 +// `define ES_TO_DS_FORWARD_BUS 39 +// `define MS_TO_DS_FORWARD_BUS 39 + + // `define HAS_LACC + `define LACC_OP_SIZE 3 + `define LACC_OP_WIDTH $clog2(`LACC_OP_SIZE) + `define BR_BUS_WD 33 //bug5 32->33 + `define FS_TO_DS_BUS_WD 109 + `define DS_TO_ES_BUS_WD (350 \ + `ifdef HAS_LACC \ + +`LACC_OP_WIDTH+1 \ + `endif \ + ) + + `define ES_TO_MS_BUS_WD 425 + + `define MS_TO_WS_BUS_WD 493 + `define WS_TO_RF_BUS_WD 38 + `define ES_TO_DS_FORWARD_BUS 39 + `define MS_TO_DS_FORWARD_BUS 39 +`endif + +//`define SIMU diff --git a/rtl/ip/open-la500/mycpu_top.v b/rtl/ip/open-la500/mycpu_top.v new file mode 100644 index 0000000..64725d6 --- /dev/null +++ b/rtl/ip/open-la500/mycpu_top.v @@ -0,0 +1,1296 @@ +module core_top +#( + parameter TLBNUM = 32 +) +( + input aclk, + input aresetn, + input [ 7:0] intrpt, + //AXI interface + //read reqest + output [ 3:0] arid, + output [31:0] araddr, + output [ 7:0] arlen, + output [ 2:0] arsize, + output [ 1:0] arburst, + output [ 1:0] arlock, + output [ 3:0] arcache, + output [ 2:0] arprot, + output arvalid, + input arready, + //read back + input [ 3:0] rid, + input [31:0] rdata, + input [ 1:0] rresp, + input rlast, + input rvalid, + output rready, + //write request + output [ 3:0] awid, + output [31:0] awaddr, + output [ 7:0] awlen, + output [ 2:0] awsize, + output [ 1:0] awburst, + output [ 1:0] awlock, + output [ 3:0] awcache, + output [ 2:0] awprot, + output awvalid, + input awready, + //write data + output [ 3:0] wid, + output [31:0] wdata, + output [ 3:0] wstrb, + output wlast, + output wvalid, + input wready, + //write back + input [ 3:0] bid, + input [ 1:0] bresp, + input bvalid, + output bready, + + //debug + input break_point, + input infor_flag, + input [ 4:0] reg_num, + output ws_valid, + output [31:0] rf_rdata, + + output [31:0] debug0_wb_pc, + output [ 3:0] debug0_wb_rf_wen, + output [ 4:0] debug0_wb_rf_wnum, + output [31:0] debug0_wb_rf_wdata, + output [31:0] debug0_wb_inst +); +reg reset; +always @(posedge aclk) reset <= ~aresetn; + +wire ds_allowin; +wire es_allowin; +wire ms_allowin; +wire ws_allowin; +wire fs_to_ds_valid; +wire ds_to_es_valid; +wire es_to_ms_valid; +wire ms_to_ws_valid; +wire [31:0] fs_csr_eentry; +wire [31:0] fs_csr_era; +wire [31:0] ws_csr_era; +wire [ 8:0] ws_csr_esubcode; +wire [ 5:0] ws_csr_ecode; +wire [63:0] ds_timer_64; +wire [31:0] ds_csr_tid; +wire [13:0] rd_csr_addr; +wire [31:0] rd_csr_data; +wire [13:0] wr_csr_addr; +wire [31:0] wr_csr_data; +wire [31:0] ws_bad_va; +wire ws_va_error; +wire ds_llbit; +wire [27:0] lladdr_out; +wire ws_llbit; +wire ws_llbit_set; +wire ws_lladdr_set; +wire [27:0] ws_lladdr; +wire has_int; +wire csr_wr_en; +wire excp_flush; +wire ertn_flush; +wire icacop_flush; +wire idle_flush; +wire es_div_enable; +wire es_mul_div_sign; +wire [31:0] es_rj_value; +wire [31:0] es_rkd_value; +wire div_complete; +wire [31:0] div_result; +wire [31:0] mod_result; +wire [63:0] mul_result; +wire [ 9:0] csr_asid; +wire [ 4:0] rand_index; +wire [31:0] tlbw_tlbehi; +wire [31:0] tlbw_tlbelo0; +wire [31:0] tlbw_tlbelo1; +wire [31:0] tlbw_r_tlbidx; +wire [ 5:0] tlbw_ecode; +wire tlbrd_en; +wire [31:0] tlbr_tlbehi; +wire [31:0] tlbr_tlbelo0; +wire [31:0] tlbr_tlbelo1; +wire [31:0] tlbr_tlbidx; +wire [ 9:0] tlbr_asid; +wire invtlb_en; +wire [ 9:0] invtlb_asid; +wire [18:0] invtlb_vpn; +wire [ 4:0] invtlb_op; +wire [18:0] csr_vppn; +wire inst_tlb_found; +wire inst_tlb_v; +wire inst_tlb_d; +wire [ 1:0] inst_tlb_mat; +wire [ 1:0] inst_tlb_plv; +wire data_tlb_found; +wire [ 4:0] data_tlb_index; +wire data_tlb_v; +wire data_tlb_d; +wire [ 1:0] data_tlb_mat; +wire [ 1:0] data_tlb_plv; +wire tlbsrch_en; +wire tlbfill_en; +wire tlbwr_en; +wire refetch_flush; +wire tlbsrch_found; +wire [ 4:0] tlbsrch_index; +wire ms_wr_tlbehi; +wire ms_flush; +wire excp_tlbrefill; +wire [31:0] csr_tlbrentry; +wire csr_pg; +wire csr_da; +wire [31:0] csr_dmw0; +wire [31:0] csr_dmw1; +wire [ 1:0] csr_plv; +wire [ 1:0] csr_datf; +wire [ 1:0] csr_datm; +wire inst_addr_trans_en; +wire data_addr_trans_en; +wire cacop_op_mode_di; +wire excp_tlb; +wire [18:0] excp_tlb_vppn; +wire icacop_op_en; +wire dcacop_op_en; +wire [ 1:0] cacop_op_mode; +wire icache_unbusy; +wire dcache_unbusy; +wire [31:0] fetch_pc; +wire fetch_en; +wire [31:0] btb_ret_pc; +wire btb_taken; +wire btb_en; +wire [ 4:0] btb_index; +wire btb_add_entry; +wire btb_pop_ras; +wire btb_push_ras; +wire btb_operate_en; +wire btb_delete_entry; +wire btb_pre_error; +wire btb_pre_right; +wire btb_target_error; +wire btb_right_orien; +wire [31:0] btb_right_target; +wire [31:0] btb_operate_pc; +wire [ 4:0] btb_operate_index; +wire es_tlb_inst_stall; +wire ms_tlb_inst_stall; +wire ws_tlb_inst_stall; +wire data_fetch; +wire [`FS_TO_DS_BUS_WD -1:0] fs_to_ds_bus; +wire [`DS_TO_ES_BUS_WD -1:0] ds_to_es_bus; +wire [`ES_TO_MS_BUS_WD -1:0] es_to_ms_bus; +wire [`MS_TO_WS_BUS_WD -1:0] ms_to_ws_bus; +wire [`WS_TO_RF_BUS_WD -1:0] ws_to_rf_bus; +wire [`BR_BUS_WD -1:0] br_bus; +wire [`ES_TO_DS_FORWARD_BUS -1:0] es_to_ds_forward_bus; +wire [`MS_TO_DS_FORWARD_BUS -1:0] ms_to_ds_forward_bus; + +wire [31:0] inst_vaddr; +wire inst_valid; +wire inst_op; +wire [ 7:0] inst_index; +wire [19:0] inst_tag; +wire [ 3:0] inst_offset; +wire [ 3:0] inst_wstrb; +wire [31:0] inst_wdata; +wire inst_addr_ok; +wire inst_data_ok; +wire [31:0] inst_rdata; +wire inst_rd_req; +wire [ 2:0] inst_rd_type; +wire [31:0] inst_rd_addr; +wire inst_rd_rdy; +wire inst_ret_valid; +wire inst_ret_last; +wire [31:0] inst_ret_data; +wire inst_wr_req; +wire [ 2:0] inst_wr_type; +wire [31:0] inst_wr_addr; +wire [ 3:0] inst_wr_wstrb; +wire [127:0] inst_wr_data; +wire inst_wr_rdy; +wire inst_uncache_en; +wire inst_tlb_excp_cancel_req; +wire inst_dmw0_en; +wire inst_dmw1_en; +wire [31:0] data_vaddr; +wire data_valid; +wire data_op; +wire [ 2:0] data_size; +wire [ 7:0] data_index; +wire [19:0] data_tag; +wire [ 3:0] data_offset; +wire [ 3:0] data_wstrb; +wire [31:0] data_wdata; +wire data_addr_ok; +wire data_data_ok; +wire [31:0] data_rdata; +wire data_rd_req; +wire [ 2:0] data_rd_type; +wire [31:0] data_rd_addr; +wire data_rd_rdy; +wire data_ret_valid; +wire data_ret_last; +wire [31:0] data_ret_data; +wire data_wr_req; +wire [ 2:0] data_wr_type; +wire [31:0] data_wr_addr; +wire [ 3:0] data_wr_wstrb; +wire [127:0] data_wr_data; +wire data_wr_rdy; +wire data_uncache_en; +wire data_dmw0_en; +wire data_dmw1_en; +wire data_tlb_excp_cancel_req; +wire sc_cancel_req; +wire dcache_empty; + +wire es_to_ds_valid; +wire ms_to_ds_valid; +wire ws_to_ds_valid; +wire write_buffer_empty; +wire [ 4:0] preld_hint; +wire preld_en; + +wire commit_inst; +wire br_inst; +wire icache_miss; +wire dcache_miss; +wire mem_inst; +wire br_pre; +wire br_pre_error; +wire fs_icache_miss; +wire ms_dcache_miss; +wire disable_cache; + +`ifdef DIFFTEST_EN +// difftest +// from wb_stage +wire ws_valid_diff ; +wire cnt_inst_diff ; +wire [63:0] timer_64_diff ; +wire [ 7:0] inst_ld_en_diff ; +wire [31:0] ld_paddr_diff ; +wire [31:0] ld_vaddr_diff ; +wire [ 7:0] inst_st_en_diff ; +wire [31:0] st_paddr_diff ; +wire [31:0] st_vaddr_diff ; +wire [31:0] st_data_diff ; +wire csr_rstat_en_diff ; +wire [31:0] csr_data_diff ; + +wire inst_valid_diff = ws_valid_diff; +reg cmt_valid ; +reg cmt_cnt_inst ; +reg [63:0] cmt_timer_64 ; +reg [ 7:0] cmt_inst_ld_en ; +reg [31:0] cmt_ld_paddr ; +reg [31:0] cmt_ld_vaddr ; +reg [ 7:0] cmt_inst_st_en ; +reg [31:0] cmt_st_paddr ; +reg [31:0] cmt_st_vaddr ; +reg [31:0] cmt_st_data ; +reg cmt_csr_rstat_en ; +reg [31:0] cmt_csr_data ; + +reg cmt_wen ; +reg [ 7:0] cmt_wdest ; +reg [31:0] cmt_wdata ; +reg [31:0] cmt_pc ; +reg [31:0] cmt_inst ; + +reg cmt_excp_flush ; +reg cmt_ertn ; +reg [5:0] cmt_csr_ecode ; +reg cmt_tlbfill_en ; +reg [4:0] cmt_rand_index ; + +// to difftest debug +reg trap ; +reg [ 7:0] trap_code ; +reg [63:0] cycleCnt ; +reg [63:0] instrCnt ; + +// from regfile +wire [31:0] regs[31:0] ; + +// from csr +wire [31:0] csr_crmd_diff_0 ; +wire [31:0] csr_prmd_diff_0 ; +wire [31:0] csr_ectl_diff_0 ; +wire [31:0] csr_estat_diff_0 ; +wire [31:0] csr_era_diff_0 ; +wire [31:0] csr_badv_diff_0 ; +wire [31:0] csr_eentry_diff_0 ; +wire [31:0] csr_tlbidx_diff_0 ; +wire [31:0] csr_tlbehi_diff_0 ; +wire [31:0] csr_tlbelo0_diff_0 ; +wire [31:0] csr_tlbelo1_diff_0 ; +wire [31:0] csr_asid_diff_0 ; +wire [31:0] csr_save0_diff_0 ; +wire [31:0] csr_save1_diff_0 ; +wire [31:0] csr_save2_diff_0 ; +wire [31:0] csr_save3_diff_0 ; +wire [31:0] csr_tid_diff_0 ; +wire [31:0] csr_tcfg_diff_0 ; +wire [31:0] csr_tval_diff_0 ; +wire [31:0] csr_ticlr_diff_0 ; +wire [31:0] csr_llbctl_diff_0 ; +wire [31:0] csr_tlbrentry_diff_0; +wire [31:0] csr_dmw0_diff_0 ; +wire [31:0] csr_dmw1_diff_0 ; +wire [31:0] csr_pgdl_diff_0 ; +wire [31:0] csr_pgdh_diff_0 ; +`endif + +`ifdef HAS_LACC +wire es_lacc_req; +wire [`LACC_OP_WIDTH-1: 0] es_lacc_command; +wire [31:0] lacc_req_rj; +wire [31:0] lacc_req_rk; +wire lacc_rsp_valid; +wire [31:0] lacc_rsp_rdat; +wire lacc_data_valid; +wire [31:0] lacc_data_addr; +wire lacc_data_read; +wire [31:0] lacc_data_wdata; +wire [ 2:0] lacc_data_size; +wire lacc_drsp_valid; +wire [31:0] lacc_drsp_rdata; +wire [6: 0] lacc_req_imm; +wire lacc_flush; +`endif + +// IF stage +if_stage if_stage( + .clk (aclk ), + .reset (reset ), + //allowin + .ds_allowin (ds_allowin ), + //brbus + .br_bus (br_bus ), + //outputs + .fs_to_ds_valid (fs_to_ds_valid ), + .fs_to_ds_bus (fs_to_ds_bus ), + //exception + .excp_flush (excp_flush ), + .ertn_flush (ertn_flush ), + .refetch_flush (refetch_flush ), + .icacop_flush (icacop_flush ), + .ws_pc (ws_csr_era ), + .csr_eentry (fs_csr_eentry ), + .csr_era (fs_csr_era ), + .excp_tlbrefill (excp_tlbrefill ), + .csr_tlbrentry (csr_tlbrentry ), + .has_int (has_int ), + //idle + .idle_flush (idle_flush ), + // inst cache interface + .inst_valid (inst_valid ), + .inst_op (inst_op ), + .inst_addr (inst_vaddr ), + .inst_wstrb (inst_wstrb ), + .inst_wdata (inst_wdata ), + .inst_addr_ok (inst_addr_ok ), + .inst_data_ok (inst_data_ok ), + .icache_miss (fs_icache_miss ), + .inst_rdata (inst_rdata ), + .inst_uncache_en (inst_uncache_en ), + .tlb_excp_cancel_req (inst_tlb_excp_cancel_req), + //from csr + .csr_pg (csr_pg ), + .csr_da (csr_da ), + .csr_dmw0 (csr_dmw0 ), + .csr_dmw1 (csr_dmw1 ), + .csr_plv (csr_plv ), + .csr_datf (csr_datf ), + .disable_cache (disable_cache ), + //to btb + .fetch_pc (fetch_pc ), + .fetch_en (fetch_en ), + .btb_ret_pc (btb_ret_pc ), + .btb_taken (btb_taken ), + .btb_en (btb_en ), + .btb_index (btb_index ), + //to addr trans + .inst_addr_trans_en(inst_addr_trans_en), + .dmw0_en (inst_dmw0_en ), + .dmw1_en (inst_dmw1_en ), + //tlb + .inst_tlb_found (inst_tlb_found ), + .inst_tlb_v (inst_tlb_v ), + .inst_tlb_d (inst_tlb_d ), + .inst_tlb_mat (inst_tlb_mat ), + .inst_tlb_plv (inst_tlb_plv ) +); +// ID stage +id_stage id_stage( + .clk (aclk ), + .reset (reset ), + //allowin + .es_allowin (es_allowin ), + .ds_allowin (ds_allowin ), + //from fs + .fs_to_ds_valid (fs_to_ds_valid ), + .fs_to_ds_bus (fs_to_ds_bus ), + //from ds forward path + .es_to_ds_forward_bus (es_to_ds_forward_bus), + .ms_to_ds_forward_bus (ms_to_ds_forward_bus), + //to es + .ds_to_es_valid (ds_to_es_valid ), + .ds_to_es_bus (ds_to_es_bus ), + //to fs + .br_bus (br_bus ), + //exception + .excp_flush (excp_flush ), + .ertn_flush (ertn_flush ), + .refetch_flush (refetch_flush ), + .icacop_flush (icacop_flush ), + //idle + .idle_flush (idle_flush ), + //tlb ins + .es_tlb_inst_stall (es_tlb_inst_stall ), + .ms_tlb_inst_stall (ms_tlb_inst_stall ), + .ws_tlb_inst_stall (ws_tlb_inst_stall ), + //interrupt + .has_int (has_int ), + //csr + .rd_csr_addr (rd_csr_addr ), + .rd_csr_data (rd_csr_data ), + .csr_plv (csr_plv ), + //timer 64 + .timer_64 (ds_timer_64 ), + .csr_tid (ds_csr_tid ), + //llbit + .ds_llbit (ds_llbit ), + //every stage valid sign + .es_to_ds_valid (es_to_ds_valid ), + .ms_to_ds_valid (ms_to_ds_valid ), + .ws_to_ds_valid (ws_to_ds_valid ), + //from axi + .write_buffer_empty (write_buffer_empty ), + //from dcache + .dcache_empty (dcache_empty ), + //to btb + .btb_operate_en (btb_operate_en ), + .btb_pop_ras (btb_pop_ras ), + .btb_push_ras (btb_push_ras ), + .btb_add_entry (btb_add_entry ), + .btb_delete_entry (btb_delete_entry ), + .btb_pre_error (btb_pre_error ), + .btb_pre_right (btb_pre_right ), + .btb_target_error (btb_target_error ), + .btb_right_orien (btb_right_orien ), + .btb_right_target (btb_right_target ), + .btb_operate_pc (btb_operate_pc ), + .btb_operate_index (btb_operate_index ), + //debug + .infor_flag (infor_flag ), + .reg_num (reg_num ), + .debug_rf_rdata1 (rf_rdata ), + //to rf: for write back + .ws_to_rf_bus (ws_to_rf_bus ) + `ifdef DIFFTEST_EN + , + .rf_to_diff (regs ) + `endif +); +// EXE stage +exe_stage exe_stage( + .clk (aclk ), + .reset (reset ), + //allowin + .ms_allowin (ms_allowin ), + .es_allowin (es_allowin ), + //from ds + .ds_to_es_valid (ds_to_es_valid ), + .ds_to_es_bus (ds_to_es_bus ), + //to ms + .es_to_ms_valid (es_to_ms_valid ), + .es_to_ms_bus (es_to_ms_bus ), + //to ds forward path + .es_to_ds_forward_bus (es_to_ds_forward_bus), + .es_to_ds_valid (es_to_ds_valid ), + //div_mul + .es_div_enable (es_div_enable ), + .es_mul_div_sign (es_mul_div_sign ), + .es_rj_value (es_rj_value ), + .es_rkd_value (es_rkd_value ), + .div_complete (div_complete ), +`ifdef HAS_LACC + .es_lacc_req (es_lacc_req ), + .es_lacc_command (es_lacc_command ), + .lacc_data_valid (lacc_data_valid ), + .lacc_data_read (lacc_data_read ), + .lacc_data_addr (lacc_data_addr ), + .lacc_data_wdata (lacc_data_wdata ), + .lacc_data_size (lacc_data_size ), + .lacc_rsp_valid (lacc_rsp_valid ), + .lacc_rsp_rdat (lacc_rsp_rdat ), + .lacc_flush (lacc_flush ), + .data_data_ok (data_data_ok ), + .lacc_drsp_valid (lacc_drsp_valid ), + .lacc_req_imm (lacc_req_imm ), +`endif + //exception + .excp_flush (excp_flush ), + .ertn_flush (ertn_flush ), + .refetch_flush (refetch_flush ), + .icacop_flush (icacop_flush ), + //idle + .idle_flush (idle_flush ), + //tlb/cache ins + .tlb_inst_stall (es_tlb_inst_stall ), + //cache ins + .icacop_op_en (icacop_op_en ), + .dcacop_op_en (dcacop_op_en ), + .cacop_op_mode (cacop_op_mode ), + //from icache + .icache_unbusy (icache_unbusy ), + //preld ins + .preld_hint (preld_hint ), + .preld_en (preld_en ), + // data cache interface + .data_valid (data_valid ), + .data_op (data_op ), + .data_size (data_size ), + .data_wstrb (data_wstrb ), + .data_wdata (data_wdata ), + .data_addr_ok (data_addr_ok ), + //from csr + .csr_vppn (csr_vppn ), + //to addr trans + .data_addr (data_vaddr ), + .data_fetch (data_fetch ), + //from ms + .ms_wr_tlbehi (ms_wr_tlbehi ), + .ms_flush (ms_flush ) +); + +div u_div( + .div_clk (aclk ), + .reset (reset ), + .div (es_div_enable ), + .div_signed (es_mul_div_sign), + .x (es_rj_value ), + .y (es_rkd_value ), + .s (div_result ), + .r (mod_result ), + .complete (div_complete ) + ); + +mul u_mul( + .mul_clk (aclk ), + .reset (reset ), + .mul_signed (es_mul_div_sign), + .x (es_rj_value ), + .y (es_rkd_value ), + .result (mul_result ) + ); + +`ifdef HAS_LACC +lacc_core u_lacc_core( + .clk (aclk ), + .reset (reset ), + .lacc_flush (lacc_flush ), + + .lacc_req_valid (es_lacc_req ), + .lacc_req_command(es_lacc_command), + .lacc_req_rj (es_rj_value ), + .lacc_req_rk (es_rkd_value ), + .lacc_req_imm (lacc_req_imm ), + + .lacc_rsp_valid (lacc_rsp_valid ), + .lacc_rsp_rdat (lacc_rsp_rdat ), + + .lacc_data_valid (lacc_data_valid ), + .lacc_data_ready (data_addr_ok ), + .lacc_data_addr (lacc_data_addr ), + .lacc_data_read (lacc_data_read ), + .lacc_data_wdata (lacc_data_wdata ), + .lacc_data_size (lacc_data_size ), + + .lacc_drsp_valid (lacc_drsp_valid ), + .lacc_drsp_rdata (data_rdata ) + ); +`endif + +// MEM stage +mem_stage mem_stage( + .clk (aclk ), + .reset (reset ), + //allowin + .ws_allowin (ws_allowin ), + .ms_allowin (ms_allowin ), + //from es + .es_to_ms_valid (es_to_ms_valid ), + .es_to_ms_bus (es_to_ms_bus ), + //to ws + .ms_to_ws_valid (ms_to_ws_valid ), + .ms_to_ws_bus (ms_to_ws_bus ), + //to ds forward path + .ms_to_ds_forward_bus (ms_to_ds_forward_bus), + .ms_to_ds_valid (ms_to_ds_valid ), + //div mul + .div_result (div_result ), + .mod_result (mod_result ), + .mul_result (mul_result ), + //exception + .excp_flush (excp_flush ), + .ertn_flush (ertn_flush ), + .refetch_flush (refetch_flush ), + .icacop_flush (icacop_flush ), + //idle + .idle_flush (idle_flush ), + //tlb ins + .tlb_inst_stall (ms_tlb_inst_stall ), + //to es + .ms_wr_tlbehi (ms_wr_tlbehi ), + .ms_flush (ms_flush ), + //from cache + .data_data_ok (data_data_ok ), + .dcache_miss (ms_dcache_miss ), + .data_rdata (data_rdata ), + //to cache + .data_uncache_en (data_uncache_en ), + .tlb_excp_cancel_req (data_tlb_excp_cancel_req), + .sc_cancel_req (sc_cancel_req ), + //from csr + .csr_pg (csr_pg ), + .csr_da (csr_da ), + .csr_dmw0 (csr_dmw0 ), + .csr_dmw1 (csr_dmw1 ), + .csr_plv (csr_plv ), + .csr_datm (csr_datm ), + .disable_cache (disable_cache ), + .lladdr (lladdr_out ), + //from addr trans for difftest + .data_index_diff (data_index ), + .data_tag_diff (data_tag ), + .data_offset_diff (data_offset ), + //to addr trans + .data_addr_trans_en (data_addr_trans_en ), + .dmw0_en (data_dmw0_en ), + .dmw1_en (data_dmw1_en ), + .cacop_op_mode_di (cacop_op_mode_di ), + //tlb + .data_tlb_found (data_tlb_found ), + .data_tlb_index (data_tlb_index ), + .data_tlb_v (data_tlb_v ), + .data_tlb_d (data_tlb_d ), + .data_tlb_mat (data_tlb_mat ), + .data_tlb_plv (data_tlb_plv ), + .data_tlb_ppn (data_tag ) +); +// WB stage +wb_stage wb_stage( + .clk (aclk ), + .reset (reset ), + //allowin + .ws_allowin (ws_allowin ), + //from ms + .ms_to_ws_valid (ms_to_ws_valid ), + .ms_to_ws_bus (ms_to_ws_bus ), + //to rf: for write back + .ws_to_rf_bus (ws_to_rf_bus ), + //to ds + .ws_to_ds_valid (ws_to_ds_valid ), + //exception + .csr_era (ws_csr_era ), + .csr_esubcode (ws_csr_esubcode ), + .csr_ecode (ws_csr_ecode ), + .excp_flush (excp_flush ), + .ertn_flush (ertn_flush ), + .refetch_flush (refetch_flush ), + .icacop_flush (icacop_flush ), + .csr_wr_en (csr_wr_en ), + .wr_csr_addr (wr_csr_addr ), + .wr_csr_data (wr_csr_data ), + .va_error (ws_va_error ), + .bad_va (ws_bad_va ), + .excp_tlbrefill (excp_tlbrefill ), + .excp_tlb (excp_tlb ), + .excp_tlb_vppn (excp_tlb_vppn ), + //idle + .idle_flush (idle_flush ), + //llbit + .ws_llbit_set (ws_llbit_set ), + .ws_llbit (ws_llbit ), + .ws_lladdr_set (ws_lladdr_set ), + .ws_lladdr (ws_lladdr ), + //tlb ins + .tlb_inst_stall (ws_tlb_inst_stall), + .tlbsrch_en (tlbsrch_en ), + .tlbsrch_found (tlbsrch_found ), + .tlbsrch_index (tlbsrch_index ), + .tlbfill_en (tlbfill_en ), + .tlbwr_en (tlbwr_en ), + .tlbrd_en (tlbrd_en ), + .invtlb_en (invtlb_en ), + .invtlb_asid (invtlb_asid ), + .invtlb_vpn (invtlb_vpn ), + .invtlb_op (invtlb_op ), + //to perf_counter + .real_valid (commit_inst ), + .real_br_inst (br_inst ), + .real_icache_miss (icache_miss ), + .real_dcache_miss (dcache_miss ), + .real_mem_inst (mem_inst ), + .real_br_pre (br_pre ), + .real_br_pre_error (br_pre_error ), + //debug + .debug_ws_valid (ws_valid ), + .debug_break_point (break_point ), + + //trace debug interface + .debug_wb_pc (debug0_wb_pc ), + .debug_wb_rf_wen (debug0_wb_rf_wen ), + .debug_wb_rf_wnum (debug0_wb_rf_wnum ), + .debug_wb_rf_wdata (debug0_wb_rf_wdata), + .debug_wb_inst (debug0_wb_inst ) +`ifdef DIFFTEST_EN + , + .ws_valid_diff (ws_valid_diff ), + .ws_cnt_inst_diff (cnt_inst_diff ), + .ws_timer_64_diff (timer_64_diff ), + .ws_inst_ld_en_diff (inst_ld_en_diff ), + .ws_ld_paddr_diff (ld_paddr_diff ), + .ws_ld_vaddr_diff (ld_vaddr_diff ), + .ws_inst_st_en_diff (inst_st_en_diff ), + .ws_st_paddr_diff (st_paddr_diff ), + .ws_st_vaddr_diff (st_vaddr_diff ), + .ws_st_data_diff (st_data_diff ), + .ws_csr_rstat_en_diff (csr_rstat_en_diff ), + .ws_csr_data_diff (csr_data_diff ) +`endif +); + +csr #(TLBNUM) u_csr( + .clk (aclk ), + .reset (reset ), + //from to ds + .rd_addr (rd_csr_addr ), + .rd_data (rd_csr_data ), + //timer 64 + .timer_64_out (ds_timer_64 ), + .tid_out (ds_csr_tid ), + //from ws + .csr_wr_en (csr_wr_en ), + .wr_addr (wr_csr_addr ), + .wr_data (wr_csr_data ), + //interrupt + .interrupt (intrpt ), + .has_int (has_int ), + //from ws + .excp_flush (excp_flush ), + .ertn_flush (ertn_flush ), + .era_in (ws_csr_era ), + .esubcode_in (ws_csr_esubcode), + .ecode_in (ws_csr_ecode ), + .va_error_in (ws_va_error ), + .bad_va_in (ws_bad_va ), + .tlbsrch_en (tlbsrch_en ), + .tlbsrch_found (tlbsrch_found ), + .tlbsrch_index (tlbsrch_index ), + .excp_tlbrefill (excp_tlbrefill ), + .excp_tlb (excp_tlb ), + .excp_tlb_vppn (excp_tlb_vppn ), + //from ws llbit + .llbit_in (ws_llbit ), + .llbit_set_in (ws_llbit_set ), + .lladdr_in (ws_lladdr ), + .lladdr_set_in (ws_lladdr_set ), + //to es + .llbit_out (ds_llbit ), + .vppn_out (csr_vppn ), + //to ms + .lladdr_out (lladdr_out ), + //to fs + .eentry_out (fs_csr_eentry ), + .era_out (fs_csr_era ), + .tlbrentry_out (csr_tlbrentry ), + .disable_cache_out (disable_cache), + //to addr trans + .asid_out (csr_asid ), + .rand_index (rand_index ), + .tlbehi_out (tlbw_tlbehi ), + .tlbelo0_out (tlbw_tlbelo0 ), + .tlbelo1_out (tlbw_tlbelo1 ), + .tlbidx_out (tlbw_r_tlbidx ), + .pg_out (csr_pg ), + .da_out (csr_da ), + .dmw0_out (csr_dmw0 ), + .dmw1_out (csr_dmw1 ), + .datf_out (csr_datf ), + .datm_out (csr_datm ), + .ecode_out (tlbw_ecode ), + //from addr trans + .tlbrd_en (tlbrd_en ), + .tlbehi_in (tlbr_tlbehi ), + .tlbelo0_in (tlbr_tlbelo0 ), + .tlbelo1_in (tlbr_tlbelo1 ), + .tlbidx_in (tlbr_tlbidx ), + .asid_in (tlbr_asid ), + //general use + .plv_out (csr_plv ) + //difftest +`ifdef DIFFTEST_EN + , + .csr_crmd_diff (csr_crmd_diff_0 ), + .csr_prmd_diff (csr_prmd_diff_0 ), + .csr_ectl_diff (csr_ectl_diff_0 ), + .csr_estat_diff (csr_estat_diff_0 ), + .csr_era_diff (csr_era_diff_0 ), + .csr_badv_diff (csr_badv_diff_0 ), + .csr_eentry_diff (csr_eentry_diff_0 ), + .csr_tlbidx_diff (csr_tlbidx_diff_0 ), + .csr_tlbehi_diff (csr_tlbehi_diff_0 ), + .csr_tlbelo0_diff (csr_tlbelo0_diff_0 ), + .csr_tlbelo1_diff (csr_tlbelo1_diff_0 ), + .csr_asid_diff (csr_asid_diff_0 ), + .csr_save0_diff (csr_save0_diff_0 ), + .csr_save1_diff (csr_save1_diff_0 ), + .csr_save2_diff (csr_save2_diff_0 ), + .csr_save3_diff (csr_save3_diff_0 ), + .csr_tid_diff (csr_tid_diff_0 ), + .csr_tcfg_diff (csr_tcfg_diff_0 ), + .csr_tval_diff (csr_tval_diff_0 ), + .csr_ticlr_diff (csr_ticlr_diff_0 ), + .csr_llbctl_diff (csr_llbctl_diff_0 ), + .csr_tlbrentry_diff (csr_tlbrentry_diff_0), + .csr_dmw0_diff (csr_dmw0_diff_0 ), + .csr_dmw1_diff (csr_dmw1_diff_0 ), + .csr_pgdl_diff (csr_pgdl_diff_0 ), + .csr_pgdh_diff (csr_pgdh_diff_0 ) +`endif +); + +axi_bridge axi_bridge( + .clk (aclk ), + .reset (reset ), + + .arid (arid ), + .araddr (araddr ), + .arlen (arlen ), + .arsize (arsize ), + .arburst (arburst ), + .arlock (arlock ), + .arcache (arcache ), + .arprot (arprot ), + .arvalid (arvalid ), + .arready (arready ), + + .rid (rid ), + .rdata (rdata ), + .rresp (rresp ), + .rlast (rlast ), + .rvalid (rvalid ), + .rready (rready ), + + .awid (awid ), + .awaddr (awaddr ), + .awlen (awlen ), + .awsize (awsize ), + .awburst (awburst ), + .awlock (awlock ), + .awcache (awcache ), + .awprot (awprot ), + .awvalid (awvalid ), + .awready (awready ), + + .wid (wid ), + .wdata (wdata ), + .wstrb (wstrb ), + .wlast (wlast ), + .wvalid (wvalid ), + .wready (wready ), + + .bid (bid ), + .bresp (bresp ), + .bvalid (bvalid ), + .bready (bready ), + + .inst_rd_req (inst_rd_req ), + .inst_rd_type (inst_rd_type ), + .inst_rd_addr (inst_rd_addr ), + .inst_rd_rdy (inst_rd_rdy ), + .inst_ret_valid (inst_ret_valid ), + .inst_ret_last (inst_ret_last ), + .inst_ret_data (inst_ret_data ), + .inst_wr_req (inst_wr_req ), + .inst_wr_type (inst_wr_type ), + .inst_wr_addr (inst_wr_addr ), + .inst_wr_wstrb (inst_wr_wstrb ), + .inst_wr_data (inst_wr_data ), + .inst_wr_rdy (inst_wr_rdy ), + + + .data_rd_req (data_rd_req ), + .data_rd_type (data_rd_type ), + .data_rd_addr (data_rd_addr ), + .data_rd_rdy (data_rd_rdy ), + .data_ret_valid (data_ret_valid ), + .data_ret_last (data_ret_last ), + .data_ret_data (data_ret_data ), + .data_wr_req (data_wr_req ), + .data_wr_type (data_wr_type ), + .data_wr_addr (data_wr_addr ), + .data_wr_wstrb (data_wr_wstrb ), + .data_wr_data (data_wr_data ), + .data_wr_rdy (data_wr_rdy ), + .write_buffer_empty (write_buffer_empty) +); + +addr_trans #(TLBNUM) addr_trans( + .clk (aclk ), + .asid (csr_asid ), + //trans mode + .inst_addr_trans_en (inst_addr_trans_en), + .data_addr_trans_en (data_addr_trans_en), + //inst addr trans + .inst_fetch (fetch_en ), + .inst_vaddr (inst_vaddr ), + .inst_dmw0_en (inst_dmw0_en ), + .inst_dmw1_en (inst_dmw1_en ), + .inst_index (inst_index ), + .inst_tag (inst_tag ), + .inst_offset (inst_offset ), + .inst_tlb_found (inst_tlb_found ), + .inst_tlb_v (inst_tlb_v ), + .inst_tlb_d (inst_tlb_d ), + .inst_tlb_mat (inst_tlb_mat ), + .inst_tlb_plv (inst_tlb_plv ), + //data addr trans + .data_fetch (data_fetch ), + .data_vaddr (data_vaddr ), + .data_dmw0_en (data_dmw0_en ), + .data_dmw1_en (data_dmw1_en ), + .cacop_op_mode_di (cacop_op_mode_di), + .data_index (data_index ), + .data_tag (data_tag ), + .data_offset (data_offset ), + .data_tlb_found (data_tlb_found ), + .data_tlb_index (data_tlb_index ), + .data_tlb_v (data_tlb_v ), + .data_tlb_d (data_tlb_d ), + .data_tlb_mat (data_tlb_mat ), + .data_tlb_plv (data_tlb_plv ), + //tlbwr tlbfill tlb write + .tlbfill_en (tlbfill_en ), + .tlbwr_en (tlbwr_en ), + .rand_index (rand_index ), + .tlbehi_in (tlbw_tlbehi ), + .tlbelo0_in (tlbw_tlbelo0 ), + .tlbelo1_in (tlbw_tlbelo1 ), + .tlbidx_in (tlbw_r_tlbidx ), + .ecode_in (tlbw_ecode ), + //tlbp tlb read + .tlbehi_out (tlbr_tlbehi ), + .tlbelo0_out (tlbr_tlbelo0 ), + .tlbelo1_out (tlbr_tlbelo1 ), + .tlbidx_out (tlbr_tlbidx ), + .asid_out (tlbr_asid ), + //invtlb + .invtlb_en (invtlb_en ), + .invtlb_asid (invtlb_asid ), + .invtlb_vpn (invtlb_vpn ), + .invtlb_op (invtlb_op ), + //from csr + .csr_dmw0 (csr_dmw0 ), + .csr_dmw1 (csr_dmw1 ), + .csr_da (csr_da ), + .csr_pg (csr_pg ) +); + +icache icache( + .clk (aclk ), + .reset (reset ), +//to from cpu + .valid (inst_valid ), + .op (inst_op ), + .index (inst_index ), + .tag (inst_tag ), + .offset (inst_offset ), + .wstrb (inst_wstrb ), + .wdata (inst_wdata ), + .addr_ok (inst_addr_ok ), + .data_ok (inst_data_ok ), + .rdata (inst_rdata ), + .uncache_en (inst_uncache_en), + .icacop_op_en (icacop_op_en ), + .cacop_op_mode (cacop_op_mode ), + .cacop_op_addr_index (data_index ), + .cacop_op_addr_tag (data_tag ), + .cacop_op_addr_offset (data_offset ), + .icache_unbusy (icache_unbusy ), + .tlb_excp_cancel_req (inst_tlb_excp_cancel_req), +//to from axi + .rd_req (inst_rd_req ), + .rd_type (inst_rd_type ), + .rd_addr (inst_rd_addr ), + .rd_rdy (inst_rd_rdy ), + .ret_valid (inst_ret_valid ), + .ret_last (inst_ret_last ), + .ret_data (inst_ret_data ), + .wr_req (inst_wr_req ), + .wr_type (inst_wr_type ), + .wr_addr (inst_wr_addr ), + .wr_wstrb (inst_wr_wstrb ), + .wr_data (inst_wr_data ), + .wr_rdy (inst_wr_rdy ), + .cache_miss (fs_icache_miss ) +); + +dcache dcache( + .clk (aclk ), + .reset (reset ), +//to from cpu + .valid (data_valid ), + .op (data_op ), + .size (data_size ), + .index (data_index ), + .tag (data_tag ), + .offset (data_offset ), + .wstrb (data_wstrb ), + .wdata (data_wdata ), + .addr_ok (data_addr_ok ), + .data_ok (data_data_ok ), + .rdata (data_rdata ), + .uncache_en (data_uncache_en), + .dcacop_op_en (dcacop_op_en ), + .cacop_op_mode (cacop_op_mode ), + .preld_hint (preld_hint ), + .preld_en (preld_en ), + .tlb_excp_cancel_req (data_tlb_excp_cancel_req), + .sc_cancel_req (sc_cancel_req ), + .dcache_empty (dcache_empty ), +//to from axi + .rd_req (data_rd_req ), + .rd_type (data_rd_type ), + .rd_addr (data_rd_addr ), + .rd_rdy (data_rd_rdy ), + .ret_valid (data_ret_valid ), + .ret_last (data_ret_last ), + .ret_data (data_ret_data ), + .wr_req (data_wr_req ), + .wr_type (data_wr_type ), + .wr_addr (data_wr_addr ), + .wr_wstrb (data_wr_wstrb ), + .wr_data (data_wr_data ), + .wr_rdy (data_wr_rdy ), + .cache_miss (ms_dcache_miss ) +); + +btb btb( + .clk (aclk ), + .reset (reset ), + //from/to if + .fetch_pc (fetch_pc ), + .fetch_en (fetch_en ), + .ret_pc (btb_ret_pc ), + .taken (btb_taken ), + .ret_en (btb_en ), + .ret_index (btb_index ), + //from id + .operate_en (btb_operate_en ), + .operate_pc (btb_operate_pc ), + .operate_index (btb_operate_index), + .pop_ras (btb_pop_ras ), + .push_ras (btb_push_ras ), + .add_entry (btb_add_entry ), + .delete_entry (btb_delete_entry ), + .pre_error (btb_pre_error ), + .pre_right (btb_pre_right ), + .target_error (btb_target_error ), + .right_orien (btb_right_orien ), + .right_target (btb_right_target ) +); + +perf_counter perf_counter( + .clk (aclk ), + .reset (reset ), + .dcache_miss (dcache_miss ), + .icache_miss (icache_miss ), + .commit_inst (commit_inst ), + .br_inst (br_inst ), + .mem_inst (mem_inst ), + .br_pre (br_pre ), + .br_pre_error (br_pre_error ) +); + +`ifdef DIFFTEST_EN +always @(posedge aclk) begin + if (reset) begin + {cmt_valid, cmt_cnt_inst, cmt_timer_64, cmt_inst_ld_en, cmt_ld_paddr, cmt_ld_vaddr, cmt_inst_st_en, cmt_st_paddr, cmt_st_vaddr, cmt_st_data, cmt_csr_rstat_en, cmt_csr_data} <= 0; + {cmt_wen, cmt_wdest, cmt_wdata, cmt_pc, cmt_inst} <= 0; + {trap, trap_code, cycleCnt, instrCnt} <= 0; + end else if (~trap) begin + cmt_valid <= inst_valid_diff ; + cmt_cnt_inst <= cnt_inst_diff ; + cmt_timer_64 <= timer_64_diff ; + cmt_inst_ld_en <= inst_ld_en_diff ; + cmt_ld_paddr <= ld_paddr_diff ; + cmt_ld_vaddr <= ld_vaddr_diff ; + cmt_inst_st_en <= inst_st_en_diff ; + cmt_st_paddr <= st_paddr_diff ; + cmt_st_vaddr <= st_vaddr_diff ; + cmt_st_data <= st_data_diff ; + cmt_csr_rstat_en<= csr_rstat_en_diff ; + cmt_csr_data <= csr_data_diff ; + + cmt_wen <= debug0_wb_rf_wen ; + cmt_wdest <= {3'd0, debug0_wb_rf_wnum} ; + cmt_wdata <= debug0_wb_rf_wdata ; + cmt_pc <= debug0_wb_pc ; + cmt_inst <= debug0_wb_inst ; + + cmt_excp_flush <= excp_flush ; + cmt_ertn <= ertn_flush ; + cmt_csr_ecode <= ws_csr_ecode ; + cmt_tlbfill_en <= tlbfill_en ; + cmt_rand_index <= rand_index ; + + trap <= 0 ; + trap_code <= regs[10][7:0] ; + cycleCnt <= cycleCnt + 1 ; + instrCnt <= instrCnt + inst_valid_diff; + end +end + +DifftestInstrCommit DifftestInstrCommit( + .clock (aclk ), + .coreid (0 ), + .index (0 ), + .valid (cmt_valid ), + .pc (cmt_pc ), + .instr (cmt_inst ), + .skip (0 ), + .is_TLBFILL (cmt_tlbfill_en ), + .TLBFILL_index (cmt_rand_index ), + .is_CNTinst (cmt_cnt_inst ), + .timer_64_value (cmt_timer_64 ), + .wen (cmt_wen ), + .wdest (cmt_wdest ), + .wdata (cmt_wdata ), + .csr_rstat (cmt_csr_rstat_en), + .csr_data (cmt_csr_data ) +); + +DifftestExcpEvent DifftestExcpEvent( + .clock (aclk ), + .coreid (0 ), + .excp_valid (cmt_excp_flush ), + .eret (cmt_ertn ), + .intrNo (csr_estat_diff_0[12:2]), + .cause (cmt_csr_ecode ), + .exceptionPC (cmt_pc ), + .exceptionInst (cmt_inst ) +); + +DifftestTrapEvent DifftestTrapEvent( + .clock (aclk ), + .coreid (0 ), + .valid (trap ), + .code (trap_code ), + .pc (cmt_pc ), + .cycleCnt (cycleCnt ), + .instrCnt (instrCnt ) +); + +DifftestStoreEvent DifftestStoreEvent( + .clock (aclk ), + .coreid (0 ), + .index (0 ), + .valid (cmt_inst_st_en ), + .storePAddr (cmt_st_paddr ), + .storeVAddr (cmt_st_vaddr ), + .storeData (cmt_st_data ) +); + +DifftestLoadEvent DifftestLoadEvent( + .clock (aclk ), + .coreid (0 ), + .index (0 ), + .valid (cmt_inst_ld_en ), + .paddr (cmt_ld_paddr ), + .vaddr (cmt_ld_vaddr ) +); + +DifftestCSRRegState DifftestCSRRegState( + .clock (aclk ), + .coreid (0 ), + .crmd (csr_crmd_diff_0 ), + .prmd (csr_prmd_diff_0 ), + .euen (0 ), + .ecfg (csr_ectl_diff_0 ), + .estat (csr_estat_diff_0 ), + .era (csr_era_diff_0 ), + .badv (csr_badv_diff_0 ), + .eentry (csr_eentry_diff_0 ), + .tlbidx (csr_tlbidx_diff_0 ), + .tlbehi (csr_tlbehi_diff_0 ), + .tlbelo0 (csr_tlbelo0_diff_0 ), + .tlbelo1 (csr_tlbelo1_diff_0 ), + .asid (csr_asid_diff_0 ), + .pgdl (csr_pgdl_diff_0 ), + .pgdh (csr_pgdh_diff_0 ), + .save0 (csr_save0_diff_0 ), + .save1 (csr_save1_diff_0 ), + .save2 (csr_save2_diff_0 ), + .save3 (csr_save3_diff_0 ), + .tid (csr_tid_diff_0 ), + .tcfg (csr_tcfg_diff_0 ), + .tval (csr_tval_diff_0 ), + .ticlr (csr_ticlr_diff_0 ), + .llbctl (csr_llbctl_diff_0 ), + .tlbrentry (csr_tlbrentry_diff_0), + .dmw0 (csr_dmw0_diff_0 ), + .dmw1 (csr_dmw1_diff_0 ) +); + +DifftestGRegState DifftestGRegState( + .clock (aclk ), + .coreid (0 ), + .gpr_0 (0 ), + .gpr_1 (regs[1] ), + .gpr_2 (regs[2] ), + .gpr_3 (regs[3] ), + .gpr_4 (regs[4] ), + .gpr_5 (regs[5] ), + .gpr_6 (regs[6] ), + .gpr_7 (regs[7] ), + .gpr_8 (regs[8] ), + .gpr_9 (regs[9] ), + .gpr_10 (regs[10] ), + .gpr_11 (regs[11] ), + .gpr_12 (regs[12] ), + .gpr_13 (regs[13] ), + .gpr_14 (regs[14] ), + .gpr_15 (regs[15] ), + .gpr_16 (regs[16] ), + .gpr_17 (regs[17] ), + .gpr_18 (regs[18] ), + .gpr_19 (regs[19] ), + .gpr_20 (regs[20] ), + .gpr_21 (regs[21] ), + .gpr_22 (regs[22] ), + .gpr_23 (regs[23] ), + .gpr_24 (regs[24] ), + .gpr_25 (regs[25] ), + .gpr_26 (regs[26] ), + .gpr_27 (regs[27] ), + .gpr_28 (regs[28] ), + .gpr_29 (regs[29] ), + .gpr_30 (regs[30] ), + .gpr_31 (regs[31] ) +); +`endif +endmodule diff --git a/rtl/ip/open-la500/perf_counter.v b/rtl/ip/open-la500/perf_counter.v new file mode 100644 index 0000000..7fa24d4 --- /dev/null +++ b/rtl/ip/open-la500/perf_counter.v @@ -0,0 +1,57 @@ +module perf_counter ( + input clk , + input reset , + + input dcache_miss , + input icache_miss , + input commit_inst , + input br_inst , + input mem_inst , + input br_pre , + input br_pre_error +); + +reg[31:0] dcache_miss_counter; +reg[31:0] icache_miss_counter; +reg[31:0] commit_inst_counter; +reg[31:0] br_inst_counter; +reg[31:0] mem_inst_counter; +reg[31:0] br_pre_counter; +reg[31:0] br_pre_error_counter; + +always @(posedge clk) begin + if (reset) begin + dcache_miss_counter <= 32'b0; + icache_miss_counter <= 32'b0; + commit_inst_counter <= 32'b0; + br_inst_counter <= 32'b0; + mem_inst_counter <= 32'b0; + br_pre_counter <= 32'b0; + br_pre_error_counter <= 32'b0; + end + else begin + if (dcache_miss) begin + dcache_miss_counter <= dcache_miss_counter + 32'b1; + end + if (icache_miss) begin + icache_miss_counter <= icache_miss_counter + 32'b1; + end + if (commit_inst) begin + commit_inst_counter <= commit_inst_counter + 32'b1; + end + if (br_inst) begin + br_inst_counter <= br_inst_counter + 32'b1; + end + if (mem_inst) begin + mem_inst_counter <= mem_inst_counter + 32'b1; + end + if (br_pre) begin + br_pre_counter <= br_pre_counter + 32'b1; + end + if (br_pre_error) begin + br_pre_error_counter <= br_pre_error_counter + 32'b1; + end + end +end + +endmodule diff --git a/rtl/ip/open-la500/regfile.v b/rtl/ip/open-la500/regfile.v new file mode 100644 index 0000000..3caa2b6 --- /dev/null +++ b/rtl/ip/open-la500/regfile.v @@ -0,0 +1,39 @@ +module regfile( + input clk, + // READ PORT 1 + input [ 4:0] raddr1, + output [31:0] rdata1, + // READ PORT 2 + input [ 4:0] raddr2, + output [31:0] rdata2, + // WRITE PORT + input we, //write enable, HIGH valid + input [ 4:0] waddr, + input [31:0] wdata + `ifdef DIFFTEST_EN + , + output [31:0] rf_o [31:0] // difftest + `endif +); +reg [31:0] rf[31:0]; + +//WRITE +always @(posedge clk) begin + if (we) rf[waddr]<= wdata; +end + +//READ OUT 1 +assign rdata1 = (raddr1==5'b0) ? 32'b0 : + ((raddr1==waddr) && we) ? wdata : + rf[raddr1]; + +//READ OUT 2 +assign rdata2 = (raddr2==5'b0) ? 32'b0 : + ((raddr2==waddr) && we) ? wdata : + rf[raddr2]; +// difftest +`ifdef DIFFTEST_EN +assign rf_o = rf; +`endif + +endmodule diff --git a/rtl/ip/open-la500/tlb_entry.v b/rtl/ip/open-la500/tlb_entry.v new file mode 100644 index 0000000..0dad79a --- /dev/null +++ b/rtl/ip/open-la500/tlb_entry.v @@ -0,0 +1,235 @@ +module tlb_entry +#( + parameter TLBNUM = 32 +) +( + input clk, + // search port 0 + input s0_fetch , + input [18:0] s0_vppn , + input s0_odd_page , + input [ 9:0] s0_asid , + output s0_found , + output [ 4:0] s0_index , + output [ 5:0] s0_ps , + output [19:0] s0_ppn , + output s0_v , + output s0_d , + output [ 1:0] s0_mat , + output [ 1:0] s0_plv , + //search port 1 + input s1_fetch , + input [18:0] s1_vppn , + input s1_odd_page , + input [ 9:0] s1_asid , + output s1_found , + output [ 4:0] s1_index , + output [ 5:0] s1_ps , + output [19:0] s1_ppn , + output s1_v , + output s1_d , + output [ 1:0] s1_mat , + output [ 1:0] s1_plv , + // write port + input we , + input [$clog2(TLBNUM)-1:0] w_index , + input [18:0] w_vppn , + input [ 9:0] w_asid , + input w_g , + input [ 5:0] w_ps , + input w_e , + input w_v0 , + input w_d0 , + input [ 1:0] w_mat0 , + input [ 1:0] w_plv0 , + input [19:0] w_ppn0 , + input w_v1 , + input w_d1 , + input [ 1:0] w_mat1 , + input [ 1:0] w_plv1 , + input [19:0] w_ppn1 , + // read port + input [$clog2(TLBNUM)-1:0] r_index , + output [18:0] r_vppn , + output [ 9:0] r_asid , + output r_g , + output [ 5:0] r_ps , + output r_e , + output r_v0 , + output r_d0 , + output [ 1:0] r_mat0 , + output [ 1:0] r_plv0 , + output [19:0] r_ppn0 , + output r_v1 , + output r_d1 , + output [ 1:0] r_mat1 , + output [ 1:0] r_plv1 , + output [19:0] r_ppn1 , + // invalid port + input inv_en , + input [ 4:0] inv_op , + input [ 9:0] inv_asid , + input [18:0] inv_vpn +); + +reg [18:0] tlb_vppn [TLBNUM-1:0]; +reg tlb_e [TLBNUM-1:0]; +reg [ 9:0] tlb_asid [TLBNUM-1:0]; +reg tlb_g [TLBNUM-1:0]; +reg [ 5:0] tlb_ps [TLBNUM-1:0]; +reg [19:0] tlb_ppn0 [TLBNUM-1:0]; +reg [ 1:0] tlb_plv0 [TLBNUM-1:0]; +reg [ 1:0] tlb_mat0 [TLBNUM-1:0]; +reg tlb_d0 [TLBNUM-1:0]; +reg tlb_v0 [TLBNUM-1:0]; +reg [19:0] tlb_ppn1 [TLBNUM-1:0]; +reg [ 1:0] tlb_plv1 [TLBNUM-1:0]; +reg [ 1:0] tlb_mat1 [TLBNUM-1:0]; +reg tlb_d1 [TLBNUM-1:0]; +reg tlb_v1 [TLBNUM-1:0]; + +reg s0_fetch_r ; +reg [18:0] s0_vppn_r ; +reg s0_odd_page_r; +reg [ 9:0] s0_asid_r ; +reg s1_fetch_r ; +reg [18:0] s1_vppn_r ; +reg s1_odd_page_r; +reg [ 9:0] s1_asid_r ; + +wire [TLBNUM-1:0] match0; +wire [TLBNUM-1:0] match1; + +wire [$clog2(TLBNUM)-1:0] match0_en; +wire [$clog2(TLBNUM)-1:0] match1_en; + +wire [TLBNUM-1:0] s0_odd_page_buffer; +wire [TLBNUM-1:0] s1_odd_page_buffer; + +always @(posedge clk) begin + s0_fetch_r <= s0_fetch; + if (s0_fetch) begin + s0_vppn_r <= s0_vppn; + s0_odd_page_r <= s0_odd_page; + s0_asid_r <= s0_asid; + end + s1_fetch_r <= s1_fetch; + if (s1_fetch) begin + s1_vppn_r <= s1_vppn; + s1_odd_page_r <= s1_odd_page; + s1_asid_r <= s1_asid; + end +end + +genvar i; +generate + for (i = 0; i < TLBNUM; i = i + 1) + begin: match + assign s0_odd_page_buffer[i] = (tlb_ps[i] == 6'd12) ? s0_odd_page_r : s0_vppn_r[8]; + assign match0[i] = tlb_e[i] && ((tlb_ps[i] == 6'd12) ? s0_vppn_r == tlb_vppn[i] : s0_vppn_r[18: 9] == tlb_vppn[i][18: 9]) && ((s0_asid_r == tlb_asid[i]) || tlb_g[i]); + assign s1_odd_page_buffer[i] = (tlb_ps[i] == 6'd12) ? s1_odd_page_r : s1_vppn_r[8]; + assign match1[i] = tlb_e[i] && ((tlb_ps[i] == 6'd12) ? s1_vppn_r == tlb_vppn[i] : s1_vppn_r[18: 9] == tlb_vppn[i][18: 9]) && ((s1_asid_r == tlb_asid[i]) || tlb_g[i]); + end +endgenerate + +encoder_32_5 en_match0 (.in({{(32-TLBNUM){1'b0}},match0}), .out(match0_en)); +encoder_32_5 en_match1 (.in({{(32-TLBNUM){1'b0}},match1}), .out(match1_en)); + +assign s0_found = |match0; +assign s0_index = {{(5-$clog2(TLBNUM)){1'b0}},match0_en}; +assign s0_ps = tlb_ps[match0_en]; +assign s0_ppn = s0_odd_page_buffer[match0_en] ? tlb_ppn1[match0_en] : tlb_ppn0[match0_en]; +assign s0_v = s0_odd_page_buffer[match0_en] ? tlb_v1[match0_en] : tlb_v0[match0_en] ; +assign s0_d = s0_odd_page_buffer[match0_en] ? tlb_d1[match0_en] : tlb_d0[match0_en] ; +assign s0_mat = s0_odd_page_buffer[match0_en] ? tlb_mat1[match0_en] : tlb_mat0[match0_en]; +assign s0_plv = s0_odd_page_buffer[match0_en] ? tlb_plv1[match0_en] : tlb_plv0[match0_en]; + +assign s1_found = |match1; +assign s1_index = {{(5-$clog2(TLBNUM)){1'b0}},match1_en}; +assign s1_ps = tlb_ps[match1_en]; +assign s1_ppn = s1_odd_page_buffer[match1_en] ? tlb_ppn1[match1_en] : tlb_ppn0[match1_en]; +assign s1_v = s1_odd_page_buffer[match1_en] ? tlb_v1[match1_en] : tlb_v0[match1_en] ; +assign s1_d = s1_odd_page_buffer[match1_en] ? tlb_d1[match1_en] : tlb_d0[match1_en] ; +assign s1_mat = s1_odd_page_buffer[match1_en] ? tlb_mat1[match1_en] : tlb_mat0[match1_en]; +assign s1_plv = s1_odd_page_buffer[match1_en] ? tlb_plv1[match1_en] : tlb_plv0[match1_en]; + +always @(posedge clk) begin + if (we) begin + tlb_vppn [w_index] <= w_vppn; + tlb_asid [w_index] <= w_asid; + tlb_g [w_index] <= w_g; + tlb_ps [w_index] <= w_ps; + tlb_ppn0 [w_index] <= w_ppn0; + tlb_plv0 [w_index] <= w_plv0; + tlb_mat0 [w_index] <= w_mat0; + tlb_d0 [w_index] <= w_d0; + tlb_v0 [w_index] <= w_v0; + tlb_ppn1 [w_index] <= w_ppn1; + tlb_plv1 [w_index] <= w_plv1; + tlb_mat1 [w_index] <= w_mat1; + tlb_d1 [w_index] <= w_d1; + tlb_v1 [w_index] <= w_v1; + end +end + +assign r_vppn = tlb_vppn [r_index]; +assign r_asid = tlb_asid [r_index]; +assign r_g = tlb_g [r_index]; +assign r_ps = tlb_ps [r_index]; +assign r_e = tlb_e [r_index]; +assign r_v0 = tlb_v0 [r_index]; +assign r_d0 = tlb_d0 [r_index]; +assign r_mat0 = tlb_mat0 [r_index]; +assign r_plv0 = tlb_plv0 [r_index]; +assign r_ppn0 = tlb_ppn0 [r_index]; +assign r_v1 = tlb_v1 [r_index]; +assign r_d1 = tlb_d1 [r_index]; +assign r_mat1 = tlb_mat1 [r_index]; +assign r_plv1 = tlb_plv1 [r_index]; +assign r_ppn1 = tlb_ppn1 [r_index]; + +//tlb entry invalid +generate + for (i = 0; i < TLBNUM; i = i + 1) + begin: invalid_tlb_entry + always @(posedge clk) begin + if (we && (w_index == i)) begin + tlb_e[i] <= w_e; + end + else if (inv_en) begin + if (inv_op == 5'd0 || inv_op == 5'd1) begin + tlb_e[i] <= 1'b0; + end + else if (inv_op == 5'd2) begin + if (tlb_g[i]) begin + tlb_e[i] <= 1'b0; + end + end + else if (inv_op == 5'd3) begin + if (!tlb_g[i]) begin + tlb_e[i] <= 1'b0; + end + end + else if (inv_op == 5'd4) begin + if (!tlb_g[i] && (tlb_asid[i] == inv_asid)) begin + tlb_e[i] <= 1'b0; + end + end + else if (inv_op == 5'd5) begin + if (!tlb_g[i] && (tlb_asid[i] == inv_asid) && + ((tlb_ps[i] == 6'd12) ? (tlb_vppn[i] == inv_vpn) : (tlb_vppn[i][18:9] == inv_vpn[18:9]))) begin + tlb_e[i] <= 1'b0; + end + end + else if (inv_op == 5'd6) begin + if ((tlb_g[i] || (tlb_asid[i] == inv_asid)) && + ((tlb_ps[i] == 6'd12) ? (tlb_vppn[i] == inv_vpn) : (tlb_vppn[i][18:9] == inv_vpn[18:9]))) begin + tlb_e[i] <= 1'b0; + end + end + end + end + end +endgenerate + +endmodule diff --git a/rtl/ip/open-la500/tools.v b/rtl/ip/open-la500/tools.v new file mode 100644 index 0000000..28022d1 --- /dev/null +++ b/rtl/ip/open-la500/tools.v @@ -0,0 +1,167 @@ +module decoder_2_4( + input [ 1:0] in, + output [ 3:0] out +); + +genvar i; +generate for (i=0; i<4; i=i+1) begin : gen_for_dec_2_4 + assign out[i] = (in == i); +end endgenerate + +endmodule + + +module encoder_4_2( + input [3:0] in, + output [1:0] out +); + +assign out = {2{in[0]}} & 2'd0 | + {2{in[1]}} & 2'd1 | + {2{in[2]}} & 2'd2 | + {2{in[3]}} & 2'd3 ; + +endmodule + +module decoder_4_16( + input [ 3:0] in, + output [15:0] out +); + +genvar i; +generate for (i=0; i<16; i=i+1) begin : gen_for_dec_4_16 + assign out[i] = (in == i); +end endgenerate + +endmodule + +module encoder_16_4( + input [15:0] in, + output [ 3:0] out +); + +wire [1:0] out_0, out_1, out_2, out_3; + +encoder_4_2 one (.in(in[ 3: 0]), .out(out_0)); +encoder_4_2 two (.in(in[ 7: 4]), .out(out_1)); +encoder_4_2 thr (.in(in[11: 8]), .out(out_2)); +encoder_4_2 fou (.in(in[15:12]), .out(out_3)); + +assign out = {4{|in[ 3: 0]}} & {2'd0, out_0} | + {4{|in[ 7: 4]}} & {2'd1, out_1} | + {4{|in[11: 8]}} & {2'd2, out_2} | + {4{|in[15:12]}} & {2'd3, out_3} ; + +endmodule + +module decoder_5_32( + input [ 4:0] in, + output [31:0] out +); + +genvar i; +generate for (i=0; i<32; i=i+1) begin : gen_for_dec_5_32 + assign out[i] = (in == i); +end endgenerate + +endmodule + +module encoder_32_5( + input [31:0] in, + output [ 4:0] out +); + +wire [3:0] out_0, out_1; + +encoder_16_4 one (.in(in[15: 0]), .out(out_0)); +encoder_16_4 two (.in(in[31:16]), .out(out_1)); + +assign out = {5{|in[15: 0]}} & {1'd0, out_0} | + {5{|in[31:16]}} & {1'd1, out_1} ; + +endmodule + + +module decoder_6_64( + input [ 5:0] in, + output [63:0] out +); + +genvar i; +generate + for (i=0; i<64; i=i+1) + begin : gen_for_dec_6_64 //bug7 + assign out[i] = (in == i); + end +endgenerate + +endmodule + +module one_valid_n #( + parameter n = 16 +)( + input [n-1:0] in, + output [n-1:0] out, + output nozero +); + +wire [n-1:0] one_in; + +assign one_in[0] = in[0]; + +genvar i; +generate + for (i=1; i + [11] tlbr | + [12] pme |data tlb exceptions + [13] ppi | + [14] pis | + [15] pil | + +*/ + +//exception have piority, onle one exception is valid +assign {csr_ecode, + va_error, + bad_va, + csr_esubcode, + excp_tlbrefill, + excp_tlb, + excp_tlb_vppn} = ws_excp_num[ 0] ? {`ECODE_INT , 1'b0 , 32'b0 , 9'b0 , 1'b0 , 1'b0 , 19'b0 } : + ws_excp_num[ 1] ? {`ECODE_ADEF, ws_valid, ws_pc , `ESUBCODE_ADEF, 1'b0 , 1'b0 , 19'b0 } : + ws_excp_num[ 2] ? {`ECODE_TLBR, ws_valid, ws_pc , 9'b0 , ws_valid, ws_valid, ws_pc[31:13] } : + ws_excp_num[ 3] ? {`ECODE_PIF , ws_valid, ws_pc , 9'b0 , 1'b0 , ws_valid, ws_pc[31:13] } : + ws_excp_num[ 4] ? {`ECODE_PPI , ws_valid, ws_pc , 9'b0 , 1'b0 , ws_valid, ws_pc[31:13] } : + ws_excp_num[ 5] ? {`ECODE_SYS , 1'b0 , 32'b0 , 9'b0 , 1'b0 , 1'b0 , 19'b0 } : + ws_excp_num[ 6] ? {`ECODE_BRK , 1'b0 , 32'b0 , 9'b0 , 1'b0 , 1'b0 , 19'b0 } : + ws_excp_num[ 7] ? {`ECODE_INE , 1'b0 , 32'b0 , 9'b0 , 1'b0 , 1'b0 , 19'b0 } : + ws_excp_num[ 8] ? {`ECODE_IPE , 1'b0 , 32'b0 , 9'b0 , 1'b0 , 1'b0 , 19'b0 } : //close ipe excp now + ws_excp_num[ 9] ? {`ECODE_ALE , ws_valid, ws_error_va, 9'b0 , 1'b0 , 1'b0 , 19'b0 } : + ws_excp_num[11] ? {`ECODE_TLBR, ws_valid, ws_error_va, 9'b0 , ws_valid, ws_valid, ws_error_va[31:13]} : + ws_excp_num[12] ? {`ECODE_PME , ws_valid, ws_error_va, 9'b0 , 1'b0 , ws_valid, ws_error_va[31:13]} : + ws_excp_num[13] ? {`ECODE_PPI , ws_valid, ws_error_va, 9'b0 , 1'b0 , ws_valid, ws_error_va[31:13]} : + ws_excp_num[14] ? {`ECODE_PIS , ws_valid, ws_error_va, 9'b0 , 1'b0 , ws_valid, ws_error_va[31:13]} : + ws_excp_num[15] ? {`ECODE_PIL , ws_valid, ws_error_va, 9'b0 , 1'b0 , ws_valid, ws_error_va[31:13]} : + 69'b0; + +//invtlb ins +assign invtlb_op = ws_dest; + +// debug info generate +assign debug_wb_pc = ws_pc; +assign debug_wb_rf_wen = {4{rf_we}}; +assign debug_wb_rf_wnum = ws_dest; +assign debug_wb_rf_wdata = ws_final_result; +assign debug_wb_inst = ws_inst; +assign debug_ws_valid = ws_valid; + +`ifdef DIFFTEST_EN +assign ws_valid_diff = real_valid ; +assign ws_timer_64_diff = ws_timer_64 ; +assign ws_cnt_inst_diff = ws_cnt_inst ; + +assign ws_inst_ld_en_diff = ws_inst_ld_en ; +assign ws_ld_paddr_diff = ws_ld_paddr ; +assign ws_ld_vaddr_diff = ws_ld_vaddr ; + +assign ws_inst_st_en_diff = ws_inst_st_en ; +assign ws_st_paddr_diff = ws_ld_paddr_diff ; +assign ws_st_vaddr_diff = ws_ld_vaddr_diff ; +assign ws_st_data_diff = ws_st_data ; + +assign ws_csr_rstat_en_diff = ws_csr_rstat_en ; +assign ws_csr_data_diff = ws_csr_data ; +`endif + +endmodule diff --git a/rtl/ip/ram_wrap/axi_wrap_ram_dp.v b/rtl/ip/ram_wrap/axi_wrap_ram_dp.v new file mode 100644 index 0000000..d8d67d8 --- /dev/null +++ b/rtl/ip/ram_wrap/axi_wrap_ram_dp.v @@ -0,0 +1,247 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ + +module axi_wrap_ram_dp #( + parameter Init_File = "none" +) +( + input aclk, + input aresetn, + //ar + input [4 :0] axi_arid , + input [31:0] axi_araddr , + input [7 :0] axi_arlen , + input [2 :0] axi_arsize , + input [1 :0] axi_arburst, + input [1 :0] axi_arlock , + input [3 :0] axi_arcache, + input [2 :0] axi_arprot , + input axi_arvalid, + output axi_arready, + //r + output [4 :0] axi_rid , + output [31:0] axi_rdata , + output [1 :0] axi_rresp , + output axi_rlast , + output axi_rvalid , + input axi_rready , + //aw + input [4 :0] axi_awid , + input [31:0] axi_awaddr , + input [7 :0] axi_awlen , + input [2 :0] axi_awsize , + input [1 :0] axi_awburst, + input [1 :0] axi_awlock , + input [3 :0] axi_awcache, + input [2 :0] axi_awprot , + input axi_awvalid, + output axi_awready, + //w + input [31:0] axi_wdata , + input [3 :0] axi_wstrb , + input axi_wlast , + input axi_wvalid , + output axi_wready , + //b + output [4 :0] axi_bid , + output [1 :0] axi_bresp , + output axi_bvalid , + input axi_bready +); + + +//ram axi +//ar +wire [4 :0] ram_arid ; +wire [31:0] ram_araddr ; +wire [7 :0] ram_arlen ; +wire [2 :0] ram_arsize ; +wire [1 :0] ram_arburst; +wire [1 :0] ram_arlock ; +wire [3 :0] ram_arcache; +wire [2 :0] ram_arprot ; +wire ram_arvalid; +wire ram_arready; +//r +wire [4 :0] ram_rid ; +wire [31:0] ram_rdata ; +wire [1 :0] ram_rresp ; +wire ram_rlast ; +wire ram_rvalid ; +wire ram_rready ; +//aw +wire [4 :0] ram_awid ; +wire [31:0] ram_awaddr ; +wire [7 :0] ram_awlen ; +wire [2 :0] ram_awsize ; +wire [1 :0] ram_awburst; +wire [1 :0] ram_awlock ; +wire [3 :0] ram_awcache; +wire [2 :0] ram_awprot ; +wire ram_awvalid; +wire ram_awready; +//w +wire [31:0] ram_wdata ; +wire [3 :0] ram_wstrb ; +wire ram_wlast ; +wire ram_wvalid ; +wire ram_wready ; +//b +wire [4 :0] ram_bid ; +wire [1 :0] ram_bresp ; +wire ram_bvalid ; +wire ram_bready ; + +//sram signal +wire [31:0] fpga_sram_raddr; +wire [31:0] fpga_sram_rdata; +wire fpga_sram_ren; +wire [31:0] fpga_sram_waddr; +wire [31:0] fpga_sram_wdata; +wire [3:0] fpga_sram_wen; + + +//ar +assign ram_arid = axi_arid ; +assign ram_araddr = axi_araddr ; +assign ram_arlen = axi_arlen ; +assign ram_arsize = axi_arsize ; +assign ram_arburst = axi_arburst; +assign ram_arlock = axi_arlock ; +assign ram_arcache = axi_arcache; +assign ram_arprot = axi_arprot ; +assign ram_arvalid = axi_arvalid; +assign axi_arready = ram_arready; +//r +assign axi_rid = axi_rvalid ? ram_rid : 5'd0 ; +assign axi_rdata = axi_rvalid ? ram_rdata : 32'd0 ; +assign axi_rresp = axi_rvalid ? ram_rresp : 2'd0 ; +assign axi_rlast = axi_rvalid ? ram_rlast : 1'd0 ; +assign axi_rvalid = ram_rvalid; +assign ram_rready = axi_rready; +//aw +assign ram_awid = axi_awid ; +assign ram_awaddr = axi_awaddr ; +assign ram_awlen = axi_awlen ; +assign ram_awsize = axi_awsize ; +assign ram_awburst = axi_awburst; +assign ram_awlock = axi_awlock ; +assign ram_awcache = axi_awcache; +assign ram_awprot = axi_awprot ; +assign ram_awvalid = axi_awvalid; +assign axi_awready = ram_awready; +//w +assign ram_wdata = axi_wdata ; +assign ram_wstrb = axi_wstrb ; +assign ram_wlast = axi_wlast ; +assign ram_wvalid = axi_wvalid ; +assign axi_wready = ram_wready ; +//b +assign axi_bid = axi_bvalid ? ram_bid : 5'd0 ; +assign axi_bresp = axi_bvalid ? ram_bresp : 2'd0 ; +assign axi_bvalid = ram_bvalid ; +assign ram_bready = axi_bready ; + +axi2sram_dp #( + .BUS_WIDTH ( 32 ), + .DATA_WIDTH ( 32 ), + .CPU_WIDTH ( 32 )) + u_axi2sram_dp ( + .aclk ( aclk ), + .aresetn ( aresetn ), + + .m_araddr ( ram_araddr ), + .m_arburst ( ram_arburst ), + .m_arcache ( 4'h0 ), + .m_arid ( ram_arid ), + .m_arlen ( ram_arlen ), + .m_arlock ( 2'h0 ), + .m_arprot ( 3'h0 ), + .m_arsize ( ram_arsize ), + .m_arvalid ( ram_arvalid ), + .m_arready ( ram_arready ), + + .m_rready ( ram_rready ), + .m_rdata ( ram_rdata ), + .m_rid ( ram_rid ), + .m_rlast ( ram_rlast ), + .m_rresp ( ram_rresp ), + .m_rvalid ( ram_rvalid ), + + .m_awaddr ( ram_awaddr ), + .m_awburst ( ram_awburst ), + .m_awcache ( 4'h0 ), + .m_awid ( ram_awid ), + .m_awlen ( ram_awlen ), + .m_awlock ( 2'h0 ), + .m_awprot ( 3'h0 ), + .m_awsize ( ram_awsize ), + .m_awvalid ( ram_awvalid ), + .m_awready ( ram_awready ), + + .m_wdata ( ram_wdata ), + .m_wlast ( ram_wlast ), + .m_wstrb ( ram_wstrb ), + .m_wvalid ( ram_wvalid ), + .m_wready ( ram_wready ), + + .m_bready ( ram_bready ), + .m_bid ( ram_bid ), + .m_bresp ( ram_bresp ), + .m_bvalid ( ram_bvalid ), + + .ram_raddr ( fpga_sram_raddr ), + .ram_ren ( fpga_sram_ren ), + .ram_waddr ( fpga_sram_waddr ), + .ram_wdata ( fpga_sram_wdata ), + .ram_wen ( fpga_sram_wen ), + .ram_rdata ( fpga_sram_rdata ) +); + +//1MByte SRAM +fpga_sram_dp #( +.AW ( 18 ), +.Init_File (Init_File) +)u_fpga_sram ( + .CLK ( aclk ), + .ram_raddr ( fpga_sram_raddr[19:2] ), + .ram_ren ( fpga_sram_ren ), + .ram_rdata ( fpga_sram_rdata ), + .ram_waddr ( fpga_sram_waddr[19:2] ), + .ram_wdata ( fpga_sram_wdata ), + .ram_wen ( fpga_sram_wen ) + +); + + +endmodule diff --git a/rtl/ip/ram_wrap/axi_wrap_ram_sp.v b/rtl/ip/ram_wrap/axi_wrap_ram_sp.v new file mode 100644 index 0000000..e2e0833 --- /dev/null +++ b/rtl/ip/ram_wrap/axi_wrap_ram_sp.v @@ -0,0 +1,244 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ + +module axi_wrap_ram_sp #( + parameter Init_File = "none" +) +( + input aclk, + input aresetn, + //ar + input [4 :0] axi_arid , + input [31:0] axi_araddr , + input [7 :0] axi_arlen , + input [2 :0] axi_arsize , + input [1 :0] axi_arburst, + input [1 :0] axi_arlock , + input [3 :0] axi_arcache, + input [2 :0] axi_arprot , + input axi_arvalid, + output axi_arready, + //r + output [4 :0] axi_rid , + output [31:0] axi_rdata , + output [1 :0] axi_rresp , + output axi_rlast , + output axi_rvalid , + input axi_rready , + //aw + input [4 :0] axi_awid , + input [31:0] axi_awaddr , + input [7 :0] axi_awlen , + input [2 :0] axi_awsize , + input [1 :0] axi_awburst, + input [1 :0] axi_awlock , + input [3 :0] axi_awcache, + input [2 :0] axi_awprot , + input axi_awvalid, + output axi_awready, + //w + input [31:0] axi_wdata , + input [3 :0] axi_wstrb , + input axi_wlast , + input axi_wvalid , + output axi_wready , + //b + output [4 :0] axi_bid , + output [1 :0] axi_bresp , + output axi_bvalid , + input axi_bready +); + + +//ram axi +//ar +wire [4 :0] ram_arid ; +wire [31:0] ram_araddr ; +wire [7 :0] ram_arlen ; +wire [2 :0] ram_arsize ; +wire [1 :0] ram_arburst; +wire [1 :0] ram_arlock ; +wire [3 :0] ram_arcache; +wire [2 :0] ram_arprot ; +wire ram_arvalid; +wire ram_arready; +//r +wire [4 :0] ram_rid ; +wire [31:0] ram_rdata ; +wire [1 :0] ram_rresp ; +wire ram_rlast ; +wire ram_rvalid ; +wire ram_rready ; +//aw +wire [4 :0] ram_awid ; +wire [31:0] ram_awaddr ; +wire [7 :0] ram_awlen ; +wire [2 :0] ram_awsize ; +wire [1 :0] ram_awburst; +wire [1 :0] ram_awlock ; +wire [3 :0] ram_awcache; +wire [2 :0] ram_awprot ; +wire ram_awvalid; +wire ram_awready; +//w +wire [31:0] ram_wdata ; +wire [3 :0] ram_wstrb ; +wire ram_wlast ; +wire ram_wvalid ; +wire ram_wready ; +//b +wire [4 :0] ram_bid ; +wire [1 :0] ram_bresp ; +wire ram_bvalid ; +wire ram_bready ; + +//sram signal +wire [31:0] fpga_sram_addr; +wire fpga_sram_cs; +wire fpga_sram_we; +wire [3:0] fpga_sram_be; +wire [31:0] fpga_sram_wdata; +wire [31:0] fpga_sram_rdata; + + +//ar +assign ram_arid = axi_arid ; +assign ram_araddr = axi_araddr ; +assign ram_arlen = axi_arlen ; +assign ram_arsize = axi_arsize ; +assign ram_arburst = axi_arburst; +assign ram_arlock = axi_arlock ; +assign ram_arcache = axi_arcache; +assign ram_arprot = axi_arprot ; +assign ram_arvalid = axi_arvalid; +assign axi_arready = ram_arready; +//r +assign axi_rid = axi_rvalid ? ram_rid : 5'd0 ; +assign axi_rdata = axi_rvalid ? ram_rdata : 32'd0 ; +assign axi_rresp = axi_rvalid ? ram_rresp : 2'd0 ; +assign axi_rlast = axi_rvalid ? ram_rlast : 1'd0 ; +assign axi_rvalid = ram_rvalid; +assign ram_rready = axi_rready; +//aw +assign ram_awid = axi_awid ; +assign ram_awaddr = axi_awaddr ; +assign ram_awlen = axi_awlen ; +assign ram_awsize = axi_awsize ; +assign ram_awburst = axi_awburst; +assign ram_awlock = axi_awlock ; +assign ram_awcache = axi_awcache; +assign ram_awprot = axi_awprot ; +assign ram_awvalid = axi_awvalid; +assign axi_awready = ram_awready; +//w +assign ram_wdata = axi_wdata ; +assign ram_wstrb = axi_wstrb ; +assign ram_wlast = axi_wlast ; +assign ram_wvalid = axi_wvalid ; +assign axi_wready = ram_wready ; +//b +assign axi_bid = axi_bvalid ? ram_bid : 5'd0 ; +assign axi_bresp = axi_bvalid ? ram_bresp : 2'd0 ; +assign axi_bvalid = ram_bvalid ; +assign ram_bready = axi_bready ; + + +axi2sram_sp #( + .AXI_ID_WIDTH ( 5 ), + .AXI_ADDR_WIDTH ( 32 ), + .AXI_DATA_WIDTH ( 32 )) + u_axi_sram_sp ( + .clk ( aclk ), + .resetn ( aresetn ), + + .s_araddr ( ram_araddr ), + .s_arburst ( ram_arburst ), + .s_arcache ( ram_arcache ), + .s_arid ( ram_arid ), + .s_arlen ( ram_arlen ), + .s_arlock ( ram_arlock ), + .s_arprot ( ram_arprot ), + .s_arsize ( ram_arsize ), + .s_arvalid ( ram_arvalid ), + .s_awaddr ( ram_awaddr ), + .s_awburst ( ram_awburst ), + .s_awcache ( ram_awcache ), + .s_awid ( ram_awid ), + .s_awlen ( ram_awlen ), + .s_awlock ( ram_awlock ), + .s_awprot ( ram_awprot ), + .s_awsize ( ram_awsize ), + .s_awvalid ( ram_awvalid ), + .s_bready ( ram_bready ), + .s_rready ( ram_rready ), + .s_wdata ( ram_wdata ), + .s_wlast ( ram_wlast ), + .s_wstrb ( ram_wstrb ), + .s_wvalid ( ram_wvalid ), + .s_arready ( ram_arready ), + .s_awready ( ram_awready ), + .s_bid ( ram_bid ), + .s_bresp ( ram_bresp ), + .s_bvalid ( ram_bvalid ), + .s_rdata ( ram_rdata ), + .s_rid ( ram_rid ), + .s_rlast ( ram_rlast ), + .s_rresp ( ram_rresp ), + .s_rvalid ( ram_rvalid ), + .s_wready ( ram_wready ), + + .req_o ( fpga_sram_cs ), + .we_o ( fpga_sram_we ), + .addr_o ( fpga_sram_addr ), + .be_o ( fpga_sram_be ), + .data_o ( fpga_sram_wdata ), + .data_i ( fpga_sram_rdata ) +); + +wire [3:0] fpga_sram_wren = {4{fpga_sram_we}} & fpga_sram_be; + +//1MByte SRAM +fpga_sram_sp #( +.AW ( 18 ), +.Init_File (Init_File) +)u_fpga_sram ( + .CLK ( aclk ), + .ADDR ( fpga_sram_addr[19:2] ), + .WDATA ( fpga_sram_wdata ), + .WREN ( fpga_sram_wren ), + .CS ( fpga_sram_cs ), + .RDATA ( fpga_sram_rdata ) +); + + +endmodule diff --git a/rtl/ip/ram_wrap/axi_wrap_ram_sp_external.v b/rtl/ip/ram_wrap/axi_wrap_ram_sp_external.v new file mode 100644 index 0000000..3446a87 --- /dev/null +++ b/rtl/ip/ram_wrap/axi_wrap_ram_sp_external.v @@ -0,0 +1,259 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ + +module axi_wrap_ram_sp_external ( + input aclk, + input aresetn, + //ar + input [4 :0] axi_arid , + input [31:0] axi_araddr , + input [7 :0] axi_arlen , + input [2 :0] axi_arsize , + input [1 :0] axi_arburst, + input axi_arlock , + input [3 :0] axi_arcache, + input [2 :0] axi_arprot , + input axi_arvalid, + output axi_arready, + //r + output [4 :0] axi_rid , + output [31:0] axi_rdata , + output [1 :0] axi_rresp , + output axi_rlast , + output axi_rvalid , + input axi_rready , + //aw + input [4 :0] axi_awid , + input [31:0] axi_awaddr , + input [7 :0] axi_awlen , + input [2 :0] axi_awsize , + input [1 :0] axi_awburst, + input axi_awlock , + input [3 :0] axi_awcache, + input [2 :0] axi_awprot , + input axi_awvalid, + output axi_awready, + //w + input [31:0] axi_wdata , + input [3 :0] axi_wstrb , + input axi_wlast , + input axi_wvalid , + output axi_wready , + //b + output [4 :0] axi_bid , + output [1 :0] axi_bresp , + output axi_bvalid , + input axi_bready , + + //BaseRAM信号 + inout [31:0] base_ram_data, //BaseRAM数据,低8位与CPLD串口控制器共享 + output [19:0] base_ram_addr, //BaseRAM地址 + output [ 3:0] base_ram_be_n, //BaseRAM字节使能,低有效。如果不使用字节使能,请保持为0 + output base_ram_ce_n, //BaseRAM片选,低有效 + output base_ram_oe_n, //BaseRAM读使能,低有效 + output base_ram_we_n, //BaseRAM写使能,低有效 + + //ExtRAM信号 + inout [31:0] ext_ram_data, //ExtRAM数据 + output [19:0] ext_ram_addr, //ExtRAM地址 + output [ 3:0] ext_ram_be_n, //ExtRAM字节使能,低有效。如果不使用字节使能,请保持为0 + output ext_ram_ce_n, //ExtRAM片选,低有效 + output ext_ram_oe_n, //ExtRAM读使能,低有效 + output ext_ram_we_n //ExtRAM写使能,低有效 +); + + +//ram axi +//ar +wire [4 :0] ram_arid ; +wire [31:0] ram_araddr ; +wire [7 :0] ram_arlen ; +wire [2 :0] ram_arsize ; +wire [1 :0] ram_arburst; +wire ram_arlock ; +wire [3 :0] ram_arcache; +wire [2 :0] ram_arprot ; +wire ram_arvalid; +wire ram_arready; +//r +wire [4 :0] ram_rid ; +wire [31:0] ram_rdata ; +wire [1 :0] ram_rresp ; +wire ram_rlast ; +wire ram_rvalid ; +wire ram_rready ; +//aw +wire [4 :0] ram_awid ; +wire [31:0] ram_awaddr ; +wire [7 :0] ram_awlen ; +wire [2 :0] ram_awsize ; +wire [1 :0] ram_awburst; +wire ram_awlock ; +wire [3 :0] ram_awcache; +wire [2 :0] ram_awprot ; +wire ram_awvalid; +wire ram_awready; +//w +wire [31:0] ram_wdata ; +wire [3 :0] ram_wstrb ; +wire ram_wlast ; +wire ram_wvalid ; +wire ram_wready ; +//b +wire [4 :0] ram_bid ; +wire [1 :0] ram_bresp ; +wire ram_bvalid ; +wire ram_bready ; + +//sram signal +wire [31:0] soc_sram_addr; +wire soc_sram_cs; +wire soc_sram_we; +wire [3:0] soc_sram_be; +wire [31:0] soc_sram_wdata; +wire [31:0] soc_sram_rdata; + +//ar +assign ram_arid = axi_arid ; +assign ram_araddr = axi_araddr ; +assign ram_arlen = axi_arlen ; +assign ram_arsize = axi_arsize ; +assign ram_arburst = axi_arburst; +assign ram_arlock = axi_arlock ; +assign ram_arcache = axi_arcache; +assign ram_arprot = axi_arprot ; +assign ram_arvalid = axi_arvalid; +assign axi_arready = ram_arready; +//r +assign axi_rid = axi_rvalid ? ram_rid : 5'd0 ; +assign axi_rdata = axi_rvalid ? ram_rdata : 32'd0 ; +assign axi_rresp = axi_rvalid ? ram_rresp : 2'd0 ; +assign axi_rlast = axi_rvalid ? ram_rlast : 1'd0 ; +assign axi_rvalid = ram_rvalid; +assign ram_rready = axi_rready; +//aw +assign ram_awid = axi_awid ; +assign ram_awaddr = axi_awaddr ; +assign ram_awlen = axi_awlen ; +assign ram_awsize = axi_awsize ; +assign ram_awburst = axi_awburst; +assign ram_awlock = axi_awlock ; +assign ram_awcache = axi_awcache; +assign ram_awprot = axi_awprot ; +assign ram_awvalid = axi_awvalid; +assign axi_awready = ram_awready; +//w +assign ram_wdata = axi_wdata ; +assign ram_wstrb = axi_wstrb ; +assign ram_wlast = axi_wlast ; +assign ram_wvalid = axi_wvalid ; +assign axi_wready = ram_wready ; +//b +assign axi_bid = axi_bvalid ? ram_bid : 5'd0 ; +assign axi_bresp = axi_bvalid ? ram_bresp : 2'd0 ; +assign axi_bvalid = ram_bvalid ; +assign ram_bready = axi_bready ; + + +axi2sram_sp_external #( + .AXI_ID_WIDTH ( 5 ), + .AXI_ADDR_WIDTH ( 32 ), + .AXI_DATA_WIDTH ( 32 )) + u_axi_sram_sp ( + .clk ( aclk ), + .resetn ( aresetn ), + + .s_araddr ( ram_araddr ), + .s_arburst ( ram_arburst ), + .s_arcache ( ram_arcache ), + .s_arid ( ram_arid ), + .s_arlen ( ram_arlen ), + .s_arlock ( ram_arlock ), + .s_arprot ( ram_arprot ), + .s_arsize ( ram_arsize ), + .s_arvalid ( ram_arvalid ), + .s_awaddr ( ram_awaddr ), + .s_awburst ( ram_awburst ), + .s_awcache ( ram_awcache ), + .s_awid ( ram_awid ), + .s_awlen ( ram_awlen ), + .s_awlock ( ram_awlock ), + .s_awprot ( ram_awprot ), + .s_awsize ( ram_awsize ), + .s_awvalid ( ram_awvalid ), + .s_bready ( ram_bready ), + .s_rready ( ram_rready ), + .s_wdata ( ram_wdata ), + .s_wlast ( ram_wlast ), + .s_wstrb ( ram_wstrb ), + .s_wvalid ( ram_wvalid ), + .s_arready ( ram_arready ), + .s_awready ( ram_awready ), + .s_bid ( ram_bid ), + .s_bresp ( ram_bresp ), + .s_bvalid ( ram_bvalid ), + .s_rdata ( ram_rdata ), + .s_rid ( ram_rid ), + .s_rlast ( ram_rlast ), + .s_rresp ( ram_rresp ), + .s_rvalid ( ram_rvalid ), + .s_wready ( ram_wready ), + + .req_o ( soc_sram_cs ), + .we_o ( soc_sram_we ), + .addr_o ( soc_sram_addr ), + .be_o ( soc_sram_be ), + .data_o ( soc_sram_wdata ), + .data_i ( soc_sram_rdata ) +); + +wire choose_sram = soc_sram_addr[22];//1:ExtRAM 0:BaseRAM +wire [3:0] be_out = soc_sram_we ? soc_sram_be : 4'b1111; + +assign base_ram_addr = soc_sram_addr[21:2]; +assign base_ram_be_n = choose_sram ? 4'b1111 : ~be_out; +assign base_ram_ce_n = ~(soc_sram_cs & (~choose_sram)); +assign base_ram_oe_n = soc_sram_we | choose_sram; +assign base_ram_we_n = ~(soc_sram_we & (~choose_sram)); +assign base_ram_data = ((~choose_sram) & soc_sram_cs & soc_sram_we) ? soc_sram_wdata : 32'hzzzzzzzz; + +assign ext_ram_addr = soc_sram_addr[21:2]; +assign ext_ram_be_n = choose_sram ? ~be_out : 4'b1111; +assign ext_ram_ce_n = choose_sram ? ~soc_sram_cs : 1'b1; +assign ext_ram_oe_n = choose_sram ? soc_sram_we : 1'b1; +assign ext_ram_we_n = choose_sram ? ~soc_sram_we : 1'b1; +assign ext_ram_data = ((choose_sram) & soc_sram_cs & soc_sram_we) ? soc_sram_wdata : 32'hzzzzzzzz; + +assign soc_sram_rdata = choose_sram ? ext_ram_data : base_ram_data; + +endmodule diff --git a/rtl/ip/ram_wrap/cache_sram.v b/rtl/ip/ram_wrap/cache_sram.v new file mode 100644 index 0000000..bbd1d2d --- /dev/null +++ b/rtl/ip/ram_wrap/cache_sram.v @@ -0,0 +1,85 @@ +`include "config.h" + +module data_bank_sram ( + input [ 7:0] addra , + input clka , + input [31:0] dina , + output [31:0] douta , + input ena , + input [ 3:0] wea +); +`ifdef USE_CACHE + localparam V_STYLE = "block"; + localparam P_STYLE = (V_STYLE == "ultra") ? "uram" : + (V_STYLE == "distributed") ? "select_ram" : + "block_ram"; + + (*ram_style = V_STYLE*) reg [31:0] mem_reg [255:0]/*synthesis syn_ramstyle=P_STYLE*/; + reg [31:0] output_buffer; + + always @(posedge clka) begin + if (ena) begin + if (wea) begin + if (wea[0]) begin + mem_reg[addra][ 7: 0] <= dina[ 7: 0]; + end + + if (wea[1]) begin + mem_reg[addra][15: 8] <= dina[15: 8]; + end + + if (wea[2]) begin + mem_reg[addra][23:16] <= dina[23:16]; + end + + if (wea[3]) begin + mem_reg[addra][31:24] <= dina[31:24]; + end + end + else begin + output_buffer <= mem_reg[addra]; + end + end + end + + assign douta = output_buffer; +`else + assign douta = 32'h0; +`endif + +endmodule + +module tagv_sram ( + input [ 7:0] addra , + input clka , + input [20:0] dina , + output [20:0] douta , + input ena , + input wea +); +`ifdef USE_CACHE + localparam V_STYLE = "block"; + localparam P_STYLE = (V_STYLE == "ultra") ? "uram" : + (V_STYLE == "distributed") ? "select_ram" : + "block_ram"; + + (*ram_style = V_STYLE*) reg [20:0] mem_reg [255:0]/*synthesis syn_ramstyle=P_STYLE*/; + reg [20:0] output_buffer; + + always @(posedge clka) begin + if (ena) begin + if (wea) begin + mem_reg[addra] <= dina; + end + else begin + output_buffer <= mem_reg[addra]; + end + end + end + + assign douta = output_buffer; +`else + assign douta = 21'h0; +`endif + +endmodule \ No newline at end of file diff --git a/rtl/ip/ram_wrap/fpga_sram_dp.v b/rtl/ip/ram_wrap/fpga_sram_dp.v new file mode 100644 index 0000000..4bc06fc --- /dev/null +++ b/rtl/ip/ram_wrap/fpga_sram_dp.v @@ -0,0 +1,53 @@ +module fpga_sram_dp #( + parameter AW = 16, + parameter Init_File = "none" +) +( + input wire CLK, + + input wire [AW-1:0] ram_raddr, + output wire [31 :0] ram_rdata, + input wire ram_ren , + + input wire [AW-1:0] ram_waddr, + input wire [31 :0] ram_wdata, + input wire [3 :0] ram_wen +); + + localparam AWT = ((1<<(AW-0))-1); + localparam V_STYLE = "block"; + localparam P_STYLE = (V_STYLE == "ultra") ? "uram" : + (V_STYLE == "distributed") ? "select_ram" : + "block_ram"; + + (*ram_style = V_STYLE*)reg [31:0] BRAM [AWT:0]/*synthesis syn_ramstyle=P_STYLE*/; + + initial begin + if(Init_File != "none") begin + $readmemb(Init_File,BRAM); + end + end + + reg [AW-1:0] addr_q1; + + always@(posedge CLK) begin + if(ram_wen[0]) BRAM[ram_waddr][7:0] <= ram_wdata[7:0]; + end + always@(posedge CLK) begin + if(ram_wen[1]) BRAM[ram_waddr][15:8] <= ram_wdata[15:8]; + end + always@(posedge CLK) begin + if(ram_wen[2]) BRAM[ram_waddr][23:16] <= ram_wdata[23:16]; + end + always@(posedge CLK) begin + if(ram_wen[3]) BRAM[ram_waddr][31:24] <= ram_wdata[31:24]; + end + + always @ (posedge CLK) begin + if(ram_ren) + addr_q1 <= ram_raddr; + end + + assign ram_rdata = BRAM[addr_q1]; + +endmodule diff --git a/rtl/ip/ram_wrap/fpga_sram_sp.v b/rtl/ip/ram_wrap/fpga_sram_sp.v new file mode 100644 index 0000000..69d2c9e --- /dev/null +++ b/rtl/ip/ram_wrap/fpga_sram_sp.v @@ -0,0 +1,54 @@ +module fpga_sram_sp #( + parameter AW = 16, + parameter Init_File = "none" +) +( + input wire CLK, + input wire [AW-1:0] ADDR, + input wire [31:0] WDATA, + input wire [3:0] WREN, + input wire CS, + output wire [31:0] RDATA +); + + localparam AWT = ((1<<(AW-0))-1); + localparam V_STYLE = "block"; + localparam P_STYLE = (V_STYLE == "ultra") ? "uram" : + (V_STYLE == "distributed") ? "select_ram" : + "block_ram"; + + (*ram_style = V_STYLE*)reg [31:0] BRAM [AWT:0]/*synthesis syn_ramstyle=P_STYLE*/; + + initial begin + if(Init_File != "none") begin + $readmemb(Init_File,BRAM); + end + end + + reg [AW-1:0] addr_q1; + wire [3:0] write_enable; + + assign write_enable[3:0] = WREN[3:0] & {4{CS}}; + + + always@(posedge CLK) begin + if(write_enable[0]) BRAM[ADDR][7:0] <= WDATA[7:0]; + end + always@(posedge CLK) begin + if(write_enable[1]) BRAM[ADDR][15:8] <= WDATA[15:8]; + end + always@(posedge CLK) begin + if(write_enable[2]) BRAM[ADDR][23:16] <= WDATA[23:16]; + end + always@(posedge CLK) begin + if(write_enable[3]) BRAM[ADDR][31:24] <= WDATA[31:24]; + end + + always @ (posedge CLK) begin + if(CS && !(|WREN)) + addr_q1 <= ADDR[AW-1:0]; + end + + assign RDATA = BRAM[addr_q1]; + +endmodule diff --git a/rtl/ip/rst_sync/rst_sync.v b/rtl/ip/rst_sync/rst_sync.v new file mode 100644 index 0000000..71a37de --- /dev/null +++ b/rtl/ip/rst_sync/rst_sync.v @@ -0,0 +1,18 @@ +module rst_sync( + input clk, + input rst_n_in, + output rst_n_out +); + + reg [1:0] delay; + always @(posedge clk or negedge rst_n_in) begin + if(~rst_n_in) begin + delay <= 2'b00; + end + else begin + delay <= {delay[0],1'b1}; + end + end + assign rst_n_out = delay[1]; + +endmodule \ No newline at end of file diff --git a/rtl/soc_top.v b/rtl/soc_top.v new file mode 100644 index 0000000..66f1fb6 --- /dev/null +++ b/rtl/soc_top.v @@ -0,0 +1,1684 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ +`timescale 1ns / 1ps + +//1f00_0000 apb +//1f10_0000 dvi +//1f20_0000 confreg +//1f30_0000 dma + +`include "config.h" + +module soc_top #(parameter SIMULATION=1'b0) +( + input clk, + input reset, + + //图像输出信号 + output [2:0] video_red, //红色像素,3位 + output [2:0] video_green, //绿色像素,3位 + output [1:0] video_blue, //蓝色像素,2位 + output video_hsync, //行同步(水平同步)信号 + output video_vsync, //场同步(垂直同步)信号 + output video_clk, //像素时钟输出 + output video_de, //行数据有效信号,用于区分消隐区 + + input [3:0] touch_btn, //BTN1~BTN4,按钮开关,按下时为1 + input [31:0] dip_sw, //32位拨码开关,拨到“ON”时为1 + output [15:0] leds, //16位LED,输出时1点亮 + output [7:0] dpy0, //数码管低位信号,包括小数点,输出1点亮 + output [7:0] dpy1, //数码管高位信号,包括小数点,输出1点亮 + + //BaseRAM信号 + inout [31:0] base_ram_data, //BaseRAM数据,低8位与CPLD串口控制器共享 + output [19:0] base_ram_addr, //BaseRAM地址 + output [ 3:0] base_ram_be_n, //BaseRAM字节使能,低有效。如果不使用字节使能,请保持为0 + output base_ram_ce_n, //BaseRAM片选,低有效 + output base_ram_oe_n, //BaseRAM读使能,低有效 + output base_ram_we_n, //BaseRAM写使能,低有效 + //ExtRAM信号 + inout [31:0] ext_ram_data, //ExtRAM数据 + output [19:0] ext_ram_addr, //ExtRAM地址 + output [ 3:0] ext_ram_be_n, //ExtRAM字节使能,低有效。如果不使用字节使能,请保持为0 + output ext_ram_ce_n, //ExtRAM片选,低有效 + output ext_ram_oe_n, //ExtRAM读使能,低有效 + output ext_ram_we_n, //ExtRAM写使能,低有效 + + //------uart------- + inout UART_RX, //串口RX接收 + inout UART_TX //串口TX发送 +); + +wire cpu_clk; +wire cpu_resetn; +wire sys_clk; +wire sys_resetn; +wire pll_locked; + +generate if(SIMULATION) begin: sim_clk + //simulation clk. + reg clk_sim; + initial begin + clk_sim = 1'b0; + end + always #15 clk_sim = ~clk_sim; + + assign cpu_clk = clk_sim; + assign sys_clk = clk; + rst_sync u_rst_sys( + .clk(sys_clk), + .rst_n_in(~reset), + .rst_n_out(sys_resetn) + ); + rst_sync u_rst_cpu( + .clk(cpu_clk), + .rst_n_in(sys_resetn), + .rst_n_out(cpu_resetn) + ); +end +else begin: pll_clk + clk_pll u_clk_pll( + .cpu_clk (cpu_clk), + .sys_clk (sys_clk), + .resetn (~reset), + .locked (pll_locked), + .clk_in1 (clk) + ); + rst_sync u_rst_sys( + .clk(sys_clk), + .rst_n_in(pll_locked), + .rst_n_out(sys_resetn) + ); + rst_sync u_rst_cpu( + .clk(cpu_clk), + .rst_n_in(sys_resetn), + .rst_n_out(cpu_resetn) + ); +end +endgenerate + +//debug signals +wire [31:0] debug_wb_pc; +wire [31:0] debug_wb_inst; +wire [3 :0] debug_wb_rf_wen; +wire [4 :0] debug_wb_rf_wnum; +wire [31:0] debug_wb_rf_wdata; + +//cpu axi +wire [3 :0] cpu_arid ; +wire [31:0] cpu_araddr ; +wire [7 :0] cpu_arlen ; +wire [2 :0] cpu_arsize ; +wire [1 :0] cpu_arburst; +wire [1 :0] cpu_arlock ; +wire [3 :0] cpu_arcache; +wire [2 :0] cpu_arprot ; +wire cpu_arvalid; +wire cpu_arready; +wire [3 :0] cpu_rid ; +wire [31:0] cpu_rdata ; +wire [1 :0] cpu_rresp ; +wire cpu_rlast ; +wire cpu_rvalid ; +wire cpu_rready ; +wire [3 :0] cpu_awid ; +wire [31:0] cpu_awaddr ; +wire [7 :0] cpu_awlen ; +wire [2 :0] cpu_awsize ; +wire [1 :0] cpu_awburst; +wire [1 :0] cpu_awlock ; +wire [3 :0] cpu_awcache; +wire [2 :0] cpu_awprot ; +wire cpu_awvalid; +wire cpu_awready; +wire [3 :0] cpu_wid ; +wire [31:0] cpu_wdata ; +wire [3 :0] cpu_wstrb ; +wire cpu_wlast ; +wire cpu_wvalid ; +wire cpu_wready ; +wire [3 :0] cpu_bid ; +wire [1 :0] cpu_bresp ; +wire cpu_bvalid ; +wire cpu_bready ; +wire cpu_sync_awid_4 ; +wire cpu_bid_4 ; +wire cpu_sync_arid_4 ; +wire cpu_rid_4 ; + +//cpu axi sync +wire [3 :0] cpu_sync_arid ; +wire [31:0] cpu_sync_araddr ; +wire [7 :0] cpu_sync_arlen ; +wire [2 :0] cpu_sync_arsize ; +wire [1 :0] cpu_sync_arburst; +wire cpu_sync_arlock ; +wire [3 :0] cpu_sync_arcache; +wire [2 :0] cpu_sync_arprot ; +wire cpu_sync_arvalid; +wire cpu_sync_arready; +wire [3 :0] cpu_sync_rid ; +wire [31:0] cpu_sync_rdata ; +wire [1 :0] cpu_sync_rresp ; +wire cpu_sync_rlast ; +wire cpu_sync_rvalid ; +wire cpu_sync_rready ; +wire [3 :0] cpu_sync_awid ; +wire [31:0] cpu_sync_awaddr ; +wire [7 :0] cpu_sync_awlen ; +wire [2 :0] cpu_sync_awsize ; +wire [1 :0] cpu_sync_awburst; +wire cpu_sync_awlock ; +wire [3 :0] cpu_sync_awcache; +wire [2 :0] cpu_sync_awprot ; +wire cpu_sync_awvalid; +wire cpu_sync_awready; +wire [3 :0] cpu_sync_wid ; +wire [31:0] cpu_sync_wdata ; +wire [3 :0] cpu_sync_wstrb ; +wire cpu_sync_wlast ; +wire cpu_sync_wvalid ; +wire cpu_sync_wready ; +wire [3 :0] cpu_sync_bid ; +wire [1 :0] cpu_sync_bresp ; +wire cpu_sync_bvalid ; +wire cpu_sync_bready ; + +//axi ram +wire [4 :0] ram_arid ; +wire [31:0] ram_araddr ; +wire [7 :0] ram_arlen ; +wire [2 :0] ram_arsize ; +wire [1 :0] ram_arburst; +wire ram_arlock ; +wire [3 :0] ram_arcache; +wire [2 :0] ram_arprot ; +wire ram_arvalid; +wire ram_arready; +wire [4 :0] ram_rid ; +wire [31:0] ram_rdata ; +wire [1 :0] ram_rresp ; +wire ram_rlast ; +wire ram_rvalid ; +wire ram_rready ; +wire [4 :0] ram_awid ; +wire [31:0] ram_awaddr ; +wire [7 :0] ram_awlen ; +wire [2 :0] ram_awsize ; +wire [1 :0] ram_awburst; +wire ram_awlock ; +wire [3 :0] ram_awcache; +wire [2 :0] ram_awprot ; +wire ram_awvalid; +wire ram_awready; +wire [4 :0] ram_wid ; +wire [31:0] ram_wdata ; +wire [3 :0] ram_wstrb ; +wire ram_wlast ; +wire ram_wvalid ; +wire ram_wready ; +wire [4 :0] ram_bid ; +wire [1 :0] ram_bresp ; +wire ram_bvalid ; +wire ram_bready ; + +//uart axi +wire uart_arready; +wire [ 4:0] uart_rid; +wire [31:0] uart_rdata; +wire [ 1:0] uart_rresp; +wire uart_rlast; +wire uart_rvalid; +wire uart_awready; +wire uart_wready; +wire [ 4:0] uart_bid; +wire [ 1:0] uart_bresp; +wire uart_bvalid; +wire [ 4:0] uart_arid; +wire [31:0] uart_araddr; +wire [ 7:0] uart_arlen; +wire [ 2:0] uart_arsize; +wire [ 1:0] uart_arburst; +wire uart_arlock; +wire [ 3:0] uart_arcache; +wire [ 2:0] uart_arprot; +wire uart_arvalid; +wire uart_rready; +wire [ 4:0] uart_awid; +wire [31:0] uart_awaddr; +wire [ 7:0] uart_awlen; +wire [ 2:0] uart_awsize; +wire [ 1:0] uart_awburst; +wire uart_awlock; +wire [ 3:0] uart_awcache; +wire [ 2:0] uart_awprot; +wire uart_awvalid; +wire [ 4:0] uart_wid; +wire [31:0] uart_wdata; +wire [ 3:0] uart_wstrb; +wire uart_wlast; +wire uart_wvalid; +wire uart_bready; +wire irq_rx; + +//uart +wire UART_CTS, UART_RTS; +wire UART_DTR, UART_DSR; +wire UART_RI, UART_DCD; +assign UART_CTS = 1'b0; +assign UART_DSR = 1'b0; +assign UART_DCD = 1'b0; +assign UART_RI = 1'b0; +wire uart0_int ; +wire uart0_txd_o ; +wire uart0_txd_i ; +wire uart0_txd_oe; +wire uart0_rxd_o ; +wire uart0_rxd_i ; +wire uart0_rxd_oe; +wire uart0_rts_o ; +wire uart0_cts_i ; +wire uart0_dsr_i ; +wire uart0_dcd_i ; +wire uart0_dtr_o ; +wire uart0_ri_i ; +assign UART_RX = uart0_rxd_oe ? 1'bz : uart0_rxd_o ; +assign UART_TX = uart0_txd_oe ? 1'bz : uart0_txd_o ; +assign UART_RTS = uart0_rts_o ; +assign UART_DTR = uart0_dtr_o ; +assign uart0_txd_i = UART_TX; +assign uart0_rxd_i = UART_RX; +assign uart0_cts_i = UART_CTS; +assign uart0_dcd_i = UART_DCD; +assign uart0_dsr_i = UART_DSR; +assign uart0_ri_i = UART_RI ; + +//dma master axi +wire [3 :0] dma_m_arid ; +wire [31:0] dma_m_araddr ; +wire [7 :0] dma_m_arlen ; +wire [2 :0] dma_m_arsize ; +wire [1 :0] dma_m_arburst; +wire dma_m_arlock ; +wire [3 :0] dma_m_arcache; +wire [2 :0] dma_m_arprot ; +wire dma_m_arvalid; +wire dma_m_arready; +wire [3 :0] dma_m_rid ; +wire [31:0] dma_m_rdata ; +wire [1 :0] dma_m_rresp ; +wire dma_m_rlast ; +wire dma_m_rvalid ; +wire dma_m_rready ; +wire [3 :0] dma_m_awid ; +wire [31:0] dma_m_awaddr ; +wire [7 :0] dma_m_awlen ; +wire [2 :0] dma_m_awsize ; +wire [1 :0] dma_m_awburst; +wire dma_m_awlock ; +wire [3 :0] dma_m_awcache; +wire [2 :0] dma_m_awprot ; +wire dma_m_awvalid; +wire dma_m_awready; +wire [3 :0] dma_m_wid ; +wire [31:0] dma_m_wdata ; +wire [3 :0] dma_m_wstrb ; +wire dma_m_wlast ; +wire dma_m_wvalid ; +wire dma_m_wready ; +wire [3 :0] dma_m_bid ; +wire [1 :0] dma_m_bresp ; +wire dma_m_bvalid ; +wire dma_m_bready ; + +wire [4 :0] dma_s_arid ; +wire [31:0] dma_s_araddr ; +wire [7 :0] dma_s_arlen ; +wire [2 :0] dma_s_arsize ; +wire [1 :0] dma_s_arburst; +wire dma_s_arlock ; +wire [3 :0] dma_s_arcache; +wire [2 :0] dma_s_arprot ; +wire dma_s_arvalid; +wire dma_s_arready; +wire [4 :0] dma_s_rid ; +wire [31:0] dma_s_rdata ; +wire [1 :0] dma_s_rresp ; +wire dma_s_rlast ; +wire dma_s_rvalid ; +wire dma_s_rready ; +wire [4 :0] dma_s_awid ; +wire [31:0] dma_s_awaddr ; +wire [7 :0] dma_s_awlen ; +wire [2 :0] dma_s_awsize ; +wire [1 :0] dma_s_awburst; +wire dma_s_awlock ; +wire [3 :0] dma_s_awcache; +wire [2 :0] dma_s_awprot ; +wire dma_s_awvalid; +wire dma_s_awready; +wire [31:0] dma_s_wdata ; +wire [3 :0] dma_s_wstrb ; +wire dma_s_wlast ; +wire dma_s_wvalid ; +wire dma_s_wready ; +wire [4 :0] dma_s_bid ; +wire [1 :0] dma_s_bresp ; +wire dma_s_bvalid ; +wire dma_s_bready ; +wire dma_finish ; + +// reserved +wire [4 :0] axiOut_1_arid ; +wire [31:0] axiOut_1_araddr ; +wire [7 :0] axiOut_1_arlen ; +wire [2 :0] axiOut_1_arsize ; +wire [1 :0] axiOut_1_arburst; +wire axiOut_1_arlock ; +wire [3 :0] axiOut_1_arcache; +wire [2 :0] axiOut_1_arprot ; +wire axiOut_1_arvalid; +wire axiOut_1_arready; +wire [4 :0] axiOut_1_rid ; +wire [31:0] axiOut_1_rdata ; +wire [1 :0] axiOut_1_rresp ; +wire axiOut_1_rlast ; +wire axiOut_1_rvalid ; +wire axiOut_1_rready ; +wire [4 :0] axiOut_1_awid ; +wire [31:0] axiOut_1_awaddr ; +wire [7 :0] axiOut_1_awlen ; +wire [2 :0] axiOut_1_awsize ; +wire [1 :0] axiOut_1_awburst; +wire axiOut_1_awlock ; +wire [3 :0] axiOut_1_awcache; +wire [2 :0] axiOut_1_awprot ; +wire axiOut_1_awvalid; +wire axiOut_1_awready; +wire [4 :0] axiOut_1_wid ; +wire [31:0] axiOut_1_wdata ; +wire [3 :0] axiOut_1_wstrb ; +wire axiOut_1_wlast ; +wire axiOut_1_wvalid ; +wire axiOut_1_wready ; +wire [4 :0] axiOut_1_bid ; +wire [1 :0] axiOut_1_bresp ; +wire axiOut_1_bvalid ; +wire axiOut_1_bready ; + +assign axiOut_1_arready = 1'b1; +assign axiOut_1_rid = 5'b0; +assign axiOut_1_rdata = 32'b0; +assign axiOut_1_rresp = 2'b0; +assign axiOut_1_rlast = 1'b0; +assign axiOut_1_rvalid = 1'b0; +assign axiOut_1_awready = 1'b1; +assign axiOut_1_wready = 1'b1; +assign axiOut_1_bid = 5'b0; +assign axiOut_1_bresp = 2'b0; +assign axiOut_1_bvalid = 1'b0; + + +//axi dvi +wire [4 :0] dvi_arid ; +wire [31:0] dvi_araddr ; +wire [7 :0] dvi_arlen ; +wire [2 :0] dvi_arsize ; +wire [1 :0] dvi_arburst; +wire [1 :0] dvi_arlock ; +wire [3 :0] dvi_arcache; +wire [2 :0] dvi_arprot ; +wire dvi_arvalid; +wire dvi_arready; +wire [4 :0] dvi_rid ; +wire [31:0] dvi_rdata ; +wire [1 :0] dvi_rresp ; +wire dvi_rlast ; +wire dvi_rvalid ; +wire dvi_rready ; +wire [4 :0] dvi_awid ; +wire [31:0] dvi_awaddr ; +wire [7 :0] dvi_awlen ; +wire [2 :0] dvi_awsize ; +wire [1 :0] dvi_awburst; +wire [1 :0] dvi_awlock ; +wire [3 :0] dvi_awcache; +wire [2 :0] dvi_awprot ; +wire dvi_awvalid; +wire dvi_awready; +wire [4 :0] dvi_wid ; +wire [31:0] dvi_wdata ; +wire [3 :0] dvi_wstrb ; +wire dvi_wlast ; +wire dvi_wvalid ; +wire dvi_wready ; +wire [4 :0] dvi_bid ; +wire [1 :0] dvi_bresp ; +wire dvi_bvalid ; +wire dvi_bready ; + +//axi confreg +wire [4 :0] confreg_arid ; +wire [31:0] confreg_araddr ; +wire [7 :0] confreg_arlen ; +wire [2 :0] confreg_arsize ; +wire [1 :0] confreg_arburst; +wire confreg_arlock ; +wire [3 :0] confreg_arcache; +wire [2 :0] confreg_arprot ; +wire confreg_arvalid; +wire confreg_arready; +wire [4 :0] confreg_rid ; +wire [31:0] confreg_rdata ; +wire [1 :0] confreg_rresp ; +wire confreg_rlast ; +wire confreg_rvalid ; +wire confreg_rready ; +wire [4 :0] confreg_awid ; +wire [31:0] confreg_awaddr ; +wire [7 :0] confreg_awlen ; +wire [2 :0] confreg_awsize ; +wire [1 :0] confreg_awburst; +wire confreg_awlock ; +wire [3 :0] confreg_awcache; +wire [2 :0] confreg_awprot ; +wire confreg_awvalid; +wire confreg_awready; +wire [4 :0] confreg_wid ; +wire [31:0] confreg_wdata ; +wire [3 :0] confreg_wstrb ; +wire confreg_wlast ; +wire confreg_wvalid ; +wire confreg_wready ; +wire [4 :0] confreg_bid ; +wire [1 :0] confreg_bresp ; +wire confreg_bvalid ; +wire confreg_bready ; + +//slave 6 FFT/IFFT +wire [4 :0] fft_arid ; +wire [31:0] fft_araddr ; +wire [7 :0] fft_arlen ; +wire [2 :0] fft_arsize ; +wire [1 :0] fft_arburst; +wire fft_arlock ; +wire [3 :0] fft_arcache; +wire [2 :0] fft_arprot ; +wire fft_arvalid; +wire fft_arready; +wire [4 :0] fft_rid ; +wire [31:0] fft_rdata ; +wire [1 :0] fft_rresp ; +wire fft_rlast ; +wire fft_rvalid ; +wire fft_rready ; +wire [4 :0] fft_awid ; +wire [31:0] fft_awaddr ; +wire [7 :0] fft_awlen ; +wire [2 :0] fft_awsize ; +wire [1 :0] fft_awburst; +wire fft_awlock ; +wire [3 :0] fft_awcache; +wire [2 :0] fft_awprot ; +wire fft_awvalid; +wire fft_awready; +wire [4 :0] fft_wid ; +wire [31:0] fft_wdata ; +wire [3 :0] fft_wstrb ; +wire fft_wlast ; +wire fft_wvalid ; +wire fft_wready ; +wire [4 :0] fft_bid ; +wire [1 :0] fft_bresp ; +wire fft_bvalid ; +wire fft_bready ; +wire fft_finish ; + +//slave 7 +wire [4 :0] axiOut_7_arid ; +wire [31:0] axiOut_7_araddr ; +wire [7 :0] axiOut_7_arlen ; +wire [2 :0] axiOut_7_arsize ; +wire [1 :0] axiOut_7_arburst; +wire axiOut_7_arlock ; +wire [3 :0] axiOut_7_arcache; +wire [2 :0] axiOut_7_arprot ; +wire axiOut_7_arvalid; +wire axiOut_7_arready; +wire [4 :0] axiOut_7_rid ; +wire [31:0] axiOut_7_rdata ; +wire [1 :0] axiOut_7_rresp ; +wire axiOut_7_rlast ; +wire axiOut_7_rvalid ; +wire axiOut_7_rready ; +wire [4 :0] axiOut_7_awid ; +wire [31:0] axiOut_7_awaddr ; +wire [7 :0] axiOut_7_awlen ; +wire [2 :0] axiOut_7_awsize ; +wire [1 :0] axiOut_7_awburst; +wire axiOut_7_awlock ; +wire [3 :0] axiOut_7_awcache; +wire [2 :0] axiOut_7_awprot ; +wire axiOut_7_awvalid; +wire axiOut_7_awready; +wire [4 :0] axiOut_7_wid ; +wire [31:0] axiOut_7_wdata ; +wire [3 :0] axiOut_7_wstrb ; +wire axiOut_7_wlast ; +wire axiOut_7_wvalid ; +wire axiOut_7_wready ; +wire [4 :0] axiOut_7_bid ; +wire [1 :0] axiOut_7_bresp ; +wire axiOut_7_bvalid ; +wire axiOut_7_bready ; + +//slave 7 - matmul accelerator +matmul_axi_slave u_matmul_axi_slave ( + .clk (sys_clk), + .resetn (sys_resetn), + + .s_axi_awid (axiOut_7_awid ), + .s_axi_awaddr (axiOut_7_awaddr ), + .s_axi_awlen (axiOut_7_awlen ), + .s_axi_awsize (axiOut_7_awsize ), + .s_axi_awburst (axiOut_7_awburst), + .s_axi_awlock (axiOut_7_awlock ), + .s_axi_awcache (axiOut_7_awcache), + .s_axi_awprot (axiOut_7_awprot ), + .s_axi_awvalid (axiOut_7_awvalid), + .s_axi_awready (axiOut_7_awready), + + .s_axi_wid (axiOut_7_wid ), + .s_axi_wdata (axiOut_7_wdata ), + .s_axi_wstrb (axiOut_7_wstrb ), + .s_axi_wlast (axiOut_7_wlast ), + .s_axi_wvalid (axiOut_7_wvalid), + .s_axi_wready (axiOut_7_wready), + + .s_axi_bid (axiOut_7_bid ), + .s_axi_bresp (axiOut_7_bresp ), + .s_axi_bvalid (axiOut_7_bvalid), + .s_axi_bready (axiOut_7_bready), + + .s_axi_arid (axiOut_7_arid ), + .s_axi_araddr (axiOut_7_araddr ), + .s_axi_arlen (axiOut_7_arlen ), + .s_axi_arsize (axiOut_7_arsize ), + .s_axi_arburst (axiOut_7_arburst), + .s_axi_arlock (axiOut_7_arlock ), + .s_axi_arcache (axiOut_7_arcache), + .s_axi_arprot (axiOut_7_arprot ), + .s_axi_arvalid (axiOut_7_arvalid), + .s_axi_arready (axiOut_7_arready), + + .s_axi_rid (axiOut_7_rid ), + .s_axi_rdata (axiOut_7_rdata ), + .s_axi_rresp (axiOut_7_rresp ), + .s_axi_rlast (axiOut_7_rlast ), + .s_axi_rvalid (axiOut_7_rvalid), + .s_axi_rready (axiOut_7_rready) +); + +wire confreg_int; + +AxiCrossbar_2x8 u_AxiCrossbar_2x8 ( + .clk ( sys_clk ), + .resetn ( sys_resetn ), + + //master 0 + //aw + .axiIn_0_awvalid ( cpu_sync_awvalid ), + .axiIn_0_awready ( cpu_sync_awready ), + .axiIn_0_awaddr ( cpu_sync_awaddr ), + .axiIn_0_awid ( cpu_sync_awid ), + .axiIn_0_awlen ( cpu_sync_awlen ), + .axiIn_0_awsize ( cpu_sync_awsize ), + .axiIn_0_awburst ( cpu_sync_awburst ), + .axiIn_0_awlock ( cpu_sync_awlock ), + .axiIn_0_awcache ( cpu_sync_awcache ), + .axiIn_0_awprot ( cpu_sync_awprot ), + //w + .axiIn_0_wvalid ( cpu_sync_wvalid ), + .axiIn_0_wready ( cpu_sync_wready ), + .axiIn_0_wdata ( cpu_sync_wdata ), + .axiIn_0_wstrb ( cpu_sync_wstrb ), + .axiIn_0_wlast ( cpu_sync_wlast ), + //b + .axiIn_0_bready ( cpu_sync_bready ), + .axiIn_0_bvalid ( cpu_sync_bvalid ), + .axiIn_0_bid ( cpu_sync_bid ), + .axiIn_0_bresp ( cpu_sync_bresp ), + //ar + .axiIn_0_arvalid ( cpu_sync_arvalid ), + .axiIn_0_arready ( cpu_sync_arready ), + .axiIn_0_araddr ( cpu_sync_araddr ), + .axiIn_0_arid ( cpu_sync_arid ), + .axiIn_0_arlen ( cpu_sync_arlen ), + .axiIn_0_arsize ( cpu_sync_arsize ), + .axiIn_0_arburst ( cpu_sync_arburst ), + .axiIn_0_arlock ( cpu_sync_arlock ), + .axiIn_0_arcache ( cpu_sync_arcache ), + .axiIn_0_arprot ( cpu_sync_arprot ), + //r + .axiIn_0_rvalid ( cpu_sync_rvalid ), + .axiIn_0_rready ( cpu_sync_rready ), + .axiIn_0_rdata ( cpu_sync_rdata ), + .axiIn_0_rid ( cpu_sync_rid ), + .axiIn_0_rresp ( cpu_sync_rresp ), + .axiIn_0_rlast ( cpu_sync_rlast ), + + //master 1 + //aw + .axiIn_1_awvalid ( dma_m_awvalid ), + .axiIn_1_awready ( dma_m_awready ), + .axiIn_1_awaddr ( dma_m_awaddr ), + .axiIn_1_awid ( dma_m_awid ), + .axiIn_1_awlen ( dma_m_awlen ), + .axiIn_1_awsize ( dma_m_awsize ), + .axiIn_1_awburst ( dma_m_awburst ), + .axiIn_1_awlock ( dma_m_awlock ), + .axiIn_1_awcache ( dma_m_awcache ), + .axiIn_1_awprot ( dma_m_awprot ), + //w + .axiIn_1_wvalid ( dma_m_wvalid ), + .axiIn_1_wready ( dma_m_wready ), + .axiIn_1_wdata ( dma_m_wdata ), + .axiIn_1_wstrb ( dma_m_wstrb ), + .axiIn_1_wlast ( dma_m_wlast ), + //b + .axiIn_1_bready ( dma_m_bready ), + .axiIn_1_bvalid ( dma_m_bvalid ), + .axiIn_1_bid ( dma_m_bid ), + .axiIn_1_bresp ( dma_m_bresp ), + //ar + .axiIn_1_arvalid ( dma_m_arvalid ), + .axiIn_1_arready ( dma_m_arready ), + .axiIn_1_araddr ( dma_m_araddr ), + .axiIn_1_arid ( dma_m_arid ), + .axiIn_1_arlen ( dma_m_arlen ), + .axiIn_1_arsize ( dma_m_arsize ), + .axiIn_1_arburst ( dma_m_arburst ), + .axiIn_1_arlock ( dma_m_arlock ), + .axiIn_1_arcache ( dma_m_arcache ), + .axiIn_1_arprot ( dma_m_arprot ), + //r + .axiIn_1_rvalid ( dma_m_rvalid ), + .axiIn_1_rready ( dma_m_rready ), + .axiIn_1_rdata ( dma_m_rdata ), + .axiIn_1_rid ( dma_m_rid ), + .axiIn_1_rresp ( dma_m_rresp ), + .axiIn_1_rlast ( dma_m_rlast ), + + //slave 0 + //aw + .axiOut_0_awvalid ( ram_awvalid ), + .axiOut_0_awready ( ram_awready ), + .axiOut_0_awaddr ( ram_awaddr ), + .axiOut_0_awid ( ram_awid ), + .axiOut_0_awlen ( ram_awlen ), + .axiOut_0_awsize ( ram_awsize ), + .axiOut_0_awburst ( ram_awburst ), + .axiOut_0_awlock ( ram_awlock ), + .axiOut_0_awcache ( ram_awcache ), + .axiOut_0_awprot ( ram_awprot ), + //w + .axiOut_0_wvalid ( ram_wvalid ), + .axiOut_0_wready ( ram_wready ), + .axiOut_0_wdata ( ram_wdata ), + .axiOut_0_wstrb ( ram_wstrb ), + .axiOut_0_wlast ( ram_wlast ), + //b + .axiOut_0_bready ( ram_bready ), + .axiOut_0_bvalid ( ram_bvalid ), + .axiOut_0_bid ( ram_bid ), + .axiOut_0_bresp ( ram_bresp ), + //ar + .axiOut_0_arvalid ( ram_arvalid ), + .axiOut_0_arready ( ram_arready ), + .axiOut_0_araddr ( ram_araddr ), + .axiOut_0_arid ( ram_arid ), + .axiOut_0_arlen ( ram_arlen ), + .axiOut_0_arsize ( ram_arsize ), + .axiOut_0_arburst ( ram_arburst ), + .axiOut_0_arlock ( ram_arlock ), + .axiOut_0_arcache ( ram_arcache ), + .axiOut_0_arprot ( ram_arprot ), + //r + .axiOut_0_rvalid ( ram_rvalid ), + .axiOut_0_rready ( ram_rready ), + .axiOut_0_rdata ( ram_rdata ), + .axiOut_0_rid ( ram_rid ), + .axiOut_0_rresp ( ram_rresp ), + .axiOut_0_rlast ( ram_rlast ), + + //slave 1 + //aw + .axiOut_1_awvalid ( axiOut_1_awvalid ), + .axiOut_1_awready ( axiOut_1_awready ), + .axiOut_1_awaddr ( axiOut_1_awaddr ), + .axiOut_1_awid ( axiOut_1_awid ), + .axiOut_1_awlen ( axiOut_1_awlen ), + .axiOut_1_awsize ( axiOut_1_awsize ), + .axiOut_1_awburst ( axiOut_1_awburst ), + .axiOut_1_awlock ( axiOut_1_awlock ), + .axiOut_1_awcache ( axiOut_1_awcache ), + .axiOut_1_awprot ( axiOut_1_awprot ), + //w + .axiOut_1_wvalid ( axiOut_1_wvalid ), + .axiOut_1_wready ( axiOut_1_wready ), + .axiOut_1_wdata ( axiOut_1_wdata ), + .axiOut_1_wstrb ( axiOut_1_wstrb ), + .axiOut_1_wlast ( axiOut_1_wlast ), + //b + .axiOut_1_bready ( axiOut_1_bready ), + .axiOut_1_bvalid ( axiOut_1_bvalid ), + .axiOut_1_bid ( axiOut_1_bid ), + .axiOut_1_bresp ( axiOut_1_bresp ), + //ar + .axiOut_1_arvalid ( axiOut_1_arvalid ), + .axiOut_1_arready ( axiOut_1_arready ), + .axiOut_1_araddr ( axiOut_1_araddr ), + .axiOut_1_arid ( axiOut_1_arid ), + .axiOut_1_arlen ( axiOut_1_arlen ), + .axiOut_1_arsize ( axiOut_1_arsize ), + .axiOut_1_arburst ( axiOut_1_arburst ), + .axiOut_1_arlock ( axiOut_1_arlock ), + .axiOut_1_arcache ( axiOut_1_arcache ), + .axiOut_1_arprot ( axiOut_1_arprot ), + //r + .axiOut_1_rvalid ( axiOut_1_rvalid ), + .axiOut_1_rready ( axiOut_1_rready ), + .axiOut_1_rdata ( axiOut_1_rdata ), + .axiOut_1_rid ( axiOut_1_rid ), + .axiOut_1_rresp ( axiOut_1_rresp ), + .axiOut_1_rlast ( axiOut_1_rlast ), + + //slave 2 + //aw + .axiOut_2_awvalid ( uart_awvalid ), + .axiOut_2_awready ( uart_awready ), + .axiOut_2_awaddr ( uart_awaddr ), + .axiOut_2_awid ( uart_awid ), + .axiOut_2_awlen ( uart_awlen ), + .axiOut_2_awsize ( uart_awsize ), + .axiOut_2_awburst ( uart_awburst ), + .axiOut_2_awlock ( uart_awlock ), + .axiOut_2_awcache ( uart_awcache ), + .axiOut_2_awprot ( uart_awprot ), + //w + .axiOut_2_wvalid ( uart_wvalid ), + .axiOut_2_wready ( uart_wready ), + .axiOut_2_wdata ( uart_wdata ), + .axiOut_2_wstrb ( uart_wstrb ), + .axiOut_2_wlast ( uart_wlast ), + //b + .axiOut_2_bready ( uart_bready ), + .axiOut_2_bvalid ( uart_bvalid ), + .axiOut_2_bid ( uart_bid ), + .axiOut_2_bresp ( uart_bresp ), + //ar + .axiOut_2_arvalid ( uart_arvalid ), + .axiOut_2_arready ( uart_arready ), + .axiOut_2_araddr ( uart_araddr ), + .axiOut_2_arid ( uart_arid ), + .axiOut_2_arlen ( uart_arlen ), + .axiOut_2_arsize ( uart_arsize ), + .axiOut_2_arburst ( uart_arburst ), + .axiOut_2_arlock ( uart_arlock ), + .axiOut_2_arcache ( uart_arcache ), + .axiOut_2_arprot ( uart_arprot ), + //r + .axiOut_2_rvalid ( uart_rvalid ), + .axiOut_2_rready ( uart_rready ), + .axiOut_2_rdata ( uart_rdata ), + .axiOut_2_rid ( uart_rid ), + .axiOut_2_rresp ( uart_rresp ), + .axiOut_2_rlast ( uart_rlast ), + + //slave 3 + //aw + .axiOut_3_awvalid ( dvi_awvalid ), + .axiOut_3_awready ( dvi_awready ), + .axiOut_3_awaddr ( dvi_awaddr ), + .axiOut_3_awid ( dvi_awid ), + .axiOut_3_awlen ( dvi_awlen ), + .axiOut_3_awsize ( dvi_awsize ), + .axiOut_3_awburst ( dvi_awburst ), + .axiOut_3_awlock ( dvi_awlock ), + .axiOut_3_awcache ( dvi_awcache ), + .axiOut_3_awprot ( dvi_awprot ), + //w + .axiOut_3_wvalid ( dvi_wvalid ), + .axiOut_3_wready ( dvi_wready ), + .axiOut_3_wdata ( dvi_wdata ), + .axiOut_3_wstrb ( dvi_wstrb ), + .axiOut_3_wlast ( dvi_wlast ), + //b + .axiOut_3_bready ( dvi_bready ), + .axiOut_3_bvalid ( dvi_bvalid ), + .axiOut_3_bid ( dvi_bid ), + .axiOut_3_bresp ( dvi_bresp ), + //ar + .axiOut_3_arvalid ( dvi_arvalid ), + .axiOut_3_arready ( dvi_arready ), + .axiOut_3_araddr ( dvi_araddr ), + .axiOut_3_arid ( dvi_arid ), + .axiOut_3_arlen ( dvi_arlen ), + .axiOut_3_arsize ( dvi_arsize ), + .axiOut_3_arburst ( dvi_arburst ), + .axiOut_3_arlock ( dvi_arlock ), + .axiOut_3_arcache ( dvi_arcache ), + .axiOut_3_arprot ( dvi_arprot ), + //r + .axiOut_3_rvalid ( dvi_rvalid ), + .axiOut_3_rready ( dvi_rready ), + .axiOut_3_rdata ( dvi_rdata ), + .axiOut_3_rid ( dvi_rid ), + .axiOut_3_rresp ( dvi_rresp ), + .axiOut_3_rlast ( dvi_rlast ), + + + //slave 4 + //aw + .axiOut_4_awvalid ( confreg_awvalid ), + .axiOut_4_awready ( confreg_awready ), + .axiOut_4_awaddr ( confreg_awaddr ), + .axiOut_4_awid ( confreg_awid ), + .axiOut_4_awlen ( confreg_awlen ), + .axiOut_4_awsize ( confreg_awsize ), + .axiOut_4_awburst ( confreg_awburst ), + .axiOut_4_awlock ( confreg_awlock ), + .axiOut_4_awcache ( confreg_awcache ), + .axiOut_4_awprot ( confreg_awprot ), + //w + .axiOut_4_wvalid ( confreg_wvalid ), + .axiOut_4_wready ( confreg_wready ), + .axiOut_4_wdata ( confreg_wdata ), + .axiOut_4_wstrb ( confreg_wstrb ), + .axiOut_4_wlast ( confreg_wlast ), + //b + .axiOut_4_bready ( confreg_bready ), + .axiOut_4_bvalid ( confreg_bvalid ), + .axiOut_4_bid ( confreg_bid ), + .axiOut_4_bresp ( confreg_bresp ), + //ar + .axiOut_4_arvalid ( confreg_arvalid ), + .axiOut_4_arready ( confreg_arready ), + .axiOut_4_araddr ( confreg_araddr ), + .axiOut_4_arid ( confreg_arid ), + .axiOut_4_arlen ( confreg_arlen ), + .axiOut_4_arsize ( confreg_arsize ), + .axiOut_4_arburst ( confreg_arburst ), + .axiOut_4_arlock ( confreg_arlock ), + .axiOut_4_arcache ( confreg_arcache ), + .axiOut_4_arprot ( confreg_arprot ), + //r + .axiOut_4_rvalid ( confreg_rvalid ), + .axiOut_4_rready ( confreg_rready ), + .axiOut_4_rdata ( confreg_rdata ), + .axiOut_4_rid ( confreg_rid ), + .axiOut_4_rresp ( confreg_rresp ), + .axiOut_4_rlast ( confreg_rlast ), + + //slave 5 + //aw + .axiOut_5_awvalid ( dma_s_awvalid ), + .axiOut_5_awready ( dma_s_awready ), + .axiOut_5_awaddr ( dma_s_awaddr ), + .axiOut_5_awid ( dma_s_awid ), + .axiOut_5_awlen ( dma_s_awlen ), + .axiOut_5_awsize ( dma_s_awsize ), + .axiOut_5_awburst ( dma_s_awburst ), + .axiOut_5_awlock ( dma_s_awlock ), + .axiOut_5_awcache ( dma_s_awcache ), + .axiOut_5_awprot ( dma_s_awprot ), + //w + .axiOut_5_wvalid ( dma_s_wvalid ), + .axiOut_5_wready ( dma_s_wready ), + .axiOut_5_wdata ( dma_s_wdata ), + .axiOut_5_wstrb ( dma_s_wstrb ), + .axiOut_5_wlast ( dma_s_wlast ), + //b + .axiOut_5_bready ( dma_s_bready ), + .axiOut_5_bvalid ( dma_s_bvalid ), + .axiOut_5_bid ( dma_s_bid ), + .axiOut_5_bresp ( dma_s_bresp ), + //ar + .axiOut_5_arvalid ( dma_s_arvalid ), + .axiOut_5_arready ( dma_s_arready ), + .axiOut_5_araddr ( dma_s_araddr ), + .axiOut_5_arid ( dma_s_arid ), + .axiOut_5_arlen ( dma_s_arlen ), + .axiOut_5_arsize ( dma_s_arsize ), + .axiOut_5_arburst ( dma_s_arburst ), + .axiOut_5_arlock ( dma_s_arlock ), + .axiOut_5_arcache ( dma_s_arcache ), + .axiOut_5_arprot ( dma_s_arprot ), + //r + .axiOut_5_rvalid ( dma_s_rvalid ), + .axiOut_5_rready ( dma_s_rready ), + .axiOut_5_rdata ( dma_s_rdata ), + .axiOut_5_rid ( dma_s_rid ), + .axiOut_5_rresp ( dma_s_rresp ), + .axiOut_5_rlast ( dma_s_rlast ), + + //slave 6 + //aw + .axiOut_6_awvalid ( fft_awvalid ), + .axiOut_6_awready ( fft_awready ), + .axiOut_6_awaddr ( fft_awaddr ), + .axiOut_6_awid ( fft_awid ), + .axiOut_6_awlen ( fft_awlen ), + .axiOut_6_awsize ( fft_awsize ), + .axiOut_6_awburst ( fft_awburst ), + .axiOut_6_awlock ( fft_awlock ), + .axiOut_6_awcache ( fft_awcache ), + .axiOut_6_awprot ( fft_awprot ), + //w + .axiOut_6_wvalid ( fft_wvalid ), + .axiOut_6_wready ( fft_wready ), + .axiOut_6_wdata ( fft_wdata ), + .axiOut_6_wstrb ( fft_wstrb ), + .axiOut_6_wlast ( fft_wlast ), + //b + .axiOut_6_bready ( fft_bready ), + .axiOut_6_bvalid ( fft_bvalid ), + .axiOut_6_bid ( fft_bid ), + .axiOut_6_bresp ( fft_bresp ), + //ar + .axiOut_6_arvalid ( fft_arvalid ), + .axiOut_6_arready ( fft_arready ), + .axiOut_6_araddr ( fft_araddr ), + .axiOut_6_arid ( fft_arid ), + .axiOut_6_arlen ( fft_arlen ), + .axiOut_6_arsize ( fft_arsize ), + .axiOut_6_arburst ( fft_arburst ), + .axiOut_6_arlock ( fft_arlock ), + .axiOut_6_arcache ( fft_arcache ), + .axiOut_6_arprot ( fft_arprot ), + //r + .axiOut_6_rvalid ( fft_rvalid ), + .axiOut_6_rready ( fft_rready ), + .axiOut_6_rdata ( fft_rdata ), + .axiOut_6_rid ( fft_rid ), + .axiOut_6_rresp ( fft_rresp ), + .axiOut_6_rlast ( fft_rlast ), + + //slave 7 + //aw + .axiOut_7_awvalid ( axiOut_7_awvalid ), + .axiOut_7_awready ( axiOut_7_awready ), + .axiOut_7_awaddr ( axiOut_7_awaddr ), + .axiOut_7_awid ( axiOut_7_awid ), + .axiOut_7_awlen ( axiOut_7_awlen ), + .axiOut_7_awsize ( axiOut_7_awsize ), + .axiOut_7_awburst ( axiOut_7_awburst ), + .axiOut_7_awlock ( axiOut_7_awlock ), + .axiOut_7_awcache ( axiOut_7_awcache ), + .axiOut_7_awprot ( axiOut_7_awprot ), + //w + .axiOut_7_wvalid ( axiOut_7_wvalid ), + .axiOut_7_wready ( axiOut_7_wready ), + .axiOut_7_wdata ( axiOut_7_wdata ), + .axiOut_7_wstrb ( axiOut_7_wstrb ), + .axiOut_7_wlast ( axiOut_7_wlast ), + //b + .axiOut_7_bready ( axiOut_7_bready ), + .axiOut_7_bvalid ( axiOut_7_bvalid ), + .axiOut_7_bid ( axiOut_7_bid ), + .axiOut_7_bresp ( axiOut_7_bresp ), + //ar + .axiOut_7_arvalid ( axiOut_7_arvalid ), + .axiOut_7_arready ( axiOut_7_arready ), + .axiOut_7_araddr ( axiOut_7_araddr ), + .axiOut_7_arid ( axiOut_7_arid ), + .axiOut_7_arlen ( axiOut_7_arlen ), + .axiOut_7_arsize ( axiOut_7_arsize ), + .axiOut_7_arburst ( axiOut_7_arburst ), + .axiOut_7_arlock ( axiOut_7_arlock ), + .axiOut_7_arcache ( axiOut_7_arcache ), + .axiOut_7_arprot ( axiOut_7_arprot ), + //r + .axiOut_7_rvalid ( axiOut_7_rvalid ), + .axiOut_7_rready ( axiOut_7_rready ), + .axiOut_7_rdata ( axiOut_7_rdata ), + .axiOut_7_rid ( axiOut_7_rid ), + .axiOut_7_rresp ( axiOut_7_rresp ), + .axiOut_7_rlast ( axiOut_7_rlast ) + +); + +// add your code + +core_top u_cpu( + .intrpt ({7'b0, confreg_int}), //high active + + .aclk (cpu_clk ), + .aresetn (cpu_resetn ), //low active + + .arid (cpu_arid ), + .araddr (cpu_araddr ), + .arlen (cpu_arlen ), + .arsize (cpu_arsize ), + .arburst (cpu_arburst ), + .arlock (cpu_arlock ), + .arcache (cpu_arcache ), + .arprot (cpu_arprot ), + .arvalid (cpu_arvalid ), + .arready (cpu_arready ), + + .rid (cpu_rid ), + .rdata (cpu_rdata ), + .rresp (cpu_rresp ), + .rlast (cpu_rlast ), + .rvalid (cpu_rvalid ), + .rready (cpu_rready ), + + .awid (cpu_awid ), + .awaddr (cpu_awaddr ), + .awlen (cpu_awlen ), + .awsize (cpu_awsize ), + .awburst (cpu_awburst ), + .awlock (cpu_awlock ), + .awcache (cpu_awcache ), + .awprot (cpu_awprot ), + .awvalid (cpu_awvalid ), + .awready (cpu_awready ), + + .wid (cpu_wid ), + .wdata (cpu_wdata ), + .wstrb (cpu_wstrb ), + .wlast (cpu_wlast ), + .wvalid (cpu_wvalid ), + .wready (cpu_wready ), + + .bid (cpu_bid ), + .bresp (cpu_bresp ), + .bvalid (cpu_bvalid ), + .bready (cpu_bready ), + + //debug interface + .break_point (1'b0 ), + .infor_flag (1'b0 ), + .reg_num (5'b0 ), + .ws_valid ( ), + .rf_rdata ( ), + + .debug0_wb_pc (debug_wb_pc ), + .debug0_wb_inst (debug_wb_inst ), + .debug0_wb_rf_wen (debug_wb_rf_wen ), + .debug0_wb_rf_wnum (debug_wb_rf_wnum ), + .debug0_wb_rf_wdata (debug_wb_rf_wdata ) +); + +//clock sync: from CPU to AXI_Crossbar +Axi_CDC u_Axi_CDC ( + .axiInClk ( cpu_clk ), + .axiInRstn ( cpu_resetn ), + .axiOutClk ( sys_clk ), + .axiOutRstn ( sys_resetn ), + + .axiIn_awvalid ( cpu_awvalid ), + .axiIn_awaddr ( cpu_awaddr ), + .axiIn_awid ( {1'b0,cpu_awid} ), + .axiIn_awlen ( cpu_awlen ), + .axiIn_awsize ( cpu_awsize ), + .axiIn_awburst ( cpu_awburst ), + .axiIn_awlock ( cpu_awlock[0] ), + .axiIn_awcache ( cpu_awcache ), + .axiIn_awprot ( cpu_awprot ), + .axiIn_wvalid ( cpu_wvalid ), + .axiIn_wdata ( cpu_wdata ), + .axiIn_wstrb ( cpu_wstrb ), + .axiIn_wlast ( cpu_wlast ), + .axiIn_bready ( cpu_bready ), + .axiIn_arvalid ( cpu_arvalid ), + .axiIn_araddr ( cpu_araddr ), + .axiIn_arid ( {1'b0,cpu_arid} ), + .axiIn_arlen ( cpu_arlen ), + .axiIn_arsize ( cpu_arsize ), + .axiIn_arburst ( cpu_arburst ), + .axiIn_arlock ( cpu_arlock[0] ), + .axiIn_arcache ( cpu_arcache ), + .axiIn_arprot ( cpu_arprot ), + .axiIn_rready ( cpu_rready ), + .axiOut_awready ( cpu_sync_awready ), + .axiOut_wready ( cpu_sync_wready ), + .axiOut_bvalid ( cpu_sync_bvalid ), + .axiOut_bid ( {1'b0,cpu_sync_bid}), + .axiOut_bresp ( cpu_sync_bresp ), + .axiOut_arready ( cpu_sync_arready ), + .axiOut_rvalid ( cpu_sync_rvalid ), + .axiOut_rdata ( cpu_sync_rdata ), + .axiOut_rid ( {1'b0,cpu_sync_rid}), + .axiOut_rresp ( cpu_sync_rresp ), + .axiOut_rlast ( cpu_sync_rlast ), + + .axiIn_awready ( cpu_awready ), + .axiIn_wready ( cpu_wready ), + .axiIn_bvalid ( cpu_bvalid ), + .axiIn_bid ( {cpu_bid_4,cpu_bid} ), + .axiIn_bresp ( cpu_bresp ), + .axiIn_arready ( cpu_arready ), + .axiIn_rvalid ( cpu_rvalid ), + .axiIn_rdata ( cpu_rdata ), + .axiIn_rid ( {cpu_rid_4,cpu_rid} ), + .axiIn_rresp ( cpu_rresp ), + .axiIn_rlast ( cpu_rlast ), + .axiOut_awvalid ( cpu_sync_awvalid ), + .axiOut_awaddr ( cpu_sync_awaddr ), + .axiOut_awid ( {cpu_sync_awid_4,cpu_sync_awid}), + .axiOut_awlen ( cpu_sync_awlen ), + .axiOut_awsize ( cpu_sync_awsize ), + .axiOut_awburst ( cpu_sync_awburst ), + .axiOut_awlock ( cpu_sync_awlock ), + .axiOut_awcache ( cpu_sync_awcache ), + .axiOut_awprot ( cpu_sync_awprot ), + .axiOut_wvalid ( cpu_sync_wvalid ), + .axiOut_wdata ( cpu_sync_wdata ), + .axiOut_wstrb ( cpu_sync_wstrb ), + .axiOut_wlast ( cpu_sync_wlast ), + .axiOut_bready ( cpu_sync_bready ), + .axiOut_arvalid ( cpu_sync_arvalid ), + .axiOut_araddr ( cpu_sync_araddr ), + .axiOut_arid ( {cpu_sync_arid_4,cpu_sync_arid}), + .axiOut_arlen ( cpu_sync_arlen ), + .axiOut_arsize ( cpu_sync_arsize ), + .axiOut_arburst ( cpu_sync_arburst ), + .axiOut_arlock ( cpu_sync_arlock ), + .axiOut_arcache ( cpu_sync_arcache ), + .axiOut_arprot ( cpu_sync_arprot ), + .axiOut_rready ( cpu_sync_rready ) +); + +//axi ram +axi_wrap_ram_sp_external u_axi_ram ( + .aclk ( sys_clk ), + .aresetn ( sys_resetn ), + //ar + .axi_arid ( ram_arid ), + .axi_araddr ( ram_araddr ), + .axi_arlen ( ram_arlen ), + .axi_arsize ( ram_arsize ), + .axi_arburst ( ram_arburst ), + .axi_arlock ( ram_arlock ), + .axi_arcache ( ram_arcache ), + .axi_arprot ( ram_arprot ), + .axi_arvalid ( ram_arvalid ), + .axi_arready ( ram_arready ), + //r + .axi_rid ( ram_rid ), + .axi_rdata ( ram_rdata ), + .axi_rresp ( ram_rresp ), + .axi_rlast ( ram_rlast ), + .axi_rvalid ( ram_rvalid ), + .axi_rready ( ram_rready ), + //aw + .axi_awid ( ram_awid ), + .axi_awaddr ( ram_awaddr ), + .axi_awlen ( ram_awlen ), + .axi_awsize ( ram_awsize ), + .axi_awburst ( ram_awburst ), + .axi_awlock ( ram_awlock ), + .axi_awcache ( ram_awcache ), + .axi_awprot ( ram_awprot ), + .axi_awvalid ( ram_awvalid ), + .axi_awready ( ram_awready ), + //w + .axi_wdata ( ram_wdata ), + .axi_wstrb ( ram_wstrb ), + .axi_wlast ( ram_wlast ), + .axi_wvalid ( ram_wvalid ), + .axi_wready ( ram_wready ), + //b ram + .axi_bid ( ram_bid ), + .axi_bresp ( ram_bresp ), + .axi_bvalid ( ram_bvalid ), + .axi_bready ( ram_bready ), + + .base_ram_addr ( base_ram_addr ), + .base_ram_be_n ( base_ram_be_n ), + .base_ram_ce_n ( base_ram_ce_n ), + .base_ram_oe_n ( base_ram_oe_n ), + .base_ram_we_n ( base_ram_we_n ), + .ext_ram_addr ( ext_ram_addr ), + .ext_ram_be_n ( ext_ram_be_n ), + .ext_ram_ce_n ( ext_ram_ce_n ), + .ext_ram_oe_n ( ext_ram_oe_n ), + .ext_ram_we_n ( ext_ram_we_n ), + + .base_ram_data ( base_ram_data ), + .ext_ram_data ( ext_ram_data ) +); + +//AXI2APB +axi_uart_controller u_axi_uart_controller +( + .clk (sys_clk ), + .rst_n (sys_resetn ), + + .axi_s_awid (uart_awid ), + .axi_s_awaddr (uart_awaddr ), + .axi_s_awlen (uart_awlen ), + .axi_s_awsize (uart_awsize ), + .axi_s_awburst (uart_awburst ), + .axi_s_awlock (uart_awlock ), + .axi_s_awcache (uart_awcache ), + .axi_s_awprot (uart_awprot ), + .axi_s_awvalid (uart_awvalid ), + .axi_s_awready (uart_awready ), + .axi_s_wid (uart_awid ), + .axi_s_wdata (uart_wdata ), + .axi_s_wstrb (uart_wstrb ), + .axi_s_wlast (uart_wlast ), + .axi_s_wvalid (uart_wvalid ), + .axi_s_wready (uart_wready ), + .axi_s_bid (uart_bid ), + .axi_s_bresp (uart_bresp ), + .axi_s_bvalid (uart_bvalid ), + .axi_s_bready (uart_bready ), + .axi_s_arid (uart_arid ), + .axi_s_araddr (uart_araddr ), + .axi_s_arlen (uart_arlen ), + .axi_s_arsize (uart_arsize ), + .axi_s_arburst (uart_arburst ), + .axi_s_arlock (uart_arlock ), + .axi_s_arcache (uart_arcache ), + .axi_s_arprot (uart_arprot ), + .axi_s_arvalid (uart_arvalid ), + .axi_s_arready (uart_arready ), + .axi_s_rid (uart_rid ), + .axi_s_rdata (uart_rdata ), + .axi_s_rresp (uart_rresp ), + .axi_s_rlast (uart_rlast ), + .axi_s_rvalid (uart_rvalid ), + .axi_s_rready (uart_rready ), + + .apb_rw_dma (1'b0 ), + .apb_psel_dma (1'b0 ), + .apb_enab_dma (1'b0 ), + .apb_addr_dma (20'b0 ), + .apb_valid_dma (1'b0 ), + .apb_wdata_dma (32'b0 ), + .apb_rdata_dma ( ), + .apb_ready_dma ( ), + .dma_grant ( ), + + .dma_req_o ( ), + .dma_ack_i (1'b0 ), + + //UART0 + .uart0_txd_i (uart0_txd_i ), + .uart0_txd_o (uart0_txd_o ), + .uart0_txd_oe (uart0_txd_oe ), + .uart0_rxd_i (uart0_rxd_i ), + .uart0_rxd_o (uart0_rxd_o ), + .uart0_rxd_oe (uart0_rxd_oe ), + .uart0_rts_o (uart0_rts_o ), + .uart0_dtr_o (uart0_dtr_o ), + .uart0_cts_i (uart0_cts_i ), + .uart0_dsr_i (uart0_dsr_i ), + .uart0_dcd_i (uart0_dcd_i ), + .uart0_ri_i (uart0_ri_i ), + .uart0_int (uart0_int ) +); + +confreg #( + .SIMULATION(SIMULATION) +) u_confreg ( + // 时钟与复位 + .aclk (sys_clk), // AXI总线时钟 + .aresetn (sys_resetn), // AXI总线复位 + .cpu_clk (cpu_clk), // CPU时钟 + .cpu_resetn (cpu_resetn), // CPU复位 + + // AXI写地址通道 + .s_awid (confreg_awid), + .s_awaddr (confreg_awaddr), + .s_awlen (confreg_awlen), + .s_awsize (confreg_awsize), + .s_awburst (confreg_awburst), + .s_awlock (confreg_awlock), + .s_awcache (confreg_awcache), + .s_awprot (confreg_awprot), + .s_awvalid (confreg_awvalid), + .s_awready (confreg_awready), + + // AXI写数据通道 + .s_wid (confreg_wid), + .s_wdata (confreg_wdata), + .s_wstrb (confreg_wstrb), + .s_wlast (confreg_wlast), + .s_wvalid (confreg_wvalid), + .s_wready (confreg_wready), + + // AXI写响应通道 + .s_bid (confreg_bid), + .s_bresp (confreg_bresp), + .s_bvalid (confreg_bvalid), + .s_bready (confreg_bready), + + // AXI读地址通道 + .s_arid (confreg_arid), + .s_araddr (confreg_araddr), + .s_arlen (confreg_arlen), + .s_arsize (confreg_arsize), + .s_arburst (confreg_arburst), + .s_arlock (confreg_arlock), + .s_arcache (confreg_arcache), + .s_arprot (confreg_arprot), + .s_arvalid (confreg_arvalid), + .s_arready (confreg_arready), + + // AXI读数据通道 + .s_rid (confreg_rid), + .s_rdata (confreg_rdata), + .s_rresp (confreg_rresp), + .s_rlast (confreg_rlast), + .s_rvalid (confreg_rvalid), + .s_rready (confreg_rready), + + // IO外设接口 (与soc_top顶层引脚相连) + .led (leds), // 顶层引脚名称为 + .dpy0 (dpy0), // 低位数码管 + .dpy1 (dpy1), // 高位数码管 + .switch (dip_sw), // 拨码开关,顶层名称为 dip_sw + .touch_btn (touch_btn), // 触摸按钮 + + // 中断与状态信号 + .uart0_int (uart0_int), // UART0中断 + .dma_finish (dma_finish), // DMA完成信号 + .fft_finish (fft_finish), // FFT完成信号 + .confreg_int(confreg_int) // 输出中断给CPU +); + +axi_dvi u_axi_dvi ( + .s_awvalid ( dvi_awvalid ), + .s_awaddr ( dvi_awaddr ), + .s_awid ( dvi_awid ), + .s_awlen ( dvi_awlen ), + .s_awsize ( dvi_awsize ), + .s_awburst ( dvi_awburst ), + .s_awlock ( dvi_awlock ), + .s_awcache ( dvi_awcache ), + .s_awprot ( dvi_awprot ), + .s_wvalid ( dvi_wvalid ), + .s_wdata ( dvi_wdata ), + .s_wstrb ( dvi_wstrb ), + .s_wlast ( dvi_wlast ), + .s_bready ( dvi_bready ), + .s_arvalid ( dvi_arvalid ), + .s_araddr ( dvi_araddr ), + .s_arid ( dvi_arid ), + .s_arlen ( dvi_arlen ), + .s_arsize ( dvi_arsize ), + .s_arburst ( dvi_arburst ), + .s_arlock ( dvi_arlock ), + .s_arcache ( dvi_arcache ), + .s_arprot ( dvi_arprot ), + .s_rready ( dvi_rready ), + .aclk ( sys_clk ), + .aresetn ( sys_resetn ), + + .s_awready ( dvi_awready ), + .s_wready ( dvi_wready ), + .s_bvalid ( dvi_bvalid ), + .s_bid ( dvi_bid ), + .s_bresp ( dvi_bresp ), + .s_arready ( dvi_arready ), + .s_rvalid ( dvi_rvalid ), + .s_rdata ( dvi_rdata ), + .s_rid ( dvi_rid ), + .s_rresp ( dvi_rresp ), + .s_rlast ( dvi_rlast ), + .video_clk ( video_clk ), + .hsync ( video_hsync ), + .vsync ( video_vsync ), + .data_enable ( video_de ), + .video_red ( video_red ), + .video_green ( video_green ), + .video_blue ( video_blue ) +); + +fft_controller u_fft_controller( + .aclk (sys_clk ), + .aresetn (sys_resetn ), + .s_awid (fft_awid ), + .s_awaddr (fft_awaddr ), + .s_awlen (fft_awlen ), + .s_awsize (fft_awsize ), + .s_awburst (fft_awburst ), + .s_awlock (fft_awlock ), + .s_awcache (fft_awcache ), + .s_awprot (fft_awprot ), + .s_awvalid (fft_awvalid ), + .s_awready (fft_awready ), + .s_wid (fft_wid ), + .s_wdata (fft_wdata ), + .s_wstrb (fft_wstrb ), + .s_wlast (fft_wlast ), + .s_wvalid (fft_wvalid ), + .s_wready (fft_wready ), + .s_bid (fft_bid ), + .s_bresp (fft_bresp ), + .s_bvalid (fft_bvalid ), + .s_bready (fft_bready ), + .s_arid (fft_arid ), + .s_araddr (fft_araddr ), + .s_arlen (fft_arlen ), + .s_arsize (fft_arsize ), + .s_arburst (fft_arburst ), + .s_arlock (fft_arlock ), + .s_arcache (fft_arcache ), + .s_arprot (fft_arprot ), + .s_arvalid (fft_arvalid ), + .s_arready (fft_arready ), + .s_rid (fft_rid ), + .s_rdata (fft_rdata ), + .s_rresp (fft_rresp ), + .s_rlast (fft_rlast ), + .s_rvalid (fft_rvalid ), + .s_rready (fft_rready ), + .fft_finish (fft_finish ) +); + +wire [31:0] cdma_s_awaddr; +wire [2:0] cdma_s_awprot; +wire cdma_s_awvalid; +wire cdma_s_awready; +wire [31:0] cdma_s_wdata; +wire [3:0] cdma_s_wstrb; +wire cdma_s_wvalid; +wire cdma_s_wready; +wire [1:0] cdma_s_bresp; +wire cdma_s_bvalid; +wire cdma_s_bready; +wire [31:0] cdma_s_araddr; +wire [2:0] cdma_s_arprot; +wire cdma_s_arvalid; +wire cdma_s_arready; +wire [31:0] cdma_s_rdata; +wire [1:0] cdma_s_rresp; +wire cdma_s_rvalid; +wire cdma_s_rready; + +axi_axil_adapter #( + .ADDR_WIDTH(32), + .AXI_DATA_WIDTH(32), + .AXI_ID_WIDTH(5), + .AXIL_DATA_WIDTH(32), + .CONVERT_BURST(1), + .CONVERT_NARROW_BURST(0) +) +u_axi_axil_adapter( + .clk(sys_clk), + .rst(~sys_resetn), + .s_axi_awid(dma_s_awid), + .s_axi_awaddr(dma_s_awaddr), + .s_axi_awlen(dma_s_awlen), + .s_axi_awsize(dma_s_awsize), + .s_axi_awburst(dma_s_awburst), + .s_axi_awlock(dma_s_awlock), + .s_axi_awcache(dma_s_awcache), + .s_axi_awprot(dma_s_awprot), + .s_axi_awvalid(dma_s_awvalid), + .s_axi_awready(dma_s_awready), + .s_axi_wdata(dma_s_wdata), + .s_axi_wstrb(dma_s_wstrb), + .s_axi_wlast(dma_s_wlast), + .s_axi_wvalid(dma_s_wvalid), + .s_axi_wready(dma_s_wready), + .s_axi_bid(dma_s_bid), + .s_axi_bresp(dma_s_bresp), + .s_axi_bvalid(dma_s_bvalid), + .s_axi_bready(dma_s_bready), + .s_axi_arid(dma_s_arid), + .s_axi_araddr(dma_s_araddr), + .s_axi_arlen(dma_s_arlen), + .s_axi_arsize(dma_s_arsize), + .s_axi_arburst(dma_s_arburst), + .s_axi_arlock(dma_s_arlock), + .s_axi_arcache(dma_s_arcache), + .s_axi_arprot(dma_s_arprot), + .s_axi_arvalid(dma_s_arvalid), + .s_axi_arready(dma_s_arready), + .s_axi_rid(dma_s_rid), + .s_axi_rdata(dma_s_rdata), + .s_axi_rresp(dma_s_rresp), + .s_axi_rlast(dma_s_rlast), + .s_axi_rvalid(dma_s_rvalid), + .s_axi_rready(dma_s_rready), + + .m_axil_awaddr(cdma_s_awaddr), + .m_axil_awprot(cdma_s_awprot), + .m_axil_awvalid(cdma_s_awvalid), + .m_axil_awready(cdma_s_awready), + .m_axil_wdata(cdma_s_wdata), + .m_axil_wstrb(cdma_s_wstrb), + .m_axil_wvalid(cdma_s_wvalid), + .m_axil_wready(cdma_s_wready), + .m_axil_bresp(cdma_s_bresp), + .m_axil_bvalid(cdma_s_bvalid), + .m_axil_bready(cdma_s_bready), + .m_axil_araddr(cdma_s_araddr), + .m_axil_arprot(cdma_s_arprot), + .m_axil_arvalid(cdma_s_arvalid), + .m_axil_arready(cdma_s_arready), + .m_axil_rdata(cdma_s_rdata), + .m_axil_rresp(cdma_s_rresp), + .m_axil_rvalid(cdma_s_rvalid), + .m_axil_rready(cdma_s_rready) +); + +// 8 通道 DMA +snix_axil_cdma_mux #( + .ADDR_WIDTH (32), + .DATA_WIDTH (32), // 适配你的 32-bit 总线 + .AXIL_ADDR_WIDTH (32), + .AXIL_DATA_WIDTH (32), + .ID_WIDTH (4), // 匹配 Crossbar 的 Master ID 宽度 + .USER_WIDTH (1), + .PORTS (4), // 8 个通道 + .FIFO_DEPTH (64) +) u_snix_axil_cdma_mux_8ch ( + .clk (sys_clk), + .rst_n (sys_resetn), // 低电平复位 + + // AXI-Lite 从机接口 (接 CPU 发来的配置请求) + .s_axil_awaddr (cdma_s_awaddr), + .s_axil_awvalid (cdma_s_awvalid), + .s_axil_awready (cdma_s_awready), + .s_axil_wdata (cdma_s_wdata), + .s_axil_wstrb (cdma_s_wstrb), + .s_axil_wvalid (cdma_s_wvalid), + .s_axil_wready (cdma_s_wready), + .s_axil_bresp (cdma_s_bresp), + .s_axil_bvalid (cdma_s_bvalid), + .s_axil_bready (cdma_s_bready), + .s_axil_araddr (cdma_s_araddr), + .s_axil_arvalid (cdma_s_arvalid), + .s_axil_arready (cdma_s_arready), + .s_axil_rdata (cdma_s_rdata), + .s_axil_rresp (cdma_s_rresp), + .s_axil_rvalid (cdma_s_rvalid), + .s_axil_rready (cdma_s_rready), + + // AXI4 主机接口 (接 Crossbar 去搬运数据) + .mm2mm_awid (dma_m_awid), + .mm2mm_awaddr (dma_m_awaddr), + .mm2mm_awlen (dma_m_awlen), + .mm2mm_awsize (dma_m_awsize), + .mm2mm_awburst (dma_m_awburst), + .mm2mm_awlock (dma_m_awlock), + .mm2mm_awcache (dma_m_awcache), + .mm2mm_awprot (dma_m_awprot), + .mm2mm_awqos (), // 悬空即可 + .mm2mm_awuser (), // 悬空即可 + .mm2mm_awvalid (dma_m_awvalid), + .mm2mm_awready (dma_m_awready), + .mm2mm_wdata (dma_m_wdata), + .mm2mm_wstrb (dma_m_wstrb), + .mm2mm_wlast (dma_m_wlast), + .mm2mm_wuser (), // 悬空即可 + .mm2mm_wvalid (dma_m_wvalid), + .mm2mm_wready (dma_m_wready), + .mm2mm_bid (dma_m_bid), + .mm2mm_bresp (dma_m_bresp), + .mm2mm_buser (1'b0), + .mm2mm_bvalid (dma_m_bvalid), + .mm2mm_bready (dma_m_bready), + .mm2mm_arid (dma_m_arid), + .mm2mm_araddr (dma_m_araddr), + .mm2mm_arlen (dma_m_arlen), + .mm2mm_arsize (dma_m_arsize), + .mm2mm_arburst (dma_m_arburst), + .mm2mm_arlock (dma_m_arlock), + .mm2mm_arcache (dma_m_arcache), + .mm2mm_arprot (dma_m_arprot), + .mm2mm_arqos (), // 悬空即可 + .mm2mm_aruser (), // 悬空即可 + .mm2mm_arvalid (dma_m_arvalid), + .mm2mm_arready (dma_m_arready), + .mm2mm_rid (dma_m_rid), + .mm2mm_rdata (dma_m_rdata), + .mm2mm_rresp (dma_m_rresp), + .mm2mm_rlast (dma_m_rlast), + .mm2mm_ruser (1'b0), + .mm2mm_rvalid (dma_m_rvalid), + .mm2mm_rready (dma_m_rready), + + // 全局中断输出 + .dma_finish (dma_finish) +); + +endmodule \ No newline at end of file diff --git a/sdk/axi_ram.mif b/sdk/axi_ram.mif new file mode 100644 index 0000000..573fd83 --- /dev/null +++ b/sdk/axi_ram.mif @@ -0,0 +1,10004 @@ +00000010100000000000000000000001 +00000010100000000000000000000010 +00000010100000000000000000000011 +00000010100000000000000000000100 +00000010100000000000000000000101 +00000010100000000000000000000110 +00000010100000000000000000000111 +00000010100000000000000000001000 +00000010100000000000000000001001 +00000010100000000000000000001010 +00000010100000000000000000001011 +00000010100000000000000000001100 +00000010100000000000000000001101 +00000010100000000000000000001110 +00000010100000000000000000001111 +00000010100000000000000000010000 +00000010100000000000000000010001 +00000010100000000000000000010010 +00000010100000000000000000010011 +00000010100000000000000000010100 +00000010100000000000000000010101 +00000010100000000000000000010110 +00000010100000000000000000010111 +00000010100000000000000000011000 +00000010100000000000000000011001 +00000010100000000000000000011010 +00000010100000000000000000011011 +00000010100000000000000000011100 +00000010100000000000000000011101 +00000010100000000000000000011110 +00000010100000000000000000011111 +00000000000101010000000000001100 +00000011100001000000000000001110 +00000000010000001001000110001101 +00000110000000000000000110100000 +00000110000000000000010110100000 +00000110000000000000000110100001 +00000110000000000000010110100001 +00000010100000000000010110001100 +01011111111111111110100110001110 +00000011100000000010000000001100 +00000011100000000110000000001101 +00000100000000000000000110101100 +00000100000001100000000000100000 +00000100000001100000010000100000 +00000011100000000010010000001100 +00000100000001100000000000101100 +00010101010000000000000000001100 +00000011100000000010010110001100 +00000100000001100000010000101100 +00000011100000000100000000001100 +00000011100000000110000000001101 +00000100000000000000000110101100 +00011100000000000000000100101100 +00000010100010100011000110001100 +00011100000000000001000000001101 +00000010101111001001000110101101 +00011100000000000001000000101110 +00000010101000000011000111001110 +01101100000000000001100110101110 +00101000100000000000000110001111 +00101001100000000000000110101111 +00000010100000000001000110001100 +00000010100000000001000110101101 +01101011111111111111000110101110 +00011100000000000001000000001100 +00000010100111111011000110001100 +00011100000000000001000000101101 +00000010101010111001000110101101 +01101100000000000001000110001101 +00101001100000000000000110000000 +00000010100000000001000110001100 +01101011111111111111100110001101 +00000011100000000110010000001100 +00000100000001100000000000101100 +00011100000000000001000000001100 +00000010100101110101000110001100 +00101000100000000000000110001101 +00000011100000000001110000001110 +00101001000000000000100110101110 +00000011100000100000000000001110 +00101001000000000000110110101110 +00000000000101010000000000001110 +00101001000000000000010110101110 +00010101011111100100000111101111 +00000011100101000000000111101111 +00101000100000000000000111101111 +00000011100000000110110000001110 +01011000000000000000100000001111 +00000011100000000000010000001110 +00101001000000000000000110101110 +00000011100000000000110000001110 +00101001000000000000110110101110 +00000000000101010000000000001110 +00101001000000000001000110101110 +00011100000000000000000000001100 +00000010100001110001000110001100 +00000100000000000011000000101100 +00000011100000000000010000001101 +00000100000000010001000000101101 +00000011100000000001000000001101 +00000100000000000000000110101101 +00000100000000000000010000100000 +00010100000000000000000000101101 +00000011101111111111110110101101 +00000100000000000001000000100000 +00000100000000000001000000101101 +00011100000000000010000000000011 +00000010101110010101000001100011 +00000000000101010000000000000100 +00000000000101010000000000000101 +01010100000000001000010000000000 +01010100000000000100000000000000 +01010000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +01010000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000010101111111100000001100011 +00011100000000000001000000000100 +00000010101101101111000010000100 +00101001100000000011000001100001 +00101001100000000010000001110111 +01010100000001011101110000000000 +00000010100000011001000000000101 +00011100000000000001000000000100 +00000010101101101111000010000100 +01010100000001011100110000000000 +00011100000000000001000000001100 +00000010101101111110000110001100 +00101000100000000000000110000110 +00101000100000000001000110000111 +00011100000000000001000000000100 +00000010101101101010000010000100 +01010100000001011011000000000000 +00011100000000000001000000001100 +00000010101101111001000110001100 +00101000100000000000000110000110 +00101000100000000001000110000111 +00011100000000000001000000000100 +00000010101101100101000010000100 +01010100000001011001010000000000 +00000010100000000001100000000100 +01010100000000111101010000000000 +00011100000000000001000000000101 +00000010101101100011000010100101 +00000000000101010000000010010111 +01010100000001010000010000000000 +00000000000101010000001011100110 +00000000000101010000001011100101 +00011100000000000001000000000100 +00000010101101011111000010000100 +01010100000001010110100000000000 +00000010100000000011000000000110 +00011100000000000001000000000101 +00000010100100001001000010100101 +00011100000000000001000000000100 +00000010100100000100000010000100 +01010100000001001001100000000000 +00011100000000000001000000000101 +00000010100100000001000010100101 +00011100000000000001000000000100 +00000010101101011100000010000100 +01010100000001010011110000000000 +00101000100000000011000001100001 +00101000100000000010000001110111 +00000000000101010000000000000100 +00000010100000000100000001100011 +01001100000000000000000000100000 +00000011010000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000010101111100001000001100011 +00101001100000011110000001100001 +00101001100000011101000001100010 +00101001100000011100000001100011 +00101001100000011011000001100100 +00101001100000011010000001100101 +00101001100000011001000001100110 +00101001100000011000000001100111 +00101001100000010111000001101000 +00101001100000010110000001101001 +00101001100000010101000001101010 +00101001100000010100000001101011 +00101001100000010011000001101100 +00101001100000010010000001101101 +00101001100000010001000001101110 +00101001100000010000000001101111 +00101001100000001111000001110000 +00101001100000001110000001110001 +00101001100000001101000001110010 +00101001100000001100000001110011 +00101001100000001011000001110100 +00101001100000001010000001110101 +00101001100000001001000001110110 +00101001100000001000000001110111 +00101001100000000111000001111000 +00101001100000000110000001111001 +00101001100000000101000001111010 +00101001100000000100000001111011 +00101001100000000011000001111100 +00101001100000000010000001111101 +00101001100000000001000001111110 +00101001100000000000000001111111 +00000100000000000001010000000100 +00000100000000000001100000000101 +00000000010001001100000010001100 +01011100000000001001000000001100 +00000011010011111111000010001100 +00000000010001001000100110001101 +00000000000101010000000110101110 +00000011010000000000010111001110 +00000011100000000000010000010100 +01011000000000010000100111010100 +00000000000101010000000110101110 +00000011010000000000100111001110 +00000011100000000000100000010100 +01011000000000010000000111010100 +00000000000101010000000110101110 +00000011010000000001000111001110 +00000011100000000001000000010100 +01011000000000001111010111010100 +00000000000101010000000110101110 +00000011010000000010000111001110 +00000011100000000010000000010100 +01011000000000001110100111010100 +00000000000101010000000110101110 +00000011010000000100000111001110 +00000011100000000100000000010100 +01011000000000001101110111010100 +00000000000101010000000110101110 +00000011010000001000000111001110 +00000011100000001000000000010100 +01011000000000001101000111010100 +00000000000101010000000110101110 +00000011010000010000000111001110 +00000011100000010000000000010100 +01011000000000001100010111010100 +00000000000101010000000110101110 +00000011010000100000000111001110 +00000011100000100000000000010100 +01011000000000001011100111010100 +01010000000000000001000000000000 +00000010100000000001000010110100 +00000100000000000001100000110100 +01010000000000000000000000000000 +00101000100000011110000001100001 +00101000100000011101000001100010 +00101000100000011100000001100011 +00101000100000011011000001100100 +00101000100000011010000001100101 +00101000100000011001000001100110 +00101000100000011000000001100111 +00101000100000010111000001101000 +00101000100000010110000001101001 +00101000100000010101000001101010 +00101000100000010100000001101011 +00101000100000010011000001101100 +00101000100000010010000001101101 +00101000100000010001000001101110 +00101000100000010000000001101111 +00101000100000001111000001110000 +00101000100000001110000001110001 +00101000100000001101000001110010 +00101000100000001100000001110011 +00101000100000001011000001110100 +00101000100000001010000001110101 +00101000100000001001000001110110 +00101000100000001000000001110111 +00101000100000000111000001111000 +00101000100000000110000001111001 +00101000100000000101000001111010 +00101000100000000100000001111011 +00101000100000000011000001111100 +00101000100000000010000001111101 +00101000100000000001000001111110 +00101000100000000000000001111111 +00000010100000011111000001100011 +00000110010010000011100000000000 +01010100000000000010010000000000 +01010011111111110111101111111111 +01010011111111110111011111111111 +01010011111111110111001111111111 +01010011111111110110111111111111 +01010011111111110110101111111111 +01010011111111110110011111111111 +01010011111111110110001111111111 +01010011111111110101111111111111 +01010000000000000000000000000000 +00000011010000000000000000000000 +00000011010000000000000000000000 +00000011010000000000000000000000 +00000011010000000000000000000000 +00000011010000000000000000000000 +00000011010000000000000000000000 +00000011010000000000000000000000 +00000011010000000000000000000000 +00000011010000000000000000000000 +00000011010000000000000000000000 +00000011010000000000000000000000 +00000010101111111000000001100011 +00101001100000000111000001100001 +00101001100000000110000001110111 +00101001100000000101000001111000 +00101001100000000100000001111001 +00101001100000000011000001111010 +01100100000000000010100010000000 +00000010101111111111110000011000 +00101000100000000111000001100001 +00000000000101010000001100000100 +00101000100000000110000001110111 +00101000100000000101000001111000 +00101000100000000100000001111001 +00101000100000000011000001111010 +00000010100000001000000001100011 +01001100000000000000000000100000 +00000000000101010000000010010111 +01010100000000100101000000000000 +00000010101111111111110000001100 +01011011111111111101000010001100 +00000010100000000010110010011000 +00000010101111111110000000001100 +00000000000100000101110010010111 +00011100000000000001000000011010 +00000010100011010101001101011010 +00000000000101001011001100011000 +00101001100000000000001101010111 +00000010101111111111001100011000 +01011000000000000001110010011000 +00000000000100010001001100011001 +00000000000101010000001100100100 +01010100000000100001100000000000 +01011111111111111001111011100100 +00000000000100000110011011110111 +00101001100000000000001101010111 +00011100000000000001000000001100 +00000010100011001010000110001100 +00101000100000000000000110001101 +01011111111111111000100110100000 +00101001100000000000000110011000 +01010011111111111000001111111111 +00000010101111111100000001100011 +00101001100000000010000001110111 +00011100000000000001000000001100 +00000010100011000001000110001100 +00101000100000000000000010010111 +00101000100000000000000110001100 +00101001100000000000000001111001 +00101001100000000011000001100001 +00101001100000000001000001111000 +00000000000100000101110010011001 +01011000000000000000110110011001 +00000000000101010000000000000100 +01010000000000000011010000000000 +00000000000100010101110010110111 +00000010100000000010000000001100 +01101100000000000000101011101100 +00000010100000000010000000010111 +00000000000101010000000010011000 +00000000000101010000001011100100 +01010111111111110001001111111111 +01011100000000000010110010011001 +00101000100000000000001100000101 +00000010100000000000010000000100 +00000000000100000101110010110111 +00101001100000000000001100010111 +00101000100000000011000001100001 +00101000100000000010000001110111 +00101000100000000001000001111000 +00101000100000000000000001111001 +00000010100000000100000001100011 +01001100000000000000000000100000 +00000010101111111111110000001100 +01011011111111111010110010001100 +00101001100000000000000010010111 +00000010100000000001000010000100 +01010100001000001001100000000000 +01010011111111111001111111111111 +00000010101111111000000001100011 +00101001100000000111000001100001 +00101001100000000110000001110111 +00101001100000000101000001111000 +00101001100000000100000001111001 +00101001100000000011000001111010 +00000010101111111010110000001100 +01101100000000000011100110000100 +00011100000000000001000000001100 +00101000100010000101000110001100 +00000010100000000011000000001101 +00101001100000000000000110001101 +00000000000101010000000000010111 +00101000100000000111000001100001 +00000000000101010000001011100100 +00101000100000000110000001110111 +00101000100000000101000001111000 +00101000100000000100000001111001 +00101000100000000011000001111010 +00000010100000001000000001100011 +01001100000000000000000000100000 +00000010100000000001110010011000 +00000010101111111110000000000100 +00000000000101001001001100011000 +00000010100000000010001100011001 +00011100000000000001000000011010 +00000010100010000111001101011010 +00101000100000000000001101010111 +01011100000000000001111011100000 +00000000000101010000001100100100 +01010111111111100101001111111111 +00000010101111111111110000001100 +00000000000101010000000010010111 +01011100000000000011000010001100 +01010011111111111001101111111111 +00101000100000000000001011101100 +00101000100000000001001011101101 +01101000000000000100010110011001 +00000000000100010110010110001100 +00000010100000000001110000001110 +01101100000000000001110111001100 +00000000000100000110011011101110 +00101001100000000000000111001100 +00101001100000000001000111001101 +00101001100000000000001101001110 +00101001100000000000001011111001 +01010000000000000000100000000000 +00101001100000000000001101001101 +00000010100000000001001011110111 +00000010100000000001001100000110 +00000000000101010000000000000101 +00000000000101010000001011100100 +01010100000000000101010000000000 +01010011111111110110001111111111 +01011100000000000010000110100000 +00000000000101010000001100100101 +00000000000101010000001011100100 +01010111111111101000101111111111 +01011000000000000001000010000000 +00101000100000000001001011101100 +00101001100000000000001101001100 +01010011111111111100111111111111 +00000010100000000001001011111010 +01010011111111110111001111111111 +00000000000101010000000000001100 +01011100000000000000100011001100 +01001100000000000000000000100000 +00000000000100000011000010101110 +00101010000000000000000111001110 +00000000000100000011000010001101 +00000010100000000000010110001100 +00101001000000000000000110101110 +01010011111111111110011111111111 +00000000000100000001100010000110 +00000000000101010000000010001100 +01011100000000000000100110000110 +01001100000000000000000000100000 +00000010100000000000010110001100 +00101001001111111111110110000101 +01010011111111111111001111111111 +00000000000101010000000010001100 +00000010100000000000010010100101 +00101000001111111111110010101101 +00000010100000000000010110001100 +00101001001111111111110110001101 +01011111111111111111000110100000 +01001100000000000000000000100000 +00000000000101010000000010001100 +00011100000000000001000000001101 +00000010101111001011000110101101 +00101000100000000000000110100100 +01100100000000000011000110000000 +00011100000000000001000000001110 +00101000100000111101000111001110 +00000000000100010011100010001110 +00000000000100010011000000001111 +01101100000000000010110111001111 +00011100000000000001000000001100 +00101000100000101100000110001100 +00000010100000000011000000001101 +00101001100000000000000110001101 +00000010101111111111110000000100 +01001100000000000000000000100000 +00011100000000000001000000001110 +00101000100000101111000111001110 +00000000000100010001000111001110 +01101011111111111101110111001100 +00000000000100000011000010001100 +00101001100000000000000110101100 +01001100000000000000000000100000 +00000010101111110000000001100011 +00011100000000000001000000001100 +00101000100000100011000110001100 +00101001100000001001000001100101 +00101001100000001010000001100110 +00000000000101010000000010000101 +00101000100000000000000110000100 +00000010100000001001000001100110 +00101001100000000111000001100001 +00101001100000001011000001100111 +00101001100000001100000001101000 +00101001100000001101000001101001 +00101001100000001110000001101010 +00101001100000001111000001101011 +00101001100000000011000001100110 +01010100000000000001000000000000 +00101000100000000111000001100001 +00000010100000010000000001100011 +01001100000000000000000000100000 +00000010101110100100000001100011 +00101001100001011011000001100001 +00101001100001011000000001111000 +00101001100001010111000001111001 +00101001100001010101000001111011 +00000000000101010000000010111000 +00000000000101010000000011011011 +00101001100001011010000001110110 +00101001100001011001000001110111 +00101001100001010110000001111010 +00101001100001010100000001111100 +00101001100001010011000001111101 +00101001100001010010000001111110 +00101001100001010001000001111111 +00000000000101010000000010011001 +01010100001111010100010000000000 +00101000100000000000000010001100 +00000000000101010000000110000100 +00101001100000001110000001101100 +01010100001111001110000000000000 +00011100000000000001000000001100 +00101000100000000010000110001100 +00101000100000000000000110001100 +00101001100000000110000001100100 +00101001010000011101000001100000 +01011100000000000000100110000000 +01010100001111101000100000000000 +00101010010000000011001100101100 +00000011010000000010000110001100 +01011000000000010000010110000000 +00101000100000000100001100101100 +01011000000000001111110110000000 +00000010100000100111000001101100 +00101001100000100100000001101100 +00101001100000100110000001100000 +00101001100000100101000001100000 +00000000000101010000000000011100 +00101001100000001001000001100000 +00101001100000001100000001100000 +00101001100000010001000001100000 +00101001100000010000000001100000 +00101001100000000011000001100000 +00101001100000001101000001100000 +00101001100000001111000001100000 +00101001100000001000000001100000 +00000000000101010000001100010111 +00000010100000001001010000001110 +00101000000000000000001011101101 +01011000000000000000100110100000 +01011100000000010000000110101110 +00000000000100010110001011111010 +01011000000000000101001101000000 +00101000100000100110000001101101 +00101001100000000000000110011000 +00101001100000000001000110011010 +00000010100000000001110000001110 +00000000000100000110100110101101 +00101001100000100110000001101101 +00101000100000100101000001101101 +00000010100000000010000110001100 +00000010100000000000010110101101 +00101001100000100101000001101101 +01100100000000000001100111001101 +00000010100000100100000001100101 +00000000000101010000001100100100 +01010100001111101100000000000000 +01011100000001111001110010000000 +00000010100000100111000001101100 +00101000100000001000000001101101 +00000000000100000110100110101101 +00101001100000001000000001101101 +00101000000000000000001011101101 +01011000000111000001110110100000 +00000010100000000000011011101110 +00101001000000011100110001100000 +00000010101111111111110000011010 +00101001100000000111000001100000 +00000000000101010000000000010111 +00000010100000000010010000011101 +00000010100000001010100000011110 +00000010100000000000010111001101 +00101001100000000101000001101101 +00101000000000000000000111001101 +00000010100000010110100000010001 +00101001100000000010000001101101 +00101000100000000010000001101101 +00000010101111111000000110101110 +01101000000100011010101000101110 +00000000010000001000100111001110 +00011100000000000000111111101101 +00000010100110110101000110101101 +00000000000100000011100110101110 +00101000100000000000000111001110 +01001100000000000000000111000000 +00000000000101010000001100100100 +01010100001111110101100000000000 +01011011111111110000000010000000 +00000010101111111111110000001100 +00101001100000001000000001101100 +00101000100001011011000001100001 +00101000100001011010000001110110 +00101000100000001000000001100100 +00101000100001011001000001110111 +00101000100001011000000001111000 +00101000100001010111000001111001 +00101000100001010110000001111010 +00101000100001010101000001111011 +00101000100001010100000001111100 +00101000100001010011000001111101 +00101000100001010010000001111110 +00101000100001010001000001111111 +00000010100001011100000001100011 +01001100000000000000000000100000 +00000010100000000000011011110111 +01010011111111101111011111111111 +00101001100000000010000001101100 +01010100001110111011000000000000 +00101000100000000001000010001100 +00000000000101010000000110000100 +00101001100000001111000001101100 +01010100001110110100110000000000 +00101001100000001101000001100100 +01010100001110111001100000000000 +00101000100000000010000010001100 +00101000100000001101000001101101 +00101001100000000011000001101100 +00101000100000000010000001101100 +01011000000000000001100110100000 +00101000100000000011000001101101 +01011000000000000001000110100000 +00101000000000000000000110101110 +01011000000000000000100111000000 +00000011100100000000001011110111 +00101000100000000101000001101110 +01010011111111110010101111111111 +00101000000000011100110001101110 +01011111111111111111010111000000 +00000010100000001000000000001110 +00101001000000011100110001101110 +01010011111111111110101111111111 +00000011100000000000011011110111 +01010011111111111110001111111111 +00101000100000000000001101101101 +00000010100000000001001101111011 +00101001100000000111000001101101 +01100111111111111101000110100000 +00000000000100010011010000001101 +00101001100000000111000001101101 +00000011100000000001001011110111 +01010011111111111100001111111111 +00000010100000001010110000001110 +01010011111111111100111111111111 +00101000100000000101000001101101 +00000010100000000000010110101110 +00101000000000000000000110101101 +00101001100000000010000001101101 +01011100000000000101000110111110 +00101000100000000000001101111010 +00000010100000000001001101101111 +01100100000000000000101101000000 +00000010101111111111110000011010 +00000000000101010000000111111011 +00101001100000000101000001101110 +01010011111111111000101111111111 +00000000010000001000101101001111 +00000000000100000110100111101101 +00000000010000001000010110101101 +00000010100000000000010111001110 +00000000000100000100000110111010 +00101000001111111111110111001101 +00101001100000000010000001101101 +00101000100000000010000001101101 +00000010101111110100000110110000 +01101111111111111101111110110000 +00101001100000000101000001101110 +01010011111111101001101111111111 +00000000000101010000000000011010 +01010011111111111110101111111111 +00000011100000100000001011110111 +01010011111111110100101111111111 +00101000100000000101000001101110 +00101001100000000111000001100000 +00101000100000000111000001101101 +00000010100000000000010111001110 +00000000010000001000100110101111 +00000000000100000011010111101111 +00101000100000000010000001101101 +00000000010000001000010111101111 +00000010101111110100000110101101 +00000000000100000011110110101101 +00101001100000000111000001101101 +00101000001111111111110111001101 +00101001100000000010000001101101 +00000010101111110100000110101111 +01101111111111111101001110101111 +01010011111111111010111111111111 +00000011100000000010001011110111 +01010011111111110000001111111111 +00101000100000000101000001101101 +00000010100000011010000000001110 +00101000000000000000000110101111 +01011100000000000001010111101110 +00000010100000000000010110101101 +00101001100000000101000001101101 +00000011100010000000001011110111 +01010011111111101110001111111111 +00000011100000010000001011110111 +01010011111111101101101111111111 +00101000100000000101000001101101 +00000010100000011011000000001110 +00101000000000000000000110101111 +01011100000000000001010111101110 +00000010100000000000010110101101 +00101001100000000101000001101101 +00000011100000001000001011110111 +01010011111111101011101111111111 +00000011100000000100001011110111 +01010011111111101011001111111111 +00000010100000000001001101101101 +00101001100000000100000001101101 +00101000100000000000001101101101 +00101001000000011100110001100000 +00101001000000110111000001101101 +00000000000101010000000000010110 +00000010100000000000010000011010 +00000000000101010000000000001111 +00000000000101010000000000011101 +00000000000101010000000000011011 +00000000000101010000000000011111 +00000010100000110111000001111000 +01010000000000100010100000000000 +00000011100000000100001011110111 +00000011010000001000001011101110 +01011000000000000110110111000000 +00000010100000000001111101111011 +00000010101111111110000000000110 +00000000000101001001101101111011 +00101000100000000000001101111111 +00101000100000000001001101110110 +00000010100000000010001101101101 +00101001100000000100000001101101 +01100100000110011001001011000000 +00000000000100010111110000011111 +00000000000100101111110000001110 +00000000000100010101100000010110 +00000000000100010011101011010110 +00000010100000001011010000001110 +00101001000000011100110001101110 +00000010100000000000010000001110 +00000010101111111111110000001111 +01011000000011010111101101001111 +00000000000101010000001011101111 +00000010101111011111110000010000 +00000000000101001100001011110111 +00000000000101010101101111110000 +01011100000011010110011000000000 +01011000000011101110101101000000 +00000010100000000000010000001111 +01011100000011010110000111001111 +01010000000110010101110000000000 +00000010100000000001001101101101 +00101001100000000100000001101101 +00000011010000000100001011101110 +01011000000000000001000111000000 +00101000100000000000001101111111 +00000000010010001111111111110110 +01010011111111111001111111111111 +00101000100000000000001101101101 +00000011010000010000001011101110 +00101001100000001010000001101101 +01011000000000000000110111000000 +00101000010000001010000001111111 +01010011111111111110011111111111 +00000011010010000000001011101110 +01011000000000000000110111000000 +00101000000000001010000001111111 +01010011111111111101011111111111 +00101000100000001010000001111111 +01010011111111111100111111111111 +00000011010000000010001011101110 +01011000000000001100110111000000 +00101000100000000000001101101110 +00101001100000001010000001101100 +00000010100000011000000001100100 +00101000100000000000000111001111 +00000010100000000001001101101100 +00101001100000000100000001101100 +00101001100000011000000001101111 +00101000100000000001000111001111 +00101001100000011001000001101111 +00101000100000000010000111001111 +00101001100000011010000001101111 +00101000100000000011000111001110 +00101001100000011011000001101110 +01010100011111010010110000000000 +00101000100000001010000001101100 +00101001100000001001000001100100 +00101001100000001100000001100101 +00101000100000001100000001101110 +00101000100000001001000001101111 +00101001100000001010000001101100 +00000000000101010000000111000101 +00000000000101010000000111100100 +01010100000110011000100000000000 +00000010100000000000010000001110 +00101000100000001010000001101100 +01011100000000001000110010001110 +00101000100000001001000001101110 +00101000100000001100000001101101 +00000000000101010000000000000110 +00000000000101010000000000000111 +00000000000101010000000111000100 +00000000000101010000000110100101 +01010100011010001111000000000000 +00101000100000001010000001101100 +01100100000000000000110010000000 +00000010100000001011010000001101 +00101001000000011100110001101101 +00101000100000000010000001101110 +00000010100000010001110000001101 +00011100000000000000111111111000 +00000010100010111101001100011000 +01100100000000000000110110101110 +00011100000000000000111111111000 +00000010100010111011001100011000 +00000010101111011111110000001101 +00000000000101001011011011110111 +00000000000101010000000000010110 +00000010100000000000110000011010 +00000000000101010000000000001111 +01010000000011001001110000000000 +00000010100000000001111101111011 +00000010101111111110000000000110 +00000000000101001001101101111011 +00000010100000000010001101101101 +00101001100000000100000001101101 +00101000100000000000001101101101 +00101001100000001001000001101101 +00101000100000000001001101101101 +00101001100000001100000001101101 +01010011111111110101101111111111 +00101000100000001001000001101111 +00101000100000001100000001101110 +00101001100000001010000001101100 +00000000000101010000000111100100 +00000000000101010000000111000101 +01010100000110001101110000000000 +00000000000101010000000010011111 +00101000100000001010000001101100 +01011100000000101101000010000000 +00101000100000001100000001101101 +01100100000000000000110110100000 +00000010100000001011010000001101 +00101001000000011100110001101101 +00101000100000000010000001101110 +00000010100000010001110000001101 +00011100000000000000111111111000 +00000010100010011011001100011000 +01100100000000000000110110101110 +00011100000000000000111111111000 +00000010100010011001001100011000 +00000010101111011111110000001101 +00000000000101001011011011110111 +00000000000101010000000000001111 +00000000000101010000000000011101 +00000000000101010000000000011011 +00000000000101010000000000010110 +00000010100000000000110000011010 +00101001100000001010000001101111 +01100100000000000000100111111010 +00101001100000001010000001111010 +00101000000000011100110001110000 +01011000000000000001001000000000 +00101000100000001010000001101101 +00000010100000000000010110101101 +00101001100000001010000001101101 +00000011010000000000101011101101 +00101001100000010010000001101101 +01011000000000000001000110100000 +00101000100000001010000001101101 +00000010100000000000100110101101 +00101001100000001010000001101101 +00000011010000100001001011111110 +01011100000000000111011111000000 +00101000100000000111000001101101 +00101000100000001010000001101110 +00000000000100010011100110110000 +01100100000000000110010000010000 +00000010100000000100000000000110 +00011100000000000000111111110100 +00000010100011101000001010010100 +00000010100000000001110000000111 +00101000100000100110000001110010 +00101000100000100101000001110001 +00101001100000000000000110010100 +00000010100000000010000110010011 +00000010100000000000011000110001 +01100000000011001110100011010000 +00101001100000000001000110010000 +00000000000100000100101000010000 +00101001100000100110000001110000 +00101001100000100101000001110001 +00000010100000000001110000010000 +00000000000101010000001001101100 +01100100000000000010001000010001 +00000010100000100100000001100101 +00000000000101010000001100100100 +00101001100000010011000001101111 +01010100001110010110010000000000 +01011100000001000010110010000000 +00101000100000010011000001101111 +00000010100000100111000001101100 +00101000000000011100110001110000 +01011000000000000101011000000000 +00000010100000011100110001110000 +00101001100000000000000110010000 +00000010100000000000010000010000 +00101001100000000001000110010000 +00101000100000100110000001110000 +00000010100000000001110000010001 +00000010100000000010000110001100 +00000010100000000000011000010000 +00101001100000100110000001110000 +00101000100000100101000001110000 +00000010100000000000011000010000 +00101001100000100101000001110000 +01100100000000000010001000110000 +00000010100000100100000001100101 +00000000000101010000001100100100 +00101001100000010011000001101111 +01010100001110010000110000000000 +01011100000000111101010010000000 +00101000100000010011000001101111 +00000010100000100111000001101100 +00101000100000010010000001101101 +01011000000000000101010110100000 +00000010100000011101000001110000 +00101001100000000000000110010000 +00000010100000000000100000010000 +00101001100000000001000110010000 +00101000100000100110000001110000 +00000010100000000001110000010001 +00000010100000000010000110001100 +00000010100000000000101000010000 +00101001100000100110000001110000 +00101000100000100101000001110000 +00000010100000000000011000010000 +00101001100000100101000001110000 +01100100000000000010001000110000 +00000010100000100100000001100101 +00000000000101010000001100100100 +00101001100000010010000001101111 +01010100001110001011010000000000 +01011100000000110111110010000000 +00101000100000010010000001101111 +00000010100000100111000001101100 +00000010100000100000000000010000 +01011100000000000111011111010000 +00101000100000000111000001101101 +00101000100000001010000001101110 +00000000000100010011100110111110 +01100100000000000110010000011110 +00000010100000000100000000010011 +00011100000000000000111111101101 +00000010100010011010000110101101 +00000010100000000001110000010100 +00101000100000100110000001110001 +00101000100000100101000001110000 +00101001100000000000000110001101 +00000010100000000010000110010010 +00000010100000000000011000010000 +01100000000011000001011001111110 +00101001100000000001000110011110 +00000000000100000100011111011110 +00101001100000100110000001111110 +00101001100000100101000001110000 +00000010100000000001110000010001 +00000000000101010000001001001100 +01100100000000000010001000110000 +00000010100000100100000001100101 +00000000000101010000001100100100 +00101001100000010010000001101111 +01010100001110000011110000000000 +01011100000000110000010010000000 +00101000100000010010000001101111 +00000010100000100111000001101100 +00000000000100010110100111111110 +01100100000000000101110000011110 +00000010100000000100000000010010 +00011100000000000000111111101101 +00000010100010000000000110101101 +00000010100000000001110000010011 +00101000100000100110000001101111 +00101000100000100101000001110000 +00101001100000000000000110001101 +00000010100000000010000110010001 +00000010100000000000011000010000 +01100000000010111111101001011110 +00000000000100000011111111001111 +00101001100000000001000110011110 +00101001100000100110000001101111 +00101001100000100101000001110000 +00000010100000000001110000001111 +00000000000101010000001000101100 +01100100000000000001100111110000 +00000010100000100100000001100101 +00000000000101010000001100100100 +01010100001101111101100000000000 +01011100000000101010000010000000 +00000010100000100111000001101100 +00000011010001000000001011101111 +00101000100000100110000001111110 +01011100000011000000000111100000 +00101001100000000000000110011000 +00101001100000000001000110011010 +00000000000100000111101101001101 +00101001100000100110000001101101 +00101000100000100101000001101101 +00000010100000000001110000001110 +00000010100000000010000110001100 +00000010100000000000010110101101 +00101001100000100101000001101101 +01100100000011001111110111001101 +00000010100000100100000001100101 +00000000000101010000001100100100 +01010100001101111001000000000000 +01011100000000100101100010000000 +00000010100000100111000001101100 +01010000000011001110010000000000 +00101000100000000010000001101101 +00000010101111110111110000011011 +00000010100000010000010000001110 +00000000000101001110110110111011 +01011100000000000110001101101110 +00000010100000001100000000001110 +00101001000000011101000001101110 +00000010100000011000010000001111 +00000010100000011110000000001110 +01011000000000000000100110101111 +00000010100000010110000000001110 +00101001000000011101010001101110 +00000010100000011000110000001110 +00000011100000000000101011110111 +01100100000000100010010111011010 +00000010100000000000011101000100 +00101001100000001010000001101100 +01010111111101010111011111111111 +00000000000101010000000010011000 +00101000100000001010000001101100 +01011100000000100001100010000000 +00101010010000000011001100101100 +00000011100000010000000110001100 +00101001010000000011001100101100 +00101010010000000011001100101100 +00000011010000010000000110001100 +01011011111110001110000110000000 +01010011111110001101011111111111 +00000010101111111111110000001110 +01011000000000011111111101001110 +00000010100000010001110000001110 +00000000000101010000000000010110 +01011100000000000001001101101110 +01011100000000000000111101000000 +00000000000101010000001101010110 +00000010100000000000010000011010 +00000011100001000000001011101101 +00101001100000010010000001101101 +00101000100000001100000001101101 +01100100000000011110000110100000 +00010101000000000000000000011100 +00000000000101011011011110011100 +00000010100000001011010000001101 +00101001100000010011000001101101 +00000010100000010000010000001110 +01011100000000100001011101101110 +00101000100000001001000001101111 +00000010100000011110000001100110 +00000000000101010000001110000101 +00000000000101010000000111100100 +00101001100000010110000001101100 +01010100000101000110100000000000 +00011100000000000000111111101110 +00000010100000101100000111001110 +00101000100000000000000111000110 +00101000100000000001000111000111 +01010100011001011110000000000000 +00000000000101010000000000000110 +00000000000101010000000000000111 +00101001100000001010000001100100 +00101001100000001011000001100101 +01010100011000101110110000000000 +00101000100000010110000001101100 +01011100000000000000110010000000 +00000010100000000000010000001110 +00101001100000011110000001101110 +00101000100000000010000001101101 +00000010100000011000010000001110 +00011100000000000000111111111100 +00000010101110101100001110011100 +01011000000000000000110110101110 +00011100000000000000111111111100 +00000010101110101110001110011100 +00011100000000000000111111101110 +00000010100000011001000111001110 +00101000100000000001000111001111 +00101000100000000000000111001110 +00000010101111111111111101011111 +00000000000101010000001100011110 +00101001100000010100000001101110 +00101001100000010101000001101111 +00101000100000010100000001100110 +00101000100000010101000001100111 +00101000100000001010000001100100 +00101000100000001011000001100101 +00101001100000010111000001101100 +00000010100000000000011111011110 +01010100011001010110010000000000 +00101001100000001010000001100100 +00101001100000001011000001100101 +01010100011101011000100000000000 +00000000000101010000000010011101 +01010100011101100001000000000000 +00000000000101010000000010000110 +00000000000101010000000010100111 +00101000100000001010000001100100 +00101000100000001011000001100101 +01010100011010111110110000000000 +00000000000100000111011110001110 +00101010000000000000000111001110 +00101001100000001010000001100100 +00101001100000001011000001100101 +00101001100000010110000001111111 +00101001001111111111111111001110 +00000010101111111111110000001101 +00101000100000010111000001101100 +01011000000000000001111111101101 +00000000000101010000000000000110 +00000000000101010000000000000111 +01010100011000100010110000000000 +00000010101111111111111111111111 +00101000100000010111000001101100 +01011111111111111000010010000000 +00011100000000000000111111111111 +00000010101111110011001111111111 +00101000100000000000001111100110 +00101000100000000001001111100111 +00101000100000001010000001100100 +00101000100000001011000001100101 +00101001100000010100000001101100 +01010100011000101001000000000000 +00101000100000010100000001101100 +01100000000000000010100000000100 +00101000100000000000001111100110 +00101000100000000001001111100111 +00101000100000001010000001100100 +00101000100000001011000001100101 +01010100011000011110010000000000 +00101000100000010100000001101100 +01011100000000001011000010000000 +00000011010000000000011110111101 +01011000000000001010101110100000 +00101000000000000011111110010001 +00101001100000100010000001111110 +00000010100000001100000000010010 +00101000100000100010000001101111 +00000010101111111111110111101110 +00101001100000100010000001101110 +00101000001111111111110111101110 +01011000000000000101110111010001 +00000010100000001110010000010001 +01011100000000000101110111010001 +00101000000000000010101110001110 +00101001001111111111110111101110 +00000000000101010000001111011100 +00000000000100010110001110011100 +01011100000000001111001100000000 +01011011111111100001011011000000 +00000000000101010000001011000100 +01010100000100111111010000000000 +01010011111111100000101111111111 +00000000000101010000000000010110 +00000010100000110111000001111000 +01010011111111100010111111111111 +00000000000101010000000010010110 +01010011111111100010011111111111 +00000000000101010000000000010110 +00000010100000000001100000011010 +01010011111111100001101111111111 +00101000100000001100000001111100 +00101001100000010011000001100000 +01010011111111100010111111111111 +00101001001111111111110111110010 +01010011111111111001001111111111 +00000010100000000000010111001110 +00101001100000001010000001101110 +00101000000000001010000001101110 +01010011111111111010001111111111 +00000010100000000000011110011100 +00101001001111111111111110001111 +00000000000100010111001111001110 +01100111111111111111010111000000 +01010011111111111001011111111111 +00101000100000010110000001101101 +00000000000101010000001111011100 +00000010100000001100000000001111 +00000000000100000011011111011110 +01010011111111111110011111111111 +00000010100000010001100000001110 +01011000000000000001111101101110 +00000010100000010001010000001110 +00000010100000000000011101011101 +01011000000000000000101101101110 +00000000000101010000001101011101 +00000010100000000000100000000110 +01010000000000000000110000000000 +00000000000101010000001101011101 +00000010100000000000110000000110 +00101000100000001001000001101111 +00000010100000100010000001101010 +00000010100000011111000001101001 +00000010100000011110000001101000 +00000000000101010000001110100111 +00000000000101010000000111100100 +00000000000101010000001110000101 +00101001100000001010000001101100 +01010100000101011001100000000000 +00000000000101010000000010011000 +01011011111111110011010010000000 +00000010100000010001110000001110 +00101000100000001010000001101100 +01011100000000010010111101101110 +00000011010000000000011011101110 +01011100000000010010010111000000 +00101000100000100010000001111100 +00000000000100010110001110011100 +00000010100000010001110000001111 +00101000100000011110000001111111 +01011100000000011010101101101111 +00000010101111111111010000001111 +01100000000000000000101111101111 +01100100000000100011101101011111 +00101000100000000010000001101101 +00000010101111111111100110101101 +00101001100000000010000001101101 +00101000100000000010000001101110 +00000010101111111111111111101101 +00000010101111110111110000001111 +00101001100000011110000001101101 +00000000000101001011110111001111 +00000010100000010000010000010000 +01011000000000011010010111110000 +00101000000000000010000001101111 +00000000000101010000000000010000 +00101001000000100000000001101111 +00000010100000001010110000001111 +01100100000000000001000110100000 +00000010100000000000010000001101 +00000000000100010111110110101101 +00000010100000001011010000001111 +00101001000000100000010001101111 +00000010100000000010010000001110 +01100100000000011011000111001101 +00000010100000100011110001101110 +00000000000101010000000111010010 +00000010100000000010100000010001 +00000010100000011000110000010011 +00000000001000001100010110101111 +01011100000000000000101000100000 +00000000001010100000000000000111 +00000010100000001100000111101111 +00101001001111111111110111001111 +00000000001000000100010110101111 +01011100000000000000101000100000 +00000000001010100000000000000111 +00000010101111111111110111010000 +01100000000000010101101001101101 +00000010100000001100000111101111 +00101001001111111111111000001111 +00000010101111111111100111001110 +00000010100000100000100001101111 +01101000000000010101000111010010 +00000010100000100000000001101101 +00000000000100010011010111101101 +00101001100000010000000001101101 +00000010100000000000010000001110 +00000000000100000111000110111010 +01100000000000000000110111011100 +00000011010000000000011011101110 +01011000000000000000110111000000 +00101000100000000110000001101101 +00000000000100000011011101011010 +00000010101011111111110000001110 +00000000000101001011101011110111 +00000011100001000000001011101101 +00101001100000010010000001101101 +00000000000101010000000000011101 +00000000000101010000000000011011 +00000000000101010000000000011111 +00101000100000010011000001101101 +01011000000000000000110110100000 +00000010100000001011010000001111 +00101001000000011100110001101111 +00101000100000010010000001110111 +00000000000101010000000000001111 +01010011111110010011001111111111 +00000010100000010001100000001110 +00000000000100000111011100011110 +01011100000000000100101101101110 +00101000000000000000001100001111 +00000010100000001100000000001110 +01011100000000000011010111101110 +00101000100000001001000001101111 +00000000000101010000000000000110 +00000000000101010000000000000111 +00000000000101010000000111100100 +00000000000101010000001110000101 +00101001100000001010000001101100 +01010100010111110110000000000000 +00101000100000001010000001101100 +01011000000000000001000010000000 +00000010100000000000010000001110 +00000000000100010111010111011101 +00101001100000011110000001111101 +00101000100000011110000001101110 +00000000000100000011101111011110 +00101000100000001001000001101111 +00000000000101010000000000000110 +00000000000101010000000000000111 +00000000000101010000000111100100 +00000000000101010000001110000101 +00101001100000001010000001101100 +01010100010111110010100000000000 +00101000100000001010000001101100 +01011100000000000000100010000000 +00101001100000100010000001111110 +00000010100000001100000000001111 +01010000000000000001000000000000 +00000010100000000000010111010000 +00101001100000100010000001110000 +00101001000000000000000111001111 +00101000100000100010000001101110 +01101011111111111111000111011110 +01010011111111100100111111111111 +00000010100000010001100000001111 +01011111111111100111001101101111 +00000011010000000000011011101111 +00000000000101010110100111101111 +01100100000000000111110000011111 +01011000000000001110000111100000 +00101000100000000110000001101101 +00000000000100000011011111101111 +00000000000100000011111101011010 +00000010100000011001100000001101 +00101001100000000010000001101101 +01010000000000001010110000000000 +00101000100000000010000001101110 +00000010100000000000010000010000 +00000010100000000011110111001111 +00101001100000001010000001101111 +00101000000000001010000001101111 +01010011111111100101011111111111 +00000000000101010000001000001110 +00000000000101010000000111101101 +01010011111111100111111111111111 +00000010100000000000010111001110 +00101010001111111111110111001101 +00000010100000000000010111101111 +00101001001111111111110111101101 +01010011111111101010001111111111 +00000010100000100000100001101110 +01011100000000000001001000000000 +00000010100000001100000000001110 +00101001000000100000100001101110 +00000010100000100000110001101110 +00000010100000001100000110101101 +00000010100000000000010111001111 +00101001000000000000000111001101 +01010011111111101000001111111111 +01011000000000000111000111100000 +00101000100000000110000001101101 +00000010100000000000010110101111 +01010011111111111000101111111111 +01100000000000000010001111111100 +00000011010000000000011011101101 +00000000000101010000001111111010 +01011000000000000000110110100000 +00101000100000000110000001101101 +00000000000100000011011111111010 +00000010100000011001110000001101 +01010011111111110111001111111111 +00101000100000000110000001101101 +00000000000100000011011110011010 +00000010100000011001110000001101 +00101001100000000010000001101101 +01100000000000000000110000011111 +00000000000100010111111101001101 +00000010100000000000010110111010 +00000011010100000000001011111011 +00000000000101010000000000011101 +01011011111111100110111101100000 +00000000000101010000000000011011 +01100111111111100110010000011111 +00000010100000011111110000010000 +01010000000000000011110000000000 +00000000000101010000001111111010 +01010011111111110010111111111111 +00000010100000011001100000001101 +00101001100000000010000001101101 +00000010100000000000010000011010 +01010011111111111101001111111111 +01100100000000000010110111111111 +00101000100000000011000001101101 +00000000000100010011111111111111 +00101000000000000000010110101111 +01011000000000000011000111100000 +00000010100000000000010110101101 +00000010100000000000011101111011 +00101001100000000011000001101101 +00101000100000000011000001101101 +00101000000000000000000110101111 +01011111111111111101100111110000 +00101000100000001101000001101101 +00000000000100000111011101101111 +00000000000111000011010111101111 +00000000000100000110100111111010 +01010011111111100000011111111111 +00000010100000000000011110111101 +01010011111111111101111111111111 +00000010100000000001001101101110 +00101001100000000100000001101110 +00000011010000001000001011101110 +00101000100000000000001101101101 +01011000000000000010000111000000 +00101000100000001000000001101110 +00101001100000000000000110101110 +00000000010010001111110111001110 +00101001100000000001000110101110 +00101000100000000100000001111011 +00101000100000000101000001111000 +01010011111100100000101111111111 +00000011010000000100001011101110 +01011000000000000001000111000000 +00101000100000001000000001101110 +00101001100000000000000110101110 +01010011111111111110011111111111 +00000011010000010000001011101110 +01011000000000000001000111000000 +00101000100000001000000001101110 +00101001010000000000000110101110 +01010011111111111101001111111111 +00000011010010000000001011110111 +01011011111111111101111011100000 +00101000100000001000000001101110 +00101001000000000000000110101110 +01010011111111111011111111111111 +00000011100000000100001011110111 +00000011010000001000001011101110 +01011000000000000011010111000000 +00000010100000000001111101111011 +00000010101111111110000000000110 +00000000000101001001101101111011 +00101000100000000000001101111111 +00101000100000000001001101110110 +00000010100000000010001101101101 +00101001100000000100000001101101 +00000010101011111111110000001110 +00000000000101001011101011110111 +00000000000101010000000000001110 +00101001000000011100110001100000 +01010011111101001100001111111111 +00000010100000000001001101101101 +00101001100000000100000001101101 +00000011010000000100001011101110 +01011000000000000000110111000000 +00101000100000000000001101111111 +01010000000000000001000000000000 +00000011010000010000001011101110 +01011000000000000001000111000000 +00101010010000000000001101111111 +00000000000101010000000000010110 +01010011111111111100011111111111 +00000011010010000000001011101110 +01011011111111111110000111000000 +00101010000000000000001101111111 +01010011111111111110111111111111 +00000010100000000001001101101101 +00101001100000000100000001101101 +00010100000000000000000011101110 +00011100000000000000111111101101 +00000010101000100101000110101101 +00000011101000001100000111001110 +00101001100000010001000001101101 +00000010100000011110000000001101 +00101001010000011101000001101110 +00101000100000000000001101111111 +00000000000101010000000000010110 +00000011100000000000101011110111 +00000010100000000000100000001110 +00101001100000000010000001101101 +01010011111111111000011111111111 +00101000100000000000001101111000 +00000010100000000001001101101101 +00101001100000000100000001101101 +00101001000000011100110001100000 +01011100000000000011001100000000 +00000010100000000001100000001110 +01101100000000000000100111011010 +00000010100000000001100000011010 +00000000000101010000000000010110 +00000000000101010000000000001111 +00000000000101010000000000011101 +00000000000101010000000000011011 +00000000000101010000000000011111 +00011100000000000000111111111000 +00000010101000010110001100011000 +01010011111101011110011111111111 +00000010101111111111110000001110 +00101001100000001010000001101100 +01011000000000000010111101001110 +00000000000101010000001101000110 +00000000000101010000000000000101 +00000000000101010000001100000100 +01010100001011010000010000000000 +00000000000101010000000010010110 +00101000100000001010000001101100 +01011011111101010010000010000000 +00000000000100010110000010011010 +00000000000101010000000000010110 +01010011111101010001011111111111 +00000000000101010000001100000100 +01010100001011010001010000000000 +00000000000101010000000010011010 +00000000000101010000000000010110 +00000000000101010000000000001111 +00000000000101010000000000011101 +00000000000101010000000000011011 +00000000000101010000000000011111 +00101000100000001010000001101100 +01010011111101011000101111111111 +00000011100000000100001011110111 +00000011010000001000001011101110 +01011000000000000010100111000000 +00000010100000000001111101111011 +00000010101111111110000000000110 +00000000000101001001101101111011 +00101000100000000000001101111111 +00101000100000000001001101110110 +00000010100000000010001101101101 +00101001100000000100000001101101 +00000010100000000000010000001110 +01010011111111101011101111111111 +00000010100000000001001101101101 +00101001100000000100000001101101 +00000011010000000100001011101110 +01011000000000000000110111000000 +00101000100000000000001101111111 +01010000000000000001000000000000 +00000011010000010000001011101110 +01011000000000000001000111000000 +00101010010000000000001101111111 +00000000000101010000000000010110 +01010011111111111101001111111111 +00000011010010000000001011101110 +01011011111111111110000111000000 +00101010000000000000001101111111 +01010011111111111110111111111111 +00011100000000000000111111001101 +00000010100111011100000110101101 +00101001100000010001000001101101 +00000011010000001000001011101110 +01011000000000000110000111000000 +00000010100000000001111101111011 +00000010101111111110000000000110 +00000000000101001001101101111011 +00101000100000000000001101111111 +00101000100000000001001101110110 +00000010100000000010001101101101 +00101001100000000100000001101101 +00000011010000000000011011101110 +01011000000000000010000111000000 +00000000000101010101101111101110 +01011000000000000001100111000000 +00101000100000000010000001101101 +00000010100000001100000000001110 +00101001000000011101000001101110 +00101001000000011101010001101101 +00000011100000000000101011110111 +00000010101011111111110000001110 +00000000000101001011101011110111 +00000010100000000000100000001110 +01010011111111100001101111111111 +00011100000000000000111111001101 +00000010100110111110000110101101 +01010011111111111001111111111111 +00000010100000000001001101101101 +00101001100000000100000001101101 +00000011010000000100001011101110 +01011000000000000000110111000000 +00101000100000000000001101111111 +01010000000000000001000000000000 +00000011010000010000001011101110 +01011000000000000001000111000000 +00101010010000000000001101111111 +00000000000101010000000000010110 +01010011111111111001101111111111 +00000011010010000000001011101110 +01011011111111111110000111000000 +00101010000000000000001101111111 +01010011111111111110111111111111 +00000000000101010000001011101111 +00000010100000000000010000001110 +01010011111100101001011111111111 +00000010100000000000010000001111 +01011000000010111111100111001111 +00000010100000000000100000001111 +01011000000000010100010111001111 +00000010100001010000000001101110 +00000000010000001111011011010000 +00000011010000000001111111101111 +00000000010001001000111111111111 +00000010100000001100000111101111 +00000000000101010111111000011111 +00000000010001001000111011010110 +00101001001111111111110111001111 +00000000000101010101101111110000 +00000010101111111111110111011000 +01011100000000000011111000000000 +00000011010000000000011011110000 +01011000000000000001011000000000 +00000010100000001100000000010000 +01011000000000000000110111110000 +00101001001111111111111100010000 +00000010101111111111100111011000 +00000010100001010000000001101101 +00000000000101010000001101001111 +00000000000101010000000000010110 +00000000000100010110000110111010 +00000000000101010000000000011101 +00000000000101010000000000011011 +00000000000101010000000000011111 +01010011111100111111001111111111 +00000000000101010000001100001110 +01010011111111111001111111111111 +00000000000101010000000000011100 +00000010100001010000000001101110 +00000011010100000000001011111101 +00000010100000011111110000011110 +00000010100000000010010000011011 +00000010100000000010100000000110 +00000000000101010000000000000111 +00000000000101010000001111100100 +00000000000101010000001011000101 +00101001100000010010000001101100 +00000010101111111111110111011000 +00101001100000001010000001101110 +01010100010000111000100000000000 +00101000100000001010000001101110 +00000010100000001100000010000100 +00000010100000000000011110011100 +00101001001111111111110111000100 +00101000100000010010000001101100 +01011000000000000101101110100000 +00101000100000000011000001101101 +00101000000000000000000110101110 +01011100000000000100111110001110 +01011000000000000100101110011110 +01011100000000000000101011000000 +01101100000000000100001101111111 +00101001100000001010000001101100 +00101000100000001101000001101100 +00101000100000001111000001100101 +00000000000101010000000000011100 +00000000000100010011001100011000 +00000000000101010000000110000110 +00000000000101010000001100000100 +01010100001010101110110000000000 +00101000100000000011000001101100 +00101000000000000000010110001110 +00101000100000001010000001101100 +01011000000000000001000111000000 +00101000100000000011000001101101 +00000010100000000000010110101101 +00101001100000000011000001101101 +00000010100000000010100000000110 +00000000000101010000000000000111 +00000000000101010000001111100100 +00000000000101010000001011000101 +00101001100000001010000001101100 +01010100001111011100010000000000 +00101000100000001010000001101100 +01011100000000000000101011000000 +01101111111111110001101101111111 +00000000000101010000000010011111 +00000000000101010000000010110110 +00000000000101010000001100001110 +01010011111111110100011111111111 +00000010100001010000000001111000 +00101000100000010001000001101101 +00000011010000000011111111101110 +00000010101111111111111100011000 +00000000000100000011100110101110 +00101010000000000000000111001110 +00000000010001001001001111111111 +00101001000000000000001100001110 +00000000010000001111001011001110 +00000000000101010111110111011111 +00000000010001001001001011010110 +00000000000101010101101111101110 +01011111111111111101010111000000 +01010011111111101101001111111111 +00000010100001010000000001111000 +01011111111111101100100111000000 +00000011010000000000010111101111 +01011011111111101100000111100000 +00000010100000001100000000001110 +00101001000001001111110001101110 +01010000000010100111000000000000 +00101000100000000010000001101101 +01011000000010100011010110100000 +00101001000000110111000001101101 +00101001000000011100110001100000 +00101001100000000100000001111011 +01010011111100000110011111111111 +00000010100000000100001001010010 +00101001100000000001000110000110 +00101001100000100110000001110010 +00101001100000100101000001110001 +01100100000000000011100011110001 +00000010100000100100000001100101 +00000000000101010000001100100100 +00101001100000010110000001101111 +00101001100000010011000001110000 +01010100001011001000010000000000 +01011111111101110100110010000000 +00101000100000010110000001101111 +00101000100000010011000001110000 +00000010100000100111000001110011 +00000010100000000001110000000111 +00011100000000000000111111010100 +00000010100110010111001010010100 +00000010100000000100000000000110 +00000010101111111100001000010000 +00000000000101010000001001101100 +01010011111100101011011111111111 +00000010100000000100001000110001 +00101001100000000001000110010011 +00101001100000100110000001110001 +00101001100000100101000001110000 +01100100000000000011001010010000 +00000010100000100100000001100101 +00000000000101010000001100100100 +00101001100000010010000001101111 +01010100001011000011010000000000 +01011111111101101111110010000000 +00101000100000010010000001101111 +00000010100000100111000001110010 +00000010100000000001110000010100 +00011100000000000000111111001101 +00000010100110000000000110101101 +00000010100000000100000000010011 +00000010101111111100001111011110 +00000000000101010000001001001100 +01010011111100111001001111111111 +00000010100000000100000111101111 +00101001100000000001000110010010 +00101001100000100110000001101111 +00101001100000100101000001110000 +01100100000000000010101001110000 +00000010100000100100000001100101 +00000000000101010000001100100100 +01010100001010111110110000000000 +01011111111101101011010010000000 +00000010100000100111000001110001 +00000010100000000001110000010011 +00011100000000000000111111001101 +00000010100101101111000110101101 +00000010100000000100000000010010 +00000010101111111100001111011110 +00000000000101010000001000101100 +01010011111100111011011111111111 +00101000100000000010000001101110 +00000010100000011001010000001101 +01100100000001101100000110101110 +00101000100000001001000001101111 +00101000100000001100000001101101 +00000000000101010000000000000110 +00000000000101010000000000000111 +00000000000101010000000111100100 +00000000000101010000000110100101 +00101001100000000010000001101100 +01010100010101111111110000000000 +00101000100000000010000001101100 +01011100000000010111010010000000 +00011100000000000000111111001101 +00000010100100000000000110101101 +00101001100000000000000110001101 +00000010100000000000010000001101 +00101001100000000001000110001101 +00101000100000100101000001101101 +00000010100000000000011111011110 +00101001100000100110000001111110 +00000010100000000000010110101101 +00101001100000100101000001101101 +00000010100000000001110000001110 +00000010100000000010000110001100 +01100100000000000001100111001101 +00000010100000100100000001100101 +00000000000101010000001100100100 +01010100001010110101010000000000 +01011111111101100001110010000000 +00000010100000100111000001101100 +00101000100000011110000001101101 +01100000000000000000110110111100 +00000011010000000000011011101101 +01011000000000001001110110100000 +00101000100000001110000001101101 +00101000100000000110000001101110 +00000010100000000010000110001100 +00101001101111111110000110001101 +00101000100000000110000001101101 +00101001101111111111000110001101 +00101000100000100110000001101101 +00000000000100000011100110101101 +00101001100000100110000001101101 +00101000100000100101000001101101 +00000010100000000001110000001110 +00000010100000000000010110101101 +00101001100000100101000001101101 +01100100000000000001100111001101 +00000010100000100100000001100101 +00000000000101010000001100100100 +01010100001010101111100000000000 +01011111111101011100000010000000 +00000010100000100111000001101100 +00000010101111111111111110011000 +01100100000000000100100000011000 +00000010100000000100000000011011 +00011100000000000000111111011010 +00000010100100110000001101011010 +00000010100000000001110000011101 +00101000100000100110000001101110 +00101000100000100101000001101101 +00101001100000000000000110011010 +00000010100000000010000110001111 +00000010100000000000010110101101 +01100000000000000110111101111000 +00101001100000000001000110011000 +00000000000100000011101100011000 +00101001100000100110000001111000 +00101001100000100101000001101101 +00000010100000000001110000001110 +00000000000101010000000111101100 +01100011111100110000110111001101 +00000011010000000001001011110111 +01011100000001110111011011100000 +00101000100000000111000001111010 +00101000100000001010000001101100 +01100100000000000000101101001100 +00000000000101010000000110011010 +00101000100000001000000001101100 +00000000000100000110100110001100 +00101001100000001000000001101100 +00101000100000100110000001101100 +01011000000000000001010110000000 +00000010100000100100000001100101 +00000000000101010000001100100100 +01010100001010100110110000000000 +01011111111101010011010010000000 +00101001100000100101000001100000 +01011100000001111100111011000000 +00000010100000100111000001101100 +01010011111110010011101111111111 +00000010100000000100000111001110 +00101001100000000001000110011011 +00101001100000100110000001101110 +00101001100000100101000001101101 +01100100000000000001101110101101 +00000010100000100100000001100101 +00000000000101010000001100100100 +01010100001010100011100000000000 +01011111111101010000000010000000 +00000010100000100111000001101111 +00000010101111111100001100011000 +00000000000101010000000111101100 +01010011111111110101001111111111 +00101000100000011110000001101101 +01100000000000010101010000001101 +00011100000000000000111111001101 +00000010100010100010000110101101 +00101001100000000000000110001101 +00000010100000000000010000001101 +00101001100000000001000110001101 +00101000100000100101000001101101 +00000010100000000000011111011110 +00101001100000100110000001111110 +00000010100000000000010110101101 +00101001100000100101000001101101 +00000010100000000001110000001110 +00000010100000000010000110001100 +01100100000000000001100111001101 +00000010100000100100000001100101 +00000000000101010000001100100100 +01010100001010011101110000000000 +01011111111101001010010010000000 +00000010100000100111000001101100 +00101000100000011110000001101101 +00000011010000000000011011101111 +00101000100000100110000001101110 +00000000000101010011011110001101 +00000000000101010011110110101101 +01011011111111110001110110100000 +00101000100000001110000001101101 +00000010100000000010000110001100 +00101001101111111110000110001101 +00101000100000000110000001101101 +00101001101111111111000110001101 +00000000000100000011100110101101 +00101001100000100110000001101101 +00101000100000100101000001101101 +00000010100000000001110000001110 +00000010100000000000010110101101 +00101001100000100101000001101101 +01100100000000000001100111001101 +00000010100000100100000001100101 +00000000000101010000001100100100 +01010100001010011000000000000000 +01011111111101000100100010000000 +00000010100000100111000001101100 +00101000100000011110000001111010 +01100100000000000110001101000000 +00000000000100010110100000011010 +00000000000101010000000110001110 +00000010100000000100000000011101 +00011100000000000000111111011011 +00000010100011010000001101111011 +00000010100000000001110000011110 +00101000100000100110000001101111 +00101000100000100101000001101101 +00101001100000000000000111011011 +00000010100000000010000110001100 +00000010100000000000010110101101 +01100000000000000100011110111010 +00101001100000000001000111011010 +00000000000100000011111101011010 +00101001100000100110000001111010 +00101001100000100101000001101101 +00000010100000000001110000001110 +01100100000000000001100111001101 +00000010100000100100000001100101 +00000000000101010000001100100100 +01010100001010010001110000000000 +01011111111100111110010010000000 +00000010100000100111000001101100 +00101000100000100110000001101101 +00101001100000000000000110011000 +00101001100000000001000110011100 +00000000000100000111000110101101 +01010011111100010100111111111111 +00000010100000000100000111101111 +00101001100000000001000111011101 +00101001100000100110000001101111 +00101001100000100101000001101101 +01100100000000000001101111001101 +00000010100000100100000001100101 +00000000000101010000001100100100 +01010100001010001110000000000000 +01011111111100111010100010000000 +00000010100000100111000001101100 +00000010101111111100001101011010 +00000000000101010000000110001110 +01010011111111110111101111111111 +00000000000101010000001111111010 +01100100000000000000101110011111 +00000000000101010000001110011010 +01100100000000000100000000011010 +00101000100000100101000001101101 +00000000000100000111101101011110 +00101001100000000000000110011000 +00101001100000000001000110011010 +00000010100000000000010110101101 +00101001100000100110000001111110 +00101001100000100101000001101101 +00000010100000000001110000001111 +00000010100000000010000110001100 +01100100000000000001100111101101 +00000010100000100100000001100101 +00000000000101010000001100100100 +01010100001010001000100000000000 +01011111111100110101000010000000 +00000010100000100111000001101100 +01100100000000000000101101000000 +00000000000101010000000000011010 +00000000000100010110101111111010 +01100100000000000101110000011010 +00000010100000000100000000001110 +00011100000000000000111111011110 +00000010100010010010001111011110 +00000010100000000001110000010001 +00101000100000100110000001101111 +00101000100000100101000001101101 +00101001100000000000000110011110 +00000010100000000010000110010000 +00000010100000000000010110101101 +01100000000000011001100111011010 +00101001100000000001000110011010 +00000000000100000011111101011010 +00101001100000100110000001111010 +00101001100000100101000001101101 +00000010100000000001110000001111 +00000000000101010000001000001100 +01100100000000000001100111101101 +00000010100000100100000001100101 +00000000000101010000001100100100 +01010100001010000010000000000000 +01011111111100101110100010000000 +00000010100000100111000001101100 +00000011010100000000001011101101 +00000000000100000111111100011010 +01011000000000000010110110100000 +00000000000100000111001100001101 +00000010100000000001110000011110 +00101001100000000010000001101101 +00011100000000000000111111011111 +00000010100001110111001111111111 +01011100000000011000001101100000 +01011100000000011000001110100000 +00000000000100000111001100001101 +01101100000000000000100110111010 +00000000000101010000000110111010 +00101000100000011110000001101101 +01100000000000000000110110111100 +00000011010000000000011011101101 +01011000000000000101000110100000 +00101000100000001110000001101101 +00101000100000000110000001101110 +00000010100000000010000110001100 +00101001101111111110000110001101 +00101000100000000110000001101101 +00101001101111111111000110001101 +00101000100000100110000001101101 +00000000000100000011100110101101 +00101001100000100110000001101101 +00101000100000100101000001101101 +00000010100000000001110000001110 +00000010100000000000010110101101 +00101001100000100101000001101101 +01100100000000000001100111001101 +00000010100000100100000001100101 +00000000000101010000001100100100 +01010100001001111001000000000000 +01011111111100100101100010000000 +00000010100000100111000001101100 +00000000000100000111001100011000 +00000000000100010110101100001101 +00101000100000011110000001111000 +00000000000100010110001110011000 +01100100000000000000100110111000 +00000000000101010000000110111000 +01100100000000000100010000011000 +00101000100000100110000001101101 +00101001100000000000000110011010 +00101001100000000001000110011000 +00000010100000000001110000001110 +00000000000100000011011100001101 +00101001100000100110000001101101 +00101000100000100101000001101101 +00000010100000000010000110001100 +00000010100000000000010110101101 +00101001100000100101000001101101 +01100100000000000001100111001101 +00000010100000100100000001100101 +00000000000101010000001100100100 +01010100001001110011010000000000 +01011111111100011111110010000000 +00000010100000100111000001101100 +00000000000101010000001100001101 +01100100000000000000101100000000 +00000000000101010000000000001101 +00101000100000011110000001111000 +00000000000100010110001110011000 +00000000000100010011011100011000 +01100111111111000111000000011000 +00000010100000000100000000011011 +00011100000000000000111111011010 +00000010100000111010001101011010 +00000010100000000001110000011101 +00101000100000100110000001101110 +00101000100000100101000001101101 +00101001100000000000000110011010 +00000010100000000010000110001111 +00000010100000000000010110101101 +01100111111111000010111101111000 +00000010100000000100000111001110 +00101001100000000001000110011011 +00101001100000100110000001101110 +00101001100000100101000001101101 +01100100000000000001101110101101 +00000010100000100100000001100101 +00000000000101010000001100100100 +01010100001001101100100000000000 +01011111111100011001000010000000 +00000010100000100111000001101111 +00000010101111111100001100011000 +00000000000101010000000111101100 +01010011111111111011101111111111 +00000010100000000100000111101111 +00101001100000000001000110001110 +00101001100000100110000001101111 +00101001100000100101000001101101 +01100100000000000010001000101101 +00000010100000100100000001100101 +00000000000101010000001100100100 +01010100001001101001010000000000 +01011111111100010101110010000000 +00000010100000100111000001110000 +00000010100000000001110000010001 +00000010100000000100000000001110 +00000010101111111100001101011010 +00000000000101010000001000001100 +01010011111111100001111111111111 +01011000000000001110001110100000 +00000010101111111111111110111101 +00101000100000001111000001101101 +00101000100000001101000001101110 +00000010100000000010000110001100 +00101001101111111110000110001101 +00101000100000001101000001101101 +00101001101111111111000110001101 +00101000100000100110000001101101 +00000000000100000011100110101101 +00101001100000100110000001101101 +00101000100000100101000001101101 +00000010100000000000010110101101 +00101001100000100101000001101101 +01100100000000000001101111001101 +00000010100000100100000001100101 +00000000000101010000001100100100 +01010100001001100011000000000000 +01011111111100001111100010000000 +00000010100000100111000001101100 +00101000100000000010000001101101 +00000000000100010110100110101110 +00101000100000000011000001101101 +00101000000000000000000110101101 +01100100000000000000100111001101 +00000000000101010000000111001101 +01100100000000000100100000001101 +00101000100000100110000001101110 +00101001100000000000000110011010 +00101001100000000001000110001101 +00000010100000000010000110001100 +00000000000100000011100110101110 +00101001100000100110000001101110 +00101000100000100101000001101110 +00000010100000000000010111001110 +00101001100000100101000001101110 +01100100000000000010001111001110 +00000010100000100100000001100101 +00000000000101010000001100100100 +00101001100000010010000001101101 +01010100001001011101010000000000 +01011111111100001001110010000000 +00101000100000010010000001101101 +00000010100000100111000001101100 +00000000000101010000000110101110 +01100100000000000000100110100000 +00000000000101010000000000001110 +00101000100000000011000001101101 +00000010100000000100000000010001 +00101000000000000000000110101101 +00000000000100010011100110101101 +01100000000000000110010000001101 +00101000100000000011000001101101 +00101000000000000000000110101101 +00000000000100000011011101011010 +01010011111111011010011111111111 +00101000100000000011000001101101 +00000010101111111111111101111011 +00000010101111111111110110101101 +00101001100000000011000001101101 +01010011111111110001101111111111 +00000010100000000100000111101111 +00101001100000000001000110010001 +00101001100000100110000001101111 +00101001100000100101000001101110 +01100100000000000010011111001110 +00000010100000100100000001100101 +00000000000101010000001100100100 +00101001100000010010000001101101 +01010100001001010110000000000000 +01011111111100000010100010000000 +00101000100000010010000001101101 +00000010100000100111000001110000 +00000010100000000100000000010001 +00000010101111111100000110101101 +00000000000101010000001000001100 +00101000100000100110000001101111 +00101000100000100101000001101110 +00101001100000000000000110011111 +00000010100000000010000110010000 +00000010100000000000010111001110 +01100011111111111011001000101101 +00101001100000000001000110001101 +00000000000100000011110110101101 +00101001100000100110000001101101 +00101001100000100101000001101110 +00000000000101010000001000001100 +01100111111111110111011111001110 +00000010100000100100000001100101 +00000000000101010000001100100100 +01010100001001010000110000000000 +01011111111011111101010010000000 +00000010100000100111000001101100 +01010011111111110101111111111111 +00101000100000100101000001101101 +00000010100000000000010000001110 +00101001100000000000000110011000 +00000010100000000000011111011110 +00000010100000000000010110101101 +00000010100000000010000110011010 +01100000000000000000110111011100 +00000011010000000000011011101111 +01011000000000011010000111100000 +00000010100000000000010000001110 +00101001100000000001000110001110 +00101001100000100110000001111110 +00101001100000100101000001101101 +00000010100000000001110000001100 +01100100000000000001100110001101 +00000010100000100100000001100101 +00000000000101010000001100100100 +01010100001001001011100000000000 +01011111111011111000000010000000 +00000010100000100111000001111010 +00101000100000001110000001101100 +00101000100000000110000001101101 +00000010100000000010001101011010 +00101001101111111110001101001100 +00101000100000000110000001101100 +00101001101111111111001101001100 +00101000100000100110000001101100 +00000000000100000011010110001100 +00101001100000100110000001101100 +00101000100000100101000001101100 +00000010100000000001110000001101 +00000010100000000000010110001100 +00101001100000100101000001101100 +01100100000000000001100110101100 +00000010100000100100000001100101 +00000000000101010000001100100100 +01010100001001000110110000000000 +01011111111011110011010010000000 +00000010100000100111000001111010 +00101000100000001001000001101101 +00101000100000001100000001101100 +00000000000101010000000000000110 +00000000000101010000000000000111 +00000000000101010000000110100100 +00000000000101010000000110000101 +00000010101111111111111110011011 +01010100010100001010010000000000 +01011000000000001000100010000000 +00101000100000100110000001101100 +00101000100000100101000001101101 +00000010100000000000011100011000 +00000010101111111111110110001100 +00000000000100000111000110001100 +00000010100000000000010110101101 +00101001100000000000001101011000 +00101001100000000001001101011011 +00101001100000100110000001101100 +00101001100000100101000001101101 +00000010100000000010001101011010 +00000010100000000001110000001100 +01100100000000000001100110001101 +00000010100000100100000001100101 +00000000000101010000001100100100 +01010100001001000000000000000000 +01011111111011101100100010000000 +00000010100000100111000001111010 +00000010100000100000000001101100 +00101001100000000000001101001100 +00101000100000010000000001101100 +00101000100000010000000001101101 +00101001100000000001001101001100 +00101000100000100110000001101100 +00000000000100000011010110001100 +00101001100000100110000001101100 +00101000100000100101000001101100 +00000010100000000001110000001101 +00000010100000000000010110001100 +00101001100000100101000001101100 +01100011111011000010110110101100 +00000010100000000010001101001100 +01010011111110010001111111111111 +01100111111111111100010000011011 +00000010100000000100000000011101 +00011100000000000000111111011000 +00000010101101100100001100011000 +00000010100000000001110000011110 +00101000100000100110000001101100 +00101000100000100101000001101101 +00101001100000000000001101011000 +00000010100000000010001101001110 +00000010100000000000010110101101 +01100000000000000010001110111011 +00000000000100000011001101101100 +00101001100000000001001101011011 +00101001100000100110000001101100 +00101001100000100101000001101101 +00000000000101010000000111011010 +00000010100000000001110000001100 +01010011111111110110101111111111 +00000010100000000100000110001100 +00101001100000000001001101011101 +00101001100000100110000001101100 +00101001100000100101000001101101 +01100100000000000001101111001101 +00000010100000100100000001100101 +00000000000101010000001100100100 +01010100001000110101010000000000 +01011111111011100001110010000000 +00000010100000100111000001101110 +00000010101111111100001101111011 +00000000000101010000000111011010 +01010011111111111001111111111111 +00101001100000000001000110001110 +00101001100000100110000001111110 +00101001100000100101000001101101 +00000010100000000001110000001100 +01010011111111110010001111111111 +00101000100000000111000001101101 +00101000100000001010000001101110 +00000000000100010011100110110111 +01100111111110001000010000010111 +00000010100000000100000000011010 +00011100000000000000111111011000 +00000010101101000001001100011000 +00000010100000000001110000011011 +00101000100000100110000001101110 +00101000100000100101000001101101 +00101001100000000000000110011000 +00000010100000000000010110101101 +01100000000000000011001101010111 +00101001100000000001000110010111 +00000000000100000011101011110111 +00101001100000100110000001110111 +00101001100000100101000001101101 +00000010100000000001110000001100 +01100111111110000100100110001101 +00000010100000100100000001100101 +00000000000101010000001100100100 +01010100001000101101010000000000 +01011011111110000011100010000000 +01010011111011011001101111111111 +00000010100000000100000111001110 +00101001100000000001000110011010 +00101001100000100110000001101110 +00101001100000100101000001101101 +00000010100000000010000110001100 +01100100000000000001101101101101 +00000010100000100100000001100101 +00000000000101010000001100100100 +01010100001000101010100000000000 +01011111111011010111000010000000 +00000010100000100111000001101100 +00000010101111111100001011110111 +01010011111111111001001111111111 +00000000000101010000001011000100 +01010100000000010101100000000000 +01010011111110000011001111111111 +00101000100000100110000001101100 +01011011111010110110010110000000 +00000010100000100100000001100101 +00000000000101010000001100100100 +01010100001000100111100000000000 +01010011111010110101011111111111 +00000010101111111111110000001110 +01011111111100111111111101001110 +01011111111101001000001011000000 +00000010100000000010010000001110 +01101011111101000111100111011111 +00000010100000001100001111111111 +00101001000001001111110001111111 +00000010100001001111110001111000 +01010011111101000100001111111111 +00000010101111111100000001100011 +00101001100000000001000001111000 +00010100111111111111111111111000 +00101001100000000011000001100001 +00101001100000000010000001110111 +00000011101111111111111100011000 +00000000000101001001011100001100 +00101001100000000000000011000000 +00010100111111111110000000010000 +00000000000101010000000010001111 +00000000000101010000000010101101 +01100100000000000000110110010000 +00000000000101010001000110010001 +01011100000000000010111000100000 +00000000000101010000000111100110 +00000000000101010000000110100111 +00000000000101010000000111100100 +00000000000101010000000110100101 +01010100001111001101010000000000 +00101000100000000011000001100001 +00101000100000000010000001110111 +00101000100000000001000001111000 +00000010100000000100000001100011 +01001100000000000000000000100000 +00000000000101001100000010110000 +00000000000101010000000011010111 +00000000000101010000000010101110 +01011100000000000010111000000000 +00011100000000000000111111001100 +00000010101011111101000110001100 +00101000100000000000000110000110 +00101000100000000001000110000111 +01010100010100010000110000000000 +00000010101111110010100000001101 +00000000000101010000000010001111 +00000000000101010000000010101110 +00000000000101001001011100001100 +00101001100000000000001011101101 +00101000100000000000001011101101 +00000000010010001101000110001100 +00000010101100000000100110001100 +00000000000100000011000110101100 +00101001100000000000001011101100 +00010101000000000001111111101100 +00000011101111111111110110001100 +00000000000101001011000111001110 +00010100011111111100000000001100 +00000000000101010011000111001100 +00000000000101010000000111100100 +00000000000101010000000110000101 +01010011111111111000011111111111 +00010100111111111111111111101100 +00000011101111111111110110001100 +00000000000101001001010110001100 +00000000000101010001000110001101 +01011000000000000011000110100000 +00010100111111111110000000001110 +00000000000101001001010111000101 +00000010100000000000110000001101 +01011000000000000001100010100000 +00000010100000000001000000001101 +01101000000000000001000110001110 +00000000000101010000000000001101 +01011100000000000000100110001110 +00000010010000000000010010001101 +00000000000101010000000110100100 +01001100000000000000000000100000 +00000010100000000000100000001101 +01010011111111111111011111111111 +01011000000000000110110010000000 +00000010101111111111000010001101 +00101001100000000000000010000000 +00011100000000000000111111001110 +00101000100001110100000111001110 +00101000100000000000000111001100 +01011100000000000001000110000000 +00101001100000000000000010001100 +00101001100000000000000111001101 +01010000000000000010100000000000 +01101011111111111111010110101100 +00101000100000000000000110001110 +00000000000100000011100110001111 +01011100000000000011110110101111 +00101000101111111111000010001101 +00000000000100000011100110101101 +00101001100000000000000110001101 +00000000000101010000000110001101 +00101000100000000001000110001100 +00101000100000000000000110101111 +00000000000100000011110110101110 +01011100000000000001100110001110 +00101000100000000000000110001110 +00101000100000000001000110001100 +00000000000100000011110111001110 +00101001100000000000000110101110 +00101001100000000001000110101100 +01001100000000000000000000100000 +01011100000000000001100110001101 +00011100000000000000111111001100 +00101000100001001100000110001100 +00000010100000000011000000001101 +00101001100000000000000110001101 +01001100000000000000000000100000 +00000010100000000001000110001110 +01010011111111111000101111111111 +00000010101111111000000001100011 +00101001100000000110000001110111 +00101000100000000011000010001100 +00101000100000000011000010110111 +00101001100000000111000001100001 +00101001100000000101000001111000 +00101001100000000100000001111001 +00101001100000000011000001111010 +00101001100000000010000001111011 +00101001100000000001000001111100 +01100000000000011010000110010111 +00000010101111111111111011110111 +00000000010000001000101011110000 +00000010100000000100000010111010 +00000000000100000100001101011011 +00000010100000000100000010011001 +00000000000100000100001100110000 +00101000100000000000001101101100 +00101000100000000000001000001101 +00000010100000000000010110001100 +00000000001000010011000110111000 +01011100000000000000100110000000 +00000000001010100000000000000111 +01101000000000001001000110101100 +00010100000000000000000111110001 +00000000000101010000001101010010 +00000000000101010000001100110011 +00000000000101010000000000010100 +00000000000101010000000000000110 +00000011101111111111111000110001 +00000010100000000001001001010010 +00101000101111111111001001001111 +00000010100000000001001001110011 +00000000000101001100010111101101 +00000000000111000110000110101101 +00000000010001001100000111101111 +00000000000111000110000111101111 +00000000000100000101000110101101 +00000000010001001100000110101110 +00000000000101001100010110101100 +00000000000100010011000011001100 +00000000000100000011100111101111 +00101000101111111111001001101110 +00000000010001001100000111110100 +00000000000101001100010111101111 +00000000000101001100010111001101 +00000000000100000011010110001100 +00000000010001001100000111001110 +00000000010010001100000110001101 +00000000000100010011110111001110 +00000000000100000011010111001110 +00000000010010001100000111000110 +00000000000101001100010110001100 +00000000010000001100000111001110 +00000000000101010011000111001100 +00101001101111111111001001101100 +01101111111111111001101101110010 +00101000100000000000001000001100 +01011000000000001011010110000000 +00000000000101010000000010011100 +01010100000110011001110000000000 +01100000000000000111010010000000 +00010100000000000000000111101111 +00000010100000000000011100011000 +00000000000101010000001100110000 +00000000000101010000000000010001 +00000011101111111111110111101111 +00000010100000000001001101011010 +00101000101111111111001101010010 +00101000100000000000001000001101 +00000010100000000001001000010000 +00000000000101001011111001001110 +00000000000100010011101000110001 +00000000000101001011110110101110 +00000000000100000011101000101110 +00000000010001001100000110101100 +00000000010001001100001001010010 +00000000010010001100000111001101 +00000000000100010100100110001100 +00000000000100000011010110001100 +00000000010010001100000110010001 +00000000000101001011110111001110 +00000000010000001100000110001100 +00000000000101010011100110001100 +00101001101111111111001000001100 +01101111111111111011101101111010 +00000000010000001000101011101100 +00000000000100000011001100101100 +00101000100000000000000110001101 +01011000000000000101010110100000 +00000000000101010000001100000100 +00101000100000000111000001100001 +00101000100000000110000001110111 +00101000100000000101000001111000 +00101000100000000100000001111001 +00101000100000000011000001111010 +00101000100000000010000001111011 +00101000100000000001000001111100 +00000010100000001000000001100011 +01001100000000000000000000100000 +00101000100000000000001000001100 +01011100000000000001000110000000 +00000010101111111111111011110111 +00000010101111111111001000010000 +01101011111111111111001100110000 +00101001100000000011000010010111 +01010011111111110100011111111111 +00101000100000000000000110001101 +01011100000000000001000110100000 +00000010101111111111111011110111 +00000010101111111111000110001100 +01101011111111111111001100101100 +00101001100000000011001110010111 +01010011111111111010011111111111 +00000000000101010000000000000100 +01010011111111111010001111111111 +00000010101111011100000001100011 +00101001100000011111000001111001 +00101001100000011110000001111010 +00101001100000100011000001100001 +00101001100000100010000001110110 +00101001100000100001000001110111 +00101001100000100000000001111000 +00101001100000011101000001111011 +00101001100000011100000001111100 +00101001100000011011000001111101 +00101001100000011010000001111110 +00101001100000011001000001111111 +00101001100000000011000001100110 +00101001100000000101000001100111 +00101001100000010000000001101000 +00101001100000000111000001101010 +00000000000101010000000010011010 +00000000000101010000000010011001 +01100100000000001010000010100000 +00010100111111111111111111111100 +00000010100000000000010000001100 +00000011101111111111111110011100 +00101001100000000000000100101100 +00000000000101001001011110011100 +00010100111111111110000000001100 +00000000000101001011001110001101 +01011100000000001000110110101100 +00101000100000010000000001101101 +00010100000000000001111111100101 +00010100000000000000000001001100 +00000011101111111111110010100101 +00000011100111000011110110001100 +00000000000101001001011110011100 +00101001100000000000000110101100 +00000000000101010110101110011010 +01011000000011111111011101000000 +00101000100000000111000001101101 +00011100000000000000111111001100 +00000010101000011100000110001100 +00101001100000000001000001101100 +01011000000000000001000110100000 +00000010100000000000110110001100 +00101000100000000111000001101101 +00101001100000000000000110101100 +00101000100000100011000001100001 +00101000100000100010000001110110 +00101000100000000001000001100100 +00101000100000100001000001110111 +00101000100000100000000001111000 +00101000100000011111000001111001 +00101000100000011110000001111010 +00101000100000011101000001111011 +00101000100000011100000001111100 +00101000100000011011000001111101 +00101000100000011010000001111110 +00101000100000011001000001111111 +00000010100000100100000001100011 +01001100000000000000000000100000 +00000000000101010000000010111100 +00101001100000000000000100100000 +01010011111111110111001111111111 +00000000000101010000000000000110 +00000000000101010000000000000111 +00000000000101010000001101000100 +00000000000101010000001110000101 +00101001100000001011000001111010 +00101001100000001110000001111100 +01010100010010100010110000000000 +01011100000000000011010010000000 +00101000100000010000000001101101 +00000010100000000000010000001100 +00101001100000000000000110101100 +00101000100000000111000001101101 +00011100000000000000111110101100 +00000010100110001001000110001100 +00101001100000000001000001101100 +01011011111111111000000110100000 +00101000100000000111000001101110 +00000010100000000000010110001101 +00101001100000000000000111001101 +01010011111111110111001111111111 +00000010100000010110000001100111 +00000010100000010111000001100110 +00000000000101010000001101000100 +00000000000101010000001110000101 +01010100000110010010000000000000 +00101001100000000001000001100000 +00000000000101010000000010010111 +01011011111111110101000010000000 +00000000010001001101001110011000 +00000011010111111111111100011000 +00101000100000010110000001111101 +01011000000000011010011100000000 +00101000100000001110000001101100 +00010100000000000001111111100101 +00000011101111111111110010100101 +00101000100000001011000001100100 +00000000000101001011000010100101 +00010100011111111110000000001100 +00000000000101010011000010100101 +00000010101100000000011100011000 +00101001100000010010000001100000 +00011100000000000000111110101100 +00000010100111011100000110001100 +00101000100000000000000110000110 +00101000100000000001000110000111 +01010100010100110010000000000000 +00011100000000000000111110101100 +00000010100111011001000110001100 +00101000100000000000000110000110 +00101000100000000001000110000111 +01010100010011000101110000000000 +00011100000000000000111110101100 +00000010100111010110000110001100 +00101000100000000000000110000110 +00101000100000000001000110000111 +01010100001101111101100000000000 +00000000000101010000000010011010 +00000000000101010000001100000100 +00000000000101010000000010111011 +01010100010111001111100000000000 +00011100000000000000111110101100 +00000010100111001111000110001100 +00101000100000000000000110000110 +00101000100000000001000110000111 +01010100010011000010010000000000 +00000000000101010000000010000110 +00000000000101010000000010100111 +00000000000101010000001101000100 +00000000000101010000001101100101 +01010100001101111010000000000000 +00000000000101010000000010011010 +00000000000101010000000010111011 +01010100010111000011010000000000 +00000000000101010000000010010110 +00000000000101010000000000000110 +00000000000101010000000000000111 +00000000000101010000001101000100 +00000000000101010000001101100101 +01010100010010101011110000000000 +01100100000000000010000010000000 +00000000000101010000001011000100 +01010100010111001010000000000000 +00000000000101010000001101000110 +00000000000101010000001101100111 +01010100010010001111010000000000 +01011000000000000000100010000000 +00000010101111111111111011010110 +00000010100000000000010000001101 +00000010100000000101100000001100 +00101001100000001111000001101101 +01101000000000000011010110010110 +00000000010000001000111011001101 +00011100000000000000111111001100 +00101000101100111001000110001100 +00000000000100000011010110001100 +00101000100000000000000110000110 +00101000100000000001000110000111 +00101000100000001011000001100100 +00101000100000001110000001100101 +01010100010010100110100000000000 +01100100000000000000100010000000 +00000010101111111111111011010110 +00101001100000001111000001100000 +00000000000100010110001110111000 +00000010101111111111111100001100 +00101001100000000010000001101100 +00000000000101010000000000011010 +01100100000000000001000110000000 +00000010100000000000010000011010 +00000000000100010110001101011010 +00101001100000000010000001100000 +01100000000000001011011011000000 +00101000100000000010000001101100 +00101001100000001010000001110110 +00000000000101010000000000011011 +00000000000100000101100110001100 +00101001100000000010000001101100 +00101000100000000011000001101101 +00000010100000000010010000001100 +01101000000000010011110110001101 +00000010100000000001010000001100 +00000010100000000000010000011000 +01100100000000000001000110001101 +00000010101111111111000110101100 +00101001100000000011000001101100 +00000000000101010000000000011000 +00101000100000000011000001101101 +00000010100000000000110000001100 +01011000000000001111010110101100 +01100000000000000111110110001101 +00000010100000000000100000001100 +00101001100000000110000001100000 +01011000000000001011000110101100 +00000010100000000000010000001100 +00101001100000000110000001101100 +01010000000000001000010000000000 +00101000100000010111000001111000 +00000010100000001000000000001100 +00000000000100000110001110111000 +00000010100100001100101100000100 +01100100000000000011010110000100 +00000000000100010001000000000100 +00000010100100000100101100001100 +00000000000101110001001110000100 +00000000000101111011001101011010 +00000000000101010110100010000100 +01010100010111001100110000000000 +00010101111111000010000000001100 +00000000000100000001010110000101 +00000010100000000000010000001100 +00000010101111111111111100011000 +00101001100000010010000001101100 +01010011111111100100011111111111 +00000000000100010001000110000100 +00000000000101110001001101000100 +01010011111111111101111111111111 +00000000000100010101101101011010 +00000000000100010101100000011011 +00101001100000001010000001100000 +01010011111111110101101111111111 +00101000100000000011000001101101 +00000010100000000001000000001100 +01011000000000000011000110101100 +00000010100000000000010000001101 +00101001100000000110000001101101 +00101000100000000011000001101101 +00000010100000000001010000001100 +01011000000000000101110110101100 +00000010101111111111110000001100 +00101001100000000100000001101100 +00000010101111111111110000011111 +00000010100000000100100000000100 +00101001100000000101000001100000 +01010000000000000010100000000000 +00000010100000000000010000001100 +00101001100000000110000001101100 +00101000100000000101000001101100 +01100000000000000110000000001100 +00000010100000000000010000001100 +00101001100000000100000001101100 +00000010100000000000010000011111 +00000010100000000000010000000100 +00101001100000000101000001101100 +01010100000011011001110000000000 +00101001100000000001000001100100 +01011100000000000101010010000000 +00000000000101010000001011100100 +01010100000011101000000000000000 +01010011111111001100111111111111 +00101001100000000110000001100000 +00101000100000000101000001101100 +00000000000100000011001011001100 +00000010100000000000010110011111 +00101001100000000100000001101100 +00000000000101010000001111100100 +01100011111111111101000000011111 +00000010100000000000010000000100 +01010011111111111100101111111111 +00000010100000000000010000011000 +00101001100000000011000001100000 +01010011111111101111011111111111 +00101000100000000101000001101100 +00101001100000000100000001101100 +00000000000101010000000110011111 +00000000000101010000000110000100 +01010011111111111010101111111111 +00000010100000000011100000001100 +01101000000000100100100110011111 +01011000000000100100011100000000 +01100100000000001100110000010110 +00000011010000000011111011001100 +00000000010000001000110110001101 +00000000010010001001001011011101 +00011100000000000000111111001100 +00101000101011000000000110001100 +00000000000100000011010110001100 +00000011010000000100001110101110 +00101000100000000001000110001101 +00000010100000000000100000011000 +00101000100000000000000110001100 +01011000000000000100000111000000 +00011100000000000000111111001110 +00101000101010111010000111001110 +00101000100000001000000111000110 +00101000100000001001000111000111 +00101000100000001011000001100100 +00101000100000001110000001100101 +00101001100000001000000001101100 +00101001100000001001000001101101 +00000011010000000011111110111101 +01010100001111100110110000000000 +00101000100000001000000001101100 +00101000100000001001000001101101 +00000000000101010000000010011001 +00000000000101010000000010111100 +00000010100000000000110000011000 +00011100000000000000111111011110 +00101000101010101011001111011110 +01010000000000000011010000000000 +00000011010000000000011110101111 +01011000000000000010010111100000 +00101000100000000000001111000110 +00101000100000000001001111000111 +00000000000101010000000110000100 +00000000000101010000000110100101 +01010100010010010101000000000000 +00000010100000000000011100011000 +00000000000101010000000010001100 +00000000000101010000000010101101 +00000000010010001000011110111101 +00000010100000000010001111011110 +01011111111111111101001110100000 +00000000000101010000000110000110 +00000000000101010000000110100111 +00000000000101010000001100100100 +00000000000101010000001110000101 +01010100001111100000010000000000 +00000000000101010000000010011001 +00000000000101010000000010111100 +01010000000000000101100000000000 +00000010100000000000100000011000 +01011000000000000101001011000000 +00000000000100010101100000011101 +00000011010000000011111110101100 +00000000010000001000110110001101 +00011100000000000000111111001100 +00101000101010001100000110001100 +00000000000100000011010110001100 +00101000100000000000000110000110 +00101000100000000001000110000111 +00101000100000001011000001100100 +00101000100000001110000001100101 +00000000010010001001001110111101 +00011100000000000000111111011110 +00101000101010000110001111011110 +01010100010010001101100000000000 +00000000000101010000000010011001 +00000000000101010000000010111100 +00000000000101010000000000001101 +01011100000000011011001110100000 +01011111111111111010010110100000 +00101000100000001111000001101100 +01011000000000011100110110000000 +00011100000000000000111110101110 +00000010100011110010000111001110 +00101000100000000000000111000110 +00101000100000000001000111000111 +00000000000101010000001100100100 +00000000000101010000001110000101 +00101001100000001000000001111001 +01010100010001110110110000000000 +01100100000000011010100010000000 +01011000000000011011001111100000 +00101000100000000100000001101100 +01100100000000001110010000001100 +00011100000000000000111110101110 +00000010100011101000000111001110 +00101000100000001000000001101101 +00101000100000000000000111000110 +00101000100000000001000111000111 +00000000000101010000001110000101 +00000000000101010000000110100100 +01010100010010000110110000000000 +00101000100000000100000001111110 +00000010101111111111111011011101 +00000000000101010000000010011001 +00000000000101010000000010111100 +00000010100000000000011100011000 +00000000000101010000001100000100 +00101001100000010001000001111001 +00101001100000001000000001111001 +00101001100000001001000001111100 +00101001100000001100000001111100 +01010100010110010000000000000000 +00101000100000010001000001101110 +00101000100000001100000001101101 +00010101111110011000000000011000 +00000000000101010000000111000110 +00000000000101010000000110100111 +01010100010010000010100000000000 +00011100000000000000111110101111 +00000010100011010001000111101111 +00101000100000000000000111100110 +00101000100000000001000111100111 +01010100001100111010010000000000 +00000000000101010000000010011001 +00000000000100000001011100011000 +01011100000000010011001111000000 +00011100000000000000111110101100 +00000010100011001011000110001100 +00101000100000010001000001101110 +00101000100000001100000001101101 +00101000100000000000000110000110 +00101000100000000001000110000111 +00000000000101010000000111000100 +00000000000101010000000110100101 +01010100010011101001010000000000 +00000000000101010000001100100110 +00000000000101010000001100000111 +00101001100000001000000001100100 +00101001100000001001000001100101 +01010100010001011000000000000000 +01100000000001111000110000000100 +00010101000000000000000000001100 +00101000100000001000000001100100 +00101000100000001001000001100101 +00000000000101011110000110001100 +00000000000101010000001100100110 +00000000000101010000000110000111 +01010100010001101000000000000000 +01100000000001110110000010000000 +00101000100000001011000001111001 +00101000100000001110000001111100 +00101000100000010111000001101100 +01100000000001000011010110000000 +00000010100000000011100000001101 +01100000000001000010110110110110 +00000000010000001000111011001101 +00011100000000000000111111001100 +00101000101000101111000110001100 +00000000000100000011010110001100 +00101000100000000000000110011010 +00101000100000000001000110011011 +00101000100000000101000001101100 +01100100000000101100010110000000 +01100000000000101100000000011111 +01011100000001110010001111100000 +00011100000000000000111110101100 +00000010100010100100000110001100 +00101000100000000000000110000110 +00101000100000000001000110000111 +00000000000101010000001101000100 +00000000000101010000001101100101 +01010100010001110101000000000000 +00000000000101010000001100100110 +00000000000101010000001110000111 +01010100010001001111010000000000 +00000000000101010000000000011010 +00000000000101010000000000011000 +01100100000001101011010010000000 +00101000100000000001000001101100 +00101000100000000001000001101101 +00000010100000000000011011010110 +00000010100000000000010110011110 +00000010100000001100010000001100 +00101001000000000000000110101100 +01010000000001101010010000000000 +00000011010000000000011110101110 +01011000000000000001100111000000 +00101000100000000000001111000110 +00101000100000000001001111000111 +00000010100000000000011100011000 +01010100010001110000010000000000 +00000010100000000000010000001101 +00000000010010001000011110111101 +00000010100000000010001111011110 +01010011111111100010111111111111 +00000000000101010000001011011101 +00000000000101010000001111111110 +01010011111111101001011111111111 +00000000000101010000001011011101 +00000000000101010000000000011110 +01010011111111101000101111111111 +00101000100000000001000001101100 +00000010101111111111111111001101 +00000000010000001000110110101110 +00000000000100000111100110001100 +00101001100000010001000001101100 +00101000100000000110000001101100 +00011100000000000000111110101101 +00101000100111111100000110101101 +00000000000100000011100110101101 +00101000100000000000000110100110 +00101000100000000001000110100111 +01011000000000001111110110000000 +00011100000000000000111110101100 +00000010100001011110000110001100 +00101000100000000000000110000100 +00101000100000000001000110000101 +00101001100000001100000001111000 +00011100000000000000111110111000 +00000010100001101011001100011000 +01010100001110110110110000000000 +00101000100000001100000001101111 +00000000000101010000001100100110 +00011100000000000000111110111001 +00000010100001100100001100111001 +00000000000101010000000111100111 +01010100010011010010010000000000 +00101000100000000001000001111110 +00101001100000001100000001100100 +00101001100000001101000001100101 +00101000100000001000000001100100 +00101000100000001001000001100101 +00000010100000000000011111011110 +01010100010101101000100000000000 +00000000000101010000000010011100 +01010100010101110001000000000000 +00000000000101010000000010000110 +00000000000101010000000010100111 +00101000100000001000000001100100 +00101000100000001001000001100101 +00000010100000001100001110011100 +01010100010011001110100000000000 +00101000100000001100000001100110 +00101000100000001101000001100111 +00101001001111111111111111011100 +00101001100000001000000001100100 +00101001100000001001000001100101 +01010100010001001111000000000000 +01100000000000010011110010000000 +00101000100000001000000001100110 +00101000100000001001000001100111 +00101000100000000000001100100100 +00101000100000000001001100100101 +01010100010011001011100000000000 +00101000100000001100000001100110 +00101000100000001101000001100111 +01010100010001001100110000000000 +01100000000000100010000010000000 +00101000100000010001000001101100 +01011011111111100100101111001100 +00101000100000000000001100000110 +00101000100000000001001100000111 +00101000100000001100000001100100 +00101000100000001101000001100101 +01010100010001011101110000000000 +00101001100000001100000001100100 +00101001100000001101000001100101 +00101000100000000000001100000110 +00101000100000000001001100000111 +00101000100000001000000001100100 +00101000100000001001000001100101 +01010100010001011100000000000000 +00101001100000001000000001100100 +00101001100000001001000001100101 +01010011111111110101001111111111 +00000000000101010000001100000101 +01010100010001011010110000000000 +00101000100000010001000001111110 +00101000100000000001000001111100 +00101001100000001100000001100100 +00101001100000001101000001100101 +00101000100000001000000001100100 +00101000100000001001000001100101 +00000010100000000000011110011100 +01010100010101011011110000000000 +00101001100000010011000001100100 +01010100010101100100010000000000 +00000000000101010000000010000110 +00000000000101010000000010100111 +00101000100000001000000001100100 +00101000100000001001000001100101 +01010100010011000010000000000000 +00101000100000010011000001101101 +00101000100000010001000001101100 +00000000000101010000000010011000 +00000010100000001100000110101101 +00101001001111111111111110001101 +00000000000101010000000010111001 +01011100000000001000011110001100 +00011100000000000000111110111100 +00000010100000001000001110011100 +00101000100000000000001110000110 +00101000100000000001001110000111 +00101000100000001100000001100100 +00101000100000001101000001100101 +01010100001100001100100000000000 +00000000000101010000000010000110 +00000000000101010000000010100111 +00000000000101010000001100000100 +00000000000101010000001100100101 +01010100010000101101010000000000 +01100000000000010100100000000100 +00101000100000001100000001100110 +00101000100000001101000001100111 +00101000100000000000001110000100 +00101000100000000001001110000101 +01010100010010111011110000000000 +00000000000101010000000010000110 +00000000000101010000000010100111 +00000000000101010000001100000100 +00000000000101010000001100100101 +01010100010000111100100000000000 +00000010100000001100000000001100 +01100111111111010100100010000000 +00101000001111111111111111001101 +00000010101111111111111111001110 +01011000000000000000110110101100 +00000000000101010000001110110110 +01010000000000001101100000000000 +00000000000101010000000111011110 +01010011111111111110101111111111 +00011100000000000000111110101100 +00000010101111111010000110001100 +00101000100000000000000110000110 +00101000100000000001000110000111 +01010100010001001100000000000000 +00101001100000001000000001100100 +00101001100000001001000001100101 +01010011111111110001111111111111 +00101000100000000001000001101100 +00000000000101010000001110001110 +00000000000101010000000111011101 +00000000000101010000001100111100 +00000010100000000000010110011000 +00000000000100000111110110011111 +00000000000101010000001101000110 +00000000000101010000001101100111 +00000000000101010000001110000100 +00000000000101010000001110100101 +01010100001110010110100000000000 +01010100010101001011010000000000 +00000000000101010000000010011001 +01010100010101010011110000000000 +00000000000101010000001101000110 +00000000000101010000001101100111 +01010100010001000111000000000000 +00000000000101010000000010000110 +00000000000101010000000010100111 +00000000000101010000001110000100 +00000000000101010000001110100101 +01010100010010110000110000000000 +00000010100000001100001100101100 +00101001001111111111111100001100 +00000000000101010000000010000110 +00000000000101010000000010100111 +00000000000101010000001100011110 +01011100000000001010101111111000 +01010100001011111101000000000000 +00000000000101010000001101000110 +00000000000101010000001101100111 +00000000000101010000000010011100 +00000000000101010000000010111101 +01010100010000011101110000000000 +01100000000000000100110000000100 +00000000000101010000001101000110 +00000000000101010000001101100111 +00000000000101010000001110000100 +00000000000101010000001110100101 +01010100010000010011010000000000 +01011100000000000000110010000000 +00000011010000000000011100111001 +01011100000000000010111100100000 +00000000000101010000001011100100 +01010100000010000100100000000000 +00101000100000010000000001101101 +00000010100000000000011011001100 +00101001000000000000001111000000 +00101001100000000000000110101100 +00101000100000000111000001101100 +01011011111101101000000110000000 +00101001100000000000000110011110 +01010011111101100111101111111111 +00000000000101010000001011011101 +00000010100000001110010000001101 +00101000001111111111111111001110 +00000010101111111111111111001100 +01011100000000000001100111001101 +00101000100000000001000001101110 +01011100000000000010000111001100 +00000010100000001100000000001101 +00000010100000000000011110111101 +00101001000000000000000111001101 +00101010000000000000000110001101 +00000010100000000000010110101101 +00101001000000000000000110001101 +01010011111111101100101111111111 +00000000000101010000000110011110 +01010011111111111100111111111111 +00011100000000000000111110101100 +00000010101110101101000110001100 +00101000100000000000000110000110 +00101000100000000001000110000111 +00000010100000000000011100011000 +01010100010000111000100000000000 +00000000000101010000000000000110 +00000000000101010000000000000111 +00000000000101010000000010011100 +00000000000101010000000010111101 +01010100010000001001010000000000 +01011111111111101101100010000000 +01010011111111110110101111111111 +00101000100000000110000001101101 +01011000000000100111100110100000 +00101000100000000011000001101110 +00000010100000000000010000001101 +01100000000000100010100110101110 +00101000100000010010000001101101 +00000010100100001100110110001100 +01011100000000000001000110100000 +00101000100000010110000001101101 +00000010100000001101100000001100 +00000000000100010011010110001100 +00000000000101010000001101111110 +00000000000101010000001101011101 +00101000100000000010000001101101 +00000000000100000011001101011010 +00000010100000000000010000000100 +00000000000100000011000110101100 +00101001100000000010000001101100 +01010100000010011010010000000000 +00000000000101010000000010011000 +01100100000000000011000000011101 +00101000100000000010000001101100 +01100100000000000010100000001100 +00101000100000000010000001101101 +00000000000101010000001110101100 +01100100000000000000100110111101 +00000000000101010000000110101100 +00101000100000000010000001101101 +00000000000100010011001101011010 +00000000000100010011001110111101 +00000000000100010011000110101100 +00101001100000000010000001101100 +01011000000000000101001101100000 +00101000100000000110000001101100 +01011000000000100000010110000000 +01100100000000000011000000011110 +00000000000101010000001111000101 +00000000000101010000001100000100 +01010100000010110110110000000000 +00000000000101010000001011100101 +00000000000101010000000010011000 +01010100000010011000000000000000 +00101001100000001000000001100100 +00000000000101010000001011100100 +01010100000001110000000000000000 +00101000100000001000000001101100 +00000000000101010000000110010111 +00000000000100010111101101100101 +01011000000000000001000010100000 +00000000000101010000001011100100 +01010100000010110011110000000000 +00000000000101010000000010010111 +00000010100000000000010000000100 +01010100000010010001100000000000 +00101000100000001010000001101100 +00000000000101010000000010011011 +01100100000000000001000000001100 +00000000000101010000000110000101 +01010100000010110001110000000000 +00000000000101010000000010011011 +01011000000001001101011101100000 +00101000100000000011000001101101 +00000010100000000000010000001100 +00000000000101010000000000011110 +01100000000000000011110110001101 +01011100000000000011101100100000 +00010100000000000001111111101100 +00000011101111111111110110001100 +00000000000101001011001110001100 +00000000000101010000001100111110 +01011100000000000010010110000000 +00010100111111111110000000000101 +00000000000101001001011110011100 +01011000000000000001101110000000 +00101000100000000010000001101100 +00000010100000000000011101011010 +00000010100000000000010000011110 +00000010100000000000010110001100 +00101001100000000010000001101100 +00101000100000001010000001101100 +00000010100000000000010000000100 +01011000000000000010010110000000 +00101000100000000011001101101100 +00000010100000000000110110001100 +00000000010000001000100110001100 +00000000000100000011001101101100 +00101000100000000000000110000100 +01010100000001110101110000000000 +00000010100000001000000000001100 +00000000000100010001000110000100 +00101000100000000010000001101100 +00000000000100000001000110000100 +00000011010000000111110010000100 +01011000000000010010100010000000 +00000010100000001000000000001100 +00000000000100010001000110001100 +00000010100000000001000000001101 +01100100000000010001000110101100 +00000010100000000111000000001100 +00000000000100010001000110000100 +00101000100000000010000001101100 +00000000000100000001001101011010 +00000000000100000001001110111101 +00000000000100000001000110001100 +00101001100000000010000001101100 +01100100000000000001010000011010 +00000000000101010000001011100100 +00000000000101010000001101000101 +01010100000010110010010000000000 +00000000000101010000000010010111 +00101000100000000010000001101100 +00000000000101010000001101111010 +01100100000000000001010000001100 +00000000000101010000000110000101 +00000000000101010000001101100100 +01010100000010110000100000000000 +00000000000101010000000010011010 +00101000100000001111000001101100 +01011000000000001100110110000000 +00000000000101010000001101000101 +00000000000101010000001011100100 +01010100000011000010100000000000 +01100100000000001011110010000000 +00000000000101010000001011100100 +00000000000101010000000000000110 +00000010100000000010100000000101 +01010100000001011011110000000000 +00101000100000000110000001101100 +00000010101111111111111011010110 +00000000000101010000000010010111 +01011000000000111110010110000000 +00000000000101010000001100000100 +00000000000101010000000000000110 +00000010100000000010100000000101 +01010100000001011001110000000000 +00101000100000000100000001101100 +00000000000101010000000010011000 +01100000000000010010000000001100 +00101000100000000011000001101101 +00000010100000000000100000001100 +01100100000000010001010110001101 +01010000000000001000010000000000 +00000010101111111111111111111110 +01100000000000000001101101111110 +00000000000100010111101101111110 +01100100000000000010111111100000 +00000000000100010111111101011101 +00000000000101010000000000001100 +01010011111111011110011111111111 +00101000100000001010000001101100 +00000000000100010110111111011011 +00000000000100000110110110001100 +00101001100000001010000001101100 +00000000000101010000001111011011 +00000000000101010000000000011110 +01010011111111111101101111111111 +00000000000101010000001101011101 +00000000000101010000001111101100 +01010011111111011011111111111111 +00000000000101010000001101111110 +00000000000101010000001101011101 +00000000000101010000000000011000 +01010011111111011100101111111111 +00000000000101010000001101100101 +01010011111111100011011111111111 +01011011111111110001000110001101 +00000000000101010000000110000100 +00000010100000000111000010000100 +01010011111111101111001111111111 +01100000000000001001010000011111 +00101000100000000011000001101101 +00000010100000000000100000001100 +01100100000000001000100110001101 +00101001100000000100000001111111 +00101000100000000100000001101100 +01011100000000000010100110000000 +00000010100000000001010000000101 +00000000000101010000001101000100 +00000000000101010000000000000110 +01010100000001001110100000000000 +00000000000101010000000010011010 +00000000000101010000000010000101 +00000000000101010000001011100100 +01010100000010110011000000000000 +01100011111110010101010000000100 +00101000100000000101000001101100 +00101000100000000001000001111110 +00000000000101000011000000010110 +00000000000101010000000000011011 +00000000000101010000001101000100 +01010100000001001011100000000000 +01011011111111000110101100000000 +01011000000000000001001101100000 +01011000000000000000111101111000 +00000000000101010000001101100100 +01010100000001001010010000000000 +00000000000101010000001100000100 +01010100000001001001110000000000 +01010011111111000100111111111111 +00000000000101010000000000011010 +00000000000101010000000000011000 +01010011111111111100001111111111 +00000000000101010000001110110110 +00000000000101010000000000011010 +00000000000101010000000000011000 +01010011111110010000001111111111 +00101000100000000110000001101100 +00101001100000000100000001111111 +01011000000000101100000110000000 +01100100000000000001010000011101 +00000000000101010000001100000100 +00000000000101010000001110100101 +01010100000010011000010000000000 +00000000000101010000000010011000 +00000000000101010000001100000100 +01011000000000000100101111000000 +00101000100000000000001100000100 +01010100000000111111100000000000 +00000000000101010000000010011011 +01011100000000000001010010000000 +00000000000101010000001100000100 +01010100000001000011110000000000 +00101001100000000001000001100000 +01010011111100101000011111111111 +00101000100000000011001100000110 +00000010100000000010001100000101 +00000010100000000010000010000100 +00000010100000000000100011000110 +00000000010000001000100011000110 +01010111110011111100111111111111 +00000010100000000000010000000101 +00000000000101010000001101100100 +01010100000010010011010000000000 +00101000100000000001000001101100 +00101000100000000100000001101101 +00000000000101010000001100011011 +00000010100000000000010110011101 +00000000000100000011010110001100 +00101001100000000101000001101100 +00000011010000000000011100101100 +00000000000101010000000010011000 +00101001100000000100000001101100 +00000010101111111111111110101100 +00101001100000000010000001101100 +00000000000101010000000000011111 +01011000000000000001101011100000 +01011000000000000001011101000000 +00000000000101010000001101000101 +00000000000101010000001011100100 +01010111111011111001111111111111 +00000000000101010000000010011111 +00000000000101010000001101100101 +00000000000101010000001011100100 +01010100000010100001100000000000 +00000000000101010000000010011100 +00000000000101010000001100000101 +00000000000101010000001101000100 +01010100000010100110100000000000 +00101000100000000010000010001111 +00000010100000001100001111111001 +00000000000101010000000010011110 +00000010100000000000010000001101 +01011100000000000001010111100000 +00000000000101010000000010000101 +00000000000101010000001011100100 +01010100000010011110100000000000 +00000000000101010000000010001101 +00000000000101010000001111000100 +00101001100000000110000001101101 +01010100000000110111110000000000 +00101000100000000011000001101100 +00101000100000000110000001101101 +00000000000101010000001110111110 +00000000000101010011010110001110 +00101000100000000100000001101100 +00000000000101010011000111001110 +01011100000000000010000111000000 +00000010100000001110010000001101 +01011000000000000110011100101101 +01100100000000000000100000011100 +00000010100000001100011111111001 +00101000100000000010000001101100 +00101001000000000000000110011001 +01010011111111101000101111111111 +01100000000000000001101110000000 +00101000100000000011000001101100 +00000000000101010111000110011100 +00101000100000000100000001101100 +00000000000101010011001110011100 +01011100000000000101111110000000 +01100111111111111101110000001101 +00000010100000000000010000000101 +00000000000101010000001011100100 +01010100000010000100000000000000 +00000000000101010000001101000101 +00000000000101010000000010010111 +01010100000010010110110000000000 +01100000000000000001000000000100 +01011111111111111011110010000000 +00000011010000000000011100101101 +01011011111111111011010110100000 +00000010100000001110010000001101 +01011111111111111010101100101101 +00101000100000000010000001101101 +00000010100000001110010000001100 +00101001000000000000000110101100 +00000010100000001110010000001110 +00101000001111111111111111001100 +00000010101111111111111111001101 +01011000000000001101000110001110 +00000010100000000000010110001100 +01010000000000000001100000000000 +01100100000000000001110000001101 +00000010100000001110010000001101 +01011011111111111101011100101101 +00101000100000000010000001101101 +00000010100000000000011100101100 +00101001000000000000000110101100 +01010011111111011111111111111111 +00101000100000000101000001101100 +00101001001111111111111110111001 +01011000000000000110000110011101 +00000000000101010000000000000110 +00000010100000000010100000000101 +00000000000101010000001011100100 +01010100000000101010000000000000 +00000000000101010000000010010111 +00000000000101010000000000000110 +00000010100000000010100000000101 +00000000000101010000001101100100 +01011100000000000001101101111000 +01010100000000101000100000000000 +00000000000101010000000010011011 +00000000000101010000000010011000 +00000010100000000000011110111101 +01010011111111101000111111111111 +01010100000000100111010000000000 +00000000000101010000000010011011 +00000000000101010000000000000110 +00000000000101010000001100000100 +00000010100000000010100000000101 +01010100000000100110000000000000 +00000000000101010000000010011000 +01010011111111111101111111111111 +00000000000101010000000000011011 +00000010100000000000010000000101 +00000000000101010000001011100100 +01010100000001110110100000000000 +00000000000101010000001101000101 +00000000000101010000000010010111 +01010100000010001001010000000000 +01100011111111110100110000000100 +01011100000000000000110010000000 +00000011010000000000011100101100 +01011111111111110100000110000000 +00000010100000001100000000001100 +00101000001111111111111111001101 +00000010101111111111111111001110 +01011111111111010101110110101100 +00000000000101010000000111011110 +01010011111111111111001111111111 +00101000100000000001000001101100 +01011100000000000001010110001101 +00000010100000000000011011010110 +00000010100000001100010000001100 +00101000100000000001000001101101 +01010011111111110011111111111111 +00000000000101010000000110111110 +01010011111111110000111111111111 +00101000100000000001000001111110 +00000000000101010000000000011010 +01010011111111010010101111111111 +00101000100000000111000001101101 +00011100000000000000111110101100 +00000010101000011101000110001100 +00101001100000000001000001101100 +00000010100000000010000110001100 +01011111111100000001010110100000 +01010011111100000001101111111111 +00101000100000000100000001101100 +01100000000000000001000000001100 +00101000100000000011000001101101 +00000010100000000000100000001100 +01100011111111001011110110001101 +00101000100000000001000001111110 +00000000000101010000000000000100 +01011000000000000001011011100000 +01011000000000000001001101000000 +00000000000101010000001101000101 +00000000000101010000001011100100 +01010111111011010110101111111111 +00101000100000000001000001101100 +00000010100000000000011111011110 +00000010100000001100000010011001 +00000000000100010011001111001101 +00101000100000000100000001101100 +00101001001111111111111111011001 +01100111111111110010110110101100 +00000000000101010000001011100100 +00000000000101010000000000000110 +00000010100000000010100000000101 +01010100000000010111000000000000 +00000000000101010000000010010111 +01010011111111111011101111111111 +00000010101111111100000001100011 +00101001100000000010000001110111 +00011100000000000000111110110111 +00000010101110100110001011110111 +00101000100000000000001011100100 +00101001100000000011000001100001 +01011000000000000001100010000000 +01010111111011001000011111111111 +00011100000000000000111110101100 +00000010101110011111000110001100 +00101001100000000000001011100000 +00101001100000000000000110000000 +00101000100000000011000001100001 +00101000100000000010000001110111 +00000010100000000100000001100011 +01001100000000000000000000100000 +00011100000000000000111110101100 +00000010101110010110000110001100 +00101000100000000000000110001101 +01011100000000000001100110100000 +00000010100000000000010000001101 +00011100000000000000000000000100 +00000010101111101011000010000100 +00101001100000000000000110001101 +01010000000010100100110000000000 +00000000000101010000000000000100 +01001100000000000000000000100000 +00011100000000000000111110101100 +00000010101110001100000110001100 +00101000100000000000000110001101 +01100100000000001000000110100100 +00000010101111111100000001100011 +00101001100000000010000001110111 +00101001100000000001000001111000 +00101001100000000011000001100001 +00000000000101010000000110011000 +00101001100000000000000001111001 +00000000000101010000000010010111 +01010111111111111010101111111111 +00000000000101010000000000001100 +01011100000000000011110010000000 +00011100000000000000111110101100 +00000010101101111111000110001100 +00101000100000000000000110000100 +00000000000101010000000110011001 +01011000000000000000100010000000 +01010111111010111110101111111111 +00000000000101010000001011100100 +01010111110010110101001111111111 +00101001100000000000001100100100 +01011000000000000000100010000000 +00101001100000000000001100010111 +00011100000000000000111110101100 +00000010101101110100000110001100 +00101000100000000000000110001100 +00101000100000000011000001100001 +00101000100000000010000001110111 +00101000100000000001000001111000 +00101000100000000000000001111001 +00000000000101010000000110000100 +00000010100000000100000001100011 +01001100000000000000000000100000 +00011100000000000000111110101100 +00000010101101101010000110001100 +00101000100000000000000110001100 +00000000000101010000000110000100 +01001100000000000000000000100000 +00000010101111111100000001100011 +00101001100000000010000001110111 +00000010100000000000010000010111 +00000000000101110001001011110111 +00000010100000000001001011100101 +00101001100000000001000001111000 +00000000010000001000100010100101 +00000000000101010000000010011000 +00000010100000000000010000000100 +00101001100000000011000001100001 +01010100000011111010010000000000 +01011000000000000001010010000000 +00101001100000000000000010011000 +00101001100000000001000010010111 +00101001100000000011000010000000 +00101001100000000010000010000000 +00101000100000000011000001100001 +00101000100000000010000001110111 +00101000100000000001000001111000 +00000010100000000100000001100011 +01001100000000000000000000100000 +01010011111010110100001111111111 +00000010101111111000000001100011 +00101001100000000110000001110111 +00101001100000000111000001100001 +00101001100000000101000001111000 +00101001100000000100000001111001 +00101001100000000011000001111010 +00000000000101010000000010010111 +01011000000000001000100010000000 +00101000100000000011000010011000 +00010100000000000000000111101111 +00000000000101010000000011011001 +00000010100000000100000010001110 +00000000000101010000000000010000 +00000011101111111111110111101111 +00101000100000000000000111001100 +00000010100000000001000111001110 +00000010100000000000011000010000 +00000000000101001011110110001101 +00000000000111000001010110101101 +00000000010001001100000110001100 +00000000000111000001010110001100 +00000000000100000110010110101101 +00000000010001001100000110110001 +00000000000101001011110110101101 +00000000000100000100010110001100 +00000000010001001100000110011001 +00000000010000001100000110001100 +00000000000100000011010110001100 +00101001101111111111000111001100 +01100011111111111100011000011000 +01011000000000000010111100100000 +00101000100000000001001011101100 +01100000000000000110101100001100 +00101000100000000000001011100100 +00000010100000000000010010000100 +01010111111111110001111111111111 +00000000000101010000000010011010 +01011100000000000011000010000000 +00000000000101010000001011100100 +01010111111010101010001111111111 +00000000000101010000000000010111 +00101000100000000111000001100001 +00000000000101010000001011100100 +00101000100000000110000001110111 +00101000100000000101000001111000 +00101000100000000100000001111001 +00101000100000000011000001111010 +00000010100000001000000001100011 +01001100000000000000000000100000 +00101000100000000011001011100110 +00000010100000000010001011100101 +00000010100000000010000010000100 +00000010100000000000100011000110 +00000000010000001000100011000110 +01010111110010101101011111111111 +00000000000101010000001011100100 +01010111111010100101111111111111 +00000000000101010000001101010111 +00000010100000000001001100001100 +00000000010000001000100110001100 +00000000000100000011001011101100 +00101001100000000000000110011001 +00000010100000000000011100011000 +00101001100000000011001011111000 +01010011111111111010011111111111 +00010101111111111111111000001101 +00000000000101001011010010001101 +00000000000101010000000010001100 +00000000000101010000000000000100 +01011100000000000000110110100000 +00000000010000001100000110001100 +00000010100000000100000000000100 +00010101111111100000000000001101 +00000000000101001011010110001101 +01011100000000000000110110100000 +00000010100000000010000010000100 +00000000010000001010000110001100 +00010101111000000000000000001101 +00000000000101001011010110001101 +01011100000000000000110110100000 +00000010100000000001000010000100 +00000000010000001001000110001100 +00010101100000000000000000001101 +00000000000101001011010110001101 +01011100000000000000110110100000 +00000010100000000000100010000100 +00000000010000001000100110001100 +01100000000000000001100110000000 +00010100100000000000000000001101 +00000000000101001011010110001100 +00000010100000000000010010000100 +01011100000000000000100110000000 +00000010100000001000000000000100 +01001100000000000000000000100000 +00101000100000000000000010001100 +00000011010000000001110110001101 +01011000000000000011110110100000 +00000011010000000000010110001110 +00000000000101010000000000001101 +01011100000000000001100111000000 +00000011010000000000100110001101 +01011000000000000001100110100000 +00000000010001001000010110001100 +00101001100000000000000010001100 +00000010100000000000010000001101 +00000000000101010000000110100100 +01001100000000000000000000100000 +00000000010001001000100110001100 +00101001100000000000000010001100 +00000010100000000000100000001101 +01010011111111111110111111111111 +00000010101111111100000001100011 +00101001100000000011000001101100 +00101010010000000011000001101110 +00000000000101010000000000001101 +01011100000000000000110111000000 +00000000010001001100000110001100 +00000010100000000100000000001101 +00000011010000111111110110001110 +01011100000000000000110111000000 +00000010100000000010000110101101 +00000000010001001010000110001100 +00000011010000000011110110001110 +01011100000000000000110111000000 +00000010100000000001000110101101 +00000000010001001001000110001100 +00000011010000000000110110001110 +01011100000000000000110111000000 +00000010100000000000100110101101 +00000000010001001000100110001100 +00000011010000000000010110001110 +01011100000000000001010111000000 +00000000010001001000010110001100 +00000011010000000000010110001110 +00000010100000000000010110101101 +01011000000000000001010111000000 +00101001100000000000000010001100 +00000000000101010000000110100100 +00000010100000000100000001100011 +01001100000000000000000000100000 +00000010100000001000000000001101 +01010011111111111111001111111111 +00000010101111111100000001100011 +00101001100000000010000001110111 +00000000000101010000000010010111 +00000010100000000000010000000100 +00101001100000000011000001100001 +01010111111111010101111111111111 +01011000000000000001000010000000 +00000010100000000000010000001100 +00101001100000000100000010010111 +00101001100000000011000010001100 +00101000100000000011000001100001 +00101000100000000010000001110111 +00000010100000000100000001100011 +01001100000000000000000000100000 +01011100000000000011000010000000 +00000000000101010000000000000100 +01001100000000000000000000100000 +00000000000101010000000000000100 +00101000100000000111000001100001 +00101000100000000110000001110111 +00101000100000000101000001111000 +00101000100000000100000001111001 +00101000100000000011000001111010 +00101000100000000010000001111011 +00000010100000001000000001100011 +01001100000000000000000000100000 +00000010101111111000000001100011 +00101001100000000100000001111001 +00101001100000000111000001100001 +00101001100000000110000001110111 +00101001100000000101000001111000 +00101001100000000011000001111010 +00101001100000000010000001111011 +00000000000101010000000010111001 +01011011111111111011110010100000 +00101000100000000011000010001101 +00101000100000000011000010101100 +00000000000101010000000010011000 +01100100000000000000110110101100 +00000000000101010000000010111000 +00000000000101010000000010011001 +00101000100000000011001100011011 +00101000100000000011001100111010 +00101000100000000001001100001100 +00101000100000000000001100000100 +00000000000100000110101101110111 +01100100000000000000100110010111 +00000010100000000000010010000100 +01010111111111001011001111111111 +01011011111111111000000010000000 +00000010100000000100000010010000 +00000000010000001000101011110010 +00000000000100000100101000010010 +00000000000101010000001000001100 +01101000000000000011010110010010 +00000010100000000100001100001110 +00000000010000001000101101110001 +00000010100000000100001100100101 +00000000010000001000101101010011 +00010100000000000000000111101111 +00000000000100000100010111010001 +00000000000100000100110010110011 +00000011101111111111110111101111 +01101000000000000001110010110011 +01100000000000010000010000010111 +00101001100000000011000010010111 +01010011111111110100001111111111 +00101001100000000000000110000000 +00000010100000000001000110001100 +01010011111111111100011111111111 +00101000100000000000000010100111 +00000000000101001011110011100111 +01011000000000000110100011100000 +00000000000101010000001000000110 +00000000000101010000000111001000 +00000000000101010000000000001010 +00101000100000000000000100001101 +00101000100000000000000011001001 +00000010100000000001000011000110 +00000000000101001011110110110100 +00000000000111000001111010010100 +00000000000101001011110100101100 +00000000010001001100000100101001 +00000010100000000001000100001000 +00000000000100000011001010010100 +00000000010001001100000110101100 +00000000000111000001110110001100 +00000000000100000010101010010100 +00000000010001001100001010001101 +00000000000101001011111010010100 +00000000000100000010010110001100 +00000000000100000011010110001100 +00000000010001001100000110001010 +00000000010000001100000110001100 +00000000000101010101000110001100 +00101001101111111111000011001100 +01101011111111111011000100010001 +00101001100000000000000011001010 +00101010010000000000100010101000 +01011000000000000110110100000000 +00101000100000000000001000001100 +00000000000101010000001000010100 +00000000000101010000000111000110 +00000000000101010000000000000111 +00101000100000000000000011001101 +00101010010000000000101010001001 +00000000000101001011110110001100 +00000000000101001011110110101101 +00000000000111000010000110101101 +00000010100000000001001010010100 +00000010100000000001000011000110 +00000000000100000010010110101101 +00000000000100000001110110101101 +00000000010000001100000110100111 +00000000000101010011000011101100 +00101001101111111111001010001100 +00101010011111111111100011001100 +00101000100000000000001010000111 +00000000010001001100000110101101 +00000000000111000010000110001100 +00000000000101001011110011100111 +00000000000100000001110110001100 +00000000000100000011010110001100 +00000000010001001100000110000111 +01101011111111111011000011010001 +00101001100000000000001010001100 +00000010100000000001000010100101 +00000010100000000001001000010000 +01010011111111101111111111111111 +00000010101111111111001001010010 +00101000100000000000001001001100 +01011111111111101111100110000000 +00000010101111111111111011110111 +01010011111111101110111111111111 +00000010101111111000000001100011 +00101001100000000110000001110111 +00101001100000000111000001100001 +00101001100000000101000001111000 +00101001100000000100000001111001 +00101001100000000011000001111010 +00000011010000000000110010101100 +00000000000101010000000010110111 +01011000000000000010010110000000 +00000010101111111111110110001100 +00000000010000001000100110001100 +00011100000000000000111110001101 +00000010100010011010000110101101 +00000000000100000011000110101100 +00101000100000000000000110000101 +00000000000101010000000000000110 +01010111111110110111001111111111 +00000000010010001000101011110111 +00000000000101010000000010011001 +01011000000000000110011011100000 +00000010100010011100010000000100 +01010111111111011001011111111111 +00000000000101010000000010011000 +00000011010000000000011011101100 +01011000000000000010000110000000 +00000000000101010000001100000101 +00000000000101010000001100100100 +01010111111111011011011111111111 +00000000000101010000000010011010 +00000000000101010000001100100100 +01010111111001100111011111111111 +00000000000101010000001101011001 +00000000010010001000011011110111 +01011000000000000010011011100000 +00000000000101010000001100000101 +00000000000101010000001100000100 +01010111111111011001001111111111 +00000000000101010000000010011010 +00000000000101010000001100000100 +01010111111001100101001111111111 +00000000000101010000001101011000 +01010011111111111011101111111111 +00000000000101010000001100000100 +01010111111001100100001111111111 +00101000100000000111000001100001 +00000000000101010000001100100100 +00101000100000000110000001110111 +00101000100000000101000001111000 +00101000100000000100000001111001 +00101000100000000011000001111010 +00000010100000001000000001100011 +01001100000000000000000000100000 +00000010101111111000000001100011 +00101001100000000110000001110111 +00101001100000000111000001100001 +00101001100000000101000001111000 +00101001100000000100000001111001 +00101001100000000011000001111010 +00101001100000000010000001111011 +00101001100000000001000001111100 +00000000000101010000000010010111 +01011000000000001011110010000000 +00101000100000000011001011111100 +00000000010010001001010010111000 +00101000100000000000000010000100 +00101000100000000001001011101100 +00000000000100000111001100011100 +00000000000101010000000010111001 +00000010100000000000011110011010 +01100000000000001100010110011010 +01010111111110100100001111111111 +00000000000101010000000010011011 +01011000000000001000010010000000 +00000010100000000100000010001100 +00000000000101010000000110001110 +00000000000101010000000000001101 +00000010100000000001000111001110 +01100000000000001011000110111000 +01100100000000000000101100000000 +00000000000101010000000000011000 +00101000100000000011001011101110 +00000000010000001000101100011000 +00000000000100000110000110001101 +00000000010000001000100111001110 +00000010100000000100001011101100 +00000011010000000111111100100101 +00000000000100000011100110001110 +01011000000000001001010010100000 +00000010100000001000000000010001 +00000000000100010001011000110001 +00000000000101010000000000001111 +00101000100000000000000110010000 +00000010100000000001000110101101 +00000010100000000001000110001100 +00000000000101110001011000010000 +00000000000101010011111000001111 +00101001101111111111000110101111 +00101000101111111111000110001111 +00000000000101111100010111101111 +01101011111111111110000110001110 +00101001100000000000000110101111 +01011000000000000000100111100000 +00000010100000000000101110011010 +00000010101111111111111101011010 +00101001100000000011001101111010 +00000000000101010000001011100100 +01010111111001010100011111111111 +00000000000101010000001101110111 +00101000100000000111000001100001 +00000000000101010000001011100100 +00101000100000000110000001110111 +00101000100000000101000001111000 +00101000100000000100000001111001 +00101000100000000011000001111010 +00101000100000000010000001111011 +00101000100000000001000001111100 +00000010100000001000000001100011 +01001100000000000000000000100000 +00000010100000000000010010000100 +00000000010000001000010110001100 +01010011111111110011011111111111 +00101001101111111111000111000000 +00000010100000000000010110101101 +01010011111111110100011111111111 +00000010100000000001000110001100 +00101000101111111111000110001111 +00000010100000000001000110101101 +00101001101111111111000110101111 +01101011111111111111000110001110 +01010011111111111001101111111111 +00000000000101010000000000001100 +01011000000000000100110010000000 +01011000000000000100100010100000 +00101000100000000011000010001100 +00101000100000000011000010101101 +00000000000100010011010110001100 +01011100000000000011100110000000 +00000000010000001000100110101101 +00000010100000000100000010000100 +00000010100000000100000010100101 +00000000000100000011010010001110 +00000000000100000011010010100101 +00000010101111111111000111001110 +00000010101111111111000010100101 +00101000100000000000000111001111 +00101000100000000000000010101101 +01011000000000000001100111101101 +00000010101111111111110000001100 +01101000000000000000100111101101 +00000010100000000000010000001100 +00000000000101010000000110000100 +01001100000000000000000000100000 +01101011111111111101100010001110 +01010011111111111111011111111111 +00000010101111111100000001100011 +00101001100000000010000001110111 +00101001100000000001000001111000 +00101001100000000011000001100001 +00101001100000000000000001111001 +00000000000101010000000010011000 +00000000000101010000000010110111 +01010111111111111000011111111111 +01011100000000000011000010000000 +01010111111110001100111111111111 +01011000000000000001000010000000 +00000010100000000000010000001100 +00101001100000000011000010001100 +00101001100000000100000010000000 +00101000100000000011000001100001 +00101000100000000010000001110111 +00101000100000000001000001111000 +00101000100000000000000001111001 +00000010100000000100000001100011 +01001100000000000000000000100000 +00000010100000000000010000011001 +01100000000000000001010010000000 +00000000000101010000001011101100 +00000000000101010000000000011001 +00000000000101010000001100010111 +00000000000101010000000110011000 +00101000100000000000001011100100 +01010111111110001000011111111111 +01011011111111111100100010000000 +00101000100000000011001011110010 +00101000100000000011001100010001 +00000010100000000100001011100101 +00000000010000001000101001010011 +00000010100000000100001100010000 +00000000010000001000101000110001 +00010100000000000000000111110100 +00101001100000000010000010011001 +00000000000100000100110010110011 +00000000000100000100011000010001 +00000010100000000100000010001110 +00000000000101010000000000000110 +00000011101111111111111010010100 +00101000100000000000000010101101 +00101000100000000000001000000111 +00000010100000000001000111001110 +00000000000101001101000110101111 +00000000000101001101000011101100 +00000000000100000001100111101111 +00000000000100010011000111101111 +00000000010001001100000011100111 +00000000010001001100000110101100 +00000000000100010001110110001100 +00000000010010001100000111101101 +00000000000100000011010110001100 +00000000010010001100000110000110 +00000000000101001101000111101111 +00000000010000001100000110001100 +00000000000101010011110110001100 +00000010100000000001001000010000 +00101001101111111111000111001100 +00000010100000000001000010100101 +01101011111111111011011000010001 +00010100000000000000000111101111 +00000011101111111111110111101111 +01101000000000000001100010110011 +00000010101111111111000111001110 +00101000100000000000000111001100 +01011000000000000100010110000000 +00101001100000000011000010010010 +01010011111111110010011111111111 +00101000100000000000000010101100 +00000010100000000001000111001110 +00000010100000000001000010100101 +00000000000101001011110110001101 +00000000000100000001100110101101 +00000000010010001100000110110000 +00000000010001001100000110001100 +00000000000100000100000110001100 +00000000010010001100000110000110 +00000000000101001011110110101101 +00000000010000001100000110001100 +00000000000101010011010110001100 +00101001101111111111000111001100 +01010011111111111011011111111111 +00000010101111111111111001010010 +01010011111111111011001111111111 +00000010101111110100000001100011 +00101001100000000111000001111010 +00000000000101010000000010011010 +00000010100000000000010000000100 +00101001100000001010000001110111 +00101001100000001001000001111000 +00101001100000001000000001111001 +00101001100000001011000001100001 +00000000000101010000000010110111 +00000000000101010000000011011001 +00000000000101010000000011111000 +01010111111101110110111111111111 +00000000000101010000000010001111 +01011000000000001000010010000000 +00010100000000000001111111101100 +00000000010001001101001011100101 +00000011101111111111110110001100 +00000011010111111111110010100101 +00000000000101001101110110001100 +01011100000000001000110010100000 +00101001100000000010000001101100 +01011000000000001001101101000000 +00000010100000000011000001100100 +00101001100000000011000001111010 +01010111111110010000101111111111 +00101000100000000011000001101110 +01011000000000000111110010000000 +00101000100000000010000001101101 +00000000000100010001000000001100 +00000000000101110011000110101100 +00000000000101010011100110001100 +00000000000101111001000110101101 +00101001100000000100000111101100 +00101001100000000010000001101101 +00101000100000000010000001101110 +00101001100000000101000111101110 +00000000000100101011100000001110 +00000010100000000000010111001110 +00101001100000000011000111101110 +01011000000000000111010010100000 +00000010101011110011010010100101 +00000000000100000001000010100101 +00000010100000001101010000001100 +00101001100000000000001100100101 +00000000000100010001000110000100 +00101001100000000000001100000100 +00101000100000001011000001100001 +00101000100000001010000001110111 +00101000100000001001000001111000 +00101000100000001000000001111001 +00101000100000000111000001111010 +00000000000101010000000111100100 +00000010100000001100000001100011 +01001100000000000000000000100000 +00010100000000000010000000001101 +00000000000101010011010110001100 +01010011111111110111001111111111 +00101001100000000100000111101110 +01010011111111111010001111111111 +00000010100000000010000001100100 +01010111111110000111101111111111 +00101000100000000010000001101100 +00000010100000001000000010000100 +00000010100000000000010000001110 +00101001100000000100000111101100 +00000010100000000000010000001100 +00101001100000000011000111101100 +01010011111111111001001111111111 +00000000010000001000100111001100 +00000010101011110011100010000100 +00101001100000000000001100100100 +00000000000100000011000111101100 +00101000100000000011000110000100 +01010111111101111101001111111111 +00000000010000001001010111001110 +00000000000100010001000111001110 +00101001100000000000001100001110 +01010011111111111000011111111111 +00000000000101010000000010000101 +00000000000101010000000000000110 +00000010100000000000100000000100 +01010000000000000000010000000000 +00011100000000000000111110001110 +00000010100011111010000111001110 +00000000000101010000000000001100 +00000000000101010000000111001101 +00000010100000001000000000010000 +00101000100000000010000111001111 +01011100000000000010100111100000 +00000000010000001000010110001110 +00000000000100000011000111001100 +00000000010000001000100110001100 +00000000000100000011000110101100 +00101001100000000000000110000101 +00101001100000000001000110000110 +00101001100000000010000110000100 +00000000000101010000000111100100 +01001100000000000000000000100000 +00000010100000000000010110001100 +00000010100000000011000111001110 +01011111111111111100110110010000 +00000010101111111111110000001111 +01010011111111111110101111111111 +00000010101111111100000001100011 +00101001000000000011110001100101 +00101010000000000011110001100101 +00000000000100000001100010000110 +01011100000000000001000010000110 +00000000000101010000000000000100 +00000010100000000100000001100011 +01001100000000000000000000100000 +00101010000000000000000010001100 +01011011111111111111010110000101 +00000010100000000000010010000100 +01010011111111111110011111111111 +00000000000101010000000010001100 +00101000000000000000000110001101 +01011100000000000000110110100000 +00000000000100010001000110000100 +01001100000000000000000000100000 +00000010100000000000010110001100 +01010011111111111110111111111111 +00000000000101010000000010001100 +01011000000000000001110011000000 +00000010100000000000010010100101 +00101000001111111111110010101101 +00000010100000000000010110001100 +00000010101111111111110011000110 +00101001001111111111110110001101 +01011111111111111110100110100000 +00000000000100000001100110000110 +01011100000000000000100110000110 +01001100000000000000000000100000 +00000010100000000000010110001100 +00101001001111111111110110000000 +01010011111111111111001111111111 +00011100000000000000111110000100 +00101000100010111011000010000100 +00000010100000111100000010000100 +01001100000000000000000000100000 +00011100000000000000111110001100 +00101000100010101111000110001100 +00101001100000001000000010001100 +00011100000000000000111110001100 +00101000100010101001000110001100 +00101001100000001001000010001100 +00011100000000000000111110001100 +00101000100010101000000110001100 +00101001100000011000000010001100 +00010101111111111111111100001100 +00000000000101010011000010100101 +00011100000000000000111110001100 +00101000100010011011000110001100 +00101001100000001010000010001100 +00011100000000000000111110001100 +00101000100010100010000110001100 +00101001100000000000000010000000 +00101001100000000001000010000000 +00101001100000000010000010000000 +00101001100000010100000010000000 +00101001010000000011100010000110 +00101001100000000100000010000000 +00101001100000000101000010000000 +00101001100000000110000010000000 +00101001100000011001000010000000 +00101001100000011010000010000000 +00101001100000000111000010000100 +00101001010000000011000010000101 +00101001100000001011000010001100 +01001100000000000000000000100000 +00011100000000000000111110000101 +00000010100000100100000010100101 +00011100000000000000111110000100 +00101000100010001010000010000100 +01010000000000010000110000000000 +00011100000000000000111110001100 +00000010100000011110000110001100 +00101000100000000000000110000100 +00000010101111111100000001100011 +00101001100000000010000001110111 +00101001100000000011000001100001 +00011100000000000000111110010111 +00000010100011111010001011110111 +01011000000000000000100010010111 +01010100000001110000010000000000 +00011100000000000000111110001100 +00000010100000010011000110001100 +00101000100000000000000110000100 +00000010100000011100001011101100 +01011000000000000000100010001100 +01010100000001101110110000000000 +00011100000000000000111110001100 +00000010100000001100000110001100 +00101000100000000000000110000100 +00000010100000111000001011110111 +01011000000000000001010010010111 +00101000100000000011000001100001 +00101000100000000010000001110111 +00000010100000000100000001100011 +01010000000001101100100000000000 +00101000100000000011000001100001 +00101000100000000010000001110111 +00000010100000000100000001100011 +01001100000000000000000000100000 +00000010101111111100000001100011 +00011100000000000000111110001100 +00000010100100110110000110001100 +00011100000000000000000000001101 +00000010101111011011000110101101 +00000000000101010000000000000110 +00000010100000000001000000000101 +00011100000000000000111110000100 +00000010100011011100000010000100 +00101001100000000011000001100001 +00101001100000000000000110001101 +01010111111111101101011111111111 +00011100000000000000111110001101 +00000010100011010111000110101101 +00000010100000000000010000000110 +00000010100000000010010000000101 +00000010100000011100000110100100 +01010111111111101011111111111111 +00101000100000000011000001100001 +00000010100000000000100000000110 +00000010100000000100100000000101 +00000010100000111000000110100100 +00000010100000000100000001100011 +01010011111111101010011111111111 +00011100000000000000111110001100 +00000010100011001001000110001100 +00101000100000000000000110001101 +01011100000000000010010110100000 +00011100000000000000000000001101 +00000010101111000111000110101101 +00101001100000000000000110001101 +00011100000000000000111110001100 +00000010100100011000000110001100 +00101000100000000000000110001100 +01011100000000000000100110000000 +01010011111111110111011111111111 +01001100000000000000000000100000 +00000010101111111000000001100011 +00101001100000000110000001110111 +00101001100000000100000001111001 +00101001100000000010000001111011 +00101001100000000001000001111100 +00101001100000000000000001111101 +00101001100000000111000001100001 +00101001100000000101000001111000 +00101001100000000011000001111010 +00000000000101010000000010011011 +00000000000101010000000010110111 +00000000000101010000000000011001 +00000010100000000000010000011100 +00000010101111111111110000011101 +00101000100000000010001011111000 +00101000100000000001001011111010 +00000010101111111111111101011010 +01100100000000000011101101000000 +00101000100000000000001011110111 +01011111111111111110111011100000 +00101000100000000111000001100001 +00000000000101010000001100100100 +00101000100000000110000001110111 +00101000100000000101000001111000 +00101000100000000100000001111001 +00101000100000000011000001111010 +00101000100000000010000001111011 +00101000100000000001000001111100 +00101000100000000000000001111101 +00000010100000001000000001100011 +01001100000000000000000000100000 +00101010010000000011001100001100 +01101100000000000001101110001100 +00101000010000000011101100001100 +01011000000000000001000110011101 +00000000000101010000001100000100 +01001100000000000000001101100001 +00000000000101010001001100111001 +00000010100000011100001100011000 +01010011111111111010011111111111 +00101000100000000010000010101101 +00000010101111111100000001100011 +00101001100000000010000001110111 +00101001100000000011000001100001 +00000000000101010000000010110111 +01011100000000000001110110100000 +00101001100000000001000010100000 +00000000000101010000000000000100 +00101000100000000011000001100001 +00101000100000000010000001110111 +00000010100000000100000001100011 +01001100000000000000000000100000 +01010100000001011011110000000000 +00101001100000000010001011100000 +00101001100000000001001011100000 +01010011111111111110011111111111 +00000010101111111100000001100011 +00101001100000000010000001110111 +00000000000101010000000010010111 +00101000010000000011100010000100 +00101001100000000011000001100001 +01010100000011101001010000000000 +01100000000000000011100010000000 +00101000100000010110001011101100 +00101000100000010111001011101110 +00000000010010001111110010001101 +00000000000100000001000110001111 +00000000000100101011000111101100 +00000000000100000011010111001101 +00000000000100000011010110001100 +00101001100000010110001011101111 +00101001100000010111001011101100 +00101000100000000011000001100001 +00101000100000000010000001110111 +00000010100000000100000001100011 +01001100000000000000000000100000 +00101010010000000011001011101100 +00010101111111111111111111001101 +00000011101111111111110110101101 +00000000000101001011010110001100 +00101001010000000011001011101100 +01010011111111111101111111111111 +00000010101111111100000001100011 +00101001100000000010000001110111 +00000000000101010000000010010111 +00101000010000000011100010000100 +00101001100000000011000001100001 +01010100000011110000100000000000 +00000010101111111111110000001100 +00101010010000000011001011101101 +01011100000000000010010010001100 +00010101111111111111111111001100 +00000011101111111111110110001100 +00000000000101001011010110001100 +00101001010000000011001011101100 +00101000100000000011000001100001 +00101000100000000010000001110111 +00000010100000000100000001100011 +01001100000000000000000000100000 +00010100000000000000000000101100 +00000000000101010011000110101100 +00101001010000000011001011101100 +00000000010010001111110010001100 +00101001100000010110001011100100 +00101001100000010111001011101100 +01010011111111111101101111111111 +00101000010000000011100010000100 +01010000000011100111000000000000 +00011100000000000000111110001100 +00101000101111100001000110001100 +00101000100000000000000110001100 +00000010101111111100000001100011 +00101001100000000010000001110111 +00101001100000000011000001100001 +00000000000101010000000010010111 +01011100000000000000100110000000 +01010111111111011111111111111111 +00101000010000000011001011101100 +00000011010000000010000110001101 +01011100000000000111010110100000 +00000011010000000100000110001101 +01011100000000000010010110100000 +00011100000000000000111110001101 +00101000101111001001000110101101 +00000010100000000010010000001110 +00101001100000000000000110101110 +00000011100000010000000110001100 +00101001010000000011001011101100 +00000010101111111111110000000100 +01010000000000001001110000000000 +00000011010000000001000110001100 +01011000000000000011100110000000 +00101000100000001100001011100100 +01011000000000000001010010000000 +00000010100000010000001011101100 +01011000000000000000100010001100 +01010111110111010100101111111111 +00101001100000001100001011100000 +00101010010000000011001011101100 +00000010101111110110110000001101 +00101001100000000001001011100000 +00000000000101001011010110001100 +00101001010000000011001011101100 +00101000100000000100001011101100 +00101001100000000000001011101100 +00101010010000000011001011101100 +00000011100000000010000110001100 +00101001010000000011001011101100 +00101000100000000100001011101100 +01011100000000000001110110000000 +00101010010000000011001011101100 +00000010100010000000000000001101 +00000011010010100000000110001100 +01011000000000000000110110001101 +00000000000101010000001011100100 +01010100000010001111110000000000 +00101000010000000011001011101100 +00000011010000000000010110001101 +01011000000000000011100110100000 +00101000100000000101001011101101 +00101001100000000010001011100000 +00000000000100010011010000001101 +00101001100000000110001011101101 +00101000100000000100001011101101 +00000000000101010000000000000100 +01011100000000000000110110100000 +00000011010000100000000110001101 +01011111111111110101110110100000 +00101000100000000011000001100001 +00101000100000000010000001110111 +00000010100000000100000001100011 +01001100000000000000000000100000 +00000011010000000000100110001101 +00000000000101010000000000001110 +01011100000000000000100110100000 +00101000100000000101001011101110 +00101001100000000010001011101110 +01010011111111111100101111111111 +00000010101111111100000001100011 +00101001100000000010000001110111 +00000000000101010000000010010111 +00101000010000000011100010000100 +00101001100000000011000001100001 +01010100000011011011000000000000 +00000010101111111111110000001100 +00101010010000000011001011101101 +01011100000000000010100010001100 +01011100000000000010010010100100 +00010101111111111111111111001100 +00000011101111111111110110001100 +00000000000101001011010110001100 +00101001010000000011001011101100 +00101000100000000011000001100001 +00101000100000000010000001110111 +00000010100000000100000001100011 +01001100000000000000000000100000 +00010100000000000000000000101100 +00000000000101010011000110101100 +00101001010000000011001011101100 +00101001100000010110001011100100 +00101001100000010111001011100101 +01010011111111111101111111111111 +00101010010000000011000010001100 +00000010101111111100000001100011 +00101001100000000010000001110111 +00101001100000000001000001111000 +00101001100000000000000001111001 +00101001100000000011000001100001 +00000011010001000000000110001100 +00000000000101010000000010010111 +00000000000101010000000010111000 +00000000000101010000000011011001 +01011000000000000001100110000000 +00101000010000000011100010000100 +00000010100000000000100000000111 +00000000000101010000000000000101 +00000000000101010000000000000110 +01010100000011010010100000000000 +00101010010000000011001011101100 +00010101111111111111111111001101 +00000011101111111111110110101101 +00000000000101001011010110001100 +00101001010000000011001011101100 +00101000010000000011101011100100 +00101000100000000011000001100001 +00101000100000000010000001110111 +00000000000101010000001100100110 +00000000000101010000001100000101 +00101000100000000000000001111001 +00101000100000000001000001111000 +00000010100000000100000001100011 +01010000000010110011000000000000 +00000000000101010000000010001100 +00000000000111000001010010000100 +00000000000111010001010110001100 +01011100000000000000100110000000 +01010011101110110010101111111111 +00011100000000000000111110001100 +00101000101101010110000110001100 +00000010100000000011000000001101 +00101001100000000000000110001101 +00000000000101010000000000000100 +01001100000000000000000000100000 +00101000010000000011000010001100 +00000010101111111100000001100011 +00101001100000000010000001110111 +00101001100000000011000001100001 +00101001100000000001000001111000 +00101001100000000000000001111001 +00000011010000000010000110001101 +00000000000101010000000010010111 +01011100000000011101010110100000 +00101000100000000001000010001101 +01100000000000000010100000001101 +00101000100000001111000010001101 +01100000000000000010000000001101 +00000000000101010000000000000100 +00101000100000000011000001100001 +00101000100000000010000001110111 +00101000100000000001000001111000 +00101000100000000000000001111001 +00000010100000000100000001100011 +01001100000000000000000000100000 +00101000100000001010001011101110 +01011011111111111110000111000000 +00011100000000000000111110011000 +00101000101100111010001100011000 +00000000010001001011000110001101 +00101000100000000000001100011001 +00000011010000000000010110101101 +00101001100000000000001100000000 +01011000000000001111010110100000 +00101000100000010110001011101100 +00101000100000010111001011100110 +00101000010000000011001011101110 +00000011010000000001000111001101 +01011000000000000100010110100000 +00101000100000000001001011101101 +00000000010010001111110110110000 +00000000000100010011010110001101 +00000000000100101011010110001111 +00000000000101010000000110101100 +00101000100000001100001011101101 +00000000000100010100000011000110 +00000000000100010011110011000110 +01011000000000000010000110100000 +00101000100000001111001011101101 +00000000010010001111110110110000 +00000000000100010011010110001101 +00000000000100101011010110001111 +00000000000100010100000011000110 +00000000000101010000000110101100 +00000000000100010011110011000110 +00101000100000000111001011100100 +01100100000000010000000111000000 +00101000100000011000001011101101 +00000000000101010000000000000111 +00000000000101010000000110000101 +01001100000000000000000110100001 +00000010101111111111110000001100 +00101010010000000011001011101101 +01011100000000000010100010001100 +01011100000000000010010010100100 +00101000100000000000001100001110 +00000010100000000111010000001100 +01101000000000001110110110001110 +00010100010000001000000000001100 +00000011100000000000010110001100 +00000000000101111011100110001100 +00000011010000000000010110001100 +01011000000000001101100110000000 +00101000100000000100001011101100 +00101001100000000001001011100000 +00101001100000000000001011101100 +00010100000000000000000000101100 +00000000000101001011000110101101 +01011000000000000010000110100000 +00000010101111111111110000001100 +01011100000000000001000010001100 +01011100000000000000110010100100 +00101000100000000000001100001100 +01011100000000000000110110000000 +00101001100000010110001011100100 +00101001100000010111001011100101 +00101000100000001100001011100100 +00101001100000000000001100011001 +01011011111111101110100010000000 +00000010100000010000001011101100 +01011000000000000000100010001100 +01010111110110100100011111111111 +00101001100000001100001011100000 +01010011111111101101011111111111 +00101000100000000111001011100100 +01100100000000000100110110000000 +00101000100000011000001011101100 +00000000000101010000000000000110 +00000010100000000000010000000111 +00000000000101010000000000000101 +01001100000000000000000110000001 +00000000000101010000000010001100 +00000000000101010000000010100110 +00000010101111111111110000001101 +01011111111111101111000110001101 +01011111111111101110110011001100 +00101000100000000000001100001101 +01011011111111101110010110100000 +00000010100000000111010000001100 +01011000000000000000110110101100 +00000010100000000101100000001100 +01011100000000001001000110101100 +00101001100000000000001100011001 +01010011111111101000011111111111 +00000010100000000000010000000110 +00000000000101010000000000000101 +01001100000000000000000111000001 +00000000000101010000000010001100 +00000000010010001111110010000110 +01010011111111111100001111111111 +00101000100000001010001011101101 +00000000000101010000000110000101 +00000000000101010000000000000110 +01001100000000000000000110100001 +00000000010010001111110010000101 +01010011111111110000001111111111 +00000011100000010000000110101101 +00101001010000000011001011101101 +00000010101111111111110000000100 +01010011111111100100101111111111 +00101000100000000100000010011001 +01011011111111100011111100100000 +00101000100000000000000010011000 +00000011010000000000110110001100 +00101001100000000000000010011001 +00000000000100010110011100011000 +00000000000101010000000000001101 +01011100000000000000100110000000 +00101000100000000101000010001101 +00101001100000000010001011101101 +01011011111111100001101100000000 +00101000100000001001001011101100 +00101000100000000111001011100100 +00000000000101010000001100000110 +00000000000101010000001100100101 +01001100000000000000000110000001 +01100000000000000001010000000100 +00101010010000000011001011101100 +00000011100000010000000110001100 +00101001010000000011001011101100 +01010011111111111010101111111111 +00000000000100000001001100111001 +00000000000100010001001100011000 +01010011111111111100111111111111 +01011100000000000001100010000000 +00011100000000000000111110000101 +00101000101011000111000010100101 +00011100000000000000000000000100 +00000010101111111101000010000100 +01010011111110011100111111111111 +00011100000000000000111110001100 +00101000101010111111000110001100 +00101000100000000000000110001100 +00000010101111111100000001100011 +00101001100000000010000001110111 +00101001100000000011000001100001 +00000000000101010000000010010111 +01011100000000000000100110000000 +01010111111110010111011111111111 +00101000010000000011001011101100 +01011000000000000001100110000000 +00101000100000000011000001100001 +00000000000101010000001011100100 +00101000100000000010000001110111 +00000010100000000100000001100011 +01010011111111010101101111111111 +00101000100000000011000001100001 +00101000100000000010000001110111 +00000000000101010000000000000100 +00000010100000000100000001100011 +01001100000000000000000000100000 +00101000100000000010000010101100 +01011100000000000001000110000000 +00000000000101010000000000001100 +00000000000101010000000110000100 +01001100000000000000000000100000 +00101010010000000011000010001100 +00000010101111110000000001100011 +00101001100000001101000001110111 +00101001100000001001000001111011 +00101001100000001111000001100001 +00101001100000001110000001110110 +00101001100000001100000001111000 +00101001100000001011000001111001 +00101001100000001010000001111010 +00101001100000001000000001111100 +00101001100000000111000001111101 +00101001100000000110000001111110 +00101001100000000101000001111111 +00000011010000000010000110001100 +00000000000101010000000010111011 +00000000000101010000000010010111 +01011000000000001101110110000000 +00101000100000000100000010001100 +01011000000000001101010110000000 +00101000010000000011001011101100 +00101000100000000000001101111010 +00000011010000000000100110001101 +01011100000000010101110110100000 +00000011010000000000010110001100 +01011000000000100000100110000000 +00000000000101010000000000011101 +00000000000101010000000000000100 +00000000000101010000000000011100 +00000000000101010000000000011001 +01011000000000110110011100100000 +01011100000000000010010010000000 +00000000000101010000001100100110 +00000010100000000010100000000101 +00000000000101010000001110000100 +01010111111101101011001111111111 +00000010100000000000011100111101 +01011000000000000000110010000000 +00000010100000000000010010000100 +00000000000100010111000010011101 +00000000000101010000001110111110 +01101100000000000000101100111101 +00000000000101010000001100111110 +00101000100000000000001011100100 +00101000100000000100001011101100 +00101000100000000101001011100110 +01101100000000110011100110000100 +00101000100000000010001011111000 +00000000000100000110000011011000 +01100100000000110010111100011110 +00000000000101010000001100000110 +00000000000101010000001110000101 +01010100000001101101110000000000 +00101000100000000000001011101100 +00000000000101010000001011100100 +00000000000100000110000110001100 +00101001100000000000001011101100 +01010111111111101010001111111111 +01011100000000010111000010000000 +00000000000100010110001110111101 +00000010100000000000010000000100 +01011100000000000001001110100000 +00000000000101010000001011100100 +01010111111111101000101111111111 +01011100000000010101100010000000 +00101000100000000010001101101100 +00000000000100000110001110011100 +00000000000100010110001100111001 +00000000000100010110000110011000 +00101001100000000010001101111000 +01011111111111110110001100000000 +01010000000000000110000000000000 +00000000000101010000001011100100 +01010111111110011111001111111111 +00000010101111111111110000001100 +01011011111111110010010010000000 +01010000000000000101000000000000 +00101000100000000000001101011001 +00101000100000000001001101011000 +00000010100000000010001101011010 +01011011111111111111011100000000 +00000000000101010000001100000110 +01101100000000000000101110011000 +00000000000101010000001110000110 +00101000100000001001001011101100 +00101000100000000111001011100100 +00000000000101010000001100100101 +01001100000000000000000110000001 +01100100000000001111100000000100 +00101000100000000010001101101100 +00000000000100000001001100111001 +00000000000100010001001100011000 +00000000000100010001000110000100 +00101001100000000010001101100100 +01011111111111111100100010000000 +00000000000101010000000000001100 +00101000100000001111000001100001 +00101000100000001110000001110110 +00101000100000001101000001110111 +00101000100000001100000001111000 +00101000100000001011000001111001 +00101000100000001010000001111010 +00101000100000001001000001111011 +00101000100000001000000001111100 +00101000100000000111000001111101 +00101000100000000110000001111110 +00101000100000000101000001111111 +00000000000101010000000110000100 +00000010100000010000000001100011 +01001100000000000000000000100000 +00010100111111111111111111111100 +00000000000101010000000000011001 +00000000000101010000000000011000 +00000011101100000000001110011100 +01010011111111110111101111111111 +00101000100000000000001101011100 +00101000100000000001001101011000 +00000010100000000010001101011010 +01011011111111111111011100000000 +00101000010000000011001011111110 +00101000100000000010001011101100 +00101000100000000000001011100100 +00000011010010000000001111001110 +01011000000000010101110111000000 +01101000000000001101001100001100 +00000011010100100000001111001110 +01011000000000001100100111000000 +00101000100000000101001011101100 +00101000100000000100001011101110 +00000000010000001000010110010110 +00000000000100000011001011001100 +00000000010001001111110110010110 +00000000000100010011100010011001 +00000000000100000011001011010110 +00000010100000000000011100101100 +00000000010010001000011011010110 +00000000000100000110000110001100 +01101100000000000000101011001100 +00000000000101010000000110010110 +00000011010100000000001111001100 +01011000000000001110100110000000 +00000000000101010000001011000100 +00101001100000000011000001101110 +01010111101101100000001111111111 +00101000100000000011000001101110 +01011100000000000100000010000000 +00011100000000000000111110001100 +00101000101000001010000110001100 +00000010100000000011000000001101 +00101001100000000000000110001101 +00101010010000000011001011101100 +00000011100000010000000110001100 +00101001010000000011001011101100 +00000010101111111111110000001100 +01010011111111110001101111111111 +00010100111111111111111111111101 +00000000000101010000000000011100 +00000000000101010000000000011000 +00000011101111111111111110111101 +00000010101011011111110000011111 +01010011111111110101101111111111 +00000000000101010000001100100110 +00000000000101010000000111000101 +00101001100000000011000001100100 +01010111101101101010111111111111 +00000000000101001111111111001101 +00101000100000000011000001101100 +00000011100000100000000110101101 +00101001010000000011001011101101 +00101001100000000100001011101100 +00101001100000000101001011110110 +00000000000100000110010110001100 +00000000000100010110011011010110 +00101001100000000000001011101100 +00101001100000000010001011110110 +00000000000101010000001100001100 +00000000000101010000001100011001 +01101100000000000000101100001100 +00000000000101010000001100001100 +00101000100000000000001011100100 +00000000000101010000000110000110 +00000000000101010000001110000101 +00101001100000000011000001101100 +01010100000001001101000000000000 +00101000100000000010001011101101 +00101000100000000011000001101100 +00000000000100010011000110101101 +00101001100000000010001011101101 +00101000100000000000001011101101 +00000000000100000011000110101100 +00101001100000000000001011101100 +00101000100000000010001101101100 +00000000000100000110011110011100 +00000000000100010110011100011000 +00000000000100010110010110011001 +00101001100000000010001101111001 +01011111111111101100101100100000 +01010011111111100110101111111111 +00000000000101010000001011000101 +00000000000101010000000111000100 +01010100000000101000110000000000 +00000000000101010000000010001100 +01011111111111110111110010000000 +00101000100000000100001011100100 +01010111110101011001111111111111 +00101010010000000011001011101100 +00000010101111011111110000001101 +00000000000101001011010110001100 +00101001010000000011001011101100 +01010011111111110000011111111111 +00101000100000000100001011101101 +01101000000000000000110110100100 +00101000100000000101001011101101 +01101100000000000100101100001101 +00000000000101010000000110011001 +01101100000000000000101100001100 +00000000000101010000001100011001 +00000000000101010000001100100110 +00000000000101010000001110000101 +01010100000001000100000000000000 +00101000100000000010001011101100 +00101000100000000000001011101101 +00000000000100010110010110001100 +00000000000100000110010110101101 +00101001100000000010001011101100 +00101001100000000000001011101101 +01011111111111110111010110000000 +00000000000101010000001011100100 +01010111111110111111011111111111 +01011011111111110110100010000000 +01010011111111101100001111111111 +00010100111111111111111111101110 +00000011101111111111100111001110 +00000000000101010000001100001100 +01101100000000000000100111011000 +00000000000101010000001110101100 +00000000001000000011010110000110 +01011100000000000000100110100000 +00000000001010100000000000000111 +00000000000111000011010011000110 +00101000100000001001001011101100 +00101000100000000111001011100100 +00000000000101010000001110000101 +01001100000000000000000110000001 +00000000000101010000000010011001 +01100011111111110010100000000100 +01010011111111101000001111111111 +00101000100000000000001101011100 +00101000100000000001001101011001 +00000000000101010000000000000100 +00000010100000000010001101011010 +01010011111111001000111111111111 +01100000000000000010001111000110 +00101000100000001001001011101100 +00101000100000000111001011100100 +00000000000101010000001110000101 +01001100000000000000000110000001 +00000000000101010000000010011000 +01100011111111001110010000000100 +01010011111111100100111111111111 +00000000000101010000001111000110 +00000000000101010000001110000101 +01010100000000111001010000000000 +00101000100000000010001011101100 +00000000000101010000001111011000 +00000000000100010111100110001100 +00101001100000000010001011101100 +00101000100000000000001011101100 +00000000000100000111100110001100 +00101001100000000000001011101100 +01010011111111001011011111111111 +00000010101111100000000001100011 +00101001100000011100000001111001 +00000000000101010000000010011001 +00101000010000000011100010000100 +00101001100000011110000001110111 +00101001100000011101000001111000 +00101001100000011111000001100001 +00000000000101010000000010110111 +00000000000101010000000011011000 +01100100000000000001110010000000 +00101010010000000011001100101100 +00101001100000000000001100000000 +00000011010000100000000110001100 +01011100000000000011100110000000 +00000010100100000000000000001100 +01010000000000000011010000000000 +00000010100000000010000001100101 +01010100000001010001100000000000 +01100011111111111110000010000000 +00101000100000000101000001101101 +00010100000000000000000111101100 +00000000000101001011010110001100 +00010101111111111111111111001101 +00000000000100000011010110001100 +00000010010000000000010110001100 +00101001100000000000001100001100 +01010011111111111101001111111111 +00000010100000010000000000001100 +00101000100000011111000001100001 +00101001100000000000001011101100 +00101000100000011101000001111000 +00101000100000011110000001110111 +00101000100000011100000001111001 +00000000000101010000000000000100 +00000010100000100000000001100011 +01001100000000000000000000100000 +00101010010000000011000010001100 +00000010101111111000000001100011 +00101001100000000110000001110111 +00101001100000000111000001100001 +00101001100000000101000001111000 +00101001100000000100000001111001 +00000011010000000000100110001100 +00000000000101010000000010010111 +01011000000000000011000110000000 +00000010100000010000111011101100 +00101001100000000000001011101100 +00101001100000000100001011101100 +00000010100000000000010000001100 +00101001100000000101001011101100 +00101000100000000111000001100001 +00101000100000000110000001110111 +00101000100000000101000001111000 +00101000100000000100000001111001 +00000010100000001000000001100011 +01001100000000000000000000100000 +00000010100000000011000001100110 +00000010100000000010000001100101 +01010111111111110001101111111111 +00101000100000000010000001111001 +00000000000101010000000010011000 +00000000000101010000001100100100 +01010111101100110000101111111111 +01011100000000000010010010000000 +00101000010000000011001011101100 +00000011010010000000000110001101 +01011111111111111100000110100000 +00000010101111111111000000001101 +00000000000101001011010110001100 +00000011100000000000100110001100 +00101001010000000011001011101100 +01010011111111111001101111111111 +00101010010000000011001011101100 +00101001100000000000001011100100 +00101001100000000100001011100100 +00101001100000000101001011111001 +00000011100000100000000110001100 +00101001010000000011001011101100 +00101000100000000011000001101100 +01011000000000000010010110000000 +00101000010000000011101011100100 +01010100000000101000100000000000 +01011000000000000001100010000000 +00101010010000000011001011101100 +00000010101111111111000000001101 +00000000000101001011010110001100 +00000011100000000000010110001100 +00101001010000000011001011101100 +00101010010000000011001011101100 +00000000000101010011001100011000 +00101001010000000011001011111000 +01010011111111110101111111111111 +01011100000000000000110010000000 +00000000000101010000000010100100 +01010011101100101000101111111111 +00000010101111111000000001100011 +00101001100000000011000001111010 +00101001100000000111000001100001 +00101001100000000110000001110111 +00101001100000000101000001111000 +00101001100000000100000001111001 +00101001100000000010000001111011 +00101001100000000001000001111100 +00101001100000000000000001111101 +00000000000101010000000010111010 +01011100000000000000110010100000 +01010111110100101110101111111111 +01010000000000000010000000000000 +00000010101111111010110000001100 +01101100000000000100010110000101 +00011100000000000000111101101100 +00101000100100011111000110001100 +00000010100000000011000000001101 +00101001100000000000000110001101 +00000000000101010000000000011010 +00101000100000000111000001100001 +00000000000101010000001101000100 +00101000100000000110000001110111 +00101000100000000101000001111000 +00101000100000000100000001111001 +00101000100000000011000001111010 +00101000100000000010000001111011 +00101000100000000001000001111100 +00101000100000000000000001111101 +00000010100000001000000001100011 +01001100000000000000000000100000 +00000000000101010000000010011001 +00000010100000000001110010111000 +00000010101111111110000000000100 +00101000101111111111001100110111 +00000000000101001001001100011000 +00000010100000000010001100011000 +00000010101111111111001100111011 +01101100000000001000111011111000 +00000000000101010000001100000101 +00000000000101010000001101100100 +00000000000100000101111101111100 +01010111101100010100101111111111 +01011100000000000110010010000000 +00011100000000000000111101101101 +00101000100100010000000110101101 +00101000100000000000000110101100 +01011000000000000011000110000000 +01011100000000001000111110001100 +00101000100000000000001110011101 +00101000100000000001001110001100 +00000000000101010000000000000101 +00000000000101010000001110000100 +00101001100000000000000110101100 +00000000000101010000001110100110 +00000000000100000111011011110111 +01010111101100101100101111111111 +00101001101111111111001100110111 +01101100000000000011111011111000 +00000000000101010000001101000100 +01010111101100011001011111111111 +00000000000101010000000010011010 +01011011111111110101100010000000 +00000010101111111111001011100110 +00000000000101010000001100100101 +01010111101100101000001111111111 +00000000000101010000001100100100 +01010011111111110010001111111111 +00000000000100010101111100000110 +00000000000101010000000000000101 +00000000000101010000001110000100 +01010111101100101000111111111111 +00000000000101010000001100010111 +00000000000100010110001011110111 +00000010100000000001110000001100 +00000000000101010000001100111010 +01101111111111110010000110010111 +00000000000100000110001101100100 +00101001101111111111001100111000 +00101001100000000000000010010111 +00000010100000000001000010000100 +01010111110100011101001111111111 +01010011111111110000101111111111 +01101011111111111010001101101100 +00000010100000000001000110001101 +00101000100000000001000110001100 +01010011111111110110011111111111 +01011100000000000011100010000000 +00000010101111111100000001100011 +00000010100000000011000001100100 +00000000000101010000000000001100 +01011000000000000001110010100000 +00000010101111111111100000001100 +01011000000000000001010011000000 +00101010000000000000000010101100 +00101001100000000000000010001100 +00101010000000000000000010101100 +00000000000100101011000000001100 +00000000000101010000000110000100 +00000010100000000100000001100011 +01001100000000000000000000100000 +00000000000101010000000000001100 +01011000000000000001110010100000 +00000010101111111111100000001100 +01011000000000000001010011000000 +00101010000000000000000010101100 +00101001100000000000000010001100 +00101010000000000000000010101100 +00000000000100101011000000001100 +00000000000101010000000110000100 +01001100000000000000000000100000 +01011000000000000011000010000000 +00000010100000111111110000001100 +01101100000000000001110110000101 +00011100000000000000111101101100 +00101000100010111100000110001100 +00000010100000100010100000001101 +00101001100000000000000110001101 +00000010101111111111110000000100 +01001100000000000000000000100000 +00101001000000000000000010000101 +00000010100000000000010000000100 +01001100000000000000000000100000 +00000000000101010000000000000100 +01001100000000000000000000100000 +01101100000000000101010010100100 +00000000000100000001100010101110 +01101100000000000100110010001110 +00000000000101000001100000001111 +00000000000101010000000000001100 +00000010101111111111110110001100 +01011100000000000000100111101100 +01001100000000000000000000100000 +00000000000100000011000111001101 +00101000000000000000000110110000 +00000000000100000001100110001101 +00000000000100000011010010001101 +00101001000000000000000110110000 +01010011111111111110001111111111 +00000000000100000011000010101101 +00101000000000000000000110101110 +00000000000100000011000010001101 +00000010100000000000010110001100 +00101001000000000000000110101110 +01011111111111111110110011001100 +01001100000000000000000000100000 +00000000000101010000000000001100 +01010011111111111111011111111111 +00000010100000000000100000001100 +01101100000000000001110110000100 +00011100000000000000111101101100 +00101000100010011000000110001100 +00000010100000000010010000001101 +00101001100000000000000110001101 +00000010101111111111110000000100 +01001100000000000000000000100000 +00000010100000000000010000000100 +01001100000000000000000000100000 +00000010100000000000100000001100 +01101000000000000110000110000100 +00011100000000000000111101101100 +00101000100010001101000110001100 +00101000100000000000000110001100 +00000010101111111000000001100011 +00101001100000000110000001110111 +00101001100000000101000001111000 +00101001100000000100000001111001 +00101001100000000011000001111010 +00101001100000000111000001100001 +00000000000101010000000011011000 +00000000000101010000000010110111 +00000000000100000001100010111001 +00000010100000000010100000011010 +01011000000000000101110110000000 +01011000000000000101111011111001 +00101010000000000000001011101100 +01011100000000000000110110011010 +00000010100000000011010000000100 +01010100000000011011000000000000 +00101000000000000000001011100100 +00000010100000000000011011110111 +01010100000000011010010000000000 +01010011111111111110001111111111 +00011100000000000000111101101100 +00101000100001110111000110001100 +00000010100000000010010000001101 +00101001100000000000000110001101 +00000010101111111111110000000100 +01001100000000000000000000100000 +00101010000000000000001011101100 +01011100000000000000110110011010 +00000010100000000011010000000100 +01010100000000010110010000000000 +00101000000000000000001011100100 +00000010100000000000011011110111 +01010100000000010101100000000000 +01011111111111111110011100110111 +00101000100000000111000001100001 +00000000000101010000001100000100 +00101000100000000110000001110111 +00101000100000000101000001111000 +00101000100000000100000001111001 +00101000100000000011000001111010 +00000010100000001000000001100011 +01001100000000000000000000100000 +01011100000000000111100010000000 +00011100000000000000111101101100 +00101000100001011111000110001100 +00101000100000000000000110001100 +01011000000000001000000110000000 +00000010101111111000000001100011 +00101001100000000110000001110111 +00101001100000000101000001111000 +00101001100000000100000001111001 +00101001100000000011000001111010 +00101001100000000111000001100001 +00000000000101010000000010111001 +00000000000101010000000011011000 +00000000000101010000000000010111 +00000010100000000010100000011010 +01011000000000000001011011111000 +01010100000000010010100000000000 +00000000000100000101111100101100 +00101001000000000000000110000100 +01011100000000000010010010011010 +00101000100000000111000001100001 +00000000000101010000001011100100 +00101000100000000110000001110111 +00101000100000000101000001111000 +00101000100000000100000001111001 +00101000100000000011000001111010 +00000010100000001000000001100011 +01001100000000000000000000100000 +00000010100000000000011011110111 +01010011111111111100101111111111 +00011100000000000000111101101100 +00101000100001000011000110001100 +00000010100000000010010000001101 +00101001100000000000000110001101 +00000010101111111111110000000100 +01001100000000000000000000100000 +01001100000000000000000000100000 +00011100000000000000111101101100 +00101000100000111100000110001100 +00000010100000000010010000001101 +00101001100000000000000110001101 +00000010101111111111110000000100 +01001100000000000000000000100000 +00000010100000000000100000001100 +01101000000000000001010110000100 +00010100000000000000000001001100 +00101001100000000011000010101100 +00000000000101010000000000000100 +01001100000000000000000000100000 +00011100000000000000111101101100 +00101000100000110000000110001100 +00000010100000000010010000001101 +00101001100000000000000110001101 +00000010101111111111110000000100 +01001100000000000000000000100000 +00000010100000000000100000001100 +01101100000000000001110110000100 +00011100000000000000111101101100 +00101000100000101000000110001100 +00000010100000000010010000001101 +00101001100000000000000110001101 +00000010101111111111110000000100 +01001100000000000000000000100000 +00000000000101010000000000000100 +01001100000000000000000000100000 +00000010100000000000100000001100 +01101100000000000010000110000100 +00011100000000000000111101101100 +00101000100000011110000110001100 +00000010100000000010010000001101 +00101001100000000000000110001101 +00000010101111111111110000000100 +00000000000101010000000010000101 +01001100000000000000000000100000 +00000000000101010000000000000100 +01010011111111111111011111111111 +00011100000000000000111101101100 +00000010100000001110000110001100 +00101000100000000000000110001100 +00101001000000000000000110000100 +01001100000000000000000000100000 +00011100000000000000111101101100 +00000010101110100101000110001100 +00101000100000000000000110001101 +00000010100000000001010110101110 +00101010000000000000000111001100 +00000011010000001000000110001100 +01011011111111111111100110000000 +00101001000000000000000110100100 +01001100000000000000000000100000 +00011100000000000000111101101100 +00000010101110011100000110001100 +00101000100000000000000110001101 +00000010101111111100000001100011 +00000010100000000001010110101110 +00101010000000000000000111001100 +00000011010000000000010110001100 +01011011111111111111100110000000 +00101010000000000000000110100100 +00101001000000000011110001100100 +00101000000000000011110001100100 +00000010100000000100000001100011 +01001100000000000000000000100000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000010101111111100000001100011 +00000000000101010000000010101101 +01011100000000100010000011100000 +00000000000101010000000011101111 +00000000000101010000000011001110 +00000000000101010000000010010001 +01101100000000010000100010100110 +00010100000000000000001000001100 +01101100000000101010100011001100 +00000010100000111111110000001100 +00000000000101010000000011010010 +01101100000000000000110110000110 +00000000010001001010000011010010 +00000010100000000010000000001111 +00011100000000000000111101101100 +00101000101111110100000110001100 +00000000000100000100100110001100 +00101010000000000000000110001100 +00000010100000001000000000010000 +00000000000100000011110110001111 +00000000000100010011111000001100 +01011000000000000001100110000000 +00000000000101110011000110101101 +00000000000101111011110010001111 +00000000000101110011000011001110 +00000000000101110011000010010001 +00000000000101010011010111100101 +00101001100000000011000001101110 +00101010010000000011000001110000 +00000000010001001100000111010010 +00000000010001001100001000101101 +00000000001000011100100010101111 +01011100000000000000101001000000 +00000000001010100000000000000111 +00000000001000010100100010101100 +01011100000000000000101001000000 +00000000001010100000000000000111 +00000000010000001100000111101111 +00000000000101010011010111101101 +00000000000111000011001000001111 +01101100000000000001100110101111 +00000000000100000011100110101101 +00000010101111111111110110010011 +01101000000000000000100110101110 +01101000000001000111000110101111 +00000000000101010000001001101100 +00000000000100010011110110101101 +00000000001000010100100110100100 +01011100000000000000101001000000 +00000000001010100000000000000111 +00000000000111000001001000010000 +00101001100000000011000001110001 +00000000001000011100100110101111 +01011100000000000000101001000000 +00000000001010100000000000000111 +00101010010000000011000001110001 +00000000010000001100000111101111 +00000000000101010100010111101111 +01101100000000000001110111110000 +00000000000100000011110111001111 +00000010101111111111110010001101 +01101000000000000000110111101110 +00000010101111111111100010000100 +01101000000000000000100111110000 +00000000000101010000000110100100 +00000000010000001100000110001100 +00000000000101010000000000000101 +00000000000101010001000110001100 +00000000000101010000000110000100 +00000010100000000100000001100011 +01001100000000000000000000100000 +00000011010000000000000000000000 +01011100000000000001010011000000 +00000010100000000000010000001100 +00000000001000010001100110001110 +01011100000000000000100011000000 +00000000001010100000000000000111 +00010100000000000000001000001100 +01101000000000010111100111001100 +00010100000000100000000000001100 +00000000010001001100000111010010 +00000010100000000100000000001111 +01101000000000000000110111001100 +00000000010001001110000111010010 +00000010100000000110000000001111 +00011100000000000000111101110000 +00101000101110101101001000010000 +00000000000100000100101000010000 +00101010000000000000001000010000 +00000010100000001000000000001100 +00000000000100000011111000001111 +00000000000100010011110110001100 +01011100000000101010000110000000 +00101001100000000011000001101110 +00101010010000000011000001110000 +00000000000100010011100110101101 +00000000010001001100000111010010 +00000010100000000000010000000101 +00000000001000010100100110101100 +01011100000000000000101001000000 +00000000001010100000000000000111 +00000000000111000100000110010011 +00000000001000011100100110101111 +01011100000000000000101001000000 +00000000001010100000000000000111 +00000000010001001100001000101101 +00000000010000001100000111101111 +00000000000101010011010111101101 +01101100000000000001100110110011 +00000000000100000011100110101101 +00000010101111111111110110001111 +01101000000000000000100110101110 +01101000000000110111000110110011 +00000000000101010000000111101100 +00000000000100010100110110101101 +00101001100000000011000001110001 +00000000001000010100100110100100 +01011100000000000000101001000000 +00000000001010100000000000000111 +00000000000111000100000010010001 +00000000001000011100100110110000 +01011100000000000000101001000000 +00000000001010100000000000000111 +00101010010000000011000001101111 +00000000010000001100001000001101 +00000000000101010011110110101111 +01101100000000000001110111110001 +00000000000100000011110111001111 +00000010101111111111110010001101 +01101000000000000000110111101110 +00000010101111111111100010000100 +01101000000000000000100111110001 +00000000000101010000000110100100 +00000000010000001100000110001100 +00000000000101010001000110001100 +00000000000101010000000110000100 +00000010100000000100000001100011 +01001100000000000000000000100000 +00000000000101010000000000000101 +00000000000101010000000000001100 +01101011111111101110000110100111 +00010100000000000000001000001100 +01101000000000000101100011101100 +00010100000000100000000000001100 +00000000010001001100000011101110 +00000010100000000100000000010001 +01101000000000000000110011101100 +00000000010001001110000011101110 +00000010100000000110000000010001 +00011100000000000000111101101111 +00101000101101101101000111101111 +00000000000100000011100111101111 +00101010000000000000000111101110 +00000010100000001000000000010000 +00000000000100000100010111001110 +00000000000100010011101000010000 +01011100000000000111011000000000 +00000000000101010000000000000101 +00000010100000000000010000001100 +01101011111111101001010011101101 +00000000000100101001100010001100 +00000011110000000000010110001100 +01010011111111101000101111111111 +00000011010000000000000000000000 +00000010100000111111110000001100 +00000000000101010000000011101110 +00000000000101010000000000010001 +01101111111111111011100110000111 +00000000010001001010000011101110 +00000010100000000010000000010001 +01010011111111111010111111111111 +00000011010000000000000000000000 +00000010100000111111110000001100 +00000000000101010000000111010010 +01101111111111101001110110001110 +00000000010001001010000111010010 +00000010100000000010000000001111 +01010011111111101001001111111111 +00010100000000100000000000001100 +00000000010001001100000011010010 +00000010100000000100000000001111 +01101011111111010110010011001100 +00000000010001001110000011010010 +00000010100000000110000000001111 +01010011111111010101101111111111 +00000000000101111011100011001100 +00000000000101110100000011100111 +00000000000101010001110110000111 +00101001100000000011000001100111 +00000000000101111011100110101111 +00101010010000000011000001110001 +00000000000101111011100010001110 +00000000000101110100000110101101 +00000000010001001100000011110011 +00000000000101010011010111001101 +00000000001000011100110111101110 +01011100000000000000101001100000 +00000000001010100000000000000111 +00000000001000010100110111110010 +01011100000000000000101001100000 +00000000001010100000000000000111 +00000000010001001100000110101100 +00000000010000001100000111001110 +00000000000101010011000111001110 +00000000000111000100101000101100 +00000000000101110100000011000110 +01101100000000000001110111001100 +00000000000100000001110111001110 +00000010101111111111111001001111 +01101000000000011101010111000111 +01101100000000011101000111001100 +00000010101111111111101001010010 +00000000000100000001110111001110 +00000000000100010011000111001110 +00000000001000010100110111010100 +01011100000000000000101001100000 +00000000001010100000000000000111 +00000000000111000101001000110001 +00101001100000000011000001101101 +00000000001000011100110111001111 +01011100000000000000101001100000 +00000000001010100000000000000111 +00101010010000000011000001101101 +00000000010000001100000111101110 +00000000000101010011010111001101 +01101100000000000001110110110001 +00000000000100000001110110101101 +00000010101111111111111010001100 +01101000000000010111100110100111 +01101100000000010111010110110001 +00000010101111111111101010010100 +00000000000100000001110110101101 +00000000010000001100001001001100 +00010100000000000000000111110010 +00000011101111111111111001010010 +00000000000101010101000110001100 +00000000010001001100000011010011 +00000000010001001100000110001111 +00000000000101001100100110001110 +00000000000101001100100011000110 +00000000000111000001100111010010 +00000000000100010100010110101101 +00000000000111000001100111100110 +00000000000111000100110111001110 +00000000000111000100110111110001 +00000000000100000001100111001110 +00000000010001001100001001001111 +00000000000100000011100111101110 +01101100000000000000110111000110 +00010100000000000000001000001111 +00000000000100000011111000110001 +00000000010001001100000111001111 +00000000000100000100010111101111 +01101000000000010000000110101111 +01011000000000001101110110101111 +00000000000101010000000000000101 +00000000000101010000000110000100 +00000010100000000100000001100011 +01001100000000000000000000100000 +00000011010000000000000000000000 +00000000000101110011000111001110 +00101001100000000011000001101110 +00000000000101111011110110110100 +00101010010000000011000001110000 +00000000000101110011000110101101 +00000000000101111011110010001111 +00000000010001001100000111010010 +00000000000101010011010111101101 +00000000001000010100101010010011 +01011100000000000000101001000000 +00000000001010100000000000000111 +00000000010001001100000110101111 +00000000000101110011000010010001 +00000000001000011100101010001100 +01011100000000000000101001000000 +00000000001010100000000000000111 +00000000010000001100000110001100 +00000000000101010011110110001100 +00000000000111000100111000001111 +01101100000000000001110110001111 +00000000000100000011100110001100 +00000010101111111111111001110100 +01101000000000001010100110001110 +01101100000000001010010110001111 +00000010101111111111101001110011 +00000000000100000011100110001100 +00000000000100010011110110001111 +00000000001000010100100111110100 +01011100000000000000101001000000 +00000000001010100000000000000111 +00000000000111000101001000000100 +00101001100000000011000001101101 +00000000001000011100100111101100 +01011100000000000000101001000000 +00000000001010100000000000000111 +00101010010000000011000001101101 +00000000010000001100000110001100 +00000000000101010011010110001101 +01101100000000000001110110100100 +00000000000100000011100110101101 +00000010101111111111111010001100 +01101000000000000100110110101110 +01101100000000000100100110100100 +00000010101111111111101010010100 +00000000000100000011100110101101 +00000000010000001100001001100101 +00000000000100010001000110101101 +00000000000101010101000010100101 +01010011111111001011101111111111 +00010100000000000000000111101111 +00000011101111111111110111101111 +00000000000101001011110111001110 +00000000000101001011111001010010 +00000000010000001100000111001110 +00000000000101110100000010001101 +00000000000100000100100111001110 +01101111111111110000110110101110 +00000010101111111111110110001100 +00000000000101010000000000000101 +01010011111111110000011111111111 +00000000000101010000000110010100 +01010011111111111100001111111111 +00000000000101010000000110010100 +01010011111111101001011111111111 +00000000000101010000001010010011 +01010011111111110110011111111111 +00000000000101010000000111110010 +01010011111111100011101111111111 +00000010101111111111100110001100 +00000000000100000011100110101101 +01010011111110111001001111111111 +00000011010000000000000000000000 +00000010101111111111100110001100 +00000000000100000011100110101101 +01010011111111001001001111111111 +00000011010000000000000000000000 +00000010101111111100000001100011 +01011100000000011110010011100000 +00000000000101010000000011101111 +00000000000101010000000011001101 +00000000000101010000000010001100 +01101100000000001111110010100110 +00010100000000000000001000001110 +00000000000101010000000010110001 +01101000000000100111100011001110 +00010100000000100000000000001110 +00000000010001001100000011010010 +00000010100000000100000000001111 +01101000000000000000110011001110 +00000000010001001110000011010010 +00000010100000000110000000001111 +00011100000000000000111101110000 +00101000101010100011001000010000 +00000000000100000100101000010000 +00101010000000000000001000010000 +00000010100000001000000000001110 +00000000000100000011111000001111 +00000000000100010011110111001110 +01011000000000000001100111000000 +00000000000101110011100010100101 +00000000000101111011110010001111 +00000000000101110011100011001101 +00000000000101110011100010001100 +00000000000101010001010111110001 +00101001100000000011000001101101 +00101010010000000011000001100100 +00000000010001001100000110110011 +00000000010001001100000110001111 +00000000001000011100111000110000 +01011100000000000000101001100000 +00000000001010100000000000000111 +00000000001000010100111000110010 +01011100000000000000101001100000 +00000000001010100000000000000111 +00000000010000001100001000010000 +00000000000101010011111000001111 +00000000000111000100100010010000 +01101100000000000001000111110000 +00000000000100000011010111101111 +01101000000000000000100111101101 +01101000000001000100000111110000 +00000000000100010100000111101111 +00101001100000000011000001101100 +00000000001000010100110111101100 +01011100000000000000101001100000 +00000000001010100000000000000111 +00000000000111000011000010000100 +00101010010000000011000001110000 +00000000001000011100110111101100 +01011100000000000000101001100000 +00000000001010100000000000000111 +00000000010000001100000110001100 +00000000000101010100000110001100 +01101100000000000001010110000100 +00000000000100000011010110001100 +01101000000000000000110110001101 +01101100000000000000100110000100 +00000000000100000011010110001100 +00000000000100010001000110000100 +00000000000101111011100010000100 +00000000000101010000000000000101 +00000010100000000100000001100011 +01001100000000000000000000100000 +00000011010000000000000000000000 +01011100000000000001010011000000 +00000010100000000000010000001110 +00000000001000010001100111001101 +01011100000000000000100011000000 +00000000001010100000000000000111 +00010100000000000000001000001110 +01101000000000010101100110101110 +00010100000000100000000000001110 +00000000010001001100000110110001 +00000010100000000100000000001111 +01101000000000000000110110101110 +00000000010001001110000110110001 +00000010100000000110000000001111 +00011100000000000000111101110000 +00101000101001100001001000010000 +00000000000100000100011000010000 +00101010000000000000001000010001 +00000010100000001000000000001110 +00000000000100000011111000101111 +00000000000100010011110111001110 +01011100000000010101000111000000 +00101001100000000011000001101101 +00101010010000000011000001110011 +00000000000100010011010010100101 +00000000010001001100000110110010 +00000000001000010100100010101111 +01011100000000000000101001000000 +00000000001010100000000000000111 +00000000000111000100110111110001 +00000000001000011100100010110000 +01011100000000000000101001000000 +00000000001010100000000000000111 +00000000010000001100001000010000 +00000000010001001100000110001111 +00000000000101010011111000001111 +01101100000000000001010111110001 +00000000000100000011010111101111 +01101000000000000000110111101101 +01101100000000000000100111110001 +00000000000100000011010111101111 +00000000000100010100010111101111 +00000000001000010100100111100100 +01011100000000000000101001000000 +00000000001010100000000000000111 +00000000000111000100110010000100 +00101001100000000011000001101100 +00000000001000011100100111101100 +01011100000000000000101001000000 +00000000001010100000000000000111 +00101010010000000011000001110000 +00000000010000001100000110001100 +00000000000101010100000110001100 +01101111111111110001100110000100 +01010011111111110000011111111111 +00000000000101010000000010001101 +01101011111111110001100010100111 +00010100000000000000001000001100 +00000000000101010000000010110000 +01101000000000000110100011101100 +00010100000000100000000000001100 +00000000010001001100000011110001 +00000010100000000100000000001110 +01101000000000000000110011101100 +00000000010001001110000011110001 +00000010100000000110000000001110 +00011100000000000000111101101100 +00101000101000101101000110001100 +00000000000100000100010110001100 +00101010000000000000000110001100 +00000010100000001000000000001111 +00000000000100000011100110001110 +00000000000100010011100111101111 +01011100000000010011000111100000 +01101000000000000000100011100101 +01101000000000000001010010000110 +00000000000100010001100010001101 +00000000000100010001110010100101 +00000000000100101011010010010000 +00000000000100010100000010110000 +00000000000101010000000110100100 +00000000000101010000001000000101 +00000010100000000100000001100011 +01001100000000000000000000100000 +00000011010000000000000000000000 +00000010100000111111110000001100 +00000000000101010000000011110001 +00000000000101010000000000001110 +01101111111111111010100110000111 +00000000010001001010000011110001 +00000010100000000010000000001110 +01010011111111111001111111111111 +00000011010000000000000000000000 +00000010100000111111110000001110 +00000000000101010000000110110001 +01101111111111101011110111001101 +00000000010001001010000110110001 +00000010100000000010000000001111 +01010011111111101011001111111111 +00000010100000111111110000001110 +00000000000101010000000011010010 +01101111111111011001110111000110 +00000000010001001010000011010010 +00000010100000000010000000001111 +01010011111111011001001111111111 +00000000000101110011100110101101 +00101001100000000011000001101101 +00101010010000000011000001110011 +00000000000101111011110010110100 +00000000010001001100000110110010 +00000000001000010100101010010001 +01011100000000000000101001000000 +00000000001010100000000000000111 +00000000000111000100011001110001 +00000000000101110011100010100101 +00000000001000011100101010010000 +01011100000000000000101001000000 +00000000001010100000000000000111 +00000000000101111011110010001111 +00000000000101010001010111101111 +00000000010001001100000111110100 +00000000010000001100001000010000 +00000000000101010101001000010000 +00000000000101110011100010001100 +01101100000000000001011000010001 +00000000000100000011011000010000 +01101000000000000000111000001101 +01101100000000000000101000010001 +00000000000100000011011000010000 +00000000000100010100011000010000 +00000000001000010100101000000101 +01011100000000000000101001000000 +00000000001010100000000000000111 +00000000000111000001011001110001 +00101001100000000011000001101111 +00101010010000000011000001101111 +00000000001000011100101000000101 +01011100000000000000101001000000 +00000000001010100000000000000111 +00000000010000001100000010100101 +00000000000101010011110010101111 +01101100000000000001010111110001 +00000000000100000011010111101111 +01101000000000000000110111101101 +01101100000000000000100111110001 +00000000000100000011010111101111 +00000000000100010100010111100101 +01010011111111100001111111111111 +00000011010000000000000000000000 +00000000000101111011100011001100 +00000000000101110011110011100111 +00000000000101010001110110000111 +00101001100000000011000001100111 +00000000000101111011100010110001 +00000000000101111011100010001100 +00000000000101110011110010100101 +00101010010000000011000001110010 +00000000010001001100000011110000 +00000000000101010001010110000101 +00000000001000011100001000101101 +01011100000000000000101000000000 +00000000001010100000000000000111 +00000000001000010100001000101100 +01011100000000000000101000000000 +00000000001010100000000000000111 +00000000010000001100000110101101 +00000000010001001100000010110001 +00000000000101010100010110101101 +00000000000111000011001001010001 +00000000000101110011110011000110 +00000000000101110011110010000100 +01101100000000000001110110110001 +00000000000100000001110110101101 +00000010101111111111110110010011 +01101000000000010010010110100111 +01101100000000010010000110110001 +00000010101111111111100110001100 +00000000000100000001110110101101 +00000000000100010100010110101101 +00000000001000010100000110110100 +01011100000000000000101000000000 +00000000001010100000000000000111 +00000000000111000101001001010010 +00101001100000000011000001100101 +00000000001000011100000110110001 +01011100000000000000101000000000 +00000000001010100000000000000111 +00101010010000000011000001100101 +00000000010000001100001000110001 +00000000000101010001011000110001 +01101100000000000001111000110010 +00000000000100000001111000110001 +00000010101111111111111010001101 +01101000000000001101001000100111 +01101100000000001100111000110010 +00000010101111111111101010010100 +00000000000100000001111000110001 +00000000010000001100000110001100 +00010100000000000000000111110000 +00000000000101010101000110001101 +00000011101111111111111000010000 +00000000010001001100000011010011 +00000000000100010100101000100101 +00000000000101001100000110110001 +00000000010001001100000110101101 +00000000000101001100000011010000 +00000000000111000100001000110010 +00000000000111000100000110110000 +00000000010001001100001001001100 +00000000000111000100111000110001 +00000000000100000100001000110001 +00000000000111000100110110101101 +00000000000100000100010110001100 +01101100000000000000110110010000 +00010100000000000000001000010000 +00000000000100000100000110101101 +00010100000000000000000111110001 +00000011101111111111111000110001 +00000000010001001100000110010000 +00000000000101001100010110001100 +00000000000101001100011001010010 +00000000010000001100000110001100 +00000000000100000011011000001101 +00000000000100000100100110001100 +01101000000000000011100010101101 +01011000000000000011000010101101 +00000000000100010011000010001100 +00000000000100101011000010000100 +00000000000100010011010010100101 +00000000000100010001000010100101 +00000000000101110011100010100100 +00000000000101111011110110001100 +00000000000101111011110010100101 +00000000000101010011000010000100 +00000010100000000100000001100011 +01001100000000000000000000100000 +00000011010000000000000000000000 +01101111111111111101010010001100 +00000000000100010001100110000110 +00000000000100101001100110010000 +00000000000100000001111000000111 +00000000000101010000000011001100 +00000000000100010001110110101101 +01010011111111111011111111111111 +00000011010000000000000000000000 +00000000000101010000000110110100 +01010011111111110011111111111111 +00000000000101010000001001101100 +01010011111111101110101111111111 +00000000000100000011010111101111 +01010011111110111100001111111111 +00000011010000000000000000000000 +00000011010000000000000000000000 +00010100000000000001111111110000 +00000011101111111111111000010000 +00000010101111111000000001100011 +00000000000101001001011000010011 +00000000000101001001111000010010 +00000000010001001101000011110001 +00101001100000000101000001111000 +00101001100000000100000001111001 +00000000010001001101000010111000 +00000000010001001111010010001101 +00000000010001001111010011010100 +00000000010000001000111001110011 +00000000010000001000111001010010 +00000000010001001111110010111001 +00101001100000000111000001100001 +00101001100000000110000001110111 +00101001100000000011000001111010 +00000000010001001111110011100111 +00000011010111111111111100011000 +00000000000101010100110110110011 +00000000010000001000110010000101 +00000011010111111111111000110001 +00000000000101010100101010010010 +00000000010000001000110011001000 +01011000000000011100011100100111 +00000000000100010100011100010100 +01100100000000010111110000010100 +01011000000000100110011000100000 +00010100000000010000000000001101 +00000010100111111111110000001100 +00000000000101010011011001010010 +01011000000001000101101100001100 +00000000000101010010001001010111 +00000010100000001110000000001100 +00000000000100101101110000010111 +01100000000000000011010110010100 +00000010100000000111110000001100 +01100000000001011000110110010100 +00000010100000001000000000001100 +00000000000101111101000100001101 +00000000000101111101001001001110 +00000000000100010101000110010100 +00000000000101110101001001010111 +00000000000101110101000100010100 +00000000000101010011011011110111 +00000000000100101101000000010100 +00000000000100010011101001110011 +00000000000101010101001011110111 +00000000000100010101110010110111 +00000000000100101101110010101110 +00000000000100010011101001101110 +00010100000000010000000000001100 +00000000000101001011000111001100 +01011000000000101111110110000000 +00010100000000001111111111101101 +00000011101111111111110110101101 +00000000000101001011010111011010 +01011000000000111011001101000000 +00000000000101010000001101000100 +01010100001010011100010000000000 +00000010101111111110000010001111 +00000000000100010011110000001100 +00000000000101110011111101001101 +00000000000101111011001011111010 +00000000000101010011011101011010 +00000000000101110011111011110111 +01100000000000111011000111111000 +00000000000100010110000111111000 +00000010100000000111110000001100 +00000010100000000000011100001111 +01100000000001001101100110001111 +00000010100000001000000000001101 +00000000000100010011110110101101 +00000000000101111011111011101100 +00000000000101110011011011110111 +00000000000101110011011101001101 +00000000000101010011000110101101 +00000000000100101101110000010111 +00000000000101111011111101001110 +00000000000101010000000000011000 +00000000000101010101110110110111 +00000011010000000001111011101100 +01011000000000000010000110000000 +00000011010000000011111011101100 +00000010100000000001000000001101 +01011000000000000001010110001101 +00000010100000000001001011101100 +00000000000100101101110110001101 +00000000000100000011010111001110 +00000000000101010000000110010111 +00010100000000010000000000001100 +00000000000101001011000111001100 +01011000000000100110100110000000 +00000010100000000000011100011000 +00000010100111111111110000001100 +00000011010111111111111100010000 +01011000000000101000011100001100 +00010101111111101111111111101101 +00000011101111111111110110101101 +00000000000101001011010111001101 +00000000010000001111010110101111 +00000000010001001000111011110111 +00000000010000001010010110101101 +00000000000101010101110111101111 +00000000010001001011000110101100 +00010100000000000001111111101101 +00000011101111111111110110101101 +00101000100000000111000001100001 +00000000010000001101001000010000 +00000000000101001011010110001100 +00000000010000001111111100100101 +00000000000101010100000110001100 +00000000000101010001010110001100 +00101000100000000110000001110111 +00101000100000000101000001111000 +00101000100000000100000001111001 +00101000100000000011000001111010 +00000000000101010000000111100100 +00000000000101010000000110000101 +00000010100000001000000001100011 +01001100000000000000000000100000 +01011100000000010000111010000000 +00000010100000000000011100001100 +00000011010111111111100110001100 +01011100000000110000000110000000 +00000000000101010001011001101100 +00000000000101010010001001001111 +01011100000001011000011100000000 +01011000000001010001100110000000 +01011100000001011010110111100000 +00010100001111111111111111101100 +00000011101111111111110110001100 +00000000010000001111011001101110 +00000000000101001001000110001111 +00000000010001001000111001101101 +00000000000101010011100111101111 +01010000000000011101000000000000 +00000000000100010100011100001100 +01100100000000011110110000001100 +01011000000000010100011000100000 +00010100000000010000000000001110 +00000010100111111111110000001101 +00000000000101010011101001010010 +01011000000000101001101100001101 +00000000000101010010001001010111 +00000010100000001110000000001101 +00000000000100101101110000010111 +01100000000000000010110110101100 +00000010100000000111110000001101 +01100100000001000100110110101100 +00000010100000001000000000001110 +00000000000101111011001001001101 +01011000000000000001000110001110 +00000000000100010011000000001100 +00000000000101110011001001010111 +00000000000101010101110100001000 +00000000000100101010000000010111 +00000000000101010011011011110111 +00000000000100000001011011110111 +00000000000100101001011011101110 +00000000000100000100110111001110 +00010100000000010000000000001100 +00000000000101001011000111001100 +01011000000000010100010110000000 +00000010100000000000011100011000 +00000010100111111111110000010000 +00000000000101010000000000001100 +00000000000101010000000000001111 +01011011111111110000011100010000 +00010101111111101111111111101101 +00000011101111111111110110101101 +00000000010001001000011011101100 +00000000000101001011010111001101 +00000011010000000000011011110111 +00000000000101010101110110010111 +00000000010000001111110110101111 +00000000010001001000010110101110 +00000000000101010101110111110111 +01010011111111100111111111111111 +00000011010000000000000000000000 +00000000000101010010001001001100 +01011000000000100101000110000000 +00000010101111111111111010001100 +01011000000001000110100110000000 +00000010100111111111110000001101 +01011000000000011111001010001101 +00000000000101010000000110010100 +01010011111111011001011111111111 +00000000000100010110001000101100 +01011100000000101100111100000000 +00000000000101010001011001101101 +01011000000000111111100110100000 +00000010101111111111110110001101 +01011000000001010100000110100000 +00000010100111111111110000001110 +01011000000000101100010110001110 +00000000000101010000000110101100 +00000000000101010001011001110111 +00000010100000001110000000001101 +00000000000100101101110000010111 +01100000000000000011010110101100 +00000010100000000111110000001101 +01100000000001001011110110101100 +00000010100000001000000000001101 +00000000000101111011001001101110 +00000000000101111011000010110111 +00000000000100010011000110101100 +00000000000101110011001001110011 +00000000000101110011000010101100 +00000000000101010101111001110111 +00000000000100101011000000001100 +00000000000100010011101001010010 +00000000000101010011001011110111 +00000000000100010101110100010111 +00000000000100101101110100001101 +00000000000101010000000011111001 +00000000000101010000001000111000 +00000000000100010011011001001110 +01010011111111010110011111111111 +00000011010000000000000000000000 +00000000000101010010001001001101 +01011000000000111110110110100000 +00000000000100000010000010110111 +00000000000100000100101001110000 +00000000000100101001011011101110 +00000010101111111111110110001101 +00000000000100000011101000001110 +01011000000000110101000110100000 +00000010100111111111110000001110 +01011000000001000111010110001110 +00000000000101010000000110101100 +01010011111111101010011111111111 +00000010100111111111110000001101 +01011000000000000110000110001101 +00000000000100000010000010101000 +00000000000100101001010100001110 +00000000000100000100101001110111 +00000000000100000011101011101101 +00000000010001001000010100001000 +00000000010000001111110110110111 +00000000000101010000000110011000 +00000000010001001000010110101110 +00000000000101010010001011110111 +00000011010000000000000000000000 +00000011010000000001111011101100 +01011111111111010111100110000000 +00000000010001001000111011101111 +00000000010000001111010111001100 +00000000010001001000110111001101 +00000000000101010011000111101111 +00000010100111111111110000001100 +01011000000000001000011100001100 +00010100000000000001111111101110 +00000011101111111111110111001110 +00000011010111111111111100010000 +00000000000101001011100110101100 +01010011111111011010011111111111 +00000010100111111111110000010000 +00000000000101010000000000001100 +00000000000101010000000000001111 +01010011111111011001011111111111 +01011100000000010011000110000000 +00000010100000000000011100001100 +00000011010111111111100110001101 +01011111111111111000000110100000 +00000000000101010001011001101100 +01011000000000100001111100000000 +01011000000000100101010110000000 +00000000000101010010001001010111 +00000000010000001111011001101110 +00010100001111111111111111101100 +01011000000000111111011011100000 +00000011101111111111110110001111 +00000000000101001001000111101100 +00000000000101010011100110001100 +00000010101111111110000000001101 +00000000010001001111010110001110 +00000000000101001011011001101101 +00000000000101010011100110101101 +00000000000101001011110110001100 +00000000010000001111010110101111 +00000000000101010011000111101111 +00000000010001001000110110101101 +00000011010000000000000000000000 +00000000000101010011010111101100 +01011000000001001100100110000000 +00010100000000000001000000001110 +00010100000000000001111111110001 +00000000000101010011100110101100 +00000011101111111111111000101101 +00000010100111111111110000010000 +00000000000101001011010110001100 +01010011111111010001011111111111 +00000000000101010000001011100100 +01010100001001100001100000000000 +00000010100000000111110000001100 +00000010100000000110000010001111 +01100111111111000101000110001111 +00000010101111111110000010011010 +00000000000101110110101011111010 +00000000000101010000000000010111 +01100111111111000101100111111000 +00010101111111101111111111101101 +00000011101111111111110110101101 +00000011010000000001111011101100 +00000000000100010011111100011000 +00000000000101001011011101001110 +01011111111111001000000110000000 +01010011111111110000101111111111 +00010100001111111111111111101100 +00000011101111111111110110001100 +00000000010000001111011001101110 +00000000000101001001000110001111 +00000000010001001000111001101101 +00000000000101010011100111101111 +01010011111111111000011111111111 +00000000000100010010000010110111 +00000000000100010100101001111010 +00000000000100101101110010101101 +00010100000000010000000000001100 +00000000000100010011011101011010 +00000000000101001011001101001100 +01011100000000101001000110000000 +00000000000101010110101011101111 +01011111111110111101010111100000 +00000000000101010000000000001101 +00000000000101010000000000011000 +00000000000101010000000000011001 +01010011111111101101001111111111 +00010100001111111111111111101100 +00000011101111111111110110001100 +00000000010000001111011001101110 +00000000000101001001000110001111 +00000000010001001000111001101101 +00000000000101010000001010011000 +00000000000101010011110111001111 +01010011111111101010101111111111 +00000000000100010110001000101100 +01011100000000010010101100000000 +00000000000101010001011001101101 +01011000000000110110000110100000 +00000010101111111111110110001101 +01011000000000010111010110100000 +00000010100111111111110000001110 +01011000000000010010000110001110 +00000000000101010000000110101100 +00000000000101010001011001110111 +00000010100000001110000000001101 +00000000000100101101110000010111 +01100000000000000011010110101100 +00000010100000000111110000001101 +01100000000000110110100110101100 +00000010100000001000000000001101 +00000000000101111011001001101110 +00000000000101111011000010110111 +00000000000100010011000110101100 +00000000000101110011001001110011 +00000000000101110011000010101100 +00000000000101010101111001110111 +00000000000100101011000000001100 +00000000000100000011101001010010 +00000000000101010011001011110111 +00000000000100000010001011110111 +00000000000100101010001011101101 +00000000000101010000001000111000 +00000000000100000100100110101110 +01010011111111001100111111111111 +00000011010000000000000000000000 +00010100000000010000000000001110 +00000010100111111111110000001101 +00000000000101010011101001110011 +01011111111111010100101000101101 +00010100001111111111111111101100 +00000011101111111111110110001100 +00000000010000001111011001001111 +00000000000101001001100110001100 +00000000010001001000111001001101 +00000000000101010000000011111001 +00000000000101010011000111101111 +01010011111111101000011111111111 +00000010101111111000011100011000 +00000010100000001000000000001101 +00000000000101111110001101001100 +01011000000000000001000111101101 +00000000000100010011110000001111 +00000000000101110011111101011010 +00000000000101010110101011110111 +00000000000100101101110000010111 +00000000000101010000000000001110 +00000000000101010000000000011000 +00000000000101010011001011110111 +01010011111111011011011111111111 +00000010100000001000000000001101 +00000000000101111101001001001100 +01011000000000000001001010001101 +00000000000100010101000000010100 +00000000000101110101001001010111 +00000000000101010101110100001000 +00000000000100101010000000010111 +00000000000101010011001011110111 +01010011111110101000001111111111 +01011000000000100001110110000000 +00000000000101010010001001001100 +01011100000000100011010110000000 +00010100001111111111111111101100 +00000011101111111111110110001100 +00000000010000001111011001101111 +00000000000101001001000110001100 +00000000010001001000111001101101 +00000000000101010011000111101111 +01010011111111011000101111111111 +00000011010000000000000000000000 +00010100000000010000000000001110 +00000010100111111111110000001101 +00000000000101010011101001110011 +01011111111111101110111000101101 +00010100001111111111111111101100 +00000011101111111111110110001100 +00000000010000001111011001001111 +00000000000101001001100110001100 +00000000010001001000111001001101 +00000000000101010011000111101111 +01010011111111011101101111111111 +00000011010000000000000000000000 +00000010100000001000000000001101 +00000000000101111011000100001110 +00000000000101111011001001001111 +00000000000100010011000110101100 +00000000000101110011001001010111 +00000000000101110011000100001100 +00000000000101010011101011110111 +00000000000100101011000000001100 +00000000000100000011111001110011 +00000000000101010011001011110111 +01010011111110111011001111111111 +00000000000100000010000010110111 +00000000000100000100101001110000 +00000000000100101010001011101101 +00000000000100000011011000001110 +00010100000000010000000000001100 +00000000000101001011000111001100 +00000010100000000000010000011000 +01011011111111001110100110000000 +00000010100000000000100000011000 +01010011111110111011011111111111 +00010100001111111111111111101110 +00000011101111111111110111001110 +00000000010000001111011001001111 +00000000000101001001100111000110 +00000000010001001000111001001101 +00000000000101010000000011111001 +00000000000101010000000110011000 +00000000000101010001100111101111 +01010011111111001101011111111111 +00000000000101010000000000001101 +00000000000101010000000000011001 +01011011111111001101000111100000 +00010100001111111111111111101100 +00000011101111111111110110001100 +00000000010000001111011001001111 +00000000000101001001100110001100 +00000000010001001000111001001101 +00000000000101010000000011111001 +00000000000101010011110110001111 +01010011111111001011001111111111 +00000000000100010010000010110111 +00000000000100010100101001110000 +00000000000100101101110010101110 +00000010100000000000010000011000 +00000000000100010011101000001110 +01010011111110010111011111111111 +00000011010000000000000000000000 +00010100001111111111111111101110 +00000000000101010000000110011000 +00000011101111111111110111001100 +00000000010000001111011001110000 +00000000000101001001000110001111 +00000000010001001000111001101101 +00000000000101010100000111101111 +01010011111111000110111111111111 +01011100000000001010010110000000 +01011111111111100100110111100000 +00000000000101010000000000011001 +00000000000101010000001000001101 +00000010101111111111110000001111 +01010011111111001110011111111111 +00000000000100010001010100010111 +00000000000100010100111001010000 +00000000000100101101110100001101 +00000000000101010000000011111001 +00000000000100010011011000011010 +01010011111110010011101111111111 +00000000000100010010000010110111 +00000000000100010100101001101101 +00000000000100101101110010101110 +00010100000000010000000000001100 +00000000000100010011100110101110 +00000000000101001011000111001100 +01011000000000010000100110000000 +00000000000100010001010100010111 +00000000000100010100111001010000 +00000000000100101101110100001101 +00000000000101010000000011111001 +00000000000100010011011000001110 +01010011111110010110011111111111 +00000010100000001000000000001110 +00000000000101111011001001101101 +01011000000000000001000110001110 +00000000000100010011000000001100 +00000000000101110011001001110011 +00000000000101010100110010100101 +00000000000100101001010000010111 +00000000000101010011011011110111 +01010011111110110101001111111111 +00010100001111111111111111101100 +00000011101111111111110110001100 +00000000010000001111011001101111 +00000000000101001001000110001100 +00000000010001001000111001101101 +00000000000101010011000111101111 +01010011111111000101001111111111 +00000000010000001111011001101110 +01011100000000001110000111100000 +00010100001111111111111111101100 +00000011101111111111110110001100 +00000000000101001001000110001100 +00000000010001001000111001101101 +00000000000101010011100110001111 +01010011111111000011001111111111 +00000000000100010001010100010111 +00000000000100010100111001010000 +00000000000100101101110100001101 +00000000000101010000000011111001 +00000010100000000000010000011000 +00000000000100010011011000001110 +01010011111110000111001111111111 +00010100001111111111111111101100 +00000011101111111111110110001100 +00000000010000001111011001001111 +00000000000101001001100110001100 +00000000010001001000111001001101 +00000000000101010011110110001111 +01010011111110110111101111111111 +00000011010000000000000000000000 +00000000000100000010000010110111 +00000000000100000100101001110000 +00000000000100101001011011101101 +00010100000000010000000000001100 +00000000000100000011011000001110 +00000000000101001011000111001100 +01011011111110110011100110000000 +00010101111111101111111111101100 +00000011101111111111110110001100 +00000010100000000000010000011000 +00000000000101001011000111001110 +01010011111110110010011111111111 +00010100001111111111111111101110 +00000000000101010000000110011000 +00000011101111111111110111001100 +00000000010000001111011001001111 +00000000000101001001100110001100 +00000000010001001000111001001101 +00000000000101010011110110001111 +01010011111110110001111111111111 +00000000000101010011101011101111 +01011111111110101111110111100000 +00000000000101010000000000001101 +00000000000101010000000000011001 +01010011111110110001001111111111 +00000010100000001000000000001110 +00000000000101111011001001101101 +01011000000000000001000110001110 +00000000000100010011000000001100 +00000000000101110011001001110011 +00000000000101010100110010100101 +00000000000100101001010000010111 +00000000000101010011011011110111 +01010011111111001010011111111111 +00010100001111111111111111101111 +00000010101111111110000000001100 +00000011101111111111110111101111 +00000000000101001011001001101101 +00000000000101001001000111101100 +00000000000101010011100110001100 +00000000010001001111010110001110 +00000000000101001011110110001111 +00000000000101010011100110101100 +00000000010000001111010110001110 +00000000010001001000110110001101 +00000000000101010011100111101111 +01010011111110110011101111111111 +00000000000101010000000000001111 +00000010100111111111110000010000 +00000000000101010000000000001100 +01010011111110000101111111111111 +00000011010000000000000000000000 +00000010101111110000000001100011 +00101001100000001101000001111000 +00101001100000001010000001111011 +00010100000000000001111111111000 +00000000000101010000000010011011 +00000000010001001101000010100100 +00101001100000001000000001111101 +00000011101111111111111100011000 +00101001100000001111000001100001 +00101001100000001110000001110111 +00101001100000001100000001111001 +00101001100000001011000001111010 +00101001100000001001000001111100 +00101001100000000111000001111110 +00000011010111111111110010000100 +00000000000101001001011100011000 +00000000010001001111110010111101 +01011000000000100001110010000000 +00000010100111111111110000001100 +01011000000000100110110010001100 +00000000010001001111011101111100 +00000000010000001000111100011000 +00010100000000010000000000001101 +00000000000101010110001110011000 +00000000010000001000111101111010 +00000010101100000000010010011001 +00000000000101010000000000011011 +00000000000101010000000000011110 +00000000000101010011011100011100 +00010100000000000001111111110111 +00000000010001001101000011101111 +00000011101111111111111011110111 +00000011010111111111110111101111 +00000000010001001111110011111000 +00000000000101001001111011110111 +01011000000000011000010111100000 +00000010100111111111110000001100 +01011000000000000101000111101100 +00000000010000001000111011100100 +00000000010001001111010011010111 +00010100000000010000000000000111 +00000010101100000000010111101111 +00000000000101010001001011110111 +00000000010000001000110011010001 +00000000000100010011111100111001 +00000000000101010000000000001101 +00000000000101010001111011110111 +00000010100000000011110000001100 +00000000000101011110001110110000 +01101000000000101001010110011011 +00011100000000000000111101001111 +00000010101000010000000111101111 +00000000010000001000101101101110 +00000000000100000011100111101110 +00101000100000000000000111001100 +00000000000100000011000111101111 +01001100000000000000000111100000 +00000000000101010001101011110001 +00000010101000000000011100111001 +01011100000000011110101000100000 +00000011100000000000101101111011 +00000000000101010000000000010111 +00000010100000000000100000001101 +01010011111111111100001111111111 +00000000000101010000001110110000 +00000010100111111111110000001111 +00000000000101010000000000001100 +00000000000101010000000000011010 +00010100000000000001111111101110 +00000011101111111111110111001110 +00101000100000001111000001100001 +00000000010000001101000111101111 +00000000000101001011100110001100 +00000000010000001111111000010000 +00000000000101010011110110001100 +00000000000101010100000110001100 +00000000000101010000001101000100 +00101000100000001110000001110111 +00101000100000001101000001111000 +00101000100000001100000001111001 +00101000100000001011000001111010 +00101000100000001010000001111011 +00101000100000001001000001111100 +00101000100000001000000001111101 +00101000100000000111000001111110 +00000000000101010000000110000101 +00000010100000010000000001100011 +01001100000000000000000000100000 +00000000000101010000001100011101 +00000000000101010000001011111100 +00000000000101010000001000111010 +00000000000101010000000110111110 +00000010100000000000100000001100 +01011011111111111000111111001100 +00000010100000000000110000001100 +01011000000001101001011111001100 +00000010100000000000010000001100 +00000010100011111111111100110011 +00000000000101010000001110110000 +01011000000000000111011111001100 +01100100000000000101100000010011 +00000011010000000001111101001100 +01011100000001001111110110000000 +00000000010001001000111101001110 +00010100000000100000000000001100 +00000000000101001011001110001100 +01011000000000000001010110000000 +00010101111111011111111111101100 +00000011101111111111110110001100 +00000010100100000000001100110011 +00000000000101001011001110011100 +00000010100111111111100000001101 +00000010100111111111110000001111 +00000000000101010000000000001100 +00000000000101010000000000011010 +01100011111111110100010110110011 +00000000010000001111011110011010 +00000000010000001010011110001101 +00000011010111111111111001101111 +00000000000101010011101101011010 +00000000010001001011000110101100 +01010011111111110010111111111111 +01011000000001001110111001100000 +00000010100000000000010000001100 +00000010100000001110000000001101 +00000000000100010100110110001100 +01100100000001010110100110101100 +00000011010000000000000000000000 +00000000000101010000000000001111 +00000000000101010000000000001100 +00000000000101010000000000011010 +01010011111111110000011111111111 +00000000000101010001101011110001 +01011000000000001110011000100000 +01011000000000111101111011100000 +00000000000101010000001011100100 +00101001100000000010000001100110 +01010100000111110011110000000000 +00101000100000000010000001100110 +00000010101111111101010010001101 +00000010100000000111010000001100 +00000010101111111110000010010001 +00000000000100010011010110001100 +00000000000101110100011011110111 +00000000000101110100010011010001 +00000000000101111011000011000110 +00000000000101010101110011010111 +00000000000100000110010010000100 +00000000000101010000000000001101 +00000010100011111100110010011001 +01010011111111100110011111111111 +00000011010000000000000000000000 +00000000000101010110111100011100 +01011000000000001000001110000000 +00101001100000000011000001100111 +00101001100000000010000001100110 +01011000000000110101011100000000 +00000000000101010000001100000100 +01010100000111101110100000000000 +00101000100000000010000001100110 +00101000100000000011000001100111 +00000010101111111101010010001110 +00000010100000000111010000011100 +00000010101111111110000010001101 +00000000000100010011101110011100 +00000000000101110011011100011000 +00000000000101110011011101111010 +00000000000101111111001101101101 +00000000000101010110000110111100 +00000010101100000011010000011001 +00000000000101010000000000011011 +00000000000101010000000000011110 +00000000000100010001001100111001 +01010011111111011100001111111111 +00000000000101010110111100011100 +01011100000000000100111110000000 +00000000000101010000000000011010 +00000010100000000010000000011011 +00000010100111111111110000011001 +00000010100000000000100000011110 +01010011111111011010011111111111 +00000011100000000000111101111011 +00000000000101010000000011010001 +00000010100000000000110000001101 +01010011111111011101111111111111 +00000000000101010000000000011010 +00000010100000000001000000011011 +00000000000101010000000000011001 +00000010100000000000010000011110 +01010011111111011000001111111111 +00000011100000000000011101111011 +00000000000101010000000000010111 +00000010100000000000010000001101 +01010011111111011011101111111111 +00000000000101010000001101111010 +00000000000101010000001100011100 +00000010100000000011000000011011 +00000010100111111111110000011001 +00000010100000000000110000011110 +01010011111111010101101111111111 +00010100000000000001111111101101 +00000000000101010000000000010000 +00000010101111111111110000011010 +00000011101111111111110110101100 +00000010100111111111110000001111 +01010011111111011101111111111111 +00010100000000000001000000001101 +00010100000000000001111111101110 +00000000000101010011011110001100 +00000011101111111111110111001101 +00000000000101010000001110110000 +00000000000101001011010110001100 +00000010100111111111110000001111 +01010011111111011011111111111111 +01101000000000110000101011111100 +01011000000000101111111011111100 +00000010101111111111111100111001 +00000000000101010000001110011000 +00000000000101010000000000010010 +00000000010001001110001000101100 +00000000010000001010001011110111 +00000000000101010101110110010111 +00101001100000000010000001110111 +00101010010000000010000001100100 +00000000010001001100001011110100 +00000000010001001100001101001110 +00000000001000011101001100010011 +01011100000000000000101010000000 +00000000001010100000000000000111 +00000000001000010101001100001111 +01011100000000000000101010000000 +00000000001010100000000000000111 +00000000010000001100001001101100 +00000000000101010011000111001110 +00000000000111000011110010001100 +00000000010000001010001000110001 +01101100000000000010000111001100 +00000000000100000101110111001110 +00000010101111111111110111101101 +01101000000000111001010111010111 +01101100000000111001000111001100 +00000010101111111111100111101111 +00000000000100000101110111001110 +00000011010000000000000000000000 +00000000000100010011000111001110 +00000000001000010101000111011000 +01011100000000000000101010000000 +00000000001010100000000000000111 +00000000000111000110000010001101 +00101001100000000010000001111010 +00000000001000011101000111001100 +01011100000000000000101010000000 +00000000001010100000000000000111 +00101010010000000010000001111010 +00000000010000001100000110001110 +00000000000101010011101101001110 +01101100000000000010000111001101 +00000000000100000101110111001110 +00000010101111111111111100001100 +01101000000000110100110111010111 +01101100000000110100100111001101 +00000010101111111111101100011000 +00000000000100000101110111001110 +00000011010000000000000000000000 +00000000010000001100000111101111 +00010100000000000000000111110011 +00000000000101010110000111111100 +00000011101111111111111001101111 +00000000000101001011111110010011 +00000000010001001100001000100101 +00000000000100010011010111011010 +00000000000111000100110010101100 +00000000010001001100001110001101 +00000000000101001011111000101111 +00000000000111000011111001100110 +00000000000111000011110110100111 +00000000010001001100000011001110 +00000000000100000001110110001100 +00000000000111000001010110110011 +00000000000100000011000111001100 +01101100000000000000110110000111 +00010100000000000000001000001101 +00000000000100000011011001110011 +00010100000000000000000111101110 +00000011101111111111110111001110 +00000000010001001100000110001101 +00000000000101001011100110001100 +00000000000101001011100011000110 +00000000010000001100000110001100 +00000000000100000100110110101101 +00000000000100000001100110001100 +01101000000000011010011101001101 +01011000000000011001101101001101 +00000000000100010011001001001100 +00000000000100010011011101001110 +00000000000100101011001001001101 +00000000000100010011010111001110 +00000010100011111111111100110011 +01011000000000100001001011101110 +00000000001000010101000111001101 +01011100000000000000101010000000 +00000000001010100000000000000111 +00000000000111000011010010000110 +00000000001000011101000111010010 +01011100000000000000101010000000 +00000000001010100000000000000111 +00000000010001001100000110001110 +00000000010000001100001001010010 +00000000000101010100100111001110 +01101100000000000001110111000110 +00000000000100000101110111001110 +00000010101111111111110110110010 +01101000000000101111100111010111 +01101100000000101111010111000110 +00000010101111111111100110101101 +00000000000100000101110111001110 +00000000000100010001100111001110 +00000000001000010101000111011010 +01011100000000000000101010000000 +00000000001010100000000000000111 +00000000000111000110100010000100 +00101001100000000010000001101100 +00000000001000011101000111010010 +01011100000000000000101010000000 +00000000001010100000000000000111 +00101010010000000010000001101100 +00000000010000001100001001001110 +00000000000101010011100110001100 +01101100000000000010000110000100 +00000000000100000101110110001100 +00000010101111111111111101001110 +01101000000000101010010110010111 +01101100000000101010000110000100 +00000010101111111111101101011010 +00000000000100000101110110001100 +00000011010000000000000000000000 +00000000010000001100000110101101 +00000000000101010110100110111010 +00101001100000000010000001111010 +00101010010000000010000001101101 +00000000010001001100001101001110 +00000000000111000011110111010010 +00000000000100010001000110001100 +00000000000111000011100010101110 +00000000000111000011110110101111 +00000000000111000011010010100101 +00000000010001001100000111101101 +00000000000100000100100010100101 +00000000000100000001010110101101 +01101100000000000000110110110010 +00010100000000000000001000010010 +00000000000100000100100111001110 +00010100000000000000000111110100 +00000011101111111111111010010100 +00000000010001001100000110110010 +00000000000101001101000110101101 +00000000000101001101000111101111 +00000000010000001100000110101101 +00000000000100000011101001001110 +00000000000100000011110110101101 +01101100000000001101100110001110 +00000000000100000011001011101100 +00000010101111111111111101001111 +01101000000000100101110110010111 +01101000000000100011000110001110 +01011000000000100111110110001110 +00000000000101010000000111111010 +00000011100000000000011101011010 +01010011111110111101001111111111 +00000000000101010000001101100100 +01010100000110111001100000000000 +00000010101111111110000010001101 +00000010100000000101010010001110 +00000010100000000111000000001111 +00000000000101010000000000011010 +00000010100000001000000010000100 +00000000000101110011011101111100 +00101000100000000010000001100110 +00101000100000000011000001100111 +01100011111111001011100111101110 +01010011111111001001101111111111 +00000000000101010000000011000100 +00101001100000000010000001100110 +01010100000110110110010000000000 +00000010100000000101010010001101 +00000010100000000111000000001100 +00000000000101010000000010000111 +00101000100000000010000001100110 +00000010100000001000000010000100 +01100111111111000001110110001101 +00000010101111111110000011100111 +00000000000101010000000000010001 +00000000000101110001110011010111 +01010011111111000010101111111111 +01101111111111100110111001001100 +00000011010000000000000000000000 +00000000000100000100011001010010 +00000000000100101100011001001110 +00000000000100000101110111001110 +00000000000100000011101101011010 +00000010101111111111111110010011 +01101100000000000100001011111010 +01101000000000010110111101001101 +01011000000000010110010110111010 +00000000000101010000001001111100 +01010011111111100100001111111111 +01101011111111010000101101010001 +00000011010000000000000000000000 +00000000010000001111111110001111 +00000000010001001000011101001101 +00000000010000001111111101010010 +00000000010001001000011110011000 +00000000000101010011010111111010 +01010011111111001111101111111111 +01011111111111110100010110001110 +01011011111110110001010110100000 +01010011111111110010011111111111 +01011111111111111100111011111010 +01101111111111111100001001010001 +00000000000101010000001001111100 +01010011111111100000011111111111 +00000011010000000011111101001100 +00000010100000000001000000001101 +01011011111110110000000110001101 +00000010011111111111001101001100 +00000010100000000001001101001101 +00000011110000000000010110001100 +00000000010001001000110110101110 +00000000000100000011001110011100 +01010011111110101110111111111111 +00000000000101010000000000001110 +00000010100000000000010000001100 +01100011111111111111000000010011 +00000010101111111111110000011010 +01011111111110110010011001100000 +00000010101100000000010000011001 +00000010101111111111110000011010 +00000010100000000000010000001100 +00000010100100000111101100100100 +00000000000101111011001101010001 +00000000000101110001001110011000 +00000000000101110001001101011010 +00000000000101010100011100010001 +00000000000100101110100000011010 +00000000000101010110101000110001 +00000000000101111011001110001110 +00000011010000000001111000101100 +01011000000000000010000110000000 +00000011010000000011111000101100 +00000010100000000001000000001101 +01011000000000000001010110001101 +00000010100000000001001000101100 +00000000000100101100010110001101 +00000000000100000011010111001110 +00000000000101010000000110010001 +00010100000000010000000000001101 +00000000000101001011010111001101 +00000010100000000000010000001111 +00000000000101010000000000001100 +00000000000101010000000000011010 +01011111111110011110000110100000 +00000000010000001010010111001101 +00000000010001001011000110101100 +00000000010000001111010111001110 +00000000010001001000111000111010 +00000000000101010000000000001111 +00000000000101010011101101011010 +01010011111110011100011111111111 +00000000000101010000000110101111 +01010011111111000111111111111111 +00000000000101010000000110011000 +01010011111111001100011111111111 +00000010100000000111110000001101 +01100111111111110111010110101100 +00000010101111111000010000010001 +00000000000100010100111000110001 +00000010100000001000000000001101 +00000000000101111100011110010001 +01011000000000000001000110001101 +00000010100100001111101100101101 +00000000000101110011011110001101 +00000000000101010011011101011010 +00000000000100101110100000011010 +00000000000101010100011101010001 +00000011010000000001111000101110 +00000000000101010000000000001100 +01011011111111111010100111000000 +00000011010000000011111000101100 +00000010100000000001000000001101 +00000000000101010000000000001110 +01011111111111110110010110001101 +01010011111111111000101111111111 +01101111111111101010001001001100 +00000000000100000100011001010010 +00000000000100101100011001001110 +00000000000100000101110111001110 +00000010101111111111101110011100 +00000000000100000011101101011010 +01010011111111001100111111111111 +00000011010000000000000000000000 +00000000000101010000000111011010 +01010011111111010110111111111111 +00000000000101010000001001001101 +01010011111111010001011111111111 +00000000010000001000011000110010 +00000000000100101100011001001111 +00000000000100000101110111110111 +00000010101111111111101101011010 +00000000000101010000001001010001 +00000000000100000101110110001100 +01011111111111011100010110001110 +01011011111110011001011000101101 +00000011100000000000011101011010 +01010011111110011000111111111111 +00000000000101010000000111111010 +01010011111111111110111111111111 +00010100000000000001000000001110 +00010100000000000001111111101101 +00000000000101010011101110001100 +00000011101111111111110110101101 +00000000000101010000001110110000 +00000000000101001011010110001100 +00000010100111111111110000001111 +01010011111110001110011111111111 +01101011111111111011001000101101 +00000000000101010000000111111010 +01010011111111111100011111111111 +00000011010000000000000000000000 +00000000010001001101000010101101 +00010100000000000001111111101100 +00000011101111111111110110001100 +00000000010001001101000011101110 +00000011010111111111110110101101 +00000010100111111111110000001111 +00000000000101001001010110010001 +00000000000101010000000010010000 +00000000000101001001110110001100 +00000000000101010000000010010010 +00000000010001001111110010100101 +00000000000101010000000011010011 +00000011010111111111110111001110 +00000000010001001111110011100111 +01011000000000000001100110101111 +00000010100000000000010000000100 +01011000000000000000110111001111 +01011100000000000000100110101110 +01011000000000000010001000101100 +01001100000000000000000000100000 +00000000000101010001001000101111 +00000010100000000000010000000100 +01011111111111111111010111100000 +01011111111111111111000111001101 +00000000000101010001100110001100 +01011111111111111110100110000000 +00000010100000000000010000000100 +01011111111111111110001001010011 +00000000000101010000000000000100 +01011011111111111101100010100111 +00000010100000000000010000000100 +01011111111111111101000110100000 +00000000000101010100001000110000 +00000000000100101100000000000100 +01001100000000000000000000100000 +00000011010000000000000000000000 +00000000010001001101000010101101 +00010100000000000001111111101100 +00000011101111111111110110001100 +00000000010001001101000011101110 +00000011010111111111110110101101 +00000010100111111111110000001111 +00000000000101001001010110010000 +00000000000101010000000010010001 +00000000000101001001110110001100 +00000000010001001111110010100101 +00000000000101010000000011010010 +00000011010111111111110111001110 +00000000010001001111110011100111 +01011000000000000110000110101111 +01011000000000000011100111001111 +01011100000000000110010110100000 +00000000000101010001001000000100 +00000010010000000000010010001111 +01011100000000000000110111000000 +00000000000101010001100110000110 +01011000000000000110000011000000 +01011100000000000011010111100000 +01011000000000000110100010100111 +00000010101111111111110010100111 +00000011010000000000100011100111 +00000010101111111111110011100111 +00000000000101010000000011100100 +01001100000000000000000000100000 +00000000000101010001100110000110 +01011100000000001000010011000000 +01011111111111111110000110100000 +00000000000101010001001000000100 +00000010010000000000010010001111 +01011011111111111101010111100000 +01011111111111111110000011100000 +00000010101111111111110000000111 +01010011111111111101101111111111 +00000000000101010001001000001111 +01011100000000000110000111100000 +01011011111111111101010111001101 +01011111111111111011100111000000 +00000000000101010001100110000110 +01011111111111111011000011000000 +01010011111111111011001111111111 +00000000000101010000000000000111 +01011011111111111011010010000000 +01010011111111111010011111111111 +00000011010000000000000000000000 +01100000000000000010010111001101 +01100011111111111100010110101110 +01101000000000000011100110010000 +01011000000000000100011000001100 +00000000000101010000000000000111 +01101111111111111001011000001100 +01011011111111111011010010100000 +00000000000101010000000010100111 +01010011111111111000101111111111 +00000010010000000000010011100111 +00000000000100010001110000000111 +00000011010000000000100011100111 +00000010101111111111110011100111 +01010011111111110111011111111111 +00000010101111111111100000000111 +01010011111111110110111111111111 +00000010101111111111110010100101 +00000011010000000000100010100111 +00000010101111111111110011100111 +01010011111111110101111111111111 +01101011111111111111001001010001 +00000000000101010000000000000111 +01101111111111110101001000110010 +01010011111111111011111111111111 +00000000010001001101000010101101 +00010100000000000001111111101100 +00000011101111111111110110001100 +00000000010001001101000011101110 +00000011010111111111110110101101 +00000010100111111111110000001111 +00000000000101001001010110010000 +00000000000101010000000010010001 +00000000000101001001110110001100 +00000000010001001111110010100101 +00000000000101010000000011010010 +00000011010111111111110111001110 +00000000010001001111110011100111 +01011000000000000010110110101111 +01011000000000000011010111001111 +01011100000000001000010110100000 +00000000000101010001001000000100 +00000010010000000000010010001111 +01011100000000000011100111000000 +00000000000101010001100110000110 +01011100000000000011000011000000 +00000000000101010000000000000111 +01011000000000000100110010000000 +01010000000000000010110000000000 +00000000000101010001001000001111 +01011100000000000011110111100000 +01011100000000000101100111001101 +00000000000101010001100110000110 +01011100000000000011000011000000 +01011100000000000001000110100000 +00000000000101010001001000000100 +00000010010000000000010010001111 +01011100000000000011000111100000 +01011000000000000100110010100111 +00000010101111111111110010100111 +00000011010000000000100011100111 +00000010101111111111110011100111 +00000000000101010000000011100100 +01001100000000000000000000100000 +00000011010000000000000000000000 +00000010100000000000100000000111 +00000000000101010000000011100100 +01001100000000000000000000100000 +00000011010000000000000000000000 +01011111111111111111010011100000 +00000010101111111111110000000111 +01010011111111111110111111111111 +00000011010000000000000000000000 +01011111111111111100010111000000 +00000000000101010001100110000110 +01011111111111111011110011000000 +01010011111111111011111111111111 +01100100000000000001100111001101 +00000010010000000000010011100111 +00000000000100010001110000000111 +00000011010000000000100011100111 +00000010101111111111110011100111 +01010011111111111100001111111111 +01100011111111111100100110101110 +01101000000000000001110110010000 +01011000000000000010101000001100 +00000000000101010000000000000111 +01101111111111111010111000001100 +01011011111111111011100010100000 +00000000000101010000000010100111 +01010011111111111010001111111111 +00000010101111111111110010100101 +00000011010000000000100010100111 +00000010101111111111110011100111 +01010011111111111001001111111111 +01101011111111111111001001010001 +00000000000101010000000000000111 +01101111111111111000011000110010 +01010011111111111101101111111111 +00000011010000000000000000000000 +00000011010000000000000000000000 +00000010101111110000000001100011 +00101001100000001110000001110111 +00000000010001001101000010101101 +00010100000000000001111111110111 +00101001100000001101000001111000 +00101001100000001000000001111101 +00000011101111111111111011110111 +00101001100000001111000001100001 +00101001100000001100000001111001 +00101001100000001011000001111010 +00101001100000001010000001111011 +00101001100000001001000001111100 +00101001100000000111000001111110 +00000011010111111111110110101101 +00000000000101010000000010011000 +00000000010001001111110010111101 +00000000000101001001011011110111 +01011000000000010100010110100000 +00000010100111111111110000001100 +01011000000000100000010110101100 +00000000010000001000111011100100 +00000000010001001111011100010111 +00010100000000010000000000000101 +00000000000101010001001011110111 +00000000010000001000111100011010 +00000010101100000000010110111011 +00000000000101010000000000011001 +00000000000101010000000000011100 +00000000000101010001011011110111 +00010100000000000001111111111000 +00000000010001001101000011101101 +00000011101111111111111100011000 +00000011010111111111110110101101 +00000000010001001111110011111110 +00000000000101001001111100011000 +01011000000000010111010110100000 +00000010100111111111110000001100 +01011000000000000101010110101100 +00000000010000001000111100000100 +00000000010001001111010011011000 +00010100000000010000000000000111 +00000010101100000000010110101101 +00000000000101010001001100011000 +00000000010000001000110011010000 +00000000000100000011011101111011 +00000000000101010000000000010010 +00000000000101010001111100011000 +00000010100000000011110000001100 +00000000000101011111101110101111 +00000010100000000000011101110001 +01101000000000100100000110011001 +00011100000000000000111100101110 +00000010101101010111000111001110 +00000000010000001000101100111001 +00000000000100000110010111011001 +00101000100000000000001100101100 +00000000000100000011000111001110 +01001100000000000000000111000000 +00000000000101010001101100010000 +00000010100111111111111101111011 +01011100000000011100101000000000 +00000011100000000000101100111001 +00000000000101010000000000011000 +00000010100000000000100000010010 +01010011111111111011111111111111 +00000000000101010000001111001111 +00000000000101010000001100010111 +00000000000101010000001000011010 +00000000000101010000001001011100 +00000010100000000000100000001100 +01011000000000010101101110001100 +00000010100000000000110000001100 +01011000000001010110101110001100 +00000010100000000000010000001100 +01011100000000111011011110001100 +00000000000101010000000000001101 +00000000000101010000000000010111 +00000000000101010000000000011010 +00010100000000000001111111100101 +00000011101111111111110010100101 +00000000000101001001011011110111 +00101000100000001111000001100001 +00000000010000001101000110101101 +00000000010000001111110111101111 +00000000000101010011011011110111 +00000000000101010011111011110111 +00000000000101010000001101000100 +00000000000101010000001011100101 +00101000100000001110000001110111 +00101000100000001101000001111000 +00101000100000001100000001111001 +00101000100000001011000001111010 +00101000100000001010000001111011 +00101000100000001001000001111100 +00101000100000001000000001111101 +00101000100000000111000001111110 +00000010100000010000000001100011 +01001100000000000000000000100000 +00000000000101010001001011111010 +01011000000000010001101101000000 +00101001100000000011000001100111 +00101001100000000010000001100110 +01011000000000111110001011100000 +00000000000101010000001011100100 +01010100000101001010000000000000 +00101000100000000010000001100110 +00101000100000000011000001100111 +00000000000101010000000010001101 +00000010101111111101010010001111 +00000010100000000111010000001110 +00000010101111111110000110101100 +00000000000100010011110111001110 +00000000000101110011001011110111 +00000000000101110011001100011010 +00000000000101111011101100011000 +00000000000101010101111100010111 +00000010101100000011010000011011 +00000000000100010011011101111011 +00010100000000000001111111111000 +00000000010001001101000011101101 +00000011101111111111111100011000 +00000011010111111111110110101101 +00000000000101010000000000011001 +00000000000101010000000000011100 +00000000010001001111110011111110 +00000000000101001001111100011000 +01011111111111101001100110100000 +00000011010000000000000000000000 +00000000000101010001101100010000 +01011000000000000111111000000000 +01011000000000110100001100000000 +00000000000101010000001100000100 +00101001100000000010000001100110 +01010100000101000010110000000000 +00101000100000000010000001100110 +00000000000101010000000010001101 +00000010101111111101010010001110 +00000010100000000111010000001100 +00000010101111111110000110110000 +00000000000100010011100110001100 +00000000000101110100001100011000 +00000000000101110100000011010000 +00000000000101111011000011000110 +00000000000101010110000011011000 +00000000000100010011011101101101 +00000000000101010000000000010010 +00000010101100000011010110111011 +01010011111111100111001111111111 +00000000000101010001001011111010 +01011100000000000011111101000000 +00000000000101010000000000010111 +00000010100000000010000000011001 +00000010100111111111110000011011 +00000010100000000000100000011100 +01010011111111100000111111111111 +00000011010000000000000000000000 +00000010100111111111110000001101 +00000000000101010000000000010111 +00000000000101010000000000011010 +01010011111111101011111111111111 +00000011100000000000011100111001 +00000000000101010000000000011000 +00000010100000000000010000010010 +01010011111111100011001111111111 +00000000000101010000000010011010 +00000010100000000011000000011001 +00000010100111111111110000011011 +00000010100000000000110000011100 +01010011111111011101011111111111 +00000000000101010000000000010111 +00000010100000000001000000011001 +00000000000101010000000000011011 +00000010100000000000010000011100 +01010011111111011100001111111111 +00000011100000000000111100111001 +00000000000101010000000011010000 +00000010100000000000110000010010 +01010011111111011111101111111111 +00000000000101010000001110101111 +01010011111111100100101111111111 +00010100000000000001111111110111 +00000000000101010000000000001111 +00000010101111111111110000011010 +00000011101111111111111011110111 +00000010100111111111110000001101 +01010011111111100101011111111111 +00010100000000000001000000000101 +00010100000000000001111111101100 +00000000000101010001011011110111 +00000011101111111111110110001100 +00000000000101010000001110101111 +00000000000101001011001011110111 +00000010100111111111110000001101 +01010011111111100011011111111111 +00010100000000000000000111101101 +00000011101111111111110110101101 +00000000010001001100001000001001 +00000000010001001100001101001000 +00000000000101001011011000010000 +00000000000111000010010100010100 +00000000000101001011011101001100 +00000000000111000100000110010011 +00000000000111000100000100010010 +00000000010001001100001001101110 +00000000000111000011000100101101 +00000000000100000100100110101101 +00000000000100000011010111001110 +01101100000000000000110111010010 +00010100000000000000001000001101 +00000000000100000011011010010100 +00010100000000000000000111101101 +00000011101111111111110110101101 +00000000010001001100001100000101 +00000000000101001011011100011000 +00000000000111000011001100000110 +00000000000101001011011001110011 +00000000010001001100000111011010 +00000000000101001011010111001110 +00000000010000001100000111001110 +00000000000100000100110111010011 +00000000000111000011000010101100 +00000000010001001100000011001101 +00000000000111000110000100010010 +00000000000100000100100110001100 +00000000000111000001010100001110 +00000000000100000011000110101101 +01101100000000000000110110110010 +00010100000000000000001000001100 +00000000000100000011000111001110 +00000000010001001100000110101100 +00000000000100000011100110001000 +00010100000000000000000111101110 +00000011101111111111110111001110 +00000000000101001011100110101101 +00000000000101001011100011000110 +00000000010000001100000110101101 +00000000000101001011101011101110 +00000000010001001100001011110111 +00000000000100000001100110100110 +00000000000100000001101101011010 +00000000000111000100000111001101 +00000000000111000011100100101100 +00000000000111000100001011110000 +00000000000111000101110100100100 +00000000000100000100000110001100 +00000000010001001100000110101001 +00000000000100000011000100101001 +01101100000000000000110100110000 +00010100000000000000001000001100 +00000000000100000011000010000100 +00010100000000000000000111110000 +00000011101111111111111000010000 +00000000000101001100000110101100 +00000000000101001100000100101101 +00000000010000001100000110101101 +00000000010001001100000100101001 +00000000000100000001000100101001 +00000000000100000011000110101101 +00000000000111000011101100001010 +00000000000111000011100010110010 +00000000000111000110001011111000 +00000000000111000101110010110111 +00000000000100000110001001010000 +00000000010001001100000101000101 +00000000000100000100000010110000 +01101100000000000000111000011000 +00010100000000000000001000001100 +00000000000100000011001011110111 +00010100000000000000000111101110 +00000011101111111111110111001110 +00000000000101001011101000001100 +00000000000101001011100101001010 +00000000010000001100000110001100 +00000000000100000101001101011010 +00000000000100000010100110001100 +00000000000100101001101101010100 +00000000000100000010000110001100 +00000000000100000101000110000101 +00000000000100000011011101011010 +00000000000100101011011101001101 +00000000000100000010010010110010 +00000000000100101010000110001100 +00000000000100101101000010100101 +00000000000100000011011001010100 +00000000000101010001010110000101 +00000000010001001100001000010000 +00000000000100101010011001001001 +00000000000100101011011010001101 +00000000000100000100000010100101 +00000000000101010011010100101001 +00000000010000001010011101001110 +00000000000100000010010010100101 +00000000000101010100110111010011 +00000000000100000101110010100101 +00000000010001001101111101011010 +00000000000100101100110000010011 +00000000010001001101111010000100 +00000000010000001010010010100101 +00000000010000001010011010001100 +00010100000000100000000000001110 +00000000000101010110101001111010 +00000000000101010001000010110111 +00000000000101010011001101011010 +00000000000101001011101011101100 +01011000000000011100000110000000 +00000000010001001000011101001101 +00000011010000000000011101011010 +00000000010000001111111011101100 +00000000000101010110100110111010 +00000000000101010011001101011010 +00000000010001001000011011110111 +00000010100011111111111000101101 +01100100000000001100010000001101 +00000011010000000001111101001100 +01011000000000000010000110000000 +00000011010000000011111101001100 +00000010100000000001000000001110 +01011000000000000001010110001110 +00000010100000000001001101001100 +00000000000100101110100110001110 +00000000000100000011101011110111 +00000000000101010000000110011010 +00010100000000100000000000001100 +00000000000101001011001011101100 +01011000000000000001010110000000 +00010101111111011111111111101100 +00000011101111111111110110001100 +00000010100100000000001000101101 +00000000000101001011001011110111 +00000010100111111111100000001100 +01100011111111010100100110001101 +00000000010001001000111101001100 +00000000010000001010011011100101 +00000000010000001111011011111010 +00000011010111111111110110101101 +00000000000101010011001101011010 +00000000010001001011000010110111 +01010011111110111111011111111111 +00000000000101010000000011000100 +00101001100000000010000001100110 +01010100000100001111000000000000 +00000010100000000111000000001100 +00000010100000000101010010001110 +00000010100000001000000010001101 +00101000100000000010000001100110 +01100111111111001100000110001110 +00000010101111111110000010000100 +00000000000101010000000000010000 +00000000000101110001000011011000 +01010011111111001100111111111111 +01010100000100001100100000000000 +00000010100000000111000000001100 +00000010100000000101010010001111 +00000010100000001000000010001101 +00101000100000000010000001100110 +00101000100000000011000001100111 +01100111111111000010010110001111 +00000010101111111110000010000100 +00000000000101010000000000011010 +00000000000101110001001100010111 +01010011111111000011001111111111 +00000010100000000000010000001100 +00000000000100010011010110001100 +01011100000000000111110110100000 +00000010100100000111101000110001 +00000000000101111011001101010000 +00000000000101110100011101011010 +00000000000101110100011011110001 +00000000000100101110100000011010 +00000000000101010100001000110000 +00000000000101010110101000010000 +00000000000101111011001011101110 +00000011010000000001111000001100 +01011000000000000010000110000000 +00000011010000000011111000001100 +00000010100000000001000000001101 +01011000000000000001010110001101 +00000010100000000001001000001100 +00000000000100101100000110001101 +00000000000100000011010111001110 +00000000000101010000000110010000 +00010100000000010000000000001100 +00000000000101001011000111001100 +00000010100000000000010000001101 +00000000000101010000000000010111 +00000000000101010000000000011010 +01011111111110110011000110000000 +00000000010000001010010111001100 +00000000010001001011000110010111 +00000000010000001111010111001110 +00000000010001001000111000011010 +00000000000101010000000000001101 +00000000000101010011101101011010 +01010011111110110001011111111111 +00000010100000001110000000001110 +01100011111110110000000111001100 +00000010100000000111110000001110 +01100111111111110111110111001100 +00000010101111111000010000010000 +00000000000100010011011000001101 +00000010100000001000000000001110 +00000000000101111011011011110000 +01011000000000000001000110001110 +00000010100100001111101000101100 +00000000000101110011001011101100 +00000000000101010011001101011010 +00000000000100101110100000011010 +00000000000101010100001101010000 +00000011010000000001111000001110 +00000000000101010000000000010111 +01011011111111111011000111000000 +00000011010000000011111000001100 +00000010100000000001000000001101 +00000000000101010000000000001110 +01011111111111110110110110001101 +01010011111111111001001111111111 +00000000000101010000001101110001 +01010011111111100101101111111111 +00010100000000000001000000001101 +00010100000000000001111111101100 +00000000000101010011011011110111 +00000011101111111111110110001100 +00000000000101001011001011110111 +00000010100111111111110000001101 +01010011111110101001101111111111 +00000011010000000000000000000000 +00000011010000000000000000000000 +00000011010000000000000000000000 +00010100000000000001111111101101 +00000011101111111111110110101101 +00000010101111111000000001100011 +00000000010001001101000011101100 +00000000000101001001010110101110 +00000000000101001001110110101101 +00101001100000000101000001111000 +00101001100000000100000001111001 +00101001100000000011000001111010 +00000000010001001101000010111000 +00000000010001001111010010011010 +00000000010001001111010011001111 +00000000010000001000110111001110 +00000000010000001000110110101101 +00101001100000000111000001100001 +00101001100000000110000001110111 +00000011010111111111110110001100 +00000010100111111111110000010001 +00000011010111111111111100011000 +00000000010001001111110010111001 +00000000000101010011101101001110 +00000000010000001000110010010010 +00000000010001001111110011100111 +00000000000101010011010111101101 +00000000010000001000110011010100 +01011000000000100010110110010001 +00000011110000000000010011100111 +00000000000100010011001100001111 +01011000000000011000001100100111 +01100100000000100010110000001111 +01011000000000100110100110000000 +00010100000000010000000000001100 +00000000000101010011000110101101 +01011000000001001011001100010001 +00000000000101010101000110110111 +00000010100000001110000000001100 +00000000000100101101110000010111 +01100000000000000011010110001111 +00000010100000000111110000001100 +01100000000001011000010110001111 +00000010100000001000000000001100 +00000000000101111011111010010000 +00000000000101111011110110110001 +00000000000100010011110110001111 +00000000000101110011110110110111 +00000000000101110011111010001111 +00000000000101010100001011110111 +00000000000100101011110000001111 +00000000000100010100010111001110 +00000000000101010011111011110111 +00000000000100010101111001010111 +00000000000100101101111001010001 +00000000000100010100010111010001 +00010100000000010000000000001100 +00000000000101001011001000101100 +01011000000000110011010110000000 +00010100000000001111111111111010 +00000011101111111111111101011010 +00000000000101001110101000111010 +01011000000000110111011101000000 +00000000000101010000001101000100 +01010100000011101001110000000000 +00000010101111111110000010001110 +00000000000100010011100000001100 +00000000000101111011001011101100 +00000000000101110011101101011010 +00000000000101110011101011110111 +00000000000101010110100110011010 +01100000000000110011000111011000 +00000000000100010110000111011000 +00000010100000000111110000001101 +00000010100000000000011100001100 +01100000000001001101000110101100 +00000010100000001000000000001101 +00000000000101111011001011101110 +00000000000101111011001101010001 +00000000000100010011000110101100 +00000000000101110011001011110111 +00000000000101110011001101011010 +00000000000101010011101101011010 +00000000000100101101110000010111 +00000000000101010000000000011000 +00000000000101010101111101010111 +00000011010000000001111011101100 +01011000000000000010000110000000 +00000011010000000011111011101110 +00000010100000000001000000001100 +01011000000000000001010111001100 +00000010100000000001001011101100 +00000000000100101101110110001101 +00000000000100000011011000110001 +00000000000101010000000110010111 +00010100000000010000000000001110 +00000000000101001011101000101110 +01011000000001101011110111000000 +00000010100000000000011100011000 +00000010100111111111110000001100 +00000011010111111111111100001111 +01011000000000101010101100001100 +00010101111111101111111111101101 +00000011101111111111110110101101 +00000000000101001011011000101101 +00000000010000001111010110110000 +00000000010001001000111011110111 +00000000010000001010010110101101 +00000000000101010101111000010000 +00000000010001001011000110101100 +00010100000000000001111111101101 +00000011101111111111110110101101 +00101000100000000111000001100001 +00000000010000001101000111101111 +00000000000101001011010110001100 +00000000010000001111111100100101 +00000000000101010011110110001100 +00000000000101010001010110001100 +00101000100000000110000001110111 +00101000100000000101000001111000 +00101000100000000100000001111001 +00101000100000000011000001111010 +00000000000101010000001000000100 +00000000000101010000000110000101 +00000010100000001000000001100011 +01001100000000000000000000100000 +00000011010000000000000000000000 +01100100000000010001100000001111 +01011000000000011101000110000000 +00010100000000010000000000001100 +00000000000101010011000110101101 +01011000000000110011011100010001 +00000000000101010101000110110111 +00000010100000001110000000001100 +00000000000100101101110000010111 +01100000000000000010110110001111 +00000010100000000111110000001100 +01100100000001000101110110001111 +00000010100000001000000000010000 +00000000000101111011110110101100 +01011000000000000001000111110000 +00000000000100010011110000001111 +00000000000101110011110110110111 +00000000000101010101111010010100 +00000000000100101101000000010111 +00000000000101010011001011110111 +00000000000100000100101011110111 +00000000000100101100101011110001 +00000000000100000011101000110001 +00010100000000010000000000001100 +00000000000101001011001000101100 +01011000000000011100000110000000 +00000010100000000000011100011000 +00000010100111111111110000001111 +00000000000101010000000000001100 +00000000000101010000000000010000 +01011011111111110100101100001111 +00010101111111101111111111101101 +00000011101111111111110110101101 +00000000010001001000011011101100 +00000000000101001011011000101101 +00000011010000000000011011110111 +00000000000101010101110110010111 +00000000010000001111110110101100 +00000000010001001000010110110001 +00000000000101010101110110010111 +01010011111111101100001111111111 +00000000000101010101000110110011 +00000010101000000000011100001111 +01011000000000000110101001100000 +01011000000000000110111100100111 +01011100000000001010100111100000 +00000010100000000000011100001100 +00000011010111111111100110001100 +01011100000000011101100110000000 +00000000000101010100100111001100 +00000000000101010101000110110000 +01011100000001001100001100000000 +01011000000001000010100110000000 +01011100000001001110001000000000 +00010100001111111111111111101101 +00000011101111111111110110101101 +00000000010000001111010111010111 +00000000000101001001000110110000 +00000000010001001000110111001100 +00000000000101010100001011110000 +01010000000000011111100000000000 +00000000000101010101000110101100 +01011000000000011101000110000000 +00000010101111111111110111101100 +01011000000001000010010110000000 +01011000000001000101010111110001 +00000000000101010000000110001111 +01010011111111011001001111111111 +00000011010000000000000000000000 +00000011110000000000010011100111 +01011111111111111001111100100111 +01011100000000100100100111100000 +00000010100000000000011100001100 +00000011010111111111100110010000 +01011100000000001100111000000000 +00000000000101010100100111001100 +01011100000000011100111100000000 +01011000000001010100100110000000 +00000000000101010101000110101100 +01011100000001010101110110000000 +00010100001111111111111111101101 +00000011101111111111110110101101 +00000000010000001111010111010000 +00000000000101001001000110101101 +00000000010001001000110111001100 +00000000000101010100000110110000 +01010000000000011001000000000000 +00000000000100010110000110001111 +00000000000101010000000011111001 +01011100000000100111001100000000 +00000000000101010100100111010000 +01011000000000110111001000000000 +00000010101111111111110111110000 +01011000000001001111001000000000 +00000010100111111111110000010001 +01011000000000100110100111110001 +00000000000101010000001000001111 +00000000000101010100100111010111 +00000010100000001110000000010000 +00000000000100101101110000010111 +01100000000000000011011000001111 +00000010100000000111110000010000 +01100000000001000101001000001111 +00000010100000001000000000010000 +00000000000101111011110111010001 +00000000000101111011111001010111 +00000000000100010011111000001111 +00000000000101110011110111001110 +00000000000101110011111001001111 +00000000000101010101110111010111 +00000000000100101011110000001110 +00000000000100010100010110101101 +00000000000101010011101011110111 +00000000000100010101111010010111 +00000000000100101101111010010001 +00000000000101010000000110011000 +00000000000100010100010110110001 +01010011111111010001011111111111 +00000000000101010101000110101100 +01011000000000110110000110000000 +00000010101111111111110111101100 +01011000000000101101000110000000 +01011000000001000010010111110001 +00000000000101010000000110001111 +01010011111111100010101111111111 +00000010100111111111110000001111 +01011000000000000100110110001111 +00000000000100000101001001010100 +00000000000100101100101010010001 +00000000000100000011010111011010 +00000000000100000100011101001101 +00000000010001001000011010010100 +00000000010000001111110110110111 +00000000000101010000000110011000 +00000000010001001000010110110001 +00000000000101010101001011110111 +00000011010000000000000000000000 +00000011010000000001111011101100 +01011111111111010100000110000000 +00000000010001001000111011110111 +00000000010000001111011000101101 +00000000010001001000111000101100 +00000000000101010000001100001111 +00000000000101010011011011110000 +01010000000000001010000000000000 +00000010100111111111110000001111 +00000000000101010000000000001100 +00000000000101010000000000010000 +01010011111111010111001111111111 +00010101111111101111111111110001 +00000011101111111111111000110001 +00000011010000000001111011101100 +00000000000100010011101100011000 +00000000000101001100011101010001 +01011111111111010000000110000000 +01010011111111111100001111111111 +00000011010000000000000000000000 +00000000000101010000001011100100 +01010100000010110010110000000000 +00000010100000000111110000001100 +00000010100000000110000010001110 +01100111111111001000110110001110 +00000010101111111110000010011010 +00000000000101110110101011111010 +00000000000101010000000000010111 +01010011111111001001001111111111 +00000000000100010101001001010111 +00000000000100010011010111011010 +00000000000100101101111001010000 +00010100000000010000000000001100 +00000000000100010100001101011010 +00000000000101001011001101001100 +01011100000000101100010110000000 +00000000000101010110101011110000 +01011111111111000100101000000000 +00000000000101010000000000001100 +00000000000101010000000000011001 +01010000000000000010010000000000 +00010100001111111111111111110000 +00000011101111111111111000010000 +00000000010000001111010111010111 +00000000000101001001001000010000 +00000000010001001000110111001100 +00000000000101010101111000010000 +00000010100111111111110000001101 +01011000000000000100000111101101 +00010100000000000001111111101110 +00000011101111111111110111001110 +00000011010111111111110111101111 +00000000000101001011100110001100 +01010011111111001100101111111111 +01011000000000001110100110000000 +00000000000101010101000110110111 +00000000010000001111010111010000 +00010100001111111111111111101101 +01011100000001000101011011100000 +00000011101111111111110110101101 +00000000000101001001000110101101 +00000000010001001000110111001100 +00000000000101010100000110110000 +00000011010000000000000000000000 +00000000000101010011001000001101 +01011000000001000101000110100000 +00010100000000000001000000001110 +00010100000000000001111111101101 +00000000000101010011100110001100 +00000011101111111111110110101101 +00000010100111111111110000001111 +00000000000101001011010110001100 +01010011111111000111111111111111 +00010100001111111111111111101101 +00000011101111111111110110101101 +00000000010000001111010111010111 +00000000000101001001000110110000 +00000000010001001000110111001100 +00000000000101010101111000010000 +01010011111111111100011111111111 +00000000000100010110000110001111 +01011000000000001111001100000000 +00010100000000010000000000010001 +00000010100111111111110000010000 +00000000000101010100010111001110 +01011000000000000110110110010000 +00000000000101010100100111010111 +00000010100000001110000000010000 +00000000000100101101110000010111 +01100000000000000011011000001111 +00000010100000000111110000010000 +01100000000000110110101000001111 +00000010100000001000000000010000 +00000000000101111011110111010001 +00000000000101111011111001010111 +00000000000100010011111000001111 +00000000000101110011110111001110 +00000000000101110011111001001111 +00000000000101010101110111010111 +00000000000100101011110000001110 +00000000000100000100010110101101 +00000000000101010011101011110111 +00000000000100000101001011110111 +00000000000100101101001011110001 +00000000000101010000000110011000 +00000000000100000011011000110001 +01010011111111001001001111111111 +00000011010000000000000000000000 +00010100000000010000000000010001 +00000010100111111111110000010000 +00000000000101010100010111001110 +01011111111111011010010110010000 +00010100001111111111111111101110 +00000000010000001111010110110000 +00000000010001001000110110101100 +00000011101111111111110111001101 +00000000000101001001100110101101 +00000000000101010011011000010000 +01010011111111110010101111111111 +00000011010000000000000000000000 +00000010101111111000011100011000 +00000010100000001000000000001101 +00000000000101111110001101001110 +01011000000000000001000110001101 +00000000000100010011000000001100 +00000000000101110011001101011010 +00000000000101010110101011110111 +00000000000100101101110000010111 +00000000000101010000000000010001 +00000000000101010000000000011000 +00000000000101010011101011110111 +01010011111111011111011111111111 +00000010100000001000000000010000 +00000000000101111011110110101100 +01011000000000000001000111110000 +00000000000100010011110000001111 +00000000000101110011110110110111 +00000000000101010101111010010100 +00000000000100101101000000010111 +00000000000101010011001011110111 +01010011111110101000101111111111 +00000000000101010100100111010000 +01011000000000100110111000000000 +00000000000100000101001001010111 +00000000000100000011010111011010 +00000000000100101101001011110001 +00000010101111111111110111110000 +00000000000100000100011101010001 +01011000000000000101001000000000 +00000010100111111111110000010001 +01011011111111110110100111110001 +00000000000101010000001000001111 +01010011111111101111101111111111 +00000010100000001000000000001100 +00000000000101111011111010010000 +00000000000101111011110110110001 +00000000000100010011110110001111 +00000000000101110011110110110111 +00000000000101110011111010001111 +00000000000101010100001011110111 +00000000000100101011110000001111 +00000000000100000100010111001110 +00000000000101010011111011110111 +01010011111110111010001111111111 +00000000000100000101001001010111 +00000000000100000011010111011010 +00000000000100101100101011110001 +00000000000100000100011101010001 +00010100000000010000000000001100 +00000000000101001011001000101100 +00000010100000000000010000011000 +01011011111111010101010110000000 +00000010100000000000100000011000 +01010011111110111010011111111111 +00010100001111111111111111101110 +00000000010000001111010110110000 +00000000010001001000110110101100 +00000011101111111111110111001101 +00000000000101001001100110100110 +00000000000101010100000011010000 +01010011111111011110111111111111 +00000000000101010000000000011001 +01011011111111011110111000000000 +00010100001111111111111111101110 +00000000010000001111010110110000 +00000000010001001000110110101100 +00000011101111111111110111001101 +00000000000101001001100110101101 +00000000000101010000000011111001 +00000000000101010100000110110000 +01010011111111011100111111111111 +00000011010000000000000000000000 +00000000000100010101001001010111 +00000000000100010011010111011010 +00000000000100101101111001010001 +00000010100000000000010000011000 +00000000000100010100011101010001 +01010011111110011011001111111111 +00010100001111111111111111101101 +00000011101111111111110110101101 +00000000010000001111010111010111 +00000000000101001001000110110000 +00000000010001001000110111001100 +00000000000101010101111000010000 +01010011111111011000111111111111 +00010100001111111111111111101101 +00000011101111111111110110101101 +00000000010000001111010111010000 +00000000000101001001000110100100 +00000000010001001000110111001100 +00000000000101010001001000010000 +01010011111111011011011111111111 +00000000000100010100101010010111 +00000000000100010011100110111010 +00000000000100101101111010010100 +00000000000101010000000011111001 +00000000000100010101001101011010 +01010011111110010111101111111111 +01011100000000001001110110000000 +01011000000000011000111000000000 +00010100001111111111111111101110 +00000000010000001111010110110000 +00000000010001001000110110101100 +00000011101111111111110111001101 +00000000000101001001100110101101 +00000000000101010000000011111001 +00000000000101010011011000010000 +01010011111111010111011111111111 +00000000000100010101001001010111 +00000000000100010011010111011010 +00000000000100101101111001010001 +00010100000000010000000000001100 +00000000000100010100011101010001 +00000000000101001011001000101100 +01011000000000010001100110000000 +00000000000100010100101010010111 +00000000000100010011100110111010 +00000000000100101101111010010001 +00000000000101010000000011111001 +00000000000100010100011101010001 +01010011111110010111111111111111 +00000010100000001000000000010001 +00000000000101111011110111010000 +01011000000000000001000111110001 +00000000000100010011110000001111 +00000000000101110011110111001110 +00000000000101010011101001010010 +00000000000100101100100000010111 +00000000000101010100001011110111 +01010011111110111011111111111111 +00010100001111111111111111101101 +00000011101111111111110110101101 +00000000010000001111010111010000 +00000000000101001001000110101101 +00000000010001001000110111001100 +00000000000101010100000110110000 +01010011111111010000001111111111 +00000000010000001111010111001111 +00010100001111111111111111101101 +01011100000000010000001000000000 +00000011101111111111110110101101 +00000000000101001001000110101101 +00000000010001001000110111001100 +00000000000101010011110110110000 +01010011111111001110001111111111 +00000000010001001000111011110000 +00000000010000001111011000101101 +00000000010001001000111000101100 +00000000000101010000001100001111 +00000000000101010011011000010000 +01010011111111001000011111111111 +00000011010000000000000000000000 +00000000000100010100101010010111 +00000000000100010011100110111010 +00000000000100101101111010010001 +00000010100000000000010000011000 +00000000000100010100011101010001 +01010011111110000111001111111111 +00010100001111111111111111101110 +00000000010000001111010110110000 +00000000010001001000110110101100 +00000011101111111111110111001101 +00000000000101001001100110101101 +00000000000101010011011000010000 +01010011111111000101011111111111 +00000000000100000101001001010111 +00000000000100000011010111011010 +00000000000100101100101011110001 +00010100000000010000000000001100 +00000000000100000100011101010001 +00000000000101001011001000101100 +01011011111110110111010110000000 +00010101111111101111111111101100 +00000011101111111111110110001100 +00000010100000000000010000011000 +00000000000101001011001000110001 +01010011111110110110001111111111 +00010100001111111111111111101110 +00000000010000001111010110110000 +00000000010001001000110110101100 +00000011101111111111110111001101 +00000000000101001001100110101101 +00000000000101010011011000010000 +01010011111111000000001111111111 +00000000000101010100011011110000 +01011111111110110011111000000000 +00000000000101010000000000001100 +00000000000101010000000000011001 +01010011111110111111011111111111 +00000010100000001000000000010001 +00000000000101111011110111010000 +01011000000000000001000111110001 +00000000000100010011110000001111 +00000000000101110011110111001110 +00000000000101010011101001010010 +00000000000100101100100000010111 +00000000000101010100001011110111 +01010011111111001010011111111111 +00010100000000000001111111101100 +00000000000101010000000000011001 +00000010101111111111110000010000 +00000011101111111111110110001100 +01010011111111000000001111111111 +00000010101111111110000000001100 +00000011101111111111110110101101 +00000000000101001011000111001110 +00000000000101001001000110101100 +00000000000101010011110110001100 +00000000010001001111010110001111 +00000000000101001011010110001101 +00000000000101010011110111001100 +00000000010000001111010110010000 +00000000000101010011011000010000 +00000000010001001000110110001100 +01010011111110111100101111111111 +00000010101111111110000000001100 +00000011101111111111110110101101 +00000000000101001011000111001110 +00000000000101001001000110101100 +00000000000101010100000110001100 +01010011111111111101001111111111 +00000000000101010000000000010000 +00000010100111111111110000001111 +00000000000101010000000000001100 +01010011111110000011111111111111 +00000011010000000000000000000000 +00000011010000000000000000000000 +00000011010000000000000000000000 +00010100000000000001111111101100 +00000000010001001101000010101101 +00000011101111111111110110001100 +00000010100011111111100000001110 +00000011010111111111110110101101 +00000000010001001111110010101111 +00000000000101001001010110001100 +01100100000000000001110111001101 +00000010100100000111010000001110 +01100100000000000001110111001101 +00010100111111111111111111100100 +00000011101111111111110010000100 +00000000000100000001000111100100 +01001100000000000000000000100000 +00000000000101010000000000000100 +01001100000000000000000000100000 +00010100000000000010000000000101 +00000010100100001100110000010000 +00000010100100000100110000001110 +00000000000101010001010110001100 +00000000000100010011010111001110 +00000010100000000111110000010001 +00000000000100010011011000010000 +00000000000101111011100110001110 +01100000000000000001011000110000 +00000010101011111011010110101101 +00000000000101111100000010000100 +00000000000101110011010110001100 +00000000000101010001000110001110 +00000000000100010011100000000100 +01011111111111111100010111100000 +00000000000101010000000111000100 +01001100000000000000000000100000 +00000011010000000000000000000000 +00000011010000000000000000000000 +00000011010000000000000000000000 +00000010101111111100000001100011 +00101001100000000011000001100001 +00101001100000000010000001110111 +00101001100000000001000001111000 +01011000000000001000100010000000 +00000000010010001111110010001100 +00000000000101011001000110010111 +00000000000100010011001011110111 +00000000010001001111110010011000 +00000000000101010000001011100100 +01010100000001010101100000000000 +00000010100100000111100000001101 +00000000000100010001000110101101 +00000010100000000010100000001100 +00000011010111111111110110101101 +01100000000000001010010110000100 +00000010100000000010110000001100 +00000000000100010001000110001100 +00010100000000000001111111101111 +00000011101111111111110111101111 +00000000000101111011001011101100 +00000000000101001011110110001100 +00010100000000000001111111101111 +00000011101111111111110111101111 +00101000100000000011000001100001 +00000000010000001101000110101101 +00000000000101001011110110001100 +00000010100000000101010010001110 +00000000010000001111111100011000 +00000000000101010011010110001100 +00000000000101110011101011101110 +00000000000101010110000110001100 +00101000100000000010000001110111 +00101000100000000001000001111000 +00000000000101010000000111000100 +00000000000101010000000110000101 +00000010100000000100000001100011 +01001100000000000000000000100000 +00010100000000000001111111101111 +00000000000101010000000000001101 +00000000000101010000000000001100 +00000011101111111111110111101111 +00101000100000000011000001100001 +00000000000101010000000000011000 +00000000010000001101000110101101 +00000000000101001011110110001100 +00000000010000001111111100011000 +00000000000101010011010110001100 +00000000000101010110000110001100 +00000000000101010000000000001110 +00101000100000000010000001110111 +00101000100000000001000001111000 +00000000000101010000000111000100 +00000000000101010000000110000101 +00000010100000000100000001100011 +01001100000000000000000000100000 +00000010101111111101010010001100 +00010100000000000001111111101111 +00000000000101110011001011101100 +00000011101111111111110111101111 +00000000000101001011110110001100 +00010100000000000001111111101111 +00000011101111111111110111101111 +00101000100000000011000001100001 +00000000010000001101000110101101 +00000000000101001011110110001100 +00000000010000001111111100011000 +00000000000101010011010110001100 +00000000000101010110000110001100 +00000000000101010000000000001110 +00101000100000000010000001110111 +00101000100000000001000001111000 +00000000000101010000000111000100 +00000000000101010000000110000101 +00000010100000000100000001100011 +01001100000000000000000000100000 +00000010101111111100000001100011 +00101001100000000010000001110111 +00101001100000000011000001100001 +00000000000101010000000010010111 +00000000000101010000000000001101 +00000000000101010000000000001100 +01011000000000000011110010000000 +01010100000001000011010000000000 +00000010100100000111100000001101 +00000000000100010001000110101101 +00000010100000000010100000001100 +00000011010111111111110110101101 +01100000000000000101000110000100 +00000010100000000010110000001110 +00010100000000000001111111101111 +00000000000100010001000111001100 +00000000000101111011001011101100 +00000010100000000101010010010000 +00000011101111111111110111101111 +00000000000101110100001011110111 +00000000000101001011110110001100 +00010100000000000001111111101110 +00101000100000000011000001100001 +00000011101111111111110111001110 +00000000010000001101000110101101 +00000000000101001011100110001100 +00000000000101010011010110001100 +00000000000101010000001011100100 +00000000000101010000000110000101 +00101000100000000010000001110111 +00000010100000000100000001100011 +01001100000000000000000000100000 +00000010101111111101010010000100 +00010100000000000001111111101110 +00000000000101110001001011101100 +00000011101111111111110111001110 +00000000000101001011100110001100 +00010100000000000001111111101110 +00101000100000000011000001100001 +00000011101111111111110111001110 +00000000010000001101000110101101 +00000000000101001011100110001100 +00000000000101010000000000010111 +00000000000101010011010110001100 +00000000000101010000001011100100 +00000000000101010000000110000101 +00101000100000000010000001110111 +00000010100000000100000001100011 +01001100000000000000000000100000 +00000011010000000000000000000000 +00000011010000000000000000000000 +00000011010000000000000000000000 +00101000100000000011000010001111 +00101000100000000000000010010000 +00101000100000000001000010001101 +00000010101111111000000001100011 +00101000100000000010000010010100 +00010100000000000000000011110010 +00101001100000000011000001101111 +00000011101111111111111001001110 +00000000010001001100000111110001 +00101010010000000011000001110011 +00000011101111111111101001000100 +00000000010000001000111010001100 +00000000010001001111010110110010 +00000000000101001011101000110001 +00000000010000001000110110101101 +00000000010001001111011000001110 +00000000000101010011100110101110 +00000000000101010011001001010010 +00000000010000001000111000000110 +00000010100000000000011000100101 +00000000010001001111011010010100 +00000000010000001000111001101101 +00101001100000000110000001110010 +00101001100000000101000001101110 +00101001100000000100000001100110 +00000000000101001001000010100100 +00000000010001001111110111101111 +00000000000101010101000110110011 +01011000000000000101000010000000 +00010101111111111111111110001100 +00000011100100000000000110001100 +00000010100111111111100000001101 +00000000000100000011001000110001 +01100100000000001110000110110001 +00000010100111111111110000010100 +00000000000101010000000000001100 +00000000000101010000000000010000 +00010100000000000001111111101101 +00000011101111111111110110101101 +00000000010000001101001010010001 +00000000000101001011010110001100 +00000000010000001111110111101111 +00000000000101010100010110001100 +00000000000101010011110110001100 +00000000000101010000001000000100 +00000000000101010000000110000101 +00000010100000001000000001100011 +01001100000000000000000000100000 +00000000000101010100100111010000 +00000000000101010100111000010000 +00000000000101010001101000010000 +01011100000000000011011000100000 +00000000000101010000000000010100 +00000000000101010000000000001100 +00000010100000000001010000001110 +01011011111111111011101000000000 +00000000010001001000110111010000 +00000000010000001010010110001101 +00000000010000001111010110001110 +00000011010111111111111000110100 +00000000000101010100000111010000 +00000000010001001011000110101100 +01010011111111111001111111111111 +00000011010000000000000000000000 +01011011111111111000101000000000 +00000000010001001111001001001101 +00000000010000001001001001110011 +00010100000000001000000000001100 +00000000000101010100110110101101 +00000000000101010011000110101101 +00000000010000001111010110110000 +00000000010001001000110110101100 +00010100000000000001111111101101 +00000000010001001111000111001110 +00000000010000001001001001010010 +00000010100111111111110000010100 +00000011101111111111110110101101 +00000000000101010100100111001110 +00000000010000001101001010010001 +00000000000101001011010110001100 +00000000010001001000110111001110 +00000000010000001111110111101111 +00000000000101010100010110001100 +00000000000101010100000111010000 +00000000000101010011110110001100 +00000000000101010000001000000100 +00000000000101010000000110000101 +00000010100000001000000001100011 +01001100000000000000000000100000 +01100000000000001110110000010001 +00000010101111110011000000001100 +01100000000000011000101000101100 +00000010100000001111010000001101 +00000000000100010100010110110001 +00010100000000000001000000001110 +00000000000101010011101001101101 +00000010100000000100000001101100 +00000000010010001001011000110011 +00000000000101010000000110001110 +00000000010000001000101001110000 +00000000000101010000000000010100 +00101001100000000111000001101101 +00000000000100000100000110010010 +00000010100000000001000111001110 +00000011010000000111111000110001 +00000000000101010001101010010100 +01011000000000000001011001001110 +00101000100000000000000111000110 +00000010100000000001000111001110 +00000000000101010001101010010100 +01011111111111111111011001001110 +00000010100000000000110000001110 +00000000000100010100110111001110 +01011000000000010101111000100000 +00000010100000001000000001100100 +00000000000100000100000010000100 +00101000101111111100000010000100 +00000010100000001000000000000101 +00000000000100010100010010100101 +00000000000101110001010010000100 +00000010100000000000010000010010 +00000000000101010001001010010100 +01011000000000000100110111000000 +00000010101111111111000000000110 +00000000000111000001101001100110 +00000000000100000100110111000100 +00000000010000001000100010000100 +00000000000100000100000110001101 +00000000000100000001000110000100 +00101000100000000000000110110000 +00101000100000000001000110110010 +00000000000100000001100110100111 +00000010100000000001000110101101 +00000000000101111100011000010000 +00000000000101110001011001010010 +00000000000101010100101000010000 +00101001100000000000000011110000 +01011111111111111110000010001101 +00101000100000000111000001101101 +00000010100000000001000000010010 +00000000000100010100111001010010 +00000000010000001000100111001110 +00000010100000001000000001110000 +00000000000101111100010110101101 +00000000000100000011101000001110 +00101001101111111100000111001101 +01010000000000001111110000000000 +00000011010000000000000000000000 +00000000010000001001000111010000 +00000000010000001001001001010100 +00000000010001001111000111001110 +00000000000101010001101000010000 +00000000010001001111001001001100 +00000000010000001001001001101101 +00000000000101010101000111001110 +00000000000100101100000000010000 +00000000000101010011010110001100 +00000000000101010011101000001110 +00000011010000000001110111001101 +01011000000000000001000110100000 +00000011010000000011110111001101 +00000010100000000001000000010000 +01011100000000000111100110110000 +00010100000000010000000000001101 +00000000000101001011010110001101 +01011011111111100100110110100000 +00000010100000000000011000110001 +00000010100111111111110000001101 +01011011111111011110101000101101 +00010101111111101111111111101101 +00000011101111111111110110101101 +00000000000101001011010110001101 +00000000010001001000110111010000 +00000000010000001111010110101110 +00000000010000001010010110101101 +00000000010001001011000110101100 +00010100000000000001111111101101 +00000011010111111111111000110100 +00000011101111111111110110101101 +00000000010000001101001010010001 +00000000000101001011010110001100 +00000000010000001111110111101111 +00000000000101010100010110001100 +00000000000101010100000111010000 +00000000000101010011110110001100 +00000000000101010000001000000100 +00000000000101010000000110000101 +00000010100000001000000001100011 +01001100000000000000000000100000 +00000000000101010000000000001100 +00000010100000000000010000001110 +00000000000101010000000000010001 +00000010011111111111000111010000 +00000011110000000000011000010000 +00010100000000010000000000001101 +00000000000100000100000110001100 +00000010100000000001000111001110 +00000000000101001011010110001101 +01010011111111110111111111111111 +00000011010000000000000000000000 +00000000000101010000000110001101 +00000000000100000100000110110010 +00101000100000000000001001010010 +00000010100000000001000110101101 +00000010100000000000011000110001 +00101001101111111111000110110010 +01100111111111111110110111010001 +00000010100000000001000000010010 +00000000000100010100111001010010 +00000000010000001000101001010010 +00000010100000000100000110001101 +00000000000100000100100110001100 +00101001100000000000000110000000 +00000010100000000001000110001100 +01011111111111111111100110101100 +00101000100000000100000001101101 +00101000100000000101000001101100 +00000000000100101101000000001110 +00000000000101010000000000010001 +00000000000101010011010111001110 +01010011111111110000101111111111 +00000011010000000000000000000000 +00000011010000000000000000000000 +00000011010000000000000000000000 +00010100000000000000001000001100 +01101100000000000100110010001100 +00000010100000111111110000001100 +00000010100000001000000000001101 +01101000000000000010000110000100 +00011100000000000000111100001100 +00101000101011000001000110001100 +00000000000100000001000110001100 +00101010000000000000000110000100 +00000000000100010001000110100100 +01001100000000000000000000100000 +00000011010000000000000000000000 +00000000010001001010000010000100 +00011100000000000000111100001100 +00101000101010111001000110001100 +00000000000100000001000110001100 +00101010000000000000000110000100 +00000010100000000110000000001101 +00000000000100010001000110100100 +01001100000000000000000000100000 +00010100000000100000000000001100 +01101000000000000010010010001100 +00000000010001001110000010000100 +00011100000000000000111100001100 +00101000101010101111000110001100 +00000000000100000001000110001100 +00101010000000000000000110000100 +00000010100000000010000000001101 +00000000000100010001000110100100 +01001100000000000000000000100000 +00000000010001001100000010000100 +00011100000000000000111100001100 +00101000101010100111000110001100 +00000000000100000001000110001100 +00101010000000000000000110000100 +00000010100000000100000000001101 +00000000000100010001000110100100 +01001100000000000000000000100000 +00000011010000000000000000000000 +00000011010000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +01101100011011000110010101001000 +01101111010011000010000001101111 +01100001011001110110111001101111 +00110011011010000110001101110010 +00001010001000010111001000110010 +00000000000000000000000000000000 +00100000001111010010000001100001 +00000000000010100110010000100101 +00100000001111010010000001100010 +00000000000010100110011000100101 +00100000001111010010000001100011 +00001010011001100110110000100101 +00000000000000000000000000000000 +01000100010000110100001001000001 +00000000000000000000000001000101 +01101001011100100111010001010011 +00111101001000000110011101101110 +00101100011100110010010100100000 +01100100010000010010000000100000 +01110011011001010111001001100100 +00100000001111010010000001110011 +01111000001001010111100000110000 +00000000000000000000000000001010 +00000000000010100111001100100101 +10000000000000000000000000000000 +01000000000010100000110100011011 +11000010111000110011111011111111 +01000000101101010110011001111001 +00000000010001100100111001001001 +00000000011001100110111001101001 +00000000010011100100000101001110 +00000000011011100110000101101110 +00110011001100100011000100110000 +00110111001101100011010100110100 +01100010011000010011100100111000 +01100110011001010110010001100011 +00000000000000000000000000000000 +00110011001100100011000100110000 +00110111001101100011010100110100 +01000010010000010011100100111000 +01000110010001010100010001000011 +00000000000000000000000000000000 +01101100011101010110111000101000 +00000000000000000010100101101100 +00000000000000000000000000110000 +00011100000000000000101010011000 +00011100000000000001101110000000 +00011100000000000001101110000000 +00011100000000000000101010101100 +00011100000000000001101110000000 +00011100000000000001101110000000 +00011100000000000001101110000000 +00011100000000000000101001001000 +00011100000000000001101110000000 +00011100000000000001101110000000 +00011100000000000000101010110100 +00011100000000000000101011010100 +00011100000000000001101110000000 +00011100000000000000101011001100 +00011100000000000000101011011100 +00011100000000000001101110000000 +00011100000000000000101101000100 +00011100000000000000101101001100 +00011100000000000000101101001100 +00011100000000000000101101001100 +00011100000000000000101101001100 +00011100000000000000101101001100 +00011100000000000000101101001100 +00011100000000000000101101001100 +00011100000000000000101101001100 +00011100000000000000101101001100 +00011100000000000001101110000000 +00011100000000000001101110000000 +00011100000000000001101110000000 +00011100000000000001101110000000 +00011100000000000001101110000000 +00011100000000000001101110000000 +00011100000000000001101110000000 +00011100000000000000110011011000 +00011100000000000001101110000000 +00011100000000000000101111100100 +00011100000000000000110000011000 +00011100000000000000110011011000 +00011100000000000000110011011000 +00011100000000000000110011011000 +00011100000000000001101110000000 +00011100000000000001101110000000 +00011100000000000001101110000000 +00011100000000000001101110000000 +00011100000000000000101110001100 +00011100000000000001101110000000 +00011100000000000001101110000000 +00011100000000000001011101101000 +00011100000000000001101110000000 +00011100000000000001101110000000 +00011100000000000001101110000000 +00011100000000000001100000011100 +00011100000000000001101110000000 +00011100000000000001100010111000 +00011100000000000001101110000000 +00011100000000000001101110000000 +00011100000000000001100100100100 +00011100000000000001101110000000 +00011100000000000001101110000000 +00011100000000000001101110000000 +00011100000000000001101110000000 +00011100000000000001101110000000 +00011100000000000001101110000000 +00011100000000000001101110000000 +00011100000000000001101110000000 +00011100000000000000110011011000 +00011100000000000001101110000000 +00011100000000000000101111100100 +00011100000000000000110000011100 +00011100000000000000110011011000 +00011100000000000000110011011000 +00011100000000000000110011011000 +00011100000000000000101110010100 +00011100000000000000110000011100 +00011100000000000000101111010100 +00011100000000000001101110000000 +00011100000000000000101110111100 +00011100000000000001101110000000 +00011100000000000001011011111100 +00011100000000000001011101101100 +00011100000000000001011111100000 +00011100000000000000101111010100 +00011100000000000001101110000000 +00011100000000000001100000011100 +00011100000000000000101010010000 +00011100000000000001100010111100 +00011100000000000001101110000000 +00011100000000000001101110000000 +00011100000000000001100110001000 +00011100000000000001101110000000 +00011100000000000000101010010000 +00110000001100000011000000110000 +00110000001100000011000000110000 +00110000001100000011000000110000 +00110000001100000011000000110000 +00100000001000000010000000100000 +00100000001000000010000000100000 +00100000001000000010000000100000 +00100000001000000010000000100000 +00000000000000000000000000000000 +00111111110000000000000000000000 +00000000000000000000000000000000 +01000000001100000000000000000000 +00000000000000000000000000000000 +00111111111000000000000000000000 +00000000000000000000000000000000 +01000011010100000000000000000000 +01101001011001100110111001001001 +01111001011101000110100101101110 +00000000000000000000000000000000 +00000000010011100110000101001110 +00000000000000000000000000000000 +00111111111110000000000000000000 +01100011011011110100001101100001 +00111111110100101000011110100111 +10001011011000001100100010110011 +00111111110001101000101000101000 +01010000100111110111100111111011 +00111111110100110100010000010011 +00000000000000000000000000000000 +00111111111100000000000000000000 +00000000000000000000000000000000 +01000000001001000000000000000000 +00000000000000000000000000000000 +01000000000111000000000000000000 +00000000000000000000000000000000 +01000000000101000000000000000000 +00000000000000000000000000000101 +00000000000000000000000000011001 +00000000000000000000000001111101 +00000000000000000000000000000000 +10010111110110001000100110111100 +00111100100111001101001010110010 +11010101101010001010011100110011 +00111001010010011111011000100011 +01000100111101001010011100111101 +00110010101001010000111111111101 +11001111100011001001011110011101 +00100101010110111011101000001000 +01100100101011000110111101000011 +00001010110010000000011000101000 +00110111111000001000000000000000 +01000011010000011100001101111001 +10110101000001010110111000010111 +01000110100100111011100010110101 +11101001001111111111100111110101 +01001101001110000100111100000011 +11111001001100000001110100110010 +01011010100000100111011101001000 +01111111011100111011111100111100 +01110101000101010100111111011101 +00000000000000000000000000000000 +00111111111100000000000000000000 +00000000000000000000000000000000 +01000000001001000000000000000000 +00000000000000000000000000000000 +01000000010110010000000000000000 +00000000000000000000000000000000 +01000000100011110100000000000000 +00000000000000000000000000000000 +01000000110000111000100000000000 +00000000000000000000000000000000 +01000000111110000110101000000000 +00000000000000000000000000000000 +01000001001011101000010010000000 +00000000000000000000000000000000 +01000001011000110001001011010000 +00000000000000000000000000000000 +01000001100101111101011110000100 +00000000000000000000000000000000 +01000001110011011100110101100101 +00100000000000000000000000000000 +01000010000000101010000001011111 +11101000000000000000000000000000 +01000010001101110100100001110110 +10100010000000000000000000000000 +01000010011011010001101010010100 +11100101010000000000000000000000 +01000010101000100011000010011100 +00011110100100000000000000000000 +01000010110101101011110011000100 +00100110001101000000000000000000 +01000011000011000110101111110101 +00110111111000001000000000000000 +01000011010000011100001101111001 +10000101110110001010000000000000 +01000011011101100011010001010111 +01100111010011101100100000000000 +01000011101010111100000101101101 +01100000100100010011110100000000 +01000011111000010101100011100100 +01111000101101011000110001000000 +01000100000101011010111100011101 +11010110111000101110111101010000 +01000100010010110001101011100100 +00000110010011011101010110010010 +01000100100000001111000011001111 +11000111111000010100101011110110 +01000100101101010010110100000010 +01111001110110011001110110110100 +01000100111010100111100001000011 +00000000000000000000000001000011 +01001001010100110100111101010000 +00000000000000000000000001011000 +00000000000000000000000000101110 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00100000001000000010000000100000 +00100000001000000010000000100000 +00101000001010000010100000100000 +00100000001000000010100000101000 +00100000001000000010000000100000 +00100000001000000010000000100000 +00100000001000000010000000100000 +00100000001000000010000000100000 +00010000000100000001000010001000 +00010000000100000001000000010000 +00010000000100000001000000010000 +00010000000100000001000000010000 +00000100000001000000010000000100 +00000100000001000000010000000100 +00010000000100000000010000000100 +00010000000100000001000000010000 +01000001010000010100000100010000 +00000001010000010100000101000001 +00000001000000010000000100000001 +00000001000000010000000100000001 +00000001000000010000000100000001 +00000001000000010000000100000001 +00010000000000010000000100000001 +00010000000100000001000000010000 +01000010010000100100001000010000 +00000010010000100100001001000010 +00000010000000100000001000000010 +00000010000000100000001000000010 +00000010000000100000001000000010 +00000010000000100000001000000010 +00010000000000100000001000000010 +00100000000100000001000000010000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +11111111111110000110101001010000 +11111111111110000110011111111100 +11111111111110000110100011111000 +11111111111110000110100001011000 +11111111111110000110100011111000 +11111111111110000110101000011000 +11111111111110000110100011111000 +11111111111110000110100001011000 +11111111111110000110011111111100 +11111111111110000110011111111100 +11111111111110000110101000011000 +11111111111110000110100001011000 +11111111111110000110100001101000 +11111111111110000110100001101000 +11111111111110000110100001101000 +11111111111110000110101000110000 +11111111111110000111010011100000 +11111111111110000111001011100000 +11111111111110000111001011100000 +11111111111110000111001011011100 +11111111111110000111001011101100 +11111111111110000111001011101100 +11111111111110000111010010101000 +11111111111110000111001011011100 +11111111111110000111001011101100 +11111111111110000111010010101000 +11111111111110000111001011101100 +11111111111110000111001011011100 +11111111111110000111010010100000 +11111111111110000111010010100000 +11111111111110000111010010100000 +11111111111110000111010011000000 +00000010000000100000000100000000 +00000011000000110000001100000011 +00000100000001000000010000000100 +00000100000001000000010000000100 +00000101000001010000010100000101 +00000101000001010000010100000101 +00000101000001010000010100000101 +00000101000001010000010100000101 +00000110000001100000011000000110 +00000110000001100000011000000110 +00000110000001100000011000000110 +00000110000001100000011000000110 +00000110000001100000011000000110 +00000110000001100000011000000110 +00000110000001100000011000000110 +00000110000001100000011000000110 +00000111000001110000011100000111 +00000111000001110000011100000111 +00000111000001110000011100000111 +00000111000001110000011100000111 +00000111000001110000011100000111 +00000111000001110000011100000111 +00000111000001110000011100000111 +00000111000001110000011100000111 +00000111000001110000011100000111 +00000111000001110000011100000111 +00000111000001110000011100000111 +00000111000001110000011100000111 +00000111000001110000011100000111 +00000111000001110000011100000111 +00000111000001110000011100000111 +00000111000001110000011100000111 +00001000000010000000100000001000 +00001000000010000000100000001000 +00001000000010000000100000001000 +00001000000010000000100000001000 +00001000000010000000100000001000 +00001000000010000000100000001000 +00001000000010000000100000001000 +00001000000010000000100000001000 +00001000000010000000100000001000 +00001000000010000000100000001000 +00001000000010000000100000001000 +00001000000010000000100000001000 +00001000000010000000100000001000 +00001000000010000000100000001000 +00001000000010000000100000001000 +00001000000010000000100000001000 +00001000000010000000100000001000 +00001000000010000000100000001000 +00001000000010000000100000001000 +00001000000010000000100000001000 +00001000000010000000100000001000 +00001000000010000000100000001000 +00001000000010000000100000001000 +00001000000010000000100000001000 +00001000000010000000100000001000 +00001000000010000000100000001000 +00001000000010000000100000001000 +00001000000010000000100000001000 +00001000000010000000100000001000 +00001000000010000000100000001000 +00001000000010000000100000001000 +00001000000010000000100000001000 +01110011011010010110100001110100 +00100000011100110110100100100000 +00000000011101000111001101100100 +01110011011010010110100001110100 +00100000011100110110100100100000 +00000000011000110111001001110011 +10111111000000000000000000000000 +00011100000010000000101111110000 +00011100000010000000101101111000 +00011100000010000000101100001000 +00011100000010000000101010011000 +00000000000000000000000000000000 +00000000000000000000000000000011 +00011100000010000000101010011000 +00000000000000000000000001000011 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000001000011 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000001000011 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000001000011 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000001000011 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000001000011 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000001000011 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00011100000000000101010110110000 +00011100000000000101010101010000 +00000000000000000000000000000000 +00011100000010000000010001100111 +00011100000010000000001111100100 +00011100000010000000000000010100 +00011100000010000000000000010100 +00011100000010000000000000010100 +00011100000010000000000000010100 +00011100000010000000000000010100 +00011100000010000000000000010100 +00011100000010000000000000010100 +00011100000010000000000000010100 +00011100000010000000000000010100 +01111111011111110111111101111111 +01111111011111110111111101111111 +01111111011111110111111101111111 +00000000000000000111111101111111 +01010011010000010000000000000001 +00000000010010010100100101000011 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +01010011010000010000000000000000 +00000000010010010100100101000011 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +10111111111000000000000111100000 +10111111101011111111111100010000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00011100000000000100100011101000 +00011100000010000000011100000000 +00011100000010000000100011111100 +00011100000010000000001100010000 +00011100000000000100110111000000 +00011100000010000000001011101000 +00011100000000000100101011001000 +00011100000010000000011100001100 +00011100000000000100101001101000 +00011100000000000100100010000000 +00011100000000000100100101001000 +00011100000011110000000000000000 +00011100000010000000101010010000 +00011100000010000000010111101000 +00011100000010000000101111110000 +00011100000010000000011100010100 +00011100000010000000100011111000 +00011100000010000000011100100000 +00011100000010000000011100100000 diff --git a/sdk/hello_world.bin b/sdk/hello_world.bin new file mode 100755 index 0000000000000000000000000000000000000000..ed69ec4e1956d7415aef2915598980d4a51b7a1b GIT binary patch literal 40012 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%0D~Mq^ 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 Z;0M-c95OFhIb=ZbDgu=M0o11eqybT@9)th@ literal 0 HcmV?d00001 diff --git a/sdk/software/bsp/common.mk b/sdk/software/bsp/common.mk new file mode 100644 index 0000000..88764f5 --- /dev/null +++ b/sdk/software/bsp/common.mk @@ -0,0 +1,82 @@ + +LA32R_GCC := loongarch32r-linux-gnusf-gcc +LA32R_AS := loongarch32r-linux-gnusf-as +LA32R_GXX := loongarch32r-linux-gnusf-g++ +LA32R_OBJDUMP := loongarch32r-linux-gnusf-objdump +LA32R_GDB := loongarch32r-linux-gnusf-gdb +LA32R_AR := loongarch32r-linux-gnusf-ar +LA32R_OBJCOPY := loongarch32r-linux-gnusf-objcopy +LA32R_READELF := loongarch32r-linux-gnusf-readelf + +.PHONY: all +all: $(TARGET) + +#TODO: 根据Cache实际情况调整has_cache宏,以在start.S中生成正确的Cache初始化代码 +CFLAGS += -Dhas_cache=1 +CFLAGS += -Dcache_index_depth=0x100 -Dcache_offset_width=0x4 -Dcache_way=2 +CFLAGS += -ffunction-sections -fdata-sections +CFLAGS += -nostartfiles -nostdlib -nostdinc -static -fno-builtin +CFLAGS += -DCLOCKS_PER_SEC=CORE_CLOCKS_PER_SEC -D_CLOCKS_PER_SEC_=CORE_CLOCKS_PER_SEC +CFLAGS += -DUSE_CPU_CLOCK_COUNT + +#若使用 newlib , 将下面的 -lsemihost 替换为 -lgloss +LDFLAGS += -T $(LINKER_SCRIPT) \ + -Wl,--gc-sections -Wl,--check-sections \ + -lc -lm -lg -lsemihost -lgcc -L$(PICOLIBC_DIR)/lib + +LINKER_SCRIPT := $(COMMON_DIR)/env/script.lds + +ASM_SRCS += $(COMMON_DIR)/env/start.S + +ifeq ($(TARGET), RTThread_Nano) + +else +ASM_SRCS += $(COMMON_DIR)/env/trap_handler.S +endif + +C_SRCS += $(COMMON_DIR)/drivers/confreg_time.c +C_SRCS += $(COMMON_DIR)/drivers/core_time.c +C_SRCS += $(COMMON_DIR)/drivers/common_func.c +C_SRCS += $(COMMON_DIR)/drivers/dvi.c \ + $(COMMON_DIR)/drivers/led.c \ + $(COMMON_DIR)/drivers/seg7.c + +INCLUDES += -I./ \ + -I$(COMMON_DIR)/include \ + -I$(PICOLIBC_DIR)/include \ + -I$(GCC_DIR)/lib/gcc/loongarch32r-linux-gnusf/8.3.0/include \ + -I$(GCC_DIR)/lib/gcc/loongarch32r-linux-gnusf/8.3.0/include-fixed + +ASM_OBJS := $(ASM_SRCS:.S=.o) +C_OBJS := $(C_SRCS:.c=.o) + +LINK_OBJS += $(ASM_OBJS) $(C_OBJS) +LINK_DEPS += $(LINKER_SCRIPT) + +CLEAN_OBJS += $(OBJDIR)/$(TARGET).elf $(LINK_OBJS) $(OBJDIR)/$(TARGET).s $(OBJDIR)/$(TARGET).bin $(OBJDIR)/convert $(OBJDIR)/axi_ram.coe $(OBJDIR)/axi_ram.mif $(OBJDIR)/rom.vlog + +$(TARGET): $(LINK_OBJS) $(LINK_DEPS) convert Makefile + $(LA32R_GCC) $(CFLAGS) $(INCLUDES) $(LINK_OBJS) -o $(OBJDIR)/$@.elf $(LDFLAGS) + $(LA32R_OBJCOPY) -O binary $(OBJDIR)/$@.elf $(OBJDIR)/$@.bin + $(LA32R_OBJDUMP) --disassemble-all -S $(OBJDIR)/$@.elf > $(OBJDIR)/$@.s + $(OBJDIR)/convert $@.bin $(OBJDIR)/ + cp ./$(OBJDIR)/axi_ram.mif $(COMMON_DIR)/../../ + cp ./$(OBJDIR)/axi_ram.mif $(LA32RSOC_WINDOWS_HOME)/sdk + cp ./$(OBJDIR)/$@.bin $(COMMON_DIR)/../../ + cp ./$(OBJDIR)/$@.bin $(LA32RSOC_WINDOWS_HOME)/sdk + rm -f $(LINK_OBJS) + rm -f $(OBJDIR)/convert + +$(ASM_OBJS): %.o: %.S + $(LA32R_GCC) $(CFLAGS) $(INCLUDES) -c -o $@ $< + +$(C_OBJS): %.o: %.c + $(LA32R_GCC) $(CFLAGS) $(INCLUDES) -c -o $@ $< + +convert: $(COMMON_DIR)/env/convert.c + mkdir -p $(OBJDIR)/ + gcc -o $(OBJDIR)/convert $(COMMON_DIR)/env/convert.c + +.PHONY: clean +clean: + rm -f $(CLEAN_OBJS) diff --git a/sdk/software/bsp/drivers/common_func.c b/sdk/software/bsp/drivers/common_func.c new file mode 100644 index 0000000..9b47921 --- /dev/null +++ b/sdk/software/bsp/drivers/common_func.c @@ -0,0 +1,20 @@ +#include "common_func.h" + +void RegWrite(unsigned int addr,unsigned int var) +{ + *((volatile unsigned int *)(addr)) = var; +} + +unsigned int RegRead(unsigned int addr) +{ + return (*((volatile unsigned int *)(addr))); +} + +//memcpy 32bit +void SaveMemory(unsigned int *DestAddr, unsigned int *SrcAddr, unsigned int Size) +{ + unsigned int i; + for (i = 0; i < Size; i += 1) + *(U32*)(DestAddr + i) = SrcAddr[i]; +} + diff --git a/sdk/software/bsp/drivers/confreg_time.c b/sdk/software/bsp/drivers/confreg_time.c new file mode 100644 index 0000000..4f9854f --- /dev/null +++ b/sdk/software/bsp/drivers/confreg_time.c @@ -0,0 +1,63 @@ +#include "confreg_time.h" +#include "time.h" + +unsigned long __attribute__((weak)) CONFREG_TIMER_BASE = 0xbf20f100; +unsigned long __attribute__((weak)) CONFREG_CLOCKS_PER_SEC = 50000000L; +unsigned long __attribute__((weak)) CORE_CLOCKS_PER_SEC = 33000000L; + +unsigned long get_confreg_clock_count() +{ + unsigned long contval; + asm volatile( + "la.local $r25, CONFREG_TIMER_BASE\n\t" + "ld.w $r25, $r25, 0\n\t" + "ld.w %0,$r25,0\n\t" + :"=r"(contval) + : + :"$r25" + ); + return contval; +} + +unsigned long get_cpu_clock_count() +{ + unsigned long contval; + asm volatile( + "rdcntvl.w %0\n\t" + :"=r"(contval) + ); + return contval; +} + +unsigned long get_clock_count() +{ +#ifdef USE_CPU_CLOCK_COUNT + return get_cpu_clock_count(); +#else + return get_confreg_clock_count(); +#endif +} + +unsigned long get_ns(void) +{ + unsigned long n=0; + n = get_clock_count(); +#ifdef USE_CPU_CLOCK_COUNT + n=n*(NSEC_PER_USEC/(CORE_CLOCKS_PER_SEC/USEC_PER_SEC)); +#else + n=n*(NSEC_PER_USEC/(CONFREG_CLOCKS_PER_SEC/USEC_PER_SEC)); +#endif + return n; +} + +unsigned long get_us(void) +{ + unsigned long n=0; + n = get_clock_count(); +#ifdef USE_CPU_CLOCK_COUNT + n=n/(CORE_CLOCKS_PER_SEC/USEC_PER_SEC); +#else + n=n/(CONFREG_CLOCKS_PER_SEC/USEC_PER_SEC); +#endif + return n; +} diff --git a/sdk/software/bsp/drivers/core_time.c b/sdk/software/bsp/drivers/core_time.c new file mode 100644 index 0000000..dc895ab --- /dev/null +++ b/sdk/software/bsp/drivers/core_time.c @@ -0,0 +1,30 @@ +#include "core_time.h" +#include "confreg_time.h" + +// default : 33 mhz + +void delay_ms(uint32_t ms) +{ + unsigned char overflow; + unsigned long time,target_time,time_r,target_time_r; + + time = get_cpu_clock_count(); + time_r = time; + target_time = time + (CORE_CLOCKS_PER_SEC/1000)*ms; + target_time_r = target_time; + if( target_time < time){ + overflow = 1; + target_time = 0xffffffff; + } + while(time < target_time){ + time = get_cpu_clock_count(); + if (time_r > time) break; + time_r = time; + } + if (overflow) { + while( time < target_time_r){ + time = get_cpu_clock_count(); + } + overflow = 0; + } +} diff --git a/sdk/software/bsp/drivers/dvi.c b/sdk/software/bsp/drivers/dvi.c new file mode 100644 index 0000000..cfb1fb9 --- /dev/null +++ b/sdk/software/bsp/drivers/dvi.c @@ -0,0 +1,27 @@ +#include "dvi.h" + +// 设置坐标和颜色的绘图函数 +void DVI_Draw_Rect(uint32_t x, uint32_t y, uint32_t l, uint32_t w) +{ + // 创建坐标值,x 和 y 分别占用 12 位; width 和 height 用于定义范围 + uint32_t coordinates = ((x & 0xFFFF)<<16) | (y & 0xFFFF); + + uint32_t size = ((l & 0xFFFF)<<16) | (w & 0xFFFF); + + // 写入坐标和颜色寄存器 + RegWrite(DVI_RECT_DIR, coordinates); + RegWrite(DVI_RECT_L_W, size); +} + +// 在指定位置绘制一个点的函数 +void DVI_Draw_SQU(uint32_t x, uint32_t y, uint32_t r) +{ + // 创建坐标值,x 和 y 分别占用 12 位; width 和 height 用于定义范围 + uint32_t coordinates = ((x & 0xFFFF)<<16) | (y & 0xFFFF); + + uint32_t size = ((r & 0xFFFF)<<16) | (r & 0xFFFF); + + // 写入坐标和颜色寄存器 + RegWrite(DVI_SQU_DIR, coordinates); + RegWrite(DVI_SQU_R, size); +} diff --git a/sdk/software/bsp/drivers/led.c b/sdk/software/bsp/drivers/led.c new file mode 100644 index 0000000..38045d2 --- /dev/null +++ b/sdk/software/bsp/drivers/led.c @@ -0,0 +1,28 @@ +#include "led.h" + +// set leds pin +void setLedPin(uint32_t data) +{ + RegWrite(LEDS_GPIO_DATA,data); +} + +// toggle one led pin +void toggleLedPin(uint32_t data) +{ + uint32_t led_data; + uint32_t process_bit; + + led_data = RegRead(LEDS_GPIO_DATA); + process_bit = 0x1 << data; + + if(led_data & process_bit) + { + led_data = led_data & (~process_bit); + } + else + { + led_data = led_data | process_bit; + } + + RegWrite(LEDS_GPIO_DATA,led_data); +} \ No newline at end of file diff --git a/sdk/software/bsp/drivers/seg7.c b/sdk/software/bsp/drivers/seg7.c new file mode 100644 index 0000000..c32fede --- /dev/null +++ b/sdk/software/bsp/drivers/seg7.c @@ -0,0 +1,17 @@ +// seg7.c + +#include "seg7.h" + +void setSegNum(uint32_t seg1,uint32_t num1,uint32_t seg2,uint32_t num2) +{ + // select seg + uint32_t select_seg = ((seg1<<2) + seg2); + + RegWrite(SEG7_SELECT,select_seg); + + // set num + uint32_t num_seg = ((num1<<4) + num2); + + RegWrite(SEG7_NUM,num_seg); + +} \ No newline at end of file diff --git a/sdk/software/bsp/env/convert.c b/sdk/software/bsp/env/convert.c new file mode 100644 index 0000000..d7c5c09 --- /dev/null +++ b/sdk/software/bsp/env/convert.c @@ -0,0 +1,103 @@ +#include +#include +#include + +void binary_out(FILE* out,unsigned char* mem) +{ + char tmp; + unsigned char num[8]; + int i; + int j; + + num[0] = 1; + num[1] = 2; + num[2] = 4; + num[3] = 8; + num[4] = 16; + num[5] = 32; + num[6] = 64; + num[7] = 128; + for(i=3;i>=0;i--) + { + for(j=7;j>=0;j--) + { + if( (mem[i] & num[j] ) != 0) + tmp = '1'; + else + tmp = '0'; + fprintf(out,"%c",tmp); + } + } + fprintf(out,"\n"); + return; +} + +int main(int argc, char** argv) +{ + FILE *in; + FILE *out; + + if(argc < 3){ + fprintf(stderr, "Usage: convert main.bin directory\n"); + return 1; + } + + char str_bin[256]; + char str_coe[256], str_mif[256], str_vlog[256]; + strncpy(str_bin, argv[2], 256); + strncpy(str_coe, argv[2], 256); + strncpy(str_mif, argv[2], 256); + strncpy(str_vlog,argv[2], 256); + strncat(str_bin, argv[1], 255); + strncat(str_coe, "axi_ram.coe", 255); + strncat(str_mif, "axi_ram.mif", 255); + strncat(str_vlog,"rom.vlog" , 255); + //printf("%s\n%s\n%s\n%s\n%s\n%s\n", str_bin, str_data, str_inst_coe, str_inst_mif, str_data_coe, str_data_mif); + + int i,j,k; + unsigned char mem[32]; + + in = fopen(str_bin, "rb"); + out = fopen(str_coe,"w"); + + fprintf(out, "memory_initialization_radix = 16;\n"); + fprintf(out, "memory_initialization_vector =\n"); + while(!feof(in)) { + if(fread(mem,1,4,in)!=4) { + fprintf(out, "%02x%02x%02x%02x\n", mem[3], mem[2], mem[1], mem[0]); + break; + } + fprintf(out, "%02x%02x%02x%02x\n", mem[3], mem[2], mem[1],mem[0]); + } + fclose(in); + fclose(out); + + in = fopen(str_bin, "rb"); + out = fopen(str_mif,"w"); + + while(!feof(in)) { + if(fread(mem,1,4,in)!=4) { + binary_out(out,mem); + break; + } + binary_out(out,mem); + } + fclose(in); + fclose(out); + + in = fopen(str_bin, "rb"); + out = fopen(str_vlog,"w"); + + fprintf(out,"@1c000000\n"); + while(!feof(in)) { + if (fread(mem,1,1,in) != 1) { + fprintf(out,"%02x\n", mem[0]); + break; + } + fprintf(out,"%02x\n", mem[0]); + } + fclose(in); + fclose(out); + + return 0; +} diff --git a/sdk/software/bsp/env/script.lds b/sdk/software/bsp/env/script.lds new file mode 100644 index 0000000..088c3d6 --- /dev/null +++ b/sdk/software/bsp/env/script.lds @@ -0,0 +1,182 @@ +OUTPUT_ARCH(loongarch) +ENTRY(_start) + +MEMORY +{ + isram (rwxai) : ORIGIN = 0x1c000000, LENGTH = 512K + dsram (rwxai) : ORIGIN = 0x1c080000, LENGTH = 512K +} +SECTIONS +{ + __stack_size = DEFINED(__stack_size) ? __stack_size : 64K; + .init : + { + KEEP (*(SORT_NONE(.init))) + } >isram AT>isram + .ilalign : + { + . = ALIGN(16); + PROVIDE( _isram_lma = . ); + } >isram AT>isram + .ialign : + { + PROVIDE( _isram = . ); + } >isram AT>isram + .text : + { + _ftext = . ; + *(.text.unlikely .text.unlikely.*) + *(.text.startup .text.startup.*) + *(.text .text.*) + *(.gnu.linkonce.t.*) + + /* section information for finsh shell */ + . = ALIGN(4); + __fsymtab_start = .; + KEEP(*(FSymTab)) + __fsymtab_end = .; + + . = ALIGN(4); + __vsymtab_start = .; + KEEP(*(VSymTab)) + __vsymtab_end = .; + + /* section information for utest */ + . = ALIGN(4); + __rt_utest_tc_tab_start = .; + KEEP(*(UtestTcTab)) + __rt_utest_tc_tab_end = .; + + /* section information for at server */ + . = ALIGN(4); + __rtatcmdtab_start = .; + KEEP(*(RtAtCmdTab)) + __rtatcmdtab_end = .; + . = ALIGN(4); + + /* section information for initial. */ + . = ALIGN(4); + __rt_init_start = .; + KEEP(*(SORT(.rti_fn*))) + __rt_init_end = .; + + } >isram AT>isram + .fini : + { + KEEP (*(SORT_NONE(.fini))) + } >isram AT>isram + . = ALIGN(16); + PROVIDE (__etext = .); + PROVIDE (_etext = .); + PROVIDE (etext = .); + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } >isram AT>isram + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) + KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) + PROVIDE_HIDDEN (__init_array_end = .); + } >isram AT>isram + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) + KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) + PROVIDE_HIDDEN (__fini_array_end = .); + } >isram AT>isram + .ctors : + { + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + } >isram AT>isram + .dtors : + { + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + } >isram AT>isram + + . = ALIGN(16); + .ex_table_base : + { + _ex_table_base_start = .; + . = 0x500; + _ex_table_base_end = .; + } >isram AT>isram + + . = ALIGN(16); + PROVIDE( _eisram = . ); + + .lalign : + { + . = ALIGN(16); + PROVIDE( _data_lma = . ); + } >isram AT>isram + .dalign : + { + . = ALIGN(16); + PROVIDE( _data = . ); + } >dsram AT>isram + .data : + { + *(.rdata) + *(.rodata .rodata.*) + rodata_end = .; + *(.gnu.linkonce.r.*) + *(.data .data.*) + *(.gnu.linkonce.d.*) + . = ALIGN(16); + PROVIDE( __global_pointer$ = . + 0x800 ); + *(.sdata .sdata.*) + *(.gnu.linkonce.s.*) + . = ALIGN(16); + *(.srodata.cst16) + *(.srodata.cst8) + *(.srodata.cst4) + *(.srodata.cst2) + *(.srodata .srodata.*) + } >dsram AT>isram + . = ALIGN(16); + PROVIDE( _edata = . ); + PROVIDE( edata = . ); + PROVIDE( _fbss = . ); + .bss : + { + PROVIDE( __bss_start = . ); + *(.sbss*) + *(.sbss.*) + *(.dynsbss) + *(.scommon) + *(.bss) + *(.bss.*) + *(.dynbss) + *(.gnu.linkonce.sb.*) + *(.bss .bss.*) + *(.gnu.linkonce.b.*) + *(COMMON) + . = ALIGN(16); + } >dsram AT>dsram + . = ALIGN(16); + PROVIDE( _end = . ); + PROVIDE( end = . ); + PROVIDE (__heap_start = _end); + .stack ORIGIN(dsram) + LENGTH(dsram) - __stack_size : + { + PROVIDE( _heap_end = . ); + PROVIDE (__heap_end = _heap_end); + PROVIDE (__heap_size = __heap_end - __heap_start); + . = __stack_size; + PROVIDE( _stack = . ); + } >dsram AT>dsram +} diff --git a/sdk/software/bsp/env/start.S b/sdk/software/bsp/env/start.S new file mode 100644 index 0000000..d79d218 --- /dev/null +++ b/sdk/software/bsp/env/start.S @@ -0,0 +1,182 @@ +#include "regdef.h" +#include "uart_print.h" +#include "handler.h" + +.extern UART_BASE + + .section .init + .globl _start + .type _start,@function + +_start: + + ##init regs + addi.w $r1,zero,0x0; addi.w $r2,zero,0x0; addi.w $r3,zero,0x0; addi.w $r4,zero,0x0; + addi.w $r5,zero,0x0; addi.w $r6,zero,0x0; addi.w $r7,zero,0x0; addi.w $r8,zero,0x0; + addi.w $r9,zero,0x0; addi.w $r10,zero,0x0; addi.w $r11,zero,0x0; addi.w $r12,zero,0x0; + addi.w $r13,zero,0x0; addi.w $r14,zero,0x0; addi.w $r15,zero,0x0; addi.w $r16,zero,0x0; + addi.w $r17,zero,0x0; addi.w $r18,zero,0x0; addi.w $r19,zero,0x0; addi.w $r20,zero,0x0; + addi.w $r21,zero,0x0; addi.w $r22,zero,0x0; addi.w $r23,zero,0x0; addi.w $r24,zero,0x0; + addi.w $r25,zero,0x0; addi.w $r26,zero,0x0; addi.w $r27,zero,0x0; addi.w $r28,zero,0x0; + addi.w $r29,zero,0x0; addi.w $r30,zero,0x0; addi.w $r31,zero,0x0; + +#if has_cache==1 + # invalid the old inst in icache and old data in dcache by index + li.w t0,0x0 + #li.w t2,0x100 + li.w t2, cache_index_depth +1: + #slli.w t1, t0, 0x4 + slli.w t1, t0, cache_offset_width +#if cache_way==1 + cacop 0x00, t1, 0x0 + cacop 0x01, t1, 0x0 +#elif cache_way==2 + cacop 0x00, t1, 0x0 + cacop 0x00, t1, 0x1 + cacop 0x01, t1, 0x0 + cacop 0x01, t1, 0x1 +#elif cache_way==4 + cacop 0x00, t1, 0x0 + cacop 0x00, t1, 0x1 + cacop 0x00, t1, 0x2 + cacop 0x00, t1, 0x3 + cacop 0x01, t1, 0x0 + cacop 0x01, t1, 0x1 + cacop 0x01, t1, 0x2 + cacop 0x01, t1, 0x3 +#endif + addi.w t0, t0, 0x1 + bne t0, t2, 1b +#else + /* disable cache */ + li.w $r12,0x1 + csrwr $r12,0x101 +#endif + + /* open da mode */ + li.w $r12,0x8 + li.w $r13,0x18 + csrxchg $r12,$r13,0x0 + + /* init dmw */ + csrwr $r0,0x180 + csrwr $r0,0x181 + li.w $r12,0x09 + csrwr $r12,0x180 + li.w $r12,0xa0000009 + csrwr $r12,0x181 + + /* open pg mode */ + li.w $r12,0x10 + li.w $r13,0x18 + csrxchg $r12,$r13,0x0 + + /* load data section */ + la.local t0, _data_lma + la.local t1, _data + la.local t2, _edata + bgeu t1, t2, 2f +1: + ld.w t3, t0, 0 + st.w t3, t1, 0 + addi.w t0, t0, 4 + addi.w t1, t1, 4 + bltu t1, t2, 1b +2: + + /* clear bss section */ + la.local t0, __bss_start + la.local t1, _end + bgeu t0, t1, 2f +1: + st.w $r0, t0, 0 + addi.w t0, t0, 4 + bltu t0, t1, 1b +2: + + /* enable cache */ +#if has_cache==1 + li.w $r12,0x19 + csrwr $r12,0x180 +#else + +#endif + + /* init UART */ + la.local t0, UART_BASE + ld.w t1, t0, 0 + #WRITE(li.wne,OFS_FIFO,FIFO_ENABLE|FIFO_RCV_RST|FIFO_XMT_RST|FIFO_TRIGGER_0); + li.w t2, 0x07 + st.b t2, t1, 2 + #WRITE(li.wne,OFS_LINE_CONTROL, 0x80); + li.w t2, 0x80 + st.b t2, t1, 3 + #WRITE(li.wne,OFS_DIVISOR_MSB, (divisor & 0xff00) >> 8); + li.w t2, 0x00 + st.b t2, t1, 1 + #WRITE(li.wne,OFS_DIVISOR_LSB, divisor & 0xff); + li.w t3, 0xbf20f500 + ld.w t3, t3, 0 + li.w t2, 0x1b + beq zero, t3, 1f + li.w t2, 0x1 +1: + st.b t2, t1, 0 + #WRITE(li.wne,OFS_DATA_FORMAT, data | parity | stop); + li.w t2, 0x3 + st.b t2, t1, 3 + #WRITE(li.wne,OFS_MODEM_CONTROL,0); + li.w t2, 0x0 + st.b t2, t1, 4 + + /* init exception */ +#ifdef RTThread + la.local t0, rtthread_irq_entry +#else + la.local t0, trap_handler +#endif + csrwr t0, csr_eentry + + #clear int + li.w t1, 0x1 + csrwr t1, csr_ticlr + + #enable int + li.w t1, 0x4 +#ifdef RTThread + csrxchg zero, t1, csr_crmd +#else + csrxchg t1, t1, csr_crmd +#endif + csrwr zero, csr_prmd + li.w t1, 0x1fff + csrwr zero, csr_ecfg + csrwr t1, csr_ecfg + + + la.local sp, _stack + + /* argc = argv = 0 */ + li.w a0, 0 + li.w a1, 0 + +#ifdef RTThread + bl entry +#else + bl main +#endif + + /*tail exit*/ + bl _myexit +1: + b 1b + +.globl _myexit +.org 0x200 +_myexit: +1: + b 1b + + + diff --git a/sdk/software/bsp/env/trap_handler.S b/sdk/software/bsp/env/trap_handler.S new file mode 100644 index 0000000..c55bb8b --- /dev/null +++ b/sdk/software/bsp/env/trap_handler.S @@ -0,0 +1,188 @@ +#include "regdef.h" + +.macro TRAP_ENTRY_SETJMP + addi.w sp, sp, -124 + + st.w ra, sp, 120 + st.w tp, sp, 116 + st.w sp, sp, 112 + st.w a0, sp, 108 + st.w a1, sp, 104 + st.w a2, sp, 100 + st.w a3, sp, 96 + st.w a4, sp, 92 + st.w a5, sp, 88 + st.w a6, sp, 84 + st.w a7, sp, 80 + st.w t0, sp, 76 + st.w t1, sp, 72 + st.w t2, sp, 68 + st.w t3, sp, 64 + st.w t4, sp, 60 + st.w t5, sp, 56 + st.w t6, sp, 52 + st.w t7, sp, 48 + st.w t8, sp, 44 + st.w $r21, sp,40 + st.w fp, sp, 36 + st.w s0, sp, 32 + st.w s1, sp, 28 + st.w s2, sp, 24 + st.w s3, sp, 20 + st.w s4, sp, 16 + st.w s5, sp, 12 + st.w s6, sp, 8 + st.w s7, sp, 4 + st.w s8, sp, 0 + +.endm + +.macro TRAP_EXIT_LONGJMP + + ld.w ra, sp, 120 + ld.w tp, sp, 116 + ld.w sp, sp, 112 + ld.w a0, sp, 108 + ld.w a1, sp, 104 + ld.w a2, sp, 100 + ld.w a3, sp, 96 + ld.w a4, sp, 92 + ld.w a5, sp, 88 + ld.w a6, sp, 84 + ld.w a7, sp, 80 + ld.w t0, sp, 76 + ld.w t1, sp, 72 + ld.w t2, sp, 68 + ld.w t3, sp, 64 + ld.w t4, sp, 60 + ld.w t5, sp, 56 + ld.w t6, sp, 52 + ld.w t7, sp, 48 + ld.w t8, sp, 44 + ld.w $r21, sp,40 + ld.w fp, sp, 36 + ld.w s0, sp, 32 + ld.w s1, sp, 28 + ld.w s2, sp, 24 + ld.w s3, sp, 20 + ld.w s4, sp, 16 + ld.w s5, sp, 12 + ld.w s6, sp, 8 + ld.w s7, sp, 4 + ld.w s8, sp, 0 + + addi.w sp, sp, 124 + + ertn + +.endm + + .section .text + .align 6 + .global trap_handler + .weak trap_handler +trap_handler: + + TRAP_ENTRY_SETJMP + + csrrd a0, csr_estat + csrrd a1, csr_era + + srli.w t0, a0, 16 + bne zero, t0, is_exceptions + andi t0, a0, 0x3FC + srli.w t1, t0, 2 + + # 根据中断号跳转到相应的处理程序 priority + move t2, t1 + andi t2, t2, 0x1 + li.w t8, 0x1 + beq t2, t8, handle_hwi0 + + move t2, t1 + andi t2, t2, 0x2 + li.w t8, 0x2 + beq t2, t8, handle_hwi1 + + move t2, t1 + andi t2, t2, 0x4 + li.w t8, 0x4 + beq t2, t8, handle_hwi2 + + move t2, t1 + andi t2, t2, 0x8 + li.w t8, 0x8 + beq t2, t8, handle_hwi3 + + move t2, t1 + andi t2, t2, 0x10 + li.w t8, 0x10 + beq t2, t8, handle_hwi4 + + move t2, t1 + andi t2, t2, 0x20 + li.w t8, 0x20 + beq t2, t8, handle_hwi5 + + move t2, t1 + andi t2, t2, 0x40 + li.w t8, 0x40 + beq t2, t8, handle_hwi6 + + move t2, t1 + andi t2, t2, 0x80 + li.w t8, 0x80 + beq t2, t8, handle_hwi7 + + b trap_jump_exit + +is_exceptions: + addi.w t8, a1, 4 + csrwr t8, csr_era +1: + b 1b + +trap_jump_exit: + TRAP_EXIT_LONGJMP + + +# HWI0 处理程序 +handle_hwi0: + + bl HWI0_IntrHandler + + b trap_jump_exit + +# HWI1 处理程序 +handle_hwi1: + b trap_jump_exit + +# HWI2 处理程序 +handle_hwi2: + b trap_jump_exit + +# HWI3 处理程序 +handle_hwi3: + b trap_jump_exit + +# HWI4 处理程序 +handle_hwi4: + b trap_jump_exit + +# HWI5 处理程序 +handle_hwi5: + b trap_jump_exit + +# HWI6 处理程序 +handle_hwi6: + b trap_jump_exit + +# HWI7 处理程序 +handle_hwi7: + b trap_jump_exit + + +.weak HWI0_IntrHandler +HWI0_IntrHandler: +1: + b 1b diff --git a/sdk/software/bsp/include/common_func.h b/sdk/software/bsp/include/common_func.h new file mode 100644 index 0000000..33fbfa5 --- /dev/null +++ b/sdk/software/bsp/include/common_func.h @@ -0,0 +1,99 @@ +#ifndef common_func_H +#define common_func_H + +#include + +typedef signed int S32; +typedef unsigned int U32; +typedef unsigned int uint32_t; +typedef signed short S16; +typedef unsigned short U16; +typedef signed char S8; +typedef unsigned char U8; +typedef long long S64; +typedef unsigned long long U64; + +void RegWrite(unsigned int addr,unsigned int var); +unsigned int RegRead(unsigned int addr); +void SaveMemory(unsigned int *DestAddr, unsigned int *SrcAddr, unsigned int Size); + +static inline U32 csr_readl(U32 reg) +{ + return __csrrd_w(reg); +} + +static inline U64 csr_readq(U32 reg) +{ + return __csrrd_w(reg); +} + +static inline void csr_writel(U32 val, U32 reg) +{ + __csrwr_w(val, reg); +} + +static inline void csr_writeq(U64 val, U32 reg) +{ + __csrwr_w(val, reg); +} + +static inline U32 csr_xchgl(U32 val, U32 mask, U32 reg) +{ + return __csrxchg_w(val, mask, reg); +} + +static inline U64 csr_xchgq(U64 val, U64 mask, U32 reg) +{ + return __csrxchg_w(val, mask, reg); +} + +#define CacheOp_Cache 0x03 +#define CacheOp_Op 0x1c + +#define Cache_I 0x00 +#define Cache_D 0x01 +#define Cache_V 0x02 +#define Cache_S 0x03 + +#define Index_Invalidate 0x08 +#define Index_Writeback_Inv 0x08 +#define Hit_Invalidate 0x10 +#define Hit_Writeback_Inv 0x10 + +#define Index_Invalidate_I (Cache_I | Index_Invalidate) +#define Index_Writeback_Inv_D (Cache_D | Index_Writeback_Inv) +#define Hit_Invalidate_I (Cache_I | Hit_Invalidate) +#define Hit_Writeback_Inv_D (Cache_D | Hit_Writeback_Inv) + +#define cache_op(op, addr) \ + __asm__ __volatile__( \ + " cacop %0, %1 \n" \ + : \ + : "i" (op), "R" (*(unsigned char *)(addr))) + +static inline void flush_icache_line_indexed(unsigned long addr) +{ + cache_op(Index_Invalidate_I, addr); +} + +static inline void flush_dcache_line_indexed(unsigned long addr) +{ + cache_op(Index_Writeback_Inv_D, addr); +} + +static inline void flush_icache_line(unsigned long addr) +{ + cache_op(Hit_Invalidate_I, addr); +} + +static inline void flush_dcache_line(unsigned long addr) +{ + cache_op(Hit_Writeback_Inv_D, addr); +} + +static inline void init_dcache_line(unsigned long addr) +{ + cache_op(0x01, addr); +} + +#endif diff --git a/sdk/software/bsp/include/confreg_time.h b/sdk/software/bsp/include/confreg_time.h new file mode 100644 index 0000000..9276762 --- /dev/null +++ b/sdk/software/bsp/include/confreg_time.h @@ -0,0 +1,22 @@ +#ifndef _CONFREG_TIME_H_H +#define _CONFREG_TIME_H_H + +extern unsigned long CONFREG_TIMER_BASE; +extern unsigned long CONFREG_CLOCKS_PER_SEC; +extern unsigned long CORE_CLOCKS_PER_SEC; + +#define MSEC_PER_SEC 1000L +#define USEC_PER_MSEC 1000L +#define NSEC_PER_USEC 1000L +#define NSEC_PER_MSCEC 1000000L +#define USEC_PER_SEC 1000000L +#define NSEC_PER_SEC 1000000000L +#define FSEC_PER_SEC 1000000000000000LL + +unsigned long get_cpu_clock_count();//获取处理器核统计的时钟周期数 +unsigned long get_confreg_clock_count();//获取CONFREG的时钟周期数 +unsigned long get_clock_count();//根据是否存在宏 USE_CPU_CLOCK_COUNT 输出 处理器核/CONFREG 的计数器值 +unsigned long get_ns(void);//获取统计的纳秒数 +unsigned long get_us(void);//获取统计的微秒数 + +#endif diff --git a/sdk/software/bsp/include/core_time.h b/sdk/software/bsp/include/core_time.h new file mode 100644 index 0000000..e847179 --- /dev/null +++ b/sdk/software/bsp/include/core_time.h @@ -0,0 +1,8 @@ +#ifndef CORE_TIME_H +#define CORE_TIME_H + +#include "common_func.h" + +void delay_ms(uint32_t ms); + +#endif diff --git a/sdk/software/bsp/include/dvi.h b/sdk/software/bsp/include/dvi.h new file mode 100644 index 0000000..75b5854 --- /dev/null +++ b/sdk/software/bsp/include/dvi.h @@ -0,0 +1,21 @@ +#ifndef DVI_H +#define DVI_H +#include "common_func.h" + +#define DVI_BASEADDR 0xbf100000 + +#define DVI_RECT_DIR (DVI_BASEADDR + 0x0) + +#define DVI_RECT_L_W (DVI_BASEADDR + 0x4) + +#define DVI_SQU_DIR (DVI_BASEADDR + 0x8) + +#define DVI_SQU_R (DVI_BASEADDR + 0xC) + +// draw rect on DVI to x y +void DVI_Draw_Rect(uint32_t x, uint32_t y, uint32_t l, uint32_t w); + +// draw squ on DVI to x y r +void DVI_Draw_SQU(uint32_t x, uint32_t y, uint32_t r); + +#endif // DVI diff --git a/sdk/software/bsp/include/handler.h b/sdk/software/bsp/include/handler.h new file mode 100644 index 0000000..a412b8c --- /dev/null +++ b/sdk/software/bsp/include/handler.h @@ -0,0 +1,31 @@ +#ifndef _HANDLER_H +#define _HANDLER_H + +#define ex_tlb_load_present_type 0x1 +#define ex_tlb_store_present_type 0x2 +#define ex_tlb_fetch_present_type 0x3 +#define ex_tlb_modify_type 0x4 +#define ex_tlb_read_inhibit_type 0x5 +#define ex_tlb_execute_inhibit_type 0x6 +#define ex_tlb_privilege_error_type 0x7 +#define ex_ade_type 0x8 +#define ex_align_check_type 0x9 +#define ex_bound_check_error_type 0xa +#define ex_syscall_type 0xb +#define ex_break_type 0xc +#define ex_ri_type 0xd +#define ex_previlege_inst_type 0xe +#define ex_fpe_disable_type 0xf +#define ex_lsx_disable_type 0x10 +#define ex_lasx_disable_type 0x11 +#define ex_fpe_type 0x12 +#define ex_watch_type 0x13 +#define ex_bt_disable_type 0x14 +#define ex_bt_help_type 0x15 +#define ex_psi_type 0x16 +#define ex_hypcall_type 0x17 +#define ex_field_change_type 0x18 +#define ex_sate_related_type 0x19 +#define ex_tlb_refill 0x3f + +#endif diff --git a/sdk/software/bsp/include/led.h b/sdk/software/bsp/include/led.h new file mode 100644 index 0000000..8ba60e1 --- /dev/null +++ b/sdk/software/bsp/include/led.h @@ -0,0 +1,14 @@ +#ifndef LED_H +#define LED_H + +#include "common_func.h" + +#define LEDS_BASEADDR 0xbf20f300 + +#define LEDS_GPIO_DATA (LEDS_BASEADDR + 0x00) + +// set leds pin +void setLedPin(uint32_t data); +void toggleLedPin(uint32_t data); + +#endif diff --git a/sdk/software/bsp/include/regdef.h b/sdk/software/bsp/include/regdef.h new file mode 100644 index 0000000..f93c476 --- /dev/null +++ b/sdk/software/bsp/include/regdef.h @@ -0,0 +1,104 @@ +#ifndef _SYS_REGDEF_H +#define _SYS_REGDEF_H + +# define zero $r0 +# define ra $r1 +# define tp $r2 +# define sp $r3 +# define a0 $r4 +# define a1 $r5 +# define a2 $r6 +# define a3 $r7 +# define a4 $r8 +# define a5 $r9 +# define a6 $r10 +# define a7 $r11 +# define v0 $r4 +# define v1 $r5 +# define t0 $r12 +# define t1 $r13 +# define t2 $r14 +# define t3 $r15 +# define t4 $r16 +# define t5 $r17 +# define t6 $r18 +# define t7 $r19 +# define t8 $r20 +# define x $r21 +# define fp $r22 +# define s0 $r23 +# define s1 $r24 +# define s2 $r25 +# define s3 $r26 +# define s4 $r27 +# define s5 $r28 +# define s6 $r29 +# define s7 $r30 +# define s8 $r31 + +# define fa0 $f0 +# define fa1 $f1 +# define fa2 $f2 +# define fa3 $f3 +# define fa4 $f4 +# define fa5 $f5 +# define fa6 $f6 +# define fa7 $f7 +# define fv0 $f0 +# define fv1 $f1 +# define ft0 $f8 +# define ft1 $f9 +# define ft2 $f10 +# define ft3 $f11 +# define ft4 $f12 +# define ft5 $f13 +# define ft6 $f14 +# define ft7 $f15 +# define ft8 $f16 +# define ft9 $f17 +# define ft10 $f18 +# define ft11 $f19 +# define ft12 $f20 +# define ft13 $f21 +# define ft14 $f22 +# define ft15 $f23 +# define fs0 $f24 +# define fs1 $f25 +# define fs2 $f26 +# define fs3 $f27 +# define fs4 $f28 +# define fs5 $f29 +# define fs6 $f30 +# define fs7 $f31 + +#define csr_crmd 0x0 +#define csr_prmd 0x1 +#define csr_euen 0x2 +#define csr_ecfg 0x4 +#define csr_estat 0x5 +#define csr_era 0x6 +#define csr_badv 0x7 +#define csr_eentry 0xc +#define csr_tlbidx 0x10 +#define csr_tlbehi 0x11 +#define csr_tlbelo0 0x12 +#define csr_tlbelo1 0x13 +#define csr_asid 0x18 +#define csr_pgdl 0x19 +#define csr_pgdh 0x1a +#define csr_pgd 0x1b +#define csr_cpuid 0x20 +#define csr_save0 0x30 +#define csr_save1 0x31 +#define csr_save2 0x32 +#define csr_save3 0x33 +#define csr_tid 0x40 +#define csr_tcfg 0x41 +#define csr_tval 0x42 +#define csr_ticlr 0x44 +#define csr_llbctl 0x60 +#define csr_tlbrentry 0x88 +#define csr_dmw0 0x180 +#define csr_dmw1 0x181 + +#endif diff --git a/sdk/software/bsp/include/seg7.h b/sdk/software/bsp/include/seg7.h new file mode 100644 index 0000000..6d2e7ad --- /dev/null +++ b/sdk/software/bsp/include/seg7.h @@ -0,0 +1,17 @@ +// seg7.h + +#ifndef SEG7_H +#define SEG7_H + +#include "common_func.h" + +#define SEG7_BASEADDR 0xbf20f200 + +#define SEG7_SELECT (SEG7_BASEADDR + 0x00) + +#define SEG7_NUM (SEG7_BASEADDR + 0x04) + +// set seg num +void setSegNum(uint32_t seg1,uint32_t num1,uint32_t seg2,uint32_t num2); + +#endif diff --git a/sdk/software/bsp/include/uart_print.h b/sdk/software/bsp/include/uart_print.h new file mode 100644 index 0000000..5e35324 --- /dev/null +++ b/sdk/software/bsp/include/uart_print.h @@ -0,0 +1,12 @@ +#ifndef _UART_PRINT_H +#define _UART_PRINT_H + +#define UART_PRINT(str)\ + la a0, 1f;\ + .section .rodata ;\ + 1: ;\ + .asciz str ;\ + .section .init ;\ + bl %plt(puts) + +#endif diff --git a/sdk/software/examples/.gitignore b/sdk/software/examples/.gitignore new file mode 100644 index 0000000..9da6d68 --- /dev/null +++ b/sdk/software/examples/.gitignore @@ -0,0 +1,56 @@ +# ======================================== +# Build outputs (per-project obj/ directories) +# ======================================== +obj/ +*.o + +# ======================================== +# Editor / IDE +# ======================================== +.vscode/ +.idea/ +*.swp +*.swo +*~ +\#*\# +.\#* + +# ======================================== +# OS generated files +# ======================================== +.DS_Store +Thumbs.db +desktop.ini + +# ======================================== +# FPGA / Vivado project files (if any leak in) +# ======================================== +*.bit +*.dcp +*.jou +*.xpr +*.xrf +*.bd +*.xci +*.xdc +*.vcd +*.wcfg +*.wdb +*.edif +.svn/ +.Xil/ +.hw/ +.runs/ +.sim/ +.ip_user_files/ +vivado_*.log +vivado_*.backup.jou +Nexys4DDR/ +*.cache/ +*.gen/ + +# ======================================== +# Misc +# ======================================== +*.tmp +*.log diff --git a/sdk/software/examples/asm/Makefile b/sdk/software/examples/asm/Makefile new file mode 100644 index 0000000..c953dd5 --- /dev/null +++ b/sdk/software/examples/asm/Makefile @@ -0,0 +1,11 @@ +TARGET = user-sample + +CFLAGS += -O3 -g + +C_SRCS := $(wildcard ./*.c ) + +OBJDIR = obj +COMMON_DIR = ../../bsp +GCC_DIR=../../../toolchains/loongson-gnu-toolchain-8.3-x86_64-loongarch32r-linux-gnusf-v2.0 +PICOLIBC_DIR=../../../toolchains/picolibc +include ../../bsp/common.mk diff --git a/sdk/software/examples/asm/user-sample.c b/sdk/software/examples/asm/user-sample.c new file mode 100644 index 0000000..e69de29 diff --git a/sdk/software/examples/c_prg/inner_product/Makefile b/sdk/software/examples/c_prg/inner_product/Makefile new file mode 100644 index 0000000..c80b65f --- /dev/null +++ b/sdk/software/examples/c_prg/inner_product/Makefile @@ -0,0 +1,14 @@ +TARGET = inner_product + +CFLAGS += -O3 -g + +#根据SIMU宏选择串口波特率,0:FPGA上板;1:仿真 +CFLAGS += -DSIMU=0 + +C_SRCS := $(wildcard ./*.c ) + +OBJDIR = obj +COMMON_DIR = ../../../bsp +GCC_DIR=../../../../toolchains/loongson-gnu-toolchain-8.3-x86_64-loongarch32r-linux-gnusf-v2.0 +PICOLIBC_DIR=../../../../toolchains/picolibc +include ../../../bsp/common.mk diff --git a/sdk/software/examples/c_prg/inner_product/inner_product.c b/sdk/software/examples/c_prg/inner_product/inner_product.c new file mode 100644 index 0000000..2e62d88 --- /dev/null +++ b/sdk/software/examples/c_prg/inner_product/inner_product.c @@ -0,0 +1,446 @@ +/* + Copyright 2008 Adobe Systems Incorporated + Copyright 2018-2019 Chris Cox + Distributed under the MIT License (see accompanying file LICENSE_1_0_0.txt + or a copy at http://stlab.adobe.com/licenses.html ) + + +Goal: Test performance of various idioms for calculating the inner product of two sequences. + +NOTE: Inner products are common in mathematical and geometry processing applications, + plus some audio and image processing. + + +Assumptions: + 1) The compiler will optimize inner product operations. + + 2) The compiler may recognize ineffecient inner product idioms + and substitute efficient methods when it can. + NOTE: the best method is highly dependent on the data types and CPU architecture + + 3) std::inner_product will be well optimized for all types and containers. + + +*/ + +/******************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include + +/******************************************************************************/ +/******************************************************************************/ +//BSP板级支持包所需全局变量 +unsigned long UART_BASE = 0xbfe001e0; //UART16550的虚地址 +unsigned long CONFREG_UART_BASE = 0xbfafff10; //CONFREG模拟UART的虚地址 +unsigned long CONFREG_TIMER_BASE = 0xbfafe000; //CONFREG计数器的虚地址 +unsigned long CONFREG_CLOCKS_PER_SEC = 100000000L; //CONFREG时钟频率 +unsigned long CORE_CLOCKS_PER_SEC = 33000000L; //处理器核时钟频率 + +clock_t start_time, end_time; + +// this constant may need to be adjusted to give reasonable minimum times +// For best results, times should be about 1.0 seconds for the minimum test run +int iterations = 5; + + +// 8000 items, or between 8 and 64k of data +// this is intended to remain within the L2 cache of most common CPUs +const int SIZE = 8000; + + +// initial value for filling our arrays, may be changed from the command line +int32_t init_value_8 = 3; +int32_t init_value_16 = 211; +int32_t init_value_32 = 1065; +float init_value_f16 = 5.0; +double init_value_f32 = 365.0; + +/******************************************************************************/ +/******************************************************************************/ + +void fill_8(int8_t * first, int8_t * last, int8_t value) { + while (first != last) *first++ = (int8_t)(value); +} + +void fill_u8(uint8_t * first, uint8_t * last, uint8_t value) { + while (first != last) *first++ = (uint8_t)(value); +} + +void fill_16(int16_t * first, int16_t * last, int16_t value) { + while (first != last) *first++ = (int16_t)(value); +} + +void fill_u16(uint16_t * first, uint16_t * last, uint16_t value) { + while (first != last) *first++ = (uint16_t)(value); +} + +void fill_32(int32_t * first, int32_t * last, int32_t value) { + while (first != last) *first++ = (int32_t)(value); +} + +void fill_u32(uint32_t * first, uint32_t * last, uint32_t value) { + while (first != last) *first++ = (uint32_t)(value); +} + +void fill_f16(float * first, float * last, float value) { + while (first != last) *first++ = (float)(value); +} + +void fill_f32(double * first, double * last, double value) { + while (first != last) *first++ = (double)(value); +} + +/******************************************************************************/ +/******************************************************************************/ +// a trivial for loop + +void test_inner_product_8( const int8_t* first, const int8_t* second, const size_t count, const char *label) { + + start_time = clock(); + + for(int i = 0; i < iterations; ++i) { + + int8_t sum = 0 ; + for (size_t j = 0; j < count; ++j) { + sum += first[j] * second[j]; + } + + //check_sum( sum, label ); + int8_t target = (int8_t)(init_value_8)*(int8_t)(init_value_8)*SIZE; + if ( abs( sum - target ) > (int8_t)(1.0e-6) ) + printf("test %s failed\n", label); + } + + // need the labels to remain valid until we print the summary + end_time = clock(); + + double time_cost = (end_time - start_time)/ (double)(CLOCKS_PER_SEC); + printf("CLOCKS_PER_SEC=%d\n",CLOCKS_PER_SEC); + printf("\"%s, %lu items\" %f sec\n", + label, + count, + time_cost); +} + +void test_inner_product_u8( const uint8_t* first, const uint8_t* second, const size_t count, const char *label) { + + start_time = clock(); + + for(int i = 0; i < iterations; ++i) { + + uint8_t sum = 0 ; + for (size_t j = 0; j < count; ++j) { + sum += first[j] * second[j]; + } + + //check_sum( sum, label ); + uint8_t target = (uint8_t)(init_value_8)*(uint8_t)(init_value_8)*SIZE; + if ( ( sum - target ) > (uint8_t)(1.0e-6) ) + printf("test %s failed\n", label); + } + + // need the labels to remain valid until we print the summary + end_time = clock(); + + double time_cost = (end_time - start_time)/ (double)(CLOCKS_PER_SEC); + printf("\"%s, %lu items\" %f sec\n", + label, + count, + time_cost); +} + +void test_inner_product_16( const int16_t* first, const int16_t* second, const size_t count, const char *label) { + + start_time = clock(); + + for(int i = 0; i < iterations; ++i) { + + int16_t sum = 0 ; + for (size_t j = 0; j < count; ++j) { + sum += first[j] * second[j]; + } + + //check_sum( sum, label ); + int16_t target = (int16_t)(init_value_16)*(int16_t)(init_value_16)*SIZE; + if ( abs( sum - target ) > (int16_t)(1.0e-6) ) + printf("test %s failed\n", label); + } + + // need the labels to remain valid until we print the summary + end_time = clock(); + + double time_cost = (end_time - start_time)/ (double)(CLOCKS_PER_SEC); + printf("\"%s, %lu items\" %f sec\n", + label, + count, + time_cost); +} + +void test_inner_product_u16( const uint16_t* first, const uint16_t* second, const size_t count, const char *label) { + + start_time = clock(); + + for(int i = 0; i < iterations; ++i) { + + uint16_t sum = 0 ; + for (size_t j = 0; j < count; ++j) { + sum += first[j] * second[j]; + } + + //check_sum( sum, label ); + uint16_t target = (uint16_t)(init_value_16)*(uint16_t)(init_value_16)*SIZE; + if ( ( sum - target ) > (uint16_t)(1.0e-6) ) + printf("test %s failed\n", label); + } + + // need the labels to remain valid until we print the summary + end_time = clock(); + + double time_cost = (end_time - start_time)/ (double)(CLOCKS_PER_SEC); + printf("\"%s, %lu items\" %f sec\n", + label, + count, + time_cost); +} + +void test_inner_product_32( const int32_t* first, const int32_t* second, const size_t count, const char *label) { + + start_time = clock(); + + for(int i = 0; i < iterations; ++i) { + + int32_t sum = 0 ; + for (size_t j = 0; j < count; ++j) { + sum += first[j] * second[j]; + } + + //check_sum( sum, label ); + int32_t target = (int32_t)(init_value_32)*(int32_t)(init_value_32)*SIZE; + if ( abs( sum - target ) > (int32_t)(1.0e-6) ) + printf("test %s failed\n", label); + } + + // need the labels to remain valid until we print the summary + end_time = clock(); + + double time_cost = (end_time - start_time)/ (double)(CLOCKS_PER_SEC); + printf("\"%s, %lu items\" %f sec\n", + label, + count, + time_cost); +} + +void test_inner_product_u32( const uint32_t* first, const uint32_t* second, const size_t count, const char *label) { + + start_time = clock(); + + for(int i = 0; i < iterations; ++i) { + + uint32_t sum = 0 ; + for (size_t j = 0; j < count; ++j) { + sum += first[j] * second[j]; + } + + //check_sum( sum, label ); + uint32_t target = (uint32_t)(init_value_32)*(uint32_t)(init_value_32)*SIZE; + if ( ( sum - target ) > (uint32_t)(1.0e-6) ) + printf("test %s failed\n", label); + } + + // need the labels to remain valid until we print the summary + end_time = clock(); + + double time_cost = (end_time - start_time)/ (double)(CLOCKS_PER_SEC); + printf("\"%s, %lu items\" %f sec\n", + label, + count, + time_cost); +} + +void test_inner_product_f16( const float* first, const float* second, const size_t count, const char *label) { + + start_time = clock(); + + for(int i = 0; i < iterations; ++i) { + + float sum = 0 ; + for (size_t j = 0; j < count; ++j) { + sum += first[j] * second[j]; + } + + //check_sum( sum, label ); + float target = (float)(init_value_f16)*(float)(init_value_f16)*SIZE; + if ( fabs( sum - target ) > (float)(1.0e-6) ) + printf("test %s failed\n", label); + } + + // need the labels to remain valid until we print the summary + end_time = clock(); + + double time_cost = (end_time - start_time)/ (double)(CLOCKS_PER_SEC); + printf("\"%s, %lu items\" %f sec\n", + label, + count, + time_cost); +} + +void test_inner_product_f32( const double* first, const double* second, const size_t count, const char *label) { + + start_time = clock(); + + for(int i = 0; i < iterations; ++i) { + + double sum = 0 ; + for (size_t j = 0; j < count; ++j) { + sum += first[j] * second[j]; + } + + //check_sum( sum, label ); + double target = (double)(init_value_f32)*(double)(init_value_f32)*SIZE; + if ( fabs( sum - target ) > (double)(1.0e-6) ) + printf("test %s failed\n", label); + } + + // need the labels to remain valid until we print the summary + end_time = clock(); + + double time_cost = (end_time - start_time)/ (double)(CLOCKS_PER_SEC); + printf("\"%s, %lu items\" %f sec\n", + label, + count, + time_cost); +} + +/******************************************************************************/ +/******************************************************************************/ + +// NOTE - can't make generic template template argument without C++17 +// I would like to have TestOneFunction to handle all the types and if's, but need to use different types with it inside +// see sum_sequence.cpp + + +void TestOneType_8() +{ + int8_t data[SIZE]; + int8_t dataB[SIZE]; + + fill_8(data, data+SIZE, (int8_t)(init_value_8)); + fill_8(dataB, dataB+SIZE, (int8_t)(init_value_8)); + + test_inner_product_8( data, dataB, SIZE, "int_8 inner_product1 to int_8"); +} + +void TestOneType_u8() +{ + uint8_t data[SIZE]; + uint8_t dataB[SIZE]; + + fill_u8(data, data+SIZE, (uint8_t)(init_value_8)); + fill_u8(dataB, dataB+SIZE, (uint8_t)(init_value_8)); + + test_inner_product_u8( data, dataB, SIZE, "uint_8 inner_product1 to uint_8"); +} + + +void TestOneType_16() +{ + int16_t data[SIZE]; + int16_t dataB[SIZE]; + + fill_16(data, data+SIZE, (int16_t)(init_value_16)); + fill_16(dataB, dataB+SIZE, (int16_t)(init_value_16)); + + test_inner_product_16( data, dataB, SIZE, "int_16 inner_product1 to int_16"); +} + +void TestOneType_u16() +{ + uint16_t data[SIZE]; + uint16_t dataB[SIZE]; + + fill_u16(data, data+SIZE, (uint16_t)(init_value_16)); + fill_u16(dataB, dataB+SIZE, (uint16_t)(init_value_16)); + + test_inner_product_u16( data, dataB, SIZE, "uint_16 inner_product1 to uint_16"); +} + +void TestOneType_32() +{ + int32_t data[SIZE]; + int32_t dataB[SIZE]; + + fill_32(data, data+SIZE, (int32_t)(init_value_32)); + fill_32(dataB, dataB+SIZE, (int32_t)(init_value_32)); + + test_inner_product_32( data, dataB, SIZE, "int_32 inner_product1 to int_32"); +} + +void TestOneType_u32() +{ + uint32_t data[SIZE]; + uint32_t dataB[SIZE]; + + fill_u32(data, data+SIZE, (uint32_t)(init_value_32)); + fill_u32(dataB, dataB+SIZE, (uint32_t)(init_value_32)); + + test_inner_product_u32( data, dataB, SIZE, "uint_32 inner_product1 to uint_32"); +} + +void TestOneType_f16() +{ + float data[SIZE]; + float dataB[SIZE]; + + fill_f16(data, data+SIZE, (float)(init_value_f16)); + fill_f16(dataB, dataB+SIZE, (float)(init_value_f16)); + + test_inner_product_f16( data, dataB, SIZE, "float inner_product1 to float"); +} + +void TestOneType_f32() +{ + double data[SIZE]; + double dataB[SIZE]; + + fill_f32(data, data+SIZE, (double)(init_value_f32)); + fill_f32(dataB, dataB+SIZE, (double)(init_value_f32)); + + test_inner_product_f32( data, dataB, SIZE, "double inner_product1 to double"); +} +/******************************************************************************/ +/******************************************************************************/ + +int main(int argc, char** argv) { + + // output command for documentation: + int i; + // for (i = 0; i < argc; ++i) + // printf("%s ", argv[i] ); + // printf("\n"); + + if (argc > 1) iterations = atoi(argv[1]); + // if (argc > 2) init_value = (int32_t) atoi(argv[2]); + + + TestOneType_8(); + TestOneType_u8(); + TestOneType_16(); + TestOneType_u16(); + TestOneType_32(); + TestOneType_u32(); + + TestOneType_f16(); + TestOneType_f32(); + + return 0; +} + +// the end +/******************************************************************************/ +/******************************************************************************/ diff --git a/sdk/software/examples/c_prg/lookup_table/Makefile b/sdk/software/examples/c_prg/lookup_table/Makefile new file mode 100644 index 0000000..2bc1f33 --- /dev/null +++ b/sdk/software/examples/c_prg/lookup_table/Makefile @@ -0,0 +1,14 @@ +TARGET = lookup_table + +CFLAGS += -O3 -g + +#根据SIMU宏选择串口波特率,0:FPGA上板;1:仿真 +CFLAGS += -DSIMU=0 + +C_SRCS := $(wildcard ./*.c ) + +OBJDIR = obj +COMMON_DIR = ../../../bsp +GCC_DIR=../../../../toolchains/loongson-gnu-toolchain-8.3-x86_64-loongarch32r-linux-gnusf-v2.0 +PICOLIBC_DIR=../../../../toolchains/picolibc +include ../../../bsp/common.mk diff --git a/sdk/software/examples/c_prg/lookup_table/lookup_table.c b/sdk/software/examples/c_prg/lookup_table/lookup_table.c new file mode 100644 index 0000000..f6d6393 --- /dev/null +++ b/sdk/software/examples/c_prg/lookup_table/lookup_table.c @@ -0,0 +1,315 @@ +/* + Copyright 2008-2009 Adobe Systems Incorporated + Copyright 2018 Chris Cox + Distributed under the MIT License (see accompanying file LICENSE_1_0_0.txt + or a copy at http://stlab.adobe.com/licenses.html ) + + +Goal: Test performance of various idioms and optimizations for lookup tables. + + +Assumptions: + 1) The compiler will optimize lookup table operations. + Unrolling will usually be needed to hide read latencies. + + 2) The compiler should recognize ineffecient lookup table idioms and substitute efficient methods. + Many different CPU architecture issues will require reading and writing words for best performance. + CPUs with... + cache write-back/write-combine delays. + store forwarding delays. + slow cache access relative to shifts/masks. + slow partial word (byte) access. + fast shift/mask operations. + On some CPUs, a lookup can be handled with vector instructions. + On some CPUs, special cache handling is needed (especially 2way caches). + + + + +TODO - lookup and interpolate (int16_t, int32_t, int64_t, float, double) +TODO - 2D and 3D LUTs, simple and interpolated + +*/ + +/******************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include + +/******************************************************************************/ +/******************************************************************************/ +//BSP板级支持包所需全局变量 +unsigned long UART_BASE = 0xbfe001e0; //UART16550的虚地址 +unsigned long CONFREG_UART_BASE = 0xbfafff10; //CONFREG模拟UART的虚地址 +unsigned long CONFREG_TIMER_BASE = 0xbfafe000; //CONFREG计数器的虚地址 +unsigned long CONFREG_CLOCKS_PER_SEC = 100000000L; //CONFREG时钟频率 +unsigned long CORE_CLOCKS_PER_SEC = 33000000L; //处理器核时钟频率 + +clock_t start_time, end_time; + +// this constant may need to be adjusted to give reasonable minimum times +// For best results, times should be about 1.0 seconds for the minimum test run +int base_iterations = 1; +int iterations = 1; + +// 4000 items, or about 2..4k of data +// this is intended to remain within the L1 cache of most common CPUs +#define SIZE_SMALL 2000 + +// about 0.5..1M of data +// 没有那么大内存,这里给50KB到100KB +// this is intended to be outside the L2 cache of most common CPUs +#define SIZE 50000 + +// initial value for filling our arrays, may be changed from the command line +int32_t init_value = 3; + +/******************************************************************************/ + +// our global arrays of numbers + +uint8_t inputData8[SIZE]; +uint8_t resultData8[SIZE]; + +uint16_t inputData16[SIZE]; +uint16_t resultData16[SIZE]; + +/******************************************************************************/ +/******************************************************************************/ + + +void fill_8(uint8_t * first, uint8_t * last, uint8_t value) { + while (first != last) *first++ = (uint8_t)(value); +} + +void fill_16(uint16_t * first, uint16_t * last, uint16_t value) { + while (first != last) *first++ = (uint16_t)(value); +} + +void fill_random_8(uint8_t * first, uint8_t * last) { + srand((unsigned int)init_value + 123 ); + while (first != last) { + *first++ = (uint8_t)rand(); + } +} + +void fill_random_16(uint16_t * first, uint16_t * last) { + srand((unsigned int)init_value + 123 ); + while (first != last) { + *first++ = (uint16_t)rand(); + } +} + +int max(int a, int b){ + if(a > b) + return a; + else + return b; +} + +/******************************************************************************/ +/******************************************************************************/ + + + +// baseline - a trivial loop + +void test_lut1_u8(const uint8_t* input, uint8_t *result, const int count, const uint8_t* LUT, const char *label) { + + start_time = clock(); + + for(int i = 0; i < iterations; ++i) { + for (int j = 0; j < count; ++j) { + result[j] = LUT[ input[j] ]; + } + } + + end_time = clock(); + + int j; + + for (j = 0; j < count; ++j) { + if (result[j] != (uint8_t)(init_value)) { + printf("test %s failed (got %u, expected %u)\n", label, (unsigned)(result[j]), (unsigned)(init_value)); + break; + } + } + + double time_cost = (end_time - start_time)/ (double)(CLOCKS_PER_SEC); + printf("\"%s, %d times\" %f sec\n", + label, + count, + time_cost); + +} + +void test_lut1_8(const int8_t* input, int8_t *result, const int count, const int8_t* LUT, const char *label) { + + start_time = clock(); + + for(int i = 0; i < iterations; ++i) { + for (int j = 0; j < count; ++j) { + result[j] = LUT[ input[j] ]; + } + } + + end_time = clock(); + + int j; + + for (j = 0; j < count; ++j) { + if (result[j] != (int8_t)(init_value)) { + printf("test %s failed (got %u, expected %u)\n", label, (unsigned)(result[j]), (unsigned)(init_value)); + break; + } + } + + double time_cost = (end_time - start_time)/ (double)(CLOCKS_PER_SEC); + printf("\"%s, %d times\" %f sec\n", + label, + count, + time_cost); + +} + +void test_lut1_u16(const uint16_t* input, uint16_t *result, const int count, const uint16_t* LUT, const char *label) { + + start_time = clock(); + + for(int i = 0; i < iterations; ++i) { + for (int j = 0; j < count; ++j) { + result[j] = LUT[ input[j] ]; + } + } + + end_time = clock(); + + int j; + + for (j = 0; j < count; ++j) { + if (result[j] != (uint16_t)(init_value)) { + printf("test %s failed (got %u, expected %u)\n", label, (unsigned)(result[j]), (unsigned)(init_value)); + break; + } + } + + double time_cost = (end_time - start_time)/ (double)(CLOCKS_PER_SEC); + printf("\"%s, %d times\" %f sec\n", + label, + count, + time_cost); + +} + +void test_lut1_16(const int16_t* input, int16_t *result, const int count, const int16_t* LUT, const char *label) { + + start_time = clock(); + + for(int i = 0; i < iterations; ++i) { + for (int j = 0; j < count; ++j) { + result[j] = LUT[ input[j] ]; + } + } + + end_time = clock(); + + int j; + + for (j = 0; j < count; ++j) { + if (result[j] != (int16_t)(init_value)) { + printf("test %s failed (got %u, expected %u)\n", label, (unsigned)(result[j]), (unsigned)(init_value)); + break; + } + } + + double time_cost = (end_time - start_time)/ (double)(CLOCKS_PER_SEC); + printf("\"%s, %d times\" %f sec\n", + label, + count, + time_cost); + +} + +/******************************************************************************/ +/******************************************************************************/ + +int main(int argc, char** argv) { + + // output command for documentation: + int i; + // for (i = 0; i < argc; ++i) + // printf("%s ", argv[i] ); + // printf("\n"); + + if (argc > 1) base_iterations = atoi(argv[1]); + if (argc > 2) init_value = (int32_t) atoi(argv[2]); + + uint8_t myLUT8[ 256 ]; + uint16_t myLUT16[ 65536 ]; + + + fill_8(myLUT8, myLUT8+256, (uint8_t)(init_value)); + fill_16(myLUT16, myLUT16+65536, (uint16_t)(init_value)); + + fill_random_8( inputData8, inputData8+SIZE ); + fill_random_16( inputData16, inputData16+SIZE ); + + +// uint8_t + iterations = base_iterations; + + test_lut1_u8( inputData8, inputData8, SIZE_SMALL, myLUT8, "uint8_t lookup table1 small inplace"); + test_lut1_u8( inputData8, resultData8, SIZE_SMALL, myLUT8, "uint8_t lookup table1 small"); + + iterations = max( 1, (int)(((uint64_t)base_iterations * SIZE_SMALL) / SIZE) ); + + test_lut1_u8( inputData8, inputData8, SIZE, myLUT8, "uint8_t lookup table1 large inplace"); + test_lut1_u8( inputData8, resultData8, SIZE, myLUT8, "uint8_t lookup table1 large"); + + + +// int8_t + iterations = base_iterations; + + test_lut1_8( (int8_t*)inputData8, (int8_t*)inputData8, SIZE_SMALL, (int8_t*)(myLUT8+128), "int8_t lookup table1 small inplace"); + test_lut1_8( (int8_t*)inputData8, (int8_t*)resultData8, SIZE_SMALL, (int8_t*)(myLUT8+128), "int8_t lookup table1 small"); + + iterations = max( 1, (int)(((uint64_t)base_iterations * SIZE_SMALL) / SIZE) ); + + test_lut1_8( (int8_t*)inputData8, (int8_t*)inputData8, SIZE, (int8_t*)(myLUT8+128), "int8_t lookup table1 large inplace"); + test_lut1_8( (int8_t*)inputData8, (int8_t*)resultData8, SIZE, (int8_t*)(myLUT8+128), "int8_t lookup table1 large"); + + +// uint16_t + iterations = base_iterations; + + test_lut1_u16( inputData16, inputData16, SIZE_SMALL, myLUT16, "uint16_t lookup table1 small inplace"); + test_lut1_u16( inputData16, resultData16, SIZE_SMALL, myLUT16, "uint16_t lookup table1 small"); + + iterations = max( 1, (int)(((uint64_t)base_iterations * SIZE_SMALL) / SIZE) ); + + test_lut1_u16( inputData16, inputData16, SIZE, myLUT16, "uint16_t lookup table1 large inplace"); + test_lut1_u16( inputData16, resultData16, SIZE, myLUT16, "uint16_t lookup table1 large"); + +// int16_t + iterations = base_iterations; + + test_lut1_16( (int16_t*)inputData16, (int16_t*)inputData16, SIZE_SMALL, (int16_t*)(myLUT16+32768), "int16_t lookup table1 small inplace"); + test_lut1_16( (int16_t*)inputData16, (int16_t*)resultData16, SIZE_SMALL, (int16_t*)(myLUT16+32768), "int16_t lookup table1 small"); + + iterations = max( 1, (int)(((uint64_t)base_iterations * SIZE_SMALL) / SIZE) ); + + test_lut1_16( (int16_t*)inputData16, (int16_t*)inputData16, SIZE, (int16_t*)(myLUT16+32768), "int16_t lookup table1 large inplace"); + test_lut1_16( (int16_t*)inputData16, (int16_t*)resultData16, SIZE, (int16_t*)(myLUT16+32768), "int16_t lookup table1 large"); + + return 0; +} + +// the end +/******************************************************************************/ +/******************************************************************************/ diff --git a/sdk/software/examples/c_prg/loop_induction/Makefile b/sdk/software/examples/c_prg/loop_induction/Makefile new file mode 100644 index 0000000..9272f21 --- /dev/null +++ b/sdk/software/examples/c_prg/loop_induction/Makefile @@ -0,0 +1,14 @@ +TARGET = loop_induction + +CFLAGS += -O3 -g + +#根据SIMU宏选择串口波特率,0:FPGA上板;1:仿真 +CFLAGS += -DSIMU=0 + +C_SRCS := $(wildcard ./*.c ) + +OBJDIR = obj +COMMON_DIR = ../../../bsp +GCC_DIR=../../../../toolchains/loongson-gnu-toolchain-8.3-x86_64-loongarch32r-linux-gnusf-v2.0 +PICOLIBC_DIR=../../../../toolchains/picolibc +include ../../../bsp/common.mk diff --git a/sdk/software/examples/c_prg/loop_induction/loop_induction.c b/sdk/software/examples/c_prg/loop_induction/loop_induction.c new file mode 100644 index 0000000..95ba9e4 --- /dev/null +++ b/sdk/software/examples/c_prg/loop_induction/loop_induction.c @@ -0,0 +1,131 @@ +/* + Copyright 2018 Chris Cox + Distributed under the MIT License (see accompanying file LICENSE_1_0_0.txt + or a copy at http://stlab.adobe.com/licenses.html ) + + +Goal: Examine performance optimizations related to loop induction variables. + + +Assumptions: + 1) The compiler will normalize all loop types and optimize all equally. + (this is a necessary step before doing induction variable analysis) + + 2) The compiler will remove unused induction variables. + This could happen due to several optimizations. + + 2) The compiler will recognize induction variables with linear relations (x = a*b + c) + and optimize out redundant variables. + + 3) The compiler will apply strength reduction to induction variable usage. + + 4) The compiler will remove bounds checks by recognizing or adjusting loop limits. + (can be an explict loop optimization, or part of range propagation) + + +*/ + +#include +#include +#include +#include +#include +#include +#include + + +/******************************************************************************/ +//BSP板级支持包所需全局变量 +unsigned long UART_BASE = 0xbfe001e0; //UART16550的虚地址 +unsigned long CONFREG_UART_BASE = 0xbfafff10; //CONFREG模拟UART的虚地址 +unsigned long CONFREG_TIMER_BASE = 0xbfafe000; //CONFREG计数器的虚地址 +unsigned long CONFREG_CLOCKS_PER_SEC = 100000000L; //CONFREG时钟频率 +unsigned long CORE_CLOCKS_PER_SEC = 33000000L; //处理器核时钟频率 + +clock_t start_time, end_time; + +/******************************************************************************/ + +// this constant may need to be adjusted to give reasonable minimum times +// For best results, times should be about 1.0 seconds for the minimum test run +int iterations = 10; + + +// 32000 items, or about 128k of data +// this is intended to remain within the L2 cache of most common CPUs +const int SIZE = 32000; + + +// initial value for filling our arrays, may be changed from the command line +int init_value = 3; + +/******************************************************************************/ + +void fill_random(int32_t * first, int32_t * last) { + while (first != last) { + *first++ = (int32_t)rand(); + } +} + +/******************************************************************************/ +/******************************************************************************/ + + +void test_copy(const int32_t *source, int32_t *dest, int count, const char *label) { + int i; + + fill_random( dest, dest+count ); + + start_time = clock(); + + for(i = 0; i < iterations; ++i) { + int i, j, k; + for ( i=0, j=0, k=0; k < count; ++i, ++j, ++k ) { + dest[i] = source[j]; + } + } + + end_time = clock(); + + if ( memcmp(dest, source, count*sizeof(int32_t)) != 0 ) + printf("test %s failed\n", label); + + double time_cost = (end_time - start_time)/ (double)(CLOCKS_PER_SEC); + + printf("\"%s, %d items\" %f sec\n", + label, + count, + time_cost); +} + +/******************************************************************************/ +/******************************************************************************/ + +int main(int argc, char** argv) { + + // output command for documentation: + int i; + // for (i = 0; i < argc; ++i) + // printf("%s ", argv[i] ); + // printf("\n"); + + if (argc > 1) iterations = atoi(argv[1]); + if (argc > 2) init_value = (int) atoi(argv[2]); + + int32_t intSrc[ SIZE ]; + int32_t intDst[ SIZE ]; + + + srand( (unsigned int)init_value + 123); + fill_random( intSrc, intSrc+SIZE ); + + + test_copy( &intSrc[0], &intDst[0], SIZE, "int32_t for induction copy" ); + + + return 0; +} + +// the end +/******************************************************************************/ +/******************************************************************************/ diff --git a/sdk/software/examples/c_prg/memcmp/Makefile b/sdk/software/examples/c_prg/memcmp/Makefile new file mode 100644 index 0000000..fa83170 --- /dev/null +++ b/sdk/software/examples/c_prg/memcmp/Makefile @@ -0,0 +1,14 @@ +TARGET = memcmp + +CFLAGS += -O3 -g + +#根据SIMU宏选择串口波特率,0:FPGA上板;1:仿真 +CFLAGS += -DSIMU=0 + +C_SRCS := $(wildcard ./*.c ) + +OBJDIR = obj +COMMON_DIR = ../../../bsp +GCC_DIR=../../../../toolchains/loongson-gnu-toolchain-8.3-x86_64-loongarch32r-linux-gnusf-v2.0 +PICOLIBC_DIR=../../../../toolchains/picolibc +include ../../../bsp/common.mk diff --git a/sdk/software/examples/c_prg/memcmp/memcmp.c b/sdk/software/examples/c_prg/memcmp/memcmp.c new file mode 100644 index 0000000..1fb0922 --- /dev/null +++ b/sdk/software/examples/c_prg/memcmp/memcmp.c @@ -0,0 +1,177 @@ +/* + Copyright 2008-2009 Adobe Systems Incorporated + Copyright 2018 Chris Cox + Distributed under the MIT License (see accompanying file LICENSE_1_0_0.txt + or a copy at http://stlab.adobe.com/licenses.html ) + + +Goal: Test compiler optimizations related to memcmp and hand coded memcmp loops. + + +Assumptions: + + 1) The compiler will recognize memcmp like loops and optimize appropriately. + This could be subtitution of calls to memcmp, + or it could be just optimizing the loop to get the best throughput. + On modern systems, cache hinting is usually required for best throughput. + + 2) The library function memcmp should be optimized for small, medium, and large buffers. + ie: low overhead for smaller buffer, highly hinted for large buffers. + + 3) The STL functions equal and mismatch should be optimized for small, medium, and large buffers. + ie: low overhead for smaller buffers, highly hinted for large buffers. + + + + +NOTE - on some OSes, memcmp calls into the VM system to test for shared pages + thus running faster than the DRAM bandwidth would allow on large arrays + + However, on those OSes, calling memcmp can hit mutexes and slow down + significantly when called from threads. + + +NOTE - Linux memcmp returns 0, +-1 instead of the actual difference +NOTE - and sometimes Linux memcmp returns 0, +-256 instead of the actual difference + + +TODO - test performance of unaligned buffers +*/ + +#include +#include +#include +#include +#include +#include +#include + +/******************************************************************************/ +//BSP板级支持包所需全局变量 +unsigned long UART_BASE = 0xbfe001e0; //UART16550的虚地址 +unsigned long CONFREG_UART_BASE = 0xbfafff10; //CONFREG模拟UART的虚地址 +unsigned long CONFREG_TIMER_BASE = 0xbfafe000; //CONFREG计数器的虚地址 +unsigned long CONFREG_CLOCKS_PER_SEC = 100000000L; //CONFREG时钟频率 +unsigned long CORE_CLOCKS_PER_SEC = 33000000L; //处理器核时钟频率 + +clock_t start_time, end_time; + +// this constant may need to be adjusted to give reasonable minimum times +// For best results, times should be about 1.0 seconds for the minimum test run +int iterations = 1; + + +// 64 Megabytes, intended to be larger than L2 cache on common CPUs +// needs to be divisible by 8 +// 没有这么大内存,给30KB +#define SIZE_4K 4096 +// #define SIZE_3M 3145728 +#define SIZE_3M 30720 + +// initial value for filling our arrays, may be changed from the command line +uint8_t init_value = 3; + +/******************************************************************************/ +/******************************************************************************/ + +void fill(uint8_t * first, uint8_t * last, uint8_t value) { + while (first != last) *first++ = value; +} + + +int forloop_memcmp( const void *first, const void *second, size_t bytes ){ + const uint8_t *first_byte = (const uint8_t *)first; + const uint8_t *second_byte = (const uint8_t *)second; + int x; + + for (x = 0; x < bytes; ++x) { + if (first_byte[x] != second_byte[x]) { + return (first_byte[x] - second_byte[x]); + } + } + + return 0; +} + + +/******************************************************************************/ +/******************************************************************************/ + + +void test_memcmp(const uint8_t *first, const uint8_t *second, int count, bool expected_result) { + int i; + int bytes = count * sizeof(uint8_t); + + start_time = clock(); + + for(i = 0; i < iterations; ++i) { + // sigh, Linux memcmp is wonky - some return 1, some return 256 + bool result = (forloop_memcmp( first, second, bytes ) != 0) ; + + // moving this test out of the loop causes unwanted overoptimization + if ( result != expected_result ) + printf("test %s by %d failed (got %d instead of %d)\n", "for loop compare", count, (int)result, (int)expected_result ); + } + + end_time = clock(); +} + +/******************************************************************************/ + +void test_memcmp_sizes(const uint8_t *first, const uint8_t *second, int max_count, bool result) { + int i = max_count * sizeof(uint8_t); + + test_memcmp( first, second, max_count, result); + + double time_cost = (end_time - start_time)/ (double)(CLOCKS_PER_SEC); + + printf("\"%s %d bytes\" compare result: %s %f sec\n", + "for loop compare", + i, + result ? "false" : "true", + time_cost); + +} + +/******************************************************************************/ +/******************************************************************************/ + +// our global arrays of numbers to be operated upon + +uint8_t data8u[SIZE_3M/sizeof(uint8_t)]; +int alignment_pad = 1024; +uint8_t data8u_dest[SIZE_3M/sizeof(uint8_t) + 1024]; // leave some room for alignment testing + +/******************************************************************************/ +/******************************************************************************/ + + +int main(int argc, char** argv) { + + // output command for documentation: + int i; + + if (argc > 1) iterations = atoi(argv[1]); + if (argc > 2) init_value = (int32_t) atoi(argv[2]); + + + fill( data8u, data8u+(SIZE_3M/sizeof(uint8_t)), (uint8_t)(init_value) ); + fill( data8u_dest, data8u_dest+(SIZE_3M/sizeof(uint8_t) + alignment_pad), (uint8_t)(init_value) ); + test_memcmp_sizes( data8u, data8u_dest, SIZE_3M/sizeof(uint8_t), false); + data8u[(SIZE_3M/sizeof(uint8_t))-1] += 1; // last byte in the array + test_memcmp_sizes( data8u, data8u_dest, SIZE_3M/sizeof(uint8_t), true); +/* + test_memcmp_sizes( data8u, data8u_dest, SIZE_1M/sizeof(uint8_t), false); + data8u[(SIZE_1M/sizeof(uint8_t))-1] += 1; // last byte in the array + test_memcmp_sizes( data8u, data8u_dest, SIZE_1M/sizeof(uint8_t), true); +*/ + test_memcmp_sizes( data8u, data8u_dest, SIZE_4K/sizeof(uint8_t), false); + data8u[(SIZE_4K/sizeof(uint8_t))-1] += 1; // last byte in the array + test_memcmp_sizes( data8u, data8u_dest, SIZE_4K/sizeof(uint8_t), true); + + return 0; +} + +// the end +/******************************************************************************/ +/******************************************************************************/ diff --git a/sdk/software/examples/c_prg/minmax_sequence/Makefile b/sdk/software/examples/c_prg/minmax_sequence/Makefile new file mode 100644 index 0000000..c2e2a84 --- /dev/null +++ b/sdk/software/examples/c_prg/minmax_sequence/Makefile @@ -0,0 +1,14 @@ +TARGET = minmax_sequence + +CFLAGS += -O3 -g + +#根据SIMU宏选择串口波特率,0:FPGA上板;1:仿真 +CFLAGS += -DSIMU=0 + +C_SRCS := $(wildcard ./*.c ) + +OBJDIR = obj +COMMON_DIR = ../../../bsp +GCC_DIR=../../../../toolchains/loongson-gnu-toolchain-8.3-x86_64-loongarch32r-linux-gnusf-v2.0 +PICOLIBC_DIR=../../../../toolchains/picolibc +include ../../../bsp/common.mk diff --git a/sdk/software/examples/c_prg/minmax_sequence/minmax_sequence.c b/sdk/software/examples/c_prg/minmax_sequence/minmax_sequence.c new file mode 100644 index 0000000..e69bced --- /dev/null +++ b/sdk/software/examples/c_prg/minmax_sequence/minmax_sequence.c @@ -0,0 +1,1509 @@ +/* + Copyright 2008-2009 Adobe Systems Incorporated + Copyright 2018-2019 Chris Cox + Distributed under the MIT License (see accompanying file LICENSE_1_0_0.txt + or a copy at http://stlab.adobe.com/licenses.html ) + + +Goal: Test the performance of various idioms for finding maximum and maximum of a sequence. + + +Assumptions: + 1) The compiler will optimize minimum and maximum finding operations. + + 2) The compiler may recognize ineffecient minimum or maximum idioms and substitute efficient methods. + + + +NOTE - min or max between two sequences is tested in minmax.cpp. + +NOTE - pin values in sequence, see minmax.cpp + +*/ + +/******************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include + +/******************************************************************************/ +//BSP板级支持包所需全局变量 +unsigned long UART_BASE = 0xbfe001e0; //UART16550的虚地址 +unsigned long CONFREG_UART_BASE = 0xbfafff10; //CONFREG模拟UART的虚地址 +unsigned long CONFREG_TIMER_BASE = 0xbfafe000; //CONFREG计数器的虚地址 +unsigned long CONFREG_CLOCKS_PER_SEC = 100000000L; //CONFREG时钟频率 +unsigned long CORE_CLOCKS_PER_SEC = 33000000L; //处理器核时钟频率 + +clock_t start_time, end_time; + +/******************************************************************************/ + +// this constant may need to be adjusted to give reasonable minimum times +// For best results, times should be about 1.0 seconds for the minimum test run +int iterations = 5; + + +// 8000 items, or between 8 and 64k of data +// this is intended to remain within the L2 cache of most common CPUs +#define SIZE 8000 + + +// initial value for filling our arrays, may be changed from the command line +int32_t init_value = 3; + +/******************************************************************************/ + +double gMinResult = 0; +double gMaxResult = 0; + +size_t gMinPosition = 0; +size_t gMaxPosition = 0; + + +/******************************************************************************/ +/******************************************************************************/ + +void check_min_position(size_t result, const char * label) { + if (result != (size_t)(gMinPosition)) + printf("test %s failed (got %tu instead of %zu)\n", label, result, gMinPosition ); +} + +/******************************************************************************/ + +void check_max_position(size_t result, const char * label) { + if (result != (size_t)(gMaxPosition)) + printf("test %s failed (got %tu instead of %zu)\n", label, result, gMaxPosition ); +} + +/******************************************************************************/ +/******************************************************************************/ + +int8_t find_minimum_8( int8_t * first, int8_t * last ) { + int8_t min_value = *first; + if (first != last) + ++first; + while (first != last) { + if (*first < min_value) + min_value = *first; + ++first; + } + return min_value; +} + +uint8_t find_minimum_u8( uint8_t * first, uint8_t * last ) { + uint8_t min_value = *first; + if (first != last) + ++first; + while (first != last) { + if (*first < min_value) + min_value = *first; + ++first; + } + return min_value; +} + +int16_t find_minimum_16( int16_t * first, int16_t * last ) { + int16_t min_value = *first; + if (first != last) + ++first; + while (first != last) { + if (*first < min_value) + min_value = *first; + ++first; + } + return min_value; +} + +uint16_t find_minimum_u16( uint16_t * first, uint16_t * last ) { + uint16_t min_value = *first; + if (first != last) + ++first; + while (first != last) { + if (*first < min_value) + min_value = *first; + ++first; + } + return min_value; +} + +int32_t find_minimum_32( int32_t * first, int32_t * last ) { + int32_t min_value = *first; + if (first != last) + ++first; + while (first != last) { + if (*first < min_value) + min_value = *first; + ++first; + } + return min_value; +} + +uint32_t find_minimum_u32( uint32_t * first, uint32_t * last ) { + uint32_t min_value = *first; + if (first != last) + ++first; + while (first != last) { + if (*first < min_value) + min_value = *first; + ++first; + } + return min_value; +} + +float find_minimum_f16( float * first, float * last ) { + float min_value = *first; + if (first != last) + ++first; + while (first != last) { + if (*first < min_value) + min_value = *first; + ++first; + } + return min_value; +} + +double find_minimum_f32( double * first, double * last ) { + double min_value = *first; + if (first != last) + ++first; + while (first != last) { + if (*first < min_value) + min_value = *first; + ++first; + } + return min_value; +} + +/******************************************************************************/ +int8_t find_maximum_8( int8_t * first, int8_t * last ) { + int8_t max_value = *first; + if (first != last) + ++first; + while (first != last) { + if (*first > max_value) + max_value = *first; + ++first; + } + return max_value; +} + +uint8_t find_maximum_u8( uint8_t * first, uint8_t * last ) { + uint8_t max_value = *first; + if (first != last) + ++first; + while (first != last) { + if (*first > max_value) + max_value = *first; + ++first; + } + return max_value; +} + +int16_t find_maximum_16( int16_t * first, int16_t * last ) { + int16_t max_value = *first; + if (first != last) + ++first; + while (first != last) { + if (*first > max_value) + max_value = *first; + ++first; + } + return max_value; +} + +uint16_t find_maximum_u16( uint16_t * first, uint16_t * last ) { + uint16_t max_value = *first; + if (first != last) + ++first; + while (first != last) { + if (*first > max_value) + max_value = *first; + ++first; + } + return max_value; +} + +int32_t find_maximum_32( int32_t * first, int32_t * last ) { + int32_t max_value = *first; + if (first != last) + ++first; + while (first != last) { + if (*first > max_value) + max_value = *first; + ++first; + } + return max_value; +} + +uint32_t find_maximum_u32( uint32_t * first, uint32_t * last ) { + uint32_t max_value = *first; + if (first != last) + ++first; + while (first != last) { + if (*first > max_value) + max_value = *first; + ++first; + } + return max_value; +} + +float find_maximum_f16( float * first, float * last ) { + float max_value = *first; + if (first != last) + ++first; + while (first != last) { + if (*first > max_value) + max_value = *first; + ++first; + } + return max_value; +} + +double find_maximum_f32( double * first, double * last ) { + double max_value = *first; + if (first != last) + ++first; + while (first != last) { + if (*first > max_value) + max_value = *first; + ++first; + } + return max_value; +} + +/******************************************************************************/ +size_t find_minimum_position_8( int8_t * first, size_t count) { + int8_t min_value = first[0]; + size_t minpos = 0; + for (size_t k = 1; k < count; ++k) { + if (first[k] < min_value) { + min_value = first[k]; + minpos = k; + } + } + return minpos; +} + +size_t find_minimum_position_u8( uint8_t * first, size_t count) { + uint8_t min_value = first[0]; + size_t minpos = 0; + for (size_t k = 1; k < count; ++k) { + if (first[k] < min_value) { + min_value = first[k]; + minpos = k; + } + } + return minpos; +} + +size_t find_minimum_position_16( int16_t * first, size_t count) { + int16_t min_value = first[0]; + size_t minpos = 0; + for (size_t k = 1; k < count; ++k) { + if (first[k] < min_value) { + min_value = first[k]; + minpos = k; + } + } + return minpos; +} + +size_t find_minimum_position_u16( uint16_t * first, size_t count) { + uint16_t min_value = first[0]; + size_t minpos = 0; + for (size_t k = 1; k < count; ++k) { + if (first[k] < min_value) { + min_value = first[k]; + minpos = k; + } + } + return minpos; +} + +size_t find_minimum_position_32( int32_t * first, size_t count) { + int32_t min_value = first[0]; + size_t minpos = 0; + for (size_t k = 1; k < count; ++k) { + if (first[k] < min_value) { + min_value = first[k]; + minpos = k; + } + } + return minpos; +} + +size_t find_minimum_position_u32( uint32_t * first, size_t count) { + uint32_t min_value = first[0]; + size_t minpos = 0; + for (size_t k = 1; k < count; ++k) { + if (first[k] < min_value) { + min_value = first[k]; + minpos = k; + } + } + return minpos; +} + +size_t find_minimum_position_f16( float * first, size_t count) { + float min_value = first[0]; + size_t minpos = 0; + for (size_t k = 1; k < count; ++k) { + if (first[k] < min_value) { + min_value = first[k]; + minpos = k; + } + } + return minpos; +} + +size_t find_minimum_position_f32( double * first, size_t count) { + double min_value = first[0]; + size_t minpos = 0; + for (size_t k = 1; k < count; ++k) { + if (first[k] < min_value) { + min_value = first[k]; + minpos = k; + } + } + return minpos; +} + +/******************************************************************************/ +size_t find_maximum_position_8( int8_t * first, size_t count) { + int8_t max_value = first[0]; + size_t maxpos = 0; + for (size_t k = 1; k < count; ++k) { + if (first[k] > max_value) { + max_value = first[k]; + maxpos = k; + } + } + return maxpos; +} + +size_t find_maximum_position_u8( uint8_t * first, size_t count) { + uint8_t max_value = first[0]; + size_t maxpos = 0; + for (size_t k = 1; k < count; ++k) { + if (first[k] > max_value) { + max_value = first[k]; + maxpos = k; + } + } + return maxpos; +} + +size_t find_maximum_position_16( int16_t * first, size_t count) { + int16_t max_value = first[0]; + size_t maxpos = 0; + for (size_t k = 1; k < count; ++k) { + if (first[k] > max_value) { + max_value = first[k]; + maxpos = k; + } + } + return maxpos; +} + +size_t find_maximum_position_u16( uint16_t * first, size_t count) { + uint16_t max_value = first[0]; + size_t maxpos = 0; + for (size_t k = 1; k < count; ++k) { + if (first[k] > max_value) { + max_value = first[k]; + maxpos = k; + } + } + return maxpos; +} + +size_t find_maximum_position_32( int32_t * first, size_t count) { + int32_t max_value = first[0]; + size_t maxpos = 0; + for (size_t k = 1; k < count; ++k) { + if (first[k] > max_value) { + max_value = first[k]; + maxpos = k; + } + } + return maxpos; +} + +size_t find_maximum_position_u32( uint32_t * first, size_t count) { + uint32_t max_value = first[0]; + size_t maxpos = 0; + for (size_t k = 1; k < count; ++k) { + if (first[k] > max_value) { + max_value = first[k]; + maxpos = k; + } + } + return maxpos; +} + +size_t find_maximum_position_f16( float * first, size_t count) { + float max_value = first[0]; + size_t maxpos = 0; + for (size_t k = 1; k < count; ++k) { + if (first[k] > max_value) { + max_value = first[k]; + maxpos = k; + } + } + return maxpos; +} + +size_t find_maximum_position_f32( double * first, size_t count) { + double max_value = first[0]; + size_t maxpos = 0; + for (size_t k = 1; k < count; ++k) { + if (first[k] > max_value) { + max_value = first[k]; + maxpos = k; + } + } + return maxpos; +} + +/******************************************************************************/ +/******************************************************************************/ +void test_min_value2_8(int8_t* first, size_t count, const char * label) { + start_time = clock(); + + for(int i = 0; i < iterations; ++i) { + int8_t min_value = first[0]; + for (size_t k = 1; k < count; ++k) { + if (first[k] < min_value) + min_value = first[k]; + } + + if (min_value != (int8_t)(gMinResult)) + printf("test %s failed (got %g instead of %g)\n", label, (double)min_value, gMinResult ); + + } + + // need the labels to remain valid until we print the summary + end_time = clock(); + double time_cost = (end_time - start_time)/ (double)(CLOCKS_PER_SEC); + printf("\"%s, %lu items\" %f sec\n", + label, + count, + time_cost); +} + +void test_min_value2_u8(uint8_t* first, size_t count, const char * label) { + start_time = clock(); + + for(int i = 0; i < iterations; ++i) { + uint8_t min_value = first[0]; + for (size_t k = 1; k < count; ++k) { + if (first[k] < min_value) + min_value = first[k]; + } + + if (min_value != (uint8_t)(gMinResult)) + printf("test %s failed (got %g instead of %g)\n", label, (double)min_value, gMinResult ); + + } + + // need the labels to remain valid until we print the summary + end_time = clock(); + double time_cost = (end_time - start_time)/ (double)(CLOCKS_PER_SEC); + printf("\"%s, %lu items\" %f sec\n", + label, + count, + time_cost); +} + +void test_min_value2_16(int16_t* first, size_t count, const char * label) { + start_time = clock(); + + for(int i = 0; i < iterations; ++i) { + int16_t min_value = first[0]; + for (size_t k = 1; k < count; ++k) { + if (first[k] < min_value) + min_value = first[k]; + } + + if (min_value != (int16_t)(gMinResult)) + printf("test %s failed (got %g instead of %g)\n", label, (double)min_value, gMinResult ); + + } + + // need the labels to remain valid until we print the summary + end_time = clock(); + double time_cost = (end_time - start_time)/ (double)(CLOCKS_PER_SEC); + printf("\"%s, %lu items\" %f sec\n", + label, + count, + time_cost); +} + +void test_min_value2_u16(uint16_t* first, size_t count, const char * label) { + start_time = clock(); + + for(int i = 0; i < iterations; ++i) { + uint16_t min_value = first[0]; + for (size_t k = 1; k < count; ++k) { + if (first[k] < min_value) + min_value = first[k]; + } + + if (min_value != (uint16_t)(gMinResult)) + printf("test %s failed (got %g instead of %g)\n", label, (double)min_value, gMinResult ); + + } + + // need the labels to remain valid until we print the summary + end_time = clock(); + double time_cost = (end_time - start_time)/ (double)(CLOCKS_PER_SEC); + printf("\"%s, %lu items\" %f sec\n", + label, + count, + time_cost); +} + +void test_min_value2_32(int32_t* first, size_t count, const char * label) { + start_time = clock(); + + for(int i = 0; i < iterations; ++i) { + int32_t min_value = first[0]; + for (size_t k = 1; k < count; ++k) { + if (first[k] < min_value) + min_value = first[k]; + } + + if (min_value != (int32_t)(gMinResult)) + printf("test %s failed (got %g instead of %g)\n", label, (double)min_value, gMinResult ); + + } + + // need the labels to remain valid until we print the summary + end_time = clock(); + double time_cost = (end_time - start_time)/ (double)(CLOCKS_PER_SEC); + printf("\"%s, %lu items\" %f sec\n", + label, + count, + time_cost); +} + +void test_min_value2_u32(uint32_t* first, size_t count, const char * label) { + start_time = clock(); + + for(int i = 0; i < iterations; ++i) { + uint32_t min_value = first[0]; + for (size_t k = 1; k < count; ++k) { + if (first[k] < min_value) + min_value = first[k]; + } + + if (min_value != (uint32_t)(gMinResult)) + printf("test %s failed (got %g instead of %g)\n", label, (double)min_value, gMinResult ); + + } + + // need the labels to remain valid until we print the summary + end_time = clock(); + double time_cost = (end_time - start_time)/ (double)(CLOCKS_PER_SEC); + printf("\"%s, %lu items\" %f sec\n", + label, + count, + time_cost); +} + +void test_min_value2_f16(float* first, size_t count, const char * label) { + start_time = clock(); + + for(int i = 0; i < iterations; ++i) { + float min_value = first[0]; + for (size_t k = 1; k < count; ++k) { + if (first[k] < min_value) + min_value = first[k]; + } + + if (min_value != (float)(gMinResult)) + printf("test %s failed (got %g instead of %g)\n", label, (double)min_value, gMinResult ); + + } + + // need the labels to remain valid until we print the summary + end_time = clock(); + double time_cost = (end_time - start_time)/ (double)(CLOCKS_PER_SEC); + printf("\"%s, %lu items\" %f sec\n", + label, + count, + time_cost); +} + +void test_min_value2_f32(double* first, size_t count, const char * label) { + start_time = clock(); + + for(int i = 0; i < iterations; ++i) { + double min_value = first[0]; + for (size_t k = 1; k < count; ++k) { + if (first[k] < min_value) + min_value = first[k]; + } + + if (min_value != (double)(gMinResult)) + printf("test %s failed (got %g instead of %g)\n", label, (double)min_value, gMinResult ); + + } + + // need the labels to remain valid until we print the summary + end_time = clock(); + double time_cost = (end_time - start_time)/ (double)(CLOCKS_PER_SEC); + printf("\"%s, %lu items\" %f sec\n", + label, + count, + time_cost); +} + +/******************************************************************************/ + +void test_max_value2_8(int8_t* first, size_t count, const char * label) { + start_time = clock(); + + for(int i = 0; i < iterations; ++i) { + int8_t max_value = first[0]; + for (size_t k = 1; k < count; ++k) { + if (first[k] > max_value) + max_value = first[k]; + } + + if (max_value != (int8_t)(gMaxResult)) + printf("test %s failed (got %g instead of %g)\n", label, (double)max_value, gMaxResult ); + } + + // need the labels to remain valid until we print the summary + end_time = clock(); + double time_cost = (end_time - start_time)/ (double)(CLOCKS_PER_SEC); + printf("\"%s, %lu items\" %f sec\n", + label, + count, + time_cost); +} + +void test_max_value2_u8(uint8_t* first, size_t count, const char * label) { + start_time = clock(); + + for(int i = 0; i < iterations; ++i) { + uint8_t max_value = first[0]; + for (size_t k = 1; k < count; ++k) { + if (first[k] > max_value) + max_value = first[k]; + } + + if (max_value != (uint8_t)(gMaxResult)) + printf("test %s failed (got %g instead of %g)\n", label, (double)max_value, gMaxResult ); + } + + // need the labels to remain valid until we print the summary + end_time = clock(); + double time_cost = (end_time - start_time)/ (double)(CLOCKS_PER_SEC); + printf("\"%s, %lu items\" %f sec\n", + label, + count, + time_cost); +} + +void test_max_value2_16(int16_t* first, size_t count, const char * label) { + start_time = clock(); + + for(int i = 0; i < iterations; ++i) { + int16_t max_value = first[0]; + for (size_t k = 1; k < count; ++k) { + if (first[k] > max_value) + max_value = first[k]; + } + + if (max_value != (int16_t)(gMaxResult)) + printf("test %s failed (got %g instead of %g)\n", label, (double)max_value, gMaxResult ); + } + + // need the labels to remain valid until we print the summary + end_time = clock(); + double time_cost = (end_time - start_time)/ (double)(CLOCKS_PER_SEC); + printf("\"%s, %lu items\" %f sec\n", + label, + count, + time_cost); +} + +void test_max_value2_u16(uint16_t* first, size_t count, const char * label) { + start_time = clock(); + + for(int i = 0; i < iterations; ++i) { + uint16_t max_value = first[0]; + for (size_t k = 1; k < count; ++k) { + if (first[k] > max_value) + max_value = first[k]; + } + + if (max_value != (uint16_t)(gMaxResult)) + printf("test %s failed (got %g instead of %g)\n", label, (double)max_value, gMaxResult ); + } + + // need the labels to remain valid until we print the summary + end_time = clock(); + double time_cost = (end_time - start_time)/ (double)(CLOCKS_PER_SEC); + printf("\"%s, %lu items\" %f sec\n", + label, + count, + time_cost); +} + +void test_max_value2_32(int32_t* first, size_t count, const char * label) { + start_time = clock(); + + for(int i = 0; i < iterations; ++i) { + int32_t max_value = first[0]; + for (size_t k = 1; k < count; ++k) { + if (first[k] > max_value) + max_value = first[k]; + } + + if (max_value != (int32_t)(gMaxResult)) + printf("test %s failed (got %g instead of %g)\n", label, (double)max_value, gMaxResult ); + } + + // need the labels to remain valid until we print the summary + end_time = clock(); + double time_cost = (end_time - start_time)/ (double)(CLOCKS_PER_SEC); + printf("\"%s, %lu items\" %f sec\n", + label, + count, + time_cost); +} + +void test_max_value2_u32(uint32_t* first, size_t count, const char * label) { + start_time = clock(); + + for(int i = 0; i < iterations; ++i) { + uint32_t max_value = first[0]; + for (size_t k = 1; k < count; ++k) { + if (first[k] > max_value) + max_value = first[k]; + } + + if (max_value != (uint32_t)(gMaxResult)) + printf("test %s failed (got %g instead of %g)\n", label, (double)max_value, gMaxResult ); + } + + // need the labels to remain valid until we print the summary + end_time = clock(); + double time_cost = (end_time - start_time)/ (double)(CLOCKS_PER_SEC); + printf("\"%s, %lu items\" %f sec\n", + label, + count, + time_cost); +} + +void test_max_value2_f16(float* first, size_t count, const char * label) { + start_time = clock(); + + for(int i = 0; i < iterations; ++i) { + float max_value = first[0]; + for (size_t k = 1; k < count; ++k) { + if (first[k] > max_value) + max_value = first[k]; + } + + if (max_value != (float)(gMaxResult)) + printf("test %s failed (got %g instead of %g)\n", label, (double)max_value, gMaxResult ); + } + + // need the labels to remain valid until we print the summary + end_time = clock(); + double time_cost = (end_time - start_time)/ (double)(CLOCKS_PER_SEC); + printf("\"%s, %lu items\" %f sec\n", + label, + count, + time_cost); +} + +void test_max_value2_f32(double* first, size_t count, const char * label) { + start_time = clock(); + + for(int i = 0; i < iterations; ++i) { + double max_value = first[0]; + for (size_t k = 1; k < count; ++k) { + if (first[k] > max_value) + max_value = first[k]; + } + + if (max_value != (double)(gMaxResult)) + printf("test %s failed (got %g instead of %g)\n", label, (double)max_value, gMaxResult ); + } + + // need the labels to remain valid until we print the summary + end_time = clock(); + double time_cost = (end_time - start_time)/ (double)(CLOCKS_PER_SEC); + printf("\"%s, %lu items\" %f sec\n", + label, + count, + time_cost); +} + +/******************************************************************************/ + +/******************************************************************************/ +/******************************************************************************/ + +void test_min_position1_8(int8_t* first, size_t count, const char * label) +{ + start_time = clock(); + + for(int i = 0; i < iterations; ++i) { + size_t minpos = 0; + for (size_t k = 1; k < count; ++k) { + if (first[k] < first[minpos]) { + minpos = k; + } + } + check_min_position(minpos, label); + } + + // need the labels to remain valid until we print the summary + end_time = clock(); + + double time_cost = (end_time - start_time)/ (double)(CLOCKS_PER_SEC); + printf("\"%s, %lu items\" %f sec\n", + label, + count, + time_cost); +} + +void test_min_position1_u8(uint8_t* first, size_t count, const char * label) +{ + start_time = clock(); + + for(int i = 0; i < iterations; ++i) { + size_t minpos = 0; + for (size_t k = 1; k < count; ++k) { + if (first[k] < first[minpos]) { + minpos = k; + } + } + check_min_position(minpos, label); + } + + // need the labels to remain valid until we print the summary + end_time = clock(); + + double time_cost = (end_time - start_time)/ (double)(CLOCKS_PER_SEC); + printf("\"%s, %lu items\" %f sec\n", + label, + count, + time_cost); +} + +void test_min_position1_16(int16_t* first, size_t count, const char * label) +{ + start_time = clock(); + + for(int i = 0; i < iterations; ++i) { + size_t minpos = 0; + for (size_t k = 1; k < count; ++k) { + if (first[k] < first[minpos]) { + minpos = k; + } + } + check_min_position(minpos, label); + } + + // need the labels to remain valid until we print the summary + end_time = clock(); + + double time_cost = (end_time - start_time)/ (double)(CLOCKS_PER_SEC); + printf("\"%s, %lu items\" %f sec\n", + label, + count, + time_cost); +} + +void test_min_position1_u16(uint16_t* first, size_t count, const char * label) +{ + start_time = clock(); + + for(int i = 0; i < iterations; ++i) { + size_t minpos = 0; + for (size_t k = 1; k < count; ++k) { + if (first[k] < first[minpos]) { + minpos = k; + } + } + check_min_position(minpos, label); + } + + // need the labels to remain valid until we print the summary + end_time = clock(); + + double time_cost = (end_time - start_time)/ (double)(CLOCKS_PER_SEC); + printf("\"%s, %lu items\" %f sec\n", + label, + count, + time_cost); +} + +void test_min_position1_32(int32_t* first, size_t count, const char * label) +{ + start_time = clock(); + + for(int i = 0; i < iterations; ++i) { + size_t minpos = 0; + for (size_t k = 1; k < count; ++k) { + if (first[k] < first[minpos]) { + minpos = k; + } + } + check_min_position(minpos, label); + } + + // need the labels to remain valid until we print the summary + end_time = clock(); + + double time_cost = (end_time - start_time)/ (double)(CLOCKS_PER_SEC); + printf("\"%s, %lu items\" %f sec\n", + label, + count, + time_cost); +} + +void test_min_position1_u32(uint32_t* first, size_t count, const char * label) +{ + start_time = clock(); + + for(int i = 0; i < iterations; ++i) { + size_t minpos = 0; + for (size_t k = 1; k < count; ++k) { + if (first[k] < first[minpos]) { + minpos = k; + } + } + check_min_position(minpos, label); + } + + // need the labels to remain valid until we print the summary + end_time = clock(); + + double time_cost = (end_time - start_time)/ (double)(CLOCKS_PER_SEC); + printf("\"%s, %lu items\" %f sec\n", + label, + count, + time_cost); +} + +void test_min_position1_f16(float* first, size_t count, const char * label) +{ + start_time = clock(); + + for(int i = 0; i < iterations; ++i) { + size_t minpos = 0; + for (size_t k = 1; k < count; ++k) { + if (first[k] < first[minpos]) { + minpos = k; + } + } + check_min_position(minpos, label); + } + + // need the labels to remain valid until we print the summary + end_time = clock(); + + double time_cost = (end_time - start_time)/ (double)(CLOCKS_PER_SEC); + printf("\"%s, %lu items\" %f sec\n", + label, + count, + time_cost); +} + +void test_min_position1_f32(double* first, size_t count, const char * label) +{ + start_time = clock(); + + for(int i = 0; i < iterations; ++i) { + size_t minpos = 0; + for (size_t k = 1; k < count; ++k) { + if (first[k] < first[minpos]) { + minpos = k; + } + } + check_min_position(minpos, label); + } + + // need the labels to remain valid until we print the summary + end_time = clock(); + + double time_cost = (end_time - start_time)/ (double)(CLOCKS_PER_SEC); + printf("\"%s, %lu items\" %f sec\n", + label, + count, + time_cost); +} + +/******************************************************************************/ +/******************************************************************************/ + +void test_max_position1_8(int8_t* first, size_t count, const char * label) +{ + start_time = clock(); + + for(int i = 0; i < iterations; ++i) { + size_t maxpos = 0; + for (size_t k = 1; k < count; ++k) { + if (first[k] > first[maxpos]) { + maxpos = k; + } + } + check_max_position(maxpos, label); + } + + // need the labels to remain valid until we print the summary + end_time = clock(); + + double time_cost = (end_time - start_time)/ (double)(CLOCKS_PER_SEC); + printf("\"%s, %lu items\" %f sec\n", + label, + count, + time_cost); +} + +void test_max_position1_u8(uint8_t* first, size_t count, const char * label) +{ + start_time = clock(); + + for(int i = 0; i < iterations; ++i) { + size_t maxpos = 0; + for (size_t k = 1; k < count; ++k) { + if (first[k] > first[maxpos]) { + maxpos = k; + } + } + check_max_position(maxpos, label); + } + + // need the labels to remain valid until we print the summary + end_time = clock(); + + double time_cost = (end_time - start_time)/ (double)(CLOCKS_PER_SEC); + printf("\"%s, %lu items\" %f sec\n", + label, + count, + time_cost); +} + +void test_max_position1_16(int16_t* first, size_t count, const char * label) +{ + start_time = clock(); + + for(int i = 0; i < iterations; ++i) { + size_t maxpos = 0; + for (size_t k = 1; k < count; ++k) { + if (first[k] > first[maxpos]) { + maxpos = k; + } + } + check_max_position(maxpos, label); + } + + // need the labels to remain valid until we print the summary + end_time = clock(); + + double time_cost = (end_time - start_time)/ (double)(CLOCKS_PER_SEC); + printf("\"%s, %lu items\" %f sec\n", + label, + count, + time_cost); +} + +void test_max_position1_u16(uint16_t* first, size_t count, const char * label) +{ + start_time = clock(); + + for(int i = 0; i < iterations; ++i) { + size_t maxpos = 0; + for (size_t k = 1; k < count; ++k) { + if (first[k] > first[maxpos]) { + maxpos = k; + } + } + check_max_position(maxpos, label); + } + + // need the labels to remain valid until we print the summary + end_time = clock(); + + double time_cost = (end_time - start_time)/ (double)(CLOCKS_PER_SEC); + printf("\"%s, %lu items\" %f sec\n", + label, + count, + time_cost); +} + +void test_max_position1_32(int32_t* first, size_t count, const char * label) +{ + start_time = clock(); + + for(int i = 0; i < iterations; ++i) { + size_t maxpos = 0; + for (size_t k = 1; k < count; ++k) { + if (first[k] > first[maxpos]) { + maxpos = k; + } + } + check_max_position(maxpos, label); + } + + // need the labels to remain valid until we print the summary + end_time = clock(); + + double time_cost = (end_time - start_time)/ (double)(CLOCKS_PER_SEC); + printf("\"%s, %lu items\" %f sec\n", + label, + count, + time_cost); +} + +void test_max_position1_u32(uint32_t* first, size_t count, const char * label) +{ + start_time = clock(); + + for(int i = 0; i < iterations; ++i) { + size_t maxpos = 0; + for (size_t k = 1; k < count; ++k) { + if (first[k] > first[maxpos]) { + maxpos = k; + } + } + check_max_position(maxpos, label); + } + + // need the labels to remain valid until we print the summary + end_time = clock(); + + double time_cost = (end_time - start_time)/ (double)(CLOCKS_PER_SEC); + printf("\"%s, %lu items\" %f sec\n", + label, + count, + time_cost); +} + +void test_max_position1_f16(float* first, size_t count, const char * label) +{ + start_time = clock(); + + for(int i = 0; i < iterations; ++i) { + size_t maxpos = 0; + for (size_t k = 1; k < count; ++k) { + if (first[k] > first[maxpos]) { + maxpos = k; + } + } + check_max_position(maxpos, label); + } + + // need the labels to remain valid until we print the summary + end_time = clock(); + + double time_cost = (end_time - start_time)/ (double)(CLOCKS_PER_SEC); + printf("\"%s, %lu items\" %f sec\n", + label, + count, + time_cost); +} + +void test_max_position1_f32(double* first, size_t count, const char * label) +{ + start_time = clock(); + + for(int i = 0; i < iterations; ++i) { + size_t maxpos = 0; + for (size_t k = 1; k < count; ++k) { + if (first[k] > first[maxpos]) { + maxpos = k; + } + } + check_max_position(maxpos, label); + } + + // need the labels to remain valid until we print the summary + end_time = clock(); + + double time_cost = (end_time - start_time)/ (double)(CLOCKS_PER_SEC); + printf("\"%s, %lu items\" %f sec\n", + label, + count, + time_cost); +} + +/******************************************************************************/ +/******************************************************************************/ + +/******************************************************************************/ +/******************************************************************************/ + +void TestOneType_8() +{ + int8_t data[SIZE]; + + srand( (unsigned int)init_value + 123 ); + int8_t * data_p = data; + while (data_p != (data+SIZE)) { + *data_p++ = (int8_t)rand(); + } + + gMinResult = find_minimum_8( data, data+SIZE ); + gMaxResult = find_maximum_8( data, data+SIZE ); + gMinPosition = find_minimum_position_8( data, SIZE ); + gMaxPosition = find_maximum_position_8( data, SIZE ); + + test_min_value2_8( data, SIZE, "int8_t minimum value sequence2"); + test_max_value2_8( data, SIZE, "int8_t maximum value sequence2"); + + // position tests are much slower, even at their best + int iterations_base = iterations; + iterations = iterations / 5; + + test_min_position1_8( data, SIZE, "int8_t minimum position sequence1"); + test_max_position1_8( data, SIZE, "int8_t maximum position sequence1"); + + iterations = iterations_base; +} + +void TestOneType_u8() +{ + uint8_t data[SIZE]; + + srand( (unsigned int)init_value + 123 ); + uint8_t * data_p = data; + while (data_p != (data+SIZE)) { + *data_p++ = (uint8_t)rand(); + } + + gMinResult = find_minimum_u8( data, data+SIZE ); + gMaxResult = find_maximum_u8( data, data+SIZE ); + gMinPosition = find_minimum_position_u8( data, SIZE ); + gMaxPosition = find_maximum_position_u8( data, SIZE ); + + test_min_value2_u8( data, SIZE, "uint8_t minimum value sequence2"); + test_max_value2_u8( data, SIZE, "uint8_t maximum value sequence2"); + + // position tests are much slower, even at their best + int iterations_base = iterations; + iterations = iterations / 5; + + test_min_position1_u8( data, SIZE, "uint8_t minimum position sequence1"); + test_max_position1_u8( data, SIZE, "uint8_t maximum position sequence1"); + + iterations = iterations_base; +} + +void TestOneType_16() +{ + int16_t data[SIZE]; + + srand( (unsigned int)init_value + 123 ); + int16_t * data_p = data; + while (data_p != (data+SIZE)) { + *data_p++ = (int16_t)rand(); + } + + gMinResult = find_minimum_16( data, data+SIZE ); + gMaxResult = find_maximum_16( data, data+SIZE ); + gMinPosition = find_minimum_position_16( data, SIZE ); + gMaxPosition = find_maximum_position_16( data, SIZE ); + + test_min_value2_16( data, SIZE, "int16_t minimum value sequence2"); + test_max_value2_16( data, SIZE, "int16_t maximum value sequence2"); + + // position tests are much slower, even at their best + int iterations_base = iterations; + iterations = iterations / 5; + + test_min_position1_16( data, SIZE, "int16_t minimum position sequence1"); + test_max_position1_16( data, SIZE, "int16_t maximum position sequence1"); + + iterations = iterations_base; +} + +void TestOneType_u16() +{ + uint16_t data[SIZE]; + + srand( (unsigned int)init_value + 123 ); + uint16_t * data_p = data; + while (data_p != (data+SIZE)) { + *data_p++ = (uint16_t)rand(); + } + + gMinResult = find_minimum_u16( data, data+SIZE ); + gMaxResult = find_maximum_u16( data, data+SIZE ); + gMinPosition = find_minimum_position_u16( data, SIZE ); + gMaxPosition = find_maximum_position_u16( data, SIZE ); + + test_min_value2_u16( data, SIZE, "uint16_t minimum value sequence2"); + test_max_value2_u16( data, SIZE, "uint16_t maximum value sequence2"); + + // position tests are much slower, even at their best + int iterations_base = iterations; + iterations = iterations / 5; + + test_min_position1_u16( data, SIZE, "uint16_t minimum position sequence1"); + test_max_position1_u16( data, SIZE, "uint16_t maximum position sequence1"); + + iterations = iterations_base; +} + +void TestOneType_32() +{ + int32_t data[SIZE]; + + srand( (unsigned int)init_value + 123 ); + int32_t * data_p = data; + while (data_p != (data+SIZE)) { + *data_p++ = (int32_t)rand(); + } + + gMinResult = find_minimum_32( data, data+SIZE ); + gMaxResult = find_maximum_32( data, data+SIZE ); + gMinPosition = find_minimum_position_32( data, SIZE ); + gMaxPosition = find_maximum_position_32( data, SIZE ); + + test_min_value2_32( data, SIZE, "int32_t minimum value sequence2"); + test_max_value2_32( data, SIZE, "int32_t maximum value sequence2"); + + // position tests are much slower, even at their best + int iterations_base = iterations; + iterations = iterations / 5; + + test_min_position1_32( data, SIZE, "int32_t minimum position sequence1"); + test_max_position1_32( data, SIZE, "int32_t maximum position sequence1"); + + iterations = iterations_base; +} + +void TestOneType_u32() +{ + uint32_t data[SIZE]; + + srand( (unsigned int)init_value + 123 ); + uint32_t * data_p = data; + while (data_p != (data+SIZE)) { + *data_p++ = (uint32_t)rand(); + } + + gMinResult = find_minimum_u32( data, data+SIZE ); + gMaxResult = find_maximum_u32( data, data+SIZE ); + gMinPosition = find_minimum_position_u32( data, SIZE ); + gMaxPosition = find_maximum_position_u32( data, SIZE ); + + test_min_value2_u32( data, SIZE, "uint32_t minimum value sequence2"); + test_max_value2_u32( data, SIZE, "uint32_t maximum value sequence2"); + + // position tests are much slower, even at their best + int iterations_base = iterations; + iterations = iterations / 5; + + test_min_position1_u32( data, SIZE, "uint32_t minimum position sequence1"); + test_max_position1_u32( data, SIZE, "uint32_t maximum position sequence1"); + + iterations = iterations_base; +} + +/******************************************************************************/ +/******************************************************************************/ + +void TestOneFloat_f16() +{ + float data[SIZE]; + + srand( (unsigned int)init_value + 123 ); + float * data_p = data; + while (data_p != (data+SIZE)) { + *data_p++ = (float)rand(); + } + + gMinResult = find_minimum_f16( data, data+SIZE ); + gMaxResult = find_maximum_f16( data, data+SIZE ); + gMinPosition = find_minimum_position_f16( data, SIZE ); + gMaxPosition = find_maximum_position_f16( data, SIZE ); + + test_min_value2_f16( data, SIZE, "float minimum value sequence2"); + test_max_value2_f16( data, SIZE, "float maximum value sequence2"); + + // position tests are much slower, even at their best + int iterations_base = iterations; + iterations = iterations / 5; + + test_min_position1_f16( data, SIZE, "float minimum position sequence1"); + test_max_position1_f16( data, SIZE, "float maximum position sequence1"); + + iterations = iterations_base; +} + +void TestOneFloat_f32() +{ + double data[SIZE]; + + srand( (unsigned int)init_value + 123 ); + double * data_p = data; + while (data_p != (data+SIZE)) { + *data_p++ = (double)rand(); + } + + gMinResult = find_minimum_f32( data, data+SIZE ); + gMaxResult = find_maximum_f32( data, data+SIZE ); + gMinPosition = find_minimum_position_f32( data, SIZE ); + gMaxPosition = find_maximum_position_f32( data, SIZE ); + + test_min_value2_f32( data, SIZE, "double minimum value sequence2"); + test_max_value2_f32( data, SIZE, "double maximum value sequence2"); + + // position tests are much slower, even at their best + int iterations_base = iterations; + iterations = iterations / 5; + + test_min_position1_f32( data, SIZE, "double minimum position sequence1"); + test_max_position1_f32( data, SIZE, "double maximum position sequence1"); + + iterations = iterations_base; +} + +/******************************************************************************/ +/******************************************************************************/ + +int main(int argc, char** argv) { + + // output command for documentation: + int i; + // for (i = 0; i < argc; ++i) + // printf("%s ", argv[i] ); + // printf("\n"); + + if (argc > 1) iterations = atoi(argv[1]); + if (argc > 2) init_value = (int32_t) atoi(argv[2]); + + + TestOneType_8(); + TestOneType_u8(); + TestOneType_16(); + TestOneType_u16(); + + TestOneType_32(); + TestOneType_u32(); + + TestOneFloat_f16(); + TestOneFloat_f32(); + + return 0; +} + +// the end +/******************************************************************************/ +/******************************************************************************/ diff --git a/sdk/software/examples/c_prg/product_sequence/Makefile b/sdk/software/examples/c_prg/product_sequence/Makefile new file mode 100644 index 0000000..b987045 --- /dev/null +++ b/sdk/software/examples/c_prg/product_sequence/Makefile @@ -0,0 +1,14 @@ +TARGET = product_sequence + +CFLAGS += -O3 -g + +#根据SIMU宏选择串口波特率,0:FPGA上板;1:仿真 +CFLAGS += -DSIMU=0 + +C_SRCS := $(wildcard ./*.c ) + +OBJDIR = obj +COMMON_DIR = ../../../bsp +GCC_DIR=../../../../toolchains/loongson-gnu-toolchain-8.3-x86_64-loongarch32r-linux-gnusf-v2.0 +PICOLIBC_DIR=../../../../toolchains/picolibc +include ../../../bsp/common.mk diff --git a/sdk/software/examples/c_prg/product_sequence/product_sequence.c b/sdk/software/examples/c_prg/product_sequence/product_sequence.c new file mode 100644 index 0000000..f747d17 --- /dev/null +++ b/sdk/software/examples/c_prg/product_sequence/product_sequence.c @@ -0,0 +1,169 @@ +/* + Copyright 2008 Adobe Systems Incorporated + Copyright 2019 Chris Cox + Distributed under the MIT License (see accompanying file LICENSE_1_0_0.txt + or a copy at http://stlab.adobe.com/licenses.html ) + + +Goal: Test performance of various idioms for calculating the product of a sequence. + + +Assumptions: + 1) The compiler will optimize product operations. + + 2) The compiler may recognize ineffecient product idioms and substitute efficient methods. + + +*/ + +/******************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include + + +/******************************************************************************/ +//BSP板级支持包所需全局变量 +unsigned long UART_BASE = 0xbfe001e0; //UART16550的虚地址 +unsigned long CONFREG_UART_BASE = 0xbfafff10; //CONFREG模拟UART的虚地址 +unsigned long CONFREG_TIMER_BASE = 0xbfafe000; //CONFREG计数器的虚地址 +unsigned long CONFREG_CLOCKS_PER_SEC = 100000000L; //CONFREG时钟频率 +unsigned long CORE_CLOCKS_PER_SEC = 33000000L; //处理器核时钟频率 + +clock_t start_time, end_time; + +/******************************************************************************/ + +// this constant may need to be adjusted to give reasonable minimum times +// For best results, times should be about 1.0 seconds for the minimum test run +int iterations = 10; + + +// 4000 items, or about 32k of data +// this is intended to remain within the L2 cache of most common CPUs +const int SIZE = 4000; + + +// initial value for filling our arrays, may be changed from the command line +double init_value = 2.1; + +/******************************************************************************/ +/******************************************************************************/ + +void fill_f16(float * first, float * last, float value) { + while (first != last) *first++ = (float)(value); +} + +void fill_f32(double * first, double * last, double value) { + while (first != last) *first++ = (double)(value); +} + + +void testOneFunction_f16(const float* first, const int count, const char * label) { + int i; + + start_time = clock(); + + for(i = 0; i < iterations; ++i) { + + float result = (float)(1); + for (int j = 0; j < count; ++j) { + result = result * first[j]; + } + + if ( fabs( result - pow(init_value,(double)SIZE) ) > 1.0e-6 ) + printf("test %s failed\n", label); + } + + // need the labels to remain valid until we print the summary + end_time = clock(); + + double time_cost = (end_time - start_time)/ (double)(CLOCKS_PER_SEC); + + printf("\"%s, %d items\" %f sec\n", + label, + count, + time_cost); +} + +void testOneFunction_f32(const double* first, const int count, const char * label) { + int i; + + start_time = clock(); + + for(i = 0; i < iterations; ++i) { + + double result = (double)(1); + for (int j = 0; j < count; ++j) { + result = result * first[j]; + } + + if ( fabs( result - pow(init_value,(double)SIZE) ) > 1.0e-6 ) + printf("test %s failed\n", label); + } + + // need the labels to remain valid until we print the summary + end_time = clock(); + + double time_cost = (end_time - start_time)/ (double)(CLOCKS_PER_SEC); + + printf("\"%s, %d items\" %f sec\n", + label, + count, + time_cost); +} + +/******************************************************************************/ +void TestOneType_f16() +{ + + float data[SIZE]; + + fill_f16(data, data+SIZE, (float)(init_value)); + + testOneFunction_f16( data, SIZE, "float product sequence1" ); + +} + +void TestOneType_f32() +{ + + double data[SIZE]; + + fill_f32(data, data+SIZE, (double)(init_value)); + + testOneFunction_f32( data, SIZE, "double product sequence1" ); + +} + +/******************************************************************************/ +/******************************************************************************/ + +int main(int argc, char** argv) { + + // output command for documentation: + int i; + // for (i = 0; i < argc; ++i) + // printf("%s ", argv[i] ); + // printf("\n"); + + if (argc > 1) iterations = atoi(argv[1]); + if (argc > 2) init_value = (double) atof(argv[2]); + + + TestOneType_f16(); + + TestOneType_f32(); + + + return 0; +} + +// the end +/******************************************************************************/ +/******************************************************************************/ diff --git a/sdk/software/examples/coremark/LICENSE.md b/sdk/software/examples/coremark/LICENSE.md new file mode 100644 index 0000000..14e53e9 --- /dev/null +++ b/sdk/software/examples/coremark/LICENSE.md @@ -0,0 +1,100 @@ +# COREMARK® ACCEPTABLE USE AGREEMENT + +This ACCEPTABLE USE AGREEMENT (this “Agreement”) is offered by Embedded Microprocessor Benchmark Consortium, a California nonprofit corporation (“Licensor”), to users of its CoreMark® software (“Licensee”) exclusively on the following terms. + +Licensor offers benchmarking software (“Software”) pursuant to an open source license, but carefully controls use of its benchmarks and their associated goodwill. Licensor has registered its trademark in one of the benchmarks available through the Software, COREMARK, Ser. No. 85/487,290; Reg. No. 4,179,307 (the “Trademark”), and promotes the use of a standard metric as a benchmark for assessing the performance of embedded systems. Solely on the terms described herein, Licensee may use and display the Trademark in connection with the generation of data regarding measurement and analysis of computer and embedded system benchmarking via the Software (the “Licensed Use”). + +## Article 1 – License Grant. +1.1. License. Subject to the terms and conditions of this Agreement, Licensor hereby grants to Licensee, and Licensee hereby accepts from Licensor, a personal, non-exclusive, royalty-free, revocable right and license to use and display the Trademark during the term of this Agreement (the “Term”), solely and exclusively in connection with the Licensed Use. During the Term, Licensee (i) shall not modify or otherwise create derivative works of the Trademark, and (ii) may use the Trademark only to the extent permitted under this License. Neither Licensee nor any affiliate or agent thereof shall otherwise use the Trademark without the prior express written consent of Licensor, which may be withheld in its sole and absolute discretion. All rights not expressly granted to Licensee hereunder shall remain the exclusive property of Licensor. + +1.2. Modifications to the Software. Licensee shall not use the Trademark in connection with any use of a modified, derivative, or otherwise altered copy of the Software. + +1.3. Licensor’s Use. Nothing in this Agreement shall preclude Licensor or any of its successors or assigns from using or permitting other entities to use the Trademark, whether or not such entity directly or indirectly competes or conflicts with Licensee’s Licensed Use in any manner. + +1.4. Term and Termination. This Agreement is perpetual unless terminated by either of the parties. Licensee may terminate this Agreement for convenience, without cause or liability, for any reason or for no reason whatsoever, upon ten (10) business days written notice. Licensor may terminate this Agreement effective immediately upon notice of breach. Upon termination, Licensee shall immediately remove all implementations of the Trademark from the Licensed Use, and delete all digitals files and records of all materials related to the Trademark. + +## Article 2 – Ownership. +2.1. Ownership. Licensee acknowledges and agrees that Licensor is the owner of all right, title, and interest in and to the Trademark, and all such right, title, and interest shall remain with Licensor. Licensee shall not contest, dispute, challenge, oppose, or seek to cancel Licensor’s right, title, and interest in and to the Trademark. Licensee shall not prosecute any application for registration of the Trademark. Licensee shall display appropriate notices regarding ownership of the Trademark in connection with the Licensed Use. + +2.2. Goodwill. Licensee acknowledges that Licensee shall not acquire any right, title, or interest in the Trademark by virtue of this Agreement other than the license granted hereunder, and disclaims any such right, title, interest, or ownership. All goodwill and reputation generated by Licensee’s use of the Trademark shall inure to the exclusive benefit of Licensor. Licensee shall not by any act or omission use the Trademark in any manner that disparages or reflects adversely on Licensor or its Licensed Use or reputation. Licensee shall not take any action that would interfere with or prejudice Licensor’s ownership or registration of the Trademark, the validity of the Trademark or the validity of the license granted by this Agreement. If Licensor determines and notifies Licensee that any act taken in connection with the Licensed Use (i) is inaccurate, unlawful or offensive to good taste; (ii) fails to provide for proper trademark notices, or (iii) otherwise violates Licensee’s obligations under this Agreement, the license granted under this Agreement shall terminate. + +## Article 3 – Indemnification. +3.1. Indemnification Generally. Licensee agrees to indemnify, defend, and hold harmless (collectively “indemnify” or “indemnification”) Licensor, including Licensor’s members, managers, officers, and employees (collectively “Related Persons”), from and against, and pay or reimburse Licensor and such Related Persons for, any and all third-party actions, claims, demands, proceedings, investigations, inquiries (collectively, “Claims”), and any and all liabilities, obligations, fines, deficiencies, costs, expenses, royalties, losses, and damages (including reasonable outside counsel fees and expenses) associated with such Claims, to the extent that such Claim arises out of (i) Licensee’s material breach of this Agreement, or (ii) any allegation(s) that Licensee’s actions infringe or violate any third-party intellectual property right, including without limitation, any U.S. copyright, patent, or trademark, or are otherwise found to be tortious or criminal (whether or not such indemnified person is a named party in a legal proceeding). + +3.2. Notice and Defense of Claims. Licensor shall promptly notify Licensee of any Claim for which indemnification is sought, following actual knowledge of such Claim, provided however that the failure to give such notice shall not relieve Licensee of its obligations hereunder except to the extent that Licensee is materially prejudiced by such failure. In the event that any third-party Claim is brought, Licensee shall have the right and option to undertake and control the defense of such action with counsel of its choice, provided however that (i) Licensor at its own expense may participate and appear on an equal footing with Licensee in the defense of any such Claim, (ii) Licensor may undertake and control such defense in the event of the material failure of Licensee to undertake and control the same; and (iii) the defense of any Claim relating to the intellectual property rights of Licensor or its licensors and any related counterclaims shall be solely controlled by Licensor with counsel of its choice. Licensee shall not consent to judgment or concede or settle or compromise any Claim without the prior written approval of Licensor (whose approval shall not be unreasonably withheld), unless such concession or settlement or compromise includes a full and unconditional release of Licensor and any applicable Related Persons from all liabilities in respect of such Claim. + +## Article 4 – Miscellaneous. +4.1. Relationship of the Parties. This Agreement does not create a partnership, franchise, joint venture, agency, fiduciary, or employment relationship between the parties. + +4.2. No Third-Party Beneficiaries. Except for the rights of Related Persons under Article 3 (Indemnification), there are no third-party beneficiaries to this Agreement. + +4.3. Assignment. Licensee’s rights hereunder are non-assignable, and may not be sublicensed. + +4.4. Equitable Relief. Licensee acknowledges that the remedies available at law for any breach of this Agreement will, by their nature, be inadequate. Accordingly, Licensor may obtain injunctive relief or other equitable relief to restrain a breach or threatened breach of this Agreement or to specifically enforce this Agreement, without proving that any monetary damages have been sustained, and without the requirement of posting of a bond prior to obtaining such equitable relief. + +4.5. Governing Law. This Agreement will be interpreted, construed, and enforced in all respects in accordance with the laws of the State of California, without reference to its conflict of law principles. + +4.6. Attorneys’ Fees. If any legal action, arbitration or other proceeding is brought for the enforcement of this Agreement, or because of an alleged dispute, breach, default, or misrepresentation in connection with any of the provisions of this Agreement, the successful or prevailing party shall be entitled to recover its reasonable attorneys’ fees and other reasonable costs incurred in that action or proceeding, in addition to any other relief to which it may be entitled. + +4.7. Amendment; Waiver. This Agreement may not be amended, nor may any rights under it be waived, except in writing by Licensor. + +4.8. Severability. If any provision of this Agreement is held by a court of competent jurisdiction to be contrary to law, the provision shall be modified by the court and interpreted so as best to accomplish the objectives of the original provision to the fullest extent +permitted by law, and the remaining provisions of this Agreement shall remain in effect. + +4.9. Entire Agreement. This Agreement constitutes the entire agreement between the parties and supersedes all prior and contemporaneous agreements, proposals or representations, written or oral, concerning its subject matter. + + +# Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ + +## TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + You must give any other recipients of the Work or Derivative Works a copy of this License; and + You must cause any modified files to carry prominent notices stating that You changed the files; and + You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS diff --git a/sdk/software/examples/coremark/Makefile b/sdk/software/examples/coremark/Makefile new file mode 100644 index 0000000..040f420 --- /dev/null +++ b/sdk/software/examples/coremark/Makefile @@ -0,0 +1,25 @@ +TARGET = coremark + +C_SRCS := \ + core_list_join.c \ + core_main.c \ + core_matrix.c \ + core_state.c \ + core_util.c \ + core_portme.c \ + +CFLAGS := -O3 -funroll-all-loops -finline-limit=200 -ftree-dominator-opts -fno-if-conversion2 -fselective-scheduling -fno-code-hoisting -fno-common -falign-functions=4 -falign-jumps=4 -falign-loops=4 + +#根据SIMU宏选择串口波特率,0:FPGA上板;1:仿真 +CFLAGS += -DSIMU=0 + +CFLAGS += -DFLAGS_STR=\""$(CFLAGS)"\" +CFLAGS += -g +#配置迭代次数 +CFLAGS += -DITERATIONS=1 + +OBJDIR = obj +COMMON_DIR = ../../bsp +GCC_DIR=../../../toolchains/loongson-gnu-toolchain-8.3-x86_64-loongarch32r-linux-gnusf-v2.0 +PICOLIBC_DIR=../../../toolchains/picolibc +include ../../bsp/common.mk diff --git a/sdk/software/examples/coremark/README.md b/sdk/software/examples/coremark/README.md new file mode 100644 index 0000000..ce67229 --- /dev/null +++ b/sdk/software/examples/coremark/README.md @@ -0,0 +1,398 @@ + +# Introduction + +CoreMark's primary goals are simplicity and providing a method for testing only a processor's core features. For more information about EEMBC's comprehensive embedded benchmark suites, please see www.eembc.org. + +For a more compute-intensive version of CoreMark that uses larger datasets and execution loops taken from common applications, please check out EEMBC's [CoreMark-PRO](https://www.github.com/eembc/coremark-pro) benchmark, also on GitHub. + +# Building and Running + +To build and run the benchmark, type + +`> make` + +Full results are available in the files `run1.log` and `run2.log`. CoreMark result can be found in `run1.log`. + +## Cross Compiling + +For cross compile platforms please adjust `core_portme.mak`, `core_portme.h` (and possibly `core_portme.c`) according to the specific platform used. When porting to a new platform, it is recommended to copy one of the default port folders (e.g. `mkdir && cp linux/* `), adjust the porting files, and run: +~~~ +% make PORT_DIR= +~~~ + +## Make Targets +`run` - Default target, creates `run1.log` and `run2.log`. +`run1.log` - Run the benchmark with performance parameters, and output to `run1.log` +`run2.log` - Run the benchmark with validation parameters, and output to `run2.log` +`run3.log` - Run the benchmark with profile generation parameters, and output to `run3.log` +`compile` - compile the benchmark executable +`link` - link the benchmark executable +`check` - test MD5 of sources that may not be modified +`clean` - clean temporary files + +### Make flag: `ITERATIONS` +By default, the benchmark will run between 10-100 seconds. To override, use `ITERATIONS=N` +~~~ +% make ITERATIONS=10 +~~~ +Will run the benchmark for 10 iterations. It is recommended to set a specific number of iterations in certain situations e.g.: + +* Running with a simulator +* Measuring power/energy +* Timing cannot be restarted + +Minimum required run time: **Results are only valid for reporting if the benchmark ran for at least 10 secs!** + +### Make flag: `XCFLAGS` +To add compiler flags from the command line, use `XCFLAGS` e.g.: + +~~~ +% make XCFLAGS="-g -DMULTITHREAD=4 -DUSE_FORK=1" +~~~ + +### Make flag: `CORE_DEBUG` + +Define to compile for a debug run if you get incorrect CRC. + +~~~ +% make XCFLAGS="-DCORE_DEBUG=1" +~~~ + +### Make flag: `REBUILD` + +Force a rebuild of the executable. + +## Systems Without `make` +The following files need to be compiled: +* `core_list_join.c` +* `core_main.c` +* `core_matrix.c` +* `core_state.c` +* `core_util.c` +* `PORT_DIR/core_portme.c` + +For example: +~~~ +% gcc -O2 -o coremark.exe core_list_join.c core_main.c core_matrix.c core_state.c core_util.c simple/core_portme.c -DPERFORMANCE_RUN=1 -DITERATIONS=1000 +% ./coremark.exe > run1.log +~~~ +The above will compile the benchmark for a performance run and 1000 iterations. Output is redirected to `run1.log`. + +# Parallel Execution +Use `XCFLAGS=-DMULTITHREAD=N` where N is number of threads to run in parallel. Several implementations are available to execute in multiple contexts, or you can implement your own in `core_portme.c`. + +~~~ +% make XCFLAGS="-DMULTITHREAD=4 -DUSE_PTHREAD" +~~~ + +The above will compile the benchmark for execution on 4 cores, using POSIX Threads API. + +Note: linking may fail on the previous command if your linker does not automatically add the `pthread` library. If you encounter `undefined reference` errors, please modify the `core_portme.mak` file for your platform, (e.g. `linux64/core_portme.mak`) and add `-lpthread` to the `LFLAGS_END` parameter. + +# Run Parameters for the Benchmark Executable +CoreMark's executable takes several parameters as follows (but only if `main()` accepts arguments): +1st - A seed value used for initialization of data. +2nd - A seed value used for initialization of data. +3rd - A seed value used for initialization of data. +4th - Number of iterations (0 for auto : default value) +5th - Reserved for internal use. +6th - Reserved for internal use. +7th - For malloc users only, ovreride the size of the input data buffer. + +The run target from make will run coremark with 2 different data initialization seeds. + +## Alternative parameters: +If not using `malloc` or command line arguments are not supported, the buffer size +for the algorithms must be defined via the compiler define `TOTAL_DATA_SIZE`. +`TOTAL_DATA_SIZE` must be set to 2000 bytes (default) for standard runs. +The default for such a target when testing different configurations could be: + +~~~ +% make XCFLAGS="-DTOTAL_DATA_SIZE=6000 -DMAIN_HAS_NOARGC=1" +~~~ + +# Submitting Results + +CoreMark results can be submitted on the web. Open a web browser and go to the [submission page](https://www.eembc.org/coremark/submit.php). After registering an account you may enter a score. + +# Run Rules +What is and is not allowed. + +## Required +1. The benchmark needs to run for at least 10 seconds. +2. All validation must succeed for seeds `0,0,0x66` and `0x3415,0x3415,0x66`, buffer size of 2000 bytes total. + * If not using command line arguments to main: +~~~ + % make XCFLAGS="-DPERFORMANCE_RUN=1" REBUILD=1 run1.log + % make XCFLAGS="-DVALIDATION_RUN=1" REBUILD=1 run2.log +~~~ +3. If using profile guided optimization, profile must be generated using seeds of `8,8,8`, and buffer size of 1200 bytes total. +~~~ + % make XCFLAGS="-DTOTAL_DATA_SIZE=1200 -DPROFILE_RUN=1" REBUILD=1 run3.log +~~~ +4. All source files must be compiled with the same flags. +5. All data type sizes must match size in bits such that: + * `ee_u8` is an unsigned 8-bit datatype. + * `ee_s16` is a signed 16-bit datatype. + * `ee_u16` is an unsigned 16-bit datatype. + * `ee_s32` is a signed 32-bit datatype. + * `ee_u32` is an unsigned 32-bit datatype. + +## Allowed + +1. Changing number of iterations +2. Changing toolchain and build/load/run options +3. Changing method of acquiring a data memory block +5. Changing the method of acquiring seed values +6. Changing implementation `in core_portme.c` +7. Changing configuration values in `core_portme.h` +8. Changing `core_portme.mak` + +## NOT ALLOWED +1. Changing of source file other then `core_portme*` (use `make check` to validate) + +# Reporting rules +Use the following syntax to report results on a data sheet: + +CoreMark 1.0 : N / C [/ P] [/ M] + +N - Number of iterations per second with seeds 0,0,0x66,size=2000) + +C - Compiler version and flags + +P - Parameters such as data and code allocation specifics + +* This parameter *may* be omitted if all data was allocated on the heap in RAM. +* This parameter *may not* be omitted when reporting CoreMark/MHz + +M - Type of parallel execution (if used) and number of contexts +* This parameter may be omitted if parallel execution was not used. + +e.g.: + +~~~ +CoreMark 1.0 : 128 / GCC 4.1.2 -O2 -fprofile-use / Heap in TCRAM / FORK:2 +~~~ +or +~~~ +CoreMark 1.0 : 1400 / GCC 3.4 -O4 +~~~ + +If reporting scaling results, the results must be reported as follows: + +CoreMark/MHz 1.0 : N / C / P [/ M] + +P - When reporting scaling results, memory parameter must also indicate memory frequency:core frequency ratio. +1. If the core has cache and cache frequency to core frequency ratio is configurable, that must also be included. + +e.g.: + +~~~ +CoreMark/MHz 1.0 : 1.47 / GCC 4.1.2 -O2 / DDR3(Heap) 30:1 Memory 1:1 Cache +~~~ + +# Log File Format +The log files have the following format + +~~~ +2K performance run parameters for coremark. (Run type) +CoreMark Size : 666 (Buffer size) +Total ticks : 25875 (platform dependent value) +Total time (secs) : 25.875000 (actual time in seconds) +Iterations/Sec : 3864.734300 (Performance value to report) +Iterations : 100000 (number of iterations used) +Compiler version : GCC3.4.4 (Compiler and version) +Compiler flags : -O2 (Compiler and linker flags) +Memory location : Code in flash, data in on chip RAM +seedcrc : 0xe9f5 (identifier for the input seeds) +[0]crclist : 0xe714 (validation for list part) +[0]crcmatrix : 0x1fd7 (validation for matrix part) +[0]crcstate : 0x8e3a (validation for state part) +[0]crcfinal : 0x33ff (iteration dependent output) +Correct operation validated. See README.md for run and reporting rules. (*Only when run is successful*) +CoreMark 1.0 : 6508.490622 / GCC3.4.4 -O2 / Heap (*Only on a successful performance run*) +~~~ + +# Theory of Operation + +This section describes the initial goals of CoreMark and their implementation. + +## Small and easy to understand + +* X number of source code lines for timed portion of the benchmark. +* Meaningful names for variables and functions. +* Comments for each block of code more than 10 lines long. + +## Portability + +A thin abstraction layer will be provided for I/O and timing in a separate file. All I/O and timing of the benchmark will be done through this layer. + +### Code / data size + +* Compile with gcc on x86 and make sure all sizes are according to requirements. +* If dynamic memory allocation is used, take total memory allocated into account as well. +* Avoid recursive functions and keep track of stack usage. +* Use the same memory block as data site for all algorithms, and initialize the data before each algorithm – while this means that initialization with data happens during the timed portion, it will only happen once during the timed portion and so have negligible effect on the results. + +## Controlled output + +This may be the most difficult goal. Compilers are constantly improving and getting better at analyzing code. To create work that cannot be computed at compile time and must be computed at run time, we will rely on two assumptions: + +* Some system functions (e.g. time, scanf) and parameters cannot be computed at compile time. In most cases, marking a variable volatile means the compiler is force to read this variable every time it is read. This will be used to introduce a factor into the input that cannot be precomputed at compile time. Since the results are input dependent, that will make sure that computation has to happen at run time. + +* Either a system function or I/O (e.g. scanf) or command line parameters or volatile variables will be used before the timed portion to generate data which is not available at compile time. Specific method used is not relevant as long as it can be controlled, and that it cannot be computed or eliminated by the compiler at compile time. E.g. if the clock() functions is a compiler stub, it may not be used. The derived values will be reported on the output so that verification can be done on a different machine. + +* We cannot rely on command line parameters since some embedded systems do not have the capability to provide command line parameters. All 3 methods above will be implemented (time based, scanf and command line parameters) and all 3 are valid if the compiler cannot determine the value at compile time. + +* It is important to note that The actual values that are to be supplied at run time will be standardized. The methodology is not intended to provide random data, but simply to provide controlled data that cannot be precomputed at compile time. + +* Printed results must be valid at run time. This will be used to make sure the computation has been executed. + +* Some embedded systems do not provide “printf” or other I/O functionality. All I/O will be done through a thin abstraction interface to allow execution on such systems (e.g. allow output via JTAG). + +## Key Algorithms + +### Linked List + +The following linked list structure will be used: + +~~~ +typedef struct list_data_s { + ee_s16 data16; + ee_s16 idx; +} list_data; + +typedef struct list_head_s { + struct list_head_s *next; + struct list_data_s *info; +} list_head; +~~~ + +While adding a level of indirection accessing the data, this structure is realistic and used in many embedded applications for small to medium lists. + +The list itself will be initialized on a block of memory that will be passed in to the initialization function. While in general linked lists use malloc for new nodes, embedded applications sometime control the memory for small data structures such as arrays and lists directly to avoid the overhead of system calls, so this approach is realistic. + +The linked list will be initialized such that 1/4 of the list pointers point to sequential areas in memory, and 3/4 of the list pointers are distributed in a non sequential manner. This is done to emulate a linked list that had add/remove happen for a while disrupting the neat order, and then a series of adds that are likely to come from sequential memory locations. + +For the benchmark itself: +- Multiple find operations are going to be performed. These find operations may result in the whole list being traversed. The result of each find will become part of the output chain. +- The list will be sorted using merge sort based on the data16 value, and then derive CRC of the data16 item in order for part of the list. The CRC will become part of the output chain. +- The list will be sorted again using merge sort based on the idx value. This sort will guarantee that the list is returned to the primary state before leaving the function, so that multiple iterations of the function will have the same result. CRC of the data16 for part of the list will again be calculated and become part of the output chain. + +The actual `data16` in each cell will be pseudo random based on a single 16b input that cannot be determined at compile time. In addition, the part of the list which is used for CRC will also be passed to the function, and determined based on an input that cannot be determined at run time. + +### Matrix Multiply + +This very simple algorithm forms the basis of many more complex algorithms. The tight inner loop is the focus of many optimizations (compiler as well as hardware based) and is thus relevant for embedded processing. + +The total available data space will be divided to 3 parts: +1. NxN matrix A. +2. NxN matrix B. +3. NxN matrix C. + +E.g. for 2K we will have 3 12x12 matrices (assuming data type of 32b 12(len)*12(wid)*4(size)*3(num) =1728 bytes). + +Matrix A will be initialized with small values (upper 3/4 of the bits all zero). +Matrix B will be initialized with medium values (upper half of the bits all zero). +Matrix C will be used for the result. + +For the benchmark itself: +- Multiple A by a constant into C, add the upper bits of each of the values in the result matrix. The result will become part of the output chain. +- Multiple A by column X of B into C, add the upper bits of each of the values in the result matrix. The result will become part of the output chain. +- Multiple A by B into C, add the upper bits of each of the values in the result matrix. The result will become part of the output chain. + +The actual values for A and B must be derived based on input that is not available at compile time. + +### State Machine + +This part of the code needs to exercise switch and if statements. As such, we will use a small Moore state machine. In particular, this will be a state machine that identifies string input as numbers and divides them according to format. + +The state machine will parse the input string until either a “,” separator or end of input is encountered. An invalid number will cause the state machine to return invalid state and a valid number will cause the state machine to return with type of number format (int/float/scientific). + +This code will perform a realistic task, be small enough to easily understand, and exercise the required functionality. The other option used in embedded systems is a mealy based state machine, which is driven by a table. The table then determines the number of states and complexity of transitions. This approach, however, tests mainly the load/store and function call mechanisms and less the handling of branches. If analysis of the final results shows that the load/store functionality of the processor is not exercised thoroughly, it may be a good addition to the benchmark (codesize allowing). + +For input, the memory block will be initialized with comma separated values of mixed formats, as well as invalid inputs. + +For the benchmark itself: +- Invoke the state machine on all of the input and count final states and state transitions. CRC of all final states and transitions will become part of the output chain. +- Modify the input at intervals (inject errors) and repeat the state machine operation. +- Modify the input back to original form. + +The actual input must be initialized based on data that cannot be determined at compile time. In addition the intervals for modification of the input and the actual modification must be based on input that cannot be determined at compile time. + +# Validation + +This release was tested on the following platforms: +* x86 cygwin and gcc 3.4 (Quad, dual and single core systems) +* x86 linux (Ubuntu/Fedora) and gcc (4.2/4.1) (Quad and single core systems) +* MIPS64 BE linux and gcc 3.4 16 cores system +* MIPS32 BE linux with CodeSourcery compiler 4.2-177 on Malta/Linux with a 1004K 3-core system +* PPC simulator with gcc 4.2.2 (No OS) +* PPC 64b BE linux (yellowdog) with gcc 3.4 and 4.1 (Dual core system) +* BF533 with VDSP50 +* Renesas R8C/H8 MCU with HEW 4.05 +* NXP LPC1700 armcc v4.0.0.524 +* NEC 78K with IAR v4.61 +* ARM simulator with armcc v4 + +# Memory Analysis + +Valgrind 3.4.0 used and no errors reported. + +# Balance Analysis + +Number of instructions executed for each function tested with cachegrind and found balanced with gcc and -O0. + +# Statistics + +Lines: +~~~ +Lines Blank Cmnts Source AESL +===== ===== ===== ===== ========== ======================================= + 469 66 170 251 627.5 core_list_join.c (C) + 330 18 54 268 670.0 core_main.c (C) + 256 32 80 146 365.0 core_matrix.c (C) + 240 16 51 186 465.0 core_state.c (C) + 165 11 20 134 335.0 core_util.c (C) + 150 23 36 98 245.0 coremark.h (C) + 1610 166 411 1083 2707.5 ----- Benchmark ----- (6 files) + 293 15 74 212 530.0 linux/core_portme.c (C) + 235 30 104 104 260.0 linux/core_portme.h (C) + 528 45 178 316 790.0 ----- Porting ----- (2 files) + +* For comparison, here are the stats for Dhrystone +Lines Blank Cmnts Source AESL +===== ===== ===== ===== ========== ======================================= + 311 15 242 54 135.0 dhry.h (C) + 789 132 119 553 1382.5 dhry_1.c (C) + 186 26 68 107 267.5 dhry_2.c (C) + 1286 173 429 714 1785.0 ----- C ----- (3 files) +~~~ + +# Credits +Many thanks to all of the individuals who helped with the development or testing of CoreMark including (Sorted by company name; note that company names may no longer be accurate as this was written in 2009). +* Alan Anderson, ADI +* Adhikary Rajiv, ADI +* Elena Stohr, ARM +* Ian Rickards, ARM +* Andrew Pickard, ARM +* Trent Parker, CAVIUM +* Shay Gal-On, EEMBC +* Markus Levy, EEMBC +* Peter Torelli, EEMBC +* Ron Olson, IBM +* Eyal Barzilay, MIPS +* Jens Eltze, NEC +* Hirohiko Ono, NEC +* Ulrich Drees, NEC +* Frank Roscheda, NEC +* Rob Cosaro, NXP +* Shumpei Kawasaki, RENESAS + +# Legal +Please refer to LICENSE.md in this reposity for a description of your rights to use this code. + +# Copyright +Copyright © 2009 EEMBC All rights reserved. +CoreMark is a trademark of EEMBC and EEMBC is a registered trademark of the Embedded Microprocessor Benchmark Consortium. + diff --git a/sdk/software/examples/coremark/core_list_join.c b/sdk/software/examples/coremark/core_list_join.c new file mode 100644 index 0000000..588b103 --- /dev/null +++ b/sdk/software/examples/coremark/core_list_join.c @@ -0,0 +1,599 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License 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. + +Original Author: Shay Gal-on +*/ + +#include "coremark.h" +/* +Topic: Description + Benchmark using a linked list. + + Linked list is a common data structure used in many applications. + + For our purposes, this will excercise the memory units of the processor. + In particular, usage of the list pointers to find and alter data. + + We are not using Malloc since some platforms do not support this +library. + + Instead, the memory block being passed in is used to create a list, + and the benchmark takes care not to add more items then can be + accomodated by the memory block. The porting layer will make sure + that we have a valid memory block. + + All operations are done in place, without using any extra memory. + + The list itself contains list pointers and pointers to data items. + Data items contain the following: + + idx - An index that captures the initial order of the list. + data - Variable data initialized based on the input parameters. The 16b +are divided as follows: o Upper 8b are backup of original data. o Bit 7 +indicates if the lower 7 bits are to be used as is or calculated. o Bits 0-2 +indicate type of operation to perform to get a 7b value. o Bits 3-6 provide +input for the operation. + +*/ + +/* local functions */ + +list_head *core_list_find(list_head *list, list_data *info); +list_head *core_list_reverse(list_head *list); +list_head *core_list_remove(list_head *item); +list_head *core_list_undo_remove(list_head *item_removed, + list_head *item_modified); +list_head *core_list_insert_new(list_head * insert_point, + list_data * info, + list_head **memblock, + list_data **datablock, + list_head * memblock_end, + list_data * datablock_end); +typedef ee_s32 (*list_cmp)(list_data *a, list_data *b, core_results *res); +list_head *core_list_mergesort(list_head * list, + list_cmp cmp, + core_results *res); + +ee_s16 +calc_func(ee_s16 *pdata, core_results *res) +{ + ee_s16 data = *pdata; + ee_s16 retval; + ee_u8 optype + = (data >> 7) + & 1; /* bit 7 indicates if the function result has been cached */ + if (optype) /* if cached, use cache */ + return (data & 0x007f); + else + { /* otherwise calculate and cache the result */ + ee_s16 flag = data & 0x7; /* bits 0-2 is type of function to perform */ + ee_s16 dtype + = ((data >> 3) + & 0xf); /* bits 3-6 is specific data for the operation */ + dtype |= dtype << 4; /* replicate the lower 4 bits to get an 8b value */ + switch (flag) + { + case 0: + if (dtype < 0x22) /* set min period for bit corruption */ + dtype = 0x22; + retval = core_bench_state(res->size, + res->memblock[3], + res->seed1, + res->seed2, + dtype, + res->crc); + if (res->crcstate == 0) + res->crcstate = retval; + break; + case 1: + retval = core_bench_matrix(&(res->mat), dtype, res->crc); + if (res->crcmatrix == 0) + res->crcmatrix = retval; + break; + default: + retval = data; + break; + } + res->crc = crcu16(retval, res->crc); + retval &= 0x007f; + *pdata = (data & 0xff00) | 0x0080 | retval; /* cache the result */ + return retval; + } +} +/* Function: cmp_complex + Compare the data item in a list cell. + + Can be used by mergesort. +*/ +ee_s32 +cmp_complex(list_data *a, list_data *b, core_results *res) +{ + ee_s16 val1 = calc_func(&(a->data16), res); + ee_s16 val2 = calc_func(&(b->data16), res); + return val1 - val2; +} + +/* Function: cmp_idx + Compare the idx item in a list cell, and regen the data. + + Can be used by mergesort. +*/ +ee_s32 +cmp_idx(list_data *a, list_data *b, core_results *res) +{ + if (res == NULL) + { + a->data16 = (a->data16 & 0xff00) | (0x00ff & (a->data16 >> 8)); + b->data16 = (b->data16 & 0xff00) | (0x00ff & (b->data16 >> 8)); + } + return a->idx - b->idx; +} + +void +copy_info(list_data *to, list_data *from) +{ + to->data16 = from->data16; + to->idx = from->idx; +} + +/* Benchmark for linked list: + - Try to find multiple data items. + - List sort + - Operate on data from list (crc) + - Single remove/reinsert + * At the end of this function, the list is back to original state +*/ +ee_u16 +core_bench_list(core_results *res, ee_s16 finder_idx) +{ + ee_u16 retval = 0; + ee_u16 found = 0, missed = 0; + list_head *list = res->list; + ee_s16 find_num = res->seed3; + list_head *this_find; + list_head *finder, *remover; + list_data info; + ee_s16 i; + + info.idx = finder_idx; + /* find values in the list, and change the list each time + * (reverse and cache if value found) */ + for (i = 0; i < find_num; i++) + { + info.data16 = (i & 0xff); + this_find = core_list_find(list, &info); + list = core_list_reverse(list); + if (this_find == NULL) + { + missed++; + retval += (list->next->info->data16 >> 8) & 1; + } + else + { + found++; + if (this_find->info->data16 & 0x1) /* use found value */ + retval += (this_find->info->data16 >> 9) & 1; + /* and cache next item at the head of the list (if any) */ + if (this_find->next != NULL) + { + finder = this_find->next; + this_find->next = finder->next; + finder->next = list->next; + list->next = finder; + } + } + if (info.idx >= 0) + info.idx++; +#if CORE_DEBUG + ee_printf("List find %d: [%d,%d,%d]\n", i, retval, missed, found); +#endif + } + retval += found * 4 - missed; + /* sort the list by data content and remove one item*/ + if (finder_idx > 0) + list = core_list_mergesort(list, cmp_complex, res); + remover = core_list_remove(list->next); + /* CRC data content of list from location of index N forward, and then undo + * remove */ + finder = core_list_find(list, &info); + if (!finder) + finder = list->next; + while (finder) + { + retval = crc16(list->info->data16, retval); + finder = finder->next; + } +#if CORE_DEBUG + ee_printf("List sort 1: %04x\n", retval); +#endif + remover = core_list_undo_remove(remover, list->next); + /* sort the list by index, in effect returning the list to original state */ + list = core_list_mergesort(list, cmp_idx, NULL); + /* CRC data content of list */ + finder = list->next; + while (finder) + { + retval = crc16(list->info->data16, retval); + finder = finder->next; + } +#if CORE_DEBUG + ee_printf("List sort 2: %04x\n", retval); +#endif + return retval; +} +/* Function: core_list_init + Initialize list with data. + + Parameters: + blksize - Size of memory to be initialized. + memblock - Pointer to memory block. + seed - Actual values chosen depend on the seed parameter. + The seed parameter MUST be supplied from a source that cannot be + determined at compile time + + Returns: + Pointer to the head of the list. + +*/ +list_head * +core_list_init(ee_u32 blksize, list_head *memblock, ee_s16 seed) +{ + /* calculated pointers for the list */ + ee_u32 per_item = 16 + sizeof(struct list_data_s); + ee_u32 size = (blksize / per_item) + - 2; /* to accomodate systems with 64b pointers, and make sure + same code is executed, set max list elements */ + list_head *memblock_end = memblock + size; + list_data *datablock = (list_data *)(memblock_end); + list_data *datablock_end = datablock + size; + /* some useful variables */ + ee_u32 i; + list_head *finder, *list = memblock; + list_data info; + + /* create a fake items for the list head and tail */ + list->next = NULL; + list->info = datablock; + list->info->idx = 0x0000; + list->info->data16 = (ee_s16)0x8080; + memblock++; + datablock++; + info.idx = 0x7fff; + info.data16 = (ee_s16)0xffff; + core_list_insert_new( + list, &info, &memblock, &datablock, memblock_end, datablock_end); + + /* then insert size items */ + for (i = 0; i < size; i++) + { + ee_u16 datpat = ((ee_u16)(seed ^ i) & 0xf); + ee_u16 dat + = (datpat << 3) | (i & 0x7); /* alternate between algorithms */ + info.data16 = (dat << 8) | dat; /* fill the data with actual data and + upper bits with rebuild value */ + core_list_insert_new( + list, &info, &memblock, &datablock, memblock_end, datablock_end); + } + /* and now index the list so we know initial seed order of the list */ + finder = list->next; + i = 1; + while (finder->next != NULL) + { + if (i < size / 5) /* first 20% of the list in order */ + finder->info->idx = i++; + else + { + volatile ee_u16 pat = (ee_u16)(i++ ^ seed); /* get a pseudo random number */ + finder->info->idx = 0x3fff & (((i & 0x07) << 8)| pat); /* make sure the mixed items end up after the ones in sequence */ + //*( volatile int * ) ( 0x40000000 ) = pat; + //*( volatile int * ) ( 0x40000004 ) = ((i & 0x07) << 8) | pat; + //*( volatile int * ) ( 0x40000008 ) = finder->info->idx; + //ee_printf("pat = %x\n",pat); + //ee_printf("((i & 0x07) << 8) | pat = %x\n",((i & 0x07) << 8) | pat); + //ee_printf("finder->info->idx = %d\n",finder->info->idx); + } + finder = finder->next; + } + list = core_list_mergesort(list, cmp_idx, NULL); + +#if CORE_DEBUG + ee_printf("Initialized list:\n"); + finder = list; + while (finder) + { + ee_printf( + "[%04x,%04x]", finder->info->idx, (ee_u16)finder->info->data16); + finder = finder->next; + } + ee_printf("\n"); +#endif + return list; +} + +/* Function: core_list_insert + Insert an item to the list + + Parameters: + insert_point - where to insert the item. + info - data for the cell. + memblock - pointer for the list header + datablock - pointer for the list data + memblock_end - end of region for list headers + datablock_end - end of region for list data + + Returns: + Pointer to new item. +*/ +list_head * +core_list_insert_new(list_head * insert_point, + list_data * info, + list_head **memblock, + list_data **datablock, + list_head * memblock_end, + list_data * datablock_end) +{ + list_head *newitem; + + if ((*memblock + 1) >= memblock_end) + return NULL; + if ((*datablock + 1) >= datablock_end) + return NULL; + + newitem = *memblock; + (*memblock)++; + newitem->next = insert_point->next; + insert_point->next = newitem; + + newitem->info = *datablock; + (*datablock)++; + copy_info(newitem->info, info); + + return newitem; +} + +/* Function: core_list_remove + Remove an item from the list. + + Operation: + For a singly linked list, remove by copying the data from the next item + over to the current cell, and unlinking the next item. + + Note: + since there is always a fake item at the end of the list, no need to + check for NULL. + + Returns: + Removed item. +*/ +list_head * +core_list_remove(list_head *item) +{ + list_data *tmp; + list_head *ret = item->next; + /* swap data pointers */ + tmp = item->info; + item->info = ret->info; + ret->info = tmp; + /* and eliminate item */ + item->next = item->next->next; + ret->next = NULL; + return ret; +} + +/* Function: core_list_undo_remove + Undo a remove operation. + + Operation: + Since we want each iteration of the benchmark to be exactly the same, + we need to be able to undo a remove. + Link the removed item back into the list, and switch the info items. + + Parameters: + item_removed - Return value from the + item_modified - List item that was modified during + + Returns: + The item that was linked back to the list. + +*/ +list_head * +core_list_undo_remove(list_head *item_removed, list_head *item_modified) +{ + list_data *tmp; + /* swap data pointers */ + tmp = item_removed->info; + item_removed->info = item_modified->info; + item_modified->info = tmp; + /* and insert item */ + item_removed->next = item_modified->next; + item_modified->next = item_removed; + return item_removed; +} + +/* Function: core_list_find + Find an item in the list + + Operation: + Find an item by idx (if not 0) or specific data value + + Parameters: + list - list head + info - idx or data to find + + Returns: + Found item, or NULL if not found. +*/ +list_head * +core_list_find(list_head *list, list_data *info) +{ + if (info->idx >= 0) + { + while (list && (list->info->idx != info->idx)) + list = list->next; + return list; + } + else + { + while (list && ((list->info->data16 & 0xff) != info->data16)) + list = list->next; + return list; + } +} +/* Function: core_list_reverse + Reverse a list + + Operation: + Rearrange the pointers so the list is reversed. + + Parameters: + list - list head + info - idx or data to find + + Returns: + Found item, or NULL if not found. +*/ + +list_head * +core_list_reverse(list_head *list) +{ + list_head *next = NULL, *tmp; + while (list) + { + tmp = list->next; + list->next = next; + next = list; + list = tmp; + } + return next; +} +/* Function: core_list_mergesort + Sort the list in place without recursion. + + Description: + Use mergesort, as for linked list this is a realistic solution. + Also, since this is aimed at embedded, care was taken to use iterative + rather then recursive algorithm. The sort can either return the list to + original order (by idx) , or use the data item to invoke other other + algorithms and change the order of the list. + + Parameters: + list - list to be sorted. + cmp - cmp function to use + + Returns: + New head of the list. + + Note: + We have a special header for the list that will always be first, + but the algorithm could theoretically modify where the list starts. + + */ +list_head * +core_list_mergesort(list_head *list, list_cmp cmp, core_results *res) +{ + list_head *p, *q, *e, *tail; + ee_s32 insize, nmerges, psize, qsize, i; + + insize = 1; + + while (1) + { + p = list; + list = NULL; + tail = NULL; + + nmerges = 0; /* count number of merges we do in this pass */ + + while (p) + { + nmerges++; /* there exists a merge to be done */ + /* step `insize' places along from p */ + q = p; + psize = 0; + for (i = 0; i < insize; i++) + { + psize++; + q = q->next; + if (!q) + break; + } + + /* if q hasn't fallen off end, we have two lists to merge */ + qsize = insize; + + /* now we have two lists; merge them */ + while (psize > 0 || (qsize > 0 && q)) + { + + /* decide whether next element of merge comes from p or q */ + if (psize == 0) + { + /* p is empty; e must come from q. */ + e = q; + q = q->next; + qsize--; + } + else if (qsize == 0 || !q) + { + /* q is empty; e must come from p. */ + e = p; + p = p->next; + psize--; + } + else if (cmp(p->info, q->info, res) <= 0) + { + /* First element of p is lower (or same); e must come from + * p. */ + e = p; + p = p->next; + psize--; + } + else + { + /* First element of q is lower; e must come from q. */ + e = q; + q = q->next; + qsize--; + } + + /* add the next element to the merged list */ + if (tail) + { + tail->next = e; + } + else + { + list = e; + } + tail = e; + } + + /* now p has stepped `insize' places along, and q has too */ + p = q; + } + + tail->next = NULL; + + /* If we have done only one merge, we're finished. */ + if (nmerges <= 1) /* allow for nmerges==0, the empty list case */ + return list; + + /* Otherwise repeat, merging lists twice the size */ + insize *= 2; + } +#if COMPILER_REQUIRES_SORT_RETURN + return list; +#endif +} diff --git a/sdk/software/examples/coremark/core_main.c b/sdk/software/examples/coremark/core_main.c new file mode 100644 index 0000000..d70050e --- /dev/null +++ b/sdk/software/examples/coremark/core_main.c @@ -0,0 +1,422 @@ +/* +Author : Shay Gal-On, EEMBC + +This file is part of EEMBC(R) and CoreMark(TM), which are Copyright (C) 2009 +All rights reserved. + +EEMBC CoreMark Software is a product of EEMBC and is provided under the terms of the +CoreMark License that is distributed with the official EEMBC COREMARK Software release. +If you received this EEMBC CoreMark Software without the accompanying CoreMark License, +you must discontinue use and download the official release from www.coremark.org. + +Also, if you are publicly displaying scores generated from the EEMBC CoreMark software, +make sure that you are in compliance with Run and Reporting rules specified in the accompanying readme.txt file. + +EEMBC +4354 Town Center Blvd. Suite 114-200 +El Dorado Hills, CA, 95762 +*/ +/* File: core_main.c + This file contains the framework to acquire a block of memory, seed initial parameters, tun t he benchmark and report the results. +*/ +#include "coremark.h" + +/* Function: iterate + Run the benchmark for a specified number of iterations. + + Operation: + For each type of benchmarked algorithm: + a - Initialize the data block for the algorithm. + b - Execute the algorithm N times. + + Returns: + NULL. +*/ + +//BSP板级支持包所需全局变量 +unsigned long UART_BASE = 0xbf000000; //UART16550的虚地址 +unsigned long CONFREG_TIMER_BASE = 0xbf20f100; //CONFREG计数器的虚地址 +unsigned long CONFREG_CLOCKS_PER_SEC = 50000000L; //CONFREG时钟频率 +unsigned long CORE_CLOCKS_PER_SEC = 33000000L; //处理器核时钟频率 + +static ee_u16 list_known_crc[] = {(ee_u16)0xd4b0,(ee_u16)0x3340,(ee_u16)0x6a79,(ee_u16)0xe714,(ee_u16)0xe3c1}; +static ee_u16 matrix_known_crc[] = {(ee_u16)0xbe52,(ee_u16)0x1199,(ee_u16)0x5608,(ee_u16)0x1fd7,(ee_u16)0x0747}; +static ee_u16 state_known_crc[] = {(ee_u16)0x5e47,(ee_u16)0x39bf,(ee_u16)0xe5a4,(ee_u16)0x8e3a,(ee_u16)0x8d84}; +void *iterate(void *pres) { + ee_u32 i; + ee_u16 crc; + core_results *res=(core_results *)pres; + ee_u32 iterations=res->iterations; + res->crc=0; + res->crclist=0; + res->crcmatrix=0; + res->crcstate=0; + + for (i=0; icrc=crcu16(crc,res->crc); + crc=core_bench_list(res,-1); + res->crc=crcu16(crc,res->crc); + if (i==0) res->crclist=res->crc; + } + return NULL; +} + +#if (SEED_METHOD==SEED_ARG) +ee_s32 get_seed_args(int i, int argc, char *argv[]); +#define get_seed(x) (ee_s16)get_seed_args(x,argc,argv) +#define get_seed_32(x) get_seed_args(x,argc,argv) +#else /* via function or volatile */ +ee_s32 get_seed_32(int i); +#define get_seed(x) (ee_s16)get_seed_32(x) +#endif + +#if (MEM_METHOD==MEM_STATIC) +ee_u8 static_memblk[TOTAL_DATA_SIZE]; +#endif +char *mem_name[3] = {"Static","Heap","Stack"}; +/* Function: main + Main entry routine for the benchmark. + This function is responsible for the following steps: + + 1 - Initialize input seeds from a source that cannot be determined at compile time. + 2 - Initialize memory block for use. + 3 - Run and time the benchmark. + 4 - Report results, testing the validity of the output if the seeds are known. + + Arguments: + 1 - first seed : Any value + 2 - second seed : Must be identical to first for iterations to be identical + 3 - third seed : Any value, should be at least an order of magnitude less then the input size, but bigger then 32. + 4 - Iterations : Special, if set to 0, iterations will be automatically determined such that the benchmark will run between 10 to 100 secs + +*/ + +#if MAIN_HAS_NOARGC +MAIN_RETURN_TYPE main(void) { + int argc=0; + char *argv[1]; +#else +MAIN_RETURN_TYPE main(int argc, char *argv[]) { +#endif + ee_u16 i,j=0,num_algorithms=0; + ee_s16 known_id=-1,total_errors=0; + ee_u16 seedcrc=0; + CORE_TICKS total_time; + core_results results[MULTITHREAD]; +#if (MEM_METHOD==MEM_STACK) + ee_u8 stack_memblock[TOTAL_DATA_SIZE*MULTITHREAD]; +#endif + /* first call any initializations needed */ + //portable_init(&(results[0].port), &argc, argv); + /* First some checks to make sure benchmark will run ok */ + if (sizeof(struct list_head_s)>128) { + + return MAIN_RETURN_VAL; + } + results[0].seed1=get_seed(1); + results[0].seed2=get_seed(2); + results[0].seed3=get_seed(3); + results[0].iterations=get_seed_32(4); +#if CORE_DEBUG + results[0].iterations=1; +#endif + // Bob: change the interation times to make it faster + /* Initializations */ + // UART_INIT(UART, 3, CCLK, BAUD); + + results[0].execs=get_seed_32(5); + if (results[0].execs==0) { /* if not supplied, execute all algorithms */ + results[0].execs=ALL_ALGORITHMS_MASK; + } + /* put in some default values based on one seed only for easy testing */ + if ((results[0].seed1==0) && (results[0].seed2==0) && (results[0].seed3==0)) { /* validation run */ + results[0].seed1=0; + results[0].seed2=0; + results[0].seed3=0x66; + } + if ((results[0].seed1==1) && (results[0].seed2==0) && (results[0].seed3==0)) { /* perfromance run */ + results[0].seed1=0x3415; + results[0].seed2=0x3415; + results[0].seed3=0x66; + } +#if (MEM_METHOD==MEM_STATIC) + results[0].memblock[0]=(void *)static_memblk; + results[0].size=TOTAL_DATA_SIZE; + results[0].err=0; + #if (MULTITHREAD>1) + #error "Cannot use a static data area with multiple contexts!" + #endif +#elif (MEM_METHOD==MEM_MALLOC) + for (i=0 ; i1) + if (default_num_contexts>MULTITHREAD) { + default_num_contexts=MULTITHREAD; + } + for (i=0 ; i= 0) + { + for (i = 0; i < default_num_contexts; i++) + { + results[i].err = 0; + if ((results[i].execs & ID_LIST) + && (results[i].crclist != list_known_crc[known_id])) + { + ee_printf("[%u]ERROR! list crc 0x%04x - should be 0x%04x\n", + i, + results[i].crclist, + list_known_crc[known_id]); + results[i].err++; + } + if ((results[i].execs & ID_MATRIX) + && (results[i].crcmatrix != matrix_known_crc[known_id])) + { + ee_printf("[%u]ERROR! matrix crc 0x%04x - should be 0x%04x\n", + i, + results[i].crcmatrix, + matrix_known_crc[known_id]); + results[i].err++; + } + if ((results[i].execs & ID_STATE) + && (results[i].crcstate != state_known_crc[known_id])) + { + ee_printf("[%u]ERROR! state crc 0x%04x - should be 0x%04x\n", + i, + results[i].crcstate, + state_known_crc[known_id]); + results[i].err++; + } + total_errors += results[i].err; + } + } + total_errors += check_data_types(); + + /* and report results */ + ee_printf("CoreMark Size : %lu\n", (long unsigned)results[0].size); + ee_printf("Total ticks : %lu\n", (long unsigned)total_time); +#if HAS_FLOAT + ee_printf("Total time (secs): %f\n", time_in_secs(total_time)); + if (time_in_secs(total_time) > 0) + ee_printf("Iterations/Sec : %f\n", + default_num_contexts * results[0].iterations + / time_in_secs(total_time)); +#else + ee_printf("Total time (secs): %d\n", time_in_secs(total_time)); + if (time_in_secs(total_time) > 0) + ee_printf("Iterations/Sec : %d\n", + default_num_contexts * results[0].iterations + / time_in_secs(total_time)); +#endif + // if (time_in_secs(total_time) < 10) + // { + // ee_printf( + // "ERROR! Must execute for at least 10 secs for a valid result!\n"); + // total_errors++; + // } + + ee_printf("Iterations : %lu\n", + (long unsigned)default_num_contexts * results[0].iterations); + ee_printf("Compiler version : %s\n", COMPILER_VERSION); + ee_printf("Compiler flags : %s\n", COMPILER_FLAGS); +#if (MULTITHREAD > 1) + ee_printf("Parallel %s : %d\n", PARALLEL_METHOD, default_num_contexts); +#endif + ee_printf("Memory location : %s\n", MEM_LOCATION); + /* output for verification */ + ee_printf("seedcrc : 0x%04x\n", seedcrc); + if (results[0].execs & ID_LIST) + for (i = 0; i < default_num_contexts; i++) + ee_printf("[%d]crclist : 0x%04x\n", i, results[i].crclist); + if (results[0].execs & ID_MATRIX) + for (i = 0; i < default_num_contexts; i++) + ee_printf("[%d]crcmatrix : 0x%04x\n", i, results[i].crcmatrix); + if (results[0].execs & ID_STATE) + for (i = 0; i < default_num_contexts; i++) + ee_printf("[%d]crcstate : 0x%04x\n", i, results[i].crcstate); + for (i = 0; i < default_num_contexts; i++) + ee_printf("[%d]crcfinal : 0x%04x\n", i, results[i].crc); + if (total_errors == 0) + { + ee_printf( + "Correct operation validated. See README.md for run and reporting " + "rules.\n"); +#if HAS_FLOAT + if (known_id == 3) + { + ee_printf("CoreMark 1.0 : %f / %s %s", + default_num_contexts * results[0].iterations + / time_in_secs(total_time), + COMPILER_VERSION, + COMPILER_FLAGS); +#if defined(MEM_LOCATION) && !defined(MEM_LOCATION_UNSPEC) + ee_printf(" / %s", MEM_LOCATION); +#else + ee_printf(" / %s", mem_name[MEM_METHOD]); +#endif + +#if (MULTITHREAD > 1) + ee_printf(" / %d:%s", default_num_contexts, PARALLEL_METHOD); +#endif + ee_printf("\n"); + } +#endif + } + if (total_errors > 0) + ee_printf("Errors detected\n"); + if (total_errors < 0) + ee_printf( + "Cannot validate operation for these seed values, please compare " + "with results on a known platform.\n"); + + float coremark_dmips = (results[0].iterations*1000000)/(float)total_time; +#if HAS_FLOAT + ee_printf ("\n"); + ee_printf ("\n"); + ee_printf ("Print Personal Added Addtional Info to Easy Visual Analysis\n"); + ee_printf ("\n"); + ee_printf (" (*) Assume the core running at %d MHz\n",CORE_CLOCKS_PER_SEC/1000000); + ee_printf (" So the CoreMark/MHz can be caculated by: \n"); + ee_printf (" (Iterations*1000000/total_ticks) = %2.6f CoreMark/MHz\n", coremark_dmips); + ee_printf ("\n"); +#endif + + return MAIN_RETURN_VAL; +} + + + diff --git a/sdk/software/examples/coremark/core_matrix.c b/sdk/software/examples/coremark/core_matrix.c new file mode 100644 index 0000000..29fd8ab --- /dev/null +++ b/sdk/software/examples/coremark/core_matrix.c @@ -0,0 +1,359 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License 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. + +Original Author: Shay Gal-on +*/ + +#include "coremark.h" +/* +Topic: Description + Matrix manipulation benchmark + + This very simple algorithm forms the basis of many more complex +algorithms. + + The tight inner loop is the focus of many optimizations (compiler as +well as hardware based) and is thus relevant for embedded processing. + + The total available data space will be divided to 3 parts: + NxN Matrix A - initialized with small values (upper 3/4 of the bits all +zero). NxN Matrix B - initialized with medium values (upper half of the bits all +zero). NxN Matrix C - used for the result. + + The actual values for A and B must be derived based on input that is not +available at compile time. +*/ +ee_s16 matrix_test(ee_u32 N, MATRES *C, MATDAT *A, MATDAT *B, MATDAT val); +ee_s16 matrix_sum(ee_u32 N, MATRES *C, MATDAT clipval); +void matrix_mul_const(ee_u32 N, MATRES *C, MATDAT *A, MATDAT val); +void matrix_mul_vect(ee_u32 N, MATRES *C, MATDAT *A, MATDAT *B); +void matrix_mul_matrix(ee_u32 N, MATRES *C, MATDAT *A, MATDAT *B); +void matrix_mul_matrix_bitextract(ee_u32 N, MATRES *C, MATDAT *A, MATDAT *B); +void matrix_add_const(ee_u32 N, MATDAT *A, MATDAT val); + +#define matrix_test_next(x) (x + 1) +#define matrix_clip(x, y) ((y) ? (x)&0x0ff : (x)&0x0ffff) +#define matrix_big(x) (0xf000 | (x)) +#define bit_extract(x, from, to) (((x) >> (from)) & (~(0xffffffff << (to)))) + +#if CORE_DEBUG +void +printmat(MATDAT *A, ee_u32 N, char *name) +{ + ee_u32 i, j; + ee_printf("Matrix %s [%dx%d]:\n", name, N, N); + for (i = 0; i < N; i++) + { + for (j = 0; j < N; j++) + { + if (j != 0) + ee_printf(","); + ee_printf("%d", A[i * N + j]); + } + ee_printf("\n"); + } +} +void +printmatC(MATRES *C, ee_u32 N, char *name) +{ + ee_u32 i, j; + ee_printf("Matrix %s [%dx%d]:\n", name, N, N); + for (i = 0; i < N; i++) + { + for (j = 0; j < N; j++) + { + if (j != 0) + ee_printf(","); + ee_printf("%d", C[i * N + j]); + } + ee_printf("\n"); + } +} +#endif +/* Function: core_bench_matrix + Benchmark function + + Iterate N times, + changing the matrix values slightly by a constant amount each time. +*/ +ee_u16 +core_bench_matrix(mat_params *p, ee_s16 seed, ee_u16 crc) +{ + ee_u32 N = p->N; + MATRES *C = p->C; + MATDAT *A = p->A; + MATDAT *B = p->B; + MATDAT val = (MATDAT)seed; + + crc = crc16(matrix_test(N, C, A, B, val), crc); + + return crc; +} + +/* Function: matrix_test + Perform matrix manipulation. + + Parameters: + N - Dimensions of the matrix. + C - memory for result matrix. + A - input matrix + B - operator matrix (not changed during operations) + + Returns: + A CRC value that captures all results calculated in the function. + In particular, crc of the value calculated on the result matrix + after each step by . + + Operation: + + 1 - Add a constant value to all elements of a matrix. + 2 - Multiply a matrix by a constant. + 3 - Multiply a matrix by a vector. + 4 - Multiply a matrix by a matrix. + 5 - Add a constant value to all elements of a matrix. + + After the last step, matrix A is back to original contents. +*/ +ee_s16 +matrix_test(ee_u32 N, MATRES *C, MATDAT *A, MATDAT *B, MATDAT val) +{ + ee_u16 crc = 0; + MATDAT clipval = matrix_big(val); + + matrix_add_const(N, A, val); /* make sure data changes */ +#if CORE_DEBUG + printmat(A, N, "matrix_add_const"); +#endif + matrix_mul_const(N, C, A, val); + crc = crc16(matrix_sum(N, C, clipval), crc); +#if CORE_DEBUG + printmatC(C, N, "matrix_mul_const"); +#endif + matrix_mul_vect(N, C, A, B); + crc = crc16(matrix_sum(N, C, clipval), crc); +#if CORE_DEBUG + printmatC(C, N, "matrix_mul_vect"); +#endif + matrix_mul_matrix(N, C, A, B); + crc = crc16(matrix_sum(N, C, clipval), crc); +#if CORE_DEBUG + printmatC(C, N, "matrix_mul_matrix"); +#endif + matrix_mul_matrix_bitextract(N, C, A, B); + crc = crc16(matrix_sum(N, C, clipval), crc); +#if CORE_DEBUG + printmatC(C, N, "matrix_mul_matrix_bitextract"); +#endif + + matrix_add_const(N, A, -val); /* return matrix to initial value */ + return crc; +} + +/* Function : matrix_init + Initialize the memory block for matrix benchmarking. + + Parameters: + blksize - Size of memory to be initialized. + memblk - Pointer to memory block. + seed - Actual values chosen depend on the seed parameter. + p - pointers to containing initialized matrixes. + + Returns: + Matrix dimensions. + + Note: + The seed parameter MUST be supplied from a source that cannot be + determined at compile time +*/ +ee_u32 +core_init_matrix(ee_u32 blksize, void *memblk, ee_s32 seed, mat_params *p) +{ + ee_u32 N = 0; + MATDAT *A; + MATDAT *B; + ee_s32 order = 1; + MATDAT val; + ee_u32 i = 0, j = 0; + if (seed == 0) + seed = 1; + while (j < blksize) + { + i++; + j = i * i * 2 * 4; + } + N = i - 1; + A = (MATDAT *)align_mem(memblk); + B = A + N * N; + + for (i = 0; i < N; i++) + { + for (j = 0; j < N; j++) + { + seed = ((order * seed) % 65536); + val = (seed + order); + val = matrix_clip(val, 0); + B[i * N + j] = val; + val = (val + order); + val = matrix_clip(val, 1); + A[i * N + j] = val; + order++; + } + } + + p->A = A; + p->B = B; + p->C = (MATRES *)align_mem(B + N * N); + p->N = N; +#if CORE_DEBUG + printmat(A, N, "A"); + printmat(B, N, "B"); +#endif + return N; +} + +/* Function: matrix_sum + Calculate a function that depends on the values of elements in the + matrix. + + For each element, accumulate into a temporary variable. + + As long as this value is under the parameter clipval, + add 1 to the result if the element is bigger then the previous. + + Otherwise, reset the accumulator and add 10 to the result. +*/ +ee_s16 +matrix_sum(ee_u32 N, MATRES *C, MATDAT clipval) +{ + MATRES tmp = 0, prev = 0, cur = 0; + ee_s16 ret = 0; + ee_u32 i, j; + for (i = 0; i < N; i++) + { + for (j = 0; j < N; j++) + { + cur = C[i * N + j]; + tmp += cur; + if (tmp > clipval) + { + ret += 10; + tmp = 0; + } + else + { + ret += (cur > prev) ? 1 : 0; + } + prev = cur; + } + } + return ret; +} + +/* Function: matrix_mul_const + Multiply a matrix by a constant. + This could be used as a scaler for instance. +*/ +void +matrix_mul_const(ee_u32 N, MATRES *C, MATDAT *A, MATDAT val) +{ + ee_u32 i, j; + for (i = 0; i < N; i++) + { + for (j = 0; j < N; j++) + { + C[i * N + j] = (MATRES)A[i * N + j] * (MATRES)val; + } + } +} + +/* Function: matrix_add_const + Add a constant value to all elements of a matrix. +*/ +void +matrix_add_const(ee_u32 N, MATDAT *A, MATDAT val) +{ + ee_u32 i, j; + for (i = 0; i < N; i++) + { + for (j = 0; j < N; j++) + { + A[i * N + j] += val; + } + } +} + +/* Function: matrix_mul_vect + Multiply a matrix by a vector. + This is common in many simple filters (e.g. fir where a vector of + coefficients is applied to the matrix.) +*/ +void +matrix_mul_vect(ee_u32 N, MATRES *C, MATDAT *A, MATDAT *B) +{ + ee_u32 i, j; + for (i = 0; i < N; i++) + { + C[i] = 0; + for (j = 0; j < N; j++) + { + C[i] += (MATRES)A[i * N + j] * (MATRES)B[j]; + } + } +} + +/* Function: matrix_mul_matrix + Multiply a matrix by a matrix. + Basic code is used in many algorithms, mostly with minor changes such as + scaling. +*/ +void +matrix_mul_matrix(ee_u32 N, MATRES *C, MATDAT *A, MATDAT *B) +{ + ee_u32 i, j, k; + for (i = 0; i < N; i++) + { + for (j = 0; j < N; j++) + { + C[i * N + j] = 0; + for (k = 0; k < N; k++) + { + C[i * N + j] += (MATRES)A[i * N + k] * (MATRES)B[k * N + j]; + } + } + } +} + +/* Function: matrix_mul_matrix_bitextract + Multiply a matrix by a matrix, and extract some bits from the result. + Basic code is used in many algorithms, mostly with minor changes such as + scaling. +*/ +void +matrix_mul_matrix_bitextract(ee_u32 N, MATRES *C, MATDAT *A, MATDAT *B) +{ + ee_u32 i, j, k; + for (i = 0; i < N; i++) + { + for (j = 0; j < N; j++) + { + C[i * N + j] = 0; + for (k = 0; k < N; k++) + { + MATRES tmp = (MATRES)A[i * N + k] * (MATRES)B[k * N + j]; + C[i * N + j] += bit_extract(tmp, 2, 4) * bit_extract(tmp, 5, 7); + } + } + } +} diff --git a/sdk/software/examples/coremark/core_portme.c b/sdk/software/examples/coremark/core_portme.c new file mode 100644 index 0000000..94a328f --- /dev/null +++ b/sdk/software/examples/coremark/core_portme.c @@ -0,0 +1,53 @@ +//#include +//#include +#include "coremark.h" +//#include "platform.h" +//#include "encoding.h" + +#if VALIDATION_RUN + volatile ee_s32 seed1_volatile=0x3415; + volatile ee_s32 seed2_volatile=0x3415; + volatile ee_s32 seed3_volatile=0x66; +#endif + +#if PERFORMANCE_RUN + volatile ee_s32 seed1_volatile=0x0; + volatile ee_s32 seed2_volatile=0x0; + volatile ee_s32 seed3_volatile=0x66; +#endif + +#if PROFILE_RUN + volatile ee_s32 seed1_volatile=0x8; + volatile ee_s32 seed2_volatile=0x8; + volatile ee_s32 seed3_volatile=0x8; +#endif + +volatile ee_s32 seed4_volatile=ITERATIONS; +volatile ee_s32 seed5_volatile=0; + +static CORE_TICKS t0, t1; + +void start_time(void) +{ + t0 = get_clock_count(); +} + +void stop_time(void) +{ + t1 = get_clock_count(); +} + +CORE_TICKS get_time(void) +{ + return t1 - t0; +} + +secs_ret time_in_secs(CORE_TICKS ticks) +{ +#ifdef USE_CPU_CLOCK_COUNT + secs_ret retval = ((secs_ret)ticks) / (secs_ret)CORE_CLOCKS_PER_SEC; +#else + secs_ret retval = ((secs_ret)ticks) / (secs_ret)CONFREG_CLOCKS_PER_SEC; +#endif + return retval; +} diff --git a/sdk/software/examples/coremark/core_portme.h b/sdk/software/examples/coremark/core_portme.h new file mode 100644 index 0000000..0d7cb67 --- /dev/null +++ b/sdk/software/examples/coremark/core_portme.h @@ -0,0 +1,64 @@ +//Bob: put some macro here such that the IDE SDK do not need to specify the macro specially +// #define FLAGS_STR "-O3 -fno-common -funroll-all-loops -finline-limit=600 -ftree-dominator-opts -fno-if-conversion2 -fselective-scheduling -fno-code-hoisting --param max-inline-insns-auto=20 -falign-functions=4 -falign-jumps=4 -falign-loops=4" +#define PERFORMANCE_RUN 1 + +#ifndef FESDK_CORE_PORTME_H +#define FESDK_CORE_PORTME_H + +#include +#include +#include "confreg_time.h" + +//#define CORE_DEBUG 1 +#define HAS_FLOAT 1 +#define HAS_TIME_H 1 +#define USE_CLOCK 1 +#define HAS_STDIO 1 +#define HAS_PRINTF 1 +#define SEED_METHOD SEED_VOLATILE +#define CORE_TICKS uint64_t +#define ee_u8 uint8_t +#define ee_u16 uint16_t +#define ee_u32 uint32_t +#define ee_s16 int16_t +#define ee_s32 int32_t +#define ee_ptr_int uintptr_t +#define ee_size_t size_t +#define COMPILER_FLAGS FLAGS_STR + +#define align_mem(x) (void *)(((ee_ptr_int)(x) + sizeof(ee_u32) - 1) & -sizeof(ee_u32)) + +#ifdef __GNUC__ +# define COMPILER_VERSION "GCC8.3.0" +#else +# error +#endif + +#define MEM_METHOD MEM_STACK +#define MEM_LOCATION "STACK" + +#define MAIN_HAS_NOARGC 0 +#define MAIN_HAS_NORETURN 0 + +#define MULTITHREAD 1 +#define USE_PTHREAD 0 +#define USE_FORK 0 +#define USE_SOCKET 0 + +#define default_num_contexts MULTITHREAD + +typedef int core_portable; +//static void portable_init(core_portable *p, int *argc, char *argv[]) {} +//static void portable_fini(core_portable *p) {} + +#if !defined(PROFILE_RUN) && !defined(PERFORMANCE_RUN) && !defined(VALIDATION_RUN) +#if (TOTAL_DATA_SIZE==1200) +#define PROFILE_RUN 1 +#elif (TOTAL_DATA_SIZE==2000) +#define PERFORMANCE_RUN 1 +#else +#define VALIDATION_RUN 1 +#endif +#endif + +#endif diff --git a/sdk/software/examples/coremark/core_state.c b/sdk/software/examples/coremark/core_state.c new file mode 100644 index 0000000..6dbab9d --- /dev/null +++ b/sdk/software/examples/coremark/core_state.c @@ -0,0 +1,330 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License 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. + +Original Author: Shay Gal-on +*/ + +#include "coremark.h" +/* local functions */ +enum CORE_STATE core_state_transition(ee_u8 **instr, ee_u32 *transition_count); + +/* +Topic: Description + Simple state machines like this one are used in many embedded products. + + For more complex state machines, sometimes a state transition table +implementation is used instead, trading speed of direct coding for ease of +maintenance. + + Since the main goal of using a state machine in CoreMark is to excercise +the switch/if behaviour, we are using a small moore machine. + + In particular, this machine tests type of string input, + trying to determine whether the input is a number or something else. + (see core_state.png). +*/ + +/* Function: core_bench_state + Benchmark function + + Go over the input twice, once direct, and once after introducing some + corruption. +*/ +ee_u16 +core_bench_state(ee_u32 blksize, + ee_u8 *memblock, + ee_s16 seed1, + ee_s16 seed2, + ee_s16 step, + ee_u16 crc) +{ + ee_u32 final_counts[NUM_CORE_STATES]; + ee_u32 track_counts[NUM_CORE_STATES]; + ee_u8 *p = memblock; + ee_u32 i; + +#if CORE_DEBUG + ee_printf("State Bench: %d,%d,%d,%04x\n", seed1, seed2, step, crc); +#endif + for (i = 0; i < NUM_CORE_STATES; i++) + { + final_counts[i] = track_counts[i] = 0; + } + /* run the state machine over the input */ + while (*p != 0) + { + enum CORE_STATE fstate = core_state_transition(&p, track_counts); + final_counts[fstate]++; +#if CORE_DEBUG + ee_printf("%d,", fstate); + } + ee_printf("\n"); +#else + } +#endif + p = memblock; + while (p < (memblock + blksize)) + { /* insert some corruption */ + if (*p != ',') + *p ^= (ee_u8)seed1; + p += step; + } + p = memblock; + /* run the state machine over the input again */ + while (*p != 0) + { + enum CORE_STATE fstate = core_state_transition(&p, track_counts); + final_counts[fstate]++; +#if CORE_DEBUG + ee_printf("%d,", fstate); + } + ee_printf("\n"); +#else + } +#endif + p = memblock; + while (p < (memblock + blksize)) + { /* undo corruption is seed1 and seed2 are equal */ + if (*p != ',') + *p ^= (ee_u8)seed2; + p += step; + } + /* end timing */ + for (i = 0; i < NUM_CORE_STATES; i++) + { + crc = crcu32(final_counts[i], crc); + crc = crcu32(track_counts[i], crc); + } + return crc; +} + +/* Default initialization patterns */ +static ee_u8 *intpat[4] + = { (ee_u8 *)"5012", (ee_u8 *)"1234", (ee_u8 *)"-874", (ee_u8 *)"+122" }; +static ee_u8 *floatpat[4] = { (ee_u8 *)"35.54400", + (ee_u8 *)".1234500", + (ee_u8 *)"-110.700", + (ee_u8 *)"+0.64400" }; +static ee_u8 *scipat[4] = { (ee_u8 *)"5.500e+3", + (ee_u8 *)"-.123e-2", + (ee_u8 *)"-87e+832", + (ee_u8 *)"+0.6e-12" }; +static ee_u8 *errpat[4] = { (ee_u8 *)"T0.3e-1F", + (ee_u8 *)"-T.T++Tq", + (ee_u8 *)"1T3.4e4z", + (ee_u8 *)"34.0e-T^" }; + +/* Function: core_init_state + Initialize the input data for the state machine. + + Populate the input with several predetermined strings, interspersed. + Actual patterns chosen depend on the seed parameter. + + Note: + The seed parameter MUST be supplied from a source that cannot be + determined at compile time +*/ +void +core_init_state(ee_u32 size, ee_s16 seed, ee_u8 *p) +{ + ee_u32 total = 0, next = 0, i; + ee_u8 *buf = 0; +#if CORE_DEBUG + ee_u8 *start = p; + ee_printf("State: %d,%d\n", size, seed); +#endif + size--; + next = 0; + while ((total + next + 1) < size) + { + if (next > 0) + { + for (i = 0; i < next; i++) + *(p + total + i) = buf[i]; + *(p + total + i) = ','; + total += next + 1; + } + seed++; + switch (seed & 0x7) + { + case 0: /* int */ + case 1: /* int */ + case 2: /* int */ + buf = intpat[(seed >> 3) & 0x3]; + next = 4; + break; + case 3: /* float */ + case 4: /* float */ + buf = floatpat[(seed >> 3) & 0x3]; + next = 8; + break; + case 5: /* scientific */ + case 6: /* scientific */ + buf = scipat[(seed >> 3) & 0x3]; + next = 8; + break; + case 7: /* invalid */ + buf = errpat[(seed >> 3) & 0x3]; + next = 8; + break; + default: /* Never happen, just to make some compilers happy */ + break; + } + } + size++; + while (total < size) + { /* fill the rest with 0 */ + *(p + total) = 0; + total++; + } +#if CORE_DEBUG + ee_printf("State Input: %s\n", start); +#endif +} + +static ee_u8 +ee_isdigit(ee_u8 c) +{ + ee_u8 retval; + retval = ((c >= '0') & (c <= '9')) ? 1 : 0; + return retval; +} + +/* Function: core_state_transition + Actual state machine. + + The state machine will continue scanning until either: + 1 - an invalid input is detcted. + 2 - a valid number has been detected. + + The input pointer is updated to point to the end of the token, and the + end state is returned (either specific format determined or invalid). +*/ + +enum CORE_STATE +core_state_transition(ee_u8 **instr, ee_u32 *transition_count) +{ + ee_u8 * str = *instr; + ee_u8 NEXT_SYMBOL; + enum CORE_STATE state = CORE_START; + for (; *str && state != CORE_INVALID; str++) + { + NEXT_SYMBOL = *str; + if (NEXT_SYMBOL == ',') /* end of this input */ + { + str++; + break; + } + switch (state) + { + case CORE_START: + if (ee_isdigit(NEXT_SYMBOL)) + { + state = CORE_INT; + } + else if (NEXT_SYMBOL == '+' || NEXT_SYMBOL == '-') + { + state = CORE_S1; + } + else if (NEXT_SYMBOL == '.') + { + state = CORE_FLOAT; + } + else + { + state = CORE_INVALID; + transition_count[CORE_INVALID]++; + } + transition_count[CORE_START]++; + break; + case CORE_S1: + if (ee_isdigit(NEXT_SYMBOL)) + { + state = CORE_INT; + transition_count[CORE_S1]++; + } + else if (NEXT_SYMBOL == '.') + { + state = CORE_FLOAT; + transition_count[CORE_S1]++; + } + else + { + state = CORE_INVALID; + transition_count[CORE_S1]++; + } + break; + case CORE_INT: + if (NEXT_SYMBOL == '.') + { + state = CORE_FLOAT; + transition_count[CORE_INT]++; + } + else if (!ee_isdigit(NEXT_SYMBOL)) + { + state = CORE_INVALID; + transition_count[CORE_INT]++; + } + break; + case CORE_FLOAT: + if (NEXT_SYMBOL == 'E' || NEXT_SYMBOL == 'e') + { + state = CORE_S2; + transition_count[CORE_FLOAT]++; + } + else if (!ee_isdigit(NEXT_SYMBOL)) + { + state = CORE_INVALID; + transition_count[CORE_FLOAT]++; + } + break; + case CORE_S2: + if (NEXT_SYMBOL == '+' || NEXT_SYMBOL == '-') + { + state = CORE_EXPONENT; + transition_count[CORE_S2]++; + } + else + { + state = CORE_INVALID; + transition_count[CORE_S2]++; + } + break; + case CORE_EXPONENT: + if (ee_isdigit(NEXT_SYMBOL)) + { + state = CORE_SCIENTIFIC; + transition_count[CORE_EXPONENT]++; + } + else + { + state = CORE_INVALID; + transition_count[CORE_EXPONENT]++; + } + break; + case CORE_SCIENTIFIC: + if (!ee_isdigit(NEXT_SYMBOL)) + { + state = CORE_INVALID; + transition_count[CORE_INVALID]++; + } + break; + default: + break; + } + } + *instr = str; + return state; +} diff --git a/sdk/software/examples/coremark/core_util.c b/sdk/software/examples/coremark/core_util.c new file mode 100644 index 0000000..67c5d77 --- /dev/null +++ b/sdk/software/examples/coremark/core_util.c @@ -0,0 +1,249 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License 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. + +Original Author: Shay Gal-on +*/ + +#include "coremark.h" +/* Function: get_seed + Get a values that cannot be determined at compile time. + + Since different embedded systems and compilers are used, 3 different + methods are provided: 1 - Using a volatile variable. This method is only + valid if the compiler is forced to generate code that reads the value of a + volatile variable from memory at run time. Please note, if using this method, + you would need to modify core_portme.c to generate training profile. 2 - + Command line arguments. This is the preferred method if command line + arguments are supported. 3 - System function. If none of the first 2 methods + is available on the platform, a system function which is not a stub can be + used. + + e.g. read the value on GPIO pins connected to switches, or invoke + special simulator functions. +*/ +#if (SEED_METHOD == SEED_VOLATILE) +extern volatile ee_s32 seed1_volatile; +extern volatile ee_s32 seed2_volatile; +extern volatile ee_s32 seed3_volatile; +extern volatile ee_s32 seed4_volatile; +extern volatile ee_s32 seed5_volatile; +ee_s32 +get_seed_32(int i) +{ + ee_s32 retval; + switch (i) + { + case 1: + retval = seed1_volatile; + break; + case 2: + retval = seed2_volatile; + break; + case 3: + retval = seed3_volatile; + break; + case 4: + retval = seed4_volatile; + break; + case 5: + retval = seed5_volatile; + break; + default: + retval = 0; + break; + } + return retval; +} +#elif (SEED_METHOD == SEED_ARG) +ee_s32 +parseval(char *valstring) +{ + ee_s32 retval = 0; + ee_s32 neg = 1; + int hexmode = 0; + if (*valstring == '-') + { + neg = -1; + valstring++; + } + if ((valstring[0] == '0') && (valstring[1] == 'x')) + { + hexmode = 1; + valstring += 2; + } + /* first look for digits */ + if (hexmode) + { + while (((*valstring >= '0') && (*valstring <= '9')) + || ((*valstring >= 'a') && (*valstring <= 'f'))) + { + ee_s32 digit = *valstring - '0'; + if (digit > 9) + digit = 10 + *valstring - 'a'; + retval *= 16; + retval += digit; + valstring++; + } + } + else + { + while ((*valstring >= '0') && (*valstring <= '9')) + { + ee_s32 digit = *valstring - '0'; + retval *= 10; + retval += digit; + valstring++; + } + } + /* now add qualifiers */ + if (*valstring == 'K') + retval *= 1024; + if (*valstring == 'M') + retval *= 1024 * 1024; + + retval *= neg; + return retval; +} + +ee_s32 +get_seed_args(int i, int argc, char *argv[]) +{ + if (argc > i) + return parseval(argv[i]); + return 0; +} + +#elif (SEED_METHOD == SEED_FUNC) +/* If using OS based function, you must define and implement the functions below + * in core_portme.h and core_portme.c ! */ +ee_s32 +get_seed_32(int i) +{ + ee_s32 retval; + switch (i) + { + case 1: + retval = portme_sys1(); + break; + case 2: + retval = portme_sys2(); + break; + case 3: + retval = portme_sys3(); + break; + case 4: + retval = portme_sys4(); + break; + case 5: + retval = portme_sys5(); + break; + default: + retval = 0; + break; + } + return retval; +} +#endif + +/* Function: crc* + Service functions to calculate 16b CRC code. + +*/ +ee_u16 +crcu8(ee_u8 data, ee_u16 crc) +{ + ee_u8 i = 0, x16 = 0, carry = 0; + + for (i = 0; i < 8; i++) + { + x16 = (ee_u8)((data & 1) ^ ((ee_u8)crc & 1)); + data >>= 1; + + if (x16 == 1) + { + crc ^= 0x4002; + carry = 1; + } + else + carry = 0; + crc >>= 1; + if (carry) + crc |= 0x8000; + else + crc &= 0x7fff; + } + return crc; +} +ee_u16 +crcu16(ee_u16 newval, ee_u16 crc) +{ + crc = crcu8((ee_u8)(newval), crc); + crc = crcu8((ee_u8)((newval) >> 8), crc); + return crc; +} +ee_u16 +crcu32(ee_u32 newval, ee_u16 crc) +{ + crc = crc16((ee_s16)newval, crc); + crc = crc16((ee_s16)(newval >> 16), crc); + return crc; +} +ee_u16 +crc16(ee_s16 newval, ee_u16 crc) +{ + return crcu16((ee_u16)newval, crc); +} + +ee_u8 +check_data_types() +{ + ee_u8 retval = 0; + if (sizeof(ee_u8) != 1) + { + ee_printf("ERROR: ee_u8 is not an 8b datatype!\n"); + retval++; + } + if (sizeof(ee_u16) != 2) + { + ee_printf("ERROR: ee_u16 is not a 16b datatype!\n"); + retval++; + } + if (sizeof(ee_s16) != 2) + { + ee_printf("ERROR: ee_s16 is not a 16b datatype!\n"); + retval++; + } + if (sizeof(ee_s32) != 4) + { + ee_printf("ERROR: ee_s32 is not a 32b datatype!\n"); + retval++; + } + if (sizeof(ee_u32) != 4) + { + ee_printf("ERROR: ee_u32 is not a 32b datatype!\n"); + retval++; + } + if (sizeof(ee_ptr_int) != sizeof(int *)) + { + ee_printf( + "ERROR: ee_ptr_int is not a datatype that holds an int pointer!\n"); + retval++; + } + if (retval > 0) + { + ee_printf("ERROR: Please modify the datatypes in core_portme.h!\n"); + } + return retval; +} diff --git a/sdk/software/examples/coremark/coremark.h b/sdk/software/examples/coremark/coremark.h new file mode 100644 index 0000000..a40511e --- /dev/null +++ b/sdk/software/examples/coremark/coremark.h @@ -0,0 +1,173 @@ +/* +Author : Shay Gal-On, EEMBC + +This file is part of EEMBC(R) and CoreMark(TM), which are Copyright (C) 2009 +All rights reserved. + +EEMBC CoreMark Software is a product of EEMBC and is provided under the terms of the +CoreMark License that is distributed with the official EEMBC COREMARK Software release. +If you received this EEMBC CoreMark Software without the accompanying CoreMark License, +you must discontinue use and download the official release from www.coremark.org. + +Also, if you are publicly displaying scores generated from the EEMBC CoreMark software, +make sure that you are in compliance with Run and Reporting rules specified in the accompanying readme.txt file. + +EEMBC +4354 Town Center Blvd. Suite 114-200 +El Dorado Hills, CA, 95762 +*/ +/* Topic: Description + This file contains declarations of the various benchmark functions. +*/ + +/* Configuration: TOTAL_DATA_SIZE + Define total size for data algorithms will operate on +*/ +#ifndef TOTAL_DATA_SIZE +#define TOTAL_DATA_SIZE 2*1000 +#endif + +#define SEED_ARG 0 +#define SEED_FUNC 1 +#define SEED_VOLATILE 2 + +#define MEM_STATIC 0 +#define MEM_MALLOC 1 +#define MEM_STACK 2 + +//void uart_initial(); +#include "core_portme.h" + +#if HAS_STDIO +#include +#endif + +#define ee_printf printf +/* Actual benchmark execution in iterate */ +void *iterate(void *pres); + +/* Typedef: secs_ret + For machines that have floating point support, get number of seconds as a double. + Otherwise an unsigned int. +*/ +#if HAS_FLOAT +typedef double secs_ret; +#else +typedef ee_u32 secs_ret; +#endif + +#if MAIN_HAS_NORETURN +#define MAIN_RETURN_VAL +#define MAIN_RETURN_TYPE void +#else +#define MAIN_RETURN_VAL 0 +#define MAIN_RETURN_TYPE int +#endif + +void start_time(void); +void stop_time(void); +CORE_TICKS get_time(void); +secs_ret time_in_secs(CORE_TICKS ticks); + +/* Misc useful functions */ +ee_u16 crcu8(ee_u8 data, ee_u16 crc); +ee_u16 crc16(ee_s16 newval, ee_u16 crc); +ee_u16 crcu16(ee_u16 newval, ee_u16 crc); +ee_u16 crcu32(ee_u32 newval, ee_u16 crc); +ee_u8 check_data_types(); +void *portable_malloc(ee_size_t size); +void portable_free(void *p); +ee_s32 parseval(char *valstring); + +/* Algorithm IDS */ +#define ID_LIST (1<<0) +#define ID_MATRIX (1<<1) +#define ID_STATE (1<<2) +#define ALL_ALGORITHMS_MASK (ID_LIST|ID_MATRIX|ID_STATE) +#define NUM_ALGORITHMS 3 + +/* list data structures */ +typedef struct list_data_s { + ee_s16 data16; + ee_s16 idx; +} list_data; + +typedef struct list_head_s { + struct list_head_s *next; + struct list_data_s *info; +} list_head; + + +/*matrix benchmark related stuff */ +#define MATDAT_INT 1 +#if MATDAT_INT +typedef ee_s16 MATDAT; +typedef ee_s32 MATRES; +#else +typedef ee_f16 MATDAT; +typedef ee_f32 MATRES; +#endif + +typedef struct MAT_PARAMS_S { + int N; + MATDAT *A; + MATDAT *B; + MATRES *C; +} mat_params; + +/* state machine related stuff */ +/* List of all the possible states for the FSM */ +typedef enum CORE_STATE { + CORE_START=0, + CORE_INVALID, + CORE_S1, + CORE_S2, + CORE_INT, + CORE_FLOAT, + CORE_EXPONENT, + CORE_SCIENTIFIC, + NUM_CORE_STATES +} core_state_e ; + + +/* Helper structure to hold results */ +typedef struct RESULTS_S { + /* inputs */ + ee_s16 seed1; /* Initializing seed */ + ee_s16 seed2; /* Initializing seed */ + ee_s16 seed3; /* Initializing seed */ + void *memblock[4]; /* Pointer to safe memory location */ + ee_u32 size; /* Size of the data */ + ee_u32 iterations; /* Number of iterations to execute */ + ee_u32 execs; /* Bitmask of operations to execute */ + struct list_head_s *list; + mat_params mat; + /* outputs */ + ee_u16 crc; + ee_u16 crclist; + ee_u16 crcmatrix; + ee_u16 crcstate; + ee_s16 err; + /* ultithread specific */ + core_portable port; +} core_results; + +/* Multicore execution handling */ +#if (MULTITHREAD>1) +ee_u8 core_start_parallel(core_results *res); +ee_u8 core_stop_parallel(core_results *res); +#endif + +/* list benchmark functions */ +list_head *core_list_init(ee_u32 blksize, list_head *memblock, ee_s16 seed); +ee_u16 core_bench_list(core_results *res, ee_s16 finder_idx); + +/* state benchmark functions */ +void core_init_state(ee_u32 size, ee_s16 seed, ee_u8 *p); +ee_u16 core_bench_state(ee_u32 blksize, ee_u8 *memblock, + ee_s16 seed1, ee_s16 seed2, ee_s16 step, ee_u16 crc); + +/* matrix benchmark functions */ +ee_u32 core_init_matrix(ee_u32 blksize, void *memblk, ee_s32 seed, mat_params *p); +ee_u16 core_bench_matrix(mat_params *p, ee_s16 seed, ee_u16 crc); + diff --git a/sdk/software/examples/dhrystone/Makefile b/sdk/software/examples/dhrystone/Makefile new file mode 100644 index 0000000..ccc9685 --- /dev/null +++ b/sdk/software/examples/dhrystone/Makefile @@ -0,0 +1,16 @@ +TARGET = dhrystone + +CFLAGS += -O3 -g -G8 -DTIME -DNumber_Of_Runs=1 + +#根据SIMU宏选择串口波特率,0:FPGA上板;1:仿真 +CFLAGS += -DSIMU=0 + +C_SRCS := $(wildcard ./*.c ) + +INCLUDES := -I. + +OBJDIR = obj +COMMON_DIR = ../../bsp +GCC_DIR=../../../toolchains/loongson-gnu-toolchain-8.3-x86_64-loongarch32r-linux-gnusf-v2.0 +PICOLIBC_DIR=../../../toolchains/picolibc +include ../../bsp/common.mk diff --git a/sdk/software/examples/dhrystone/README.md b/sdk/software/examples/dhrystone/README.md new file mode 100644 index 0000000..52fc469 --- /dev/null +++ b/sdk/software/examples/dhrystone/README.md @@ -0,0 +1,10 @@ +Multiple versions of Reinhold P. Weicker's **Dhrystone** benchmark + +Sources downloaded and extracted from old Usenet postings and from +sites linked from http://en.wikipedia.org/wiki/Dhrystone + +The `original-sources` directory contains the raw sources. Each +subdirectory `v1`, `v2.0`, `v2.1`, `v2.2` contains an extracted +version; see the `_README` file in each directory. + +version in this dir is v2.1 diff --git a/sdk/software/examples/dhrystone/dhry.h b/sdk/software/examples/dhrystone/dhry.h new file mode 100644 index 0000000..c1b7410 --- /dev/null +++ b/sdk/software/examples/dhrystone/dhry.h @@ -0,0 +1,420 @@ +/* + **************************************************************************** + * + * "DHRYSTONE" Benchmark Program + * ----------------------------- + * + * Version: C, Version 2.1 + * + * File: dhry.h (part 1 of 3) + * + * Date: May 25, 1988 + * + * Author: Reinhold P. Weicker + * Siemens AG, AUT E 51 + * Postfach 3220 + * 8520 Erlangen + * Germany (West) + * Phone: [+49]-9131-7-20330 + * (8-17 Central European Time) + * Usenet: ..!mcsun!unido!estevax!weicker + * + * Original Version (in Ada) published in + * "Communications of the ACM" vol. 27., no. 10 (Oct. 1984), + * pp. 1013 - 1030, together with the statistics + * on which the distribution of statements etc. is based. + * + * In this C version, the following C library functions are used: + * - strcpy, strcmp (inside the measurement loop) + * - printf, scanf (outside the measurement loop) + * In addition, Berkeley UNIX system calls "times ()" or "time ()" + * are used for execution time measurement. For measurements + * on other systems, these calls have to be changed. + * + * Collection of Results: + * Reinhold Weicker (address see above) and + * + * Rick Richardson + * PC Research. Inc. + * 94 Apple Orchard Drive + * Tinton Falls, NJ 07724 + * Phone: (201) 389-8963 (9-17 EST) + * Usenet: ...!uunet!pcrat!rick + * + * Please send results to Rick Richardson and/or Reinhold Weicker. + * Complete information should be given on hardware and software used. + * Hardware information includes: Machine type, CPU, type and size + * of caches; for microprocessors: clock frequency, memory speed + * (number of wait states). + * Software information includes: Compiler (and runtime library) + * manufacturer and version, compilation switches, OS version. + * The Operating System version may give an indication about the + * compiler; Dhrystone itself performs no OS calls in the measurement loop. + * + * The complete output generated by the program should be mailed + * such that at least some checks for correctness can be made. + * + *************************************************************************** + * + * History: This version C/2.1 has been made for two reasons: + * + * 1) There is an obvious need for a common C version of + * Dhrystone, since C is at present the most popular system + * programming language for the class of processors + * (microcomputers, minicomputers) where Dhrystone is used most. + * There should be, as far as possible, only one C version of + * Dhrystone such that results can be compared without + * restrictions. In the past, the C versions distributed + * by Rick Richardson (Version 1.1) and by Reinhold Weicker + * had small (though not significant) differences. + * + * 2) As far as it is possible without changes to the Dhrystone + * statistics, optimizing compilers should be prevented from + * removing significant statements. + * + * This C version has been developed in cooperation with + * Rick Richardson (Tinton Falls, NJ), it incorporates many + * ideas from the "Version 1.1" distributed previously by + * him over the UNIX network Usenet. + * I also thank Chaim Benedelac (National Semiconductor), + * David Ditzel (SUN), Earl Killian and John Mashey (MIPS), + * Alan Smith and Rafael Saavedra-Barrera (UC at Berkeley) + * for their help with comments on earlier versions of the + * benchmark. + * + * Changes: In the initialization part, this version follows mostly + * Rick Richardson's version distributed via Usenet, not the + * version distributed earlier via floppy disk by Reinhold Weicker. + * As a concession to older compilers, names have been made + * unique within the first 8 characters. + * Inside the measurement loop, this version follows the + * version previously distributed by Reinhold Weicker. + * + * At several places in the benchmark, code has been added, + * but within the measurement loop only in branches that + * are not executed. The intention is that optimizing compilers + * should be prevented from moving code out of the measurement + * loop, or from removing code altogether. Since the statements + * that are executed within the measurement loop have NOT been + * changed, the numbers defining the "Dhrystone distribution" + * (distribution of statements, operand types and locality) + * still hold. Except for sophisticated optimizing compilers, + * execution times for this version should be the same as + * for previous versions. + * + * Since it has proven difficult to subtract the time for the + * measurement loop overhead in a correct way, the loop check + * has been made a part of the benchmark. This does have + * an impact - though a very minor one - on the distribution + * statistics which have been updated for this version. + * + * All changes within the measurement loop are described + * and discussed in the companion paper "Rationale for + * Dhrystone version 2". + * + * Because of the self-imposed limitation that the order and + * distribution of the executed statements should not be + * changed, there are still cases where optimizing compilers + * may not generate code for some statements. To a certain + * degree, this is unavoidable for small synthetic benchmarks. + * Users of the benchmark are advised to check code listings + * whether code is generated for all statements of Dhrystone. + * + * Version 2.1 is identical to version 2.0 distributed via + * the UNIX network Usenet in March 1988 except that it corrects + * some minor deficiencies that were found by users of version 2.0. + * The only change within the measurement loop is that a + * non-executed "else" part was added to the "if" statement in + * Func_3, and a non-executed "else" part removed from Proc_3. + * + *************************************************************************** + * + * Defines: The following "Defines" are possible: + * -DREG=register (default: Not defined) + * As an approximation to what an average C programmer + * might do, the "register" storage class is applied + * (if enabled by -DREG=register) + * - for local variables, if they are used (dynamically) + * five or more times + * - for parameters if they are used (dynamically) + * six or more times + * Note that an optimal "register" strategy is + * compiler-dependent, and that "register" declarations + * do not necessarily lead to faster execution. + * -DNOSTRUCTASSIGN (default: Not defined) + * Define if the C compiler does not support + * assignment of structures. + * -DNOENUMS (default: Not defined) + * Define if the C compiler does not support + * enumeration types. + * -DTIMES (default) + * -DTIME + * The "times" function of UNIX (returning process times) + * or the "time" function (returning wallclock time) + * is used for measurement. + * For single user machines, "time ()" is adequate. For + * multi-user machines where you cannot get single-user + * access, use the "times ()" function. If you have + * neither, use a stopwatch in the dead of night. + * "printf"s are provided marking the points "Start Timer" + * and "Stop Timer". DO NOT use the UNIX "time(1)" + * command, as this will measure the total time to + * run this program, which will (erroneously) include + * the time to allocate storage (malloc) and to perform + * the initialization. + * -DHZ=nnn + * In Berkeley UNIX, the function "times" returns process + * time in 1/HZ seconds, with HZ = 60 for most systems. + * CHECK YOUR SYSTEM DESCRIPTION BEFORE YOU JUST APPLY + * A VALUE. + * + *************************************************************************** + * + * Compilation model and measurement (IMPORTANT): + * + * This C version of Dhrystone consists of three files: + * - dhry.h (this file, containing global definitions and comments) + * - dhry_1.c (containing the code corresponding to Ada package Pack_1) + * - dhry_2.c (containing the code corresponding to Ada package Pack_2) + * + * The following "ground rules" apply for measurements: + * - Separate compilation + * - No procedure merging + * - Otherwise, compiler optimizations are allowed but should be indicated + * - Default results are those without register declarations + * See the companion paper "Rationale for Dhrystone Version 2" for a more + * detailed discussion of these ground rules. + * + * For 16-Bit processors (e.g. 80186, 80286), times for all compilation + * models ("small", "medium", "large" etc.) should be given if possible, + * together with a definition of these models for the compiler system used. + * + ************************************************************************** + * + * Dhrystone (C version) statistics: + * + * [Comment from the first distribution, updated for version 2. + * Note that because of language differences, the numbers are slightly + * different from the Ada version.] + * + * The following program contains statements of a high level programming + * language (here: C) in a distribution considered representative: + * + * assignments 52 (51.0 %) + * control statements 33 (32.4 %) + * procedure, function calls 17 (16.7 %) + * + * 103 statements are dynamically executed. The program is balanced with + * respect to the three aspects: + * + * - statement type + * - operand type + * - operand locality + * operand global, local, parameter, or constant. + * + * The combination of these three aspects is balanced only approximately. + * + * 1. Statement Type: + * ----------------- number + * + * V1 = V2 9 + * (incl. V1 = F(..) + * V = Constant 12 + * Assignment, 7 + * with array element + * Assignment, 6 + * with record component + * -- + * 34 34 + * + * X = Y +|-|"&&"|"|" Z 5 + * X = Y +|-|"==" Constant 6 + * X = X +|- 1 3 + * X = Y *|/ Z 2 + * X = Expression, 1 + * two operators + * X = Expression, 1 + * three operators + * -- + * 18 18 + * + * if .... 14 + * with "else" 7 + * without "else" 7 + * executed 3 + * not executed 4 + * for ... 7 | counted every time + * while ... 4 | the loop condition + * do ... while 1 | is evaluated + * switch ... 1 + * break 1 + * declaration with 1 + * initialization + * -- + * 34 34 + * + * P (...) procedure call 11 + * user procedure 10 + * library procedure 1 + * X = F (...) + * function call 6 + * user function 5 + * library function 1 + * -- + * 17 17 + * --- + * 103 + * + * The average number of parameters in procedure or function calls + * is 1.82 (not counting the function values as implicit parameters). + * + * + * 2. Operators + * ------------ + * number approximate + * percentage + * + * Arithmetic 32 50.8 + * + * + 21 33.3 + * - 7 11.1 + * * 3 4.8 + * / (int div) 1 1.6 + * + * Comparison 27 42.8 + * + * == 9 14.3 + * /= 4 6.3 + * > 1 1.6 + * < 3 4.8 + * >= 1 1.6 + * <= 9 14.3 + * + * Logic 4 6.3 + * + * && (AND-THEN) 1 1.6 + * | (OR) 1 1.6 + * ! (NOT) 2 3.2 + * + * -- ----- + * 63 100.1 + * + * + * 3. Operand Type (counted once per operand reference): + * --------------- + * number approximate + * percentage + * + * Integer 175 72.3 % + * Character 45 18.6 % + * Pointer 12 5.0 % + * String30 6 2.5 % + * Array 2 0.8 % + * Record 2 0.8 % + * --- ------- + * 242 100.0 % + * + * When there is an access path leading to the final operand (e.g. a record + * component), only the final data type on the access path is counted. + * + * + * 4. Operand Locality: + * ------------------- + * number approximate + * percentage + * + * local variable 114 47.1 % + * global variable 22 9.1 % + * parameter 45 18.6 % + * value 23 9.5 % + * reference 22 9.1 % + * function result 6 2.5 % + * constant 55 22.7 % + * --- ------- + * 242 100.0 % + * + * + * The program does not compute anything meaningful, but it is syntactically + * and semantically correct. All variables have a value assigned to them + * before they are used as a source operand. + * + * There has been no explicit effort to account for the effects of a + * cache, or to balance the use of long or short displacements for code or + * data. + * + *************************************************************************** + */ + +/* Compiler and system dependent definitions: */ + +#ifndef TIME +#define TIMES +#endif + /* Use times(2) time function unless */ + /* explicitly defined otherwise */ + + +#define Mic_secs_Per_Second 1000000 + /* Berkeley UNIX C returns process times in seconds/HZ */ + +#ifdef NOSTRUCTASSIGN +#define structassign(d, s) memcpy(&(d), &(s), sizeof(d)) +#else +#define structassign(d, s) d = s +#endif + +#ifdef NOENUM +#define Ident_1 0 +#define Ident_2 1 +#define Ident_3 2 +#define Ident_4 3 +#define Ident_5 4 + typedef int Enumeration; +#else + typedef enum {Ident_1, Ident_2, Ident_3, Ident_4, Ident_5} + Enumeration; +#endif + /* for boolean and enumeration types in Ada, Pascal */ + +/* General definitions: */ + +#include +#include +#include "confreg_time.h" + /* for strcpy, strcmp */ + +#define Null 0 + /* Value of a Null pointer */ +#define true 1 +#define false 0 + +typedef int One_Thirty; +typedef int One_Fifty; +typedef char Capital_Letter; +typedef int Boolean; +typedef char Str_30 [31]; +typedef int Arr_1_Dim [50]; +typedef int Arr_2_Dim [50] [50]; + +typedef struct record + { + struct record *Ptr_Comp; + Enumeration Discr; + union { + struct { + Enumeration Enum_Comp; + int Int_Comp; + char Str_Comp [31]; + } var_1; + struct { + Enumeration E_Comp_2; + char Str_2_Comp [31]; + } var_2; + struct { + char Ch_1_Comp; + char Ch_2_Comp; + } var_3; + } variant; + } Rec_Type, *Rec_Pointer; + + diff --git a/sdk/software/examples/dhrystone/dhry_1.c b/sdk/software/examples/dhrystone/dhry_1.c new file mode 100644 index 0000000..a69c15a --- /dev/null +++ b/sdk/software/examples/dhrystone/dhry_1.c @@ -0,0 +1,392 @@ +/* + **************************************************************************** + * + * "DHRYSTONE" Benchmark Program + * ----------------------------- + * + * Version: C, Version 2.1 + * + * File: dhry_1.c (part 2 of 3) + * + * Date: May 25, 1988 + * + * Author: Reinhold P. Weicker + * + **************************************************************************** + */ + +#include "dhry.h" + +/* Global Variables: */ + +//BSP板级支持包所需全局变量 +unsigned long UART_BASE = 0xbfe001e0; //UART16550的虚地址 +unsigned long CONFREG_UART_BASE = 0xbfafff10; //CONFREG模拟UART的虚地址 +unsigned long CONFREG_TIMER_BASE = 0xbfafe000; //CONFREG计数器的虚地址 +unsigned long CONFREG_CLOCKS_PER_SEC = 100000000L; //CONFREG时钟频率 +unsigned long CORE_CLOCKS_PER_SEC = 33000000L; //处理器核时钟频率 + +Rec_Pointer Ptr_Glob, + Next_Ptr_Glob; +int Int_Glob; +Boolean Bool_Glob; +char Ch_1_Glob, + Ch_2_Glob; +int Arr_1_Glob [50]; +int Arr_2_Glob [50] [50]; + +Enumeration Func_1 (); + + /* forward declaration necessary since Enumeration may not simply be int */ + +#ifndef REG + Boolean Reg = false; +#define REG + /* REG becomes defined as empty */ + /* i.e. no register variables */ +#else + Boolean Reg = true; +#endif + +/* variables for time measurement: */ + + /* see library function "times" */ +#define Too_Small_Time 120 + /* Measurements should last at least about 2 seconds */ + +long Begin_Time, + End_Time, + User_Time; + +float Microseconds, + Dhrystones_Per_Second; + +Rec_Type Next_Rec_Glob; +Rec_Type Rec_Glob; +/* end of variables for time measurement */ + +void* malloc(size_t); + +int main (int argc, char** argv) +/*****/ + + /* main program, corresponds to procedures */ + /* Main and Proc_0 in the Ada version */ +{ + One_Fifty Int_1_Loc; + REG One_Fifty Int_2_Loc; + One_Fifty Int_3_Loc; + REG char Ch_Index; + Enumeration Enum_Loc; + Str_30 Str_1_Loc; + Str_30 Str_2_Loc; + REG int Run_Index; + + /* Initializations */ + printf ("\n"); + printf ("Dhrystone Benchmark, Version 2.1 (Language: C)\n"); + printf ("\n"); + +// Next_Ptr_Glob = (Rec_Pointer) malloc (sizeof (Rec_Type)); +// Ptr_Glob = (Rec_Pointer) malloc (sizeof (Rec_Type)); + Next_Ptr_Glob = (Rec_Pointer)&Next_Rec_Glob; + Ptr_Glob = (Rec_Pointer)&Rec_Glob; + + Ptr_Glob->Ptr_Comp = Next_Ptr_Glob; + Ptr_Glob->Discr = Ident_1; + Ptr_Glob->variant.var_1.Enum_Comp = Ident_3; + Ptr_Glob->variant.var_1.Int_Comp = 40; + strcpy (Ptr_Glob->variant.var_1.Str_Comp, + "DHRYSTONE PROGRAM, SOME STRING"); + strcpy (Str_1_Loc, "DHRYSTONE PROGRAM, 1'ST STRING"); + + Arr_2_Glob [8][7] = 10; + /* Was missing in published program. Without this statement, */ + /* Arr_2_Glob [8][7] would have an undefined value. */ + /* Warning: With 16-Bit processors and Number_Of_Runs > 32000, */ + /* overflow may occur for this array element. */ + + printf("\n"); + printf("Dhrystone Benchmark, Version 2.1 (Language: C)\n"); + printf("\n"); + if (Reg) + { + printf ("Program compiled with 'register' attribute\n"); + printf ("\n"); + } + else + { + printf ("Program compiled without 'register' attribute\n"); + printf ("\n"); + } + + printf ("Execution starts, %d runs through Dhrystone\n", Number_Of_Runs); + + /***************/ + /* Start timer */ + /***************/ + + Begin_Time = get_ns(); + + for (Run_Index = 1; Run_Index <= Number_Of_Runs; ++Run_Index) + { + + Proc_5(); + Proc_4(); + /* Ch_1_Glob == 'A', Ch_2_Glob == 'B', Bool_Glob == true */ + Int_1_Loc = 2; + Int_2_Loc = 3; + strcpy (Str_2_Loc, "DHRYSTONE PROGRAM, 2'ND STRING"); + Enum_Loc = Ident_2; + Bool_Glob = ! Func_2 (Str_1_Loc, Str_2_Loc); + /* Bool_Glob == 1 */ + while (Int_1_Loc < Int_2_Loc) /* loop body executed once */ + { + Int_3_Loc = 5 * Int_1_Loc - Int_2_Loc; + /* Int_3_Loc == 7 */ + Proc_7 (Int_1_Loc, Int_2_Loc, &Int_3_Loc); + /* Int_3_Loc == 7 */ + Int_1_Loc += 1; + } /* while */ + /* Int_1_Loc == 3, Int_2_Loc == 3, Int_3_Loc == 7 */ + Proc_8 (Arr_1_Glob, Arr_2_Glob, Int_1_Loc, Int_3_Loc); + /* Int_Glob == 5 */ + Proc_1 (Ptr_Glob); + for (Ch_Index = 'A'; Ch_Index <= Ch_2_Glob; ++Ch_Index) + /* loop body executed twice */ + { + if (Enum_Loc == Func_1 (Ch_Index, 'C')) + /* then, not executed */ + { + Proc_6 (Ident_1, &Enum_Loc); + strcpy (Str_2_Loc, "DHRYSTONE PROGRAM, 3'RD STRING"); + Int_2_Loc = Run_Index; + Int_Glob = Run_Index; + } + } + /* Int_1_Loc == 3, Int_2_Loc == 3, Int_3_Loc == 7 */ + Int_2_Loc = Int_2_Loc * Int_1_Loc; + Int_1_Loc = Int_2_Loc / Int_3_Loc; + Int_2_Loc = 7 * (Int_2_Loc - Int_3_Loc) - Int_1_Loc; + /* Int_1_Loc == 1, Int_2_Loc == 13, Int_3_Loc == 7 */ + Proc_2 (&Int_1_Loc); + /* Int_1_Loc == 5 */ + + } /* loop "for Run_Index" */ + + /**************/ + /* Stop timer */ + /**************/ + + End_Time = get_ns(); + + printf ("Execution ends\n"); + printf ("\n"); + printf ("Final values of the variables used in the benchmark:\n"); + printf ("\n"); + printf ("Int_Glob: %d\n", Int_Glob); + printf (" should be: %d\n", 5); + printf ("Bool_Glob: %d\n", Bool_Glob); + printf (" should be: %d\n", 1); + printf ("Ch_1_Glob: %c\n", Ch_1_Glob); + printf (" should be: %c\n", 'A'); + printf ("Ch_2_Glob: %c\n", Ch_2_Glob); + printf (" should be: %c\n", 'B'); + printf ("Arr_1_Glob[8]: %d\n", Arr_1_Glob[8]); + printf (" should be: %d\n", 7); + printf ("Arr_2_Glob[8][7]: %d\n", Arr_2_Glob[8][7]); + printf (" should be: %d\n", Number_Of_Runs + 10); + printf ("Ptr_Glob->\n"); + printf (" Ptr_Comp: %d\n", (int) Ptr_Glob->Ptr_Comp); + printf (" should be: (implementation-dependent)\n"); + printf (" Discr: %d\n", Ptr_Glob->Discr); + printf (" should be: %d\n", 0); + printf (" Enum_Comp: %d\n", Ptr_Glob->variant.var_1.Enum_Comp); + printf (" should be: %d\n", 2); + printf (" Int_Comp: %d\n", Ptr_Glob->variant.var_1.Int_Comp); + printf (" should be: %d\n", 17); + printf (" Str_Comp: %s\n", Ptr_Glob->variant.var_1.Str_Comp); + printf (" should be: DHRYSTONE PROGRAM, SOME STRING\n"); + printf ("Next_Ptr_Glob->\n"); + printf (" Ptr_Comp: %d\n", (int) Next_Ptr_Glob->Ptr_Comp); + printf (" should be: (implementation-dependent), same as above\n"); + printf (" Discr: %d\n", Next_Ptr_Glob->Discr); + printf (" should be: %d\n", 0); + printf (" Enum_Comp: %d\n", Next_Ptr_Glob->variant.var_1.Enum_Comp); + printf (" should be: %d\n", 1); + printf (" Int_Comp: %d\n", Next_Ptr_Glob->variant.var_1.Int_Comp); + printf (" should be: %d\n", 18); + printf (" Str_Comp: %s\n", + Next_Ptr_Glob->variant.var_1.Str_Comp); + printf (" should be: DHRYSTONE PROGRAM, SOME STRING\n"); + printf ("Int_1_Loc: %d\n", Int_1_Loc); + printf (" should be: %d\n", 5); + printf ("Int_2_Loc: %d\n", Int_2_Loc); + printf (" should be: %d\n", 13); + printf ("Int_3_Loc: %d\n", Int_3_Loc); + printf (" should be: %d\n", 7); + printf ("Enum_Loc: %d\n", Enum_Loc); + printf (" should be: %d\n", 1); + printf ("Str_1_Loc: %s\n", Str_1_Loc); + printf (" should be: DHRYSTONE PROGRAM, 1'ST STRING\n"); + printf ("Str_2_Loc: %s\n", Str_2_Loc); + printf (" should be: DHRYSTONE PROGRAM, 2'ND STRING\n"); + printf ("\n"); + + int pass = 0; + if (Int_Glob == 5) ; else pass = 1; + if (Bool_Glob == 1) ; else pass = 1; + if (Ch_1_Glob == 'A') ; else pass = 1; + if (Ch_2_Glob == 'B') ; else pass = 1; + if (Arr_1_Glob[8] == 7) ; else pass = 1; + if ((Arr_2_Glob[8][7] == Number_Of_Runs + 10)) ; else pass = 1; + if ((int) Ptr_Glob->Ptr_Comp == (int) Next_Ptr_Glob->Ptr_Comp) ; else pass = 1; + if (Ptr_Glob->Discr == 0) ; else pass = 1; + if (Ptr_Glob->variant.var_1.Enum_Comp == 2) ; else pass = 1; + if (Ptr_Glob->variant.var_1.Int_Comp == 17) ; else pass = 1; + if (strcmp(Ptr_Glob->variant.var_1.Str_Comp, "DHRYSTONE PROGRAM, SOME STRING") == 0) ; else pass = 1; + if (Next_Ptr_Glob->Discr == 0) ; else pass = 1; + if (Next_Ptr_Glob->variant.var_1.Enum_Comp == 1) ; else pass = 1; + if (Next_Ptr_Glob->variant.var_1.Int_Comp == 18) ; else pass = 1; + if (strcmp(Next_Ptr_Glob->variant.var_1.Str_Comp, "DHRYSTONE PROGRAM, SOME STRING") == 0) ; else pass = 1; + if (Int_1_Loc == 5) ; else pass = 1; + if (Int_2_Loc == 13) ; else pass = 1; + if (Int_3_Loc == 7) ; else pass = 1; + if (Enum_Loc == 1) ; else pass = 1; + if (strcmp(Str_1_Loc, "DHRYSTONE PROGRAM, 1'ST STRING") == 0) ; else pass = 1; + if (strcmp(Str_2_Loc, "DHRYSTONE PROGRAM, 2'ND STRING") == 0) ; else pass = 1; + + User_Time = End_Time - Begin_Time; + printf ("Begin ns: %lu\n",Begin_Time); + printf ("End ns: %lu\n",End_Time); + printf ("Total ns: %lu\n",User_Time); + + + if (User_Time < Too_Small_Time) + { + printf ("Measured time too small to obtain meaningful results\n"); + printf ("Please increase number of runs\n"); + printf ("\n"); + } + else + { + Microseconds = (float) User_Time /(float) Number_Of_Runs/(float)1000000; + Dhrystones_Per_Second = ((float) 1000000000 * (float) Number_Of_Runs) + / (float) User_Time; + + printf ("Microseconds for one run through Dhrystone: "); + printf ("%10.1f \n", Microseconds); + printf ("Dhrystones per Second: "); + printf ("%10.0f \n", Dhrystones_Per_Second); + printf ("\n"); + } + return pass; +} + + +Proc_1 (Ptr_Val_Par) +/******************/ + +REG Rec_Pointer Ptr_Val_Par; + /* executed once */ +{ + REG Rec_Pointer Next_Record = Ptr_Val_Par->Ptr_Comp; + /* == Ptr_Glob_Next */ + /* Local variable, initialized with Ptr_Val_Par->Ptr_Comp, */ + /* corresponds to "rename" in Ada, "with" in Pascal */ + + structassign (*Ptr_Val_Par->Ptr_Comp, *Ptr_Glob); + Ptr_Val_Par->variant.var_1.Int_Comp = 5; + Next_Record->variant.var_1.Int_Comp + = Ptr_Val_Par->variant.var_1.Int_Comp; + Next_Record->Ptr_Comp = Ptr_Val_Par->Ptr_Comp; + Proc_3 (&Next_Record->Ptr_Comp); + /* Ptr_Val_Par->Ptr_Comp->Ptr_Comp + == Ptr_Glob->Ptr_Comp */ + if (Next_Record->Discr == Ident_1) + /* then, executed */ + { + Next_Record->variant.var_1.Int_Comp = 6; + Proc_6 (Ptr_Val_Par->variant.var_1.Enum_Comp, + &Next_Record->variant.var_1.Enum_Comp); + Next_Record->Ptr_Comp = Ptr_Glob->Ptr_Comp; + Proc_7 (Next_Record->variant.var_1.Int_Comp, 10, + &Next_Record->variant.var_1.Int_Comp); + } + else /* not executed */ + structassign (*Ptr_Val_Par, *Ptr_Val_Par->Ptr_Comp); +} /* Proc_1 */ + + +Proc_2 (Int_Par_Ref) +/******************/ + /* executed once */ + /* *Int_Par_Ref == 1, becomes 4 */ + +One_Fifty *Int_Par_Ref; +{ + One_Fifty Int_Loc; + Enumeration Enum_Loc; + + Int_Loc = *Int_Par_Ref + 10; + do /* executed once */ + if (Ch_1_Glob == 'A') + /* then, executed */ + { + Int_Loc -= 1; + *Int_Par_Ref = Int_Loc - Int_Glob; + Enum_Loc = Ident_1; + } /* if */ + while (Enum_Loc != Ident_1); /* true */ +} /* Proc_2 */ + + +Proc_3 (Ptr_Ref_Par) +/******************/ + /* executed once */ + /* Ptr_Ref_Par becomes Ptr_Glob */ + +Rec_Pointer *Ptr_Ref_Par; + +{ + if (Ptr_Glob != Null) + /* then, executed */ + *Ptr_Ref_Par = Ptr_Glob->Ptr_Comp; + Proc_7 (10, Int_Glob, &Ptr_Glob->variant.var_1.Int_Comp); +} /* Proc_3 */ + + +Proc_4 () /* without parameters */ +/*******/ + /* executed once */ +{ + Boolean Bool_Loc; + + Bool_Loc = Ch_1_Glob == 'A'; + Bool_Glob = Bool_Loc | Bool_Glob; + Ch_2_Glob = 'B'; +} /* Proc_4 */ + + +Proc_5 () /* without parameters */ +/*******/ + /* executed once */ +{ + Ch_1_Glob = 'A'; + Bool_Glob = false; +} /* Proc_5 */ + + + /* Procedure for the assignment of structures, */ + /* if the C compiler doesn't support this feature */ +#ifdef NOSTRUCTASSIGN +memcpy (d, s, l) +register char *d; +register char *s; +register int l; +{ + while (l--) *d++ = *s++; +} +#endif + + diff --git a/sdk/software/examples/dhrystone/dhry_2.c b/sdk/software/examples/dhrystone/dhry_2.c new file mode 100644 index 0000000..63a3d3e --- /dev/null +++ b/sdk/software/examples/dhrystone/dhry_2.c @@ -0,0 +1,192 @@ +/* + **************************************************************************** + * + * "DHRYSTONE" Benchmark Program + * ----------------------------- + * + * Version: C, Version 2.1 + * + * File: dhry_2.c (part 3 of 3) + * + * Date: May 25, 1988 + * + * Author: Reinhold P. Weicker + * + **************************************************************************** + */ + +#include "dhry.h" + +#ifndef REG +#define REG + /* REG becomes defined as empty */ + /* i.e. no register variables */ +#endif + +extern int Int_Glob; +extern char Ch_1_Glob; + + +Proc_6 (Enum_Val_Par, Enum_Ref_Par) +/*********************************/ + /* executed once */ + /* Enum_Val_Par == Ident_3, Enum_Ref_Par becomes Ident_2 */ + +Enumeration Enum_Val_Par; +Enumeration *Enum_Ref_Par; +{ + *Enum_Ref_Par = Enum_Val_Par; + if (! Func_3 (Enum_Val_Par)) + /* then, not executed */ + *Enum_Ref_Par = Ident_4; + switch (Enum_Val_Par) + { + case Ident_1: + *Enum_Ref_Par = Ident_1; + break; + case Ident_2: + if (Int_Glob > 100) + /* then */ + *Enum_Ref_Par = Ident_1; + else *Enum_Ref_Par = Ident_4; + break; + case Ident_3: /* executed */ + *Enum_Ref_Par = Ident_2; + break; + case Ident_4: break; + case Ident_5: + *Enum_Ref_Par = Ident_3; + break; + } /* switch */ +} /* Proc_6 */ + + +Proc_7 (Int_1_Par_Val, Int_2_Par_Val, Int_Par_Ref) +/**********************************************/ + /* executed three times */ + /* first call: Int_1_Par_Val == 2, Int_2_Par_Val == 3, */ + /* Int_Par_Ref becomes 7 */ + /* second call: Int_1_Par_Val == 10, Int_2_Par_Val == 5, */ + /* Int_Par_Ref becomes 17 */ + /* third call: Int_1_Par_Val == 6, Int_2_Par_Val == 10, */ + /* Int_Par_Ref becomes 18 */ +One_Fifty Int_1_Par_Val; +One_Fifty Int_2_Par_Val; +One_Fifty *Int_Par_Ref; +{ + One_Fifty Int_Loc; + + Int_Loc = Int_1_Par_Val + 2; + *Int_Par_Ref = Int_2_Par_Val + Int_Loc; +} /* Proc_7 */ + + +Proc_8 (Arr_1_Par_Ref, Arr_2_Par_Ref, Int_1_Par_Val, Int_2_Par_Val) +/*********************************************************************/ + /* executed once */ + /* Int_Par_Val_1 == 3 */ + /* Int_Par_Val_2 == 7 */ +Arr_1_Dim Arr_1_Par_Ref; +Arr_2_Dim Arr_2_Par_Ref; +int Int_1_Par_Val; +int Int_2_Par_Val; +{ + REG One_Fifty Int_Index; + REG One_Fifty Int_Loc; + + Int_Loc = Int_1_Par_Val + 5; + Arr_1_Par_Ref [Int_Loc] = Int_2_Par_Val; + Arr_1_Par_Ref [Int_Loc+1] = Arr_1_Par_Ref [Int_Loc]; + Arr_1_Par_Ref [Int_Loc+30] = Int_Loc; + for (Int_Index = Int_Loc; Int_Index <= Int_Loc+1; ++Int_Index) + Arr_2_Par_Ref [Int_Loc] [Int_Index] = Int_Loc; + Arr_2_Par_Ref [Int_Loc] [Int_Loc-1] += 1; + Arr_2_Par_Ref [Int_Loc+20] [Int_Loc] = Arr_1_Par_Ref [Int_Loc]; + Int_Glob = 5; +} /* Proc_8 */ + + +Enumeration Func_1 (Ch_1_Par_Val, Ch_2_Par_Val) +/*************************************************/ + /* executed three times */ + /* first call: Ch_1_Par_Val == 'H', Ch_2_Par_Val == 'R' */ + /* second call: Ch_1_Par_Val == 'A', Ch_2_Par_Val == 'C' */ + /* third call: Ch_1_Par_Val == 'B', Ch_2_Par_Val == 'C' */ + +Capital_Letter Ch_1_Par_Val; +Capital_Letter Ch_2_Par_Val; +{ + Capital_Letter Ch_1_Loc; + Capital_Letter Ch_2_Loc; + + Ch_1_Loc = Ch_1_Par_Val; + Ch_2_Loc = Ch_1_Loc; + if (Ch_2_Loc != Ch_2_Par_Val) + /* then, executed */ + return (Ident_1); + else /* not executed */ + { + Ch_1_Glob = Ch_1_Loc; + return (Ident_2); + } +} /* Func_1 */ + + +Boolean Func_2 (Str_1_Par_Ref, Str_2_Par_Ref) +/*************************************************/ + /* executed once */ + /* Str_1_Par_Ref == "DHRYSTONE PROGRAM, 1'ST STRING" */ + /* Str_2_Par_Ref == "DHRYSTONE PROGRAM, 2'ND STRING" */ + +Str_30 Str_1_Par_Ref; +Str_30 Str_2_Par_Ref; +{ + REG One_Thirty Int_Loc; + Capital_Letter Ch_Loc; + + Int_Loc = 2; + while (Int_Loc <= 2) /* loop body executed once */ + if (Func_1 (Str_1_Par_Ref[Int_Loc], + Str_2_Par_Ref[Int_Loc+1]) == Ident_1) + /* then, executed */ + { + Ch_Loc = 'A'; + Int_Loc += 1; + } /* if, while */ + if (Ch_Loc >= 'W' && Ch_Loc < 'Z') + /* then, not executed */ + Int_Loc = 7; + if (Ch_Loc == 'R') + /* then, not executed */ + return (true); + else /* executed */ + { + if (strcmp (Str_1_Par_Ref, Str_2_Par_Ref) > 0) + /* then, not executed */ + { + Int_Loc += 7; + Int_Glob = Int_Loc; + return (true); + } + else /* executed */ + return (false); + } /* if Ch_Loc */ +} /* Func_2 */ + + +Boolean Func_3 (Enum_Par_Val) +/***************************/ + /* executed once */ + /* Enum_Par_Val == Ident_3 */ +Enumeration Enum_Par_Val; +{ + Enumeration Enum_Loc; + + Enum_Loc = Enum_Par_Val; + if (Enum_Loc == Ident_3) + /* then, executed */ + return (true); + else /* not executed */ + return (false); +} /* Func_3 */ + diff --git a/sdk/software/examples/fireye/A0/A0.c b/sdk/software/examples/fireye/A0/A0.c new file mode 100644 index 0000000..09f6654 --- /dev/null +++ b/sdk/software/examples/fireye/A0/A0.c @@ -0,0 +1,35 @@ +//BSP板级支持包所需全局变量 +unsigned long UART_BASE = 0xbfe001e0; //UART16550的虚地址 +unsigned long CONFREG_UART_BASE = 0xbfafff10; //CONFREG模拟UART的虚地址 +unsigned long CONFREG_TIMER_BASE = 0xbfafe000; //CONFREG计数器的虚地址 +unsigned long CONFREG_CLOCKS_PER_SEC = 100000000L; //CONFREG时钟频率 +unsigned long CORE_CLOCKS_PER_SEC = 33000000L; //处理器核时钟频率 + +int A0_n = 10000; +int A0_k = 20; +int data[20] = {207, 47, 368, 668, 655, 560, 8, 820, 11, 723, 396, 310, 268, 572, 45, 84, 229, 5, 92, 475}; +#define LOOP 1 + +#include + +#define KN 10000 + +int pos[KN] = {1}; + +int A0_max(int a, int b) { return a > b ? a : b; } + +int main() { + pos[0] = 0; + + int ans = 0; + for(int i = 0; i < A0_k; i++) { + int x = data[i]; + for(int j = x; j <= A0_n; j += x) pos[j] ^= 1; + int tmp = 0; + for(int j = 1; j <= A0_n; j++) tmp += pos[j]; + ans = A0_max(ans, tmp); + } + + printf("%d\n", ans); + return (ans == 3367) ? 0 : 1; +} diff --git a/sdk/software/examples/fireye/A0/Makefile b/sdk/software/examples/fireye/A0/Makefile new file mode 100644 index 0000000..5be849f --- /dev/null +++ b/sdk/software/examples/fireye/A0/Makefile @@ -0,0 +1,14 @@ +TARGET = fireye_A0 + +CFLAGS += -O3 -g + +#根据SIMU宏选择串口波特率,0:FPGA上板;1:仿真 +CFLAGS += -DSIMU=0 + +C_SRCS := $(wildcard ./*.c ) + +OBJDIR = obj +COMMON_DIR = ../../../bsp +GCC_DIR=../../../../toolchains/loongson-gnu-toolchain-8.3-x86_64-loongarch32r-linux-gnusf-v2.0 +PICOLIBC_DIR=../../../../toolchains/picolibc +include ../../../bsp/common.mk diff --git a/sdk/software/examples/fireye/B2/B2.c b/sdk/software/examples/fireye/B2/B2.c new file mode 100644 index 0000000..76e95f9 --- /dev/null +++ b/sdk/software/examples/fireye/B2/B2.c @@ -0,0 +1,61 @@ +//BSP板级支持包所需全局变量 +unsigned long UART_BASE = 0xbfe001e0; //UART16550的虚地址 +unsigned long CONFREG_UART_BASE = 0xbfafff10; //CONFREG模拟UART的虚地址 +unsigned long CONFREG_TIMER_BASE = 0xbfafe000; //CONFREG计数器的虚地址 +unsigned long CONFREG_CLOCKS_PER_SEC = 100000000L; //CONFREG时钟频率 +unsigned long CORE_CLOCKS_PER_SEC = 33000000L; //处理器核时钟频率 + +int B2_n = 100; +int L[100] = {48, 47, 40, 40, 36, 31, 25, 25, 25, 24, 14, 13, 13, 10, 10, 10, 10, 10, 10, 8, 5, 5, 5, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 21, 21, 21, 21, 21, 23, 23, 23, 23, 26, 29, 29, 32, 32, 32, 32, 33, 33, 33, 33, 38, 38, 38, 38, 38, 38, 38, 39, 40, 40, 40, 42, 43, 48}; +int R[100] = {48, 48, 53, 53, 53, 54, 55, 57, 59, 66, 66, 66, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 96, 96, 96, 96, 96, 96, 96, 96, 95, 95, 95, 95, 94, 94, 93, 93, 93, 92, 92, 89, 89, 83, 80, 79, 78, 77, 77, 76, 76, 71, 71, 71, 71, 70, 70, 69, 69, 69, 68, 57, 51, 48}; + +#define LOOP 2 + +#include + +#define KN 100 + +int log_2(int x) { int ans = 0; while(x >>= 1) ans++; return ans; } +int B2_max(int a, int b) { return a > b ? a : b; } +int B2_min(int a, int b) { return a < b ? a : b; } + +int query(int d[][KN], int l, int r, int maxx) { + int t = log_2(r - l + 1); + if (maxx) return B2_max(d[t][l], d[t][r - (1 << t) + 1]); + return B2_min(d[t][l], d[t][r - (1 << t) + 1]); +} + +void init(int d[][KN], int a[], int len, int maxx) { + for (int i = 0; i < len; i++) d[0][i] = a[i]; + int t = 1; + for (int i = 1; t <= len; i++) { + for (int j = 0; j + t < len; j++) + if (maxx)d[i][j] = B2_max(d[i - 1][j], d[i - 1][j + t]); + else d[i][j] = B2_min(d[i - 1][j], d[i - 1][j + t]); + t <<= 1; + } +} + +int main() { + int dl[20][KN], dr[20][KN]; + + init(dl, L, B2_n, 1); + init(dr, R, B2_n, 0); + + int ans; + for (int var = 0; var < LOOP; var++) { + ans = 1; + for (int i = 1; i <= B2_n; i++) { + int l = ans, r = B2_n - i + 1; + while (l <= r) { + int mid = l + r >> 1; + if (query(dr, i - 1, i + mid - 2, 0) - query(dl, i - 1, i + mid - 2, 1) + 1 >= mid) { + ans = B2_max(ans, mid); l = mid + 1; + } else r = mid - 1; + } + } + } + + printf("%d\n", ans); + return (ans == 64) ? 0 : 1; +} diff --git a/sdk/software/examples/fireye/B2/Makefile b/sdk/software/examples/fireye/B2/Makefile new file mode 100644 index 0000000..7993184 --- /dev/null +++ b/sdk/software/examples/fireye/B2/Makefile @@ -0,0 +1,14 @@ +TARGET = fireye_B2 + +CFLAGS += -O3 -g + +#根据SIMU宏选择串口波特率,0:FPGA上板;1:仿真 +CFLAGS += -DSIMU=0 + +C_SRCS := $(wildcard ./*.c ) + +OBJDIR = obj +COMMON_DIR = ../../../bsp +GCC_DIR=../../../../toolchains/loongson-gnu-toolchain-8.3-x86_64-loongarch32r-linux-gnusf-v2.0 +PICOLIBC_DIR=../../../../toolchains/picolibc +include ../../../bsp/common.mk diff --git a/sdk/software/examples/fireye/C0/C0.c b/sdk/software/examples/fireye/C0/C0.c new file mode 100644 index 0000000..fd1c1c0 --- /dev/null +++ b/sdk/software/examples/fireye/C0/C0.c @@ -0,0 +1,74 @@ +//BSP板级支持包所需全局变量 +unsigned long UART_BASE = 0xbfe001e0; //UART16550的虚地址 +unsigned long CONFREG_UART_BASE = 0xbfafff10; //CONFREG模拟UART的虚地址 +unsigned long CONFREG_TIMER_BASE = 0xbfafe000; //CONFREG计数器的虚地址 +unsigned long CONFREG_CLOCKS_PER_SEC = 100000000L; //CONFREG时钟频率 +unsigned long CORE_CLOCKS_PER_SEC = 33000000L; //处理器核时钟频率 + +int C0_n = 2, A = 50, C0_m = 2, B = 50; +char C0_data0[50][3] = {"of", "to", "in", "is", "it", "on", "be", "as", "at", "by", "he", "or", "an", "we", "up", "so", "if", "do", "no", "me", "my", "go", "er", "us", "am", "oh", "de", "mm", "et", "al", "la", "ah", "ha", "eh", "ad", "ya", "en", "re", "ye", "ex", "yo", "ma", "na", "ta", "ed", "sh", "ho", "um", "em", "un"}; +char C0_data1[50][3] = {"lo", "wo", "hi", "li", "ti", "ne", "ba", "pa", "si", "id", "mi", "mo", "fe", "el", "ox", "ab", "ar", "es", "ow", "pe", "bo", "oi", "op", "fa", "uh", "bi", "pi", "mu", "hm", "ay", "xi", "ki", "nu", "os", "aa", "ai", "ag", "ae", "ut", "aw", "oy", "ka", "ax", "od", "qi", "om", "jo", "za", "ef", "oe"}; + +#define LOOP 2 + +#include + +#define N 100 + +int mpN[6][6], mpM[6][6]; +int ans; + +struct Trie { + int ch[N][26]; + int tot; +} t[2] = {{{1}, 0}, {{1}, 0}}; + +void insert(struct Trie *t, char *s) { + int x = 0; + for (int i = 0; s[i] != '\0'; i++) { + if (!t->ch[x][s[i] - 'a']) + t->ch[x][s[i] - 'a'] = ++t->tot; + x = t->ch[x][s[i] - 'a']; + } +} + +void dfs(int x, int y) { + if (x == C0_n + 1) { + ++ans; + return; + } + for (int i = 0; i < 26; i++) { + int lastN = mpN[x - 1][y], lastM = mpM[x][y - 1]; + int nx = t[0].ch[lastN][i], ny = t[1].ch[lastM][i]; + if (!(nx && ny)) continue; + mpN[x][y] = nx; + mpM[x][y] = ny; + + nx = x, ny = y + 1; + if (ny > C0_m) ++nx, ny = 1; + dfs(nx, ny); + } +} + +void run() { + for (int i = 0; i < A; i++) { + insert(&t[0], C0_data0[i]); + } + for (int i = 0; i < B; i++) { + insert(&t[1], C0_data1[i]); + } + for (int i = 0; i < LOOP; i++) { + ans = 0; + dfs(1, 1); + } +} + +int main() { + t[0].ch[0][0] = 0; + t[1].ch[0][0] = 0; + + run(); + printf("%d\n", ans); + + return (ans == 62) ? 0 : 1; +} diff --git a/sdk/software/examples/fireye/C0/Makefile b/sdk/software/examples/fireye/C0/Makefile new file mode 100644 index 0000000..1cbbece --- /dev/null +++ b/sdk/software/examples/fireye/C0/Makefile @@ -0,0 +1,14 @@ +TARGET = fireye_C0 + +CFLAGS += -O3 -g + +#根据SIMU宏选择串口波特率,0:FPGA上板;1:仿真 +CFLAGS += -DSIMU=0 + +C_SRCS := $(wildcard ./*.c ) + +OBJDIR = obj +COMMON_DIR = ../../../bsp +GCC_DIR=../../../../toolchains/loongson-gnu-toolchain-8.3-x86_64-loongarch32r-linux-gnusf-v2.0 +PICOLIBC_DIR=../../../../toolchains/picolibc +include ../../../bsp/common.mk diff --git a/sdk/software/examples/fireye/D1/D1.c b/sdk/software/examples/fireye/D1/D1.c new file mode 100644 index 0000000..103393a --- /dev/null +++ b/sdk/software/examples/fireye/D1/D1.c @@ -0,0 +1,76 @@ +//BSP板级支持包所需全局变量 +unsigned long UART_BASE = 0xbfe001e0; //UART16550的虚地址 +unsigned long CONFREG_UART_BASE = 0xbfafff10; //CONFREG模拟UART的虚地址 +unsigned long CONFREG_TIMER_BASE = 0xbfafe000; //CONFREG计数器的虚地址 +unsigned long CONFREG_CLOCKS_PER_SEC = 100000000L; //CONFREG时钟频率 +unsigned long CORE_CLOCKS_PER_SEC = 33000000L; //处理器核时钟频率 + +int x = 1000, y = 1000, D1_n = 492; +int D1_data0[492] = {595, 982, 328, 543, 646, 541, 484, 344, 862, 393, 378, 997, 699, 264, 128, 565, 582, 136, 768, 872, 967, 769, 979, 439, 892, 174, 779, 339, 520, 175, 931, 606, 146, 430, 661, 877, 950, 103, 563, 903, 681, 921, 924, 186, 20, 591, 953, 962, 253, 882, 141, 413, 845, 337, 465, 735, 659, 750, 821, 853, 100, 521, 16, 740, 580, 468, 562, 206, 476, 682, 68, 634, 126, 895, 947, 696, 246, 511, 38, 356, 319, 291, 519, 367, 164, 279, 330, 560, 137, 350, 564, 51, 332, 256, 657, 455, 459, 242, 537, 23, 526, 714, 10, 412, 630, 287, 410, 840, 987, 99, 98, 311, 235, 198, 588, 977, 282, 6, 841, 719, 598, 259, 207, 255, 720, 664, 766, 501, 671, 323, 937, 949, 392, 14, 739, 217, 228, 592, 957, 556, 406, 376, 94, 518, 669, 315, 223, 22, 483, 625, 780, 990, 748, 172, 33, 884, 341, 972, 426, 831, 529, 724, 787, 241, 628, 744, 461, 12, 763, 850, 973, 247, 403, 195, 790, 290, 856, 764, 331, 796, 69, 677, 754, 102, 355, 804, 738, 46, 920, 566, 795, 989, 803, 514, 742, 364, 125, 629, 889, 570, 776, 161, 24, 885, 601, 948, 822, 761, 805, 495, 326, 871, 911, 952, 651, 153, 858, 506, 913, 919, 799, 236, 737, 559, 249, 965, 729, 208, 202, 615, 833, 417, 340, 440, 834, 257, 741, 700, 122, 158, 452, 116, 215, 755, 851, 283, 276, 618, 36, 819, 133, 600, 645, 148, 583, 983, 115, 929, 313, 63, 405, 181, 534, 785, 767, 945, 351, 303, 797, 415, 930, 204, 400, 467, 727, 690, 854, 268, 789, 728, 602, 307, 976, 360, 444, 552, 144, 41, 384, 706, 905, 899, 828, 510, 694, 245, 62, 670, 425, 597, 394, 551, 607, 273, 117, 42, 839, 500, 686, 879, 986, 423, 486, 532, 745, 294, 65, 544, 916, 286, 284, 120, 383, 170, 179, 868, 818, 90, 616, 936, 823, 807, 568, 233, 447, 557, 722, 723, 297, 448, 656, 642, 266, 433, 808, 830, 280, 361, 185, 708, 293, 545, 225, 956, 567, 229, 917, 398, 673, 718, 281, 586, 60, 5, 352, 270, 149, 594, 775, 676, 458, 436, 2, 528, 451, 244, 975, 366, 162, 93, 298, 274, 810, 852, 37, 131, 826, 631, 349, 701, 784, 915, 89, 34, 814, 512, 372, 497, 316, 912, 209, 614, 231, 189, 984, 132, 407, 946, 308, 301, 166, 83, 58, 357, 914, 427, 44, 715, 434, 968, 887, 7, 505, 396, 214, 420, 674, 620, 477, 792, 760, 925, 961, 666, 991, 944, 637, 542, 698, 442, 865, 110, 730, 933, 875, 498, 783, 234, 765, 399, 88, 704, 535, 707, 18, 992, 445, 716, 310, 891, 32, 277, 824, 938, 751, 91, 391, 675, 385, 82, 842, 70, 324, 612, 558, 112, 581, 359, 752, 999, 424, 832, 782, 299, 288, 746, 438, 599, 414, 487, 201, 464}; +int D1_data1[492] = {29, 951, 39, 276, 380, 861, 357, 324, 624, 363, 758, 792, 233, 752, 950, 894, 215, 23, 525, 414, 933, 547, 364, 155, 256, 953, 749, 833, 344, 792, 614, 633, 325, 744, 872, 239, 317, 77, 29, 20, 545, 601, 168, 369, 124, 760, 727, 515, 49, 7, 292, 631, 384, 262, 665, 430, 403, 304, 458, 541, 314, 998, 324, 578, 27, 607, 245, 38, 851, 874, 478, 900, 370, 175, 514, 13, 845, 717, 67, 723, 901, 828, 936, 891, 72, 952, 762, 536, 985, 488, 229, 81, 909, 613, 840, 66, 901, 79, 813, 59, 212, 502, 985, 317, 112, 161, 941, 880, 150, 599, 730, 378, 847, 367, 901, 155, 982, 340, 97, 957, 78, 138, 359, 29, 950, 578, 626, 548, 80, 703, 674, 80, 869, 941, 324, 893, 76, 263, 836, 365, 453, 270, 507, 530, 865, 982, 493, 868, 148, 869, 675, 470, 440, 512, 797, 929, 897, 224, 619, 666, 251, 485, 707, 680, 281, 990, 435, 675, 189, 463, 743, 489, 662, 223, 155, 25, 476, 862, 870, 284, 445, 191, 297, 181, 900, 288, 249, 371, 533, 929, 159, 30, 89, 986, 33, 547, 178, 949, 964, 130, 700, 840, 124, 242, 376, 879, 746, 295, 450, 784, 844, 753, 38, 434, 403, 439, 598, 713, 480, 589, 742, 234, 650, 922, 3, 771, 16, 498, 371, 956, 747, 848, 30, 769, 483, 810, 683, 600, 981, 168, 127, 325, 324, 255, 446, 33, 281, 786, 896, 383, 387, 823, 302, 314, 437, 102, 629, 272, 478, 419, 375, 549, 425, 27, 410, 532, 44, 988, 198, 187, 504, 37, 837, 257, 338, 660, 124, 978, 813, 52, 521, 329, 388, 855, 729, 117, 314, 769, 127, 191, 292, 21, 895, 37, 718, 250, 514, 779, 326, 577, 306, 757, 34, 363, 786, 809, 153, 70, 714, 610, 575, 213, 611, 20, 958, 615, 985, 251, 181, 7, 569, 307, 91, 996, 93, 105, 143, 944, 864, 546, 444, 453, 318, 514, 383, 546, 81, 128, 780, 35, 521, 714, 288, 14, 622, 621, 701, 445, 187, 246, 593, 674, 331, 38, 120, 898, 366, 429, 291, 221, 553, 59, 326, 558, 565, 393, 991, 549, 232, 80, 935, 330, 491, 632, 478, 58, 396, 183, 205, 769, 236, 537, 92, 516, 379, 90, 796, 248, 418, 230, 368, 666, 608, 993, 219, 700, 456, 294, 917, 482, 613, 662, 390, 2, 947, 11, 81, 607, 898, 855, 18, 857, 310, 811, 666, 940, 359, 199, 148, 476, 315, 890, 310, 968, 979, 174, 895, 632, 597, 759, 255, 1, 133, 763, 788, 136, 256, 335, 325, 766, 901, 280, 254, 688, 731, 793, 996, 288, 80, 80, 842, 584, 951, 600, 818, 323, 303, 303, 318, 807, 47, 864, 63, 140, 450, 231, 905, 200, 247, 725, 4, 714, 122, 298, 60, 547, 433, 328, 666, 606, 143, 643, 689, 716, 425, 737, 594, 255, 243, 931, 537, 358}; +#define LOOP 2 + +#include +#include + +#define MAXN 10000 + +int in[MAXN] = {1}, out[MAXN] = {1}; +int mn[MAXN] = {1}, mx [MAXN] = {1}; + +int D1_max(int a, int b) { return a > b ? a : b; } +int D1_min(int a, int b) { return a < b ? a : b; } + +int main() { + int ans; + + for (int l = 0; l < LOOP; l++) { + memset(mn, -1, (D1_max(x, y) + 1) * sizeof(int)); + memset(mx, -1, (D1_max(x, y) + 1) * sizeof(int)); + memset(in, 0, (D1_max(x, y) + 1) * sizeof(int)); + memset(out, 0, (D1_max(x, y) + 1) * sizeof(int)); + + int a, b; + for (int i = 0; i < D1_n; i++) { + a = D1_data0[i]; + b = D1_data1[i]; + if (mn[a] == -1) + mn[a] = b; + else + mn[a] = D1_min(mn[a], b); + mx[a] = D1_max(mx[a], b); + } + + int reduce = 0; + int down = 0; + int sum = 0; + + for (int i = 0; i < y + 1; i++) { + if (mx[i] != -1){ + in[mx[i]]++; + + out[mn[i]]++; + sum += mn[i]; + down++; + } + } + + ans = 0x7fffffff; + int up = 0, upsum = 0; + for (int p = y + 1; p >= 0; p--){ + if (in[p] > 0){ + up += in[p]; + upsum += in[p] * p; + } + if (out[p] > 0){ + down -= out[p]; + sum -= out[p] * p; + } + int df = 2 * ((upsum - up * p) + (down * p - sum)); + ans = D1_min(ans, df); + } + } + + printf("%d\n", ans + x - 1); + return (ans + x - 1 == 253649) ? 0 : 1; +} diff --git a/sdk/software/examples/fireye/D1/Makefile b/sdk/software/examples/fireye/D1/Makefile new file mode 100644 index 0000000..41a7f6c --- /dev/null +++ b/sdk/software/examples/fireye/D1/Makefile @@ -0,0 +1,14 @@ +TARGET = fireye_D1 + +CFLAGS += -O3 -g + +#根据SIMU宏选择串口波特率,0:FPGA上板;1:仿真 +CFLAGS += -DSIMU=0 + +C_SRCS := $(wildcard ./*.c ) + +OBJDIR = obj +COMMON_DIR = ../../../bsp +GCC_DIR=../../../../toolchains/loongson-gnu-toolchain-8.3-x86_64-loongarch32r-linux-gnusf-v2.0 +PICOLIBC_DIR=../../../../toolchains/picolibc +include ../../../bsp/common.mk diff --git a/sdk/software/examples/fireye/I2/I2.c b/sdk/software/examples/fireye/I2/I2.c new file mode 100644 index 0000000..8a5838c --- /dev/null +++ b/sdk/software/examples/fireye/I2/I2.c @@ -0,0 +1,122 @@ +//BSP板级支持包所需全局变量 +unsigned long UART_BASE = 0xbfe001e0; //UART16550的虚地址 +unsigned long CONFREG_UART_BASE = 0xbfafff10; //CONFREG模拟UART的虚地址 +unsigned long CONFREG_TIMER_BASE = 0xbfafe000; //CONFREG计数器的虚地址 +unsigned long CONFREG_CLOCKS_PER_SEC = 100000000L; //CONFREG时钟频率 +unsigned long CORE_CLOCKS_PER_SEC = 33000000L; //处理器核时钟频率 + +int I2_m = 19, I2_n = 32; +char s[32][21] = {" ###################", " #.................#", " #.###############.#", " #.###############.#", " #.##..............#", " #.##..............#", " #.##..............#", " #.##..............#", " #.##..............#", " #.##..............#", " #.##..............#", " #.##..............#", " #.##..............#", " #.##..............#", " #.##..............#", " #.##..............#", " #.##..............#", " #.##..............#", " #.##..............#", " #.##..............#", " #.##..............#", " #.##..............#", " #.##..............#", " #.##..............#", " #.##..............#", " #.##..............#", " #.##..............#", " #.##..............#", " #.###############.#", " #.###############.#", " #.................#", " ###################"}; +int vis[32][19] = {1}; + +#define LOOP 10 + +#include +#include + +int dd[8][2] = {{-1, 0}, {-1, -1}, {-1, 1}, {0, 1}, {0, -1}, {1, 0}, {1, -1}, {1, 1}}; +int abc[3][15] = {{1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1}, + {1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1}, + {1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1} +}; +int add1[20], add2[20]; + +int check(int x, int y, int I2_n, int I2_m, char cur) { + for (int i = x; i < x + I2_n; i++) + for (int j = y; j < y + I2_m; j++) + if (s[i][j] != cur || vis[i][j])return 1; + return 0; +} + +int find(int stx, int sty, int x, int y, int cur) { + add1[0] = 0, add1[1] = x, add1[2] = x + y; + for (int i = 3; i < 15; i++)add1[i] = add1[i % 3]; + add2[0] = 0, add2[3] = x, add2[6] = x + y, add2[9] = 2 * x + y, add2[12] = 2 * x + 2 * y; + for (int i = 0; i < 5; i++) + for (int j = 1; j < 3; j++)add2[3 * i + j] = add2[3 * i + j - 1]; + + for (int i = 0; i < 15; i++) { + int addn = 0, addm = 0; + if (i / 3 % 2 == 0)addn = x; else addn = y; + if (i % 3 % 2 == 0)addm = x; else addm = y; + + char findchar = '.'; + if (abc[cur][i])findchar = '#'; + if (check(stx + add2[i], sty + add1[i], addn, addm, findchar)) { + return 0; + } + } + return 1; +} + +int main() { + + int ansa = 0, ansb = 0, ansc = 0; + + for (int l = 0; l < LOOP; l++) { + + ansa = ansb = ansc = 0; + memset(vis, 0, sizeof(vis)); + + for (int i = 2; i <= I2_n - 1; i++) + for (int j = 2; j <= I2_m - 1; j++) + if (s[i][j] == '#') { + int gg = 0; + for (int k = 0; k < 8; k++) + if (s[i + dd[k][0]][j + dd[k][1]] == '#') { + gg++; + break; + } + if (!gg)s[i][j] = '.'; + } + + for (int i = 2; i <= I2_n - 1; i++) + for (int j = 2; j <= I2_m - 2; j++) + if (s[i][j] == '.' && s[i][j + 1] == '#' && !vis[i][j]) { + int a = 1, b = 1; + for (int k = j + 2; k <= I2_m - 2; k++) + if (s[i][k] == '#')a++; + else break; + for (int k = i + 1; k <= I2_n - 2; k++) + if (s[k][j + 1] == '#')b++; + else break; + + int x = 2 * a - b, y = 2 * b - 3 * a; + if (x <= 0 || y <= 0)continue; + + int gg = 0; + for (int k = j; k <= j + a + 1; k++) + if (s[i - 1][k] == '#' || s[i + b][k] == '#') { + gg++; + break; + } + if (gg)continue; + for (int k = i; k <= i + b - 1; k++) + if (s[k][j] == '#' || s[k][j + a + 1] == '#') { + gg++; + break; + } + if (gg)continue; + + int cur = 0; + if (s[i][j + x + 1] == '#' && s[i + x + y][j + x + 1] == '#' && s[i + 2 * (x + y)][j + x + 1] == '.')cur = 1; + if (s[i][j + x + 1] == '#' && s[i + x + y][j + x + 1] == '#' && s[i + 2 * (x + y)][j + x + 1] == '#')cur = 2; + if (s[i][j + x + 1] == '#' && s[i + x + y][j + x + 1] == '.' && s[i + 2 * (x + y)][j + x + 1] == '#')cur = 3; + + if (!cur)continue; + + if (find(i, j + 1, x, y, cur - 1)) { + for (int visx = i - 1; visx <= i + b; visx++) + for (int visy = j; visy <= j + a + 1; visy++) + vis[visx][visy]++; + if (cur == 1)ansa++; + else if (cur == 2)ansb++; + else ansc++; + } + + } + } + + printf("%d %d %d\n", ansa, ansb, ansc); + return (ansa == 0 && ansb == 0 && ansc == 1) ? 0 : 1; +} diff --git a/sdk/software/examples/fireye/I2/Makefile b/sdk/software/examples/fireye/I2/Makefile new file mode 100644 index 0000000..ab031e0 --- /dev/null +++ b/sdk/software/examples/fireye/I2/Makefile @@ -0,0 +1,14 @@ +TARGET = fireye_I2 + +CFLAGS += -O3 -g + +C_SRCS := $(wildcard ./*.c ) + +#根据SIMU宏选择串口波特率,0:FPGA上板;1:仿真 +CFLAGS += -DSIMU=0 + +OBJDIR = obj +COMMON_DIR = ../../../bsp +GCC_DIR=../../../../toolchains/loongson-gnu-toolchain-8.3-x86_64-loongarch32r-linux-gnusf-v2.0 +PICOLIBC_DIR=../../../../toolchains/picolibc +include ../../../bsp/common.mk diff --git a/sdk/software/examples/hello_world/Makefile b/sdk/software/examples/hello_world/Makefile new file mode 100644 index 0000000..89c3964 --- /dev/null +++ b/sdk/software/examples/hello_world/Makefile @@ -0,0 +1,11 @@ +TARGET = hello_world + +CFLAGS += -O3 -g + +C_SRCS := $(wildcard ./*.c ) + +OBJDIR = obj +COMMON_DIR = ../../bsp +GCC_DIR=../../../toolchains/loongson-gnu-toolchain-8.3-x86_64-loongarch32r-linux-gnusf-v2.0 +PICOLIBC_DIR=../../../toolchains/picolibc +include ../../bsp/common.mk diff --git a/sdk/software/examples/hello_world/main.c b/sdk/software/examples/hello_world/main.c new file mode 100644 index 0000000..ac2afec --- /dev/null +++ b/sdk/software/examples/hello_world/main.c @@ -0,0 +1,36 @@ +#include +#include +#include +#include + +//BSP板级支持包所需全局变量 +unsigned long UART_BASE = 0xbf000000; //UART16550的虚地址 +unsigned long CONFREG_TIMER_BASE = 0xbf20f100; //CONFREG计数器的虚地址 +unsigned long CONFREG_CLOCKS_PER_SEC = 50000000L; //CONFREG时钟频率 +unsigned long CORE_CLOCKS_PER_SEC = 33000000L; //处理器核时钟频率 + +#define CPSIZE 12 +char src[CPSIZE] = "this is src"; +char dst[CPSIZE] = "this is dst"; + +int main(int argc, char** argv) +{ + int a = 100; + float b = 3.2564; + double c = 5478.47563; + char *str; + + printf("Hello Loongarch32r!\n"); + printf("a = %d\n", a); + printf("b = %f\n", b); + printf("c = %lf\n", c); + + str = (char *)malloc(6); + strcpy(str, "ABCDE"); + printf("String = %s, Address = 0x%x\n", str, str); + + memcpy(dst, src, CPSIZE); + printf("%s\n", dst); + + return 0; +} \ No newline at end of file diff --git a/sdk/software/examples/int_test/Makefile b/sdk/software/examples/int_test/Makefile new file mode 100644 index 0000000..64dcd00 --- /dev/null +++ b/sdk/software/examples/int_test/Makefile @@ -0,0 +1,11 @@ +TARGET = int_test + +CFLAGS += -O3 -g + +C_SRCS := $(wildcard ./*.c ) + +OBJDIR = obj +COMMON_DIR = ../../bsp +GCC_DIR=../../../toolchains/loongson-gnu-toolchain-8.3-x86_64-loongarch32r-linux-gnusf-v2.0 +PICOLIBC_DIR=../../../toolchains/picolibc +include ../../bsp/common.mk diff --git a/sdk/software/examples/int_test/main.c b/sdk/software/examples/int_test/main.c new file mode 100644 index 0000000..54095cb --- /dev/null +++ b/sdk/software/examples/int_test/main.c @@ -0,0 +1,96 @@ +#include +#include +#include +#include + +#include "common_func.h" + +//BSP板级支持包所需全局变量 +unsigned long UART_BASE = 0xbf000000; //UART16550的虚地址 +unsigned long CONFREG_TIMER_BASE = 0xbf20f100; //CONFREG计数器的虚地址 +unsigned long CONFREG_CLOCKS_PER_SEC = 50000000L; //CONFREG时钟频率 +unsigned long CORE_CLOCKS_PER_SEC = 33000000L; //处理器核时钟频率 + + +int Ball_x = 400; +int Ball_y = 100; +int Ball_r = 5; + +int Plane_x = 400; +int Plane_y = 400; +int Plane_l = 100; +int Plane_w = 5; + +int simu_flag; +volatile unsigned char int_flag; + +void Timer_IntrHandler(void); +void Button_IntrHandler(unsigned char button_state); + +int main(int argc, char** argv) +{ + int_flag = 0; + DVI_Draw_Rect(Plane_x,Plane_y,Plane_l,Plane_w); + DVI_Draw_SQU(Ball_x,Ball_y,Ball_r); + + simu_flag = RegRead(0xbf20f500); + RegWrite(0xbf20f004,0x0f);//edge + RegWrite(0xbf20f008,0x1f);//pol + RegWrite(0xbf20f00c,0x1f);//clr + RegWrite(0xbf20f000,0x1f);//en + if(simu_flag){ + RegWrite(0xbf20f104,5000);//timercmp 0.1ms + } + else{ + RegWrite(0xbf20f104,50000000);//timercmp 1s + } + RegWrite(0xbf20f108,0x1);//timeren + + while(int_flag == 0) + { + + } + + return 0; +} + +void HWI0_IntrHandler(void) +{ + unsigned int int_state; + int_state = RegRead(0xbf20f014); + + if((int_state & 0x10) == 0x10){ + Timer_IntrHandler(); + } + else if(int_state & 0xf){ + Button_IntrHandler(int_state & 0xf); + } +} + +void Timer_IntrHandler(void) +{ + RegWrite(0xbf20f108,0);//timeren + RegWrite(0xbf20f108,1);//timeren + printf("timer int\n"); +} + +void Button_IntrHandler(unsigned char button_state) +{ + if((button_state & 0b1000) == 0b1000){ + printf("button4 int\n"); + int_flag = 1; + RegWrite(0xbf20f00c,0x8);//clr + } + else if((button_state & 0b0100) == 0b0100){ + printf("button3 int\n"); + RegWrite(0xbf20f00c,0x4);//clr + } + else if((button_state & 0b0010) == 0b0010){ + printf("button2 int\n"); + RegWrite(0xbf20f00c,0x2);//clr + } + else if((button_state & 0b0001) == 0b0001){ + printf("button1 int\n"); + RegWrite(0xbf20f00c,0x1);//clr + } +} \ No newline at end of file diff --git a/sdk/software/examples/lenet/AccelConvFuncs.c b/sdk/software/examples/lenet/AccelConvFuncs.c new file mode 100644 index 0000000..89e9d63 --- /dev/null +++ b/sdk/software/examples/lenet/AccelConvFuncs.c @@ -0,0 +1,179 @@ +#include "AccelConvFuncs.h" + +void accel_conv_func(int8_t* d_i, int8_t* weight, int32_t* bias, int32_t* d_o, int8_t di_type, + int height, int width, int padding, int channel, int out_channel, + int kernel_width, int kernel_height, int with_relu) { + accel_conf_t accel_conf; + accel_conf.buf_size = di_type; + accel_conf.weight_size = 0; + accel_conf.padding = padding; + accel_conf.stride = 1; + accel_conf.kernel_height = kernel_height; + accel_conf.kernel_width = kernel_width; + + int size_mul = di_type == 0b10 ? 4 : + di_type == 0b01 ? 2 : 1; + int buf_mul = di_type == 0b10 ? 1 : + di_type == 0b01 ? 2 : 4; + + int del_h = kernel_height - 1; + int del_w = (kernel_width - 1) * size_mul; + + int size_sft = size_mul >> 1; + int buf_sft = buf_mul >> 1; + int width_i = width * size_mul; + int height_o = (height - kernel_height + padding * 2) + 1; + int width_o = ((width - kernel_width + padding * 2) + 1); + + + int h_append = 0; + int res_h = 0; + for (int h = 0; h < height; h += h_append) { + int h_eq_0 = h == 0; + h_append = h_eq_0 ? MAX_BUF_HEIGHT : MAX_BUF_HEIGHT - del_h; + int h_remain = height - h; + int buf_h_end = h_remain <= h_append; + int buf_h; + int begin_h = h_eq_0 ? 0 : h - del_h; + if (buf_h_end) { + if (h_eq_0) buf_h = h_remain; + else buf_h = h_remain + del_h; + } else { + buf_h = MAX_BUF_HEIGHT; + } + accel_conf.buf_height = buf_h - 1; + int res_h_append = (buf_h - kernel_height + (h_eq_0 + buf_h_end) * padding) + 1; + + int w_append = 0; + int res_w = 0; + for (int w = 0; w < width_i; w += w_append) { + int w_eq_0 = w == 0; + w_append = w_eq_0 ? MAX_BUF_WIDTH : MAX_BUF_WIDTH - del_w; + int w_remain = width_i - w; + int buf_w_end = w_remain <= w_append; + int buf_w; + int begin_w = w_eq_0 ? 0 : w - del_w; + if (buf_w_end) { + if (w_eq_0) { + buf_w = w_remain; + } else { + buf_w = (w_remain + del_w); + } + } else { + buf_w = MAX_BUF_WIDTH; + } + int padding_valid = (w_eq_0) | + (buf_w_end << 1) | + (h_eq_0 << 2) | + (buf_h_end << 3); + int buf_offset = width_i - buf_w; + int res_w_append = ((buf_w >> size_sft) - kernel_width + (w_eq_0 + buf_w_end) * padding) + 1; + int res_offset = (width_o - res_w_append) << size_sft; + int res_buf_info = ((res_w_append - 1) << 16) | res_offset; + inst_conf_offset(buf_offset, res_buf_info); + + accel_conf.buf_width = buf_w - 1; + accel_conf.padding_valid = padding_valid; + for (int k = 0; k < channel; k++) { + accel_conf.buf_refresh = 1; + accel_conf.wadd = k != 0; + for (int c = 0; c < out_channel; c += MAX_KERNEL_NUM) { + int valid_kernel_num = c + MAX_KERNEL_NUM > out_channel ? out_channel - c : MAX_KERNEL_NUM; + accel_conf.kernel_num = valid_kernel_num - 1; + inst_conf_buf((uint32_t)&d_i[(k * height + begin_h) * width_i + begin_w], accel_conf.val); + for (int vc = 0; vc < valid_kernel_num; vc++) { + int ca = c + vc; + inst_conf_res_addr(&d_o[(ca * height_o + res_h) * width_o + res_w], vc); + + if (k == 0) { + inst_conf_res_bias(bias[ca], vc); + // for (int m = 0; m < res_h_append; m++) { + // for (int n = 0; n < res_w_append; n++) { + // d_o[(ca * height_o + res_h + m) * width_o + res_w + n] = bias[ca]; + // } + // } + } + } + if (k == channel - 1 && with_relu) { + inst_conv_relu(&weight[(k * out_channel + c) * kernel_height * kernel_width]); + } else { + inst_conv(&weight[(k * out_channel + c) * kernel_height * kernel_width]); + } + accel_conf.buf_refresh = 0; + } + } + res_w += res_w_append; + } + res_h += res_h_append; + } +} + +// height and width must align 2 +void accel_pool_func(int32_t* d_i, int32_t* d_o, int pool_mode, int channel, int height, int width) { + accel_conf_t conf; + conf.buf_refresh = 1; + conf.wadd = 0; + conf.padding_valid = 0; + conf.weight_size = 2; + conf.buf_size = 2; + conf.kernel_width = 2; + conf.kernel_height = 2; + conf.stride = 2; + conf.kernel_num = 0; + conf.padding = 0; + + int max_width_word = MAX_BUF_WIDTH >> 2; + + // for (int i = 0; i < height; i++) { + // for(int j = 0; j < width; j++) { + // printf("%x ", d_i[i * width + j]); + // } + // printf("\n"); + // } + + int width_o = width >> 1; + int height_o = height >> 1; + + for (int c = 0; c < channel; c++) { + int h_append; + int res_h = 0; + for (int h = 0; h < height; h += h_append) { + h_append = height - h < MAX_BUF_HEIGHT ? height - h : MAX_BUF_HEIGHT; + int buf_h = h_append; + conf.buf_height = buf_h - 1; + int res_h_append = buf_h >> 1; + + int w_append; + int res_w = 0; + for (int w = 0; w < width; w += w_append) { + int w_remain = width - w; + w_append = w_remain < max_width_word ? w_remain : max_width_word; + int buf_w = w_append; + conf.buf_width = (buf_w << 2) - 1; + + inst_conf_buf((uint32_t)&d_i[(c * height + h) * width + w], conf.val); + inst_conf_res_addr((uint32_t)&d_o[(c * height_o + res_h) * width_o + res_w], 0); + int buf_offset = (width - buf_w) << 2; + int res_w_append = (buf_w >> 1); + int res_offset = (width_o - res_w_append) << 2; + int res_buf_info = ((res_w_append - 1) << 16) | res_offset; + inst_conf_offset(buf_offset, res_buf_info); + inst_pool(pool_mode); + + res_w += res_w_append; + } + res_h += res_h_append; + } + } +} + +void accel_linear_func(int32_t* d_i, int8_t* weight, int32_t* bias, + int32_t* output, int input_size, int output_size) { + // 线性层的瓶颈在于访存,cpu可以处理计算 + for (int i = 0; i < output_size; i++) { + output[i] = bias[i]; + for (int j = 0; j < input_size; j++) { + output[i] += d_i[j] * weight[i * input_size + j]; + } + } +} \ No newline at end of file diff --git a/sdk/software/examples/lenet/AccelConvFuncs.h b/sdk/software/examples/lenet/AccelConvFuncs.h new file mode 100644 index 0000000..d8ce398 --- /dev/null +++ b/sdk/software/examples/lenet/AccelConvFuncs.h @@ -0,0 +1,14 @@ +#ifndef __ACCEL__CONV__FUNCS__H__ +#define __ACCEL__CONV__FUNCS__H__ +#include "Accelop.h" + +void accel_conv_func(int8_t* d_i, int8_t* weight, int32_t* bias, int32_t* d_o, int8_t di_type, + int height, int width, int padding, int channel, int out_channel, + int kernel_width, int kernel_height, int with_relu); + +void accel_pool_func(int32_t* d_i, int32_t* d_o, int pool_mode, int channel, int height, int width); + +void accel_linear_func(int32_t* d_i, int8_t* weight, int32_t* bias, + int32_t* output, int input_size, int output_size); + +#endif \ No newline at end of file diff --git a/sdk/software/examples/lenet/Accelop.h b/sdk/software/examples/lenet/Accelop.h new file mode 100644 index 0000000..60688b7 --- /dev/null +++ b/sdk/software/examples/lenet/Accelop.h @@ -0,0 +1,154 @@ +#ifndef __ACCEL__OP__H__ +#define __ACCEL__OP__H__ +#include +// #define LACC_OP + +typedef struct { + union { + struct { + uint32_t buf_refresh: 1; + uint32_t wadd: 1; + uint32_t padding_valid: 4; + uint32_t weight_size: 2; + uint32_t buf_size: 2; + uint32_t kernel_width: 3; + uint32_t kernel_height: 3; + uint32_t buf_width: 5; + uint32_t buf_height: 4; + uint32_t stride: 2; + uint32_t kernel_num: 3; + uint32_t padding: 2; + }; + uint32_t val; + }; +}accel_conf_t; + +#define MAX_KERNEL_NUM 3 +#define MAx_KERNEL_WIDTH 3 +#define MAX_KERNEL_HEIGHT 3 +#define MAX_BUF_WIDTH 32 +#define MAX_BUF_HEIGHT 8 + +void inst_conf_buf(uint32_t addr, uint32_t para) { +#ifdef LACC_OP + asm volatile ( + "lacc 0x0, $r0, %[addr], %[para], 0x0\n\t" + ::[addr]"r"(addr), [para]"r"(para) + ); +#else + asm volatile ( + "move $r5, %[addr]\n\t" + "move $r6, %[para]\n\t" + ".word 0xc00018a0\n\t" + ::[addr]"r"(addr),[para]"r"(para) + :"$r5", "$r6" + ); +#endif +} + +void inst_conf_res_addr(uint32_t waddr, uint32_t idx) { +#ifdef LACC_OP + asm volatile ( + "lacc 0x1, $r0, %[addr], %[idx], 0x5\n\t" + ::[addr]"r"(waddr), [idx]"r"(idx) + ); +#else + asm volatile ( + "move $r5, %[addr]\n\t" + "move $r6, %[idx]\n\t" + ".word 0xc04298a0\n\t" + ::[addr]"r"(waddr), [idx]"r"(idx) + :"$r5", "$r6" + ); +#endif +} + +void inst_conf_res_bias(uint32_t bias, uint32_t idx) { +#ifdef LACC_OP + asm volatile ( + "lacc 0x1, $r0, %[bias], %[idx], 0x2\n\t" + ::[bias]"r"(bias), [idx]"r"(idx) + ); +#else + asm volatile ( + "move $r5, %[addr]\n\t" + "move $r6, %[idx]\n\t" + ".word 0xc04118a0\n\t" + ::[addr]"r"(bias), [idx]"r"(idx) + :"$r5", "$r6" + ); +#endif +} + +typedef void (*inst_conv_ptr_t)(uint32_t); + +void inst_conv(uint32_t weight_addr) { +#ifdef LACC_OP + asm volatile ( + "lacc 0x2, $r0, %[addr], $r0, 0x1\n\t" + ::[addr]"r"(weight_addr) + ); +#else + asm volatile ( + "move $r5, %[addr]\n\t" + ".word 0xc08080a0\n\t" + ::[addr]"r"(weight_addr) + : "$r5" + ); +#endif +} + +void inst_conv_relu(uint32_t weight_addr) { +#ifdef LACC_OP + asm volatile ( + "lacc 0x2, $r0, %[addr], $r0, 0x5\n\t" + ::[addr]"r"(weight_addr) + ); +#else + asm volatile ( + "move $r5, %[addr]\n\t" + ".word 0xc08280a0\n\t" + ::[addr]"r"(weight_addr) + : "$r5" + ); +#endif +} + +#define POOL_MODE_MIN 0 +#define POOL_MODE_MAX 1 +#define POOL_MODE_AVG 2 + +void inst_pool(int pool_mode) { +#ifdef LACC_OP + asm volatile ( + "lacc 0x2, $r0, %[pool_mode], $r0, 0x2\n\t" + ::[pool_mode]"r"(pool_mode) + ); +#else + asm volatile ( + "move $r5, %[pool_mode]\n\t" + ".word 0xc08100a0\n\t" + ::[pool_mode]"r"(pool_mode) + :"$r5" + ); +#endif +} + +void inst_conf_offset(uint32_t buf_offset, uint32_t res_offset) { +#ifdef LACC_OP + asm volatile ( + "lacc 0x3, $r0, %[buf_offset], %[res_offset], 0x0\n\t" + ::[buf_offset]"r"(buf_offset), [res_offset]"r"(res_offset) + ); +#else + asm volatile ( + "move $r5, %[buf_offset]\n\t" + "move $r6, %[res_offset]\n\t" + ".word 0xc0c018a0" + ::[buf_offset]"r"(buf_offset),[res_offset]"r"(res_offset) + :"$r5", "$r6" + ); +#endif +} + +#endif \ No newline at end of file diff --git a/sdk/software/examples/lenet/ConvFuncs.c b/sdk/software/examples/lenet/ConvFuncs.c new file mode 100644 index 0000000..8afb0f4 --- /dev/null +++ b/sdk/software/examples/lenet/ConvFuncs.c @@ -0,0 +1,97 @@ +#include "ConvFuncs.h" + +void conv_func(int8_t* d_i, int8_t* weight, int32_t* bias, int32_t* d_o, int8_t di_type, + int height, int width, int padding, int channel, int out_channel, + int kernel_width, int kernel_height) { + // 使用多重循环卷积(BUF_HEIGHT - KERNEL_SIZE + PADDING * 2) / STRIDE + 1 + int16_t* d_16 = (int16_t*)d_i; + int32_t* d_32 = (int32_t*)d_i; + int height_o = (height - kernel_height + padding * 2) + 1; + int width_o = (width - kernel_width + padding * 2) + 1; + for (int c = 0; c < out_channel; c++) { + for (int h = -padding; h < (height - kernel_height + padding) + 1; h++) { + for (int w = -padding; w < (width - kernel_width + padding) + 1; w++) { + int32_t sum = 0; + for(int k = 0; k < channel; k++) { + for (int m = 0; m < kernel_height; m++) { + for (int n = 0; n < kernel_width; n++) { + int h_m = h + m; + int w_n = w + n; + if (h_m >= 0 && h_m < height && w_n >= 0 && w_n < width) { + if(di_type == 0){ + sum += d_i[(k * height + h_m) * width + w_n] * + weight[((c * channel + k) * kernel_height + m) * kernel_width + n]; + } else if (di_type == 1) { + sum += d_16[(k * height + h_m) * width + w_n] * + weight[((c * channel + k) * kernel_height + m) * kernel_width + n]; + } else if (di_type == 2) { + sum += d_32[(k * height + h_m) * width + w_n] * + weight[((c * channel + k) * kernel_height + m) * kernel_width + n]; + } + } + } + } + } + d_o[c * height_o * width_o + (h+padding) * width_o + w + padding] = sum + bias[c]; + } + } + } +} + +void pool_func(int32_t* d_i, int32_t* d_o, int channel, int height, int width) { + for (int c = 0; c < channel; c++) { + for (int h = 0; h < height / 2; h++) { + for (int w = 0; w < width / 2; w++) { + int32_t sum = d_i[(c * height + (h << 1)) * width + (w << 1)] + + d_i[(c * height + (h << 1) + 1) * width + (w << 1)] + + d_i[(c * height + (h << 1)) * width + (w << 1) + 1] + + d_i[(c * height + (h << 1) + 1) * width + (w << 1) + 1]; + if(sum > 0) d_o[(c * height / 2 + h) * (width / 2) + w] = sum >> 2; + else d_o[(c * height / 2 + h) * (width / 2) + w] = 0; + } + } + } +} + +void linear_func( + int32_t* d_i, + int8_t* weight, + int32_t* bias, + int32_t* output, + int input_size, + int output_size) { + + for (int i = 0; i < output_size; i++) { + output[i] = bias[i]; + for (int j = 0; j < input_size; j++) { + output[i] += d_i[j] * weight[i * input_size + j]; + } + } +} + +void relu_int(int32_t *x, int size) { + for (int i = 0; i < size; i++) { + if (x[i] < 0) { + x[i] = 0; + } + } +} + +void softmax(int32_t *x, float *output, int size) { + int32_t max = x[0]; + for (int i = 1; i < size; i++) { + if (x[i] > max) { + max = x[i]; + } + } + + float sum = 0; + for (int i = 0; i < size; i++) { + output[i] = exp((float)(x[i] - max)) ; + sum += output[i]; + } + + for (int i = 0; i < size; i++) { + output[i] /= sum; + } +} \ No newline at end of file diff --git a/sdk/software/examples/lenet/ConvFuncs.h b/sdk/software/examples/lenet/ConvFuncs.h new file mode 100644 index 0000000..84cd58f --- /dev/null +++ b/sdk/software/examples/lenet/ConvFuncs.h @@ -0,0 +1,16 @@ +#ifndef __CONV_FUNCS_H__ +#define __CONV_FUNCS_H__ +#include + +void conv_func(int8_t* d_i, int8_t* weight, int32_t* bias, int32_t* d_o, int8_t di_type, + int height, int width, int padding, int channel, int out_channel, + int kernel_width, int kernel_height); + +void pool_func(int32_t* d_i, int32_t* d_o, int channel, int height, int width); + +void linear_func(int32_t* d_i, int8_t* weight, int32_t* bias, int32_t* output, int input_size, int output_size); + +void relu_int(int32_t *x, int size); + +void softmax(int32_t *x, float *output, int size); +#endif \ No newline at end of file diff --git a/sdk/software/examples/lenet/Makefile b/sdk/software/examples/lenet/Makefile new file mode 100644 index 0000000..db3f5f3 --- /dev/null +++ b/sdk/software/examples/lenet/Makefile @@ -0,0 +1,11 @@ +TARGET = lenet + +CFLAGS += -O3 -g + +C_SRCS := $(wildcard ./*.c ) + +OBJDIR = obj +COMMON_DIR = ../../bsp +GCC_DIR=../../../toolchains/loongson-gnu-toolchain-8.3-x86_64-loongarch32r-linux-gnusf-v2.0 +PICOLIBC_DIR=../../../toolchains/picolibc +include ../../bsp/common.mk diff --git a/sdk/software/examples/lenet/main.c b/sdk/software/examples/lenet/main.c new file mode 100644 index 0000000..7be5437 --- /dev/null +++ b/sdk/software/examples/lenet/main.c @@ -0,0 +1,160 @@ +#include +#include +#include +#include +#include +#include +#include "ConvFuncs.h" +#include "weights.h" +#include "test_image.h" +#include "common_func.h" + + +//BSP板级支持包所需全局变量 +unsigned long UART_BASE = 0xbf000000; //UART16550的虚地址 +unsigned long CONFREG_TIMER_BASE = 0xbf20f100; //CONFREG计数器的虚地址 +unsigned long CONFREG_CLOCKS_PER_SEC = 50000000L; //CONFREG时钟频率 +unsigned long CORE_CLOCKS_PER_SEC = 33000000L; //处理器核时钟频率 + +int start = 0; + + +void InterruptInit(void) +{ + // Enable button and timer Interrupt + RegWrite(0xbf20f004,0x0f);//edge + RegWrite(0xbf20f008,0x1f);//pol + RegWrite(0xbf20f00c,0x1f);//clr + RegWrite(0xbf20f000,0x1f);//en +} + +void HWI0_IntrHandler(void) +{ + unsigned int int_state; + int_state = RegRead(0xbf20f014); + + if(int_state & 0xf){ + Button_IntrHandler(int_state & 0xf); + } +} + +void Button_IntrHandler(unsigned char button_state) +{ + if((button_state & 0b0001) == 0b0001){ + start = 1; + RegWrite(0xbf20f00c,0x1);//clr + } +} + + +int compare(int32_t* dut, int32_t* ref, int size) { + for (int i = 0; i < size; i++) { + if (dut[i] != ref[i]) { + printf("Error at index %d: expected %d, got %d, %x\n", i, ref[i], dut[i], (uint32_t)&dut[i]); + return 1; + } + } + return 0; +} + +void printImage(int8_t* image, int height, int width) { + for (int i = 0; i < height; i++) { + for (int j = 0; j < width; j++) { + printf("%d ", image[i * width + j] != -1); + } + printf("\n"); + } + printf("\n"); +} + +void flush_dcache(int size) { + for (int i = 0; i < size; i++) { + int index = size << 4; + init_dcache_line(index); + } +} + +int simu_flag; + +int main(int argc, char** argv) { + InterruptInit(); + simu_flag = RegRead(0xbf20f500); + + int32_t conv1_out[6][28][28] = { 0 }; + int32_t pool1_out[6][14][14] = { 0 }; + int32_t conv2_out[16][12][12] = { 0 }; + int32_t pool2_out[16][6][6] = { 0 }; + int32_t fc1_out[10] = { 0 }; + int acc = 0; + int begin_clk, end_clk; + + int32_t accel_conv1_out[6][28][28]; + int32_t accel_pool1_out[6][14][14] = { 0 }; + int32_t accel_conv2_out[16][12][12] = { 0 }; + int32_t accel_pool2_out[16][6][6] = { 0 }; + int32_t accel_fc1_out[10] = { 0 }; + + int test_idx = 0; + int test_num = 0; + + printf("image num: %d\n", TEST_IMAGE_SIZE); + + int clk, ret; + while (1) { + if(!simu_flag) delay_ms(200); + if (start | simu_flag) { + start = 0; + printf("start\n"); + int gold_clk = 0; + if (!simu_flag) { + printImage(test_image[test_idx], 28, 28); + + flush_dcache(256); + + gold_clk = clock(); + conv_func(test_image[test_idx], w_conv1, b_conv1, conv1_out, 0, 28, 28, 1, 1, 6, 3, 3); + relu_int(&conv1_out, 6 * 28 * 28); + pool_func(conv1_out, pool1_out, 6, 28, 28); + conv_func(pool1_out, w_conv2, b_conv2, conv2_out, 2, 14, 14, 0, 6, 16, 3, 3); + relu_int(&conv2_out, 16 * 12 * 12); + pool_func(conv2_out, pool2_out, 16, 12, 12); + linear_func(pool2_out, w_fc1, b_fc1, fc1_out, 576, 10); + gold_clk = clock() - gold_clk; + + flush_dcache(256); + + } + + clk = clock(); + accel_conv_func(test_image[test_idx], w_conv1, b_conv1, accel_conv1_out, 0, 28, 28, 1, 1, 6, 3, 3, 1); + accel_pool_func(accel_conv1_out, accel_pool1_out, 2, 6, 28, 28); + accel_conv_func(accel_pool1_out, w_conv2_rev, b_conv2, accel_conv2_out, 2, 14, 14, 0, 6, 16, 3, 3, 1); + accel_pool_func(accel_conv2_out, accel_pool2_out, 2, 16, 12, 12); + accel_linear_func(accel_pool2_out, w_fc1, b_fc1, accel_fc1_out, 576, 10); + clk = clock() - clk; + + int index = 0; + float max = accel_fc1_out[0]; + for (int j = 1; j < 10; j++) { + if (accel_fc1_out[j] > max) { + index = j; + max = accel_fc1_out[j]; + } + } + printf("recognized number: %d\n", index); + if (index == test_target[test_idx]) acc++; + test_num++; + test_idx = (test_idx + 1) % TEST_IMAGE_SIZE; + if (simu_flag) { + printf("Accuracy: %d/%d, clk: %d\n", + acc, test_num, clk); + } else { + printf("Accuracy: %d/%d, gold_clk: %d, clk: %d speedup: %f\n", + acc, test_num, gold_clk, clk, (float)gold_clk/(float)clk); + } + if (simu_flag) break; + } + } + + return 0; +} \ No newline at end of file diff --git a/sdk/software/examples/lenet/test_image.h b/sdk/software/examples/lenet/test_image.h new file mode 100644 index 0000000..ed2afc9 --- /dev/null +++ b/sdk/software/examples/lenet/test_image.h @@ -0,0 +1,23 @@ +#ifndef __TEST_IMAGE__H__ +#define __TEST_IMAGE__H__ + +#include + +#define TEST_IMAGE_SIZE 10 + +int8_t test_image[TEST_IMAGE_SIZE][28][28] = { + {{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 6, 4, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 8, 7, 0, -1, -1, -1, -1, 0, 7, 5, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6, 8, 5, -1, -1, -1, -1, -1, 5, 8, 2, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 8, 8, 3, -1, -1, -1, -1, 0, 8, 7, 0, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 8, 7, 0, -1, -1, -1, -1, 2, 8, 5, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, 3, 8, 7, -1, -1, -1, -1, 0, 8, 8, 2, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, 5, 8, 4, -1, -1, -1, -1, 1, 8, 8, 0, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, 5, 8, 7, 0, -1, -1, -1, 3, 8, 7, 0, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 8, 8, 4, -1, -1, -1, 4, 8, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 6, 8, 8, 6, 6, 7, 8, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 4, 7, 8, 8, 8, 8, 8, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 2, 8, 7, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 8, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 8, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3, 8, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 7, 8, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 8, 8, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 8, 7, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4, 8, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 7, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}}, + {{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4, 6, 8, 8, 7, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, 6, 8, 8, 8, 8, 8, 8, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, 5, 7, 6, 5, 3, 7, 8, 8, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, -1, -1, -1, 0, 5, 8, 6, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 7, 8, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 8, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 8, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 2, 8, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 2, 7, 7, 8, 7, 7, 8, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 6, 8, 8, 6, 4, 5, 8, 8, 6, 0, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, 6, 8, 5, 2, -1, -1, -1, 6, 8, 8, 6, 0, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, 1, 8, 6, 0, -1, -1, -1, 0, 7, 8, 8, 8, 5, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, 5, 8, 1, -1, -1, -1, -1, 4, 8, 4, 2, 8, 7, 0, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, 6, 8, 1, -1, -1, -1, 2, 8, 8, 0, 0, 7, 8, 0, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, 4, 8, 2, -1, -1, 0, 7, 8, 3, -1, -1, 4, 8, 6, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, 0, 8, 7, 1, 1, 5, 8, 7, 0, -1, -1, 0, 3, 3, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, 6, 8, 8, 8, 8, 7, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 8, 8, 8, 8, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3, 7, 6, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}}, + {{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 4, 8, 8, 3, 3, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 7, 8, 8, 8, 8, 8, 7, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 8, 8, 7, 5, 2, 2, 5, 7, 7, 1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, 0, 7, 6, 2, 0, -1, -1, -1, -1, 1, 7, 7, 1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, 5, 6, 0, -1, -1, -1, -1, -1, -1, -1, 4, 8, 7, 0, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, 0, 4, 1, 0, 0, -1, -1, -1, -1, -1, -1, 0, 4, 8, 4, 0, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, 0, 0, 2, 7, 7, 1, -1, -1, -1, -1, -1, -1, 1, 8, 8, 0, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, 4, 8, 8, 8, 2, -1, -1, -1, -1, -1, -1, 0, 7, 8, 0, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, 5, 8, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, 6, 8, 4, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, 0, 8, 8, 7, 0, -1, -1, -1, -1, -1, -1, -1, -1, 6, 8, 4, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, 0, 8, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6, 8, 4, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, 2, 8, 7, 0, -1, -1, -1, -1, -1, -1, -1, -1, 1, 8, 8, 2, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, 0, 7, 8, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 8, 6, 0, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, 0, 8, 8, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4, 8, 4, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, 5, 8, 6, -1, -1, -1, -1, -1, -1, -1, -1, 3, 7, 8, 0, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, 1, 8, 6, 0, -1, -1, -1, -1, -1, -1, 4, 7, 8, 4, 0, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, 5, 8, 3, 0, -1, -1, -1, 0, 4, 8, 8, 6, 0, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, 3, 8, 8, 5, 2, 2, 4, 5, 8, 8, 5, 0, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 8, 8, 8, 8, 8, 8, 8, 5, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 2, 5, 4, 3, 3, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}}, + {{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 3, 8, 5, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 6, 8, 5, 1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 6, 8, 5, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 6, 7, 3, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 6, 7, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5, 8, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 8, 5, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 8, 6, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 8, 8, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 7, 8, 5, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6, 8, 8, 6, 5, 4, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 5, 8, 6, 1, 2, 3, 6, 6, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, 3, 8, 7, 1, -1, -1, -1, 0, 6, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, 2, 8, 8, 1, -1, -1, -1, -1, -1, 5, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, 7, 8, 6, 0, -1, -1, -1, -1, 0, 7, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, 1, 8, 8, 1, -1, -1, -1, -1, 0, 7, 6, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, 5, 8, 4, -1, -1, -1, -1, 0, 6, 8, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, 7, 8, 4, -1, -1, 0, 0, 7, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, 5, 8, 8, 4, 3, 7, 8, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, 3, 7, 8, 8, 6, 3, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}}, + {{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, 0, 2, 2, 6, 8, 8, 8, 8, 8, 6, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, 0, 1, 4, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, 5, 8, 8, 8, 8, 7, 6, 7, 6, 6, 6, 7, 8, 8, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, 1, 7, 8, 8, 2, 2, 0, -1, -1, -1, -1, -1, 2, 8, 8, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, 1, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 8, 8, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 5, 7, 8, 7, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 5, 8, 8, 7, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 8, 8, 8, 8, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, 2, 6, 8, 8, 8, 8, 8, 8, 8, 7, 2, 1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 2, 0, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, 6, 8, 8, 8, 7, 6, 6, 7, 6, 7, 8, 8, 8, 2, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, 0, 2, 2, 2, 0, -1, -1, -1, -1, 0, 2, 8, 8, 7, 1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 8, 8, 2, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 7, 8, 8, 2, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 7, 8, 8, 6, 0, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3, 7, 8, 8, 6, 0, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 5, 8, 8, 8, 6, 0, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 3, 7, 7, 8, 8, 7, 2, 0, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, 3, 5, 8, 8, 8, 8, 8, 5, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, 5, 8, 8, 8, 8, 5, 2, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}}, + {{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 1, 4, 5, 8, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 6, 8, 8, 8, 8, 8, 8, 0, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 8, 8, 8, 8, 4, 6, 8, 8, 1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4, 8, 7, 1, -1, -1, 5, 8, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4, 8, 4, -1, -1, 0, 7, 8, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 8, 7, -1, -1, 7, 8, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 7, 8, 3, 3, 8, 8, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6, 8, 7, 7, 8, 7, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 8, 8, 8, 8, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7, 8, 8, 7, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4, 8, 8, 8, 8, 6, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 8, 8, 7, 4, 8, 8, 6, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 7, 8, 7, 2, -1, 3, 7, 8, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 8, 8, 3, -1, -1, -1, 5, 8, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, 0, 7, 8, 6, 0, -1, -1, -1, 4, 8, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, 1, 8, 8, 2, -1, -1, -1, -1, 2, 8, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, 1, 8, 8, 0, -1, -1, -1, 2, 7, 8, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, 0, 7, 8, 8, 4, 4, 5, 8, 8, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 7, 8, 8, 8, 8, 8, 6, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 3, 4, 8, 5, 2, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}}, + {{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 1, 3, 8, 8, 8, 8, 4, 0, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, 0, 4, 5, 6, 8, 8, 8, 8, 8, 8, 8, 8, 6, 0, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 5, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, 0, 8, 8, 8, 8, 8, 8, 8, 8, 6, 7, 8, 8, 8, 6, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, 6, 8, 8, 8, 8, 8, 4, 0, 0, 1, 8, 8, 8, 6, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 3, 3, 6, 1, -1, -1, -1, 6, 8, 8, 8, 6, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3, 8, 8, 8, 8, 3, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 7, 8, 8, 8, 6, 0, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7, 8, 8, 8, 8, 3, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 7, 8, 8, 8, 8, 6, 0, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 5, 8, 8, 8, 8, 4, 0, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 7, 8, 8, 8, 8, 7, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 7, 8, 8, 8, 8, 5, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 8, 8, 8, 8, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 8, 8, 8, 8, 8, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, 0, 5, 8, 8, 8, 8, 8, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, 5, 8, 8, 8, 8, 8, 8, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, 6, 8, 8, 8, 8, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, 6, 8, 8, 8, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, 1, 7, 8, 3, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}}, + {{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 2, 4, 7, 6, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 6, 8, 8, 8, 8, 8, 4, 1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 7, 8, 8, 8, 5, 5, 7, 8, 8, 8, 3, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, 7, 8, 8, 6, 1, -1, -1, 0, 6, 8, 8, 7, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, 7, 8, 8, 0, -1, -1, -1, 1, 8, 8, 8, 7, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, 1, 8, 8, 8, 7, 3, 0, 0, 7, 8, 8, 8, 2, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, 0, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 7, 8, 8, 8, 8, 8, 8, 8, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 2, 6, 8, 8, 8, 8, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 7, 8, 8, 8, 8, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3, 8, 8, 7, 7, 8, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 8, 8, 7, 0, 4, 8, 7, 0, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7, 8, 8, 3, -1, 4, 8, 7, 0, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 7, 8, 8, -1, -1, 4, 8, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5, 8, 8, 6, 0, 2, 7, 8, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4, 8, 8, 8, 8, 8, 8, 8, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 7, 8, 8, 8, 8, 8, 6, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 7, 8, 8, 8, 7, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 4, 8, 2, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}}, + {{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 4, 6, 8, 8, 8, 8, 1, 0, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 2, 5, 7, 8, 8, 8, 8, 8, 8, 8, 1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, 3, 7, 8, 8, 8, 8, 8, 8, 6, 7, 8, 8, 1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, 0, 7, 8, 8, 8, 8, 8, 4, 4, 1, 0, 4, 8, 7, 0, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, 4, 8, 8, 8, 8, 7, 1, -1, -1, -1, 5, 8, 8, 3, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, 6, 7, 6, 4, 0, -1, -1, 0, 5, 8, 8, 4, 0, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 2, 6, 6, 4, 6, 7, 8, 8, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, 4, 8, 8, 8, 8, 8, 8, 8, 8, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 8, 8, 8, 8, 8, 7, 7, 8, 8, 8, 7, 0, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, 5, 8, 8, 8, 6, 3, -1, 0, 4, 6, 8, 8, 1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 3, 8, 0, 0, 0, -1, -1, -1, 0, 6, 8, 5, 0, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, -1, -1, -1, -1, -1, -1, -1, 1, 6, 8, 4, 0, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6, 8, 6, 0, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 8, 8, 2, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, 0, 5, 8, 7, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 8, 8, 7, 0, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, 0, 6, 8, 8, 8, 6, 1, -1, -1, -1, -1, -1, -1, 0, 7, 8, 8, 6, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, 1, 8, 8, 7, 8, 8, 8, 8, 3, 0, 0, 0, 4, 8, 8, 7, 0, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, 0, 6, 8, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 5, 0, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, 3, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 6, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, 0, 3, 8, 8, 8, 8, 4, 4, 4, 2, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}}, + {{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 3, 3, 1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 2, 3, 3, 3, 7, 8, 8, 8, 8, 8, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 0, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 4, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 5, 0, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, 2, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 7, 5, 1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, 0, 6, 8, 8, 8, 8, 8, 6, 6, 6, 6, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, 6, 8, 8, 8, 8, 3, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, 8, 8, 8, 8, 7, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, 8, 8, 8, 8, 8, 8, 7, 5, 5, 2, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 2, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, 5, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 5, 5, 5, 7, 8, 8, 8, 8, 6, 0, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 5, 8, 8, 8, 5, 0, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 4, 0, -1, -1, -1, 0, 7, 8, 8, 8, 0, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, 3, 7, 8, 7, 3, 0, -1, -1, 1, 8, 8, 8, 2, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, 3, 8, 8, 8, 8, 6, 2, 3, 7, 8, 8, 8, 3, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, 3, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, 0, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 4, 8, 8, 8, 8, 8, 8, 4, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 3, 3, 3, 3, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}} +}; + +int test_target[TEST_IMAGE_SIZE] = {4, 2, 0, 6, 3, 8, 7, 8, 3, 5}; + +#endif // __TEST_IMAGE__H__ diff --git a/sdk/software/examples/lenet/weights.h b/sdk/software/examples/lenet/weights.h new file mode 100644 index 0000000..79f59d4 --- /dev/null +++ b/sdk/software/examples/lenet/weights.h @@ -0,0 +1,62 @@ +#ifndef __WEIGHTS__H__ +#define __WEIGHTS__H__ + +#include + +int8_t w_conv1[6][3][3] = { + {{-43, -52, -8}, {15, -8, 91}, {32, 101, 91}}, + {{-17, 33, -10}, {109, 106, 69}, {64, 89, 14}}, + {{0, -51, -93}, {-80, -43, -26}, {40, 78, 114}}, + {{75, 6, 83}, {34, 75, 65}, {-114, -120, -74}}, + {{60, 36, 44}, {34, 127, 9}, {75, 40, -49}}, + {{4, 7, 25}, {-91, -44, -109}, {-79, -28, -87}} +}; + +int8_t w_conv2[16][6][3][3] = { + {{{12, 13, -12}, {46, -29, -42}, {15, -25, -25}}, {{-8, 40, -29}, {27, 25, -42}, {15, 18, -23}}, {{-66, -41, -10}, {-58, -45, 6}, {-38, -50, -2}}, {{-9, -41, 1}, {-10, -72, -30}, {-26, -81, -65}}, {{27, 45, -23}, {13, 58, -45}, {23, 26, -57}}, {{-61, 15, 29}, {-39, 9, 44}, {0, 42, 13}}}, + {{{18, -67, -47}, {-49, -30, 46}, {-34, 33, 56}}, {{29, 14, -83}, {-79, -85, 9}, {-39, -14, 33}}, {{-2, -6, 58}, {23, 79, 108}, {8, 5, 3}}, {{58, 41, 45}, {45, -66, -13}, {-49, -2, 88}}, {{43, 41, -50}, {-37, -127, -40}, {-93, -16, 58}}, {{-20, -7, 31}, {22, 27, -32}, {15, -27, -46}}}, + {{{-69, -37, -1}, {13, -20, -71}, {64, 56, 34}}, {{-26, -19, 46}, {-15, -64, -87}, {50, 12, 42}}, {{-51, -52, -26}, {8, 18, -29}, {-18, -19, 14}}, {{20, 65, 75}, {-44, -11, 3}, {-7, 28, -84}}, {{-4, 7, 27}, {-23, -67, -47}, {55, 21, -27}}, {{38, 26, 28}, {28, -1, 28}, {-8, -30, 29}}}, + {{{-2, -1, 9}, {-32, -5, 15}, {30, -1, -20}}, {{-15, 21, -24}, {-18, 9, -19}, {18, -5, -46}}, {{-10, 16, 42}, {-11, -20, 5}, {-17, -13, 1}}, {{71, 49, -18}, {54, 63, 45}, {-81, -21, -14}}, {{9, 1, 10}, {21, 0, 34}, {-3, -40, -9}}, {{-45, 3, -20}, {13, 7, -1}, {30, 3, -2}}}, + {{{-42, -10, 0}, {-3, 26, -9}, {46, -26, -73}}, {{27, -44, 21}, {-19, 20, 10}, {-3, 20, -27}}, {{-17, 9, 5}, {55, 29, -61}, {43, -41, 9}}, {{49, 12, -34}, {-19, -28, 6}, {19, 21, -7}}, {{8, -28, 26}, {-46, 10, 41}, {29, 34, -30}}, {{-2, -14, -84}, {19, -46, -74}, {-33, -50, 18}}}, + {{{-22, -12, 50}, {-61, -3, 4}, {-35, -7, 6}}, {{48, -50, 9}, {11, -15, 18}, {-18, -22, 3}}, {{-41, -34, -26}, {0, -31, -69}, {25, 0, -40}}, {{11, -2, 7}, {-48, -92, -8}, {-74, -65, -38}}, {{20, -55, 54}, {13, -75, 50}, {-22, -14, 35}}, {{19, 13, -12}, {30, 29, -42}, {3, 32, -43}}}, + {{{9, 41, 25}, {-18, -26, -6}, {4, 7, 14}}, {{0, 32, 3}, {7, -1, 27}, {-10, -48, -4}}, {{1, -16, 4}, {-46, -24, -21}, {66, 51, 59}}, {{40, 53, -3}, {62, 72, 50}, {-50, -66, -35}}, {{-20, 19, 3}, {7, -3, 25}, {-47, -58, -15}}, {{-29, -31, -28}, {9, 10, 0}, {-3, 33, 13}}}, + {{{24, -14, -41}, {14, -12, 3}, {-2, 24, 27}}, {{20, -37, -70}, {-10, 19, -6}, {-27, 39, 32}}, {{-41, -30, 2}, {-31, 4, -23}, {16, -6, 19}}, {{-8, -68, -13}, {49, -14, -26}, {21, 94, 62}}, {{45, 7, -67}, {11, 21, -52}, {-18, -1, 10}}, {{-43, 21, 15}, {-75, -16, 8}, {12, -23, -53}}}, + {{{2, -9, 32}, {-23, 29, -9}, {-55, 26, -9}}, {{0, -43, 25}, {7, -33, 23}, {-55, 4, 27}}, {{1, 3, -61}, {17, -14, -120}, {-15, -63, -124}}, {{18, -46, -47}, {-2, -32, -58}, {-51, -28, -65}}, {{0, -49, 68}, {12, -14, 66}, {-36, -29, 62}}, {{21, 9, -19}, {48, 9, -70}, {32, -4, -57}}}, + {{{-38, 41, -14}, {38, 33, -58}, {23, -72, -33}}, {{-16, 20, -4}, {-36, 17, -30}, {2, -11, -49}}, {{11, 11, -35}, {54, 18, -21}, {33, -21, 9}}, {{-3, -34, -20}, {-32, -24, 27}, {3, 50, -8}}, {{-18, 33, 27}, {-27, 33, 18}, {38, 38, -37}}, {{15, -42, -52}, {-29, -55, -25}, {-60, -17, 45}}}, + {{{0, -33, -29}, {16, -7, -20}, {8, 22, -21}}, {{-6, -43, -36}, {2, -10, -7}, {8, 0, 9}}, {{52, 16, -14}, {-1, 30, 20}, {17, 16, 0}}, {{22, 60, 93}, {107, 51, -2}, {62, 41, 46}}, {{-24, -49, -29}, {-4, -23, -27}, {26, 18, 22}}, {{27, 9, 50}, {-37, -7, -9}, {-3, -23, -12}}}, + {{{-28, -79, -65}, {-18, 15, 36}, {-4, 55, 20}}, {{17, -12, -64}, {-32, -56, -15}, {-26, 26, 27}}, {{-45, 6, 27}, {40, 45, 46}, {56, 9, 48}}, {{93, 6, -28}, {14, -76, -29}, {-67, -12, 43}}, {{60, -33, -69}, {-48, -79, -12}, {-7, 7, 68}}, {{-6, -12, 9}, {-2, 14, -1}, {-24, -18, -5}}}, + {{{15, -4, -30}, {-3, 36, -29}, {-3, 23, 14}}, {{-5, 11, -30}, {-5, 36, -3}, {-30, 36, 29}}, {{-22, -35, -23}, {-38, -41, 1}, {-27, -63, 23}}, {{0, -50, -83}, {-25, -75, -111}, {-50, -26, -29}}, {{-37, 20, 4}, {1, 38, -8}, {9, 49, 27}}, {{-48, -80, -20}, {6, -33, -30}, {1, -51, -39}}}, + {{{15, -22, -26}, {21, -1, 11}, {-23, 6, -13}}, {{-10, -41, -15}, {25, -5, -4}, {-31, -26, -19}}, {{-17, 7, 10}, {0, -21, -8}, {-5, 10, 47}}, {{5, -55, -38}, {55, 62, 45}, {54, 55, 14}}, {{-17, -28, -12}, {31, 35, 30}, {-17, -6, 2}}, {{2, -20, -6}, {-10, -22, 12}, {27, 14, 25}}}, + {{{-8, -27, 36}, {-31, 37, 50}, {-57, 28, 12}}, {{24, -67, -46}, {-18, -24, 30}, {-41, 1, -4}}, {{12, 18, 92}, {-27, 12, 33}, {7, -11, -27}}, {{29, -33, -123}, {-61, -85, 4}, {-44, -75, -35}}, {{21, -68, -77}, {1, -60, 14}, {-77, -22, 52}}, {{5, 0, 31}, {7, 20, -13}, {-2, 5, 5}}}, + {{{-28, -15, -5}, {16, 16, 14}, {-25, -8, -37}}, {{-18, -30, -30}, {28, 23, 30}, {-14, 16, 8}}, {{0, 3, 6}, {-7, 4, -5}, {-27, -44, -41}}, {{5, 23, 16}, {11, -5, 9}, {50, 71, 40}}, {{-7, -22, -36}, {37, 0, 20}, {27, 39, 10}}, {{10, 30, 3}, {-24, -17, -16}, {2, -29, 3}}} +}; + +int8_t w_conv2_rev[6][16][3][3] = { + {{{12, 13, -12}, {46, -29, -42}, {15, -25, -25}}, {{18, -67, -47}, {-49, -30, 46}, {-34, 33, 56}}, {{-69, -37, -1}, {13, -20, -71}, {64, 56, 34}}, {{-2, -1, 9}, {-32, -5, 15}, {30, -1, -20}}, {{-42, -10, 0}, {-3, 26, -9}, {46, -26, -73}}, {{-22, -12, 50}, {-61, -3, 4}, {-35, -7, 6}}, {{9, 41, 25}, {-18, -26, -6}, {4, 7, 14}}, {{24, -14, -41}, {14, -12, 3}, {-2, 24, 27}}, {{2, -9, 32}, {-23, 29, -9}, {-55, 26, -9}}, {{-38, 41, -14}, {38, 33, -58}, {23, -72, -33}}, {{0, -33, -29}, {16, -7, -20}, {8, 22, -21}}, {{-28, -79, -65}, {-18, 15, 36}, {-4, 55, 20}}, {{15, -4, -30}, {-3, 36, -29}, {-3, 23, 14}}, {{15, -22, -26}, {21, -1, 11}, {-23, 6, -13}}, {{-8, -27, 36}, {-31, 37, 50}, {-57, 28, 12}}, {{-28, -15, -5}, {16, 16, 14}, {-25, -8, -37}}}, + {{{-8, 40, -29}, {27, 25, -42}, {15, 18, -23}}, {{29, 14, -83}, {-79, -85, 9}, {-39, -14, 33}}, {{-26, -19, 46}, {-15, -64, -87}, {50, 12, 42}}, {{-15, 21, -24}, {-18, 9, -19}, {18, -5, -46}}, {{27, -44, 21}, {-19, 20, 10}, {-3, 20, -27}}, {{48, -50, 9}, {11, -15, 18}, {-18, -22, 3}}, {{0, 32, 3}, {7, -1, 27}, {-10, -48, -4}}, {{20, -37, -70}, {-10, 19, -6}, {-27, 39, 32}}, {{0, -43, 25}, {7, -33, 23}, {-55, 4, 27}}, {{-16, 20, -4}, {-36, 17, -30}, {2, -11, -49}}, {{-6, -43, -36}, {2, -10, -7}, {8, 0, 9}}, {{17, -12, -64}, {-32, -56, -15}, {-26, 26, 27}}, {{-5, 11, -30}, {-5, 36, -3}, {-30, 36, 29}}, {{-10, -41, -15}, {25, -5, -4}, {-31, -26, -19}}, {{24, -67, -46}, {-18, -24, 30}, {-41, 1, -4}}, {{-18, -30, -30}, {28, 23, 30}, {-14, 16, 8}}}, + {{{-66, -41, -10}, {-58, -45, 6}, {-38, -50, -2}}, {{-2, -6, 58}, {23, 79, 108}, {8, 5, 3}}, {{-51, -52, -26}, {8, 18, -29}, {-18, -19, 14}}, {{-10, 16, 42}, {-11, -20, 5}, {-17, -13, 1}}, {{-17, 9, 5}, {55, 29, -61}, {43, -41, 9}}, {{-41, -34, -26}, {0, -31, -69}, {25, 0, -40}}, {{1, -16, 4}, {-46, -24, -21}, {66, 51, 59}}, {{-41, -30, 2}, {-31, 4, -23}, {16, -6, 19}}, {{1, 3, -61}, {17, -14, -120}, {-15, -63, -124}}, {{11, 11, -35}, {54, 18, -21}, {33, -21, 9}}, {{52, 16, -14}, {-1, 30, 20}, {17, 16, 0}}, {{-45, 6, 27}, {40, 45, 46}, {56, 9, 48}}, {{-22, -35, -23}, {-38, -41, 1}, {-27, -63, 23}}, {{-17, 7, 10}, {0, -21, -8}, {-5, 10, 47}}, {{12, 18, 92}, {-27, 12, 33}, {7, -11, -27}}, {{0, 3, 6}, {-7, 4, -5}, {-27, -44, -41}}}, + {{{-9, -41, 1}, {-10, -72, -30}, {-26, -81, -65}}, {{58, 41, 45}, {45, -66, -13}, {-49, -2, 88}}, {{20, 65, 75}, {-44, -11, 3}, {-7, 28, -84}}, {{71, 49, -18}, {54, 63, 45}, {-81, -21, -14}}, {{49, 12, -34}, {-19, -28, 6}, {19, 21, -7}}, {{11, -2, 7}, {-48, -92, -8}, {-74, -65, -38}}, {{40, 53, -3}, {62, 72, 50}, {-50, -66, -35}}, {{-8, -68, -13}, {49, -14, -26}, {21, 94, 62}}, {{18, -46, -47}, {-2, -32, -58}, {-51, -28, -65}}, {{-3, -34, -20}, {-32, -24, 27}, {3, 50, -8}}, {{22, 60, 93}, {107, 51, -2}, {62, 41, 46}}, {{93, 6, -28}, {14, -76, -29}, {-67, -12, 43}}, {{0, -50, -83}, {-25, -75, -111}, {-50, -26, -29}}, {{5, -55, -38}, {55, 62, 45}, {54, 55, 14}}, {{29, -33, -123}, {-61, -85, 4}, {-44, -75, -35}}, {{5, 23, 16}, {11, -5, 9}, {50, 71, 40}}}, + {{{27, 45, -23}, {13, 58, -45}, {23, 26, -57}}, {{43, 41, -50}, {-37, -127, -40}, {-93, -16, 58}}, {{-4, 7, 27}, {-23, -67, -47}, {55, 21, -27}}, {{9, 1, 10}, {21, 0, 34}, {-3, -40, -9}}, {{8, -28, 26}, {-46, 10, 41}, {29, 34, -30}}, {{20, -55, 54}, {13, -75, 50}, {-22, -14, 35}}, {{-20, 19, 3}, {7, -3, 25}, {-47, -58, -15}}, {{45, 7, -67}, {11, 21, -52}, {-18, -1, 10}}, {{0, -49, 68}, {12, -14, 66}, {-36, -29, 62}}, {{-18, 33, 27}, {-27, 33, 18}, {38, 38, -37}}, {{-24, -49, -29}, {-4, -23, -27}, {26, 18, 22}}, {{60, -33, -69}, {-48, -79, -12}, {-7, 7, 68}}, {{-37, 20, 4}, {1, 38, -8}, {9, 49, 27}}, {{-17, -28, -12}, {31, 35, 30}, {-17, -6, 2}}, {{21, -68, -77}, {1, -60, 14}, {-77, -22, 52}}, {{-7, -22, -36}, {37, 0, 20}, {27, 39, 10}}}, + {{{-61, 15, 29}, {-39, 9, 44}, {0, 42, 13}}, {{-20, -7, 31}, {22, 27, -32}, {15, -27, -46}}, {{38, 26, 28}, {28, -1, 28}, {-8, -30, 29}}, {{-45, 3, -20}, {13, 7, -1}, {30, 3, -2}}, {{-2, -14, -84}, {19, -46, -74}, {-33, -50, 18}}, {{19, 13, -12}, {30, 29, -42}, {3, 32, -43}}, {{-29, -31, -28}, {9, 10, 0}, {-3, 33, 13}}, {{-43, 21, 15}, {-75, -16, 8}, {12, -23, -53}}, {{21, 9, -19}, {48, 9, -70}, {32, -4, -57}}, {{15, -42, -52}, {-29, -55, -25}, {-60, -17, 45}}, {{27, 9, 50}, {-37, -7, -9}, {-3, -23, -12}}, {{-6, -12, 9}, {-2, 14, -1}, {-24, -18, -5}}, {{-48, -80, -20}, {6, -33, -30}, {1, -51, -39}}, {{2, -20, -6}, {-10, -22, 12}, {27, 14, 25}}, {{5, 0, 31}, {7, 20, -13}, {-2, 5, 5}}, {{10, 30, 3}, {-24, -17, -16}, {2, -29, 3}}} +}; + +int8_t w_fc1[10][576] = { + {-6, -4, -15, -14, -18, 2, -7, -15, 0, -10, -5, -2, -6, 21, 14, -15, 11, 11, -1, 13, 21, -61, -12, -4, 3, 21, -18, -26, -15, -12, 4, 0, -13, -25, -30, -27, -12, -10, -15, -15, -7, -4, 0, -6, -8, -13, -34, -3, -7, 5, -8, -31, -6, -15, -24, -3, -4, -12, 4, 0, -23, -51, -28, -3, 20, 6, -13, -28, -17, 0, 5, 1, 4, 4, -8, 0, -7, -6, -3, -18, -10, -2, -1, -12, -9, -28, -21, -32, -39, -16, -24, -58, -24, -10, -30, -22, -14, -13, -25, 0, -5, 1, -10, -1, 5, 4, 5, 1, -1, -10, -10, -5, 4, -1, -4, -16, 2, 11, -8, -10, -5, -11, -28, -5, -18, -24, -3, -23, -73, -69, -2, 9, -18, -13, -23, -16, 0, -1, 5, -8, 11, -6, -18, -10, 4, -15, -16, -18, -21, 2, -4, -1, -12, -25, -37, -26, -6, 10, 0, -51, -2, 1, 14, 7, -34, 4, 12, 14, 5, -9, -14, 3, 5, 1, 7, 2, -18, -45, -16, -1, -4, -5, -9, -2, -7, -5, -11, -11, -19, -3, -3, -2, -5, -1, -20, 7, 39, 0, 1, 17, -29, 24, 41, -4, -10, 15, -35, -20, -6, -14, -16, -4, -28, -61, -26, -8, 4, -11, -21, -16, -13, -1, -2, -24, -24, 8, -5, -22, -11, -22, -24, -7, -5, -35, -8, -16, -43, -57, -3, 0, -21, -9, -9, -7, -6, -5, 7, -8, 7, -12, -18, -10, -2, -11, -12, -9, -8, -3, -5, -12, -11, 20, -6, 7, -6, -21, -13, -13, -1, 1, -10, 8, 16, -32, -10, 2, -8, 8, 11, -24, -20, -16, -6, 11, 14, -19, -26, -20, -6, -14, -8, -4, 4, -7, 0, -6, -13, -12, 4, -5, 8, -9, 3, -2, 14, 7, 18, 20, -13, 6, 23, 6, 5, -3, -23, -26, -10, -4, 10, -13, -24, -43, -19, -6, 6, -15, -12, -11, -30, -2, -6, -4, 4, -15, -44, -15, -11, 8, 5, -41, -6, 16, 7, 10, -2, -3, 10, 14, 4, -18, 4, 0, 1, 1, 5, -10, -16, -21, -12, -7, -8, -16, -5, -1, -9, -3, -4, -3, -8, 8, -3, -13, 2, 3, -18, -74, -25, -3, -10, -39, -31, -12, -23, -26, -24, -14, -8, 1, -19, -28, -12, -18, 3, 11, -5, 4, -9, -7, -16, -15, -20, -5, -6, -8, -8, -16, -56, -17, -1, 3, -3, -51, -37, -27, -11, -24, -22, 9, -2, -6, -18, -47, -14, 12, 36, 0, -3, -11, 3, 12, -3, -6, -8, -8, 12, -5, 3, 4, -6, 1, -9, 4, -5, 16, -8, -9, -4, -18, 8, 20, -3, -13, -1, -29, -18, 14, 3, -3, 13, -15, -23, -9, -5, -6, -20, -22, -10, -8, -8, -13, -28, -12, -22, -19, -11, -14, -3, -1, -14, -25, -1, -17, -23, -44, -5, 4, -2, 7, -55, -39, 8, -9, 2, -5, 0, -3, -8, -17, 2, 2, 20, 12, -18, -21, -16, -2, -12, -6, -5, -7, -2, 2, 7, -12, -36, -4, 7, -4, -9, -27, -10, -16, -5, -4, -7, 14, -1, -10, -16, -57, -30, -4, 14, 2, -8, -40, -26, 8, 9, 3, -6, -16, -2, -12, -8, -4, -7, -7, -5, 6, -4, 0, -3, -2, -17, -80, -21, -7, -12, -22, -31, -35, -25, -20, -17, -21, 3, 5, -13, -19, -14, -23, -6, 12, -7, -10}, + {7, 12, 25, 18, 2, -6, -5, -13, 6, 35, -3, -6, 9, -11, -14, 15, -10, -20, 4, -3, -6, 10, -32, -6, 5, 8, 35, -24, -28, 0, -5, 5, -9, -9, -8, 2, -18, -16, -5, 2, 7, 5, -9, -30, -25, 30, 1, 2, -3, -16, 9, 5, -8, -4, -20, -23, -1, -11, -7, 8, 7, 3, 18, -7, -23, -7, -6, -18, -35, -23, -13, -7, -4, -2, -14, -13, -10, -11, -8, 6, -9, 14, -11, -12, -10, 3, -33, -12, -27, -18, -5, 3, -40, -15, 13, -4, -5, 6, 21, 16, 3, -12, -9, -11, 4, 7, 1, -5, -1, -9, -13, -4, 2, 7, -5, -27, -26, -40, -44, -16, -7, -10, 0, -24, -39, -16, 5, -22, -10, -40, -26, -3, -10, -16, -17, -5, -22, 3, 0, -4, -21, -9, 1, 1, -7, -14, 7, -5, -2, -14, -11, -28, 0, -5, -7, -16, -13, -15, 0, -13, -30, 2, -14, -25, -16, -34, -13, 4, -19, 6, -8, -49, -26, -5, -5, -5, -19, -13, -5, -2, -6, -11, 3, 0, 11, -5, -7, -20, 0, 35, 27, 2, -8, -19, -3, 23, 14, 6, -17, -28, 25, -11, 10, 7, -7, -14, 31, -13, 4, -2, -4, -10, -12, 4, -12, 0, -1, -7, -22, -21, -5, -8, -4, -14, -20, -66, -59, -15, -11, -9, 13, -17, -39, -12, 4, -22, -5, -33, -26, -4, -22, -21, -26, -6, -4, 4, -7, 8, -26, 2, 5, 3, 3, -1, -29, -24, -19, -1, -3, 5, 4, -15, -3, -8, 4, -9, -49, 26, 2, -21, -3, -11, -55, -6, -23, -5, 1, 5, 1, 1, -5, -5, 7, 4, 26, -6, -6, -2, -6, -2, 22, 13, 16, 1, -17, -9, 9, 36, 13, -7, -13, -19, 1, 19, -8, 0, -24, -12, 12, -9, -16, 5, -16, -13, 16, -6, -8, 7, -9, -11, -14, 2, -4, -5, 1, -15, -2, 0, -6, -5, -8, -27, -14, -13, 5, -23, 1, -7, -11, -3, -21, -7, 1, -6, -15, -4, -29, -12, -3, 5, -21, -25, -21, -10, -2, -17, -23, -9, -5, 4, 7, -19, -17, -27, -13, -11, -3, -11, -35, -20, -57, -30, 0, -3, -30, -16, -58, -5, -9, -18, -27, -32, -36, 4, 14, 15, 1, 2, 12, 8, -1, -14, -24, -6, -13, 8, -6, -13, -13, -1, 2, -13, -1, -15, -35, 7, -10, -3, -1, -3, 2, -2, -23, -2, -18, -8, -10, -8, -1, 10, 14, 10, 9, -27, -45, -9, -9, -4, -13, -39, -21, -4, 5, -12, -8, 4, -6, -4, -10, -19, 14, 16, 9, -6, -3, -21, -32, 5, -5, -10, -7, -13, -11, 12, -26, -12, -4, -14, -6, 12, 2, -2, 0, 1, -12, -23, 1, -8, -1, -19, -33, -40, -27, -4, -3, -13, -9, -32, -46, -12, -2, -15, -16, -31, -55, -15, 1, -25, -28, -42, -87, -7, -9, 7, 0, -19, 5, -6, 7, -10, -32, -12, 3, -7, -9, -12, 5, 19, 24, -10, -15, -24, -7, 39, 50, 6, -9, -8, 19, 18, 30, 4, -9, -5, 1, -8, 13, -16, 3, -3, -19, 15, -8, -20, -6, 0, 3, -12, -25, -19, 5, -16, -19, -19, -22, -20, -9, -17, -24, -7, -28, -25, -2, -10, -42, -14, -55, -2, -12, -13, -42, -37, -50, -5, 1, 13, -22, 18, 17, 12, 4, -29, -42, -36, -16, -5}, + {-6, -5, -8, -6, 2, 6, -2, -16, -9, 5, -5, 6, -5, -50, -33, -5, -2, -8, -5, -63, -35, -10, -15, -34, 5, 6, -11, -30, -15, -28, 9, 4, -43, -33, -4, -21, -11, -21, -32, -31, -33, -6, -3, 6, -25, -45, -23, -6, 14, 13, -11, -8, 8, 30, 12, 26, 19, 8, 22, -3, -18, -9, 8, -15, -32, 5, -28, -37, -17, -28, -13, -13, -11, -8, -9, -2, -11, -9, 4, 15, -1, -16, 7, -11, 6, 34, 39, 19, -30, -7, 2, -20, -42, -43, -17, -8, -19, -59, -26, 3, 43, 17, -8, -13, -2, 21, 12, -9, -2, 25, 29, 5, -7, -14, -11, -2, 17, -3, -31, -42, 6, 0, -19, -17, -42, -18, -25, -35, -30, -26, -11, 32, -1, -16, -3, 3, 18, 28, 14, -2, -7, 11, 11, 8, 5, 3, -3, -12, -28, -2, 0, -3, -7, -33, -36, -30, -17, -26, -33, -7, 15, 18, -1, 4, 14, 7, 5, 14, 13, 8, -3, -13, -54, 3, 6, -22, -46, -53, -25, -6, -2, 8, -15, -27, -29, 12, -12, -17, -19, 8, 7, 8, -29, -36, -32, 23, 20, 11, -8, -21, -11, -7, -41, -10, 0, 11, -13, -49, -28, -23, -7, -20, -56, -12, 12, -8, -8, 17, 16, 21, -15, -14, -10, 4, 3, 18, -11, -40, 0, 11, -5, 1, -31, -24, -21, -55, -36, -29, -27, 33, -10, -26, -14, 5, 25, 26, 3, -2, -5, 4, 4, -1, 5, -7, 16, 14, 11, -14, 8, -23, 5, 13, -2, -8, 13, -33, -24, -14, -7, 3, 3, -74, -53, -8, -22, -12, -5, -43, -26, 24, 0, -18, -4, -8, -49, -15, 18, -14, -14, -11, -23, -19, -24, -8, -7, -19, -26, -14, 13, -7, -45, -48, -45, 1, 16, 2, -15, -13, -18, 15, -26, 0, 16, 19, -10, -38, -39, -6, -2, -20, -44, -46, -10, 1, -3, 7, -13, -24, -26, -5, 1, 8, 5, -21, -37, -19, 0, -23, -50, -19, 14, 8, 1, -11, 12, 11, 7, -4, 16, 9, -7, -10, -33, -19, 9, -25, -23, -44, -33, -5, -13, -5, -7, 3, -5, -24, -4, -17, -20, -12, -31, -28, 13, 30, 21, -12, -32, -1, 18, 8, -8, -1, -16, 7, -19, -36, -23, 4, 54, 49, -35, -36, -28, 10, 35, 2, -9, -10, -26, -22, -32, -15, 0, 10, -16, -69, -68, -13, 19, 26, 3, -9, -5, 24, 10, 22, 3, 25, 30, 5, -18, -11, 0, 4, -21, -9, -26, -10, -7, -33, -19, -18, 3, 1, 10, -4, 1, -4, 1, -28, 7, 1, 4, -21, -16, -51, -28, -28, 8, -17, 5, -39, 10, -15, 3, -19, 12, 1, 26, -7, -12, -10, -1, -6, -27, -22, -12, -1, 0, 16, 19, 4, -3, -27, -8, -7, -9, -10, -39, -33, -10, -10, -27, -47, -45, -8, -9, -9, 6, 6, 4, 31, 17, -19, -17, -15, 20, 18, -11, -14, -10, -8, 6, 1, -7, -9, -16, -29, -15, -1, -4, 1, -20, -53, -18, 13, 5, -15, -13, -5, 15, 6, 8, 25, 28, 0, 38, -19, -10, 5, 17, -21, -76, -27, -28, -34, 10, -20, -37, -8, -4, 6, -1, -8, -5, -11, 8, -4, -2, -13, -33, -31, 15, 11, 13, -32, -43, -10, 18, 7, -4, -8, 5, 17, -12, -25, -2, 7, 30, 24, -25, -50, -15, -2, 16, 10}, + {2, -9, 4, 6, 7, -7, -2, -36, -29, 12, 7, 13, 5, -31, -39, -36, 8, -20, 0, -35, -45, -27, 4, -13, 5, -59, -86, -1, 14, 6, -1, -22, -27, 1, 5, -16, 3, -3, -12, -34, -47, -3, -4, -11, -8, -55, -39, -16, -13, 28, 58, -3, -28, -5, -19, -32, -31, -26, -18, -5, -16, -20, 3, 10, 5, -11, 5, 22, 35, 40, -9, -8, -9, -3, 6, 7, -4, -4, -1, 8, 6, -10, -23, -21, 2, -16, -32, -37, -7, -6, 5, 19, 38, 3, -11, -13, -3, 19, 23, -13, -46, -16, -9, -13, -25, -35, -43, -6, 5, 24, 37, 12, -10, 0, 16, 2, -14, -19, -54, -44, 5, -5, -6, 0, -10, -4, -34, -25, -10, 10, 2, -44, 15, -9, -8, -22, -30, -36, -1, 10, 1, -3, -11, -24, 4, -9, -30, -17, -9, -18, 8, -6, -3, 3, 8, -19, -17, -31, 23, 31, -10, -12, -39, -53, -15, -29, -23, -20, -9, -48, -19, 6, 15, -5, -17, -8, 0, 16, -4, 6, 4, -10, -25, -39, -24, 2, -11, -33, -48, -53, -5, 18, -30, -22, -12, -44, -56, 3, -37, -19, 3, -50, -23, 4, -9, -44, -50, -18, -4, 4, -1, -13, -52, -26, -22, 10, 10, 16, 32, 14, -4, -7, 4, 15, 17, -11, -59, -48, -7, 6, 13, -13, -11, -23, -28, -9, 0, 4, -19, -47, 10, -9, 15, -11, -34, -42, -8, -7, -12, -6, -13, -17, 0, 6, 14, -4, 10, 2, 4, -6, 0, 8, 5, 1, 0, -73, -93, 2, 7, 4, 9, -26, -45, -7, 4, -9, 21, -10, -35, -8, 7, 4, 9, 4, -42, -22, -18, -16, -2, -27, -28, -10, -16, -7, -26, -50, -44, -49, -6, -4, -57, -31, -5, -39, -47, -6, -35, -31, -18, -64, -26, 1, -25, -35, -67, -36, -14, -3, -20, -20, -25, -14, -10, -6, 6, 11, -39, -44, -17, -7, 16, -16, -18, 13, 26, -8, -8, -32, -13, 11, 1, -16, -25, -70, -36, -28, -17, -14, -3, -46, -48, 11, 10, -6, -8, 4, 6, 6, 7, 0, 3, 2, -3, 8, 8, -19, -3, -5, 4, -1, -21, -37, -3, -17, -26, -1, -12, -35, -4, -1, -7, -10, 3, 1, 6, 21, 11, 2, -24, -38, 17, 40, 38, 3, -26, -16, -2, -12, -2, -12, -27, -17, -7, -5, -9, -53, -44, -18, -12, -1, 38, 14, 2, 6, -21, -35, -15, -27, -24, -2, -11, -13, -13, -7, -3, -13, 12, 28, 38, 20, -1, 3, 1, 3, 2, 14, 13, 0, 9, -23, 6, 5, 10, 3, -9, -66, -13, -14, -16, -29, 13, -9, -8, -16, -5, -1, 9, -8, -23, -12, -2, 4, 11, 1, -23, -15, 4, -6, 9, 11, 22, -5, -18, -24, 20, 16, 7, 8, -22, -26, -8, -20, -2, 25, 19, -14, -15, -26, -15, 4, -10, -41, 1, -6, -26, 6, -21, -32, 8, 17, 10, -12, -17, -21, -4, -10, -27, -40, -30, -6, -9, -27, -78, -87, -12, -9, -15, -6, 27, -27, -40, -8, -21, -31, -17, -36, -39, 0, -19, -18, 7, -12, -21, -1, 4, 1, 24, 7, 7, 2, -2, 2, -11, 4, 3, -17, 1, 10, 11, 11, -7, -16, -9, 0, -12, 5, -7, -44, -11, -17, 4, -2, -4, 3, 4, 14, 18, -4, -23, -26, 11, 31, 29, -3, -21, -7}, + {-5, 1, -7, 1, -28, -15, -3, 30, 44, 9, -4, -13, -3, 11, 3, -20, 0, -23, -2, 1, -21, -9, -5, -20, 5, -5, -2, 5, -7, -17, 0, 0, 0, -12, -16, -2, 1, 3, 1, 3, 19, 15, -11, -2, -9, -4, 28, 0, -6, 0, -68, -18, -8, -19, -18, -18, -40, -15, 1, -1, -12, 5, -11, -25, -12, -2, -17, -23, -25, -37, -19, -3, -7, 5, -12, -13, -13, -9, -16, -15, -44, -77, -34, -9, -6, -51, -33, -39, -11, 8, -1, 7, 22, -14, -11, 6, -6, -11, -8, -36, 2, -8, 1, -22, -41, -31, -19, -10, 3, -14, -19, -15, -7, 2, -1, -22, -77, -76, -65, 9, -7, -15, -24, -24, -60, -11, 1, 5, 28, 27, 11, -15, -16, -9, -9, 18, 10, -10, -11, -26, -38, -23, 4, 1, 0, -13, -18, -15, -17, 14, -11, -15, -4, 7, 24, 6, -13, 30, -6, 7, 3, -7, 8, 0, -47, 10, -26, -9, -8, -17, -8, -10, -32, -1, -8, -1, -1, 11, 0, -3, -7, -8, 6, 5, 17, -4, -2, 1, 31, 58, 56, 1, 6, 16, -25, 6, 23, -7, -5, -7, -27, -5, -27, -8, -22, -29, 16, 11, -9, -3, -9, -11, 4, 9, 6, -4, -6, -10, -15, -20, -14, -7, -1, -4, -79, -94, -76, 3, -18, -26, -35, -20, -45, -12, 1, -5, 20, 14, 11, -12, -14, -3, -19, 8, -9, -19, -20, -20, -21, -2, 4, 9, -3, -24, -66, -64, -34, -8, -10, -1, -8, -11, -26, -22, 0, 11, 36, -26, 8, -38, -3, 16, 32, -27, 12, -10, -7, -31, -34, -27, -17, -14, 5, -15, 3, 7, -4, -5, -1, -15, 16, 25, 22, 1, -7, 1, 29, 68, 51, 9, -5, -2, -11, 23, 25, 4, 4, -13, -24, 22, 5, 4, -19, -14, 3, 16, 6, -5, -16, -2, -17, -6, 9, -7, -6, -11, -17, -16, -4, 6, -4, -12, -4, 12, 16, 4, -20, 23, 8, -6, -4, -10, 17, 8, -12, 4, -15, -8, -18, -7, -7, -8, -28, -5, -2, -12, -22, -6, -1, -8, 2, -1, -25, -19, -24, 8, -15, -10, -9, -36, -20, -24, -8, -7, -2, -20, 5, -8, -12, -21, 3, 6, -1, -2, -1, -8, -30, -59, -13, -8, 4, -30, -52, -21, -15, -1, -3, -6, -5, -9, 4, 9, -7, -12, -23, 1, 27, 0, -8, -4, -35, -8, -9, -11, -5, -19, -26, -10, 10, 1, -11, 11, -40, -30, -20, -7, -11, -14, -28, -35, -17, -5, -2, -24, -43, -29, -29, 8, -3, 10, 1, -4, -35, -18, 5, 22, 11, 9, -4, -15, -1, 14, -15, -6, -1, -9, -5, -37, -58, -8, -8, -12, -2, -8, -8, -22, -13, 7, -2, -11, -26, -52, -30, -1, -4, -29, -58, -68, -53, -9, -16, -11, -6, -15, 5, -16, 11, 22, 25, 40, 19, 0, -11, -25, -18, -20, -21, -4, -11, -16, -25, -38, -3, 5, -13, -6, 3, 9, 5, -2, -10, -3, 1, 37, 26, -1, 8, 9, -54, -10, -5, -19, -11, -16, -57, -25, -25, -16, 3, 14, -15, -23, -13, -13, -8, -2, -13, -50, -25, -9, 2, 2, -19, -32, -30, 4, -14, -21, -21, -32, -21, -27, -7, 10, 9, -16, 2, -12, -4, -5, 4, 10, 10, -9, -8, -15, -34, -48, -15, -9, 6, -23, -57, -51, -25, -2}, + {5, -4, -37, -55, -7, -30, -6, -2, 10, -53, -29, -53, 6, -23, 7, -28, -29, -49, -5, -50, -15, -22, -9, -21, -5, -33, -25, -6, -1, 0, 1, -19, -9, 2, -14, 5, -23, -6, -4, -3, 6, 4, -12, -24, -16, 8, 43, 24, -28, -42, -29, -49, -34, -8, -8, -35, -27, -23, -40, -8, 0, 14, 3, 4, -7, -8, -7, -5, 16, 14, 13, -9, -7, -5, 0, -8, -19, -17, -14, -38, -10, 14, -2, -2, -12, -5, 18, 57, 36, 21, 17, 29, 2, 10, 8, -2, -10, 10, 11, -4, -14, -19, -3, -1, -12, -24, -12, -6, -13, -16, -22, 7, 14, 1, -22, -33, 0, 22, 37, 33, -17, -7, -5, 8, 17, 20, -4, 16, 2, -18, -40, -30, -1, 4, -4, -43, -28, -20, -25, -4, 5, -5, -5, 0, -6, -2, -8, 8, 21, 19, -10, -19, -17, -27, -6, 52, -12, -7, -12, -102, -127, -23, -16, -27, -39, -37, -34, -19, 5, -16, -11, 0, 3, 8, -20, -6, 1, 9, 11, 3, -2, -14, -11, -2, 1, -4, -6, 4, 16, -32, -35, -6, -5, 6, -5, -78, -65, -14, -21, -25, -37, 5, -11, -2, -6, -32, -46, -2, 7, 2, -11, -1, -43, -39, 2, 0, -5, -16, -38, -2, 17, 3, -13, -29, -26, 7, 31, 34, -14, 3, -13, 16, 19, 36, -13, 25, -2, -22, -17, -42, -4, 13, -5, -28, -37, -22, -32, -8, -3, -17, -13, 1, -1, -14, -12, -8, -7, -2, -14, -22, -19, -36, -27, -14, -1, 11, 10, -22, -26, -51, 6, -26, -10, -1, -8, -16, 8, -7, -22, -3, 4, 9, 0, -3, -9, 1, -11, 1, -8, -9, 2, -1, -23, -5, 3, 19, 16, -38, -57, 5, -6, -1, 7, -67, -61, -15, -24, -29, -54, -16, -19, 1, -26, -30, -44, -10, 11, 9, -26, -29, -30, -35, 3, 5, -9, -14, -9, 11, 36, 5, -7, -10, -20, -26, -17, 14, -4, -9, 2, -56, -115, -41, -13, -26, -26, -43, -29, -24, 3, -10, -11, 4, 9, 13, -13, -10, 12, 0, 1, 7, -10, -18, -13, -1, 2, 2, -28, -21, -12, -6, -1, 7, -22, -39, 0, 8, 15, 7, 3, 13, -6, -4, -17, -13, -5, 13, 3, -7, -12, -14, -2, 11, 48, 8, -2, -11, -12, -2, -2, 10, 4, 11, -22, -30, -11, 31, 52, 36, -26, -39, -24, -41, -25, -8, -9, -18, -16, -32, -49, -30, -2, -2, 0, 9, -19, -13, -5, -3, 22, 11, 9, -10, -3, -8, -13, 4, -17, -1, -16, 16, 1, -25, -45, -10, -3, 7, 11, -33, -15, -30, -6, -18, -11, -13, -2, -6, -10, -15, 10, 9, -9, 11, 4, -10, -2, 3, -3, 7, -15, -27, -21, -4, 5, 9, -18, -13, 11, 22, 33, 23, -10, 2, 9, -10, -16, -1, -12, 4, -20, -31, -28, -19, 0, 14, -7, -8, -2, -11, -14, -17, -2, -5, -14, 1, -3, -5, -13, 6, -19, -10, -5, 2, 17, 13, -14, -15, -22, -27, -25, -50, 5, -11, -15, -38, -29, -31, -6, 2, -10, -13, -11, 14, 7, -4, -10, -8, 16, 25, 5, 0, -15, -19, -26, -17, -9, -4, -28, -30, 4, 13, 11, 2, -20, -17, -8, -6, 23, 9, -8, -6, -17, -14, -11, -9, 0, 14, 14, 3, -22, -1, 0, 1, 18, 15, -23, -12}, + {-6, 23, 41, 19, 0, 3, 7, 18, 18, -23, -50, -11, 5, 16, -6, -40, -55, -16, 1, 11, 6, -39, -14, 4, 0, -8, -9, -10, 6, -10, -7, -13, -16, -11, -3, -10, -2, -5, 0, 13, -10, -6, -2, -6, 9, 18, -22, -5, -6, -6, 22, 11, -17, -9, -23, -34, -4, -24, -31, -9, -42, -80, -48, -23, 13, -2, -12, -23, -24, -7, -4, -4, -14, -16, -27, -40, -29, -12, -15, -22, -30, -5, 19, -2, -23, -51, -27, 37, 29, 5, -29, -70, -43, -7, -10, -22, -7, -45, -30, -25, -35, -4, -1, 0, 22, -1, -14, -5, -1, 1, -3, 1, 17, 1, -3, -21, -36, -17, 9, 3, -17, -41, -51, -16, 3, -31, -16, -28, -41, -17, -25, -15, -10, 4, -1, 2, 1, -17, -24, -13, 8, 20, -11, -24, 5, 23, 8, 2, 5, 0, -8, 8, 6, 1, -13, -27, 2, 4, 5, -37, -38, -13, -1, 6, -16, -20, 0, -5, -20, 3, -12, -14, 9, -5, -22, -21, -34, -50, -16, -3, 10, 8, 11, 24, 13, -1, 8, 6, 3, -6, -35, -12, 14, 10, 4, -25, -40, -10, -1, 11, -2, -26, -1, -5, -13, 10, -23, -41, -15, -7, -10, -4, -10, -49, -18, -1, 8, 4, -27, -27, 10, 15, -1, -30, -65, -30, 17, 15, -6, -37, -79, -28, 15, -26, -7, -18, -45, -24, -34, -11, -11, -1, -6, 3, -8, -15, -14, -7, 18, -3, -12, -13, -9, -15, -13, -8, 11, 20, -12, -7, -13, -23, -21, -9, 0, 8, -8, -8, -48, -17, -6, 7, -13, 8, -11, 15, -6, -7, 13, 8, 12, -8, -6, -20, -21, -19, -23, -17, 3, 14, 25, 21, 10, 4, 2, 5, 6, -32, -55, -2, 11, 17, 2, -34, -43, -3, 6, 11, 11, -27, -11, 2, -11, 7, -14, -40, -18, 1, -12, -23, -51, -39, -6, -3, 5, 18, 22, 10, 12, -4, 6, 15, 6, -7, -32, -25, -7, 1, -2, -32, -53, -18, -13, 2, -11, -39, -4, 5, -15, -2, 3, 9, 0, 0, -2, -5, -41, -39, -13, -6, 1, -3, -27, -19, -18, -9, -19, -26, -32, -33, -11, -14, -4, -35, -13, 32, 21, 15, -32, -41, -21, 24, 10, -25, -24, -56, -16, 10, -11, -16, -3, -15, -11, -3, -11, 3, 2, -18, -7, -3, -6, -8, -14, -10, 22, 28, 4, -15, -11, -17, 16, 27, -9, -1, -26, -44, -9, -21, -46, -24, -26, -60, -24, -17, 20, -6, -4, -20, -26, -5, -10, -1, 0, 7, 0, -3, 10, 15, -7, -1, -20, -50, -44, -27, 3, 8, 4, -42, -20, 1, -8, 1, 10, -4, -8, 11, -15, 9, 19, 4, -4, -14, 0, -13, -29, -21, -16, 1, 2, -3, -13, -3, 17, 11, -14, -24, -37, -33, -21, -10, -16, -29, -25, -28, -16, -19, -8, -13, -25, -4, 21, -5, -19, -12, 14, 21, 6, -22, -14, -47, -39, -21, -18, -6, -3, -2, 2, 11, 0, -13, -8, -4, 16, 33, 11, -4, 0, -2, 19, 14, -7, -5, -7, -17, 16, -17, -32, -12, -21, -70, -44, -32, -20, -7, -10, -41, -42, -12, -3, -2, -3, 1, -19, -22, -4, 4, -8, -27, -38, -39, -36, -18, -11, -33, 0, 17, 3, 12, -34, -42, -17, 13, -6, -29, -20, -55, -1, 13, -8, -13, 1, -17, -20, -3, -2, -1}, + {-6, 0, -21, -20, -10, -15, -10, -20, -20, -4, -6, -3, -8, 0, 60, 3, -6, -1, 7, 53, 12, -24, -10, -7, 9, 11, 5, 0, -7, -12, 1, 22, 15, -3, -9, -12, -7, -4, -1, -37, -41, -14, -13, -29, -43, -30, -6, -11, -19, 12, 16, -6, -16, -19, -11, 43, 3, 25, -3, -19, -3, -4, -7, -3, -8, 6, 19, 3, -29, -23, -17, -10, -11, -1, 1, 7, -2, -5, 5, 27, 46, 13, -24, -2, 6, 31, -4, -40, -6, -10, -18, -16, -17, 8, -9, -20, -2, -14, -42, 8, -6, -26, -26, -45, -37, -17, -12, -10, 6, -1, -7, -14, -10, 0, 2, 33, 34, 27, -11, -22, 7, 5, -12, 21, 11, -12, -8, -13, -29, -25, 0, -19, -28, -34, -27, -17, 7, -2, 8, -37, -43, -27, -43, -18, 1, 0, -34, -19, -11, -9, -12, -46, -28, 9, 20, -12, -8, -16, -26, -8, -16, -5, -10, -8, -16, -2, 6, -12, -20, -32, -5, -9, -21, -5, 11, 14, 3, 11, -25, -7, -7, -6, -29, -38, -18, -10, -12, 2, -34, -52, -18, -1, -13, -22, -34, 45, 0, -8, -20, -9, -18, 52, 19, -3, -24, -23, 1, 16, -11, 6, 7, -8, 24, 23, -18, 4, 3, -7, -4, -8, 7, 6, 0, 22, 26, 24, -16, -25, 8, 12, 1, 12, -17, -29, -9, 11, -27, -29, 11, -22, -20, -28, -31, -18, -20, -18, -7, -35, -44, -23, -31, -22, -1, 1, -8, -9, -17, -3, 19, 36, 5, -23, -18, -18, -3, 1, -3, 5, 0, 6, 1, -11, -44, -45, 3, -4, -5, -15, -35, -31, -29, -20, 8, -3, 12, -3, -13, -17, 0, -20, -18, -47, -24, -7, -11, -13, -15, -2, -3, -8, -20, -17, -32, 21, 5, -6, -27, -25, -4, 24, 20, -1, -22, -35, 14, 30, -16, 4, 21, 10, 20, 20, -15, 0, -3, -4, -24, -14, -8, -12, 0, -38, -15, -6, 15, 1, 10, 5, 0, -8, 1, -6, 1, -2, -42, -2, 0, 0, -8, -19, -3, -30, -18, -17, 17, 18, -8, 12, -15, -3, -4, 4, -16, -7, -15, -31, 1, 8, 10, 2, 5, -13, 8, 23, -2, -34, -6, -11, -7, 6, -28, -43, 7, -12, -1, -8, -33, -46, -49, -22, 17, -11, -56, -20, -21, -8, -11, -10, -8, -9, -19, -13, -8, -29, -14, -2, 5, -13, -16, 14, 11, -22, 1, -15, -10, 29, 16, -11, -9, -9, 3, -7, -6, -10, -7, 9, 9, 5, -31, -22, -24, -6, 1, -10, -15, -11, -28, -13, 28, 36, 37, 19, 8, -3, 13, -12, -30, 12, -6, -6, -12, -30, -40, 5, -4, -2, -9, -33, -19, -20, -26, -25, 6, 9, 11, 8, -8, -5, 1, 0, -16, -25, -31, -6, 14, 11, 7, 17, -3, -16, 12, 21, -10, 0, -13, -20, -1, -20, -52, -14, 22, -2, -27, -62, -31, -26, -28, -17, 9, 2, -49, -32, -36, -21, -7, -8, -20, -28, -29, -18, -15, -32, -46, -48, -3, -12, -30, -16, -4, 14, -18, -20, -8, 22, 20, 48, -17, -24, -13, 3, 16, 31, 5, 3, 3, 10, -6, -5, 1, -5, -7, -7, -20, -35, -31, -27, -6, 6, 16, 19, -2, -11, -8, 17, -22, -34, -15, -8, -3, -13, -25, -13, 12, -12, -16, -21, -47, -36, -33, -22, 27, -4, -53, -33, -22, -13}, + {-5, -3, -24, -22, -25, -25, -7, -8, -50, -37, -9, -19, 6, -7, -19, -21, 4, -5, 4, -28, -3, -7, -11, -8, -1, 4, -28, -9, 6, -3, 4, -42, -34, -8, -7, -7, 1, -2, 4, -1, 10, 9, 11, 13, -17, -43, -18, 1, -10, -44, -80, -12, 10, -12, -10, -10, -21, -15, -29, 14, -4, -14, -61, -24, -6, 5, -26, -56, -40, 23, -6, 2, 19, 2, 0, -10, -2, 0, 12, -18, -20, -31, -15, 8, 14, 1, 4, -33, -42, -10, 3, -27, -92, -20, 17, 11, 1, -64, -50, -26, -28, 14, 17, 10, -1, -12, 3, 17, 2, -17, -5, -10, 0, 5, -1, -9, -5, -7, -5, 5, -4, -9, 1, -11, 10, -3, -6, -8, -8, 14, 4, 4, -21, -30, -32, -21, -27, -24, -11, 7, 10, 2, -18, -5, 1, -2, 12, -8, -6, -13, 3, 6, -14, -8, -10, -3, -2, -14, -4, 17, 44, 9, -16, 18, 37, -7, -50, -18, -13, 2, -11, -7, -3, -7, -6, -45, -9, 20, 8, -8, 1, 5, 1, 0, 5, 6, -8, 4, -14, -24, -16, -7, -2, -7, -12, -38, -9, -12, -10, 2, 9, -58, -46, 2, 3, 4, -4, -34, -8, -2, 0, -11, -7, -43, -18, 2, 5, -14, -8, 1, -9, -2, 0, -30, -6, -9, -7, -11, -2, -9, -13, -15, 5, -6, -6, 2, -4, 16, 14, -4, -13, -38, -24, -11, -27, -27, -9, -8, 5, 8, -4, -9, -2, -5, 1, 4, -17, -7, -6, -26, -9, 11, 12, -5, 2, 34, 22, -8, -10, 1, -18, -17, 28, 13, -9, -15, -20, -17, -1, 4, -8, -15, -3, 8, 3, -26, -9, 1, -5, -4, -26, -19, 8, -5, -2, -7, -28, -29, -11, 8, -11, -7, -22, -32, -21, -3, -13, -11, 6, -59, -44, -4, 4, -7, -1, -43, -3, -4, -7, -24, -37, -36, -12, -1, 1, 3, 17, 5, -8, -10, -10, 6, -18, -11, 6, -9, -8, -26, -15, 19, 30, 14, -7, 24, 39, -23, -41, -30, -20, 5, -10, -12, 2, -3, -6, -31, -25, -3, 15, -8, -1, 4, 5, 13, 12, -2, -6, 5, -6, 0, 18, 18, -15, -8, 4, -3, -16, -25, -15, -12, -20, -10, 1, -1, -20, -40, -37, -19, -14, -21, -17, -38, 4, -20, -38, -7, -4, 3, -6, -3, 11, 5, 0, 0, -20, -23, -13, -4, -9, -32, -60, -8, 10, -4, -2, 2, -27, -37, -24, 12, 0, -38, -36, -35, -25, -12, -13, -63, -44, 16, 18, 3, 1, -17, -10, -29, -31, -11, -12, -14, -37, -37, -17, -2, 5, 8, -9, -11, -26, 3, -17, -33, -16, -10, -25, -16, -10, -5, -30, -12, 1, 0, -7, 13, 8, -9, 15, 4, -1, -12, 9, 16, 5, 9, -4, -23, -15, 4, 13, 7, -8, -27, -24, -3, 16, 19, -29, -31, -12, -12, 1, -35, -14, -22, -5, 17, -12, -23, -17, 2, 24, 20, 7, -1, 9, 5, -1, -10, -9, 7, 9, 12, -25, -43, -42, -6, 5, -29, -68, -28, -39, 2, 4, -2, -43, -43, -46, 24, 15, 3, -59, -34, -20, 22, 2, -43, -113, -32, 9, 19, -7, -5, 16, 7, -8, -1, -7, 3, -10, -21, 2, 3, -5, -27, -3, 13, -13, -15, -10, -6, -15, 3, -1, -6, -10, -39, -38, -17, -11, -11, -28, -47, 17, 9, -5, -3}, + {-4, -10, -26, -36, -24, -10, -2, -28, -60, -26, -15, -2, 5, -15, -63, 15, 14, 3, 1, -28, -49, 22, 12, 7, -6, -26, -4, 6, -2, -5, 5, 1, 20, -8, -1, 4, -14, 1, -1, -7, -34, -1, 8, 11, 23, -12, -77, -12, -12, -30, -47, 1, 3, -15, -41, -78, -46, 2, -15, -7, -25, -6, 9, -6, -14, -7, 19, 23, 10, -36, -12, -17, -1, -6, -3, 8, 3, 2, -4, -39, -42, -18, 5, 3, -33, -57, -38, -35, -24, -15, 2, 8, 25, -66, -66, -4, -12, 17, 16, -9, -26, -6, -12, -10, -17, -11, 14, -3, -3, -6, -14, -9, -12, 11, -22, -20, -1, -11, -6, -22, 2, -5, 5, -23, -23, -31, -5, 1, 5, 22, -30, -28, -26, -7, 17, -12, -34, -21, -15, -16, -17, -24, -26, -6, -2, -18, 12, -18, -13, -16, -6, 9, 6, -7, -29, -38, 13, -10, -23, 18, -6, -23, -14, -26, -45, 12, 9, -30, -10, -14, -14, -10, -25, 0, 4, 6, 2, -9, 1, -3, -2, -8, -25, -17, -11, -4, -5, -10, -25, -61, -49, 3, 3, 0, -25, -43, -14, -5, -9, -8, -50, -25, -2, 2, -15, -15, -28, 3, 7, 6, -1, -2, 24, 21, 27, -9, 9, 5, -8, 9, -6, 3, -15, -64, -8, 6, 0, -17, -10, -41, -4, -8, -14, -45, -14, -13, 0, 10, -42, -30, -16, 15, 13, -22, -22, -24, -25, -17, -25, -29, -18, -5, -1, 3, 24, 9, -6, -3, -13, -47, -40, 9, 4, 0, -7, 3, -20, -8, -4, 8, -9, 23, -2, -5, 7, 1, -6, -8, -11, -28, -8, -14, 6, -15, 6, 0, -2, 8, -7, -1, -60, -70, -30, 0, 3, -5, -40, -56, -45, -9, 5, -1, -29, -19, -3, -5, -15, -15, -52, 0, 3, 2, -24, -40, -22, 11, 2, 4, 1, 1, 21, 33, 23, 5, -2, -13, 5, -19, -25, -13, 0, 21, -2, -26, -19, -34, 2, -17, -36, 22, -6, -15, -13, -31, -52, 13, 8, -30, -3, -5, -17, -10, -6, -14, -4, 8, -5, -11, -21, -1, -11, -19, 12, 10, -2, -25, -4, -5, -4, 7, 12, -7, -26, -36, -21, -11, -22, -31, -47, -27, 14, -7, -61, -48, -24, 5, 11, -22, -62, 4, 11, 4, -30, -12, 21, 10, -2, 0, 4, -12, -21, -13, 9, 5, 12, -28, -58, -17, -16, -31, -36, 6, -8, -17, -43, -57, -27, -13, -2, -10, -18, 7, 11, 4, 1, -11, 8, 20, 1, -18, -10, -20, -7, -16, -18, -31, -14, -9, -17, -49, -66, -4, 10, -8, 5, 0, -20, 25, 16, -2, 1, 11, -40, -5, 7, -18, -1, -17, -45, -19, -1, -14, 1, -4, 5, 22, 10, 11, 3, -17, -9, -4, -16, -9, -13, -15, 1, 0, 8, -21, -4, -13, 14, 15, -16, -18, -17, -1, 22, -7, -62, -38, -11, -5, 1, -46, -48, -20, -4, -6, -21, -19, -4, 5, -2, -3, -18, -20, -18, -11, 5, 16, 8, -61, -62, -3, 0, -8, -53, -8, -14, -1, -19, -79, -86, -29, 22, 5, -3, -12, -15, -24, 35, 1, 5, 15, 19, -2, -10, -14, -3, -17, 12, 13, -10, -26, -5, 2, -13, 4, 9, 2, -18, -27, -13, 27, 4, -19, -53, -29, 10, -31, -44, -37, -24, 9, 8, -48, -42, -8, 9, 9, -28, -28, 13, 22} +}; + +int32_t b_conv1[6] = {101, 113, 26, 14, 127, 61}; + +int32_t b_conv2[16] = {70, -89, 4, 48, 24, 127, -12, -74, 77, 36, -15, 13, -45, 21, 30, -28}; + +int32_t b_fc1[10] = {-77, -48, -24, -90, -35, -48, -89, -44, 127, 10}; + +#endif // __WEIGHTS__H__ diff --git a/sdk/software/examples/matmul_test/Makefile b/sdk/software/examples/matmul_test/Makefile new file mode 100644 index 0000000..79cb285 --- /dev/null +++ b/sdk/software/examples/matmul_test/Makefile @@ -0,0 +1,11 @@ +TARGET = matmul_test + +CFLAGS += -O3 -g + +C_SRCS := $(wildcard ./*.c ) + +OBJDIR = obj +COMMON_DIR = ../../bsp +GCC_DIR=../../../toolchains/loongson-gnu-toolchain-8.3-x86_64-loongarch32r-linux-gnusf-v2.0 +PICOLIBC_DIR=../../../toolchains/picolibc +include ../../bsp/common.mk diff --git a/sdk/software/examples/matmul_test/main.c b/sdk/software/examples/matmul_test/main.c new file mode 100644 index 0000000..fc36f77 --- /dev/null +++ b/sdk/software/examples/matmul_test/main.c @@ -0,0 +1,253 @@ +/** + * matmul_test - Standalone test example for matmul_axi_slave IP + * + * Tests the 4x4 matrix multiplier IP at 0x1f500000 (axiOut_7). + * Computes C = A x B using register-level access, then verifies + * against a software reference matmul. + * + * Register map (byte offsets from MATMUL_BASE): + * 0x000 CTRL [W] bit0=1 starts computation + * 0x004 STATUS [R] bit2=error, bit1=done, bit0=busy + * 0x008 SRC_BASE [R/W] source data base address + * 0x00c DST_BASE [R/W] result data base address + * 0x010 GROUP_NUM [R/W] number of matrix groups + * 0x020 A_BASE [R/W] 16 words of matrix A (row-major) + * 0x060 B_BASE [R/W] 16 words of matrix B (row-major) + * 0x0a0 C_BASE [R] 48 words of result C (3 words per element) + */ + +#include +#include + +/* ─── BSP globals (required by common.mk / picolibc) ─────────────── */ +unsigned long UART_BASE = 0xbf000000; +unsigned long CONFREG_TIMER_BASE = 0xbf20f100; +unsigned long CONFREG_CLOCKS_PER_SEC = 50000000L; +unsigned long CORE_CLOCKS_PER_SEC = 33000000L; + +/* ─── MATMUL IP register map ─────────────────────────────────────── */ +#define MATMUL_BASE 0x1f500000 + +#define MATMUL_CTRL (MATMUL_BASE + 0x000) +#define MATMUL_STATUS (MATMUL_BASE + 0x004) +#define MATMUL_SRC_BASE (MATMUL_BASE + 0x008) +#define MATMUL_DST_BASE (MATMUL_BASE + 0x00c) +#define MATMUL_GROUP_NUM (MATMUL_BASE + 0x010) +#define MATMUL_A_BASE (MATMUL_BASE + 0x020) +#define MATMUL_B_BASE (MATMUL_BASE + 0x060) +#define MATMUL_C_BASE (MATMUL_BASE + 0x0a0) + +/* CTRL bits */ +#define CTRL_START 0x1 + +/* STATUS bits */ +#define STATUS_BUSY 0x1 +#define STATUS_DONE 0x2 +#define STATUS_ERROR 0x4 + +/* ─── Convenience macros ─────────────────────────────────────────── */ +#define REG_WR(addr, val) (*(volatile uint32_t *)(addr) = (uint32_t)(val)) +#define REG_RD(addr) (*(volatile uint32_t *)(addr)) + +/* ─── Test data ───────────────────────────────────────────────────── + * Test group 0: + * A = identity (4x4) + * B = diagonal {2, 3, 4, 5} + * Expected C = B (since identity * X = X) + * + * Test group 1: + * A = [[1,2,0,0], [0,0,3,0], [0,0,0,4], [0,0,0,0]] + * B = [[5,0,0,0], [6,0,0,0], [0,7,0,0], [0,0,8,0]] + * Expected C computed by software reference below + * + * Each A/B is 16 uint32_t, row-major. Unused slots in sub-4x4 matrices + * are 0 as specified. + */ + +#define N_GROUPS 2 + +static const uint32_t test_a[N_GROUPS][16] = { + /* group 0: identity */ + { 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 }, + /* group 1 */ + { 1, 2, 0, 0, + 0, 0, 3, 0, + 0, 0, 0, 4, + 0, 0, 0, 0 }, +}; + +static const uint32_t test_b[N_GROUPS][16] = { + /* group 0: diagonal */ + { 2, 0, 0, 0, + 0, 3, 0, 0, + 0, 0, 4, 0, + 0, 0, 0, 5 }, + /* group 1 */ + { 5, 0, 0, 0, + 6, 0, 0, 0, + 0, 7, 0, 0, + 0, 0, 8, 0 }, +}; + +/* ─── Software reference matmul ───────────────────────────────────── + * Returns the 66-bit result element as two 32-bit halves: + * words[0] = result[31:0] + * words[1] = result[63:32] + * words[2] = result[65:64] (only 2 bits, zero-extended to 32) + */ +static void matmul_ref_u32( + const uint32_t a[16], + const uint32_t b[16], + uint32_t c_words[48]) +{ + int row, col, k; + for (row = 0; row < 4; row++) { + for (col = 0; col < 4; col++) { + uint64_t acc = 0; + for (k = 0; k < 4; k++) { + acc += (uint64_t)a[row * 4 + k] * (uint64_t)b[k * 4 + col]; + } + int idx = (row * 4 + col) * 3; + c_words[idx + 0] = (uint32_t)(acc & 0xFFFFFFFFULL); + c_words[idx + 1] = (uint32_t)((acc >> 32) & 0xFFFFFFFFULL); + c_words[idx + 2] = (uint32_t)((acc >> 64) & 0x3ULL); + } + } +} + +/* ─── Write 16 words of matrix data to the IP ────────────────────── */ +static void write_matrix(uint32_t base_addr, const uint32_t data[16]) +{ + int i; + for (i = 0; i < 16; i++) { + REG_WR(base_addr + i * 4, data[i]); + } +} + +/* ─── Read 48 words of result C from the IP ──────────────────────── */ +static void read_result(uint32_t c_words[48]) +{ + int i; + for (i = 0; i < 48; i++) { + c_words[i] = REG_RD(MATMUL_C_BASE + i * 4); + } +} + +/* ─── Wait until IP is done, return 0 on success, -1 on error ────── */ +static int wait_done(void) +{ + while (1) { + uint32_t status = REG_RD(MATMUL_STATUS); + if (status & STATUS_ERROR) { + printf("[ERROR] matmul IP reports error (status=0x%08lx)\n", + (unsigned long)status); + return -1; + } + if (status & STATUS_DONE) { + return 0; + } + } +} + +/* ─── Verify group result against expected C words ───────────────── */ +static int verify_group(int group, const uint32_t got[48], + const uint32_t expected[48]) +{ + int i, errors = 0; + for (i = 0; i < 48; i++) { + if (got[i] != expected[i]) { + if (errors < 8) { + int elem = i / 3; + int sub = i % 3; /* 0=low, 1=high, 2=overflow */ + const char *sub_name[] = {"low", "high", "ovf"}; + printf(" group%d C[%d][%d].%s: got 0x%08lx exp 0x%08lx\n", + group, elem / 4, elem % 4, sub_name[sub], + (unsigned long)got[i], (unsigned long)expected[i]); + } + errors++; + } + } + if (errors > 8) { + printf(" ... and %d more mismatches\n", errors - 8); + } + return errors; +} + +/* ─── Main ────────────────────────────────────────────────────────── */ +int main(void) +{ + int g, pass_count = 0, fail_count = 0; + + printf("\n===== MATMUL IP Test =====\n"); + printf("Base addr : 0x%08lx\n", (unsigned long)MATMUL_BASE); + printf("Groups : %d\n", N_GROUPS); + printf("===========================\n"); + + /* Write group count */ + REG_WR(MATMUL_GROUP_NUM, N_GROUPS); + + /* For this register-level example, SRC_BASE / DST_BASE are + * informational only (no DMA). Set them to 0. */ + REG_WR(MATMUL_SRC_BASE, 0); + REG_WR(MATMUL_DST_BASE, 0); + + /* ── Run each test group ──────────────────────────────────── */ + for (g = 0; g < N_GROUPS; g++) { + uint32_t expected_c[48]; + uint32_t got_c[48]; + int errs; + + printf("\n--- Group %d ---\n", g); + printf("Loading A[16] and B[16] into IP...\n"); + + write_matrix(MATMUL_A_BASE, test_a[g]); + write_matrix(MATMUL_B_BASE, test_b[g]); + + /* Clear any stale done/error flags */ + REG_WR(MATMUL_STATUS, STATUS_DONE | STATUS_ERROR); + + printf("Starting computation (CTRL=0x%x)...\n", CTRL_START); + REG_WR(MATMUL_CTRL, CTRL_START); + + printf("Waiting for done...\n"); + if (wait_done() != 0) { + fail_count++; + continue; + } + + printf("Reading C[48] from IP...\n"); + read_result(got_c); + + printf("Computing software reference...\n"); + matmul_ref_u32(test_a[g], test_b[g], expected_c); + + printf("Verifying...\n"); + errs = verify_group(g, got_c, expected_c); + + if (errs == 0) { + printf("Group %d: PASS\n", g); + pass_count++; + } else { + printf("Group %d: FAIL (%d mismatches)\n", g, errs); + fail_count++; + } + } + + /* ── Final report ─────────────────────────────────────────── */ + printf("\n============================\n"); + printf("RESULTS: %d passed, %d failed\n", pass_count, fail_count); + if (fail_count == 0) { + printf("ALL TESTS PASSED\n"); + } else { + printf("SOME TESTS FAILED\n"); + } + printf("============================\n"); + + /* Signal completion to testbench via UART */ + printf("MATMUL_DONE\n"); + + return (fail_count == 0) ? 0 : 1; +} diff --git a/sdk/software/examples/pinball_game/Makefile b/sdk/software/examples/pinball_game/Makefile new file mode 100644 index 0000000..31b0ccc --- /dev/null +++ b/sdk/software/examples/pinball_game/Makefile @@ -0,0 +1,11 @@ +TARGET = pinball_game + +CFLAGS += -O3 -g + +C_SRCS := $(wildcard ./*.c ) + +OBJDIR = obj +COMMON_DIR = ../../bsp +GCC_DIR=../../../toolchains/loongson-gnu-toolchain-8.3-x86_64-loongarch32r-linux-gnusf-v2.0 +PICOLIBC_DIR=../../../toolchains/picolibc +include ../../bsp/common.mk diff --git a/sdk/software/examples/pinball_game/main.c b/sdk/software/examples/pinball_game/main.c new file mode 100644 index 0000000..739ce6f --- /dev/null +++ b/sdk/software/examples/pinball_game/main.c @@ -0,0 +1,249 @@ +#include +#include +#include +#include + +#include "common_func.h" +#include "dvi.h" +#include "seg7.h" +#include "led.h" +#include "core_time.h" + +//BSP板级支持包所需全局变量 +unsigned long UART_BASE = 0xbf000000; //UART16550的虚地址 +unsigned long CONFREG_TIMER_BASE = 0xbf20f100; //CONFREG计数器的虚地址 +unsigned long CONFREG_CLOCKS_PER_SEC = 50000000L; //CONFREG时钟频率 +unsigned long CORE_CLOCKS_PER_SEC = 33000000L; //处理器核时钟频率 + + +int Ball_x = 400; +int Ball_y = 100; +int Ball_r = 5; + +volatile int Plane_x = 400; +int Plane_y = 400; +int Plane_l = 100; +int Plane_w = 5; + +// ball move direction +int Ball_dx = 2; +int Ball_dy = 2; + +// ball move direction +int Plane_dx = 20; + +int score = 0; + +volatile int delay_time = 0; + +void Timer_IntrHandler(void); +void Button_IntrHandler(unsigned char button_state); + +void showGameOver(void); + +int chooseFlag = 1; + +volatile int flag = 1; + +void InterruptInit(void) +{ + // Enable button and timer Interrupt + RegWrite(0xbf20f004,0x0f);//edge + RegWrite(0xbf20f008,0x1f);//pol + RegWrite(0xbf20f00c,0x1f);//clr + RegWrite(0xbf20f000,0x1f);//en + + RegWrite(0xbf20f104,25000000);//timercmp 500ms + RegWrite(0xbf20f108,0x1);//timeren +} + +void showGameOver(void); + +void chooseTime(void) +{ + printf("Please Choosetime !!\n"); + while (flag); + printf("Choosetime:%d\n",delay_time); + chooseFlag = 0; + setSegNum(0,0,0,0); +} + +int main(int argc, char** argv) +{ + InterruptInit(); + + chooseTime(); + + while (1) { + + DVI_Draw_Rect(Plane_x,Plane_y,Plane_l,Plane_w); + + DVI_Draw_SQU(Ball_x,Ball_y,Ball_r); + + delay_ms(delay_time); + + // refresh place + Ball_x += Ball_dx; + Ball_y += Ball_dy; + + delay_ms(delay_time); + + if(Ball_y < 2) + { + Ball_y = 2; + Ball_dy = -Ball_dy; + } + + if(Ball_y > 600) + { + Ball_y = 600; + Ball_dy = -Ball_dy; + } + + if(Ball_x < 2) + { + Ball_x = 2; + Ball_dx = -Ball_dx; + } + + if(Ball_x > 800) + { + Ball_x = 800; + Ball_dx = -Ball_dx; + } + + if( Ball_y > 410 ) + break; + + if((Plane_y - Ball_y) < 2 && (Ball_x > (Plane_x - Plane_l)) && (Ball_x < (Plane_x + Plane_l))) + { + Ball_dy = -Ball_dy; + score++; + } + + } + + showGameOver(); + + return 0; + +} + +void HWI0_IntrHandler(void) +{ + unsigned int int_state; + int_state = RegRead(0xbf20f014); + + if((int_state & 0x10) == 0x10){ + Timer_IntrHandler(); + } + else if(int_state & 0xf){ + Button_IntrHandler(int_state & 0xf); + } +} + +void Timer_IntrHandler(void) +{ + if (!chooseFlag) + { + // refreshing the DVI output + if (score > 9) + { + setSegNum(1,score/10,1,score%10); + }else{ + setSegNum(0,0,1,score); + } + } + RegWrite(0xbf20f108,0); + RegWrite(0xbf20f108,1); +} + +void Button_IntrHandler(unsigned char button_state) +{ + if (chooseFlag) + { + if (button_state & 0b1) + { + delay_time++; + + if (delay_time > 20) + { + delay_time = 20; + } + printf("button1\n"); + RegWrite(0xbf20f00c,0x1);//clr + + }else if (button_state & 0b1000) + { + delay_time--; + if (delay_time < 1) + { + delay_time = 1; + } + printf("button4\n"); + RegWrite(0xbf20f00c,0x8);//clr + }else if (button_state & 0b100) + { + flag = 0; + printf("button3\n"); + RegWrite(0xbf20f00c,0x4);//clr + }else{ + printf("button2\n"); + RegWrite(0xbf20f00c,0x2);//clr + } + + setSegNum(1,delay_time/10,1,delay_time%10); + + } + + if (!chooseFlag) + { + + if (button_state & 0b1) + { + Plane_x += Plane_dx; + if (Plane_x + Plane_l > 800) + { + Plane_x = 800 - Plane_l; + } + RegWrite(0xbf20f00c,0x1);//clr + }else if (button_state & 0b1000) + { + Plane_x -= Plane_dx; + if (Plane_x - Plane_l < 0) + { + Plane_x = Plane_l; + } + RegWrite(0xbf20f00c,0x8);//clr + }else if (button_state & 0b0100){ + RegWrite(0xbf20f00c,0x4);//clr + }else if (button_state & 0b0010){ + RegWrite(0xbf20f00c,0x2);//clr + } + } +} + +void showGameOver(void) +{ + + printf("GameOver\n"); + + while (1) + { + setLedPin(0b1000000000000001);delay_ms(50); + setLedPin(0b1100000000000011);delay_ms(50); + setLedPin(0b1110000000000111);delay_ms(50); + setLedPin(0b1111000000001111);delay_ms(50); + setLedPin(0b1111100000011111);delay_ms(50); + setLedPin(0b1111110000111111);delay_ms(50); + setLedPin(0b1111111001111111);delay_ms(50); + setLedPin(0b1111111111111111);delay_ms(50); + setLedPin(0b1111111001111111);delay_ms(50); + setLedPin(0b1111110000111111);delay_ms(50); + setLedPin(0b1111100000011111);delay_ms(50); + setLedPin(0b1111000000001111);delay_ms(50); + setLedPin(0b1110000000000111);delay_ms(50); + setLedPin(0b1100000000000011);delay_ms(50); + setLedPin(0b1000000000000001);delay_ms(50); + } +} diff --git a/sdk/toolchains b/sdk/toolchains new file mode 120000 index 0000000..f2b6cdc --- /dev/null +++ b/sdk/toolchains @@ -0,0 +1 @@ +/opt/la32r-toolchain \ No newline at end of file diff --git a/sim/matmul_flow_tb.v b/sim/matmul_flow_tb.v new file mode 100644 index 0000000..3d23c00 --- /dev/null +++ b/sim/matmul_flow_tb.v @@ -0,0 +1,396 @@ +`timescale 1ns / 1ps +`include "config.h" + +`define UART_PSEL u_soc_top.u_axi_uart_controller.uart0.PSEL +`define UART_PENABLE u_soc_top.u_axi_uart_controller.uart0.PENABLE +`define UART_PWRITE u_soc_top.u_axi_uart_controller.uart0.PWRITE +`define UART_WADDR u_soc_top.u_axi_uart_controller.uart0.PADDR[7:0] +`define UART_WDATA u_soc_top.u_axi_uart_controller.uart0.PWDATA[7:0] + +module tb_matmul_flow; + +localparam EXTRAM_WORDS = 1048576; +localparam DONE_LEN = 11; +localparam PC_CALL_MAIN = 32'h1c0001bc; +localparam PC_MAIN_ENTRY = 32'h1c000240; +localparam PC_MATMUL_INIT = 32'h1c000274; +localparam PC_MATMUL_LOAD_LOOP = 32'h1c0002f0; +localparam PC_MATMUL_WAIT = 32'h1c00045c; +localparam PC_MATMUL_STORE = 32'h1c000480; +localparam PC_DONE_PRINTF = 32'h1c0004a8; + +reg reset; +reg clk; +reg [3:0] touch_btn; +reg [31:0] dip_sw; + +wire UART_RX; +wire UART_TX; +wire [2:0] video_red; +wire [2:0] video_green; +wire [1:0] video_blue; +wire video_hsync; +wire video_vsync; +wire video_clk; +wire video_de; +wire [15:0] leds; +wire [7:0] dpy0; +wire [7:0] dpy1; +wire [19:0] base_ram_addr; +wire [3:0] base_ram_be_n; +wire base_ram_ce_n; +wire base_ram_oe_n; +wire base_ram_we_n; +wire [19:0] ext_ram_addr; +wire [3:0] ext_ram_be_n; +wire ext_ram_ce_n; +wire ext_ram_oe_n; +wire ext_ram_we_n; +wire [31:0] base_ram_data; +wire [31:0] ext_ram_data; + +reg [31:0] expected_mem [0:EXTRAM_WORDS-1]; +reg [8*256-1:0] input_hex; +reg [8*256-1:0] expected_hex; +reg [31:0] group_num; +reg [31:0] timeout_cycles; +reg [31:0] progress_cycles; +reg [31:0] uart_shift [0:DONE_LEN-1]; +reg done_seen; +integer i; +integer err_count; +integer check_words; +integer timeout_count; +integer uart_count; +integer matmul_write_rsp_count; +integer matmul_read_rsp_count; +integer ram_read_rsp_count; +integer cpu_read_req_count; +integer cpu_write_rsp_count; +reg [31:0] last_debug_pc; +reg [31:0] same_pc_cycles; +reg main_seen; +reg matmul_access_seen; +reg done_printf_seen; +reg [8*32-1:0] phase_text; + +initial begin + clk = 1'b0; + forever #10 clk = ~clk; +end + +initial begin + input_hex = "../../../../../../tools/matmul_testdata/extram_input_4mb.hex"; + expected_hex = "../../../../../../tools/matmul_testdata/extram_expected_4mb.hex"; + group_num = 32'd10; + timeout_cycles = 32'd5000000; + progress_cycles = 32'd500000; + + if (!$value$plusargs("INPUT_HEX=%s", input_hex)) begin + end + if (!$value$plusargs("EXPECTED_HEX=%s", expected_hex)) begin + end + if (!$value$plusargs("GROUPS=%d", group_num)) begin + end + if (!$value$plusargs("TIMEOUT_CYCLES=%d", timeout_cycles)) begin + end + if (!$value$plusargs("PROGRESS_CYCLES=%d", progress_cycles)) begin + end + + reset = 1'b1; + touch_btn = 4'h0; + dip_sw = 32'h0000_abcd; + done_seen = 1'b0; + timeout_count = 0; + uart_count = 0; + matmul_write_rsp_count = 0; + matmul_read_rsp_count = 0; + ram_read_rsp_count = 0; + cpu_read_req_count = 0; + cpu_write_rsp_count = 0; + last_debug_pc = 32'b0; + same_pc_cycles = 32'b0; + main_seen = 1'b0; + matmul_access_seen = 1'b0; + done_printf_seen = 1'b0; + + for (i = 0; i < DONE_LEN; i = i + 1) begin + uart_shift[i] = 32'b0; + end + + $display("[MATMUL_TB] load ExtRAM input: %0s", input_hex); + $display("[MATMUL_TB] load expected image: %0s", expected_hex); + $display("[MATMUL_TB] groups: %0d", group_num); + $readmemh(input_hex, ext_sram_sp.BRAM); + $readmemh(expected_hex, expected_mem); + + #2000; + $display("[MATMUL_TB] release reset and start timing"); + reset = 1'b0; +end + +always @(posedge clk) begin + if (!reset && !done_seen) begin + timeout_count <= timeout_count + 1; + + if (u_soc_top.debug_wb_pc == last_debug_pc) begin + same_pc_cycles <= same_pc_cycles + 1; + end else begin + last_debug_pc <= u_soc_top.debug_wb_pc; + same_pc_cycles <= 32'b0; + end + + if (u_soc_top.cpu_arvalid && u_soc_top.cpu_arready) begin + cpu_read_req_count <= cpu_read_req_count + 1; + end + if (u_soc_top.cpu_bvalid && u_soc_top.cpu_bready) begin + cpu_write_rsp_count <= cpu_write_rsp_count + 1; + end + if (u_soc_top.ram_rvalid && u_soc_top.ram_rready) begin + ram_read_rsp_count <= ram_read_rsp_count + 1; + end + if (u_soc_top.axiOut_7_bvalid && u_soc_top.axiOut_7_bready) begin + matmul_write_rsp_count <= matmul_write_rsp_count + 1; + matmul_access_seen <= 1'b1; + end + if (u_soc_top.axiOut_7_rvalid && u_soc_top.axiOut_7_rready) begin + matmul_read_rsp_count <= matmul_read_rsp_count + 1; + matmul_access_seen <= 1'b1; + end + + if (!main_seen && (u_soc_top.debug_wb_pc >= PC_MAIN_ENTRY)) begin + main_seen <= 1'b1; + $display("[MATMUL_TB] stage: entered main at cycles=%0d pc=%08x inst=%08x", + timeout_count, u_soc_top.debug_wb_pc, u_soc_top.debug_wb_inst); + end + if (!done_printf_seen && (u_soc_top.debug_wb_pc >= PC_DONE_PRINTF) && + (u_soc_top.debug_wb_pc < 32'h1c000780)) begin + done_printf_seen <= 1'b1; + $display("[MATMUL_TB] stage: software reached MATMUL_DONE printf path at cycles=%0d pc=%08x", + timeout_count, u_soc_top.debug_wb_pc); + end + + if ((progress_cycles != 0) && (timeout_count != 0) && + ((timeout_count % progress_cycles) == 0)) begin + print_progress; + end + if (timeout_count >= timeout_cycles) begin + $display(""); + $display("[MATMUL_TB] TIMEOUT: MATMUL_DONE was not printed"); + $display("[MATMUL_TB] debug_wb_pc = %08x", u_soc_top.debug_wb_pc); + print_progress; + $display("[MATMUL_TB] matmul busy=%0d done=%0d error=%0d", + u_soc_top.u_matmul_axi_slave.busy, + u_soc_top.u_matmul_axi_slave.done, + u_soc_top.u_matmul_axi_slave.error); + $finish; + end + end +end + +soc_top #(.SIMULATION(1'b1)) u_soc_top ( + .clk (clk), + .reset (reset), + .touch_btn (touch_btn), + .dip_sw (dip_sw), + .video_red (video_red), + .video_green (video_green), + .video_blue (video_blue), + .video_hsync (video_hsync), + .video_vsync (video_vsync), + .video_clk (video_clk), + .video_de (video_de), + .leds (leds), + .dpy0 (dpy0), + .dpy1 (dpy1), + .base_ram_addr (base_ram_addr), + .base_ram_be_n (base_ram_be_n), + .base_ram_ce_n (base_ram_ce_n), + .base_ram_oe_n (base_ram_oe_n), + .base_ram_we_n (base_ram_we_n), + .ext_ram_addr (ext_ram_addr), + .ext_ram_be_n (ext_ram_be_n), + .ext_ram_ce_n (ext_ram_ce_n), + .ext_ram_oe_n (ext_ram_oe_n), + .ext_ram_we_n (ext_ram_we_n), + .base_ram_data (base_ram_data), + .ext_ram_data (ext_ram_data), + .UART_RX (UART_RX), + .UART_TX (UART_TX) +); + +sram_sp #( + .AW(20), + .Init_File(`SRAM_Init_File) +) base_sram_sp ( + .ram_addr (base_ram_addr), + .ram_be_n (base_ram_be_n), + .ram_ce_n (base_ram_ce_n), + .ram_oe_n (base_ram_oe_n), + .ram_we_n (base_ram_we_n), + .ram_data (base_ram_data) +); + +sram_sp #( + .AW(20), + .Init_File("none") +) ext_sram_sp ( + .ram_addr (ext_ram_addr), + .ram_be_n (ext_ram_be_n), + .ram_ce_n (ext_ram_ce_n), + .ram_oe_n (ext_ram_oe_n), + .ram_we_n (ext_ram_we_n), + .ram_data (ext_ram_data) +); + +wire uart_wen; +wire uart_display; +wire [7:0] uart_data; +assign uart_wen = (`UART_PSEL == 1'b1) && (`UART_PENABLE == 1'b1) && (`UART_PWRITE == 1'b1); +assign uart_display = uart_wen && (`UART_WADDR == 8'h0); +assign uart_data = `UART_WDATA; + +always @(posedge clk) begin + if (uart_display) begin + uart_count <= uart_count + 1; + $write("%c", uart_data); + for (i = 0; i < DONE_LEN-1; i = i + 1) begin + uart_shift[i] <= uart_shift[i+1]; + end + uart_shift[DONE_LEN-1] <= {24'b0, uart_data}; + + if ((uart_shift[1][7:0] == "M") && + (uart_shift[2][7:0] == "A") && + (uart_shift[3][7:0] == "T") && + (uart_shift[4][7:0] == "M") && + (uart_shift[5][7:0] == "U") && + (uart_shift[6][7:0] == "L") && + (uart_shift[7][7:0] == "_") && + (uart_shift[8][7:0] == "D") && + (uart_shift[9][7:0] == "O") && + (uart_shift[10][7:0] == "N") && + (uart_data == "E")) begin + done_seen <= 1'b1; + check_result; + end + end +end + +task update_phase_text; + begin + if (u_soc_top.debug_wb_pc == PC_CALL_MAIN) begin + if (same_pc_cycles >= progress_cycles) begin + phase_text = "STUCK_AT_CALL_MAIN"; + end else begin + phase_text = "BOOT_CALL_MAIN"; + end + end else if (u_soc_top.debug_wb_pc < PC_MAIN_ENTRY) begin + phase_text = "BOOT"; + end else if (u_soc_top.debug_wb_pc < PC_MATMUL_INIT) begin + phase_text = "MAIN_PROLOGUE"; + end else if (u_soc_top.debug_wb_pc < PC_MATMUL_LOAD_LOOP) begin + phase_text = "MATMUL_REG_INIT"; + end else if (u_soc_top.debug_wb_pc < PC_MATMUL_WAIT) begin + phase_text = "LOAD_A_B_START_HW"; + end else if (u_soc_top.debug_wb_pc < PC_MATMUL_STORE) begin + phase_text = "POLL_MATMUL_DONE"; + end else if (u_soc_top.debug_wb_pc < PC_DONE_PRINTF) begin + phase_text = "STORE_RESULTS"; + end else if (u_soc_top.debug_wb_pc < 32'h1c000780) begin + phase_text = "PRINT_DONE"; + end else begin + phase_text = "LIB_OR_TRAP"; + end + end +endtask + +task print_progress; + begin + update_phase_text; + $display("[MATMUL_TB] progress cycles=%0d phase=%0s pc=%08x inst=%08x same_pc_cycles=%0d uart_bytes=%0d", + timeout_count, phase_text, u_soc_top.debug_wb_pc, + u_soc_top.debug_wb_inst, same_pc_cycles, uart_count); + $display("[MATMUL_TB] bus cpu_ar=%0d/%0d addr=%08x cpu_aw=%0d/%0d addr=%08x cpu_w=%0d/%0d cpu_b=%0d/%0d cpu_reads=%0d cpu_write_rsps=%0d ram_r_rsps=%0d", + u_soc_top.cpu_arvalid, u_soc_top.cpu_arready, u_soc_top.cpu_araddr, + u_soc_top.cpu_awvalid, u_soc_top.cpu_awready, u_soc_top.cpu_awaddr, + u_soc_top.cpu_wvalid, u_soc_top.cpu_wready, + u_soc_top.cpu_bvalid, u_soc_top.cpu_bready, + cpu_read_req_count, cpu_write_rsp_count, ram_read_rsp_count); + $display("[MATMUL_TB] cpu_bridge ws_valid=%0d inst_req=%0d/%0d inst_addr=%08x inst_ret=%0d data_wr=%0d/%0d data_wr_addr=%08x write_state=%0d write_wait=%0d read_state=%0d b=%0d/%0d", + u_soc_top.u_cpu.ws_valid, + u_soc_top.u_cpu.inst_rd_req, + u_soc_top.u_cpu.inst_rd_rdy, + u_soc_top.u_cpu.inst_rd_addr, + u_soc_top.u_cpu.inst_ret_valid, + u_soc_top.u_cpu.data_wr_req, + u_soc_top.u_cpu.data_wr_rdy, + u_soc_top.u_cpu.data_wr_addr, + u_soc_top.u_cpu.axi_bridge.write_requst_state, + u_soc_top.u_cpu.axi_bridge.write_wait_enable, + u_soc_top.u_cpu.axi_bridge.read_requst_state, + u_soc_top.u_cpu.bvalid, + u_soc_top.u_cpu.bready); + $display("[MATMUL_TB] uart_axi aw=%0d/%0d addr=%08x w=%0d/%0d strb=%x data=%08x b=%0d/%0d sel_wr=%0d apb_psel=%0d penable=%0d pwrite=%0d paddr=%02x", + u_soc_top.u_axi_uart_controller.axi_s_awvalid, + u_soc_top.u_axi_uart_controller.axi_s_awready, + u_soc_top.u_axi_uart_controller.axi_s_awaddr, + u_soc_top.u_axi_uart_controller.axi_s_wvalid, + u_soc_top.u_axi_uart_controller.axi_s_wready, + u_soc_top.u_axi_uart_controller.axi_s_wstrb, + u_soc_top.u_axi_uart_controller.axi_s_wdata, + u_soc_top.u_axi_uart_controller.axi_s_bvalid, + u_soc_top.u_axi_uart_controller.axi_s_bready, + u_soc_top.u_axi_uart_controller.AA_axi2apb_bridge_cpu.axi_s_sel_wr, + u_soc_top.u_axi_uart_controller.uart0.PSEL, + u_soc_top.u_axi_uart_controller.uart0.PENABLE, + u_soc_top.u_axi_uart_controller.uart0.PWRITE, + u_soc_top.u_axi_uart_controller.uart0.PADDR); + $display("[MATMUL_TB] matmul busy=%0d done=%0d error=%0d access_seen=%0d write_rsps=%0d read_rsps=%0d axi7_aw=%0d/%0d addr=%08x axi7_w=%0d/%0d axi7_b=%0d/%0d axi7_ar=%0d/%0d addr=%08x axi7_r=%0d/%0d", + u_soc_top.u_matmul_axi_slave.busy, + u_soc_top.u_matmul_axi_slave.done, + u_soc_top.u_matmul_axi_slave.error, + matmul_access_seen, + matmul_write_rsp_count, + matmul_read_rsp_count, + u_soc_top.axiOut_7_awvalid, + u_soc_top.axiOut_7_awready, + u_soc_top.axiOut_7_awaddr, + u_soc_top.axiOut_7_wvalid, + u_soc_top.axiOut_7_wready, + u_soc_top.axiOut_7_bvalid, + u_soc_top.axiOut_7_bready, + u_soc_top.axiOut_7_arvalid, + u_soc_top.axiOut_7_arready, + u_soc_top.axiOut_7_araddr, + u_soc_top.axiOut_7_rvalid, + u_soc_top.axiOut_7_rready); + end +endtask + +task check_result; + begin + $display(""); + $display("[MATMUL_TB] MATMUL_DONE captured after %0d clk cycles", timeout_count); + + err_count = 0; + check_words = group_num * 80; + for (i = 0; i < check_words; i = i + 1) begin + if (ext_sram_sp.BRAM[i] !== expected_mem[i]) begin + if (err_count < 16) begin + $display("[MATMUL_TB] mismatch word[%0d]: got=%08x expected=%08x", + i, ext_sram_sp.BRAM[i], expected_mem[i]); + end + err_count = err_count + 1; + end + end + + if (err_count == 0) begin + $display("[MATMUL_TB] PASS: source and result regions match expected image"); + end else begin + $display("[MATMUL_TB] FAIL: %0d mismatched words", err_count); + end + $finish; + end +endtask + +endmodule diff --git a/sim/mycpu_tb.v b/sim/mycpu_tb.v new file mode 100644 index 0000000..fc29a0b --- /dev/null +++ b/sim/mycpu_tb.v @@ -0,0 +1,230 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ +`timescale 1ns / 1ps +`include "config.h" +// `define FFT_OUTPUT_TXT + +`define UART_PSEL u_soc_top.u_axi_uart_controller.uart0.PSEL +`define UART_PENBLE u_soc_top.u_axi_uart_controller.uart0.PENABLE +`define UART_PWRITE u_soc_top.u_axi_uart_controller.uart0.PWRITE +`define UART_WADDR u_soc_top.u_axi_uart_controller.uart0.PADDR[7:0] +`define UART_WDATA u_soc_top.u_axi_uart_controller.uart0.PWDATA[7:0] +`define END_PC 32'h1c000200 + +module tb_top( ); +reg reset; +reg clk; +reg [3:0] touch_btn; +reg [31:0] dip_sw; + +wire UART_RX; +wire UART_TX; +wire [2:0] video_red; +wire [2:0] video_green; +wire [1:0] video_blue; +wire video_hsync; +wire video_vsync; +wire video_clk; +wire video_de; +wire [15:0] leds; +wire [7:0] dpy0; +wire [7:0] dpy1; +wire [19:0] base_ram_addr; +wire [ 3:0] base_ram_be_n; +wire base_ram_ce_n; +wire base_ram_oe_n; +wire base_ram_we_n; +wire [19:0] ext_ram_addr; +wire [ 3:0] ext_ram_be_n; +wire ext_ram_ce_n; +wire ext_ram_oe_n; +wire ext_ram_we_n; +wire [31:0] base_ram_data; +wire [31:0] ext_ram_data; + +//产生时钟与复位信号 +initial begin + clk = 1'b0; + reset = 1'b1; + dip_sw = 32'h0; + #2000; + reset = 1'b0; +end +always #10 clk=~clk; + +//产生按键信号 +initial begin + touch_btn = 4'h0; + dip_sw = 32'h0000_abcd; + + #3000000; + + #100000 + touch_btn = 4'b0001; + #50 + touch_btn = 4'b0000; + + #100000 + touch_btn = 4'b0010; + #50 + touch_btn = 4'b0000; + + #100000 + touch_btn = 4'b0100; + #50 + touch_btn = 4'b0000; + + #100000 + touch_btn = 4'b1000; + #50 + touch_btn = 4'b0000; + +end + +soc_top #(.SIMULATION(1'b1)) u_soc_top ( + .clk ( clk ), + .reset ( reset ), + .touch_btn ( touch_btn ), + .dip_sw ( dip_sw ), + + .video_red ( video_red ), + .video_green ( video_green ), + .video_blue ( video_blue ), + .video_hsync ( video_hsync ), + .video_vsync ( video_vsync ), + .video_clk ( video_clk ), + .video_de ( video_de ), + .leds ( leds ), + .dpy0 ( dpy0 ), + .dpy1 ( dpy1 ), + + .base_ram_addr ( base_ram_addr ), + .base_ram_be_n ( base_ram_be_n ), + .base_ram_ce_n ( base_ram_ce_n ), + .base_ram_oe_n ( base_ram_oe_n ), + .base_ram_we_n ( base_ram_we_n ), + .ext_ram_addr ( ext_ram_addr ), + .ext_ram_be_n ( ext_ram_be_n ), + .ext_ram_ce_n ( ext_ram_ce_n ), + .ext_ram_oe_n ( ext_ram_oe_n ), + .ext_ram_we_n ( ext_ram_we_n ), + + .base_ram_data ( base_ram_data ), + .ext_ram_data ( ext_ram_data ), + + .UART_RX ( UART_RX ), + .UART_TX ( UART_TX ) +); + +sram_sp #( + .AW ( 18 ), + .Init_File(`SRAM_Init_File)) +base_sram_sp ( + .ram_addr ( base_ram_addr ), + .ram_be_n ( base_ram_be_n ), + .ram_ce_n ( base_ram_ce_n ), + .ram_oe_n ( base_ram_oe_n ), + .ram_we_n ( base_ram_we_n ), + + .ram_data ( base_ram_data ) +); + +sram_sp #( + .AW ( 18 ), + .Init_File(`SRAM_Init_File)) +ext_sram_sp ( + .ram_addr ( ext_ram_addr ), + .ram_be_n ( ext_ram_be_n ), + .ram_ce_n ( ext_ram_ce_n ), + .ram_oe_n ( ext_ram_oe_n ), + .ram_we_n ( ext_ram_we_n ), + + .ram_data ( ext_ram_data ) +); + +//模拟串口打印 +wire uart_display; +wire [7:0] uart_data; +wire uart_wen; +assign uart_wen = (`UART_PSEL == 1'b1) && (`UART_PENBLE == 1'b1) && (`UART_PWRITE == 1'b1); +assign uart_display = (uart_wen == 1'b1) && (`UART_WADDR == 8'h0); +assign uart_data = `UART_WDATA; + +always @(posedge clk) +begin + if(uart_display) + begin + if(uart_data==8'hff) + begin + ;//$finish; + end + else + begin + $write("%c",uart_data); + end + end +end + +//仿真结束 +wire [31:0] debug_wb_pc; +assign debug_wb_pc = u_soc_top.debug_wb_pc; +wire test_end = debug_wb_pc==`END_PC; +always @(posedge u_soc_top.cpu_clk) +begin + if (!u_soc_top.cpu_resetn) begin + end + else if(test_end) begin + $display("=============================================================="); + $display("Test end!"); + $finish; + end +end + +//FFT测试结果输出 +`ifdef FFT_OUTPUT_TXT + integer fft_output_re; + integer fft_output_im; + initial begin + fft_output_re = $fopen("../../../../../../python/fft512_output_re.txt", "w"); + fft_output_im = $fopen("../../../../../../python/fft512_output_im.txt", "w"); + forever begin + @(posedge u_soc_top.u_axi_fft_top.u_axi_fft_wrap.aclk); + if(u_soc_top.u_axi_fft_top.u_axi_fft_wrap.valid_out) begin + $fwrite(fft_output_re, "%04h\n", u_soc_top.u_axi_fft_top.u_axi_fft_wrap.y_re); + $fwrite(fft_output_im, "%04h\n", u_soc_top.u_axi_fft_top.u_axi_fft_wrap.y_im); + end + end + end +`endif + +endmodule diff --git a/sim/sram.v b/sim/sram.v new file mode 100644 index 0000000..8f2ace7 --- /dev/null +++ b/sim/sram.v @@ -0,0 +1,52 @@ +`timescale 1ns/100ps +module sram_sp #( + parameter AW = 16, + parameter Init_File = "none" +) +( + inout [31:0] ram_data, //BaseRAM数据,低8位与CPLD串口控制器共享 + input [19:0] ram_addr, //BaseRAM地址 + input [ 3:0] ram_be_n, //BaseRAM字节使能,低有效。如果不使用字节使能,请保持为0 + input ram_ce_n, //BaseRAM片选,低有效 + input ram_oe_n, //BaseRAM读使能,低有效 + input ram_we_n //BaseRAM写使能,低有效 + +); + localparam AWT = ((1<<(AW-0))-1); + + reg [31:0] BRAM [AWT:0]; + + initial begin + if(Init_File != "none") begin + $readmemb(Init_File,BRAM); + end + end + + reg [AW-1:0] addr_q1; + wire [3:0] write_enable; + + assign write_enable[3:0] = (~ram_be_n) & {4{(~ram_ce_n) & (~ram_we_n)}}; + + + always@(posedge write_enable[0]) begin + #10; + if(~ram_be_n[0]) BRAM[ram_addr][7:0] <= ram_data[7:0]; + end + always@(posedge write_enable[1]) begin + #10; + if(~ram_be_n[1]) BRAM[ram_addr][15:8] <= ram_data[15:8]; + end + always@(posedge write_enable[2]) begin + #10; + if(~ram_be_n[2]) BRAM[ram_addr][23:16] <= ram_data[23:16]; + end + always@(posedge write_enable[3]) begin + #10; + if(~ram_be_n[3]) BRAM[ram_addr][31:24] <= ram_data[31:24]; + end + + wire [31:0] RDATA = BRAM[ram_addr]; + + assign ram_data = ((~ram_ce_n) & (~ram_oe_n)) ? RDATA : 32'hzzzzzzzz; + +endmodule diff --git a/tools/generate_matmul_testdata.py b/tools/generate_matmul_testdata.py new file mode 100644 index 0000000..bbcdf81 --- /dev/null +++ b/tools/generate_matmul_testdata.py @@ -0,0 +1,164 @@ +#!/usr/bin/env python3 +import argparse +import json +import random +import struct +from pathlib import Path + + +def u32(value): + return value & 0xFFFFFFFF + + +def split_u66(value): + return [ + value & 0xFFFFFFFF, + (value >> 32) & 0xFFFFFFFF, + (value >> 64) & 0x3, + ] + + +def matmul4x4(a, b): + c = [] + for row in range(4): + for col in range(4): + acc = 0 + for k in range(4): + acc += a[row * 4 + k] * b[k * 4 + col] + c.append(acc) + return c + + +def write_words_bin(path, words): + with path.open("wb") as f: + for word in words: + f.write(struct.pack(" max_groups: + raise SystemExit(f"--groups={args.groups} does not fit in {args.memory_bytes} bytes; max is {max_groups}") + if args.max_value < 0 or args.max_value > 0xFFFFFFFF: + raise SystemExit("--max-value must be in range 0..0xffffffff") + + rng = random.Random(args.seed) + vectors, source_words, result_words = build_vectors( + args.groups, rng, args.max_value, args.dump_vectors, not args.no_zero_matrix + ) + dst_base_word = len(source_words) + result_end_word = dst_base_word + len(result_words) + + input_image_words = [0] * memory_words + expected_image_words = [0] * memory_words + input_image_words[0:len(source_words)] = source_words + expected_image_words[0:len(source_words)] = source_words + expected_image_words[dst_base_word:result_end_word] = result_words + + args.out_dir.mkdir(parents=True, exist_ok=True) + write_words_bin(args.out_dir / "matmul_source_ab.bin", source_words) + write_words_bin(args.out_dir / "matmul_expected_c.bin", result_words) + write_words_bin(args.out_dir / "extram_input_4mb.bin", input_image_words) + write_words_bin(args.out_dir / "extram_expected_4mb.bin", expected_image_words) + write_words_hex(args.out_dir / "matmul_source_ab.hex", source_words) + write_words_hex(args.out_dir / "matmul_expected_c.hex", result_words) + write_words_hex(args.out_dir / "extram_input_4mb.hex", input_image_words) + write_words_hex(args.out_dir / "extram_expected_4mb.hex", expected_image_words) + + metadata = { + "groups": args.groups, + "seed": args.seed, + "max_value": args.max_value, + "zero_matrix_group": None if args.no_zero_matrix else 0, + "memory_bytes": args.memory_bytes, + "memory_words": memory_words, + "max_groups_for_memory": max_groups, + "source_words": len(source_words), + "result_words": len(result_words), + "src_base_offset": 0, + "dst_base_offset": dst_base_word * 4, + "unused_tail_words": memory_words - result_end_word, + "bytes_per_source_group": 128, + "bytes_per_result_group": 192, + "input_image": "source region filled, result region and unused tail filled with 0", + "expected_image": "source region preserved, result region filled, unused tail filled with 0", + "layout": "A0,B0,A1,B1,...,A(n-1),B(n-1),C0,C1,...,C(n-1),zero padding", + } + if args.dump_vectors: + metadata["vectors"] = vectors + (args.out_dir / "matmul_vectors.json").write_text( + json.dumps(metadata, indent=2), encoding="utf-8" + ) + + print(f"generated {args.groups} groups in {args.out_dir}") + print(f"memory size: {args.memory_bytes} bytes ({memory_words} words)") + print("SRC_BASE offset: 0") + print(f"DST_BASE offset: {dst_base_word * 4}") + print(f"unused tail: {memory_words - result_end_word} words") + print("input image: extram_input_4mb.bin / extram_input_4mb.hex") + print("expected image: extram_expected_4mb.bin / extram_expected_4mb.hex") + + +if __name__ == "__main__": + main()
  • 7zfT+0}8SncT^ZfhZ_xEiBtX)5sW8ZWZ*IQ&y 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%0D8y*(=d; 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�o*G50~?VkHDg)(HjhjqDhZzHFWQb?_CHkQq05%1)jLAHGYm6O@XcBk z1L(0rws9!q!oJlIM}ZljOP3qX!G&d@P}UPN9bHoR(iU!^rtRz#f=}*7i!NGxW%`;g zFC)L@d9YYXz0{LvEc5;eE1)6FoL-61nBNy@PXIL9#|t^GrLUO=~rK9 z`+BmmHC@KaHD!-CY$wJUaI}>W=x}2Zdy1-_c0MO>TL4N??s_N~)SXGwFH+jKers)F`$$W^F)TD2Y^3`3nF0UqU}-+vyOARqUTW@9 zH-4VJd4+i0MaD~E9A_XGhFeGNX*nyaP-#+kP?4Xi%*3=*Hy3&z;Yo z{NVu`KhuSO9t{)m6`@=>^l{V(vkxKf>~r)QxO)~Fe+(|fSx)>AcLVFYor8mei^q!~ z?r?||yv{Z0(E}AMM|o#;STq4@wU}Y+0`__7r`ENKuEU(S=HjSa#rS+sN(QAyKZ8_~ z5ZfB{Jz{HGk@w>0rh0>&-yrmU-2l0hS9dsnz9PZaDoRlrt)*!3T7R;K6pvWpuUez` z^8HGKx(N=@w;u%HC92@coOsQ$IAAEZVC)5gyKu8rpNu_1-pnPi9CwBIJNd&#Kifb( z&abiNGsYPvepRbnxUM{{H$_&7gzbBg)hTGZ zozx*=x}8@KM|Zsz0DoN$W_$lCs)8&ZfvpWUm~$ZGcJL2RzRT?B*+A$!le!vreOhcYYJt9eN8xvTdFc zGeQBsVtE0`HPh`ugU8){fD*Y+imqtO(#pcb>_M}#Dm!T7mW*0d%^>%N-_aQFc?+?H zO_1YOw|W0q%CI2+1*ec6HEGDdZZAkhi&|ecwPJw`HC-*sVLux3v3Co-XOy1@{D_Ts zOkY8(Y(0V_j+?d@l;GMmK5df0V4#JHDIzKQEU4A#RZ}>1aQ0fx)YH?vsO$Id!l#dc zqR7xWO;?p4tEbj1@e?|`f-Y|-`l-ib6%PbevLEK4o54MS5YtcPvcT%)ex_|gSvKJu z*h1L|f+vuK;_?D`*DK=dXyLZp+mn2};tQ^rlt|?@~PdrSQeRt+_d_# z7k@aovbc6xB+PKmTBrFmiqz>}m5G;bxW_WYLV?$ta$uP%#&Q&B&61_Y4?slUO(bNG7ohd&#v*XTj*m84$qkN z>O)my zUa5j>pPmZ|WU(R9oDz&Of^a5ml*~bPW{jXa-MCn@)HV^OE?hjtglwchy3|UyGo{h@ z-@d86c#QRIPHS~@?ojU@T^_u~IMegy=oEdW_f37AUSv(~w&-p4apO~%&QXy9a}j9L zL}_%Y9hq5{Y@P$}%e)t{h?{QFNN4cp`kzOLI%@>qHaS1zy|U&O<{ZlEBV<|k%zA}T zSf3fWy|QLx_kQSik@So}OBIRDiaHHA2Yr5_q4>elTNb6w0(dlFK!c&~A%bh*Lq#=i zj(hE*{8Vy_mNZswA$okj*h_IOnZ#-=ctO6E*u`z9xfRUXq68wVuX7 z{%2^hU1$pF>w1vqnEOMkdwfPexDfu#KEfpu)R15N&I&yQ2fMK)0y}$IF;xRvah(Mt z+zS^G2n0g`BY^!HA1-dUsO6E5@LW1=OQ(-5Z}@kO9Hhmle`eU8ju9a|Sk!I3J|lT5 zwDf9D+6z}O)dYbSZTI}D`&?j+rkztCMD~)(7^jT;%Fb^-+KgY-?R0o6s#f^K6hWBi521yolsv`LGE7qT5n-DgHX=J{o?d4vo&-Pf`n;+LxU2jJ%ZTvTZ z{HYj?>A*j_s)|Cr*KyO?6$aHr%VSIE1FW1Q#T=Z4p`m4YLzKCAYlsd)sLP=V#lV>B zpcBM5YeT!bgu>TA_xNq^TpDortgB%x0;Y(~>X`k#NXD(X)PXCEy1Abbl7<~fhsMn?jey+SOKVq!}m(L*FDDl zjI;1qiyV*|{6==LjKa`_j7$`UjC?qLkWbu#vDfcTG9>3(7-)f(n1sa->7bY}bKu)S zvS#}DBaj|ZLNd5;7tQ5#JPv-=BDWA=>1kS{I1LHNu#dXG8EW(wcQH&E-Yr$s^Pa>` zvGO%V<`%q=7&}sa48C|j6|nhhP)%;)ZBC*MC}K;=yB#x+x`*Q^n=UQ&lx5+?MiK!S zh*LGSArfz~OTC-GI>%YXGR{KxM+(Mb#GUAPR-7N1>|{WZ3Fq;>`jK-@jw_|XC5+axo|R~87qA`?83x=hXjZIZ5Ak)amy1kf&|cVG&Rx)5*j?+n5covk zL+o`f$K&#q|L(vtW=gLpCA)f#=qxLZ+wp_P%k6Xd{oK0r8)u-Bo8$TOq2V`Qq+5|b zY0_um{L5=iLJN|H-gl;LH+#kOd5SvE)$$0Foo$caTBr^60$ko}KgpKjE-G-b`;$ziH8#TJAd~-WooBh^w zqVHzsTQnRN=T_0p?XuhMmP`7fH85Pwpc4xJx&cpNw4kXyjafYZ5=DnoZ4&_Bb_%gH z=kHofLsVCs@MOO+^$L(%!)gJe84W>)x;{TYM<37RB!ti~Y(5vkoOAxv@K<+|YAK-@ z{e*`0XQ)PiHMTKwbaF5@utor0+5WIVU}OO>0RCR^@X!kxI2w!D+BgB|1;48a%c)YU zm|Gh=${D*V*;*UeC@9OS0O&=G9Swo31~yKADIEb?jBG#wN;&{~Q5!>BBXb*50KKG< zv5k|tlRK>hfL_`8hm*UVF@RnL_@4oIvi)vj4kR=NFtYw-{1*YB|0|7;?|*Cc7xy2n z#LTUnj2(a!Rt8SSBF6vl(#sgzm^zsOSlKy%OtAmy60BRM&cc+%ngFujbz9Dlm}5fq zHs(5Hm#Qpdw_r}9FU1^Hu2#w2q)3y3g$>ld`UVj= z1o*}S)$@n(3shGw(Y*{QY|fwCCy1OO@+Tg?p2KUHPCxl8NUs2TeFb>Xz#m_}p$m8C zeglIVKxUu_@e^c(fR7*qqWsH}%D|PWmEr#9Xv$xYu%jNV{6Zv55(Xa!U=j%!Muz#n z-mFL1QwL04!SMB!Ji+G>F^NP_5GjeE#1Tb=p(~0Mh7l2oqN7mehe@D_{@+o;=qOn1 z7%hx_nAcdHK~u=2A|VunOd>FGgi>Mfib6(Vs6@hv$XNM7!~dcpzM+QPPaxa)J}AQk zyHw7<%N9I&pGwdc8@p|JG&OKs*gUp4{*vB`Id##zn#=C6UM`-<`2=rOJ{(kTs_p{E z{NeKd5THM)0od8u z|F!?WzU5$U=Va>uU}XQ7>wmisko~WV{PiNH|MnRGy&6D^1)#;u%nV>*-~g~PF#L0H zFf;1_7#RVKOn|>AMrMH4KPWb4023?2Kd`@NCU$lp87F}0Urr`Y0P{aU05ceT*nzFG|09Q;<6ok`GJ)f-1K?l;Z~*%Y?HCa)0UN46K16`~Q6v_)DVeXrwhqdnaq|=m=ab{ssNx0?I(2Q3aaZf1CGzxdgrXe@26a zh5f(A@~_taA65z$4o={F{%74_1aPu5b1?j$myWXz7`McQ6?UH-(~LBd1eph82@|pe zNeMC>4HyU}4UOJTvM;DEvEG$%uykLbP}D>$LA5X;XcK}+{VL6VsnX^*STv|A*3f;m zq`inee9dB>3PM&mdwuYIufA-HAGvIq>df)voJtG&hN59cJ7T0&Yqc2P7_eqbjJ+j- zZa>s(o0b{e+gM-k_Y%-dngB{~1VF|+~qT$i5xfyr9Y!Aw3T za9fHGmKH7x^Ze*ez3cNFs}$_*EPh3`o7mD{h2AQ1^azNiK zOA-T?MalQDHA6!@{2*89uq%=jd9|bpP}mWNMW3uk@Am{>M6Y5XJ7lSdv9^W%r~Iw- zY5qVIgCle^=(93lo4WLZ|6C}ov%NHe(nmHhMU+L9hAr8VT}nxP%}PpA_U zDB&(t`i;}$;~q5L!SQ39%7``~_O#?IQTUNR6ab_3;b*xh0xZ1=3X^i1Cet3zlACJp zId;`T+#%iXyk>Z-n&4dU+r-=WAnI`?+EjC<-FPsMAW^a;>jna}H{N5nfR3-$nc+|0 zo=CGX?llF^d1yz+6ZK48TND_GOCOjcw{L}cgX|yye1<}kH3$Z9wa=` zr3%@CC;4*4bXfp=&Aum`skRp2%$xuv<&CUZ;Y+R~I+7j=mDlync2r;u=XteHQ$o14 zhUim9N|7&@q}dyH`KvFcA$qs|xHqpE>)<;x^D()i7%TKB=NF#vx9d{=m>AF;SGGJu z_F12(<{Z$m8ZlIVw|-l6OE=7p?%RTFDP3`W{9&?1K=%^90&)-|zhDp);h=Ad04_38 zB3Sz-ZMT6wMC|xn?m9=IydZbgwq;1QY$xB-D)K48sbqx)U(6UIn^!dC!+7AV)hb9o z$O`sMG*oS@>KP_qO#6fv{Z;Mr>W(Fu1WJxg#jCtK|8x3@(1t~0sn(fbXJhNMOy>h< zl6O8*+AIoo_mY)|&e|m(WV8bf@d(u~?Hss;+TLUOVx(F{gcs z4dSC;O650H$_pDWLnk)J=^z0YRrTDmI?nyR> zO8s|8$w(Z5=-ZXunt-u0W37o>jW%;ub{L_;>&lAYpa<07&blaq-#?a zZd4C^MR(t6uGoIZe6tT&mJgUBtYS^=(Q^fkaF{NF$h3nxZLuKP;TjlMR&^di`JtyGVWr z8Mr;94f)KJ<9W_q3x;)KsuIBGIj@snjo&lWq=ZcX9p_5A2Rq8-PAL^PY*~06#sil} zA9f9bbjE}cVue3EHa{4~ibHsVezKKTP#Pud9VVsFB|guZ`jRn5p_7&COLiAQflbIS z{d}YE(49rH`0g=WDl zz=_VjlTIP-^JSlAu=NG;LhrP78tFqUuH7bR3F`%B35}#iPgkt-kRtSwaTAKr*3I)` zz=K;1kq%9^tN&X_Y?9Ax%!j%kQ<&{Al<;~4eRT}UBI~u+2dR|bb4G) zLK%jgHyE0K=~0^e^4Bg(MFd&u%|dw5(wFa+e+2V|T+BNo&b7vdhej-eJ;g#dSo5pw zhU;mr`g5;M(N3+>=5vJm$v2GcmoYQccPA zJ0usUtGEl1%fADvr31Ac-H#vo!WMVQsi?HTl(tP z9_Q&6e47$~Tq(#|@QwF_Lo-0=1Itb}-&Qq`7m7^4PX~Hiv_<{FXCG@4V>=0RGfUK| zKwfC4ml*$QFrLa`+u(MHr_KG?2O$jbtm}b4&jKm-wA;H>TR34zlk#@Dty4&=OXBWv zRDyGYw}M01K7wr*D;Jinp6anF+7z-)9dVz+#vfe}XIY2-rv9cMT~(1Ni&XmHK|fas z*xVSMCSl%655@_?<%aykgz5ATvqH3aZ%vy^z;&CE09MpTPzt}(=kUHP5sDj4TT7wd zx#lB)j2@|@4tpL@|1tGvn#3i0`JjhVg}BM-#Oi*__BV0yp#P2b#HtX;)8k+h=u3HY z`G)|V;*@3GbQ5wB{Jwhw)T0&a&o##UHP@0joqp(t+A-1!0e=$Ic@%(mD&$Gt>@!DX zs)jY-)|U~xo|H~tfaBZwQfvL8xOFCA;HAb1(#f2CiLwQM!dat=-|@XB!J*CickYZB zryzEZF<>dH<)a)U;#SNC+`Vl%utBh8CaI}bxgOy+s7v6ac)G2@Y5SK=G|=o9(w9dN z=(ic|Du0Lf+i&YAvCi^WEV<&_@=)(g6mtRX_dNKXC}|H{51%DWH@*O6ICz=!5CT}F z{Azzf+zsPv--yVOi_aRGPf)Cl?{c5E?}D5JLB@cucBx)3gg=2b`rJLbMc**z96yzP zT|0L9A6)0813oS|fO!e4a3{=?zx@M`8ZSST?bd`=TvZ>D8uMQHF4k>B2n`i|eT)6Y)nrKRm&SuwA7l;Y_$tK@{^@+RmRLY! z9q6BisWr8+M7uN<>=VX_=5?jI=`#xc0pB{NrA0uP;HMLFNBB-Xn7?x+I~hl*Dye8Kkw2uJr#x8C5rIBDY(2nk%` zmAQl>>_cRF>WqB&2KJLw30F}T-F+698IH;odnv#F#z(<1iBKB~k%lXKdnzdG@s z<|2Ra5kXkjM-exfqb&%8kFwkgagLe!JqLY&I@KZ7GhOqUsw-4Eq&?C9|-_5?^*!)DGoC++hWu1U1rsVOYJ_b|^AaQ!dZ&Y`^$ zrt88TcWm2EI<{?h)Uj>bwrv|7qhs5)dE%4gB=0l){=j$Dqy{zEgQ~$^yVkw#u1k03 z_PPs}4CJ1jsp78qQ%+bv<|Mb`SZ;UI4fV8A3cezlFzkA;)l&JVwe!C?3`|Bp2mnNi zustzX6?E*e1zg~QX3W6jIQ1C+Q;+fu(p@_VGRF3%kh|?`Uq1kw^gLQ2mk=`6-LJM7 z4^J$JBrOPFG2t77~_i!QMGjIl?z5_!l3UhI{fpq|`QH<&@5 zXV(bS{AI$QXRXzIDEe+e?*EZ>iLJ+w!zw&r2A96!Z{CWWcXomtUlUpz`u;odP274E zG0IcNhm!w7euJ|>_>*{{mvCPx046_B?;V%M)(SK$oH=W!E1eOK{KmuiYwMnvYtfDy z-s#p4_7`QMQb9C(qt~+%*gDz!dCR#cnkCXP>}tv0&uLcIFl-1fJ|vh+tQ)pV46hJ7 zzvdhvq;>2{rRABefS=2V+cu>NJJ!bt`J zU^wuZfm(qD_`dK2A$+J$c7X*_rUM29I2rL=f$g&oP~K`$#S0IbqMVXB1Yp&vKl9}h z-AMIJSIF)^P5rUO`$7)W3PJ*QVESID!f0Y5+1HDL0}4WW?#V#P_t6T{LSX*F&p{S~ zp-;LhL;=Vy7yzgJiAu4z0j{{$@Q@R*{cecLcEHyjxhdUSo!Ngxb?I~J3^D_VvP^$D z+)Lj{5j@q+sOc5Up^{Ye)-c9y(*A~EMdloy7Xf7(`)z25H zd4A4jyXte-JfCfw0Gu4!#$!j$DR=Q)sB1?Lo+w=*A^0ig$biKT*9C_yV8=tGzpJHvfs%N@u1 zvMBuqgJ-1)@d$2DRAFErip)M)fGs`rnExO3hCZ$d^*^AA^K`MtGezQ{#}v39( zXhgJ>q3fPsp?V~RcPxeYo?#IDsod(oL1iZ2{(8=J;w3KV2MCl`0)NQjI&F)An*?GA z+knGgeh!9!&Y$rhf)t*vfwpNEEj1_+aPwvKv&es31?xv2Ld{M2 z2g8{|y7AoC-!V>0r!I1O~&P7gT1__ipiAI_4Z2Sv5|@XS?t<`PLoQ7;&d6Wk(gH>VV#k14)DtT zV=b<2;QQ0-6+HNE0$GDg#vkR2%hIl>OcoWWa9NH}231S5b!e4gi5Xk5dpC@&SdNfD* zn0@X(e~7jr9kUvYujynPZx>XH3Uz|UUkBl}m`TUk#@G8p-uyWG>JbF)*9aETtoNTE zUNIJF?CB$WG9YbLLD_+RHOLa3uWnwitzk#scOJSsdm^Cu?&6r8sg8AlxW~`$gOAkP zS57APgrnjw`#W8xmwJRN*9x?^K9T8-J5s}2kBbBsL&CB^sqfMG6=-SQMuUQK*%``N z@)n3@;-2Kk`mFtsd0^awB;DLk{oNZrr1$oLJI?WzVIErKc6g$(Ip0U#IV-+7%aA=8 zl>b1+>k(SXhp`{t_kq7c+7Y-s=k1X|q!X006gxkrtL}_7t+h+F# zH}4R^{o6+Om0REz;n#)!-2*iQi88c{z5ldAke|U$v>>^Ib_etO$bT4R2rwP1_6<;b zb($n1+aC#pBQ}@k-idq>X2x8|CVopH=8;5}gy)l-kGKvp0l(aeo<@CgiW1ot4(pk} znFduZFam=+Jsb9RsP^xiN#?49U-(BaaF24Sr7NIG zW_?3rIm5&h!Wl5nn!)fHVAzK{)UG(M!|$11^ylNz-NQc-G^*VqTZHxPkM7W(zD9Yn zHyTrb+G`Mpf}{Tl3)?2p98Y1A^8ta9IA^xoSc0&=upXZO{7w_X5jB^r;BUy!aS7XN z=14zr*JUdv>US9X)Q&Q~6fQnLlnKUNkYNHem!VEZ1!!7R-XU*^l;cDOTt>7ds|NdB z9+@;`0?H&F)YK^rtLePlG1ljvUhnFaLO(L599;6k=my?OSDie=lFS}$79U+^W z+GpgyV+y?s@`0ed=lp|WnPRDg9r*%TDAV+AG0>I^vm0L@$=iSJ64>|n;@XfP7Av7? z_y^pir2oe!>KpqyQ)mI3z8>i&-f$XCiH#3SxX69eHIiVPo|FDJ!oAZS+`=8nFXX&` zIQKlLZumBVbKSnF#S#Txc)N38lKu0<=R>dqz>IGhkc58e!PO5hH1TdvfttkhIgtHv zKkBVIssX_tB{E`UDIJyw70FNgr?`e*hHIZ)2bS`83t#>f>V;jQq8`7>5>&4u>gX3h z^J}qv2}l;v6KhhnK-jYl$Av|cECJaJaP|3=MHVES4aalKs z$gRllLTMw15^paGD?a0U%ax!&IIcU$J1uXd0k1v;J9j33YW2=8{_B92uU8UkN{Kbw z&WUNMpAzI#s)YSg;7C&7mM!Vv{XTrO4hc7K(6ye~iM3{}UfsWz`Obv??tOk`Ipdn{ zNyCLP;DF(?D&%S^VeHw+gl*>_*wB zHIn!-fidtUiK@f%=~o&5k+wUI9nk@IOkZ&|@M=t<{hw&VA>*!s^?9O7SfxWGG2Xt! zec$g)3Fd`HBXM*#PDA`6*=Y+?Kp!Rq!Ox0*)D$0H1BF5AN*LRDAzOX2Z(`k-YCQcI zL@Nwi7FsKrSD?%ukz5ooGqCoa0LIT5C-(Kjry}N~*xk6@2Z-J45s>8bf_80hYc!ySWiXZixQn{*k{)v3L&M_6(ANr#wex&LB64&Q^m7!xQc z(yPDzq}S&V`g{x5vv+a+)1Ue$YZC!$-6y}!*2v5l%*6?UY?vMTP<`p2ulk=SWe+Wg zE@!lnf;}I;jdB<9g$lc%-A%7HC(MT(5m2ymNdFwx-j-19obu@kAv5M zkUJR71?6WH&s~9iF+ZRlo__`;x2&A-cYSp6RbiT>s+~Sz5;@M0lzdx@{fn*P(=>Jvmc-T^U&A?7_uGe?6{kcCAQc)9 z_6dd+@jv4Ta+l-}r+qdkVdngbE03Y?p&oM*NH_1}v7+`FsuXrzp_$!s=g=^~-KTX; z)lX-O%ueL%gjcIvnXq261;|juUva`(vHr{IB3|Xl7pmha2(dYV-i)@VVe=dA3$Bd! ze%r_^$Rq)R68R^Q0qNmcOeI^b6XRT9{t)G|c($Et>pP!2nmwLlQ+IE6MXa=9;|fge zw&NdNmt|qj2pWd|w-SDz4x+Ja0nr>`{k3wfvK=wg6NkoMcB_eaNTIq&l5-C=P9@%ufn>klR^oIjPu*b!l7gFp# zY7c`5Q2S7q=7SfIr;i%$E{Xqf!apAKE1w{xdq2Bn{sq9-@F(x^P2Xb7ib@DwLl8Uw z^ppMmRdAHVHhcIx9`XhIsi25pdj@s8W~a(K`jR_UYrI8k^5o-J2R4sqr}QiH7ojVl zKE$&AZ42qsAuTnk-;PC&)Lk!d(eLw4(vf7>?o%)MD#U`9pSj;9()B1vZ@WB0o;`(7 zQXBe)zvT^u_nf6QZ_n+-fu2c zDCW^B!{Z*?cdhOV?&B?QzuO+K@UKYt(CO;C;f;afU(yA3ExzTGou`b*0C>PgVBMp? zLfi}VIgHjBVxkMN2_c0t=XGiI?Ok+Q(>&L-@V$UsqJH!<2l{xK3c-AXF{E^EQtatV zd{?0L@zel0k#IM22q-&OYkqlqqV@qI|6ryboRiN^tc z)DkNR@cNH?d^Z^9@r?dtajfueGn(CAZ9vLI=wsa3r@SqoC7WXS8mD>(6$dR4-O=>< zvHcz+J-1i&*fM$FasqgNYT#xLB)~758Rb3Q!w-muu33xe2CE8c@d3ee+kje&<#7Nw17J^dlY4Hd&pdLo9Pzf$`R z(9b#!9sb>SPZwX)4LbxQPB$s{!})iM5<1Xo{BWyH*Np6LC_9X8!{imGw_Us$Zp6B| zgmxmf&gMinI}MuKrSa^*$tifx7mg46j1jPL$+w8nlfS!iuSX)RqICQ{emCj*1h?J2 z1nl+I`s!i~WaA1n0Pv}=4GF+oy+ihiQO{zZjXNxLpJL7@{P6$1c%m5AAr{ifxX-Wc zBQ+gn3QoLst#$Uf6K}-kwwnUGeT7rBy1)%2Zp6$+Z3A=h6a8-QaIx7AJNXRTf)TBt z2DICQzskRPy({!EfOLTz*8=NAaQ!h}1OnyVego~j#pJ`{!C*n4S0~TLZte6g?nOSk zNA=W&w9KuUlB|4WLQGVAbgM+D?vSV$gLz6hUGp$a_p097@lypCFwOOKe}HHEEOZW@ry}G^Ue4&9E!srxS@{#`$+bPLUr=h_Z0htWL&Za`twr6|g^QrJAMIC&qVKYV?C1fGr6L^suKxw zFP5~H_)1)Fv1=4sNH+p5uZOrtDQI`bdF>&wd@9#Jrh8JL9oS4IFR$8CF#6}fT0!=K za5+IuwXVhMPsr9uLt{67#mbX)RM9DmW-H};Zq(W6v1$7{8N|>g8j%tAV67fu3-3{= z9K~7vJ4@ctq-V^wSR=vbEUsc}=|G&|^GSlXUzL}n0mYCKxfs*8{PY-qe_2=6#wzjw zXZ~J;x2?U!V@4>@qu}#tJJCuq^0diMW_vFr68x_YL_r{q8(dekxz30f@aTMdvbTL*aP|DOk>Y~9F;>$TqmqHT-8my?D)#t6T?dD0 z)4*MMI9p6?FQJT1sq$xQeY0&Tm@^on4(7V~>n`p8Yhf8ad5_B4e4g`S5}7q;dq2KA z6Ik2(Civ!=fwxItFr?J0Cg!T@#gwAr6$!=7kqo4+N@bgl!se{Od$w4~MBq$HrUec`6y_CE$E zVvDkjoDiH#oK1DOTyZrP*VeDDkulELyk$oe2GZ z5f8$*PR__HY}aMKCm0sDkl!O$qqQU;e}2chOOj0!AegY1=)r|ZO2Q7m z1y^B)WQ)JWV@nO+o$)Gk2M z4niBMrM+;Pg{&j5&hFx_g&2b}jzzUzLYAnljSYeEY@!Pz^c|d#IG_#Yh?=7nks_5j zUs`1(fV*Fuyz3TnK>v*irN2> zTsC|!IxYi3-|&E6s8`96j{+*5Ep-9&V+h3jZ+0(pJZpUIOS)rVL6;MVwkWk0O`LjP zQ`cWmal5k=OP@9sd^t^#AAq!NB~zl|h0r*G@qYJF_P(*E3yTiaUl?Gs;TP_j6^8NX2D-1}h(Y+hQm?fZH`zQzzG#QO?jAojKarI%B4kCuX>sC-@u zNx+3aqu)>JH@!nQrJRwK#En1jS(u55mi0J<`q{m!H`d~46Xc_45D}Ohc|zvwE|eCs zDcIzw8w4xY3^t>a`N0ZRrE{6{p@`S5JXg8K)fF2DLnH_XeUca$(w2bx&~aw}B@lcs zqndnv3+bUp6IbFogDfWNoDf~+Fopkt*5$Jtzz=nTZ;o3C$B56snn2+*W~9alnV)cBrym*S}e)%YT~E9l;i9Sl;ZX>qdZVf(k3o z@!WBWI+Ay@hMarrR6*N>c6{`t77&s{q+pLJK=|$l9QzsiKNxi|h9F%Sbx`D|y{?^I zPy^v|4!xz#-E?pWe=$du=77VoN0}6D2*FR!3XWMO<6Zl@YE}YDKZy9Y+T36dI5voJ|Q;B)+jERDFzznZ&I1Pg>t@*d1mqkFifJX9IZC4opH#6J|k zL6n1P!gmn`OE=-)XNCM<`sANPZ%4xIcu)4BTO#fM<}UQY1JZg_k9Cda2_GI-F(T?% zp#X{`#EA!8==FRot{#I@o~%G`ub|2*sMa5@MuEm1_4aO^BLsRoSOr>*5MtgO;a}FV z+bcMoH8LX0mxkFZLF_ya)}`8U>@`W|9Fmj<`tk4Sk2UU|n?I;YOtv#jw!J!t=g9xb zk$pn*J3zTR7JRbBno#MurTA*wIKW_SRF{afWYF&)Lh#Gp+lsTEHH_qq1)o zqVnG`pz_tsppA-I{H3IXp;4V_K*+F|*9e5P@rEt~lMqHM9B0#6dLW26Ms5A?Pm$vo zo>g3rq;?4%kb~h8wlh$2K+8=zHCOD!eDf|-XI6IYrt%N9(itydKBpn9BYk0EyBg|k zDl_JpJTMU1KGVu|d3PJC$23iKtT$CaWOTGnyVrWYkrDzQr+gN#EufKO z=y=f`B&}P+)h|4+j$HAfgPsB>OHTJ8=QH12vyv*nlnEDU3Aj&}5vE!)yZgel;f7g=oACYhp^#Pko zK8-;5T*+dIbKBe|^{R-Ili`g@lDTe~0^Crk&W0jjn=YR#$|B6O95@)E(~oBjx>3H0 z6RX2@lXl3xs%Vuw0cbeMGu@1|AYq(#kJTZUv)mS$&CnO8l` zCc%I6InlR{uYxX;K6DLVEh1C=Ctv1q5TAY>NIFLE*q<|%0P!N%*|fb_ff{ySN9h93lC zmp$H^4UfDxzyaRc%;d-G1ng$}L0R`^G)vTZw3`ro*uox{1MSzG*ybL=CbBmjNi zF9FeN=f)FALR|lQtm)eQbmPu*!EYVls>7Evf61M^V=p<3zHx)Lb!It0@{#o0_=C`= z`HY*$C1xFFCvrsHfqBm9b6a4-DFNo|_t@W!gh%sv(I-#vV*C~u-te?L_hqk5++x3z z%4zJw^E3TZ8ZpN`cg|9~_7Wu>J_lLB$@Sj7q%gdt9m`35DZm?`ETYtywJEL7b_s6D zbqR9GQY}EOh<5CloifKe%XnJFJcnnSz#NGsXC_;lMb4acto3TlPycIe!-O55I(x7n z+Hs5G3!{B#;3ZRg@D?C7^{fh7r#nrku6TFS_)>N7>y{xty1S}-&5_buoF80gjJpSx zAvVs8au`NE6uP29K_kNEfR2SSn1#n;qzy=A_bk(5I*lS3L zN-X~yZ|=&5=g*FR zGa^>7)NzO~8)=J+n=JgfdfH3tS+S~Rl+uzXx%Z}asgo%xbT;S{;Zdeq4OM?R7^|v+ z#Fd&z`B7IF)W{Zcg|)3J!Oh|hAty>PWYNvaWN7(uu_Ox{BkRM$P-9TSBtnyDYO$4; z4*?`HZ4uN~w9h0WF%|0KcY^pgFObQUKlGk#J`)ZIbGP93Z_HG204MGcm`~?&zLW zWxj^;M-Sk`34QwG*kqbMzhXl=KomG%ndVQZh>oWf` zYt!d4WYYN6csr{zmZQP^qYy1$v~~I)7J->@63Th@GO4Wq;6$>dAQ6`m7~^PaVxXpIeZ)r>U+4U z`j$`AG^T9Ee5GTikig|>-izS5iVN}2WCEt|Wbh>d-aI*$xE8&-MSjn~i z-K^V0nsKgiuaU8a(?jdxRBsF86?+u(D=HDyh=@XcZzI?@X>~5!v0$^}h@Vfyi(pvc zW;n%zA?}mBlXY+tGozac^q(%AI#XufhlUGk3Y6_1dc@rK+usWmT|4rExu-9Tix}r| zRUkSeqK2-|YLmnkyvuCF!|i$+;q)_?RVf*b?S7RBQ!)^^)Sf5X`VP;RsvW zZ4s9xD`N@rIXACnK+qlb6PVnRuH~;k0Tt5gs5a-EnY$SakB4pMcnTE}8`du@siRbzl^C=$ z@4lBxALkmsk=Go%L_slT#LM|x=b8-pgbRBMLZy46GMQn?^(BawPV|IH&L`GxFg&z* z(DOgD!`Exh5wT|8#{~t%8W!(F&WE1Dj??m!6f7e$!spdD#a~U>^-Iv_okX=+)Z2I7 zdZq={zJuFVmSnqdKC=T!tm`&DV0YUQ&M=#Bo&kNsTgKqI*zA0PmWYOQp^iemSbBuugn+t z>0xu-iyVu1e#L!i-@<>mos|vn6jCf%>WT{%m|1F+7Va(#u6-tgQ^!&(R_Isep0`-q zF4V)?68?KCG(P0!RcV_5FT~zhQ^luZX8eKCMjl(Xt-;L={A)y+ls_n-f^mN!6p*n@ zT;tiFhBjXJTZ;FDVljy{t&J0a=XUzy){Z`rrub(=6PZIhz=-K z_w|;eR1H&ST#<1pb$i>U?WO3Y@}qc7wg`-=AF;^kG4O{_l~Qs2`=emsQu5j821?Cg z$#BW_kyxpKKgF#aFug^%oV4sDGnO7t%_q1_eXdyuBAP7v)9NaqZ@;d*Vx~pw2qC2)kI;!;Zur0t3)TJR8uChC~bux=u$fJ z#*maQQ}ask`!rJDkp&^-_UC*9L_BGsAmt!xa}7trFj8 zdJW6u$s*r6HtYkMn?V1BWH!5^KFJ>0w@luQU`F1x!YadD%Gp(a@>QwB@rZ5k6Qo=k zp|y|~=Z-w@7Gp1cUb3LN@do#W$*OK=9AP5X)XFanpa+kEigDW2N+8NzdX_sM6QR88fSmIk>xhm^Ux{$ESZ%x8WC42VCj&KSP?bJqUH(0~wSu!yV|1I9Khk)1At7bPK73}G@6V-Sayxpy zc7<Ur&Q{hBBhV1_@?4zrZAFGZ9t{GWl< zrZu3@J2N|NZGeydDd$;}7V9V}8Z{e<);kz$(E_J^-~pBH8i(}nx!VJpbft%7>sRBg zAt}42!H?MwZUIZx0iRXX=y#IUTS>FF)PxsvRe~w8b5pnO&#q5qGuY?Pr~k7)_g>K> zl=z?OAT3$k*Bi6uxtk5M96^G}T?(kK394H5X7dK`Vsp4Z7|Y?jl?Yp-jOJS;581E^ z0F6y}MqWzcee6)#3+n5QY(-%+K_?u@1;F_SEHP#s%G&+{5#larybYao-Zc?1odhMe z+6`U9SBD^TSFWcD!ba2pD7zaKOCGyMhRq8S5LVlK%Amb3UixUu{C<7~c3})CNk0?> zr1pkt8_RjpJU4e(;+wCJ7ZdvEURYv03uX+w^`&g>%!!g`5l=5?dW)th&7!%+BfGLK zzQ_1+F{p$pQA^e=po9U0DL%J|G&UfQmih|Cj!I^tZYI}bJtVY=%I%H%qat1f5fzYD zun3(m5iXt@*4&&#b*2DlkQ@HHQ;b)fOfK&C_s2W&VE|`Hr7^uqT2>_<;BTdcGSk95 zWbwgKq+}uDf6gzg_q}2FVmU#|E{ta-PPZu7wtY~a4b$^f|60@3Vz@K zvCNUt)O+25Exq_v?5WZi>a5&!v3Rllvr& zA2qPDfCj7yGESIb6n^M}6`{V`BNE6>t)$$8|b@ewxLY}QU?$x30 zE*o2*r>9h*zgr1<85W}OC!~t_d$rfvDIgJidW_xV4l3bvjo5q^dP_c#mj6dy#Y|)n z!J?++n~AY#L&$4a=FV9^LqQ!D(l$CCdVBjZ9~{t~X21 zC-esc7CiSaU^sRJxwN(HtT%2y7c@wecw3Sh&{B8)EA4 zR!QdYS+-HDkhGjS@lnVLF~}LlDJPkbHpv(^$QNeFNhUbjrCJj4q;iovyG#~u45kMG z{S5qq`5(&W@}j{UoJ>qCEVNN9Q81%ZEDH-06TRNF(Z2sMa52-84;?G3M~|H4+aeLS*fVn$b9`iO;(>3VCB$CL)|AXW018S+H2b%11L=w z*?B~b7fmgOAbf`y7@6DCwiNUDjrag7spuApd58LaUfdV&7zJz=c@<0;UHUW6`gR|n z_iac;vM!Kelu}ds2<3!o_eBf@e6i1j3Q`JmJF~Hfc%{tfSh6ryjl{IOgps*rP`6}P-v z6&}8VW>1ua2?~0{qe!>wJ23)$;R*yJ`8PC2I4gkh%s@F=Q}lr#taG*#pXI&eh~}!y zUh)o=hDCSxj0P5OeHlqr{fqFooJadf%@52KYz4;bJU@xg>fyAFnui9OKAD~5&&-!h zE2ZiDb!zwm+OOZBdTw5dB;YjeMRjpUvzc*1vEH~G`4gL)H@Od}s z%cxK0mh~-`FCLZ2T6L(^ve9>D|B?ICT%#9lJ>xyMI4cMU+ZdNovtpr5)pCy98Tkj_ zyPu^NUcl>R9lc+mmhR7C#?4P{M-3F^c6y-5x7gr6##566$1i1y%N!$ z=e8JBBra~=&jjfSsu2^6zfit)3!9YupE3Jtw*`CIQq)96A3u(tlUlb^gD+}5ELUAG zQ*znzR0%qHvPf}%PX0tB?99RW#D-cQdmJG-+uJ8k-D760H9EFTU*} z1qA=goTtk0x!_ta(b}zJa|YE1o7)eGepPKz#UZS{5PWLfJ+(#cb2P(9L;`zsWJIbQ zK3`Sm4-P&yas!`$06A-Xi>6v_Hx3b2l~ogq(*k7~CFO|31ulHESo`*~y&oV*uaCtq zB_PdcrvvbGnt=>t0-d;W`kl6hk6rq_))4^VIS>DjG9K%;2(^&Rpo$!QPhjRcrhg6K~b{1!D)zog$xE)@(A|c* zDff6~a+F<=VF%;^j+&S=O^ep9bS zWXS0l1pk_wXIs=3+3o~TC6VCNG4bTB()7D|f4+CS*W-B&jjP~a!AXrul#lQ}sKLK; zpGZO5;q}>!B<4uQ_gE?S@lkVe2yrnA?Ul`b+eg3G9JPbq+tG>hxEjoi_ofnT2~@Mu zG}wLb93rsuwb?Hgco-w71^5GY8>lfdmO=G)%0?H7t7BL2z;9-pH5PT9x?Rx)bz&_s zT{7bMRC|POT2;6W>!{K?hHMdmrfUQx!ZH>+yXg+OPS;H52l-AE7;1XOmkDf$wb9}v zqL9G|GOQ0tx;7Q7+H#q5<7kSyKA+XP*QVfx`c2NkH1?;<_>p|076+4=0CP%tgH(-2 ztFiP7gRP~{``#XnPRkX@h3cYW4XZ5KbgxFb5}qW>-|Q^rup%ko-$;_HtE14NtDQ54 zan0f_h9$)@Ea)mtoUE7`sp3XGP3i5ko4y8PO$`m3g4=0Y{W^JB8bTj0@ddq`0ACp0 z<0=qL&i7Nz*J*@!j(v*cgxq{Ni#)pBCI+9q-td1Tlc54>>l(gar&^15m%EDZE_t2m zH^jSK#RjV1Plt=iU4tyAnWnncb^PV5<#gq|Tlso?{{#!&L;b{W)IXLt>Cw_(b@cs4 z_7P#ZUUW45miFslb-i~qdfo2pLnFKew0eEUA1~%Ic%_i5nAG6HF;~)PWOid)k3Dk^ ze>SN~$^@YuY7k&{)~HQwZGaWpC0|Rrzki50a?j76@5%l4Ndio1o;jGT0b*V5tB@G4MCglDpM*{Oy3W)AcVb5%bb4>k1&hiej= znl9T;NH(1FZG#hbto)pl=R2j;=*G}dHLGfKOZXEYU8CXQg-IcPX2!rkD=|rkYBqg~ zzKNZVVKmz^K|0#)WW%L-HSz5ZCnr@dbx(!nZw!ypWXgkS#fFv2!*~_%-=6uAR&I5h z!P&~#M5z>+*+P_g<>Z6peKOV|vm~iIWW+M6w5om)l5dM_&q-Vut(2@RWSgQ~M(Qes z%7;d^$qe5`vk695h30yNJ#d+a(bs>p`LAjS2C@vdV(S)dl}(C8daVjB`gfBC z)x@Y|6O}vt)_}e-o{fdXhh^QMS^7;4n;Lh+IA0XCLn-!Z;kLb^bx@)L3a24Ev|Vj! zK2SfpKgZ>VmS4;T?X-P>iZ1hmRZ;WY;gzN>Km$YRZ{tn60Mk3fShd-VoMXxdBw$DFM8t;4BD^f0?)C$c1Jv4DVVwq~n`5TR3n#65IY~qKdNQ>8 zaJ=!ivIEdQxC@?~OZ{6~uyB?Vzih$43ty)qEAK|$Mq@=wv39l89qS;bnL?$DS?{5Y ztL#o%D8If`>S5opUZTEerWImRw)hN1j;BU0A4BK(J_R}^9P3wXS?7}K5`}^>YYKZx zMTWpezH!Fi^QWImmfoVqzQv`TspA*N^U38cnT{QYgZr{3vlr9$qvVrVe0gYM_vaY5 z+ThySYn!_274skJD|lP>?;UPIX*Pa|+rGgu#j;Juheu>46az)Fc7O0f7$vZr+J@K4 z*q=@@Q?hS$L63+H@&T8dVf_t^x;o8dlw3k}3@ruvCfaBFSIcbI#}3Utezf5u4HD__eXN&Q)1XEHB1+la2XXuzfQ~d*gRwO<3CH-Yv3>kr*?t$#c-y;u8C6tr z(%ql>SKx9u#FgNrd;(!fEb|d2dLs~J#)90wwt^O7dJ88he5K`mPNY;y$rZ9*FJE_S z%vU*NUi_-g1@vX@x6{t$-18r{PySrq1%tO}z5TPPC^}dL^ESdN!N>{XUy;&LF;nbm zIpLW^ELMVNl#>*Xlz;o$y&P7E zigZ9=HgHgD`0{(Z13E1<(`L#!nVJe2{@qknrO1JbwYvk)p`#pJ=n{s5zYYoJ7dW5pp(Nn0SN{eV6A;{rGdsck96) zFax4^Hc?tfaWUuX?yU20!2c^py{SKG0laZu5Y+xV($wMJ=4a46m!p}wJzKqHyE?ra zvGFIGH0G&~*%iZFzDr{o=d^c*cyzF1f`FIK!Y6w)K4TAd}^w7Gif~< z+u%n`_`Zx=_eZ~3%@8a5{&akQj;71`6`PFhT|h#P`Ee&&3K?_4tLaSNR^IWwJ?;TP zr{Dcw1)+i(gx-t#DM`gH7u^DoCa_^gJ0&UC?l*nwydAvc>Z`)7UKX131tR%btykpt zx1D21h!!&GI&JelOz%-GL$GyS-_H%~f#yN2TG+wB2`mj0S*^;n)L%8lVcJbLKEPu6 zQ=F6u+jPtnEc5WZx!Q;gzfu*Nt=pDr`IbzMnOZs{qe&x9$d83-^AAzR^q*OF8L#8X z+p~Qyl#Osre&kx{+$VsaJfe?TnY1iDQ$%_?OsA~`_!zVOTW=Rm659Izy8h;A|0dGL zqUEHR)`4nH;~Vk9Vhj;%bItNI$TUu`)#>Kh#cuwGVf>e_M|*UFQK%~#qh-)|C&`}1 zx)vpL0_Ii7^OV-=q!@;8alJ~H_tvasZE`KIPrK`TTD>o)+=NT72#FjUpJ}xI9V|?O zqkLLUyQF?$m13{fR+bY}ZloUY;CUv#_Nia9Oz&Nnk)4w51Crgf+BgurjVIxXX_SzZ z7#khQF)36T_thfLW2!`pUP?2)qs&3Wz%1I@%2m{SB6a)=$+H;&u((Tl%AbNFd_lpN zcIUL*(^*35lUvVNr?fwH;p(L1YTIl7uv>B7@HsQ*3ruA13qwN85xb}M$xRt0@HmBZv~ z3Um%&^BQOqaIl$0bx~;NEsi64Z*17R-{_J|G1-WAXT6AmIm-OB*4tN|y+sm)r^=8) z9gSX9f^$ZjGKOVbVGN*>HUnR$3E*yVSTuaXt3RAb2>PZSBbdUENHS5 z`}hReuzew$IDq3wxCzDgzn<>?4^2R_zjO9JW{;V@lTCIv+1-#0feiO;qTFC4Dk5qu zNkjy!CG|qk7OK^XZI#v&rC%WgSkWqN)z((NrI*#VR_u>jt)`_dwJK!!z4vy*(SE=G z|1ZhRdow$`nR%c4+;Q`p18G?+?A>(pui6>~WW{*D1Ve5w#(OVF!8CGeJJJL`|tv-Q3zl<-TyAv;t@&Y?TDJ9at*hp+COVs;uU?Z<1H z8D(2o6yZhb9vQ%k4$rOpu#s1IL>C! z^fX(+9&5=%;(8l{4;Ea^1Ghi<=ykE}U%C7Bt3Utx-Iu?3FSLGg-RSG~8PoH#7H_%h zmc(Lib==(f?H_Kr^4OlI?|J&teK2?c&a5mMow|8`&%2Yek3IOzXDXqwxo3_uk7F7$ zf@4*Q#hy8~&!J4@==X8siBE(aQ!h;hy1B=^)BI!j8hR7HiH?~u2%r%Hvub9YXH|2K`Al0aj*pwu{}#a_kG} zJz%QAiTF2;S3R;sS4hhv>8e)0*>cOvHPVpQa%=h9x!ZZRMiy8X7{KeU955IFi*=Z? z7#`{cRm8Vb(T}Yh;<>`Au8{n1^y^A{AH2VEcYkg{KFG~YeD)&yijwKU7A^QZ#@?+M zdwn1Q^6)W=zlX5>AmzjP`sAAY#>k*?&@|{DRBnwACbs5xc^~&b8Q*6b_8&|ue>41ia$Upc^V`^M+@LTh-fFwmzRkJK{UG~*_*L5j_OH92NPH*xoqU-+Abw!{ zv*`oN2gwhb>jbluYy&0O+RRNAfytj_=}z`gdxqy4$>1;tCrMcTNSKbumcw%y%M2M5 z^&--XJ;j~HV@0+YeF49~V2Y~86lKVHbkBAV;#z z9gIn)Ih_qfY;IO`#WgO9O&TG11#EEEUjZ_9EbAjI7XBe((xlyuSAeXou}U~K${~`U zFgpA0HKHLTi*A2uXkhNc z*WGo|s{U<1*>L#{%l5v}drRjvH?8X|tj<>cH2v|OFMfUF;+dsuG4Hz=Q`A!!dpsZs ztM+sL=Hy%4uOn|I+12a@?iO*Qbdzbld4uC7^=|Pthd~mz)uHhsm-K2$FUN%9ED*Ru z@Jir?`f#!f%WBLKbtxNP6UXKT2oXS9ILsUG8TNR9*-JQ|A6gFryKGnOjJ*u6!d$RU zuN$mm^tzt9ops0R*g8mfr-m=n4KEpx!I!!~ryHp%b)!|;)KO!KG7Zq$s=TpOg>1bN z6K$r191kR-iLhC_0tBtZNEPu+HHNUIYQwvT6hEI85|C2KrR){rW#M1@dj-J)s=N@G zEg@{U4)t2N3wWW2crV9Q<dfKry&d+V{E)qQi*w%1qP{OXf8-TV7j zzx5)@+b3_BxAe}XlU8KD5Qw82VeHwf-aa^V_pYtaoccp$!xyhb&)s^_fI-88|^UIZIV42yA?=uRhjiD=A{Cl>mTVA!k96=_t;&925>44Wn?$=pnF4Dsx z-D||krWBTt)S}33RxPXzYK-e>%O0Px5(oDf?BxLqucr;~3}x zULMs1fRP2F0P&p_AP2J9G`(YGh{Y-%lhlno=j0j0bEtYO0q6t_3m|`pnT(b4$wQ2a zFe{u2ux*Rp!t&@XtgN$es-Dp~*ukygHgSU-%OMC^!08;?&cQCOheJL1G}5^~4q>%~ zLs*#2$BgoCx*J&eqdZ!{Z{yJ#eiM)QO9krCJlTy^>XFmkj6>f_t64Lk@?7vAjzN5L_`0iNeL zgk%VhLYRX(+zA-~WvD_1UMdMJURQ9bSas1>W8EL)=NYI4%e(v2?W64v zeP6Et7(CY8jAtE<VuRc?q}x+761<1~2gND9x0Zvj7LIC~ySecvb%2 z0S*Yjc?xj025{~yz!3&`T8FR$uA$%M%tDSuR@eyp%d6(SmCB5M47n42MuC2(a!7f?S+%>J>;T;{x#WAFk6lI!%NoL*6H%BP^Y%kx>#Q5ToSt0dbPYdv`!vmH(Rz^ zH_MytTS9k*zi$1yyu`o8>r=u_(_@~6R1 zLk*I3j)KBi=fsNyf}v1AvKSP}9q=e_5ebUuvN;vk`jAyte!a#%kYesal7dyDb<=HgmVUoc02F1j>j1 zbH7=><>hvv9sf~t@od}|4stZe*XER#E3TQ^L(ch80w+I02d)N{Qfi!4E z|4q3-ZW&k>+5+whZOQNOe>1t;zdQMX|If)kWlgPMV{$|Oq2?X=$74_D-}Jwkd^2TW z+sf!q`>a>Dv=NL7L<(fo|BuU4$m?1I-uXg>W<8q1J0)0{8k-v5;(rUi5&KR4k8y#G z!MM3uW?a1DcZS?CcgmH^G*64oE-Z#ie9Mv#Ae#*2wuNw6tf#H7ZLn=;o9NH^o4Wub z3;tLr<;$`>VnUu!Xa26(L$SB=g4(9Hb+uiIu4H<+9==ED$*tpW@ZX^Hh1SMyNN!Bs z&flrr8QPW~Z2NKcH`xzkpT&GjMQd1*w1^y5+*&jr!#u136w~1t6RB%$$TOKps#uiV zbt#X>jWQ{MW!tf>Oh~4!NQcQ}7~Iz}iR7Ui-Zy1B9d#!@KX*j{8bY}M3M^#P;ns#G z@`60AXxFg~h5+6jV;Pp5G?;A#EDlu`V#Drddc1*mIMBidlhsQ0W;5PLFdbNBw9u-O zL+it(win>ffCesyUaSqJFFKh{x6d2FcsGirLwElaY+E)ljUOm<7+IQ@F*C&2JupI% zbD*kt;*F-lQ5UeM>U8pyh}Rygo|CeLXv!Ocf?x3|i02bAtPtlDDQ_YVvqDoIMnj1_ zQ-Do*CaKirVUEk>K|C1AgHSV5%wyY9Zcn$LpB6!VjIg^O4h#%{f&Q~52>D7-We7xy zW#Oa!y^)CIPM3v`hkD(0R8w`kFtH5xx{=gS7Dk79rA%4)5D&F*0wE#%A!H*&MCqq$ zlkickNRuE)WFZfB%b%zQ1ka5(N#1CSQ8TRnIMqw?qe+-Y;kkac}J4 zO{>0T6@-pk=iT&_`_vlc(e<78E?_w<8)u(+m$PEI5vy4$lci7=lGtxH{D5^w=uzvV z_5;>~cB2@=4*+jrZg#DAe~H=Z{wDK)e>d|yBbgWri-I$mr3{x9Wm`Ku%S=|!IwiClKnR=V-Ot)!*w$e~HouM$ zT54Cl(CQ6)k(Z*IcUFAml~h+vcMs6$+Q$R^*aYn-I&1&Q?vw9zjC^zwvp-^$zDChS zbt$|_i2D=9ggeeFQX??A@J{q`jnLpRHxl~p6dX|sEaY<9X;jU_vr&~;pY|BBTL{F*u|ErkC%*Ts&A+*2 z-N=Kt|9C@qRprFM1mA`NAf6BT4sm~6b z{s~<0{7kn)$ze$!#gd-*MBUhyn@VA})TkJPcgpw6zmmCi@;c{c`9a4H*K5ja!C%Uv z*JgJHLyX{poBel%P)g*(3eX}#STSo+kLC-fEEY5JrQB{H2HHFAuxdo+?7E$^m(TqE z09kwctSI3L6FZ7}6sl3!7bU(`CaQTTSMX4-;Gtk5nLZ{Na|NEB_{$4Pb_k=`osL z6mtg%<)yG@JmGu0zgM~Ox0@Ed51T9hePY=S@p0M>Oz$SOA-=Wp;x8(HeDRl81mJY& zfj&4jh-s`I%e7$)u{_*P;nkrRuMXT4_d z`+Fe_rU9M}^``47%+o07q{qP!1$M9s?2alYK1a1R!nJ9HH1oD7jRk2W^qZ$)@o{;k z%Bjy`1|f1hgS%n<+GK%`$1N87B?~KW$f?%%Zdje0I4O1GsSk6xwCeH47UWo$HR;MX zr>^4A==;&k+DhumKr~gEv@GdSvlDNr?2db6{Ys|)i=kA!^6TrmTvlQQX&6_+7*`tM zdaA{zvSk?3$HiB+NUUVolVu)EA4Oz37&5rSdGqeXa(F62xdr|=f4U4+6)LW`ywQU=k4Oh!w4I<{^*&xZxrDZrPggKEE?0TzlQ7K#oQiX)at zC`fT6NKXbSjszdh{0BQYNo`4zR(YJp?B&07pGAvmsun?xbPX>?$3~1CBp;TzC`@&A z364vMq9*|{v;I3l4o{+r9EmuM8zzv`>kWO}Rf${Q<|rU>+BVrl#|mc|A6DCHCj4D9p_@+JK#Bzt8aQd{(v zo|g4upSRDqzJ9xRyKj$okI&ecU1!{EWV|gIe^*Oi%RTIO*kdiMiMi8wxP_T1Vkmq6 z5wQ~-h!&`P-bdv#+=sR9Ir@~QhZ;OyZ-h@ZFqTwAg6VL`MBo^rAPeyXWTA-7)@9#r zM^<~M9T6F^$$rMp+F1fyI~EkjhpC__qfd0Bp}i{st%+~~(L`vOd`v#(}FCjWy>ZO`awxGE~H;2`_;})l+msQ&R&%kp{QNk8whmdOe;pPCtZTfzKep+8;)(M-1Pd6MXQGH|Hsb;AALl3FiQmZ z;Uj4>zMVcya<%mSz8O1b9G!7&2J4vda6oVA!c&Ct)~H1yVI`nN3SlLqMW%(7iCP4O z6@wOagcU`LVlmmMMT=o&f)>TA5RJu@i4!ImjRuryYzzbx(e8*KJp$i}KsAz!^hI_? zjz*3}_(&P4x?i5rGvn|KMx6m?Op8Z~U4@^51#W^W>8Qq?AhTAD|3s^uoH3 zDtj8UC8*CAViS9R2Ud$Gwqv9^&>L*XGK!z_oEYIny15tMonay}phi&bb=`TFVcg3DfYxK&3xoG4?^>f# ztwp2Ar|GGpPrKZVl;3#qW#*z%I$ zkXgJQKs!4vgO{`gEkswLL9|8Rj&|t#%)^#L`9o8FW&U-u*=~f41@VY$z8h?Aei-bA zJ1swJ7L9@aKiL=v)7$>7Yfa}!UDJheAWCw^Zf;>=CjqZ)<~#5 zG;OL2xN^vn15DEE_96X~TzvSB5q zMcOA#P}(_`RX8h^X5p}s)S}}HZOV8EK*VBpVq<0!0K_@BAXjkaas>d*g-P7B9GFyK z+sqJ|j0Q;%EPa-jEXa}&SV3^ReY?Hw$}_DIEJO(s)`Td<(a^(Fr@a8% zsf)xn<{}wWfUxQ_K$7C9YyJ3GWyu8vXJZF=g}SqNtw>moB#v0BC1;ju%~{PYh$Y`S zk6`V9_?5A_1o{W2EYYQGzHw4^a^n=Xduex?WRw_Myl!)cL3Ngz%V&-qkW0F3DUlM$ zAxjD1Geh*~@Q_T74)4Xo*&>sr)o3lYo^uw!c$2(X-!_3sCWv4)^kOi(1eWpoC>41r z6?vMgUPfCjep~Y=Rx?oG|1W>DwTuJfsK11qvmlbew-TPb`M(yA-rSaV6e|ss)-t0n zo=1a|Guei)*LfqXo2b+`hvDBFX0D#=-j7aHtT!*k3VqV+O%&iyD|0T;(IVa|o6}cT zE_d`od3h@2iDI44-7($y9H!Yitg|1)G^>JltMND)$WR3;)FX@0)#xU)Ro$WPQlC>z zFj9tJ*7KH?Eep}5A%r;}qea}~6x)P|A*{$+R1K3Df({t)r+`gHfhb}`OtihIj9%8W z?*GZ$mLvm3Gy^?rponI8Si8LYoPu4|u1=n$iI=3Dt(%zHL|zSGd8O>fYM@=VQu9eh zOrR{B9O`9Q3M*#Jd}^+yP(Tm!Zw@S1q9&lI;nc!DpshXiUVc&BMGfXvy^B@Z)O_2O z-}u66c#}}s9&c6GGS?AfIS%Xf4X1a{54)V18$p%#@qfqbm_saG$M>yXXaSGyGZ1LWa+X23o+XbG;?QGuD z{JQ5g@8Ra(dEW9KZ65Lb+52bTvF4A#XP$rM;xpka&-CmvxYV;Kd#z`^?^W+Bxi`FT zhcMr7GBjn^L5n_)9VbERCJiYbo3tLa!4d9tSp7}Gj$>xG2 z{1?T_Ia}?}z70a8cNVuHXb&QoM2(JC$9l(u=pA$h364m_E)(rEq7m&h!VrvzItfNZ z?RFc)HitdpwA&+?8+=>0CU--FBtfM3MZ3gMNSf^PZ8lZT$-2zQnDGwVFj(>AdSB}DZ;x>Z zEOjuCIO~zaC-D3|ngUwIl97?kwcJE(hL+98>~sax$OyW3tuvI}p%5;j}j95R;h#~iH=pX_&*kZv23PG_C{ z1Rp6jI*=j(WS5dANu(N{guF_C@;l|MhSyB>a)O8q#>Bz}3SRWzQIk4`6xhd1AZP~P zBnTKgeXEk_#Mnr%Z~TPu!SUSO(*k1|!>?0Y*r}(#dluWCoz~#McSU^w>uJXY1^k?1 zT+`R=PYJsWyJYqzxIx$q?-JN4qB#W^SBjUs?O`U%Ai&5BDUQ(@j+qrCSmEy|szE)7 zg0^;9QYBPP|Ckl1InjyRb)MXx{NrE4TgbrGFjx+?Fq2zwf0_w|oxU!D}kNto)?18h#nJ!zr)t zowfO?$_tg@eRsinI0;_*%w2fxNCYuWZIA}Ix0=nE!Ao&pTQQrt(Ysbz8~A*xFLQrD z*x)@FJCypZ^4q{~V!SUYXHtn$yp$ZD%4L=%uSxc01~bN20rUsz0&@bt_Wf4jo=U+V z$KLY%CiYhH&D4i6KA=Z~DbYe$djy6RL5pI>@6w_ms5aCGQytOHD2he}SAELub|Fy^ z?Z7YlbAH|5=jZ&hGBtlX$Ur@_Cxafz9L^lgFqsBOMLeX!98wVvBUTHg;hJBKN_fk| zjhQmMX`eB$;%!y88jY@zH2spjssj*Td#uhA@WxY#I!_`G zV*$KN`s(vAu0-?a`PyeK*r3ZH%+#Xe*+@tokD(X_kos3Zx|*&x00#gqPv0AimW4m> z?+pe;SAALd+fc8|NlDFxm1>ESns|W=jym4{gWuB#+1Uz9_qn*303Qn^<`qVt$C`#y z!I}pA+ku~N|Lu>O1|}6R39kOy%-a{_yU@**8wbN!(`XH^WqQeM&d|muj#_3I4Br}D z^0he*lJ_;UvWDA$>CFWauz}KB-88sFxF0gS1un+3Rd5}=6K)3&h(EOc5lF062a_SQ zNMydomeEl?E4ouM146q+k?3wD^@9bMh@zQEN7}=VtOK3PN9G)}Qe(84(o-nqZ%V;wMu~c#uS&#oY*_cD$oi7Gs4L^`wTZmTsx+Wtp<@>)~D&fKXXDw!c>d zlI$)Ee;w+T8A`?ZS`|1)6!t_cmaJ7k6Pk7cc$TEArDX}`&Q&8{+gf?G@~2hX7i`=N zw?eF^!8LtwGr$tK2Ca$R3~xp^gl|ySMb^i+!p-V~jnBYm;s+BiG@gmMc=dL8 zPwe*OL$SxmH|p91po&K^D4%9)a0T3k-m=J5VUY zujtn1R4^DoR*MCj>!O{e#Vo0&#Z2og0_|B1bz)@@Y5V0CsJHaB9BpA*3L@noB3%cO zau6}%c2N%Eq9j)=lt$9!02`nK*)*|6 zeSUdl%<_cxlHXf1HPf_8tJ?k`(AX4;hU1OVY#ug+@GcW+$b)Dsr#9yy7{kLaei05- zW3W^^h||I;Y;T?za+XrW9(7W2kEbX0%cY!b#R48ydIsF}tBtIl1bc509^oBuCnBoJd2HlNMM7r51x z2P(z9Y7WVP#M~lfOVj{@e|huBwnv|V-kz;%PET+Ir0>7-$Zc&`qKyc`%DM}gQ^&3w zZz(4#H{ZF$guV)&x^>ed4r~<-o_Uw$Fn?-AJ1Cy}?Dsc7E3}frRx6tVbzHg=b|T5v zR)*8{qb;p1enw$ecvtvV_*W=AXXY%R{%{++*0|QZ*0Rpp7wQZ5W&3hl#5;|f&6_Q^ zTQ{elVxP*(c5~ibFc*XQU?Er}NdS$k8dAe`b&dIna3bnpbG}?C7tU!D3KNPm%`@v4 z7#Eor%Zut3rGsG@MoK7Q6Jeb{)dn$W4^}YI6(}&wmv^g&lTNSVdDbK>6LIgL#S`LA3E>W@YByP&CX*#?s<*HSi4J@ej$%79)x<ubDGg80#~NdgiD2fB_jblfxpK z&Ab4ogA$xhQ(OqE?oRh(COvSH6f_Qu4qzmzYEx9w)=El z6?GF2&y~hi=Bwo^)5OCAu~q>3tEEFGqt{wubJkKmXQgWLQbl(Zi%mXX6GBa)kh7_k z2}(^o7Tm+VO^h>2`TyD6hmQXYqmp1)tp`X5)pGBv6_&Pq2#wVh#S&vRcqA0UJQKHf z@4j^PUFnG*ymTe9-leRGd}r*}iE$FCW%5}4k+ z^Ri7BPt4D`W!3dxz4)PbB(5Wrg+IIZD?PU_YhKk5`oY?J7To)bqA#2!9)*cmAKXLq zK^UU6)3yvQL(788Lf66T&~?GtpyCC^l`bp7AhsM z1-h|_x3QPrqv{$+e#@FLI>J{kcnO;{+0pM2`{vOVslsd_A#-yp-(L`G8+YpDm@UJaERNnw z;Y17pqE(xlAk2_c1tye5DqIoEmBWo2oB;Tj{3Y_EMHMPWtQr(W&F2c zvch=s9yOckgsgTQv5#d*5_MBa)Uhfi=0qf7qguB)okV6*`N`7|0x`9#K?ZuKQ#*=s z4)*1C=Jw={<=9+UrGQr{;8hBEHDb4Ka=6B={K^PKm2{~qmAf!pQV?SFwgz&|H&PjgT5yM(7*PrA9U3)`*R?GL%PYuq)i zm7cZi2E(AnEpspSbZJ-d*9hElVX3&>aG7PPi_^6(uz*?2&F48)E3mDu>0p+Hi}Q6t zN=&&@ZVs!-T2AZHj%r*jL=pfNO*Odv?s_-l7R=-k6$@4|1TkzO(UFdBdGwW6ULj8Z zYR0?n1RPX=)g>!di-<1{dqPUMd}gz5a|^sG3If*moLEuec%Gno(d{7}4Z>EeNCG7A z(kT!0{3++w-P_$K+^qZkoJ)6gx%RkDxH#3-#2keRx3C9?(c`GGiwK{<78#TnhDU+ceI^&5fJ2rmIeUf&I!dXE@5m<5DKp zeC_E!GPbpi!J-lK7mTIKnRkU-FqW2>OU^~w4@j`JF5x6RmN=g?6ot8%NG zwn%KN(i>V6{#+w_m2j1~T4Lr%bHg)JbF%DGWpVc69MdIqiOY-(D*yvl5d-dQeV{Jf zB$SL}!NVZ1k8e|QQh+tusw=D5MZpM-Vkv1Sq=9Lpof5|@ubiz>Q}hNY5D+EF5WqTP zC?onoszPf@TVk02_;!-YE??*GkyCMqd_g7S))61qM(|L#)yKiR{ViL zNHQ3xGgS%T6M<|{6eGk>pUXD!f6a{Jg!~Ek-7-mCy zv8kGxO;fECjk!XuX|QQ~6VutWqN%5;j~*OrI?*IHy)XVry2PmL_Ztr(75L$2x=}ZE znU0zm)01uE%jnvDRbnK?u|D~@R~|h{O||ssduOe)^SV%yT3Je+=O*GU=h5r`PO#_i z1=-Rr;$J~-r&TGnA1qCXV+hkFA!27LAA5_f4bb>*O2xLX!{>9raziBj#KKy*nlM*d)BCo6faL-~+(7~)e z#|egQtl%XE=P=(kE=7{hbU9(uK!#2DT2TV|M1Cyw!&9Q-OFn&;Daada(Cm{EZE!uf zN#pEcQi*M`ma?+5Bu~=Q`Xpu&L8fitXki^#Z`&B@OK)s^D6%8^1bjl?rR|FBiayb} zEBk!(`S|mRL#+ooek8x5yrTZ7ba>LQ?7vb!HJ+FhuxDk}9#LcIR3@99Am{8kb-dP+ z%%x`lvmH!QC*>v`oy5M{2-h}#K6^)cOO~CIUTRvZF;dhQbx-V=G{-+B$=jV77|UFx zJ+3{TVQW+yVf~ZzI$I)xY(UGfN}Mc(;^+M$Sqdf5nyAJ6UwNfAkVP1iZF4ee7B*^X zR*u-@h`j^AMtcV@3kvU7@uwskQJHeE2BgMIg*kXB?16o74?GNy!4uE` z%jh%RI#r#ou2dPd8ANtQP^650a6q5*z!))}?8c@a7LDg82GuH|iQz}7&r&19|0j|= ze@~jml48Jatn&}yl_8BD@DJ>tvgAM()Cg%?yaF-$}H<7rOev=cu=cDx;jj}P;8(5sfJ|eQvkvjOc|irSbu6<8$(kx zbwe*k53j&7euc6Jj5TN31Cj3+obqq?U0Io+tPnj_Os_GsK=@ro!lk z8<&k9Y74j&NyxodIo@b*nOh0x;}iR4LcQ|O>mR%l-Ox2Ycl2-d4wE%A6TVxDwJf^? z{k3w@@CvLFK%*3Qcs#Zl@Y2dx+mbG|o{7gf*}r5t{3_i1$d&kr$pqpvDzCw&mXymS zyKE4jvU)DMhVTpr<{7()RaA|14|4$8seSQOM^VpR=Dp0pX)J$Er&A}k9nNp5jn!`z`b!BtZ5RW%B#4fAMf#1F?6KL?!{y=~wac&#TQk=Bw*n%a{xWeHtv|3x` zsoZSqo$MC#L5WmWN^y7*mP4oiO)|tDh>k0gsBa%L$gqRVb_VTaAhVg{ z_dwW%dJw{DhE#@4`?Q}gqf1o{^OHnY{CpQpyK3rtV=GoIy`UW|mA#NJ3x6H%g?7Z1 zg%d-)NIn<6)o6Q74fRxJ!gA&JFjBczfSsRyW2~Fw1lrBmD z*45E^epg5M9UA?&I}3C)%6Np?gWx-ikLA9q;rEl)js(i1A7efD!tRbF&Uk)*M+epx z=fgjDRou1qj`*JDRIWh`UERm4{dIL|r-XVWh}V}F5)jB7n?Q`c17jgxWC+n7o~te~ z8T1fdVov4yNH2gvZaar|a**4c1J42k@anz*n}7xu(Do1bE=hkovbeN|I9cEB^A@<) zOo8-iV)42T_cC@M&;i(X)?vqLF2TpYrw+Y55g{%jIP&z`d`Y0A&`5*os)XN?$%7DE*N`ii zbP0c`Ne>3e-iBW?mCyWA50Q&ZCU%n-dg)m&y}~QULqdB43$h~}BiKUfrit0<^pWf+ zA&+0CkH9QGpi0c)!*8e4FU!9?Lehm5eT^}&HIMA`TcBMHmj*kYk`5Rcd)j^rxFvrl zxZ8Mlkq_G4ZF0w82P*~Ua&!4<>a@t*Hoap@P&8Ns6+~viIfhxrS;aZyrnJqPu-JID z@eb*B!|g`v0{3lh6z*8jfqKL|D70tl8Vk>3qt*mWSZ$L^rj)T{qH*Q6qKqv@M9jt> z6Qj~$oryKIdr9IAH5WqWJS@ z3MM-jrloMnRfbpVAthUC5_C&R6}p5$fsqAxLV%>b&6J5#K35H=^bZWANnfF~JW2{f zNd4GY?(4_h7_UhWV0om!V}#_&rfsDvFUwXX_z+`)SbmSxT07IY%8cUpK$LTgYi(&o zyd)Y##A^{Xg7~7bqyk&e5de0FHEa&RNOU|`3V>Fzpu%FoXb;E%Xo=um8{ZxPG&V{? zEH$rceLX21#`*!)6JY-UAo_WSoocpeK*dTEe$ot4re!)Du$0EB7NRE;eL*EQoe}HT zsxHH(SSz-9wj_VXLFgxewGsTdB4}ohD?RB@c#Z@lPMRH@ocyk z!?Ug|numLHMz*~yN<+P@u@<;FTkJ&A*T-7F5rw%L#pGQc=h@yZB>&b$>)}X+oU0lW zCF(QnpM++7Db_M!#m%9*pM11)hL~xA|_pc1qLK^^0O#Rz)HWZJFjm7oF?F?vB zgFgblkGzMxH^gy?I3ShE{6a4x_)l)IA=0JzdQ=)xzDRHHIDq|E9Diczn-{1`ZpVw##i1;YX zYAW;@l>i9xidt&~Rf}ej@34Th5^G@TQe~eDAgwHVhI^49DYRNo8pBs2w9Yld!}wRt z{Yl32Hk^W$EEZGffw8z^M zSmzxGY_)&cvE8=a`viOpJsaHzzXyLP{LuG-cs%fD^(6H2XtsT^{qFGH>R|LlRIsV= zg)_&1inlOkOCSgco6lj~>Cpx?1T_)kPbN#If1~_H~4S!qb@&u#1H*tXwvN` zcnElzuj=_6KP58dIrNokSe;b%cMtTB_IDrer>K`scZ`hmQvq?@UL!-p{NRSXp&slBqF~sFKgQ^$T+z)E7KrcANk)~mTJau{SBQJAj$T6_j$g?0*$m~AN77Yx zNeTtigaN(X-F>8k^ajB!6I0T2Ad9Vr88Zr5LQs>_nL32m@$Td zQ8TGT>9Mka>u1q;Dkk2t*ehmR`mc67cJUIrbi9e(GRB#&VJz7CqLNG ziP^3{ZHBf+tL9c3jg=D_zWvJVl4;BL^e(@8`h-)jyaH#;+x1P#eNVmptr-DZwEs2u z=G4AY=jtE*_}2vUNhi|z%pTwbL1y?o%uk7KENM-o)eNxEp;lY&%IN@-q)P;_357^e z66L^TqT5K$JOD-|ZWBni14Pp8hRM4H%Cqrx0$V=w27L#f{P-ZD8n(%3r0j-h|FjmF z1nRpf`eQ{Pd*tvrH6Z9B&C~V(W~^q1-bD33R=YIB2&&71D(n#$AoK{NfiNrF%YK_3 zVj1$U1pH`(ViN@Ioz8FwKPQ>ur^Vz!o)!-lH#udoghLl959uREiT=?2a(8#Sx!SQ2 zlLrke+E;kHeLbMZ`3A%J)Bsj710}Z}D1~WjpDD8oVweb?Fh#{wfu5dUpD8H3Pg>%* z%)P?1%)8t#Kt|#PNi=b;S^O4s55L*8RlXzmD0;@b-|u>2IvwC|(@B*|zx&jTLEsia|9gfGO#|&k0zqH5j zL-Z$f%yiP=6psoJ2uB6fPe!tKBq?%_zzesqPLOlE$gMi;CHo53Cf6gbcU-K?rTl_) zDLQi$izO089;$|o^_lh(S>sC;NFXA-F1k}n$?Aq{+?(9n+>HCA(>X{=O1FzBCvFqp z5gA$3Mf@b<9`TsSi%(lzEZ9QuifPd8ISc96#Q=+JQ7y~~3$&0sk?>ktri7-{bS7-R z%o~(_1#lco)0n^(GqX<2%*@Qp%q)x1B8!=sEoNEF%*+fHGg~a>{N9)3PbF1Js_t%f zn`ft|>vndw`+@>SMS$u6x0fBp4vI@qk($r{D^wloQcG>NVAhugjvWx!cK;>yxlzNh z1S0~$A1|rEeVZ>6kfo5yJ)e_Ubm{j)3D^$%GMJ&t1MiX$eKH|Qr}4_ZRc@xG1lZ*g zD138t%A;hj()^3+%oPoaV8slzj43GkL{Q?Hu)xPtmshT>z#77CeRa^{DQ-(_If;=b zXU%XS&U7A^Gnc#qyiPmQKbKw0@4}H;Yw0u z>_tHM8KV6KL&l^(EzCRf{JLAf>8Eyd{xRy6x_gToXb&eW{scbxB@u=>E{E0n z^F<%YZ<4wG+x{lL=!6NAkEVj}VmMz##~md*IKV3-oG>T3I+r7?Rk1(oSD+6;C0w1IP|eg;RdKty zs19qQ;=8&F(%3c&3ggfKw~zLx6k=@sw&5JOj#89KtR%kch_7>yvmNgD-W-N3m8j|T zb;;{ALDRWg)fNln%W-K#{iZ>DDgRY)4jZ<|Zyb3Ds%;sS2A1$d*@4oupRvIRSfdua z)0O?hHaNg&VpiYI{Lz68g4CBvdm{15x|}_=$Us9}mCJU&?Uw#Y6u|%O<9OY*Y_uys zpX~LuMr%$T%JcSD|E{PwqR+qtzOOOk98zRav3@|xr0w?Y?`RcV9TBk$uh7DiQx5X! z0b(OzGwwSbTdgR_Up>m^4KL9EH}~ab6drA?8A=9;v(x2CiM*WY>(q^^di*`^)EaDe zlL7~>lMkQFBe$!j-%H`ma_j6zQ&X>ekKXPsDXT{vpI|U#0Ev0zKHlYI;=ibmz(^!Q{>x> z%sRs*<{U@~nVVwWc}ffTHli(31E{!CH8i(8#XVGJ#Zny4=D79zD+jpuMBDDO)1a~8 zP6U?24A>sM?o1sm`Mtn;-sGVNHc(eGh6IW8{Z0tgqjuwb2_{bZ#M92?!qTnARQ+)D z{;(sz(wUO?Mq@+GD6-#jUaBxu$F~_l>BB-*;!=!T_&)lY(9UHaiV#X-idT|?b<=So zHFif0TzHIF%WxMDS`S`svpptT5B94-3(IOZ>MsIL9JwDnw+h>%x+-|wTzX=P@#Y8f=phpN=tO~!8GU-e@NY_(_qS0WvSkqxEKIAl zn%&TQvciq9MdjOiB41b>$!De|LVkG#2T1`(!m~VaH2Y3tQgv5hrk) z&aI@o7~{l^K0F!ICWrWycNP-Srb5Wa#G%nSk$=eJy)PQ!jynr}(fU*ldoz_A z|Ij1qlSg(7W2EV;g{mTMU?Hw)p0EdraFEvWu<)yy=E!s?VbO1C>6PXo(ZKzPKe!o} zP}g;1Kf36^I3QSq3wdIFvTQIHR^MB`f3!XOv_4AvcCUAB+ibJek|pp7MTm(>%Ts^X zlyg-=2RF^MbT3!MAi(b`E}}X9_2t7`_%Xw#``f9v`vlWkL|=q(+ZVlG8uD~5lby!e zUAI!~%T2fK{nPufh@G$u%vq+F?LR-qyfHbN zJvwhj=aP4e9q*YNJU53zF%<|_o<{0NOS;nxP^JgT?K89-+qEi(Kv+^XK6{#MVP7si z6L?n2QU3sNZ6T%NsTv(RF@#~ZzQi9GIT7chM~sS>){&!X zm(EVl;B@Y@;7IkPXALICmciD3i%PiJC)t!%gLv_bMq1BHgwsT>-J^?XM%zlr6HIuF zSYXh!1(njN4ItC+wN26NYjB5$CRML8Dvuav=w74k&Z^Gg3Y^?ao&FW|>0n|2hCi%U ztkYbcy4F@vzFdAon1XPDQbm6c>WY2V#G!I|_Z%1E`@O;dn5H&8b2C@Q0P@YXI8h3zvVw6CJG`iB@EwYov5ddd*EI zswPgHva(mXd)u;G<)iJ@vwrc8U|}a}XQJcCxfn#nVZj(JNxHNS73O56&7QN8ryg-m zWU&QyvzGh<^Fe;KrQKI%=1nwDnW#53u|qbtQMtQgtXR_T3AwulM|QlmeX8LR6ytSs zmR1F_t#WMGGD1jhu7BWXNO>?5tsR-IcNmAGNJ&Q6y*As{cln-7kH5#bgPxrOi zu0MrOYV}}AC@OeJKnOB2BnrwyJ&Z(ghPoLXA}8v3A&}WilE#=LLIIG$4k4wrKa796 z=pbih1R&5p32p?^GC&d&irmA{=+D*{l0k@*@%$%cyp!5dOdGV zPQa%?!QbA3Y;oNjqm;6HJvQDv@Fou=s{Ht|=M>+&8-ZG-ki|JN*h$^Ls}()LfXA7N zIu9H7BXbCAn;%}onZA(?c6TgRo(&S1I5_BT@@Qm*RnQe}18EyyAS_>K-JbW9NQzYG zK(rqe(XoN618cP_oFc<{?^b6|&Mu)b!3_ZsFfj~UThPvFuM2_A^sPShC`-G$OA8yP zp1OExes9Gz5ap&cD1@Pil4R@fzVEElB4k%SMuuG1^uEOsiMxf!m)WWcl+cBS?yP|81yYR_6etuQL(-+tC)iR$PP*E0 zxP_o$jV);?h-~n`{%A@+A5lTBe;XQzcBIxP#75a7Pa{}3+Rhy`jDKlw$7DG)I-Ndv zeZ6}Q_>gFb$sf8sI6yjzI^C_reLh#{2@mk;>P9wTWM5`#Jp<32!Ox|_$w6es zfVlOm#z*u9N{|j`3z;~V6Ly|8lTDx(YbNZEE;^OuXXiY~jwU(KbD!Xzw{MeCl zxRT6B`zP(Dj3GkzRlhX+!p%%)nsP=kKe!N*gf@mUD|o;D4gn*FB}rw99vRs4aGb%3 z9>zNoE`d^;y21|>7*FRyjTGk` zqt&$6AeEn`f`EJnsYRRtTsfBG>w68e8BH+Fd*R0!$AExyKj)FgOLDU3Y^vxe>=FiCWW;u9LA)dUprsKn%x^Ag36{YC)O9Q)#z1TGkMfFV!S z>?n=x!NQvd7ce2Y5>p?QltwoR`JkHOgA7H^VAzmQY@H_0xA~>Yn;ZUN4 zYgQ}-?5=RHBZ%~vhE-@nc=vqu*D?lYCg-l&L})K|k?ftw<>Dx^v0kfCpKL+Um~9XdAyE)|Jh*<*qJ>Pad`e&#`R2py4wkPfiykipoW z#<7eQnhlz_&)o|ldcZJo-HP;!_$U!&!g5h0GSz7em%S1Ds(oGTC~k7Jeki#Z@$3qn z%Q#N!TouZT1arTIbxSM(M*I^JfkcPMco^}=DR~=l`H~0rQrs>}7=)>LPx5wLdcJP; zqkg~I7j@7a?$DBk!LPc!0qL2h(6bT4XUUCe1dC%>)MjfQ8IiaCNzCDwvSy_i7y3eK zl%RK|KauaS!`O|nGMh-&LXqHm3yt+n$7fI&#;LbOlzO#XX7SVq9iYLkdKPM|s2Lg} zRfv71M2`juBkq5CU@UD1_F|)#c~!=oVreUlN(WPqADEDK{P1mvDju6RYvY~O$rVG) zit;;&rM1cF+=&dCy^y=r4@3XrHG0D*V~j6c-v$b=k1Z-7%X!-a!es5%TmaEpHR0;o z$W=niRKxq_=rBtj#n<+VKr?53-GwyokD@v)7B(U-Vak}X7OlZ=I%DI$ap?iZ=O2og zd5WhAYL4ol9kDLOU!S^E%`Q}BWQ6= zJ+b~+2t3*P#L;RxTnLIZbhZ}LZ2OS3mi_H#qU<^13L9_n`MDqWB6b&2c3LK$+(~wC znl!PjV-+ahg`9BP1Zn`Q9|OsJ4wcto1q{Nt5PFxN`g;b15gHpl%;9fahUlA%oB~S~ z1*Xc#fj5YZ98;ADRM0z09EJ@PMg#}Vyi_`x3}N{QyFtDpalnkOb_w?G5{xzFA!Bb+5rNOa>f-G&K zTcaM(#&_{z{ETsVlol!^)+fTFs$Zk)LDDSi_>}8F(kLOom&0j;Osf!EX46l0R(Fa3 zsHD;(YI=$pz7HStXuP{?TYNa8=8mkK$XRgmkg>mEvyJIbb(ce&lqAS!nbUjZoVYz; z$n=cwm{LwutGaEpMGJ{DkSGSNZc06*8X_scWB^HI9&iY{;BtGGh_f;%6E0&4tJ$=@ z((>P#av9qQ@EXGoiK=W|O&n`0+fB-I)Z&c&em9F`dXs#CVmh3!fF7Y>Ni59vOj$EF zNu7}GWg-@eMXqvJBob(=w`%ER3vK9EfETdkVQLOB=G7WwfbB*gdHuD|LvM8|o_@eH)(7FQ+6Ce+ho!ZBb&AJB~H6-GvgcT6PY z@7)6y>ml&?W4D)2v^G@6+tMj#0OUexgaz#u?(0Nxr3Kc-B>II0u=T88H)gkUtGrZH5$okrY|vQ}Ku;qZ z9%ic5;e_?8l5#@6(bKR)0Gkn=9Q~@?C2g8MXa?pCB0wOZ=eU-Q%VFnMj$eV!jDZ$J z8;<*xcm;E$PIwyWnN^e@9)9ofX%yQg-p2;9RD8!Vwupo%*&yy0AD>PrC`V84?$SzM zvO)Z>{(cjkOc80Vjq#QP)BYO4cz1pdPN*n?`3I)umuMY>0(Cv#Q0?$$n60&%uDh&i z>+#>6ysBU)+es92aAnA)s>?;~I{owd@+aH&*qI0O)qtD$-J zp46^pS7^94R0w^CD>TrO8d`^EwZaS9A1XDM=4*8#T3z1?BKMAYnBjAzWvn-&RuJy4`-z$$&-AfFSUK1v!8e0_o#K#?exFEX3m^HP-w)M+nrBzhx8-7xC z!R$rO+~(pW;_H={@%tLzjeq1-S3c9uMJ%MJ4&|@bCg-%`ci##e{C?M70tWlz>P_W2 z?j?>FNFGHa0(mP56{7 zccd=OeJcB-(7bUzblOEmO-uby+unbP!KRsfP$;9_`7wP~FgF#w)rdbC@CY5^t2@%F z!;t#NC+(^bCrs4+h-WkTf=b^95mr!#?JVTeZ4zOoj|UR%heMC3i0tJ2gO^g60C^Od z&m>0hNf);Kh_+Ue`ijj2&M;=AAD@d_mSP?j0v!7g)W=_Ez9da@9i z@@`aQJUB|O9`ab}9VY^cf$$Zqk)B$(Iw}qv*@;7<978QHc> zM%-%Ir!3@VdMk1<8-s2{J*!3LkR?k>IywmnE_K8j852P6mym5_U|~mF3J__vCQXk$ z5O+q6TQsER$mU5gDb30%lyVe9_!Yh(npzY>`?hN>8C%YTpd)P(Xk_YM>ek8jROKSF zH_$pVC+x;ema}A`g}kS_wo2ZfW*YIuB>9OHB)lkMt zyob(ZW99fULv4$l)#=kW5I3aSK`j)`CVJypW66QQqovMIMwSFd(h9uovnNM^m3S`z ziXgM1xiH#5w=gkYYA<{j?2eZp9R)pKMrOzy3tVY@CIv)Vh9J4O!C=9TaczfGRh9v- zA%5Jp7ma3wYAhpwPDM(l-Dz?oBjo1IKAhjhhtX2$vOV&8^Uy~XG4e%_R4QRG~WmwT3?3!sPt?$ zT&C3Y@O+K;&(e8wxGFQ9s+%|$t*^B0wmkzjB1c97)|s_(YsGfMwg~HDk~rL!5iFX# zIt^%`H13Mlm`jA?TlF6+$B_1X^y13|v8zj4K4(jqz16w(yL4_3w6cxk&EK=<(&fj* zpVOw?58Op$_7i*`wY3+_2(Cm%pQu(2nbQdy z3Yt6jSWbG>@f)bdSD`3YY4E8iJ1>0XBG@N%5jge))GBOZnhy_WNR71CRxXHm-1RGG z7}6E>uJMwgvPh4OLP$YLs<#}9F09H1n;jfoAoO{)PtWU47L?t^o_Ab51l0(5EC)Dj zDzAI)O;B8V?B^^_{POcWUJb35^}SK(ei^B`BE)$c4>hoPd!6-bc`JjC=z2LD;y$!V z!(dU(?lOa>JA4Uum!ilG1xwL3Y#gmnf=IkWslH?ja}EbR6Q|pdLnaQ?2|2==EXEU1m%=ddwnK5GCfvftghEOWq<2ges`LD z1D{VAVC(k9&Q$`PY_2I4>hSxf<_RUaK$-9V9i_~Xwgj4F05A46tbHyzcp~StCxfN3n47kV7jotRC)E-^mMuSZzz)~6`IU|lRt}Lu`@BMj0XLN?S1U%s z*ZDFMqVU~udN0why_#noyRyasOIu;+EEQFWEx3*IQNn(;>l~brwYf++=5|zH9fz0eyU+R~@OAuWIc`h00)EV?mPvCnE8IF024g1vQtF5@zY_2pTW~~xx=Cm)<0dK6aMJ3xp47GD42Hk=g{=-E#o$akbc$2%3r3f3! z!XGg4v3b$mMEiu`o~T%Ss$uV{v?3SNUzL78kXZfzFFb3uRyn*82~8fAwWHp+?5X=t6>7Y9|(?p)oHq zpzcQDLixFpbKFbe(zG7qy4gt%;O9QR))BlL6iE}aY*iQ{(AI4sr@>q|cy*Jy)>)04 z$_7)h#=3PWeOw0@`!?}w`{U28aj|z1gS)rMg(HN*`6!6ckvl;rk?l!;vq7hzALP7h z=*1QpYjPP%MtKIK!+cmJ6>)uW*w45rb5YKmaG6>d@FP;g{A^MR;n2iM$#0n@h7zwA zmZ|uwD(F8Hx5_pN#oWb}Sj~x6IHc1qNocH!T+$wiaF!u~E;Z1)a_qK9OjXG%Z zy2J-^?6kT|Kl-MtjJ&<+;)nK z>L4dT=f`bzl8)+ztD z%7)6@{7_;zMPgvd&KSlrI)`er8sP|^qR+(p!N9LY_q67I#q!JHu@wGOs6GvjtRION)hDX$M zB7N_X6Li%~q>1|Z;7#YUn8Cne@s;1|j;@}n(L_XO*5n|Z);CTQ7>rGPE_PWVFvGF* z#?W}SY)vZ>qRSzN?5oi$s_x0Pq2XFZL{N<8j5WB7e2X;f-Meb5&jx<{3 zQl!0He~`A5s)`k*R1^HPeYl@pX8HLc9HmEbw6n*pT}^LYaU6)oJv1oJHhnsy5Yb16 z7R9(uv0ZR$!H*skv(dEqtkMN3DusX4YHxYfVXK_}81_op?={#3e#$W65jUJilSqBi zRV_?0KL{{+cM?v%?OuJ`wYe^)HudhN`TgKGaw~@in@*oWf9939vAgip;k)$wr%cbY zgd&25!p-x?V{k%4pd^Y342mf8ic?jPo1+_{bL~-sJtGGBL8U!@gX#)9WJNcx7M*YU1v9+iUT8$=n5;LapSo2cbQWn zP0$|^TjiE{xMVPoQlQYvP|sI4`HlRdT~h;JqPlgUhQ|TAISwb-PvTXwNlRs8O#gGNu44&%zSOdkzjwDOM#``$#r3$315s zgin5#7H>R0`3_28l>zARymYBF@g~UJ!bGOORuj9F7&2~&p?>*JcrSTxy^7TI^B{k; z_tR0X%I33t_r#MWVhAF<>HBJ<2AkXFe?1_(JE_uK4-F>10gH6w0%f!nVoOSh=Ojsc zQ=FX9AVd3B=@anr<2MPK7TFeyRV~dWxmEpg=d(E*u0gRWiVDq`&Yj=V-K;XBg?H;s zw+7wY`%1m;9}#!;=1r+>e8i1kVEu>I@;Oe>642$kc6MlpOH))^->|mGh*-{4UXsMMIKV^7F8H53Pj4 z=GKCrgPxf8B%bxwWVb`YVZ%$=;<*Swr)?RSuU`s)$ybi0NYpQ19pXtp9x`-KNnHkY!kG4 zjo>#~@_hegd1x5DKT#Eaa^|&#d;2KBRLJ**+l{U{(4ee(Vd?a-*1$0L_eaUc^Nj4e zMk&KDgZ&TfSDW|oe23cUZza$3r`Q)ZFR=N)?6#G*_qJ91DpJik7sPG*$lD~fj%&v( zr>He*n#N>@s8OLSRMC_(iZLz|)(DFK6m;JId^g(L`y-J|Vy8>EKImTdFjEop>*nfo zYWTVTlqmY-rc%kO<}}i)EDpJdw*zIc@PO&p$Vo=NwRStYFU8L@shB~wrIXrqTiTEi zeZ&xlB$4GWt{A(}4!E(V{G-#?CC?llJbwPLpmpQLg-%JnIq&QQ2aue0xd;K2a1s3% z$-H{H^KsdgGww@yoFq$>m$Voc=Cd*-2kfki<_{2EFk|xx%`^y=+KI4VN9v(`#0(U- zLj)C0&3p;QI#1t>(2XBHV)(u>9AMQ#6Z>0SK{E7I{@9y{ zOxnMDkJBEPw7~nxI@s)BbC1~hqy1Y9;mz#4u)+62I1WG1T)Q996U1M8V=%XMbHtDS0S zA=7j2R>hy`!w$CnK5(-4b{CyD&i|p?baNuvmR4QD@iiBkzmPxCJXlqsp5j*kjyTCw z0^ttbdK_e#OclXUTfLy(Sbt$U>WBAk;=4%0d;qZ7u{>;!ejl>IMbND zGxu8)Al1pdrIJJgmOeF=rtnW@cIINHb7(Nh?cS-;h2!s=g}sw9r)#7~&1=PsZ{JLg zzdwH;43R+mkW!%{;JSH=50X}82R_deI*3q`{=KP0RV-G>#QP>6Shsz?2wq%PoB(lV z%4NZv`f%W+C5uuf%QOD0nbJQZc}MY_6nmr+Zd$Lm=u=*PFb6FMf9vt{_Q~A?RBxc4 zE`mNMibyIzf%#yl1!}sY9xoCbLabj%6#a(GgR_Dm&$|q5uz(?5d1)Y8j{H~PH?g%| z6RPW{vR?}^x?nyoZ|0@U<@tp;UP|72ub_vqemRwf;z-;kl2oL7gqNcx=L2&UBM%Zwt1Oi6q2)RD#Yseo8kanz@!b0rF;kLbf0G}D9> zXYr{C{PFC`>}f7%)FQC~cEpO>4E}CM&`2xq3|$byxf@U)?an+CEXZ{qXK3+e+9Z&z z#=b$#2TvJh-6(Z9b{X5qZ?!V9Z@o8)L^$Q>#4!U%;E9H!w-o%TAp@2G=>YE}Oit-9 zw*_<<{FLXc!@=u(yaC+5vKI9Qb{Dq=wW_R587CwSH}J# zC`gOHS?H$b-=a{W20e5wVHB>Nx6hSX0zh4?{8m%T3ZGJR_tslKZQqy|pT7Te z2Vnu|u;S6szhShkrxrtxWKyG6zn>2#uc;-@Be<>HpG96q zendV{d{JD^?91%Evgk56`013P04?>6pX-;vqFV3!5ER8y(=2qv!L zfe0>s%*y*4r)~1frOVl_6nG<)W^X@+(_qZjnn3CUm(;QKQsxek2E6cv@q;d}NKkd^ z$W9)*>S{X zrLEn68wSebN#*@Wp-w$poMUimm32jXdkop)#mSK><&f^;WxAt04Y( zP?LvKXQ7fiuKKB#gWR6g$jG=zJiOT=1ykq<_eq}2{06`xrG%MyJ4gVvup?8Y7Ar*7 zAIN)b-2_FWEHRIN{h3b$Pe3%rrovPFuGs!_bq8ePbq&^qL#-(5xEi(53F0m>Q59Xy zAkU!qRF#m=iTV3wEqconvu17#=AQ`@tqGj=z2Kz*gl~wZU;)FhAZuZohtGUUs_~~~ zgr%jJ2e5lHXPA=9BJvC0d_>6!4?-D!XCx*=Zh(hw-1Y>ta#0?xa8b}}`YenEOZUw* zL?M0UrS`04dt1b=CipT5Q{4^Db@~P{b~ZAbF$*z8dAT9|$V;#+7kbRYSAWVvx^Ka? z_66~FOdprNZjdP{@*0Z+(G|2+rKklPm99JOqtM-lvNWB8u!Z3-?(vOVL;x9uj#ZL4_)l4@2~y;EiRLWE9mo$RmXVaWUt)OD0_^03^l<;S;vS#fk-Tnk!T zFn|cV;9MNY;n#`E{x&J}6r8lHOKV#UUz%wdQ#xkw&^`$UPzdzRKeB`zEA)k1ai(D$hYv`&F09qXc83%K9Jv z`LxaLUeZKkz9Ys6`hD!v0Jt&H zT2qnx-#aYdw29Q9UOY3%)o{wQf39(@qjl8il$k;t7o?Y7h zw)1{W??W!(-98p@vFT^)w;<%4wb^f7Ifd@yl_BGm;MF!0*~Zs6V?DjOvH8Zg7W%*= z;*LpZ_;~l)`1%kVOh8F+h-i~r2uw(z{u$W^yYO87=|aj#OpO-t%o`gfnje6rd~O>- zWVJNo(#bdddi`}!H~gJ(DOxA9jPw+_j0S6gt%o|F zg!cv14>|>%;yL#Y&JScx!(k8W5(KsyHNGzsrA2T8tKple4zgNAkXT!(T6-5*h(4*} z-c~&9o;N+MEvu(|Q0`XPZEw7oxN{g^S<>L($qptpaOW?^2B*tNs* zY66zLQ8-aTx>+=8J8{Z(Q1X}7k8M~)Q7=c@n?MkvPDm}I8L@l!4`r&4Am@lgJDNNn z>Ix_AJ%#q%cfn6b1@DfWgTjhLk!TiW-NYa@*+1!$=4OSc@8qcuj)Aa|nARJ79tW`m zzCL112Jn*OL*~bcbxy)bVq;@=6X$(sR}u~=+Yb?;jb%;P>rpmC@9685lU%5x)jRwe z5|5OPYB&!pL^?AU$@a~gwC_D``cCXrT#;#p{_&R0db$o0h^w=uzJ2oR>te$&(7v+5 z>pwS9=o;sF*;@S5nOC)x-ZG4OxlZ}C2yP{Wpwn1+F8-+asMfZUQH`$nz?qnQStBQ! z#dqm#UJ<_-*}6o*zh#G(x(GWg!aO!h%B-IqpCAqzV|iK}E2LkzWY$ZhA1cxa4C;j! zBBx9V#t|dYhW+w6meBxMIxq`kgk622k2Q#65OlLgsRMDVVrTa)tkd;6?#YVS_k^49 zTcsUQ6}g}@1WlS?0Zv^xglTG7o-O1%WXx(wavy1kp0W3BdC1eIO2qPQzKe==az4du z{)@78RRPs)u8U!{aMf)>%S_^4o3BFmuU512NvQ=vDdyP%Ty>F$+l0WZZcP~TngtY> z6#2I8-f4(18eK99tXnN6J-GE|_;8Kao-XrzXF>J;4MVYsvidSE)iyt?JK`yE+?Ak$ z87*{e{J>x#6i~Razx$_8%r!IN^6{i!K}O4O1-p^q&TT+gLMHdA>>Xitfk9f25}Rc}QXA zRS1Y|H&8WX8kbJlFj;#>%w1H0G=6#}z7eQl6Mi%+eNYu(PGX4A$FK5}Qso%?k~p$*TxW=+k%v#!0d&Lm9?%6e(^i z!O4CIISp^9*bl)EbLwpW;@_WVgb*U+!QS?;VR5{A10&e+Sk8ihkZ^?D`;Ub}c?gGSK_oo$~S?I$K`V&wJ#A&ew{&^gz4)K#gAT7uJFz*+*IvLfz{qBX0vzi3Fa(iTcf!SF;3a2 zCDk(GOB|krk6{mLRLyB>)V8WP30$sVzt6o}&J3eWdw~O+W3*kyUk?P!aXpba5cKsbCt0<9#|{2eO@D z7O>?im6>ksA%}~D5>~NpzrA2O%vHR1bA8O>2X*ZH1`iPYZus+PC_8i}TSweO-{or{ zO!3JjdOLyL#KGAfhhc=-YJl)-MyJl@^Q&oBL!rQ~TitoR@N2nmT6x(g~Ec;JzPu{Ass7l0A)_kfp|LDj4?@5HcQl@71E>yPe(HVgDUWs5!g7W*;@e#%>c}de;NNp02uyCjLnr>TyHdF|^ z9U$`AXwDO4Se-c}+z!nmzL`*q!o?5{8qfB56A{MQggc7{ zq5SFYvN~ z1`|wrmHChrxRP4!)RXc>ugq#M^pMN$S9RxeM_WIRZ=N061Pn6o>K4rDve3|~LKt&# zL2&y-0XYCzJ`n`30N#5TJ|Wy=uEZhw6*jlt>N;4rXuVpS^FTcl%yXP}!{wE)?L+kL zuNZ5l%nhUsNz@|^!N(JG=|=M7Ss`3>&Nzn+6IN;S%q9OF0K*@ta6C90x#RrwCAXjA z36H<`=o*?oRN=a{JysvD6RMNbE8hJWy?{(YCM5-rZWYEWbYy45@MK~>oh*nV=zsq{ zKKFO~?T*9zJgx>~50dq?7b^u?h_mZ$6PHj{rr{6Bc!l)6 zqAH%wE@pO8_T~-%HZJCWT@46Ub&!w}l{0eupI!>|X$=4e2gkoY_}9OktQ=h&oB+)K z;rbsg3}pZ7rhh$|`M>%tfI$PG!^95IVPRp>0|2KLGbezJkrBWG1aSbRu(Px40a!Qz zEL?!Ur>u+s9Uut6&cyhS-oLt8IJxuytQ`L$xLAQ=*nm`jF+eKd3GklyFDn}xknOKD zV9Unwk2E$;pl(J+AQ4cc4p1%d00{c4|1UKwE6e|A|1pn)^?xFnIXLtH9Dk{Sl)w`J z=id%+GW`qqM;0egGY|`evH@?)fx>{60)T@45&BmN&@4T@|1xv`UbO!Vm(br(;R0Y{ zWMcy`2)S8kSegEvv&`%O1`#7iNi!=8OBbNkz-#$$RB-{&u`vG~2U{ZxX8;T9zat_n z?BD^=p<@Gf^dB@cu(SWj1jd}d!y#^DXJzXNp!_Fd0e~S3@K4O5`VZF17C2bUEdM&d zUwU~XJ775azl6EJget&j>0)9DV32okvNN*%SDwbdR&xMtV32Y#vb8c1vbV4`1Bz#m zGxGSihyPf}AZO+53=D_=g8uO@6`(_^1K9sY!GA*HUnT#=-xxIib4gg)*#FA~{cHOF zLnvfnV&dWi{3kFn0ob|NxtRag*m&Lv>64_k#_y9`A}2-8a>B=wJ}Nu*Gad<$WU5>g zOpii}QVx)Y9E4Cub2VF3>mAZY-XN3x0;Z|?&{$c&;<|{gdM>`Hx1dMH@_CkZl#T=z z@!ECu`TD*4N+#s2RiWn5H}^H`XhJY5jJ6@f)QMJ~+oF!OlP%WLhfnFP8;>1Wm}qFM%<}gD9xDl?F^X z&L}K@U>yKRI$jwrg$YpHJZ|)??q$*6Yd5h3`G1iJ{^VwNh z5wRju-o)31QGZIe>Hl_tEh6?Qb0Rq)@}+w-%TqySAo3xt#h?VQ4{*u@#j=~(6=bUc zZ^1X)zjOLR);7@aqquB3UL;%g`^=3X_r~*>gleVQoM;b&MMQ&?BPPj|MO(maJU!~i zH_7E(l_%dZW^TwEl3n@(vjW0zc}#+MeZQ1GGdm{pT*rc3ehKf&xA;;kzDG@3641YNML7j9jj+I6;4zHph%bgkN_5uckqOfN zMm^B=^5>I#^v@~VS7|urm<#)^z`sN>GcTGc54I(~)s?ejmq6X`2l)ZvW7=Rh0KIc@ z3SFS(#03wk2kznVJoo+H6O3s9QQhw+5uQ1Wd%i(v0I3=K>h34r1zrumH2MbO0F-}f z63=Wg2`j|6?-%OS;vRlwgdVo^=rWJ>ylbcG@vMQo^}r?GxkC$>B1wWG#TxmV15y3uJ1i|k@ii-D zGsp>7F0EiX{B=8*pW~LGmJfkAP6sON#}p=S@%V&z)Se{ZYpqQj9XR_>x&7NdPxTR4 z(||jYBf2RTvwgp;K#&iPsEJsE(KIiT+!`b9lp}oJM5BMerlu!!4X^Xqh=^{ z=CbDPVKZXk_I2>*edfNh-xLg~YEzM$Xij6p1)1b3{A0FrmtyPFB`it0I8+RIIA+w* zaqD@0!W~_XCASdoN?ti{#lC?SGZJevk++^*oA(er5}Oh{Oey+i0(Kw|ln#>i2k^z^ zI{mp7Iz=+Bq8ofx4z<2scqMpzdmr=Hp9nuW7OPk>FBuj%06Y#eaz5xxzN6Bh8b646 zp(;UPCceA1dxD-ZW+QkKbA!<;gT+07z^ncdq99cU+1nR;I$68wafYSDG;@~%^}@Kc z$bW?x`|>QRH|nN^u0=jddCKQ zdD_Q!hZ_fLYqAEpYobVaMhW@je6j?>FNW#qPPFS>EV?oH?2?ndq;%YLD0dXMPVzXpsiCr?M;0+xP0TCj#? z@~%w-gV0g1hBRjI^qIa2`l-cn{rQMC_0sI{2#S`(;@5_W87rU7iyDO9wVySG#_tOu z`S^DOFGKSb-?-42J@5ymFpYGbN6X=Uw%($Wj+@ll6YEk1${&7{p_KT@0G89pKeI>h zBl}DV33qkooQ&5gOE^jnGSy%xw0)@29H)ozqZ!*fL#IUCyI4L{hF|`A>S=tzH#{>O z>~lGZBbJFihHmvogaiL4=N2Xt1j#7fP{2`VR9LFnOIDV25f&t7=*S(P*xk*JiOYuO zvCW;N(xFiPw6W+aq|y;AYr2T@oaB7_OnOK4UFjmRQqGI+6N||tLBNB{4)PeDPnuWJYlhhzz55D$HC}fZ@~9LCtkUtT%-*!)m3kHBQLG*ro`-`Y9N_GP^l-(&Vb~PZ36PuP8EKEDH){@gG>pUb zHu6yDcA{#Bz=EV4D{|qmL_Wss!R^WJG3i;B{yOv!X07M&Ze+ka_lc-4w(=NC9P0V0dG%l8Ec}D>`wA3F^x7APN8}?2KP!Qbs65kb3INTz?yGMPs=PCA` zNdTGuicetVOfjc->xi*+SN=@SdkmP4{t_Q!mW)DXUWQ%TuX^H>0krW>TC8mw1mBA*pR^@X@gudzx2F;66Dtk21tiD*XFySypTaaQ zH{m_bliwFT=#H>jXh~=2jaZQRouL=MdxM@$!EpU81S89(#S8yhRr zT;%-DN2E_=JrCz7gIAYx@Wqd z-vtcM^AP*hcg44$F4;Gp^|=Q41AqioU`6QW6&2hrX50GCFG8hy>-(x1WWIcwbMg4S zNThi}R`*v4CzQtD4NAUA2CxBEdY?Nn^QrLJeHBCab%o!H%mnJbN(k%aln)b(e{lg& zBHUvNGqryxfN@u=Vg`TX#;-`?d5zaMYj4B%wq%?Kgg~2S(ja+}6SWa~5b_LyM?BGc zlUOvqQ9p5h2Tbga@?af*Xw;x(dg5D<0?<1*h}v+_J79g$T$mMjhlL)>U)wo%oIZ3` zL$O)spP$kq$^QO?2iy0*>hs)kj_#&9|5Egd3cGPW8r-{4Ty_^Uhx@`G7O`5w@@SXtpR%x57f#Z{qHOe9xPVE*qZlkxKk+&x3Wt9E?7=T?918}a8*|1i(9_c zKTsX$O0x*!vFOUNE}jek$xcR(P1*G5`gnd^h-Ud*nD3&!rvDPm{6`=%g5wkv^WT5< zxzK7M+Hhy!>eyTTJ@UPPXz92%Gh-&TZdYl8fv!Rx>|M=qZ&`e9r%bD{AOGL14g1K6 zB9}>W>64R@l<|GOwNQ>%hFPT&PZ-k-mh$*o^>|m+s_>A`(KRB$N!c665}NnT4a(gs zk&T5nPuW>7vNu_UM12P26UBJv=fpJ*k=Qlbz1q4FedDSpebAJrxpC~n+rjet_Q_+N z1f~qhJd#iKNJjO{=;lOPhrd3@DPIU^xX+6C;(O!q#4Nml~+>5V&X^o!d#2wvF=)m-leoWz&1s*7%W zPZb-xnjTJ{;yx*&@i1PCZ+&!@Ah!^uY-bI;@E2|0D8`{^CLGsL`})6I)h@Y(fLrl1 z&P@gnDL<@N1_tr9;1S+((fMVs2rN*#e7N^lfZD4B?#+w%gy1|jvl{5qfi)W0CrB=s zM=h^ATRQ6WAWf3+iY)3QmTkG|*A=61cOfwrQlbI?#p%ud@ePMK8TGK&NTCO%1Jyug zkVqP{jbSc+tq(4VqV`8N!mm@!H~mMO!|sfL+FvGzU{UVv_^jMT4D=fw3a6}_FdcY? z$u6}*MNte*`A~6;pk#azu?75w1_+CdgEC|C^#CsusI7IpF;<|z$H~af9*y~2b+_UQ z-q@t2ls$2lioHGdo@IA{gS<5We6N|xa&)%%qumXp(^kugeEp$sF*=)kafT2C@Xhxr z^a9^2{0ejfZE~GFLJm0l<`WqIw`A*!nUnBZ`SBmysq*vQ2}+o)S|gEBp=S-f@YrmH(+ zSHhKLs{aI5-H`|uE)L$rbOA2Bl-|wpW*tg5cHLX~MssUk?=^v5L}EQ#qkXdo9vZ1= zE?7GL_0qRuNhc!M0;qKTBxvmWu4~BYZA}c%)Yi#C+sTynaYt@{ZEjN`6xy z_%lYSzZGX*X>6p3NOVX0Y|6~#GTsqV%7}k>5P-VjS29NcgO2x_x49I{YAlt^(>&Hr+0uJ)2*+ zZy%)UPLZK>V4EPCr#o*#uirwC*f)~0yvdDS#DI>jFna#x_Nf5U>#tA01o?xT#aBS} zn5WQ7yHFAQ*OwzsbRRybvsD+ZzOZA~D2nx;BtiTabcgCH6=PuxH2?NCSFG8syD^AA zrw&P>$SZR@m|r{E7w@_18FtAEY)(y!c$;594DQgDZQX_Wojs|b-KT^-@}2UYU27}Q z@txNb;j_Q zzj6yh2tEvhp6d!@3;AzKiML82KZo-4!`(aUp1gqDFY3P60+X}zVOg$|+O+^CL3gBM z^V7VkmBQ*)AdT;GWH1iWjW(dUcHir*Hc20jV852kr`u!Sb)rSKI{Fto|L0?6(mCbO;+vxN!m4 z2LiW){3KX|0^qxZQSZMC_BP-F8^*5zii$`#b{mmf?&Lm26`4PLdtH7$dlv8BbQ*I0 zyvO@-32{eQ8l;>&yDJFIzw=JCmqI&d%WiB;6ibFZUtU_81F3dFMJ;c`vZ9kk-P zeK-x4#A1Ee6S!ly@U=cLp`2w6)btLQQT_0uJna-BD=*-SjL#{JEW&Z6k3K_PU2YAu zC;Zv{!&n1tdr&}PgDM`}*$SNY_lmdRuWh*QAK%VDTBEOzZ@lH(u#i0!>=a!wT{b0F zjoJEge13M_DZb`uL47`xASjQjp!OVc>oKN_ zX=O`mKYcu0y70@kaqicvG9^xG4vj34S1kKN@!q=+wCs0;?jY!Zr$0dB@v3AUkkdA^ z^|cAAM*8Z(@Mzq=I!KG>G>3p{j$YQd^l{vFiMWfJ*}_*QcT~m(sVB!Kfd+yoJ&V|a zzKrhfvF-}I++I5?uYT`aYB%mGf-g0ve_vSST@?;~efzx%6u)#wt85)`C4UFKFqL|! zm(auckv?8yHduoMzF1cECI@aNIfG&+F!pBqB$VdnzmdB{55+p@ea*E1xbLk}S)r6< z3M?+_!S~e;AJO+#^}W_Sd%TG61fq9akZ*gps{5CyZUstTY>sZ$-sYrE;*&3ye`dFT zWPYPLhUhcQv~3`CqauAWORosp@JqZ3moIZA>IgYrBI;7Xyky3OK!n6(lwMHh`*DP{ z68n_6RMylUvOckjwEQ^0o>#qr&LFL3c|JxeZX$F!NjS*Ghr_*tY&D}uWl+N(e9()@z=S;XaYEES>NSrXnoy%*~y|;Ib?E2-tTbrhL zWuyBfVl#4^_!-OC>ryNz+CHl}7UkhD&GlHs%X|0BFOV+c@{Dl&C*R1K=I#@rOGk{u zACqVfx&Dsl5D$fcD_Epff>*t%HkFHmou^$l#n?|h6C$c-oU{Yl<}lFx$8JCJ&Q3_^ zj{~sAdWD``kama3%#Xb7RaSj ztPSD#C1LpFb%XgpUr&MtwfJHJibq;QTkzj>t4R7_JvbrEcYRw(U2{mjOr{kta2qaM z6LB361p-Hmjw$Z!H#+Rgh*y6+^4V=GQ_#OXz!{0jIz|7x3|3=#C z!@lK4amC~7JJIz;<_T;~E`9rJPj-WK6FX)+)eGWAK=+IfnWX^D7wDEr5FiQ+Z&n8J zeM59sEKmb?sp4Zp$*R*t6#KPt-$y)SXFsOBy7_WqOVy%3?b#{vretsJ{;?okd5G92 zCI}r%ek3=Bd1%IICs5_baQ5lr^UYR^e?fC?NW!I!>ZUyQM5 zEs}C!;7j)?#ilTND~ZT#M{w)XF~OgN$P{f2pcP>jaqXz;ep&pG2mc8f@-r}i=UR=i z5cPp|RomuY&qYxuR}(LBul=0rxr9sdU-1{P)}O{dupBt%6!u&G;;a`GVvhaj5@L>n z7hOA6G?v9#5#Hl}PX9LpX%HVm1aZxmjIg}19JWf_4Xhs>VCq*(hkA!OJ?g&E&zjiz zAe6ZIz%I2~k+K>1FDzl}*YhO?B`9O~iu?zP-D%34ShO#jIs}s|i73Mm)P>@YZ6@_b z_wod*ivn(6ftuZC{A_#Q2-uJ8HGtbe_*+5UhA5sxo==~Dsh0&wV_g}S=wyZf#!Fpr zPHssB^`$qp&B`_0%%JA?j4_p|m)c`iYOT)Lf@$}DJ%Dmm{@ch~#|~F%C59Wpr64df zEHm~N&N2&RfB8vAErEmOyYY&s$g<3r>l9sgkR?s{OlogH)XE0RuX}mCSu%TY9iau1 zTK|2`F9R1%Au5OWR-5gOor@MBub=)4$p-svCY?9}G?)Vs8V(|4*w0D6{t=Fy!zUgW zqUS~RRi!P#+pRIio2#WNhuO6*7o$Tl&ljjpH?zW8FnE%Bb)TEIg58AX)D3Q{XH)5p zffOl$%KQqsRj|l<=UWEW+*+T5b?8hEdV|6l=k3-tXp|kqwmk= zUW$NUzCq!S&Zj@0ykBcWY@fI$Y=wG;_uS*$TP&e*n8#E{*ZK9DLk67UaU%%=z0aYz!kOO6x!>C#-i zDx2n^w&dhqZJb%~4I}{xCmJ{bL$<`)m`eW89O@B7kqGV)PldmYDz){iyNE?dmRw=* z_seb|37b4w25b)T)E&neG`B34GI(f;sG1C$YFaP&b}6h3{UH^&>lfSuEOn#gv7))r zlrPvs`y3g5APF!3X6Yu?^FaCaR_=L@&kf+A`_qZy@>fil@BRnQj}FqwRhfs+fzo$9 zt**p1FxemS7e{9AojmfxZ>oq6Apx0Q`J#SQ=-0D5FcOzu|6P(*pVXoa$Bb?jl3_Q3Vlas5_U5N_l3L=5tWDAxiS(|J0E@1?OtjPX;m!*uL#Vd| zSX7H6o_0F&b;7rlT%Tf7d}(*|iR$AHH+CtT$j$jz`h=~;;AovQ2_F9bN0!Q2a#$vR zX>86Lx?=3yL}HdYeydyf%Y`#dVzzww$V*paJCOqz;b1mC*rTjqpIwlZYWYesoL<3kl z$NHYbm@Lvw4?;TPlU8muu>F?&7N~jE4XCY~!Rg&H;0aB!0zSH%prmmqrXSg@2ED&% zG#*vIyDR2zpcO?Lu--mc4UyP~o|le0{d`HdCHT!}EDam~^{G= z!qtA@IrF%f9M$hM?VfPQb&q$^2QrFxj#Q=&QnC!}&i)dtJqw6Op{@P>yBey5D6l1P z$MfhIeN@44%$n}o7W&Z;UC|V@4J9a&O|tDXHPX{JHo1i#QWX<1W)t+s4wpL#hYd_J zc(Yl|1Z7vSZop4s-yXz!3UWtKbkBbELH%r%wi5x-2d@U_HAZ(rWaEdO0Ny!vBgWDZ zXDd&8Y5IXRhXAi}nZ`9%Hr_v-v-FI?1Vjj(;XAHJ=Hx`ieuxIu7{~y|OIP~BzQLV& zwyNxZ8L5W3IkLb$K}6TjaCBQu^6N*{h!Yac$y~&Dw%J4^txF^)>p5fRN z$>Uz_--s5E;m%~({>s9nJBv)PLcj6-&W}zM^CIC_56^OJqFzw2hk{vGBT_H<4zhs7 ztvA{0TErdw!AsomRv>K>0Mla$P7B&g@X$1%uCzTT7Q-cdjyoOl=*2%F3IL6O>vuEN z%jrwE{!B5_fZ8%`a%Xqy{e;O(Q~T$zOhv+WwB-4o@sD30COo@1gXOo*XA5B#HqV7Yxr4?jmjZq0AT*;-Ep;?jX< zY5tazOWV}Xh#PG}_Zmbz7~Z70mv@3J#wndsz5`t;dV_`erJp|k$&4xV^P^kNP1o>7 zJq$M<6+Si}IaM6(n!|Qq|CI$7JPv;ton^iOagtC9)zqTg{1}yZmW>Cn^vT|Rz=*N^ zp&7}zr5s_%%pDDhjo@w7K1D>#*SBM{dCz%~eO-IETXg1r-wJpmgnvP;>ZGgB?ZjHO z?c(f8Y^Y1!eK0MyDG<6kOZ>T{Iv9e8qr+`sAohLV;9E>FEEfFr57ecT%Q<>5Gx2jM0=djFWCvfYCSXwCMSN0!RZRp=Py4IB+l=k_EbeFCz zEz@ku4Rq_Z**ch;lLc0inCf*`MmKlhuH&lDXs^s^#qPIAXkPHSI#-DWH*MiUn4|01 zj^_+-XgXn_A=0!P-nxZPaj;b|Osnk7rJR?aFjypZBe0saM&k(<=L_)j{)aBAi(Z<( zpRyrSu+7|JN>I!$E0L?TW(~K}dGNG9x-ncoNk6 zE^6WWNwW4+X9w=OTWSb~yr>eoPPn^7!r>h~NiHP)g_ zE5^tYaxVECXBEdZwwJVj&-VHEx)(k;M}d7JTCJsQ^$Cbr2BGJ>Vs65CxpQ3_areotIeL4m^ZXmb$`PF-IMiVL z#FX|X5YGr_jY8pm4N4sRZeh)UN;P&- z^fGdYJZHvuS=6YbvDK?@JT`(!ovJ0>XY2birsy@qGjKy=fk||B{y;+RF$!1EHKNi` zx01P~kdoj8cmU-(ic{0_+Ck&gVbWIQqB-=Brqq?{IEQB5HUjILt$(qRSJup-7}~IA zghS%O;d9Mqdgd!Roo8U@UgsbFq#0YIZQZxWciaJJl%2^dI|`Ccz;dyu{9;)%Hqtr> zQmeIQ{=iCSrNd5K!ed%Cc5+X%ReL7cd4<8wB6`X~!eiF;%r<(3vk>iJ)xe=rw0VR7 zGUILo{4yh4rS#GbxxFTxje?rFyr#Lu6M(p1a_J^~7NHm(dM|YC=!g_;Wbl}0f_VmX zhYDK`(-8Xw{auA9PCA7TW6V}5vM`A6B_^PxV}*iE^;Z z41ku-7A^W3Z5H1uqTzoNhSqdOSrP@3Q^faLQj{iyDf~lK5ZQ~dUt!6vL8R#5=P8K- z8hATthN3RzoH(sp<4faLgON8JXd=i$ncSJ6EAIcpN`m4MN;x;lm!Fv*FS_qDmgGv9 z82m_Tdp=BJA>6c!X4D=mUmN(W?=L?Jz>P$eNfhhQ$S4EuwmG3}4atNT10Uy}-y!+c zs|j^X$q99?tHuL%Ab$A|_i^lM3yEA98$t~)coD->4~zn8>Lu22 zAs-<7xEmC`a-!m&0xAdmhU?|{t|D*>jY4z{N&x6+G!g8QCp_+j$nD+2O@HlPu;6f~ zCYjJs`kSH}M(auK^K_g@{UH(;#NZ*Utr153g*ytn^U5v_5WaCJe5=KjB@L5GPpoF? z7(bq+UeobOd5!u03anpC3fVfTck=hpD;~ssGt7ijSS7Xs1%w824tcc@Bqe(oG!|pk z$?dIMN0PYXzVKEjcII$}O5{9P_K<$?eR5viNp-y{1U_rT-x$<2^R_rs*)ES@k=Q2gq8$n?$~&l4}szDd1St)h3&J{T_KDg2Cn zj7)jIig=>_j>~@>-2b5k^HAVfXJ~17VxM<{>R1afbS#LDx<;Ax2U#IQu>iELpwYMso3HfHq z92Run+l#6%x0V(?z}G@C%wu;%KDG;uz`fz~G1kU2VUaneV+XWQ?LvG{s)tSOJ)f>N zETw%)-7*e5i0_*2;t2^iNSzLnXCRJA3e@nA=$Y-%DPW{a{4$=%j-4Ewf7&x@3V}k~ zDwrZyNEqRKRVJup=gDlma$4}Be1tUN}@1;GHYUN2> zVozLRMtoSLBP*`iNrt#7sLhDRPg|&FfHnt7op!)N&NPUhI!}UPlnRyC2~G_^mbL-* z$nZmz?4{6ZSA17$7dbCtPEF{K2aT1*uroh#{t)Ubfd{0&ngK!`%qo;OT-vF>PLNkb zTnG9ryAYlOvf^*`U<(P7{e2TG*YxnLCara3>?t*%Rg0DuL#>)xWhFtS@pJ&Jy`knV z{ulLeEFT|aix#H#vc{pZOdrb(DK9-^Y|WCtXb?T(u-T#7Wiz*WF6XM&+eMFT*0usY;n;nmvPLNoK_(RCim7-BJYJ2*a0)k zAymNbQG>-88nzaCGC9zz_o{uTLk|Mu8-+=QnpM93$+yqhi#_29#l4Mk*0vL9PV)jz zXz|iZYQvm!0VefsO+2WZfi@P8&s~Eb?zGyr8FQ{%&eQ~xpRIB?Y8nABO+`Y$KoIm6@( zF^P*{7T_P~A4Tv<@E3s|Re(x?WGld2Xni$DI}Ad99s5yO;$NF30FC&!IE;U7@_XWr~!i)MMb z^~J%51hZnq$LV^K$*9AZjTUyOUKIUm6ZZ=C5e(h^8<|2$8I}IIO~Y9yw26vKaAu8! zA9u>xzv+T}OiHec+!$ngX?+JO^w=iLX$?EU*|$Uz^|bkZUj3Rh28W|>2G&0^mv9ix-(iUJxpx*=k_bJBHk-ij~9?sk%ra3 zI&h~}C-D!$0)GRaehl1`S|bkpK2QD{4wFmRmncgc-pSqJdYafB;)D=#4SR|=HMKS1 zUX;5vQDM%szr;n935Mei6%#5`S_l&&lU4}xSLJiy6p|XjvF5DV22NY%bn(ym1)TnN zh_Dd9@pQ;pFtm0q)Ac`f`Fz9as;DHi$ z77jH;CW^n2jHe(WAFfBn5Ps8+ojg2XPYSbo2QI{OwY* z##ap&ABKeUpp~fWJM#V~Hm{>pknC-9Aa9N}@mXFGD2K@72k(-mIrk<)I3|ChF2|a! z&*9p4?&=H1yxjrxM3&mA{l|)YK#*iAFp zPJm#Y$qQ_^t)bqF6)=J0;XHAbgm34ZCb;VA?z`!lUg_U(KtruPa?Q)DgjM5adeJ@B z0aMf1cByvO6fSXg+}50NzV{FtpLv5o%X*lLZ;Use*=)>ag|%~QQ47P&Rju3MuK)9B zxTrH;fzG<`-}!T&5~cvS!;$d%o3T^W{sMxbY|mG-8o5fC<5rW54oWVb3?U5 z*06rG16OgcDmogY@BLG#9NM;b_tch)L+dR8UrGcew?Qq!UrM&ej^^@fGpqI)Yh^7y zjTVct>KiX;`~*`G1g+=grnZiS7K=se=;U^ZHT~PJ3rUEW$J{m2C!-pj;q?QRc9JJe zcNKUUnKYKBuF|eLsy3#^pHhU?BaQjnewR$cH-a;%Yi<{1;VSDbCLFEFjuKpro`1Ck z1kcwQvgxvcioM!eeNqoeTQ)f^c7wkNXO5RR$<~nLqbiCZB*o>jh|}4kD?C_&6fWYU zY$Y5%pDSqj=QUcgss7DHVT6~Qho5^KTHq2f%{==jX+U5eEBT zkF!_}Q$j!~P+>v@ z_xn52&)Mo5FJ0rKE*Y-$mTW>zVGuvB`KlxNL3w?7%B8)9Nyjov_g%|;CS&w0irbcs z-}!t4)9YM!BUFxC>Jgoge@dk{yM#?PqrpeoK;Fke!$2d@T-?X`BW)6rfxD*0y7L0p zWlajUGYX3%Y=zxyT&f`T_LRA+hT{K>Ie@vKMhVSot;|uSC9}Mx-7Z6ZqnMhmsFq_#hpFQR|=DUfMC>JgXz0Q=_$(OCju!UOv+%h4v2(e6Ms^)45c?q z4gcfeN}tmdprRr&0eW}AzQ5Xhe&%E%>(#HFyP;YP*Ml<_l*0Z{(o%lIlOy8v zSs}kcQ~R3iBQZR>2@L*bae!9yP3fvVKdKN>z3(YW%|s-*`e5qyJN5C@pPv*9jW`St zhx1UKhG*b=*4)!?`3Lopep-FXX%CHy0CnSPf}Ii`c4TC5TN)Z!<%@oJGjlC?tWhFS zgRJ>DXFBSEjnegcL?JAX(IOV<30?>vAo>v+F#CsW@V|1}Lzrwd z0rF81)05NRUtKN~QQfnrYF-Iir(&xy2vun%aRbWK7!%zI;)c+PQp2d3P?L`6(S@R? zAF=7tElPs#|JWByHS$Imvg;5=4I1@CdW+>Qn{H2BaJom1fog}_Q$Ler3fFFLg>e-Q z209g?=8-$1IU2C(H44*{JqKrOUhk3J79{V3SpXlcSV-W)7jASvStaB zS&-;Tw*qg@9C@Z{3_sA>H>EMy5>r^vBF#PTkM^e7Bz-m-$Uw5M|Mi`H-YA``C+J(k z`^ka5%Np)^8pM0hj+&Ef$?%@>rwq^@@f>JGJxGw*%O zX9loEss&av8hjMlJlQ^N+ydfL)J7o@B$LPhqld$#^8<=6z@eArFMY58ibj%jL8+nlS>UXlLNeCp@fi% zBhWm7GsO~Vu@I~2V}MeZ9v7OHDc+-(B)+4}+q_#~5lYLk3%9Ls@7JH&dF`}X@#UfI zB*x^8rOH99{B8<1r0%u^!o00V0+sY&vBqD=Mn^WpUT!EGqXKa(6tQe#IW+bvwMezF zJ3?!_$(R{|StoNCE*Mt@;EyCeQrYwf+%j>E8PUd^29=;F7a;+W9Lk-FUrE}@)e|Zc zO6+Prw2#uK$l}?lD$;VVO>;UO$i`a%v%p8hL`|N_KT?CMl1XgY)23LBPnYhO0?))7 z<2lAmjk9ZoeCrFEyXRc&B2d$;D*sykU#L79=e*T-qO#UH-OA5Vni=2=&PM zs(vYH7N_hrs&3``RuXV{PBRg77hZfK2Oo#pA#9=4{9v-$?eZAY@vDHCjUJ+(Euna& zFHZii=Hv8F)NA%`mMwZw_ak3-P`#kg%>tmH8}z_!wh!&96eg9Xkeq%uzo8eAUJl;c z)WDsl{ptLlEQju--RKFT8|MfA$P30ZEg+h}gsA>zjw&Id2=|Qb(IU&GWbxmui)D&S zx=Z#WwSZszcG7mTK$33~fm79GlJgPdo6Q@pXZ9wgAZ;&WZ~ki%u4!9?kf*#S1V2$t zjAChJgD2okNJQK&QCtS9K%oRhI$}b^5FQY$Fph z9`MX1MfzKj63B`D4SvoOWm)(rutCcodF2e(E%zb=fXM`83_=#THd;b`O7@y|nqqCh z^k~a50o7f~Mqk8bI;@JV7{s*75k}yz%nk-;rQY_KNS=u5Do=IaByPV!9*A>bMSYFL3pimzPu2MdLe~*xlyNWJ?6}vlhdj9z^EgA46 z1|JhnHZ!~2Ud^fM#E#5yIQ(o1i#uhq6m&L5*9UIrN4t<+#iNbW2@+Sw58OXQMA{XI z+*>Sq!91!!Uc@HM6uzB?(t)H-eUlsz5ekHDC^My>!f@m@_a5f%q4Fbt?pf|3ST&xP z_SVhQ$L9n+OZQW6S7`momVBc=yw$~>sVRJ(vsn*yr3m)a#Az#6(Jil0Z!L?hP$>Io z_H_X(dPbbu4|Vxf84@`?py4en=)Yo3!XF%$i`!(xwOr?1Z1(0@VQkri&GQ?{s}s}s zHwJ4ve6f!FibxJ&AMQQYdkS~mh0nk3kVA5j8S{K!)(IT3Qsd>+`M|jt^*XnpsSB)WgxJCaT&Xw!;#6)#czSYSTcBuZt2X zo(x7lP;p)Dw88NlT*K#60|&KO^a%dRrRjs9%ET|fc#p=Wuw2hq=1Wb}rf$3aTVxXe zzW^b6FX_-Px0{6&-Xsw|H5pE?fTCGT6`?0>0{6voX^t`+Lm2_cr8Xo{TEH$i^g}KV z30v?ZpWyO_PtQf>-kFb&=9*O`&>Qox!&TBFQSya~_v2EU7xcv$79jYP4xdm||F#qb zH$(lFlCAI#vN$yqI-SSFnKD?*}o;d1p-gNcw{B)^c+b7$UP zS})|ntv0W3hHnBi`FGKTfXYYTg z%^Uso#WiJ4invR}!^3Cyhd-NL$ec_j@tF*Jz0GS;K?C!P<9-QT++DQ<;fZfdNu=F* zV*_W1hgNbNPD-xk?C)Bww7(NE+8VOg63k*9ha|OPMla%<$}Fs#DAw_-EyAT>q!Lmx z5>gU!NUc#5(+5nd`*Lqmo2oQkWbe~&$HEkH#_#{~H5jv)vnaS+%SucAo1EQ6?e&}_ zf*9E`Z3<#Agek!uKX^XcSDE+Q^#?mLl^U0-2>jr;ODq}YNk~kXn1n>croJh2Vd}KJ zpXv<7F#D*S(AVp6^0U-Er5HY!AvjccDxp|~!bmN~v{(paYRT@j16`)PQ{Y{HY+NI} ze12tg-_);()LfiM-`U)}Q@U6jTNc*{({V9XK}=2$R8aykVwK=Oz$=Ma0S2Xj4$F8c zBX$lHBcpFhB#L^du^Hby(I9duW#SP#$|ai!@w`N-Dv_37_{_`)mywqnmkon6m*q6f z3X-B`XPVOS32VarwW0mh3=ATf___>P#+3)Oy%&5FJr9kTf@zE#U_J~AQ#I5~c)#;V zTY6(-g=^G1$ja--*Vu_qqT($bKXs1C_E!a$JOypLi}L3#rmc0z_&wF6TIf#dcI_Td zg>K$o}hh6HRe0^rMnlrnW{WW9PS1StyiJRt^c`&@7z7A*gaS*O7A4Zb;hf z-xS6)KfXjYy|BNIb0&;d(rnu7kNLGAI%(u(vuazWuMGyZa z=MIfK6;_RDi8QLFHZr2hl1I_PQiG~D3Wwc*X*E7mlh+pUWmNSGoPvTfjV&db8DE1j zmiL`R+hyg*+?H>Pcene=+}@Iao9YqzAxB$fcSg#HSL5#eZN;|f>cYauVn}u68u2RZ zf%DdJ3ek_ec984+OsLPYfokLAP5rG_x{LNK=5>dHAOFQ*A?LNMAnF{RrhkfO_2wrg z>6bpKlH1?t;O2z%hT_yQs?Xqsv8d}+qmM|(XqjKhUk$9tg(Yj$`63a1i^FMFTZ6t5 zO7ynoDFRc9kex>Qh29c9NwXLtRs87`r5J0C8kp)xn&rX#Bb%|z`ac;QiyDU=i|AS! z$l0r%sf+)rm%6@x#?%bP3_2!LFl0L>zdO`N(3YQAP*7S>3Ya8a9kYZHlQ@FMg(TBw zqiV1}y{B*Q5mj{>uAG_Iv{5$+qI;Rxm{tq&0`DHr$Y$55Y@bckYp{9lK-xA)w!S87 zWf!!xL>-S$bK1$COT+BU#{f0i?q?NvS?6NSEdqD6qSe2qM7MdF)i_HhAC43Q#e?T`eh;MaOG-A zx8ZV0>5S}GWF@Pp8et@nb1kim7&VXuiWu`tw@v|$yDGjG zzWKl-GJt`bO}oocFqS_4IXuOT!G(rKj^ASocz&wp85j)?{(?V7zAk~B9S5T#ej#%t z`%;F4XG4O4oUFoB9F!$llWqlmaYK`fbx6WlAFGO?Wd!|2w@YEForRycU8u$n`q+{9 zfh5G|=^3t6P!T;zerI-k!g4B7TGoX!{ zzq;46TI+IjSH(t$B{#<8mWsjBP)0kY&W3xV==Qr-MTHNgW~d{s>cLdLWn&0Z3Tyi8 zy&#MIX6-gp(c&O*T9y54(~&g}4%c>@6YhQyA314y5K>5R2e2%9-4s!>WU$K3Y*40nY2ggeX{Izc`9FLsiba;(7A z-#=K$4Hs5~fgBql5XcSuONIF^LBR0>m?yXlbd#P`IE&L;HB@jek+RfrC`5e~B`-P_ zqx|W#9=_CZ_95T%{^vI@L3StvlT!?Oq@!cU3U2Pfq~xq@Y7>`z)U37Ztchm5CF{6p z=p@=v=J>)vHY?3W2$UG6nqR$C9fT*%iaP~+l`#;#ek1v?o+lWDYKC;nwHY-!8`c}-wVC{vyROvJH?oZ}5y%le!G zJB_KBzvx@OAo#?lqA|_(Y^>-}t}C_2bL zJbxoaSF#Orh15hl@;$&~W~Z1*azY=-Aec*zJqqQLta-!y>j&mOkZZ6>EgQU1P-0KU zHJyxz33h!A04nX@KGSo1ZWrlfa-NUjX|XlkmqDbZ4E?I>IxI#l=o!7n!=FU_fCJB$ z6@8bJwH5r;=8`8f=e1!nCi}89X73^0{1es$e)U)`>!&;j1_ehz4{l?Z%<6+@6H}aB zGVt)HX3ti`+Jd2{fL1wYE|p!srI*k6+L^e_G&D&CTA3h?rLo6Qv+Kr1>=VG!>|_+$g;o!G?~6|9`-O(P9bxp ze9+u=lHfIOXyW2?s%qyy?EbO)b5<*%z6fbCO6dq3H#LozMmDO(YyHPmv6Eikv#&XB`W>w}<%A6Nlz8n6qWH}Cz0RZToi^p2Z{QLXQwJsbe_X~n zi0lRSNQE8G6`VJzFA}7Xo}jje?>ji&7LF)=j-$GTzG*v&zdBDkqtc^qIn6PZ{Mt61 z_$Au5R~+F-9^_5{zP07FGFfXUH)%5`^i>%abFBm;G}gp9Dkmz2hgAYbBvamoVw>0` zUGxjduxM8ga)p*8EMtYR@Ol|KV~wb%0gV)bi#j@~oXb`0$KPwl?k9)Bt-sw?Q5;rH z(-_q%hiw#$qyVc&hlayov6C5E=h~Or2OEcgHTSVnPXd8drd_Qs zvomJy5JYwa0;@3pTvKCl)ViGh#n56!M+vu3ICLQRLB1Jb-amRP=d_%GsD+8j@ z##y|`O;z1U;Alqz8_hwMVDA)TZ^N>F`t@%>w^HM^BII||+qHM;`4c5~!~Q-)^S4QD za75lbD6JCv^w`Cs$@lWH&)#0a%+Yy4U7AjYNP11HjmlbKPp0H0;!D?P+Bk64frIqZ zrJUO*#--WC^vvv8XYV37*Tm=eOW;EP+Anzok@KSqhnu^dxkff}!`9uDvW>rZo1Qx~ zLbv!6b}TbFaI1@gq;U13nfwr)>K_JN#I#vtx(;IMp_kxO4Hrcz{Dw0!TTcK^4?27W1;3YxWxX9@tje*Q}0A+4d^*KKBmjE0*uqMrxyF^w{u zG_gTUemsS0SQ?{=_k4I~-Qxr4xcVtmwF@Vfp6+Xj6j}#DY>`R*Ri9ZA;6^Q;;h8jJ zLIl|$BAWd_Sui|-w-Lc;P49Wzd=Xva*$NqjTKo8ApRdLJ9T%V5%;rIb&U;D@hrYJv z!BU$fM0AK5&{fDv=~T&XG^~K z35x(Iz$>KVhf{icX2O8=I>Yi84gt>+ycIYC+aOA|nH14~I0QG>1y@VX68%g=J>*Ve zJJrjIHfv*|1&$3uNnggdVVBAj(VmW?j3{;~bqf7#U(*prQ~Q+WA}jTwVA2W!+!~x zLA`di+W2}>hF6e+OXu~u4dH>sTTgK9n|E_nev z%^&BW;vr69K1qJE*4vE@_1^7TuXR@U8c*Y+1tP*%Ym1EG3tRPsP zoOa72+fMh8?bW*1b&M0HS2F8Mj|jO9^<)+08CO%DL;LVJLBU8^SsCrXfS23QKtT}5 z(GAp<)Yy&pz(n`2GlktsRk%t>)=swo9LHBrGMsfW zlTKGXRz|~vvOY@~FytL-05$|g&dpH@v?1PedneR}qvFF9!#EB6fTw}wPW+9abfCiWg`j4`V0RAwFZpdf>K7k zA}C^gQ--@6dTPSMF`uDJGA0RilpWtqCkX`fU4WZ7cb`zPe)|V3H+8u)47dr2m}tdX zK%Zu@2~z!I(6TUIvf|3d%k~z##~Z^@{v=jv`#K>)^b6%ko67M7mV(Tq|Jk2NJH5o= z@9!(4shhyGoj)lA7A!QF*7=t)xH!dD6=uP|#{`DWpTyn@Mkk_|>y@0V>8jPWjTxu( z^}9sY41Lr*m*2zh!=C_8fJ%08di(U6Dbdyq&YrqDkqNl0#LTnC%=C1H1`41oa`#=r zV?m1Lgp=uU8^2lNIF(pzvy^fAjTF;ENi#;{|1|a`@Kkl*`;;V=N=ZcKp@=&V$edIn zLzya>lgu(?NK~doC__plB~6Ajph853N~Dw!m7<~nrTFiC?$y2L+}{89_kP~@bGkSbH{LatbZ^ZBQo9}#_|7pnzd6zcsKCu!ti)_nrEuTzg8VWV_z?f;W)`+ma+o zhAMK#9CCLozxJ-;3USikbQiDigL-A3z=2%%t40sPljILC085#-ELvLT%UX-?K01`p zaQ9wt!ncQ6N|n@pJM*1Cmbq{7zk0ne;_CLj-c7{jcr~q$zq7i&F5VDbrsSIDWqIKG z>!;}widHB0?>%t4D$uq{uQM#a*>vh{7`~fCkU!+LRQUY0OYe#1`L}+KI7o6!6{c7Z zeamR@Gzm_8+qlVmqr|8yJ)_2LBbd1q3WdMe+FQ2ylFZh)%MR9VLK=7FI-lH?R#Cma zzt(Y&^t;_s>iX4jz0czROf4Cei|{cIe7(^gdu zdeKVRq=@x5btT2h4)7%B8?UFmOy0a<#>vlu&zJK1pCsj1<$Mx6arSZI_KHfwmmUor zE-!VLpRt>{ak<9pu{=aV6@Y3f?pJiYYA zF1XElI)d6-JnDTfy+xmIn6>!%!ZAm^SMu*y9yWM-)!D3`Po0$bv6as*`P59OSo;Ev zPG8pw(W?5_^n*m#U+PYt_=9UsE#{KRuc~dloNr$Lp-Lp1T2fsJGZ+$>%yvw$xSVC*FHY;Ikqahan6hdAs4rtf7)viOCJ)Woxhsk zHhZ93)G6?W;2-yioF`h(?_QnKzI)lO>>^KCc;u{sZppdNFMo6K*z;@fNq)@=(VyNf zQR#DZy&Jb2J9PSDMsW`HWy#@uDVL(vyi+MNqP-W!2-ALAhG+)!D(^Qd>1_;Zdfan) zxMKI*(1LUMxvMo!U$k}{|5+!OZL!z=)pOpmQ!jo6J;=b1^V|P)7+0Ch?u`ja&=pjT zur=0R8~bpMv8jXaj2vGZ<8h(m-}LyhOy%WkcV0>i=-aaRUEvQ$&&>hLKiiKjy5TW@ z_Zf9*g^}nYt6X2@Ifql$C11-TCA%lTOrHIi*SSSKb5~bZNSMo=K`Xm!+x4%#-G5qJ zWBYK|UGkb;ouzm2GvBQ_tG-EQ$-vsci;L6~S{ke5udNktc^*(uZkBkyo=B~b>#a z{d4ov?raVEq2IGxPPZEiw0r+Lc{P*j&YRai6;NLBq3)Q-a9Os^zGvH~u60zn>m*zf zzvbCMmK&BxXzRW?5jI$;+0lA+sN`8^(TZkmg=IK{wORNxYkLH5#9VvT)lGl?hi7D! zeaD+qI~NzNytC3r!N>CVmHRcZSLI%>|1H-m@>%oQd^ux&Lmf)(?tsINGmI7y7;t>$6{hX{Ml$$U=R}in(=t_}r2dN&Y$bbi){)0i*lt z=jg|_2=MK+*?6CRH%0RHZO1)J^e0|$o;3j~1KTVQ4wVbCc`Pjpc{tJocR(AfT83SjzQs;>YLP&(0#qSaYwJnv8ns zLK>_nyzufyv1-l^+-%~Mt@3EM-dS3flz~6jq-z-Os$%}jqG!u6pTNVb!dIQo9tES zE}FDT?w5n_kM>U@^B-tNDT;B5K6j1pbTSL!48?P7hnHTioEznmFR6I~E}s(ejI zMPki^HQgoqAN|i@{rA=h`A2p2b@x}iOY&A6 zaTy9zsBC>dC|U0vT~qsH(TBtFM#~dk-C88&pxj#I%sZ!k*ZM1sn_XzJQDR?*mjx#5 zH1Wc{7rVDw-9F6UA;0se_(bsYqK=6A-Ld|-Ppv~A3@u`G<3@Z%GtZ~<>Kc>YtR#I6 z2^Af#liICwPyAWTh56*$JM{LOoaZ*(H8)ADN351;99P(>kZ&SNvOF}y^2Zqo8vajt z)a0s2v;Eqq#Jz$GRZ4$s@;aWr-v5%?sju4J+<6OIeeUIDt)H;2KI+u?$c9^_qe^;S z^Vy(}Rco$NR_qELY2VKkqBG`~Hh<5Kk>U0~!rQ~&?w9~4D-PE!5KTxEmDvAXa5z#r zXy*s5{kKLW60T~7`<>*LzN4x6#lo#qtBU8C=GA+N$@hOq6xer>aHVRSuI233 zor%LzQ#rp~Yfl8$&FRrOZEKn|mA|At{`mF;A$snzM00L|LkY%|ImvgoEq}c*_Fp;yQkM-vJ+e4JWmkN@AHlS6v9}Q`>f0^vG!B zwe2kC$y3~&y7?lH(~kSGG8NLzT*6-Ix0k6Y$jF{-@QnLT-FRtLQ|&KR`l%VBTm^NO z0ozAk=I#G>RQzS{?Yb^nub=!6;?K9@-KIR_kK3ezru0HI6I~Zh9M8@bv51{~85DFCe_NX08;SJz96RUAD`llWE zAv#j^>D0qb27b*Nr*%|^Jy*A=&6Ac7ap1GuZ=`?UxHra?S1v=OsvuKDXj6M;!M$To za#k64ZH@M>4ycdbbAD&%rqU$ee7R-w-H!Qhb)WNYqvYbX2`f}mwT%taVs;G~@jkZM z6n`OUEm*_2c>Ae&!rTL!B_20V9TgUCpQyG+a?tfik8({ZZfvmRmkepdmM|Jf1J5RzN z9ImvhHvHK6!LdxXxOB^A+(q4=)vxkp*Z+)&_ZhIT-WgPRZ(vW0ote{`_STFqZC6{m zQpy#koSdbnw#jW?BR-)_(7nGqAH1ROlu4QN-J3SXhQKN2$Zr2u+peFQP(6^6lhs0d zIl5w@QJJ-%Z5&Q-prTz7j4Hw0wI=HN6dh$5#RJay3_p*N*&(8T0 z!k@^yyw0WhY~Xu%X8R+<%e97&crJvOxcMb!FRR8cHmmR3`uL!BMfiWkCO6Vc>Eao05^Z>@v22+MpLmHc!f_Ns(@>Ia!V-O}8hsZSbx zg{<*O55-OQIFllJgasZv*foC^y=qn5Mq?b`)Ng6gKUPMDM|Yh_l4_*I+D8b}y%dd= zG(N>&n~`)#$39J)pP-a;!FRK0O2B%`2YQkM&v?R!Y(V5tG_5E`cZpFR?FCPh`Spyf z$3|v+Rf1yfkuG&TSBd=cMy7uPOg8M$RIPlsD%{h={^A4O$7$V91EsRdR6Sm41vny4ggwKJ$H{xZp%| zx4hpZ?_MV@?y(M4eOi9RYFq8%6TPjj^91=-w;xeI^(<8MGJT`I{NNVwly>r!Bj@#T z{JV#jbodX7?MXE-;QlpdXU{saz1`Dsr`DyBH+m$Ece}Q_JzYhAIIR9r+beI7=_wNdRL{n7mzFEG`{_~r+^RBwp=7vtT zwS{P@SrK-G32ORp+`=8S+UnqEf!yncZ)~FC@`@EQFB)Au(^aOxV=d(W?aV{F8m$JC z;WFH#=!1qlQ|r3sNJq{KsZSf;m*roba-=>s50C#7d^RO;bMfNn5085lhYjU^CY{PH z4&_OZmO39*96YqBKSIyAyzAKaeSG~tw)4G^2rj#JA@^%&YLLK^IpEPD@8SpA6VLWV zDCAz~kPFmf_0Gsx5qLw{oRVa$QaP z)AQ!^@1F^}#iqBl;~ee|lV=DcyInqAiW)>2#wc#zI$ ze$|!^)uVB16YXjSt2Ry9%|4oME9HFTi+@;ZRQy4AX%qg%)rH4y$auXM+rmw=30e{r zAUM;*y_5GPb)j*7g2w}qPraiapUOMOu1o9+{4+P`?5B?V*)bm|6PvD_l%~3V@%Bg@ zk~z&MF1bT?o33m$Pifl@xup%?Y}dt__DDZpX4`GRWhwi{`_`*tF$)va+@uee4r_Vr zs=Qn(0)E57my(e*Cof}#eANb1r;|3{-s%_HH@@K8=dka=P3`hUlP?{%rRa4oyMAFu zi>}J@rnki_B3(@983^-eD)Ln{e)7FtqRW#YlUj4E`Rx;(;MaQP9(yRFK2pJpE(jS4 z`TZ2@TpF|>j%#46wQkbVR?qV_?MK(Tlr0Yx7I`jqX%R0WXfMg-e4?1cAEBik^1bbS zt{W3qYM9!u5_Q{n3nYEv1 z*awv|-oxMXpTBiZyCLm*(jj{I;p2KfeB928jEd4o&?!^e|w7WPz-C zrtABHbq(%XuRYYKVt=OQR~boHI)CKl3-l1v9+-7gykX&8pO3_A`+sBwUEwLpGtS=C zbYqt2RcqxvxyF$fPQ^T5I+k5iEuWI(bnk@bkCHm~m&atc6aFZCP3w=>S2B%CTP79f zTu8~dTqbfo`1qr}8a>Zn>WtcV1ieT;s<&lW3-lqtA91 z(XOT2wfQW%+wxPg=tf^*&q7-N_fqwHWp|=I_FIno7A6cVA1arwDDz6~7Vlher}LWz z?b-W)!?PzmKg$WL*~iSS+VR`=_Ro(Ym1iz@#ojmaYWTQ1^L29Jb*-++PXVpZGz-J5 zC!UR}mTI+5ntbZ^n7T1)SDL-+eDq755LNzdcGS_E+q~C4&hX#ywxZT8s%6J}v-d9V z*R-t5N>sPoJK6Rj_Z0s9wUl|j#%9C$a^l<7Z(M0BUs(1@>hK0R#bxx$YQE%a1~*NE z^q;G0sM1~wPD+Lzskpgw{COPLF{Rv$r3L5O%)E-OH#Igplh#Lds`Iq&{5`nw%5C?i z9~F)AX9WaRmgXFoGwcyX{#Euv=d729#L$Ed-$7hheZ7Fo;8Xmn(>2f@*x#3ypby1h=2{yTtN7fngCEW{^&JzFfIkwRA zL@8b|)p)o6?aa~G@MFXEDvK0%FL)s*xaXD9j2n@ep0-z?_dl`+tA#|L*&UE zqlAu33(?CpxjRojA0~M;ypg7?@f7y@>PZNHsCKb(zRJE|pR3#zv}b!cxxPO;@;&$U zuec{2UN;?8zxd6re3JgW%>H%H?lF(b45z%u0bfqL^HMazy3ch4ycNt^nEZW@`&8@b zp_lIyn;O2jY3!1<-ejc_*bsH*c27mim0Zype70uTtEGAYrxgf28d1IP)aRUjE45I1 zGWEVmL|{UC=4&0b`=m`11|o;g1xN10uWnoP*89#xPqF~yjnn)PTMZqdpaGQnD|*UmJF4oQX_Jf)9!k}VItf22-1Qju`H@0io6T3MnF zWg@ELU_nqJ&f?MutJ3ecgLk#4kvcR;fzNUzC}%xKX}rJGJ~+D9SCHvuna%DUW^PSM zk*P|n-7_~eL>yF*7Tl5DZ{T=*gR6F%Qk;J4N|zRE$CA%lW72wEyCnkVH#!z{wI~cF zs%KxPdj-DkjdU!-kEN6HKb3u1Z|WlGEHq5D?tj)QU24;?^W}@Cv)7w9x8Ivg$hMnk z>ukR2Wp}&iwx!R_9|6~*d{sYr*tKxaI6QKt@zH;HvWBsNRFol&?gFU zrrD~g&u(2gLAg!2y{>l6fvdCctjLOZG;2ZZqXN}Ni(h2EX3z%c|;{yLmkn44!8;B#Md_ z98FigDDNZT7q*UMzF#tYv_^UcMS?fufML+>^?I4#z9w{QmU%WlnaKY9<@5G;xj{Qt zDIK4?bnj}n%7Mh{^IkKbSf0MSe@fWW^8M<&#VcYE^ig`8zdHn^*Dg z?^w2Ivdl?sKs!xZd0X-W@=C@2<~iSUL>%sMMa`fB9y`PEy5nskt4}(4?8$rn$GW#vq}DIa-*D=2r<(m*JH=PEP4l0HMmp7- zWjx)GvgPY*?G5H+Lm#*JlHRAO+G=|Jl^34;ZkSh(+n1kFs%w)>y`D!J5*L`KRP%G@ zIT^X#TD{SVrDU!ABv^}F&=bVW#Yi0z66T3uha#d|IHOO$xCMa;%|cVI*7XEXEi zjhjC4zB_B6cjBugt=oQp1()o%lFE@Kilh%2O38oc>1=rXj#2+E8Qur zh9_O(G}jAPhYt}on%wt&7JTCGYd`noP5wy>$mD;E#7Z73EF9e%a<{i8}; z#aPLN=EQGx$?v0%iLY1rd@3BhxNFtBg*@~Jcevdycy4n@bPT;#yRulx^4AO7S)0e_==5i%fS<}BMEq=!El$!J*>@}J{LlKC zpA*ckT$T=zU$anWp2>@n=90#eM|!>eUv2zoAA-C4hV}c+Zt=vQ`=XFN({cvCLdLoi zCu#Wj!wA5vpu?A_Ir2c3gXjaT8IE-Fc?^bGa>5WU5 zK%s@DVywi#NTK*A@r;KeGI6Uv&O4jA;Cl2uTb0c0WFO>iO!;QUb(#FyP#Bb%5)a_4y_dwOXNn!s{ zQh`yE^od9bQQ_Un&26@&<=X;Y`cYSKso*1s*NO zQ*NI-)cXEZVE@?d(~27SG|JNace0iA19J5%)~$M;_U(j5n9$KEB_mmhwbI?L-tC$) zrwYD{<(2 zq`l*EIZB${Vx8_ZV*Kn?!;Hhnt?G@F0%X#!q&_*fa~4jhV1|+b;qr~1ZiSr6)dmzx zx2k&?Znuh@UFXuD6JE@)rL5Mw_Ts*|VMt=f@Wm2^!$~UCmjyY;5|8C&;Q|Mj{+V?0 z*g$pDR=}ltO81?Sl2iJ1aq+LDSss_WqGL7vyG1j#_9QJfo0ZWg?>9w?lK56}F@Lj^ zw0%IqoMsz+UxL7o4^jw(7nfRPFEdh>D;Mv$9a44?GXvBF}}s+ zr+@v?*LOXtI4rmmILr*nIHZ8{FxbI|89HeFJ7L ziC0`k2O_~Ar_t4GOQ@lS^tgkw-hF*>Y>Q{!t+l9Qx&ZdXO$Uf^19bWuR z2v-oEUw?VCz|_1auREi6{*G@f`(al~PCM0Zcw;TiIMF$+40qtQ!ENfBN8hE|CI`R0 z+Y#Jxr*7tQHL-$J8IekUjeUMz#f5iu>_kkn3YN%4Qml?BI zi(37LqGjj$n`hm9IjzPbpE#5CVuw@XsB%9?w1v#fe!uM5&NIHUN%(^Q)=~2a0$)$8 zc~Clwg*#jealclm<>u zH#}ZSAa1i@N8H5ynYou`pVgk)<*lzFZx;J@T~e>k+_Byyx6n(@dida{3))Rc>kZPE z%xnod(Q@zBwjbaeSIJtHAKFp?HDh z)m>(*vV0wjviALan>J{!njOwtXtR1#yF=Y3{W!(qm1S02KPm1umVJ{uFq12HtMA0F z2Jxfc%xG!JX7z&F{_P8wr|Oz*Fxx`TPL8{{q0=scPftw8wOKe!$6vY;mnQ#4$A5L5 zlKdOxzNmZFCt{>~156cZ>kLPBzHwM2wNB6QT$^|OpRGSD31Ui7gh=I_V9#M<2hXw< zk8T|ZnK7g_u-rL&rlQ*H+(kzh*vJlV%2l+kXbsi$;vH2s>lBRZSMYn_TedCFVp2dd zR<=k?%xi1K-aL+9i3G*?xepd3%pr02dG`ZPn0Xro8b9-;T_E@!t7e zZMHn>)>+%;6b=|Y{4DRnC6jPHxvW$$u=iJLRU ztlxZmW&D{h@JNZ@`1rF8v&N$NYvZ~tjQ4DN^rS^3H`95_z$m%u7LgKeFe~kJXOPWE zy`}1dxaiN}D|I&CkmR9Cs8I7}E%eTEx>>8Duvl{U{m_*WM@B>W{R7sTnR(B+^Ye(A z;d*NlF7n|}s)f0byxc5{_IfTkIcNEvC$3x03j3eS+d-my{g{`d3RUOoSUdzx>{fGi{rA`14f#nIx56S z@LH>5?`6F74P}anGi1CJj)xXSXs$|^5IU_|VJewW-7-VDViRt=nefoVM;RWG4-T4H zt4}=NbJJ_|z>9S*DRON_E%L7GmMUjOyiZgp(tDbgox_#Mb%{a-VW{kJFQ%~J;YG)M za!993`uC0T(J#KcyX-u^>Uy1EX@~Lgrz8G_m5MVS9y@bZdN^pK#YsMg6;JrDx;zYi zx7Z+FYie~M;}7(s8XSYPy|^vS6&M||$LHeFVm+z?@BTNd{7V{=2* zY+lv!f+U@NI}&_!*5ue(41X(GK4NrW&IyMXP6ac=6*pm^FnBozism_N-ZpjP|ml7}s$LZ6hUq9*TW@Wf@8c{1nj;wquV$_iSlj{iloMGayVF`D_8>0u0 z6|c-}GW^!Pu>bCf7sA4yt@e#v)>#_slpp0vUvt~nC;#j*x48Enjl$cm=l!zk+t`tj zWEQ`Td$h}9qo>>B4uAEQMK$lr51(G^J0O?bGed8D#}X%vi1NoDHimHb_B<6xOEF$n zmXUR~*>F&(j(3k~`$KwW*Nno#lU+f3x6T?fSXF3w^g_xiSqr`Gg>Q1YHcOc1>^2oi zSTFjxIVdiKWpMT7k411~9?fJopAE|s>sRu~qG zw#k|hls;5Vd8)r1@?JAB%bUv&q_P zLF+eKPT~=J_oWt9($``tn;j+c>ogpPyq%U`e_E2#wKQ1hj`XbuVl}VrU5uW8c>b=d zZfHqX`UP?^f6DTcZOX)vrja=786J0BE;yP`11MB>r;sbhT^YshgB8Z?cZPXII?z;^E1(;(A~<5s+H2+l*@8vnrd6m zpe|o@rT>0|a&_WU>r2`EsTK!+nA56$U(um{vuYl=7gKOZyrSk&j$uS=tKcSj=pKRo zBUY*I*Pq?Eo?-4uF0nS8JKI*l*8W!eF7Z9$p4YGYZn6Tq2@4cM<~=&|KE}1xaZLZ= zdkasEt<}$-8a>~qX?n{|{#3J`?PWdNlhI|Tx8HITlsBxRF5{M@sm*M7v_+3Vv-Ps&5{0==p)c{hWlcDkI!E0~<@?K}1Cu~Yp%i8>=2nNxEf zX?P@j7a4lr`0YG6_bBfj=suBq+)^v}N$r&Xr{Y^4+m%$mSSYoZ`m_&`6Rs*>;>+Ys z`EB#{J?-d=;>{{uliBK@C;lvz`*pmzeeUG&)Yc#2iySY>@#wsckd>TGIDFFh=@zvC z`_;#Fc}0HQ6;E6*R2lno^W9Hp+Uz~$_1&p8nU%-p99Fs{5b(6z-*8>UB!7yezO;gz z)v;z%$tCZCb%TurH(hvmS6a^K!o~bNu@m_RKYBXOD>|&aqoS~7Tf(V%$IjkAcv3|A z)uRLCgYz#12c$W+`ZVcC2Zy$ti508asOZ~N7$@fy_hJ4j`7e7kRV|bW zsoDRA7Ge|V?T~r)RB+3~q zDDF;PFrI5PD|OY(zt&Ch|V~d4iv81|rU!y^1 zQNx3!`}H4`8nxM%53fFdJ1o%&dT~>AN`#yD%b!oT|f1#3f!qtDOo_4faigz^Mn720Kn9yU{2Y)WuJ6;$W zxiE70q^gYcM}=Wk!L`Q<;uk-?D>}w=d4>3aiKqeZZ`$8()*KYqQ4tV#7k+XeV3D}< zf)=qzi6_fjU7zQ_b8k*h?j7yecsO1s;Rmnm@5mWlYT$RTFGt)FHT%)vQ@HL%+?nXD z+LAmTe;#}19N4OTQ~zZ8BzVgA`~|H^<+A%ePVSG+3~sp}^J90OR94oS_$#~BJ(`lr zF7&(QU;II-Y{`gz-kY|}`Pt};Tc^*=Yt?J~VoMLS%1h~$EnG4g9v-~a<4?^Y`hsx# z50UBFbLaNYO%VQU+kHH4t#9|ltA}sPXMgiwzU)=eS*qRXyFHzsO}6`Vg(uis?CEQL zx<9hq!(9JhQ2p?yyuf{DUOZkQP2d*D`B5}0%4wH6PpVOxTa^3<(~d2gqIaJ?bd??Y zE@eXE-9w2i+8D6w(d_D+myuNw2VAsvp2MYXSm`Z`6Oo*GOtDO5YwX+uwJBt!K+~Ep zv9tq}*k5fUQcdf~h1yy;5}O&b=PJeF}d&Yh5mZ4?kvBPDL3th^tFpixL?`|;68EDGR|Dw%Cq`S zYVq##L!axnsB~^x92Y4cA$=kAX;l0Y-ti^6zn9GTxrF!UlDe@ahezSR2EV}P)C~1} zErRFcHEB{N;(X_?Q4R%IjUBtpu}oJ$`MzWs8t&{OkG<_Af; zM=iVeWQV-}In(xQhUPVLQv5l=7oJC&&zsToO80s{alWC&>sc)s`mw}vH0Hnn7wyH7 zc{BNr-HqR>B@nR8R6uZ{H_z-n&OSnSH!NF{{X=YVx3IYM=$qF9i@Jl z&VM{Bxu$NWro3Ur^;P#&OzkPMhZOR^;IBBx+!Tv{@SeCQ$=*tPVH!b`^tCoD;+pBD zBg#DSm*w(jYg6io_!A@CA!2lc=&0N`JmM3oqh$m~T-3aVc|Tusk8iiipPO8z$yJ1_ z7CmoU=p*QN`@FP5 zv@ySea;8A|s_Pl_wG!4|FRNEpl@Bc~8j<_sRXN`^pD6rjU!tYqeY>sq?Uoi#28s9Z zHnbE)Rb6~>$b0OGPG-R)jqK8g0@q^ol3H?IX3cPwTf#ja*7x>elkh!>jo~?Ozm)ke zxp?OCx$^Rn-C~nL<)VAtGPRU<4~iy6wthNg#=Bdz{g&f~Dx1&1FSTNx-I}#yd>(k^ z#@z6QALgi7Nf}lfM7x~^tL)e58>-B1-tUO|;eASiPvGF}@%SNOAEnyCPlK;4TL*8= z@16hq_!~7hnevR6qLZZkDM2Sg-CbNqr2Z)WP=76kX!6tJ7d)?|8h3_9M!Uzo;}a#X>^eW^rp%qYD>4K_ zRGMw4PUfoX{i?I}Af8Kju}D62;rYbgj|6p}+f#hp2X{Xgx%72lc2kT>K{Bz`eU8^V zl+=WS0)DVAFQW&FFvLCKgYUgP;MHUIVEbk=*L z^}P0i_i)3vaBp-2zW`xN0biL(66nYuA|CmJr!fCg8GqsHz@ZkA%(y0kcaSr#$&A0? zE#t^FmGPQ%B6w{$at&S-j{If5be)7_d{4qLY9-+q_mRNc&!HX(&-@-wVqP=#zc!fD~O=ey*+e4x-%cU^dLt?g%L}lP4QJMPSP3Oq{ zG^QS%Sr46AE}fxAX10fnW9X5Y?I42}z{C5=ct-ok$cyX2HS^u$WbkHlfeSpi zU=#>1z*kKFK(4?gfyihVat)LT%>F{I3E-O9UgVkxuUSRoNbs7ibTYhVD~|%N8U2CW zPX*UZKSi!-@S3eWI=p6;2jH+@L9}F6>3E2i=|!+KJVeX%Cgd8TrLaoJL$nmO(ji)= zw;}ovEro>^579Ec5cwXWrLvU=(K5Xgeh;c=Lq~vUnLdkr3(+!T54nbDnZAr%L$u78 zM6MxPrjH}n5G{>`jsVfp8NP^o57E+D=m-!koz+?bL`!E`4^+oyJ0e8Oj2u`R5uhdF zSfvvIS|W~BIuYDX#IZ^z0<=VCq#^eMv_u>WEfJt4;@QdrXo+~X@&H;Qo~=B9mWXGe z1;w-VED4|`GI%j8?+8lq(j zDH24>7F8sOmMxAzacq7^hG^NMiVV@RMHLyMWs52@M9UUcWQdk6s>l#6TU3z&S~8iz zf)Fhkpe3_K85y7@lNmgMd=Jo)*`f~I&K4CEfR;>Va52=T0JLPbD5L&hG3oQ+zW#b$gL`!4YmIl$X zaS*sPa7Fs$)%f?uAh?d4eONVIL7>o|lGDmONIyywlVl+@X zE2JQsvdl^VNLXeg08N&W2ml4kBm{tgWdH&|z-lgJP*!sYpmr8`$et{ykULqxKn1L5 zhQ!HYT}YcO&V{7OVq8d>EQW=IiDwZk5g@~}_!ZJ6o<*-jfDO-LS0Vt1XOSxrpu@Ac z6%@=O7s!-&7SBSW#ItCY1OVb$EK33i@hn<}EQx2aDhWblktzv7WN|79LS#`YWJo-V zQ6WKsF=aX@0VT2c4$>o@MXrz?@honIMg*ig4T1t8vIr0IA)duw6bO+;P>>Dr zEIxu{h-VQ7^8c7o)GX9Wc0J_0KsAoUSg0Rfqh zzzPURd<0fNK;9#;0s_(=ffW#t^$4sOfTTxY#Q?Zs^*W?H0xKXO;}KW^0SS-53JAz| z1Xe&mx+Aax0OBR<2J(#xZ8L59bb&wnU~E zs#;mwz&KX{y$B|3D$v2eOvKnZ$X}AkbT2TU@O1{$OCrKFf8qgYq6$a^|H5I8PaJSI z`#J{zaE$TfAK(ZOoXP&Z+Z4Ghxy-qYxCjW+EnE%&rze*`*IooEYzK~u1pZHE$BNX7 z#>yPFQMRKJr)`I|784%Beg6TE2;m*uwBHk8)92b~ygK0E_P3^isguS6TzWfF*s&n_ z3K|QlA8{nuk5n8{1qS`-_+7P%GHwiSM%4^+;Qv`Om^!O~ zZU7Y7bp)mFQ(W%8nB$ z6pfR~UX0#iScn2V3kDnjinR%|cGz4qFe68KI?_{#ulCL5GT_?GwT?>%qS)bQKFo%I zgfI~r0dt{*fq+1OeFUgm1;*)gACZ_8HI0XaVa>xF%t7}b&ckpV6E1HqXFz>M004y40n#kHP`1TBMt0=ona1r<}%Rw1jvFq+1~>Lcd( zHEk9q7Do2>4=fD7F$b{)`pogX8D;A(HZ+W4|0f!-;KX!f1{eMfAcPA^(|(O`A&EJ@ z|CiO69?A4Bf(k)}Bq_N?$IOBq7E%TZ*7S-h%5?~M>_CMw%U`2$x-uEMvGZtZwy}Wq zHeZuX?3EMYYzISr5>TL+PtV>Xk7Nz8N|(*cj^t7~h%3hJ-W|+kXZ&XPP{{x4^(f#=)VRLIUd`Y$E|0 z#fiG zEfC~Rt9Sge{1v1PGEy%tz4U->+jQCc4=D`|aC)l1KAivnLCCRNidie8!=~-VX(=SQ zU~HRZNBl9K3Y4%oGM#Z{9*M7FgF-}BiBM3`D)x-G+Gt06{DFPM1#W{y?U#K%B7P16jd%%y{AU&10~whG;=%wQ6ebihbCVZS z`QIVjc(wCokB#x|n9gSugQ=WpMYfiMRYVmO`TngAX*r__s4#&Q{~fRG=>9W3X%1M= zBO@En=*pR^Gwdy=k_f1=l8i~($jl`iOw<2P*E}Z7&R8!^8h|F?v_5C{Hoc$Bj)6cS zp{!42EXhyD;$H|1b1*m5{{e^q!GP6wtEDB2t-(qN1~U?q&nZqr>q-F{}}97F*7 z0a^nggZ~q~laTd66ciFF0Gad-IDvh^gESp*f8&E`CKf6Ebx25`7(0ML^MqTj4+uF3oIgL#Bwai{Po%YAH6fY9|aU0vJCT(aA5Yz#+ZM@1OfUtf|>CQ zG~vp}e*i@@8CU^?K>rWy&hSh$R8)*Hdy+DpGcX1sMrZ;!45%1)CrwWRnbH4GaQ{W_ zM9wS}wI~X<+@VuZNz;pv%t4&FXUITAoL;m7-@;#s~_Gg@9oh2L%Q(6{GF!Lcy+4Lq4M(;zdqY#3Y%*5*(>KTUAV$bgXkTK6xc6Z&>rpv^26ap{4q*^|qK%NH!N zxW?a!&oN%jApiI~jHNMlFsykq;}93=Z@M@=m0<~^%njLO@FNj! z%VT87!2vcIo=(Bj;fREm5pb}XXc^em=af<59u-=Tf`gmLY%=(f0AqqpMgW_ocuc)e zMu6Mp7(F_H<6Z(89#2E-fzvjCYEUvV*vjIN5pZyxfz|`(jIiaAi8#3Rh}HvUM%xrm zqu_{;0NM1Q3_0$GmVrGuu(pMkfh{o*QWzPLgvJcNreo>_B0O?*knLXZ5zrC3Z9oRj z`JiRc{cvzLHuW7(F_id9cY4Jx*Vv;9%B|(F2Z!l7X**1ESjt%R`Ql zvE2*xh;TiZO@`>fl}$Do_(&mP;sfdtF_@tqa*%}WUPKS(Hf%DeN5S|m)FT1j$Li7G zmL=Q0h#uUQWs`xA6gu1)WRpQXByDArfsa%i+=OP6A$l;QVv~W7RAeWZO$PNSa3zyX z2KA5wUTiW%4<43blR-UX-IGlQ^{6maVv|8V7EK*XFPvjRKP!wtEph4DZ77s2JXbdISRcUZ_XM*dEct z#46CE<2ZN?9IC~PM^FzBmoVW!%&`oXM}$Yd*ks@%pmEOjBFB<3dL$egGc1q9=?8Q& zW?X=JWVq3XDUSjV1hB~vJx)KMQ{mAJtRANy&}s0{14fU6=}SP*fQ`{Mfb~*f(!_Qz z)WgFyH#Qm6qhiJds7HWD&9Hj#_!pZD>LHs2Y%*9L4bBzWWKa)DmQ2KDHewn07WKk(5x{0f|O!o(^l51dWqunTA~hhGr^yQ8pxdcgrGv<+Z+$N?%g z%utVjX&a&kPxfH+{^5T_&T$J?i?$UkkHF!lV3@|ppdJw(XUEh_<%|y^axfI5N5_nz zNO|zMJX#NM6Gy*+)Plo)V95Y|FD#D)_Zcze5iq_6^~fA~C!TZV(Nf;RCr_uqxTQ~BVv6Q)C=+^PJA?uaTPH3Kk(5w##KC# zz{$^GI~P4h!FrKLGuSZ0cF;Na6dbC<*dFMC?M!r^!}2JYTpr4(oIC{XMf)UD9wr9? z_mV)uhO#Nt1FVCRK|Lxa=R))_TnzPS@Z=7qJvt^o05Xs$qJ0<2u-pmj zMILKFmq!DRg{lM5gNqj!Jt9U1^@yB&53?H7y@(#B&jCIfNKiTSK!GS3)T3g!6P8E9 za0Jw&apun?Fk)iMqXSix43>u+hDNuSj{gTf3dgt)rj7r=_YYsA1Lx(amx{@iK|8>B zj`Ia4*w&7@tm_Abd0Tl67WFIc7RGy zHh_Bn7>~$c($1mxkMW3%?b5FeG3??D%FmiG@n zg^3QT4p1IA4~_04STB)dUIF$|IQbL|4A}9AfG2SBJs?0dH^F-UF&;t3=fHq$|GR74(k15J%WNf8pd`n)T3c?3)l`KW^DxO(J?Ya53}Y0^uUv(=-7gKB#wLy zxC zk^!t97(&rDK=e4~$zTVDGk(EQOpbcNdI_2%KzURwhXH&vkes2gAbOns2bzZVA*hEu zT7vci8ZatHd3elN2J59^Vi1;xoax7uhh2Y0^e}4$pgcN`bDl>96Gs#lsP_+k0rZT< z4E4Zd7j-YJmxLKBpdK~`5j{>`qa%;`v9%5AkvYdpK(T1dh#rPJVZB(NgnAUt*rH?C z;1N9zzaoN_QM6AYdK`WQmI^Sw0rh}kP_{yry)iL}=yA+@z%oB3mxp>Zj`bHXd|=kh z5j}X0oz14OUJ7SE4q^};3s4U`mxSffF&qZ<=$J78=mFQojvqv@0E3P}L=VH+pgcTw z?16fm>-^wxUU>R}t!;=N2Va2w)L4N!Ydl83hyjuwFovsCz+k;dG5d1~xl5WE?pr{U7lG zWXO4XHhj=76pa6YHGZ&0hHVGfg}~0~Kr`qVz6a&e!GbIbA1IHAJSfXnFO*@|?_vL9 zeH_R@9AW#7j;CVAGFUGalW#y74HJW)UMff)vG~9=0PSmFb`Izsldl08$mUV^LOpB_ z2W3=@9{?HHUqIUhv<(a^=)Qz9JZ8-owgWU6RWFVN@(Ao&J&=I`7^4Tb-_iHN^1vv7 z(F4AL?KcwOFig%0_J~1VjJ5%kAwQGB-oIeO5P1X;Bg5v7;9g)Cw4I?0OzJTBz_SY2 zIV{-tM1BSVRR=hK!qE;AFcrEyXaf?~$H8h7Hn#wSC5?g^%iz5nyavb=o8RMrj0}(5 zqwxJ>ua`unV&~X6FvG^q&!LQpwE@`T1IwGJI-n0BKSse`FSr$(mw@tUV9-O|3vQ)? z$sdOdY<^;8z*Zc3G%_{^28$)w`96$k?AZW_8Jm}Y1Oz07=(YhF7=Y1z2{$=$@E8wU zd!Y=E-Jbz6jyVaCQ8B&-?xkVRDL{Px;32R^fyM{hhFzz@fkk=bxf?coPzKJ(pfH2| zZyHBl43aS9q#XOb;70ItCHh`4(s1 z>{tP0L~PDVB?2kN?|}^LPN2$zb|3FI63RdiWADWyPrtKa25W>IJ_%(M zcq*P<51gh0orIFXeghM4lnm_Pf(aMK20#WDZqa&RMu+??5PKaUi{RKV1Cv4I2PfF{ zz&--V8ZhO7m1a6-jtC4zqhj(6@Z$#HxEm%G;K+@QX)ss-I4I0ucaV;q+k?Cjm>NAU zKpA#V6VywgVRIF*gGwUROg1=t4dk)t{ss3!7sS>9(n)lm11waK?4k7Fz1SQb9FhSC@-Uc5;D^mH{sNLP zj<^ImoabMFjAKm!B&;BkP*?yTf=L+K2Ea2wT7r&2u+9vIGR(a|22MSp%Y)n9n7j$x z3zq&dJ_KYOc_%nD2Zl#u#e z%@WA4J_PUOIBNwqjsZu$&0W0~>lA^&&rM zg=q%`8>`@64(W6J}x8Eou>Grc&D*a9*R ze+FAm*l_{e3(_eJJ__8S;gn&=Bd{6)76n;){=W8Zdz^j2&rO=U?Q@3b%q3OLyuAD+ zLHY0rk@cP~UXs8T$Y*^?TMZXS7mB^3lZ%r**@@)nU=JqV;2@8^Gu{C#H#!pSH8n^y z2XMB6>`cZxz)c>!1DJX^Ig*?m>39b`&Yq$Pf3(KW-`>|BIo%Fv0pvFG<>c0y7|j2F DaJB$o literal 0 HcmV?d00001 diff --git a/doc/matmul_ip_spec.md b/doc/matmul_ip_spec.md new file mode 100644 index 0000000..61c68b1 --- /dev/null +++ b/doc/matmul_ip_spec.md @@ -0,0 +1,137 @@ +# 集成电路创新创业大赛 龙芯中科杯 阶段任务三 矩阵乘法器 IP 设计说明 + +## 1. 参赛任务与设计自由度 + +本题希望参赛者在保证测试流程能够正确运行的前提下,获得尽可能大的设计自由度。参赛者可以自行决定矩阵乘法器的内部微结构、是否实现 DMA、CPU 与加速器之间的数据搬运方式、批量计算调度方式以及 C 程序中的驱动策略。 + +参赛者至少需要设计两部分内容: + +1. **乘法加速器**:在 `rtl/` 中实现并接入 SoC 的矩阵乘法硬件 IP。 +2. **C 程序**:运行在 SoC CPU 上,负责按数据布局读取输入、配置并启动加速器、等待计算完成,并将结果写回 ExtRAM 中的指定结果区域。 + +无论内部实现如何,最终都必须满足本文定义的数据布局、结果格式和测试流程要求。测试只关心程序能否在解除复位后正确运行,并在串口输出完成标志后,从 ExtRAM 中读取到正确结果。 + +## 2. 设计目标与接口 + +参赛者需要设计一个矩阵乘法器 IP,用于完成: + +```text +C = A x B +``` + +矩阵最大规模为 `4x4 * 4x4`。对于较小规模矩阵,例如 `2x3 * 3x2`,仍使用 4x4 数据槽位存储,未使用位置填 0,硬件可按统一的 4x4 规则计算,不影响有效结果。 + +每个输入元素为 32 bit。若采用无符号计算,每个输出元素为 4 项 32x32 乘积累加结果,结果宽度为 66 bit。实现中不得使用 FPGA DSP 资源,乘法运算应由 LUT、寄存器、加法器、移位器等基础逻辑构成。 + +矩阵乘法器 IP 固定作为 AXI slave 外设接入 SoC 的 `axiOut_7` 位置,由 CPU 通过 memory-mapped register 方式进行配置、启动和查询。寄存器接口可以按参赛者实现需要进行扩展或调整,但软件程序必须能够配合该接口完成测试任务。 + +## 3. RAM 数据布局 + +测试使用 ExtRAM 存放源矩阵和结果矩阵。数据采用“源数据连续区 + 结果连续区”的批量布局:前部连续存放 n 组源矩阵 A/B,排列方式为 `A0, B0, A1, B1, ... A(n-1), B(n-1)`;后部连续存放 n 组结果矩阵 C。 + +每组源数据占: + +```text +A: 16 word = 64 Byte +B: 16 word = 64 Byte +A + B: 32 word = 128 Byte +``` + +每组结果数据占: + +```text +C: 16 * 3 word = 48 word = 192 Byte +``` + +因此每组完整数据总占用: + +```text +(1 + 1 + 3) * 16 * 32 bit = 80 word = 320 Byte +``` + +批量布局如下: + +```text +SRC_BASE + 0 * 128: + group0_A[16] + group0_B[16] + +SRC_BASE + 1 * 128: + group1_A[16] + group1_B[16] + +... + +SRC_BASE + (n - 1) * 128: + group(n-1)_A[16] + group(n-1)_B[16] + +DST_BASE: + group0_C[48] + group1_C[48] + ... + group(n-1)_C[48] +``` + +第 i 组矩阵的地址计算规则为: + +```text +A_i = SRC_BASE + i * 128 +B_i = SRC_BASE + i * 128 + 64 +C_i = DST_BASE + i * 192 +``` + +默认可令: + +```text +DST_BASE = SRC_BASE + n * 128 +``` + +即结果区紧跟在 n 组源数据之后。IP 不应假设源区和结果区必须相邻,DMA 模式下应以 `SRC_BASE` 和 `DST_BASE` 寄存器为准。 + +矩阵 A、B 均按 row-major 存储,每个元素占 1 个 32 bit word: + +```text +A[0][0], A[0][1], A[0][2], A[0][3], +A[1][0], ... +A[3][3] +``` + +矩阵 C 同样按 row-major 存储,每个元素占 3 个 32 bit word,用于保存 66 bit 结果: + +```text +C[i][j] word0 = result[31:0] +C[i][j] word1 = result[63:32] +C[i][j] word2 = {30'b0, result[65:64]} +``` + +## 4. 测试流程 + +测试流程如下: + +1. 保持 SoC 处于复位状态。 +2. 测试平台向存储器写入待运行程序和矩阵输入数据。 +3. 解除 SoC 复位,同时开始计时。 +4. SoC CPU 运行参赛者编写的 C 程序。程序应完成输入数据读取、加速器配置、矩阵乘法计算调度、结果写回以及完成通知。 +5. 测试平台监听串口输出。当串口输出约定的特定字符串时,停止计时。 +6. 停止计时后,测试平台读取 ExtRAM 中的结果数据,并按本文定义的结果布局进行校验。 + +因此,C 程序必须在所有矩阵结果已经写回 ExtRAM 后,再通过串口输出完成标志。若提前输出完成标志,测试平台会立即停止计时并读取结果,可能导致校验失败。 + +## 5. 发布包环境修改 + +发布包工程保持统一顶层引脚约束,使用提供的 `fpga/constraints/soc.xdc`。参赛者不需要、也不应修改板级引脚约束。 + +工程需要在 SoC 顶层中为矩阵乘法器预留接入点: + +1. 将矩阵乘法器 IP 的 AXI slave 接口连接到 `AxiCrossbar_2x8` 的 `axiOut_7`。 +2. 为矩阵乘法器分配地址空间 `0x1f50_0000`,对应 crossbar slave7。 +3. 若支持 DMA,可将矩阵乘法器的 AXI master 接口连接到当前预留的 master1 通路。 +4. 保留 BaseRAM/ExtRAM 的统一连接方式。BaseRAM 可用于存放程序指令,ExtRAM 用于存放源矩阵和结果矩阵。 +5. 软件 BSP 中增加矩阵乘法器寄存器基地址和驱动接口,例如: + +```c +#define MATMUL_BASE 0x1f500000 +``` + +硬件部分建议限制为 `rtl/` 目录内文件替换或新增;软件部分应提供用于运行矩阵任务的 C 程序及必要的 BSP/驱动适配。工程、引脚约束、测试框架和资源检查流程保持统一,以保证结果可复现。 diff --git a/fpga/check_dsp.py b/fpga/check_dsp.py new file mode 100644 index 0000000..b0ff3a7 --- /dev/null +++ b/fpga/check_dsp.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python3 +import os +import re +import sys +from pathlib import Path +from typing import List + + +def usage() -> None: + print("Usage: python3 check_dsp.py [max-dsp]", file=sys.stderr) + + +def extract_dsp_used(report: Path) -> int: + if not report.is_file(): + raise FileNotFoundError(f"DSP utilization report not found: {report}") + + used_values = [] + for line in report.read_text(errors="replace").splitlines(): + stripped = line.strip() + if not stripped.startswith("|") or "DSP" not in stripped.upper(): + continue + + columns = [col.strip() for col in stripped.strip("|").split("|")] + if len(columns) < 2: + continue + if not re.fullmatch(r"DSPs?", columns[0], re.IGNORECASE): + continue + + match = re.fullmatch(r"\d+", columns[1]) + if match: + used_values.append(int(match.group(0))) + + if not used_values: + raise ValueError(f"No DSP utilization row found in {report}") + + return max(used_values) + + +def main(argv: List[str]) -> int: + if len(argv) not in (2, 3): + usage() + return 2 + + report = Path(argv[1]) + max_allowed = int(argv[2]) if len(argv) == 3 else int(os.environ.get("DSP_MAX", "0")) + used = extract_dsp_used(report) + print(f"DSP used: {used}, allowed: {max_allowed}") + if used > max_allowed: + print(f"ERROR: DSP usage {used} exceeds allowed limit {max_allowed}", file=sys.stderr) + return 1 + return 0 + + +if __name__ == "__main__": + try: + sys.exit(main(sys.argv)) + except Exception as exc: + print(f"ERROR: {exc}", file=sys.stderr) + sys.exit(1) diff --git a/fpga/create_project.tcl b/fpga/create_project.tcl new file mode 100644 index 0000000..b7f5988 --- /dev/null +++ b/fpga/create_project.tcl @@ -0,0 +1,24 @@ +# SET PROJECT NAME +set project_name Loongson_Soc +set project_path ./project +set project_part xc7a200tfbg676-1 +# CLEAR +file delete -force $project_path + +create_project -force $project_name $project_path -part $project_part + +# Add conventional sources +add_files -scan_for_includes ../rtl + +# Add IPs +add_files -norecurse -scan_for_includes ../rtl/ip/PLL_2019_2/clk_pll.xci + +# Add simulation files +add_files -fileset sim_1 ../sim/ + +# Add constraints +add_files -fileset constrs_1 -quiet ./constraints + +set_property top soc_top [current_fileset] +set_property -name "top" -value "tb_top" -objects [get_filesets sim_1] +set_property -name {xsim.simulate.log_all_signals} -value {true} -objects [get_filesets sim_1] diff --git a/fpga/generate_bit.tcl b/fpga/generate_bit.tcl new file mode 100644 index 0000000..a3d8ee9 --- /dev/null +++ b/fpga/generate_bit.tcl @@ -0,0 +1,26 @@ +# open project +open_project project/Loongson_Soc.xpr + +# generate Bitstream +launch_runs impl_1 -to_step write_bitstream +wait_on_run impl_1 + +set impl_run [get_runs impl_1] +set impl_progress [get_property PROGRESS $impl_run] +set impl_status [get_property STATUS $impl_run] +puts "impl_1 progress: $impl_progress" +puts "impl_1 status: $impl_status" + +set bit_files [glob -nocomplain project/Loongson_Soc.runs/impl_1/*.bit] +if {[llength $bit_files] == 0} { + puts "ERROR: Bitstream file was not generated!" + exit 1 +} + +puts "Generated bitstream files:" +foreach bit_file $bit_files { + puts " $bit_file" +} + +close_project +exit 0 diff --git a/fpga/run-linter.py b/fpga/run-linter.py new file mode 100644 index 0000000..1959d92 --- /dev/null +++ b/fpga/run-linter.py @@ -0,0 +1,288 @@ +#!/usr/bin/env python3 +from lxml import etree +import chardet +import sys +import os +from pathlib import Path +from typing import Tuple, List, Set +import shutil +import subprocess +import tempfile +import traceback +import re + +def usage(): + print("Usage: python3 run-linter.py ", file=sys.stderr) + +def is_header(f: Path): + with f.open('rb') as fd: + return -1 == fd.read().find(b'endmodule') + +def transcoding(src: Path, target: Path): + with src.open("rb") as fd: + rawdata = fd.read() + res = chardet.detect(rawdata) + detected = res['encoding'] if res['confidence'] > 0.5 else None + encodings = ["utf-8", "gb18030"] + if detected and detected.lower() not in ("utf-8", "gb18030"): + encodings.append(detected) + + for encoding in encodings: + try: + s = rawdata.decode(encoding) + break + except UnicodeDecodeError: + continue + else: + print("Transcoding", src, "with replacement characters") + s = rawdata.decode("utf-8", "replace") + with target.open("wb") as wfd: + wfd.write(s.encode('utf-8')) + +def parse_project(xpr: Path) -> Tuple[str, Set[str], Set[str], Set[str]]: + prjname = os.path.splitext(xpr.name)[0] + prjdir = xpr.parent.resolve() + repo_root = prjdir.parent.parent + srcdir = prjdir / (prjname + ".srcs") + topname = '' + target = prjdir / '.lint' + + tree = etree.parse(str(xpr)) + srclist = set() + headerlist = set() + inclist = set() + skipped_ip_count = 0 + for fileset in tree.xpath("/Project/FileSets/FileSet"): + if fileset.attrib['Type'] != 'DesignSrcs' and \ + fileset.attrib['Type'] != 'BlockSrcs': + continue + for child in fileset: + if child.tag == 'File': + tmp = child.attrib['Path'] + if tmp.endswith((".xci", ".xcix")): + skipped_ip_count += 1 + continue + tmp = tmp.replace('$PSRCDIR', str(srcdir)) + tmp = tmp.replace('$PPRDIR', str(prjdir)) + vlog = Path(tmp).resolve() + if not vlog.is_file(): + print("Source file", vlog, "does not exist") + continue + vlog_target = target / vlog.relative_to(repo_root) + vlog_target.parent.mkdir(exist_ok=True, parents=True) + # shutil.copy(vlog, vlog_target) + transcoding(vlog, vlog_target) + inclist.add(str(vlog_target.parent)) + if is_header(vlog_target): + headerlist.add(str(vlog_target)) + else: + srclist.add(str(vlog_target)) + elif child.tag == 'Config' and fileset.attrib['Type'] == 'DesignSrcs': + topname = child.xpath("./Option[@Name='TopModule']")[0].attrib['Val'] + + return (topname, headerlist, srclist, inclist) + +def verilator_supports_warning(verilator: str, env, warning: str) -> bool: + with tempfile.TemporaryDirectory() as tmpdir: + probe = Path(tmpdir) / "verilator_warning_probe.v" + probe.write_text("module verilator_warning_probe; endmodule\n", encoding="utf-8") + res = subprocess.run( + [verilator, "--lint-only", "-Wno-" + warning, str(probe)], + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + universal_newlines=True, + env=env, + ) + return "Unknown warning specified" not in res.stdout + +def strip_verilog_comments(text: str) -> str: + text = re.sub(r"/\*.*?\*/", "", text, flags=re.S) + return re.sub(r"//.*", "", text) + +def find_module_body(text: str, module_name: str) -> str: + pattern = re.compile(r"\bmodule\s+" + re.escape(module_name) + r"\b.*?\bendmodule\b", re.S) + m = pattern.search(text) + return m.group(0) if m else "" + +def find_top_source(topname: str, srclist: Set[str]) -> Tuple[Path, str]: + module_re = re.compile(r"\bmodule\s+" + re.escape(topname) + r"\b") + for src in sorted(srclist): + path = Path(src) + text = path.read_text(encoding="utf-8", errors="replace") + if module_re.search(strip_verilog_comments(text)): + return path, text + return Path(), "" + +def module_is_instantiated(module_name: str, text: str) -> bool: + code = strip_verilog_comments(text) + pattern = re.compile( + r"(? Tuple[dict, dict]: + module_sources = {} + module_bodies = {} + for src in sorted(sources): + path = Path(src) + text = path.read_text(encoding="utf-8", errors="replace") + code = strip_verilog_comments(text) + for m in re.finditer(r"\bmodule\s+([A-Za-z_][A-Za-z0-9_$]*)\b.*?\bendmodule\b", code, re.S): + name = m.group(1) + module_sources.setdefault(name, path) + module_bodies.setdefault(name, m.group(0)) + return module_sources, module_bodies + +def find_instantiated_modules(text: str, module_names: Set[str]) -> Set[str]: + return { + module + for module in module_names + if module_is_instantiated(module, text) + } + +def find_reachable_modules(topname: str, module_bodies: dict) -> Set[str]: + reachable = set() + pending = [topname] + module_names = set(module_bodies) + while pending: + module = pending.pop() + if module in reachable: + continue + reachable.add(module) + body = module_bodies.get(module, "") + for child in find_instantiated_modules(body, module_names - reachable): + pending.append(child) + return reachable + +def run_design_sanity_checks(prjdir: Path, topname: str, srclist: Set[str]): + issues = [] + top_source, top_text = find_top_source(topname, srclist) + if not top_text: + issues.append("Top module '{}' was not found in lint source set.".format(topname)) + else: + for lineno, line in enumerate(top_text.splitlines(), start=1): + if "add your code" in line.lower(): + issues.append( + "{}:{}: template placeholder remains in top module; the SoC integration is likely incomplete.".format( + top_source, lineno + ) + ) + + module_sources, module_bodies = extract_module_definitions(srclist) + reachable_modules = find_reachable_modules(topname, module_bodies) + unreachable_modules = sorted(set(module_bodies) - reachable_modules) + if len(module_bodies) >= 20 and len(unreachable_modules) > len(module_bodies) // 2: + shown_modules = ", ".join(unreachable_modules[:12]) + if len(unreachable_modules) > 12: + shown_modules += ", ..." + issues.append( + "{}: only {} of {} project modules are reachable from top '{}'; unreachable modules include: {}.".format( + top_source, + len(reachable_modules & set(module_bodies)), + len(module_bodies), + topname, + shown_modules, + ) + ) + + if issues: + sanity_log = prjdir / "linter-sanity.log" + sanity_log.write_text("\n".join(issues) + "\n", encoding="utf-8") + print("HDL sanity check failed.") + for issue in issues: + print(issue) + print("Full log:", sanity_log) + sys.exit(1) + +def run_linter(prjdir: Path, topname: str, headerlist: Set[str], srclist: Set[str], inclist: Set[str]): + linter_log = prjdir / "linter.log" + linter_args = prjdir / "linter.args" + verilator = os.environ.get("VERILATOR") or shutil.which("verilator") or shutil.which("verilator_bin.exe") + if not verilator: + print("ERROR: verilator was not found in PATH.", file=sys.stderr) + print("Install verilator in the CI image, set VERILATOR, or remove the HDL lint step from .gitlab-ci.yml.", file=sys.stderr) + sys.exit(127) + + env = os.environ.copy() + if os.name == "nt" and "VERILATOR_ROOT" not in env: + verilator_root = Path(verilator).resolve().parent.parent / "share" / "verilator" + if verilator_root.is_dir(): + env["VERILATOR_ROOT"] = str(verilator_root) + + timescale_warning = None + for warning in ("TIMESCALEMOD", "TIMESCALE"): + if verilator_supports_warning(verilator, env, warning): + timescale_warning = warning + break + + args = [ + verilator, + "--lint-only", + "-Wall", + "-Wno-fatal", + "-Wno-DECLFILENAME", + "-Wno-PINCONNECTEMPTY", + "-Wno-UNUSED", + "-GSIMULATION=1", + ] + if timescale_warning: + args.append("-Wno-" + timescale_warning) + args += ['--top-module', topname] + incargs = [ '-I' + i for i in inclist] + args += incargs + args += sorted(headerlist) + args += srclist + + if os.name == "nt": + response_args = [str(arg).replace("\\", "/") for arg in args[1:]] + linter_args.write_text("\n".join(response_args) + "\n", encoding="utf-8") + run_args = [verilator, "-f", str(linter_args)] + else: + run_args = args + + with linter_log.open("w", encoding="utf-8") as log: + res = subprocess.run(run_args, stdout=log, stderr=subprocess.STDOUT, env=env) + if res.returncode != 0: + log_text = linter_log.read_text(encoding="utf-8", errors="replace") + error_lines = [ + line for line in log_text.splitlines() + if "%Error" in line or "Error:" in line or "ERROR:" in line + ] + print("HDL lint failed.") + if error_lines: + print("Key errors:") + for line in error_lines[:20]: + print(line) + if len(error_lines) > 20: + print("... {} more error lines omitted".format(len(error_lines) - 20)) + else: + print("No explicit error line found in Verilator output.") + print("Return code:", res.returncode) + print("Full log:", linter_log) + sys.exit(res.returncode) + print("HDL lint passed.") + +if __name__ == "__main__": + try: + if len(sys.argv) != 2: + usage() + sys.exit(2) + xpr = Path(sys.argv[1]) + if not xpr.is_file(): + print("Vivado project file does not exist:", xpr, file=sys.stderr) + sys.exit(2) + topname, headerlist, srclist, inclist = parse_project(xpr) + if not topname: + print("Top module was not found in project:", xpr, file=sys.stderr) + sys.exit(1) + if not srclist: + print("No Verilog source files were found in project:", xpr, file=sys.stderr) + sys.exit(1) + run_design_sanity_checks(xpr.parent, topname, srclist) + run_linter(xpr.parent, topname, headerlist, srclist, inclist) + except Exception: + traceback.print_exc() + sys.exit(1) diff --git a/fpga/run_impl.tcl b/fpga/run_impl.tcl new file mode 100644 index 0000000..7182fed --- /dev/null +++ b/fpga/run_impl.tcl @@ -0,0 +1,32 @@ +# bit.tcl +open_project project/Loongson_Soc.xpr + +# Add myCPU +# add_files -scan_for_includes mysrc + +# Add xilinx_ip in myCPU +# add_files -quiet [glob -nocomplain mysrc/xilinx_ip/*/*.xci] +# add_files -quiet [glob -nocomplain mysrc/xilinx_ip/*/*.xcix] + +# Upgrade IPs +upgrade_ip -quiet [get_ips] + +# run_impl +launch_runs impl_1 +wait_on_run impl_1 + +# check impl status +if {[get_property PROGRESS [get_runs impl_1]] != "100%"} { + puts "ERROR: Implementation failed!" + exit 1 +} + +# open_run impl_1 +open_run impl_1 +report_utilization -file project/dsp_utilization.rpt -pb project/dsp_utilization.pb + +# report_timing_summary -delay_type min_max -report_unconstrained \ +# -file lab/lab1.runs/impl_1/timing_summary.rpt + +close_project +exit 0 \ No newline at end of file diff --git a/rtl/config.h b/rtl/config.h new file mode 100644 index 0000000..5e0bd9f --- /dev/null +++ b/rtl/config.h @@ -0,0 +1,94 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ + +`define SRAM_Init_File "../../../../../../sdk/axi_ram.mif" + +`define USE_CACHE + +`define Lawcmd 4 +`define Lawdirqid 4 +`define Lawstate 2 +`define Lawscseti 2 +`define Lawid 4 +`define Lawaddr 32 +`define Lawlen 8 +`define Lawsize 3 +`define Lawburst 2 +`define Lawlock 2 +`define Lawcache 4 +`define Lawprot 3 +`define Lawvalid 1 +`define Lawready 1 +`define Lwid 4 +`define Lwdata 32 +`define Lwstrb 4 +`define Lwlast 1 +`define Lwvalid 1 +`define Lwready 1 +`define Lbid 4 +`define Lbresp 2 +`define Lbvalid 1 +`define Lbready 1 +`define Larcmd 4 +`define Larcpuno 10 +`define Larid 4 +`define Laraddr 32 +`define Larlen 8 +`define Larsize 3 +`define Larburst 2 +`define Larlock 2 +`define Larcache 4 +`define Larprot 3 +`define Larvalid 1 +`define Larready 1 +`define Lrstate 2 +`define Lrscseti 2 +`define Lrid 4 +`define Lrdata 32 +`define Lrresp 2 +`define Lrlast 1 +`define Lrvalid 1 +`define Lrready 1 +`define Lrrequest 1 + +`define LID 4 +`define LADDR 32 +`define LLEN 8 +`define LSIZE 3 +`define LDATA 32 +`define LSTRB 4 +`define LBURST 2 +`define LLOCK 2 +`define LCACHE 4 +`define LPROT 3 +`define LRESP 2 diff --git a/rtl/ip/APB_UART/URT/raminfr.v b/rtl/ip/APB_UART/URT/raminfr.v new file mode 100644 index 0000000..a7e8677 --- /dev/null +++ b/rtl/ip/APB_UART/URT/raminfr.v @@ -0,0 +1,62 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ + +module raminfr(clk, we, a, dpra, di, dpo); + +parameter addr_width = 4; +parameter data_width = 8; +parameter depth = 16; + +input clk; +input we; +input [addr_width-1:0] a; +input [addr_width-1:0] dpra; +input [data_width-1:0] di; +output [data_width-1:0] dpo; +reg [data_width-1:0] ram [depth-1:0]; + +wire [data_width-1:0] di; +wire [addr_width-1:0] a; +wire [addr_width-1:0] dpra; + +always @(posedge clk) begin + if (we) + ram[a] <= di; +end +reg [data_width-1:0] dpo; + +always @(posedge clk) + dpo <= ram[dpra]; + +endmodule + diff --git a/rtl/ip/APB_UART/URT/uart_defines.h b/rtl/ip/APB_UART/URT/uart_defines.h new file mode 100644 index 0000000..02bc376 --- /dev/null +++ b/rtl/ip/APB_UART/URT/uart_defines.h @@ -0,0 +1,119 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ + +`define UART_ADDR_WIDTH 3 +`define UART_DATA_WIDTH 8 + +// Register addresses +`define UART_REG_RB `UART_ADDR_WIDTH'd0 // receiver buffer +`define UART_REG_TR `UART_ADDR_WIDTH'd0 // transmitter +`define UART_REG_IE `UART_ADDR_WIDTH'd1 // Interrupt enable +`define UART_REG_II `UART_ADDR_WIDTH'd2 // Interrupt identification +`define UART_REG_FC `UART_ADDR_WIDTH'd2 // FIFO control +`define UART_REG_LC `UART_ADDR_WIDTH'd3 // Line Control +`define UART_REG_MC `UART_ADDR_WIDTH'd4 // Modem control +`define UART_REG_LS `UART_ADDR_WIDTH'd5 // Line status +`define UART_REG_MS `UART_ADDR_WIDTH'd6 // Modem status +`define UART_REG_SR `UART_ADDR_WIDTH'd7 // Scratch register +`define UART_REG_DL1 `UART_ADDR_WIDTH'd0 // Divisor latch bytes (1-2) +`define UART_REG_DL2 `UART_ADDR_WIDTH'd1 + +// Interrupt Enable register bits +`define UART_IE_RDA 0 // Received Data available interrupt +`define UART_IE_THRE 1 // Transmitter Holding Register empty interrupt +`define UART_IE_RLS 2 // Receiver Line Status Interrupt +`define UART_IE_MS 3 // Modem Status Interrupt + +// Interrupt Identification register bits +`define UART_II_IP 0 // Interrupt pending when 0 +`define UART_II_II 3:1 // Interrupt identification + +// Interrupt identification values for bits 3:1 +`define UART_II_RLS 3'b011 // Receiver Line Status +`define UART_II_RDA 3'b010 // Receiver Data available +`define UART_II_TI 3'b110 // Timeout Indication +`define UART_II_THRE 3'b001 // Transmitter Holding Register empty +`define UART_II_MS 3'b000 // Modem Status + +// FIFO Control Register bits +`define UART_FC_TL 1:0 // Trigger level + +// FIFO trigger level values +`define UART_FC_1 2'b00 +`define UART_FC_4 2'b01 +`define UART_FC_8 2'b10 +`define UART_FC_14 2'b11 + +// Line Control register bits +`define UART_LC_BITS 1:0 // bits in character +`define UART_LC_SB 2 // stop bits +`define UART_LC_PE 3 // parity enable +`define UART_LC_EP 4 // even parity +`define UART_LC_SP 5 // stick parity +`define UART_LC_BC 6 // Break control +`define UART_LC_DL 7 // Divisor Latch access bit + +// Modem Control register bits +`define UART_MC_DTR 0 +`define UART_MC_RTS 1 +`define UART_MC_OUT1 2 +`define UART_MC_OUT2 3 +`define UART_MC_LB 4 // Loopback mode + +// Line Status Register bits +`define UART_LS_DR 0 // Data ready +`define UART_LS_OE 1 // Overrun Error +`define UART_LS_PE 2 // Parity Error +`define UART_LS_FE 3 // Framing Error +`define UART_LS_BI 4 // Break interrupt +`define UART_LS_TFE 5 // Transmit FIFO is empty +`define UART_LS_TE 6 // Transmitter Empty indicator +`define UART_LS_EI 7 // Error indicator + +// Modem Status Register bits +`define UART_MS_DCTS 0 // Delta signals +`define UART_MS_DDSR 1 +`define UART_MS_TERI 2 +`define UART_MS_DDCD 3 +`define UART_MS_CCTS 4 // Complement signals +`define UART_MS_CDSR 5 +`define UART_MS_CRI 6 +`define UART_MS_CDCD 7 + +// FIFO parameter defines + +`define UART_FIFO_WIDTH 8 +`define UART_FIFO_DEPTH 16 +`define UART_FIFO_POINTER_W 4 +`define UART_FIFO_COUNTER_W 5 +`define UART_FIFO_REC_WIDTH 11 diff --git a/rtl/ip/APB_UART/URT/uart_receiver.v b/rtl/ip/APB_UART/URT/uart_receiver.v new file mode 100644 index 0000000..da5ace6 --- /dev/null +++ b/rtl/ip/APB_UART/URT/uart_receiver.v @@ -0,0 +1,288 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ + +`include "uart_defines.h" + +module uart_receiver (clk, wb_rst_i, lcr, rf_pop, srx_pad_i, enable, + counter_t, rf_count, rf_data_out, rf_error_bit, + rf_overrun, rx_reset, lsr_mask, rstate, rf_push_pulse); + +input clk; +input wb_rst_i; +input [7:0] lcr; +input rf_pop; +input srx_pad_i; +input enable; +input rx_reset; +input lsr_mask; + +output [9:0] counter_t; +output [`UART_FIFO_COUNTER_W-1:0] rf_count; +output [`UART_FIFO_REC_WIDTH-1:0] rf_data_out; +output rf_overrun; +output rf_error_bit; +output [3:0] rstate; +output rf_push_pulse; + +reg [3:0] rstate; +reg [3:0] rcounter16; +reg [2:0] rbit_counter; +reg [7:0] rshift; +reg rparity; +reg rparity_error; +reg rframing_error; +reg rbit_in; +reg rparity_xor; +reg [7:0] counter_b; +reg rf_push_q; + +reg [`UART_FIFO_REC_WIDTH-1:0] rf_data_in; +wire[`UART_FIFO_REC_WIDTH-1:0] rf_data_out; +wire rf_push_pulse; +reg rf_push; +wire rf_pop; +wire rf_overrun; +wire[`UART_FIFO_COUNTER_W-1:0] rf_count; +wire rf_error_bit; +wire break_error = (counter_b == 0); + +uart_rfifo #(`UART_FIFO_REC_WIDTH) fifo_rx( + .clk ( clk ), + .wb_rst_i ( wb_rst_i ), + .data_in ( rf_data_in ), + .data_out ( rf_data_out ), + .push ( rf_push_pulse), + .pop ( rf_pop ), + .overrun ( rf_overrun ), + .count ( rf_count ), + .error_bit ( rf_error_bit ), + .fifo_reset ( rx_reset ), + .reset_status( lsr_mask ) +); + +wire rcounter16_eq_7 = (rcounter16 == 4'd7); +wire rcounter16_eq_0 = (rcounter16 == 4'd0); +wire rcounter16_eq_1 = (rcounter16 == 4'd1); + +wire [3:0] rcounter16_minus_1 = rcounter16 - 1'b1; + +parameter sr_idle = 4'd0; +parameter sr_rec_start = 4'd1; +parameter sr_rec_bit = 4'd2; +parameter sr_rec_parity = 4'd3; +parameter sr_rec_stop = 4'd4; +parameter sr_check_parity = 4'd5; +parameter sr_rec_prepare = 4'd6; +parameter sr_end_bit = 4'd7; +parameter sr_ca_lc_parity = 4'd8; +parameter sr_wait1 = 4'd9; +parameter sr_push = 4'd10; + + +always @(posedge clk ) begin + if (wb_rst_i) begin + rstate <= sr_idle; + rbit_in <= 1'b0; + rcounter16 <= 0; + rbit_counter <= 0; + rparity_xor <= 1'b0; + rframing_error <= 1'b0; + rparity_error <= 1'b0; + rparity <= 1'b0; + rshift <= 0; + rf_push <= 1'b0; + rf_data_in <= 0; + end + else if (enable) begin + case (rstate) + sr_idle : begin + rf_push <= 1'b0; + rf_data_in <= 0; + rcounter16 <= 4'b1110; + if (srx_pad_i==1'b0 & ~break_error) begin + rstate <= sr_rec_start; + end + end + sr_rec_start : begin + rf_push <= 1'b0; + if (rcounter16_eq_7) + if (srx_pad_i==1'b1) + rstate <= sr_idle; + else + rstate <= sr_rec_prepare; + else rstate<=rstate; + rcounter16 <= rcounter16_minus_1; + end + sr_rec_prepare: begin + case (lcr[1:0]) + 2'b00 : rbit_counter <= 3'b100; + 2'b01 : rbit_counter <= 3'b101; + 2'b10 : rbit_counter <= 3'b110; + 2'b11 : rbit_counter <= 3'b111; + endcase + if (rcounter16_eq_0) begin + rstate <= sr_rec_bit; + rcounter16 <= 4'b1110; + rshift <= 0; + end + else + rstate <= sr_rec_prepare; + rcounter16 <= rcounter16_minus_1; + end + sr_rec_bit : begin + if (rcounter16_eq_0) rstate <= sr_end_bit; + if (rcounter16_eq_7) + case (lcr[1:0]) + 2'b00 : rshift[4:0] <= {srx_pad_i, rshift[4:1]}; + 2'b01 : rshift[5:0] <= {srx_pad_i, rshift[5:1]}; + 2'b10 : rshift[6:0] <= {srx_pad_i, rshift[6:1]}; + 2'b11 : rshift[7:0] <= {srx_pad_i, rshift[7:1]}; + endcase + rcounter16 <= rcounter16_minus_1; + end + sr_end_bit : begin + if (rbit_counter==3'b0) + if (lcr[`UART_LC_PE]) + rstate <= sr_rec_parity; + else begin + rstate <= sr_rec_stop; + rparity_error<= 1'b0; + end + else begin + rstate <= sr_rec_bit; + rbit_counter <= rbit_counter - 1'b1; + end + rcounter16 <= 4'b1110; + end + sr_rec_parity : begin + if (rcounter16_eq_7) begin + rparity <= srx_pad_i; + rstate <= sr_ca_lc_parity; + end + rcounter16 <= rcounter16_minus_1; + end + sr_ca_lc_parity:begin + rcounter16 <= rcounter16_minus_1; + rparity_xor <= ^{rshift,rparity}; + rstate <= sr_check_parity; + end + sr_check_parity: begin + case ({lcr[`UART_LC_EP],lcr[`UART_LC_SP]}) + 2'b00: rparity_error <= rparity_xor == 0; + 2'b01: rparity_error <= ~rparity; + 2'b10: rparity_error <= rparity_xor == 1; + 2'b11: rparity_error <= rparity; + endcase + rcounter16 <= rcounter16_minus_1; + rstate <= sr_wait1; + end + sr_wait1 : + if (rcounter16_eq_0) begin + rstate <= sr_rec_stop; + rcounter16 <= 4'b1110; + end + else rcounter16 <= rcounter16_minus_1; + sr_rec_stop : begin + if (rcounter16_eq_7) begin + rframing_error <= !srx_pad_i; + rstate <= sr_push; + end + rcounter16 <= rcounter16_minus_1; + end + sr_push : begin + if(srx_pad_i | break_error) begin + if(break_error) + rf_data_in <= {8'b0, 3'b100}; + else + rf_data_in <= {rshift, 1'b0, rparity_error, rframing_error}; + rf_push <= 1'b1; + rstate <= sr_idle; + end + else if(~rframing_error) begin + rf_data_in <= {rshift, 1'b0, rparity_error, rframing_error}; + rf_push <= 1'b1; + rcounter16 <= 4'b1110; + rstate <= sr_rec_start; + end + + end + default : rstate <= sr_idle; + endcase + end +end + +always @ (posedge clk ) begin + if(wb_rst_i) rf_push_q <= 0; + else rf_push_q <= rf_push; +end + +assign rf_push_pulse = rf_push & ~rf_push_q; + + +reg [9:0] toc_value; + +always @(lcr) + case (lcr[3:0]) + 4'b0000 : toc_value = 447; + 4'b0100 : toc_value = 479; + 4'b0001, 4'b1000 : toc_value = 511; + 4'b1100 : toc_value = 543; + 4'b0010, 4'b0101, 4'b1001 : toc_value = 575; + 4'b0011, 4'b0110, 4'b1010, 4'b1101 : toc_value = 639; + 4'b0111, 4'b1011, 4'b1110 : toc_value = 703; + 4'b1111 : toc_value = 767; + endcase + +wire [7:0] brc_value; +assign brc_value = toc_value[9:2]; + +always @(posedge clk ) begin + if (wb_rst_i) counter_b <= 8'd159; + else if (srx_pad_i) counter_b <= brc_value; + else if (enable & counter_b != 8'b0) + counter_b <= counter_b - 1; +end + + +reg [9:0] counter_t; + +always @(posedge clk ) begin + if (wb_rst_i) counter_t <= 10'd639; + else if(rf_push_pulse || rf_pop || rf_count == 0) + counter_t <= toc_value; + else if (enable && counter_t != 10'b0) + counter_t <= counter_t - 1; +end + +endmodule + diff --git a/rtl/ip/APB_UART/URT/uart_regs.v b/rtl/ip/APB_UART/URT/uart_regs.v new file mode 100644 index 0000000..443ea93 --- /dev/null +++ b/rtl/ip/APB_UART/URT/uart_regs.v @@ -0,0 +1,711 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ + +`include "uart_defines.h" + +`define UART_DL1 7:0 +`define UART_DL2 15:8 +`define UART_DL3 23:16 +module uart_regs (clk, rst, clk_carrier, + addr, dat_i, dat_o, we, re, + + modem_inputs, + rts_pad_o, dtr_pad_o, + stx_pad_o,TXD_i,srx_pad_i,RXD_o, + int_o, + usart_mode, + rx_en, + tx2rx_en +); +input clk; +input rst ; +input clk_carrier; +input [2:0] addr; +input [7:0] dat_i; +output [7:0] dat_o; +input we; +input re; + +output stx_pad_o; +input srx_pad_i; +input TXD_i; +output RXD_o; + +input [3:0] modem_inputs; +output rts_pad_o; +output dtr_pad_o; +output int_o; + +output usart_mode; +output tx2rx_en; +output rx_en; + +wire [3:0] modem_inputs; +reg enable; + +wire stx_pad_o; +wire srx_pad_i; +wire srx_pad; + +reg [7:0] dat_o; + +wire [2:0] addr; +wire [7:0] dat_i; + +reg [3:0] ier; +reg [3:0] iir; +reg [1:0] fcr; +reg [4:0] mcr; +reg infrared; +reg rx_pol; +reg [7:0] lcr; +reg [7:0] msr; +reg [23:0] dl; +reg start_dlc; +reg lsr_mask_d; +reg msi_reset; + +reg [15:0] dlc; +reg int_o; + +reg [3:0] trigger_level; +reg rx_reset; +reg tx_reset; +wire dlab; + +wire usart_mode; +wire usart_rx_en; +wire usart_tx_en; +wire tx2rx_en; +reg sclk_reg; +reg sclk_en_reg; +reg [7:0] mode_reg; +reg [7:0] fi_di_reg; +reg [7:0] sclk_count; +reg [2:0] repeat_reg; + +wire usart_normal; +wire usart_irda; +wire usart_t0; +wire usart_t1; +wire rx_en; +wire tx_en; +wire sclk_por; + +assign usart_normal = mode_reg[1:0]==2'h0; +assign usart_irda = mode_reg[1:0]==2'h1; +assign usart_t0 = mode_reg[1:0]==2'h2; +assign usart_t1 = mode_reg[1:0]==2'h3; +assign usart_tx_en = mode_reg[2]==1'b0; +assign usart_rx_en = mode_reg[2]==1'b1; +assign sclk_por = mode_reg[3]; +assign RXD_o = sclk_reg^sclk_por; + +assign usart_mode = usart_t0 || usart_t1; +assign rx_en = usart_normal || usart_irda || usart_mode && usart_rx_en; +assign tx_en = usart_normal || usart_irda || usart_mode && usart_tx_en; + + +always @(posedge clk ) +begin + if (rst) begin + mode_reg <= 8'h0; + fi_di_reg <= 8'h0; + repeat_reg<= 3'h4; + sclk_en_reg<= 1'b0; + end + else if (we && addr==`UART_REG_SR)begin + if(dlab) + fi_di_reg <= dat_i; + else + mode_reg <= dat_i; + end + else begin + if(enable) sclk_en_reg <= mode_reg[4]; + repeat_reg <= mode_reg[7:5]; + end +end + +always @(posedge clk) +begin + if(rst) begin + sclk_count <= 8'b0; + sclk_reg <=1'b0; + end + else if(usart_mode&&(fi_di_reg>8'h1)&&sclk_en_reg) begin + if(sclk_count == fi_di_reg[7:1]) begin + sclk_reg <= 1'b1; + sclk_count <= sclk_count + 1'b1; + end + else if(sclk_count == fi_di_reg) begin + sclk_reg <= 1'b0; + sclk_count <= 8'b0; + end + else begin + sclk_count <= sclk_count + 1'b1; + end + end + else begin + sclk_reg <=1'b0; + sclk_count <= 8'b0; + end +end + +wire cts_pad_i, dsr_pad_i, ri_pad_i, dcd_pad_i; +wire loopback; +wire cts, dsr, ri, dcd; +wire cts_c, dsr_c, ri_c, dcd_c; +wire rts_pad_o, dtr_pad_o; + +wire [7:0] lsr; +wire lsr0, lsr1, lsr2, lsr3, lsr4, lsr5, lsr6, lsr7; +reg lsr0r, lsr1r, lsr2r, lsr3r, lsr4r, lsr5r, lsr6r, lsr7r; +wire lsr_mask; + +assign lsr[7:0] = { lsr7r, lsr6r, lsr5r, lsr4r, lsr3r, lsr2r, lsr1r, lsr0r }; + +assign {cts_pad_i, dsr_pad_i, ri_pad_i, dcd_pad_i} = modem_inputs; +assign {cts, dsr, ri, dcd} = ~{cts_pad_i,dsr_pad_i,ri_pad_i,dcd_pad_i}; + +assign {cts_c, dsr_c, ri_c, dcd_c} = loopback ? {mcr[`UART_MC_RTS],mcr[`UART_MC_DTR],mcr[`UART_MC_OUT1],mcr[`UART_MC_OUT2]} + : {cts_pad_i,dsr_pad_i,ri_pad_i,dcd_pad_i}; + +assign dlab = lcr[`UART_LC_DL]; +assign loopback = mcr[4]; + +assign rts_pad_o = mcr[`UART_MC_RTS]; +assign dtr_pad_o = mcr[`UART_MC_DTR]; + +wire rls_int; +wire rda_int; +wire ti_int; +wire thre_int; +wire ms_int; + +wire tf_push; +reg rf_pop; +wire [`UART_FIFO_REC_WIDTH-1:0] rf_data_out; +wire rf_error_bit; +wire [`UART_FIFO_COUNTER_W-1:0] rf_count; +wire [`UART_FIFO_COUNTER_W-1:0] tf_count; +wire [2:0] tstate; +wire [3:0] rstate; +wire [9:0] counter_t; + +wire thre_set_en; +reg [7:0] block_cnt; +reg [7:0] block_value; +wire current_finish; +wire max_repeat_time; + +wire serial_out; +wire serial_out_modulated = ~ (clk_carrier & serial_out); + +uart_transmitter transmitter(.clk(clk), .wb_rst_i(rst), .lcr(lcr), .tf_push(tf_push), .wb_dat_i(dat_i), + + .tx2rx_en (tx2rx_en), + .usart_mode(usart_mode), + .srx_pad_i(TXD_i), + .enable (enable && tx_en), + .usart_t0(usart_t0), + .repeat_time(repeat_reg ), + .current_finish(current_finish), + .max_repeat_time(max_repeat_time), + + .stx_pad_o(serial_out), .tstate(tstate), .tf_count(tf_count), + .tx_reset(tx_reset), .lsr_mask(lsr_mask)); +wire rcv_pad_i; +assign rcv_pad_i = ~usart_mode ? srx_pad_i : (rx_en ? TXD_i : 1'b1); + +uart_sync_flops i_uart_sync_flops( + .rst_i (rst), + .clk_i (clk), + .stage1_rst_i (1'b0), + .stage1_clk_en_i (1'b1), + .async_dat_i (rcv_pad_i), + .sync_dat_o (srx_pad) + ); + + defparam i_uart_sync_flops.width = 1; + defparam i_uart_sync_flops.init_value = 1'b1; +wire serial_in = loopback ? serial_out : rx_pol ? ~srx_pad : srx_pad; +assign stx_pad_o = loopback ? 1'b1 : infrared ? serial_out_modulated : serial_out; + +wire rf_overrun; +wire rf_push_pulse; +uart_receiver receiver(.clk(clk), .wb_rst_i(rst), .lcr(lcr), .rf_pop(rf_pop), .srx_pad_i(serial_in), + .enable(enable && rx_en), + .counter_t(counter_t), .rf_count(rf_count), .rf_data_out(rf_data_out), .rf_error_bit(rf_error_bit), + .rf_overrun(rf_overrun), .rx_reset(rx_reset), .lsr_mask(lsr_mask), .rstate(rstate), .rf_push_pulse(rf_push_pulse)); + + +always @(dl or dlab or ier or iir or fi_di_reg or mode_reg + or lcr or lsr or msr or rf_data_out or addr ) +begin + case (addr) + `UART_REG_RB : dat_o = dlab ? dl[`UART_DL1] : rf_data_out[10:3]; + `UART_REG_IE : dat_o = dlab ? dl[`UART_DL2] : ier; + `UART_REG_II : dat_o = dlab ? dl[`UART_DL3] : {4'b1100,iir}; + `UART_REG_LC : dat_o = lcr; + `UART_REG_LS : dat_o = lsr; + `UART_REG_MS : dat_o = msr; + `UART_REG_SR : dat_o = dlab ? fi_di_reg : mode_reg; + default : dat_o = 8'b0; + endcase +end + +always @(posedge clk ) +begin + if (rst) + rf_pop <= 0; + else + if (rf_pop) + rf_pop <= 0; + else + if (re && addr == `UART_REG_RB && !dlab) + rf_pop <= 1; +end + +wire lsr_mask_condition; +wire iir_read; +wire msr_read; +wire fifo_read; +wire fifo_write; + +assign lsr_mask_condition = (re && addr == `UART_REG_LS && !dlab); +assign iir_read = (re && addr == `UART_REG_II && !dlab); +assign msr_read = (re && addr == `UART_REG_MS && !dlab); +assign fifo_read = (re && addr == `UART_REG_RB && !dlab); +assign fifo_write = (we && addr == `UART_REG_TR && !dlab); + +always @(posedge clk ) +begin + if (rst) + lsr_mask_d <= 0; + else + lsr_mask_d <= lsr_mask_condition; +end + +assign lsr_mask = lsr_mask_condition && ~lsr_mask_d; + +always @(posedge clk ) +begin + if (rst) + msi_reset <= 1; + else + if (msi_reset) + msi_reset <= 0; + else + if (msr_read) + msi_reset <= 1; +end + +always @(posedge clk ) + if (rst) + lcr <= 8'b00000011; + else + if (we && addr==`UART_REG_LC) + lcr <= dat_i; + +always @(posedge clk ) + if (rst) + begin + ier <= 4'b0000; + dl[`UART_DL2] <= 8'b0; + end + else + if (we && addr==`UART_REG_IE) + if (dlab) + begin + dl[`UART_DL2] <= dat_i; + end + else + ier <= dat_i[3:0]; + else + ier<= ier; + +always @(posedge clk ) + if (rst) begin + fcr <= 2'b11; + rx_reset <= 0; + tx_reset <= 0; + dl[`UART_DL3] <= 8'h0; + end else + if (we && addr==`UART_REG_FC) begin + if(dlab) dl[`UART_DL3] <= dat_i; + else begin + fcr <= dat_i[7:6]; + rx_reset <= dat_i[1]; + tx_reset <= dat_i[2]; + end + end else begin + rx_reset <= 0; + tx_reset <= 0; + end + +always @(posedge clk ) + if (rst) begin + mcr <= 5'b0; + infrared <= 1'b0; + rx_pol <= 1'b0; end + else + if(we && addr==`UART_REG_MC) begin + mcr <= dat_i[4:0]; + infrared <= dat_i[7]; + rx_pol <= dat_i[6]; end + +assign tf_push = we & addr==`UART_REG_TR & !dlab; +always @(posedge clk ) + if (rst) + begin + dl[`UART_DL1] <= 8'b0; + start_dlc <= 1'b0; + end + else + if (we && addr==`UART_REG_TR) + if (dlab) + begin + dl[`UART_DL1] <= dat_i; + start_dlc <= 1'b1; + end + else + begin + start_dlc <= 1'b0; + end + else + begin + start_dlc <= 1'b0; + end + +always @(fcr) + case (fcr[`UART_FC_TL]) + 2'b00 : trigger_level = 1; + 2'b01 : trigger_level = 4; + 2'b10 : trigger_level = 8; + 2'b11 : trigger_level = 14; + endcase + +reg [3:0] delayed_modem_signals; +always @(posedge clk ) +begin + if (rst) + begin + msr <= 0; + delayed_modem_signals[3:0] <= 0; + end + else begin + msr[`UART_MS_DDCD:`UART_MS_DCTS] <= msi_reset ? 4'b0 : + msr[`UART_MS_DDCD:`UART_MS_DCTS] | ({dcd, ri, dsr, cts} ^ delayed_modem_signals[3:0]); + msr[`UART_MS_CDCD:`UART_MS_CCTS] <= {dcd_c, ri_c, dsr_c, cts_c}; + delayed_modem_signals[3:0] <= {dcd, ri, dsr, cts}; + end +end + +assign lsr0 = (rf_count==0 && rf_push_pulse); +assign lsr1 = rf_overrun; +assign lsr2 = rf_data_out[1]; +assign lsr3 = rf_data_out[0]; +assign lsr4 = rf_data_out[2]; +assign lsr5 = current_finish && (tf_count==5'b0 && thre_set_en); +assign lsr6 = (tf_count==5'b0 && thre_set_en && (tstate == 3'd0)); +assign lsr7 = rf_error_bit | rf_overrun; + +reg lsr0_d; + +always @(posedge clk ) + if (rst) lsr0_d <= 0; + else lsr0_d <= lsr0; + +always @(posedge clk ) + if (rst) lsr0r <= 0; + else lsr0r <= (rf_count==1 && rf_pop && !rf_push_pulse || rx_reset) ? 0 : + lsr0r || (lsr0 && ~lsr0_d); + +reg lsr1_d; + +always @(posedge clk ) + if (rst) lsr1_d <= 0; + else lsr1_d <= lsr1; + +always @(posedge clk ) + if (rst) lsr1r <= 0; + else lsr1r <= lsr_mask ? 0 : lsr1r || (lsr1 && ~lsr1_d); + +reg lsr2_d; + +always @(posedge clk ) + if (rst) lsr2_d <= 0; + else lsr2_d <= lsr2; + +always @(posedge clk ) + if (rst) lsr2r <= 0; + else lsr2r <= lsr_mask ? 0 : lsr2r || (lsr2 && ~lsr2_d); + +reg lsr3_d; + +always @(posedge clk ) + if (rst) lsr3_d <= 0; + else lsr3_d <= lsr3; + +always @(posedge clk ) + if (rst) lsr3r <= 0; + else lsr3r <= lsr_mask ? 0 : lsr3r || (lsr3 && ~lsr3_d); + +reg lsr4_d; + +always @(posedge clk ) + if (rst) lsr4_d <= 0; + else lsr4_d <= lsr4; + +always @(posedge clk ) + if (rst) lsr4r <= 0; + else lsr4r <= lsr_mask ? 0 : lsr4r || (lsr4 && ~lsr4_d); + +reg lsr5_d; +always @(posedge clk ) + if (rst) lsr5_d <= 1; + else lsr5_d <= lsr5; + +always @(posedge clk ) + if (rst) lsr5r <= 1; + else lsr5r <= (fifo_write) ? 0 : lsr5r || (lsr5 && ~lsr5_d); + +reg lsr6_d; + +always @(posedge clk ) + if (rst) lsr6_d <= 1; + else lsr6_d <= lsr6; + +always @(posedge clk ) + if (rst) lsr6r <= 1; + else lsr6r <= (fifo_write) ? 0 : lsr6r || (lsr6 && ~lsr6_d); + +reg lsr7_d; + +always @(posedge clk ) + if (rst) lsr7_d <= 0; + else lsr7_d <= lsr7; + +always @(posedge clk ) + if (rst) lsr7r <= 0; + else lsr7r <= lsr_mask ? 0 : lsr7r || (lsr7 && ~lsr7_d); + +reg [8:0] M_cnt; +wire [8:0] M_next = M_cnt + dl[`UART_DL3]; +wire M_toggle = M_cnt[8] ^ M_next[8]; + +always @(posedge clk ) +begin + if (rst) begin + dlc <= 0; + M_cnt <= 8'h0; + end + else if (start_dlc | ~ (|dlc)) begin + dlc <= dl - 1 + M_toggle; + M_cnt <= M_next; + end + else + dlc <= dlc - 1; +end + +always @(posedge clk ) +begin + if (rst) + enable <= 1'b0; + else if (|dl & ~(|dlc)) + enable <= 1'b1; + else + enable <= 1'b0; +end + +always @(lcr) + case (lcr[3:0]) + 4'b0000 : block_value = 95; + 4'b0100 : block_value = 103; + 4'b0001, 4'b1000 : block_value = 111; + 4'b1100 : block_value = 119; + 4'b0010, 4'b0101, 4'b1001 : block_value = 127; + 4'b0011, 4'b0110, 4'b1010, 4'b1101 : block_value = 143; + 4'b0111, 4'b1011, 4'b1110 : block_value = 159; + 4'b1111 : block_value = 175; + endcase + +always @(posedge clk ) +begin + if (rst) + block_cnt <= 8'd0; + else + if(lsr5r & fifo_write) + block_cnt <= usart_t0 ? (block_value + 8'h16) : block_value; + else + if (enable & block_cnt != 8'b0) + block_cnt <= block_cnt - 1; +end + +assign thre_set_en = ~(|block_cnt); + +assign rls_int = ier[`UART_IE_RLS] && (lsr[`UART_LS_OE] || lsr[`UART_LS_PE] || lsr[`UART_LS_FE] || lsr[`UART_LS_BI]); +assign rda_int = ier[`UART_IE_RDA] && (rf_count >= {1'b0,trigger_level}); +assign thre_int = ier[`UART_IE_THRE]&& lsr[`UART_LS_TFE]; +assign ms_int = ier[`UART_IE_MS] && (usart_t0 ? max_repeat_time : (| msr[3:0])); +assign ti_int = ier[`UART_IE_RDA] && (counter_t == 10'b0) && (|rf_count); + +reg rls_int_d; +reg thre_int_d; +reg ms_int_d; +reg ti_int_d; +reg rda_int_d; + +always @(posedge clk ) + if (rst) rls_int_d <= 0; + else rls_int_d <= rls_int; + +always @(posedge clk ) + if (rst) rda_int_d <= 0; + else rda_int_d <= rda_int; + +always @(posedge clk ) + if (rst) thre_int_d <= 0; + else thre_int_d <= thre_int; + +always @(posedge clk ) + if (rst) ms_int_d <= 0; + else ms_int_d <= ms_int; + +always @(posedge clk ) + if (rst) ti_int_d <= 0; + else ti_int_d <= ti_int; + + +wire rls_int_rise; +wire thre_int_rise; +wire ms_int_rise; +wire ti_int_rise; +wire rda_int_rise; + +assign rda_int_rise = rda_int & ~rda_int_d; +assign rls_int_rise = rls_int & ~rls_int_d; +assign thre_int_rise = thre_int & ~thre_int_d; +assign ms_int_rise = ms_int & ~ms_int_d; +assign ti_int_rise = ti_int & ~ti_int_d; + +reg rls_int_pnd; +reg rda_int_pnd; +reg thre_int_pnd; +reg ms_int_pnd; +reg ti_int_pnd; + +always @(posedge clk ) + if (rst) rls_int_pnd <= 0; + else + rls_int_pnd <= lsr_mask ? 0 : + rls_int_rise ? 1 : + rls_int_pnd && ier[`UART_IE_RLS]; + +reg d1_fifo_read; +always @( posedge clk ) d1_fifo_read <= fifo_read; + +always @(posedge clk) + if (rst) rda_int_pnd <= 0; + else rda_int_pnd <= ((rf_count == {1'b0,trigger_level}) && d1_fifo_read) ? 0 : + rda_int_rise ? 1 : + rda_int_pnd && ier[`UART_IE_RDA]; + +always @(posedge clk ) + if (rst) thre_int_pnd <= 0; + else + thre_int_pnd <= fifo_write || (iir_read & ~iir[`UART_II_IP] & iir[`UART_II_II] == `UART_II_THRE)? 0 : + thre_int_rise ? 1 : + thre_int_pnd && ier[`UART_IE_THRE]; + +always @(posedge clk ) + if (rst) ms_int_pnd <= 0; + else + ms_int_pnd <= msr_read ? 0 : ms_int_rise ? 1 : + ms_int_pnd && ier[`UART_IE_MS]; + +always @(posedge clk ) + if (rst) ti_int_pnd <= 0; + else + ti_int_pnd <= fifo_read ? 0 : ti_int_rise ? 1 : + ti_int_pnd && ier[`UART_IE_RDA]; + +always @(posedge clk ) +begin + if (rst) int_o <= 1'b0; + else int_o <= rls_int_pnd ? ~lsr_mask : + rda_int_pnd ? 1 : + ti_int_pnd ? ~fifo_read: + thre_int_pnd? !(fifo_write & iir_read) : + ms_int_pnd ? ~msr_read : + 0; +end + + +always @(posedge clk ) +begin + if (rst) + iir <= 1; + else + if (rls_int_pnd) + begin + iir[`UART_II_II] <= `UART_II_RLS; + iir[`UART_II_IP] <= 1'b0; + end else + if (rda_int_pnd) + begin + iir[`UART_II_II] <= `UART_II_RDA; + iir[`UART_II_IP] <= 1'b0; + end + else if (ti_int_pnd) + begin + iir[`UART_II_II] <= `UART_II_TI; + iir[`UART_II_IP] <= 1'b0; + end + else if (thre_int_pnd) + begin + iir[`UART_II_II] <= `UART_II_THRE; + iir[`UART_II_IP] <= 1'b0; + end + else if (ms_int_pnd) + begin + iir[`UART_II_II] <= `UART_II_MS; + iir[`UART_II_IP] <= 1'b0; + end else + begin + iir[`UART_II_II] <= 0; + iir[`UART_II_IP] <= 1'b1; + end +end + +endmodule diff --git a/rtl/ip/APB_UART/URT/uart_rfifo.v b/rtl/ip/APB_UART/URT/uart_rfifo.v new file mode 100644 index 0000000..c53db74 --- /dev/null +++ b/rtl/ip/APB_UART/URT/uart_rfifo.v @@ -0,0 +1,193 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ + +`include "uart_defines.h" + +module uart_rfifo (clk, + wb_rst_i, data_in, data_out, + push, + pop, + overrun, + count, + error_bit, + fifo_reset, + reset_status +); + +parameter fifo_width = `UART_FIFO_WIDTH; +parameter fifo_depth = `UART_FIFO_DEPTH; +parameter fifo_pointer_w = `UART_FIFO_POINTER_W; +parameter fifo_counter_w = `UART_FIFO_COUNTER_W; + +input clk; +input wb_rst_i; +input push; +input pop; +input [fifo_width-1:0] data_in; +input fifo_reset; +input reset_status; + +output [fifo_width-1:0] data_out; +output overrun; +output [fifo_counter_w-1:0] count; +output error_bit; + +wire [fifo_width-1:0] data_out; +wire [7:0] data8_out; +reg [2:0] fifo[fifo_depth-1:0]; + +reg [fifo_pointer_w-1:0] top; +reg [fifo_pointer_w-1:0] bottom; + +reg [fifo_counter_w-1:0] count; +reg overrun; + +wire [fifo_pointer_w-1:0] top_plus_1 = top + 1'b1; + +raminfr #(fifo_pointer_w,8,fifo_depth) rfifo (.clk(clk), + .we(push), + .a(top), + .dpra(bottom), + .di(data_in[fifo_width-1:fifo_width-8]), + .dpo(data8_out) +); + +always @(posedge clk) +begin + if (wb_rst_i) + begin + top <= 0; + bottom <= 1'b0; + count <= 0; + fifo[0] <= 0; + fifo[1] <= 0; + fifo[2] <= 0; + fifo[3] <= 0; + fifo[4] <= 0; + fifo[5] <= 0; + fifo[6] <= 0; + fifo[7] <= 0; + fifo[8] <= 0; + fifo[9] <= 0; + fifo[10]<= 0; + fifo[11]<= 0; + fifo[12]<= 0; + fifo[13]<= 0; + fifo[14]<= 0; + fifo[15]<= 0; + end + else + if (fifo_reset) begin + top <= 0; + bottom <= 1'b0; + count <= 0; + fifo[0] <= 0; + fifo[1] <= 0; + fifo[2] <= 0; + fifo[3] <= 0; + fifo[4] <= 0; + fifo[5] <= 0; + fifo[6] <= 0; + fifo[7] <= 0; + fifo[8] <= 0; + fifo[9] <= 0; + fifo[10]<= 0; + fifo[11]<= 0; + fifo[12]<= 0; + fifo[13]<= 0; + fifo[14]<= 0; + fifo[15]<= 0; + end + else + begin + case ({push, pop}) + 2'b10 : if (count0) + begin + fifo[bottom] <= 0; + bottom <= bottom + 1'b1; + count <= count - 1'b1; + end + 2'b11 : begin + bottom <= bottom + 1'b1; + top <= top_plus_1; + fifo[top] <= data_in[2:0]; + end + default: ; + endcase + end +end + +always @(posedge clk) +begin + if (wb_rst_i) + overrun <= 1'b0; + else + if(fifo_reset | reset_status) + overrun <= 1'b0; + else + if(push & ~pop & (count==fifo_depth)) + overrun <= 1'b1; +end + +assign data_out = {data8_out,fifo[bottom]}; + +wire [2:0] word0 = fifo[0]; +wire [2:0] word1 = fifo[1]; +wire [2:0] word2 = fifo[2]; +wire [2:0] word3 = fifo[3]; +wire [2:0] word4 = fifo[4]; +wire [2:0] word5 = fifo[5]; +wire [2:0] word6 = fifo[6]; +wire [2:0] word7 = fifo[7]; + +wire [2:0] word8 = fifo[8]; +wire [2:0] word9 = fifo[9]; +wire [2:0] word10 = fifo[10]; +wire [2:0] word11 = fifo[11]; +wire [2:0] word12 = fifo[12]; +wire [2:0] word13 = fifo[13]; +wire [2:0] word14 = fifo[14]; +wire [2:0] word15 = fifo[15]; + +assign error_bit = |(word0[2:0] | word1[2:0] | word2[2:0] | word3[2:0] | + word4[2:0] | word5[2:0] | word6[2:0] | word7[2:0] | + word8[2:0] | word9[2:0] | word10[2:0] | word11[2:0] | + word12[2:0] | word13[2:0] | word14[2:0] | word15[2:0] ); + +endmodule diff --git a/rtl/ip/APB_UART/URT/uart_sync_flops.v b/rtl/ip/APB_UART/URT/uart_sync_flops.v new file mode 100644 index 0000000..99cdeb4 --- /dev/null +++ b/rtl/ip/APB_UART/URT/uart_sync_flops.v @@ -0,0 +1,76 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ + +module uart_sync_flops +( + rst_i, + clk_i, + stage1_rst_i, + stage1_clk_en_i, + async_dat_i, + sync_dat_o +); + +parameter Tp = 1; +parameter width = 1; +parameter init_value = 1'b0; + +input rst_i; +input clk_i; +input stage1_rst_i; +input stage1_clk_en_i; +input [width-1:0] async_dat_i; +output [width-1:0] sync_dat_o; + +reg [width-1:0] sync_dat_o; +reg [width-1:0] flop_0; + +always @ (posedge clk_i) +begin + if (rst_i) + flop_0 <= {width{init_value}}; + else + flop_0 <= async_dat_i; +end + +always @ (posedge clk_i) +begin + if (rst_i) + sync_dat_o <= {width{init_value}}; + else if (stage1_rst_i) + sync_dat_o <= {width{init_value}}; + else if (stage1_clk_en_i) + sync_dat_o <= flop_0; +end + +endmodule diff --git a/rtl/ip/APB_UART/URT/uart_tfifo.v b/rtl/ip/APB_UART/URT/uart_tfifo.v new file mode 100644 index 0000000..824da97 --- /dev/null +++ b/rtl/ip/APB_UART/URT/uart_tfifo.v @@ -0,0 +1,129 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ + +`include "uart_defines.h" + +module uart_tfifo (clk, + wb_rst_i, data_in, data_out, + push, + pop, + overrun, + count, + fifo_reset, + reset_status +); + +parameter fifo_width = `UART_FIFO_WIDTH; +parameter fifo_depth = `UART_FIFO_DEPTH; +parameter fifo_pointer_w = `UART_FIFO_POINTER_W; +parameter fifo_counter_w = `UART_FIFO_COUNTER_W; + +input clk; +input wb_rst_i; +input push; +input pop; +input [fifo_width-1:0] data_in; +input fifo_reset; +input reset_status; + +output [fifo_width-1:0] data_out; +output overrun; +output [fifo_counter_w-1:0] count; + +wire [fifo_width-1:0] data_out; + +reg [fifo_pointer_w-1:0] top; +reg [fifo_pointer_w-1:0] bottom; + +reg [fifo_counter_w-1:0] count; +reg overrun; +wire [fifo_pointer_w-1:0] top_plus_1 = top + 1'b1; + +raminfr #(fifo_pointer_w,fifo_width,fifo_depth) tfifo (.clk(clk), + .we(push), + .a(top), + .dpra(bottom), + .di(data_in), + .dpo(data_out) +); + + +always @(posedge clk) +begin + if (wb_rst_i) + begin + top <= 0; + bottom <= 1'b0; + count <= 0; + end + else + if (fifo_reset) begin + top <= 0; + bottom <= 1'b0; + count <= 0; + end + else + begin + case ({push, pop}) + 2'b10 : if (count0) + begin + bottom <= bottom + 1'b1; + count <= count - 1'b1; + end + 2'b11 : begin + bottom <= bottom + 1'b1; + top <= top_plus_1; + end + default: ; + endcase + end +end + +always @(posedge clk) +begin + if (wb_rst_i) + overrun <= 1'b0; + else + if(fifo_reset | reset_status) + overrun <= 1'b0; + else + if(push & (count==fifo_depth)) + overrun <= 1'b1; +end + +endmodule diff --git a/rtl/ip/APB_UART/URT/uart_top.v b/rtl/ip/APB_UART/URT/uart_top.v new file mode 100644 index 0000000..8e8662b --- /dev/null +++ b/rtl/ip/APB_UART/URT/uart_top.v @@ -0,0 +1,107 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ + +`include "uart_defines.h" + +module UART_TOP( + PCLK, PRST_, + PSEL, PENABLE, PADDR, PWRITE, + PWDATA, URT_PRDATA, + + INT, clk_carrier, + + TXD_i, TXD_o, TXD_oe, + RXD_i, RXD_o, RXD_oe, + + RTS, CTS, DSR, + DCD, DTR, RI + ); + +input PCLK, PRST_; +input PSEL, PENABLE, PWRITE; +input [7:0] PADDR; +input [7:0] PWDATA; +output [7:0] URT_PRDATA; + +output INT; +input clk_carrier; + +input TXD_i; +output TXD_o; +output TXD_oe; +input RXD_i; +output RXD_o; +output RXD_oe; + +output RTS; +input CTS, DSR, DCD; +output DTR; +input RI; + +wire prst = !PRST_; +wire we = PSEL & PENABLE & PWRITE; +wire re = PSEL & PENABLE & !PWRITE; + +wire rx_en; +wire tx2rx_en; +wire isomode; + +assign TXD_oe = isomode&&(rx_en||tx2rx_en) ? 1'b1:1'b0; +assign RXD_oe =~isomode; + +uart_regs regs( + .clk (PCLK ), + .rst (prst ), + .clk_carrier (clk_carrier), + .addr (PADDR[2:0] ), + .dat_i (PWDATA ), + .dat_o (URT_PRDATA ), + .we (we ), + .re (re ), + + .modem_inputs({ CTS, DSR, RI, DCD } ), + .rts_pad_o (RTS ), + .dtr_pad_o (DTR ), + .stx_pad_o (TXD_o ), + .TXD_i (TXD_i ), + .srx_pad_i (RXD_i ), + .RXD_o (RXD_o ), + .int_o ( INT ), + .tx2rx_en (tx2rx_en ), + .rx_en (rx_en ), + .usart_mode (isomode ) + +); + + +endmodule diff --git a/rtl/ip/APB_UART/URT/uart_transmitter.v b/rtl/ip/APB_UART/URT/uart_transmitter.v new file mode 100644 index 0000000..1e8daeb --- /dev/null +++ b/rtl/ip/APB_UART/URT/uart_transmitter.v @@ -0,0 +1,281 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ + +`include "uart_defines.h" + +module uart_transmitter (clk, wb_rst_i, lcr, tf_push, wb_dat_i, + enable,stx_pad_o, tstate, tf_count, tx_reset, lsr_mask, + usart_t0,srx_pad_i,repeat_time,max_repeat_time,current_finish, + usart_mode,tx2rx_en); + +input clk; +input wb_rst_i; +input [7:0] lcr; +input tf_push; +input [7:0] wb_dat_i; +input enable; +input tx_reset; +input lsr_mask; +input usart_mode; +input usart_t0,srx_pad_i; +input [2:0] repeat_time; +output current_finish; +output max_repeat_time; + +output tx2rx_en; +reg tx2rx_en; +output stx_pad_o; +output [2:0] tstate; +output [`UART_FIFO_COUNTER_W-1:0] tf_count; + +reg [2:0] tstate; +reg [4:0] counter; +reg [2:0] bit_counter; +reg [6:0] shift_out; +reg stx_o_tmp; +reg parity_xor; +reg tf_pop; +reg bit_out; +reg tx_error; +reg [2:0] error_time; + +wire [`UART_FIFO_WIDTH-1:0] tf_data_in; +wire [`UART_FIFO_WIDTH-1:0] tf_data_out; +wire tf_push; +wire tf_overrun; +wire [`UART_FIFO_COUNTER_W-1:0]tf_count; + +assign tf_data_in = wb_dat_i; + +uart_tfifo fifo_tx( + .clk ( clk ), + .wb_rst_i( wb_rst_i ), + .data_in ( tf_data_in ), + .data_out( tf_data_out ), + .push ( tf_push ), + .pop ( tf_pop ), + .overrun ( tf_overrun ), + .count ( tf_count ), + .fifo_reset ( tx_reset), + .reset_status(lsr_mask ) +); + +parameter s_idle = 3'd0; +parameter s_send_start = 3'd1; +parameter s_send_byte = 3'd2; +parameter s_send_parity = 3'd3; +parameter s_send_stop = 3'd4; +parameter s_pop_byte = 3'd5; +parameter s_send_guard1 = 3'd6; +reg [7:0]tf_data_bak; + +wire max_repeat_time = (error_time==(repeat_time+1'b1)) & usart_mode & usart_t0; + +always @(posedge clk ) +begin + if (wb_rst_i) + begin + tx_error <= 1'b0; + error_time <= 3'b0; + tstate <= s_idle; + stx_o_tmp <= 1'b1; + counter <= 5'b0; + shift_out <= 7'b0; + bit_out <= 1'b0; + parity_xor <= 1'b0; + tf_pop <= 1'b0; + bit_counter <= 3'b0; + tx2rx_en <= 1'b0; + tf_data_bak <= 8'h0; + end + else + if (enable) + begin + case (tstate) + s_idle :if ((~|tf_count)&(error_time==(repeat_time+1'b1)||~tx_error||~usart_mode)) + begin + tstate <= s_idle; + stx_o_tmp <= 1'b1; + tx_error <= 1'b0; + end + else begin + tf_pop <= 1'b0; + stx_o_tmp <= 1'b1; + tstate <= s_pop_byte; + end + s_pop_byte : begin + + if(tx_error&(error_time !=(repeat_time+1'b1))) + begin + tf_pop <= 1'b0; + case (lcr[1:0]) + 2'b00 : begin + bit_counter <= 3'b100; + parity_xor <= ^tf_data_bak[4:0]; + end + 2'b01 : begin + bit_counter <= 3'b101; + parity_xor <= ^tf_data_bak[5:0]; + end + 2'b10 : begin + bit_counter <= 3'b110; + parity_xor <= ^tf_data_bak[6:0]; + end + 2'b11 : begin + bit_counter <= 3'b111; + parity_xor <= ^tf_data_bak[7:0]; + end + endcase + {shift_out[6:0], bit_out} <= tf_data_bak; + end + else begin + tf_pop <= 1'b1; + error_time <= 3'h0; + case (lcr[1:0]) + 2'b00 : begin + bit_counter <= 3'b100; + parity_xor <= ^tf_data_out[4:0]; + end + 2'b01 : begin + bit_counter <= 3'b101; + parity_xor <= ^tf_data_out[5:0]; + end + 2'b10 : begin + bit_counter <= 3'b110; + parity_xor <= ^tf_data_out[6:0]; + end + 2'b11 : begin + bit_counter <= 3'b111; + parity_xor <= ^tf_data_out[7:0]; + end + endcase + {shift_out[6:0], bit_out} <= tf_data_out; + tf_data_bak <= tf_data_out; + end + tstate <= s_send_start; + end + s_send_start : begin + tf_pop <= 1'b0; + if (~|counter) + counter <= 5'b01111; + else if (counter == 5'b00001) + begin + counter <= 0; + tstate <= s_send_byte; + end + else + counter <= counter - 1'b1; + stx_o_tmp <= 1'b0; + end + s_send_byte : begin + if (~|counter) + counter <= 5'b01111; + else if (counter == 5'b00001) + begin + if (bit_counter > 3'b0) begin + bit_counter <= bit_counter - 1'b1; + {shift_out[5:0],bit_out } <= {shift_out[6:1], shift_out[0]}; + tstate <= s_send_byte; + end + else + if (~lcr[`UART_LC_PE]) begin + tstate <= s_send_stop; + end + else begin + case ({lcr[`UART_LC_EP],lcr[`UART_LC_SP]}) + 2'b00: bit_out <= ~parity_xor; + 2'b01: bit_out <= 1'b1; + 2'b10: bit_out <= parity_xor; + 2'b11: bit_out <= 1'b0; + endcase + tstate <= s_send_parity; + end + counter <= 0; + end + else counter <= counter - 1'b1; + stx_o_tmp <= bit_out; + end + s_send_parity : begin + if (~|counter) counter <= 5'b01111; + else if (counter == 5'b00001) begin + counter <= 4'b0; + tstate <= usart_mode ? s_send_guard1 : s_send_stop; + end + else counter <= counter - 1'b1; + stx_o_tmp <= bit_out; + end + s_send_stop : begin + if (~|counter) begin + if(usart_t0) + counter <= tx_error ? 5'b11101 : 5'b01101; + else + casex ({lcr[`UART_LC_SB],lcr[`UART_LC_BITS]}) + 3'b0xx: counter <= 5'b01101; + 3'b100: counter <= 5'b10101; + default: counter <= 5'b11101; + endcase + end + else if (counter == 5'b00001) begin + counter <= 5'b0; + tx2rx_en<= 1'b0; + tstate <= s_idle; + end + else counter <= counter - 1'b1; + stx_o_tmp <= 1'b1; + end + s_send_guard1:begin + if (~|counter) begin + tx2rx_en <= 1'b1; + counter <= usart_t0 ? 5'b01111:5'b01101; + end + else if (counter == 5'b00001) begin + counter <= 5'b0; + tx_error <= !srx_pad_i; + error_time<= error_time + !srx_pad_i; + tx2rx_en <= usart_t0 ? 1'b1 : 1'b0; + tstate <= usart_t0 ? s_send_stop : s_idle; + end + else counter <= counter - 1'b1; + stx_o_tmp <= 1'b1; + end + default : + tstate <= s_idle; + endcase + end + else tf_pop <= 1'b0; +end + +assign stx_pad_o = lcr[`UART_LC_BC] ? 1'b0 : stx_o_tmp; +assign current_finish = usart_mode ? ( (tstate==3'b0)&(tx_error & (error_time ==repeat_time+1'b1) |~tx_error) ) : 1'b1; + +endmodule diff --git a/rtl/ip/APB_UART/apb_mux2.v b/rtl/ip/APB_UART/apb_mux2.v new file mode 100644 index 0000000..7b585e5 --- /dev/null +++ b/rtl/ip/APB_UART/apb_mux2.v @@ -0,0 +1,206 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ + +`define APB_DEV0 6'h00 + +`define APB_DEV1 6'h1e + +module apb_mux2 ( +clk, +rst_n, +apb_ack_cpu, +apb_rw_cpu, +apb_psel_cpu, +apb_enab_cpu, +apb_addr_cpu, +apb_datai_cpu, +apb_datao_cpu, +apb_high_24b_rd, +apb_high_24b_wr, +apb_word_trans_cpu, + +apb_ready_dma, +apb_rw_dma, +apb_psel_dma, +apb_enab_dma, +apb_addr_dma, +apb_wdata_dma, +apb_rdata_dma, +apb_valid_dma, +apb_valid_cpu, +dma_grant, + +apb0_req, +apb0_ack, +apb0_rw, +apb0_psel, +apb0_enab, +apb0_addr, +apb0_datai, +apb0_datao, + +apb1_req, +apb1_ack, +apb1_rw, +apb1_psel, +apb1_enab, +apb1_addr, +apb1_datai, +apb1_datao +); + +parameter ADDR_APB = 20, + DATA_APB = 8, + DATA_APB_32 = 32; +input clk,rst_n; +output apb_ready_dma; +input apb_rw_dma; +input apb_psel_dma; +input apb_enab_dma; +input [ADDR_APB-1:0] apb_addr_dma; +input [31:0] apb_wdata_dma; +output[31:0] apb_rdata_dma; +output dma_grant; +input apb_valid_dma; +input apb_valid_cpu; + +output apb_ack_cpu; +input apb_rw_cpu; +input apb_psel_cpu; +input apb_enab_cpu; +input [ADDR_APB-1:0] apb_addr_cpu; +input [DATA_APB-1:0] apb_datai_cpu; +output[DATA_APB-1:0] apb_datao_cpu; +output [23:0] apb_high_24b_rd; +input [23:0] apb_high_24b_wr; + +output apb_word_trans_cpu; +output apb0_req; +input apb0_ack; +output apb0_rw; +output apb0_psel; +output apb0_enab; +output[ADDR_APB-1:0] apb0_addr; +output[DATA_APB-1:0] apb0_datai; +input [DATA_APB-1:0] apb0_datao; + +output apb1_req; +input apb1_ack; +output apb1_rw; +output apb1_psel; +output apb1_enab; +output[ADDR_APB-1:0] apb1_addr; +output[31:0] apb1_datai; +input [31:0] apb1_datao; + +wire apb_ack; +wire apb_rw; +wire apb_psel; +wire apb_enab; +wire [ADDR_APB-1:0] apb_addr; +wire [DATA_APB-1:0] apb_datai; +wire [23:0]high_24b_wr; +wire [23:0]high_24b_rd; +wire [7:0]apb_datao ; +wire dma_grant; + +arb_2_1 arb_2_1(.clk(clk), .rst_n(rst_n), .valid0(apb_valid_cpu), .valid1(apb_valid_dma), .dma_grant(dma_grant)); + +assign apb_addr = dma_grant ? apb_addr_dma:apb_addr_cpu; +assign apb_rw = dma_grant ? apb_rw_dma:apb_rw_cpu; +assign apb_psel = dma_grant ? apb_psel_dma:apb_psel_cpu; +assign apb_enab = dma_grant ? apb_enab_dma:apb_enab_cpu; +assign apb_datai = dma_grant ? apb_wdata_dma[7:0]:apb_datai_cpu; +assign high_24b_wr = dma_grant ? apb_wdata_dma[31:8]:apb_high_24b_wr; +assign high_24b_rd = apb1_req ? apb1_datao[31:8] : 24'h0; + +assign apb_word_trans_cpu = dma_grant ? 1'h0: apb1_req; + +assign apb_high_24b_rd = dma_grant ? 24'h0: high_24b_rd; +assign apb_datao_cpu = dma_grant ? 8'h0: apb_datao; +assign apb_rdata_dma = dma_grant ? {high_24b_rd,apb_datao }:32'h0; +assign apb_ack_cpu = ~dma_grant & apb_ack; +assign apb_ready_dma = dma_grant & apb_ack; + +assign apb0_req = (apb_addr[ADDR_APB-1:14] ==`APB_DEV0); +//assign apb1_req = (apb_addr[ADDR_APB-1:14] ==`APB_DEV1); +assign apb1_req = !apb0_req; + +assign apb0_psel = apb_psel && apb0_req ; +assign apb1_psel = apb_psel && apb1_req; + +assign apb0_enab = apb_enab && apb0_req ; +assign apb1_enab = apb_enab && apb1_req; + +assign apb_ack = apb0_req ? apb0_ack : + apb1_req ? apb1_ack : + 1'b0; + +assign apb_datao = apb0_req ? apb0_datao : + apb1_req ? apb1_datao[7:0] : + 8'b0; + + + +assign apb0_addr = apb_addr; +assign apb0_datai = apb_datai; +assign apb0_rw = apb_rw; + +assign apb1_addr = apb_addr; +assign apb1_datai = {high_24b_wr,apb_datai}; +assign apb1_rw = apb_rw; + +endmodule + +module arb_2_1( clk, rst_n, valid0, valid1, dma_grant); +input clk; +input rst_n; +input valid0; +input valid1; +output dma_grant; +reg dma_grant; + +always @(posedge clk) + if(~rst_n) + dma_grant<= 1'b0; + else if(valid0&&~valid1) + dma_grant<= 1'b0; + else if(valid1&&~valid0) + dma_grant<= 1'b1; + else if(valid0&&valid1&&~dma_grant) + dma_grant<= 1'b0; + else if(valid0&&valid1&&dma_grant) + dma_grant<= 1'b1; + else dma_grant<= 1'b0; + +endmodule diff --git a/rtl/ip/APB_UART/axi2apb.v b/rtl/ip/APB_UART/axi2apb.v new file mode 100644 index 0000000..bfbdcc6 --- /dev/null +++ b/rtl/ip/APB_UART/axi2apb.v @@ -0,0 +1,674 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ + +`include "config.h" + +module axi2apb_bridge( +clk, +rst_n, +axi_s_awid, +axi_s_awaddr, +axi_s_awlen, +axi_s_awsize, +axi_s_awburst, +axi_s_awlock, +axi_s_awcache, +axi_s_awprot, +axi_s_awvalid, +axi_s_awready, +axi_s_wid, +axi_s_wdata, +axi_s_wstrb, +axi_s_wlast, +axi_s_wvalid, +axi_s_wready, +axi_s_bid, +axi_s_bresp, +axi_s_bvalid, +axi_s_bready, +axi_s_arid, +axi_s_araddr, +axi_s_arlen, +axi_s_arsize, +axi_s_arburst, +axi_s_arlock, +axi_s_arcache, +axi_s_arprot, +axi_s_arvalid, +axi_s_arready, +axi_s_rid, +axi_s_rdata, +axi_s_rresp, +axi_s_rlast, +axi_s_rvalid, +axi_s_rready, + +apb_valid_cpu, +cpu_grant, +apb_word_trans, +apb_high_24b_rd, +apb_high_24b_wr, +apb_clk, +apb_reset_n, +reg_psel, +reg_enable, +reg_rw, +reg_addr, +reg_datai, +reg_ready_1, +reg_datao +); +parameter L_ADDR_APB = 20; + +input clk; +input rst_n; + +input [`LID :0] axi_s_awid; +input [`Lawaddr -1 :0] axi_s_awaddr; +input [`Lawlen -1 :0] axi_s_awlen; +input [`Lawsize -1 :0] axi_s_awsize; +input [`Lawburst -1 :0] axi_s_awburst; +input [`Lawlock -1 :0] axi_s_awlock; +input [`Lawcache -1 :0] axi_s_awcache; +input [`Lawprot -1 :0] axi_s_awprot; +input axi_s_awvalid; +output axi_s_awready; +input [`LID :0] axi_s_wid; +input [`Lwdata -1 :0] axi_s_wdata; +input [`Lwstrb -1 :0] axi_s_wstrb; +input axi_s_wlast; +input axi_s_wvalid; +output axi_s_wready; +output [`LID :0] axi_s_bid; +output [`Lbresp -1 :0] axi_s_bresp; +output axi_s_bvalid; +input axi_s_bready; +input [`LID :0] axi_s_arid; +input [`Laraddr -1 :0] axi_s_araddr; +input [`Larlen -1 :0] axi_s_arlen; +input [`Larsize -1 :0] axi_s_arsize; +input [`Larburst -1 :0] axi_s_arburst; +input [`Larlock -1 :0] axi_s_arlock; +input [`Larcache -1 :0] axi_s_arcache; +input [`Larprot -1 :0] axi_s_arprot; +input axi_s_arvalid; +output axi_s_arready; +output [`LID :0] axi_s_rid; +output [`Lrdata -1 :0] axi_s_rdata; +output [`Lrresp -1 :0] axi_s_rresp; +output axi_s_rlast; +output axi_s_rvalid; +input axi_s_rready; +input apb_word_trans; +input cpu_grant; +output apb_valid_cpu; +input [23:0] apb_high_24b_rd; +output [23:0] apb_high_24b_wr; +output apb_clk; +output apb_reset_n; +output reg_psel; +output reg_enable; +output reg_rw; +output[L_ADDR_APB-1:0] reg_addr; +output[7:0] reg_datai; +input [7:0] reg_datao; +input reg_ready_1; + +wire csr_rw_send_axi_rsp_done; +wire reg_ready; + +parameter CSR_RW_SM_IDLE = 4'b0001, + CSR_RW_SM_GET_AXI_ADDR = 4'b0010, + CSR_RW_SM_SEND_AXI_RSP = 4'b1000; + +reg reg_psel; +reg reg_enable; +reg axi_s_sel_rd; +reg axi_s_sel_wr; +reg[3:0] csr_rw_sm; +reg[3:0] csr_rw_sm_nxt; +reg[L_ADDR_APB-1:0] axi_s_req_addr; +reg[`LID:0] axi_s_w_id; +reg[`LID:0] axi_s_r_id; +reg[23:0] apb_high_24b_wr; + +assign apb_clk = clk; +assign apb_reset_n = rst_n; +assign reg_rw = axi_s_sel_wr; +assign reg_addr = axi_s_req_addr; +assign reg_ready = reg_enable & reg_ready_1; +assign apb_valid_cpu = axi_s_sel_wr | axi_s_sel_rd | axi_s_awvalid | axi_s_arvalid; +reg axi_s_rlast; +reg axi_s_rvalid; +reg axi_s_wready; +reg axi_s_awready; +reg axi_s_arready; + +reg [3:0]axi_s_rstrb; +reg [3:0]apb_s_wstrb; +reg [31:0]reg_datai_32; +reg [31:0]reg_datao_32; +reg [2:0] rd_count; +reg [2:0] apb_rd_size; +reg [2:0] apb_wr_size; +reg [7:0] reg_datai; +reg axi_s_bvalid; + +always@(posedge clk) +begin + if(!rst_n) + begin + reg_datai_32 <= 32'h0; + reg_datao_32 <= 32'h0; + axi_s_req_addr <= 20'h0; + apb_s_wstrb <= 4'b0; + axi_s_rstrb <= 4'b0; + axi_s_wready <= 1'b0; + reg_enable <= 1'b0; + reg_psel <= 1'b0; + rd_count <= 3'b0; + apb_rd_size <= 3'b0; + apb_wr_size <= 3'b0; + axi_s_rlast <= 1'b0; + axi_s_rvalid <= 1'b0; + reg_datai <= 8'b0; + axi_s_awready <= 1'b0; + axi_s_arready <= 1'b0; + axi_s_bvalid <= 1'b0; + axi_s_sel_wr <= 1'b0; + axi_s_sel_rd <= 1'b0; + axi_s_w_id <= 'h0; + axi_s_r_id <= 'h0; + apb_high_24b_wr <= 24'h0; + end + else begin + if(axi_s_awvalid & ~axi_s_bvalid & ~axi_s_sel_rd & (csr_rw_sm == CSR_RW_SM_IDLE) &cpu_grant) begin + axi_s_req_addr <= axi_s_awaddr[L_ADDR_APB-1:0]; + axi_s_awready <= 1'b1; + axi_s_sel_wr <= 1'b1; + apb_wr_size <= axi_s_awsize; + end + else if(axi_s_sel_wr) begin + axi_s_awready <= 1'b0; + if(axi_s_wvalid && ~axi_s_wready) begin + `ifdef AXI128 + axi_s_req_addr <= (axi_s_wstrb[15:0]==16'h0002)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 4'h1): + (axi_s_wstrb[15:0]==16'h0004)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 4'h2): + (axi_s_wstrb[15:0]==16'h0008)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 4'h3): + (axi_s_wstrb[15:0]==16'h0010)&&(axi_s_req_addr[ 2]==1'h0)? (axi_s_req_addr + 4'h4): + (axi_s_wstrb[15:0]==16'h0020)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 4'h5): + (axi_s_wstrb[15:0]==16'h0040)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 4'h6): + (axi_s_wstrb[15:0]==16'h0080)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 4'h7): + (axi_s_wstrb[15:0]==16'h0100)&&(axi_s_req_addr[ 3]==1'h0)? (axi_s_req_addr + 4'h8): + (axi_s_wstrb[15:0]==16'h0200)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 4'h9): + (axi_s_wstrb[15:0]==16'h0400)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 4'ha): + (axi_s_wstrb[15:0]==16'h0800)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 4'hb): + (axi_s_wstrb[15:0]==16'h1000)&&(axi_s_req_addr[ 2]==1'h0)? (axi_s_req_addr + 4'hc): + (axi_s_wstrb[15:0]==16'h2000)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 4'hd): + (axi_s_wstrb[15:0]==16'h4000)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 4'he): + (axi_s_wstrb[15:0]==16'h8000)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 4'hf): + (axi_s_wstrb[15:0]==16'h0006)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 4'h1): + (axi_s_wstrb[15:0]==16'h000c)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 4'h2): + (axi_s_wstrb[15:0]==16'h0018)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 4'h3): + (axi_s_wstrb[15:0]==16'h0030)&&(axi_s_req_addr[ 2]==1'h0)? (axi_s_req_addr + 4'h4): + (axi_s_wstrb[15:0]==16'h0060)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 4'h5): + (axi_s_wstrb[15:0]==16'h00c0)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 4'h6): + (axi_s_wstrb[15:0]==16'h0180)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 4'h7): + (axi_s_wstrb[15:0]==16'h0300)&&(axi_s_req_addr[ 3]==1'h0)? (axi_s_req_addr + 4'h8): + (axi_s_wstrb[15:0]==16'h0600)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 4'h9): + (axi_s_wstrb[15:0]==16'h0c00)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 4'ha): + (axi_s_wstrb[15:0]==16'h1800)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 4'hb): + (axi_s_wstrb[15:0]==16'h3000)&&(axi_s_req_addr[ 2]==1'h0)? (axi_s_req_addr + 4'hc): + (axi_s_wstrb[15:0]==16'h6000)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 4'hd): + (axi_s_wstrb[15:0]==16'hc000)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 4'he): + (axi_s_wstrb[15:0]==16'h001e)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 4'h1): + (axi_s_wstrb[15:0]==16'h003c)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 4'h2): + (axi_s_wstrb[15:0]==16'h0078)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 4'h3): + (axi_s_wstrb[15:0]==16'h00f0)&&(axi_s_req_addr[ 2]==1'h0)? (axi_s_req_addr + 4'h4): + (axi_s_wstrb[15:0]==16'h01e0)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 4'h5): + (axi_s_wstrb[15:0]==16'h03c0)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 4'h6): + (axi_s_wstrb[15:0]==16'h0780)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 4'h7): + (axi_s_wstrb[15:0]==16'h0f00)&&(axi_s_req_addr[ 3]==1'h0)? (axi_s_req_addr + 4'h8): + (axi_s_wstrb[15:0]==16'h1e00)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 4'h9): + (axi_s_wstrb[15:0]==16'h3c00)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 4'ha): + (axi_s_wstrb[15:0]==16'h7800)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 4'hb): + (axi_s_wstrb[15:0]==16'hf000)&&(axi_s_req_addr[ 2]==1'h0)? (axi_s_req_addr + 4'hc): + (axi_s_wstrb[15:0]==16'h01fe)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 4'h1): + (axi_s_wstrb[15:0]==16'h03fc)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 4'h2): + (axi_s_wstrb[15:0]==16'h07f8)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 4'h3): + (axi_s_wstrb[15:0]==16'h0ff0)&&(axi_s_req_addr[ 2]==1'h0)? (axi_s_req_addr + 4'h4): + (axi_s_wstrb[15:0]==16'h1fe0)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 4'h5): + (axi_s_wstrb[15:0]==16'h3fc0)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 4'h6): + (axi_s_wstrb[15:0]==16'h7f80)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 4'h7): + (axi_s_wstrb[15:0]==16'hff00)&&(axi_s_req_addr[ 3]==1'h0)? (axi_s_req_addr + 4'h8): axi_s_req_addr ; + `elsif AXI64 + axi_s_req_addr <= (axi_s_wstrb[7:0]==8'h02)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 2'h1): + (axi_s_wstrb[7:0]==8'h04)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 2'h2): + (axi_s_wstrb[7:0]==8'h08)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 2'h3): + (axi_s_wstrb[7:0]==8'h10)&&(axi_s_req_addr[ 2]==1'h0)? (axi_s_req_addr + 2'h4): + (axi_s_wstrb[7:0]==8'h20)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 2'h5): + (axi_s_wstrb[7:0]==8'h40)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 2'h6): + (axi_s_wstrb[7:0]==8'h80)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 2'h7): + (axi_s_wstrb[7:0]==8'h06)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 2'h1): + (axi_s_wstrb[7:0]==8'h0c)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 2'h2): + (axi_s_wstrb[7:0]==8'h18)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 2'h3): + (axi_s_wstrb[7:0]==8'h30)&&(axi_s_req_addr[ 2]==1'h0)? (axi_s_req_addr + 2'h4): + (axi_s_wstrb[7:0]==8'h60)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 2'h5): + (axi_s_wstrb[7:0]==8'hc0)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 2'h6): + (axi_s_wstrb[7:0]==8'h1e)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 2'h1): + (axi_s_wstrb[7:0]==8'h3c)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 2'h2): + (axi_s_wstrb[7:0]==8'h78)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 2'h3): + (axi_s_wstrb[7:0]==8'hf0)&&(axi_s_req_addr[ 2]==1'h0)? (axi_s_req_addr + 2'h4): axi_s_req_addr ; + `else + axi_s_req_addr <= (axi_s_wstrb[3:0]==4'h2)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 2'h1): + (axi_s_wstrb[3:0]==4'h4)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 2'h2): + (axi_s_wstrb[3:0]==4'h8)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 2'h3): + (axi_s_wstrb[3:0]==4'h6)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 2'h1): + (axi_s_wstrb[3:0]==4'hc)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 2'h2): axi_s_req_addr ; + `endif + + axi_s_wready <= 1'b1; + reg_psel <= 1'b0; + reg_enable <= 1'b0; + axi_s_w_id <= axi_s_wid; + `ifdef AXI128 + case({axi_s_req_addr[3:0]}) + 4'b0000: begin apb_s_wstrb <= axi_s_wstrb[ 3: 0]; reg_datai_32 <=axi_s_wdata[ 31: 0]; end + 4'b0001: begin apb_s_wstrb <= axi_s_wstrb[ 4: 1]; reg_datai_32 <=axi_s_wdata[ 39: 8]; end + 4'b0010: begin apb_s_wstrb <= axi_s_wstrb[ 5: 2]; reg_datai_32 <=axi_s_wdata[ 47: 16]; end + 4'b0011: begin apb_s_wstrb <= axi_s_wstrb[ 6: 3]; reg_datai_32 <=axi_s_wdata[ 55: 24]; end + 4'b0100: begin apb_s_wstrb <= axi_s_wstrb[ 7: 4]; reg_datai_32 <=axi_s_wdata[ 63: 32]; end + 4'b0101: begin apb_s_wstrb <= axi_s_wstrb[ 8: 5]; reg_datai_32 <=axi_s_wdata[ 71: 40]; end + 4'b0110: begin apb_s_wstrb <= axi_s_wstrb[ 9: 6]; reg_datai_32 <=axi_s_wdata[ 79: 48]; end + 4'b0111: begin apb_s_wstrb <= axi_s_wstrb[10: 7]; reg_datai_32 <=axi_s_wdata[ 87: 56]; end + 4'b1000: begin apb_s_wstrb <= axi_s_wstrb[11: 8]; reg_datai_32 <=axi_s_wdata[ 95: 64]; end + 4'b1001: begin apb_s_wstrb <= axi_s_wstrb[12: 9]; reg_datai_32 <=axi_s_wdata[103: 72]; end + 4'b1010: begin apb_s_wstrb <= axi_s_wstrb[13:10]; reg_datai_32 <=axi_s_wdata[111: 80]; end + 4'b1011: begin apb_s_wstrb <= axi_s_wstrb[14:11]; reg_datai_32 <=axi_s_wdata[119: 88]; end + 4'b1100: begin apb_s_wstrb <= axi_s_wstrb[15:12]; reg_datai_32 <=axi_s_wdata[127: 96]; end + 4'b1101: begin apb_s_wstrb <= {1'b0, axi_s_wstrb[15:13]}; reg_datai_32 <={ 8'b0, axi_s_wdata[127:104]}; end + 4'b1110: begin apb_s_wstrb <= {2'b0, axi_s_wstrb[15:14]}; reg_datai_32 <={16'b0, axi_s_wdata[127:112]}; end + 4'b1111: begin apb_s_wstrb <= {3'b0, axi_s_wstrb[ 15]}; reg_datai_32 <={24'b0, axi_s_wdata[127:120]}; end + default: begin apb_s_wstrb <= 4'b0; reg_datai_32 <=32'h0; end + endcase + `elsif AXI64 + case({axi_s_req_addr[2:0]}) + 3'b000: begin apb_s_wstrb <= axi_s_wstrb[3:0]; reg_datai_32 <=axi_s_wdata[31: 0]; end + 3'b001: begin apb_s_wstrb <= axi_s_wstrb[4:1]; reg_datai_32 <=axi_s_wdata[39: 8]; end + 3'b010: begin apb_s_wstrb <= axi_s_wstrb[5:2]; reg_datai_32 <=axi_s_wdata[47:16]; end + 3'b011: begin apb_s_wstrb <= axi_s_wstrb[6:3]; reg_datai_32 <=axi_s_wdata[55:24]; end + 3'b100: begin apb_s_wstrb <= axi_s_wstrb[7:4]; reg_datai_32 <=axi_s_wdata[63:32]; end + 3'b101: begin apb_s_wstrb <= {1'b0, axi_s_wstrb[7:5]}; reg_datai_32 <={8 'b0, axi_s_wdata[63:40]}; end + 3'b110: begin apb_s_wstrb <= {2'b0, axi_s_wstrb[7:6]}; reg_datai_32 <={16'b0, axi_s_wdata[63:48]}; end + 3'b111: begin apb_s_wstrb <= {3'b0, axi_s_wstrb[ 7]}; reg_datai_32 <={24'b0, axi_s_wdata[63:56]}; end + default: begin apb_s_wstrb <= 4'b0; reg_datai_32 <=32'h0; end + endcase + `else + case({axi_s_req_addr[1:0]}) + 2'b00: begin apb_s_wstrb <= axi_s_wstrb[3:0]; reg_datai_32 <=axi_s_wdata[31:0]; end + 2'b01: begin apb_s_wstrb <= {1'b0,axi_s_wstrb[3:1]}; reg_datai_32 <={8'h0,axi_s_wdata[31:8]}; end + 2'b10: begin apb_s_wstrb <= {2'b0,axi_s_wstrb[3:2]}; reg_datai_32 <={16'b0,axi_s_wdata[31:16]}; end + 2'b11: begin apb_s_wstrb <= {3'b0,axi_s_wstrb[3]}; reg_datai_32 <={24'b0,axi_s_wdata[31:24]}; end + default: begin apb_s_wstrb <= 4'b0; reg_datai_32 <=32'h0; end + endcase + `endif + end + else if((~reg_psel) && (apb_s_wstrb!=4'h0) ) begin + reg_psel <= 1'b1; + reg_enable <= 1'b0; + reg_datai <= (apb_s_wstrb == 4'h1) ? reg_datai_32[7:0]: + (apb_s_wstrb == 4'h2) ? reg_datai_32[15:8]: + (apb_s_wstrb == 4'h6) ? reg_datai_32[15:8]: + (apb_s_wstrb == 4'h4) ? reg_datai_32[23:16]: + (apb_s_wstrb == 4'h8) ? reg_datai_32[31:24]: reg_datai_32[7:0]; + apb_high_24b_wr <= reg_datai_32[31:8]; + if(axi_s_bready) axi_s_bvalid <= 1'b0; + end + else if(apb_word_trans & apb_s_wstrb==4'hf ) begin + if(~reg_ready)begin + reg_psel <= 1'b1; + reg_enable <= 1'b1; + end + else begin + reg_psel <= 1'b0; + reg_enable <= 1'b0; + axi_s_sel_wr <= 1'b0; + axi_s_bvalid <= 1'b1; + apb_s_wstrb <= 4'b0; + end + reg_datai <= reg_datai_32[7:0]; + apb_high_24b_wr <= reg_datai_32[31:8]; + axi_s_wready <= 1'b0; + end + else if(apb_s_wstrb[0]) begin + if(~reg_ready)begin + reg_psel <= 1'b1; + reg_enable <= 1'b1; + reg_datai <= reg_datai_32[7:0]; + end + else begin + if(apb_s_wstrb[3:1] ==3'b0) + begin + reg_psel <= 1'b0; + axi_s_sel_wr<= 1'b0; + axi_s_bvalid <= 1'b1; + end + else + reg_psel <= 1'b1; + reg_enable <= 1'b0; + apb_s_wstrb[0] <= 1'b0; + axi_s_req_addr <= axi_s_req_addr +1'b1; + reg_datai <= reg_datai_32[15:8]; + end + axi_s_wready <= 1'b0; + end + else if (apb_s_wstrb[1]) begin + if(~reg_ready)begin + reg_psel <= 1'b1; + reg_enable <= 1'b1; + end + else begin + if(apb_s_wstrb[3:2] ==2'b0) + begin + reg_psel <= 1'b0; + axi_s_sel_wr <= 1'b0; + axi_s_bvalid <= 1'b1; + end + else + reg_psel <= 1'b1; + reg_enable <= 1'b0; + apb_s_wstrb[1] <= 1'b0; + axi_s_req_addr <= axi_s_req_addr +1'b1; + reg_datai <= reg_datai_32[23:16]; + end + axi_s_wready <= 1'b0; + end + else if (apb_s_wstrb[2]) begin + if(~reg_ready)begin + reg_psel <= 1'b1; + reg_enable <= 1'b1; + end + else begin + if(apb_s_wstrb[3] ==1'b0) + begin + reg_psel <= 1'b0; + axi_s_sel_wr <= 1'b0; + axi_s_bvalid <= 1'b1; + end + else + reg_psel <= 1'b1; + reg_enable <= 1'b0; + apb_s_wstrb[2] <= 1'b0; + axi_s_req_addr <= axi_s_req_addr +1'b1; + reg_datai <= reg_datai_32[31:24]; + end + axi_s_wready <= 1'b0; + end + else if (apb_s_wstrb[3]) begin + if(~reg_ready)begin + reg_psel <= 1'b1; + reg_enable <= 1'b1; + end + else begin + reg_psel <= 1'b0; + reg_enable <= 1'b0; + axi_s_sel_wr <= 1'b0; + axi_s_bvalid <= 1'b1; + apb_s_wstrb[3] <= 1'b0; + end + axi_s_wready <= 1'b0; + end + else begin + reg_psel <= 1'b0; + reg_enable <= 1'b0; + reg_datai <= 8'h0; + apb_s_wstrb <= 4'h0; + axi_s_wready <= 1'b0; + if(csr_rw_sm == CSR_RW_SM_IDLE) axi_s_sel_wr <= 1'b0; + end + end + else if(axi_s_arvalid & ~axi_s_arready & ~axi_s_bvalid & (csr_rw_sm == CSR_RW_SM_IDLE)&cpu_grant) + begin + reg_enable <= 1'b0; + reg_psel <= 1'b1; + axi_s_arready <= 1'b1; + axi_s_sel_rd <= 1'b1; + axi_s_r_id <= axi_s_arid; + apb_rd_size <= axi_s_arsize; + axi_s_req_addr <= axi_s_araddr[L_ADDR_APB-1:0]; + axi_s_rstrb <= axi_s_araddr[3:0]; + if(axi_s_arsize==3'b010) + rd_count<= 3'h4; + else if(axi_s_arsize==3'b01) + rd_count<= 3'h2; + else if(axi_s_arsize==3'b0) + rd_count<= 3'h1; + end + else if(axi_s_sel_rd) + begin + axi_s_arready <= 1'b0; + if(apb_word_trans) + begin + if(reg_ready) + begin + reg_psel <= rd_count==3'b10; + reg_enable <= 1'b0; + rd_count <= rd_count-3'b1; + axi_s_rlast <= apb_rd_size==3'h2|rd_count==2'b1; + axi_s_rvalid <= apb_rd_size==3'h2|rd_count==2'b1; + axi_s_sel_rd <= rd_count==3'b10; + reg_datao_32 <= {apb_high_24b_rd,reg_datao}; + end + else begin + reg_psel <= 1'b1; + reg_enable <= 1'b1; + end + end + else if(rd_count==3'h4) + begin + if(reg_ready) + begin + reg_psel <= 1'b1; + reg_enable <= 1'b0; + rd_count <= rd_count-3'h1; + reg_datao_32[7:0] <= reg_datao; + axi_s_req_addr <= axi_s_req_addr +1'b1; + end + else begin + reg_psel <= 1'b1; + reg_enable <= 1'b1; + end + end + else if(rd_count==3'h3) + begin + if(reg_ready) + begin + reg_psel <= 1'b1; + reg_enable <= 1'b0; + rd_count <= rd_count-3'h1; + reg_datao_32[15:8] <= reg_datao; + axi_s_req_addr <= axi_s_req_addr +1'b1; + end + else begin + reg_psel <= 1'b1; + reg_enable <= 1'b1; + end + end + else if(rd_count==3'h2) + begin + if(reg_ready) + begin + reg_psel <= 1'b1; + reg_enable <= 1'b0; + rd_count <= rd_count-3'h1; + axi_s_req_addr <= axi_s_req_addr +1'b1; + if(apb_rd_size==3'h2 ) + reg_datao_32[23:16] <= reg_datao; + else if(apb_rd_size==3'h1) + reg_datao_32[7:0] <= reg_datao; + end + else begin + reg_psel <= 1'b1; + reg_enable <= 1'b1; + end + end + else if(rd_count==3'h1) + begin + if(reg_ready) + begin + reg_psel <= 1'b0; + reg_enable <= 1'b0; + axi_s_rlast <= 1'b1; + axi_s_rvalid <= 1'b1; + axi_s_sel_rd <= 1'b0; + if(apb_rd_size==3'h2 ) + reg_datao_32[31:24] <= reg_datao; + else if(apb_rd_size==3'h1) + reg_datao_32[15:8] <= reg_datao; + else if(apb_rd_size==3'h0) + reg_datao_32[7:0] <= reg_datao; + end + else begin + reg_psel <= 1'b1; + reg_enable <= 1'b1; + end + end// end if(rd_count) + else begin + axi_s_arready <= 1'b0; + axi_s_rlast <= 1'b1; + axi_s_rvalid <= 1'b1; + reg_psel <= 1'b0; + reg_enable <= 1'b0; + if(axi_s_rvalid && axi_s_rready) + begin + reg_datao_32 <= 32'h0; + axi_s_rlast <= 1'b0; + axi_s_rvalid <= 1'b0; + end + if(csr_rw_sm == CSR_RW_SM_IDLE) axi_s_sel_rd <= 1'b0; + if(axi_s_bready) axi_s_bvalid <= 1'b0; + end + end//end if(axi_s_sel_rd) + else begin + reg_psel <= 1'b0; + reg_enable <= 1'b0; + axi_s_sel_wr <= 1'b0; + axi_s_sel_rd <= 1'b0; + axi_s_wready <= 1'b0; + axi_s_arready <= 1'b0; + axi_s_req_addr <= 32'h0; + reg_datai_32 <= 32'h0; + if(axi_s_bready) axi_s_bvalid <= 1'b0; + if(axi_s_rvalid && axi_s_rready) + begin + reg_datao_32 <= 32'h0; + axi_s_rlast <= 1'b0; + axi_s_rvalid <= 1'b0; + end + end + end//end if(rst_n) +end//end always + +assign csr_rw_send_axi_rsp_done = csr_rw_sm == CSR_RW_SM_SEND_AXI_RSP && axi_s_rlast && axi_s_rready || axi_s_bvalid && axi_s_bready; + +assign axi_s_bid = axi_s_w_id; +assign axi_s_rid = axi_s_r_id; +assign axi_s_bresp = 2'b00; +assign axi_s_rresp = 2'b00; +`ifdef AXI128 +assign axi_s_rdata= ( axi_s_rstrb == 4'h0) ? {96'b0, reg_datao_32 } : + ( axi_s_rstrb == 4'h1) ? {88'b0, reg_datao_32, 8'b0 } : + ( axi_s_rstrb == 4'h2) ? {80'b0, reg_datao_32, 16'b0 } : + ( axi_s_rstrb == 4'h3) ? {72'b0, reg_datao_32, 24'b0 } : + ( axi_s_rstrb == 4'h4) ? {64'b0, reg_datao_32, 32'b0 } : + ( axi_s_rstrb == 4'h5) ? {56'b0, reg_datao_32, 40'b0 } : + ( axi_s_rstrb == 4'h6) ? {48'b0, reg_datao_32, 48'b0 } : + ( axi_s_rstrb == 4'h7) ? {40'b0, reg_datao_32, 56'b0 } : + ( axi_s_rstrb == 4'h8) ? {32'b0, reg_datao_32, 64'b0 } : + ( axi_s_rstrb == 4'h9) ? {24'b0, reg_datao_32, 72'b0 } : + ( axi_s_rstrb == 4'ha) ? {16'b0, reg_datao_32, 80'b0 } : + ( axi_s_rstrb == 4'hb) ? { 8'b0, reg_datao_32, 88'b0 } : + ( axi_s_rstrb == 4'hc) ? {reg_datao_32, 96'b0 } : + ( axi_s_rstrb == 4'hd) ? {reg_datao_32[23:0], 104'b0 } : + ( axi_s_rstrb == 4'he) ? {reg_datao_32[15:0], 112'b0 } : + ( axi_s_rstrb == 4'hf) ? {reg_datao_32[ 7:0], 120'b0 } : 128'h0; + +`elsif AXI64 +assign axi_s_rdata= ( axi_s_rstrb[2:0] == 3'h0) ? {32'b0, reg_datao_32 } : + ( axi_s_rstrb[2:0] == 3'h1) ? {24'b0, reg_datao_32, 8'b0 } : + ( axi_s_rstrb[2:0] == 3'h2) ? {16'b0, reg_datao_32, 16'b0 } : + ( axi_s_rstrb[2:0] == 3'h3) ? { 8'b0, reg_datao_32, 24'b0 } : + ( axi_s_rstrb[2:0] == 3'h4) ? {reg_datao_32, 32'b0 } : + ( axi_s_rstrb[2:0] == 3'h5) ? {reg_datao_32[23:0], 40'b0 } : + ( axi_s_rstrb[2:0] == 3'h6) ? {reg_datao_32[15:0], 48'b0 } : + ( axi_s_rstrb[2:0] == 3'h7) ? {reg_datao_32[ 7:0], 56'b0 } : 64'h0; +`else +assign axi_s_rdata= ( axi_s_rstrb[1:0] == 2'h0) ? { reg_datao_32 } : + ( axi_s_rstrb[1:0] == 2'h1) ? {reg_datao_32[23:0], 8'h0} : + ( axi_s_rstrb[1:0] == 2'h2) ? {reg_datao_32[15:0],16'h0} : + ( axi_s_rstrb[1:0] == 2'h3) ? {reg_datao_32[7:0], 24'h0} : 32'h0; +`endif +always@(csr_rw_sm or axi_s_awvalid or axi_s_arvalid or axi_s_sel_rd or axi_s_sel_wr or + axi_s_wready or csr_rw_send_axi_rsp_done or cpu_grant) begin + case(csr_rw_sm) + CSR_RW_SM_IDLE: + if((axi_s_awvalid || axi_s_arvalid)&&~(axi_s_sel_wr||axi_s_sel_rd)&cpu_grant) + csr_rw_sm_nxt = CSR_RW_SM_GET_AXI_ADDR; + else + csr_rw_sm_nxt = CSR_RW_SM_IDLE; + CSR_RW_SM_GET_AXI_ADDR: + if(axi_s_sel_wr) + csr_rw_sm_nxt = CSR_RW_SM_SEND_AXI_RSP; + else if(axi_s_sel_rd) + csr_rw_sm_nxt = CSR_RW_SM_SEND_AXI_RSP; + else + csr_rw_sm_nxt = CSR_RW_SM_GET_AXI_ADDR; + CSR_RW_SM_SEND_AXI_RSP: + if(csr_rw_send_axi_rsp_done) + csr_rw_sm_nxt = CSR_RW_SM_IDLE; + else + csr_rw_sm_nxt = CSR_RW_SM_SEND_AXI_RSP; + default: + csr_rw_sm_nxt = CSR_RW_SM_IDLE; + endcase +end + +always@(posedge clk) begin + if(!rst_n) + csr_rw_sm <= CSR_RW_SM_IDLE; + else + csr_rw_sm <= csr_rw_sm_nxt; +end + +endmodule + diff --git a/rtl/ip/APB_UART/axi_uart_controller.v b/rtl/ip/APB_UART/axi_uart_controller.v new file mode 100644 index 0000000..e93ea75 --- /dev/null +++ b/rtl/ip/APB_UART/axi_uart_controller.v @@ -0,0 +1,356 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ + +`include "config.h" + +module axi_uart_controller +( +clk, +rst_n, + +axi_s_awid, +axi_s_awaddr, +axi_s_awlen, +axi_s_awsize, +axi_s_awburst, +axi_s_awlock, +axi_s_awcache, +axi_s_awprot, +axi_s_awvalid, +axi_s_awready, +axi_s_wid, +axi_s_wdata, +axi_s_wstrb, +axi_s_wlast, +axi_s_wvalid, +axi_s_wready, +axi_s_bid, +axi_s_bresp, +axi_s_bvalid, +axi_s_bready, +axi_s_arid, +axi_s_araddr, +axi_s_arlen, +axi_s_arsize, +axi_s_arburst, +axi_s_arlock, +axi_s_arcache, +axi_s_arprot, +axi_s_arvalid, +axi_s_arready, +axi_s_rid, +axi_s_rdata, +axi_s_rresp, +axi_s_rlast, +axi_s_rvalid, +axi_s_rready, + +apb_rw_dma, +apb_psel_dma, +apb_enab_dma, +apb_addr_dma, +apb_valid_dma, +apb_wdata_dma, +apb_rdata_dma, +apb_ready_dma, +dma_grant, + +dma_req_o, +dma_ack_i, + +uart0_txd_i, +uart0_txd_o, +uart0_txd_oe, +uart0_rxd_i, +uart0_rxd_o, +uart0_rxd_oe, +uart0_rts_o, +uart0_dtr_o, +uart0_cts_i, +uart0_dsr_i, +uart0_dcd_i, +uart0_ri_i, + +uart0_int +); + +parameter ADDR_APB = 20, + DATA_APB = 8; + +input clk; +input rst_n; + +input [`LID :0] axi_s_awid; +input [`Lawaddr -1 :0] axi_s_awaddr; +input [`Lawlen -1 :0] axi_s_awlen; +input [`Lawsize -1 :0] axi_s_awsize; +input [`Lawburst -1 :0] axi_s_awburst; +input [`Lawlock -1 :0] axi_s_awlock; +input [`Lawcache -1 :0] axi_s_awcache; +input [`Lawprot -1 :0] axi_s_awprot; +input axi_s_awvalid; +output axi_s_awready; +input [`LID :0] axi_s_wid; +input [`Lwdata -1 :0] axi_s_wdata; +input [`Lwstrb -1 :0] axi_s_wstrb; +input axi_s_wlast; +input axi_s_wvalid; +output axi_s_wready; +output [`LID :0] axi_s_bid; +output [`Lbresp -1 :0] axi_s_bresp; +output axi_s_bvalid; +input axi_s_bready; +input [`LID :0] axi_s_arid; +input [`Laraddr -1 :0] axi_s_araddr; +input [`Larlen -1 :0] axi_s_arlen; +input [`Larsize -1 :0] axi_s_arsize; +input [`Larburst -1 :0] axi_s_arburst; +input [`Larlock -1 :0] axi_s_arlock; +input [`Larcache -1 :0] axi_s_arcache; +input [`Larprot -1 :0] axi_s_arprot; +input axi_s_arvalid; +output axi_s_arready; +output [`LID :0] axi_s_rid; +output [`Lrdata -1 :0] axi_s_rdata; +output [`Lrresp -1 :0] axi_s_rresp; +output axi_s_rlast; +output axi_s_rvalid; +input axi_s_rready; + +output apb_ready_dma; +input apb_rw_dma; +input apb_psel_dma; +input apb_enab_dma; +input [ADDR_APB-1:0] apb_addr_dma; +input [31:0] apb_wdata_dma; +output[31:0] apb_rdata_dma; +input apb_valid_dma; +output dma_grant; + +output dma_req_o; +input dma_ack_i; + +input uart0_txd_i; +output uart0_txd_o; +output uart0_txd_oe; +input uart0_rxd_i; +output uart0_rxd_o; +output uart0_rxd_oe; +output uart0_rts_o; +output uart0_dtr_o; +input uart0_cts_i; +input uart0_dsr_i; +input uart0_dcd_i; +input uart0_ri_i; + +output uart0_int; + +assign dma_req_o = 1'b0; +assign nand_dma_ack_i = dma_ack_i; + +wire apb_ready_cpu; +wire apb_rw_cpu; +wire apb_psel_cpu; +wire apb_enab_cpu; +wire [ADDR_APB-1 :0] apb_addr_cpu; +wire [DATA_APB-1:0] apb_datai_cpu; +wire [DATA_APB-1:0] apb_datao_cpu; +wire apb_clk_cpu; +wire apb_reset_n_cpu; +wire apb_word_trans_cpu; +wire apb_valid_cpu; +wire dma_grant; +wire [23:0] apb_high_24b_rd; +wire [23:0] apb_high_24b_wr; + +wire apb_rw_dma; +wire apb_psel_dma; +wire apb_enab_dma; +wire [31:0] apb_wdata_dma; +wire [31:0] apb_rdata_dma; +wire apb_clk_dma; +wire apb_reset_n_dma; + +wire apb_uart0_req; +wire apb_uart0_ack; +wire apb_uart0_rw; +wire apb_uart0_enab; +wire apb_uart0_psel; +wire [ADDR_APB -1:0] apb_uart0_addr; +wire [DATA_APB -1:0] apb_uart0_datai; +wire [DATA_APB -1:0] apb_uart0_datao; + +wire apb_nand_req; +wire apb_nand_ack; +wire apb_nand_rw; +wire apb_nand_enab; +wire apb_nand_psel; +wire [ADDR_APB -1:0] apb_nand_addr; +wire [31:0] apb_nand_datai; +wire [31:0] apb_nand_datao; + +axi2apb_bridge AA_axi2apb_bridge_cpu +( +.clk (clk ), +.rst_n (rst_n ), +.axi_s_awid (axi_s_awid ), +.axi_s_awaddr (axi_s_awaddr ), +.axi_s_awlen (axi_s_awlen ), +.axi_s_awsize (axi_s_awsize ), +.axi_s_awburst (axi_s_awburst ), +.axi_s_awlock (axi_s_awlock ), +.axi_s_awcache (axi_s_awcache ), +.axi_s_awprot (axi_s_awprot ), +.axi_s_awvalid (axi_s_awvalid ), +.axi_s_awready (axi_s_awready ), +.axi_s_wid (axi_s_wid ), +.axi_s_wdata (axi_s_wdata ), +.axi_s_wstrb (axi_s_wstrb ), +.axi_s_wlast (axi_s_wlast ), +.axi_s_wvalid (axi_s_wvalid ), +.axi_s_wready (axi_s_wready ), +.axi_s_bid (axi_s_bid ), +.axi_s_bresp (axi_s_bresp ), +.axi_s_bvalid (axi_s_bvalid ), +.axi_s_bready (axi_s_bready ), +.axi_s_arid (axi_s_arid ), +.axi_s_araddr (axi_s_araddr ), +.axi_s_arlen (axi_s_arlen ), +.axi_s_arsize (axi_s_arsize ), +.axi_s_arburst (axi_s_arburst ), +.axi_s_arlock (axi_s_arlock ), +.axi_s_arcache (axi_s_arcache ), +.axi_s_arprot (axi_s_arprot ), +.axi_s_arvalid (axi_s_arvalid ), +.axi_s_arready (axi_s_arready ), +.axi_s_rid (axi_s_rid ), +.axi_s_rdata (axi_s_rdata ), +.axi_s_rresp (axi_s_rresp ), +.axi_s_rlast (axi_s_rlast ), +.axi_s_rvalid (axi_s_rvalid ), +.axi_s_rready (axi_s_rready ), + +.apb_word_trans (apb_word_trans_cpu ), +.apb_high_24b_rd (apb_high_24b_rd ), +.apb_high_24b_wr (apb_high_24b_wr ), +.apb_valid_cpu (apb_valid_cpu ), +.cpu_grant (~dma_grant ), + +.apb_clk (apb_clk_cpu ), +.apb_reset_n (apb_reset_n_cpu ), +.reg_psel (apb_psel_cpu ), +.reg_enable (apb_enab_cpu ), +.reg_rw (apb_rw_cpu ), +.reg_addr (apb_addr_cpu ), +.reg_datai (apb_datai_cpu ), +.reg_datao (apb_datao_cpu ), +.reg_ready_1 (apb_ready_cpu ) +); + +apb_mux2 u_apb_mux2 +( +.clk (clk ), +.rst_n (rst_n ), +.apb_ready_dma (apb_ready_dma ), +.apb_rw_dma (apb_rw_dma ), +.apb_addr_dma (apb_addr_dma ), +.apb_psel_dma (apb_psel_dma ), +.apb_enab_dma (apb_enab_dma ), +.apb_wdata_dma (apb_wdata_dma ), +.apb_rdata_dma (apb_rdata_dma ), +.apb_valid_dma (apb_valid_dma ), +.apb_valid_cpu (apb_valid_cpu ), +.dma_grant (dma_grant ), + +.apb_ack_cpu (apb_ready_cpu ), +.apb_rw_cpu (apb_rw_cpu ), +.apb_addr_cpu (apb_addr_cpu ), +.apb_psel_cpu (apb_psel_cpu ), +.apb_enab_cpu (apb_enab_cpu ), +.apb_datai_cpu (apb_datai_cpu ), +.apb_datao_cpu (apb_datao_cpu ), +.apb_high_24b_rd (apb_high_24b_rd), +.apb_high_24b_wr (apb_high_24b_wr), +.apb_word_trans_cpu (apb_word_trans_cpu ), + +.apb0_req (apb_uart0_req ), +.apb0_ack (apb_uart0_ack ), +.apb0_rw (apb_uart0_rw ), +.apb0_psel (apb_uart0_psel ), +.apb0_enab (apb_uart0_enab ), +.apb0_addr (apb_uart0_addr ), +.apb0_datai (apb_uart0_datai ), +.apb0_datao (apb_uart0_datao ), + +.apb1_req ( ), +.apb1_ack (1'b1 ), +.apb1_rw ( ), +.apb1_enab ( ), +.apb1_psel ( ), +.apb1_addr ( ), +.apb1_datai ( ), +.apb1_datao (32'b0 ) + +); + +//uart0 +assign apb_uart0_ack = apb_uart0_enab; +UART_TOP uart0 +( +.PCLK (clk ), +.clk_carrier (1'b0 ), +.PRST_ (rst_n ), +.PSEL (apb_uart0_psel ), +.PENABLE (apb_uart0_enab ), +.PADDR (apb_uart0_addr[7:0] ), +.PWRITE (apb_uart0_rw ), +.PWDATA (apb_uart0_datai ), +.URT_PRDATA (apb_uart0_datao ), +.INT (uart0_int ), +.TXD_o (uart0_txd_o ), +.TXD_i (uart0_txd_i ), +.TXD_oe (uart0_txd_oe ), +.RXD_o (uart0_rxd_o ), +.RXD_i (uart0_rxd_i ), +.RXD_oe (uart0_rxd_oe ), +.RTS (uart0_rts_o ), +.CTS (uart0_cts_i ), +.DSR (uart0_dsr_i ), +.DCD (uart0_dcd_i ), +.DTR (uart0_dtr_o ), +.RI (uart0_ri_i ) +); + +endmodule + + diff --git a/rtl/ip/Bus_interconnects/AxiCrossbar_2x8.v b/rtl/ip/Bus_interconnects/AxiCrossbar_2x8.v new file mode 100644 index 0000000..a1d84a1 --- /dev/null +++ b/rtl/ip/Bus_interconnects/AxiCrossbar_2x8.v @@ -0,0 +1,6331 @@ +// Generator : SpinalHDL v1.10.1 git head : 2527c7c6b0fb0f95e5e1a5722a0be732b364ce43 +// Component : AxiCrossbar_2x8 + + +module AxiCrossbar_2x8 ( + input wire axiIn_0_awvalid, + output wire axiIn_0_awready, + input wire [31:0] axiIn_0_awaddr, + input wire [3:0] axiIn_0_awid, + input wire [7:0] axiIn_0_awlen, + input wire [2:0] axiIn_0_awsize, + input wire [1:0] axiIn_0_awburst, + input wire [0:0] axiIn_0_awlock, + input wire [3:0] axiIn_0_awcache, + input wire [2:0] axiIn_0_awprot, + input wire axiIn_0_wvalid, + output wire axiIn_0_wready, + input wire [31:0] axiIn_0_wdata, + input wire [3:0] axiIn_0_wstrb, + input wire axiIn_0_wlast, + output wire axiIn_0_bvalid, + input wire axiIn_0_bready, + output wire [3:0] axiIn_0_bid, + output wire [1:0] axiIn_0_bresp, + input wire axiIn_0_arvalid, + output wire axiIn_0_arready, + input wire [31:0] axiIn_0_araddr, + input wire [3:0] axiIn_0_arid, + input wire [7:0] axiIn_0_arlen, + input wire [2:0] axiIn_0_arsize, + input wire [1:0] axiIn_0_arburst, + input wire [0:0] axiIn_0_arlock, + input wire [3:0] axiIn_0_arcache, + input wire [2:0] axiIn_0_arprot, + output wire axiIn_0_rvalid, + input wire axiIn_0_rready, + output wire [31:0] axiIn_0_rdata, + output wire [3:0] axiIn_0_rid, + output wire [1:0] axiIn_0_rresp, + output wire axiIn_0_rlast, + input wire axiIn_1_awvalid, + output wire axiIn_1_awready, + input wire [31:0] axiIn_1_awaddr, + input wire [3:0] axiIn_1_awid, + input wire [7:0] axiIn_1_awlen, + input wire [2:0] axiIn_1_awsize, + input wire [1:0] axiIn_1_awburst, + input wire [0:0] axiIn_1_awlock, + input wire [3:0] axiIn_1_awcache, + input wire [2:0] axiIn_1_awprot, + input wire axiIn_1_wvalid, + output wire axiIn_1_wready, + input wire [31:0] axiIn_1_wdata, + input wire [3:0] axiIn_1_wstrb, + input wire axiIn_1_wlast, + output wire axiIn_1_bvalid, + input wire axiIn_1_bready, + output wire [3:0] axiIn_1_bid, + output wire [1:0] axiIn_1_bresp, + input wire axiIn_1_arvalid, + output wire axiIn_1_arready, + input wire [31:0] axiIn_1_araddr, + input wire [3:0] axiIn_1_arid, + input wire [7:0] axiIn_1_arlen, + input wire [2:0] axiIn_1_arsize, + input wire [1:0] axiIn_1_arburst, + input wire [0:0] axiIn_1_arlock, + input wire [3:0] axiIn_1_arcache, + input wire [2:0] axiIn_1_arprot, + output wire axiIn_1_rvalid, + input wire axiIn_1_rready, + output wire [31:0] axiIn_1_rdata, + output wire [3:0] axiIn_1_rid, + output wire [1:0] axiIn_1_rresp, + output wire axiIn_1_rlast, + output wire axiOut_0_awvalid, + input wire axiOut_0_awready, + output wire [31:0] axiOut_0_awaddr, + output wire [4:0] axiOut_0_awid, + output wire [7:0] axiOut_0_awlen, + output wire [2:0] axiOut_0_awsize, + output wire [1:0] axiOut_0_awburst, + output wire [0:0] axiOut_0_awlock, + output wire [3:0] axiOut_0_awcache, + output wire [2:0] axiOut_0_awprot, + output wire axiOut_0_wvalid, + input wire axiOut_0_wready, + output wire [31:0] axiOut_0_wdata, + output wire [3:0] axiOut_0_wstrb, + output wire axiOut_0_wlast, + input wire axiOut_0_bvalid, + output wire axiOut_0_bready, + input wire [4:0] axiOut_0_bid, + input wire [1:0] axiOut_0_bresp, + output wire axiOut_0_arvalid, + input wire axiOut_0_arready, + output wire [31:0] axiOut_0_araddr, + output wire [4:0] axiOut_0_arid, + output wire [7:0] axiOut_0_arlen, + output wire [2:0] axiOut_0_arsize, + output wire [1:0] axiOut_0_arburst, + output wire [0:0] axiOut_0_arlock, + output wire [3:0] axiOut_0_arcache, + output wire [2:0] axiOut_0_arprot, + input wire axiOut_0_rvalid, + output wire axiOut_0_rready, + input wire [31:0] axiOut_0_rdata, + input wire [4:0] axiOut_0_rid, + input wire [1:0] axiOut_0_rresp, + input wire axiOut_0_rlast, + output wire axiOut_1_awvalid, + input wire axiOut_1_awready, + output wire [31:0] axiOut_1_awaddr, + output wire [4:0] axiOut_1_awid, + output wire [7:0] axiOut_1_awlen, + output wire [2:0] axiOut_1_awsize, + output wire [1:0] axiOut_1_awburst, + output wire [0:0] axiOut_1_awlock, + output wire [3:0] axiOut_1_awcache, + output wire [2:0] axiOut_1_awprot, + output wire axiOut_1_wvalid, + input wire axiOut_1_wready, + output wire [31:0] axiOut_1_wdata, + output wire [3:0] axiOut_1_wstrb, + output wire axiOut_1_wlast, + input wire axiOut_1_bvalid, + output wire axiOut_1_bready, + input wire [4:0] axiOut_1_bid, + input wire [1:0] axiOut_1_bresp, + output wire axiOut_1_arvalid, + input wire axiOut_1_arready, + output wire [31:0] axiOut_1_araddr, + output wire [4:0] axiOut_1_arid, + output wire [7:0] axiOut_1_arlen, + output wire [2:0] axiOut_1_arsize, + output wire [1:0] axiOut_1_arburst, + output wire [0:0] axiOut_1_arlock, + output wire [3:0] axiOut_1_arcache, + output wire [2:0] axiOut_1_arprot, + input wire axiOut_1_rvalid, + output wire axiOut_1_rready, + input wire [31:0] axiOut_1_rdata, + input wire [4:0] axiOut_1_rid, + input wire [1:0] axiOut_1_rresp, + input wire axiOut_1_rlast, + output wire axiOut_2_awvalid, + input wire axiOut_2_awready, + output wire [31:0] axiOut_2_awaddr, + output wire [4:0] axiOut_2_awid, + output wire [7:0] axiOut_2_awlen, + output wire [2:0] axiOut_2_awsize, + output wire [1:0] axiOut_2_awburst, + output wire [0:0] axiOut_2_awlock, + output wire [3:0] axiOut_2_awcache, + output wire [2:0] axiOut_2_awprot, + output wire axiOut_2_wvalid, + input wire axiOut_2_wready, + output wire [31:0] axiOut_2_wdata, + output wire [3:0] axiOut_2_wstrb, + output wire axiOut_2_wlast, + input wire axiOut_2_bvalid, + output wire axiOut_2_bready, + input wire [4:0] axiOut_2_bid, + input wire [1:0] axiOut_2_bresp, + output wire axiOut_2_arvalid, + input wire axiOut_2_arready, + output wire [31:0] axiOut_2_araddr, + output wire [4:0] axiOut_2_arid, + output wire [7:0] axiOut_2_arlen, + output wire [2:0] axiOut_2_arsize, + output wire [1:0] axiOut_2_arburst, + output wire [0:0] axiOut_2_arlock, + output wire [3:0] axiOut_2_arcache, + output wire [2:0] axiOut_2_arprot, + input wire axiOut_2_rvalid, + output wire axiOut_2_rready, + input wire [31:0] axiOut_2_rdata, + input wire [4:0] axiOut_2_rid, + input wire [1:0] axiOut_2_rresp, + input wire axiOut_2_rlast, + output wire axiOut_3_awvalid, + input wire axiOut_3_awready, + output wire [31:0] axiOut_3_awaddr, + output wire [4:0] axiOut_3_awid, + output wire [7:0] axiOut_3_awlen, + output wire [2:0] axiOut_3_awsize, + output wire [1:0] axiOut_3_awburst, + output wire [0:0] axiOut_3_awlock, + output wire [3:0] axiOut_3_awcache, + output wire [2:0] axiOut_3_awprot, + output wire axiOut_3_wvalid, + input wire axiOut_3_wready, + output wire [31:0] axiOut_3_wdata, + output wire [3:0] axiOut_3_wstrb, + output wire axiOut_3_wlast, + input wire axiOut_3_bvalid, + output wire axiOut_3_bready, + input wire [4:0] axiOut_3_bid, + input wire [1:0] axiOut_3_bresp, + output wire axiOut_3_arvalid, + input wire axiOut_3_arready, + output wire [31:0] axiOut_3_araddr, + output wire [4:0] axiOut_3_arid, + output wire [7:0] axiOut_3_arlen, + output wire [2:0] axiOut_3_arsize, + output wire [1:0] axiOut_3_arburst, + output wire [0:0] axiOut_3_arlock, + output wire [3:0] axiOut_3_arcache, + output wire [2:0] axiOut_3_arprot, + input wire axiOut_3_rvalid, + output wire axiOut_3_rready, + input wire [31:0] axiOut_3_rdata, + input wire [4:0] axiOut_3_rid, + input wire [1:0] axiOut_3_rresp, + input wire axiOut_3_rlast, + output wire axiOut_4_awvalid, + input wire axiOut_4_awready, + output wire [31:0] axiOut_4_awaddr, + output wire [4:0] axiOut_4_awid, + output wire [7:0] axiOut_4_awlen, + output wire [2:0] axiOut_4_awsize, + output wire [1:0] axiOut_4_awburst, + output wire [0:0] axiOut_4_awlock, + output wire [3:0] axiOut_4_awcache, + output wire [2:0] axiOut_4_awprot, + output wire axiOut_4_wvalid, + input wire axiOut_4_wready, + output wire [31:0] axiOut_4_wdata, + output wire [3:0] axiOut_4_wstrb, + output wire axiOut_4_wlast, + input wire axiOut_4_bvalid, + output wire axiOut_4_bready, + input wire [4:0] axiOut_4_bid, + input wire [1:0] axiOut_4_bresp, + output wire axiOut_4_arvalid, + input wire axiOut_4_arready, + output wire [31:0] axiOut_4_araddr, + output wire [4:0] axiOut_4_arid, + output wire [7:0] axiOut_4_arlen, + output wire [2:0] axiOut_4_arsize, + output wire [1:0] axiOut_4_arburst, + output wire [0:0] axiOut_4_arlock, + output wire [3:0] axiOut_4_arcache, + output wire [2:0] axiOut_4_arprot, + input wire axiOut_4_rvalid, + output wire axiOut_4_rready, + input wire [31:0] axiOut_4_rdata, + input wire [4:0] axiOut_4_rid, + input wire [1:0] axiOut_4_rresp, + input wire axiOut_4_rlast, + output wire axiOut_5_awvalid, + input wire axiOut_5_awready, + output wire [31:0] axiOut_5_awaddr, + output wire [4:0] axiOut_5_awid, + output wire [7:0] axiOut_5_awlen, + output wire [2:0] axiOut_5_awsize, + output wire [1:0] axiOut_5_awburst, + output wire [0:0] axiOut_5_awlock, + output wire [3:0] axiOut_5_awcache, + output wire [2:0] axiOut_5_awprot, + output wire axiOut_5_wvalid, + input wire axiOut_5_wready, + output wire [31:0] axiOut_5_wdata, + output wire [3:0] axiOut_5_wstrb, + output wire axiOut_5_wlast, + input wire axiOut_5_bvalid, + output wire axiOut_5_bready, + input wire [4:0] axiOut_5_bid, + input wire [1:0] axiOut_5_bresp, + output wire axiOut_5_arvalid, + input wire axiOut_5_arready, + output wire [31:0] axiOut_5_araddr, + output wire [4:0] axiOut_5_arid, + output wire [7:0] axiOut_5_arlen, + output wire [2:0] axiOut_5_arsize, + output wire [1:0] axiOut_5_arburst, + output wire [0:0] axiOut_5_arlock, + output wire [3:0] axiOut_5_arcache, + output wire [2:0] axiOut_5_arprot, + input wire axiOut_5_rvalid, + output wire axiOut_5_rready, + input wire [31:0] axiOut_5_rdata, + input wire [4:0] axiOut_5_rid, + input wire [1:0] axiOut_5_rresp, + input wire axiOut_5_rlast, + output wire axiOut_6_awvalid, + input wire axiOut_6_awready, + output wire [31:0] axiOut_6_awaddr, + output wire [4:0] axiOut_6_awid, + output wire [7:0] axiOut_6_awlen, + output wire [2:0] axiOut_6_awsize, + output wire [1:0] axiOut_6_awburst, + output wire [0:0] axiOut_6_awlock, + output wire [3:0] axiOut_6_awcache, + output wire [2:0] axiOut_6_awprot, + output wire axiOut_6_wvalid, + input wire axiOut_6_wready, + output wire [31:0] axiOut_6_wdata, + output wire [3:0] axiOut_6_wstrb, + output wire axiOut_6_wlast, + input wire axiOut_6_bvalid, + output wire axiOut_6_bready, + input wire [4:0] axiOut_6_bid, + input wire [1:0] axiOut_6_bresp, + output wire axiOut_6_arvalid, + input wire axiOut_6_arready, + output wire [31:0] axiOut_6_araddr, + output wire [4:0] axiOut_6_arid, + output wire [7:0] axiOut_6_arlen, + output wire [2:0] axiOut_6_arsize, + output wire [1:0] axiOut_6_arburst, + output wire [0:0] axiOut_6_arlock, + output wire [3:0] axiOut_6_arcache, + output wire [2:0] axiOut_6_arprot, + input wire axiOut_6_rvalid, + output wire axiOut_6_rready, + input wire [31:0] axiOut_6_rdata, + input wire [4:0] axiOut_6_rid, + input wire [1:0] axiOut_6_rresp, + input wire axiOut_6_rlast, + output wire axiOut_7_awvalid, + input wire axiOut_7_awready, + output wire [31:0] axiOut_7_awaddr, + output wire [4:0] axiOut_7_awid, + output wire [7:0] axiOut_7_awlen, + output wire [2:0] axiOut_7_awsize, + output wire [1:0] axiOut_7_awburst, + output wire [0:0] axiOut_7_awlock, + output wire [3:0] axiOut_7_awcache, + output wire [2:0] axiOut_7_awprot, + output wire axiOut_7_wvalid, + input wire axiOut_7_wready, + output wire [31:0] axiOut_7_wdata, + output wire [3:0] axiOut_7_wstrb, + output wire axiOut_7_wlast, + input wire axiOut_7_bvalid, + output wire axiOut_7_bready, + input wire [4:0] axiOut_7_bid, + input wire [1:0] axiOut_7_bresp, + output wire axiOut_7_arvalid, + input wire axiOut_7_arready, + output wire [31:0] axiOut_7_araddr, + output wire [4:0] axiOut_7_arid, + output wire [7:0] axiOut_7_arlen, + output wire [2:0] axiOut_7_arsize, + output wire [1:0] axiOut_7_arburst, + output wire [0:0] axiOut_7_arlock, + output wire [3:0] axiOut_7_arcache, + output wire [2:0] axiOut_7_arprot, + input wire axiOut_7_rvalid, + output wire axiOut_7_rready, + input wire [31:0] axiOut_7_rdata, + input wire [4:0] axiOut_7_rid, + input wire [1:0] axiOut_7_rresp, + input wire axiOut_7_rlast, + input wire clk, + input wire resetn +); + + wire [3:0] axiIn_0_readOnly_decoder_io_outputs_2_r_payload_id; + wire [3:0] axiIn_0_readOnly_decoder_io_outputs_3_r_payload_id; + wire [3:0] axiIn_0_readOnly_decoder_io_outputs_4_r_payload_id; + wire [3:0] axiIn_0_readOnly_decoder_io_outputs_5_r_payload_id; + wire [3:0] axiIn_0_writeOnly_decoder_io_outputs_2_b_payload_id; + wire [3:0] axiIn_0_writeOnly_decoder_io_outputs_3_b_payload_id; + wire [3:0] axiIn_0_writeOnly_decoder_io_outputs_4_b_payload_id; + wire [3:0] axiIn_0_writeOnly_decoder_io_outputs_5_b_payload_id; + wire axiIn_0_readOnly_decoder_io_input_ar_ready; + wire axiIn_0_readOnly_decoder_io_input_r_valid; + wire [31:0] axiIn_0_readOnly_decoder_io_input_r_payload_data; + wire [3:0] axiIn_0_readOnly_decoder_io_input_r_payload_id; + wire [1:0] axiIn_0_readOnly_decoder_io_input_r_payload_resp; + wire axiIn_0_readOnly_decoder_io_input_r_payload_last; + wire axiIn_0_readOnly_decoder_io_outputs_0_ar_valid; + wire [31:0] axiIn_0_readOnly_decoder_io_outputs_0_ar_payload_addr; + wire [3:0] axiIn_0_readOnly_decoder_io_outputs_0_ar_payload_id; + wire [7:0] axiIn_0_readOnly_decoder_io_outputs_0_ar_payload_len; + wire [2:0] axiIn_0_readOnly_decoder_io_outputs_0_ar_payload_size; + wire [1:0] axiIn_0_readOnly_decoder_io_outputs_0_ar_payload_burst; + wire [0:0] axiIn_0_readOnly_decoder_io_outputs_0_ar_payload_lock; + wire [3:0] axiIn_0_readOnly_decoder_io_outputs_0_ar_payload_cache; + wire [2:0] axiIn_0_readOnly_decoder_io_outputs_0_ar_payload_prot; + wire axiIn_0_readOnly_decoder_io_outputs_0_r_ready; + wire axiIn_0_readOnly_decoder_io_outputs_1_ar_valid; + wire [31:0] axiIn_0_readOnly_decoder_io_outputs_1_ar_payload_addr; + wire [3:0] axiIn_0_readOnly_decoder_io_outputs_1_ar_payload_id; + wire [7:0] axiIn_0_readOnly_decoder_io_outputs_1_ar_payload_len; + wire [2:0] axiIn_0_readOnly_decoder_io_outputs_1_ar_payload_size; + wire [1:0] axiIn_0_readOnly_decoder_io_outputs_1_ar_payload_burst; + wire [0:0] axiIn_0_readOnly_decoder_io_outputs_1_ar_payload_lock; + wire [3:0] axiIn_0_readOnly_decoder_io_outputs_1_ar_payload_cache; + wire [2:0] axiIn_0_readOnly_decoder_io_outputs_1_ar_payload_prot; + wire axiIn_0_readOnly_decoder_io_outputs_1_r_ready; + wire axiIn_0_readOnly_decoder_io_outputs_2_ar_valid; + wire [31:0] axiIn_0_readOnly_decoder_io_outputs_2_ar_payload_addr; + wire [3:0] axiIn_0_readOnly_decoder_io_outputs_2_ar_payload_id; + wire [7:0] axiIn_0_readOnly_decoder_io_outputs_2_ar_payload_len; + wire [2:0] axiIn_0_readOnly_decoder_io_outputs_2_ar_payload_size; + wire [1:0] axiIn_0_readOnly_decoder_io_outputs_2_ar_payload_burst; + wire [0:0] axiIn_0_readOnly_decoder_io_outputs_2_ar_payload_lock; + wire [3:0] axiIn_0_readOnly_decoder_io_outputs_2_ar_payload_cache; + wire [2:0] axiIn_0_readOnly_decoder_io_outputs_2_ar_payload_prot; + wire axiIn_0_readOnly_decoder_io_outputs_2_r_ready; + wire axiIn_0_readOnly_decoder_io_outputs_3_ar_valid; + wire [31:0] axiIn_0_readOnly_decoder_io_outputs_3_ar_payload_addr; + wire [3:0] axiIn_0_readOnly_decoder_io_outputs_3_ar_payload_id; + wire [7:0] axiIn_0_readOnly_decoder_io_outputs_3_ar_payload_len; + wire [2:0] axiIn_0_readOnly_decoder_io_outputs_3_ar_payload_size; + wire [1:0] axiIn_0_readOnly_decoder_io_outputs_3_ar_payload_burst; + wire [0:0] axiIn_0_readOnly_decoder_io_outputs_3_ar_payload_lock; + wire [3:0] axiIn_0_readOnly_decoder_io_outputs_3_ar_payload_cache; + wire [2:0] axiIn_0_readOnly_decoder_io_outputs_3_ar_payload_prot; + wire axiIn_0_readOnly_decoder_io_outputs_3_r_ready; + wire axiIn_0_readOnly_decoder_io_outputs_4_ar_valid; + wire [31:0] axiIn_0_readOnly_decoder_io_outputs_4_ar_payload_addr; + wire [3:0] axiIn_0_readOnly_decoder_io_outputs_4_ar_payload_id; + wire [7:0] axiIn_0_readOnly_decoder_io_outputs_4_ar_payload_len; + wire [2:0] axiIn_0_readOnly_decoder_io_outputs_4_ar_payload_size; + wire [1:0] axiIn_0_readOnly_decoder_io_outputs_4_ar_payload_burst; + wire [0:0] axiIn_0_readOnly_decoder_io_outputs_4_ar_payload_lock; + wire [3:0] axiIn_0_readOnly_decoder_io_outputs_4_ar_payload_cache; + wire [2:0] axiIn_0_readOnly_decoder_io_outputs_4_ar_payload_prot; + wire axiIn_0_readOnly_decoder_io_outputs_4_r_ready; + wire axiIn_0_readOnly_decoder_io_outputs_5_ar_valid; + wire [31:0] axiIn_0_readOnly_decoder_io_outputs_5_ar_payload_addr; + wire [3:0] axiIn_0_readOnly_decoder_io_outputs_5_ar_payload_id; + wire [7:0] axiIn_0_readOnly_decoder_io_outputs_5_ar_payload_len; + wire [2:0] axiIn_0_readOnly_decoder_io_outputs_5_ar_payload_size; + wire [1:0] axiIn_0_readOnly_decoder_io_outputs_5_ar_payload_burst; + wire [0:0] axiIn_0_readOnly_decoder_io_outputs_5_ar_payload_lock; + wire [3:0] axiIn_0_readOnly_decoder_io_outputs_5_ar_payload_cache; + wire [2:0] axiIn_0_readOnly_decoder_io_outputs_5_ar_payload_prot; + wire axiIn_0_readOnly_decoder_io_outputs_5_r_ready; + wire axiIn_0_readOnly_decoder_io_outputs_6_ar_valid; + wire [31:0] axiIn_0_readOnly_decoder_io_outputs_6_ar_payload_addr; + wire [3:0] axiIn_0_readOnly_decoder_io_outputs_6_ar_payload_id; + wire [7:0] axiIn_0_readOnly_decoder_io_outputs_6_ar_payload_len; + wire [2:0] axiIn_0_readOnly_decoder_io_outputs_6_ar_payload_size; + wire [1:0] axiIn_0_readOnly_decoder_io_outputs_6_ar_payload_burst; + wire [0:0] axiIn_0_readOnly_decoder_io_outputs_6_ar_payload_lock; + wire [3:0] axiIn_0_readOnly_decoder_io_outputs_6_ar_payload_cache; + wire [2:0] axiIn_0_readOnly_decoder_io_outputs_6_ar_payload_prot; + wire axiIn_0_readOnly_decoder_io_outputs_6_r_ready; + wire axiIn_0_readOnly_decoder_io_outputs_7_ar_valid; + wire [31:0] axiIn_0_readOnly_decoder_io_outputs_7_ar_payload_addr; + wire [3:0] axiIn_0_readOnly_decoder_io_outputs_7_ar_payload_id; + wire [7:0] axiIn_0_readOnly_decoder_io_outputs_7_ar_payload_len; + wire [2:0] axiIn_0_readOnly_decoder_io_outputs_7_ar_payload_size; + wire [1:0] axiIn_0_readOnly_decoder_io_outputs_7_ar_payload_burst; + wire [0:0] axiIn_0_readOnly_decoder_io_outputs_7_ar_payload_lock; + wire [3:0] axiIn_0_readOnly_decoder_io_outputs_7_ar_payload_cache; + wire [2:0] axiIn_0_readOnly_decoder_io_outputs_7_ar_payload_prot; + wire axiIn_0_readOnly_decoder_io_outputs_7_r_ready; + wire axiIn_0_writeOnly_decoder_io_input_aw_ready; + wire axiIn_0_writeOnly_decoder_io_input_w_ready; + wire axiIn_0_writeOnly_decoder_io_input_b_valid; + wire [3:0] axiIn_0_writeOnly_decoder_io_input_b_payload_id; + wire [1:0] axiIn_0_writeOnly_decoder_io_input_b_payload_resp; + wire axiIn_0_writeOnly_decoder_io_outputs_0_aw_valid; + wire [31:0] axiIn_0_writeOnly_decoder_io_outputs_0_aw_payload_addr; + wire [3:0] axiIn_0_writeOnly_decoder_io_outputs_0_aw_payload_id; + wire [7:0] axiIn_0_writeOnly_decoder_io_outputs_0_aw_payload_len; + wire [2:0] axiIn_0_writeOnly_decoder_io_outputs_0_aw_payload_size; + wire [1:0] axiIn_0_writeOnly_decoder_io_outputs_0_aw_payload_burst; + wire [0:0] axiIn_0_writeOnly_decoder_io_outputs_0_aw_payload_lock; + wire [3:0] axiIn_0_writeOnly_decoder_io_outputs_0_aw_payload_cache; + wire [2:0] axiIn_0_writeOnly_decoder_io_outputs_0_aw_payload_prot; + wire axiIn_0_writeOnly_decoder_io_outputs_0_w_valid; + wire [31:0] axiIn_0_writeOnly_decoder_io_outputs_0_w_payload_data; + wire [3:0] axiIn_0_writeOnly_decoder_io_outputs_0_w_payload_strb; + wire axiIn_0_writeOnly_decoder_io_outputs_0_w_payload_last; + wire axiIn_0_writeOnly_decoder_io_outputs_0_b_ready; + wire axiIn_0_writeOnly_decoder_io_outputs_1_aw_valid; + wire [31:0] axiIn_0_writeOnly_decoder_io_outputs_1_aw_payload_addr; + wire [3:0] axiIn_0_writeOnly_decoder_io_outputs_1_aw_payload_id; + wire [7:0] axiIn_0_writeOnly_decoder_io_outputs_1_aw_payload_len; + wire [2:0] axiIn_0_writeOnly_decoder_io_outputs_1_aw_payload_size; + wire [1:0] axiIn_0_writeOnly_decoder_io_outputs_1_aw_payload_burst; + wire [0:0] axiIn_0_writeOnly_decoder_io_outputs_1_aw_payload_lock; + wire [3:0] axiIn_0_writeOnly_decoder_io_outputs_1_aw_payload_cache; + wire [2:0] axiIn_0_writeOnly_decoder_io_outputs_1_aw_payload_prot; + wire axiIn_0_writeOnly_decoder_io_outputs_1_w_valid; + wire [31:0] axiIn_0_writeOnly_decoder_io_outputs_1_w_payload_data; + wire [3:0] axiIn_0_writeOnly_decoder_io_outputs_1_w_payload_strb; + wire axiIn_0_writeOnly_decoder_io_outputs_1_w_payload_last; + wire axiIn_0_writeOnly_decoder_io_outputs_1_b_ready; + wire axiIn_0_writeOnly_decoder_io_outputs_2_aw_valid; + wire [31:0] axiIn_0_writeOnly_decoder_io_outputs_2_aw_payload_addr; + wire [3:0] axiIn_0_writeOnly_decoder_io_outputs_2_aw_payload_id; + wire [7:0] axiIn_0_writeOnly_decoder_io_outputs_2_aw_payload_len; + wire [2:0] axiIn_0_writeOnly_decoder_io_outputs_2_aw_payload_size; + wire [1:0] axiIn_0_writeOnly_decoder_io_outputs_2_aw_payload_burst; + wire [0:0] axiIn_0_writeOnly_decoder_io_outputs_2_aw_payload_lock; + wire [3:0] axiIn_0_writeOnly_decoder_io_outputs_2_aw_payload_cache; + wire [2:0] axiIn_0_writeOnly_decoder_io_outputs_2_aw_payload_prot; + wire axiIn_0_writeOnly_decoder_io_outputs_2_w_valid; + wire [31:0] axiIn_0_writeOnly_decoder_io_outputs_2_w_payload_data; + wire [3:0] axiIn_0_writeOnly_decoder_io_outputs_2_w_payload_strb; + wire axiIn_0_writeOnly_decoder_io_outputs_2_w_payload_last; + wire axiIn_0_writeOnly_decoder_io_outputs_2_b_ready; + wire axiIn_0_writeOnly_decoder_io_outputs_3_aw_valid; + wire [31:0] axiIn_0_writeOnly_decoder_io_outputs_3_aw_payload_addr; + wire [3:0] axiIn_0_writeOnly_decoder_io_outputs_3_aw_payload_id; + wire [7:0] axiIn_0_writeOnly_decoder_io_outputs_3_aw_payload_len; + wire [2:0] axiIn_0_writeOnly_decoder_io_outputs_3_aw_payload_size; + wire [1:0] axiIn_0_writeOnly_decoder_io_outputs_3_aw_payload_burst; + wire [0:0] axiIn_0_writeOnly_decoder_io_outputs_3_aw_payload_lock; + wire [3:0] axiIn_0_writeOnly_decoder_io_outputs_3_aw_payload_cache; + wire [2:0] axiIn_0_writeOnly_decoder_io_outputs_3_aw_payload_prot; + wire axiIn_0_writeOnly_decoder_io_outputs_3_w_valid; + wire [31:0] axiIn_0_writeOnly_decoder_io_outputs_3_w_payload_data; + wire [3:0] axiIn_0_writeOnly_decoder_io_outputs_3_w_payload_strb; + wire axiIn_0_writeOnly_decoder_io_outputs_3_w_payload_last; + wire axiIn_0_writeOnly_decoder_io_outputs_3_b_ready; + wire axiIn_0_writeOnly_decoder_io_outputs_4_aw_valid; + wire [31:0] axiIn_0_writeOnly_decoder_io_outputs_4_aw_payload_addr; + wire [3:0] axiIn_0_writeOnly_decoder_io_outputs_4_aw_payload_id; + wire [7:0] axiIn_0_writeOnly_decoder_io_outputs_4_aw_payload_len; + wire [2:0] axiIn_0_writeOnly_decoder_io_outputs_4_aw_payload_size; + wire [1:0] axiIn_0_writeOnly_decoder_io_outputs_4_aw_payload_burst; + wire [0:0] axiIn_0_writeOnly_decoder_io_outputs_4_aw_payload_lock; + wire [3:0] axiIn_0_writeOnly_decoder_io_outputs_4_aw_payload_cache; + wire [2:0] axiIn_0_writeOnly_decoder_io_outputs_4_aw_payload_prot; + wire axiIn_0_writeOnly_decoder_io_outputs_4_w_valid; + wire [31:0] axiIn_0_writeOnly_decoder_io_outputs_4_w_payload_data; + wire [3:0] axiIn_0_writeOnly_decoder_io_outputs_4_w_payload_strb; + wire axiIn_0_writeOnly_decoder_io_outputs_4_w_payload_last; + wire axiIn_0_writeOnly_decoder_io_outputs_4_b_ready; + wire axiIn_0_writeOnly_decoder_io_outputs_5_aw_valid; + wire [31:0] axiIn_0_writeOnly_decoder_io_outputs_5_aw_payload_addr; + wire [3:0] axiIn_0_writeOnly_decoder_io_outputs_5_aw_payload_id; + wire [7:0] axiIn_0_writeOnly_decoder_io_outputs_5_aw_payload_len; + wire [2:0] axiIn_0_writeOnly_decoder_io_outputs_5_aw_payload_size; + wire [1:0] axiIn_0_writeOnly_decoder_io_outputs_5_aw_payload_burst; + wire [0:0] axiIn_0_writeOnly_decoder_io_outputs_5_aw_payload_lock; + wire [3:0] axiIn_0_writeOnly_decoder_io_outputs_5_aw_payload_cache; + wire [2:0] axiIn_0_writeOnly_decoder_io_outputs_5_aw_payload_prot; + wire axiIn_0_writeOnly_decoder_io_outputs_5_w_valid; + wire [31:0] axiIn_0_writeOnly_decoder_io_outputs_5_w_payload_data; + wire [3:0] axiIn_0_writeOnly_decoder_io_outputs_5_w_payload_strb; + wire axiIn_0_writeOnly_decoder_io_outputs_5_w_payload_last; + wire axiIn_0_writeOnly_decoder_io_outputs_5_b_ready; + wire axiIn_0_writeOnly_decoder_io_outputs_6_aw_valid; + wire [31:0] axiIn_0_writeOnly_decoder_io_outputs_6_aw_payload_addr; + wire [3:0] axiIn_0_writeOnly_decoder_io_outputs_6_aw_payload_id; + wire [7:0] axiIn_0_writeOnly_decoder_io_outputs_6_aw_payload_len; + wire [2:0] axiIn_0_writeOnly_decoder_io_outputs_6_aw_payload_size; + wire [1:0] axiIn_0_writeOnly_decoder_io_outputs_6_aw_payload_burst; + wire [0:0] axiIn_0_writeOnly_decoder_io_outputs_6_aw_payload_lock; + wire [3:0] axiIn_0_writeOnly_decoder_io_outputs_6_aw_payload_cache; + wire [2:0] axiIn_0_writeOnly_decoder_io_outputs_6_aw_payload_prot; + wire axiIn_0_writeOnly_decoder_io_outputs_6_w_valid; + wire [31:0] axiIn_0_writeOnly_decoder_io_outputs_6_w_payload_data; + wire [3:0] axiIn_0_writeOnly_decoder_io_outputs_6_w_payload_strb; + wire axiIn_0_writeOnly_decoder_io_outputs_6_w_payload_last; + wire axiIn_0_writeOnly_decoder_io_outputs_6_b_ready; + wire axiIn_0_writeOnly_decoder_io_outputs_7_aw_valid; + wire [31:0] axiIn_0_writeOnly_decoder_io_outputs_7_aw_payload_addr; + wire [3:0] axiIn_0_writeOnly_decoder_io_outputs_7_aw_payload_id; + wire [7:0] axiIn_0_writeOnly_decoder_io_outputs_7_aw_payload_len; + wire [2:0] axiIn_0_writeOnly_decoder_io_outputs_7_aw_payload_size; + wire [1:0] axiIn_0_writeOnly_decoder_io_outputs_7_aw_payload_burst; + wire [0:0] axiIn_0_writeOnly_decoder_io_outputs_7_aw_payload_lock; + wire [3:0] axiIn_0_writeOnly_decoder_io_outputs_7_aw_payload_cache; + wire [2:0] axiIn_0_writeOnly_decoder_io_outputs_7_aw_payload_prot; + wire axiIn_0_writeOnly_decoder_io_outputs_7_w_valid; + wire [31:0] axiIn_0_writeOnly_decoder_io_outputs_7_w_payload_data; + wire [3:0] axiIn_0_writeOnly_decoder_io_outputs_7_w_payload_strb; + wire axiIn_0_writeOnly_decoder_io_outputs_7_w_payload_last; + wire axiIn_0_writeOnly_decoder_io_outputs_7_b_ready; + wire axiIn_1_readOnly_decoder_io_input_ar_ready; + wire axiIn_1_readOnly_decoder_io_input_r_valid; + wire [31:0] axiIn_1_readOnly_decoder_io_input_r_payload_data; + wire [3:0] axiIn_1_readOnly_decoder_io_input_r_payload_id; + wire [1:0] axiIn_1_readOnly_decoder_io_input_r_payload_resp; + wire axiIn_1_readOnly_decoder_io_input_r_payload_last; + wire axiIn_1_readOnly_decoder_io_outputs_0_ar_valid; + wire [31:0] axiIn_1_readOnly_decoder_io_outputs_0_ar_payload_addr; + wire [3:0] axiIn_1_readOnly_decoder_io_outputs_0_ar_payload_id; + wire [7:0] axiIn_1_readOnly_decoder_io_outputs_0_ar_payload_len; + wire [2:0] axiIn_1_readOnly_decoder_io_outputs_0_ar_payload_size; + wire [1:0] axiIn_1_readOnly_decoder_io_outputs_0_ar_payload_burst; + wire [0:0] axiIn_1_readOnly_decoder_io_outputs_0_ar_payload_lock; + wire [3:0] axiIn_1_readOnly_decoder_io_outputs_0_ar_payload_cache; + wire [2:0] axiIn_1_readOnly_decoder_io_outputs_0_ar_payload_prot; + wire axiIn_1_readOnly_decoder_io_outputs_0_r_ready; + wire axiIn_1_readOnly_decoder_io_outputs_1_ar_valid; + wire [31:0] axiIn_1_readOnly_decoder_io_outputs_1_ar_payload_addr; + wire [3:0] axiIn_1_readOnly_decoder_io_outputs_1_ar_payload_id; + wire [7:0] axiIn_1_readOnly_decoder_io_outputs_1_ar_payload_len; + wire [2:0] axiIn_1_readOnly_decoder_io_outputs_1_ar_payload_size; + wire [1:0] axiIn_1_readOnly_decoder_io_outputs_1_ar_payload_burst; + wire [0:0] axiIn_1_readOnly_decoder_io_outputs_1_ar_payload_lock; + wire [3:0] axiIn_1_readOnly_decoder_io_outputs_1_ar_payload_cache; + wire [2:0] axiIn_1_readOnly_decoder_io_outputs_1_ar_payload_prot; + wire axiIn_1_readOnly_decoder_io_outputs_1_r_ready; + wire axiIn_1_readOnly_decoder_io_outputs_2_ar_valid; + wire [31:0] axiIn_1_readOnly_decoder_io_outputs_2_ar_payload_addr; + wire [3:0] axiIn_1_readOnly_decoder_io_outputs_2_ar_payload_id; + wire [7:0] axiIn_1_readOnly_decoder_io_outputs_2_ar_payload_len; + wire [2:0] axiIn_1_readOnly_decoder_io_outputs_2_ar_payload_size; + wire [1:0] axiIn_1_readOnly_decoder_io_outputs_2_ar_payload_burst; + wire [0:0] axiIn_1_readOnly_decoder_io_outputs_2_ar_payload_lock; + wire [3:0] axiIn_1_readOnly_decoder_io_outputs_2_ar_payload_cache; + wire [2:0] axiIn_1_readOnly_decoder_io_outputs_2_ar_payload_prot; + wire axiIn_1_readOnly_decoder_io_outputs_2_r_ready; + wire axiIn_1_readOnly_decoder_io_outputs_3_ar_valid; + wire [31:0] axiIn_1_readOnly_decoder_io_outputs_3_ar_payload_addr; + wire [3:0] axiIn_1_readOnly_decoder_io_outputs_3_ar_payload_id; + wire [7:0] axiIn_1_readOnly_decoder_io_outputs_3_ar_payload_len; + wire [2:0] axiIn_1_readOnly_decoder_io_outputs_3_ar_payload_size; + wire [1:0] axiIn_1_readOnly_decoder_io_outputs_3_ar_payload_burst; + wire [0:0] axiIn_1_readOnly_decoder_io_outputs_3_ar_payload_lock; + wire [3:0] axiIn_1_readOnly_decoder_io_outputs_3_ar_payload_cache; + wire [2:0] axiIn_1_readOnly_decoder_io_outputs_3_ar_payload_prot; + wire axiIn_1_readOnly_decoder_io_outputs_3_r_ready; + wire axiIn_1_writeOnly_decoder_io_input_aw_ready; + wire axiIn_1_writeOnly_decoder_io_input_w_ready; + wire axiIn_1_writeOnly_decoder_io_input_b_valid; + wire [3:0] axiIn_1_writeOnly_decoder_io_input_b_payload_id; + wire [1:0] axiIn_1_writeOnly_decoder_io_input_b_payload_resp; + wire axiIn_1_writeOnly_decoder_io_outputs_0_aw_valid; + wire [31:0] axiIn_1_writeOnly_decoder_io_outputs_0_aw_payload_addr; + wire [3:0] axiIn_1_writeOnly_decoder_io_outputs_0_aw_payload_id; + wire [7:0] axiIn_1_writeOnly_decoder_io_outputs_0_aw_payload_len; + wire [2:0] axiIn_1_writeOnly_decoder_io_outputs_0_aw_payload_size; + wire [1:0] axiIn_1_writeOnly_decoder_io_outputs_0_aw_payload_burst; + wire [0:0] axiIn_1_writeOnly_decoder_io_outputs_0_aw_payload_lock; + wire [3:0] axiIn_1_writeOnly_decoder_io_outputs_0_aw_payload_cache; + wire [2:0] axiIn_1_writeOnly_decoder_io_outputs_0_aw_payload_prot; + wire axiIn_1_writeOnly_decoder_io_outputs_0_w_valid; + wire [31:0] axiIn_1_writeOnly_decoder_io_outputs_0_w_payload_data; + wire [3:0] axiIn_1_writeOnly_decoder_io_outputs_0_w_payload_strb; + wire axiIn_1_writeOnly_decoder_io_outputs_0_w_payload_last; + wire axiIn_1_writeOnly_decoder_io_outputs_0_b_ready; + wire axiIn_1_writeOnly_decoder_io_outputs_1_aw_valid; + wire [31:0] axiIn_1_writeOnly_decoder_io_outputs_1_aw_payload_addr; + wire [3:0] axiIn_1_writeOnly_decoder_io_outputs_1_aw_payload_id; + wire [7:0] axiIn_1_writeOnly_decoder_io_outputs_1_aw_payload_len; + wire [2:0] axiIn_1_writeOnly_decoder_io_outputs_1_aw_payload_size; + wire [1:0] axiIn_1_writeOnly_decoder_io_outputs_1_aw_payload_burst; + wire [0:0] axiIn_1_writeOnly_decoder_io_outputs_1_aw_payload_lock; + wire [3:0] axiIn_1_writeOnly_decoder_io_outputs_1_aw_payload_cache; + wire [2:0] axiIn_1_writeOnly_decoder_io_outputs_1_aw_payload_prot; + wire axiIn_1_writeOnly_decoder_io_outputs_1_w_valid; + wire [31:0] axiIn_1_writeOnly_decoder_io_outputs_1_w_payload_data; + wire [3:0] axiIn_1_writeOnly_decoder_io_outputs_1_w_payload_strb; + wire axiIn_1_writeOnly_decoder_io_outputs_1_w_payload_last; + wire axiIn_1_writeOnly_decoder_io_outputs_1_b_ready; + wire axiIn_1_writeOnly_decoder_io_outputs_2_aw_valid; + wire [31:0] axiIn_1_writeOnly_decoder_io_outputs_2_aw_payload_addr; + wire [3:0] axiIn_1_writeOnly_decoder_io_outputs_2_aw_payload_id; + wire [7:0] axiIn_1_writeOnly_decoder_io_outputs_2_aw_payload_len; + wire [2:0] axiIn_1_writeOnly_decoder_io_outputs_2_aw_payload_size; + wire [1:0] axiIn_1_writeOnly_decoder_io_outputs_2_aw_payload_burst; + wire [0:0] axiIn_1_writeOnly_decoder_io_outputs_2_aw_payload_lock; + wire [3:0] axiIn_1_writeOnly_decoder_io_outputs_2_aw_payload_cache; + wire [2:0] axiIn_1_writeOnly_decoder_io_outputs_2_aw_payload_prot; + wire axiIn_1_writeOnly_decoder_io_outputs_2_w_valid; + wire [31:0] axiIn_1_writeOnly_decoder_io_outputs_2_w_payload_data; + wire [3:0] axiIn_1_writeOnly_decoder_io_outputs_2_w_payload_strb; + wire axiIn_1_writeOnly_decoder_io_outputs_2_w_payload_last; + wire axiIn_1_writeOnly_decoder_io_outputs_2_b_ready; + wire axiIn_1_writeOnly_decoder_io_outputs_3_aw_valid; + wire [31:0] axiIn_1_writeOnly_decoder_io_outputs_3_aw_payload_addr; + wire [3:0] axiIn_1_writeOnly_decoder_io_outputs_3_aw_payload_id; + wire [7:0] axiIn_1_writeOnly_decoder_io_outputs_3_aw_payload_len; + wire [2:0] axiIn_1_writeOnly_decoder_io_outputs_3_aw_payload_size; + wire [1:0] axiIn_1_writeOnly_decoder_io_outputs_3_aw_payload_burst; + wire [0:0] axiIn_1_writeOnly_decoder_io_outputs_3_aw_payload_lock; + wire [3:0] axiIn_1_writeOnly_decoder_io_outputs_3_aw_payload_cache; + wire [2:0] axiIn_1_writeOnly_decoder_io_outputs_3_aw_payload_prot; + wire axiIn_1_writeOnly_decoder_io_outputs_3_w_valid; + wire [31:0] axiIn_1_writeOnly_decoder_io_outputs_3_w_payload_data; + wire [3:0] axiIn_1_writeOnly_decoder_io_outputs_3_w_payload_strb; + wire axiIn_1_writeOnly_decoder_io_outputs_3_w_payload_last; + wire axiIn_1_writeOnly_decoder_io_outputs_3_b_ready; + wire axi4ReadOnlyArbiter_4_io_inputs_0_ar_ready; + wire axi4ReadOnlyArbiter_4_io_inputs_0_r_valid; + wire [31:0] axi4ReadOnlyArbiter_4_io_inputs_0_r_payload_data; + wire [3:0] axi4ReadOnlyArbiter_4_io_inputs_0_r_payload_id; + wire [1:0] axi4ReadOnlyArbiter_4_io_inputs_0_r_payload_resp; + wire axi4ReadOnlyArbiter_4_io_inputs_0_r_payload_last; + wire axi4ReadOnlyArbiter_4_io_inputs_1_ar_ready; + wire axi4ReadOnlyArbiter_4_io_inputs_1_r_valid; + wire [31:0] axi4ReadOnlyArbiter_4_io_inputs_1_r_payload_data; + wire [3:0] axi4ReadOnlyArbiter_4_io_inputs_1_r_payload_id; + wire [1:0] axi4ReadOnlyArbiter_4_io_inputs_1_r_payload_resp; + wire axi4ReadOnlyArbiter_4_io_inputs_1_r_payload_last; + wire axi4ReadOnlyArbiter_4_io_output_ar_valid; + wire [31:0] axi4ReadOnlyArbiter_4_io_output_ar_payload_addr; + wire [4:0] axi4ReadOnlyArbiter_4_io_output_ar_payload_id; + wire [7:0] axi4ReadOnlyArbiter_4_io_output_ar_payload_len; + wire [2:0] axi4ReadOnlyArbiter_4_io_output_ar_payload_size; + wire [1:0] axi4ReadOnlyArbiter_4_io_output_ar_payload_burst; + wire [0:0] axi4ReadOnlyArbiter_4_io_output_ar_payload_lock; + wire [3:0] axi4ReadOnlyArbiter_4_io_output_ar_payload_cache; + wire [2:0] axi4ReadOnlyArbiter_4_io_output_ar_payload_prot; + wire axi4ReadOnlyArbiter_4_io_output_r_ready; + wire axi4WriteOnlyArbiter_4_io_inputs_0_aw_ready; + wire axi4WriteOnlyArbiter_4_io_inputs_0_w_ready; + wire axi4WriteOnlyArbiter_4_io_inputs_0_b_valid; + wire [3:0] axi4WriteOnlyArbiter_4_io_inputs_0_b_payload_id; + wire [1:0] axi4WriteOnlyArbiter_4_io_inputs_0_b_payload_resp; + wire axi4WriteOnlyArbiter_4_io_inputs_1_aw_ready; + wire axi4WriteOnlyArbiter_4_io_inputs_1_w_ready; + wire axi4WriteOnlyArbiter_4_io_inputs_1_b_valid; + wire [3:0] axi4WriteOnlyArbiter_4_io_inputs_1_b_payload_id; + wire [1:0] axi4WriteOnlyArbiter_4_io_inputs_1_b_payload_resp; + wire axi4WriteOnlyArbiter_4_io_output_aw_valid; + wire [31:0] axi4WriteOnlyArbiter_4_io_output_aw_payload_addr; + wire [4:0] axi4WriteOnlyArbiter_4_io_output_aw_payload_id; + wire [7:0] axi4WriteOnlyArbiter_4_io_output_aw_payload_len; + wire [2:0] axi4WriteOnlyArbiter_4_io_output_aw_payload_size; + wire [1:0] axi4WriteOnlyArbiter_4_io_output_aw_payload_burst; + wire [0:0] axi4WriteOnlyArbiter_4_io_output_aw_payload_lock; + wire [3:0] axi4WriteOnlyArbiter_4_io_output_aw_payload_cache; + wire [2:0] axi4WriteOnlyArbiter_4_io_output_aw_payload_prot; + wire axi4WriteOnlyArbiter_4_io_output_w_valid; + wire [31:0] axi4WriteOnlyArbiter_4_io_output_w_payload_data; + wire [3:0] axi4WriteOnlyArbiter_4_io_output_w_payload_strb; + wire axi4WriteOnlyArbiter_4_io_output_w_payload_last; + wire axi4WriteOnlyArbiter_4_io_output_b_ready; + wire axi4ReadOnlyArbiter_5_io_inputs_0_ar_ready; + wire axi4ReadOnlyArbiter_5_io_inputs_0_r_valid; + wire [31:0] axi4ReadOnlyArbiter_5_io_inputs_0_r_payload_data; + wire [3:0] axi4ReadOnlyArbiter_5_io_inputs_0_r_payload_id; + wire [1:0] axi4ReadOnlyArbiter_5_io_inputs_0_r_payload_resp; + wire axi4ReadOnlyArbiter_5_io_inputs_0_r_payload_last; + wire axi4ReadOnlyArbiter_5_io_inputs_1_ar_ready; + wire axi4ReadOnlyArbiter_5_io_inputs_1_r_valid; + wire [31:0] axi4ReadOnlyArbiter_5_io_inputs_1_r_payload_data; + wire [3:0] axi4ReadOnlyArbiter_5_io_inputs_1_r_payload_id; + wire [1:0] axi4ReadOnlyArbiter_5_io_inputs_1_r_payload_resp; + wire axi4ReadOnlyArbiter_5_io_inputs_1_r_payload_last; + wire axi4ReadOnlyArbiter_5_io_output_ar_valid; + wire [31:0] axi4ReadOnlyArbiter_5_io_output_ar_payload_addr; + wire [4:0] axi4ReadOnlyArbiter_5_io_output_ar_payload_id; + wire [7:0] axi4ReadOnlyArbiter_5_io_output_ar_payload_len; + wire [2:0] axi4ReadOnlyArbiter_5_io_output_ar_payload_size; + wire [1:0] axi4ReadOnlyArbiter_5_io_output_ar_payload_burst; + wire [0:0] axi4ReadOnlyArbiter_5_io_output_ar_payload_lock; + wire [3:0] axi4ReadOnlyArbiter_5_io_output_ar_payload_cache; + wire [2:0] axi4ReadOnlyArbiter_5_io_output_ar_payload_prot; + wire axi4ReadOnlyArbiter_5_io_output_r_ready; + wire axi4WriteOnlyArbiter_5_io_inputs_0_aw_ready; + wire axi4WriteOnlyArbiter_5_io_inputs_0_w_ready; + wire axi4WriteOnlyArbiter_5_io_inputs_0_b_valid; + wire [3:0] axi4WriteOnlyArbiter_5_io_inputs_0_b_payload_id; + wire [1:0] axi4WriteOnlyArbiter_5_io_inputs_0_b_payload_resp; + wire axi4WriteOnlyArbiter_5_io_inputs_1_aw_ready; + wire axi4WriteOnlyArbiter_5_io_inputs_1_w_ready; + wire axi4WriteOnlyArbiter_5_io_inputs_1_b_valid; + wire [3:0] axi4WriteOnlyArbiter_5_io_inputs_1_b_payload_id; + wire [1:0] axi4WriteOnlyArbiter_5_io_inputs_1_b_payload_resp; + wire axi4WriteOnlyArbiter_5_io_output_aw_valid; + wire [31:0] axi4WriteOnlyArbiter_5_io_output_aw_payload_addr; + wire [4:0] axi4WriteOnlyArbiter_5_io_output_aw_payload_id; + wire [7:0] axi4WriteOnlyArbiter_5_io_output_aw_payload_len; + wire [2:0] axi4WriteOnlyArbiter_5_io_output_aw_payload_size; + wire [1:0] axi4WriteOnlyArbiter_5_io_output_aw_payload_burst; + wire [0:0] axi4WriteOnlyArbiter_5_io_output_aw_payload_lock; + wire [3:0] axi4WriteOnlyArbiter_5_io_output_aw_payload_cache; + wire [2:0] axi4WriteOnlyArbiter_5_io_output_aw_payload_prot; + wire axi4WriteOnlyArbiter_5_io_output_w_valid; + wire [31:0] axi4WriteOnlyArbiter_5_io_output_w_payload_data; + wire [3:0] axi4WriteOnlyArbiter_5_io_output_w_payload_strb; + wire axi4WriteOnlyArbiter_5_io_output_w_payload_last; + wire axi4WriteOnlyArbiter_5_io_output_b_ready; + wire axi4ReadOnlyArbiter_6_io_inputs_0_ar_ready; + wire axi4ReadOnlyArbiter_6_io_inputs_0_r_valid; + wire [31:0] axi4ReadOnlyArbiter_6_io_inputs_0_r_payload_data; + wire [3:0] axi4ReadOnlyArbiter_6_io_inputs_0_r_payload_id; + wire [1:0] axi4ReadOnlyArbiter_6_io_inputs_0_r_payload_resp; + wire axi4ReadOnlyArbiter_6_io_inputs_0_r_payload_last; + wire axi4ReadOnlyArbiter_6_io_inputs_1_ar_ready; + wire axi4ReadOnlyArbiter_6_io_inputs_1_r_valid; + wire [31:0] axi4ReadOnlyArbiter_6_io_inputs_1_r_payload_data; + wire [3:0] axi4ReadOnlyArbiter_6_io_inputs_1_r_payload_id; + wire [1:0] axi4ReadOnlyArbiter_6_io_inputs_1_r_payload_resp; + wire axi4ReadOnlyArbiter_6_io_inputs_1_r_payload_last; + wire axi4ReadOnlyArbiter_6_io_output_ar_valid; + wire [31:0] axi4ReadOnlyArbiter_6_io_output_ar_payload_addr; + wire [4:0] axi4ReadOnlyArbiter_6_io_output_ar_payload_id; + wire [7:0] axi4ReadOnlyArbiter_6_io_output_ar_payload_len; + wire [2:0] axi4ReadOnlyArbiter_6_io_output_ar_payload_size; + wire [1:0] axi4ReadOnlyArbiter_6_io_output_ar_payload_burst; + wire [0:0] axi4ReadOnlyArbiter_6_io_output_ar_payload_lock; + wire [3:0] axi4ReadOnlyArbiter_6_io_output_ar_payload_cache; + wire [2:0] axi4ReadOnlyArbiter_6_io_output_ar_payload_prot; + wire axi4ReadOnlyArbiter_6_io_output_r_ready; + wire axi4WriteOnlyArbiter_6_io_inputs_0_aw_ready; + wire axi4WriteOnlyArbiter_6_io_inputs_0_w_ready; + wire axi4WriteOnlyArbiter_6_io_inputs_0_b_valid; + wire [3:0] axi4WriteOnlyArbiter_6_io_inputs_0_b_payload_id; + wire [1:0] axi4WriteOnlyArbiter_6_io_inputs_0_b_payload_resp; + wire axi4WriteOnlyArbiter_6_io_inputs_1_aw_ready; + wire axi4WriteOnlyArbiter_6_io_inputs_1_w_ready; + wire axi4WriteOnlyArbiter_6_io_inputs_1_b_valid; + wire [3:0] axi4WriteOnlyArbiter_6_io_inputs_1_b_payload_id; + wire [1:0] axi4WriteOnlyArbiter_6_io_inputs_1_b_payload_resp; + wire axi4WriteOnlyArbiter_6_io_output_aw_valid; + wire [31:0] axi4WriteOnlyArbiter_6_io_output_aw_payload_addr; + wire [4:0] axi4WriteOnlyArbiter_6_io_output_aw_payload_id; + wire [7:0] axi4WriteOnlyArbiter_6_io_output_aw_payload_len; + wire [2:0] axi4WriteOnlyArbiter_6_io_output_aw_payload_size; + wire [1:0] axi4WriteOnlyArbiter_6_io_output_aw_payload_burst; + wire [0:0] axi4WriteOnlyArbiter_6_io_output_aw_payload_lock; + wire [3:0] axi4WriteOnlyArbiter_6_io_output_aw_payload_cache; + wire [2:0] axi4WriteOnlyArbiter_6_io_output_aw_payload_prot; + wire axi4WriteOnlyArbiter_6_io_output_w_valid; + wire [31:0] axi4WriteOnlyArbiter_6_io_output_w_payload_data; + wire [3:0] axi4WriteOnlyArbiter_6_io_output_w_payload_strb; + wire axi4WriteOnlyArbiter_6_io_output_w_payload_last; + wire axi4WriteOnlyArbiter_6_io_output_b_ready; + wire axi4ReadOnlyArbiter_7_io_inputs_0_ar_ready; + wire axi4ReadOnlyArbiter_7_io_inputs_0_r_valid; + wire [31:0] axi4ReadOnlyArbiter_7_io_inputs_0_r_payload_data; + wire [3:0] axi4ReadOnlyArbiter_7_io_inputs_0_r_payload_id; + wire [1:0] axi4ReadOnlyArbiter_7_io_inputs_0_r_payload_resp; + wire axi4ReadOnlyArbiter_7_io_inputs_0_r_payload_last; + wire axi4ReadOnlyArbiter_7_io_inputs_1_ar_ready; + wire axi4ReadOnlyArbiter_7_io_inputs_1_r_valid; + wire [31:0] axi4ReadOnlyArbiter_7_io_inputs_1_r_payload_data; + wire [3:0] axi4ReadOnlyArbiter_7_io_inputs_1_r_payload_id; + wire [1:0] axi4ReadOnlyArbiter_7_io_inputs_1_r_payload_resp; + wire axi4ReadOnlyArbiter_7_io_inputs_1_r_payload_last; + wire axi4ReadOnlyArbiter_7_io_output_ar_valid; + wire [31:0] axi4ReadOnlyArbiter_7_io_output_ar_payload_addr; + wire [4:0] axi4ReadOnlyArbiter_7_io_output_ar_payload_id; + wire [7:0] axi4ReadOnlyArbiter_7_io_output_ar_payload_len; + wire [2:0] axi4ReadOnlyArbiter_7_io_output_ar_payload_size; + wire [1:0] axi4ReadOnlyArbiter_7_io_output_ar_payload_burst; + wire [0:0] axi4ReadOnlyArbiter_7_io_output_ar_payload_lock; + wire [3:0] axi4ReadOnlyArbiter_7_io_output_ar_payload_cache; + wire [2:0] axi4ReadOnlyArbiter_7_io_output_ar_payload_prot; + wire axi4ReadOnlyArbiter_7_io_output_r_ready; + wire axi4WriteOnlyArbiter_7_io_inputs_0_aw_ready; + wire axi4WriteOnlyArbiter_7_io_inputs_0_w_ready; + wire axi4WriteOnlyArbiter_7_io_inputs_0_b_valid; + wire [3:0] axi4WriteOnlyArbiter_7_io_inputs_0_b_payload_id; + wire [1:0] axi4WriteOnlyArbiter_7_io_inputs_0_b_payload_resp; + wire axi4WriteOnlyArbiter_7_io_inputs_1_aw_ready; + wire axi4WriteOnlyArbiter_7_io_inputs_1_w_ready; + wire axi4WriteOnlyArbiter_7_io_inputs_1_b_valid; + wire [3:0] axi4WriteOnlyArbiter_7_io_inputs_1_b_payload_id; + wire [1:0] axi4WriteOnlyArbiter_7_io_inputs_1_b_payload_resp; + wire axi4WriteOnlyArbiter_7_io_output_aw_valid; + wire [31:0] axi4WriteOnlyArbiter_7_io_output_aw_payload_addr; + wire [4:0] axi4WriteOnlyArbiter_7_io_output_aw_payload_id; + wire [7:0] axi4WriteOnlyArbiter_7_io_output_aw_payload_len; + wire [2:0] axi4WriteOnlyArbiter_7_io_output_aw_payload_size; + wire [1:0] axi4WriteOnlyArbiter_7_io_output_aw_payload_burst; + wire [0:0] axi4WriteOnlyArbiter_7_io_output_aw_payload_lock; + wire [3:0] axi4WriteOnlyArbiter_7_io_output_aw_payload_cache; + wire [2:0] axi4WriteOnlyArbiter_7_io_output_aw_payload_prot; + wire axi4WriteOnlyArbiter_7_io_output_w_valid; + wire [31:0] axi4WriteOnlyArbiter_7_io_output_w_payload_data; + wire [3:0] axi4WriteOnlyArbiter_7_io_output_w_payload_strb; + wire axi4WriteOnlyArbiter_7_io_output_w_payload_last; + wire axi4WriteOnlyArbiter_7_io_output_b_ready; + wire axiIn_0_readOnly_ar_valid; + wire axiIn_0_readOnly_ar_ready; + wire [31:0] axiIn_0_readOnly_ar_payload_addr; + wire [3:0] axiIn_0_readOnly_ar_payload_id; + wire [7:0] axiIn_0_readOnly_ar_payload_len; + wire [2:0] axiIn_0_readOnly_ar_payload_size; + wire [1:0] axiIn_0_readOnly_ar_payload_burst; + wire [0:0] axiIn_0_readOnly_ar_payload_lock; + wire [3:0] axiIn_0_readOnly_ar_payload_cache; + wire [2:0] axiIn_0_readOnly_ar_payload_prot; + wire axiIn_0_readOnly_r_valid; + wire axiIn_0_readOnly_r_ready; + wire [31:0] axiIn_0_readOnly_r_payload_data; + wire [3:0] axiIn_0_readOnly_r_payload_id; + wire [1:0] axiIn_0_readOnly_r_payload_resp; + wire axiIn_0_readOnly_r_payload_last; + wire axiIn_0_writeOnly_aw_valid; + wire axiIn_0_writeOnly_aw_ready; + wire [31:0] axiIn_0_writeOnly_aw_payload_addr; + wire [3:0] axiIn_0_writeOnly_aw_payload_id; + wire [7:0] axiIn_0_writeOnly_aw_payload_len; + wire [2:0] axiIn_0_writeOnly_aw_payload_size; + wire [1:0] axiIn_0_writeOnly_aw_payload_burst; + wire [0:0] axiIn_0_writeOnly_aw_payload_lock; + wire [3:0] axiIn_0_writeOnly_aw_payload_cache; + wire [2:0] axiIn_0_writeOnly_aw_payload_prot; + wire axiIn_0_writeOnly_w_valid; + wire axiIn_0_writeOnly_w_ready; + wire [31:0] axiIn_0_writeOnly_w_payload_data; + wire [3:0] axiIn_0_writeOnly_w_payload_strb; + wire axiIn_0_writeOnly_w_payload_last; + wire axiIn_0_writeOnly_b_valid; + wire axiIn_0_writeOnly_b_ready; + wire [3:0] axiIn_0_writeOnly_b_payload_id; + wire [1:0] axiIn_0_writeOnly_b_payload_resp; + wire axiIn_1_readOnly_ar_valid; + wire axiIn_1_readOnly_ar_ready; + wire [31:0] axiIn_1_readOnly_ar_payload_addr; + wire [3:0] axiIn_1_readOnly_ar_payload_id; + wire [7:0] axiIn_1_readOnly_ar_payload_len; + wire [2:0] axiIn_1_readOnly_ar_payload_size; + wire [1:0] axiIn_1_readOnly_ar_payload_burst; + wire [0:0] axiIn_1_readOnly_ar_payload_lock; + wire [3:0] axiIn_1_readOnly_ar_payload_cache; + wire [2:0] axiIn_1_readOnly_ar_payload_prot; + wire axiIn_1_readOnly_r_valid; + wire axiIn_1_readOnly_r_ready; + wire [31:0] axiIn_1_readOnly_r_payload_data; + wire [3:0] axiIn_1_readOnly_r_payload_id; + wire [1:0] axiIn_1_readOnly_r_payload_resp; + wire axiIn_1_readOnly_r_payload_last; + wire axiIn_1_writeOnly_aw_valid; + wire axiIn_1_writeOnly_aw_ready; + wire [31:0] axiIn_1_writeOnly_aw_payload_addr; + wire [3:0] axiIn_1_writeOnly_aw_payload_id; + wire [7:0] axiIn_1_writeOnly_aw_payload_len; + wire [2:0] axiIn_1_writeOnly_aw_payload_size; + wire [1:0] axiIn_1_writeOnly_aw_payload_burst; + wire [0:0] axiIn_1_writeOnly_aw_payload_lock; + wire [3:0] axiIn_1_writeOnly_aw_payload_cache; + wire [2:0] axiIn_1_writeOnly_aw_payload_prot; + wire axiIn_1_writeOnly_w_valid; + wire axiIn_1_writeOnly_w_ready; + wire [31:0] axiIn_1_writeOnly_w_payload_data; + wire [3:0] axiIn_1_writeOnly_w_payload_strb; + wire axiIn_1_writeOnly_w_payload_last; + wire axiIn_1_writeOnly_b_valid; + wire axiIn_1_writeOnly_b_ready; + wire [3:0] axiIn_1_writeOnly_b_payload_id; + wire [1:0] axiIn_1_writeOnly_b_payload_resp; + wire toplevel_axiIn_0_readOnly_decoder_io_outputs_0_ar_validPipe_valid; + wire toplevel_axiIn_0_readOnly_decoder_io_outputs_0_ar_validPipe_ready; + wire [31:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_0_ar_validPipe_payload_addr; + wire [3:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_0_ar_validPipe_payload_id; + wire [7:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_0_ar_validPipe_payload_len; + wire [2:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_0_ar_validPipe_payload_size; + wire [1:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_0_ar_validPipe_payload_burst; + wire [0:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_0_ar_validPipe_payload_lock; + wire [3:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_0_ar_validPipe_payload_cache; + wire [2:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_0_ar_validPipe_payload_prot; + reg toplevel_axiIn_0_readOnly_decoder_io_outputs_0_ar_rValid; + wire toplevel_axiIn_0_readOnly_decoder_io_outputs_0_ar_validPipe_fire; + wire toplevel_axiIn_0_readOnly_decoder_io_outputs_1_ar_validPipe_valid; + wire toplevel_axiIn_0_readOnly_decoder_io_outputs_1_ar_validPipe_ready; + wire [31:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_1_ar_validPipe_payload_addr; + wire [3:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_1_ar_validPipe_payload_id; + wire [7:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_1_ar_validPipe_payload_len; + wire [2:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_1_ar_validPipe_payload_size; + wire [1:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_1_ar_validPipe_payload_burst; + wire [0:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_1_ar_validPipe_payload_lock; + wire [3:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_1_ar_validPipe_payload_cache; + wire [2:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_1_ar_validPipe_payload_prot; + reg toplevel_axiIn_0_readOnly_decoder_io_outputs_1_ar_rValid; + wire toplevel_axiIn_0_readOnly_decoder_io_outputs_1_ar_validPipe_fire; + wire toplevel_axiIn_0_readOnly_decoder_io_outputs_2_ar_validPipe_valid; + wire toplevel_axiIn_0_readOnly_decoder_io_outputs_2_ar_validPipe_ready; + wire [31:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_2_ar_validPipe_payload_addr; + wire [3:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_2_ar_validPipe_payload_id; + wire [7:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_2_ar_validPipe_payload_len; + wire [2:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_2_ar_validPipe_payload_size; + wire [1:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_2_ar_validPipe_payload_burst; + wire [0:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_2_ar_validPipe_payload_lock; + wire [3:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_2_ar_validPipe_payload_cache; + wire [2:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_2_ar_validPipe_payload_prot; + reg toplevel_axiIn_0_readOnly_decoder_io_outputs_2_ar_rValid; + wire toplevel_axiIn_0_readOnly_decoder_io_outputs_2_ar_validPipe_fire; + wire toplevel_axiIn_0_readOnly_decoder_io_outputs_3_ar_validPipe_valid; + wire toplevel_axiIn_0_readOnly_decoder_io_outputs_3_ar_validPipe_ready; + wire [31:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_3_ar_validPipe_payload_addr; + wire [3:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_3_ar_validPipe_payload_id; + wire [7:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_3_ar_validPipe_payload_len; + wire [2:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_3_ar_validPipe_payload_size; + wire [1:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_3_ar_validPipe_payload_burst; + wire [0:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_3_ar_validPipe_payload_lock; + wire [3:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_3_ar_validPipe_payload_cache; + wire [2:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_3_ar_validPipe_payload_prot; + reg toplevel_axiIn_0_readOnly_decoder_io_outputs_3_ar_rValid; + wire toplevel_axiIn_0_readOnly_decoder_io_outputs_3_ar_validPipe_fire; + wire toplevel_axiIn_0_readOnly_decoder_io_outputs_4_ar_validPipe_valid; + wire toplevel_axiIn_0_readOnly_decoder_io_outputs_4_ar_validPipe_ready; + wire [31:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_4_ar_validPipe_payload_addr; + wire [3:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_4_ar_validPipe_payload_id; + wire [7:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_4_ar_validPipe_payload_len; + wire [2:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_4_ar_validPipe_payload_size; + wire [1:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_4_ar_validPipe_payload_burst; + wire [0:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_4_ar_validPipe_payload_lock; + wire [3:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_4_ar_validPipe_payload_cache; + wire [2:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_4_ar_validPipe_payload_prot; + reg toplevel_axiIn_0_readOnly_decoder_io_outputs_4_ar_rValid; + wire toplevel_axiIn_0_readOnly_decoder_io_outputs_4_ar_validPipe_fire; + wire toplevel_axiIn_0_readOnly_decoder_io_outputs_5_ar_validPipe_valid; + wire toplevel_axiIn_0_readOnly_decoder_io_outputs_5_ar_validPipe_ready; + wire [31:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_5_ar_validPipe_payload_addr; + wire [3:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_5_ar_validPipe_payload_id; + wire [7:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_5_ar_validPipe_payload_len; + wire [2:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_5_ar_validPipe_payload_size; + wire [1:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_5_ar_validPipe_payload_burst; + wire [0:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_5_ar_validPipe_payload_lock; + wire [3:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_5_ar_validPipe_payload_cache; + wire [2:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_5_ar_validPipe_payload_prot; + reg toplevel_axiIn_0_readOnly_decoder_io_outputs_5_ar_rValid; + wire toplevel_axiIn_0_readOnly_decoder_io_outputs_5_ar_validPipe_fire; + wire toplevel_axiIn_0_readOnly_decoder_io_outputs_6_ar_validPipe_valid; + wire toplevel_axiIn_0_readOnly_decoder_io_outputs_6_ar_validPipe_ready; + wire [31:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_6_ar_validPipe_payload_addr; + wire [3:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_6_ar_validPipe_payload_id; + wire [7:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_6_ar_validPipe_payload_len; + wire [2:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_6_ar_validPipe_payload_size; + wire [1:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_6_ar_validPipe_payload_burst; + wire [0:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_6_ar_validPipe_payload_lock; + wire [3:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_6_ar_validPipe_payload_cache; + wire [2:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_6_ar_validPipe_payload_prot; + reg toplevel_axiIn_0_readOnly_decoder_io_outputs_6_ar_rValid; + wire toplevel_axiIn_0_readOnly_decoder_io_outputs_6_ar_validPipe_fire; + wire toplevel_axiIn_0_readOnly_decoder_io_outputs_7_ar_validPipe_valid; + wire toplevel_axiIn_0_readOnly_decoder_io_outputs_7_ar_validPipe_ready; + wire [31:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_7_ar_validPipe_payload_addr; + wire [3:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_7_ar_validPipe_payload_id; + wire [7:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_7_ar_validPipe_payload_len; + wire [2:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_7_ar_validPipe_payload_size; + wire [1:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_7_ar_validPipe_payload_burst; + wire [0:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_7_ar_validPipe_payload_lock; + wire [3:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_7_ar_validPipe_payload_cache; + wire [2:0] toplevel_axiIn_0_readOnly_decoder_io_outputs_7_ar_validPipe_payload_prot; + reg toplevel_axiIn_0_readOnly_decoder_io_outputs_7_ar_rValid; + wire toplevel_axiIn_0_readOnly_decoder_io_outputs_7_ar_validPipe_fire; + wire toplevel_axiIn_0_writeOnly_decoder_io_outputs_0_aw_validPipe_valid; + wire toplevel_axiIn_0_writeOnly_decoder_io_outputs_0_aw_validPipe_ready; + wire [31:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_0_aw_validPipe_payload_addr; + wire [3:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_0_aw_validPipe_payload_id; + wire [7:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_0_aw_validPipe_payload_len; + wire [2:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_0_aw_validPipe_payload_size; + wire [1:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_0_aw_validPipe_payload_burst; + wire [0:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_0_aw_validPipe_payload_lock; + wire [3:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_0_aw_validPipe_payload_cache; + wire [2:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_0_aw_validPipe_payload_prot; + reg toplevel_axiIn_0_writeOnly_decoder_io_outputs_0_aw_rValid; + wire toplevel_axiIn_0_writeOnly_decoder_io_outputs_0_aw_validPipe_fire; + wire toplevel_axiIn_0_writeOnly_decoder_io_outputs_1_aw_validPipe_valid; + wire toplevel_axiIn_0_writeOnly_decoder_io_outputs_1_aw_validPipe_ready; + wire [31:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_1_aw_validPipe_payload_addr; + wire [3:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_1_aw_validPipe_payload_id; + wire [7:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_1_aw_validPipe_payload_len; + wire [2:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_1_aw_validPipe_payload_size; + wire [1:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_1_aw_validPipe_payload_burst; + wire [0:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_1_aw_validPipe_payload_lock; + wire [3:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_1_aw_validPipe_payload_cache; + wire [2:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_1_aw_validPipe_payload_prot; + reg toplevel_axiIn_0_writeOnly_decoder_io_outputs_1_aw_rValid; + wire toplevel_axiIn_0_writeOnly_decoder_io_outputs_1_aw_validPipe_fire; + wire toplevel_axiIn_0_writeOnly_decoder_io_outputs_2_aw_validPipe_valid; + wire toplevel_axiIn_0_writeOnly_decoder_io_outputs_2_aw_validPipe_ready; + wire [31:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_2_aw_validPipe_payload_addr; + wire [3:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_2_aw_validPipe_payload_id; + wire [7:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_2_aw_validPipe_payload_len; + wire [2:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_2_aw_validPipe_payload_size; + wire [1:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_2_aw_validPipe_payload_burst; + wire [0:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_2_aw_validPipe_payload_lock; + wire [3:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_2_aw_validPipe_payload_cache; + wire [2:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_2_aw_validPipe_payload_prot; + reg toplevel_axiIn_0_writeOnly_decoder_io_outputs_2_aw_rValid; + wire toplevel_axiIn_0_writeOnly_decoder_io_outputs_2_aw_validPipe_fire; + wire toplevel_axiIn_0_writeOnly_decoder_io_outputs_3_aw_validPipe_valid; + wire toplevel_axiIn_0_writeOnly_decoder_io_outputs_3_aw_validPipe_ready; + wire [31:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_3_aw_validPipe_payload_addr; + wire [3:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_3_aw_validPipe_payload_id; + wire [7:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_3_aw_validPipe_payload_len; + wire [2:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_3_aw_validPipe_payload_size; + wire [1:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_3_aw_validPipe_payload_burst; + wire [0:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_3_aw_validPipe_payload_lock; + wire [3:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_3_aw_validPipe_payload_cache; + wire [2:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_3_aw_validPipe_payload_prot; + reg toplevel_axiIn_0_writeOnly_decoder_io_outputs_3_aw_rValid; + wire toplevel_axiIn_0_writeOnly_decoder_io_outputs_3_aw_validPipe_fire; + wire toplevel_axiIn_0_writeOnly_decoder_io_outputs_4_aw_validPipe_valid; + wire toplevel_axiIn_0_writeOnly_decoder_io_outputs_4_aw_validPipe_ready; + wire [31:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_4_aw_validPipe_payload_addr; + wire [3:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_4_aw_validPipe_payload_id; + wire [7:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_4_aw_validPipe_payload_len; + wire [2:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_4_aw_validPipe_payload_size; + wire [1:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_4_aw_validPipe_payload_burst; + wire [0:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_4_aw_validPipe_payload_lock; + wire [3:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_4_aw_validPipe_payload_cache; + wire [2:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_4_aw_validPipe_payload_prot; + reg toplevel_axiIn_0_writeOnly_decoder_io_outputs_4_aw_rValid; + wire toplevel_axiIn_0_writeOnly_decoder_io_outputs_4_aw_validPipe_fire; + wire toplevel_axiIn_0_writeOnly_decoder_io_outputs_5_aw_validPipe_valid; + wire toplevel_axiIn_0_writeOnly_decoder_io_outputs_5_aw_validPipe_ready; + wire [31:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_5_aw_validPipe_payload_addr; + wire [3:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_5_aw_validPipe_payload_id; + wire [7:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_5_aw_validPipe_payload_len; + wire [2:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_5_aw_validPipe_payload_size; + wire [1:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_5_aw_validPipe_payload_burst; + wire [0:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_5_aw_validPipe_payload_lock; + wire [3:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_5_aw_validPipe_payload_cache; + wire [2:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_5_aw_validPipe_payload_prot; + reg toplevel_axiIn_0_writeOnly_decoder_io_outputs_5_aw_rValid; + wire toplevel_axiIn_0_writeOnly_decoder_io_outputs_5_aw_validPipe_fire; + wire toplevel_axiIn_0_writeOnly_decoder_io_outputs_6_aw_validPipe_valid; + wire toplevel_axiIn_0_writeOnly_decoder_io_outputs_6_aw_validPipe_ready; + wire [31:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_6_aw_validPipe_payload_addr; + wire [3:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_6_aw_validPipe_payload_id; + wire [7:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_6_aw_validPipe_payload_len; + wire [2:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_6_aw_validPipe_payload_size; + wire [1:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_6_aw_validPipe_payload_burst; + wire [0:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_6_aw_validPipe_payload_lock; + wire [3:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_6_aw_validPipe_payload_cache; + wire [2:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_6_aw_validPipe_payload_prot; + reg toplevel_axiIn_0_writeOnly_decoder_io_outputs_6_aw_rValid; + wire toplevel_axiIn_0_writeOnly_decoder_io_outputs_6_aw_validPipe_fire; + wire toplevel_axiIn_0_writeOnly_decoder_io_outputs_7_aw_validPipe_valid; + wire toplevel_axiIn_0_writeOnly_decoder_io_outputs_7_aw_validPipe_ready; + wire [31:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_7_aw_validPipe_payload_addr; + wire [3:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_7_aw_validPipe_payload_id; + wire [7:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_7_aw_validPipe_payload_len; + wire [2:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_7_aw_validPipe_payload_size; + wire [1:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_7_aw_validPipe_payload_burst; + wire [0:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_7_aw_validPipe_payload_lock; + wire [3:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_7_aw_validPipe_payload_cache; + wire [2:0] toplevel_axiIn_0_writeOnly_decoder_io_outputs_7_aw_validPipe_payload_prot; + reg toplevel_axiIn_0_writeOnly_decoder_io_outputs_7_aw_rValid; + wire toplevel_axiIn_0_writeOnly_decoder_io_outputs_7_aw_validPipe_fire; + wire toplevel_axiIn_1_readOnly_decoder_io_outputs_0_ar_validPipe_valid; + wire toplevel_axiIn_1_readOnly_decoder_io_outputs_0_ar_validPipe_ready; + wire [31:0] toplevel_axiIn_1_readOnly_decoder_io_outputs_0_ar_validPipe_payload_addr; + wire [3:0] toplevel_axiIn_1_readOnly_decoder_io_outputs_0_ar_validPipe_payload_id; + wire [7:0] toplevel_axiIn_1_readOnly_decoder_io_outputs_0_ar_validPipe_payload_len; + wire [2:0] toplevel_axiIn_1_readOnly_decoder_io_outputs_0_ar_validPipe_payload_size; + wire [1:0] toplevel_axiIn_1_readOnly_decoder_io_outputs_0_ar_validPipe_payload_burst; + wire [0:0] toplevel_axiIn_1_readOnly_decoder_io_outputs_0_ar_validPipe_payload_lock; + wire [3:0] toplevel_axiIn_1_readOnly_decoder_io_outputs_0_ar_validPipe_payload_cache; + wire [2:0] toplevel_axiIn_1_readOnly_decoder_io_outputs_0_ar_validPipe_payload_prot; + reg toplevel_axiIn_1_readOnly_decoder_io_outputs_0_ar_rValid; + wire toplevel_axiIn_1_readOnly_decoder_io_outputs_0_ar_validPipe_fire; + wire toplevel_axiIn_1_readOnly_decoder_io_outputs_1_ar_validPipe_valid; + wire toplevel_axiIn_1_readOnly_decoder_io_outputs_1_ar_validPipe_ready; + wire [31:0] toplevel_axiIn_1_readOnly_decoder_io_outputs_1_ar_validPipe_payload_addr; + wire [3:0] toplevel_axiIn_1_readOnly_decoder_io_outputs_1_ar_validPipe_payload_id; + wire [7:0] toplevel_axiIn_1_readOnly_decoder_io_outputs_1_ar_validPipe_payload_len; + wire [2:0] toplevel_axiIn_1_readOnly_decoder_io_outputs_1_ar_validPipe_payload_size; + wire [1:0] toplevel_axiIn_1_readOnly_decoder_io_outputs_1_ar_validPipe_payload_burst; + wire [0:0] toplevel_axiIn_1_readOnly_decoder_io_outputs_1_ar_validPipe_payload_lock; + wire [3:0] toplevel_axiIn_1_readOnly_decoder_io_outputs_1_ar_validPipe_payload_cache; + wire [2:0] toplevel_axiIn_1_readOnly_decoder_io_outputs_1_ar_validPipe_payload_prot; + reg toplevel_axiIn_1_readOnly_decoder_io_outputs_1_ar_rValid; + wire toplevel_axiIn_1_readOnly_decoder_io_outputs_1_ar_validPipe_fire; + wire toplevel_axiIn_1_readOnly_decoder_io_outputs_2_ar_validPipe_valid; + wire toplevel_axiIn_1_readOnly_decoder_io_outputs_2_ar_validPipe_ready; + wire [31:0] toplevel_axiIn_1_readOnly_decoder_io_outputs_2_ar_validPipe_payload_addr; + wire [3:0] toplevel_axiIn_1_readOnly_decoder_io_outputs_2_ar_validPipe_payload_id; + wire [7:0] toplevel_axiIn_1_readOnly_decoder_io_outputs_2_ar_validPipe_payload_len; + wire [2:0] toplevel_axiIn_1_readOnly_decoder_io_outputs_2_ar_validPipe_payload_size; + wire [1:0] toplevel_axiIn_1_readOnly_decoder_io_outputs_2_ar_validPipe_payload_burst; + wire [0:0] toplevel_axiIn_1_readOnly_decoder_io_outputs_2_ar_validPipe_payload_lock; + wire [3:0] toplevel_axiIn_1_readOnly_decoder_io_outputs_2_ar_validPipe_payload_cache; + wire [2:0] toplevel_axiIn_1_readOnly_decoder_io_outputs_2_ar_validPipe_payload_prot; + reg toplevel_axiIn_1_readOnly_decoder_io_outputs_2_ar_rValid; + wire toplevel_axiIn_1_readOnly_decoder_io_outputs_2_ar_validPipe_fire; + wire toplevel_axiIn_1_readOnly_decoder_io_outputs_3_ar_validPipe_valid; + wire toplevel_axiIn_1_readOnly_decoder_io_outputs_3_ar_validPipe_ready; + wire [31:0] toplevel_axiIn_1_readOnly_decoder_io_outputs_3_ar_validPipe_payload_addr; + wire [3:0] toplevel_axiIn_1_readOnly_decoder_io_outputs_3_ar_validPipe_payload_id; + wire [7:0] toplevel_axiIn_1_readOnly_decoder_io_outputs_3_ar_validPipe_payload_len; + wire [2:0] toplevel_axiIn_1_readOnly_decoder_io_outputs_3_ar_validPipe_payload_size; + wire [1:0] toplevel_axiIn_1_readOnly_decoder_io_outputs_3_ar_validPipe_payload_burst; + wire [0:0] toplevel_axiIn_1_readOnly_decoder_io_outputs_3_ar_validPipe_payload_lock; + wire [3:0] toplevel_axiIn_1_readOnly_decoder_io_outputs_3_ar_validPipe_payload_cache; + wire [2:0] toplevel_axiIn_1_readOnly_decoder_io_outputs_3_ar_validPipe_payload_prot; + reg toplevel_axiIn_1_readOnly_decoder_io_outputs_3_ar_rValid; + wire toplevel_axiIn_1_readOnly_decoder_io_outputs_3_ar_validPipe_fire; + wire toplevel_axiIn_1_writeOnly_decoder_io_outputs_0_aw_validPipe_valid; + wire toplevel_axiIn_1_writeOnly_decoder_io_outputs_0_aw_validPipe_ready; + wire [31:0] toplevel_axiIn_1_writeOnly_decoder_io_outputs_0_aw_validPipe_payload_addr; + wire [3:0] toplevel_axiIn_1_writeOnly_decoder_io_outputs_0_aw_validPipe_payload_id; + wire [7:0] toplevel_axiIn_1_writeOnly_decoder_io_outputs_0_aw_validPipe_payload_len; + wire [2:0] toplevel_axiIn_1_writeOnly_decoder_io_outputs_0_aw_validPipe_payload_size; + wire [1:0] toplevel_axiIn_1_writeOnly_decoder_io_outputs_0_aw_validPipe_payload_burst; + wire [0:0] toplevel_axiIn_1_writeOnly_decoder_io_outputs_0_aw_validPipe_payload_lock; + wire [3:0] toplevel_axiIn_1_writeOnly_decoder_io_outputs_0_aw_validPipe_payload_cache; + wire [2:0] toplevel_axiIn_1_writeOnly_decoder_io_outputs_0_aw_validPipe_payload_prot; + reg toplevel_axiIn_1_writeOnly_decoder_io_outputs_0_aw_rValid; + wire toplevel_axiIn_1_writeOnly_decoder_io_outputs_0_aw_validPipe_fire; + wire toplevel_axiIn_1_writeOnly_decoder_io_outputs_1_aw_validPipe_valid; + wire toplevel_axiIn_1_writeOnly_decoder_io_outputs_1_aw_validPipe_ready; + wire [31:0] toplevel_axiIn_1_writeOnly_decoder_io_outputs_1_aw_validPipe_payload_addr; + wire [3:0] toplevel_axiIn_1_writeOnly_decoder_io_outputs_1_aw_validPipe_payload_id; + wire [7:0] toplevel_axiIn_1_writeOnly_decoder_io_outputs_1_aw_validPipe_payload_len; + wire [2:0] toplevel_axiIn_1_writeOnly_decoder_io_outputs_1_aw_validPipe_payload_size; + wire [1:0] toplevel_axiIn_1_writeOnly_decoder_io_outputs_1_aw_validPipe_payload_burst; + wire [0:0] toplevel_axiIn_1_writeOnly_decoder_io_outputs_1_aw_validPipe_payload_lock; + wire [3:0] toplevel_axiIn_1_writeOnly_decoder_io_outputs_1_aw_validPipe_payload_cache; + wire [2:0] toplevel_axiIn_1_writeOnly_decoder_io_outputs_1_aw_validPipe_payload_prot; + reg toplevel_axiIn_1_writeOnly_decoder_io_outputs_1_aw_rValid; + wire toplevel_axiIn_1_writeOnly_decoder_io_outputs_1_aw_validPipe_fire; + wire toplevel_axiIn_1_writeOnly_decoder_io_outputs_2_aw_validPipe_valid; + wire toplevel_axiIn_1_writeOnly_decoder_io_outputs_2_aw_validPipe_ready; + wire [31:0] toplevel_axiIn_1_writeOnly_decoder_io_outputs_2_aw_validPipe_payload_addr; + wire [3:0] toplevel_axiIn_1_writeOnly_decoder_io_outputs_2_aw_validPipe_payload_id; + wire [7:0] toplevel_axiIn_1_writeOnly_decoder_io_outputs_2_aw_validPipe_payload_len; + wire [2:0] toplevel_axiIn_1_writeOnly_decoder_io_outputs_2_aw_validPipe_payload_size; + wire [1:0] toplevel_axiIn_1_writeOnly_decoder_io_outputs_2_aw_validPipe_payload_burst; + wire [0:0] toplevel_axiIn_1_writeOnly_decoder_io_outputs_2_aw_validPipe_payload_lock; + wire [3:0] toplevel_axiIn_1_writeOnly_decoder_io_outputs_2_aw_validPipe_payload_cache; + wire [2:0] toplevel_axiIn_1_writeOnly_decoder_io_outputs_2_aw_validPipe_payload_prot; + reg toplevel_axiIn_1_writeOnly_decoder_io_outputs_2_aw_rValid; + wire toplevel_axiIn_1_writeOnly_decoder_io_outputs_2_aw_validPipe_fire; + wire toplevel_axiIn_1_writeOnly_decoder_io_outputs_3_aw_validPipe_valid; + wire toplevel_axiIn_1_writeOnly_decoder_io_outputs_3_aw_validPipe_ready; + wire [31:0] toplevel_axiIn_1_writeOnly_decoder_io_outputs_3_aw_validPipe_payload_addr; + wire [3:0] toplevel_axiIn_1_writeOnly_decoder_io_outputs_3_aw_validPipe_payload_id; + wire [7:0] toplevel_axiIn_1_writeOnly_decoder_io_outputs_3_aw_validPipe_payload_len; + wire [2:0] toplevel_axiIn_1_writeOnly_decoder_io_outputs_3_aw_validPipe_payload_size; + wire [1:0] toplevel_axiIn_1_writeOnly_decoder_io_outputs_3_aw_validPipe_payload_burst; + wire [0:0] toplevel_axiIn_1_writeOnly_decoder_io_outputs_3_aw_validPipe_payload_lock; + wire [3:0] toplevel_axiIn_1_writeOnly_decoder_io_outputs_3_aw_validPipe_payload_cache; + wire [2:0] toplevel_axiIn_1_writeOnly_decoder_io_outputs_3_aw_validPipe_payload_prot; + reg toplevel_axiIn_1_writeOnly_decoder_io_outputs_3_aw_rValid; + wire toplevel_axiIn_1_writeOnly_decoder_io_outputs_3_aw_validPipe_fire; + + Axi4ReadOnlyDecoder axiIn_0_readOnly_decoder ( + .io_input_ar_valid (axiIn_0_readOnly_ar_valid ), //i + .io_input_ar_ready (axiIn_0_readOnly_decoder_io_input_ar_ready ), //o + .io_input_ar_payload_addr (axiIn_0_readOnly_ar_payload_addr[31:0] ), //i + .io_input_ar_payload_id (axiIn_0_readOnly_ar_payload_id[3:0] ), //i + .io_input_ar_payload_len (axiIn_0_readOnly_ar_payload_len[7:0] ), //i + .io_input_ar_payload_size (axiIn_0_readOnly_ar_payload_size[2:0] ), //i + .io_input_ar_payload_burst (axiIn_0_readOnly_ar_payload_burst[1:0] ), //i + .io_input_ar_payload_lock (axiIn_0_readOnly_ar_payload_lock ), //i + .io_input_ar_payload_cache (axiIn_0_readOnly_ar_payload_cache[3:0] ), //i + .io_input_ar_payload_prot (axiIn_0_readOnly_ar_payload_prot[2:0] ), //i + .io_input_r_valid (axiIn_0_readOnly_decoder_io_input_r_valid ), //o + .io_input_r_ready (axiIn_0_readOnly_r_ready ), //i + .io_input_r_payload_data (axiIn_0_readOnly_decoder_io_input_r_payload_data[31:0] ), //o + .io_input_r_payload_id (axiIn_0_readOnly_decoder_io_input_r_payload_id[3:0] ), //o + .io_input_r_payload_resp (axiIn_0_readOnly_decoder_io_input_r_payload_resp[1:0] ), //o + .io_input_r_payload_last (axiIn_0_readOnly_decoder_io_input_r_payload_last ), //o + .io_outputs_0_ar_valid (axiIn_0_readOnly_decoder_io_outputs_0_ar_valid ), //o + .io_outputs_0_ar_ready (toplevel_axiIn_0_readOnly_decoder_io_outputs_0_ar_validPipe_fire), //i + .io_outputs_0_ar_payload_addr (axiIn_0_readOnly_decoder_io_outputs_0_ar_payload_addr[31:0] ), //o + .io_outputs_0_ar_payload_id (axiIn_0_readOnly_decoder_io_outputs_0_ar_payload_id[3:0] ), //o + .io_outputs_0_ar_payload_len (axiIn_0_readOnly_decoder_io_outputs_0_ar_payload_len[7:0] ), //o + .io_outputs_0_ar_payload_size (axiIn_0_readOnly_decoder_io_outputs_0_ar_payload_size[2:0] ), //o + .io_outputs_0_ar_payload_burst (axiIn_0_readOnly_decoder_io_outputs_0_ar_payload_burst[1:0] ), //o + .io_outputs_0_ar_payload_lock (axiIn_0_readOnly_decoder_io_outputs_0_ar_payload_lock ), //o + .io_outputs_0_ar_payload_cache (axiIn_0_readOnly_decoder_io_outputs_0_ar_payload_cache[3:0] ), //o + .io_outputs_0_ar_payload_prot (axiIn_0_readOnly_decoder_io_outputs_0_ar_payload_prot[2:0] ), //o + .io_outputs_0_r_valid (axi4ReadOnlyArbiter_4_io_inputs_0_r_valid ), //i + .io_outputs_0_r_ready (axiIn_0_readOnly_decoder_io_outputs_0_r_ready ), //o + .io_outputs_0_r_payload_data (axi4ReadOnlyArbiter_4_io_inputs_0_r_payload_data[31:0] ), //i + .io_outputs_0_r_payload_id (axi4ReadOnlyArbiter_4_io_inputs_0_r_payload_id[3:0] ), //i + .io_outputs_0_r_payload_resp (axi4ReadOnlyArbiter_4_io_inputs_0_r_payload_resp[1:0] ), //i + .io_outputs_0_r_payload_last (axi4ReadOnlyArbiter_4_io_inputs_0_r_payload_last ), //i + .io_outputs_1_ar_valid (axiIn_0_readOnly_decoder_io_outputs_1_ar_valid ), //o + .io_outputs_1_ar_ready (toplevel_axiIn_0_readOnly_decoder_io_outputs_1_ar_validPipe_fire), //i + .io_outputs_1_ar_payload_addr (axiIn_0_readOnly_decoder_io_outputs_1_ar_payload_addr[31:0] ), //o + .io_outputs_1_ar_payload_id (axiIn_0_readOnly_decoder_io_outputs_1_ar_payload_id[3:0] ), //o + .io_outputs_1_ar_payload_len (axiIn_0_readOnly_decoder_io_outputs_1_ar_payload_len[7:0] ), //o + .io_outputs_1_ar_payload_size (axiIn_0_readOnly_decoder_io_outputs_1_ar_payload_size[2:0] ), //o + .io_outputs_1_ar_payload_burst (axiIn_0_readOnly_decoder_io_outputs_1_ar_payload_burst[1:0] ), //o + .io_outputs_1_ar_payload_lock (axiIn_0_readOnly_decoder_io_outputs_1_ar_payload_lock ), //o + .io_outputs_1_ar_payload_cache (axiIn_0_readOnly_decoder_io_outputs_1_ar_payload_cache[3:0] ), //o + .io_outputs_1_ar_payload_prot (axiIn_0_readOnly_decoder_io_outputs_1_ar_payload_prot[2:0] ), //o + .io_outputs_1_r_valid (axi4ReadOnlyArbiter_5_io_inputs_0_r_valid ), //i + .io_outputs_1_r_ready (axiIn_0_readOnly_decoder_io_outputs_1_r_ready ), //o + .io_outputs_1_r_payload_data (axi4ReadOnlyArbiter_5_io_inputs_0_r_payload_data[31:0] ), //i + .io_outputs_1_r_payload_id (axi4ReadOnlyArbiter_5_io_inputs_0_r_payload_id[3:0] ), //i + .io_outputs_1_r_payload_resp (axi4ReadOnlyArbiter_5_io_inputs_0_r_payload_resp[1:0] ), //i + .io_outputs_1_r_payload_last (axi4ReadOnlyArbiter_5_io_inputs_0_r_payload_last ), //i + .io_outputs_2_ar_valid (axiIn_0_readOnly_decoder_io_outputs_2_ar_valid ), //o + .io_outputs_2_ar_ready (toplevel_axiIn_0_readOnly_decoder_io_outputs_2_ar_validPipe_fire), //i + .io_outputs_2_ar_payload_addr (axiIn_0_readOnly_decoder_io_outputs_2_ar_payload_addr[31:0] ), //o + .io_outputs_2_ar_payload_id (axiIn_0_readOnly_decoder_io_outputs_2_ar_payload_id[3:0] ), //o + .io_outputs_2_ar_payload_len (axiIn_0_readOnly_decoder_io_outputs_2_ar_payload_len[7:0] ), //o + .io_outputs_2_ar_payload_size (axiIn_0_readOnly_decoder_io_outputs_2_ar_payload_size[2:0] ), //o + .io_outputs_2_ar_payload_burst (axiIn_0_readOnly_decoder_io_outputs_2_ar_payload_burst[1:0] ), //o + .io_outputs_2_ar_payload_lock (axiIn_0_readOnly_decoder_io_outputs_2_ar_payload_lock ), //o + .io_outputs_2_ar_payload_cache (axiIn_0_readOnly_decoder_io_outputs_2_ar_payload_cache[3:0] ), //o + .io_outputs_2_ar_payload_prot (axiIn_0_readOnly_decoder_io_outputs_2_ar_payload_prot[2:0] ), //o + .io_outputs_2_r_valid (axiOut_2_rvalid ), //i + .io_outputs_2_r_ready (axiIn_0_readOnly_decoder_io_outputs_2_r_ready ), //o + .io_outputs_2_r_payload_data (axiOut_2_rdata[31:0] ), //i + .io_outputs_2_r_payload_id (axiIn_0_readOnly_decoder_io_outputs_2_r_payload_id[3:0] ), //i + .io_outputs_2_r_payload_resp (axiOut_2_rresp[1:0] ), //i + .io_outputs_2_r_payload_last (axiOut_2_rlast ), //i + .io_outputs_3_ar_valid (axiIn_0_readOnly_decoder_io_outputs_3_ar_valid ), //o + .io_outputs_3_ar_ready (toplevel_axiIn_0_readOnly_decoder_io_outputs_3_ar_validPipe_fire), //i + .io_outputs_3_ar_payload_addr (axiIn_0_readOnly_decoder_io_outputs_3_ar_payload_addr[31:0] ), //o + .io_outputs_3_ar_payload_id (axiIn_0_readOnly_decoder_io_outputs_3_ar_payload_id[3:0] ), //o + .io_outputs_3_ar_payload_len (axiIn_0_readOnly_decoder_io_outputs_3_ar_payload_len[7:0] ), //o + .io_outputs_3_ar_payload_size (axiIn_0_readOnly_decoder_io_outputs_3_ar_payload_size[2:0] ), //o + .io_outputs_3_ar_payload_burst (axiIn_0_readOnly_decoder_io_outputs_3_ar_payload_burst[1:0] ), //o + .io_outputs_3_ar_payload_lock (axiIn_0_readOnly_decoder_io_outputs_3_ar_payload_lock ), //o + .io_outputs_3_ar_payload_cache (axiIn_0_readOnly_decoder_io_outputs_3_ar_payload_cache[3:0] ), //o + .io_outputs_3_ar_payload_prot (axiIn_0_readOnly_decoder_io_outputs_3_ar_payload_prot[2:0] ), //o + .io_outputs_3_r_valid (axiOut_3_rvalid ), //i + .io_outputs_3_r_ready (axiIn_0_readOnly_decoder_io_outputs_3_r_ready ), //o + .io_outputs_3_r_payload_data (axiOut_3_rdata[31:0] ), //i + .io_outputs_3_r_payload_id (axiIn_0_readOnly_decoder_io_outputs_3_r_payload_id[3:0] ), //i + .io_outputs_3_r_payload_resp (axiOut_3_rresp[1:0] ), //i + .io_outputs_3_r_payload_last (axiOut_3_rlast ), //i + .io_outputs_4_ar_valid (axiIn_0_readOnly_decoder_io_outputs_4_ar_valid ), //o + .io_outputs_4_ar_ready (toplevel_axiIn_0_readOnly_decoder_io_outputs_4_ar_validPipe_fire), //i + .io_outputs_4_ar_payload_addr (axiIn_0_readOnly_decoder_io_outputs_4_ar_payload_addr[31:0] ), //o + .io_outputs_4_ar_payload_id (axiIn_0_readOnly_decoder_io_outputs_4_ar_payload_id[3:0] ), //o + .io_outputs_4_ar_payload_len (axiIn_0_readOnly_decoder_io_outputs_4_ar_payload_len[7:0] ), //o + .io_outputs_4_ar_payload_size (axiIn_0_readOnly_decoder_io_outputs_4_ar_payload_size[2:0] ), //o + .io_outputs_4_ar_payload_burst (axiIn_0_readOnly_decoder_io_outputs_4_ar_payload_burst[1:0] ), //o + .io_outputs_4_ar_payload_lock (axiIn_0_readOnly_decoder_io_outputs_4_ar_payload_lock ), //o + .io_outputs_4_ar_payload_cache (axiIn_0_readOnly_decoder_io_outputs_4_ar_payload_cache[3:0] ), //o + .io_outputs_4_ar_payload_prot (axiIn_0_readOnly_decoder_io_outputs_4_ar_payload_prot[2:0] ), //o + .io_outputs_4_r_valid (axiOut_4_rvalid ), //i + .io_outputs_4_r_ready (axiIn_0_readOnly_decoder_io_outputs_4_r_ready ), //o + .io_outputs_4_r_payload_data (axiOut_4_rdata[31:0] ), //i + .io_outputs_4_r_payload_id (axiIn_0_readOnly_decoder_io_outputs_4_r_payload_id[3:0] ), //i + .io_outputs_4_r_payload_resp (axiOut_4_rresp[1:0] ), //i + .io_outputs_4_r_payload_last (axiOut_4_rlast ), //i + .io_outputs_5_ar_valid (axiIn_0_readOnly_decoder_io_outputs_5_ar_valid ), //o + .io_outputs_5_ar_ready (toplevel_axiIn_0_readOnly_decoder_io_outputs_5_ar_validPipe_fire), //i + .io_outputs_5_ar_payload_addr (axiIn_0_readOnly_decoder_io_outputs_5_ar_payload_addr[31:0] ), //o + .io_outputs_5_ar_payload_id (axiIn_0_readOnly_decoder_io_outputs_5_ar_payload_id[3:0] ), //o + .io_outputs_5_ar_payload_len (axiIn_0_readOnly_decoder_io_outputs_5_ar_payload_len[7:0] ), //o + .io_outputs_5_ar_payload_size (axiIn_0_readOnly_decoder_io_outputs_5_ar_payload_size[2:0] ), //o + .io_outputs_5_ar_payload_burst (axiIn_0_readOnly_decoder_io_outputs_5_ar_payload_burst[1:0] ), //o + .io_outputs_5_ar_payload_lock (axiIn_0_readOnly_decoder_io_outputs_5_ar_payload_lock ), //o + .io_outputs_5_ar_payload_cache (axiIn_0_readOnly_decoder_io_outputs_5_ar_payload_cache[3:0] ), //o + .io_outputs_5_ar_payload_prot (axiIn_0_readOnly_decoder_io_outputs_5_ar_payload_prot[2:0] ), //o + .io_outputs_5_r_valid (axiOut_5_rvalid ), //i + .io_outputs_5_r_ready (axiIn_0_readOnly_decoder_io_outputs_5_r_ready ), //o + .io_outputs_5_r_payload_data (axiOut_5_rdata[31:0] ), //i + .io_outputs_5_r_payload_id (axiIn_0_readOnly_decoder_io_outputs_5_r_payload_id[3:0] ), //i + .io_outputs_5_r_payload_resp (axiOut_5_rresp[1:0] ), //i + .io_outputs_5_r_payload_last (axiOut_5_rlast ), //i + .io_outputs_6_ar_valid (axiIn_0_readOnly_decoder_io_outputs_6_ar_valid ), //o + .io_outputs_6_ar_ready (toplevel_axiIn_0_readOnly_decoder_io_outputs_6_ar_validPipe_fire), //i + .io_outputs_6_ar_payload_addr (axiIn_0_readOnly_decoder_io_outputs_6_ar_payload_addr[31:0] ), //o + .io_outputs_6_ar_payload_id (axiIn_0_readOnly_decoder_io_outputs_6_ar_payload_id[3:0] ), //o + .io_outputs_6_ar_payload_len (axiIn_0_readOnly_decoder_io_outputs_6_ar_payload_len[7:0] ), //o + .io_outputs_6_ar_payload_size (axiIn_0_readOnly_decoder_io_outputs_6_ar_payload_size[2:0] ), //o + .io_outputs_6_ar_payload_burst (axiIn_0_readOnly_decoder_io_outputs_6_ar_payload_burst[1:0] ), //o + .io_outputs_6_ar_payload_lock (axiIn_0_readOnly_decoder_io_outputs_6_ar_payload_lock ), //o + .io_outputs_6_ar_payload_cache (axiIn_0_readOnly_decoder_io_outputs_6_ar_payload_cache[3:0] ), //o + .io_outputs_6_ar_payload_prot (axiIn_0_readOnly_decoder_io_outputs_6_ar_payload_prot[2:0] ), //o + .io_outputs_6_r_valid (axi4ReadOnlyArbiter_6_io_inputs_0_r_valid ), //i + .io_outputs_6_r_ready (axiIn_0_readOnly_decoder_io_outputs_6_r_ready ), //o + .io_outputs_6_r_payload_data (axi4ReadOnlyArbiter_6_io_inputs_0_r_payload_data[31:0] ), //i + .io_outputs_6_r_payload_id (axi4ReadOnlyArbiter_6_io_inputs_0_r_payload_id[3:0] ), //i + .io_outputs_6_r_payload_resp (axi4ReadOnlyArbiter_6_io_inputs_0_r_payload_resp[1:0] ), //i + .io_outputs_6_r_payload_last (axi4ReadOnlyArbiter_6_io_inputs_0_r_payload_last ), //i + .io_outputs_7_ar_valid (axiIn_0_readOnly_decoder_io_outputs_7_ar_valid ), //o + .io_outputs_7_ar_ready (toplevel_axiIn_0_readOnly_decoder_io_outputs_7_ar_validPipe_fire), //i + .io_outputs_7_ar_payload_addr (axiIn_0_readOnly_decoder_io_outputs_7_ar_payload_addr[31:0] ), //o + .io_outputs_7_ar_payload_id (axiIn_0_readOnly_decoder_io_outputs_7_ar_payload_id[3:0] ), //o + .io_outputs_7_ar_payload_len (axiIn_0_readOnly_decoder_io_outputs_7_ar_payload_len[7:0] ), //o + .io_outputs_7_ar_payload_size (axiIn_0_readOnly_decoder_io_outputs_7_ar_payload_size[2:0] ), //o + .io_outputs_7_ar_payload_burst (axiIn_0_readOnly_decoder_io_outputs_7_ar_payload_burst[1:0] ), //o + .io_outputs_7_ar_payload_lock (axiIn_0_readOnly_decoder_io_outputs_7_ar_payload_lock ), //o + .io_outputs_7_ar_payload_cache (axiIn_0_readOnly_decoder_io_outputs_7_ar_payload_cache[3:0] ), //o + .io_outputs_7_ar_payload_prot (axiIn_0_readOnly_decoder_io_outputs_7_ar_payload_prot[2:0] ), //o + .io_outputs_7_r_valid (axi4ReadOnlyArbiter_7_io_inputs_0_r_valid ), //i + .io_outputs_7_r_ready (axiIn_0_readOnly_decoder_io_outputs_7_r_ready ), //o + .io_outputs_7_r_payload_data (axi4ReadOnlyArbiter_7_io_inputs_0_r_payload_data[31:0] ), //i + .io_outputs_7_r_payload_id (axi4ReadOnlyArbiter_7_io_inputs_0_r_payload_id[3:0] ), //i + .io_outputs_7_r_payload_resp (axi4ReadOnlyArbiter_7_io_inputs_0_r_payload_resp[1:0] ), //i + .io_outputs_7_r_payload_last (axi4ReadOnlyArbiter_7_io_inputs_0_r_payload_last ), //i + .clk (clk ), //i + .resetn (resetn ) //i + ); + Axi4WriteOnlyDecoder axiIn_0_writeOnly_decoder ( + .io_input_aw_valid (axiIn_0_writeOnly_aw_valid ), //i + .io_input_aw_ready (axiIn_0_writeOnly_decoder_io_input_aw_ready ), //o + .io_input_aw_payload_addr (axiIn_0_writeOnly_aw_payload_addr[31:0] ), //i + .io_input_aw_payload_id (axiIn_0_writeOnly_aw_payload_id[3:0] ), //i + .io_input_aw_payload_len (axiIn_0_writeOnly_aw_payload_len[7:0] ), //i + .io_input_aw_payload_size (axiIn_0_writeOnly_aw_payload_size[2:0] ), //i + .io_input_aw_payload_burst (axiIn_0_writeOnly_aw_payload_burst[1:0] ), //i + .io_input_aw_payload_lock (axiIn_0_writeOnly_aw_payload_lock ), //i + .io_input_aw_payload_cache (axiIn_0_writeOnly_aw_payload_cache[3:0] ), //i + .io_input_aw_payload_prot (axiIn_0_writeOnly_aw_payload_prot[2:0] ), //i + .io_input_w_valid (axiIn_0_writeOnly_w_valid ), //i + .io_input_w_ready (axiIn_0_writeOnly_decoder_io_input_w_ready ), //o + .io_input_w_payload_data (axiIn_0_writeOnly_w_payload_data[31:0] ), //i + .io_input_w_payload_strb (axiIn_0_writeOnly_w_payload_strb[3:0] ), //i + .io_input_w_payload_last (axiIn_0_writeOnly_w_payload_last ), //i + .io_input_b_valid (axiIn_0_writeOnly_decoder_io_input_b_valid ), //o + .io_input_b_ready (axiIn_0_writeOnly_b_ready ), //i + .io_input_b_payload_id (axiIn_0_writeOnly_decoder_io_input_b_payload_id[3:0] ), //o + .io_input_b_payload_resp (axiIn_0_writeOnly_decoder_io_input_b_payload_resp[1:0] ), //o + .io_outputs_0_aw_valid (axiIn_0_writeOnly_decoder_io_outputs_0_aw_valid ), //o + .io_outputs_0_aw_ready (toplevel_axiIn_0_writeOnly_decoder_io_outputs_0_aw_validPipe_fire), //i + .io_outputs_0_aw_payload_addr (axiIn_0_writeOnly_decoder_io_outputs_0_aw_payload_addr[31:0] ), //o + .io_outputs_0_aw_payload_id (axiIn_0_writeOnly_decoder_io_outputs_0_aw_payload_id[3:0] ), //o + .io_outputs_0_aw_payload_len (axiIn_0_writeOnly_decoder_io_outputs_0_aw_payload_len[7:0] ), //o + .io_outputs_0_aw_payload_size (axiIn_0_writeOnly_decoder_io_outputs_0_aw_payload_size[2:0] ), //o + .io_outputs_0_aw_payload_burst (axiIn_0_writeOnly_decoder_io_outputs_0_aw_payload_burst[1:0] ), //o + .io_outputs_0_aw_payload_lock (axiIn_0_writeOnly_decoder_io_outputs_0_aw_payload_lock ), //o + .io_outputs_0_aw_payload_cache (axiIn_0_writeOnly_decoder_io_outputs_0_aw_payload_cache[3:0] ), //o + .io_outputs_0_aw_payload_prot (axiIn_0_writeOnly_decoder_io_outputs_0_aw_payload_prot[2:0] ), //o + .io_outputs_0_w_valid (axiIn_0_writeOnly_decoder_io_outputs_0_w_valid ), //o + .io_outputs_0_w_ready (axi4WriteOnlyArbiter_4_io_inputs_0_w_ready ), //i + .io_outputs_0_w_payload_data (axiIn_0_writeOnly_decoder_io_outputs_0_w_payload_data[31:0] ), //o + .io_outputs_0_w_payload_strb (axiIn_0_writeOnly_decoder_io_outputs_0_w_payload_strb[3:0] ), //o + .io_outputs_0_w_payload_last (axiIn_0_writeOnly_decoder_io_outputs_0_w_payload_last ), //o + .io_outputs_0_b_valid (axi4WriteOnlyArbiter_4_io_inputs_0_b_valid ), //i + .io_outputs_0_b_ready (axiIn_0_writeOnly_decoder_io_outputs_0_b_ready ), //o + .io_outputs_0_b_payload_id (axi4WriteOnlyArbiter_4_io_inputs_0_b_payload_id[3:0] ), //i + .io_outputs_0_b_payload_resp (axi4WriteOnlyArbiter_4_io_inputs_0_b_payload_resp[1:0] ), //i + .io_outputs_1_aw_valid (axiIn_0_writeOnly_decoder_io_outputs_1_aw_valid ), //o + .io_outputs_1_aw_ready (toplevel_axiIn_0_writeOnly_decoder_io_outputs_1_aw_validPipe_fire), //i + .io_outputs_1_aw_payload_addr (axiIn_0_writeOnly_decoder_io_outputs_1_aw_payload_addr[31:0] ), //o + .io_outputs_1_aw_payload_id (axiIn_0_writeOnly_decoder_io_outputs_1_aw_payload_id[3:0] ), //o + .io_outputs_1_aw_payload_len (axiIn_0_writeOnly_decoder_io_outputs_1_aw_payload_len[7:0] ), //o + .io_outputs_1_aw_payload_size (axiIn_0_writeOnly_decoder_io_outputs_1_aw_payload_size[2:0] ), //o + .io_outputs_1_aw_payload_burst (axiIn_0_writeOnly_decoder_io_outputs_1_aw_payload_burst[1:0] ), //o + .io_outputs_1_aw_payload_lock (axiIn_0_writeOnly_decoder_io_outputs_1_aw_payload_lock ), //o + .io_outputs_1_aw_payload_cache (axiIn_0_writeOnly_decoder_io_outputs_1_aw_payload_cache[3:0] ), //o + .io_outputs_1_aw_payload_prot (axiIn_0_writeOnly_decoder_io_outputs_1_aw_payload_prot[2:0] ), //o + .io_outputs_1_w_valid (axiIn_0_writeOnly_decoder_io_outputs_1_w_valid ), //o + .io_outputs_1_w_ready (axi4WriteOnlyArbiter_5_io_inputs_0_w_ready ), //i + .io_outputs_1_w_payload_data (axiIn_0_writeOnly_decoder_io_outputs_1_w_payload_data[31:0] ), //o + .io_outputs_1_w_payload_strb (axiIn_0_writeOnly_decoder_io_outputs_1_w_payload_strb[3:0] ), //o + .io_outputs_1_w_payload_last (axiIn_0_writeOnly_decoder_io_outputs_1_w_payload_last ), //o + .io_outputs_1_b_valid (axi4WriteOnlyArbiter_5_io_inputs_0_b_valid ), //i + .io_outputs_1_b_ready (axiIn_0_writeOnly_decoder_io_outputs_1_b_ready ), //o + .io_outputs_1_b_payload_id (axi4WriteOnlyArbiter_5_io_inputs_0_b_payload_id[3:0] ), //i + .io_outputs_1_b_payload_resp (axi4WriteOnlyArbiter_5_io_inputs_0_b_payload_resp[1:0] ), //i + .io_outputs_2_aw_valid (axiIn_0_writeOnly_decoder_io_outputs_2_aw_valid ), //o + .io_outputs_2_aw_ready (toplevel_axiIn_0_writeOnly_decoder_io_outputs_2_aw_validPipe_fire), //i + .io_outputs_2_aw_payload_addr (axiIn_0_writeOnly_decoder_io_outputs_2_aw_payload_addr[31:0] ), //o + .io_outputs_2_aw_payload_id (axiIn_0_writeOnly_decoder_io_outputs_2_aw_payload_id[3:0] ), //o + .io_outputs_2_aw_payload_len (axiIn_0_writeOnly_decoder_io_outputs_2_aw_payload_len[7:0] ), //o + .io_outputs_2_aw_payload_size (axiIn_0_writeOnly_decoder_io_outputs_2_aw_payload_size[2:0] ), //o + .io_outputs_2_aw_payload_burst (axiIn_0_writeOnly_decoder_io_outputs_2_aw_payload_burst[1:0] ), //o + .io_outputs_2_aw_payload_lock (axiIn_0_writeOnly_decoder_io_outputs_2_aw_payload_lock ), //o + .io_outputs_2_aw_payload_cache (axiIn_0_writeOnly_decoder_io_outputs_2_aw_payload_cache[3:0] ), //o + .io_outputs_2_aw_payload_prot (axiIn_0_writeOnly_decoder_io_outputs_2_aw_payload_prot[2:0] ), //o + .io_outputs_2_w_valid (axiIn_0_writeOnly_decoder_io_outputs_2_w_valid ), //o + .io_outputs_2_w_ready (axiOut_2_wready ), //i + .io_outputs_2_w_payload_data (axiIn_0_writeOnly_decoder_io_outputs_2_w_payload_data[31:0] ), //o + .io_outputs_2_w_payload_strb (axiIn_0_writeOnly_decoder_io_outputs_2_w_payload_strb[3:0] ), //o + .io_outputs_2_w_payload_last (axiIn_0_writeOnly_decoder_io_outputs_2_w_payload_last ), //o + .io_outputs_2_b_valid (axiOut_2_bvalid ), //i + .io_outputs_2_b_ready (axiIn_0_writeOnly_decoder_io_outputs_2_b_ready ), //o + .io_outputs_2_b_payload_id (axiIn_0_writeOnly_decoder_io_outputs_2_b_payload_id[3:0] ), //i + .io_outputs_2_b_payload_resp (axiOut_2_bresp[1:0] ), //i + .io_outputs_3_aw_valid (axiIn_0_writeOnly_decoder_io_outputs_3_aw_valid ), //o + .io_outputs_3_aw_ready (toplevel_axiIn_0_writeOnly_decoder_io_outputs_3_aw_validPipe_fire), //i + .io_outputs_3_aw_payload_addr (axiIn_0_writeOnly_decoder_io_outputs_3_aw_payload_addr[31:0] ), //o + .io_outputs_3_aw_payload_id (axiIn_0_writeOnly_decoder_io_outputs_3_aw_payload_id[3:0] ), //o + .io_outputs_3_aw_payload_len (axiIn_0_writeOnly_decoder_io_outputs_3_aw_payload_len[7:0] ), //o + .io_outputs_3_aw_payload_size (axiIn_0_writeOnly_decoder_io_outputs_3_aw_payload_size[2:0] ), //o + .io_outputs_3_aw_payload_burst (axiIn_0_writeOnly_decoder_io_outputs_3_aw_payload_burst[1:0] ), //o + .io_outputs_3_aw_payload_lock (axiIn_0_writeOnly_decoder_io_outputs_3_aw_payload_lock ), //o + .io_outputs_3_aw_payload_cache (axiIn_0_writeOnly_decoder_io_outputs_3_aw_payload_cache[3:0] ), //o + .io_outputs_3_aw_payload_prot (axiIn_0_writeOnly_decoder_io_outputs_3_aw_payload_prot[2:0] ), //o + .io_outputs_3_w_valid (axiIn_0_writeOnly_decoder_io_outputs_3_w_valid ), //o + .io_outputs_3_w_ready (axiOut_3_wready ), //i + .io_outputs_3_w_payload_data (axiIn_0_writeOnly_decoder_io_outputs_3_w_payload_data[31:0] ), //o + .io_outputs_3_w_payload_strb (axiIn_0_writeOnly_decoder_io_outputs_3_w_payload_strb[3:0] ), //o + .io_outputs_3_w_payload_last (axiIn_0_writeOnly_decoder_io_outputs_3_w_payload_last ), //o + .io_outputs_3_b_valid (axiOut_3_bvalid ), //i + .io_outputs_3_b_ready (axiIn_0_writeOnly_decoder_io_outputs_3_b_ready ), //o + .io_outputs_3_b_payload_id (axiIn_0_writeOnly_decoder_io_outputs_3_b_payload_id[3:0] ), //i + .io_outputs_3_b_payload_resp (axiOut_3_bresp[1:0] ), //i + .io_outputs_4_aw_valid (axiIn_0_writeOnly_decoder_io_outputs_4_aw_valid ), //o + .io_outputs_4_aw_ready (toplevel_axiIn_0_writeOnly_decoder_io_outputs_4_aw_validPipe_fire), //i + .io_outputs_4_aw_payload_addr (axiIn_0_writeOnly_decoder_io_outputs_4_aw_payload_addr[31:0] ), //o + .io_outputs_4_aw_payload_id (axiIn_0_writeOnly_decoder_io_outputs_4_aw_payload_id[3:0] ), //o + .io_outputs_4_aw_payload_len (axiIn_0_writeOnly_decoder_io_outputs_4_aw_payload_len[7:0] ), //o + .io_outputs_4_aw_payload_size (axiIn_0_writeOnly_decoder_io_outputs_4_aw_payload_size[2:0] ), //o + .io_outputs_4_aw_payload_burst (axiIn_0_writeOnly_decoder_io_outputs_4_aw_payload_burst[1:0] ), //o + .io_outputs_4_aw_payload_lock (axiIn_0_writeOnly_decoder_io_outputs_4_aw_payload_lock ), //o + .io_outputs_4_aw_payload_cache (axiIn_0_writeOnly_decoder_io_outputs_4_aw_payload_cache[3:0] ), //o + .io_outputs_4_aw_payload_prot (axiIn_0_writeOnly_decoder_io_outputs_4_aw_payload_prot[2:0] ), //o + .io_outputs_4_w_valid (axiIn_0_writeOnly_decoder_io_outputs_4_w_valid ), //o + .io_outputs_4_w_ready (axiOut_4_wready ), //i + .io_outputs_4_w_payload_data (axiIn_0_writeOnly_decoder_io_outputs_4_w_payload_data[31:0] ), //o + .io_outputs_4_w_payload_strb (axiIn_0_writeOnly_decoder_io_outputs_4_w_payload_strb[3:0] ), //o + .io_outputs_4_w_payload_last (axiIn_0_writeOnly_decoder_io_outputs_4_w_payload_last ), //o + .io_outputs_4_b_valid (axiOut_4_bvalid ), //i + .io_outputs_4_b_ready (axiIn_0_writeOnly_decoder_io_outputs_4_b_ready ), //o + .io_outputs_4_b_payload_id (axiIn_0_writeOnly_decoder_io_outputs_4_b_payload_id[3:0] ), //i + .io_outputs_4_b_payload_resp (axiOut_4_bresp[1:0] ), //i + .io_outputs_5_aw_valid (axiIn_0_writeOnly_decoder_io_outputs_5_aw_valid ), //o + .io_outputs_5_aw_ready (toplevel_axiIn_0_writeOnly_decoder_io_outputs_5_aw_validPipe_fire), //i + .io_outputs_5_aw_payload_addr (axiIn_0_writeOnly_decoder_io_outputs_5_aw_payload_addr[31:0] ), //o + .io_outputs_5_aw_payload_id (axiIn_0_writeOnly_decoder_io_outputs_5_aw_payload_id[3:0] ), //o + .io_outputs_5_aw_payload_len (axiIn_0_writeOnly_decoder_io_outputs_5_aw_payload_len[7:0] ), //o + .io_outputs_5_aw_payload_size (axiIn_0_writeOnly_decoder_io_outputs_5_aw_payload_size[2:0] ), //o + .io_outputs_5_aw_payload_burst (axiIn_0_writeOnly_decoder_io_outputs_5_aw_payload_burst[1:0] ), //o + .io_outputs_5_aw_payload_lock (axiIn_0_writeOnly_decoder_io_outputs_5_aw_payload_lock ), //o + .io_outputs_5_aw_payload_cache (axiIn_0_writeOnly_decoder_io_outputs_5_aw_payload_cache[3:0] ), //o + .io_outputs_5_aw_payload_prot (axiIn_0_writeOnly_decoder_io_outputs_5_aw_payload_prot[2:0] ), //o + .io_outputs_5_w_valid (axiIn_0_writeOnly_decoder_io_outputs_5_w_valid ), //o + .io_outputs_5_w_ready (axiOut_5_wready ), //i + .io_outputs_5_w_payload_data (axiIn_0_writeOnly_decoder_io_outputs_5_w_payload_data[31:0] ), //o + .io_outputs_5_w_payload_strb (axiIn_0_writeOnly_decoder_io_outputs_5_w_payload_strb[3:0] ), //o + .io_outputs_5_w_payload_last (axiIn_0_writeOnly_decoder_io_outputs_5_w_payload_last ), //o + .io_outputs_5_b_valid (axiOut_5_bvalid ), //i + .io_outputs_5_b_ready (axiIn_0_writeOnly_decoder_io_outputs_5_b_ready ), //o + .io_outputs_5_b_payload_id (axiIn_0_writeOnly_decoder_io_outputs_5_b_payload_id[3:0] ), //i + .io_outputs_5_b_payload_resp (axiOut_5_bresp[1:0] ), //i + .io_outputs_6_aw_valid (axiIn_0_writeOnly_decoder_io_outputs_6_aw_valid ), //o + .io_outputs_6_aw_ready (toplevel_axiIn_0_writeOnly_decoder_io_outputs_6_aw_validPipe_fire), //i + .io_outputs_6_aw_payload_addr (axiIn_0_writeOnly_decoder_io_outputs_6_aw_payload_addr[31:0] ), //o + .io_outputs_6_aw_payload_id (axiIn_0_writeOnly_decoder_io_outputs_6_aw_payload_id[3:0] ), //o + .io_outputs_6_aw_payload_len (axiIn_0_writeOnly_decoder_io_outputs_6_aw_payload_len[7:0] ), //o + .io_outputs_6_aw_payload_size (axiIn_0_writeOnly_decoder_io_outputs_6_aw_payload_size[2:0] ), //o + .io_outputs_6_aw_payload_burst (axiIn_0_writeOnly_decoder_io_outputs_6_aw_payload_burst[1:0] ), //o + .io_outputs_6_aw_payload_lock (axiIn_0_writeOnly_decoder_io_outputs_6_aw_payload_lock ), //o + .io_outputs_6_aw_payload_cache (axiIn_0_writeOnly_decoder_io_outputs_6_aw_payload_cache[3:0] ), //o + .io_outputs_6_aw_payload_prot (axiIn_0_writeOnly_decoder_io_outputs_6_aw_payload_prot[2:0] ), //o + .io_outputs_6_w_valid (axiIn_0_writeOnly_decoder_io_outputs_6_w_valid ), //o + .io_outputs_6_w_ready (axi4WriteOnlyArbiter_6_io_inputs_0_w_ready ), //i + .io_outputs_6_w_payload_data (axiIn_0_writeOnly_decoder_io_outputs_6_w_payload_data[31:0] ), //o + .io_outputs_6_w_payload_strb (axiIn_0_writeOnly_decoder_io_outputs_6_w_payload_strb[3:0] ), //o + .io_outputs_6_w_payload_last (axiIn_0_writeOnly_decoder_io_outputs_6_w_payload_last ), //o + .io_outputs_6_b_valid (axi4WriteOnlyArbiter_6_io_inputs_0_b_valid ), //i + .io_outputs_6_b_ready (axiIn_0_writeOnly_decoder_io_outputs_6_b_ready ), //o + .io_outputs_6_b_payload_id (axi4WriteOnlyArbiter_6_io_inputs_0_b_payload_id[3:0] ), //i + .io_outputs_6_b_payload_resp (axi4WriteOnlyArbiter_6_io_inputs_0_b_payload_resp[1:0] ), //i + .io_outputs_7_aw_valid (axiIn_0_writeOnly_decoder_io_outputs_7_aw_valid ), //o + .io_outputs_7_aw_ready (toplevel_axiIn_0_writeOnly_decoder_io_outputs_7_aw_validPipe_fire), //i + .io_outputs_7_aw_payload_addr (axiIn_0_writeOnly_decoder_io_outputs_7_aw_payload_addr[31:0] ), //o + .io_outputs_7_aw_payload_id (axiIn_0_writeOnly_decoder_io_outputs_7_aw_payload_id[3:0] ), //o + .io_outputs_7_aw_payload_len (axiIn_0_writeOnly_decoder_io_outputs_7_aw_payload_len[7:0] ), //o + .io_outputs_7_aw_payload_size (axiIn_0_writeOnly_decoder_io_outputs_7_aw_payload_size[2:0] ), //o + .io_outputs_7_aw_payload_burst (axiIn_0_writeOnly_decoder_io_outputs_7_aw_payload_burst[1:0] ), //o + .io_outputs_7_aw_payload_lock (axiIn_0_writeOnly_decoder_io_outputs_7_aw_payload_lock ), //o + .io_outputs_7_aw_payload_cache (axiIn_0_writeOnly_decoder_io_outputs_7_aw_payload_cache[3:0] ), //o + .io_outputs_7_aw_payload_prot (axiIn_0_writeOnly_decoder_io_outputs_7_aw_payload_prot[2:0] ), //o + .io_outputs_7_w_valid (axiIn_0_writeOnly_decoder_io_outputs_7_w_valid ), //o + .io_outputs_7_w_ready (axi4WriteOnlyArbiter_7_io_inputs_0_w_ready ), //i + .io_outputs_7_w_payload_data (axiIn_0_writeOnly_decoder_io_outputs_7_w_payload_data[31:0] ), //o + .io_outputs_7_w_payload_strb (axiIn_0_writeOnly_decoder_io_outputs_7_w_payload_strb[3:0] ), //o + .io_outputs_7_w_payload_last (axiIn_0_writeOnly_decoder_io_outputs_7_w_payload_last ), //o + .io_outputs_7_b_valid (axi4WriteOnlyArbiter_7_io_inputs_0_b_valid ), //i + .io_outputs_7_b_ready (axiIn_0_writeOnly_decoder_io_outputs_7_b_ready ), //o + .io_outputs_7_b_payload_id (axi4WriteOnlyArbiter_7_io_inputs_0_b_payload_id[3:0] ), //i + .io_outputs_7_b_payload_resp (axi4WriteOnlyArbiter_7_io_inputs_0_b_payload_resp[1:0] ), //i + .clk (clk ), //i + .resetn (resetn ) //i + ); + Axi4ReadOnlyDecoder_1 axiIn_1_readOnly_decoder ( + .io_input_ar_valid (axiIn_1_readOnly_ar_valid ), //i + .io_input_ar_ready (axiIn_1_readOnly_decoder_io_input_ar_ready ), //o + .io_input_ar_payload_addr (axiIn_1_readOnly_ar_payload_addr[31:0] ), //i + .io_input_ar_payload_id (axiIn_1_readOnly_ar_payload_id[3:0] ), //i + .io_input_ar_payload_len (axiIn_1_readOnly_ar_payload_len[7:0] ), //i + .io_input_ar_payload_size (axiIn_1_readOnly_ar_payload_size[2:0] ), //i + .io_input_ar_payload_burst (axiIn_1_readOnly_ar_payload_burst[1:0] ), //i + .io_input_ar_payload_lock (axiIn_1_readOnly_ar_payload_lock ), //i + .io_input_ar_payload_cache (axiIn_1_readOnly_ar_payload_cache[3:0] ), //i + .io_input_ar_payload_prot (axiIn_1_readOnly_ar_payload_prot[2:0] ), //i + .io_input_r_valid (axiIn_1_readOnly_decoder_io_input_r_valid ), //o + .io_input_r_ready (axiIn_1_readOnly_r_ready ), //i + .io_input_r_payload_data (axiIn_1_readOnly_decoder_io_input_r_payload_data[31:0] ), //o + .io_input_r_payload_id (axiIn_1_readOnly_decoder_io_input_r_payload_id[3:0] ), //o + .io_input_r_payload_resp (axiIn_1_readOnly_decoder_io_input_r_payload_resp[1:0] ), //o + .io_input_r_payload_last (axiIn_1_readOnly_decoder_io_input_r_payload_last ), //o + .io_outputs_0_ar_valid (axiIn_1_readOnly_decoder_io_outputs_0_ar_valid ), //o + .io_outputs_0_ar_ready (toplevel_axiIn_1_readOnly_decoder_io_outputs_0_ar_validPipe_fire), //i + .io_outputs_0_ar_payload_addr (axiIn_1_readOnly_decoder_io_outputs_0_ar_payload_addr[31:0] ), //o + .io_outputs_0_ar_payload_id (axiIn_1_readOnly_decoder_io_outputs_0_ar_payload_id[3:0] ), //o + .io_outputs_0_ar_payload_len (axiIn_1_readOnly_decoder_io_outputs_0_ar_payload_len[7:0] ), //o + .io_outputs_0_ar_payload_size (axiIn_1_readOnly_decoder_io_outputs_0_ar_payload_size[2:0] ), //o + .io_outputs_0_ar_payload_burst (axiIn_1_readOnly_decoder_io_outputs_0_ar_payload_burst[1:0] ), //o + .io_outputs_0_ar_payload_lock (axiIn_1_readOnly_decoder_io_outputs_0_ar_payload_lock ), //o + .io_outputs_0_ar_payload_cache (axiIn_1_readOnly_decoder_io_outputs_0_ar_payload_cache[3:0] ), //o + .io_outputs_0_ar_payload_prot (axiIn_1_readOnly_decoder_io_outputs_0_ar_payload_prot[2:0] ), //o + .io_outputs_0_r_valid (axi4ReadOnlyArbiter_4_io_inputs_1_r_valid ), //i + .io_outputs_0_r_ready (axiIn_1_readOnly_decoder_io_outputs_0_r_ready ), //o + .io_outputs_0_r_payload_data (axi4ReadOnlyArbiter_4_io_inputs_1_r_payload_data[31:0] ), //i + .io_outputs_0_r_payload_id (axi4ReadOnlyArbiter_4_io_inputs_1_r_payload_id[3:0] ), //i + .io_outputs_0_r_payload_resp (axi4ReadOnlyArbiter_4_io_inputs_1_r_payload_resp[1:0] ), //i + .io_outputs_0_r_payload_last (axi4ReadOnlyArbiter_4_io_inputs_1_r_payload_last ), //i + .io_outputs_1_ar_valid (axiIn_1_readOnly_decoder_io_outputs_1_ar_valid ), //o + .io_outputs_1_ar_ready (toplevel_axiIn_1_readOnly_decoder_io_outputs_1_ar_validPipe_fire), //i + .io_outputs_1_ar_payload_addr (axiIn_1_readOnly_decoder_io_outputs_1_ar_payload_addr[31:0] ), //o + .io_outputs_1_ar_payload_id (axiIn_1_readOnly_decoder_io_outputs_1_ar_payload_id[3:0] ), //o + .io_outputs_1_ar_payload_len (axiIn_1_readOnly_decoder_io_outputs_1_ar_payload_len[7:0] ), //o + .io_outputs_1_ar_payload_size (axiIn_1_readOnly_decoder_io_outputs_1_ar_payload_size[2:0] ), //o + .io_outputs_1_ar_payload_burst (axiIn_1_readOnly_decoder_io_outputs_1_ar_payload_burst[1:0] ), //o + .io_outputs_1_ar_payload_lock (axiIn_1_readOnly_decoder_io_outputs_1_ar_payload_lock ), //o + .io_outputs_1_ar_payload_cache (axiIn_1_readOnly_decoder_io_outputs_1_ar_payload_cache[3:0] ), //o + .io_outputs_1_ar_payload_prot (axiIn_1_readOnly_decoder_io_outputs_1_ar_payload_prot[2:0] ), //o + .io_outputs_1_r_valid (axi4ReadOnlyArbiter_5_io_inputs_1_r_valid ), //i + .io_outputs_1_r_ready (axiIn_1_readOnly_decoder_io_outputs_1_r_ready ), //o + .io_outputs_1_r_payload_data (axi4ReadOnlyArbiter_5_io_inputs_1_r_payload_data[31:0] ), //i + .io_outputs_1_r_payload_id (axi4ReadOnlyArbiter_5_io_inputs_1_r_payload_id[3:0] ), //i + .io_outputs_1_r_payload_resp (axi4ReadOnlyArbiter_5_io_inputs_1_r_payload_resp[1:0] ), //i + .io_outputs_1_r_payload_last (axi4ReadOnlyArbiter_5_io_inputs_1_r_payload_last ), //i + .io_outputs_2_ar_valid (axiIn_1_readOnly_decoder_io_outputs_2_ar_valid ), //o + .io_outputs_2_ar_ready (toplevel_axiIn_1_readOnly_decoder_io_outputs_2_ar_validPipe_fire), //i + .io_outputs_2_ar_payload_addr (axiIn_1_readOnly_decoder_io_outputs_2_ar_payload_addr[31:0] ), //o + .io_outputs_2_ar_payload_id (axiIn_1_readOnly_decoder_io_outputs_2_ar_payload_id[3:0] ), //o + .io_outputs_2_ar_payload_len (axiIn_1_readOnly_decoder_io_outputs_2_ar_payload_len[7:0] ), //o + .io_outputs_2_ar_payload_size (axiIn_1_readOnly_decoder_io_outputs_2_ar_payload_size[2:0] ), //o + .io_outputs_2_ar_payload_burst (axiIn_1_readOnly_decoder_io_outputs_2_ar_payload_burst[1:0] ), //o + .io_outputs_2_ar_payload_lock (axiIn_1_readOnly_decoder_io_outputs_2_ar_payload_lock ), //o + .io_outputs_2_ar_payload_cache (axiIn_1_readOnly_decoder_io_outputs_2_ar_payload_cache[3:0] ), //o + .io_outputs_2_ar_payload_prot (axiIn_1_readOnly_decoder_io_outputs_2_ar_payload_prot[2:0] ), //o + .io_outputs_2_r_valid (axi4ReadOnlyArbiter_6_io_inputs_1_r_valid ), //i + .io_outputs_2_r_ready (axiIn_1_readOnly_decoder_io_outputs_2_r_ready ), //o + .io_outputs_2_r_payload_data (axi4ReadOnlyArbiter_6_io_inputs_1_r_payload_data[31:0] ), //i + .io_outputs_2_r_payload_id (axi4ReadOnlyArbiter_6_io_inputs_1_r_payload_id[3:0] ), //i + .io_outputs_2_r_payload_resp (axi4ReadOnlyArbiter_6_io_inputs_1_r_payload_resp[1:0] ), //i + .io_outputs_2_r_payload_last (axi4ReadOnlyArbiter_6_io_inputs_1_r_payload_last ), //i + .io_outputs_3_ar_valid (axiIn_1_readOnly_decoder_io_outputs_3_ar_valid ), //o + .io_outputs_3_ar_ready (toplevel_axiIn_1_readOnly_decoder_io_outputs_3_ar_validPipe_fire), //i + .io_outputs_3_ar_payload_addr (axiIn_1_readOnly_decoder_io_outputs_3_ar_payload_addr[31:0] ), //o + .io_outputs_3_ar_payload_id (axiIn_1_readOnly_decoder_io_outputs_3_ar_payload_id[3:0] ), //o + .io_outputs_3_ar_payload_len (axiIn_1_readOnly_decoder_io_outputs_3_ar_payload_len[7:0] ), //o + .io_outputs_3_ar_payload_size (axiIn_1_readOnly_decoder_io_outputs_3_ar_payload_size[2:0] ), //o + .io_outputs_3_ar_payload_burst (axiIn_1_readOnly_decoder_io_outputs_3_ar_payload_burst[1:0] ), //o + .io_outputs_3_ar_payload_lock (axiIn_1_readOnly_decoder_io_outputs_3_ar_payload_lock ), //o + .io_outputs_3_ar_payload_cache (axiIn_1_readOnly_decoder_io_outputs_3_ar_payload_cache[3:0] ), //o + .io_outputs_3_ar_payload_prot (axiIn_1_readOnly_decoder_io_outputs_3_ar_payload_prot[2:0] ), //o + .io_outputs_3_r_valid (axi4ReadOnlyArbiter_7_io_inputs_1_r_valid ), //i + .io_outputs_3_r_ready (axiIn_1_readOnly_decoder_io_outputs_3_r_ready ), //o + .io_outputs_3_r_payload_data (axi4ReadOnlyArbiter_7_io_inputs_1_r_payload_data[31:0] ), //i + .io_outputs_3_r_payload_id (axi4ReadOnlyArbiter_7_io_inputs_1_r_payload_id[3:0] ), //i + .io_outputs_3_r_payload_resp (axi4ReadOnlyArbiter_7_io_inputs_1_r_payload_resp[1:0] ), //i + .io_outputs_3_r_payload_last (axi4ReadOnlyArbiter_7_io_inputs_1_r_payload_last ), //i + .clk (clk ), //i + .resetn (resetn ) //i + ); + Axi4WriteOnlyDecoder_1 axiIn_1_writeOnly_decoder ( + .io_input_aw_valid (axiIn_1_writeOnly_aw_valid ), //i + .io_input_aw_ready (axiIn_1_writeOnly_decoder_io_input_aw_ready ), //o + .io_input_aw_payload_addr (axiIn_1_writeOnly_aw_payload_addr[31:0] ), //i + .io_input_aw_payload_id (axiIn_1_writeOnly_aw_payload_id[3:0] ), //i + .io_input_aw_payload_len (axiIn_1_writeOnly_aw_payload_len[7:0] ), //i + .io_input_aw_payload_size (axiIn_1_writeOnly_aw_payload_size[2:0] ), //i + .io_input_aw_payload_burst (axiIn_1_writeOnly_aw_payload_burst[1:0] ), //i + .io_input_aw_payload_lock (axiIn_1_writeOnly_aw_payload_lock ), //i + .io_input_aw_payload_cache (axiIn_1_writeOnly_aw_payload_cache[3:0] ), //i + .io_input_aw_payload_prot (axiIn_1_writeOnly_aw_payload_prot[2:0] ), //i + .io_input_w_valid (axiIn_1_writeOnly_w_valid ), //i + .io_input_w_ready (axiIn_1_writeOnly_decoder_io_input_w_ready ), //o + .io_input_w_payload_data (axiIn_1_writeOnly_w_payload_data[31:0] ), //i + .io_input_w_payload_strb (axiIn_1_writeOnly_w_payload_strb[3:0] ), //i + .io_input_w_payload_last (axiIn_1_writeOnly_w_payload_last ), //i + .io_input_b_valid (axiIn_1_writeOnly_decoder_io_input_b_valid ), //o + .io_input_b_ready (axiIn_1_writeOnly_b_ready ), //i + .io_input_b_payload_id (axiIn_1_writeOnly_decoder_io_input_b_payload_id[3:0] ), //o + .io_input_b_payload_resp (axiIn_1_writeOnly_decoder_io_input_b_payload_resp[1:0] ), //o + .io_outputs_0_aw_valid (axiIn_1_writeOnly_decoder_io_outputs_0_aw_valid ), //o + .io_outputs_0_aw_ready (toplevel_axiIn_1_writeOnly_decoder_io_outputs_0_aw_validPipe_fire), //i + .io_outputs_0_aw_payload_addr (axiIn_1_writeOnly_decoder_io_outputs_0_aw_payload_addr[31:0] ), //o + .io_outputs_0_aw_payload_id (axiIn_1_writeOnly_decoder_io_outputs_0_aw_payload_id[3:0] ), //o + .io_outputs_0_aw_payload_len (axiIn_1_writeOnly_decoder_io_outputs_0_aw_payload_len[7:0] ), //o + .io_outputs_0_aw_payload_size (axiIn_1_writeOnly_decoder_io_outputs_0_aw_payload_size[2:0] ), //o + .io_outputs_0_aw_payload_burst (axiIn_1_writeOnly_decoder_io_outputs_0_aw_payload_burst[1:0] ), //o + .io_outputs_0_aw_payload_lock (axiIn_1_writeOnly_decoder_io_outputs_0_aw_payload_lock ), //o + .io_outputs_0_aw_payload_cache (axiIn_1_writeOnly_decoder_io_outputs_0_aw_payload_cache[3:0] ), //o + .io_outputs_0_aw_payload_prot (axiIn_1_writeOnly_decoder_io_outputs_0_aw_payload_prot[2:0] ), //o + .io_outputs_0_w_valid (axiIn_1_writeOnly_decoder_io_outputs_0_w_valid ), //o + .io_outputs_0_w_ready (axi4WriteOnlyArbiter_4_io_inputs_1_w_ready ), //i + .io_outputs_0_w_payload_data (axiIn_1_writeOnly_decoder_io_outputs_0_w_payload_data[31:0] ), //o + .io_outputs_0_w_payload_strb (axiIn_1_writeOnly_decoder_io_outputs_0_w_payload_strb[3:0] ), //o + .io_outputs_0_w_payload_last (axiIn_1_writeOnly_decoder_io_outputs_0_w_payload_last ), //o + .io_outputs_0_b_valid (axi4WriteOnlyArbiter_4_io_inputs_1_b_valid ), //i + .io_outputs_0_b_ready (axiIn_1_writeOnly_decoder_io_outputs_0_b_ready ), //o + .io_outputs_0_b_payload_id (axi4WriteOnlyArbiter_4_io_inputs_1_b_payload_id[3:0] ), //i + .io_outputs_0_b_payload_resp (axi4WriteOnlyArbiter_4_io_inputs_1_b_payload_resp[1:0] ), //i + .io_outputs_1_aw_valid (axiIn_1_writeOnly_decoder_io_outputs_1_aw_valid ), //o + .io_outputs_1_aw_ready (toplevel_axiIn_1_writeOnly_decoder_io_outputs_1_aw_validPipe_fire), //i + .io_outputs_1_aw_payload_addr (axiIn_1_writeOnly_decoder_io_outputs_1_aw_payload_addr[31:0] ), //o + .io_outputs_1_aw_payload_id (axiIn_1_writeOnly_decoder_io_outputs_1_aw_payload_id[3:0] ), //o + .io_outputs_1_aw_payload_len (axiIn_1_writeOnly_decoder_io_outputs_1_aw_payload_len[7:0] ), //o + .io_outputs_1_aw_payload_size (axiIn_1_writeOnly_decoder_io_outputs_1_aw_payload_size[2:0] ), //o + .io_outputs_1_aw_payload_burst (axiIn_1_writeOnly_decoder_io_outputs_1_aw_payload_burst[1:0] ), //o + .io_outputs_1_aw_payload_lock (axiIn_1_writeOnly_decoder_io_outputs_1_aw_payload_lock ), //o + .io_outputs_1_aw_payload_cache (axiIn_1_writeOnly_decoder_io_outputs_1_aw_payload_cache[3:0] ), //o + .io_outputs_1_aw_payload_prot (axiIn_1_writeOnly_decoder_io_outputs_1_aw_payload_prot[2:0] ), //o + .io_outputs_1_w_valid (axiIn_1_writeOnly_decoder_io_outputs_1_w_valid ), //o + .io_outputs_1_w_ready (axi4WriteOnlyArbiter_5_io_inputs_1_w_ready ), //i + .io_outputs_1_w_payload_data (axiIn_1_writeOnly_decoder_io_outputs_1_w_payload_data[31:0] ), //o + .io_outputs_1_w_payload_strb (axiIn_1_writeOnly_decoder_io_outputs_1_w_payload_strb[3:0] ), //o + .io_outputs_1_w_payload_last (axiIn_1_writeOnly_decoder_io_outputs_1_w_payload_last ), //o + .io_outputs_1_b_valid (axi4WriteOnlyArbiter_5_io_inputs_1_b_valid ), //i + .io_outputs_1_b_ready (axiIn_1_writeOnly_decoder_io_outputs_1_b_ready ), //o + .io_outputs_1_b_payload_id (axi4WriteOnlyArbiter_5_io_inputs_1_b_payload_id[3:0] ), //i + .io_outputs_1_b_payload_resp (axi4WriteOnlyArbiter_5_io_inputs_1_b_payload_resp[1:0] ), //i + .io_outputs_2_aw_valid (axiIn_1_writeOnly_decoder_io_outputs_2_aw_valid ), //o + .io_outputs_2_aw_ready (toplevel_axiIn_1_writeOnly_decoder_io_outputs_2_aw_validPipe_fire), //i + .io_outputs_2_aw_payload_addr (axiIn_1_writeOnly_decoder_io_outputs_2_aw_payload_addr[31:0] ), //o + .io_outputs_2_aw_payload_id (axiIn_1_writeOnly_decoder_io_outputs_2_aw_payload_id[3:0] ), //o + .io_outputs_2_aw_payload_len (axiIn_1_writeOnly_decoder_io_outputs_2_aw_payload_len[7:0] ), //o + .io_outputs_2_aw_payload_size (axiIn_1_writeOnly_decoder_io_outputs_2_aw_payload_size[2:0] ), //o + .io_outputs_2_aw_payload_burst (axiIn_1_writeOnly_decoder_io_outputs_2_aw_payload_burst[1:0] ), //o + .io_outputs_2_aw_payload_lock (axiIn_1_writeOnly_decoder_io_outputs_2_aw_payload_lock ), //o + .io_outputs_2_aw_payload_cache (axiIn_1_writeOnly_decoder_io_outputs_2_aw_payload_cache[3:0] ), //o + .io_outputs_2_aw_payload_prot (axiIn_1_writeOnly_decoder_io_outputs_2_aw_payload_prot[2:0] ), //o + .io_outputs_2_w_valid (axiIn_1_writeOnly_decoder_io_outputs_2_w_valid ), //o + .io_outputs_2_w_ready (axi4WriteOnlyArbiter_6_io_inputs_1_w_ready ), //i + .io_outputs_2_w_payload_data (axiIn_1_writeOnly_decoder_io_outputs_2_w_payload_data[31:0] ), //o + .io_outputs_2_w_payload_strb (axiIn_1_writeOnly_decoder_io_outputs_2_w_payload_strb[3:0] ), //o + .io_outputs_2_w_payload_last (axiIn_1_writeOnly_decoder_io_outputs_2_w_payload_last ), //o + .io_outputs_2_b_valid (axi4WriteOnlyArbiter_6_io_inputs_1_b_valid ), //i + .io_outputs_2_b_ready (axiIn_1_writeOnly_decoder_io_outputs_2_b_ready ), //o + .io_outputs_2_b_payload_id (axi4WriteOnlyArbiter_6_io_inputs_1_b_payload_id[3:0] ), //i + .io_outputs_2_b_payload_resp (axi4WriteOnlyArbiter_6_io_inputs_1_b_payload_resp[1:0] ), //i + .io_outputs_3_aw_valid (axiIn_1_writeOnly_decoder_io_outputs_3_aw_valid ), //o + .io_outputs_3_aw_ready (toplevel_axiIn_1_writeOnly_decoder_io_outputs_3_aw_validPipe_fire), //i + .io_outputs_3_aw_payload_addr (axiIn_1_writeOnly_decoder_io_outputs_3_aw_payload_addr[31:0] ), //o + .io_outputs_3_aw_payload_id (axiIn_1_writeOnly_decoder_io_outputs_3_aw_payload_id[3:0] ), //o + .io_outputs_3_aw_payload_len (axiIn_1_writeOnly_decoder_io_outputs_3_aw_payload_len[7:0] ), //o + .io_outputs_3_aw_payload_size (axiIn_1_writeOnly_decoder_io_outputs_3_aw_payload_size[2:0] ), //o + .io_outputs_3_aw_payload_burst (axiIn_1_writeOnly_decoder_io_outputs_3_aw_payload_burst[1:0] ), //o + .io_outputs_3_aw_payload_lock (axiIn_1_writeOnly_decoder_io_outputs_3_aw_payload_lock ), //o + .io_outputs_3_aw_payload_cache (axiIn_1_writeOnly_decoder_io_outputs_3_aw_payload_cache[3:0] ), //o + .io_outputs_3_aw_payload_prot (axiIn_1_writeOnly_decoder_io_outputs_3_aw_payload_prot[2:0] ), //o + .io_outputs_3_w_valid (axiIn_1_writeOnly_decoder_io_outputs_3_w_valid ), //o + .io_outputs_3_w_ready (axi4WriteOnlyArbiter_7_io_inputs_1_w_ready ), //i + .io_outputs_3_w_payload_data (axiIn_1_writeOnly_decoder_io_outputs_3_w_payload_data[31:0] ), //o + .io_outputs_3_w_payload_strb (axiIn_1_writeOnly_decoder_io_outputs_3_w_payload_strb[3:0] ), //o + .io_outputs_3_w_payload_last (axiIn_1_writeOnly_decoder_io_outputs_3_w_payload_last ), //o + .io_outputs_3_b_valid (axi4WriteOnlyArbiter_7_io_inputs_1_b_valid ), //i + .io_outputs_3_b_ready (axiIn_1_writeOnly_decoder_io_outputs_3_b_ready ), //o + .io_outputs_3_b_payload_id (axi4WriteOnlyArbiter_7_io_inputs_1_b_payload_id[3:0] ), //i + .io_outputs_3_b_payload_resp (axi4WriteOnlyArbiter_7_io_inputs_1_b_payload_resp[1:0] ), //i + .clk (clk ), //i + .resetn (resetn ) //i + ); + Axi4ReadOnlyArbiter axi4ReadOnlyArbiter_4 ( + .io_inputs_0_ar_valid (toplevel_axiIn_0_readOnly_decoder_io_outputs_0_ar_validPipe_valid ), //i + .io_inputs_0_ar_ready (axi4ReadOnlyArbiter_4_io_inputs_0_ar_ready ), //o + .io_inputs_0_ar_payload_addr (toplevel_axiIn_0_readOnly_decoder_io_outputs_0_ar_validPipe_payload_addr[31:0]), //i + .io_inputs_0_ar_payload_id (toplevel_axiIn_0_readOnly_decoder_io_outputs_0_ar_validPipe_payload_id[3:0] ), //i + .io_inputs_0_ar_payload_len (toplevel_axiIn_0_readOnly_decoder_io_outputs_0_ar_validPipe_payload_len[7:0] ), //i + .io_inputs_0_ar_payload_size (toplevel_axiIn_0_readOnly_decoder_io_outputs_0_ar_validPipe_payload_size[2:0] ), //i + .io_inputs_0_ar_payload_burst (toplevel_axiIn_0_readOnly_decoder_io_outputs_0_ar_validPipe_payload_burst[1:0]), //i + .io_inputs_0_ar_payload_lock (toplevel_axiIn_0_readOnly_decoder_io_outputs_0_ar_validPipe_payload_lock ), //i + .io_inputs_0_ar_payload_cache (toplevel_axiIn_0_readOnly_decoder_io_outputs_0_ar_validPipe_payload_cache[3:0]), //i + .io_inputs_0_ar_payload_prot (toplevel_axiIn_0_readOnly_decoder_io_outputs_0_ar_validPipe_payload_prot[2:0] ), //i + .io_inputs_0_r_valid (axi4ReadOnlyArbiter_4_io_inputs_0_r_valid ), //o + .io_inputs_0_r_ready (axiIn_0_readOnly_decoder_io_outputs_0_r_ready ), //i + .io_inputs_0_r_payload_data (axi4ReadOnlyArbiter_4_io_inputs_0_r_payload_data[31:0] ), //o + .io_inputs_0_r_payload_id (axi4ReadOnlyArbiter_4_io_inputs_0_r_payload_id[3:0] ), //o + .io_inputs_0_r_payload_resp (axi4ReadOnlyArbiter_4_io_inputs_0_r_payload_resp[1:0] ), //o + .io_inputs_0_r_payload_last (axi4ReadOnlyArbiter_4_io_inputs_0_r_payload_last ), //o + .io_inputs_1_ar_valid (toplevel_axiIn_1_readOnly_decoder_io_outputs_0_ar_validPipe_valid ), //i + .io_inputs_1_ar_ready (axi4ReadOnlyArbiter_4_io_inputs_1_ar_ready ), //o + .io_inputs_1_ar_payload_addr (toplevel_axiIn_1_readOnly_decoder_io_outputs_0_ar_validPipe_payload_addr[31:0]), //i + .io_inputs_1_ar_payload_id (toplevel_axiIn_1_readOnly_decoder_io_outputs_0_ar_validPipe_payload_id[3:0] ), //i + .io_inputs_1_ar_payload_len (toplevel_axiIn_1_readOnly_decoder_io_outputs_0_ar_validPipe_payload_len[7:0] ), //i + .io_inputs_1_ar_payload_size (toplevel_axiIn_1_readOnly_decoder_io_outputs_0_ar_validPipe_payload_size[2:0] ), //i + .io_inputs_1_ar_payload_burst (toplevel_axiIn_1_readOnly_decoder_io_outputs_0_ar_validPipe_payload_burst[1:0]), //i + .io_inputs_1_ar_payload_lock (toplevel_axiIn_1_readOnly_decoder_io_outputs_0_ar_validPipe_payload_lock ), //i + .io_inputs_1_ar_payload_cache (toplevel_axiIn_1_readOnly_decoder_io_outputs_0_ar_validPipe_payload_cache[3:0]), //i + .io_inputs_1_ar_payload_prot (toplevel_axiIn_1_readOnly_decoder_io_outputs_0_ar_validPipe_payload_prot[2:0] ), //i + .io_inputs_1_r_valid (axi4ReadOnlyArbiter_4_io_inputs_1_r_valid ), //o + .io_inputs_1_r_ready (axiIn_1_readOnly_decoder_io_outputs_0_r_ready ), //i + .io_inputs_1_r_payload_data (axi4ReadOnlyArbiter_4_io_inputs_1_r_payload_data[31:0] ), //o + .io_inputs_1_r_payload_id (axi4ReadOnlyArbiter_4_io_inputs_1_r_payload_id[3:0] ), //o + .io_inputs_1_r_payload_resp (axi4ReadOnlyArbiter_4_io_inputs_1_r_payload_resp[1:0] ), //o + .io_inputs_1_r_payload_last (axi4ReadOnlyArbiter_4_io_inputs_1_r_payload_last ), //o + .io_output_ar_valid (axi4ReadOnlyArbiter_4_io_output_ar_valid ), //o + .io_output_ar_ready (axiOut_0_arready ), //i + .io_output_ar_payload_addr (axi4ReadOnlyArbiter_4_io_output_ar_payload_addr[31:0] ), //o + .io_output_ar_payload_id (axi4ReadOnlyArbiter_4_io_output_ar_payload_id[4:0] ), //o + .io_output_ar_payload_len (axi4ReadOnlyArbiter_4_io_output_ar_payload_len[7:0] ), //o + .io_output_ar_payload_size (axi4ReadOnlyArbiter_4_io_output_ar_payload_size[2:0] ), //o + .io_output_ar_payload_burst (axi4ReadOnlyArbiter_4_io_output_ar_payload_burst[1:0] ), //o + .io_output_ar_payload_lock (axi4ReadOnlyArbiter_4_io_output_ar_payload_lock ), //o + .io_output_ar_payload_cache (axi4ReadOnlyArbiter_4_io_output_ar_payload_cache[3:0] ), //o + .io_output_ar_payload_prot (axi4ReadOnlyArbiter_4_io_output_ar_payload_prot[2:0] ), //o + .io_output_r_valid (axiOut_0_rvalid ), //i + .io_output_r_ready (axi4ReadOnlyArbiter_4_io_output_r_ready ), //o + .io_output_r_payload_data (axiOut_0_rdata[31:0] ), //i + .io_output_r_payload_id (axiOut_0_rid[4:0] ), //i + .io_output_r_payload_resp (axiOut_0_rresp[1:0] ), //i + .io_output_r_payload_last (axiOut_0_rlast ), //i + .clk (clk ), //i + .resetn (resetn ) //i + ); + Axi4WriteOnlyArbiter axi4WriteOnlyArbiter_4 ( + .io_inputs_0_aw_valid (toplevel_axiIn_0_writeOnly_decoder_io_outputs_0_aw_validPipe_valid ), //i + .io_inputs_0_aw_ready (axi4WriteOnlyArbiter_4_io_inputs_0_aw_ready ), //o + .io_inputs_0_aw_payload_addr (toplevel_axiIn_0_writeOnly_decoder_io_outputs_0_aw_validPipe_payload_addr[31:0]), //i + .io_inputs_0_aw_payload_id (toplevel_axiIn_0_writeOnly_decoder_io_outputs_0_aw_validPipe_payload_id[3:0] ), //i + .io_inputs_0_aw_payload_len (toplevel_axiIn_0_writeOnly_decoder_io_outputs_0_aw_validPipe_payload_len[7:0] ), //i + .io_inputs_0_aw_payload_size (toplevel_axiIn_0_writeOnly_decoder_io_outputs_0_aw_validPipe_payload_size[2:0] ), //i + .io_inputs_0_aw_payload_burst (toplevel_axiIn_0_writeOnly_decoder_io_outputs_0_aw_validPipe_payload_burst[1:0]), //i + .io_inputs_0_aw_payload_lock (toplevel_axiIn_0_writeOnly_decoder_io_outputs_0_aw_validPipe_payload_lock ), //i + .io_inputs_0_aw_payload_cache (toplevel_axiIn_0_writeOnly_decoder_io_outputs_0_aw_validPipe_payload_cache[3:0]), //i + .io_inputs_0_aw_payload_prot (toplevel_axiIn_0_writeOnly_decoder_io_outputs_0_aw_validPipe_payload_prot[2:0] ), //i + .io_inputs_0_w_valid (axiIn_0_writeOnly_decoder_io_outputs_0_w_valid ), //i + .io_inputs_0_w_ready (axi4WriteOnlyArbiter_4_io_inputs_0_w_ready ), //o + .io_inputs_0_w_payload_data (axiIn_0_writeOnly_decoder_io_outputs_0_w_payload_data[31:0] ), //i + .io_inputs_0_w_payload_strb (axiIn_0_writeOnly_decoder_io_outputs_0_w_payload_strb[3:0] ), //i + .io_inputs_0_w_payload_last (axiIn_0_writeOnly_decoder_io_outputs_0_w_payload_last ), //i + .io_inputs_0_b_valid (axi4WriteOnlyArbiter_4_io_inputs_0_b_valid ), //o + .io_inputs_0_b_ready (axiIn_0_writeOnly_decoder_io_outputs_0_b_ready ), //i + .io_inputs_0_b_payload_id (axi4WriteOnlyArbiter_4_io_inputs_0_b_payload_id[3:0] ), //o + .io_inputs_0_b_payload_resp (axi4WriteOnlyArbiter_4_io_inputs_0_b_payload_resp[1:0] ), //o + .io_inputs_1_aw_valid (toplevel_axiIn_1_writeOnly_decoder_io_outputs_0_aw_validPipe_valid ), //i + .io_inputs_1_aw_ready (axi4WriteOnlyArbiter_4_io_inputs_1_aw_ready ), //o + .io_inputs_1_aw_payload_addr (toplevel_axiIn_1_writeOnly_decoder_io_outputs_0_aw_validPipe_payload_addr[31:0]), //i + .io_inputs_1_aw_payload_id (toplevel_axiIn_1_writeOnly_decoder_io_outputs_0_aw_validPipe_payload_id[3:0] ), //i + .io_inputs_1_aw_payload_len (toplevel_axiIn_1_writeOnly_decoder_io_outputs_0_aw_validPipe_payload_len[7:0] ), //i + .io_inputs_1_aw_payload_size (toplevel_axiIn_1_writeOnly_decoder_io_outputs_0_aw_validPipe_payload_size[2:0] ), //i + .io_inputs_1_aw_payload_burst (toplevel_axiIn_1_writeOnly_decoder_io_outputs_0_aw_validPipe_payload_burst[1:0]), //i + .io_inputs_1_aw_payload_lock (toplevel_axiIn_1_writeOnly_decoder_io_outputs_0_aw_validPipe_payload_lock ), //i + .io_inputs_1_aw_payload_cache (toplevel_axiIn_1_writeOnly_decoder_io_outputs_0_aw_validPipe_payload_cache[3:0]), //i + .io_inputs_1_aw_payload_prot (toplevel_axiIn_1_writeOnly_decoder_io_outputs_0_aw_validPipe_payload_prot[2:0] ), //i + .io_inputs_1_w_valid (axiIn_1_writeOnly_decoder_io_outputs_0_w_valid ), //i + .io_inputs_1_w_ready (axi4WriteOnlyArbiter_4_io_inputs_1_w_ready ), //o + .io_inputs_1_w_payload_data (axiIn_1_writeOnly_decoder_io_outputs_0_w_payload_data[31:0] ), //i + .io_inputs_1_w_payload_strb (axiIn_1_writeOnly_decoder_io_outputs_0_w_payload_strb[3:0] ), //i + .io_inputs_1_w_payload_last (axiIn_1_writeOnly_decoder_io_outputs_0_w_payload_last ), //i + .io_inputs_1_b_valid (axi4WriteOnlyArbiter_4_io_inputs_1_b_valid ), //o + .io_inputs_1_b_ready (axiIn_1_writeOnly_decoder_io_outputs_0_b_ready ), //i + .io_inputs_1_b_payload_id (axi4WriteOnlyArbiter_4_io_inputs_1_b_payload_id[3:0] ), //o + .io_inputs_1_b_payload_resp (axi4WriteOnlyArbiter_4_io_inputs_1_b_payload_resp[1:0] ), //o + .io_output_aw_valid (axi4WriteOnlyArbiter_4_io_output_aw_valid ), //o + .io_output_aw_ready (axiOut_0_awready ), //i + .io_output_aw_payload_addr (axi4WriteOnlyArbiter_4_io_output_aw_payload_addr[31:0] ), //o + .io_output_aw_payload_id (axi4WriteOnlyArbiter_4_io_output_aw_payload_id[4:0] ), //o + .io_output_aw_payload_len (axi4WriteOnlyArbiter_4_io_output_aw_payload_len[7:0] ), //o + .io_output_aw_payload_size (axi4WriteOnlyArbiter_4_io_output_aw_payload_size[2:0] ), //o + .io_output_aw_payload_burst (axi4WriteOnlyArbiter_4_io_output_aw_payload_burst[1:0] ), //o + .io_output_aw_payload_lock (axi4WriteOnlyArbiter_4_io_output_aw_payload_lock ), //o + .io_output_aw_payload_cache (axi4WriteOnlyArbiter_4_io_output_aw_payload_cache[3:0] ), //o + .io_output_aw_payload_prot (axi4WriteOnlyArbiter_4_io_output_aw_payload_prot[2:0] ), //o + .io_output_w_valid (axi4WriteOnlyArbiter_4_io_output_w_valid ), //o + .io_output_w_ready (axiOut_0_wready ), //i + .io_output_w_payload_data (axi4WriteOnlyArbiter_4_io_output_w_payload_data[31:0] ), //o + .io_output_w_payload_strb (axi4WriteOnlyArbiter_4_io_output_w_payload_strb[3:0] ), //o + .io_output_w_payload_last (axi4WriteOnlyArbiter_4_io_output_w_payload_last ), //o + .io_output_b_valid (axiOut_0_bvalid ), //i + .io_output_b_ready (axi4WriteOnlyArbiter_4_io_output_b_ready ), //o + .io_output_b_payload_id (axiOut_0_bid[4:0] ), //i + .io_output_b_payload_resp (axiOut_0_bresp[1:0] ), //i + .clk (clk ), //i + .resetn (resetn ) //i + ); + Axi4ReadOnlyArbiter axi4ReadOnlyArbiter_5 ( + .io_inputs_0_ar_valid (toplevel_axiIn_0_readOnly_decoder_io_outputs_1_ar_validPipe_valid ), //i + .io_inputs_0_ar_ready (axi4ReadOnlyArbiter_5_io_inputs_0_ar_ready ), //o + .io_inputs_0_ar_payload_addr (toplevel_axiIn_0_readOnly_decoder_io_outputs_1_ar_validPipe_payload_addr[31:0]), //i + .io_inputs_0_ar_payload_id (toplevel_axiIn_0_readOnly_decoder_io_outputs_1_ar_validPipe_payload_id[3:0] ), //i + .io_inputs_0_ar_payload_len (toplevel_axiIn_0_readOnly_decoder_io_outputs_1_ar_validPipe_payload_len[7:0] ), //i + .io_inputs_0_ar_payload_size (toplevel_axiIn_0_readOnly_decoder_io_outputs_1_ar_validPipe_payload_size[2:0] ), //i + .io_inputs_0_ar_payload_burst (toplevel_axiIn_0_readOnly_decoder_io_outputs_1_ar_validPipe_payload_burst[1:0]), //i + .io_inputs_0_ar_payload_lock (toplevel_axiIn_0_readOnly_decoder_io_outputs_1_ar_validPipe_payload_lock ), //i + .io_inputs_0_ar_payload_cache (toplevel_axiIn_0_readOnly_decoder_io_outputs_1_ar_validPipe_payload_cache[3:0]), //i + .io_inputs_0_ar_payload_prot (toplevel_axiIn_0_readOnly_decoder_io_outputs_1_ar_validPipe_payload_prot[2:0] ), //i + .io_inputs_0_r_valid (axi4ReadOnlyArbiter_5_io_inputs_0_r_valid ), //o + .io_inputs_0_r_ready (axiIn_0_readOnly_decoder_io_outputs_1_r_ready ), //i + .io_inputs_0_r_payload_data (axi4ReadOnlyArbiter_5_io_inputs_0_r_payload_data[31:0] ), //o + .io_inputs_0_r_payload_id (axi4ReadOnlyArbiter_5_io_inputs_0_r_payload_id[3:0] ), //o + .io_inputs_0_r_payload_resp (axi4ReadOnlyArbiter_5_io_inputs_0_r_payload_resp[1:0] ), //o + .io_inputs_0_r_payload_last (axi4ReadOnlyArbiter_5_io_inputs_0_r_payload_last ), //o + .io_inputs_1_ar_valid (toplevel_axiIn_1_readOnly_decoder_io_outputs_1_ar_validPipe_valid ), //i + .io_inputs_1_ar_ready (axi4ReadOnlyArbiter_5_io_inputs_1_ar_ready ), //o + .io_inputs_1_ar_payload_addr (toplevel_axiIn_1_readOnly_decoder_io_outputs_1_ar_validPipe_payload_addr[31:0]), //i + .io_inputs_1_ar_payload_id (toplevel_axiIn_1_readOnly_decoder_io_outputs_1_ar_validPipe_payload_id[3:0] ), //i + .io_inputs_1_ar_payload_len (toplevel_axiIn_1_readOnly_decoder_io_outputs_1_ar_validPipe_payload_len[7:0] ), //i + .io_inputs_1_ar_payload_size (toplevel_axiIn_1_readOnly_decoder_io_outputs_1_ar_validPipe_payload_size[2:0] ), //i + .io_inputs_1_ar_payload_burst (toplevel_axiIn_1_readOnly_decoder_io_outputs_1_ar_validPipe_payload_burst[1:0]), //i + .io_inputs_1_ar_payload_lock (toplevel_axiIn_1_readOnly_decoder_io_outputs_1_ar_validPipe_payload_lock ), //i + .io_inputs_1_ar_payload_cache (toplevel_axiIn_1_readOnly_decoder_io_outputs_1_ar_validPipe_payload_cache[3:0]), //i + .io_inputs_1_ar_payload_prot (toplevel_axiIn_1_readOnly_decoder_io_outputs_1_ar_validPipe_payload_prot[2:0] ), //i + .io_inputs_1_r_valid (axi4ReadOnlyArbiter_5_io_inputs_1_r_valid ), //o + .io_inputs_1_r_ready (axiIn_1_readOnly_decoder_io_outputs_1_r_ready ), //i + .io_inputs_1_r_payload_data (axi4ReadOnlyArbiter_5_io_inputs_1_r_payload_data[31:0] ), //o + .io_inputs_1_r_payload_id (axi4ReadOnlyArbiter_5_io_inputs_1_r_payload_id[3:0] ), //o + .io_inputs_1_r_payload_resp (axi4ReadOnlyArbiter_5_io_inputs_1_r_payload_resp[1:0] ), //o + .io_inputs_1_r_payload_last (axi4ReadOnlyArbiter_5_io_inputs_1_r_payload_last ), //o + .io_output_ar_valid (axi4ReadOnlyArbiter_5_io_output_ar_valid ), //o + .io_output_ar_ready (axiOut_1_arready ), //i + .io_output_ar_payload_addr (axi4ReadOnlyArbiter_5_io_output_ar_payload_addr[31:0] ), //o + .io_output_ar_payload_id (axi4ReadOnlyArbiter_5_io_output_ar_payload_id[4:0] ), //o + .io_output_ar_payload_len (axi4ReadOnlyArbiter_5_io_output_ar_payload_len[7:0] ), //o + .io_output_ar_payload_size (axi4ReadOnlyArbiter_5_io_output_ar_payload_size[2:0] ), //o + .io_output_ar_payload_burst (axi4ReadOnlyArbiter_5_io_output_ar_payload_burst[1:0] ), //o + .io_output_ar_payload_lock (axi4ReadOnlyArbiter_5_io_output_ar_payload_lock ), //o + .io_output_ar_payload_cache (axi4ReadOnlyArbiter_5_io_output_ar_payload_cache[3:0] ), //o + .io_output_ar_payload_prot (axi4ReadOnlyArbiter_5_io_output_ar_payload_prot[2:0] ), //o + .io_output_r_valid (axiOut_1_rvalid ), //i + .io_output_r_ready (axi4ReadOnlyArbiter_5_io_output_r_ready ), //o + .io_output_r_payload_data (axiOut_1_rdata[31:0] ), //i + .io_output_r_payload_id (axiOut_1_rid[4:0] ), //i + .io_output_r_payload_resp (axiOut_1_rresp[1:0] ), //i + .io_output_r_payload_last (axiOut_1_rlast ), //i + .clk (clk ), //i + .resetn (resetn ) //i + ); + Axi4WriteOnlyArbiter_1 axi4WriteOnlyArbiter_5 ( + .io_inputs_0_aw_valid (toplevel_axiIn_0_writeOnly_decoder_io_outputs_1_aw_validPipe_valid ), //i + .io_inputs_0_aw_ready (axi4WriteOnlyArbiter_5_io_inputs_0_aw_ready ), //o + .io_inputs_0_aw_payload_addr (toplevel_axiIn_0_writeOnly_decoder_io_outputs_1_aw_validPipe_payload_addr[31:0]), //i + .io_inputs_0_aw_payload_id (toplevel_axiIn_0_writeOnly_decoder_io_outputs_1_aw_validPipe_payload_id[3:0] ), //i + .io_inputs_0_aw_payload_len (toplevel_axiIn_0_writeOnly_decoder_io_outputs_1_aw_validPipe_payload_len[7:0] ), //i + .io_inputs_0_aw_payload_size (toplevel_axiIn_0_writeOnly_decoder_io_outputs_1_aw_validPipe_payload_size[2:0] ), //i + .io_inputs_0_aw_payload_burst (toplevel_axiIn_0_writeOnly_decoder_io_outputs_1_aw_validPipe_payload_burst[1:0]), //i + .io_inputs_0_aw_payload_lock (toplevel_axiIn_0_writeOnly_decoder_io_outputs_1_aw_validPipe_payload_lock ), //i + .io_inputs_0_aw_payload_cache (toplevel_axiIn_0_writeOnly_decoder_io_outputs_1_aw_validPipe_payload_cache[3:0]), //i + .io_inputs_0_aw_payload_prot (toplevel_axiIn_0_writeOnly_decoder_io_outputs_1_aw_validPipe_payload_prot[2:0] ), //i + .io_inputs_0_w_valid (axiIn_0_writeOnly_decoder_io_outputs_1_w_valid ), //i + .io_inputs_0_w_ready (axi4WriteOnlyArbiter_5_io_inputs_0_w_ready ), //o + .io_inputs_0_w_payload_data (axiIn_0_writeOnly_decoder_io_outputs_1_w_payload_data[31:0] ), //i + .io_inputs_0_w_payload_strb (axiIn_0_writeOnly_decoder_io_outputs_1_w_payload_strb[3:0] ), //i + .io_inputs_0_w_payload_last (axiIn_0_writeOnly_decoder_io_outputs_1_w_payload_last ), //i + .io_inputs_0_b_valid (axi4WriteOnlyArbiter_5_io_inputs_0_b_valid ), //o + .io_inputs_0_b_ready (axiIn_0_writeOnly_decoder_io_outputs_1_b_ready ), //i + .io_inputs_0_b_payload_id (axi4WriteOnlyArbiter_5_io_inputs_0_b_payload_id[3:0] ), //o + .io_inputs_0_b_payload_resp (axi4WriteOnlyArbiter_5_io_inputs_0_b_payload_resp[1:0] ), //o + .io_inputs_1_aw_valid (toplevel_axiIn_1_writeOnly_decoder_io_outputs_1_aw_validPipe_valid ), //i + .io_inputs_1_aw_ready (axi4WriteOnlyArbiter_5_io_inputs_1_aw_ready ), //o + .io_inputs_1_aw_payload_addr (toplevel_axiIn_1_writeOnly_decoder_io_outputs_1_aw_validPipe_payload_addr[31:0]), //i + .io_inputs_1_aw_payload_id (toplevel_axiIn_1_writeOnly_decoder_io_outputs_1_aw_validPipe_payload_id[3:0] ), //i + .io_inputs_1_aw_payload_len (toplevel_axiIn_1_writeOnly_decoder_io_outputs_1_aw_validPipe_payload_len[7:0] ), //i + .io_inputs_1_aw_payload_size (toplevel_axiIn_1_writeOnly_decoder_io_outputs_1_aw_validPipe_payload_size[2:0] ), //i + .io_inputs_1_aw_payload_burst (toplevel_axiIn_1_writeOnly_decoder_io_outputs_1_aw_validPipe_payload_burst[1:0]), //i + .io_inputs_1_aw_payload_lock (toplevel_axiIn_1_writeOnly_decoder_io_outputs_1_aw_validPipe_payload_lock ), //i + .io_inputs_1_aw_payload_cache (toplevel_axiIn_1_writeOnly_decoder_io_outputs_1_aw_validPipe_payload_cache[3:0]), //i + .io_inputs_1_aw_payload_prot (toplevel_axiIn_1_writeOnly_decoder_io_outputs_1_aw_validPipe_payload_prot[2:0] ), //i + .io_inputs_1_w_valid (axiIn_1_writeOnly_decoder_io_outputs_1_w_valid ), //i + .io_inputs_1_w_ready (axi4WriteOnlyArbiter_5_io_inputs_1_w_ready ), //o + .io_inputs_1_w_payload_data (axiIn_1_writeOnly_decoder_io_outputs_1_w_payload_data[31:0] ), //i + .io_inputs_1_w_payload_strb (axiIn_1_writeOnly_decoder_io_outputs_1_w_payload_strb[3:0] ), //i + .io_inputs_1_w_payload_last (axiIn_1_writeOnly_decoder_io_outputs_1_w_payload_last ), //i + .io_inputs_1_b_valid (axi4WriteOnlyArbiter_5_io_inputs_1_b_valid ), //o + .io_inputs_1_b_ready (axiIn_1_writeOnly_decoder_io_outputs_1_b_ready ), //i + .io_inputs_1_b_payload_id (axi4WriteOnlyArbiter_5_io_inputs_1_b_payload_id[3:0] ), //o + .io_inputs_1_b_payload_resp (axi4WriteOnlyArbiter_5_io_inputs_1_b_payload_resp[1:0] ), //o + .io_output_aw_valid (axi4WriteOnlyArbiter_5_io_output_aw_valid ), //o + .io_output_aw_ready (axiOut_1_awready ), //i + .io_output_aw_payload_addr (axi4WriteOnlyArbiter_5_io_output_aw_payload_addr[31:0] ), //o + .io_output_aw_payload_id (axi4WriteOnlyArbiter_5_io_output_aw_payload_id[4:0] ), //o + .io_output_aw_payload_len (axi4WriteOnlyArbiter_5_io_output_aw_payload_len[7:0] ), //o + .io_output_aw_payload_size (axi4WriteOnlyArbiter_5_io_output_aw_payload_size[2:0] ), //o + .io_output_aw_payload_burst (axi4WriteOnlyArbiter_5_io_output_aw_payload_burst[1:0] ), //o + .io_output_aw_payload_lock (axi4WriteOnlyArbiter_5_io_output_aw_payload_lock ), //o + .io_output_aw_payload_cache (axi4WriteOnlyArbiter_5_io_output_aw_payload_cache[3:0] ), //o + .io_output_aw_payload_prot (axi4WriteOnlyArbiter_5_io_output_aw_payload_prot[2:0] ), //o + .io_output_w_valid (axi4WriteOnlyArbiter_5_io_output_w_valid ), //o + .io_output_w_ready (axiOut_1_wready ), //i + .io_output_w_payload_data (axi4WriteOnlyArbiter_5_io_output_w_payload_data[31:0] ), //o + .io_output_w_payload_strb (axi4WriteOnlyArbiter_5_io_output_w_payload_strb[3:0] ), //o + .io_output_w_payload_last (axi4WriteOnlyArbiter_5_io_output_w_payload_last ), //o + .io_output_b_valid (axiOut_1_bvalid ), //i + .io_output_b_ready (axi4WriteOnlyArbiter_5_io_output_b_ready ), //o + .io_output_b_payload_id (axiOut_1_bid[4:0] ), //i + .io_output_b_payload_resp (axiOut_1_bresp[1:0] ), //i + .clk (clk ), //i + .resetn (resetn ) //i + ); + Axi4ReadOnlyArbiter axi4ReadOnlyArbiter_6 ( + .io_inputs_0_ar_valid (toplevel_axiIn_0_readOnly_decoder_io_outputs_6_ar_validPipe_valid ), //i + .io_inputs_0_ar_ready (axi4ReadOnlyArbiter_6_io_inputs_0_ar_ready ), //o + .io_inputs_0_ar_payload_addr (toplevel_axiIn_0_readOnly_decoder_io_outputs_6_ar_validPipe_payload_addr[31:0]), //i + .io_inputs_0_ar_payload_id (toplevel_axiIn_0_readOnly_decoder_io_outputs_6_ar_validPipe_payload_id[3:0] ), //i + .io_inputs_0_ar_payload_len (toplevel_axiIn_0_readOnly_decoder_io_outputs_6_ar_validPipe_payload_len[7:0] ), //i + .io_inputs_0_ar_payload_size (toplevel_axiIn_0_readOnly_decoder_io_outputs_6_ar_validPipe_payload_size[2:0] ), //i + .io_inputs_0_ar_payload_burst (toplevel_axiIn_0_readOnly_decoder_io_outputs_6_ar_validPipe_payload_burst[1:0]), //i + .io_inputs_0_ar_payload_lock (toplevel_axiIn_0_readOnly_decoder_io_outputs_6_ar_validPipe_payload_lock ), //i + .io_inputs_0_ar_payload_cache (toplevel_axiIn_0_readOnly_decoder_io_outputs_6_ar_validPipe_payload_cache[3:0]), //i + .io_inputs_0_ar_payload_prot (toplevel_axiIn_0_readOnly_decoder_io_outputs_6_ar_validPipe_payload_prot[2:0] ), //i + .io_inputs_0_r_valid (axi4ReadOnlyArbiter_6_io_inputs_0_r_valid ), //o + .io_inputs_0_r_ready (axiIn_0_readOnly_decoder_io_outputs_6_r_ready ), //i + .io_inputs_0_r_payload_data (axi4ReadOnlyArbiter_6_io_inputs_0_r_payload_data[31:0] ), //o + .io_inputs_0_r_payload_id (axi4ReadOnlyArbiter_6_io_inputs_0_r_payload_id[3:0] ), //o + .io_inputs_0_r_payload_resp (axi4ReadOnlyArbiter_6_io_inputs_0_r_payload_resp[1:0] ), //o + .io_inputs_0_r_payload_last (axi4ReadOnlyArbiter_6_io_inputs_0_r_payload_last ), //o + .io_inputs_1_ar_valid (toplevel_axiIn_1_readOnly_decoder_io_outputs_2_ar_validPipe_valid ), //i + .io_inputs_1_ar_ready (axi4ReadOnlyArbiter_6_io_inputs_1_ar_ready ), //o + .io_inputs_1_ar_payload_addr (toplevel_axiIn_1_readOnly_decoder_io_outputs_2_ar_validPipe_payload_addr[31:0]), //i + .io_inputs_1_ar_payload_id (toplevel_axiIn_1_readOnly_decoder_io_outputs_2_ar_validPipe_payload_id[3:0] ), //i + .io_inputs_1_ar_payload_len (toplevel_axiIn_1_readOnly_decoder_io_outputs_2_ar_validPipe_payload_len[7:0] ), //i + .io_inputs_1_ar_payload_size (toplevel_axiIn_1_readOnly_decoder_io_outputs_2_ar_validPipe_payload_size[2:0] ), //i + .io_inputs_1_ar_payload_burst (toplevel_axiIn_1_readOnly_decoder_io_outputs_2_ar_validPipe_payload_burst[1:0]), //i + .io_inputs_1_ar_payload_lock (toplevel_axiIn_1_readOnly_decoder_io_outputs_2_ar_validPipe_payload_lock ), //i + .io_inputs_1_ar_payload_cache (toplevel_axiIn_1_readOnly_decoder_io_outputs_2_ar_validPipe_payload_cache[3:0]), //i + .io_inputs_1_ar_payload_prot (toplevel_axiIn_1_readOnly_decoder_io_outputs_2_ar_validPipe_payload_prot[2:0] ), //i + .io_inputs_1_r_valid (axi4ReadOnlyArbiter_6_io_inputs_1_r_valid ), //o + .io_inputs_1_r_ready (axiIn_1_readOnly_decoder_io_outputs_2_r_ready ), //i + .io_inputs_1_r_payload_data (axi4ReadOnlyArbiter_6_io_inputs_1_r_payload_data[31:0] ), //o + .io_inputs_1_r_payload_id (axi4ReadOnlyArbiter_6_io_inputs_1_r_payload_id[3:0] ), //o + .io_inputs_1_r_payload_resp (axi4ReadOnlyArbiter_6_io_inputs_1_r_payload_resp[1:0] ), //o + .io_inputs_1_r_payload_last (axi4ReadOnlyArbiter_6_io_inputs_1_r_payload_last ), //o + .io_output_ar_valid (axi4ReadOnlyArbiter_6_io_output_ar_valid ), //o + .io_output_ar_ready (axiOut_6_arready ), //i + .io_output_ar_payload_addr (axi4ReadOnlyArbiter_6_io_output_ar_payload_addr[31:0] ), //o + .io_output_ar_payload_id (axi4ReadOnlyArbiter_6_io_output_ar_payload_id[4:0] ), //o + .io_output_ar_payload_len (axi4ReadOnlyArbiter_6_io_output_ar_payload_len[7:0] ), //o + .io_output_ar_payload_size (axi4ReadOnlyArbiter_6_io_output_ar_payload_size[2:0] ), //o + .io_output_ar_payload_burst (axi4ReadOnlyArbiter_6_io_output_ar_payload_burst[1:0] ), //o + .io_output_ar_payload_lock (axi4ReadOnlyArbiter_6_io_output_ar_payload_lock ), //o + .io_output_ar_payload_cache (axi4ReadOnlyArbiter_6_io_output_ar_payload_cache[3:0] ), //o + .io_output_ar_payload_prot (axi4ReadOnlyArbiter_6_io_output_ar_payload_prot[2:0] ), //o + .io_output_r_valid (axiOut_6_rvalid ), //i + .io_output_r_ready (axi4ReadOnlyArbiter_6_io_output_r_ready ), //o + .io_output_r_payload_data (axiOut_6_rdata[31:0] ), //i + .io_output_r_payload_id (axiOut_6_rid[4:0] ), //i + .io_output_r_payload_resp (axiOut_6_rresp[1:0] ), //i + .io_output_r_payload_last (axiOut_6_rlast ), //i + .clk (clk ), //i + .resetn (resetn ) //i + ); + Axi4WriteOnlyArbiter_2 axi4WriteOnlyArbiter_6 ( + .io_inputs_0_aw_valid (toplevel_axiIn_0_writeOnly_decoder_io_outputs_6_aw_validPipe_valid ), //i + .io_inputs_0_aw_ready (axi4WriteOnlyArbiter_6_io_inputs_0_aw_ready ), //o + .io_inputs_0_aw_payload_addr (toplevel_axiIn_0_writeOnly_decoder_io_outputs_6_aw_validPipe_payload_addr[31:0]), //i + .io_inputs_0_aw_payload_id (toplevel_axiIn_0_writeOnly_decoder_io_outputs_6_aw_validPipe_payload_id[3:0] ), //i + .io_inputs_0_aw_payload_len (toplevel_axiIn_0_writeOnly_decoder_io_outputs_6_aw_validPipe_payload_len[7:0] ), //i + .io_inputs_0_aw_payload_size (toplevel_axiIn_0_writeOnly_decoder_io_outputs_6_aw_validPipe_payload_size[2:0] ), //i + .io_inputs_0_aw_payload_burst (toplevel_axiIn_0_writeOnly_decoder_io_outputs_6_aw_validPipe_payload_burst[1:0]), //i + .io_inputs_0_aw_payload_lock (toplevel_axiIn_0_writeOnly_decoder_io_outputs_6_aw_validPipe_payload_lock ), //i + .io_inputs_0_aw_payload_cache (toplevel_axiIn_0_writeOnly_decoder_io_outputs_6_aw_validPipe_payload_cache[3:0]), //i + .io_inputs_0_aw_payload_prot (toplevel_axiIn_0_writeOnly_decoder_io_outputs_6_aw_validPipe_payload_prot[2:0] ), //i + .io_inputs_0_w_valid (axiIn_0_writeOnly_decoder_io_outputs_6_w_valid ), //i + .io_inputs_0_w_ready (axi4WriteOnlyArbiter_6_io_inputs_0_w_ready ), //o + .io_inputs_0_w_payload_data (axiIn_0_writeOnly_decoder_io_outputs_6_w_payload_data[31:0] ), //i + .io_inputs_0_w_payload_strb (axiIn_0_writeOnly_decoder_io_outputs_6_w_payload_strb[3:0] ), //i + .io_inputs_0_w_payload_last (axiIn_0_writeOnly_decoder_io_outputs_6_w_payload_last ), //i + .io_inputs_0_b_valid (axi4WriteOnlyArbiter_6_io_inputs_0_b_valid ), //o + .io_inputs_0_b_ready (axiIn_0_writeOnly_decoder_io_outputs_6_b_ready ), //i + .io_inputs_0_b_payload_id (axi4WriteOnlyArbiter_6_io_inputs_0_b_payload_id[3:0] ), //o + .io_inputs_0_b_payload_resp (axi4WriteOnlyArbiter_6_io_inputs_0_b_payload_resp[1:0] ), //o + .io_inputs_1_aw_valid (toplevel_axiIn_1_writeOnly_decoder_io_outputs_2_aw_validPipe_valid ), //i + .io_inputs_1_aw_ready (axi4WriteOnlyArbiter_6_io_inputs_1_aw_ready ), //o + .io_inputs_1_aw_payload_addr (toplevel_axiIn_1_writeOnly_decoder_io_outputs_2_aw_validPipe_payload_addr[31:0]), //i + .io_inputs_1_aw_payload_id (toplevel_axiIn_1_writeOnly_decoder_io_outputs_2_aw_validPipe_payload_id[3:0] ), //i + .io_inputs_1_aw_payload_len (toplevel_axiIn_1_writeOnly_decoder_io_outputs_2_aw_validPipe_payload_len[7:0] ), //i + .io_inputs_1_aw_payload_size (toplevel_axiIn_1_writeOnly_decoder_io_outputs_2_aw_validPipe_payload_size[2:0] ), //i + .io_inputs_1_aw_payload_burst (toplevel_axiIn_1_writeOnly_decoder_io_outputs_2_aw_validPipe_payload_burst[1:0]), //i + .io_inputs_1_aw_payload_lock (toplevel_axiIn_1_writeOnly_decoder_io_outputs_2_aw_validPipe_payload_lock ), //i + .io_inputs_1_aw_payload_cache (toplevel_axiIn_1_writeOnly_decoder_io_outputs_2_aw_validPipe_payload_cache[3:0]), //i + .io_inputs_1_aw_payload_prot (toplevel_axiIn_1_writeOnly_decoder_io_outputs_2_aw_validPipe_payload_prot[2:0] ), //i + .io_inputs_1_w_valid (axiIn_1_writeOnly_decoder_io_outputs_2_w_valid ), //i + .io_inputs_1_w_ready (axi4WriteOnlyArbiter_6_io_inputs_1_w_ready ), //o + .io_inputs_1_w_payload_data (axiIn_1_writeOnly_decoder_io_outputs_2_w_payload_data[31:0] ), //i + .io_inputs_1_w_payload_strb (axiIn_1_writeOnly_decoder_io_outputs_2_w_payload_strb[3:0] ), //i + .io_inputs_1_w_payload_last (axiIn_1_writeOnly_decoder_io_outputs_2_w_payload_last ), //i + .io_inputs_1_b_valid (axi4WriteOnlyArbiter_6_io_inputs_1_b_valid ), //o + .io_inputs_1_b_ready (axiIn_1_writeOnly_decoder_io_outputs_2_b_ready ), //i + .io_inputs_1_b_payload_id (axi4WriteOnlyArbiter_6_io_inputs_1_b_payload_id[3:0] ), //o + .io_inputs_1_b_payload_resp (axi4WriteOnlyArbiter_6_io_inputs_1_b_payload_resp[1:0] ), //o + .io_output_aw_valid (axi4WriteOnlyArbiter_6_io_output_aw_valid ), //o + .io_output_aw_ready (axiOut_6_awready ), //i + .io_output_aw_payload_addr (axi4WriteOnlyArbiter_6_io_output_aw_payload_addr[31:0] ), //o + .io_output_aw_payload_id (axi4WriteOnlyArbiter_6_io_output_aw_payload_id[4:0] ), //o + .io_output_aw_payload_len (axi4WriteOnlyArbiter_6_io_output_aw_payload_len[7:0] ), //o + .io_output_aw_payload_size (axi4WriteOnlyArbiter_6_io_output_aw_payload_size[2:0] ), //o + .io_output_aw_payload_burst (axi4WriteOnlyArbiter_6_io_output_aw_payload_burst[1:0] ), //o + .io_output_aw_payload_lock (axi4WriteOnlyArbiter_6_io_output_aw_payload_lock ), //o + .io_output_aw_payload_cache (axi4WriteOnlyArbiter_6_io_output_aw_payload_cache[3:0] ), //o + .io_output_aw_payload_prot (axi4WriteOnlyArbiter_6_io_output_aw_payload_prot[2:0] ), //o + .io_output_w_valid (axi4WriteOnlyArbiter_6_io_output_w_valid ), //o + .io_output_w_ready (axiOut_6_wready ), //i + .io_output_w_payload_data (axi4WriteOnlyArbiter_6_io_output_w_payload_data[31:0] ), //o + .io_output_w_payload_strb (axi4WriteOnlyArbiter_6_io_output_w_payload_strb[3:0] ), //o + .io_output_w_payload_last (axi4WriteOnlyArbiter_6_io_output_w_payload_last ), //o + .io_output_b_valid (axiOut_6_bvalid ), //i + .io_output_b_ready (axi4WriteOnlyArbiter_6_io_output_b_ready ), //o + .io_output_b_payload_id (axiOut_6_bid[4:0] ), //i + .io_output_b_payload_resp (axiOut_6_bresp[1:0] ), //i + .clk (clk ), //i + .resetn (resetn ) //i + ); + Axi4ReadOnlyArbiter axi4ReadOnlyArbiter_7 ( + .io_inputs_0_ar_valid (toplevel_axiIn_0_readOnly_decoder_io_outputs_7_ar_validPipe_valid ), //i + .io_inputs_0_ar_ready (axi4ReadOnlyArbiter_7_io_inputs_0_ar_ready ), //o + .io_inputs_0_ar_payload_addr (toplevel_axiIn_0_readOnly_decoder_io_outputs_7_ar_validPipe_payload_addr[31:0]), //i + .io_inputs_0_ar_payload_id (toplevel_axiIn_0_readOnly_decoder_io_outputs_7_ar_validPipe_payload_id[3:0] ), //i + .io_inputs_0_ar_payload_len (toplevel_axiIn_0_readOnly_decoder_io_outputs_7_ar_validPipe_payload_len[7:0] ), //i + .io_inputs_0_ar_payload_size (toplevel_axiIn_0_readOnly_decoder_io_outputs_7_ar_validPipe_payload_size[2:0] ), //i + .io_inputs_0_ar_payload_burst (toplevel_axiIn_0_readOnly_decoder_io_outputs_7_ar_validPipe_payload_burst[1:0]), //i + .io_inputs_0_ar_payload_lock (toplevel_axiIn_0_readOnly_decoder_io_outputs_7_ar_validPipe_payload_lock ), //i + .io_inputs_0_ar_payload_cache (toplevel_axiIn_0_readOnly_decoder_io_outputs_7_ar_validPipe_payload_cache[3:0]), //i + .io_inputs_0_ar_payload_prot (toplevel_axiIn_0_readOnly_decoder_io_outputs_7_ar_validPipe_payload_prot[2:0] ), //i + .io_inputs_0_r_valid (axi4ReadOnlyArbiter_7_io_inputs_0_r_valid ), //o + .io_inputs_0_r_ready (axiIn_0_readOnly_decoder_io_outputs_7_r_ready ), //i + .io_inputs_0_r_payload_data (axi4ReadOnlyArbiter_7_io_inputs_0_r_payload_data[31:0] ), //o + .io_inputs_0_r_payload_id (axi4ReadOnlyArbiter_7_io_inputs_0_r_payload_id[3:0] ), //o + .io_inputs_0_r_payload_resp (axi4ReadOnlyArbiter_7_io_inputs_0_r_payload_resp[1:0] ), //o + .io_inputs_0_r_payload_last (axi4ReadOnlyArbiter_7_io_inputs_0_r_payload_last ), //o + .io_inputs_1_ar_valid (toplevel_axiIn_1_readOnly_decoder_io_outputs_3_ar_validPipe_valid ), //i + .io_inputs_1_ar_ready (axi4ReadOnlyArbiter_7_io_inputs_1_ar_ready ), //o + .io_inputs_1_ar_payload_addr (toplevel_axiIn_1_readOnly_decoder_io_outputs_3_ar_validPipe_payload_addr[31:0]), //i + .io_inputs_1_ar_payload_id (toplevel_axiIn_1_readOnly_decoder_io_outputs_3_ar_validPipe_payload_id[3:0] ), //i + .io_inputs_1_ar_payload_len (toplevel_axiIn_1_readOnly_decoder_io_outputs_3_ar_validPipe_payload_len[7:0] ), //i + .io_inputs_1_ar_payload_size (toplevel_axiIn_1_readOnly_decoder_io_outputs_3_ar_validPipe_payload_size[2:0] ), //i + .io_inputs_1_ar_payload_burst (toplevel_axiIn_1_readOnly_decoder_io_outputs_3_ar_validPipe_payload_burst[1:0]), //i + .io_inputs_1_ar_payload_lock (toplevel_axiIn_1_readOnly_decoder_io_outputs_3_ar_validPipe_payload_lock ), //i + .io_inputs_1_ar_payload_cache (toplevel_axiIn_1_readOnly_decoder_io_outputs_3_ar_validPipe_payload_cache[3:0]), //i + .io_inputs_1_ar_payload_prot (toplevel_axiIn_1_readOnly_decoder_io_outputs_3_ar_validPipe_payload_prot[2:0] ), //i + .io_inputs_1_r_valid (axi4ReadOnlyArbiter_7_io_inputs_1_r_valid ), //o + .io_inputs_1_r_ready (axiIn_1_readOnly_decoder_io_outputs_3_r_ready ), //i + .io_inputs_1_r_payload_data (axi4ReadOnlyArbiter_7_io_inputs_1_r_payload_data[31:0] ), //o + .io_inputs_1_r_payload_id (axi4ReadOnlyArbiter_7_io_inputs_1_r_payload_id[3:0] ), //o + .io_inputs_1_r_payload_resp (axi4ReadOnlyArbiter_7_io_inputs_1_r_payload_resp[1:0] ), //o + .io_inputs_1_r_payload_last (axi4ReadOnlyArbiter_7_io_inputs_1_r_payload_last ), //o + .io_output_ar_valid (axi4ReadOnlyArbiter_7_io_output_ar_valid ), //o + .io_output_ar_ready (axiOut_7_arready ), //i + .io_output_ar_payload_addr (axi4ReadOnlyArbiter_7_io_output_ar_payload_addr[31:0] ), //o + .io_output_ar_payload_id (axi4ReadOnlyArbiter_7_io_output_ar_payload_id[4:0] ), //o + .io_output_ar_payload_len (axi4ReadOnlyArbiter_7_io_output_ar_payload_len[7:0] ), //o + .io_output_ar_payload_size (axi4ReadOnlyArbiter_7_io_output_ar_payload_size[2:0] ), //o + .io_output_ar_payload_burst (axi4ReadOnlyArbiter_7_io_output_ar_payload_burst[1:0] ), //o + .io_output_ar_payload_lock (axi4ReadOnlyArbiter_7_io_output_ar_payload_lock ), //o + .io_output_ar_payload_cache (axi4ReadOnlyArbiter_7_io_output_ar_payload_cache[3:0] ), //o + .io_output_ar_payload_prot (axi4ReadOnlyArbiter_7_io_output_ar_payload_prot[2:0] ), //o + .io_output_r_valid (axiOut_7_rvalid ), //i + .io_output_r_ready (axi4ReadOnlyArbiter_7_io_output_r_ready ), //o + .io_output_r_payload_data (axiOut_7_rdata[31:0] ), //i + .io_output_r_payload_id (axiOut_7_rid[4:0] ), //i + .io_output_r_payload_resp (axiOut_7_rresp[1:0] ), //i + .io_output_r_payload_last (axiOut_7_rlast ), //i + .clk (clk ), //i + .resetn (resetn ) //i + ); + Axi4WriteOnlyArbiter_3 axi4WriteOnlyArbiter_7 ( + .io_inputs_0_aw_valid (toplevel_axiIn_0_writeOnly_decoder_io_outputs_7_aw_validPipe_valid ), //i + .io_inputs_0_aw_ready (axi4WriteOnlyArbiter_7_io_inputs_0_aw_ready ), //o + .io_inputs_0_aw_payload_addr (toplevel_axiIn_0_writeOnly_decoder_io_outputs_7_aw_validPipe_payload_addr[31:0]), //i + .io_inputs_0_aw_payload_id (toplevel_axiIn_0_writeOnly_decoder_io_outputs_7_aw_validPipe_payload_id[3:0] ), //i + .io_inputs_0_aw_payload_len (toplevel_axiIn_0_writeOnly_decoder_io_outputs_7_aw_validPipe_payload_len[7:0] ), //i + .io_inputs_0_aw_payload_size (toplevel_axiIn_0_writeOnly_decoder_io_outputs_7_aw_validPipe_payload_size[2:0] ), //i + .io_inputs_0_aw_payload_burst (toplevel_axiIn_0_writeOnly_decoder_io_outputs_7_aw_validPipe_payload_burst[1:0]), //i + .io_inputs_0_aw_payload_lock (toplevel_axiIn_0_writeOnly_decoder_io_outputs_7_aw_validPipe_payload_lock ), //i + .io_inputs_0_aw_payload_cache (toplevel_axiIn_0_writeOnly_decoder_io_outputs_7_aw_validPipe_payload_cache[3:0]), //i + .io_inputs_0_aw_payload_prot (toplevel_axiIn_0_writeOnly_decoder_io_outputs_7_aw_validPipe_payload_prot[2:0] ), //i + .io_inputs_0_w_valid (axiIn_0_writeOnly_decoder_io_outputs_7_w_valid ), //i + .io_inputs_0_w_ready (axi4WriteOnlyArbiter_7_io_inputs_0_w_ready ), //o + .io_inputs_0_w_payload_data (axiIn_0_writeOnly_decoder_io_outputs_7_w_payload_data[31:0] ), //i + .io_inputs_0_w_payload_strb (axiIn_0_writeOnly_decoder_io_outputs_7_w_payload_strb[3:0] ), //i + .io_inputs_0_w_payload_last (axiIn_0_writeOnly_decoder_io_outputs_7_w_payload_last ), //i + .io_inputs_0_b_valid (axi4WriteOnlyArbiter_7_io_inputs_0_b_valid ), //o + .io_inputs_0_b_ready (axiIn_0_writeOnly_decoder_io_outputs_7_b_ready ), //i + .io_inputs_0_b_payload_id (axi4WriteOnlyArbiter_7_io_inputs_0_b_payload_id[3:0] ), //o + .io_inputs_0_b_payload_resp (axi4WriteOnlyArbiter_7_io_inputs_0_b_payload_resp[1:0] ), //o + .io_inputs_1_aw_valid (toplevel_axiIn_1_writeOnly_decoder_io_outputs_3_aw_validPipe_valid ), //i + .io_inputs_1_aw_ready (axi4WriteOnlyArbiter_7_io_inputs_1_aw_ready ), //o + .io_inputs_1_aw_payload_addr (toplevel_axiIn_1_writeOnly_decoder_io_outputs_3_aw_validPipe_payload_addr[31:0]), //i + .io_inputs_1_aw_payload_id (toplevel_axiIn_1_writeOnly_decoder_io_outputs_3_aw_validPipe_payload_id[3:0] ), //i + .io_inputs_1_aw_payload_len (toplevel_axiIn_1_writeOnly_decoder_io_outputs_3_aw_validPipe_payload_len[7:0] ), //i + .io_inputs_1_aw_payload_size (toplevel_axiIn_1_writeOnly_decoder_io_outputs_3_aw_validPipe_payload_size[2:0] ), //i + .io_inputs_1_aw_payload_burst (toplevel_axiIn_1_writeOnly_decoder_io_outputs_3_aw_validPipe_payload_burst[1:0]), //i + .io_inputs_1_aw_payload_lock (toplevel_axiIn_1_writeOnly_decoder_io_outputs_3_aw_validPipe_payload_lock ), //i + .io_inputs_1_aw_payload_cache (toplevel_axiIn_1_writeOnly_decoder_io_outputs_3_aw_validPipe_payload_cache[3:0]), //i + .io_inputs_1_aw_payload_prot (toplevel_axiIn_1_writeOnly_decoder_io_outputs_3_aw_validPipe_payload_prot[2:0] ), //i + .io_inputs_1_w_valid (axiIn_1_writeOnly_decoder_io_outputs_3_w_valid ), //i + .io_inputs_1_w_ready (axi4WriteOnlyArbiter_7_io_inputs_1_w_ready ), //o + .io_inputs_1_w_payload_data (axiIn_1_writeOnly_decoder_io_outputs_3_w_payload_data[31:0] ), //i + .io_inputs_1_w_payload_strb (axiIn_1_writeOnly_decoder_io_outputs_3_w_payload_strb[3:0] ), //i + .io_inputs_1_w_payload_last (axiIn_1_writeOnly_decoder_io_outputs_3_w_payload_last ), //i + .io_inputs_1_b_valid (axi4WriteOnlyArbiter_7_io_inputs_1_b_valid ), //o + .io_inputs_1_b_ready (axiIn_1_writeOnly_decoder_io_outputs_3_b_ready ), //i + .io_inputs_1_b_payload_id (axi4WriteOnlyArbiter_7_io_inputs_1_b_payload_id[3:0] ), //o + .io_inputs_1_b_payload_resp (axi4WriteOnlyArbiter_7_io_inputs_1_b_payload_resp[1:0] ), //o + .io_output_aw_valid (axi4WriteOnlyArbiter_7_io_output_aw_valid ), //o + .io_output_aw_ready (axiOut_7_awready ), //i + .io_output_aw_payload_addr (axi4WriteOnlyArbiter_7_io_output_aw_payload_addr[31:0] ), //o + .io_output_aw_payload_id (axi4WriteOnlyArbiter_7_io_output_aw_payload_id[4:0] ), //o + .io_output_aw_payload_len (axi4WriteOnlyArbiter_7_io_output_aw_payload_len[7:0] ), //o + .io_output_aw_payload_size (axi4WriteOnlyArbiter_7_io_output_aw_payload_size[2:0] ), //o + .io_output_aw_payload_burst (axi4WriteOnlyArbiter_7_io_output_aw_payload_burst[1:0] ), //o + .io_output_aw_payload_lock (axi4WriteOnlyArbiter_7_io_output_aw_payload_lock ), //o + .io_output_aw_payload_cache (axi4WriteOnlyArbiter_7_io_output_aw_payload_cache[3:0] ), //o + .io_output_aw_payload_prot (axi4WriteOnlyArbiter_7_io_output_aw_payload_prot[2:0] ), //o + .io_output_w_valid (axi4WriteOnlyArbiter_7_io_output_w_valid ), //o + .io_output_w_ready (axiOut_7_wready ), //i + .io_output_w_payload_data (axi4WriteOnlyArbiter_7_io_output_w_payload_data[31:0] ), //o + .io_output_w_payload_strb (axi4WriteOnlyArbiter_7_io_output_w_payload_strb[3:0] ), //o + .io_output_w_payload_last (axi4WriteOnlyArbiter_7_io_output_w_payload_last ), //o + .io_output_b_valid (axiOut_7_bvalid ), //i + .io_output_b_ready (axi4WriteOnlyArbiter_7_io_output_b_ready ), //o + .io_output_b_payload_id (axiOut_7_bid[4:0] ), //i + .io_output_b_payload_resp (axiOut_7_bresp[1:0] ), //i + .clk (clk ), //i + .resetn (resetn ) //i + ); + assign axiOut_0_arvalid = axi4ReadOnlyArbiter_4_io_output_ar_valid; + assign axiOut_0_araddr = axi4ReadOnlyArbiter_4_io_output_ar_payload_addr; + assign axiOut_0_arid = axi4ReadOnlyArbiter_4_io_output_ar_payload_id; + assign axiOut_0_arlen = axi4ReadOnlyArbiter_4_io_output_ar_payload_len; + assign axiOut_0_arsize = axi4ReadOnlyArbiter_4_io_output_ar_payload_size; + assign axiOut_0_arburst = axi4ReadOnlyArbiter_4_io_output_ar_payload_burst; + assign axiOut_0_arlock = axi4ReadOnlyArbiter_4_io_output_ar_payload_lock; + assign axiOut_0_arcache = axi4ReadOnlyArbiter_4_io_output_ar_payload_cache; + assign axiOut_0_arprot = axi4ReadOnlyArbiter_4_io_output_ar_payload_prot; + assign axiOut_0_rready = axi4ReadOnlyArbiter_4_io_output_r_ready; + assign axiOut_0_awvalid = axi4WriteOnlyArbiter_4_io_output_aw_valid; + assign axiOut_0_awaddr = axi4WriteOnlyArbiter_4_io_output_aw_payload_addr; + assign axiOut_0_awid = axi4WriteOnlyArbiter_4_io_output_aw_payload_id; + assign axiOut_0_awlen = axi4WriteOnlyArbiter_4_io_output_aw_payload_len; + assign axiOut_0_awsize = axi4WriteOnlyArbiter_4_io_output_aw_payload_size; + assign axiOut_0_awburst = axi4WriteOnlyArbiter_4_io_output_aw_payload_burst; + assign axiOut_0_awlock = axi4WriteOnlyArbiter_4_io_output_aw_payload_lock; + assign axiOut_0_awcache = axi4WriteOnlyArbiter_4_io_output_aw_payload_cache; + assign axiOut_0_awprot = axi4WriteOnlyArbiter_4_io_output_aw_payload_prot; + assign axiOut_0_wvalid = axi4WriteOnlyArbiter_4_io_output_w_valid; + assign axiOut_0_wdata = axi4WriteOnlyArbiter_4_io_output_w_payload_data; + assign axiOut_0_wstrb = axi4WriteOnlyArbiter_4_io_output_w_payload_strb; + assign axiOut_0_wlast = axi4WriteOnlyArbiter_4_io_output_w_payload_last; + assign axiOut_0_bready = axi4WriteOnlyArbiter_4_io_output_b_ready; + assign axiOut_1_arvalid = axi4ReadOnlyArbiter_5_io_output_ar_valid; + assign axiOut_1_araddr = axi4ReadOnlyArbiter_5_io_output_ar_payload_addr; + assign axiOut_1_arid = axi4ReadOnlyArbiter_5_io_output_ar_payload_id; + assign axiOut_1_arlen = axi4ReadOnlyArbiter_5_io_output_ar_payload_len; + assign axiOut_1_arsize = axi4ReadOnlyArbiter_5_io_output_ar_payload_size; + assign axiOut_1_arburst = axi4ReadOnlyArbiter_5_io_output_ar_payload_burst; + assign axiOut_1_arlock = axi4ReadOnlyArbiter_5_io_output_ar_payload_lock; + assign axiOut_1_arcache = axi4ReadOnlyArbiter_5_io_output_ar_payload_cache; + assign axiOut_1_arprot = axi4ReadOnlyArbiter_5_io_output_ar_payload_prot; + assign axiOut_1_rready = axi4ReadOnlyArbiter_5_io_output_r_ready; + assign axiOut_1_awvalid = axi4WriteOnlyArbiter_5_io_output_aw_valid; + assign axiOut_1_awaddr = axi4WriteOnlyArbiter_5_io_output_aw_payload_addr; + assign axiOut_1_awid = axi4WriteOnlyArbiter_5_io_output_aw_payload_id; + assign axiOut_1_awlen = axi4WriteOnlyArbiter_5_io_output_aw_payload_len; + assign axiOut_1_awsize = axi4WriteOnlyArbiter_5_io_output_aw_payload_size; + assign axiOut_1_awburst = axi4WriteOnlyArbiter_5_io_output_aw_payload_burst; + assign axiOut_1_awlock = axi4WriteOnlyArbiter_5_io_output_aw_payload_lock; + assign axiOut_1_awcache = axi4WriteOnlyArbiter_5_io_output_aw_payload_cache; + assign axiOut_1_awprot = axi4WriteOnlyArbiter_5_io_output_aw_payload_prot; + assign axiOut_1_wvalid = axi4WriteOnlyArbiter_5_io_output_w_valid; + assign axiOut_1_wdata = axi4WriteOnlyArbiter_5_io_output_w_payload_data; + assign axiOut_1_wstrb = axi4WriteOnlyArbiter_5_io_output_w_payload_strb; + assign axiOut_1_wlast = axi4WriteOnlyArbiter_5_io_output_w_payload_last; + assign axiOut_1_bready = axi4WriteOnlyArbiter_5_io_output_b_ready; + assign axiOut_2_arvalid = toplevel_axiIn_0_readOnly_decoder_io_outputs_2_ar_validPipe_valid; + assign axiOut_2_araddr = toplevel_axiIn_0_readOnly_decoder_io_outputs_2_ar_validPipe_payload_addr; + assign axiOut_2_arid = {1'd0, toplevel_axiIn_0_readOnly_decoder_io_outputs_2_ar_validPipe_payload_id}; + assign axiOut_2_arlen = toplevel_axiIn_0_readOnly_decoder_io_outputs_2_ar_validPipe_payload_len; + assign axiOut_2_arsize = toplevel_axiIn_0_readOnly_decoder_io_outputs_2_ar_validPipe_payload_size; + assign axiOut_2_arburst = toplevel_axiIn_0_readOnly_decoder_io_outputs_2_ar_validPipe_payload_burst; + assign axiOut_2_arlock = toplevel_axiIn_0_readOnly_decoder_io_outputs_2_ar_validPipe_payload_lock; + assign axiOut_2_arcache = toplevel_axiIn_0_readOnly_decoder_io_outputs_2_ar_validPipe_payload_cache; + assign axiOut_2_arprot = toplevel_axiIn_0_readOnly_decoder_io_outputs_2_ar_validPipe_payload_prot; + assign axiOut_2_rready = axiIn_0_readOnly_decoder_io_outputs_2_r_ready; + assign axiOut_2_awvalid = toplevel_axiIn_0_writeOnly_decoder_io_outputs_2_aw_validPipe_valid; + assign axiOut_2_awaddr = toplevel_axiIn_0_writeOnly_decoder_io_outputs_2_aw_validPipe_payload_addr; + assign axiOut_2_awid = {1'd0, toplevel_axiIn_0_writeOnly_decoder_io_outputs_2_aw_validPipe_payload_id}; + assign axiOut_2_awlen = toplevel_axiIn_0_writeOnly_decoder_io_outputs_2_aw_validPipe_payload_len; + assign axiOut_2_awsize = toplevel_axiIn_0_writeOnly_decoder_io_outputs_2_aw_validPipe_payload_size; + assign axiOut_2_awburst = toplevel_axiIn_0_writeOnly_decoder_io_outputs_2_aw_validPipe_payload_burst; + assign axiOut_2_awlock = toplevel_axiIn_0_writeOnly_decoder_io_outputs_2_aw_validPipe_payload_lock; + assign axiOut_2_awcache = toplevel_axiIn_0_writeOnly_decoder_io_outputs_2_aw_validPipe_payload_cache; + assign axiOut_2_awprot = toplevel_axiIn_0_writeOnly_decoder_io_outputs_2_aw_validPipe_payload_prot; + assign axiOut_2_wvalid = axiIn_0_writeOnly_decoder_io_outputs_2_w_valid; + assign axiOut_2_wdata = axiIn_0_writeOnly_decoder_io_outputs_2_w_payload_data; + assign axiOut_2_wstrb = axiIn_0_writeOnly_decoder_io_outputs_2_w_payload_strb; + assign axiOut_2_wlast = axiIn_0_writeOnly_decoder_io_outputs_2_w_payload_last; + assign axiOut_2_bready = axiIn_0_writeOnly_decoder_io_outputs_2_b_ready; + assign axiOut_3_arvalid = toplevel_axiIn_0_readOnly_decoder_io_outputs_3_ar_validPipe_valid; + assign axiOut_3_araddr = toplevel_axiIn_0_readOnly_decoder_io_outputs_3_ar_validPipe_payload_addr; + assign axiOut_3_arid = {1'd0, toplevel_axiIn_0_readOnly_decoder_io_outputs_3_ar_validPipe_payload_id}; + assign axiOut_3_arlen = toplevel_axiIn_0_readOnly_decoder_io_outputs_3_ar_validPipe_payload_len; + assign axiOut_3_arsize = toplevel_axiIn_0_readOnly_decoder_io_outputs_3_ar_validPipe_payload_size; + assign axiOut_3_arburst = toplevel_axiIn_0_readOnly_decoder_io_outputs_3_ar_validPipe_payload_burst; + assign axiOut_3_arlock = toplevel_axiIn_0_readOnly_decoder_io_outputs_3_ar_validPipe_payload_lock; + assign axiOut_3_arcache = toplevel_axiIn_0_readOnly_decoder_io_outputs_3_ar_validPipe_payload_cache; + assign axiOut_3_arprot = toplevel_axiIn_0_readOnly_decoder_io_outputs_3_ar_validPipe_payload_prot; + assign axiOut_3_rready = axiIn_0_readOnly_decoder_io_outputs_3_r_ready; + assign axiOut_3_awvalid = toplevel_axiIn_0_writeOnly_decoder_io_outputs_3_aw_validPipe_valid; + assign axiOut_3_awaddr = toplevel_axiIn_0_writeOnly_decoder_io_outputs_3_aw_validPipe_payload_addr; + assign axiOut_3_awid = {1'd0, toplevel_axiIn_0_writeOnly_decoder_io_outputs_3_aw_validPipe_payload_id}; + assign axiOut_3_awlen = toplevel_axiIn_0_writeOnly_decoder_io_outputs_3_aw_validPipe_payload_len; + assign axiOut_3_awsize = toplevel_axiIn_0_writeOnly_decoder_io_outputs_3_aw_validPipe_payload_size; + assign axiOut_3_awburst = toplevel_axiIn_0_writeOnly_decoder_io_outputs_3_aw_validPipe_payload_burst; + assign axiOut_3_awlock = toplevel_axiIn_0_writeOnly_decoder_io_outputs_3_aw_validPipe_payload_lock; + assign axiOut_3_awcache = toplevel_axiIn_0_writeOnly_decoder_io_outputs_3_aw_validPipe_payload_cache; + assign axiOut_3_awprot = toplevel_axiIn_0_writeOnly_decoder_io_outputs_3_aw_validPipe_payload_prot; + assign axiOut_3_wvalid = axiIn_0_writeOnly_decoder_io_outputs_3_w_valid; + assign axiOut_3_wdata = axiIn_0_writeOnly_decoder_io_outputs_3_w_payload_data; + assign axiOut_3_wstrb = axiIn_0_writeOnly_decoder_io_outputs_3_w_payload_strb; + assign axiOut_3_wlast = axiIn_0_writeOnly_decoder_io_outputs_3_w_payload_last; + assign axiOut_3_bready = axiIn_0_writeOnly_decoder_io_outputs_3_b_ready; + assign axiOut_4_arvalid = toplevel_axiIn_0_readOnly_decoder_io_outputs_4_ar_validPipe_valid; + assign axiOut_4_araddr = toplevel_axiIn_0_readOnly_decoder_io_outputs_4_ar_validPipe_payload_addr; + assign axiOut_4_arid = {1'd0, toplevel_axiIn_0_readOnly_decoder_io_outputs_4_ar_validPipe_payload_id}; + assign axiOut_4_arlen = toplevel_axiIn_0_readOnly_decoder_io_outputs_4_ar_validPipe_payload_len; + assign axiOut_4_arsize = toplevel_axiIn_0_readOnly_decoder_io_outputs_4_ar_validPipe_payload_size; + assign axiOut_4_arburst = toplevel_axiIn_0_readOnly_decoder_io_outputs_4_ar_validPipe_payload_burst; + assign axiOut_4_arlock = toplevel_axiIn_0_readOnly_decoder_io_outputs_4_ar_validPipe_payload_lock; + assign axiOut_4_arcache = toplevel_axiIn_0_readOnly_decoder_io_outputs_4_ar_validPipe_payload_cache; + assign axiOut_4_arprot = toplevel_axiIn_0_readOnly_decoder_io_outputs_4_ar_validPipe_payload_prot; + assign axiOut_4_rready = axiIn_0_readOnly_decoder_io_outputs_4_r_ready; + assign axiOut_4_awvalid = toplevel_axiIn_0_writeOnly_decoder_io_outputs_4_aw_validPipe_valid; + assign axiOut_4_awaddr = toplevel_axiIn_0_writeOnly_decoder_io_outputs_4_aw_validPipe_payload_addr; + assign axiOut_4_awid = {1'd0, toplevel_axiIn_0_writeOnly_decoder_io_outputs_4_aw_validPipe_payload_id}; + assign axiOut_4_awlen = toplevel_axiIn_0_writeOnly_decoder_io_outputs_4_aw_validPipe_payload_len; + assign axiOut_4_awsize = toplevel_axiIn_0_writeOnly_decoder_io_outputs_4_aw_validPipe_payload_size; + assign axiOut_4_awburst = toplevel_axiIn_0_writeOnly_decoder_io_outputs_4_aw_validPipe_payload_burst; + assign axiOut_4_awlock = toplevel_axiIn_0_writeOnly_decoder_io_outputs_4_aw_validPipe_payload_lock; + assign axiOut_4_awcache = toplevel_axiIn_0_writeOnly_decoder_io_outputs_4_aw_validPipe_payload_cache; + assign axiOut_4_awprot = toplevel_axiIn_0_writeOnly_decoder_io_outputs_4_aw_validPipe_payload_prot; + assign axiOut_4_wvalid = axiIn_0_writeOnly_decoder_io_outputs_4_w_valid; + assign axiOut_4_wdata = axiIn_0_writeOnly_decoder_io_outputs_4_w_payload_data; + assign axiOut_4_wstrb = axiIn_0_writeOnly_decoder_io_outputs_4_w_payload_strb; + assign axiOut_4_wlast = axiIn_0_writeOnly_decoder_io_outputs_4_w_payload_last; + assign axiOut_4_bready = axiIn_0_writeOnly_decoder_io_outputs_4_b_ready; + assign axiOut_5_arvalid = toplevel_axiIn_0_readOnly_decoder_io_outputs_5_ar_validPipe_valid; + assign axiOut_5_araddr = toplevel_axiIn_0_readOnly_decoder_io_outputs_5_ar_validPipe_payload_addr; + assign axiOut_5_arid = {1'd0, toplevel_axiIn_0_readOnly_decoder_io_outputs_5_ar_validPipe_payload_id}; + assign axiOut_5_arlen = toplevel_axiIn_0_readOnly_decoder_io_outputs_5_ar_validPipe_payload_len; + assign axiOut_5_arsize = toplevel_axiIn_0_readOnly_decoder_io_outputs_5_ar_validPipe_payload_size; + assign axiOut_5_arburst = toplevel_axiIn_0_readOnly_decoder_io_outputs_5_ar_validPipe_payload_burst; + assign axiOut_5_arlock = toplevel_axiIn_0_readOnly_decoder_io_outputs_5_ar_validPipe_payload_lock; + assign axiOut_5_arcache = toplevel_axiIn_0_readOnly_decoder_io_outputs_5_ar_validPipe_payload_cache; + assign axiOut_5_arprot = toplevel_axiIn_0_readOnly_decoder_io_outputs_5_ar_validPipe_payload_prot; + assign axiOut_5_rready = axiIn_0_readOnly_decoder_io_outputs_5_r_ready; + assign axiOut_5_awvalid = toplevel_axiIn_0_writeOnly_decoder_io_outputs_5_aw_validPipe_valid; + assign axiOut_5_awaddr = toplevel_axiIn_0_writeOnly_decoder_io_outputs_5_aw_validPipe_payload_addr; + assign axiOut_5_awid = {1'd0, toplevel_axiIn_0_writeOnly_decoder_io_outputs_5_aw_validPipe_payload_id}; + assign axiOut_5_awlen = toplevel_axiIn_0_writeOnly_decoder_io_outputs_5_aw_validPipe_payload_len; + assign axiOut_5_awsize = toplevel_axiIn_0_writeOnly_decoder_io_outputs_5_aw_validPipe_payload_size; + assign axiOut_5_awburst = toplevel_axiIn_0_writeOnly_decoder_io_outputs_5_aw_validPipe_payload_burst; + assign axiOut_5_awlock = toplevel_axiIn_0_writeOnly_decoder_io_outputs_5_aw_validPipe_payload_lock; + assign axiOut_5_awcache = toplevel_axiIn_0_writeOnly_decoder_io_outputs_5_aw_validPipe_payload_cache; + assign axiOut_5_awprot = toplevel_axiIn_0_writeOnly_decoder_io_outputs_5_aw_validPipe_payload_prot; + assign axiOut_5_wvalid = axiIn_0_writeOnly_decoder_io_outputs_5_w_valid; + assign axiOut_5_wdata = axiIn_0_writeOnly_decoder_io_outputs_5_w_payload_data; + assign axiOut_5_wstrb = axiIn_0_writeOnly_decoder_io_outputs_5_w_payload_strb; + assign axiOut_5_wlast = axiIn_0_writeOnly_decoder_io_outputs_5_w_payload_last; + assign axiOut_5_bready = axiIn_0_writeOnly_decoder_io_outputs_5_b_ready; + assign axiOut_6_arvalid = axi4ReadOnlyArbiter_6_io_output_ar_valid; + assign axiOut_6_araddr = axi4ReadOnlyArbiter_6_io_output_ar_payload_addr; + assign axiOut_6_arid = axi4ReadOnlyArbiter_6_io_output_ar_payload_id; + assign axiOut_6_arlen = axi4ReadOnlyArbiter_6_io_output_ar_payload_len; + assign axiOut_6_arsize = axi4ReadOnlyArbiter_6_io_output_ar_payload_size; + assign axiOut_6_arburst = axi4ReadOnlyArbiter_6_io_output_ar_payload_burst; + assign axiOut_6_arlock = axi4ReadOnlyArbiter_6_io_output_ar_payload_lock; + assign axiOut_6_arcache = axi4ReadOnlyArbiter_6_io_output_ar_payload_cache; + assign axiOut_6_arprot = axi4ReadOnlyArbiter_6_io_output_ar_payload_prot; + assign axiOut_6_rready = axi4ReadOnlyArbiter_6_io_output_r_ready; + assign axiOut_6_awvalid = axi4WriteOnlyArbiter_6_io_output_aw_valid; + assign axiOut_6_awaddr = axi4WriteOnlyArbiter_6_io_output_aw_payload_addr; + assign axiOut_6_awid = axi4WriteOnlyArbiter_6_io_output_aw_payload_id; + assign axiOut_6_awlen = axi4WriteOnlyArbiter_6_io_output_aw_payload_len; + assign axiOut_6_awsize = axi4WriteOnlyArbiter_6_io_output_aw_payload_size; + assign axiOut_6_awburst = axi4WriteOnlyArbiter_6_io_output_aw_payload_burst; + assign axiOut_6_awlock = axi4WriteOnlyArbiter_6_io_output_aw_payload_lock; + assign axiOut_6_awcache = axi4WriteOnlyArbiter_6_io_output_aw_payload_cache; + assign axiOut_6_awprot = axi4WriteOnlyArbiter_6_io_output_aw_payload_prot; + assign axiOut_6_wvalid = axi4WriteOnlyArbiter_6_io_output_w_valid; + assign axiOut_6_wdata = axi4WriteOnlyArbiter_6_io_output_w_payload_data; + assign axiOut_6_wstrb = axi4WriteOnlyArbiter_6_io_output_w_payload_strb; + assign axiOut_6_wlast = axi4WriteOnlyArbiter_6_io_output_w_payload_last; + assign axiOut_6_bready = axi4WriteOnlyArbiter_6_io_output_b_ready; + assign axiOut_7_arvalid = axi4ReadOnlyArbiter_7_io_output_ar_valid; + assign axiOut_7_araddr = axi4ReadOnlyArbiter_7_io_output_ar_payload_addr; + assign axiOut_7_arid = axi4ReadOnlyArbiter_7_io_output_ar_payload_id; + assign axiOut_7_arlen = axi4ReadOnlyArbiter_7_io_output_ar_payload_len; + assign axiOut_7_arsize = axi4ReadOnlyArbiter_7_io_output_ar_payload_size; + assign axiOut_7_arburst = axi4ReadOnlyArbiter_7_io_output_ar_payload_burst; + assign axiOut_7_arlock = axi4ReadOnlyArbiter_7_io_output_ar_payload_lock; + assign axiOut_7_arcache = axi4ReadOnlyArbiter_7_io_output_ar_payload_cache; + assign axiOut_7_arprot = axi4ReadOnlyArbiter_7_io_output_ar_payload_prot; + assign axiOut_7_rready = axi4ReadOnlyArbiter_7_io_output_r_ready; + assign axiOut_7_awvalid = axi4WriteOnlyArbiter_7_io_output_aw_valid; + assign axiOut_7_awaddr = axi4WriteOnlyArbiter_7_io_output_aw_payload_addr; + assign axiOut_7_awid = axi4WriteOnlyArbiter_7_io_output_aw_payload_id; + assign axiOut_7_awlen = axi4WriteOnlyArbiter_7_io_output_aw_payload_len; + assign axiOut_7_awsize = axi4WriteOnlyArbiter_7_io_output_aw_payload_size; + assign axiOut_7_awburst = axi4WriteOnlyArbiter_7_io_output_aw_payload_burst; + assign axiOut_7_awlock = axi4WriteOnlyArbiter_7_io_output_aw_payload_lock; + assign axiOut_7_awcache = axi4WriteOnlyArbiter_7_io_output_aw_payload_cache; + assign axiOut_7_awprot = axi4WriteOnlyArbiter_7_io_output_aw_payload_prot; + assign axiOut_7_wvalid = axi4WriteOnlyArbiter_7_io_output_w_valid; + assign axiOut_7_wdata = axi4WriteOnlyArbiter_7_io_output_w_payload_data; + assign axiOut_7_wstrb = axi4WriteOnlyArbiter_7_io_output_w_payload_strb; + assign axiOut_7_wlast = axi4WriteOnlyArbiter_7_io_output_w_payload_last; + assign axiOut_7_bready = axi4WriteOnlyArbiter_7_io_output_b_ready; + assign axiIn_0_readOnly_ar_valid = axiIn_0_arvalid; + assign axiIn_0_arready = axiIn_0_readOnly_ar_ready; + assign axiIn_0_readOnly_ar_payload_addr = axiIn_0_araddr; + assign axiIn_0_readOnly_ar_payload_id = axiIn_0_arid; + assign axiIn_0_readOnly_ar_payload_len = axiIn_0_arlen; + assign axiIn_0_readOnly_ar_payload_size = axiIn_0_arsize; + assign axiIn_0_readOnly_ar_payload_burst = axiIn_0_arburst; + assign axiIn_0_readOnly_ar_payload_lock = axiIn_0_arlock; + assign axiIn_0_readOnly_ar_payload_cache = axiIn_0_arcache; + assign axiIn_0_readOnly_ar_payload_prot = axiIn_0_arprot; + assign axiIn_0_rvalid = axiIn_0_readOnly_r_valid; + assign axiIn_0_readOnly_r_ready = axiIn_0_rready; + assign axiIn_0_rdata = axiIn_0_readOnly_r_payload_data; + assign axiIn_0_rlast = axiIn_0_readOnly_r_payload_last; + assign axiIn_0_rid = axiIn_0_readOnly_r_payload_id; + assign axiIn_0_rresp = axiIn_0_readOnly_r_payload_resp; + assign axiIn_0_writeOnly_aw_valid = axiIn_0_awvalid; + assign axiIn_0_awready = axiIn_0_writeOnly_aw_ready; + assign axiIn_0_writeOnly_aw_payload_addr = axiIn_0_awaddr; + assign axiIn_0_writeOnly_aw_payload_id = axiIn_0_awid; + assign axiIn_0_writeOnly_aw_payload_len = axiIn_0_awlen; + assign axiIn_0_writeOnly_aw_payload_size = axiIn_0_awsize; + assign axiIn_0_writeOnly_aw_payload_burst = axiIn_0_awburst; + assign axiIn_0_writeOnly_aw_payload_lock = axiIn_0_awlock; + assign axiIn_0_writeOnly_aw_payload_cache = axiIn_0_awcache; + assign axiIn_0_writeOnly_aw_payload_prot = axiIn_0_awprot; + assign axiIn_0_writeOnly_w_valid = axiIn_0_wvalid; + assign axiIn_0_wready = axiIn_0_writeOnly_w_ready; + assign axiIn_0_writeOnly_w_payload_data = axiIn_0_wdata; + assign axiIn_0_writeOnly_w_payload_strb = axiIn_0_wstrb; + assign axiIn_0_writeOnly_w_payload_last = axiIn_0_wlast; + assign axiIn_0_bvalid = axiIn_0_writeOnly_b_valid; + assign axiIn_0_writeOnly_b_ready = axiIn_0_bready; + assign axiIn_0_bid = axiIn_0_writeOnly_b_payload_id; + assign axiIn_0_bresp = axiIn_0_writeOnly_b_payload_resp; + assign axiIn_1_readOnly_ar_valid = axiIn_1_arvalid; + assign axiIn_1_arready = axiIn_1_readOnly_ar_ready; + assign axiIn_1_readOnly_ar_payload_addr = axiIn_1_araddr; + assign axiIn_1_readOnly_ar_payload_id = axiIn_1_arid; + assign axiIn_1_readOnly_ar_payload_len = axiIn_1_arlen; + assign axiIn_1_readOnly_ar_payload_size = axiIn_1_arsize; + assign axiIn_1_readOnly_ar_payload_burst = axiIn_1_arburst; + assign axiIn_1_readOnly_ar_payload_lock = axiIn_1_arlock; + assign axiIn_1_readOnly_ar_payload_cache = axiIn_1_arcache; + assign axiIn_1_readOnly_ar_payload_prot = axiIn_1_arprot; + assign axiIn_1_rvalid = axiIn_1_readOnly_r_valid; + assign axiIn_1_readOnly_r_ready = axiIn_1_rready; + assign axiIn_1_rdata = axiIn_1_readOnly_r_payload_data; + assign axiIn_1_rlast = axiIn_1_readOnly_r_payload_last; + assign axiIn_1_rid = axiIn_1_readOnly_r_payload_id; + assign axiIn_1_rresp = axiIn_1_readOnly_r_payload_resp; + assign axiIn_1_writeOnly_aw_valid = axiIn_1_awvalid; + assign axiIn_1_awready = axiIn_1_writeOnly_aw_ready; + assign axiIn_1_writeOnly_aw_payload_addr = axiIn_1_awaddr; + assign axiIn_1_writeOnly_aw_payload_id = axiIn_1_awid; + assign axiIn_1_writeOnly_aw_payload_len = axiIn_1_awlen; + assign axiIn_1_writeOnly_aw_payload_size = axiIn_1_awsize; + assign axiIn_1_writeOnly_aw_payload_burst = axiIn_1_awburst; + assign axiIn_1_writeOnly_aw_payload_lock = axiIn_1_awlock; + assign axiIn_1_writeOnly_aw_payload_cache = axiIn_1_awcache; + assign axiIn_1_writeOnly_aw_payload_prot = axiIn_1_awprot; + assign axiIn_1_writeOnly_w_valid = axiIn_1_wvalid; + assign axiIn_1_wready = axiIn_1_writeOnly_w_ready; + assign axiIn_1_writeOnly_w_payload_data = axiIn_1_wdata; + assign axiIn_1_writeOnly_w_payload_strb = axiIn_1_wstrb; + assign axiIn_1_writeOnly_w_payload_last = axiIn_1_wlast; + assign axiIn_1_bvalid = axiIn_1_writeOnly_b_valid; + assign axiIn_1_writeOnly_b_ready = axiIn_1_bready; + assign axiIn_1_bid = axiIn_1_writeOnly_b_payload_id; + assign axiIn_1_bresp = axiIn_1_writeOnly_b_payload_resp; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_0_ar_validPipe_fire = (toplevel_axiIn_0_readOnly_decoder_io_outputs_0_ar_validPipe_valid && toplevel_axiIn_0_readOnly_decoder_io_outputs_0_ar_validPipe_ready); + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_0_ar_validPipe_valid = toplevel_axiIn_0_readOnly_decoder_io_outputs_0_ar_rValid; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_0_ar_validPipe_payload_addr = axiIn_0_readOnly_decoder_io_outputs_0_ar_payload_addr; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_0_ar_validPipe_payload_id = axiIn_0_readOnly_decoder_io_outputs_0_ar_payload_id; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_0_ar_validPipe_payload_len = axiIn_0_readOnly_decoder_io_outputs_0_ar_payload_len; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_0_ar_validPipe_payload_size = axiIn_0_readOnly_decoder_io_outputs_0_ar_payload_size; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_0_ar_validPipe_payload_burst = axiIn_0_readOnly_decoder_io_outputs_0_ar_payload_burst; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_0_ar_validPipe_payload_lock = axiIn_0_readOnly_decoder_io_outputs_0_ar_payload_lock; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_0_ar_validPipe_payload_cache = axiIn_0_readOnly_decoder_io_outputs_0_ar_payload_cache; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_0_ar_validPipe_payload_prot = axiIn_0_readOnly_decoder_io_outputs_0_ar_payload_prot; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_0_ar_validPipe_ready = axi4ReadOnlyArbiter_4_io_inputs_0_ar_ready; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_1_ar_validPipe_fire = (toplevel_axiIn_0_readOnly_decoder_io_outputs_1_ar_validPipe_valid && toplevel_axiIn_0_readOnly_decoder_io_outputs_1_ar_validPipe_ready); + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_1_ar_validPipe_valid = toplevel_axiIn_0_readOnly_decoder_io_outputs_1_ar_rValid; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_1_ar_validPipe_payload_addr = axiIn_0_readOnly_decoder_io_outputs_1_ar_payload_addr; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_1_ar_validPipe_payload_id = axiIn_0_readOnly_decoder_io_outputs_1_ar_payload_id; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_1_ar_validPipe_payload_len = axiIn_0_readOnly_decoder_io_outputs_1_ar_payload_len; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_1_ar_validPipe_payload_size = axiIn_0_readOnly_decoder_io_outputs_1_ar_payload_size; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_1_ar_validPipe_payload_burst = axiIn_0_readOnly_decoder_io_outputs_1_ar_payload_burst; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_1_ar_validPipe_payload_lock = axiIn_0_readOnly_decoder_io_outputs_1_ar_payload_lock; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_1_ar_validPipe_payload_cache = axiIn_0_readOnly_decoder_io_outputs_1_ar_payload_cache; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_1_ar_validPipe_payload_prot = axiIn_0_readOnly_decoder_io_outputs_1_ar_payload_prot; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_1_ar_validPipe_ready = axi4ReadOnlyArbiter_5_io_inputs_0_ar_ready; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_2_ar_validPipe_fire = (toplevel_axiIn_0_readOnly_decoder_io_outputs_2_ar_validPipe_valid && toplevel_axiIn_0_readOnly_decoder_io_outputs_2_ar_validPipe_ready); + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_2_ar_validPipe_valid = toplevel_axiIn_0_readOnly_decoder_io_outputs_2_ar_rValid; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_2_ar_validPipe_payload_addr = axiIn_0_readOnly_decoder_io_outputs_2_ar_payload_addr; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_2_ar_validPipe_payload_id = axiIn_0_readOnly_decoder_io_outputs_2_ar_payload_id; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_2_ar_validPipe_payload_len = axiIn_0_readOnly_decoder_io_outputs_2_ar_payload_len; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_2_ar_validPipe_payload_size = axiIn_0_readOnly_decoder_io_outputs_2_ar_payload_size; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_2_ar_validPipe_payload_burst = axiIn_0_readOnly_decoder_io_outputs_2_ar_payload_burst; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_2_ar_validPipe_payload_lock = axiIn_0_readOnly_decoder_io_outputs_2_ar_payload_lock; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_2_ar_validPipe_payload_cache = axiIn_0_readOnly_decoder_io_outputs_2_ar_payload_cache; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_2_ar_validPipe_payload_prot = axiIn_0_readOnly_decoder_io_outputs_2_ar_payload_prot; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_2_ar_validPipe_ready = axiOut_2_arready; + assign axiIn_0_readOnly_decoder_io_outputs_2_r_payload_id = axiOut_2_rid[3:0]; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_3_ar_validPipe_fire = (toplevel_axiIn_0_readOnly_decoder_io_outputs_3_ar_validPipe_valid && toplevel_axiIn_0_readOnly_decoder_io_outputs_3_ar_validPipe_ready); + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_3_ar_validPipe_valid = toplevel_axiIn_0_readOnly_decoder_io_outputs_3_ar_rValid; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_3_ar_validPipe_payload_addr = axiIn_0_readOnly_decoder_io_outputs_3_ar_payload_addr; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_3_ar_validPipe_payload_id = axiIn_0_readOnly_decoder_io_outputs_3_ar_payload_id; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_3_ar_validPipe_payload_len = axiIn_0_readOnly_decoder_io_outputs_3_ar_payload_len; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_3_ar_validPipe_payload_size = axiIn_0_readOnly_decoder_io_outputs_3_ar_payload_size; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_3_ar_validPipe_payload_burst = axiIn_0_readOnly_decoder_io_outputs_3_ar_payload_burst; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_3_ar_validPipe_payload_lock = axiIn_0_readOnly_decoder_io_outputs_3_ar_payload_lock; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_3_ar_validPipe_payload_cache = axiIn_0_readOnly_decoder_io_outputs_3_ar_payload_cache; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_3_ar_validPipe_payload_prot = axiIn_0_readOnly_decoder_io_outputs_3_ar_payload_prot; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_3_ar_validPipe_ready = axiOut_3_arready; + assign axiIn_0_readOnly_decoder_io_outputs_3_r_payload_id = axiOut_3_rid[3:0]; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_4_ar_validPipe_fire = (toplevel_axiIn_0_readOnly_decoder_io_outputs_4_ar_validPipe_valid && toplevel_axiIn_0_readOnly_decoder_io_outputs_4_ar_validPipe_ready); + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_4_ar_validPipe_valid = toplevel_axiIn_0_readOnly_decoder_io_outputs_4_ar_rValid; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_4_ar_validPipe_payload_addr = axiIn_0_readOnly_decoder_io_outputs_4_ar_payload_addr; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_4_ar_validPipe_payload_id = axiIn_0_readOnly_decoder_io_outputs_4_ar_payload_id; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_4_ar_validPipe_payload_len = axiIn_0_readOnly_decoder_io_outputs_4_ar_payload_len; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_4_ar_validPipe_payload_size = axiIn_0_readOnly_decoder_io_outputs_4_ar_payload_size; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_4_ar_validPipe_payload_burst = axiIn_0_readOnly_decoder_io_outputs_4_ar_payload_burst; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_4_ar_validPipe_payload_lock = axiIn_0_readOnly_decoder_io_outputs_4_ar_payload_lock; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_4_ar_validPipe_payload_cache = axiIn_0_readOnly_decoder_io_outputs_4_ar_payload_cache; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_4_ar_validPipe_payload_prot = axiIn_0_readOnly_decoder_io_outputs_4_ar_payload_prot; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_4_ar_validPipe_ready = axiOut_4_arready; + assign axiIn_0_readOnly_decoder_io_outputs_4_r_payload_id = axiOut_4_rid[3:0]; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_5_ar_validPipe_fire = (toplevel_axiIn_0_readOnly_decoder_io_outputs_5_ar_validPipe_valid && toplevel_axiIn_0_readOnly_decoder_io_outputs_5_ar_validPipe_ready); + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_5_ar_validPipe_valid = toplevel_axiIn_0_readOnly_decoder_io_outputs_5_ar_rValid; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_5_ar_validPipe_payload_addr = axiIn_0_readOnly_decoder_io_outputs_5_ar_payload_addr; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_5_ar_validPipe_payload_id = axiIn_0_readOnly_decoder_io_outputs_5_ar_payload_id; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_5_ar_validPipe_payload_len = axiIn_0_readOnly_decoder_io_outputs_5_ar_payload_len; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_5_ar_validPipe_payload_size = axiIn_0_readOnly_decoder_io_outputs_5_ar_payload_size; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_5_ar_validPipe_payload_burst = axiIn_0_readOnly_decoder_io_outputs_5_ar_payload_burst; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_5_ar_validPipe_payload_lock = axiIn_0_readOnly_decoder_io_outputs_5_ar_payload_lock; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_5_ar_validPipe_payload_cache = axiIn_0_readOnly_decoder_io_outputs_5_ar_payload_cache; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_5_ar_validPipe_payload_prot = axiIn_0_readOnly_decoder_io_outputs_5_ar_payload_prot; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_5_ar_validPipe_ready = axiOut_5_arready; + assign axiIn_0_readOnly_decoder_io_outputs_5_r_payload_id = axiOut_5_rid[3:0]; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_6_ar_validPipe_fire = (toplevel_axiIn_0_readOnly_decoder_io_outputs_6_ar_validPipe_valid && toplevel_axiIn_0_readOnly_decoder_io_outputs_6_ar_validPipe_ready); + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_6_ar_validPipe_valid = toplevel_axiIn_0_readOnly_decoder_io_outputs_6_ar_rValid; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_6_ar_validPipe_payload_addr = axiIn_0_readOnly_decoder_io_outputs_6_ar_payload_addr; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_6_ar_validPipe_payload_id = axiIn_0_readOnly_decoder_io_outputs_6_ar_payload_id; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_6_ar_validPipe_payload_len = axiIn_0_readOnly_decoder_io_outputs_6_ar_payload_len; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_6_ar_validPipe_payload_size = axiIn_0_readOnly_decoder_io_outputs_6_ar_payload_size; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_6_ar_validPipe_payload_burst = axiIn_0_readOnly_decoder_io_outputs_6_ar_payload_burst; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_6_ar_validPipe_payload_lock = axiIn_0_readOnly_decoder_io_outputs_6_ar_payload_lock; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_6_ar_validPipe_payload_cache = axiIn_0_readOnly_decoder_io_outputs_6_ar_payload_cache; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_6_ar_validPipe_payload_prot = axiIn_0_readOnly_decoder_io_outputs_6_ar_payload_prot; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_6_ar_validPipe_ready = axi4ReadOnlyArbiter_6_io_inputs_0_ar_ready; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_7_ar_validPipe_fire = (toplevel_axiIn_0_readOnly_decoder_io_outputs_7_ar_validPipe_valid && toplevel_axiIn_0_readOnly_decoder_io_outputs_7_ar_validPipe_ready); + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_7_ar_validPipe_valid = toplevel_axiIn_0_readOnly_decoder_io_outputs_7_ar_rValid; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_7_ar_validPipe_payload_addr = axiIn_0_readOnly_decoder_io_outputs_7_ar_payload_addr; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_7_ar_validPipe_payload_id = axiIn_0_readOnly_decoder_io_outputs_7_ar_payload_id; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_7_ar_validPipe_payload_len = axiIn_0_readOnly_decoder_io_outputs_7_ar_payload_len; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_7_ar_validPipe_payload_size = axiIn_0_readOnly_decoder_io_outputs_7_ar_payload_size; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_7_ar_validPipe_payload_burst = axiIn_0_readOnly_decoder_io_outputs_7_ar_payload_burst; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_7_ar_validPipe_payload_lock = axiIn_0_readOnly_decoder_io_outputs_7_ar_payload_lock; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_7_ar_validPipe_payload_cache = axiIn_0_readOnly_decoder_io_outputs_7_ar_payload_cache; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_7_ar_validPipe_payload_prot = axiIn_0_readOnly_decoder_io_outputs_7_ar_payload_prot; + assign toplevel_axiIn_0_readOnly_decoder_io_outputs_7_ar_validPipe_ready = axi4ReadOnlyArbiter_7_io_inputs_0_ar_ready; + assign axiIn_0_readOnly_ar_ready = axiIn_0_readOnly_decoder_io_input_ar_ready; + assign axiIn_0_readOnly_r_valid = axiIn_0_readOnly_decoder_io_input_r_valid; + assign axiIn_0_readOnly_r_payload_data = axiIn_0_readOnly_decoder_io_input_r_payload_data; + assign axiIn_0_readOnly_r_payload_last = axiIn_0_readOnly_decoder_io_input_r_payload_last; + assign axiIn_0_readOnly_r_payload_id = axiIn_0_readOnly_decoder_io_input_r_payload_id; + assign axiIn_0_readOnly_r_payload_resp = axiIn_0_readOnly_decoder_io_input_r_payload_resp; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_0_aw_validPipe_fire = (toplevel_axiIn_0_writeOnly_decoder_io_outputs_0_aw_validPipe_valid && toplevel_axiIn_0_writeOnly_decoder_io_outputs_0_aw_validPipe_ready); + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_0_aw_validPipe_valid = toplevel_axiIn_0_writeOnly_decoder_io_outputs_0_aw_rValid; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_0_aw_validPipe_payload_addr = axiIn_0_writeOnly_decoder_io_outputs_0_aw_payload_addr; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_0_aw_validPipe_payload_id = axiIn_0_writeOnly_decoder_io_outputs_0_aw_payload_id; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_0_aw_validPipe_payload_len = axiIn_0_writeOnly_decoder_io_outputs_0_aw_payload_len; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_0_aw_validPipe_payload_size = axiIn_0_writeOnly_decoder_io_outputs_0_aw_payload_size; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_0_aw_validPipe_payload_burst = axiIn_0_writeOnly_decoder_io_outputs_0_aw_payload_burst; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_0_aw_validPipe_payload_lock = axiIn_0_writeOnly_decoder_io_outputs_0_aw_payload_lock; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_0_aw_validPipe_payload_cache = axiIn_0_writeOnly_decoder_io_outputs_0_aw_payload_cache; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_0_aw_validPipe_payload_prot = axiIn_0_writeOnly_decoder_io_outputs_0_aw_payload_prot; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_0_aw_validPipe_ready = axi4WriteOnlyArbiter_4_io_inputs_0_aw_ready; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_1_aw_validPipe_fire = (toplevel_axiIn_0_writeOnly_decoder_io_outputs_1_aw_validPipe_valid && toplevel_axiIn_0_writeOnly_decoder_io_outputs_1_aw_validPipe_ready); + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_1_aw_validPipe_valid = toplevel_axiIn_0_writeOnly_decoder_io_outputs_1_aw_rValid; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_1_aw_validPipe_payload_addr = axiIn_0_writeOnly_decoder_io_outputs_1_aw_payload_addr; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_1_aw_validPipe_payload_id = axiIn_0_writeOnly_decoder_io_outputs_1_aw_payload_id; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_1_aw_validPipe_payload_len = axiIn_0_writeOnly_decoder_io_outputs_1_aw_payload_len; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_1_aw_validPipe_payload_size = axiIn_0_writeOnly_decoder_io_outputs_1_aw_payload_size; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_1_aw_validPipe_payload_burst = axiIn_0_writeOnly_decoder_io_outputs_1_aw_payload_burst; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_1_aw_validPipe_payload_lock = axiIn_0_writeOnly_decoder_io_outputs_1_aw_payload_lock; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_1_aw_validPipe_payload_cache = axiIn_0_writeOnly_decoder_io_outputs_1_aw_payload_cache; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_1_aw_validPipe_payload_prot = axiIn_0_writeOnly_decoder_io_outputs_1_aw_payload_prot; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_1_aw_validPipe_ready = axi4WriteOnlyArbiter_5_io_inputs_0_aw_ready; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_2_aw_validPipe_fire = (toplevel_axiIn_0_writeOnly_decoder_io_outputs_2_aw_validPipe_valid && toplevel_axiIn_0_writeOnly_decoder_io_outputs_2_aw_validPipe_ready); + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_2_aw_validPipe_valid = toplevel_axiIn_0_writeOnly_decoder_io_outputs_2_aw_rValid; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_2_aw_validPipe_payload_addr = axiIn_0_writeOnly_decoder_io_outputs_2_aw_payload_addr; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_2_aw_validPipe_payload_id = axiIn_0_writeOnly_decoder_io_outputs_2_aw_payload_id; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_2_aw_validPipe_payload_len = axiIn_0_writeOnly_decoder_io_outputs_2_aw_payload_len; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_2_aw_validPipe_payload_size = axiIn_0_writeOnly_decoder_io_outputs_2_aw_payload_size; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_2_aw_validPipe_payload_burst = axiIn_0_writeOnly_decoder_io_outputs_2_aw_payload_burst; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_2_aw_validPipe_payload_lock = axiIn_0_writeOnly_decoder_io_outputs_2_aw_payload_lock; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_2_aw_validPipe_payload_cache = axiIn_0_writeOnly_decoder_io_outputs_2_aw_payload_cache; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_2_aw_validPipe_payload_prot = axiIn_0_writeOnly_decoder_io_outputs_2_aw_payload_prot; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_2_aw_validPipe_ready = axiOut_2_awready; + assign axiIn_0_writeOnly_decoder_io_outputs_2_b_payload_id = axiOut_2_bid[3:0]; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_3_aw_validPipe_fire = (toplevel_axiIn_0_writeOnly_decoder_io_outputs_3_aw_validPipe_valid && toplevel_axiIn_0_writeOnly_decoder_io_outputs_3_aw_validPipe_ready); + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_3_aw_validPipe_valid = toplevel_axiIn_0_writeOnly_decoder_io_outputs_3_aw_rValid; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_3_aw_validPipe_payload_addr = axiIn_0_writeOnly_decoder_io_outputs_3_aw_payload_addr; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_3_aw_validPipe_payload_id = axiIn_0_writeOnly_decoder_io_outputs_3_aw_payload_id; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_3_aw_validPipe_payload_len = axiIn_0_writeOnly_decoder_io_outputs_3_aw_payload_len; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_3_aw_validPipe_payload_size = axiIn_0_writeOnly_decoder_io_outputs_3_aw_payload_size; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_3_aw_validPipe_payload_burst = axiIn_0_writeOnly_decoder_io_outputs_3_aw_payload_burst; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_3_aw_validPipe_payload_lock = axiIn_0_writeOnly_decoder_io_outputs_3_aw_payload_lock; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_3_aw_validPipe_payload_cache = axiIn_0_writeOnly_decoder_io_outputs_3_aw_payload_cache; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_3_aw_validPipe_payload_prot = axiIn_0_writeOnly_decoder_io_outputs_3_aw_payload_prot; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_3_aw_validPipe_ready = axiOut_3_awready; + assign axiIn_0_writeOnly_decoder_io_outputs_3_b_payload_id = axiOut_3_bid[3:0]; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_4_aw_validPipe_fire = (toplevel_axiIn_0_writeOnly_decoder_io_outputs_4_aw_validPipe_valid && toplevel_axiIn_0_writeOnly_decoder_io_outputs_4_aw_validPipe_ready); + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_4_aw_validPipe_valid = toplevel_axiIn_0_writeOnly_decoder_io_outputs_4_aw_rValid; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_4_aw_validPipe_payload_addr = axiIn_0_writeOnly_decoder_io_outputs_4_aw_payload_addr; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_4_aw_validPipe_payload_id = axiIn_0_writeOnly_decoder_io_outputs_4_aw_payload_id; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_4_aw_validPipe_payload_len = axiIn_0_writeOnly_decoder_io_outputs_4_aw_payload_len; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_4_aw_validPipe_payload_size = axiIn_0_writeOnly_decoder_io_outputs_4_aw_payload_size; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_4_aw_validPipe_payload_burst = axiIn_0_writeOnly_decoder_io_outputs_4_aw_payload_burst; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_4_aw_validPipe_payload_lock = axiIn_0_writeOnly_decoder_io_outputs_4_aw_payload_lock; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_4_aw_validPipe_payload_cache = axiIn_0_writeOnly_decoder_io_outputs_4_aw_payload_cache; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_4_aw_validPipe_payload_prot = axiIn_0_writeOnly_decoder_io_outputs_4_aw_payload_prot; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_4_aw_validPipe_ready = axiOut_4_awready; + assign axiIn_0_writeOnly_decoder_io_outputs_4_b_payload_id = axiOut_4_bid[3:0]; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_5_aw_validPipe_fire = (toplevel_axiIn_0_writeOnly_decoder_io_outputs_5_aw_validPipe_valid && toplevel_axiIn_0_writeOnly_decoder_io_outputs_5_aw_validPipe_ready); + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_5_aw_validPipe_valid = toplevel_axiIn_0_writeOnly_decoder_io_outputs_5_aw_rValid; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_5_aw_validPipe_payload_addr = axiIn_0_writeOnly_decoder_io_outputs_5_aw_payload_addr; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_5_aw_validPipe_payload_id = axiIn_0_writeOnly_decoder_io_outputs_5_aw_payload_id; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_5_aw_validPipe_payload_len = axiIn_0_writeOnly_decoder_io_outputs_5_aw_payload_len; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_5_aw_validPipe_payload_size = axiIn_0_writeOnly_decoder_io_outputs_5_aw_payload_size; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_5_aw_validPipe_payload_burst = axiIn_0_writeOnly_decoder_io_outputs_5_aw_payload_burst; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_5_aw_validPipe_payload_lock = axiIn_0_writeOnly_decoder_io_outputs_5_aw_payload_lock; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_5_aw_validPipe_payload_cache = axiIn_0_writeOnly_decoder_io_outputs_5_aw_payload_cache; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_5_aw_validPipe_payload_prot = axiIn_0_writeOnly_decoder_io_outputs_5_aw_payload_prot; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_5_aw_validPipe_ready = axiOut_5_awready; + assign axiIn_0_writeOnly_decoder_io_outputs_5_b_payload_id = axiOut_5_bid[3:0]; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_6_aw_validPipe_fire = (toplevel_axiIn_0_writeOnly_decoder_io_outputs_6_aw_validPipe_valid && toplevel_axiIn_0_writeOnly_decoder_io_outputs_6_aw_validPipe_ready); + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_6_aw_validPipe_valid = toplevel_axiIn_0_writeOnly_decoder_io_outputs_6_aw_rValid; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_6_aw_validPipe_payload_addr = axiIn_0_writeOnly_decoder_io_outputs_6_aw_payload_addr; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_6_aw_validPipe_payload_id = axiIn_0_writeOnly_decoder_io_outputs_6_aw_payload_id; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_6_aw_validPipe_payload_len = axiIn_0_writeOnly_decoder_io_outputs_6_aw_payload_len; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_6_aw_validPipe_payload_size = axiIn_0_writeOnly_decoder_io_outputs_6_aw_payload_size; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_6_aw_validPipe_payload_burst = axiIn_0_writeOnly_decoder_io_outputs_6_aw_payload_burst; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_6_aw_validPipe_payload_lock = axiIn_0_writeOnly_decoder_io_outputs_6_aw_payload_lock; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_6_aw_validPipe_payload_cache = axiIn_0_writeOnly_decoder_io_outputs_6_aw_payload_cache; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_6_aw_validPipe_payload_prot = axiIn_0_writeOnly_decoder_io_outputs_6_aw_payload_prot; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_6_aw_validPipe_ready = axi4WriteOnlyArbiter_6_io_inputs_0_aw_ready; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_7_aw_validPipe_fire = (toplevel_axiIn_0_writeOnly_decoder_io_outputs_7_aw_validPipe_valid && toplevel_axiIn_0_writeOnly_decoder_io_outputs_7_aw_validPipe_ready); + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_7_aw_validPipe_valid = toplevel_axiIn_0_writeOnly_decoder_io_outputs_7_aw_rValid; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_7_aw_validPipe_payload_addr = axiIn_0_writeOnly_decoder_io_outputs_7_aw_payload_addr; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_7_aw_validPipe_payload_id = axiIn_0_writeOnly_decoder_io_outputs_7_aw_payload_id; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_7_aw_validPipe_payload_len = axiIn_0_writeOnly_decoder_io_outputs_7_aw_payload_len; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_7_aw_validPipe_payload_size = axiIn_0_writeOnly_decoder_io_outputs_7_aw_payload_size; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_7_aw_validPipe_payload_burst = axiIn_0_writeOnly_decoder_io_outputs_7_aw_payload_burst; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_7_aw_validPipe_payload_lock = axiIn_0_writeOnly_decoder_io_outputs_7_aw_payload_lock; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_7_aw_validPipe_payload_cache = axiIn_0_writeOnly_decoder_io_outputs_7_aw_payload_cache; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_7_aw_validPipe_payload_prot = axiIn_0_writeOnly_decoder_io_outputs_7_aw_payload_prot; + assign toplevel_axiIn_0_writeOnly_decoder_io_outputs_7_aw_validPipe_ready = axi4WriteOnlyArbiter_7_io_inputs_0_aw_ready; + assign axiIn_0_writeOnly_aw_ready = axiIn_0_writeOnly_decoder_io_input_aw_ready; + assign axiIn_0_writeOnly_w_ready = axiIn_0_writeOnly_decoder_io_input_w_ready; + assign axiIn_0_writeOnly_b_valid = axiIn_0_writeOnly_decoder_io_input_b_valid; + assign axiIn_0_writeOnly_b_payload_id = axiIn_0_writeOnly_decoder_io_input_b_payload_id; + assign axiIn_0_writeOnly_b_payload_resp = axiIn_0_writeOnly_decoder_io_input_b_payload_resp; + assign toplevel_axiIn_1_readOnly_decoder_io_outputs_0_ar_validPipe_fire = (toplevel_axiIn_1_readOnly_decoder_io_outputs_0_ar_validPipe_valid && toplevel_axiIn_1_readOnly_decoder_io_outputs_0_ar_validPipe_ready); + assign toplevel_axiIn_1_readOnly_decoder_io_outputs_0_ar_validPipe_valid = toplevel_axiIn_1_readOnly_decoder_io_outputs_0_ar_rValid; + assign toplevel_axiIn_1_readOnly_decoder_io_outputs_0_ar_validPipe_payload_addr = axiIn_1_readOnly_decoder_io_outputs_0_ar_payload_addr; + assign toplevel_axiIn_1_readOnly_decoder_io_outputs_0_ar_validPipe_payload_id = axiIn_1_readOnly_decoder_io_outputs_0_ar_payload_id; + assign toplevel_axiIn_1_readOnly_decoder_io_outputs_0_ar_validPipe_payload_len = axiIn_1_readOnly_decoder_io_outputs_0_ar_payload_len; + assign toplevel_axiIn_1_readOnly_decoder_io_outputs_0_ar_validPipe_payload_size = axiIn_1_readOnly_decoder_io_outputs_0_ar_payload_size; + assign toplevel_axiIn_1_readOnly_decoder_io_outputs_0_ar_validPipe_payload_burst = axiIn_1_readOnly_decoder_io_outputs_0_ar_payload_burst; + assign toplevel_axiIn_1_readOnly_decoder_io_outputs_0_ar_validPipe_payload_lock = axiIn_1_readOnly_decoder_io_outputs_0_ar_payload_lock; + assign toplevel_axiIn_1_readOnly_decoder_io_outputs_0_ar_validPipe_payload_cache = axiIn_1_readOnly_decoder_io_outputs_0_ar_payload_cache; + assign toplevel_axiIn_1_readOnly_decoder_io_outputs_0_ar_validPipe_payload_prot = axiIn_1_readOnly_decoder_io_outputs_0_ar_payload_prot; + assign toplevel_axiIn_1_readOnly_decoder_io_outputs_0_ar_validPipe_ready = axi4ReadOnlyArbiter_4_io_inputs_1_ar_ready; + assign toplevel_axiIn_1_readOnly_decoder_io_outputs_1_ar_validPipe_fire = (toplevel_axiIn_1_readOnly_decoder_io_outputs_1_ar_validPipe_valid && toplevel_axiIn_1_readOnly_decoder_io_outputs_1_ar_validPipe_ready); + assign toplevel_axiIn_1_readOnly_decoder_io_outputs_1_ar_validPipe_valid = toplevel_axiIn_1_readOnly_decoder_io_outputs_1_ar_rValid; + assign toplevel_axiIn_1_readOnly_decoder_io_outputs_1_ar_validPipe_payload_addr = axiIn_1_readOnly_decoder_io_outputs_1_ar_payload_addr; + assign toplevel_axiIn_1_readOnly_decoder_io_outputs_1_ar_validPipe_payload_id = axiIn_1_readOnly_decoder_io_outputs_1_ar_payload_id; + assign toplevel_axiIn_1_readOnly_decoder_io_outputs_1_ar_validPipe_payload_len = axiIn_1_readOnly_decoder_io_outputs_1_ar_payload_len; + assign toplevel_axiIn_1_readOnly_decoder_io_outputs_1_ar_validPipe_payload_size = axiIn_1_readOnly_decoder_io_outputs_1_ar_payload_size; + assign toplevel_axiIn_1_readOnly_decoder_io_outputs_1_ar_validPipe_payload_burst = axiIn_1_readOnly_decoder_io_outputs_1_ar_payload_burst; + assign toplevel_axiIn_1_readOnly_decoder_io_outputs_1_ar_validPipe_payload_lock = axiIn_1_readOnly_decoder_io_outputs_1_ar_payload_lock; + assign toplevel_axiIn_1_readOnly_decoder_io_outputs_1_ar_validPipe_payload_cache = axiIn_1_readOnly_decoder_io_outputs_1_ar_payload_cache; + assign toplevel_axiIn_1_readOnly_decoder_io_outputs_1_ar_validPipe_payload_prot = axiIn_1_readOnly_decoder_io_outputs_1_ar_payload_prot; + assign toplevel_axiIn_1_readOnly_decoder_io_outputs_1_ar_validPipe_ready = axi4ReadOnlyArbiter_5_io_inputs_1_ar_ready; + assign toplevel_axiIn_1_readOnly_decoder_io_outputs_2_ar_validPipe_fire = (toplevel_axiIn_1_readOnly_decoder_io_outputs_2_ar_validPipe_valid && toplevel_axiIn_1_readOnly_decoder_io_outputs_2_ar_validPipe_ready); + assign toplevel_axiIn_1_readOnly_decoder_io_outputs_2_ar_validPipe_valid = toplevel_axiIn_1_readOnly_decoder_io_outputs_2_ar_rValid; + assign toplevel_axiIn_1_readOnly_decoder_io_outputs_2_ar_validPipe_payload_addr = axiIn_1_readOnly_decoder_io_outputs_2_ar_payload_addr; + assign toplevel_axiIn_1_readOnly_decoder_io_outputs_2_ar_validPipe_payload_id = axiIn_1_readOnly_decoder_io_outputs_2_ar_payload_id; + assign toplevel_axiIn_1_readOnly_decoder_io_outputs_2_ar_validPipe_payload_len = axiIn_1_readOnly_decoder_io_outputs_2_ar_payload_len; + assign toplevel_axiIn_1_readOnly_decoder_io_outputs_2_ar_validPipe_payload_size = axiIn_1_readOnly_decoder_io_outputs_2_ar_payload_size; + assign toplevel_axiIn_1_readOnly_decoder_io_outputs_2_ar_validPipe_payload_burst = axiIn_1_readOnly_decoder_io_outputs_2_ar_payload_burst; + assign toplevel_axiIn_1_readOnly_decoder_io_outputs_2_ar_validPipe_payload_lock = axiIn_1_readOnly_decoder_io_outputs_2_ar_payload_lock; + assign toplevel_axiIn_1_readOnly_decoder_io_outputs_2_ar_validPipe_payload_cache = axiIn_1_readOnly_decoder_io_outputs_2_ar_payload_cache; + assign toplevel_axiIn_1_readOnly_decoder_io_outputs_2_ar_validPipe_payload_prot = axiIn_1_readOnly_decoder_io_outputs_2_ar_payload_prot; + assign toplevel_axiIn_1_readOnly_decoder_io_outputs_2_ar_validPipe_ready = axi4ReadOnlyArbiter_6_io_inputs_1_ar_ready; + assign toplevel_axiIn_1_readOnly_decoder_io_outputs_3_ar_validPipe_fire = (toplevel_axiIn_1_readOnly_decoder_io_outputs_3_ar_validPipe_valid && toplevel_axiIn_1_readOnly_decoder_io_outputs_3_ar_validPipe_ready); + assign toplevel_axiIn_1_readOnly_decoder_io_outputs_3_ar_validPipe_valid = toplevel_axiIn_1_readOnly_decoder_io_outputs_3_ar_rValid; + assign toplevel_axiIn_1_readOnly_decoder_io_outputs_3_ar_validPipe_payload_addr = axiIn_1_readOnly_decoder_io_outputs_3_ar_payload_addr; + assign toplevel_axiIn_1_readOnly_decoder_io_outputs_3_ar_validPipe_payload_id = axiIn_1_readOnly_decoder_io_outputs_3_ar_payload_id; + assign toplevel_axiIn_1_readOnly_decoder_io_outputs_3_ar_validPipe_payload_len = axiIn_1_readOnly_decoder_io_outputs_3_ar_payload_len; + assign toplevel_axiIn_1_readOnly_decoder_io_outputs_3_ar_validPipe_payload_size = axiIn_1_readOnly_decoder_io_outputs_3_ar_payload_size; + assign toplevel_axiIn_1_readOnly_decoder_io_outputs_3_ar_validPipe_payload_burst = axiIn_1_readOnly_decoder_io_outputs_3_ar_payload_burst; + assign toplevel_axiIn_1_readOnly_decoder_io_outputs_3_ar_validPipe_payload_lock = axiIn_1_readOnly_decoder_io_outputs_3_ar_payload_lock; + assign toplevel_axiIn_1_readOnly_decoder_io_outputs_3_ar_validPipe_payload_cache = axiIn_1_readOnly_decoder_io_outputs_3_ar_payload_cache; + assign toplevel_axiIn_1_readOnly_decoder_io_outputs_3_ar_validPipe_payload_prot = axiIn_1_readOnly_decoder_io_outputs_3_ar_payload_prot; + assign toplevel_axiIn_1_readOnly_decoder_io_outputs_3_ar_validPipe_ready = axi4ReadOnlyArbiter_7_io_inputs_1_ar_ready; + assign axiIn_1_readOnly_ar_ready = axiIn_1_readOnly_decoder_io_input_ar_ready; + assign axiIn_1_readOnly_r_valid = axiIn_1_readOnly_decoder_io_input_r_valid; + assign axiIn_1_readOnly_r_payload_data = axiIn_1_readOnly_decoder_io_input_r_payload_data; + assign axiIn_1_readOnly_r_payload_last = axiIn_1_readOnly_decoder_io_input_r_payload_last; + assign axiIn_1_readOnly_r_payload_id = axiIn_1_readOnly_decoder_io_input_r_payload_id; + assign axiIn_1_readOnly_r_payload_resp = axiIn_1_readOnly_decoder_io_input_r_payload_resp; + assign toplevel_axiIn_1_writeOnly_decoder_io_outputs_0_aw_validPipe_fire = (toplevel_axiIn_1_writeOnly_decoder_io_outputs_0_aw_validPipe_valid && toplevel_axiIn_1_writeOnly_decoder_io_outputs_0_aw_validPipe_ready); + assign toplevel_axiIn_1_writeOnly_decoder_io_outputs_0_aw_validPipe_valid = toplevel_axiIn_1_writeOnly_decoder_io_outputs_0_aw_rValid; + assign toplevel_axiIn_1_writeOnly_decoder_io_outputs_0_aw_validPipe_payload_addr = axiIn_1_writeOnly_decoder_io_outputs_0_aw_payload_addr; + assign toplevel_axiIn_1_writeOnly_decoder_io_outputs_0_aw_validPipe_payload_id = axiIn_1_writeOnly_decoder_io_outputs_0_aw_payload_id; + assign toplevel_axiIn_1_writeOnly_decoder_io_outputs_0_aw_validPipe_payload_len = axiIn_1_writeOnly_decoder_io_outputs_0_aw_payload_len; + assign toplevel_axiIn_1_writeOnly_decoder_io_outputs_0_aw_validPipe_payload_size = axiIn_1_writeOnly_decoder_io_outputs_0_aw_payload_size; + assign toplevel_axiIn_1_writeOnly_decoder_io_outputs_0_aw_validPipe_payload_burst = axiIn_1_writeOnly_decoder_io_outputs_0_aw_payload_burst; + assign toplevel_axiIn_1_writeOnly_decoder_io_outputs_0_aw_validPipe_payload_lock = axiIn_1_writeOnly_decoder_io_outputs_0_aw_payload_lock; + assign toplevel_axiIn_1_writeOnly_decoder_io_outputs_0_aw_validPipe_payload_cache = axiIn_1_writeOnly_decoder_io_outputs_0_aw_payload_cache; + assign toplevel_axiIn_1_writeOnly_decoder_io_outputs_0_aw_validPipe_payload_prot = axiIn_1_writeOnly_decoder_io_outputs_0_aw_payload_prot; + assign toplevel_axiIn_1_writeOnly_decoder_io_outputs_0_aw_validPipe_ready = axi4WriteOnlyArbiter_4_io_inputs_1_aw_ready; + assign toplevel_axiIn_1_writeOnly_decoder_io_outputs_1_aw_validPipe_fire = (toplevel_axiIn_1_writeOnly_decoder_io_outputs_1_aw_validPipe_valid && toplevel_axiIn_1_writeOnly_decoder_io_outputs_1_aw_validPipe_ready); + assign toplevel_axiIn_1_writeOnly_decoder_io_outputs_1_aw_validPipe_valid = toplevel_axiIn_1_writeOnly_decoder_io_outputs_1_aw_rValid; + assign toplevel_axiIn_1_writeOnly_decoder_io_outputs_1_aw_validPipe_payload_addr = axiIn_1_writeOnly_decoder_io_outputs_1_aw_payload_addr; + assign toplevel_axiIn_1_writeOnly_decoder_io_outputs_1_aw_validPipe_payload_id = axiIn_1_writeOnly_decoder_io_outputs_1_aw_payload_id; + assign toplevel_axiIn_1_writeOnly_decoder_io_outputs_1_aw_validPipe_payload_len = axiIn_1_writeOnly_decoder_io_outputs_1_aw_payload_len; + assign toplevel_axiIn_1_writeOnly_decoder_io_outputs_1_aw_validPipe_payload_size = axiIn_1_writeOnly_decoder_io_outputs_1_aw_payload_size; + assign toplevel_axiIn_1_writeOnly_decoder_io_outputs_1_aw_validPipe_payload_burst = axiIn_1_writeOnly_decoder_io_outputs_1_aw_payload_burst; + assign toplevel_axiIn_1_writeOnly_decoder_io_outputs_1_aw_validPipe_payload_lock = axiIn_1_writeOnly_decoder_io_outputs_1_aw_payload_lock; + assign toplevel_axiIn_1_writeOnly_decoder_io_outputs_1_aw_validPipe_payload_cache = axiIn_1_writeOnly_decoder_io_outputs_1_aw_payload_cache; + assign toplevel_axiIn_1_writeOnly_decoder_io_outputs_1_aw_validPipe_payload_prot = axiIn_1_writeOnly_decoder_io_outputs_1_aw_payload_prot; + assign toplevel_axiIn_1_writeOnly_decoder_io_outputs_1_aw_validPipe_ready = axi4WriteOnlyArbiter_5_io_inputs_1_aw_ready; + assign toplevel_axiIn_1_writeOnly_decoder_io_outputs_2_aw_validPipe_fire = (toplevel_axiIn_1_writeOnly_decoder_io_outputs_2_aw_validPipe_valid && toplevel_axiIn_1_writeOnly_decoder_io_outputs_2_aw_validPipe_ready); + assign toplevel_axiIn_1_writeOnly_decoder_io_outputs_2_aw_validPipe_valid = toplevel_axiIn_1_writeOnly_decoder_io_outputs_2_aw_rValid; + assign toplevel_axiIn_1_writeOnly_decoder_io_outputs_2_aw_validPipe_payload_addr = axiIn_1_writeOnly_decoder_io_outputs_2_aw_payload_addr; + assign toplevel_axiIn_1_writeOnly_decoder_io_outputs_2_aw_validPipe_payload_id = axiIn_1_writeOnly_decoder_io_outputs_2_aw_payload_id; + assign toplevel_axiIn_1_writeOnly_decoder_io_outputs_2_aw_validPipe_payload_len = axiIn_1_writeOnly_decoder_io_outputs_2_aw_payload_len; + assign toplevel_axiIn_1_writeOnly_decoder_io_outputs_2_aw_validPipe_payload_size = axiIn_1_writeOnly_decoder_io_outputs_2_aw_payload_size; + assign toplevel_axiIn_1_writeOnly_decoder_io_outputs_2_aw_validPipe_payload_burst = axiIn_1_writeOnly_decoder_io_outputs_2_aw_payload_burst; + assign toplevel_axiIn_1_writeOnly_decoder_io_outputs_2_aw_validPipe_payload_lock = axiIn_1_writeOnly_decoder_io_outputs_2_aw_payload_lock; + assign toplevel_axiIn_1_writeOnly_decoder_io_outputs_2_aw_validPipe_payload_cache = axiIn_1_writeOnly_decoder_io_outputs_2_aw_payload_cache; + assign toplevel_axiIn_1_writeOnly_decoder_io_outputs_2_aw_validPipe_payload_prot = axiIn_1_writeOnly_decoder_io_outputs_2_aw_payload_prot; + assign toplevel_axiIn_1_writeOnly_decoder_io_outputs_2_aw_validPipe_ready = axi4WriteOnlyArbiter_6_io_inputs_1_aw_ready; + assign toplevel_axiIn_1_writeOnly_decoder_io_outputs_3_aw_validPipe_fire = (toplevel_axiIn_1_writeOnly_decoder_io_outputs_3_aw_validPipe_valid && toplevel_axiIn_1_writeOnly_decoder_io_outputs_3_aw_validPipe_ready); + assign toplevel_axiIn_1_writeOnly_decoder_io_outputs_3_aw_validPipe_valid = toplevel_axiIn_1_writeOnly_decoder_io_outputs_3_aw_rValid; + assign toplevel_axiIn_1_writeOnly_decoder_io_outputs_3_aw_validPipe_payload_addr = axiIn_1_writeOnly_decoder_io_outputs_3_aw_payload_addr; + assign toplevel_axiIn_1_writeOnly_decoder_io_outputs_3_aw_validPipe_payload_id = axiIn_1_writeOnly_decoder_io_outputs_3_aw_payload_id; + assign toplevel_axiIn_1_writeOnly_decoder_io_outputs_3_aw_validPipe_payload_len = axiIn_1_writeOnly_decoder_io_outputs_3_aw_payload_len; + assign toplevel_axiIn_1_writeOnly_decoder_io_outputs_3_aw_validPipe_payload_size = axiIn_1_writeOnly_decoder_io_outputs_3_aw_payload_size; + assign toplevel_axiIn_1_writeOnly_decoder_io_outputs_3_aw_validPipe_payload_burst = axiIn_1_writeOnly_decoder_io_outputs_3_aw_payload_burst; + assign toplevel_axiIn_1_writeOnly_decoder_io_outputs_3_aw_validPipe_payload_lock = axiIn_1_writeOnly_decoder_io_outputs_3_aw_payload_lock; + assign toplevel_axiIn_1_writeOnly_decoder_io_outputs_3_aw_validPipe_payload_cache = axiIn_1_writeOnly_decoder_io_outputs_3_aw_payload_cache; + assign toplevel_axiIn_1_writeOnly_decoder_io_outputs_3_aw_validPipe_payload_prot = axiIn_1_writeOnly_decoder_io_outputs_3_aw_payload_prot; + assign toplevel_axiIn_1_writeOnly_decoder_io_outputs_3_aw_validPipe_ready = axi4WriteOnlyArbiter_7_io_inputs_1_aw_ready; + assign axiIn_1_writeOnly_aw_ready = axiIn_1_writeOnly_decoder_io_input_aw_ready; + assign axiIn_1_writeOnly_w_ready = axiIn_1_writeOnly_decoder_io_input_w_ready; + assign axiIn_1_writeOnly_b_valid = axiIn_1_writeOnly_decoder_io_input_b_valid; + assign axiIn_1_writeOnly_b_payload_id = axiIn_1_writeOnly_decoder_io_input_b_payload_id; + assign axiIn_1_writeOnly_b_payload_resp = axiIn_1_writeOnly_decoder_io_input_b_payload_resp; + always @(posedge clk or negedge resetn) begin + if(!resetn) begin + toplevel_axiIn_0_readOnly_decoder_io_outputs_0_ar_rValid <= 1'b0; + toplevel_axiIn_0_readOnly_decoder_io_outputs_1_ar_rValid <= 1'b0; + toplevel_axiIn_0_readOnly_decoder_io_outputs_2_ar_rValid <= 1'b0; + toplevel_axiIn_0_readOnly_decoder_io_outputs_3_ar_rValid <= 1'b0; + toplevel_axiIn_0_readOnly_decoder_io_outputs_4_ar_rValid <= 1'b0; + toplevel_axiIn_0_readOnly_decoder_io_outputs_5_ar_rValid <= 1'b0; + toplevel_axiIn_0_readOnly_decoder_io_outputs_6_ar_rValid <= 1'b0; + toplevel_axiIn_0_readOnly_decoder_io_outputs_7_ar_rValid <= 1'b0; + toplevel_axiIn_0_writeOnly_decoder_io_outputs_0_aw_rValid <= 1'b0; + toplevel_axiIn_0_writeOnly_decoder_io_outputs_1_aw_rValid <= 1'b0; + toplevel_axiIn_0_writeOnly_decoder_io_outputs_2_aw_rValid <= 1'b0; + toplevel_axiIn_0_writeOnly_decoder_io_outputs_3_aw_rValid <= 1'b0; + toplevel_axiIn_0_writeOnly_decoder_io_outputs_4_aw_rValid <= 1'b0; + toplevel_axiIn_0_writeOnly_decoder_io_outputs_5_aw_rValid <= 1'b0; + toplevel_axiIn_0_writeOnly_decoder_io_outputs_6_aw_rValid <= 1'b0; + toplevel_axiIn_0_writeOnly_decoder_io_outputs_7_aw_rValid <= 1'b0; + toplevel_axiIn_1_readOnly_decoder_io_outputs_0_ar_rValid <= 1'b0; + toplevel_axiIn_1_readOnly_decoder_io_outputs_1_ar_rValid <= 1'b0; + toplevel_axiIn_1_readOnly_decoder_io_outputs_2_ar_rValid <= 1'b0; + toplevel_axiIn_1_readOnly_decoder_io_outputs_3_ar_rValid <= 1'b0; + toplevel_axiIn_1_writeOnly_decoder_io_outputs_0_aw_rValid <= 1'b0; + toplevel_axiIn_1_writeOnly_decoder_io_outputs_1_aw_rValid <= 1'b0; + toplevel_axiIn_1_writeOnly_decoder_io_outputs_2_aw_rValid <= 1'b0; + toplevel_axiIn_1_writeOnly_decoder_io_outputs_3_aw_rValid <= 1'b0; + end else begin + if(axiIn_0_readOnly_decoder_io_outputs_0_ar_valid) begin + toplevel_axiIn_0_readOnly_decoder_io_outputs_0_ar_rValid <= 1'b1; + end + if(toplevel_axiIn_0_readOnly_decoder_io_outputs_0_ar_validPipe_fire) begin + toplevel_axiIn_0_readOnly_decoder_io_outputs_0_ar_rValid <= 1'b0; + end + if(axiIn_0_readOnly_decoder_io_outputs_1_ar_valid) begin + toplevel_axiIn_0_readOnly_decoder_io_outputs_1_ar_rValid <= 1'b1; + end + if(toplevel_axiIn_0_readOnly_decoder_io_outputs_1_ar_validPipe_fire) begin + toplevel_axiIn_0_readOnly_decoder_io_outputs_1_ar_rValid <= 1'b0; + end + if(axiIn_0_readOnly_decoder_io_outputs_2_ar_valid) begin + toplevel_axiIn_0_readOnly_decoder_io_outputs_2_ar_rValid <= 1'b1; + end + if(toplevel_axiIn_0_readOnly_decoder_io_outputs_2_ar_validPipe_fire) begin + toplevel_axiIn_0_readOnly_decoder_io_outputs_2_ar_rValid <= 1'b0; + end + if(axiIn_0_readOnly_decoder_io_outputs_3_ar_valid) begin + toplevel_axiIn_0_readOnly_decoder_io_outputs_3_ar_rValid <= 1'b1; + end + if(toplevel_axiIn_0_readOnly_decoder_io_outputs_3_ar_validPipe_fire) begin + toplevel_axiIn_0_readOnly_decoder_io_outputs_3_ar_rValid <= 1'b0; + end + if(axiIn_0_readOnly_decoder_io_outputs_4_ar_valid) begin + toplevel_axiIn_0_readOnly_decoder_io_outputs_4_ar_rValid <= 1'b1; + end + if(toplevel_axiIn_0_readOnly_decoder_io_outputs_4_ar_validPipe_fire) begin + toplevel_axiIn_0_readOnly_decoder_io_outputs_4_ar_rValid <= 1'b0; + end + if(axiIn_0_readOnly_decoder_io_outputs_5_ar_valid) begin + toplevel_axiIn_0_readOnly_decoder_io_outputs_5_ar_rValid <= 1'b1; + end + if(toplevel_axiIn_0_readOnly_decoder_io_outputs_5_ar_validPipe_fire) begin + toplevel_axiIn_0_readOnly_decoder_io_outputs_5_ar_rValid <= 1'b0; + end + if(axiIn_0_readOnly_decoder_io_outputs_6_ar_valid) begin + toplevel_axiIn_0_readOnly_decoder_io_outputs_6_ar_rValid <= 1'b1; + end + if(toplevel_axiIn_0_readOnly_decoder_io_outputs_6_ar_validPipe_fire) begin + toplevel_axiIn_0_readOnly_decoder_io_outputs_6_ar_rValid <= 1'b0; + end + if(axiIn_0_readOnly_decoder_io_outputs_7_ar_valid) begin + toplevel_axiIn_0_readOnly_decoder_io_outputs_7_ar_rValid <= 1'b1; + end + if(toplevel_axiIn_0_readOnly_decoder_io_outputs_7_ar_validPipe_fire) begin + toplevel_axiIn_0_readOnly_decoder_io_outputs_7_ar_rValid <= 1'b0; + end + if(axiIn_0_writeOnly_decoder_io_outputs_0_aw_valid) begin + toplevel_axiIn_0_writeOnly_decoder_io_outputs_0_aw_rValid <= 1'b1; + end + if(toplevel_axiIn_0_writeOnly_decoder_io_outputs_0_aw_validPipe_fire) begin + toplevel_axiIn_0_writeOnly_decoder_io_outputs_0_aw_rValid <= 1'b0; + end + if(axiIn_0_writeOnly_decoder_io_outputs_1_aw_valid) begin + toplevel_axiIn_0_writeOnly_decoder_io_outputs_1_aw_rValid <= 1'b1; + end + if(toplevel_axiIn_0_writeOnly_decoder_io_outputs_1_aw_validPipe_fire) begin + toplevel_axiIn_0_writeOnly_decoder_io_outputs_1_aw_rValid <= 1'b0; + end + if(axiIn_0_writeOnly_decoder_io_outputs_2_aw_valid) begin + toplevel_axiIn_0_writeOnly_decoder_io_outputs_2_aw_rValid <= 1'b1; + end + if(toplevel_axiIn_0_writeOnly_decoder_io_outputs_2_aw_validPipe_fire) begin + toplevel_axiIn_0_writeOnly_decoder_io_outputs_2_aw_rValid <= 1'b0; + end + if(axiIn_0_writeOnly_decoder_io_outputs_3_aw_valid) begin + toplevel_axiIn_0_writeOnly_decoder_io_outputs_3_aw_rValid <= 1'b1; + end + if(toplevel_axiIn_0_writeOnly_decoder_io_outputs_3_aw_validPipe_fire) begin + toplevel_axiIn_0_writeOnly_decoder_io_outputs_3_aw_rValid <= 1'b0; + end + if(axiIn_0_writeOnly_decoder_io_outputs_4_aw_valid) begin + toplevel_axiIn_0_writeOnly_decoder_io_outputs_4_aw_rValid <= 1'b1; + end + if(toplevel_axiIn_0_writeOnly_decoder_io_outputs_4_aw_validPipe_fire) begin + toplevel_axiIn_0_writeOnly_decoder_io_outputs_4_aw_rValid <= 1'b0; + end + if(axiIn_0_writeOnly_decoder_io_outputs_5_aw_valid) begin + toplevel_axiIn_0_writeOnly_decoder_io_outputs_5_aw_rValid <= 1'b1; + end + if(toplevel_axiIn_0_writeOnly_decoder_io_outputs_5_aw_validPipe_fire) begin + toplevel_axiIn_0_writeOnly_decoder_io_outputs_5_aw_rValid <= 1'b0; + end + if(axiIn_0_writeOnly_decoder_io_outputs_6_aw_valid) begin + toplevel_axiIn_0_writeOnly_decoder_io_outputs_6_aw_rValid <= 1'b1; + end + if(toplevel_axiIn_0_writeOnly_decoder_io_outputs_6_aw_validPipe_fire) begin + toplevel_axiIn_0_writeOnly_decoder_io_outputs_6_aw_rValid <= 1'b0; + end + if(axiIn_0_writeOnly_decoder_io_outputs_7_aw_valid) begin + toplevel_axiIn_0_writeOnly_decoder_io_outputs_7_aw_rValid <= 1'b1; + end + if(toplevel_axiIn_0_writeOnly_decoder_io_outputs_7_aw_validPipe_fire) begin + toplevel_axiIn_0_writeOnly_decoder_io_outputs_7_aw_rValid <= 1'b0; + end + if(axiIn_1_readOnly_decoder_io_outputs_0_ar_valid) begin + toplevel_axiIn_1_readOnly_decoder_io_outputs_0_ar_rValid <= 1'b1; + end + if(toplevel_axiIn_1_readOnly_decoder_io_outputs_0_ar_validPipe_fire) begin + toplevel_axiIn_1_readOnly_decoder_io_outputs_0_ar_rValid <= 1'b0; + end + if(axiIn_1_readOnly_decoder_io_outputs_1_ar_valid) begin + toplevel_axiIn_1_readOnly_decoder_io_outputs_1_ar_rValid <= 1'b1; + end + if(toplevel_axiIn_1_readOnly_decoder_io_outputs_1_ar_validPipe_fire) begin + toplevel_axiIn_1_readOnly_decoder_io_outputs_1_ar_rValid <= 1'b0; + end + if(axiIn_1_readOnly_decoder_io_outputs_2_ar_valid) begin + toplevel_axiIn_1_readOnly_decoder_io_outputs_2_ar_rValid <= 1'b1; + end + if(toplevel_axiIn_1_readOnly_decoder_io_outputs_2_ar_validPipe_fire) begin + toplevel_axiIn_1_readOnly_decoder_io_outputs_2_ar_rValid <= 1'b0; + end + if(axiIn_1_readOnly_decoder_io_outputs_3_ar_valid) begin + toplevel_axiIn_1_readOnly_decoder_io_outputs_3_ar_rValid <= 1'b1; + end + if(toplevel_axiIn_1_readOnly_decoder_io_outputs_3_ar_validPipe_fire) begin + toplevel_axiIn_1_readOnly_decoder_io_outputs_3_ar_rValid <= 1'b0; + end + if(axiIn_1_writeOnly_decoder_io_outputs_0_aw_valid) begin + toplevel_axiIn_1_writeOnly_decoder_io_outputs_0_aw_rValid <= 1'b1; + end + if(toplevel_axiIn_1_writeOnly_decoder_io_outputs_0_aw_validPipe_fire) begin + toplevel_axiIn_1_writeOnly_decoder_io_outputs_0_aw_rValid <= 1'b0; + end + if(axiIn_1_writeOnly_decoder_io_outputs_1_aw_valid) begin + toplevel_axiIn_1_writeOnly_decoder_io_outputs_1_aw_rValid <= 1'b1; + end + if(toplevel_axiIn_1_writeOnly_decoder_io_outputs_1_aw_validPipe_fire) begin + toplevel_axiIn_1_writeOnly_decoder_io_outputs_1_aw_rValid <= 1'b0; + end + if(axiIn_1_writeOnly_decoder_io_outputs_2_aw_valid) begin + toplevel_axiIn_1_writeOnly_decoder_io_outputs_2_aw_rValid <= 1'b1; + end + if(toplevel_axiIn_1_writeOnly_decoder_io_outputs_2_aw_validPipe_fire) begin + toplevel_axiIn_1_writeOnly_decoder_io_outputs_2_aw_rValid <= 1'b0; + end + if(axiIn_1_writeOnly_decoder_io_outputs_3_aw_valid) begin + toplevel_axiIn_1_writeOnly_decoder_io_outputs_3_aw_rValid <= 1'b1; + end + if(toplevel_axiIn_1_writeOnly_decoder_io_outputs_3_aw_validPipe_fire) begin + toplevel_axiIn_1_writeOnly_decoder_io_outputs_3_aw_rValid <= 1'b0; + end + end + end + + +endmodule + +module Axi4WriteOnlyArbiter_3 ( + input wire io_inputs_0_aw_valid, + output wire io_inputs_0_aw_ready, + input wire [31:0] io_inputs_0_aw_payload_addr, + input wire [3:0] io_inputs_0_aw_payload_id, + input wire [7:0] io_inputs_0_aw_payload_len, + input wire [2:0] io_inputs_0_aw_payload_size, + input wire [1:0] io_inputs_0_aw_payload_burst, + input wire [0:0] io_inputs_0_aw_payload_lock, + input wire [3:0] io_inputs_0_aw_payload_cache, + input wire [2:0] io_inputs_0_aw_payload_prot, + input wire io_inputs_0_w_valid, + output wire io_inputs_0_w_ready, + input wire [31:0] io_inputs_0_w_payload_data, + input wire [3:0] io_inputs_0_w_payload_strb, + input wire io_inputs_0_w_payload_last, + output wire io_inputs_0_b_valid, + input wire io_inputs_0_b_ready, + output wire [3:0] io_inputs_0_b_payload_id, + output wire [1:0] io_inputs_0_b_payload_resp, + input wire io_inputs_1_aw_valid, + output wire io_inputs_1_aw_ready, + input wire [31:0] io_inputs_1_aw_payload_addr, + input wire [3:0] io_inputs_1_aw_payload_id, + input wire [7:0] io_inputs_1_aw_payload_len, + input wire [2:0] io_inputs_1_aw_payload_size, + input wire [1:0] io_inputs_1_aw_payload_burst, + input wire [0:0] io_inputs_1_aw_payload_lock, + input wire [3:0] io_inputs_1_aw_payload_cache, + input wire [2:0] io_inputs_1_aw_payload_prot, + input wire io_inputs_1_w_valid, + output wire io_inputs_1_w_ready, + input wire [31:0] io_inputs_1_w_payload_data, + input wire [3:0] io_inputs_1_w_payload_strb, + input wire io_inputs_1_w_payload_last, + output wire io_inputs_1_b_valid, + input wire io_inputs_1_b_ready, + output wire [3:0] io_inputs_1_b_payload_id, + output wire [1:0] io_inputs_1_b_payload_resp, + output wire io_output_aw_valid, + input wire io_output_aw_ready, + output wire [31:0] io_output_aw_payload_addr, + output wire [4:0] io_output_aw_payload_id, + output wire [7:0] io_output_aw_payload_len, + output wire [2:0] io_output_aw_payload_size, + output wire [1:0] io_output_aw_payload_burst, + output wire [0:0] io_output_aw_payload_lock, + output wire [3:0] io_output_aw_payload_cache, + output wire [2:0] io_output_aw_payload_prot, + output wire io_output_w_valid, + input wire io_output_w_ready, + output wire [31:0] io_output_w_payload_data, + output wire [3:0] io_output_w_payload_strb, + output wire io_output_w_payload_last, + input wire io_output_b_valid, + output wire io_output_b_ready, + input wire [4:0] io_output_b_payload_id, + input wire [1:0] io_output_b_payload_resp, + input wire clk, + input wire resetn +); + + reg cmdArbiter_io_output_ready; + wire cmdRouteFork_translated_fifo_io_pop_ready; + wire cmdRouteFork_translated_fifo_io_flush; + wire cmdArbiter_io_inputs_0_ready; + wire cmdArbiter_io_inputs_1_ready; + wire cmdArbiter_io_output_valid; + wire [31:0] cmdArbiter_io_output_payload_addr; + wire [3:0] cmdArbiter_io_output_payload_id; + wire [7:0] cmdArbiter_io_output_payload_len; + wire [2:0] cmdArbiter_io_output_payload_size; + wire [1:0] cmdArbiter_io_output_payload_burst; + wire [0:0] cmdArbiter_io_output_payload_lock; + wire [3:0] cmdArbiter_io_output_payload_cache; + wire [2:0] cmdArbiter_io_output_payload_prot; + wire [0:0] cmdArbiter_io_chosen; + wire [1:0] cmdArbiter_io_chosenOH; + wire cmdRouteFork_translated_fifo_io_push_ready; + wire cmdRouteFork_translated_fifo_io_pop_valid; + wire [0:0] cmdRouteFork_translated_fifo_io_pop_payload; + wire [2:0] cmdRouteFork_translated_fifo_io_occupancy; + wire [2:0] cmdRouteFork_translated_fifo_io_availability; + reg _zz_io_output_w_valid; + reg [31:0] _zz_io_output_w_payload_data; + reg [3:0] _zz_io_output_w_payload_strb; + reg _zz_io_output_w_payload_last; + reg _zz_io_output_b_ready; + wire cmdOutputFork_valid; + wire cmdOutputFork_ready; + wire [31:0] cmdOutputFork_payload_addr; + wire [3:0] cmdOutputFork_payload_id; + wire [7:0] cmdOutputFork_payload_len; + wire [2:0] cmdOutputFork_payload_size; + wire [1:0] cmdOutputFork_payload_burst; + wire [0:0] cmdOutputFork_payload_lock; + wire [3:0] cmdOutputFork_payload_cache; + wire [2:0] cmdOutputFork_payload_prot; + wire cmdRouteFork_valid; + wire cmdRouteFork_ready; + wire [31:0] cmdRouteFork_payload_addr; + wire [3:0] cmdRouteFork_payload_id; + wire [7:0] cmdRouteFork_payload_len; + wire [2:0] cmdRouteFork_payload_size; + wire [1:0] cmdRouteFork_payload_burst; + wire [0:0] cmdRouteFork_payload_lock; + wire [3:0] cmdRouteFork_payload_cache; + wire [2:0] cmdRouteFork_payload_prot; + reg axi4WriteOnlyArbiter_7_cmdArbiter_io_output_fork2_logic_linkEnable_0; + reg axi4WriteOnlyArbiter_7_cmdArbiter_io_output_fork2_logic_linkEnable_1; + wire when_Stream_l1020; + wire when_Stream_l1020_1; + wire cmdOutputFork_fire; + wire cmdRouteFork_fire; + wire cmdRouteFork_translated_valid; + wire cmdRouteFork_translated_ready; + wire [0:0] cmdRouteFork_translated_payload; + wire io_output_w_fire; + wire [0:0] writeRspIndex; + wire writeRspSels_0; + wire writeRspSels_1; + + StreamArbiter_7 cmdArbiter ( + .io_inputs_0_valid (io_inputs_0_aw_valid ), //i + .io_inputs_0_ready (cmdArbiter_io_inputs_0_ready ), //o + .io_inputs_0_payload_addr (io_inputs_0_aw_payload_addr[31:0] ), //i + .io_inputs_0_payload_id (io_inputs_0_aw_payload_id[3:0] ), //i + .io_inputs_0_payload_len (io_inputs_0_aw_payload_len[7:0] ), //i + .io_inputs_0_payload_size (io_inputs_0_aw_payload_size[2:0] ), //i + .io_inputs_0_payload_burst (io_inputs_0_aw_payload_burst[1:0] ), //i + .io_inputs_0_payload_lock (io_inputs_0_aw_payload_lock ), //i + .io_inputs_0_payload_cache (io_inputs_0_aw_payload_cache[3:0] ), //i + .io_inputs_0_payload_prot (io_inputs_0_aw_payload_prot[2:0] ), //i + .io_inputs_1_valid (io_inputs_1_aw_valid ), //i + .io_inputs_1_ready (cmdArbiter_io_inputs_1_ready ), //o + .io_inputs_1_payload_addr (io_inputs_1_aw_payload_addr[31:0] ), //i + .io_inputs_1_payload_id (io_inputs_1_aw_payload_id[3:0] ), //i + .io_inputs_1_payload_len (io_inputs_1_aw_payload_len[7:0] ), //i + .io_inputs_1_payload_size (io_inputs_1_aw_payload_size[2:0] ), //i + .io_inputs_1_payload_burst (io_inputs_1_aw_payload_burst[1:0] ), //i + .io_inputs_1_payload_lock (io_inputs_1_aw_payload_lock ), //i + .io_inputs_1_payload_cache (io_inputs_1_aw_payload_cache[3:0] ), //i + .io_inputs_1_payload_prot (io_inputs_1_aw_payload_prot[2:0] ), //i + .io_output_valid (cmdArbiter_io_output_valid ), //o + .io_output_ready (cmdArbiter_io_output_ready ), //i + .io_output_payload_addr (cmdArbiter_io_output_payload_addr[31:0]), //o + .io_output_payload_id (cmdArbiter_io_output_payload_id[3:0] ), //o + .io_output_payload_len (cmdArbiter_io_output_payload_len[7:0] ), //o + .io_output_payload_size (cmdArbiter_io_output_payload_size[2:0] ), //o + .io_output_payload_burst (cmdArbiter_io_output_payload_burst[1:0]), //o + .io_output_payload_lock (cmdArbiter_io_output_payload_lock ), //o + .io_output_payload_cache (cmdArbiter_io_output_payload_cache[3:0]), //o + .io_output_payload_prot (cmdArbiter_io_output_payload_prot[2:0] ), //o + .io_chosen (cmdArbiter_io_chosen ), //o + .io_chosenOH (cmdArbiter_io_chosenOH[1:0] ), //o + .clk (clk ), //i + .resetn (resetn ) //i + ); + StreamFifoLowLatency_3 cmdRouteFork_translated_fifo ( + .io_push_valid (cmdRouteFork_translated_valid ), //i + .io_push_ready (cmdRouteFork_translated_fifo_io_push_ready ), //o + .io_push_payload (cmdRouteFork_translated_payload ), //i + .io_pop_valid (cmdRouteFork_translated_fifo_io_pop_valid ), //o + .io_pop_ready (cmdRouteFork_translated_fifo_io_pop_ready ), //i + .io_pop_payload (cmdRouteFork_translated_fifo_io_pop_payload ), //o + .io_flush (cmdRouteFork_translated_fifo_io_flush ), //i + .io_occupancy (cmdRouteFork_translated_fifo_io_occupancy[2:0] ), //o + .io_availability (cmdRouteFork_translated_fifo_io_availability[2:0]), //o + .clk (clk ), //i + .resetn (resetn ) //i + ); + always @(*) begin + case(cmdRouteFork_translated_fifo_io_pop_payload) + 1'b0 : begin + _zz_io_output_w_valid = io_inputs_0_w_valid; + _zz_io_output_w_payload_data = io_inputs_0_w_payload_data; + _zz_io_output_w_payload_strb = io_inputs_0_w_payload_strb; + _zz_io_output_w_payload_last = io_inputs_0_w_payload_last; + end + default : begin + _zz_io_output_w_valid = io_inputs_1_w_valid; + _zz_io_output_w_payload_data = io_inputs_1_w_payload_data; + _zz_io_output_w_payload_strb = io_inputs_1_w_payload_strb; + _zz_io_output_w_payload_last = io_inputs_1_w_payload_last; + end + endcase + end + + always @(*) begin + case(writeRspIndex) + 1'b0 : _zz_io_output_b_ready = io_inputs_0_b_ready; + default : _zz_io_output_b_ready = io_inputs_1_b_ready; + endcase + end + + assign io_inputs_0_aw_ready = cmdArbiter_io_inputs_0_ready; + assign io_inputs_1_aw_ready = cmdArbiter_io_inputs_1_ready; + always @(*) begin + cmdArbiter_io_output_ready = 1'b1; + if(when_Stream_l1020) begin + cmdArbiter_io_output_ready = 1'b0; + end + if(when_Stream_l1020_1) begin + cmdArbiter_io_output_ready = 1'b0; + end + end + + assign when_Stream_l1020 = ((! cmdOutputFork_ready) && axi4WriteOnlyArbiter_7_cmdArbiter_io_output_fork2_logic_linkEnable_0); + assign when_Stream_l1020_1 = ((! cmdRouteFork_ready) && axi4WriteOnlyArbiter_7_cmdArbiter_io_output_fork2_logic_linkEnable_1); + assign cmdOutputFork_valid = (cmdArbiter_io_output_valid && axi4WriteOnlyArbiter_7_cmdArbiter_io_output_fork2_logic_linkEnable_0); + assign cmdOutputFork_payload_addr = cmdArbiter_io_output_payload_addr; + assign cmdOutputFork_payload_id = cmdArbiter_io_output_payload_id; + assign cmdOutputFork_payload_len = cmdArbiter_io_output_payload_len; + assign cmdOutputFork_payload_size = cmdArbiter_io_output_payload_size; + assign cmdOutputFork_payload_burst = cmdArbiter_io_output_payload_burst; + assign cmdOutputFork_payload_lock = cmdArbiter_io_output_payload_lock; + assign cmdOutputFork_payload_cache = cmdArbiter_io_output_payload_cache; + assign cmdOutputFork_payload_prot = cmdArbiter_io_output_payload_prot; + assign cmdOutputFork_fire = (cmdOutputFork_valid && cmdOutputFork_ready); + assign cmdRouteFork_valid = (cmdArbiter_io_output_valid && axi4WriteOnlyArbiter_7_cmdArbiter_io_output_fork2_logic_linkEnable_1); + assign cmdRouteFork_payload_addr = cmdArbiter_io_output_payload_addr; + assign cmdRouteFork_payload_id = cmdArbiter_io_output_payload_id; + assign cmdRouteFork_payload_len = cmdArbiter_io_output_payload_len; + assign cmdRouteFork_payload_size = cmdArbiter_io_output_payload_size; + assign cmdRouteFork_payload_burst = cmdArbiter_io_output_payload_burst; + assign cmdRouteFork_payload_lock = cmdArbiter_io_output_payload_lock; + assign cmdRouteFork_payload_cache = cmdArbiter_io_output_payload_cache; + assign cmdRouteFork_payload_prot = cmdArbiter_io_output_payload_prot; + assign cmdRouteFork_fire = (cmdRouteFork_valid && cmdRouteFork_ready); + assign io_output_aw_valid = cmdOutputFork_valid; + assign cmdOutputFork_ready = io_output_aw_ready; + assign io_output_aw_payload_addr = cmdOutputFork_payload_addr; + assign io_output_aw_payload_len = cmdOutputFork_payload_len; + assign io_output_aw_payload_size = cmdOutputFork_payload_size; + assign io_output_aw_payload_burst = cmdOutputFork_payload_burst; + assign io_output_aw_payload_lock = cmdOutputFork_payload_lock; + assign io_output_aw_payload_cache = cmdOutputFork_payload_cache; + assign io_output_aw_payload_prot = cmdOutputFork_payload_prot; + assign io_output_aw_payload_id = {cmdArbiter_io_chosen,cmdArbiter_io_output_payload_id}; + assign cmdRouteFork_translated_valid = cmdRouteFork_valid; + assign cmdRouteFork_ready = cmdRouteFork_translated_ready; + assign cmdRouteFork_translated_payload = cmdArbiter_io_chosen; + assign cmdRouteFork_translated_ready = cmdRouteFork_translated_fifo_io_push_ready; + assign io_output_w_valid = (cmdRouteFork_translated_fifo_io_pop_valid && _zz_io_output_w_valid); + assign io_output_w_payload_data = _zz_io_output_w_payload_data; + assign io_output_w_payload_strb = _zz_io_output_w_payload_strb; + assign io_output_w_payload_last = _zz_io_output_w_payload_last; + assign io_inputs_0_w_ready = ((cmdRouteFork_translated_fifo_io_pop_valid && io_output_w_ready) && (cmdRouteFork_translated_fifo_io_pop_payload == 1'b0)); + assign io_inputs_1_w_ready = ((cmdRouteFork_translated_fifo_io_pop_valid && io_output_w_ready) && (cmdRouteFork_translated_fifo_io_pop_payload == 1'b1)); + assign io_output_w_fire = (io_output_w_valid && io_output_w_ready); + assign cmdRouteFork_translated_fifo_io_pop_ready = (io_output_w_fire && io_output_w_payload_last); + assign writeRspIndex = io_output_b_payload_id[4 : 4]; + assign writeRspSels_0 = (writeRspIndex == 1'b0); + assign writeRspSels_1 = (writeRspIndex == 1'b1); + assign io_inputs_0_b_valid = (io_output_b_valid && writeRspSels_0); + assign io_inputs_0_b_payload_resp = io_output_b_payload_resp; + assign io_inputs_0_b_payload_id = io_output_b_payload_id[3 : 0]; + assign io_inputs_1_b_valid = (io_output_b_valid && writeRspSels_1); + assign io_inputs_1_b_payload_resp = io_output_b_payload_resp; + assign io_inputs_1_b_payload_id = io_output_b_payload_id[3 : 0]; + assign io_output_b_ready = _zz_io_output_b_ready; + assign cmdRouteFork_translated_fifo_io_flush = 1'b0; + always @(posedge clk or negedge resetn) begin + if(!resetn) begin + axi4WriteOnlyArbiter_7_cmdArbiter_io_output_fork2_logic_linkEnable_0 <= 1'b1; + axi4WriteOnlyArbiter_7_cmdArbiter_io_output_fork2_logic_linkEnable_1 <= 1'b1; + end else begin + if(cmdOutputFork_fire) begin + axi4WriteOnlyArbiter_7_cmdArbiter_io_output_fork2_logic_linkEnable_0 <= 1'b0; + end + if(cmdRouteFork_fire) begin + axi4WriteOnlyArbiter_7_cmdArbiter_io_output_fork2_logic_linkEnable_1 <= 1'b0; + end + if(cmdArbiter_io_output_ready) begin + axi4WriteOnlyArbiter_7_cmdArbiter_io_output_fork2_logic_linkEnable_0 <= 1'b1; + axi4WriteOnlyArbiter_7_cmdArbiter_io_output_fork2_logic_linkEnable_1 <= 1'b1; + end + end + end + + +endmodule + +//Axi4ReadOnlyArbiter_3 replaced by Axi4ReadOnlyArbiter + +module Axi4WriteOnlyArbiter_2 ( + input wire io_inputs_0_aw_valid, + output wire io_inputs_0_aw_ready, + input wire [31:0] io_inputs_0_aw_payload_addr, + input wire [3:0] io_inputs_0_aw_payload_id, + input wire [7:0] io_inputs_0_aw_payload_len, + input wire [2:0] io_inputs_0_aw_payload_size, + input wire [1:0] io_inputs_0_aw_payload_burst, + input wire [0:0] io_inputs_0_aw_payload_lock, + input wire [3:0] io_inputs_0_aw_payload_cache, + input wire [2:0] io_inputs_0_aw_payload_prot, + input wire io_inputs_0_w_valid, + output wire io_inputs_0_w_ready, + input wire [31:0] io_inputs_0_w_payload_data, + input wire [3:0] io_inputs_0_w_payload_strb, + input wire io_inputs_0_w_payload_last, + output wire io_inputs_0_b_valid, + input wire io_inputs_0_b_ready, + output wire [3:0] io_inputs_0_b_payload_id, + output wire [1:0] io_inputs_0_b_payload_resp, + input wire io_inputs_1_aw_valid, + output wire io_inputs_1_aw_ready, + input wire [31:0] io_inputs_1_aw_payload_addr, + input wire [3:0] io_inputs_1_aw_payload_id, + input wire [7:0] io_inputs_1_aw_payload_len, + input wire [2:0] io_inputs_1_aw_payload_size, + input wire [1:0] io_inputs_1_aw_payload_burst, + input wire [0:0] io_inputs_1_aw_payload_lock, + input wire [3:0] io_inputs_1_aw_payload_cache, + input wire [2:0] io_inputs_1_aw_payload_prot, + input wire io_inputs_1_w_valid, + output wire io_inputs_1_w_ready, + input wire [31:0] io_inputs_1_w_payload_data, + input wire [3:0] io_inputs_1_w_payload_strb, + input wire io_inputs_1_w_payload_last, + output wire io_inputs_1_b_valid, + input wire io_inputs_1_b_ready, + output wire [3:0] io_inputs_1_b_payload_id, + output wire [1:0] io_inputs_1_b_payload_resp, + output wire io_output_aw_valid, + input wire io_output_aw_ready, + output wire [31:0] io_output_aw_payload_addr, + output wire [4:0] io_output_aw_payload_id, + output wire [7:0] io_output_aw_payload_len, + output wire [2:0] io_output_aw_payload_size, + output wire [1:0] io_output_aw_payload_burst, + output wire [0:0] io_output_aw_payload_lock, + output wire [3:0] io_output_aw_payload_cache, + output wire [2:0] io_output_aw_payload_prot, + output wire io_output_w_valid, + input wire io_output_w_ready, + output wire [31:0] io_output_w_payload_data, + output wire [3:0] io_output_w_payload_strb, + output wire io_output_w_payload_last, + input wire io_output_b_valid, + output wire io_output_b_ready, + input wire [4:0] io_output_b_payload_id, + input wire [1:0] io_output_b_payload_resp, + input wire clk, + input wire resetn +); + + reg cmdArbiter_io_output_ready; + wire cmdRouteFork_translated_fifo_io_pop_ready; + wire cmdRouteFork_translated_fifo_io_flush; + wire cmdArbiter_io_inputs_0_ready; + wire cmdArbiter_io_inputs_1_ready; + wire cmdArbiter_io_output_valid; + wire [31:0] cmdArbiter_io_output_payload_addr; + wire [3:0] cmdArbiter_io_output_payload_id; + wire [7:0] cmdArbiter_io_output_payload_len; + wire [2:0] cmdArbiter_io_output_payload_size; + wire [1:0] cmdArbiter_io_output_payload_burst; + wire [0:0] cmdArbiter_io_output_payload_lock; + wire [3:0] cmdArbiter_io_output_payload_cache; + wire [2:0] cmdArbiter_io_output_payload_prot; + wire [0:0] cmdArbiter_io_chosen; + wire [1:0] cmdArbiter_io_chosenOH; + wire cmdRouteFork_translated_fifo_io_push_ready; + wire cmdRouteFork_translated_fifo_io_pop_valid; + wire [0:0] cmdRouteFork_translated_fifo_io_pop_payload; + wire [2:0] cmdRouteFork_translated_fifo_io_occupancy; + wire [2:0] cmdRouteFork_translated_fifo_io_availability; + reg _zz_io_output_w_valid; + reg [31:0] _zz_io_output_w_payload_data; + reg [3:0] _zz_io_output_w_payload_strb; + reg _zz_io_output_w_payload_last; + reg _zz_io_output_b_ready; + wire cmdOutputFork_valid; + wire cmdOutputFork_ready; + wire [31:0] cmdOutputFork_payload_addr; + wire [3:0] cmdOutputFork_payload_id; + wire [7:0] cmdOutputFork_payload_len; + wire [2:0] cmdOutputFork_payload_size; + wire [1:0] cmdOutputFork_payload_burst; + wire [0:0] cmdOutputFork_payload_lock; + wire [3:0] cmdOutputFork_payload_cache; + wire [2:0] cmdOutputFork_payload_prot; + wire cmdRouteFork_valid; + wire cmdRouteFork_ready; + wire [31:0] cmdRouteFork_payload_addr; + wire [3:0] cmdRouteFork_payload_id; + wire [7:0] cmdRouteFork_payload_len; + wire [2:0] cmdRouteFork_payload_size; + wire [1:0] cmdRouteFork_payload_burst; + wire [0:0] cmdRouteFork_payload_lock; + wire [3:0] cmdRouteFork_payload_cache; + wire [2:0] cmdRouteFork_payload_prot; + reg axi4WriteOnlyArbiter_6_cmdArbiter_io_output_fork2_logic_linkEnable_0; + reg axi4WriteOnlyArbiter_6_cmdArbiter_io_output_fork2_logic_linkEnable_1; + wire when_Stream_l1020; + wire when_Stream_l1020_1; + wire cmdOutputFork_fire; + wire cmdRouteFork_fire; + wire cmdRouteFork_translated_valid; + wire cmdRouteFork_translated_ready; + wire [0:0] cmdRouteFork_translated_payload; + wire io_output_w_fire; + wire [0:0] writeRspIndex; + wire writeRspSels_0; + wire writeRspSels_1; + + StreamArbiter_7 cmdArbiter ( + .io_inputs_0_valid (io_inputs_0_aw_valid ), //i + .io_inputs_0_ready (cmdArbiter_io_inputs_0_ready ), //o + .io_inputs_0_payload_addr (io_inputs_0_aw_payload_addr[31:0] ), //i + .io_inputs_0_payload_id (io_inputs_0_aw_payload_id[3:0] ), //i + .io_inputs_0_payload_len (io_inputs_0_aw_payload_len[7:0] ), //i + .io_inputs_0_payload_size (io_inputs_0_aw_payload_size[2:0] ), //i + .io_inputs_0_payload_burst (io_inputs_0_aw_payload_burst[1:0] ), //i + .io_inputs_0_payload_lock (io_inputs_0_aw_payload_lock ), //i + .io_inputs_0_payload_cache (io_inputs_0_aw_payload_cache[3:0] ), //i + .io_inputs_0_payload_prot (io_inputs_0_aw_payload_prot[2:0] ), //i + .io_inputs_1_valid (io_inputs_1_aw_valid ), //i + .io_inputs_1_ready (cmdArbiter_io_inputs_1_ready ), //o + .io_inputs_1_payload_addr (io_inputs_1_aw_payload_addr[31:0] ), //i + .io_inputs_1_payload_id (io_inputs_1_aw_payload_id[3:0] ), //i + .io_inputs_1_payload_len (io_inputs_1_aw_payload_len[7:0] ), //i + .io_inputs_1_payload_size (io_inputs_1_aw_payload_size[2:0] ), //i + .io_inputs_1_payload_burst (io_inputs_1_aw_payload_burst[1:0] ), //i + .io_inputs_1_payload_lock (io_inputs_1_aw_payload_lock ), //i + .io_inputs_1_payload_cache (io_inputs_1_aw_payload_cache[3:0] ), //i + .io_inputs_1_payload_prot (io_inputs_1_aw_payload_prot[2:0] ), //i + .io_output_valid (cmdArbiter_io_output_valid ), //o + .io_output_ready (cmdArbiter_io_output_ready ), //i + .io_output_payload_addr (cmdArbiter_io_output_payload_addr[31:0]), //o + .io_output_payload_id (cmdArbiter_io_output_payload_id[3:0] ), //o + .io_output_payload_len (cmdArbiter_io_output_payload_len[7:0] ), //o + .io_output_payload_size (cmdArbiter_io_output_payload_size[2:0] ), //o + .io_output_payload_burst (cmdArbiter_io_output_payload_burst[1:0]), //o + .io_output_payload_lock (cmdArbiter_io_output_payload_lock ), //o + .io_output_payload_cache (cmdArbiter_io_output_payload_cache[3:0]), //o + .io_output_payload_prot (cmdArbiter_io_output_payload_prot[2:0] ), //o + .io_chosen (cmdArbiter_io_chosen ), //o + .io_chosenOH (cmdArbiter_io_chosenOH[1:0] ), //o + .clk (clk ), //i + .resetn (resetn ) //i + ); + StreamFifoLowLatency_3 cmdRouteFork_translated_fifo ( + .io_push_valid (cmdRouteFork_translated_valid ), //i + .io_push_ready (cmdRouteFork_translated_fifo_io_push_ready ), //o + .io_push_payload (cmdRouteFork_translated_payload ), //i + .io_pop_valid (cmdRouteFork_translated_fifo_io_pop_valid ), //o + .io_pop_ready (cmdRouteFork_translated_fifo_io_pop_ready ), //i + .io_pop_payload (cmdRouteFork_translated_fifo_io_pop_payload ), //o + .io_flush (cmdRouteFork_translated_fifo_io_flush ), //i + .io_occupancy (cmdRouteFork_translated_fifo_io_occupancy[2:0] ), //o + .io_availability (cmdRouteFork_translated_fifo_io_availability[2:0]), //o + .clk (clk ), //i + .resetn (resetn ) //i + ); + always @(*) begin + case(cmdRouteFork_translated_fifo_io_pop_payload) + 1'b0 : begin + _zz_io_output_w_valid = io_inputs_0_w_valid; + _zz_io_output_w_payload_data = io_inputs_0_w_payload_data; + _zz_io_output_w_payload_strb = io_inputs_0_w_payload_strb; + _zz_io_output_w_payload_last = io_inputs_0_w_payload_last; + end + default : begin + _zz_io_output_w_valid = io_inputs_1_w_valid; + _zz_io_output_w_payload_data = io_inputs_1_w_payload_data; + _zz_io_output_w_payload_strb = io_inputs_1_w_payload_strb; + _zz_io_output_w_payload_last = io_inputs_1_w_payload_last; + end + endcase + end + + always @(*) begin + case(writeRspIndex) + 1'b0 : _zz_io_output_b_ready = io_inputs_0_b_ready; + default : _zz_io_output_b_ready = io_inputs_1_b_ready; + endcase + end + + assign io_inputs_0_aw_ready = cmdArbiter_io_inputs_0_ready; + assign io_inputs_1_aw_ready = cmdArbiter_io_inputs_1_ready; + always @(*) begin + cmdArbiter_io_output_ready = 1'b1; + if(when_Stream_l1020) begin + cmdArbiter_io_output_ready = 1'b0; + end + if(when_Stream_l1020_1) begin + cmdArbiter_io_output_ready = 1'b0; + end + end + + assign when_Stream_l1020 = ((! cmdOutputFork_ready) && axi4WriteOnlyArbiter_6_cmdArbiter_io_output_fork2_logic_linkEnable_0); + assign when_Stream_l1020_1 = ((! cmdRouteFork_ready) && axi4WriteOnlyArbiter_6_cmdArbiter_io_output_fork2_logic_linkEnable_1); + assign cmdOutputFork_valid = (cmdArbiter_io_output_valid && axi4WriteOnlyArbiter_6_cmdArbiter_io_output_fork2_logic_linkEnable_0); + assign cmdOutputFork_payload_addr = cmdArbiter_io_output_payload_addr; + assign cmdOutputFork_payload_id = cmdArbiter_io_output_payload_id; + assign cmdOutputFork_payload_len = cmdArbiter_io_output_payload_len; + assign cmdOutputFork_payload_size = cmdArbiter_io_output_payload_size; + assign cmdOutputFork_payload_burst = cmdArbiter_io_output_payload_burst; + assign cmdOutputFork_payload_lock = cmdArbiter_io_output_payload_lock; + assign cmdOutputFork_payload_cache = cmdArbiter_io_output_payload_cache; + assign cmdOutputFork_payload_prot = cmdArbiter_io_output_payload_prot; + assign cmdOutputFork_fire = (cmdOutputFork_valid && cmdOutputFork_ready); + assign cmdRouteFork_valid = (cmdArbiter_io_output_valid && axi4WriteOnlyArbiter_6_cmdArbiter_io_output_fork2_logic_linkEnable_1); + assign cmdRouteFork_payload_addr = cmdArbiter_io_output_payload_addr; + assign cmdRouteFork_payload_id = cmdArbiter_io_output_payload_id; + assign cmdRouteFork_payload_len = cmdArbiter_io_output_payload_len; + assign cmdRouteFork_payload_size = cmdArbiter_io_output_payload_size; + assign cmdRouteFork_payload_burst = cmdArbiter_io_output_payload_burst; + assign cmdRouteFork_payload_lock = cmdArbiter_io_output_payload_lock; + assign cmdRouteFork_payload_cache = cmdArbiter_io_output_payload_cache; + assign cmdRouteFork_payload_prot = cmdArbiter_io_output_payload_prot; + assign cmdRouteFork_fire = (cmdRouteFork_valid && cmdRouteFork_ready); + assign io_output_aw_valid = cmdOutputFork_valid; + assign cmdOutputFork_ready = io_output_aw_ready; + assign io_output_aw_payload_addr = cmdOutputFork_payload_addr; + assign io_output_aw_payload_len = cmdOutputFork_payload_len; + assign io_output_aw_payload_size = cmdOutputFork_payload_size; + assign io_output_aw_payload_burst = cmdOutputFork_payload_burst; + assign io_output_aw_payload_lock = cmdOutputFork_payload_lock; + assign io_output_aw_payload_cache = cmdOutputFork_payload_cache; + assign io_output_aw_payload_prot = cmdOutputFork_payload_prot; + assign io_output_aw_payload_id = {cmdArbiter_io_chosen,cmdArbiter_io_output_payload_id}; + assign cmdRouteFork_translated_valid = cmdRouteFork_valid; + assign cmdRouteFork_ready = cmdRouteFork_translated_ready; + assign cmdRouteFork_translated_payload = cmdArbiter_io_chosen; + assign cmdRouteFork_translated_ready = cmdRouteFork_translated_fifo_io_push_ready; + assign io_output_w_valid = (cmdRouteFork_translated_fifo_io_pop_valid && _zz_io_output_w_valid); + assign io_output_w_payload_data = _zz_io_output_w_payload_data; + assign io_output_w_payload_strb = _zz_io_output_w_payload_strb; + assign io_output_w_payload_last = _zz_io_output_w_payload_last; + assign io_inputs_0_w_ready = ((cmdRouteFork_translated_fifo_io_pop_valid && io_output_w_ready) && (cmdRouteFork_translated_fifo_io_pop_payload == 1'b0)); + assign io_inputs_1_w_ready = ((cmdRouteFork_translated_fifo_io_pop_valid && io_output_w_ready) && (cmdRouteFork_translated_fifo_io_pop_payload == 1'b1)); + assign io_output_w_fire = (io_output_w_valid && io_output_w_ready); + assign cmdRouteFork_translated_fifo_io_pop_ready = (io_output_w_fire && io_output_w_payload_last); + assign writeRspIndex = io_output_b_payload_id[4 : 4]; + assign writeRspSels_0 = (writeRspIndex == 1'b0); + assign writeRspSels_1 = (writeRspIndex == 1'b1); + assign io_inputs_0_b_valid = (io_output_b_valid && writeRspSels_0); + assign io_inputs_0_b_payload_resp = io_output_b_payload_resp; + assign io_inputs_0_b_payload_id = io_output_b_payload_id[3 : 0]; + assign io_inputs_1_b_valid = (io_output_b_valid && writeRspSels_1); + assign io_inputs_1_b_payload_resp = io_output_b_payload_resp; + assign io_inputs_1_b_payload_id = io_output_b_payload_id[3 : 0]; + assign io_output_b_ready = _zz_io_output_b_ready; + assign cmdRouteFork_translated_fifo_io_flush = 1'b0; + always @(posedge clk or negedge resetn) begin + if(!resetn) begin + axi4WriteOnlyArbiter_6_cmdArbiter_io_output_fork2_logic_linkEnable_0 <= 1'b1; + axi4WriteOnlyArbiter_6_cmdArbiter_io_output_fork2_logic_linkEnable_1 <= 1'b1; + end else begin + if(cmdOutputFork_fire) begin + axi4WriteOnlyArbiter_6_cmdArbiter_io_output_fork2_logic_linkEnable_0 <= 1'b0; + end + if(cmdRouteFork_fire) begin + axi4WriteOnlyArbiter_6_cmdArbiter_io_output_fork2_logic_linkEnable_1 <= 1'b0; + end + if(cmdArbiter_io_output_ready) begin + axi4WriteOnlyArbiter_6_cmdArbiter_io_output_fork2_logic_linkEnable_0 <= 1'b1; + axi4WriteOnlyArbiter_6_cmdArbiter_io_output_fork2_logic_linkEnable_1 <= 1'b1; + end + end + end + + +endmodule + +//Axi4ReadOnlyArbiter_2 replaced by Axi4ReadOnlyArbiter + +module Axi4WriteOnlyArbiter_1 ( + input wire io_inputs_0_aw_valid, + output wire io_inputs_0_aw_ready, + input wire [31:0] io_inputs_0_aw_payload_addr, + input wire [3:0] io_inputs_0_aw_payload_id, + input wire [7:0] io_inputs_0_aw_payload_len, + input wire [2:0] io_inputs_0_aw_payload_size, + input wire [1:0] io_inputs_0_aw_payload_burst, + input wire [0:0] io_inputs_0_aw_payload_lock, + input wire [3:0] io_inputs_0_aw_payload_cache, + input wire [2:0] io_inputs_0_aw_payload_prot, + input wire io_inputs_0_w_valid, + output wire io_inputs_0_w_ready, + input wire [31:0] io_inputs_0_w_payload_data, + input wire [3:0] io_inputs_0_w_payload_strb, + input wire io_inputs_0_w_payload_last, + output wire io_inputs_0_b_valid, + input wire io_inputs_0_b_ready, + output wire [3:0] io_inputs_0_b_payload_id, + output wire [1:0] io_inputs_0_b_payload_resp, + input wire io_inputs_1_aw_valid, + output wire io_inputs_1_aw_ready, + input wire [31:0] io_inputs_1_aw_payload_addr, + input wire [3:0] io_inputs_1_aw_payload_id, + input wire [7:0] io_inputs_1_aw_payload_len, + input wire [2:0] io_inputs_1_aw_payload_size, + input wire [1:0] io_inputs_1_aw_payload_burst, + input wire [0:0] io_inputs_1_aw_payload_lock, + input wire [3:0] io_inputs_1_aw_payload_cache, + input wire [2:0] io_inputs_1_aw_payload_prot, + input wire io_inputs_1_w_valid, + output wire io_inputs_1_w_ready, + input wire [31:0] io_inputs_1_w_payload_data, + input wire [3:0] io_inputs_1_w_payload_strb, + input wire io_inputs_1_w_payload_last, + output wire io_inputs_1_b_valid, + input wire io_inputs_1_b_ready, + output wire [3:0] io_inputs_1_b_payload_id, + output wire [1:0] io_inputs_1_b_payload_resp, + output wire io_output_aw_valid, + input wire io_output_aw_ready, + output wire [31:0] io_output_aw_payload_addr, + output wire [4:0] io_output_aw_payload_id, + output wire [7:0] io_output_aw_payload_len, + output wire [2:0] io_output_aw_payload_size, + output wire [1:0] io_output_aw_payload_burst, + output wire [0:0] io_output_aw_payload_lock, + output wire [3:0] io_output_aw_payload_cache, + output wire [2:0] io_output_aw_payload_prot, + output wire io_output_w_valid, + input wire io_output_w_ready, + output wire [31:0] io_output_w_payload_data, + output wire [3:0] io_output_w_payload_strb, + output wire io_output_w_payload_last, + input wire io_output_b_valid, + output wire io_output_b_ready, + input wire [4:0] io_output_b_payload_id, + input wire [1:0] io_output_b_payload_resp, + input wire clk, + input wire resetn +); + + reg cmdArbiter_io_output_ready; + wire cmdRouteFork_translated_fifo_io_pop_ready; + wire cmdRouteFork_translated_fifo_io_flush; + wire cmdArbiter_io_inputs_0_ready; + wire cmdArbiter_io_inputs_1_ready; + wire cmdArbiter_io_output_valid; + wire [31:0] cmdArbiter_io_output_payload_addr; + wire [3:0] cmdArbiter_io_output_payload_id; + wire [7:0] cmdArbiter_io_output_payload_len; + wire [2:0] cmdArbiter_io_output_payload_size; + wire [1:0] cmdArbiter_io_output_payload_burst; + wire [0:0] cmdArbiter_io_output_payload_lock; + wire [3:0] cmdArbiter_io_output_payload_cache; + wire [2:0] cmdArbiter_io_output_payload_prot; + wire [0:0] cmdArbiter_io_chosen; + wire [1:0] cmdArbiter_io_chosenOH; + wire cmdRouteFork_translated_fifo_io_push_ready; + wire cmdRouteFork_translated_fifo_io_pop_valid; + wire [0:0] cmdRouteFork_translated_fifo_io_pop_payload; + wire [2:0] cmdRouteFork_translated_fifo_io_occupancy; + wire [2:0] cmdRouteFork_translated_fifo_io_availability; + reg _zz_io_output_w_valid; + reg [31:0] _zz_io_output_w_payload_data; + reg [3:0] _zz_io_output_w_payload_strb; + reg _zz_io_output_w_payload_last; + reg _zz_io_output_b_ready; + wire cmdOutputFork_valid; + wire cmdOutputFork_ready; + wire [31:0] cmdOutputFork_payload_addr; + wire [3:0] cmdOutputFork_payload_id; + wire [7:0] cmdOutputFork_payload_len; + wire [2:0] cmdOutputFork_payload_size; + wire [1:0] cmdOutputFork_payload_burst; + wire [0:0] cmdOutputFork_payload_lock; + wire [3:0] cmdOutputFork_payload_cache; + wire [2:0] cmdOutputFork_payload_prot; + wire cmdRouteFork_valid; + wire cmdRouteFork_ready; + wire [31:0] cmdRouteFork_payload_addr; + wire [3:0] cmdRouteFork_payload_id; + wire [7:0] cmdRouteFork_payload_len; + wire [2:0] cmdRouteFork_payload_size; + wire [1:0] cmdRouteFork_payload_burst; + wire [0:0] cmdRouteFork_payload_lock; + wire [3:0] cmdRouteFork_payload_cache; + wire [2:0] cmdRouteFork_payload_prot; + reg axi4WriteOnlyArbiter_5_cmdArbiter_io_output_fork2_logic_linkEnable_0; + reg axi4WriteOnlyArbiter_5_cmdArbiter_io_output_fork2_logic_linkEnable_1; + wire when_Stream_l1020; + wire when_Stream_l1020_1; + wire cmdOutputFork_fire; + wire cmdRouteFork_fire; + wire cmdRouteFork_translated_valid; + wire cmdRouteFork_translated_ready; + wire [0:0] cmdRouteFork_translated_payload; + wire io_output_w_fire; + wire [0:0] writeRspIndex; + wire writeRspSels_0; + wire writeRspSels_1; + + StreamArbiter_7 cmdArbiter ( + .io_inputs_0_valid (io_inputs_0_aw_valid ), //i + .io_inputs_0_ready (cmdArbiter_io_inputs_0_ready ), //o + .io_inputs_0_payload_addr (io_inputs_0_aw_payload_addr[31:0] ), //i + .io_inputs_0_payload_id (io_inputs_0_aw_payload_id[3:0] ), //i + .io_inputs_0_payload_len (io_inputs_0_aw_payload_len[7:0] ), //i + .io_inputs_0_payload_size (io_inputs_0_aw_payload_size[2:0] ), //i + .io_inputs_0_payload_burst (io_inputs_0_aw_payload_burst[1:0] ), //i + .io_inputs_0_payload_lock (io_inputs_0_aw_payload_lock ), //i + .io_inputs_0_payload_cache (io_inputs_0_aw_payload_cache[3:0] ), //i + .io_inputs_0_payload_prot (io_inputs_0_aw_payload_prot[2:0] ), //i + .io_inputs_1_valid (io_inputs_1_aw_valid ), //i + .io_inputs_1_ready (cmdArbiter_io_inputs_1_ready ), //o + .io_inputs_1_payload_addr (io_inputs_1_aw_payload_addr[31:0] ), //i + .io_inputs_1_payload_id (io_inputs_1_aw_payload_id[3:0] ), //i + .io_inputs_1_payload_len (io_inputs_1_aw_payload_len[7:0] ), //i + .io_inputs_1_payload_size (io_inputs_1_aw_payload_size[2:0] ), //i + .io_inputs_1_payload_burst (io_inputs_1_aw_payload_burst[1:0] ), //i + .io_inputs_1_payload_lock (io_inputs_1_aw_payload_lock ), //i + .io_inputs_1_payload_cache (io_inputs_1_aw_payload_cache[3:0] ), //i + .io_inputs_1_payload_prot (io_inputs_1_aw_payload_prot[2:0] ), //i + .io_output_valid (cmdArbiter_io_output_valid ), //o + .io_output_ready (cmdArbiter_io_output_ready ), //i + .io_output_payload_addr (cmdArbiter_io_output_payload_addr[31:0]), //o + .io_output_payload_id (cmdArbiter_io_output_payload_id[3:0] ), //o + .io_output_payload_len (cmdArbiter_io_output_payload_len[7:0] ), //o + .io_output_payload_size (cmdArbiter_io_output_payload_size[2:0] ), //o + .io_output_payload_burst (cmdArbiter_io_output_payload_burst[1:0]), //o + .io_output_payload_lock (cmdArbiter_io_output_payload_lock ), //o + .io_output_payload_cache (cmdArbiter_io_output_payload_cache[3:0]), //o + .io_output_payload_prot (cmdArbiter_io_output_payload_prot[2:0] ), //o + .io_chosen (cmdArbiter_io_chosen ), //o + .io_chosenOH (cmdArbiter_io_chosenOH[1:0] ), //o + .clk (clk ), //i + .resetn (resetn ) //i + ); + StreamFifoLowLatency_3 cmdRouteFork_translated_fifo ( + .io_push_valid (cmdRouteFork_translated_valid ), //i + .io_push_ready (cmdRouteFork_translated_fifo_io_push_ready ), //o + .io_push_payload (cmdRouteFork_translated_payload ), //i + .io_pop_valid (cmdRouteFork_translated_fifo_io_pop_valid ), //o + .io_pop_ready (cmdRouteFork_translated_fifo_io_pop_ready ), //i + .io_pop_payload (cmdRouteFork_translated_fifo_io_pop_payload ), //o + .io_flush (cmdRouteFork_translated_fifo_io_flush ), //i + .io_occupancy (cmdRouteFork_translated_fifo_io_occupancy[2:0] ), //o + .io_availability (cmdRouteFork_translated_fifo_io_availability[2:0]), //o + .clk (clk ), //i + .resetn (resetn ) //i + ); + always @(*) begin + case(cmdRouteFork_translated_fifo_io_pop_payload) + 1'b0 : begin + _zz_io_output_w_valid = io_inputs_0_w_valid; + _zz_io_output_w_payload_data = io_inputs_0_w_payload_data; + _zz_io_output_w_payload_strb = io_inputs_0_w_payload_strb; + _zz_io_output_w_payload_last = io_inputs_0_w_payload_last; + end + default : begin + _zz_io_output_w_valid = io_inputs_1_w_valid; + _zz_io_output_w_payload_data = io_inputs_1_w_payload_data; + _zz_io_output_w_payload_strb = io_inputs_1_w_payload_strb; + _zz_io_output_w_payload_last = io_inputs_1_w_payload_last; + end + endcase + end + + always @(*) begin + case(writeRspIndex) + 1'b0 : _zz_io_output_b_ready = io_inputs_0_b_ready; + default : _zz_io_output_b_ready = io_inputs_1_b_ready; + endcase + end + + assign io_inputs_0_aw_ready = cmdArbiter_io_inputs_0_ready; + assign io_inputs_1_aw_ready = cmdArbiter_io_inputs_1_ready; + always @(*) begin + cmdArbiter_io_output_ready = 1'b1; + if(when_Stream_l1020) begin + cmdArbiter_io_output_ready = 1'b0; + end + if(when_Stream_l1020_1) begin + cmdArbiter_io_output_ready = 1'b0; + end + end + + assign when_Stream_l1020 = ((! cmdOutputFork_ready) && axi4WriteOnlyArbiter_5_cmdArbiter_io_output_fork2_logic_linkEnable_0); + assign when_Stream_l1020_1 = ((! cmdRouteFork_ready) && axi4WriteOnlyArbiter_5_cmdArbiter_io_output_fork2_logic_linkEnable_1); + assign cmdOutputFork_valid = (cmdArbiter_io_output_valid && axi4WriteOnlyArbiter_5_cmdArbiter_io_output_fork2_logic_linkEnable_0); + assign cmdOutputFork_payload_addr = cmdArbiter_io_output_payload_addr; + assign cmdOutputFork_payload_id = cmdArbiter_io_output_payload_id; + assign cmdOutputFork_payload_len = cmdArbiter_io_output_payload_len; + assign cmdOutputFork_payload_size = cmdArbiter_io_output_payload_size; + assign cmdOutputFork_payload_burst = cmdArbiter_io_output_payload_burst; + assign cmdOutputFork_payload_lock = cmdArbiter_io_output_payload_lock; + assign cmdOutputFork_payload_cache = cmdArbiter_io_output_payload_cache; + assign cmdOutputFork_payload_prot = cmdArbiter_io_output_payload_prot; + assign cmdOutputFork_fire = (cmdOutputFork_valid && cmdOutputFork_ready); + assign cmdRouteFork_valid = (cmdArbiter_io_output_valid && axi4WriteOnlyArbiter_5_cmdArbiter_io_output_fork2_logic_linkEnable_1); + assign cmdRouteFork_payload_addr = cmdArbiter_io_output_payload_addr; + assign cmdRouteFork_payload_id = cmdArbiter_io_output_payload_id; + assign cmdRouteFork_payload_len = cmdArbiter_io_output_payload_len; + assign cmdRouteFork_payload_size = cmdArbiter_io_output_payload_size; + assign cmdRouteFork_payload_burst = cmdArbiter_io_output_payload_burst; + assign cmdRouteFork_payload_lock = cmdArbiter_io_output_payload_lock; + assign cmdRouteFork_payload_cache = cmdArbiter_io_output_payload_cache; + assign cmdRouteFork_payload_prot = cmdArbiter_io_output_payload_prot; + assign cmdRouteFork_fire = (cmdRouteFork_valid && cmdRouteFork_ready); + assign io_output_aw_valid = cmdOutputFork_valid; + assign cmdOutputFork_ready = io_output_aw_ready; + assign io_output_aw_payload_addr = cmdOutputFork_payload_addr; + assign io_output_aw_payload_len = cmdOutputFork_payload_len; + assign io_output_aw_payload_size = cmdOutputFork_payload_size; + assign io_output_aw_payload_burst = cmdOutputFork_payload_burst; + assign io_output_aw_payload_lock = cmdOutputFork_payload_lock; + assign io_output_aw_payload_cache = cmdOutputFork_payload_cache; + assign io_output_aw_payload_prot = cmdOutputFork_payload_prot; + assign io_output_aw_payload_id = {cmdArbiter_io_chosen,cmdArbiter_io_output_payload_id}; + assign cmdRouteFork_translated_valid = cmdRouteFork_valid; + assign cmdRouteFork_ready = cmdRouteFork_translated_ready; + assign cmdRouteFork_translated_payload = cmdArbiter_io_chosen; + assign cmdRouteFork_translated_ready = cmdRouteFork_translated_fifo_io_push_ready; + assign io_output_w_valid = (cmdRouteFork_translated_fifo_io_pop_valid && _zz_io_output_w_valid); + assign io_output_w_payload_data = _zz_io_output_w_payload_data; + assign io_output_w_payload_strb = _zz_io_output_w_payload_strb; + assign io_output_w_payload_last = _zz_io_output_w_payload_last; + assign io_inputs_0_w_ready = ((cmdRouteFork_translated_fifo_io_pop_valid && io_output_w_ready) && (cmdRouteFork_translated_fifo_io_pop_payload == 1'b0)); + assign io_inputs_1_w_ready = ((cmdRouteFork_translated_fifo_io_pop_valid && io_output_w_ready) && (cmdRouteFork_translated_fifo_io_pop_payload == 1'b1)); + assign io_output_w_fire = (io_output_w_valid && io_output_w_ready); + assign cmdRouteFork_translated_fifo_io_pop_ready = (io_output_w_fire && io_output_w_payload_last); + assign writeRspIndex = io_output_b_payload_id[4 : 4]; + assign writeRspSels_0 = (writeRspIndex == 1'b0); + assign writeRspSels_1 = (writeRspIndex == 1'b1); + assign io_inputs_0_b_valid = (io_output_b_valid && writeRspSels_0); + assign io_inputs_0_b_payload_resp = io_output_b_payload_resp; + assign io_inputs_0_b_payload_id = io_output_b_payload_id[3 : 0]; + assign io_inputs_1_b_valid = (io_output_b_valid && writeRspSels_1); + assign io_inputs_1_b_payload_resp = io_output_b_payload_resp; + assign io_inputs_1_b_payload_id = io_output_b_payload_id[3 : 0]; + assign io_output_b_ready = _zz_io_output_b_ready; + assign cmdRouteFork_translated_fifo_io_flush = 1'b0; + always @(posedge clk or negedge resetn) begin + if(!resetn) begin + axi4WriteOnlyArbiter_5_cmdArbiter_io_output_fork2_logic_linkEnable_0 <= 1'b1; + axi4WriteOnlyArbiter_5_cmdArbiter_io_output_fork2_logic_linkEnable_1 <= 1'b1; + end else begin + if(cmdOutputFork_fire) begin + axi4WriteOnlyArbiter_5_cmdArbiter_io_output_fork2_logic_linkEnable_0 <= 1'b0; + end + if(cmdRouteFork_fire) begin + axi4WriteOnlyArbiter_5_cmdArbiter_io_output_fork2_logic_linkEnable_1 <= 1'b0; + end + if(cmdArbiter_io_output_ready) begin + axi4WriteOnlyArbiter_5_cmdArbiter_io_output_fork2_logic_linkEnable_0 <= 1'b1; + axi4WriteOnlyArbiter_5_cmdArbiter_io_output_fork2_logic_linkEnable_1 <= 1'b1; + end + end + end + + +endmodule + +//Axi4ReadOnlyArbiter_1 replaced by Axi4ReadOnlyArbiter + +module Axi4WriteOnlyArbiter ( + input wire io_inputs_0_aw_valid, + output wire io_inputs_0_aw_ready, + input wire [31:0] io_inputs_0_aw_payload_addr, + input wire [3:0] io_inputs_0_aw_payload_id, + input wire [7:0] io_inputs_0_aw_payload_len, + input wire [2:0] io_inputs_0_aw_payload_size, + input wire [1:0] io_inputs_0_aw_payload_burst, + input wire [0:0] io_inputs_0_aw_payload_lock, + input wire [3:0] io_inputs_0_aw_payload_cache, + input wire [2:0] io_inputs_0_aw_payload_prot, + input wire io_inputs_0_w_valid, + output wire io_inputs_0_w_ready, + input wire [31:0] io_inputs_0_w_payload_data, + input wire [3:0] io_inputs_0_w_payload_strb, + input wire io_inputs_0_w_payload_last, + output wire io_inputs_0_b_valid, + input wire io_inputs_0_b_ready, + output wire [3:0] io_inputs_0_b_payload_id, + output wire [1:0] io_inputs_0_b_payload_resp, + input wire io_inputs_1_aw_valid, + output wire io_inputs_1_aw_ready, + input wire [31:0] io_inputs_1_aw_payload_addr, + input wire [3:0] io_inputs_1_aw_payload_id, + input wire [7:0] io_inputs_1_aw_payload_len, + input wire [2:0] io_inputs_1_aw_payload_size, + input wire [1:0] io_inputs_1_aw_payload_burst, + input wire [0:0] io_inputs_1_aw_payload_lock, + input wire [3:0] io_inputs_1_aw_payload_cache, + input wire [2:0] io_inputs_1_aw_payload_prot, + input wire io_inputs_1_w_valid, + output wire io_inputs_1_w_ready, + input wire [31:0] io_inputs_1_w_payload_data, + input wire [3:0] io_inputs_1_w_payload_strb, + input wire io_inputs_1_w_payload_last, + output wire io_inputs_1_b_valid, + input wire io_inputs_1_b_ready, + output wire [3:0] io_inputs_1_b_payload_id, + output wire [1:0] io_inputs_1_b_payload_resp, + output wire io_output_aw_valid, + input wire io_output_aw_ready, + output wire [31:0] io_output_aw_payload_addr, + output wire [4:0] io_output_aw_payload_id, + output wire [7:0] io_output_aw_payload_len, + output wire [2:0] io_output_aw_payload_size, + output wire [1:0] io_output_aw_payload_burst, + output wire [0:0] io_output_aw_payload_lock, + output wire [3:0] io_output_aw_payload_cache, + output wire [2:0] io_output_aw_payload_prot, + output wire io_output_w_valid, + input wire io_output_w_ready, + output wire [31:0] io_output_w_payload_data, + output wire [3:0] io_output_w_payload_strb, + output wire io_output_w_payload_last, + input wire io_output_b_valid, + output wire io_output_b_ready, + input wire [4:0] io_output_b_payload_id, + input wire [1:0] io_output_b_payload_resp, + input wire clk, + input wire resetn +); + + reg cmdArbiter_io_output_ready; + wire cmdRouteFork_translated_fifo_io_pop_ready; + wire cmdRouteFork_translated_fifo_io_flush; + wire cmdArbiter_io_inputs_0_ready; + wire cmdArbiter_io_inputs_1_ready; + wire cmdArbiter_io_output_valid; + wire [31:0] cmdArbiter_io_output_payload_addr; + wire [3:0] cmdArbiter_io_output_payload_id; + wire [7:0] cmdArbiter_io_output_payload_len; + wire [2:0] cmdArbiter_io_output_payload_size; + wire [1:0] cmdArbiter_io_output_payload_burst; + wire [0:0] cmdArbiter_io_output_payload_lock; + wire [3:0] cmdArbiter_io_output_payload_cache; + wire [2:0] cmdArbiter_io_output_payload_prot; + wire [0:0] cmdArbiter_io_chosen; + wire [1:0] cmdArbiter_io_chosenOH; + wire cmdRouteFork_translated_fifo_io_push_ready; + wire cmdRouteFork_translated_fifo_io_pop_valid; + wire [0:0] cmdRouteFork_translated_fifo_io_pop_payload; + wire [2:0] cmdRouteFork_translated_fifo_io_occupancy; + wire [2:0] cmdRouteFork_translated_fifo_io_availability; + reg _zz_io_output_w_valid; + reg [31:0] _zz_io_output_w_payload_data; + reg [3:0] _zz_io_output_w_payload_strb; + reg _zz_io_output_w_payload_last; + reg _zz_io_output_b_ready; + wire cmdOutputFork_valid; + wire cmdOutputFork_ready; + wire [31:0] cmdOutputFork_payload_addr; + wire [3:0] cmdOutputFork_payload_id; + wire [7:0] cmdOutputFork_payload_len; + wire [2:0] cmdOutputFork_payload_size; + wire [1:0] cmdOutputFork_payload_burst; + wire [0:0] cmdOutputFork_payload_lock; + wire [3:0] cmdOutputFork_payload_cache; + wire [2:0] cmdOutputFork_payload_prot; + wire cmdRouteFork_valid; + wire cmdRouteFork_ready; + wire [31:0] cmdRouteFork_payload_addr; + wire [3:0] cmdRouteFork_payload_id; + wire [7:0] cmdRouteFork_payload_len; + wire [2:0] cmdRouteFork_payload_size; + wire [1:0] cmdRouteFork_payload_burst; + wire [0:0] cmdRouteFork_payload_lock; + wire [3:0] cmdRouteFork_payload_cache; + wire [2:0] cmdRouteFork_payload_prot; + reg axi4WriteOnlyArbiter_4_cmdArbiter_io_output_fork2_logic_linkEnable_0; + reg axi4WriteOnlyArbiter_4_cmdArbiter_io_output_fork2_logic_linkEnable_1; + wire when_Stream_l1020; + wire when_Stream_l1020_1; + wire cmdOutputFork_fire; + wire cmdRouteFork_fire; + wire cmdRouteFork_translated_valid; + wire cmdRouteFork_translated_ready; + wire [0:0] cmdRouteFork_translated_payload; + wire io_output_w_fire; + wire [0:0] writeRspIndex; + wire writeRspSels_0; + wire writeRspSels_1; + + StreamArbiter_7 cmdArbiter ( + .io_inputs_0_valid (io_inputs_0_aw_valid ), //i + .io_inputs_0_ready (cmdArbiter_io_inputs_0_ready ), //o + .io_inputs_0_payload_addr (io_inputs_0_aw_payload_addr[31:0] ), //i + .io_inputs_0_payload_id (io_inputs_0_aw_payload_id[3:0] ), //i + .io_inputs_0_payload_len (io_inputs_0_aw_payload_len[7:0] ), //i + .io_inputs_0_payload_size (io_inputs_0_aw_payload_size[2:0] ), //i + .io_inputs_0_payload_burst (io_inputs_0_aw_payload_burst[1:0] ), //i + .io_inputs_0_payload_lock (io_inputs_0_aw_payload_lock ), //i + .io_inputs_0_payload_cache (io_inputs_0_aw_payload_cache[3:0] ), //i + .io_inputs_0_payload_prot (io_inputs_0_aw_payload_prot[2:0] ), //i + .io_inputs_1_valid (io_inputs_1_aw_valid ), //i + .io_inputs_1_ready (cmdArbiter_io_inputs_1_ready ), //o + .io_inputs_1_payload_addr (io_inputs_1_aw_payload_addr[31:0] ), //i + .io_inputs_1_payload_id (io_inputs_1_aw_payload_id[3:0] ), //i + .io_inputs_1_payload_len (io_inputs_1_aw_payload_len[7:0] ), //i + .io_inputs_1_payload_size (io_inputs_1_aw_payload_size[2:0] ), //i + .io_inputs_1_payload_burst (io_inputs_1_aw_payload_burst[1:0] ), //i + .io_inputs_1_payload_lock (io_inputs_1_aw_payload_lock ), //i + .io_inputs_1_payload_cache (io_inputs_1_aw_payload_cache[3:0] ), //i + .io_inputs_1_payload_prot (io_inputs_1_aw_payload_prot[2:0] ), //i + .io_output_valid (cmdArbiter_io_output_valid ), //o + .io_output_ready (cmdArbiter_io_output_ready ), //i + .io_output_payload_addr (cmdArbiter_io_output_payload_addr[31:0]), //o + .io_output_payload_id (cmdArbiter_io_output_payload_id[3:0] ), //o + .io_output_payload_len (cmdArbiter_io_output_payload_len[7:0] ), //o + .io_output_payload_size (cmdArbiter_io_output_payload_size[2:0] ), //o + .io_output_payload_burst (cmdArbiter_io_output_payload_burst[1:0]), //o + .io_output_payload_lock (cmdArbiter_io_output_payload_lock ), //o + .io_output_payload_cache (cmdArbiter_io_output_payload_cache[3:0]), //o + .io_output_payload_prot (cmdArbiter_io_output_payload_prot[2:0] ), //o + .io_chosen (cmdArbiter_io_chosen ), //o + .io_chosenOH (cmdArbiter_io_chosenOH[1:0] ), //o + .clk (clk ), //i + .resetn (resetn ) //i + ); + StreamFifoLowLatency_3 cmdRouteFork_translated_fifo ( + .io_push_valid (cmdRouteFork_translated_valid ), //i + .io_push_ready (cmdRouteFork_translated_fifo_io_push_ready ), //o + .io_push_payload (cmdRouteFork_translated_payload ), //i + .io_pop_valid (cmdRouteFork_translated_fifo_io_pop_valid ), //o + .io_pop_ready (cmdRouteFork_translated_fifo_io_pop_ready ), //i + .io_pop_payload (cmdRouteFork_translated_fifo_io_pop_payload ), //o + .io_flush (cmdRouteFork_translated_fifo_io_flush ), //i + .io_occupancy (cmdRouteFork_translated_fifo_io_occupancy[2:0] ), //o + .io_availability (cmdRouteFork_translated_fifo_io_availability[2:0]), //o + .clk (clk ), //i + .resetn (resetn ) //i + ); + always @(*) begin + case(cmdRouteFork_translated_fifo_io_pop_payload) + 1'b0 : begin + _zz_io_output_w_valid = io_inputs_0_w_valid; + _zz_io_output_w_payload_data = io_inputs_0_w_payload_data; + _zz_io_output_w_payload_strb = io_inputs_0_w_payload_strb; + _zz_io_output_w_payload_last = io_inputs_0_w_payload_last; + end + default : begin + _zz_io_output_w_valid = io_inputs_1_w_valid; + _zz_io_output_w_payload_data = io_inputs_1_w_payload_data; + _zz_io_output_w_payload_strb = io_inputs_1_w_payload_strb; + _zz_io_output_w_payload_last = io_inputs_1_w_payload_last; + end + endcase + end + + always @(*) begin + case(writeRspIndex) + 1'b0 : _zz_io_output_b_ready = io_inputs_0_b_ready; + default : _zz_io_output_b_ready = io_inputs_1_b_ready; + endcase + end + + assign io_inputs_0_aw_ready = cmdArbiter_io_inputs_0_ready; + assign io_inputs_1_aw_ready = cmdArbiter_io_inputs_1_ready; + always @(*) begin + cmdArbiter_io_output_ready = 1'b1; + if(when_Stream_l1020) begin + cmdArbiter_io_output_ready = 1'b0; + end + if(when_Stream_l1020_1) begin + cmdArbiter_io_output_ready = 1'b0; + end + end + + assign when_Stream_l1020 = ((! cmdOutputFork_ready) && axi4WriteOnlyArbiter_4_cmdArbiter_io_output_fork2_logic_linkEnable_0); + assign when_Stream_l1020_1 = ((! cmdRouteFork_ready) && axi4WriteOnlyArbiter_4_cmdArbiter_io_output_fork2_logic_linkEnable_1); + assign cmdOutputFork_valid = (cmdArbiter_io_output_valid && axi4WriteOnlyArbiter_4_cmdArbiter_io_output_fork2_logic_linkEnable_0); + assign cmdOutputFork_payload_addr = cmdArbiter_io_output_payload_addr; + assign cmdOutputFork_payload_id = cmdArbiter_io_output_payload_id; + assign cmdOutputFork_payload_len = cmdArbiter_io_output_payload_len; + assign cmdOutputFork_payload_size = cmdArbiter_io_output_payload_size; + assign cmdOutputFork_payload_burst = cmdArbiter_io_output_payload_burst; + assign cmdOutputFork_payload_lock = cmdArbiter_io_output_payload_lock; + assign cmdOutputFork_payload_cache = cmdArbiter_io_output_payload_cache; + assign cmdOutputFork_payload_prot = cmdArbiter_io_output_payload_prot; + assign cmdOutputFork_fire = (cmdOutputFork_valid && cmdOutputFork_ready); + assign cmdRouteFork_valid = (cmdArbiter_io_output_valid && axi4WriteOnlyArbiter_4_cmdArbiter_io_output_fork2_logic_linkEnable_1); + assign cmdRouteFork_payload_addr = cmdArbiter_io_output_payload_addr; + assign cmdRouteFork_payload_id = cmdArbiter_io_output_payload_id; + assign cmdRouteFork_payload_len = cmdArbiter_io_output_payload_len; + assign cmdRouteFork_payload_size = cmdArbiter_io_output_payload_size; + assign cmdRouteFork_payload_burst = cmdArbiter_io_output_payload_burst; + assign cmdRouteFork_payload_lock = cmdArbiter_io_output_payload_lock; + assign cmdRouteFork_payload_cache = cmdArbiter_io_output_payload_cache; + assign cmdRouteFork_payload_prot = cmdArbiter_io_output_payload_prot; + assign cmdRouteFork_fire = (cmdRouteFork_valid && cmdRouteFork_ready); + assign io_output_aw_valid = cmdOutputFork_valid; + assign cmdOutputFork_ready = io_output_aw_ready; + assign io_output_aw_payload_addr = cmdOutputFork_payload_addr; + assign io_output_aw_payload_len = cmdOutputFork_payload_len; + assign io_output_aw_payload_size = cmdOutputFork_payload_size; + assign io_output_aw_payload_burst = cmdOutputFork_payload_burst; + assign io_output_aw_payload_lock = cmdOutputFork_payload_lock; + assign io_output_aw_payload_cache = cmdOutputFork_payload_cache; + assign io_output_aw_payload_prot = cmdOutputFork_payload_prot; + assign io_output_aw_payload_id = {cmdArbiter_io_chosen,cmdArbiter_io_output_payload_id}; + assign cmdRouteFork_translated_valid = cmdRouteFork_valid; + assign cmdRouteFork_ready = cmdRouteFork_translated_ready; + assign cmdRouteFork_translated_payload = cmdArbiter_io_chosen; + assign cmdRouteFork_translated_ready = cmdRouteFork_translated_fifo_io_push_ready; + assign io_output_w_valid = (cmdRouteFork_translated_fifo_io_pop_valid && _zz_io_output_w_valid); + assign io_output_w_payload_data = _zz_io_output_w_payload_data; + assign io_output_w_payload_strb = _zz_io_output_w_payload_strb; + assign io_output_w_payload_last = _zz_io_output_w_payload_last; + assign io_inputs_0_w_ready = ((cmdRouteFork_translated_fifo_io_pop_valid && io_output_w_ready) && (cmdRouteFork_translated_fifo_io_pop_payload == 1'b0)); + assign io_inputs_1_w_ready = ((cmdRouteFork_translated_fifo_io_pop_valid && io_output_w_ready) && (cmdRouteFork_translated_fifo_io_pop_payload == 1'b1)); + assign io_output_w_fire = (io_output_w_valid && io_output_w_ready); + assign cmdRouteFork_translated_fifo_io_pop_ready = (io_output_w_fire && io_output_w_payload_last); + assign writeRspIndex = io_output_b_payload_id[4 : 4]; + assign writeRspSels_0 = (writeRspIndex == 1'b0); + assign writeRspSels_1 = (writeRspIndex == 1'b1); + assign io_inputs_0_b_valid = (io_output_b_valid && writeRspSels_0); + assign io_inputs_0_b_payload_resp = io_output_b_payload_resp; + assign io_inputs_0_b_payload_id = io_output_b_payload_id[3 : 0]; + assign io_inputs_1_b_valid = (io_output_b_valid && writeRspSels_1); + assign io_inputs_1_b_payload_resp = io_output_b_payload_resp; + assign io_inputs_1_b_payload_id = io_output_b_payload_id[3 : 0]; + assign io_output_b_ready = _zz_io_output_b_ready; + assign cmdRouteFork_translated_fifo_io_flush = 1'b0; + always @(posedge clk or negedge resetn) begin + if(!resetn) begin + axi4WriteOnlyArbiter_4_cmdArbiter_io_output_fork2_logic_linkEnable_0 <= 1'b1; + axi4WriteOnlyArbiter_4_cmdArbiter_io_output_fork2_logic_linkEnable_1 <= 1'b1; + end else begin + if(cmdOutputFork_fire) begin + axi4WriteOnlyArbiter_4_cmdArbiter_io_output_fork2_logic_linkEnable_0 <= 1'b0; + end + if(cmdRouteFork_fire) begin + axi4WriteOnlyArbiter_4_cmdArbiter_io_output_fork2_logic_linkEnable_1 <= 1'b0; + end + if(cmdArbiter_io_output_ready) begin + axi4WriteOnlyArbiter_4_cmdArbiter_io_output_fork2_logic_linkEnable_0 <= 1'b1; + axi4WriteOnlyArbiter_4_cmdArbiter_io_output_fork2_logic_linkEnable_1 <= 1'b1; + end + end + end + + +endmodule + +module Axi4ReadOnlyArbiter ( + input wire io_inputs_0_ar_valid, + output wire io_inputs_0_ar_ready, + input wire [31:0] io_inputs_0_ar_payload_addr, + input wire [3:0] io_inputs_0_ar_payload_id, + input wire [7:0] io_inputs_0_ar_payload_len, + input wire [2:0] io_inputs_0_ar_payload_size, + input wire [1:0] io_inputs_0_ar_payload_burst, + input wire [0:0] io_inputs_0_ar_payload_lock, + input wire [3:0] io_inputs_0_ar_payload_cache, + input wire [2:0] io_inputs_0_ar_payload_prot, + output wire io_inputs_0_r_valid, + input wire io_inputs_0_r_ready, + output wire [31:0] io_inputs_0_r_payload_data, + output wire [3:0] io_inputs_0_r_payload_id, + output wire [1:0] io_inputs_0_r_payload_resp, + output wire io_inputs_0_r_payload_last, + input wire io_inputs_1_ar_valid, + output wire io_inputs_1_ar_ready, + input wire [31:0] io_inputs_1_ar_payload_addr, + input wire [3:0] io_inputs_1_ar_payload_id, + input wire [7:0] io_inputs_1_ar_payload_len, + input wire [2:0] io_inputs_1_ar_payload_size, + input wire [1:0] io_inputs_1_ar_payload_burst, + input wire [0:0] io_inputs_1_ar_payload_lock, + input wire [3:0] io_inputs_1_ar_payload_cache, + input wire [2:0] io_inputs_1_ar_payload_prot, + output wire io_inputs_1_r_valid, + input wire io_inputs_1_r_ready, + output wire [31:0] io_inputs_1_r_payload_data, + output wire [3:0] io_inputs_1_r_payload_id, + output wire [1:0] io_inputs_1_r_payload_resp, + output wire io_inputs_1_r_payload_last, + output wire io_output_ar_valid, + input wire io_output_ar_ready, + output wire [31:0] io_output_ar_payload_addr, + output wire [4:0] io_output_ar_payload_id, + output wire [7:0] io_output_ar_payload_len, + output wire [2:0] io_output_ar_payload_size, + output wire [1:0] io_output_ar_payload_burst, + output wire [0:0] io_output_ar_payload_lock, + output wire [3:0] io_output_ar_payload_cache, + output wire [2:0] io_output_ar_payload_prot, + input wire io_output_r_valid, + output wire io_output_r_ready, + input wire [31:0] io_output_r_payload_data, + input wire [4:0] io_output_r_payload_id, + input wire [1:0] io_output_r_payload_resp, + input wire io_output_r_payload_last, + input wire clk, + input wire resetn +); + + wire cmdArbiter_io_inputs_0_ready; + wire cmdArbiter_io_inputs_1_ready; + wire cmdArbiter_io_output_valid; + wire [31:0] cmdArbiter_io_output_payload_addr; + wire [3:0] cmdArbiter_io_output_payload_id; + wire [7:0] cmdArbiter_io_output_payload_len; + wire [2:0] cmdArbiter_io_output_payload_size; + wire [1:0] cmdArbiter_io_output_payload_burst; + wire [0:0] cmdArbiter_io_output_payload_lock; + wire [3:0] cmdArbiter_io_output_payload_cache; + wire [2:0] cmdArbiter_io_output_payload_prot; + wire [0:0] cmdArbiter_io_chosen; + wire [1:0] cmdArbiter_io_chosenOH; + reg _zz_io_output_r_ready; + wire [0:0] readRspIndex; + wire readRspSels_0; + wire readRspSels_1; + + StreamArbiter_7 cmdArbiter ( + .io_inputs_0_valid (io_inputs_0_ar_valid ), //i + .io_inputs_0_ready (cmdArbiter_io_inputs_0_ready ), //o + .io_inputs_0_payload_addr (io_inputs_0_ar_payload_addr[31:0] ), //i + .io_inputs_0_payload_id (io_inputs_0_ar_payload_id[3:0] ), //i + .io_inputs_0_payload_len (io_inputs_0_ar_payload_len[7:0] ), //i + .io_inputs_0_payload_size (io_inputs_0_ar_payload_size[2:0] ), //i + .io_inputs_0_payload_burst (io_inputs_0_ar_payload_burst[1:0] ), //i + .io_inputs_0_payload_lock (io_inputs_0_ar_payload_lock ), //i + .io_inputs_0_payload_cache (io_inputs_0_ar_payload_cache[3:0] ), //i + .io_inputs_0_payload_prot (io_inputs_0_ar_payload_prot[2:0] ), //i + .io_inputs_1_valid (io_inputs_1_ar_valid ), //i + .io_inputs_1_ready (cmdArbiter_io_inputs_1_ready ), //o + .io_inputs_1_payload_addr (io_inputs_1_ar_payload_addr[31:0] ), //i + .io_inputs_1_payload_id (io_inputs_1_ar_payload_id[3:0] ), //i + .io_inputs_1_payload_len (io_inputs_1_ar_payload_len[7:0] ), //i + .io_inputs_1_payload_size (io_inputs_1_ar_payload_size[2:0] ), //i + .io_inputs_1_payload_burst (io_inputs_1_ar_payload_burst[1:0] ), //i + .io_inputs_1_payload_lock (io_inputs_1_ar_payload_lock ), //i + .io_inputs_1_payload_cache (io_inputs_1_ar_payload_cache[3:0] ), //i + .io_inputs_1_payload_prot (io_inputs_1_ar_payload_prot[2:0] ), //i + .io_output_valid (cmdArbiter_io_output_valid ), //o + .io_output_ready (io_output_ar_ready ), //i + .io_output_payload_addr (cmdArbiter_io_output_payload_addr[31:0]), //o + .io_output_payload_id (cmdArbiter_io_output_payload_id[3:0] ), //o + .io_output_payload_len (cmdArbiter_io_output_payload_len[7:0] ), //o + .io_output_payload_size (cmdArbiter_io_output_payload_size[2:0] ), //o + .io_output_payload_burst (cmdArbiter_io_output_payload_burst[1:0]), //o + .io_output_payload_lock (cmdArbiter_io_output_payload_lock ), //o + .io_output_payload_cache (cmdArbiter_io_output_payload_cache[3:0]), //o + .io_output_payload_prot (cmdArbiter_io_output_payload_prot[2:0] ), //o + .io_chosen (cmdArbiter_io_chosen ), //o + .io_chosenOH (cmdArbiter_io_chosenOH[1:0] ), //o + .clk (clk ), //i + .resetn (resetn ) //i + ); + always @(*) begin + case(readRspIndex) + 1'b0 : _zz_io_output_r_ready = io_inputs_0_r_ready; + default : _zz_io_output_r_ready = io_inputs_1_r_ready; + endcase + end + + assign io_inputs_0_ar_ready = cmdArbiter_io_inputs_0_ready; + assign io_inputs_1_ar_ready = cmdArbiter_io_inputs_1_ready; + assign io_output_ar_valid = cmdArbiter_io_output_valid; + assign io_output_ar_payload_addr = cmdArbiter_io_output_payload_addr; + assign io_output_ar_payload_len = cmdArbiter_io_output_payload_len; + assign io_output_ar_payload_size = cmdArbiter_io_output_payload_size; + assign io_output_ar_payload_burst = cmdArbiter_io_output_payload_burst; + assign io_output_ar_payload_lock = cmdArbiter_io_output_payload_lock; + assign io_output_ar_payload_cache = cmdArbiter_io_output_payload_cache; + assign io_output_ar_payload_prot = cmdArbiter_io_output_payload_prot; + assign io_output_ar_payload_id = {cmdArbiter_io_chosen,cmdArbiter_io_output_payload_id}; + assign readRspIndex = io_output_r_payload_id[4 : 4]; + assign readRspSels_0 = (readRspIndex == 1'b0); + assign readRspSels_1 = (readRspIndex == 1'b1); + assign io_inputs_0_r_valid = (io_output_r_valid && readRspSels_0); + assign io_inputs_0_r_payload_data = io_output_r_payload_data; + assign io_inputs_0_r_payload_resp = io_output_r_payload_resp; + assign io_inputs_0_r_payload_last = io_output_r_payload_last; + assign io_inputs_0_r_payload_id = io_output_r_payload_id[3 : 0]; + assign io_inputs_1_r_valid = (io_output_r_valid && readRspSels_1); + assign io_inputs_1_r_payload_data = io_output_r_payload_data; + assign io_inputs_1_r_payload_resp = io_output_r_payload_resp; + assign io_inputs_1_r_payload_last = io_output_r_payload_last; + assign io_inputs_1_r_payload_id = io_output_r_payload_id[3 : 0]; + assign io_output_r_ready = _zz_io_output_r_ready; + +endmodule + +module Axi4WriteOnlyDecoder_1 ( + input wire io_input_aw_valid, + output wire io_input_aw_ready, + input wire [31:0] io_input_aw_payload_addr, + input wire [3:0] io_input_aw_payload_id, + input wire [7:0] io_input_aw_payload_len, + input wire [2:0] io_input_aw_payload_size, + input wire [1:0] io_input_aw_payload_burst, + input wire [0:0] io_input_aw_payload_lock, + input wire [3:0] io_input_aw_payload_cache, + input wire [2:0] io_input_aw_payload_prot, + input wire io_input_w_valid, + output wire io_input_w_ready, + input wire [31:0] io_input_w_payload_data, + input wire [3:0] io_input_w_payload_strb, + input wire io_input_w_payload_last, + output wire io_input_b_valid, + input wire io_input_b_ready, + output reg [3:0] io_input_b_payload_id, + output reg [1:0] io_input_b_payload_resp, + output wire io_outputs_0_aw_valid, + input wire io_outputs_0_aw_ready, + output wire [31:0] io_outputs_0_aw_payload_addr, + output wire [3:0] io_outputs_0_aw_payload_id, + output wire [7:0] io_outputs_0_aw_payload_len, + output wire [2:0] io_outputs_0_aw_payload_size, + output wire [1:0] io_outputs_0_aw_payload_burst, + output wire [0:0] io_outputs_0_aw_payload_lock, + output wire [3:0] io_outputs_0_aw_payload_cache, + output wire [2:0] io_outputs_0_aw_payload_prot, + output wire io_outputs_0_w_valid, + input wire io_outputs_0_w_ready, + output wire [31:0] io_outputs_0_w_payload_data, + output wire [3:0] io_outputs_0_w_payload_strb, + output wire io_outputs_0_w_payload_last, + input wire io_outputs_0_b_valid, + output wire io_outputs_0_b_ready, + input wire [3:0] io_outputs_0_b_payload_id, + input wire [1:0] io_outputs_0_b_payload_resp, + output wire io_outputs_1_aw_valid, + input wire io_outputs_1_aw_ready, + output wire [31:0] io_outputs_1_aw_payload_addr, + output wire [3:0] io_outputs_1_aw_payload_id, + output wire [7:0] io_outputs_1_aw_payload_len, + output wire [2:0] io_outputs_1_aw_payload_size, + output wire [1:0] io_outputs_1_aw_payload_burst, + output wire [0:0] io_outputs_1_aw_payload_lock, + output wire [3:0] io_outputs_1_aw_payload_cache, + output wire [2:0] io_outputs_1_aw_payload_prot, + output wire io_outputs_1_w_valid, + input wire io_outputs_1_w_ready, + output wire [31:0] io_outputs_1_w_payload_data, + output wire [3:0] io_outputs_1_w_payload_strb, + output wire io_outputs_1_w_payload_last, + input wire io_outputs_1_b_valid, + output wire io_outputs_1_b_ready, + input wire [3:0] io_outputs_1_b_payload_id, + input wire [1:0] io_outputs_1_b_payload_resp, + output wire io_outputs_2_aw_valid, + input wire io_outputs_2_aw_ready, + output wire [31:0] io_outputs_2_aw_payload_addr, + output wire [3:0] io_outputs_2_aw_payload_id, + output wire [7:0] io_outputs_2_aw_payload_len, + output wire [2:0] io_outputs_2_aw_payload_size, + output wire [1:0] io_outputs_2_aw_payload_burst, + output wire [0:0] io_outputs_2_aw_payload_lock, + output wire [3:0] io_outputs_2_aw_payload_cache, + output wire [2:0] io_outputs_2_aw_payload_prot, + output wire io_outputs_2_w_valid, + input wire io_outputs_2_w_ready, + output wire [31:0] io_outputs_2_w_payload_data, + output wire [3:0] io_outputs_2_w_payload_strb, + output wire io_outputs_2_w_payload_last, + input wire io_outputs_2_b_valid, + output wire io_outputs_2_b_ready, + input wire [3:0] io_outputs_2_b_payload_id, + input wire [1:0] io_outputs_2_b_payload_resp, + output wire io_outputs_3_aw_valid, + input wire io_outputs_3_aw_ready, + output wire [31:0] io_outputs_3_aw_payload_addr, + output wire [3:0] io_outputs_3_aw_payload_id, + output wire [7:0] io_outputs_3_aw_payload_len, + output wire [2:0] io_outputs_3_aw_payload_size, + output wire [1:0] io_outputs_3_aw_payload_burst, + output wire [0:0] io_outputs_3_aw_payload_lock, + output wire [3:0] io_outputs_3_aw_payload_cache, + output wire [2:0] io_outputs_3_aw_payload_prot, + output wire io_outputs_3_w_valid, + input wire io_outputs_3_w_ready, + output wire [31:0] io_outputs_3_w_payload_data, + output wire [3:0] io_outputs_3_w_payload_strb, + output wire io_outputs_3_w_payload_last, + input wire io_outputs_3_b_valid, + output wire io_outputs_3_b_ready, + input wire [3:0] io_outputs_3_b_payload_id, + input wire [1:0] io_outputs_3_b_payload_resp, + input wire clk, + input wire resetn +); + + wire errorSlave_io_axi_aw_valid; + wire errorSlave_io_axi_w_valid; + wire errorSlave_io_axi_aw_ready; + wire errorSlave_io_axi_w_ready; + wire errorSlave_io_axi_b_valid; + wire [3:0] errorSlave_io_axi_b_payload_id; + wire [1:0] errorSlave_io_axi_b_payload_resp; + wire [31:0] _zz_decodedCmdSels; + wire [31:0] _zz_decodedCmdSels_1; + wire [31:0] _zz_decodedCmdSels_2; + wire [31:0] _zz_decodedCmdSels_3; + wire [31:0] _zz_decodedCmdSels_4; + wire [31:0] _zz_decodedCmdSels_5; + reg [3:0] _zz_io_input_b_payload_id; + reg [1:0] _zz_io_input_b_payload_resp; + wire cmdAllowedStart; + wire io_input_aw_fire; + wire io_input_b_fire; + reg pendingCmdCounter_incrementIt; + reg pendingCmdCounter_decrementIt; + wire [2:0] pendingCmdCounter_valueNext; + reg [2:0] pendingCmdCounter_value; + wire pendingCmdCounter_mayOverflow; + wire pendingCmdCounter_willOverflowIfInc; + wire pendingCmdCounter_willOverflow; + reg [2:0] pendingCmdCounter_finalIncrement; + wire when_Utils_l723; + wire when_Utils_l725; + wire io_input_w_fire; + wire when_Utils_l697; + reg pendingDataCounter_incrementIt; + reg pendingDataCounter_decrementIt; + wire [2:0] pendingDataCounter_valueNext; + reg [2:0] pendingDataCounter_value; + wire pendingDataCounter_mayOverflow; + wire pendingDataCounter_willOverflowIfInc; + wire pendingDataCounter_willOverflow; + reg [2:0] pendingDataCounter_finalIncrement; + wire when_Utils_l723_1; + wire when_Utils_l725_1; + wire [3:0] decodedCmdSels; + wire decodedCmdError; + reg [3:0] pendingSels; + reg pendingError; + wire allowCmd; + wire allowData; + reg _zz_cmdAllowedStart; + wire _zz_io_outputs_1_w_valid; + wire _zz_io_outputs_2_w_valid; + wire _zz_io_outputs_3_w_valid; + wire _zz_writeRspIndex; + wire _zz_writeRspIndex_1; + wire [1:0] writeRspIndex; + + assign _zz_decodedCmdSels = 32'h000fffff; + assign _zz_decodedCmdSels_1 = (~ 32'h000fffff); + assign _zz_decodedCmdSels_2 = (io_input_aw_payload_addr & (~ 32'h007fffff)); + assign _zz_decodedCmdSels_3 = 32'h00000000; + assign _zz_decodedCmdSels_4 = (io_input_aw_payload_addr & (~ 32'h007fffff)); + assign _zz_decodedCmdSels_5 = 32'h1c000000; + Axi4WriteOnlyErrorSlave_1 errorSlave ( + .io_axi_aw_valid (errorSlave_io_axi_aw_valid ), //i + .io_axi_aw_ready (errorSlave_io_axi_aw_ready ), //o + .io_axi_aw_payload_addr (io_input_aw_payload_addr[31:0] ), //i + .io_axi_aw_payload_id (io_input_aw_payload_id[3:0] ), //i + .io_axi_aw_payload_len (io_input_aw_payload_len[7:0] ), //i + .io_axi_aw_payload_size (io_input_aw_payload_size[2:0] ), //i + .io_axi_aw_payload_burst (io_input_aw_payload_burst[1:0] ), //i + .io_axi_aw_payload_lock (io_input_aw_payload_lock ), //i + .io_axi_aw_payload_cache (io_input_aw_payload_cache[3:0] ), //i + .io_axi_aw_payload_prot (io_input_aw_payload_prot[2:0] ), //i + .io_axi_w_valid (errorSlave_io_axi_w_valid ), //i + .io_axi_w_ready (errorSlave_io_axi_w_ready ), //o + .io_axi_w_payload_data (io_input_w_payload_data[31:0] ), //i + .io_axi_w_payload_strb (io_input_w_payload_strb[3:0] ), //i + .io_axi_w_payload_last (io_input_w_payload_last ), //i + .io_axi_b_valid (errorSlave_io_axi_b_valid ), //o + .io_axi_b_ready (io_input_b_ready ), //i + .io_axi_b_payload_id (errorSlave_io_axi_b_payload_id[3:0] ), //o + .io_axi_b_payload_resp (errorSlave_io_axi_b_payload_resp[1:0]), //o + .clk (clk ), //i + .resetn (resetn ) //i + ); + always @(*) begin + case(writeRspIndex) + 2'b00 : begin + _zz_io_input_b_payload_id = io_outputs_0_b_payload_id; + _zz_io_input_b_payload_resp = io_outputs_0_b_payload_resp; + end + 2'b01 : begin + _zz_io_input_b_payload_id = io_outputs_1_b_payload_id; + _zz_io_input_b_payload_resp = io_outputs_1_b_payload_resp; + end + 2'b10 : begin + _zz_io_input_b_payload_id = io_outputs_2_b_payload_id; + _zz_io_input_b_payload_resp = io_outputs_2_b_payload_resp; + end + default : begin + _zz_io_input_b_payload_id = io_outputs_3_b_payload_id; + _zz_io_input_b_payload_resp = io_outputs_3_b_payload_resp; + end + endcase + end + + assign io_input_aw_fire = (io_input_aw_valid && io_input_aw_ready); + assign io_input_b_fire = (io_input_b_valid && io_input_b_ready); + always @(*) begin + pendingCmdCounter_incrementIt = 1'b0; + if(io_input_aw_fire) begin + pendingCmdCounter_incrementIt = 1'b1; + end + end + + always @(*) begin + pendingCmdCounter_decrementIt = 1'b0; + if(io_input_b_fire) begin + pendingCmdCounter_decrementIt = 1'b1; + end + end + + assign pendingCmdCounter_mayOverflow = (pendingCmdCounter_value == 3'b111); + assign pendingCmdCounter_willOverflowIfInc = (pendingCmdCounter_mayOverflow && (! pendingCmdCounter_decrementIt)); + assign pendingCmdCounter_willOverflow = (pendingCmdCounter_willOverflowIfInc && pendingCmdCounter_incrementIt); + assign when_Utils_l723 = (pendingCmdCounter_incrementIt && (! pendingCmdCounter_decrementIt)); + always @(*) begin + if(when_Utils_l723) begin + pendingCmdCounter_finalIncrement = 3'b001; + end else begin + if(when_Utils_l725) begin + pendingCmdCounter_finalIncrement = 3'b111; + end else begin + pendingCmdCounter_finalIncrement = 3'b000; + end + end + end + + assign when_Utils_l725 = ((! pendingCmdCounter_incrementIt) && pendingCmdCounter_decrementIt); + assign pendingCmdCounter_valueNext = (pendingCmdCounter_value + pendingCmdCounter_finalIncrement); + assign io_input_w_fire = (io_input_w_valid && io_input_w_ready); + assign when_Utils_l697 = (io_input_w_fire && io_input_w_payload_last); + always @(*) begin + pendingDataCounter_incrementIt = 1'b0; + if(cmdAllowedStart) begin + pendingDataCounter_incrementIt = 1'b1; + end + end + + always @(*) begin + pendingDataCounter_decrementIt = 1'b0; + if(when_Utils_l697) begin + pendingDataCounter_decrementIt = 1'b1; + end + end + + assign pendingDataCounter_mayOverflow = (pendingDataCounter_value == 3'b111); + assign pendingDataCounter_willOverflowIfInc = (pendingDataCounter_mayOverflow && (! pendingDataCounter_decrementIt)); + assign pendingDataCounter_willOverflow = (pendingDataCounter_willOverflowIfInc && pendingDataCounter_incrementIt); + assign when_Utils_l723_1 = (pendingDataCounter_incrementIt && (! pendingDataCounter_decrementIt)); + always @(*) begin + if(when_Utils_l723_1) begin + pendingDataCounter_finalIncrement = 3'b001; + end else begin + if(when_Utils_l725_1) begin + pendingDataCounter_finalIncrement = 3'b111; + end else begin + pendingDataCounter_finalIncrement = 3'b000; + end + end + end + + assign when_Utils_l725_1 = ((! pendingDataCounter_incrementIt) && pendingDataCounter_decrementIt); + assign pendingDataCounter_valueNext = (pendingDataCounter_value + pendingDataCounter_finalIncrement); + assign decodedCmdSels = {(((io_input_aw_payload_addr & (~ _zz_decodedCmdSels)) == 32'h1f500000) && io_input_aw_valid),{(((io_input_aw_payload_addr & _zz_decodedCmdSels_1) == 32'h1f400000) && io_input_aw_valid),{((_zz_decodedCmdSels_2 == _zz_decodedCmdSels_3) && io_input_aw_valid),((_zz_decodedCmdSels_4 == _zz_decodedCmdSels_5) && io_input_aw_valid)}}}; + assign decodedCmdError = (decodedCmdSels == 4'b0000); + assign allowCmd = ((pendingCmdCounter_value == 3'b000) || ((pendingCmdCounter_value != 3'b111) && (pendingSels == decodedCmdSels))); + assign allowData = (pendingDataCounter_value != 3'b000); + assign cmdAllowedStart = ((io_input_aw_valid && allowCmd) && _zz_cmdAllowedStart); + assign io_input_aw_ready = (((|(decodedCmdSels & {io_outputs_3_aw_ready,{io_outputs_2_aw_ready,{io_outputs_1_aw_ready,io_outputs_0_aw_ready}}})) || (decodedCmdError && errorSlave_io_axi_aw_ready)) && allowCmd); + assign errorSlave_io_axi_aw_valid = ((io_input_aw_valid && decodedCmdError) && allowCmd); + assign io_outputs_0_aw_valid = ((io_input_aw_valid && decodedCmdSels[0]) && allowCmd); + assign io_outputs_0_aw_payload_addr = io_input_aw_payload_addr; + assign io_outputs_0_aw_payload_id = io_input_aw_payload_id; + assign io_outputs_0_aw_payload_len = io_input_aw_payload_len; + assign io_outputs_0_aw_payload_size = io_input_aw_payload_size; + assign io_outputs_0_aw_payload_burst = io_input_aw_payload_burst; + assign io_outputs_0_aw_payload_lock = io_input_aw_payload_lock; + assign io_outputs_0_aw_payload_cache = io_input_aw_payload_cache; + assign io_outputs_0_aw_payload_prot = io_input_aw_payload_prot; + assign io_outputs_1_aw_valid = ((io_input_aw_valid && decodedCmdSels[1]) && allowCmd); + assign io_outputs_1_aw_payload_addr = io_input_aw_payload_addr; + assign io_outputs_1_aw_payload_id = io_input_aw_payload_id; + assign io_outputs_1_aw_payload_len = io_input_aw_payload_len; + assign io_outputs_1_aw_payload_size = io_input_aw_payload_size; + assign io_outputs_1_aw_payload_burst = io_input_aw_payload_burst; + assign io_outputs_1_aw_payload_lock = io_input_aw_payload_lock; + assign io_outputs_1_aw_payload_cache = io_input_aw_payload_cache; + assign io_outputs_1_aw_payload_prot = io_input_aw_payload_prot; + assign io_outputs_2_aw_valid = ((io_input_aw_valid && decodedCmdSels[2]) && allowCmd); + assign io_outputs_2_aw_payload_addr = io_input_aw_payload_addr; + assign io_outputs_2_aw_payload_id = io_input_aw_payload_id; + assign io_outputs_2_aw_payload_len = io_input_aw_payload_len; + assign io_outputs_2_aw_payload_size = io_input_aw_payload_size; + assign io_outputs_2_aw_payload_burst = io_input_aw_payload_burst; + assign io_outputs_2_aw_payload_lock = io_input_aw_payload_lock; + assign io_outputs_2_aw_payload_cache = io_input_aw_payload_cache; + assign io_outputs_2_aw_payload_prot = io_input_aw_payload_prot; + assign io_outputs_3_aw_valid = ((io_input_aw_valid && decodedCmdSels[3]) && allowCmd); + assign io_outputs_3_aw_payload_addr = io_input_aw_payload_addr; + assign io_outputs_3_aw_payload_id = io_input_aw_payload_id; + assign io_outputs_3_aw_payload_len = io_input_aw_payload_len; + assign io_outputs_3_aw_payload_size = io_input_aw_payload_size; + assign io_outputs_3_aw_payload_burst = io_input_aw_payload_burst; + assign io_outputs_3_aw_payload_lock = io_input_aw_payload_lock; + assign io_outputs_3_aw_payload_cache = io_input_aw_payload_cache; + assign io_outputs_3_aw_payload_prot = io_input_aw_payload_prot; + assign io_input_w_ready = (((|(pendingSels & {io_outputs_3_w_ready,{io_outputs_2_w_ready,{io_outputs_1_w_ready,io_outputs_0_w_ready}}})) || (pendingError && errorSlave_io_axi_w_ready)) && allowData); + assign errorSlave_io_axi_w_valid = ((io_input_w_valid && pendingError) && allowData); + assign _zz_io_outputs_1_w_valid = pendingSels[1]; + assign _zz_io_outputs_2_w_valid = pendingSels[2]; + assign _zz_io_outputs_3_w_valid = pendingSels[3]; + assign io_outputs_0_w_valid = ((io_input_w_valid && pendingSels[0]) && allowData); + assign io_outputs_0_w_payload_data = io_input_w_payload_data; + assign io_outputs_0_w_payload_strb = io_input_w_payload_strb; + assign io_outputs_0_w_payload_last = io_input_w_payload_last; + assign io_outputs_1_w_valid = ((io_input_w_valid && _zz_io_outputs_1_w_valid) && allowData); + assign io_outputs_1_w_payload_data = io_input_w_payload_data; + assign io_outputs_1_w_payload_strb = io_input_w_payload_strb; + assign io_outputs_1_w_payload_last = io_input_w_payload_last; + assign io_outputs_2_w_valid = ((io_input_w_valid && _zz_io_outputs_2_w_valid) && allowData); + assign io_outputs_2_w_payload_data = io_input_w_payload_data; + assign io_outputs_2_w_payload_strb = io_input_w_payload_strb; + assign io_outputs_2_w_payload_last = io_input_w_payload_last; + assign io_outputs_3_w_valid = ((io_input_w_valid && _zz_io_outputs_3_w_valid) && allowData); + assign io_outputs_3_w_payload_data = io_input_w_payload_data; + assign io_outputs_3_w_payload_strb = io_input_w_payload_strb; + assign io_outputs_3_w_payload_last = io_input_w_payload_last; + assign _zz_writeRspIndex = (_zz_io_outputs_1_w_valid || _zz_io_outputs_3_w_valid); + assign _zz_writeRspIndex_1 = (_zz_io_outputs_2_w_valid || _zz_io_outputs_3_w_valid); + assign writeRspIndex = {_zz_writeRspIndex_1,_zz_writeRspIndex}; + assign io_input_b_valid = ((|{io_outputs_3_b_valid,{io_outputs_2_b_valid,{io_outputs_1_b_valid,io_outputs_0_b_valid}}}) || errorSlave_io_axi_b_valid); + always @(*) begin + io_input_b_payload_id = _zz_io_input_b_payload_id; + if(pendingError) begin + io_input_b_payload_id = errorSlave_io_axi_b_payload_id; + end + end + + always @(*) begin + io_input_b_payload_resp = _zz_io_input_b_payload_resp; + if(pendingError) begin + io_input_b_payload_resp = errorSlave_io_axi_b_payload_resp; + end + end + + assign io_outputs_0_b_ready = io_input_b_ready; + assign io_outputs_1_b_ready = io_input_b_ready; + assign io_outputs_2_b_ready = io_input_b_ready; + assign io_outputs_3_b_ready = io_input_b_ready; + always @(posedge clk or negedge resetn) begin + if(!resetn) begin + pendingCmdCounter_value <= 3'b000; + pendingDataCounter_value <= 3'b000; + pendingSels <= 4'b0000; + pendingError <= 1'b0; + _zz_cmdAllowedStart <= 1'b1; + end else begin + pendingCmdCounter_value <= pendingCmdCounter_valueNext; + pendingDataCounter_value <= pendingDataCounter_valueNext; + if(cmdAllowedStart) begin + pendingSels <= decodedCmdSels; + end + if(cmdAllowedStart) begin + pendingError <= decodedCmdError; + end + if(cmdAllowedStart) begin + _zz_cmdAllowedStart <= 1'b0; + end + if(io_input_aw_ready) begin + _zz_cmdAllowedStart <= 1'b1; + end + end + end + + +endmodule + +module Axi4ReadOnlyDecoder_1 ( + input wire io_input_ar_valid, + output wire io_input_ar_ready, + input wire [31:0] io_input_ar_payload_addr, + input wire [3:0] io_input_ar_payload_id, + input wire [7:0] io_input_ar_payload_len, + input wire [2:0] io_input_ar_payload_size, + input wire [1:0] io_input_ar_payload_burst, + input wire [0:0] io_input_ar_payload_lock, + input wire [3:0] io_input_ar_payload_cache, + input wire [2:0] io_input_ar_payload_prot, + output reg io_input_r_valid, + input wire io_input_r_ready, + output wire [31:0] io_input_r_payload_data, + output reg [3:0] io_input_r_payload_id, + output reg [1:0] io_input_r_payload_resp, + output reg io_input_r_payload_last, + output wire io_outputs_0_ar_valid, + input wire io_outputs_0_ar_ready, + output wire [31:0] io_outputs_0_ar_payload_addr, + output wire [3:0] io_outputs_0_ar_payload_id, + output wire [7:0] io_outputs_0_ar_payload_len, + output wire [2:0] io_outputs_0_ar_payload_size, + output wire [1:0] io_outputs_0_ar_payload_burst, + output wire [0:0] io_outputs_0_ar_payload_lock, + output wire [3:0] io_outputs_0_ar_payload_cache, + output wire [2:0] io_outputs_0_ar_payload_prot, + input wire io_outputs_0_r_valid, + output wire io_outputs_0_r_ready, + input wire [31:0] io_outputs_0_r_payload_data, + input wire [3:0] io_outputs_0_r_payload_id, + input wire [1:0] io_outputs_0_r_payload_resp, + input wire io_outputs_0_r_payload_last, + output wire io_outputs_1_ar_valid, + input wire io_outputs_1_ar_ready, + output wire [31:0] io_outputs_1_ar_payload_addr, + output wire [3:0] io_outputs_1_ar_payload_id, + output wire [7:0] io_outputs_1_ar_payload_len, + output wire [2:0] io_outputs_1_ar_payload_size, + output wire [1:0] io_outputs_1_ar_payload_burst, + output wire [0:0] io_outputs_1_ar_payload_lock, + output wire [3:0] io_outputs_1_ar_payload_cache, + output wire [2:0] io_outputs_1_ar_payload_prot, + input wire io_outputs_1_r_valid, + output wire io_outputs_1_r_ready, + input wire [31:0] io_outputs_1_r_payload_data, + input wire [3:0] io_outputs_1_r_payload_id, + input wire [1:0] io_outputs_1_r_payload_resp, + input wire io_outputs_1_r_payload_last, + output wire io_outputs_2_ar_valid, + input wire io_outputs_2_ar_ready, + output wire [31:0] io_outputs_2_ar_payload_addr, + output wire [3:0] io_outputs_2_ar_payload_id, + output wire [7:0] io_outputs_2_ar_payload_len, + output wire [2:0] io_outputs_2_ar_payload_size, + output wire [1:0] io_outputs_2_ar_payload_burst, + output wire [0:0] io_outputs_2_ar_payload_lock, + output wire [3:0] io_outputs_2_ar_payload_cache, + output wire [2:0] io_outputs_2_ar_payload_prot, + input wire io_outputs_2_r_valid, + output wire io_outputs_2_r_ready, + input wire [31:0] io_outputs_2_r_payload_data, + input wire [3:0] io_outputs_2_r_payload_id, + input wire [1:0] io_outputs_2_r_payload_resp, + input wire io_outputs_2_r_payload_last, + output wire io_outputs_3_ar_valid, + input wire io_outputs_3_ar_ready, + output wire [31:0] io_outputs_3_ar_payload_addr, + output wire [3:0] io_outputs_3_ar_payload_id, + output wire [7:0] io_outputs_3_ar_payload_len, + output wire [2:0] io_outputs_3_ar_payload_size, + output wire [1:0] io_outputs_3_ar_payload_burst, + output wire [0:0] io_outputs_3_ar_payload_lock, + output wire [3:0] io_outputs_3_ar_payload_cache, + output wire [2:0] io_outputs_3_ar_payload_prot, + input wire io_outputs_3_r_valid, + output wire io_outputs_3_r_ready, + input wire [31:0] io_outputs_3_r_payload_data, + input wire [3:0] io_outputs_3_r_payload_id, + input wire [1:0] io_outputs_3_r_payload_resp, + input wire io_outputs_3_r_payload_last, + input wire clk, + input wire resetn +); + + wire errorSlave_io_axi_ar_valid; + wire errorSlave_io_axi_ar_ready; + wire errorSlave_io_axi_r_valid; + wire [31:0] errorSlave_io_axi_r_payload_data; + wire [3:0] errorSlave_io_axi_r_payload_id; + wire [1:0] errorSlave_io_axi_r_payload_resp; + wire errorSlave_io_axi_r_payload_last; + wire [31:0] _zz_decodedCmdSels; + wire [31:0] _zz_decodedCmdSels_1; + wire [31:0] _zz_decodedCmdSels_2; + wire [31:0] _zz_decodedCmdSels_3; + wire [31:0] _zz_decodedCmdSels_4; + wire [31:0] _zz_decodedCmdSels_5; + reg [31:0] _zz_io_input_r_payload_data; + reg [3:0] _zz_io_input_r_payload_id; + reg [1:0] _zz_io_input_r_payload_resp; + reg _zz_io_input_r_payload_last; + wire io_input_ar_fire; + wire io_input_r_fire; + wire when_Utils_l697; + reg pendingCmdCounter_incrementIt; + reg pendingCmdCounter_decrementIt; + wire [2:0] pendingCmdCounter_valueNext; + reg [2:0] pendingCmdCounter_value; + wire pendingCmdCounter_mayOverflow; + wire pendingCmdCounter_willOverflowIfInc; + wire pendingCmdCounter_willOverflow; + reg [2:0] pendingCmdCounter_finalIncrement; + wire when_Utils_l723; + wire when_Utils_l725; + wire [3:0] decodedCmdSels; + wire decodedCmdError; + reg [3:0] pendingSels; + reg pendingError; + wire allowCmd; + wire _zz_readRspIndex; + wire _zz_readRspIndex_1; + wire _zz_readRspIndex_2; + wire [1:0] readRspIndex; + + assign _zz_decodedCmdSels = 32'h000fffff; + assign _zz_decodedCmdSels_1 = (~ 32'h000fffff); + assign _zz_decodedCmdSels_2 = (io_input_ar_payload_addr & (~ 32'h007fffff)); + assign _zz_decodedCmdSels_3 = 32'h00000000; + assign _zz_decodedCmdSels_4 = (io_input_ar_payload_addr & (~ 32'h007fffff)); + assign _zz_decodedCmdSels_5 = 32'h1c000000; + Axi4ReadOnlyErrorSlave_1 errorSlave ( + .io_axi_ar_valid (errorSlave_io_axi_ar_valid ), //i + .io_axi_ar_ready (errorSlave_io_axi_ar_ready ), //o + .io_axi_ar_payload_addr (io_input_ar_payload_addr[31:0] ), //i + .io_axi_ar_payload_id (io_input_ar_payload_id[3:0] ), //i + .io_axi_ar_payload_len (io_input_ar_payload_len[7:0] ), //i + .io_axi_ar_payload_size (io_input_ar_payload_size[2:0] ), //i + .io_axi_ar_payload_burst (io_input_ar_payload_burst[1:0] ), //i + .io_axi_ar_payload_lock (io_input_ar_payload_lock ), //i + .io_axi_ar_payload_cache (io_input_ar_payload_cache[3:0] ), //i + .io_axi_ar_payload_prot (io_input_ar_payload_prot[2:0] ), //i + .io_axi_r_valid (errorSlave_io_axi_r_valid ), //o + .io_axi_r_ready (io_input_r_ready ), //i + .io_axi_r_payload_data (errorSlave_io_axi_r_payload_data[31:0]), //o + .io_axi_r_payload_id (errorSlave_io_axi_r_payload_id[3:0] ), //o + .io_axi_r_payload_resp (errorSlave_io_axi_r_payload_resp[1:0] ), //o + .io_axi_r_payload_last (errorSlave_io_axi_r_payload_last ), //o + .clk (clk ), //i + .resetn (resetn ) //i + ); + always @(*) begin + case(readRspIndex) + 2'b00 : begin + _zz_io_input_r_payload_data = io_outputs_0_r_payload_data; + _zz_io_input_r_payload_id = io_outputs_0_r_payload_id; + _zz_io_input_r_payload_resp = io_outputs_0_r_payload_resp; + _zz_io_input_r_payload_last = io_outputs_0_r_payload_last; + end + 2'b01 : begin + _zz_io_input_r_payload_data = io_outputs_1_r_payload_data; + _zz_io_input_r_payload_id = io_outputs_1_r_payload_id; + _zz_io_input_r_payload_resp = io_outputs_1_r_payload_resp; + _zz_io_input_r_payload_last = io_outputs_1_r_payload_last; + end + 2'b10 : begin + _zz_io_input_r_payload_data = io_outputs_2_r_payload_data; + _zz_io_input_r_payload_id = io_outputs_2_r_payload_id; + _zz_io_input_r_payload_resp = io_outputs_2_r_payload_resp; + _zz_io_input_r_payload_last = io_outputs_2_r_payload_last; + end + default : begin + _zz_io_input_r_payload_data = io_outputs_3_r_payload_data; + _zz_io_input_r_payload_id = io_outputs_3_r_payload_id; + _zz_io_input_r_payload_resp = io_outputs_3_r_payload_resp; + _zz_io_input_r_payload_last = io_outputs_3_r_payload_last; + end + endcase + end + + assign io_input_ar_fire = (io_input_ar_valid && io_input_ar_ready); + assign io_input_r_fire = (io_input_r_valid && io_input_r_ready); + assign when_Utils_l697 = (io_input_r_fire && io_input_r_payload_last); + always @(*) begin + pendingCmdCounter_incrementIt = 1'b0; + if(io_input_ar_fire) begin + pendingCmdCounter_incrementIt = 1'b1; + end + end + + always @(*) begin + pendingCmdCounter_decrementIt = 1'b0; + if(when_Utils_l697) begin + pendingCmdCounter_decrementIt = 1'b1; + end + end + + assign pendingCmdCounter_mayOverflow = (pendingCmdCounter_value == 3'b111); + assign pendingCmdCounter_willOverflowIfInc = (pendingCmdCounter_mayOverflow && (! pendingCmdCounter_decrementIt)); + assign pendingCmdCounter_willOverflow = (pendingCmdCounter_willOverflowIfInc && pendingCmdCounter_incrementIt); + assign when_Utils_l723 = (pendingCmdCounter_incrementIt && (! pendingCmdCounter_decrementIt)); + always @(*) begin + if(when_Utils_l723) begin + pendingCmdCounter_finalIncrement = 3'b001; + end else begin + if(when_Utils_l725) begin + pendingCmdCounter_finalIncrement = 3'b111; + end else begin + pendingCmdCounter_finalIncrement = 3'b000; + end + end + end + + assign when_Utils_l725 = ((! pendingCmdCounter_incrementIt) && pendingCmdCounter_decrementIt); + assign pendingCmdCounter_valueNext = (pendingCmdCounter_value + pendingCmdCounter_finalIncrement); + assign decodedCmdSels = {(((io_input_ar_payload_addr & (~ _zz_decodedCmdSels)) == 32'h1f500000) && io_input_ar_valid),{(((io_input_ar_payload_addr & _zz_decodedCmdSels_1) == 32'h1f400000) && io_input_ar_valid),{((_zz_decodedCmdSels_2 == _zz_decodedCmdSels_3) && io_input_ar_valid),((_zz_decodedCmdSels_4 == _zz_decodedCmdSels_5) && io_input_ar_valid)}}}; + assign decodedCmdError = (decodedCmdSels == 4'b0000); + assign allowCmd = ((pendingCmdCounter_value == 3'b000) || ((pendingCmdCounter_value != 3'b111) && (pendingSels == decodedCmdSels))); + assign io_input_ar_ready = (((|(decodedCmdSels & {io_outputs_3_ar_ready,{io_outputs_2_ar_ready,{io_outputs_1_ar_ready,io_outputs_0_ar_ready}}})) || (decodedCmdError && errorSlave_io_axi_ar_ready)) && allowCmd); + assign errorSlave_io_axi_ar_valid = ((io_input_ar_valid && decodedCmdError) && allowCmd); + assign io_outputs_0_ar_valid = ((io_input_ar_valid && decodedCmdSels[0]) && allowCmd); + assign io_outputs_0_ar_payload_addr = io_input_ar_payload_addr; + assign io_outputs_0_ar_payload_id = io_input_ar_payload_id; + assign io_outputs_0_ar_payload_len = io_input_ar_payload_len; + assign io_outputs_0_ar_payload_size = io_input_ar_payload_size; + assign io_outputs_0_ar_payload_burst = io_input_ar_payload_burst; + assign io_outputs_0_ar_payload_lock = io_input_ar_payload_lock; + assign io_outputs_0_ar_payload_cache = io_input_ar_payload_cache; + assign io_outputs_0_ar_payload_prot = io_input_ar_payload_prot; + assign io_outputs_1_ar_valid = ((io_input_ar_valid && decodedCmdSels[1]) && allowCmd); + assign io_outputs_1_ar_payload_addr = io_input_ar_payload_addr; + assign io_outputs_1_ar_payload_id = io_input_ar_payload_id; + assign io_outputs_1_ar_payload_len = io_input_ar_payload_len; + assign io_outputs_1_ar_payload_size = io_input_ar_payload_size; + assign io_outputs_1_ar_payload_burst = io_input_ar_payload_burst; + assign io_outputs_1_ar_payload_lock = io_input_ar_payload_lock; + assign io_outputs_1_ar_payload_cache = io_input_ar_payload_cache; + assign io_outputs_1_ar_payload_prot = io_input_ar_payload_prot; + assign io_outputs_2_ar_valid = ((io_input_ar_valid && decodedCmdSels[2]) && allowCmd); + assign io_outputs_2_ar_payload_addr = io_input_ar_payload_addr; + assign io_outputs_2_ar_payload_id = io_input_ar_payload_id; + assign io_outputs_2_ar_payload_len = io_input_ar_payload_len; + assign io_outputs_2_ar_payload_size = io_input_ar_payload_size; + assign io_outputs_2_ar_payload_burst = io_input_ar_payload_burst; + assign io_outputs_2_ar_payload_lock = io_input_ar_payload_lock; + assign io_outputs_2_ar_payload_cache = io_input_ar_payload_cache; + assign io_outputs_2_ar_payload_prot = io_input_ar_payload_prot; + assign io_outputs_3_ar_valid = ((io_input_ar_valid && decodedCmdSels[3]) && allowCmd); + assign io_outputs_3_ar_payload_addr = io_input_ar_payload_addr; + assign io_outputs_3_ar_payload_id = io_input_ar_payload_id; + assign io_outputs_3_ar_payload_len = io_input_ar_payload_len; + assign io_outputs_3_ar_payload_size = io_input_ar_payload_size; + assign io_outputs_3_ar_payload_burst = io_input_ar_payload_burst; + assign io_outputs_3_ar_payload_lock = io_input_ar_payload_lock; + assign io_outputs_3_ar_payload_cache = io_input_ar_payload_cache; + assign io_outputs_3_ar_payload_prot = io_input_ar_payload_prot; + assign _zz_readRspIndex = pendingSels[3]; + assign _zz_readRspIndex_1 = (pendingSels[1] || _zz_readRspIndex); + assign _zz_readRspIndex_2 = (pendingSels[2] || _zz_readRspIndex); + assign readRspIndex = {_zz_readRspIndex_2,_zz_readRspIndex_1}; + always @(*) begin + io_input_r_valid = (|{io_outputs_3_r_valid,{io_outputs_2_r_valid,{io_outputs_1_r_valid,io_outputs_0_r_valid}}}); + if(errorSlave_io_axi_r_valid) begin + io_input_r_valid = 1'b1; + end + end + + assign io_input_r_payload_data = _zz_io_input_r_payload_data; + always @(*) begin + io_input_r_payload_id = _zz_io_input_r_payload_id; + if(pendingError) begin + io_input_r_payload_id = errorSlave_io_axi_r_payload_id; + end + end + + always @(*) begin + io_input_r_payload_resp = _zz_io_input_r_payload_resp; + if(pendingError) begin + io_input_r_payload_resp = errorSlave_io_axi_r_payload_resp; + end + end + + always @(*) begin + io_input_r_payload_last = _zz_io_input_r_payload_last; + if(pendingError) begin + io_input_r_payload_last = errorSlave_io_axi_r_payload_last; + end + end + + assign io_outputs_0_r_ready = io_input_r_ready; + assign io_outputs_1_r_ready = io_input_r_ready; + assign io_outputs_2_r_ready = io_input_r_ready; + assign io_outputs_3_r_ready = io_input_r_ready; + always @(posedge clk or negedge resetn) begin + if(!resetn) begin + pendingCmdCounter_value <= 3'b000; + pendingSels <= 4'b0000; + pendingError <= 1'b0; + end else begin + pendingCmdCounter_value <= pendingCmdCounter_valueNext; + if(io_input_ar_ready) begin + pendingSels <= decodedCmdSels; + end + if(io_input_ar_ready) begin + pendingError <= decodedCmdError; + end + end + end + + +endmodule + +module Axi4WriteOnlyDecoder ( + input wire io_input_aw_valid, + output wire io_input_aw_ready, + input wire [31:0] io_input_aw_payload_addr, + input wire [3:0] io_input_aw_payload_id, + input wire [7:0] io_input_aw_payload_len, + input wire [2:0] io_input_aw_payload_size, + input wire [1:0] io_input_aw_payload_burst, + input wire [0:0] io_input_aw_payload_lock, + input wire [3:0] io_input_aw_payload_cache, + input wire [2:0] io_input_aw_payload_prot, + input wire io_input_w_valid, + output wire io_input_w_ready, + input wire [31:0] io_input_w_payload_data, + input wire [3:0] io_input_w_payload_strb, + input wire io_input_w_payload_last, + output wire io_input_b_valid, + input wire io_input_b_ready, + output reg [3:0] io_input_b_payload_id, + output reg [1:0] io_input_b_payload_resp, + output wire io_outputs_0_aw_valid, + input wire io_outputs_0_aw_ready, + output wire [31:0] io_outputs_0_aw_payload_addr, + output wire [3:0] io_outputs_0_aw_payload_id, + output wire [7:0] io_outputs_0_aw_payload_len, + output wire [2:0] io_outputs_0_aw_payload_size, + output wire [1:0] io_outputs_0_aw_payload_burst, + output wire [0:0] io_outputs_0_aw_payload_lock, + output wire [3:0] io_outputs_0_aw_payload_cache, + output wire [2:0] io_outputs_0_aw_payload_prot, + output wire io_outputs_0_w_valid, + input wire io_outputs_0_w_ready, + output wire [31:0] io_outputs_0_w_payload_data, + output wire [3:0] io_outputs_0_w_payload_strb, + output wire io_outputs_0_w_payload_last, + input wire io_outputs_0_b_valid, + output wire io_outputs_0_b_ready, + input wire [3:0] io_outputs_0_b_payload_id, + input wire [1:0] io_outputs_0_b_payload_resp, + output wire io_outputs_1_aw_valid, + input wire io_outputs_1_aw_ready, + output wire [31:0] io_outputs_1_aw_payload_addr, + output wire [3:0] io_outputs_1_aw_payload_id, + output wire [7:0] io_outputs_1_aw_payload_len, + output wire [2:0] io_outputs_1_aw_payload_size, + output wire [1:0] io_outputs_1_aw_payload_burst, + output wire [0:0] io_outputs_1_aw_payload_lock, + output wire [3:0] io_outputs_1_aw_payload_cache, + output wire [2:0] io_outputs_1_aw_payload_prot, + output wire io_outputs_1_w_valid, + input wire io_outputs_1_w_ready, + output wire [31:0] io_outputs_1_w_payload_data, + output wire [3:0] io_outputs_1_w_payload_strb, + output wire io_outputs_1_w_payload_last, + input wire io_outputs_1_b_valid, + output wire io_outputs_1_b_ready, + input wire [3:0] io_outputs_1_b_payload_id, + input wire [1:0] io_outputs_1_b_payload_resp, + output wire io_outputs_2_aw_valid, + input wire io_outputs_2_aw_ready, + output wire [31:0] io_outputs_2_aw_payload_addr, + output wire [3:0] io_outputs_2_aw_payload_id, + output wire [7:0] io_outputs_2_aw_payload_len, + output wire [2:0] io_outputs_2_aw_payload_size, + output wire [1:0] io_outputs_2_aw_payload_burst, + output wire [0:0] io_outputs_2_aw_payload_lock, + output wire [3:0] io_outputs_2_aw_payload_cache, + output wire [2:0] io_outputs_2_aw_payload_prot, + output wire io_outputs_2_w_valid, + input wire io_outputs_2_w_ready, + output wire [31:0] io_outputs_2_w_payload_data, + output wire [3:0] io_outputs_2_w_payload_strb, + output wire io_outputs_2_w_payload_last, + input wire io_outputs_2_b_valid, + output wire io_outputs_2_b_ready, + input wire [3:0] io_outputs_2_b_payload_id, + input wire [1:0] io_outputs_2_b_payload_resp, + output wire io_outputs_3_aw_valid, + input wire io_outputs_3_aw_ready, + output wire [31:0] io_outputs_3_aw_payload_addr, + output wire [3:0] io_outputs_3_aw_payload_id, + output wire [7:0] io_outputs_3_aw_payload_len, + output wire [2:0] io_outputs_3_aw_payload_size, + output wire [1:0] io_outputs_3_aw_payload_burst, + output wire [0:0] io_outputs_3_aw_payload_lock, + output wire [3:0] io_outputs_3_aw_payload_cache, + output wire [2:0] io_outputs_3_aw_payload_prot, + output wire io_outputs_3_w_valid, + input wire io_outputs_3_w_ready, + output wire [31:0] io_outputs_3_w_payload_data, + output wire [3:0] io_outputs_3_w_payload_strb, + output wire io_outputs_3_w_payload_last, + input wire io_outputs_3_b_valid, + output wire io_outputs_3_b_ready, + input wire [3:0] io_outputs_3_b_payload_id, + input wire [1:0] io_outputs_3_b_payload_resp, + output wire io_outputs_4_aw_valid, + input wire io_outputs_4_aw_ready, + output wire [31:0] io_outputs_4_aw_payload_addr, + output wire [3:0] io_outputs_4_aw_payload_id, + output wire [7:0] io_outputs_4_aw_payload_len, + output wire [2:0] io_outputs_4_aw_payload_size, + output wire [1:0] io_outputs_4_aw_payload_burst, + output wire [0:0] io_outputs_4_aw_payload_lock, + output wire [3:0] io_outputs_4_aw_payload_cache, + output wire [2:0] io_outputs_4_aw_payload_prot, + output wire io_outputs_4_w_valid, + input wire io_outputs_4_w_ready, + output wire [31:0] io_outputs_4_w_payload_data, + output wire [3:0] io_outputs_4_w_payload_strb, + output wire io_outputs_4_w_payload_last, + input wire io_outputs_4_b_valid, + output wire io_outputs_4_b_ready, + input wire [3:0] io_outputs_4_b_payload_id, + input wire [1:0] io_outputs_4_b_payload_resp, + output wire io_outputs_5_aw_valid, + input wire io_outputs_5_aw_ready, + output wire [31:0] io_outputs_5_aw_payload_addr, + output wire [3:0] io_outputs_5_aw_payload_id, + output wire [7:0] io_outputs_5_aw_payload_len, + output wire [2:0] io_outputs_5_aw_payload_size, + output wire [1:0] io_outputs_5_aw_payload_burst, + output wire [0:0] io_outputs_5_aw_payload_lock, + output wire [3:0] io_outputs_5_aw_payload_cache, + output wire [2:0] io_outputs_5_aw_payload_prot, + output wire io_outputs_5_w_valid, + input wire io_outputs_5_w_ready, + output wire [31:0] io_outputs_5_w_payload_data, + output wire [3:0] io_outputs_5_w_payload_strb, + output wire io_outputs_5_w_payload_last, + input wire io_outputs_5_b_valid, + output wire io_outputs_5_b_ready, + input wire [3:0] io_outputs_5_b_payload_id, + input wire [1:0] io_outputs_5_b_payload_resp, + output wire io_outputs_6_aw_valid, + input wire io_outputs_6_aw_ready, + output wire [31:0] io_outputs_6_aw_payload_addr, + output wire [3:0] io_outputs_6_aw_payload_id, + output wire [7:0] io_outputs_6_aw_payload_len, + output wire [2:0] io_outputs_6_aw_payload_size, + output wire [1:0] io_outputs_6_aw_payload_burst, + output wire [0:0] io_outputs_6_aw_payload_lock, + output wire [3:0] io_outputs_6_aw_payload_cache, + output wire [2:0] io_outputs_6_aw_payload_prot, + output wire io_outputs_6_w_valid, + input wire io_outputs_6_w_ready, + output wire [31:0] io_outputs_6_w_payload_data, + output wire [3:0] io_outputs_6_w_payload_strb, + output wire io_outputs_6_w_payload_last, + input wire io_outputs_6_b_valid, + output wire io_outputs_6_b_ready, + input wire [3:0] io_outputs_6_b_payload_id, + input wire [1:0] io_outputs_6_b_payload_resp, + output wire io_outputs_7_aw_valid, + input wire io_outputs_7_aw_ready, + output wire [31:0] io_outputs_7_aw_payload_addr, + output wire [3:0] io_outputs_7_aw_payload_id, + output wire [7:0] io_outputs_7_aw_payload_len, + output wire [2:0] io_outputs_7_aw_payload_size, + output wire [1:0] io_outputs_7_aw_payload_burst, + output wire [0:0] io_outputs_7_aw_payload_lock, + output wire [3:0] io_outputs_7_aw_payload_cache, + output wire [2:0] io_outputs_7_aw_payload_prot, + output wire io_outputs_7_w_valid, + input wire io_outputs_7_w_ready, + output wire [31:0] io_outputs_7_w_payload_data, + output wire [3:0] io_outputs_7_w_payload_strb, + output wire io_outputs_7_w_payload_last, + input wire io_outputs_7_b_valid, + output wire io_outputs_7_b_ready, + input wire [3:0] io_outputs_7_b_payload_id, + input wire [1:0] io_outputs_7_b_payload_resp, + input wire clk, + input wire resetn +); + + wire errorSlave_io_axi_aw_valid; + wire errorSlave_io_axi_w_valid; + wire errorSlave_io_axi_aw_ready; + wire errorSlave_io_axi_w_ready; + wire errorSlave_io_axi_b_valid; + wire [3:0] errorSlave_io_axi_b_payload_id; + wire [1:0] errorSlave_io_axi_b_payload_resp; + wire [31:0] _zz_decodedCmdSels; + wire [31:0] _zz_decodedCmdSels_1; + wire [31:0] _zz_decodedCmdSels_2; + wire [31:0] _zz_decodedCmdSels_3; + wire _zz_decodedCmdSels_4; + wire _zz_decodedCmdSels_5; + wire [0:0] _zz_decodedCmdSels_6; + wire [1:0] _zz_decodedCmdSels_7; + wire [31:0] _zz_decodedCmdSels_8; + wire [31:0] _zz_decodedCmdSels_9; + reg [3:0] _zz_io_input_b_payload_id; + reg [1:0] _zz_io_input_b_payload_resp; + wire cmdAllowedStart; + wire io_input_aw_fire; + wire io_input_b_fire; + reg pendingCmdCounter_incrementIt; + reg pendingCmdCounter_decrementIt; + wire [2:0] pendingCmdCounter_valueNext; + reg [2:0] pendingCmdCounter_value; + wire pendingCmdCounter_mayOverflow; + wire pendingCmdCounter_willOverflowIfInc; + wire pendingCmdCounter_willOverflow; + reg [2:0] pendingCmdCounter_finalIncrement; + wire when_Utils_l723; + wire when_Utils_l725; + wire io_input_w_fire; + wire when_Utils_l697; + reg pendingDataCounter_incrementIt; + reg pendingDataCounter_decrementIt; + wire [2:0] pendingDataCounter_valueNext; + reg [2:0] pendingDataCounter_value; + wire pendingDataCounter_mayOverflow; + wire pendingDataCounter_willOverflowIfInc; + wire pendingDataCounter_willOverflow; + reg [2:0] pendingDataCounter_finalIncrement; + wire when_Utils_l723_1; + wire when_Utils_l725_1; + wire [7:0] decodedCmdSels; + wire decodedCmdError; + reg [7:0] pendingSels; + reg pendingError; + wire allowCmd; + wire allowData; + reg _zz_cmdAllowedStart; + wire _zz_io_outputs_1_w_valid; + wire _zz_io_outputs_2_w_valid; + wire _zz_io_outputs_3_w_valid; + wire _zz_io_outputs_4_w_valid; + wire _zz_io_outputs_5_w_valid; + wire _zz_io_outputs_6_w_valid; + wire _zz_io_outputs_7_w_valid; + wire _zz_writeRspIndex; + wire _zz_writeRspIndex_1; + wire _zz_writeRspIndex_2; + wire [2:0] writeRspIndex; + + assign _zz_decodedCmdSels = 32'h000fffff; + assign _zz_decodedCmdSels_1 = (~ 32'h000fffff); + assign _zz_decodedCmdSels_2 = (io_input_aw_payload_addr & (~ 32'h000fffff)); + assign _zz_decodedCmdSels_3 = 32'h1f300000; + assign _zz_decodedCmdSels_4 = ((io_input_aw_payload_addr & (~ 32'h000fffff)) == 32'h1f200000); + assign _zz_decodedCmdSels_5 = (((io_input_aw_payload_addr & (~ 32'h000fffff)) == 32'h1f100000) && io_input_aw_valid); + assign _zz_decodedCmdSels_6 = (((io_input_aw_payload_addr & (~ 32'h000fffff)) == 32'h1f000000) && io_input_aw_valid); + assign _zz_decodedCmdSels_7 = {(((io_input_aw_payload_addr & (~ _zz_decodedCmdSels_8)) == 32'h00000000) && io_input_aw_valid),(((io_input_aw_payload_addr & (~ _zz_decodedCmdSels_9)) == 32'h1c000000) && io_input_aw_valid)}; + assign _zz_decodedCmdSels_8 = 32'h007fffff; + assign _zz_decodedCmdSels_9 = 32'h007fffff; + Axi4WriteOnlyErrorSlave_1 errorSlave ( + .io_axi_aw_valid (errorSlave_io_axi_aw_valid ), //i + .io_axi_aw_ready (errorSlave_io_axi_aw_ready ), //o + .io_axi_aw_payload_addr (io_input_aw_payload_addr[31:0] ), //i + .io_axi_aw_payload_id (io_input_aw_payload_id[3:0] ), //i + .io_axi_aw_payload_len (io_input_aw_payload_len[7:0] ), //i + .io_axi_aw_payload_size (io_input_aw_payload_size[2:0] ), //i + .io_axi_aw_payload_burst (io_input_aw_payload_burst[1:0] ), //i + .io_axi_aw_payload_lock (io_input_aw_payload_lock ), //i + .io_axi_aw_payload_cache (io_input_aw_payload_cache[3:0] ), //i + .io_axi_aw_payload_prot (io_input_aw_payload_prot[2:0] ), //i + .io_axi_w_valid (errorSlave_io_axi_w_valid ), //i + .io_axi_w_ready (errorSlave_io_axi_w_ready ), //o + .io_axi_w_payload_data (io_input_w_payload_data[31:0] ), //i + .io_axi_w_payload_strb (io_input_w_payload_strb[3:0] ), //i + .io_axi_w_payload_last (io_input_w_payload_last ), //i + .io_axi_b_valid (errorSlave_io_axi_b_valid ), //o + .io_axi_b_ready (io_input_b_ready ), //i + .io_axi_b_payload_id (errorSlave_io_axi_b_payload_id[3:0] ), //o + .io_axi_b_payload_resp (errorSlave_io_axi_b_payload_resp[1:0]), //o + .clk (clk ), //i + .resetn (resetn ) //i + ); + always @(*) begin + case(writeRspIndex) + 3'b000 : begin + _zz_io_input_b_payload_id = io_outputs_0_b_payload_id; + _zz_io_input_b_payload_resp = io_outputs_0_b_payload_resp; + end + 3'b001 : begin + _zz_io_input_b_payload_id = io_outputs_1_b_payload_id; + _zz_io_input_b_payload_resp = io_outputs_1_b_payload_resp; + end + 3'b010 : begin + _zz_io_input_b_payload_id = io_outputs_2_b_payload_id; + _zz_io_input_b_payload_resp = io_outputs_2_b_payload_resp; + end + 3'b011 : begin + _zz_io_input_b_payload_id = io_outputs_3_b_payload_id; + _zz_io_input_b_payload_resp = io_outputs_3_b_payload_resp; + end + 3'b100 : begin + _zz_io_input_b_payload_id = io_outputs_4_b_payload_id; + _zz_io_input_b_payload_resp = io_outputs_4_b_payload_resp; + end + 3'b101 : begin + _zz_io_input_b_payload_id = io_outputs_5_b_payload_id; + _zz_io_input_b_payload_resp = io_outputs_5_b_payload_resp; + end + 3'b110 : begin + _zz_io_input_b_payload_id = io_outputs_6_b_payload_id; + _zz_io_input_b_payload_resp = io_outputs_6_b_payload_resp; + end + default : begin + _zz_io_input_b_payload_id = io_outputs_7_b_payload_id; + _zz_io_input_b_payload_resp = io_outputs_7_b_payload_resp; + end + endcase + end + + assign io_input_aw_fire = (io_input_aw_valid && io_input_aw_ready); + assign io_input_b_fire = (io_input_b_valid && io_input_b_ready); + always @(*) begin + pendingCmdCounter_incrementIt = 1'b0; + if(io_input_aw_fire) begin + pendingCmdCounter_incrementIt = 1'b1; + end + end + + always @(*) begin + pendingCmdCounter_decrementIt = 1'b0; + if(io_input_b_fire) begin + pendingCmdCounter_decrementIt = 1'b1; + end + end + + assign pendingCmdCounter_mayOverflow = (pendingCmdCounter_value == 3'b111); + assign pendingCmdCounter_willOverflowIfInc = (pendingCmdCounter_mayOverflow && (! pendingCmdCounter_decrementIt)); + assign pendingCmdCounter_willOverflow = (pendingCmdCounter_willOverflowIfInc && pendingCmdCounter_incrementIt); + assign when_Utils_l723 = (pendingCmdCounter_incrementIt && (! pendingCmdCounter_decrementIt)); + always @(*) begin + if(when_Utils_l723) begin + pendingCmdCounter_finalIncrement = 3'b001; + end else begin + if(when_Utils_l725) begin + pendingCmdCounter_finalIncrement = 3'b111; + end else begin + pendingCmdCounter_finalIncrement = 3'b000; + end + end + end + + assign when_Utils_l725 = ((! pendingCmdCounter_incrementIt) && pendingCmdCounter_decrementIt); + assign pendingCmdCounter_valueNext = (pendingCmdCounter_value + pendingCmdCounter_finalIncrement); + assign io_input_w_fire = (io_input_w_valid && io_input_w_ready); + assign when_Utils_l697 = (io_input_w_fire && io_input_w_payload_last); + always @(*) begin + pendingDataCounter_incrementIt = 1'b0; + if(cmdAllowedStart) begin + pendingDataCounter_incrementIt = 1'b1; + end + end + + always @(*) begin + pendingDataCounter_decrementIt = 1'b0; + if(when_Utils_l697) begin + pendingDataCounter_decrementIt = 1'b1; + end + end + + assign pendingDataCounter_mayOverflow = (pendingDataCounter_value == 3'b111); + assign pendingDataCounter_willOverflowIfInc = (pendingDataCounter_mayOverflow && (! pendingDataCounter_decrementIt)); + assign pendingDataCounter_willOverflow = (pendingDataCounter_willOverflowIfInc && pendingDataCounter_incrementIt); + assign when_Utils_l723_1 = (pendingDataCounter_incrementIt && (! pendingDataCounter_decrementIt)); + always @(*) begin + if(when_Utils_l723_1) begin + pendingDataCounter_finalIncrement = 3'b001; + end else begin + if(when_Utils_l725_1) begin + pendingDataCounter_finalIncrement = 3'b111; + end else begin + pendingDataCounter_finalIncrement = 3'b000; + end + end + end + + assign when_Utils_l725_1 = ((! pendingDataCounter_incrementIt) && pendingDataCounter_decrementIt); + assign pendingDataCounter_valueNext = (pendingDataCounter_value + pendingDataCounter_finalIncrement); + assign decodedCmdSels = {(((io_input_aw_payload_addr & (~ _zz_decodedCmdSels)) == 32'h1f500000) && io_input_aw_valid),{(((io_input_aw_payload_addr & _zz_decodedCmdSels_1) == 32'h1f400000) && io_input_aw_valid),{((_zz_decodedCmdSels_2 == _zz_decodedCmdSels_3) && io_input_aw_valid),{(_zz_decodedCmdSels_4 && io_input_aw_valid),{_zz_decodedCmdSels_5,{_zz_decodedCmdSels_6,_zz_decodedCmdSels_7}}}}}}; + assign decodedCmdError = (decodedCmdSels == 8'h00); + assign allowCmd = ((pendingCmdCounter_value == 3'b000) || ((pendingCmdCounter_value != 3'b111) && (pendingSels == decodedCmdSels))); + assign allowData = (pendingDataCounter_value != 3'b000); + assign cmdAllowedStart = ((io_input_aw_valid && allowCmd) && _zz_cmdAllowedStart); + assign io_input_aw_ready = (((|(decodedCmdSels & {io_outputs_7_aw_ready,{io_outputs_6_aw_ready,{io_outputs_5_aw_ready,{io_outputs_4_aw_ready,{io_outputs_3_aw_ready,{io_outputs_2_aw_ready,{io_outputs_1_aw_ready,io_outputs_0_aw_ready}}}}}}})) || (decodedCmdError && errorSlave_io_axi_aw_ready)) && allowCmd); + assign errorSlave_io_axi_aw_valid = ((io_input_aw_valid && decodedCmdError) && allowCmd); + assign io_outputs_0_aw_valid = ((io_input_aw_valid && decodedCmdSels[0]) && allowCmd); + assign io_outputs_0_aw_payload_addr = io_input_aw_payload_addr; + assign io_outputs_0_aw_payload_id = io_input_aw_payload_id; + assign io_outputs_0_aw_payload_len = io_input_aw_payload_len; + assign io_outputs_0_aw_payload_size = io_input_aw_payload_size; + assign io_outputs_0_aw_payload_burst = io_input_aw_payload_burst; + assign io_outputs_0_aw_payload_lock = io_input_aw_payload_lock; + assign io_outputs_0_aw_payload_cache = io_input_aw_payload_cache; + assign io_outputs_0_aw_payload_prot = io_input_aw_payload_prot; + assign io_outputs_1_aw_valid = ((io_input_aw_valid && decodedCmdSels[1]) && allowCmd); + assign io_outputs_1_aw_payload_addr = io_input_aw_payload_addr; + assign io_outputs_1_aw_payload_id = io_input_aw_payload_id; + assign io_outputs_1_aw_payload_len = io_input_aw_payload_len; + assign io_outputs_1_aw_payload_size = io_input_aw_payload_size; + assign io_outputs_1_aw_payload_burst = io_input_aw_payload_burst; + assign io_outputs_1_aw_payload_lock = io_input_aw_payload_lock; + assign io_outputs_1_aw_payload_cache = io_input_aw_payload_cache; + assign io_outputs_1_aw_payload_prot = io_input_aw_payload_prot; + assign io_outputs_2_aw_valid = ((io_input_aw_valid && decodedCmdSels[2]) && allowCmd); + assign io_outputs_2_aw_payload_addr = io_input_aw_payload_addr; + assign io_outputs_2_aw_payload_id = io_input_aw_payload_id; + assign io_outputs_2_aw_payload_len = io_input_aw_payload_len; + assign io_outputs_2_aw_payload_size = io_input_aw_payload_size; + assign io_outputs_2_aw_payload_burst = io_input_aw_payload_burst; + assign io_outputs_2_aw_payload_lock = io_input_aw_payload_lock; + assign io_outputs_2_aw_payload_cache = io_input_aw_payload_cache; + assign io_outputs_2_aw_payload_prot = io_input_aw_payload_prot; + assign io_outputs_3_aw_valid = ((io_input_aw_valid && decodedCmdSels[3]) && allowCmd); + assign io_outputs_3_aw_payload_addr = io_input_aw_payload_addr; + assign io_outputs_3_aw_payload_id = io_input_aw_payload_id; + assign io_outputs_3_aw_payload_len = io_input_aw_payload_len; + assign io_outputs_3_aw_payload_size = io_input_aw_payload_size; + assign io_outputs_3_aw_payload_burst = io_input_aw_payload_burst; + assign io_outputs_3_aw_payload_lock = io_input_aw_payload_lock; + assign io_outputs_3_aw_payload_cache = io_input_aw_payload_cache; + assign io_outputs_3_aw_payload_prot = io_input_aw_payload_prot; + assign io_outputs_4_aw_valid = ((io_input_aw_valid && decodedCmdSels[4]) && allowCmd); + assign io_outputs_4_aw_payload_addr = io_input_aw_payload_addr; + assign io_outputs_4_aw_payload_id = io_input_aw_payload_id; + assign io_outputs_4_aw_payload_len = io_input_aw_payload_len; + assign io_outputs_4_aw_payload_size = io_input_aw_payload_size; + assign io_outputs_4_aw_payload_burst = io_input_aw_payload_burst; + assign io_outputs_4_aw_payload_lock = io_input_aw_payload_lock; + assign io_outputs_4_aw_payload_cache = io_input_aw_payload_cache; + assign io_outputs_4_aw_payload_prot = io_input_aw_payload_prot; + assign io_outputs_5_aw_valid = ((io_input_aw_valid && decodedCmdSels[5]) && allowCmd); + assign io_outputs_5_aw_payload_addr = io_input_aw_payload_addr; + assign io_outputs_5_aw_payload_id = io_input_aw_payload_id; + assign io_outputs_5_aw_payload_len = io_input_aw_payload_len; + assign io_outputs_5_aw_payload_size = io_input_aw_payload_size; + assign io_outputs_5_aw_payload_burst = io_input_aw_payload_burst; + assign io_outputs_5_aw_payload_lock = io_input_aw_payload_lock; + assign io_outputs_5_aw_payload_cache = io_input_aw_payload_cache; + assign io_outputs_5_aw_payload_prot = io_input_aw_payload_prot; + assign io_outputs_6_aw_valid = ((io_input_aw_valid && decodedCmdSels[6]) && allowCmd); + assign io_outputs_6_aw_payload_addr = io_input_aw_payload_addr; + assign io_outputs_6_aw_payload_id = io_input_aw_payload_id; + assign io_outputs_6_aw_payload_len = io_input_aw_payload_len; + assign io_outputs_6_aw_payload_size = io_input_aw_payload_size; + assign io_outputs_6_aw_payload_burst = io_input_aw_payload_burst; + assign io_outputs_6_aw_payload_lock = io_input_aw_payload_lock; + assign io_outputs_6_aw_payload_cache = io_input_aw_payload_cache; + assign io_outputs_6_aw_payload_prot = io_input_aw_payload_prot; + assign io_outputs_7_aw_valid = ((io_input_aw_valid && decodedCmdSels[7]) && allowCmd); + assign io_outputs_7_aw_payload_addr = io_input_aw_payload_addr; + assign io_outputs_7_aw_payload_id = io_input_aw_payload_id; + assign io_outputs_7_aw_payload_len = io_input_aw_payload_len; + assign io_outputs_7_aw_payload_size = io_input_aw_payload_size; + assign io_outputs_7_aw_payload_burst = io_input_aw_payload_burst; + assign io_outputs_7_aw_payload_lock = io_input_aw_payload_lock; + assign io_outputs_7_aw_payload_cache = io_input_aw_payload_cache; + assign io_outputs_7_aw_payload_prot = io_input_aw_payload_prot; + assign io_input_w_ready = (((|(pendingSels & {io_outputs_7_w_ready,{io_outputs_6_w_ready,{io_outputs_5_w_ready,{io_outputs_4_w_ready,{io_outputs_3_w_ready,{io_outputs_2_w_ready,{io_outputs_1_w_ready,io_outputs_0_w_ready}}}}}}})) || (pendingError && errorSlave_io_axi_w_ready)) && allowData); + assign errorSlave_io_axi_w_valid = ((io_input_w_valid && pendingError) && allowData); + assign _zz_io_outputs_1_w_valid = pendingSels[1]; + assign _zz_io_outputs_2_w_valid = pendingSels[2]; + assign _zz_io_outputs_3_w_valid = pendingSels[3]; + assign _zz_io_outputs_4_w_valid = pendingSels[4]; + assign _zz_io_outputs_5_w_valid = pendingSels[5]; + assign _zz_io_outputs_6_w_valid = pendingSels[6]; + assign _zz_io_outputs_7_w_valid = pendingSels[7]; + assign io_outputs_0_w_valid = ((io_input_w_valid && pendingSels[0]) && allowData); + assign io_outputs_0_w_payload_data = io_input_w_payload_data; + assign io_outputs_0_w_payload_strb = io_input_w_payload_strb; + assign io_outputs_0_w_payload_last = io_input_w_payload_last; + assign io_outputs_1_w_valid = ((io_input_w_valid && _zz_io_outputs_1_w_valid) && allowData); + assign io_outputs_1_w_payload_data = io_input_w_payload_data; + assign io_outputs_1_w_payload_strb = io_input_w_payload_strb; + assign io_outputs_1_w_payload_last = io_input_w_payload_last; + assign io_outputs_2_w_valid = ((io_input_w_valid && _zz_io_outputs_2_w_valid) && allowData); + assign io_outputs_2_w_payload_data = io_input_w_payload_data; + assign io_outputs_2_w_payload_strb = io_input_w_payload_strb; + assign io_outputs_2_w_payload_last = io_input_w_payload_last; + assign io_outputs_3_w_valid = ((io_input_w_valid && _zz_io_outputs_3_w_valid) && allowData); + assign io_outputs_3_w_payload_data = io_input_w_payload_data; + assign io_outputs_3_w_payload_strb = io_input_w_payload_strb; + assign io_outputs_3_w_payload_last = io_input_w_payload_last; + assign io_outputs_4_w_valid = ((io_input_w_valid && _zz_io_outputs_4_w_valid) && allowData); + assign io_outputs_4_w_payload_data = io_input_w_payload_data; + assign io_outputs_4_w_payload_strb = io_input_w_payload_strb; + assign io_outputs_4_w_payload_last = io_input_w_payload_last; + assign io_outputs_5_w_valid = ((io_input_w_valid && _zz_io_outputs_5_w_valid) && allowData); + assign io_outputs_5_w_payload_data = io_input_w_payload_data; + assign io_outputs_5_w_payload_strb = io_input_w_payload_strb; + assign io_outputs_5_w_payload_last = io_input_w_payload_last; + assign io_outputs_6_w_valid = ((io_input_w_valid && _zz_io_outputs_6_w_valid) && allowData); + assign io_outputs_6_w_payload_data = io_input_w_payload_data; + assign io_outputs_6_w_payload_strb = io_input_w_payload_strb; + assign io_outputs_6_w_payload_last = io_input_w_payload_last; + assign io_outputs_7_w_valid = ((io_input_w_valid && _zz_io_outputs_7_w_valid) && allowData); + assign io_outputs_7_w_payload_data = io_input_w_payload_data; + assign io_outputs_7_w_payload_strb = io_input_w_payload_strb; + assign io_outputs_7_w_payload_last = io_input_w_payload_last; + assign _zz_writeRspIndex = (((_zz_io_outputs_1_w_valid || _zz_io_outputs_3_w_valid) || _zz_io_outputs_5_w_valid) || _zz_io_outputs_7_w_valid); + assign _zz_writeRspIndex_1 = (((_zz_io_outputs_2_w_valid || _zz_io_outputs_3_w_valid) || _zz_io_outputs_6_w_valid) || _zz_io_outputs_7_w_valid); + assign _zz_writeRspIndex_2 = (((_zz_io_outputs_4_w_valid || _zz_io_outputs_5_w_valid) || _zz_io_outputs_6_w_valid) || _zz_io_outputs_7_w_valid); + assign writeRspIndex = {_zz_writeRspIndex_2,{_zz_writeRspIndex_1,_zz_writeRspIndex}}; + assign io_input_b_valid = ((|{io_outputs_7_b_valid,{io_outputs_6_b_valid,{io_outputs_5_b_valid,{io_outputs_4_b_valid,{io_outputs_3_b_valid,{io_outputs_2_b_valid,{io_outputs_1_b_valid,io_outputs_0_b_valid}}}}}}}) || errorSlave_io_axi_b_valid); + always @(*) begin + io_input_b_payload_id = _zz_io_input_b_payload_id; + if(pendingError) begin + io_input_b_payload_id = errorSlave_io_axi_b_payload_id; + end + end + + always @(*) begin + io_input_b_payload_resp = _zz_io_input_b_payload_resp; + if(pendingError) begin + io_input_b_payload_resp = errorSlave_io_axi_b_payload_resp; + end + end + + assign io_outputs_0_b_ready = io_input_b_ready; + assign io_outputs_1_b_ready = io_input_b_ready; + assign io_outputs_2_b_ready = io_input_b_ready; + assign io_outputs_3_b_ready = io_input_b_ready; + assign io_outputs_4_b_ready = io_input_b_ready; + assign io_outputs_5_b_ready = io_input_b_ready; + assign io_outputs_6_b_ready = io_input_b_ready; + assign io_outputs_7_b_ready = io_input_b_ready; + always @(posedge clk or negedge resetn) begin + if(!resetn) begin + pendingCmdCounter_value <= 3'b000; + pendingDataCounter_value <= 3'b000; + pendingSels <= 8'h00; + pendingError <= 1'b0; + _zz_cmdAllowedStart <= 1'b1; + end else begin + pendingCmdCounter_value <= pendingCmdCounter_valueNext; + pendingDataCounter_value <= pendingDataCounter_valueNext; + if(cmdAllowedStart) begin + pendingSels <= decodedCmdSels; + end + if(cmdAllowedStart) begin + pendingError <= decodedCmdError; + end + if(cmdAllowedStart) begin + _zz_cmdAllowedStart <= 1'b0; + end + if(io_input_aw_ready) begin + _zz_cmdAllowedStart <= 1'b1; + end + end + end + + +endmodule + +module Axi4ReadOnlyDecoder ( + input wire io_input_ar_valid, + output wire io_input_ar_ready, + input wire [31:0] io_input_ar_payload_addr, + input wire [3:0] io_input_ar_payload_id, + input wire [7:0] io_input_ar_payload_len, + input wire [2:0] io_input_ar_payload_size, + input wire [1:0] io_input_ar_payload_burst, + input wire [0:0] io_input_ar_payload_lock, + input wire [3:0] io_input_ar_payload_cache, + input wire [2:0] io_input_ar_payload_prot, + output reg io_input_r_valid, + input wire io_input_r_ready, + output wire [31:0] io_input_r_payload_data, + output reg [3:0] io_input_r_payload_id, + output reg [1:0] io_input_r_payload_resp, + output reg io_input_r_payload_last, + output wire io_outputs_0_ar_valid, + input wire io_outputs_0_ar_ready, + output wire [31:0] io_outputs_0_ar_payload_addr, + output wire [3:0] io_outputs_0_ar_payload_id, + output wire [7:0] io_outputs_0_ar_payload_len, + output wire [2:0] io_outputs_0_ar_payload_size, + output wire [1:0] io_outputs_0_ar_payload_burst, + output wire [0:0] io_outputs_0_ar_payload_lock, + output wire [3:0] io_outputs_0_ar_payload_cache, + output wire [2:0] io_outputs_0_ar_payload_prot, + input wire io_outputs_0_r_valid, + output wire io_outputs_0_r_ready, + input wire [31:0] io_outputs_0_r_payload_data, + input wire [3:0] io_outputs_0_r_payload_id, + input wire [1:0] io_outputs_0_r_payload_resp, + input wire io_outputs_0_r_payload_last, + output wire io_outputs_1_ar_valid, + input wire io_outputs_1_ar_ready, + output wire [31:0] io_outputs_1_ar_payload_addr, + output wire [3:0] io_outputs_1_ar_payload_id, + output wire [7:0] io_outputs_1_ar_payload_len, + output wire [2:0] io_outputs_1_ar_payload_size, + output wire [1:0] io_outputs_1_ar_payload_burst, + output wire [0:0] io_outputs_1_ar_payload_lock, + output wire [3:0] io_outputs_1_ar_payload_cache, + output wire [2:0] io_outputs_1_ar_payload_prot, + input wire io_outputs_1_r_valid, + output wire io_outputs_1_r_ready, + input wire [31:0] io_outputs_1_r_payload_data, + input wire [3:0] io_outputs_1_r_payload_id, + input wire [1:0] io_outputs_1_r_payload_resp, + input wire io_outputs_1_r_payload_last, + output wire io_outputs_2_ar_valid, + input wire io_outputs_2_ar_ready, + output wire [31:0] io_outputs_2_ar_payload_addr, + output wire [3:0] io_outputs_2_ar_payload_id, + output wire [7:0] io_outputs_2_ar_payload_len, + output wire [2:0] io_outputs_2_ar_payload_size, + output wire [1:0] io_outputs_2_ar_payload_burst, + output wire [0:0] io_outputs_2_ar_payload_lock, + output wire [3:0] io_outputs_2_ar_payload_cache, + output wire [2:0] io_outputs_2_ar_payload_prot, + input wire io_outputs_2_r_valid, + output wire io_outputs_2_r_ready, + input wire [31:0] io_outputs_2_r_payload_data, + input wire [3:0] io_outputs_2_r_payload_id, + input wire [1:0] io_outputs_2_r_payload_resp, + input wire io_outputs_2_r_payload_last, + output wire io_outputs_3_ar_valid, + input wire io_outputs_3_ar_ready, + output wire [31:0] io_outputs_3_ar_payload_addr, + output wire [3:0] io_outputs_3_ar_payload_id, + output wire [7:0] io_outputs_3_ar_payload_len, + output wire [2:0] io_outputs_3_ar_payload_size, + output wire [1:0] io_outputs_3_ar_payload_burst, + output wire [0:0] io_outputs_3_ar_payload_lock, + output wire [3:0] io_outputs_3_ar_payload_cache, + output wire [2:0] io_outputs_3_ar_payload_prot, + input wire io_outputs_3_r_valid, + output wire io_outputs_3_r_ready, + input wire [31:0] io_outputs_3_r_payload_data, + input wire [3:0] io_outputs_3_r_payload_id, + input wire [1:0] io_outputs_3_r_payload_resp, + input wire io_outputs_3_r_payload_last, + output wire io_outputs_4_ar_valid, + input wire io_outputs_4_ar_ready, + output wire [31:0] io_outputs_4_ar_payload_addr, + output wire [3:0] io_outputs_4_ar_payload_id, + output wire [7:0] io_outputs_4_ar_payload_len, + output wire [2:0] io_outputs_4_ar_payload_size, + output wire [1:0] io_outputs_4_ar_payload_burst, + output wire [0:0] io_outputs_4_ar_payload_lock, + output wire [3:0] io_outputs_4_ar_payload_cache, + output wire [2:0] io_outputs_4_ar_payload_prot, + input wire io_outputs_4_r_valid, + output wire io_outputs_4_r_ready, + input wire [31:0] io_outputs_4_r_payload_data, + input wire [3:0] io_outputs_4_r_payload_id, + input wire [1:0] io_outputs_4_r_payload_resp, + input wire io_outputs_4_r_payload_last, + output wire io_outputs_5_ar_valid, + input wire io_outputs_5_ar_ready, + output wire [31:0] io_outputs_5_ar_payload_addr, + output wire [3:0] io_outputs_5_ar_payload_id, + output wire [7:0] io_outputs_5_ar_payload_len, + output wire [2:0] io_outputs_5_ar_payload_size, + output wire [1:0] io_outputs_5_ar_payload_burst, + output wire [0:0] io_outputs_5_ar_payload_lock, + output wire [3:0] io_outputs_5_ar_payload_cache, + output wire [2:0] io_outputs_5_ar_payload_prot, + input wire io_outputs_5_r_valid, + output wire io_outputs_5_r_ready, + input wire [31:0] io_outputs_5_r_payload_data, + input wire [3:0] io_outputs_5_r_payload_id, + input wire [1:0] io_outputs_5_r_payload_resp, + input wire io_outputs_5_r_payload_last, + output wire io_outputs_6_ar_valid, + input wire io_outputs_6_ar_ready, + output wire [31:0] io_outputs_6_ar_payload_addr, + output wire [3:0] io_outputs_6_ar_payload_id, + output wire [7:0] io_outputs_6_ar_payload_len, + output wire [2:0] io_outputs_6_ar_payload_size, + output wire [1:0] io_outputs_6_ar_payload_burst, + output wire [0:0] io_outputs_6_ar_payload_lock, + output wire [3:0] io_outputs_6_ar_payload_cache, + output wire [2:0] io_outputs_6_ar_payload_prot, + input wire io_outputs_6_r_valid, + output wire io_outputs_6_r_ready, + input wire [31:0] io_outputs_6_r_payload_data, + input wire [3:0] io_outputs_6_r_payload_id, + input wire [1:0] io_outputs_6_r_payload_resp, + input wire io_outputs_6_r_payload_last, + output wire io_outputs_7_ar_valid, + input wire io_outputs_7_ar_ready, + output wire [31:0] io_outputs_7_ar_payload_addr, + output wire [3:0] io_outputs_7_ar_payload_id, + output wire [7:0] io_outputs_7_ar_payload_len, + output wire [2:0] io_outputs_7_ar_payload_size, + output wire [1:0] io_outputs_7_ar_payload_burst, + output wire [0:0] io_outputs_7_ar_payload_lock, + output wire [3:0] io_outputs_7_ar_payload_cache, + output wire [2:0] io_outputs_7_ar_payload_prot, + input wire io_outputs_7_r_valid, + output wire io_outputs_7_r_ready, + input wire [31:0] io_outputs_7_r_payload_data, + input wire [3:0] io_outputs_7_r_payload_id, + input wire [1:0] io_outputs_7_r_payload_resp, + input wire io_outputs_7_r_payload_last, + input wire clk, + input wire resetn +); + + wire errorSlave_io_axi_ar_valid; + wire errorSlave_io_axi_ar_ready; + wire errorSlave_io_axi_r_valid; + wire [31:0] errorSlave_io_axi_r_payload_data; + wire [3:0] errorSlave_io_axi_r_payload_id; + wire [1:0] errorSlave_io_axi_r_payload_resp; + wire errorSlave_io_axi_r_payload_last; + wire [31:0] _zz_decodedCmdSels; + wire [31:0] _zz_decodedCmdSels_1; + wire [31:0] _zz_decodedCmdSels_2; + wire [31:0] _zz_decodedCmdSels_3; + wire _zz_decodedCmdSels_4; + wire _zz_decodedCmdSels_5; + wire [0:0] _zz_decodedCmdSels_6; + wire [1:0] _zz_decodedCmdSels_7; + wire [31:0] _zz_decodedCmdSels_8; + wire [31:0] _zz_decodedCmdSels_9; + reg [31:0] _zz_io_input_r_payload_data; + reg [3:0] _zz_io_input_r_payload_id; + reg [1:0] _zz_io_input_r_payload_resp; + reg _zz_io_input_r_payload_last; + wire io_input_ar_fire; + wire io_input_r_fire; + wire when_Utils_l697; + reg pendingCmdCounter_incrementIt; + reg pendingCmdCounter_decrementIt; + wire [2:0] pendingCmdCounter_valueNext; + reg [2:0] pendingCmdCounter_value; + wire pendingCmdCounter_mayOverflow; + wire pendingCmdCounter_willOverflowIfInc; + wire pendingCmdCounter_willOverflow; + reg [2:0] pendingCmdCounter_finalIncrement; + wire when_Utils_l723; + wire when_Utils_l725; + wire [7:0] decodedCmdSels; + wire decodedCmdError; + reg [7:0] pendingSels; + reg pendingError; + wire allowCmd; + wire _zz_readRspIndex; + wire _zz_readRspIndex_1; + wire _zz_readRspIndex_2; + wire _zz_readRspIndex_3; + wire _zz_readRspIndex_4; + wire _zz_readRspIndex_5; + wire _zz_readRspIndex_6; + wire [2:0] readRspIndex; + + assign _zz_decodedCmdSels = 32'h000fffff; + assign _zz_decodedCmdSels_1 = (~ 32'h000fffff); + assign _zz_decodedCmdSels_2 = (io_input_ar_payload_addr & (~ 32'h000fffff)); + assign _zz_decodedCmdSels_3 = 32'h1f300000; + assign _zz_decodedCmdSels_4 = ((io_input_ar_payload_addr & (~ 32'h000fffff)) == 32'h1f200000); + assign _zz_decodedCmdSels_5 = (((io_input_ar_payload_addr & (~ 32'h000fffff)) == 32'h1f100000) && io_input_ar_valid); + assign _zz_decodedCmdSels_6 = (((io_input_ar_payload_addr & (~ 32'h000fffff)) == 32'h1f000000) && io_input_ar_valid); + assign _zz_decodedCmdSels_7 = {(((io_input_ar_payload_addr & (~ _zz_decodedCmdSels_8)) == 32'h00000000) && io_input_ar_valid),(((io_input_ar_payload_addr & (~ _zz_decodedCmdSels_9)) == 32'h1c000000) && io_input_ar_valid)}; + assign _zz_decodedCmdSels_8 = 32'h007fffff; + assign _zz_decodedCmdSels_9 = 32'h007fffff; + Axi4ReadOnlyErrorSlave_1 errorSlave ( + .io_axi_ar_valid (errorSlave_io_axi_ar_valid ), //i + .io_axi_ar_ready (errorSlave_io_axi_ar_ready ), //o + .io_axi_ar_payload_addr (io_input_ar_payload_addr[31:0] ), //i + .io_axi_ar_payload_id (io_input_ar_payload_id[3:0] ), //i + .io_axi_ar_payload_len (io_input_ar_payload_len[7:0] ), //i + .io_axi_ar_payload_size (io_input_ar_payload_size[2:0] ), //i + .io_axi_ar_payload_burst (io_input_ar_payload_burst[1:0] ), //i + .io_axi_ar_payload_lock (io_input_ar_payload_lock ), //i + .io_axi_ar_payload_cache (io_input_ar_payload_cache[3:0] ), //i + .io_axi_ar_payload_prot (io_input_ar_payload_prot[2:0] ), //i + .io_axi_r_valid (errorSlave_io_axi_r_valid ), //o + .io_axi_r_ready (io_input_r_ready ), //i + .io_axi_r_payload_data (errorSlave_io_axi_r_payload_data[31:0]), //o + .io_axi_r_payload_id (errorSlave_io_axi_r_payload_id[3:0] ), //o + .io_axi_r_payload_resp (errorSlave_io_axi_r_payload_resp[1:0] ), //o + .io_axi_r_payload_last (errorSlave_io_axi_r_payload_last ), //o + .clk (clk ), //i + .resetn (resetn ) //i + ); + always @(*) begin + case(readRspIndex) + 3'b000 : begin + _zz_io_input_r_payload_data = io_outputs_0_r_payload_data; + _zz_io_input_r_payload_id = io_outputs_0_r_payload_id; + _zz_io_input_r_payload_resp = io_outputs_0_r_payload_resp; + _zz_io_input_r_payload_last = io_outputs_0_r_payload_last; + end + 3'b001 : begin + _zz_io_input_r_payload_data = io_outputs_1_r_payload_data; + _zz_io_input_r_payload_id = io_outputs_1_r_payload_id; + _zz_io_input_r_payload_resp = io_outputs_1_r_payload_resp; + _zz_io_input_r_payload_last = io_outputs_1_r_payload_last; + end + 3'b010 : begin + _zz_io_input_r_payload_data = io_outputs_2_r_payload_data; + _zz_io_input_r_payload_id = io_outputs_2_r_payload_id; + _zz_io_input_r_payload_resp = io_outputs_2_r_payload_resp; + _zz_io_input_r_payload_last = io_outputs_2_r_payload_last; + end + 3'b011 : begin + _zz_io_input_r_payload_data = io_outputs_3_r_payload_data; + _zz_io_input_r_payload_id = io_outputs_3_r_payload_id; + _zz_io_input_r_payload_resp = io_outputs_3_r_payload_resp; + _zz_io_input_r_payload_last = io_outputs_3_r_payload_last; + end + 3'b100 : begin + _zz_io_input_r_payload_data = io_outputs_4_r_payload_data; + _zz_io_input_r_payload_id = io_outputs_4_r_payload_id; + _zz_io_input_r_payload_resp = io_outputs_4_r_payload_resp; + _zz_io_input_r_payload_last = io_outputs_4_r_payload_last; + end + 3'b101 : begin + _zz_io_input_r_payload_data = io_outputs_5_r_payload_data; + _zz_io_input_r_payload_id = io_outputs_5_r_payload_id; + _zz_io_input_r_payload_resp = io_outputs_5_r_payload_resp; + _zz_io_input_r_payload_last = io_outputs_5_r_payload_last; + end + 3'b110 : begin + _zz_io_input_r_payload_data = io_outputs_6_r_payload_data; + _zz_io_input_r_payload_id = io_outputs_6_r_payload_id; + _zz_io_input_r_payload_resp = io_outputs_6_r_payload_resp; + _zz_io_input_r_payload_last = io_outputs_6_r_payload_last; + end + default : begin + _zz_io_input_r_payload_data = io_outputs_7_r_payload_data; + _zz_io_input_r_payload_id = io_outputs_7_r_payload_id; + _zz_io_input_r_payload_resp = io_outputs_7_r_payload_resp; + _zz_io_input_r_payload_last = io_outputs_7_r_payload_last; + end + endcase + end + + assign io_input_ar_fire = (io_input_ar_valid && io_input_ar_ready); + assign io_input_r_fire = (io_input_r_valid && io_input_r_ready); + assign when_Utils_l697 = (io_input_r_fire && io_input_r_payload_last); + always @(*) begin + pendingCmdCounter_incrementIt = 1'b0; + if(io_input_ar_fire) begin + pendingCmdCounter_incrementIt = 1'b1; + end + end + + always @(*) begin + pendingCmdCounter_decrementIt = 1'b0; + if(when_Utils_l697) begin + pendingCmdCounter_decrementIt = 1'b1; + end + end + + assign pendingCmdCounter_mayOverflow = (pendingCmdCounter_value == 3'b111); + assign pendingCmdCounter_willOverflowIfInc = (pendingCmdCounter_mayOverflow && (! pendingCmdCounter_decrementIt)); + assign pendingCmdCounter_willOverflow = (pendingCmdCounter_willOverflowIfInc && pendingCmdCounter_incrementIt); + assign when_Utils_l723 = (pendingCmdCounter_incrementIt && (! pendingCmdCounter_decrementIt)); + always @(*) begin + if(when_Utils_l723) begin + pendingCmdCounter_finalIncrement = 3'b001; + end else begin + if(when_Utils_l725) begin + pendingCmdCounter_finalIncrement = 3'b111; + end else begin + pendingCmdCounter_finalIncrement = 3'b000; + end + end + end + + assign when_Utils_l725 = ((! pendingCmdCounter_incrementIt) && pendingCmdCounter_decrementIt); + assign pendingCmdCounter_valueNext = (pendingCmdCounter_value + pendingCmdCounter_finalIncrement); + assign decodedCmdSels = {(((io_input_ar_payload_addr & (~ _zz_decodedCmdSels)) == 32'h1f500000) && io_input_ar_valid),{(((io_input_ar_payload_addr & _zz_decodedCmdSels_1) == 32'h1f400000) && io_input_ar_valid),{((_zz_decodedCmdSels_2 == _zz_decodedCmdSels_3) && io_input_ar_valid),{(_zz_decodedCmdSels_4 && io_input_ar_valid),{_zz_decodedCmdSels_5,{_zz_decodedCmdSels_6,_zz_decodedCmdSels_7}}}}}}; + assign decodedCmdError = (decodedCmdSels == 8'h00); + assign allowCmd = ((pendingCmdCounter_value == 3'b000) || ((pendingCmdCounter_value != 3'b111) && (pendingSels == decodedCmdSels))); + assign io_input_ar_ready = (((|(decodedCmdSels & {io_outputs_7_ar_ready,{io_outputs_6_ar_ready,{io_outputs_5_ar_ready,{io_outputs_4_ar_ready,{io_outputs_3_ar_ready,{io_outputs_2_ar_ready,{io_outputs_1_ar_ready,io_outputs_0_ar_ready}}}}}}})) || (decodedCmdError && errorSlave_io_axi_ar_ready)) && allowCmd); + assign errorSlave_io_axi_ar_valid = ((io_input_ar_valid && decodedCmdError) && allowCmd); + assign io_outputs_0_ar_valid = ((io_input_ar_valid && decodedCmdSels[0]) && allowCmd); + assign io_outputs_0_ar_payload_addr = io_input_ar_payload_addr; + assign io_outputs_0_ar_payload_id = io_input_ar_payload_id; + assign io_outputs_0_ar_payload_len = io_input_ar_payload_len; + assign io_outputs_0_ar_payload_size = io_input_ar_payload_size; + assign io_outputs_0_ar_payload_burst = io_input_ar_payload_burst; + assign io_outputs_0_ar_payload_lock = io_input_ar_payload_lock; + assign io_outputs_0_ar_payload_cache = io_input_ar_payload_cache; + assign io_outputs_0_ar_payload_prot = io_input_ar_payload_prot; + assign io_outputs_1_ar_valid = ((io_input_ar_valid && decodedCmdSels[1]) && allowCmd); + assign io_outputs_1_ar_payload_addr = io_input_ar_payload_addr; + assign io_outputs_1_ar_payload_id = io_input_ar_payload_id; + assign io_outputs_1_ar_payload_len = io_input_ar_payload_len; + assign io_outputs_1_ar_payload_size = io_input_ar_payload_size; + assign io_outputs_1_ar_payload_burst = io_input_ar_payload_burst; + assign io_outputs_1_ar_payload_lock = io_input_ar_payload_lock; + assign io_outputs_1_ar_payload_cache = io_input_ar_payload_cache; + assign io_outputs_1_ar_payload_prot = io_input_ar_payload_prot; + assign io_outputs_2_ar_valid = ((io_input_ar_valid && decodedCmdSels[2]) && allowCmd); + assign io_outputs_2_ar_payload_addr = io_input_ar_payload_addr; + assign io_outputs_2_ar_payload_id = io_input_ar_payload_id; + assign io_outputs_2_ar_payload_len = io_input_ar_payload_len; + assign io_outputs_2_ar_payload_size = io_input_ar_payload_size; + assign io_outputs_2_ar_payload_burst = io_input_ar_payload_burst; + assign io_outputs_2_ar_payload_lock = io_input_ar_payload_lock; + assign io_outputs_2_ar_payload_cache = io_input_ar_payload_cache; + assign io_outputs_2_ar_payload_prot = io_input_ar_payload_prot; + assign io_outputs_3_ar_valid = ((io_input_ar_valid && decodedCmdSels[3]) && allowCmd); + assign io_outputs_3_ar_payload_addr = io_input_ar_payload_addr; + assign io_outputs_3_ar_payload_id = io_input_ar_payload_id; + assign io_outputs_3_ar_payload_len = io_input_ar_payload_len; + assign io_outputs_3_ar_payload_size = io_input_ar_payload_size; + assign io_outputs_3_ar_payload_burst = io_input_ar_payload_burst; + assign io_outputs_3_ar_payload_lock = io_input_ar_payload_lock; + assign io_outputs_3_ar_payload_cache = io_input_ar_payload_cache; + assign io_outputs_3_ar_payload_prot = io_input_ar_payload_prot; + assign io_outputs_4_ar_valid = ((io_input_ar_valid && decodedCmdSels[4]) && allowCmd); + assign io_outputs_4_ar_payload_addr = io_input_ar_payload_addr; + assign io_outputs_4_ar_payload_id = io_input_ar_payload_id; + assign io_outputs_4_ar_payload_len = io_input_ar_payload_len; + assign io_outputs_4_ar_payload_size = io_input_ar_payload_size; + assign io_outputs_4_ar_payload_burst = io_input_ar_payload_burst; + assign io_outputs_4_ar_payload_lock = io_input_ar_payload_lock; + assign io_outputs_4_ar_payload_cache = io_input_ar_payload_cache; + assign io_outputs_4_ar_payload_prot = io_input_ar_payload_prot; + assign io_outputs_5_ar_valid = ((io_input_ar_valid && decodedCmdSels[5]) && allowCmd); + assign io_outputs_5_ar_payload_addr = io_input_ar_payload_addr; + assign io_outputs_5_ar_payload_id = io_input_ar_payload_id; + assign io_outputs_5_ar_payload_len = io_input_ar_payload_len; + assign io_outputs_5_ar_payload_size = io_input_ar_payload_size; + assign io_outputs_5_ar_payload_burst = io_input_ar_payload_burst; + assign io_outputs_5_ar_payload_lock = io_input_ar_payload_lock; + assign io_outputs_5_ar_payload_cache = io_input_ar_payload_cache; + assign io_outputs_5_ar_payload_prot = io_input_ar_payload_prot; + assign io_outputs_6_ar_valid = ((io_input_ar_valid && decodedCmdSels[6]) && allowCmd); + assign io_outputs_6_ar_payload_addr = io_input_ar_payload_addr; + assign io_outputs_6_ar_payload_id = io_input_ar_payload_id; + assign io_outputs_6_ar_payload_len = io_input_ar_payload_len; + assign io_outputs_6_ar_payload_size = io_input_ar_payload_size; + assign io_outputs_6_ar_payload_burst = io_input_ar_payload_burst; + assign io_outputs_6_ar_payload_lock = io_input_ar_payload_lock; + assign io_outputs_6_ar_payload_cache = io_input_ar_payload_cache; + assign io_outputs_6_ar_payload_prot = io_input_ar_payload_prot; + assign io_outputs_7_ar_valid = ((io_input_ar_valid && decodedCmdSels[7]) && allowCmd); + assign io_outputs_7_ar_payload_addr = io_input_ar_payload_addr; + assign io_outputs_7_ar_payload_id = io_input_ar_payload_id; + assign io_outputs_7_ar_payload_len = io_input_ar_payload_len; + assign io_outputs_7_ar_payload_size = io_input_ar_payload_size; + assign io_outputs_7_ar_payload_burst = io_input_ar_payload_burst; + assign io_outputs_7_ar_payload_lock = io_input_ar_payload_lock; + assign io_outputs_7_ar_payload_cache = io_input_ar_payload_cache; + assign io_outputs_7_ar_payload_prot = io_input_ar_payload_prot; + assign _zz_readRspIndex = pendingSels[3]; + assign _zz_readRspIndex_1 = pendingSels[5]; + assign _zz_readRspIndex_2 = pendingSels[6]; + assign _zz_readRspIndex_3 = pendingSels[7]; + assign _zz_readRspIndex_4 = (((pendingSels[1] || _zz_readRspIndex) || _zz_readRspIndex_1) || _zz_readRspIndex_3); + assign _zz_readRspIndex_5 = (((pendingSels[2] || _zz_readRspIndex) || _zz_readRspIndex_2) || _zz_readRspIndex_3); + assign _zz_readRspIndex_6 = (((pendingSels[4] || _zz_readRspIndex_1) || _zz_readRspIndex_2) || _zz_readRspIndex_3); + assign readRspIndex = {_zz_readRspIndex_6,{_zz_readRspIndex_5,_zz_readRspIndex_4}}; + always @(*) begin + io_input_r_valid = (|{io_outputs_7_r_valid,{io_outputs_6_r_valid,{io_outputs_5_r_valid,{io_outputs_4_r_valid,{io_outputs_3_r_valid,{io_outputs_2_r_valid,{io_outputs_1_r_valid,io_outputs_0_r_valid}}}}}}}); + if(errorSlave_io_axi_r_valid) begin + io_input_r_valid = 1'b1; + end + end + + assign io_input_r_payload_data = _zz_io_input_r_payload_data; + always @(*) begin + io_input_r_payload_id = _zz_io_input_r_payload_id; + if(pendingError) begin + io_input_r_payload_id = errorSlave_io_axi_r_payload_id; + end + end + + always @(*) begin + io_input_r_payload_resp = _zz_io_input_r_payload_resp; + if(pendingError) begin + io_input_r_payload_resp = errorSlave_io_axi_r_payload_resp; + end + end + + always @(*) begin + io_input_r_payload_last = _zz_io_input_r_payload_last; + if(pendingError) begin + io_input_r_payload_last = errorSlave_io_axi_r_payload_last; + end + end + + assign io_outputs_0_r_ready = io_input_r_ready; + assign io_outputs_1_r_ready = io_input_r_ready; + assign io_outputs_2_r_ready = io_input_r_ready; + assign io_outputs_3_r_ready = io_input_r_ready; + assign io_outputs_4_r_ready = io_input_r_ready; + assign io_outputs_5_r_ready = io_input_r_ready; + assign io_outputs_6_r_ready = io_input_r_ready; + assign io_outputs_7_r_ready = io_input_r_ready; + always @(posedge clk or negedge resetn) begin + if(!resetn) begin + pendingCmdCounter_value <= 3'b000; + pendingSels <= 8'h00; + pendingError <= 1'b0; + end else begin + pendingCmdCounter_value <= pendingCmdCounter_valueNext; + if(io_input_ar_ready) begin + pendingSels <= decodedCmdSels; + end + if(io_input_ar_ready) begin + pendingError <= decodedCmdError; + end + end + end + + +endmodule + +//StreamFifoLowLatency replaced by StreamFifoLowLatency_3 + +//StreamArbiter replaced by StreamArbiter_7 + +//StreamArbiter_1 replaced by StreamArbiter_7 + +//StreamFifoLowLatency_1 replaced by StreamFifoLowLatency_3 + +//StreamArbiter_2 replaced by StreamArbiter_7 + +//StreamArbiter_3 replaced by StreamArbiter_7 + +//StreamFifoLowLatency_2 replaced by StreamFifoLowLatency_3 + +//StreamArbiter_4 replaced by StreamArbiter_7 + +//StreamArbiter_5 replaced by StreamArbiter_7 + +module StreamFifoLowLatency_3 ( + input wire io_push_valid, + output wire io_push_ready, + input wire [0:0] io_push_payload, + output wire io_pop_valid, + input wire io_pop_ready, + output wire [0:0] io_pop_payload, + input wire io_flush, + output wire [2:0] io_occupancy, + output wire [2:0] io_availability, + input wire clk, + input wire resetn +); + + wire fifo_io_push_ready; + wire fifo_io_pop_valid; + wire [0:0] fifo_io_pop_payload; + wire [2:0] fifo_io_occupancy; + wire [2:0] fifo_io_availability; + + StreamFifo_3 fifo ( + .io_push_valid (io_push_valid ), //i + .io_push_ready (fifo_io_push_ready ), //o + .io_push_payload (io_push_payload ), //i + .io_pop_valid (fifo_io_pop_valid ), //o + .io_pop_ready (io_pop_ready ), //i + .io_pop_payload (fifo_io_pop_payload ), //o + .io_flush (io_flush ), //i + .io_occupancy (fifo_io_occupancy[2:0] ), //o + .io_availability (fifo_io_availability[2:0]), //o + .clk (clk ), //i + .resetn (resetn ) //i + ); + assign io_push_ready = fifo_io_push_ready; + assign io_pop_valid = fifo_io_pop_valid; + assign io_pop_payload = fifo_io_pop_payload; + assign io_occupancy = fifo_io_occupancy; + assign io_availability = fifo_io_availability; + +endmodule + +//StreamArbiter_6 replaced by StreamArbiter_7 + +module StreamArbiter_7 ( + input wire io_inputs_0_valid, + output wire io_inputs_0_ready, + input wire [31:0] io_inputs_0_payload_addr, + input wire [3:0] io_inputs_0_payload_id, + input wire [7:0] io_inputs_0_payload_len, + input wire [2:0] io_inputs_0_payload_size, + input wire [1:0] io_inputs_0_payload_burst, + input wire [0:0] io_inputs_0_payload_lock, + input wire [3:0] io_inputs_0_payload_cache, + input wire [2:0] io_inputs_0_payload_prot, + input wire io_inputs_1_valid, + output wire io_inputs_1_ready, + input wire [31:0] io_inputs_1_payload_addr, + input wire [3:0] io_inputs_1_payload_id, + input wire [7:0] io_inputs_1_payload_len, + input wire [2:0] io_inputs_1_payload_size, + input wire [1:0] io_inputs_1_payload_burst, + input wire [0:0] io_inputs_1_payload_lock, + input wire [3:0] io_inputs_1_payload_cache, + input wire [2:0] io_inputs_1_payload_prot, + output wire io_output_valid, + input wire io_output_ready, + output wire [31:0] io_output_payload_addr, + output wire [3:0] io_output_payload_id, + output wire [7:0] io_output_payload_len, + output wire [2:0] io_output_payload_size, + output wire [1:0] io_output_payload_burst, + output wire [0:0] io_output_payload_lock, + output wire [3:0] io_output_payload_cache, + output wire [2:0] io_output_payload_prot, + output wire [0:0] io_chosen, + output wire [1:0] io_chosenOH, + input wire clk, + input wire resetn +); + + wire [3:0] _zz__zz_maskProposal_0_2; + wire [3:0] _zz__zz_maskProposal_0_2_1; + wire [1:0] _zz__zz_maskProposal_0_2_2; + reg locked; + wire maskProposal_0; + wire maskProposal_1; + reg maskLocked_0; + reg maskLocked_1; + wire maskRouted_0; + wire maskRouted_1; + wire [1:0] _zz_maskProposal_0; + wire [3:0] _zz_maskProposal_0_1; + wire [3:0] _zz_maskProposal_0_2; + wire [1:0] _zz_maskProposal_0_3; + wire io_output_fire; + wire _zz_io_chosen; + + assign _zz__zz_maskProposal_0_2 = (_zz_maskProposal_0_1 - _zz__zz_maskProposal_0_2_1); + assign _zz__zz_maskProposal_0_2_2 = {maskLocked_0,maskLocked_1}; + assign _zz__zz_maskProposal_0_2_1 = {2'd0, _zz__zz_maskProposal_0_2_2}; + assign maskRouted_0 = (locked ? maskLocked_0 : maskProposal_0); + assign maskRouted_1 = (locked ? maskLocked_1 : maskProposal_1); + assign _zz_maskProposal_0 = {io_inputs_1_valid,io_inputs_0_valid}; + assign _zz_maskProposal_0_1 = {_zz_maskProposal_0,_zz_maskProposal_0}; + assign _zz_maskProposal_0_2 = (_zz_maskProposal_0_1 & (~ _zz__zz_maskProposal_0_2)); + assign _zz_maskProposal_0_3 = (_zz_maskProposal_0_2[3 : 2] | _zz_maskProposal_0_2[1 : 0]); + assign maskProposal_0 = _zz_maskProposal_0_3[0]; + assign maskProposal_1 = _zz_maskProposal_0_3[1]; + assign io_output_fire = (io_output_valid && io_output_ready); + assign io_output_valid = ((io_inputs_0_valid && maskRouted_0) || (io_inputs_1_valid && maskRouted_1)); + assign io_output_payload_addr = (maskRouted_0 ? io_inputs_0_payload_addr : io_inputs_1_payload_addr); + assign io_output_payload_id = (maskRouted_0 ? io_inputs_0_payload_id : io_inputs_1_payload_id); + assign io_output_payload_len = (maskRouted_0 ? io_inputs_0_payload_len : io_inputs_1_payload_len); + assign io_output_payload_size = (maskRouted_0 ? io_inputs_0_payload_size : io_inputs_1_payload_size); + assign io_output_payload_burst = (maskRouted_0 ? io_inputs_0_payload_burst : io_inputs_1_payload_burst); + assign io_output_payload_lock = (maskRouted_0 ? io_inputs_0_payload_lock : io_inputs_1_payload_lock); + assign io_output_payload_cache = (maskRouted_0 ? io_inputs_0_payload_cache : io_inputs_1_payload_cache); + assign io_output_payload_prot = (maskRouted_0 ? io_inputs_0_payload_prot : io_inputs_1_payload_prot); + assign io_inputs_0_ready = (maskRouted_0 && io_output_ready); + assign io_inputs_1_ready = (maskRouted_1 && io_output_ready); + assign io_chosenOH = {maskRouted_1,maskRouted_0}; + assign _zz_io_chosen = io_chosenOH[1]; + assign io_chosen = _zz_io_chosen; + always @(posedge clk or negedge resetn) begin + if(!resetn) begin + locked <= 1'b0; + maskLocked_0 <= 1'b0; + maskLocked_1 <= 1'b1; + end else begin + if(io_output_valid) begin + maskLocked_0 <= maskRouted_0; + maskLocked_1 <= maskRouted_1; + end + if(io_output_valid) begin + locked <= 1'b1; + end + if(io_output_fire) begin + locked <= 1'b0; + end + end + end + + +endmodule + +//Axi4WriteOnlyErrorSlave replaced by Axi4WriteOnlyErrorSlave_1 + +//Axi4ReadOnlyErrorSlave replaced by Axi4ReadOnlyErrorSlave_1 + +module Axi4WriteOnlyErrorSlave_1 ( + input wire io_axi_aw_valid, + output wire io_axi_aw_ready, + input wire [31:0] io_axi_aw_payload_addr, + input wire [3:0] io_axi_aw_payload_id, + input wire [7:0] io_axi_aw_payload_len, + input wire [2:0] io_axi_aw_payload_size, + input wire [1:0] io_axi_aw_payload_burst, + input wire [0:0] io_axi_aw_payload_lock, + input wire [3:0] io_axi_aw_payload_cache, + input wire [2:0] io_axi_aw_payload_prot, + input wire io_axi_w_valid, + output wire io_axi_w_ready, + input wire [31:0] io_axi_w_payload_data, + input wire [3:0] io_axi_w_payload_strb, + input wire io_axi_w_payload_last, + output wire io_axi_b_valid, + input wire io_axi_b_ready, + output wire [3:0] io_axi_b_payload_id, + output wire [1:0] io_axi_b_payload_resp, + input wire clk, + input wire resetn +); + + reg consumeData; + reg sendRsp; + reg [3:0] id; + wire io_axi_aw_fire; + wire io_axi_w_fire; + wire when_Axi4ErrorSlave_l24; + wire io_axi_b_fire; + + assign io_axi_aw_ready = (! (consumeData || sendRsp)); + assign io_axi_aw_fire = (io_axi_aw_valid && io_axi_aw_ready); + assign io_axi_w_ready = consumeData; + assign io_axi_w_fire = (io_axi_w_valid && io_axi_w_ready); + assign when_Axi4ErrorSlave_l24 = (io_axi_w_fire && io_axi_w_payload_last); + assign io_axi_b_valid = sendRsp; + assign io_axi_b_payload_resp = 2'b11; + assign io_axi_b_payload_id = id; + assign io_axi_b_fire = (io_axi_b_valid && io_axi_b_ready); + always @(posedge clk or negedge resetn) begin + if(!resetn) begin + consumeData <= 1'b0; + sendRsp <= 1'b0; + end else begin + if(io_axi_aw_fire) begin + consumeData <= 1'b1; + end + if(when_Axi4ErrorSlave_l24) begin + consumeData <= 1'b0; + sendRsp <= 1'b1; + end + if(io_axi_b_fire) begin + sendRsp <= 1'b0; + end + end + end + + always @(posedge clk) begin + if(io_axi_aw_fire) begin + id <= io_axi_aw_payload_id; + end + end + + +endmodule + +module Axi4ReadOnlyErrorSlave_1 ( + input wire io_axi_ar_valid, + output wire io_axi_ar_ready, + input wire [31:0] io_axi_ar_payload_addr, + input wire [3:0] io_axi_ar_payload_id, + input wire [7:0] io_axi_ar_payload_len, + input wire [2:0] io_axi_ar_payload_size, + input wire [1:0] io_axi_ar_payload_burst, + input wire [0:0] io_axi_ar_payload_lock, + input wire [3:0] io_axi_ar_payload_cache, + input wire [2:0] io_axi_ar_payload_prot, + output wire io_axi_r_valid, + input wire io_axi_r_ready, + output wire [31:0] io_axi_r_payload_data, + output wire [3:0] io_axi_r_payload_id, + output wire [1:0] io_axi_r_payload_resp, + output wire io_axi_r_payload_last, + input wire clk, + input wire resetn +); + + reg sendRsp; + reg [3:0] id; + reg [7:0] remaining; + wire remainingZero; + wire io_axi_ar_fire; + + assign remainingZero = (remaining == 8'h00); + assign io_axi_ar_ready = (! sendRsp); + assign io_axi_ar_fire = (io_axi_ar_valid && io_axi_ar_ready); + assign io_axi_r_valid = sendRsp; + assign io_axi_r_payload_id = id; + assign io_axi_r_payload_resp = 2'b11; + assign io_axi_r_payload_last = remainingZero; + always @(posedge clk or negedge resetn) begin + if(!resetn) begin + sendRsp <= 1'b0; + end else begin + if(io_axi_ar_fire) begin + sendRsp <= 1'b1; + end + if(sendRsp) begin + if(io_axi_r_ready) begin + if(remainingZero) begin + sendRsp <= 1'b0; + end + end + end + end + end + + always @(posedge clk) begin + if(io_axi_ar_fire) begin + remaining <= io_axi_ar_payload_len; + id <= io_axi_ar_payload_id; + end + if(sendRsp) begin + if(io_axi_r_ready) begin + remaining <= (remaining - 8'h01); + end + end + end + + +endmodule + +//StreamFifo replaced by StreamFifo_3 + +//StreamFifo_1 replaced by StreamFifo_3 + +//StreamFifo_2 replaced by StreamFifo_3 + +module StreamFifo_3 ( + input wire io_push_valid, + output wire io_push_ready, + input wire [0:0] io_push_payload, + output reg io_pop_valid, + input wire io_pop_ready, + output reg [0:0] io_pop_payload, + input wire io_flush, + output wire [2:0] io_occupancy, + output wire [2:0] io_availability, + input wire clk, + input wire resetn +); + + wire [0:0] _zz_logic_ram_port1; + wire [0:0] _zz_logic_ram_port; + reg _zz_1; + reg logic_ptr_doPush; + wire logic_ptr_doPop; + wire logic_ptr_full; + wire logic_ptr_empty; + reg [2:0] logic_ptr_push; + reg [2:0] logic_ptr_pop; + wire [2:0] logic_ptr_occupancy; + wire [2:0] logic_ptr_popOnIo; + wire when_Stream_l1205; + reg logic_ptr_wentUp; + wire io_push_fire; + wire logic_push_onRam_write_valid; + wire [1:0] logic_push_onRam_write_payload_address; + wire [0:0] logic_push_onRam_write_payload_data; + wire logic_pop_addressGen_valid; + wire logic_pop_addressGen_ready; + wire [1:0] logic_pop_addressGen_payload; + wire logic_pop_addressGen_fire; + wire [0:0] logic_pop_async_readed; + wire logic_pop_addressGen_translated_valid; + wire logic_pop_addressGen_translated_ready; + wire [0:0] logic_pop_addressGen_translated_payload; + (* ram_style = "distributed" *) reg [0:0] logic_ram [0:3]; + + assign _zz_logic_ram_port = logic_push_onRam_write_payload_data; + always @(posedge clk) begin + if(_zz_1) begin + logic_ram[logic_push_onRam_write_payload_address] <= _zz_logic_ram_port; + end + end + + assign _zz_logic_ram_port1 = logic_ram[logic_pop_addressGen_payload]; + always @(*) begin + _zz_1 = 1'b0; + if(logic_push_onRam_write_valid) begin + _zz_1 = 1'b1; + end + end + + assign when_Stream_l1205 = (logic_ptr_doPush != logic_ptr_doPop); + assign logic_ptr_full = (((logic_ptr_push ^ logic_ptr_popOnIo) ^ 3'b100) == 3'b000); + assign logic_ptr_empty = (logic_ptr_push == logic_ptr_pop); + assign logic_ptr_occupancy = (logic_ptr_push - logic_ptr_popOnIo); + assign io_push_ready = (! logic_ptr_full); + assign io_push_fire = (io_push_valid && io_push_ready); + always @(*) begin + logic_ptr_doPush = io_push_fire; + if(logic_ptr_empty) begin + if(io_pop_ready) begin + logic_ptr_doPush = 1'b0; + end + end + end + + assign logic_push_onRam_write_valid = io_push_fire; + assign logic_push_onRam_write_payload_address = logic_ptr_push[1:0]; + assign logic_push_onRam_write_payload_data = io_push_payload; + assign logic_pop_addressGen_valid = (! logic_ptr_empty); + assign logic_pop_addressGen_payload = logic_ptr_pop[1:0]; + assign logic_pop_addressGen_fire = (logic_pop_addressGen_valid && logic_pop_addressGen_ready); + assign logic_ptr_doPop = logic_pop_addressGen_fire; + assign logic_pop_async_readed = _zz_logic_ram_port1; + assign logic_pop_addressGen_translated_valid = logic_pop_addressGen_valid; + assign logic_pop_addressGen_ready = logic_pop_addressGen_translated_ready; + assign logic_pop_addressGen_translated_payload = logic_pop_async_readed; + always @(*) begin + io_pop_valid = logic_pop_addressGen_translated_valid; + if(logic_ptr_empty) begin + io_pop_valid = io_push_valid; + end + end + + assign logic_pop_addressGen_translated_ready = io_pop_ready; + always @(*) begin + io_pop_payload = logic_pop_addressGen_translated_payload; + if(logic_ptr_empty) begin + io_pop_payload = io_push_payload; + end + end + + assign logic_ptr_popOnIo = logic_ptr_pop; + assign io_occupancy = logic_ptr_occupancy; + assign io_availability = (3'b100 - logic_ptr_occupancy); + always @(posedge clk or negedge resetn) begin + if(!resetn) begin + logic_ptr_push <= 3'b000; + logic_ptr_pop <= 3'b000; + logic_ptr_wentUp <= 1'b0; + end else begin + if(when_Stream_l1205) begin + logic_ptr_wentUp <= logic_ptr_doPush; + end + if(io_flush) begin + logic_ptr_wentUp <= 1'b0; + end + if(logic_ptr_doPush) begin + logic_ptr_push <= (logic_ptr_push + 3'b001); + end + if(logic_ptr_doPop) begin + logic_ptr_pop <= (logic_ptr_pop + 3'b001); + end + if(io_flush) begin + logic_ptr_push <= 3'b000; + logic_ptr_pop <= 3'b000; + end + end + end + + +endmodule diff --git a/rtl/ip/Bus_interconnects/Axi_CDC.v b/rtl/ip/Bus_interconnects/Axi_CDC.v new file mode 100644 index 0000000..572d826 --- /dev/null +++ b/rtl/ip/Bus_interconnects/Axi_CDC.v @@ -0,0 +1,1608 @@ +// Generator : SpinalHDL v1.10.1 git head : 2527c7c6b0fb0f95e5e1a5722a0be732b364ce43 +// Component : Axi_CDC + +`timescale 1ns/1ps + +module Axi_CDC ( + input wire axiInClk, + input wire axiInRstn, + input wire axiOutClk, + input wire axiOutRstn, + input wire axiIn_awvalid, + output wire axiIn_awready, + input wire [31:0] axiIn_awaddr, + input wire [4:0] axiIn_awid, + input wire [7:0] axiIn_awlen, + input wire [2:0] axiIn_awsize, + input wire [1:0] axiIn_awburst, + input wire [0:0] axiIn_awlock, + input wire [3:0] axiIn_awcache, + input wire [2:0] axiIn_awprot, + input wire axiIn_wvalid, + output wire axiIn_wready, + input wire [31:0] axiIn_wdata, + input wire [3:0] axiIn_wstrb, + input wire axiIn_wlast, + output wire axiIn_bvalid, + input wire axiIn_bready, + output wire [4:0] axiIn_bid, + output wire [1:0] axiIn_bresp, + input wire axiIn_arvalid, + output wire axiIn_arready, + input wire [31:0] axiIn_araddr, + input wire [4:0] axiIn_arid, + input wire [7:0] axiIn_arlen, + input wire [2:0] axiIn_arsize, + input wire [1:0] axiIn_arburst, + input wire [0:0] axiIn_arlock, + input wire [3:0] axiIn_arcache, + input wire [2:0] axiIn_arprot, + output wire axiIn_rvalid, + input wire axiIn_rready, + output wire [31:0] axiIn_rdata, + output wire [4:0] axiIn_rid, + output wire [1:0] axiIn_rresp, + output wire axiIn_rlast, + output wire axiOut_awvalid, + input wire axiOut_awready, + output wire [31:0] axiOut_awaddr, + output wire [4:0] axiOut_awid, + output wire [7:0] axiOut_awlen, + output wire [2:0] axiOut_awsize, + output wire [1:0] axiOut_awburst, + output wire [0:0] axiOut_awlock, + output wire [3:0] axiOut_awcache, + output wire [2:0] axiOut_awprot, + output wire axiOut_wvalid, + input wire axiOut_wready, + output wire [31:0] axiOut_wdata, + output wire [3:0] axiOut_wstrb, + output wire axiOut_wlast, + input wire axiOut_bvalid, + output wire axiOut_bready, + input wire [4:0] axiOut_bid, + input wire [1:0] axiOut_bresp, + output wire axiOut_arvalid, + input wire axiOut_arready, + output wire [31:0] axiOut_araddr, + output wire [4:0] axiOut_arid, + output wire [7:0] axiOut_arlen, + output wire [2:0] axiOut_arsize, + output wire [1:0] axiOut_arburst, + output wire [0:0] axiOut_arlock, + output wire [3:0] axiOut_arcache, + output wire [2:0] axiOut_arprot, + input wire axiOut_rvalid, + output wire axiOut_rready, + input wire [31:0] axiOut_rdata, + input wire [4:0] axiOut_rid, + input wire [1:0] axiOut_rresp, + input wire axiOut_rlast +); + + wire awFifo_io_push_ready; + wire awFifo_io_pop_valid; + wire [31:0] awFifo_io_pop_payload_addr; + wire [4:0] awFifo_io_pop_payload_id; + wire [7:0] awFifo_io_pop_payload_len; + wire [2:0] awFifo_io_pop_payload_size; + wire [1:0] awFifo_io_pop_payload_burst; + wire [0:0] awFifo_io_pop_payload_lock; + wire [3:0] awFifo_io_pop_payload_cache; + wire [2:0] awFifo_io_pop_payload_prot; + wire [2:0] awFifo_io_pushOccupancy; + wire [2:0] awFifo_io_popOccupancy; + wire awFifo_awFifo_toplevel_axiInRstn_syncronized_1; + wire wFifo_io_push_ready; + wire wFifo_io_pop_valid; + wire [31:0] wFifo_io_pop_payload_data; + wire [3:0] wFifo_io_pop_payload_strb; + wire wFifo_io_pop_payload_last; + wire [3:0] wFifo_io_pushOccupancy; + wire [3:0] wFifo_io_popOccupancy; + wire bFifo_io_push_ready; + wire bFifo_io_pop_valid; + wire [4:0] bFifo_io_pop_payload_id; + wire [1:0] bFifo_io_pop_payload_resp; + wire [2:0] bFifo_io_pushOccupancy; + wire [2:0] bFifo_io_popOccupancy; + wire bFifo_bFifo_toplevel_axiOutRstn_syncronized_1; + wire arFifo_io_push_ready; + wire arFifo_io_pop_valid; + wire [31:0] arFifo_io_pop_payload_addr; + wire [4:0] arFifo_io_pop_payload_id; + wire [7:0] arFifo_io_pop_payload_len; + wire [2:0] arFifo_io_pop_payload_size; + wire [1:0] arFifo_io_pop_payload_burst; + wire [0:0] arFifo_io_pop_payload_lock; + wire [3:0] arFifo_io_pop_payload_cache; + wire [2:0] arFifo_io_pop_payload_prot; + wire [2:0] arFifo_io_pushOccupancy; + wire [2:0] arFifo_io_popOccupancy; + wire rFifo_io_push_ready; + wire rFifo_io_pop_valid; + wire [31:0] rFifo_io_pop_payload_data; + wire [4:0] rFifo_io_pop_payload_id; + wire [1:0] rFifo_io_pop_payload_resp; + wire rFifo_io_pop_payload_last; + wire [3:0] rFifo_io_pushOccupancy; + wire [3:0] rFifo_io_popOccupancy; + + StreamFifoCC awFifo ( + .io_push_valid (axiIn_awvalid ), //i + .io_push_ready (awFifo_io_push_ready ), //o + .io_push_payload_addr (axiIn_awaddr[31:0] ), //i + .io_push_payload_id (axiIn_awid[4:0] ), //i + .io_push_payload_len (axiIn_awlen[7:0] ), //i + .io_push_payload_size (axiIn_awsize[2:0] ), //i + .io_push_payload_burst (axiIn_awburst[1:0] ), //i + .io_push_payload_lock (axiIn_awlock ), //i + .io_push_payload_cache (axiIn_awcache[3:0] ), //i + .io_push_payload_prot (axiIn_awprot[2:0] ), //i + .io_pop_valid (awFifo_io_pop_valid ), //o + .io_pop_ready (axiOut_awready ), //i + .io_pop_payload_addr (awFifo_io_pop_payload_addr[31:0] ), //o + .io_pop_payload_id (awFifo_io_pop_payload_id[4:0] ), //o + .io_pop_payload_len (awFifo_io_pop_payload_len[7:0] ), //o + .io_pop_payload_size (awFifo_io_pop_payload_size[2:0] ), //o + .io_pop_payload_burst (awFifo_io_pop_payload_burst[1:0] ), //o + .io_pop_payload_lock (awFifo_io_pop_payload_lock ), //o + .io_pop_payload_cache (awFifo_io_pop_payload_cache[3:0] ), //o + .io_pop_payload_prot (awFifo_io_pop_payload_prot[2:0] ), //o + .io_pushOccupancy (awFifo_io_pushOccupancy[2:0] ), //o + .io_popOccupancy (awFifo_io_popOccupancy[2:0] ), //o + .axiInClk (axiInClk ), //i + .axiInRstn (axiInRstn ), //i + .axiOutClk (axiOutClk ), //i + .awFifo_toplevel_axiInRstn_syncronized_1 (awFifo_awFifo_toplevel_axiInRstn_syncronized_1) //o + ); + StreamFifoCC_1 wFifo ( + .io_push_valid (axiIn_wvalid ), //i + .io_push_ready (wFifo_io_push_ready ), //o + .io_push_payload_data (axiIn_wdata[31:0] ), //i + .io_push_payload_strb (axiIn_wstrb[3:0] ), //i + .io_push_payload_last (axiIn_wlast ), //i + .io_pop_valid (wFifo_io_pop_valid ), //o + .io_pop_ready (axiOut_wready ), //i + .io_pop_payload_data (wFifo_io_pop_payload_data[31:0] ), //o + .io_pop_payload_strb (wFifo_io_pop_payload_strb[3:0] ), //o + .io_pop_payload_last (wFifo_io_pop_payload_last ), //o + .io_pushOccupancy (wFifo_io_pushOccupancy[3:0] ), //o + .io_popOccupancy (wFifo_io_popOccupancy[3:0] ), //o + .axiInClk (axiInClk ), //i + .axiInRstn (axiInRstn ), //i + .axiOutClk (axiOutClk ), //i + .awFifo_toplevel_axiInRstn_syncronized (awFifo_awFifo_toplevel_axiInRstn_syncronized_1) //i + ); + StreamFifoCC_2 bFifo ( + .io_push_valid (axiOut_bvalid ), //i + .io_push_ready (bFifo_io_push_ready ), //o + .io_push_payload_id (axiOut_bid[4:0] ), //i + .io_push_payload_resp (axiOut_bresp[1:0] ), //i + .io_pop_valid (bFifo_io_pop_valid ), //o + .io_pop_ready (axiIn_bready ), //i + .io_pop_payload_id (bFifo_io_pop_payload_id[4:0] ), //o + .io_pop_payload_resp (bFifo_io_pop_payload_resp[1:0] ), //o + .io_pushOccupancy (bFifo_io_pushOccupancy[2:0] ), //o + .io_popOccupancy (bFifo_io_popOccupancy[2:0] ), //o + .axiOutClk (axiOutClk ), //i + .axiOutRstn (axiOutRstn ), //i + .axiInClk (axiInClk ), //i + .bFifo_toplevel_axiOutRstn_syncronized_1 (bFifo_bFifo_toplevel_axiOutRstn_syncronized_1) //o + ); + StreamFifoCC_3 arFifo ( + .io_push_valid (axiIn_arvalid ), //i + .io_push_ready (arFifo_io_push_ready ), //o + .io_push_payload_addr (axiIn_araddr[31:0] ), //i + .io_push_payload_id (axiIn_arid[4:0] ), //i + .io_push_payload_len (axiIn_arlen[7:0] ), //i + .io_push_payload_size (axiIn_arsize[2:0] ), //i + .io_push_payload_burst (axiIn_arburst[1:0] ), //i + .io_push_payload_lock (axiIn_arlock ), //i + .io_push_payload_cache (axiIn_arcache[3:0] ), //i + .io_push_payload_prot (axiIn_arprot[2:0] ), //i + .io_pop_valid (arFifo_io_pop_valid ), //o + .io_pop_ready (axiOut_arready ), //i + .io_pop_payload_addr (arFifo_io_pop_payload_addr[31:0] ), //o + .io_pop_payload_id (arFifo_io_pop_payload_id[4:0] ), //o + .io_pop_payload_len (arFifo_io_pop_payload_len[7:0] ), //o + .io_pop_payload_size (arFifo_io_pop_payload_size[2:0] ), //o + .io_pop_payload_burst (arFifo_io_pop_payload_burst[1:0] ), //o + .io_pop_payload_lock (arFifo_io_pop_payload_lock ), //o + .io_pop_payload_cache (arFifo_io_pop_payload_cache[3:0] ), //o + .io_pop_payload_prot (arFifo_io_pop_payload_prot[2:0] ), //o + .io_pushOccupancy (arFifo_io_pushOccupancy[2:0] ), //o + .io_popOccupancy (arFifo_io_popOccupancy[2:0] ), //o + .axiInClk (axiInClk ), //i + .axiInRstn (axiInRstn ), //i + .axiOutClk (axiOutClk ), //i + .awFifo_toplevel_axiInRstn_syncronized (awFifo_awFifo_toplevel_axiInRstn_syncronized_1) //i + ); + StreamFifoCC_4 rFifo ( + .io_push_valid (axiOut_rvalid ), //i + .io_push_ready (rFifo_io_push_ready ), //o + .io_push_payload_data (axiOut_rdata[31:0] ), //i + .io_push_payload_id (axiOut_rid[4:0] ), //i + .io_push_payload_resp (axiOut_rresp[1:0] ), //i + .io_push_payload_last (axiOut_rlast ), //i + .io_pop_valid (rFifo_io_pop_valid ), //o + .io_pop_ready (axiIn_rready ), //i + .io_pop_payload_data (rFifo_io_pop_payload_data[31:0] ), //o + .io_pop_payload_id (rFifo_io_pop_payload_id[4:0] ), //o + .io_pop_payload_resp (rFifo_io_pop_payload_resp[1:0] ), //o + .io_pop_payload_last (rFifo_io_pop_payload_last ), //o + .io_pushOccupancy (rFifo_io_pushOccupancy[3:0] ), //o + .io_popOccupancy (rFifo_io_popOccupancy[3:0] ), //o + .axiOutClk (axiOutClk ), //i + .axiOutRstn (axiOutRstn ), //i + .axiInClk (axiInClk ), //i + .bFifo_toplevel_axiOutRstn_syncronized (bFifo_bFifo_toplevel_axiOutRstn_syncronized_1) //i + ); + assign axiIn_awready = awFifo_io_push_ready; + assign axiOut_awvalid = awFifo_io_pop_valid; + assign axiOut_awaddr = awFifo_io_pop_payload_addr; + assign axiOut_awid = awFifo_io_pop_payload_id; + assign axiOut_awlen = awFifo_io_pop_payload_len; + assign axiOut_awsize = awFifo_io_pop_payload_size; + assign axiOut_awburst = awFifo_io_pop_payload_burst; + assign axiOut_awlock = awFifo_io_pop_payload_lock; + assign axiOut_awcache = awFifo_io_pop_payload_cache; + assign axiOut_awprot = awFifo_io_pop_payload_prot; + assign axiIn_wready = wFifo_io_push_ready; + assign axiOut_wvalid = wFifo_io_pop_valid; + assign axiOut_wdata = wFifo_io_pop_payload_data; + assign axiOut_wstrb = wFifo_io_pop_payload_strb; + assign axiOut_wlast = wFifo_io_pop_payload_last; + assign axiOut_bready = bFifo_io_push_ready; + assign axiIn_bvalid = bFifo_io_pop_valid; + assign axiIn_bid = bFifo_io_pop_payload_id; + assign axiIn_bresp = bFifo_io_pop_payload_resp; + assign axiIn_arready = arFifo_io_push_ready; + assign axiOut_arvalid = arFifo_io_pop_valid; + assign axiOut_araddr = arFifo_io_pop_payload_addr; + assign axiOut_arid = arFifo_io_pop_payload_id; + assign axiOut_arlen = arFifo_io_pop_payload_len; + assign axiOut_arsize = arFifo_io_pop_payload_size; + assign axiOut_arburst = arFifo_io_pop_payload_burst; + assign axiOut_arlock = arFifo_io_pop_payload_lock; + assign axiOut_arcache = arFifo_io_pop_payload_cache; + assign axiOut_arprot = arFifo_io_pop_payload_prot; + assign axiOut_rready = rFifo_io_push_ready; + assign axiIn_rvalid = rFifo_io_pop_valid; + assign axiIn_rdata = rFifo_io_pop_payload_data; + assign axiIn_rid = rFifo_io_pop_payload_id; + assign axiIn_rresp = rFifo_io_pop_payload_resp; + assign axiIn_rlast = rFifo_io_pop_payload_last; + +endmodule + +module StreamFifoCC_4 ( + input wire io_push_valid, + output wire io_push_ready, + input wire [31:0] io_push_payload_data, + input wire [4:0] io_push_payload_id, + input wire [1:0] io_push_payload_resp, + input wire io_push_payload_last, + output wire io_pop_valid, + input wire io_pop_ready, + output wire [31:0] io_pop_payload_data, + output wire [4:0] io_pop_payload_id, + output wire [1:0] io_pop_payload_resp, + output wire io_pop_payload_last, + output wire [3:0] io_pushOccupancy, + output wire [3:0] io_popOccupancy, + input wire axiOutClk, + input wire axiOutRstn, + input wire axiInClk, + input wire bFifo_toplevel_axiOutRstn_syncronized +); + + reg [39:0] _zz_ram_port1; + wire [3:0] popToPushGray_buffercc_io_dataOut; + wire [3:0] pushToPopGray_buffercc_io_dataOut; + wire [3:0] _zz_pushCC_pushPtrGray; + wire [2:0] _zz_ram_port; + wire [39:0] _zz_ram_port_1; + wire [3:0] _zz_popCC_popPtrGray; + reg _zz_1; + wire [3:0] popToPushGray; + wire [3:0] pushToPopGray; + reg [3:0] pushCC_pushPtr; + wire [3:0] pushCC_pushPtrPlus; + wire io_push_fire; + reg [3:0] pushCC_pushPtrGray; + wire [3:0] pushCC_popPtrGray; + wire pushCC_full; + wire _zz_io_pushOccupancy; + wire _zz_io_pushOccupancy_1; + wire _zz_io_pushOccupancy_2; + reg [3:0] popCC_popPtr; + (* keep , syn_keep *) wire [3:0] popCC_popPtrPlus /* synthesis syn_keep = 1 */ ; + wire [3:0] popCC_popPtrGray; + wire [3:0] popCC_pushPtrGray; + wire popCC_addressGen_valid; + reg popCC_addressGen_ready; + wire [2:0] popCC_addressGen_payload; + wire popCC_empty; + wire popCC_addressGen_fire; + wire popCC_readArbitation_valid; + wire popCC_readArbitation_ready; + wire [2:0] popCC_readArbitation_payload; + reg popCC_addressGen_rValid; + reg [2:0] popCC_addressGen_rData; + wire when_Stream_l369; + wire popCC_readPort_cmd_valid; + wire [2:0] popCC_readPort_cmd_payload; + wire [31:0] popCC_readPort_rsp_data; + wire [4:0] popCC_readPort_rsp_id; + wire [1:0] popCC_readPort_rsp_resp; + wire popCC_readPort_rsp_last; + wire [39:0] _zz_popCC_readPort_rsp_data; + wire popCC_readArbitation_translated_valid; + wire popCC_readArbitation_translated_ready; + wire [31:0] popCC_readArbitation_translated_payload_data; + wire [4:0] popCC_readArbitation_translated_payload_id; + wire [1:0] popCC_readArbitation_translated_payload_resp; + wire popCC_readArbitation_translated_payload_last; + wire popCC_readArbitation_fire; + reg [3:0] popCC_ptrToPush; + reg [3:0] popCC_ptrToOccupancy; + wire _zz_io_popOccupancy; + wire _zz_io_popOccupancy_1; + wire _zz_io_popOccupancy_2; + reg [39:0] ram [0:7]; + + assign _zz_pushCC_pushPtrGray = (pushCC_pushPtrPlus >>> 1'b1); + assign _zz_ram_port = pushCC_pushPtr[2:0]; + assign _zz_popCC_popPtrGray = (popCC_popPtr >>> 1'b1); + assign _zz_ram_port_1 = {io_push_payload_last,{io_push_payload_resp,{io_push_payload_id,io_push_payload_data}}}; + always @(posedge axiOutClk) begin + if(_zz_1) begin + ram[_zz_ram_port] <= _zz_ram_port_1; + end + end + + always @(posedge axiInClk) begin + if(popCC_readPort_cmd_valid) begin + _zz_ram_port1 <= ram[popCC_readPort_cmd_payload]; + end + end + + BufferCC popToPushGray_buffercc ( + .io_dataIn (popToPushGray[3:0] ), //i + .io_dataOut (popToPushGray_buffercc_io_dataOut[3:0]), //o + .axiOutClk (axiOutClk ), //i + .axiOutRstn (axiOutRstn ) //i + ); + BufferCC_1 pushToPopGray_buffercc ( + .io_dataIn (pushToPopGray[3:0] ), //i + .io_dataOut (pushToPopGray_buffercc_io_dataOut[3:0]), //o + .axiInClk (axiInClk ), //i + .bFifo_toplevel_axiOutRstn_syncronized (bFifo_toplevel_axiOutRstn_syncronized ) //i + ); + always @(*) begin + _zz_1 = 1'b0; + if(io_push_fire) begin + _zz_1 = 1'b1; + end + end + + assign pushCC_pushPtrPlus = (pushCC_pushPtr + 4'b0001); + assign io_push_fire = (io_push_valid && io_push_ready); + assign pushCC_popPtrGray = popToPushGray_buffercc_io_dataOut; + assign pushCC_full = ((pushCC_pushPtrGray[3 : 2] == (~ pushCC_popPtrGray[3 : 2])) && (pushCC_pushPtrGray[1 : 0] == pushCC_popPtrGray[1 : 0])); + assign io_push_ready = (! pushCC_full); + assign _zz_io_pushOccupancy = (pushCC_popPtrGray[1] ^ _zz_io_pushOccupancy_1); + assign _zz_io_pushOccupancy_1 = (pushCC_popPtrGray[2] ^ _zz_io_pushOccupancy_2); + assign _zz_io_pushOccupancy_2 = pushCC_popPtrGray[3]; + assign io_pushOccupancy = (pushCC_pushPtr - {_zz_io_pushOccupancy_2,{_zz_io_pushOccupancy_1,{_zz_io_pushOccupancy,(pushCC_popPtrGray[0] ^ _zz_io_pushOccupancy)}}}); + assign popCC_popPtrPlus = (popCC_popPtr + 4'b0001); + assign popCC_popPtrGray = (_zz_popCC_popPtrGray ^ popCC_popPtr); + assign popCC_pushPtrGray = pushToPopGray_buffercc_io_dataOut; + assign popCC_empty = (popCC_popPtrGray == popCC_pushPtrGray); + assign popCC_addressGen_valid = (! popCC_empty); + assign popCC_addressGen_payload = popCC_popPtr[2:0]; + assign popCC_addressGen_fire = (popCC_addressGen_valid && popCC_addressGen_ready); + always @(*) begin + popCC_addressGen_ready = popCC_readArbitation_ready; + if(when_Stream_l369) begin + popCC_addressGen_ready = 1'b1; + end + end + + assign when_Stream_l369 = (! popCC_readArbitation_valid); + assign popCC_readArbitation_valid = popCC_addressGen_rValid; + assign popCC_readArbitation_payload = popCC_addressGen_rData; + assign _zz_popCC_readPort_rsp_data = _zz_ram_port1; + assign popCC_readPort_rsp_data = _zz_popCC_readPort_rsp_data[31 : 0]; + assign popCC_readPort_rsp_id = _zz_popCC_readPort_rsp_data[36 : 32]; + assign popCC_readPort_rsp_resp = _zz_popCC_readPort_rsp_data[38 : 37]; + assign popCC_readPort_rsp_last = _zz_popCC_readPort_rsp_data[39]; + assign popCC_readPort_cmd_valid = popCC_addressGen_fire; + assign popCC_readPort_cmd_payload = popCC_addressGen_payload; + assign popCC_readArbitation_translated_valid = popCC_readArbitation_valid; + assign popCC_readArbitation_ready = popCC_readArbitation_translated_ready; + assign popCC_readArbitation_translated_payload_data = popCC_readPort_rsp_data; + assign popCC_readArbitation_translated_payload_id = popCC_readPort_rsp_id; + assign popCC_readArbitation_translated_payload_resp = popCC_readPort_rsp_resp; + assign popCC_readArbitation_translated_payload_last = popCC_readPort_rsp_last; + assign io_pop_valid = popCC_readArbitation_translated_valid; + assign popCC_readArbitation_translated_ready = io_pop_ready; + assign io_pop_payload_data = popCC_readArbitation_translated_payload_data; + assign io_pop_payload_id = popCC_readArbitation_translated_payload_id; + assign io_pop_payload_resp = popCC_readArbitation_translated_payload_resp; + assign io_pop_payload_last = popCC_readArbitation_translated_payload_last; + assign popCC_readArbitation_fire = (popCC_readArbitation_valid && popCC_readArbitation_ready); + assign _zz_io_popOccupancy = (popCC_pushPtrGray[1] ^ _zz_io_popOccupancy_1); + assign _zz_io_popOccupancy_1 = (popCC_pushPtrGray[2] ^ _zz_io_popOccupancy_2); + assign _zz_io_popOccupancy_2 = popCC_pushPtrGray[3]; + assign io_popOccupancy = ({_zz_io_popOccupancy_2,{_zz_io_popOccupancy_1,{_zz_io_popOccupancy,(popCC_pushPtrGray[0] ^ _zz_io_popOccupancy)}}} - popCC_ptrToOccupancy); + assign pushToPopGray = pushCC_pushPtrGray; + assign popToPushGray = popCC_ptrToPush; + always @(posedge axiOutClk or negedge axiOutRstn) begin + if(!axiOutRstn) begin + pushCC_pushPtr <= 4'b0000; + pushCC_pushPtrGray <= 4'b0000; + end else begin + if(io_push_fire) begin + pushCC_pushPtrGray <= (_zz_pushCC_pushPtrGray ^ pushCC_pushPtrPlus); + end + if(io_push_fire) begin + pushCC_pushPtr <= pushCC_pushPtrPlus; + end + end + end + + always @(posedge axiInClk or negedge bFifo_toplevel_axiOutRstn_syncronized) begin + if(!bFifo_toplevel_axiOutRstn_syncronized) begin + popCC_popPtr <= 4'b0000; + popCC_addressGen_rValid <= 1'b0; + popCC_ptrToPush <= 4'b0000; + popCC_ptrToOccupancy <= 4'b0000; + end else begin + if(popCC_addressGen_fire) begin + popCC_popPtr <= popCC_popPtrPlus; + end + if(popCC_addressGen_ready) begin + popCC_addressGen_rValid <= popCC_addressGen_valid; + end + if(popCC_readArbitation_fire) begin + popCC_ptrToPush <= popCC_popPtrGray; + end + if(popCC_readArbitation_fire) begin + popCC_ptrToOccupancy <= popCC_popPtr; + end + end + end + + always @(posedge axiInClk) begin + if(popCC_addressGen_ready) begin + popCC_addressGen_rData <= popCC_addressGen_payload; + end + end + + +endmodule + +module StreamFifoCC_3 ( + input wire io_push_valid, + output wire io_push_ready, + input wire [31:0] io_push_payload_addr, + input wire [4:0] io_push_payload_id, + input wire [7:0] io_push_payload_len, + input wire [2:0] io_push_payload_size, + input wire [1:0] io_push_payload_burst, + input wire [0:0] io_push_payload_lock, + input wire [3:0] io_push_payload_cache, + input wire [2:0] io_push_payload_prot, + output wire io_pop_valid, + input wire io_pop_ready, + output wire [31:0] io_pop_payload_addr, + output wire [4:0] io_pop_payload_id, + output wire [7:0] io_pop_payload_len, + output wire [2:0] io_pop_payload_size, + output wire [1:0] io_pop_payload_burst, + output wire [0:0] io_pop_payload_lock, + output wire [3:0] io_pop_payload_cache, + output wire [2:0] io_pop_payload_prot, + output wire [2:0] io_pushOccupancy, + output wire [2:0] io_popOccupancy, + input wire axiInClk, + input wire axiInRstn, + input wire axiOutClk, + input wire awFifo_toplevel_axiInRstn_syncronized +); + + reg [57:0] _zz_ram_port1; + wire [2:0] popToPushGray_buffercc_io_dataOut; + wire [2:0] pushToPopGray_buffercc_io_dataOut; + wire [2:0] _zz_pushCC_pushPtrGray; + wire [1:0] _zz_ram_port; + wire [57:0] _zz_ram_port_1; + wire [2:0] _zz_popCC_popPtrGray; + reg _zz_1; + wire [2:0] popToPushGray; + wire [2:0] pushToPopGray; + reg [2:0] pushCC_pushPtr; + wire [2:0] pushCC_pushPtrPlus; + wire io_push_fire; + reg [2:0] pushCC_pushPtrGray; + wire [2:0] pushCC_popPtrGray; + wire pushCC_full; + wire _zz_io_pushOccupancy; + wire _zz_io_pushOccupancy_1; + reg [2:0] popCC_popPtr; + (* keep , syn_keep *) wire [2:0] popCC_popPtrPlus /* synthesis syn_keep = 1 */ ; + wire [2:0] popCC_popPtrGray; + wire [2:0] popCC_pushPtrGray; + wire popCC_addressGen_valid; + reg popCC_addressGen_ready; + wire [1:0] popCC_addressGen_payload; + wire popCC_empty; + wire popCC_addressGen_fire; + wire popCC_readArbitation_valid; + wire popCC_readArbitation_ready; + wire [1:0] popCC_readArbitation_payload; + reg popCC_addressGen_rValid; + reg [1:0] popCC_addressGen_rData; + wire when_Stream_l369; + wire popCC_readPort_cmd_valid; + wire [1:0] popCC_readPort_cmd_payload; + wire [31:0] popCC_readPort_rsp_addr; + wire [4:0] popCC_readPort_rsp_id; + wire [7:0] popCC_readPort_rsp_len; + wire [2:0] popCC_readPort_rsp_size; + wire [1:0] popCC_readPort_rsp_burst; + wire [0:0] popCC_readPort_rsp_lock; + wire [3:0] popCC_readPort_rsp_cache; + wire [2:0] popCC_readPort_rsp_prot; + wire [57:0] _zz_popCC_readPort_rsp_addr; + wire popCC_readArbitation_translated_valid; + wire popCC_readArbitation_translated_ready; + wire [31:0] popCC_readArbitation_translated_payload_addr; + wire [4:0] popCC_readArbitation_translated_payload_id; + wire [7:0] popCC_readArbitation_translated_payload_len; + wire [2:0] popCC_readArbitation_translated_payload_size; + wire [1:0] popCC_readArbitation_translated_payload_burst; + wire [0:0] popCC_readArbitation_translated_payload_lock; + wire [3:0] popCC_readArbitation_translated_payload_cache; + wire [2:0] popCC_readArbitation_translated_payload_prot; + wire popCC_readArbitation_fire; + reg [2:0] popCC_ptrToPush; + reg [2:0] popCC_ptrToOccupancy; + wire _zz_io_popOccupancy; + wire _zz_io_popOccupancy_1; + reg [57:0] ram [0:3]; + + assign _zz_pushCC_pushPtrGray = (pushCC_pushPtrPlus >>> 1'b1); + assign _zz_ram_port = pushCC_pushPtr[1:0]; + assign _zz_popCC_popPtrGray = (popCC_popPtr >>> 1'b1); + assign _zz_ram_port_1 = {io_push_payload_prot,{io_push_payload_cache,{io_push_payload_lock,{io_push_payload_burst,{io_push_payload_size,{io_push_payload_len,{io_push_payload_id,io_push_payload_addr}}}}}}}; + always @(posedge axiInClk) begin + if(_zz_1) begin + ram[_zz_ram_port] <= _zz_ram_port_1; + end + end + + always @(posedge axiOutClk) begin + if(popCC_readPort_cmd_valid) begin + _zz_ram_port1 <= ram[popCC_readPort_cmd_payload]; + end + end + + BufferCC_9 popToPushGray_buffercc ( + .io_dataIn (popToPushGray[2:0] ), //i + .io_dataOut (popToPushGray_buffercc_io_dataOut[2:0]), //o + .axiInClk (axiInClk ), //i + .axiInRstn (axiInRstn ) //i + ); + BufferCC_11 pushToPopGray_buffercc ( + .io_dataIn (pushToPopGray[2:0] ), //i + .io_dataOut (pushToPopGray_buffercc_io_dataOut[2:0]), //o + .axiOutClk (axiOutClk ), //i + .awFifo_toplevel_axiInRstn_syncronized (awFifo_toplevel_axiInRstn_syncronized ) //i + ); + always @(*) begin + _zz_1 = 1'b0; + if(io_push_fire) begin + _zz_1 = 1'b1; + end + end + + assign pushCC_pushPtrPlus = (pushCC_pushPtr + 3'b001); + assign io_push_fire = (io_push_valid && io_push_ready); + assign pushCC_popPtrGray = popToPushGray_buffercc_io_dataOut; + assign pushCC_full = ((pushCC_pushPtrGray[2 : 1] == (~ pushCC_popPtrGray[2 : 1])) && (pushCC_pushPtrGray[0 : 0] == pushCC_popPtrGray[0 : 0])); + assign io_push_ready = (! pushCC_full); + assign _zz_io_pushOccupancy = (pushCC_popPtrGray[1] ^ _zz_io_pushOccupancy_1); + assign _zz_io_pushOccupancy_1 = pushCC_popPtrGray[2]; + assign io_pushOccupancy = (pushCC_pushPtr - {_zz_io_pushOccupancy_1,{_zz_io_pushOccupancy,(pushCC_popPtrGray[0] ^ _zz_io_pushOccupancy)}}); + assign popCC_popPtrPlus = (popCC_popPtr + 3'b001); + assign popCC_popPtrGray = (_zz_popCC_popPtrGray ^ popCC_popPtr); + assign popCC_pushPtrGray = pushToPopGray_buffercc_io_dataOut; + assign popCC_empty = (popCC_popPtrGray == popCC_pushPtrGray); + assign popCC_addressGen_valid = (! popCC_empty); + assign popCC_addressGen_payload = popCC_popPtr[1:0]; + assign popCC_addressGen_fire = (popCC_addressGen_valid && popCC_addressGen_ready); + always @(*) begin + popCC_addressGen_ready = popCC_readArbitation_ready; + if(when_Stream_l369) begin + popCC_addressGen_ready = 1'b1; + end + end + + assign when_Stream_l369 = (! popCC_readArbitation_valid); + assign popCC_readArbitation_valid = popCC_addressGen_rValid; + assign popCC_readArbitation_payload = popCC_addressGen_rData; + assign _zz_popCC_readPort_rsp_addr = _zz_ram_port1; + assign popCC_readPort_rsp_addr = _zz_popCC_readPort_rsp_addr[31 : 0]; + assign popCC_readPort_rsp_id = _zz_popCC_readPort_rsp_addr[36 : 32]; + assign popCC_readPort_rsp_len = _zz_popCC_readPort_rsp_addr[44 : 37]; + assign popCC_readPort_rsp_size = _zz_popCC_readPort_rsp_addr[47 : 45]; + assign popCC_readPort_rsp_burst = _zz_popCC_readPort_rsp_addr[49 : 48]; + assign popCC_readPort_rsp_lock = _zz_popCC_readPort_rsp_addr[50 : 50]; + assign popCC_readPort_rsp_cache = _zz_popCC_readPort_rsp_addr[54 : 51]; + assign popCC_readPort_rsp_prot = _zz_popCC_readPort_rsp_addr[57 : 55]; + assign popCC_readPort_cmd_valid = popCC_addressGen_fire; + assign popCC_readPort_cmd_payload = popCC_addressGen_payload; + assign popCC_readArbitation_translated_valid = popCC_readArbitation_valid; + assign popCC_readArbitation_ready = popCC_readArbitation_translated_ready; + assign popCC_readArbitation_translated_payload_addr = popCC_readPort_rsp_addr; + assign popCC_readArbitation_translated_payload_id = popCC_readPort_rsp_id; + assign popCC_readArbitation_translated_payload_len = popCC_readPort_rsp_len; + assign popCC_readArbitation_translated_payload_size = popCC_readPort_rsp_size; + assign popCC_readArbitation_translated_payload_burst = popCC_readPort_rsp_burst; + assign popCC_readArbitation_translated_payload_lock = popCC_readPort_rsp_lock; + assign popCC_readArbitation_translated_payload_cache = popCC_readPort_rsp_cache; + assign popCC_readArbitation_translated_payload_prot = popCC_readPort_rsp_prot; + assign io_pop_valid = popCC_readArbitation_translated_valid; + assign popCC_readArbitation_translated_ready = io_pop_ready; + assign io_pop_payload_addr = popCC_readArbitation_translated_payload_addr; + assign io_pop_payload_id = popCC_readArbitation_translated_payload_id; + assign io_pop_payload_len = popCC_readArbitation_translated_payload_len; + assign io_pop_payload_size = popCC_readArbitation_translated_payload_size; + assign io_pop_payload_burst = popCC_readArbitation_translated_payload_burst; + assign io_pop_payload_lock = popCC_readArbitation_translated_payload_lock; + assign io_pop_payload_cache = popCC_readArbitation_translated_payload_cache; + assign io_pop_payload_prot = popCC_readArbitation_translated_payload_prot; + assign popCC_readArbitation_fire = (popCC_readArbitation_valid && popCC_readArbitation_ready); + assign _zz_io_popOccupancy = (popCC_pushPtrGray[1] ^ _zz_io_popOccupancy_1); + assign _zz_io_popOccupancy_1 = popCC_pushPtrGray[2]; + assign io_popOccupancy = ({_zz_io_popOccupancy_1,{_zz_io_popOccupancy,(popCC_pushPtrGray[0] ^ _zz_io_popOccupancy)}} - popCC_ptrToOccupancy); + assign pushToPopGray = pushCC_pushPtrGray; + assign popToPushGray = popCC_ptrToPush; + always @(posedge axiInClk or negedge axiInRstn) begin + if(!axiInRstn) begin + pushCC_pushPtr <= 3'b000; + pushCC_pushPtrGray <= 3'b000; + end else begin + if(io_push_fire) begin + pushCC_pushPtrGray <= (_zz_pushCC_pushPtrGray ^ pushCC_pushPtrPlus); + end + if(io_push_fire) begin + pushCC_pushPtr <= pushCC_pushPtrPlus; + end + end + end + + always @(posedge axiOutClk or negedge awFifo_toplevel_axiInRstn_syncronized) begin + if(!awFifo_toplevel_axiInRstn_syncronized) begin + popCC_popPtr <= 3'b000; + popCC_addressGen_rValid <= 1'b0; + popCC_ptrToPush <= 3'b000; + popCC_ptrToOccupancy <= 3'b000; + end else begin + if(popCC_addressGen_fire) begin + popCC_popPtr <= popCC_popPtrPlus; + end + if(popCC_addressGen_ready) begin + popCC_addressGen_rValid <= popCC_addressGen_valid; + end + if(popCC_readArbitation_fire) begin + popCC_ptrToPush <= popCC_popPtrGray; + end + if(popCC_readArbitation_fire) begin + popCC_ptrToOccupancy <= popCC_popPtr; + end + end + end + + always @(posedge axiOutClk) begin + if(popCC_addressGen_ready) begin + popCC_addressGen_rData <= popCC_addressGen_payload; + end + end + + +endmodule + +module StreamFifoCC_2 ( + input wire io_push_valid, + output wire io_push_ready, + input wire [4:0] io_push_payload_id, + input wire [1:0] io_push_payload_resp, + output wire io_pop_valid, + input wire io_pop_ready, + output wire [4:0] io_pop_payload_id, + output wire [1:0] io_pop_payload_resp, + output wire [2:0] io_pushOccupancy, + output wire [2:0] io_popOccupancy, + input wire axiOutClk, + input wire axiOutRstn, + input wire axiInClk, + output wire bFifo_toplevel_axiOutRstn_syncronized_1 +); + + wire bufferCC_12_io_dataIn; + reg [6:0] _zz_ram_port1; + wire [2:0] popToPushGray_buffercc_io_dataOut; + wire bufferCC_12_io_dataOut; + wire [2:0] pushToPopGray_buffercc_io_dataOut; + wire [2:0] _zz_pushCC_pushPtrGray; + wire [1:0] _zz_ram_port; + wire [6:0] _zz_ram_port_1; + wire [2:0] _zz_popCC_popPtrGray; + reg _zz_1; + wire [2:0] popToPushGray; + wire [2:0] pushToPopGray; + reg [2:0] pushCC_pushPtr; + wire [2:0] pushCC_pushPtrPlus; + wire io_push_fire; + reg [2:0] pushCC_pushPtrGray; + wire [2:0] pushCC_popPtrGray; + wire pushCC_full; + wire _zz_io_pushOccupancy; + wire _zz_io_pushOccupancy_1; + wire bFifo_toplevel_axiOutRstn_syncronized; + reg [2:0] popCC_popPtr; + (* keep , syn_keep *) wire [2:0] popCC_popPtrPlus /* synthesis syn_keep = 1 */ ; + wire [2:0] popCC_popPtrGray; + wire [2:0] popCC_pushPtrGray; + wire popCC_addressGen_valid; + reg popCC_addressGen_ready; + wire [1:0] popCC_addressGen_payload; + wire popCC_empty; + wire popCC_addressGen_fire; + wire popCC_readArbitation_valid; + wire popCC_readArbitation_ready; + wire [1:0] popCC_readArbitation_payload; + reg popCC_addressGen_rValid; + reg [1:0] popCC_addressGen_rData; + wire when_Stream_l369; + wire popCC_readPort_cmd_valid; + wire [1:0] popCC_readPort_cmd_payload; + wire [4:0] popCC_readPort_rsp_id; + wire [1:0] popCC_readPort_rsp_resp; + wire [6:0] _zz_popCC_readPort_rsp_id; + wire popCC_readArbitation_translated_valid; + wire popCC_readArbitation_translated_ready; + wire [4:0] popCC_readArbitation_translated_payload_id; + wire [1:0] popCC_readArbitation_translated_payload_resp; + wire popCC_readArbitation_fire; + reg [2:0] popCC_ptrToPush; + reg [2:0] popCC_ptrToOccupancy; + wire _zz_io_popOccupancy; + wire _zz_io_popOccupancy_1; + reg [6:0] ram [0:3]; + + assign _zz_pushCC_pushPtrGray = (pushCC_pushPtrPlus >>> 1'b1); + assign _zz_ram_port = pushCC_pushPtr[1:0]; + assign _zz_popCC_popPtrGray = (popCC_popPtr >>> 1'b1); + assign _zz_ram_port_1 = {io_push_payload_resp,io_push_payload_id}; + always @(posedge axiOutClk) begin + if(_zz_1) begin + ram[_zz_ram_port] <= _zz_ram_port_1; + end + end + + always @(posedge axiInClk) begin + if(popCC_readPort_cmd_valid) begin + _zz_ram_port1 <= ram[popCC_readPort_cmd_payload]; + end + end + + BufferCC_4 popToPushGray_buffercc ( + .io_dataIn (popToPushGray[2:0] ), //i + .io_dataOut (popToPushGray_buffercc_io_dataOut[2:0]), //o + .axiOutClk (axiOutClk ), //i + .axiOutRstn (axiOutRstn ) //i + ); + BufferCC_5 bufferCC_12 ( + .io_dataIn (bufferCC_12_io_dataIn ), //i + .io_dataOut (bufferCC_12_io_dataOut), //o + .axiInClk (axiInClk ), //i + .axiOutRstn (axiOutRstn ) //i + ); + BufferCC_6 pushToPopGray_buffercc ( + .io_dataIn (pushToPopGray[2:0] ), //i + .io_dataOut (pushToPopGray_buffercc_io_dataOut[2:0]), //o + .axiInClk (axiInClk ), //i + .bFifo_toplevel_axiOutRstn_syncronized (bFifo_toplevel_axiOutRstn_syncronized ) //i + ); + always @(*) begin + _zz_1 = 1'b0; + if(io_push_fire) begin + _zz_1 = 1'b1; + end + end + + assign pushCC_pushPtrPlus = (pushCC_pushPtr + 3'b001); + assign io_push_fire = (io_push_valid && io_push_ready); + assign pushCC_popPtrGray = popToPushGray_buffercc_io_dataOut; + assign pushCC_full = ((pushCC_pushPtrGray[2 : 1] == (~ pushCC_popPtrGray[2 : 1])) && (pushCC_pushPtrGray[0 : 0] == pushCC_popPtrGray[0 : 0])); + assign io_push_ready = (! pushCC_full); + assign _zz_io_pushOccupancy = (pushCC_popPtrGray[1] ^ _zz_io_pushOccupancy_1); + assign _zz_io_pushOccupancy_1 = pushCC_popPtrGray[2]; + assign io_pushOccupancy = (pushCC_pushPtr - {_zz_io_pushOccupancy_1,{_zz_io_pushOccupancy,(pushCC_popPtrGray[0] ^ _zz_io_pushOccupancy)}}); + assign bufferCC_12_io_dataIn = (1'b1 ^ 1'b0); + assign bFifo_toplevel_axiOutRstn_syncronized = bufferCC_12_io_dataOut; + assign popCC_popPtrPlus = (popCC_popPtr + 3'b001); + assign popCC_popPtrGray = (_zz_popCC_popPtrGray ^ popCC_popPtr); + assign popCC_pushPtrGray = pushToPopGray_buffercc_io_dataOut; + assign popCC_empty = (popCC_popPtrGray == popCC_pushPtrGray); + assign popCC_addressGen_valid = (! popCC_empty); + assign popCC_addressGen_payload = popCC_popPtr[1:0]; + assign popCC_addressGen_fire = (popCC_addressGen_valid && popCC_addressGen_ready); + always @(*) begin + popCC_addressGen_ready = popCC_readArbitation_ready; + if(when_Stream_l369) begin + popCC_addressGen_ready = 1'b1; + end + end + + assign when_Stream_l369 = (! popCC_readArbitation_valid); + assign popCC_readArbitation_valid = popCC_addressGen_rValid; + assign popCC_readArbitation_payload = popCC_addressGen_rData; + assign _zz_popCC_readPort_rsp_id = _zz_ram_port1; + assign popCC_readPort_rsp_id = _zz_popCC_readPort_rsp_id[4 : 0]; + assign popCC_readPort_rsp_resp = _zz_popCC_readPort_rsp_id[6 : 5]; + assign popCC_readPort_cmd_valid = popCC_addressGen_fire; + assign popCC_readPort_cmd_payload = popCC_addressGen_payload; + assign popCC_readArbitation_translated_valid = popCC_readArbitation_valid; + assign popCC_readArbitation_ready = popCC_readArbitation_translated_ready; + assign popCC_readArbitation_translated_payload_id = popCC_readPort_rsp_id; + assign popCC_readArbitation_translated_payload_resp = popCC_readPort_rsp_resp; + assign io_pop_valid = popCC_readArbitation_translated_valid; + assign popCC_readArbitation_translated_ready = io_pop_ready; + assign io_pop_payload_id = popCC_readArbitation_translated_payload_id; + assign io_pop_payload_resp = popCC_readArbitation_translated_payload_resp; + assign popCC_readArbitation_fire = (popCC_readArbitation_valid && popCC_readArbitation_ready); + assign _zz_io_popOccupancy = (popCC_pushPtrGray[1] ^ _zz_io_popOccupancy_1); + assign _zz_io_popOccupancy_1 = popCC_pushPtrGray[2]; + assign io_popOccupancy = ({_zz_io_popOccupancy_1,{_zz_io_popOccupancy,(popCC_pushPtrGray[0] ^ _zz_io_popOccupancy)}} - popCC_ptrToOccupancy); + assign pushToPopGray = pushCC_pushPtrGray; + assign popToPushGray = popCC_ptrToPush; + assign bFifo_toplevel_axiOutRstn_syncronized_1 = bFifo_toplevel_axiOutRstn_syncronized; + always @(posedge axiOutClk or negedge axiOutRstn) begin + if(!axiOutRstn) begin + pushCC_pushPtr <= 3'b000; + pushCC_pushPtrGray <= 3'b000; + end else begin + if(io_push_fire) begin + pushCC_pushPtrGray <= (_zz_pushCC_pushPtrGray ^ pushCC_pushPtrPlus); + end + if(io_push_fire) begin + pushCC_pushPtr <= pushCC_pushPtrPlus; + end + end + end + + always @(posedge axiInClk or negedge bFifo_toplevel_axiOutRstn_syncronized) begin + if(!bFifo_toplevel_axiOutRstn_syncronized) begin + popCC_popPtr <= 3'b000; + popCC_addressGen_rValid <= 1'b0; + popCC_ptrToPush <= 3'b000; + popCC_ptrToOccupancy <= 3'b000; + end else begin + if(popCC_addressGen_fire) begin + popCC_popPtr <= popCC_popPtrPlus; + end + if(popCC_addressGen_ready) begin + popCC_addressGen_rValid <= popCC_addressGen_valid; + end + if(popCC_readArbitation_fire) begin + popCC_ptrToPush <= popCC_popPtrGray; + end + if(popCC_readArbitation_fire) begin + popCC_ptrToOccupancy <= popCC_popPtr; + end + end + end + + always @(posedge axiInClk) begin + if(popCC_addressGen_ready) begin + popCC_addressGen_rData <= popCC_addressGen_payload; + end + end + + +endmodule + +module StreamFifoCC_1 ( + input wire io_push_valid, + output wire io_push_ready, + input wire [31:0] io_push_payload_data, + input wire [3:0] io_push_payload_strb, + input wire io_push_payload_last, + output wire io_pop_valid, + input wire io_pop_ready, + output wire [31:0] io_pop_payload_data, + output wire [3:0] io_pop_payload_strb, + output wire io_pop_payload_last, + output wire [3:0] io_pushOccupancy, + output wire [3:0] io_popOccupancy, + input wire axiInClk, + input wire axiInRstn, + input wire axiOutClk, + input wire awFifo_toplevel_axiInRstn_syncronized +); + + reg [36:0] _zz_ram_port1; + wire [3:0] popToPushGray_buffercc_io_dataOut; + wire [3:0] pushToPopGray_buffercc_io_dataOut; + wire [3:0] _zz_pushCC_pushPtrGray; + wire [2:0] _zz_ram_port; + wire [36:0] _zz_ram_port_1; + wire [3:0] _zz_popCC_popPtrGray; + reg _zz_1; + wire [3:0] popToPushGray; + wire [3:0] pushToPopGray; + reg [3:0] pushCC_pushPtr; + wire [3:0] pushCC_pushPtrPlus; + wire io_push_fire; + reg [3:0] pushCC_pushPtrGray; + wire [3:0] pushCC_popPtrGray; + wire pushCC_full; + wire _zz_io_pushOccupancy; + wire _zz_io_pushOccupancy_1; + wire _zz_io_pushOccupancy_2; + reg [3:0] popCC_popPtr; + (* keep , syn_keep *) wire [3:0] popCC_popPtrPlus /* synthesis syn_keep = 1 */ ; + wire [3:0] popCC_popPtrGray; + wire [3:0] popCC_pushPtrGray; + wire popCC_addressGen_valid; + reg popCC_addressGen_ready; + wire [2:0] popCC_addressGen_payload; + wire popCC_empty; + wire popCC_addressGen_fire; + wire popCC_readArbitation_valid; + wire popCC_readArbitation_ready; + wire [2:0] popCC_readArbitation_payload; + reg popCC_addressGen_rValid; + reg [2:0] popCC_addressGen_rData; + wire when_Stream_l369; + wire popCC_readPort_cmd_valid; + wire [2:0] popCC_readPort_cmd_payload; + wire [31:0] popCC_readPort_rsp_data; + wire [3:0] popCC_readPort_rsp_strb; + wire popCC_readPort_rsp_last; + wire [36:0] _zz_popCC_readPort_rsp_data; + wire popCC_readArbitation_translated_valid; + wire popCC_readArbitation_translated_ready; + wire [31:0] popCC_readArbitation_translated_payload_data; + wire [3:0] popCC_readArbitation_translated_payload_strb; + wire popCC_readArbitation_translated_payload_last; + wire popCC_readArbitation_fire; + reg [3:0] popCC_ptrToPush; + reg [3:0] popCC_ptrToOccupancy; + wire _zz_io_popOccupancy; + wire _zz_io_popOccupancy_1; + wire _zz_io_popOccupancy_2; + reg [36:0] ram [0:7]; + + assign _zz_pushCC_pushPtrGray = (pushCC_pushPtrPlus >>> 1'b1); + assign _zz_ram_port = pushCC_pushPtr[2:0]; + assign _zz_popCC_popPtrGray = (popCC_popPtr >>> 1'b1); + assign _zz_ram_port_1 = {io_push_payload_last,{io_push_payload_strb,io_push_payload_data}}; + always @(posedge axiInClk) begin + if(_zz_1) begin + ram[_zz_ram_port] <= _zz_ram_port_1; + end + end + + always @(posedge axiOutClk) begin + if(popCC_readPort_cmd_valid) begin + _zz_ram_port1 <= ram[popCC_readPort_cmd_payload]; + end + end + + BufferCC_7 popToPushGray_buffercc ( + .io_dataIn (popToPushGray[3:0] ), //i + .io_dataOut (popToPushGray_buffercc_io_dataOut[3:0]), //o + .axiInClk (axiInClk ), //i + .axiInRstn (axiInRstn ) //i + ); + BufferCC_8 pushToPopGray_buffercc ( + .io_dataIn (pushToPopGray[3:0] ), //i + .io_dataOut (pushToPopGray_buffercc_io_dataOut[3:0]), //o + .axiOutClk (axiOutClk ), //i + .awFifo_toplevel_axiInRstn_syncronized (awFifo_toplevel_axiInRstn_syncronized ) //i + ); + always @(*) begin + _zz_1 = 1'b0; + if(io_push_fire) begin + _zz_1 = 1'b1; + end + end + + assign pushCC_pushPtrPlus = (pushCC_pushPtr + 4'b0001); + assign io_push_fire = (io_push_valid && io_push_ready); + assign pushCC_popPtrGray = popToPushGray_buffercc_io_dataOut; + assign pushCC_full = ((pushCC_pushPtrGray[3 : 2] == (~ pushCC_popPtrGray[3 : 2])) && (pushCC_pushPtrGray[1 : 0] == pushCC_popPtrGray[1 : 0])); + assign io_push_ready = (! pushCC_full); + assign _zz_io_pushOccupancy = (pushCC_popPtrGray[1] ^ _zz_io_pushOccupancy_1); + assign _zz_io_pushOccupancy_1 = (pushCC_popPtrGray[2] ^ _zz_io_pushOccupancy_2); + assign _zz_io_pushOccupancy_2 = pushCC_popPtrGray[3]; + assign io_pushOccupancy = (pushCC_pushPtr - {_zz_io_pushOccupancy_2,{_zz_io_pushOccupancy_1,{_zz_io_pushOccupancy,(pushCC_popPtrGray[0] ^ _zz_io_pushOccupancy)}}}); + assign popCC_popPtrPlus = (popCC_popPtr + 4'b0001); + assign popCC_popPtrGray = (_zz_popCC_popPtrGray ^ popCC_popPtr); + assign popCC_pushPtrGray = pushToPopGray_buffercc_io_dataOut; + assign popCC_empty = (popCC_popPtrGray == popCC_pushPtrGray); + assign popCC_addressGen_valid = (! popCC_empty); + assign popCC_addressGen_payload = popCC_popPtr[2:0]; + assign popCC_addressGen_fire = (popCC_addressGen_valid && popCC_addressGen_ready); + always @(*) begin + popCC_addressGen_ready = popCC_readArbitation_ready; + if(when_Stream_l369) begin + popCC_addressGen_ready = 1'b1; + end + end + + assign when_Stream_l369 = (! popCC_readArbitation_valid); + assign popCC_readArbitation_valid = popCC_addressGen_rValid; + assign popCC_readArbitation_payload = popCC_addressGen_rData; + assign _zz_popCC_readPort_rsp_data = _zz_ram_port1; + assign popCC_readPort_rsp_data = _zz_popCC_readPort_rsp_data[31 : 0]; + assign popCC_readPort_rsp_strb = _zz_popCC_readPort_rsp_data[35 : 32]; + assign popCC_readPort_rsp_last = _zz_popCC_readPort_rsp_data[36]; + assign popCC_readPort_cmd_valid = popCC_addressGen_fire; + assign popCC_readPort_cmd_payload = popCC_addressGen_payload; + assign popCC_readArbitation_translated_valid = popCC_readArbitation_valid; + assign popCC_readArbitation_ready = popCC_readArbitation_translated_ready; + assign popCC_readArbitation_translated_payload_data = popCC_readPort_rsp_data; + assign popCC_readArbitation_translated_payload_strb = popCC_readPort_rsp_strb; + assign popCC_readArbitation_translated_payload_last = popCC_readPort_rsp_last; + assign io_pop_valid = popCC_readArbitation_translated_valid; + assign popCC_readArbitation_translated_ready = io_pop_ready; + assign io_pop_payload_data = popCC_readArbitation_translated_payload_data; + assign io_pop_payload_strb = popCC_readArbitation_translated_payload_strb; + assign io_pop_payload_last = popCC_readArbitation_translated_payload_last; + assign popCC_readArbitation_fire = (popCC_readArbitation_valid && popCC_readArbitation_ready); + assign _zz_io_popOccupancy = (popCC_pushPtrGray[1] ^ _zz_io_popOccupancy_1); + assign _zz_io_popOccupancy_1 = (popCC_pushPtrGray[2] ^ _zz_io_popOccupancy_2); + assign _zz_io_popOccupancy_2 = popCC_pushPtrGray[3]; + assign io_popOccupancy = ({_zz_io_popOccupancy_2,{_zz_io_popOccupancy_1,{_zz_io_popOccupancy,(popCC_pushPtrGray[0] ^ _zz_io_popOccupancy)}}} - popCC_ptrToOccupancy); + assign pushToPopGray = pushCC_pushPtrGray; + assign popToPushGray = popCC_ptrToPush; + always @(posedge axiInClk or negedge axiInRstn) begin + if(!axiInRstn) begin + pushCC_pushPtr <= 4'b0000; + pushCC_pushPtrGray <= 4'b0000; + end else begin + if(io_push_fire) begin + pushCC_pushPtrGray <= (_zz_pushCC_pushPtrGray ^ pushCC_pushPtrPlus); + end + if(io_push_fire) begin + pushCC_pushPtr <= pushCC_pushPtrPlus; + end + end + end + + always @(posedge axiOutClk or negedge awFifo_toplevel_axiInRstn_syncronized) begin + if(!awFifo_toplevel_axiInRstn_syncronized) begin + popCC_popPtr <= 4'b0000; + popCC_addressGen_rValid <= 1'b0; + popCC_ptrToPush <= 4'b0000; + popCC_ptrToOccupancy <= 4'b0000; + end else begin + if(popCC_addressGen_fire) begin + popCC_popPtr <= popCC_popPtrPlus; + end + if(popCC_addressGen_ready) begin + popCC_addressGen_rValid <= popCC_addressGen_valid; + end + if(popCC_readArbitation_fire) begin + popCC_ptrToPush <= popCC_popPtrGray; + end + if(popCC_readArbitation_fire) begin + popCC_ptrToOccupancy <= popCC_popPtr; + end + end + end + + always @(posedge axiOutClk) begin + if(popCC_addressGen_ready) begin + popCC_addressGen_rData <= popCC_addressGen_payload; + end + end + + +endmodule + +module StreamFifoCC ( + input wire io_push_valid, + output wire io_push_ready, + input wire [31:0] io_push_payload_addr, + input wire [4:0] io_push_payload_id, + input wire [7:0] io_push_payload_len, + input wire [2:0] io_push_payload_size, + input wire [1:0] io_push_payload_burst, + input wire [0:0] io_push_payload_lock, + input wire [3:0] io_push_payload_cache, + input wire [2:0] io_push_payload_prot, + output wire io_pop_valid, + input wire io_pop_ready, + output wire [31:0] io_pop_payload_addr, + output wire [4:0] io_pop_payload_id, + output wire [7:0] io_pop_payload_len, + output wire [2:0] io_pop_payload_size, + output wire [1:0] io_pop_payload_burst, + output wire [0:0] io_pop_payload_lock, + output wire [3:0] io_pop_payload_cache, + output wire [2:0] io_pop_payload_prot, + output wire [2:0] io_pushOccupancy, + output wire [2:0] io_popOccupancy, + input wire axiInClk, + input wire axiInRstn, + input wire axiOutClk, + output wire awFifo_toplevel_axiInRstn_syncronized_1 +); + + wire bufferCC_12_io_dataIn; + reg [57:0] _zz_ram_port1; + wire [2:0] popToPushGray_buffercc_io_dataOut; + wire bufferCC_12_io_dataOut; + wire [2:0] pushToPopGray_buffercc_io_dataOut; + wire [2:0] _zz_pushCC_pushPtrGray; + wire [1:0] _zz_ram_port; + wire [57:0] _zz_ram_port_1; + wire [2:0] _zz_popCC_popPtrGray; + reg _zz_1; + wire [2:0] popToPushGray; + wire [2:0] pushToPopGray; + reg [2:0] pushCC_pushPtr; + wire [2:0] pushCC_pushPtrPlus; + wire io_push_fire; + reg [2:0] pushCC_pushPtrGray; + wire [2:0] pushCC_popPtrGray; + wire pushCC_full; + wire _zz_io_pushOccupancy; + wire _zz_io_pushOccupancy_1; + wire awFifo_toplevel_axiInRstn_syncronized; + reg [2:0] popCC_popPtr; + (* keep , syn_keep *) wire [2:0] popCC_popPtrPlus /* synthesis syn_keep = 1 */ ; + wire [2:0] popCC_popPtrGray; + wire [2:0] popCC_pushPtrGray; + wire popCC_addressGen_valid; + reg popCC_addressGen_ready; + wire [1:0] popCC_addressGen_payload; + wire popCC_empty; + wire popCC_addressGen_fire; + wire popCC_readArbitation_valid; + wire popCC_readArbitation_ready; + wire [1:0] popCC_readArbitation_payload; + reg popCC_addressGen_rValid; + reg [1:0] popCC_addressGen_rData; + wire when_Stream_l369; + wire popCC_readPort_cmd_valid; + wire [1:0] popCC_readPort_cmd_payload; + wire [31:0] popCC_readPort_rsp_addr; + wire [4:0] popCC_readPort_rsp_id; + wire [7:0] popCC_readPort_rsp_len; + wire [2:0] popCC_readPort_rsp_size; + wire [1:0] popCC_readPort_rsp_burst; + wire [0:0] popCC_readPort_rsp_lock; + wire [3:0] popCC_readPort_rsp_cache; + wire [2:0] popCC_readPort_rsp_prot; + wire [57:0] _zz_popCC_readPort_rsp_addr; + wire popCC_readArbitation_translated_valid; + wire popCC_readArbitation_translated_ready; + wire [31:0] popCC_readArbitation_translated_payload_addr; + wire [4:0] popCC_readArbitation_translated_payload_id; + wire [7:0] popCC_readArbitation_translated_payload_len; + wire [2:0] popCC_readArbitation_translated_payload_size; + wire [1:0] popCC_readArbitation_translated_payload_burst; + wire [0:0] popCC_readArbitation_translated_payload_lock; + wire [3:0] popCC_readArbitation_translated_payload_cache; + wire [2:0] popCC_readArbitation_translated_payload_prot; + wire popCC_readArbitation_fire; + reg [2:0] popCC_ptrToPush; + reg [2:0] popCC_ptrToOccupancy; + wire _zz_io_popOccupancy; + wire _zz_io_popOccupancy_1; + reg [57:0] ram [0:3]; + + assign _zz_pushCC_pushPtrGray = (pushCC_pushPtrPlus >>> 1'b1); + assign _zz_ram_port = pushCC_pushPtr[1:0]; + assign _zz_popCC_popPtrGray = (popCC_popPtr >>> 1'b1); + assign _zz_ram_port_1 = {io_push_payload_prot,{io_push_payload_cache,{io_push_payload_lock,{io_push_payload_burst,{io_push_payload_size,{io_push_payload_len,{io_push_payload_id,io_push_payload_addr}}}}}}}; + always @(posedge axiInClk) begin + if(_zz_1) begin + ram[_zz_ram_port] <= _zz_ram_port_1; + end + end + + always @(posedge axiOutClk) begin + if(popCC_readPort_cmd_valid) begin + _zz_ram_port1 <= ram[popCC_readPort_cmd_payload]; + end + end + + BufferCC_9 popToPushGray_buffercc ( + .io_dataIn (popToPushGray[2:0] ), //i + .io_dataOut (popToPushGray_buffercc_io_dataOut[2:0]), //o + .axiInClk (axiInClk ), //i + .axiInRstn (axiInRstn ) //i + ); + BufferCC_10 bufferCC_12 ( + .io_dataIn (bufferCC_12_io_dataIn ), //i + .io_dataOut (bufferCC_12_io_dataOut), //o + .axiOutClk (axiOutClk ), //i + .axiInRstn (axiInRstn ) //i + ); + BufferCC_11 pushToPopGray_buffercc ( + .io_dataIn (pushToPopGray[2:0] ), //i + .io_dataOut (pushToPopGray_buffercc_io_dataOut[2:0]), //o + .axiOutClk (axiOutClk ), //i + .awFifo_toplevel_axiInRstn_syncronized (awFifo_toplevel_axiInRstn_syncronized ) //i + ); + always @(*) begin + _zz_1 = 1'b0; + if(io_push_fire) begin + _zz_1 = 1'b1; + end + end + + assign pushCC_pushPtrPlus = (pushCC_pushPtr + 3'b001); + assign io_push_fire = (io_push_valid && io_push_ready); + assign pushCC_popPtrGray = popToPushGray_buffercc_io_dataOut; + assign pushCC_full = ((pushCC_pushPtrGray[2 : 1] == (~ pushCC_popPtrGray[2 : 1])) && (pushCC_pushPtrGray[0 : 0] == pushCC_popPtrGray[0 : 0])); + assign io_push_ready = (! pushCC_full); + assign _zz_io_pushOccupancy = (pushCC_popPtrGray[1] ^ _zz_io_pushOccupancy_1); + assign _zz_io_pushOccupancy_1 = pushCC_popPtrGray[2]; + assign io_pushOccupancy = (pushCC_pushPtr - {_zz_io_pushOccupancy_1,{_zz_io_pushOccupancy,(pushCC_popPtrGray[0] ^ _zz_io_pushOccupancy)}}); + assign bufferCC_12_io_dataIn = (1'b1 ^ 1'b0); + assign awFifo_toplevel_axiInRstn_syncronized = bufferCC_12_io_dataOut; + assign popCC_popPtrPlus = (popCC_popPtr + 3'b001); + assign popCC_popPtrGray = (_zz_popCC_popPtrGray ^ popCC_popPtr); + assign popCC_pushPtrGray = pushToPopGray_buffercc_io_dataOut; + assign popCC_empty = (popCC_popPtrGray == popCC_pushPtrGray); + assign popCC_addressGen_valid = (! popCC_empty); + assign popCC_addressGen_payload = popCC_popPtr[1:0]; + assign popCC_addressGen_fire = (popCC_addressGen_valid && popCC_addressGen_ready); + always @(*) begin + popCC_addressGen_ready = popCC_readArbitation_ready; + if(when_Stream_l369) begin + popCC_addressGen_ready = 1'b1; + end + end + + assign when_Stream_l369 = (! popCC_readArbitation_valid); + assign popCC_readArbitation_valid = popCC_addressGen_rValid; + assign popCC_readArbitation_payload = popCC_addressGen_rData; + assign _zz_popCC_readPort_rsp_addr = _zz_ram_port1; + assign popCC_readPort_rsp_addr = _zz_popCC_readPort_rsp_addr[31 : 0]; + assign popCC_readPort_rsp_id = _zz_popCC_readPort_rsp_addr[36 : 32]; + assign popCC_readPort_rsp_len = _zz_popCC_readPort_rsp_addr[44 : 37]; + assign popCC_readPort_rsp_size = _zz_popCC_readPort_rsp_addr[47 : 45]; + assign popCC_readPort_rsp_burst = _zz_popCC_readPort_rsp_addr[49 : 48]; + assign popCC_readPort_rsp_lock = _zz_popCC_readPort_rsp_addr[50 : 50]; + assign popCC_readPort_rsp_cache = _zz_popCC_readPort_rsp_addr[54 : 51]; + assign popCC_readPort_rsp_prot = _zz_popCC_readPort_rsp_addr[57 : 55]; + assign popCC_readPort_cmd_valid = popCC_addressGen_fire; + assign popCC_readPort_cmd_payload = popCC_addressGen_payload; + assign popCC_readArbitation_translated_valid = popCC_readArbitation_valid; + assign popCC_readArbitation_ready = popCC_readArbitation_translated_ready; + assign popCC_readArbitation_translated_payload_addr = popCC_readPort_rsp_addr; + assign popCC_readArbitation_translated_payload_id = popCC_readPort_rsp_id; + assign popCC_readArbitation_translated_payload_len = popCC_readPort_rsp_len; + assign popCC_readArbitation_translated_payload_size = popCC_readPort_rsp_size; + assign popCC_readArbitation_translated_payload_burst = popCC_readPort_rsp_burst; + assign popCC_readArbitation_translated_payload_lock = popCC_readPort_rsp_lock; + assign popCC_readArbitation_translated_payload_cache = popCC_readPort_rsp_cache; + assign popCC_readArbitation_translated_payload_prot = popCC_readPort_rsp_prot; + assign io_pop_valid = popCC_readArbitation_translated_valid; + assign popCC_readArbitation_translated_ready = io_pop_ready; + assign io_pop_payload_addr = popCC_readArbitation_translated_payload_addr; + assign io_pop_payload_id = popCC_readArbitation_translated_payload_id; + assign io_pop_payload_len = popCC_readArbitation_translated_payload_len; + assign io_pop_payload_size = popCC_readArbitation_translated_payload_size; + assign io_pop_payload_burst = popCC_readArbitation_translated_payload_burst; + assign io_pop_payload_lock = popCC_readArbitation_translated_payload_lock; + assign io_pop_payload_cache = popCC_readArbitation_translated_payload_cache; + assign io_pop_payload_prot = popCC_readArbitation_translated_payload_prot; + assign popCC_readArbitation_fire = (popCC_readArbitation_valid && popCC_readArbitation_ready); + assign _zz_io_popOccupancy = (popCC_pushPtrGray[1] ^ _zz_io_popOccupancy_1); + assign _zz_io_popOccupancy_1 = popCC_pushPtrGray[2]; + assign io_popOccupancy = ({_zz_io_popOccupancy_1,{_zz_io_popOccupancy,(popCC_pushPtrGray[0] ^ _zz_io_popOccupancy)}} - popCC_ptrToOccupancy); + assign pushToPopGray = pushCC_pushPtrGray; + assign popToPushGray = popCC_ptrToPush; + assign awFifo_toplevel_axiInRstn_syncronized_1 = awFifo_toplevel_axiInRstn_syncronized; + always @(posedge axiInClk or negedge axiInRstn) begin + if(!axiInRstn) begin + pushCC_pushPtr <= 3'b000; + pushCC_pushPtrGray <= 3'b000; + end else begin + if(io_push_fire) begin + pushCC_pushPtrGray <= (_zz_pushCC_pushPtrGray ^ pushCC_pushPtrPlus); + end + if(io_push_fire) begin + pushCC_pushPtr <= pushCC_pushPtrPlus; + end + end + end + + always @(posedge axiOutClk or negedge awFifo_toplevel_axiInRstn_syncronized) begin + if(!awFifo_toplevel_axiInRstn_syncronized) begin + popCC_popPtr <= 3'b000; + popCC_addressGen_rValid <= 1'b0; + popCC_ptrToPush <= 3'b000; + popCC_ptrToOccupancy <= 3'b000; + end else begin + if(popCC_addressGen_fire) begin + popCC_popPtr <= popCC_popPtrPlus; + end + if(popCC_addressGen_ready) begin + popCC_addressGen_rValid <= popCC_addressGen_valid; + end + if(popCC_readArbitation_fire) begin + popCC_ptrToPush <= popCC_popPtrGray; + end + if(popCC_readArbitation_fire) begin + popCC_ptrToOccupancy <= popCC_popPtr; + end + end + end + + always @(posedge axiOutClk) begin + if(popCC_addressGen_ready) begin + popCC_addressGen_rData <= popCC_addressGen_payload; + end + end + + +endmodule + +module BufferCC_1 ( + input wire [3:0] io_dataIn, + output wire [3:0] io_dataOut, + input wire axiInClk, + input wire bFifo_toplevel_axiOutRstn_syncronized +); + + (* async_reg = "true" *) reg [3:0] buffers_0; + (* async_reg = "true" *) reg [3:0] buffers_1; + + assign io_dataOut = buffers_1; + always @(posedge axiInClk or negedge bFifo_toplevel_axiOutRstn_syncronized) begin + if(!bFifo_toplevel_axiOutRstn_syncronized) begin + buffers_0 <= 4'b0000; + buffers_1 <= 4'b0000; + end else begin + buffers_0 <= io_dataIn; + buffers_1 <= buffers_0; + end + end + + +endmodule + +module BufferCC ( + input wire [3:0] io_dataIn, + output wire [3:0] io_dataOut, + input wire axiOutClk, + input wire axiOutRstn +); + + (* async_reg = "true" *) reg [3:0] buffers_0; + (* async_reg = "true" *) reg [3:0] buffers_1; + + assign io_dataOut = buffers_1; + always @(posedge axiOutClk or negedge axiOutRstn) begin + if(!axiOutRstn) begin + buffers_0 <= 4'b0000; + buffers_1 <= 4'b0000; + end else begin + buffers_0 <= io_dataIn; + buffers_1 <= buffers_0; + end + end + + +endmodule + +//BufferCC_3 replaced by BufferCC_11 + +//BufferCC_2 replaced by BufferCC_9 + +module BufferCC_6 ( + input wire [2:0] io_dataIn, + output wire [2:0] io_dataOut, + input wire axiInClk, + input wire bFifo_toplevel_axiOutRstn_syncronized +); + + (* async_reg = "true" *) reg [2:0] buffers_0; + (* async_reg = "true" *) reg [2:0] buffers_1; + + assign io_dataOut = buffers_1; + always @(posedge axiInClk or negedge bFifo_toplevel_axiOutRstn_syncronized) begin + if(!bFifo_toplevel_axiOutRstn_syncronized) begin + buffers_0 <= 3'b000; + buffers_1 <= 3'b000; + end else begin + buffers_0 <= io_dataIn; + buffers_1 <= buffers_0; + end + end + + +endmodule + +module BufferCC_5 ( + input wire io_dataIn, + output wire io_dataOut, + input wire axiInClk, + input wire axiOutRstn +); + + (* async_reg = "true" *) reg buffers_0; + (* async_reg = "true" *) reg buffers_1; + + assign io_dataOut = buffers_1; + always @(posedge axiInClk or negedge axiOutRstn) begin + if(!axiOutRstn) begin + buffers_0 <= 1'b0; + buffers_1 <= 1'b0; + end else begin + buffers_0 <= io_dataIn; + buffers_1 <= buffers_0; + end + end + + +endmodule + +module BufferCC_4 ( + input wire [2:0] io_dataIn, + output wire [2:0] io_dataOut, + input wire axiOutClk, + input wire axiOutRstn +); + + (* async_reg = "true" *) reg [2:0] buffers_0; + (* async_reg = "true" *) reg [2:0] buffers_1; + + assign io_dataOut = buffers_1; + always @(posedge axiOutClk or negedge axiOutRstn) begin + if(!axiOutRstn) begin + buffers_0 <= 3'b000; + buffers_1 <= 3'b000; + end else begin + buffers_0 <= io_dataIn; + buffers_1 <= buffers_0; + end + end + + +endmodule + +module BufferCC_8 ( + input wire [3:0] io_dataIn, + output wire [3:0] io_dataOut, + input wire axiOutClk, + input wire awFifo_toplevel_axiInRstn_syncronized +); + + (* async_reg = "true" *) reg [3:0] buffers_0; + (* async_reg = "true" *) reg [3:0] buffers_1; + + assign io_dataOut = buffers_1; + always @(posedge axiOutClk or negedge awFifo_toplevel_axiInRstn_syncronized) begin + if(!awFifo_toplevel_axiInRstn_syncronized) begin + buffers_0 <= 4'b0000; + buffers_1 <= 4'b0000; + end else begin + buffers_0 <= io_dataIn; + buffers_1 <= buffers_0; + end + end + + +endmodule + +module BufferCC_7 ( + input wire [3:0] io_dataIn, + output wire [3:0] io_dataOut, + input wire axiInClk, + input wire axiInRstn +); + + (* async_reg = "true" *) reg [3:0] buffers_0; + (* async_reg = "true" *) reg [3:0] buffers_1; + + assign io_dataOut = buffers_1; + always @(posedge axiInClk or negedge axiInRstn) begin + if(!axiInRstn) begin + buffers_0 <= 4'b0000; + buffers_1 <= 4'b0000; + end else begin + buffers_0 <= io_dataIn; + buffers_1 <= buffers_0; + end + end + + +endmodule + +module BufferCC_11 ( + input wire [2:0] io_dataIn, + output wire [2:0] io_dataOut, + input wire axiOutClk, + input wire awFifo_toplevel_axiInRstn_syncronized +); + + (* async_reg = "true" *) reg [2:0] buffers_0; + (* async_reg = "true" *) reg [2:0] buffers_1; + + assign io_dataOut = buffers_1; + always @(posedge axiOutClk or negedge awFifo_toplevel_axiInRstn_syncronized) begin + if(!awFifo_toplevel_axiInRstn_syncronized) begin + buffers_0 <= 3'b000; + buffers_1 <= 3'b000; + end else begin + buffers_0 <= io_dataIn; + buffers_1 <= buffers_0; + end + end + + +endmodule + +module BufferCC_10 ( + input wire io_dataIn, + output wire io_dataOut, + input wire axiOutClk, + input wire axiInRstn +); + + (* async_reg = "true" *) reg buffers_0; + (* async_reg = "true" *) reg buffers_1; + + assign io_dataOut = buffers_1; + always @(posedge axiOutClk or negedge axiInRstn) begin + if(!axiInRstn) begin + buffers_0 <= 1'b0; + buffers_1 <= 1'b0; + end else begin + buffers_0 <= io_dataIn; + buffers_1 <= buffers_0; + end + end + + +endmodule + +module BufferCC_9 ( + input wire [2:0] io_dataIn, + output wire [2:0] io_dataOut, + input wire axiInClk, + input wire axiInRstn +); + + (* async_reg = "true" *) reg [2:0] buffers_0; + (* async_reg = "true" *) reg [2:0] buffers_1; + + assign io_dataOut = buffers_1; + always @(posedge axiInClk or negedge axiInRstn) begin + if(!axiInRstn) begin + buffers_0 <= 3'b000; + buffers_1 <= 3'b000; + end else begin + buffers_0 <= io_dataIn; + buffers_1 <= buffers_0; + end + end + + +endmodule diff --git a/rtl/ip/Bus_interconnects/axi2sram_dp.v b/rtl/ip/Bus_interconnects/axi2sram_dp.v new file mode 100644 index 0000000..d4463bb --- /dev/null +++ b/rtl/ip/Bus_interconnects/axi2sram_dp.v @@ -0,0 +1,520 @@ +//+FHDR----------------------------------------------------------------- +// (C) Copyright Loongson Technology Corporation Limited. All rights reserved +// Loongson Confidential Proprietary +//-FHDR----------------------------------------------------------------- +module axi2sram_dp#( + parameter BUS_WIDTH = 32, + parameter DATA_WIDTH = 64, + parameter CPU_WIDTH = 32 +) +( + input wire aclk , + input wire aresetn , + output wire [BUS_WIDTH-1 :0] ram_raddr, + input wire [DATA_WIDTH-1 :0] ram_rdata, + output wire ram_ren , + output wire [BUS_WIDTH-1 :0] ram_waddr, + output wire [DATA_WIDTH-1 :0] ram_wdata, + output wire [DATA_WIDTH/8-1 :0] ram_wen , + input wire [BUS_WIDTH-1 :0] m_araddr , + input wire [1 :0] m_arburst, + input wire [3 :0] m_arcache, + input wire [4 :0] m_arid , + input wire [3 :0] m_arlen , + input wire [1 :0] m_arlock , + input wire [2 :0] m_arprot , + output wire m_arready, + input wire [2 :0] m_arsize , + input wire m_arvalid, + input wire [BUS_WIDTH-1 :0] m_awaddr , + input wire [1 :0] m_awburst, + input wire [3 :0] m_awcache, + input wire [4 :0] m_awid , + input wire [3 :0] m_awlen , + input wire [1 :0] m_awlock , + input wire [2 :0] m_awprot , + output wire m_awready, + input wire [2 :0] m_awsize , + input wire m_awvalid, + output wire [4 :0] m_bid , + input wire m_bready , + output wire [1 :0] m_bresp , + output wire m_bvalid , + output wire [DATA_WIDTH-1 :0] m_rdata , + output wire [4 :0] m_rid , + output wire m_rlast , + input wire m_rready , + output wire [1 :0] m_rresp , + output wire m_rvalid , + input wire [DATA_WIDTH-1 :0] m_wdata , + input wire m_wlast , + output wire m_wready , + input wire [DATA_WIDTH/8-1 :0] m_wstrb , + input wire m_wvalid +); +localparam ADDR_INCR_BASE=($clog2(DATA_WIDTH) - 3); + +wire [BUS_WIDTH+13-1 :0] ram_r_a_data ; +reg [BUS_WIDTH-1 :0] ram_r_a_data_araddr ; +wire [BUS_WIDTH-1 :0] ram_r_a_data_araddr_fixed ; +wire [BUS_WIDTH-1 :0] ram_r_a_data_araddr_incr ; +wire [BUS_WIDTH-1 :0] ram_r_a_data_araddr_next ; +wire ram_r_a_data_araddr_update ; +wire [BUS_WIDTH-1 :0] ram_r_a_data_araddr_wrap ; +reg [1 :0] ram_r_a_data_arburst ; +wire ram_r_a_data_arburst_fixed ; +wire ram_r_a_data_arburst_incr ; +wire ram_r_a_data_arburst_wrap ; +reg [4 :0] ram_r_a_data_arid ; +reg [3 :0] ram_r_a_data_arlen ; +wire ram_r_a_data_arlen_last ; +reg [2 :0] ram_r_a_data_arsize ; +wire ram_r_a_data_push ; +wire ram_r_a_full ; +wire ram_r_a_pop ; +wire ram_r_a_push ; +wire [BUS_WIDTH+14-1 :0] ram_r_a_push_data ; +reg [BUS_WIDTH+14-1 :0] ram_r_a_queue_datas ; +wire [BUS_WIDTH-1 :0] ram_r_a_queue_datas_araddr ; +wire [1 :0] ram_r_a_queue_datas_arburst; +wire [4 :0] ram_r_a_queue_datas_arid ; +wire [3 :0] ram_r_a_queue_datas_arlen ; +wire [2 :0] ram_r_a_queue_datas_arsize ; +wire ram_r_a_queue_empty ; +wire ram_r_a_queue_full ; +wire ram_r_a_queue_pop ; +wire ram_r_a_queue_push ; +reg ram_r_a_queue_valid ; +reg ram_r_a_valid ; +wire [BUS_WIDTH-1 :0] ram_r_addr ; +wire ram_r_allow_out ; +wire [DATA_WIDTH-1 :0] ram_r_data ; +wire ram_r_en ; +reg [3 :0] ram_r_rcur ; +wire ram_r_rcur_reset ; +reg [4 :0] ram_r_rid ; +reg ram_r_rlast ; +reg ram_r_rvalid ; +wire [BUS_WIDTH+13-1 :0] ram_w_a_data ; +reg [BUS_WIDTH-1 :0] ram_w_a_data_awaddr ; +wire [BUS_WIDTH-1 :0] ram_w_a_data_awaddr_fixed ; +wire [BUS_WIDTH-1 :0] ram_w_a_data_awaddr_incr ; +wire [BUS_WIDTH-1 :0] ram_w_a_data_awaddr_next ; +wire ram_w_a_data_awaddr_update ; +wire [BUS_WIDTH-1 :0] ram_w_a_data_awaddr_wrap ; +reg [1 :0] ram_w_a_data_awburst ; +wire ram_w_a_data_awburst_fixed ; +wire ram_w_a_data_awburst_incr ; +wire ram_w_a_data_awburst_wrap ; +reg [4 :0] ram_w_a_data_awid ; +reg [3 :0] ram_w_a_data_awlen ; +reg [2 :0] ram_w_a_data_awsize ; +wire ram_w_a_data_push ; +wire ram_w_a_full ; +wire ram_w_a_pop ; +wire ram_w_a_push ; +wire [BUS_WIDTH+14-1 :0] ram_w_a_push_data ; +reg [BUS_WIDTH+14-1 :0] ram_w_a_queue_datas ; +wire [BUS_WIDTH-1 :0] ram_w_a_queue_datas_awaddr ; +wire [1 :0] ram_w_a_queue_datas_awburst; +wire [4 :0] ram_w_a_queue_datas_awid ; +wire [3 :0] ram_w_a_queue_datas_awlen ; +wire [2 :0] ram_w_a_queue_datas_awsize ; +wire ram_w_a_queue_empty ; +wire ram_w_a_queue_full ; +wire ram_w_a_queue_pop ; +wire ram_w_a_queue_push ; +reg ram_w_a_queue_valid ; +reg ram_w_a_valid ; +wire [BUS_WIDTH-1 :0] ram_w_addr ; +wire ram_w_allow_out ; +reg [4 :0] ram_w_b_data ; +wire ram_w_b_data_push ; +wire ram_w_b_full ; +wire ram_w_b_pop ; +wire ram_w_b_push ; +reg [4 :0] ram_w_b_queue_datas ; +wire ram_w_b_queue_empty ; +wire ram_w_b_queue_full ; +wire ram_w_b_queue_pop ; +wire ram_w_b_queue_push ; +reg ram_w_b_queue_valid ; +reg ram_w_b_valid ; +wire ram_w_en ; +wire ram_w_go ; +wire [DATA_WIDTH/8-1 :0] ram_w_strb ; +reg [DATA_WIDTH-1 :0] ram_w_wdata ; +reg ram_w_wlast ; +reg [DATA_WIDTH/8-1 :0] ram_w_wstrb ; +reg ram_w_wvalid ; +assign m_arready = !ram_r_a_full; +assign m_awready = !ram_w_a_full; +assign m_bid = ram_w_b_data; +assign m_bresp = 2'h0; +assign m_bvalid = ram_w_b_valid; +assign m_rdata = ram_rdata ; +assign m_rid = ram_r_rid ; +assign m_rlast = ram_r_rlast ; +assign m_rresp = 2'h0; +assign m_rvalid = ram_r_rvalid; +assign m_wready = ram_w_allow_out || !ram_w_wvalid; +assign ram_r_a_data = {ram_r_a_data_arburst,ram_r_a_data_arsize,ram_r_a_data_arlen,ram_r_a_data_araddr,ram_r_a_data_arid}; +assign ram_r_a_data_araddr_fixed = ram_r_a_data_araddr; +assign ram_r_a_data_araddr_incr [ADDR_INCR_BASE-1:0] = ram_r_a_data_araddr[ADDR_INCR_BASE-1:0]; +assign ram_r_a_data_araddr_incr [BUS_WIDTH-1 :ADDR_INCR_BASE ] = ram_r_a_data_araddr[BUS_WIDTH-1:ADDR_INCR_BASE] + {{BUS_WIDTH-ADDR_INCR_BASE-1{1'b0}},1'b1}; +assign ram_r_a_data_araddr_next = {BUS_WIDTH{ram_r_a_data_arburst_fixed}} & ram_r_a_data_araddr_fixed + | {BUS_WIDTH{ram_r_a_data_arburst_incr }} & ram_r_a_data_araddr_incr + | {BUS_WIDTH{ram_r_a_data_arburst_wrap }} & ram_r_a_data_araddr_wrap ; +assign ram_r_a_data_araddr_update = ram_r_en && !ram_r_a_data_arlen_last; +assign ram_r_a_data_araddr_wrap [ADDR_INCR_BASE-1 :0] = ram_r_a_data_araddr[ADDR_INCR_BASE-1 :0]; +assign ram_r_a_data_araddr_wrap [BUS_WIDTH-1:ADDR_INCR_BASE+4] = ram_r_a_data_araddr[BUS_WIDTH-1:ADDR_INCR_BASE+4]; +assign ram_r_a_data_araddr_wrap [ADDR_INCR_BASE+3 :ADDR_INCR_BASE] = ram_r_a_data_araddr[ADDR_INCR_BASE+3:ADDR_INCR_BASE] & ~ram_r_a_data_arlen | ram_r_a_data_arlen & ram_r_a_data_araddr[ADDR_INCR_BASE+3:ADDR_INCR_BASE] + 4'h1; +assign ram_r_a_data_arburst_fixed = ram_r_a_data_arburst == 2'h0; +assign ram_r_a_data_arburst_incr = ram_r_a_data_arburst == 2'h1; +assign ram_r_a_data_arburst_wrap = ram_r_a_data_arburst == 2'h2; +assign ram_r_a_data_arlen_last = ram_r_a_data_arlen == ram_r_rcur; +assign ram_r_a_data_push = ram_r_a_push && (ram_r_a_pop || !ram_r_a_valid); +assign ram_r_a_full = ram_r_a_queue_full; +assign ram_r_a_pop = ram_r_en && ram_r_a_data_arlen_last; +assign ram_r_a_push = m_arvalid && !ram_r_a_full ; +//assign ram_r_a_push_data = {m_arburst,m_arsize ,m_arlen,m_araddr,m_arid}; +assign ram_r_a_push_data = {m_araddr,m_arburst,m_arsize,m_arlen,m_arid}; +assign ram_r_a_queue_datas_araddr = ram_r_a_queue_datas[BUS_WIDTH-1+14:14]; +assign ram_r_a_queue_datas_arburst = ram_r_a_queue_datas[13 :12]; +assign ram_r_a_queue_datas_arid = ram_r_a_queue_datas[4 : 0]; +assign ram_r_a_queue_datas_arlen = ram_r_a_queue_datas[8 : 5]; +assign ram_r_a_queue_datas_arsize = ram_r_a_queue_datas[11 : 9]; +assign ram_r_a_queue_empty = !ram_r_a_queue_valid; +assign ram_r_a_queue_full = ram_r_a_queue_valid; +assign ram_r_a_queue_pop = ram_r_a_pop && !ram_r_a_queue_empty; +assign ram_r_a_queue_push = ram_r_a_push && ram_r_a_valid && !ram_r_a_pop && !ram_r_a_queue_full; +assign ram_r_addr = ram_r_a_data_araddr; +assign ram_r_allow_out = m_rready || !m_rvalid; +assign ram_r_data = ram_rdata; +assign ram_r_en = ram_r_a_valid && ram_r_allow_out; +assign ram_r_rcur_reset = !aresetn || ram_r_a_pop; +assign ram_w_a_data = {ram_w_a_data_awaddr,ram_w_a_data_awburst,ram_w_a_data_awsize ,ram_w_a_data_awlen,ram_w_a_data_awid}; +assign ram_w_a_data_awaddr_fixed = ram_w_a_data_awaddr; +assign ram_w_a_data_awaddr_incr [ADDR_INCR_BASE-1 :0] = ram_w_a_data_awaddr[ADDR_INCR_BASE-1:0]; +assign ram_w_a_data_awaddr_incr [BUS_WIDTH-1:ADDR_INCR_BASE] = ram_w_a_data_awaddr[BUS_WIDTH-1:ADDR_INCR_BASE] + {{BUS_WIDTH-ADDR_INCR_BASE-1{1'b0}},1'b1}; +assign ram_w_a_data_awaddr_next = {BUS_WIDTH{ram_w_a_data_awburst_fixed}} & ram_w_a_data_awaddr_fixed + | {BUS_WIDTH{ram_w_a_data_awburst_incr }} & ram_w_a_data_awaddr_incr + | {BUS_WIDTH{ram_w_a_data_awburst_wrap }} & ram_w_a_data_awaddr_wrap ; +assign ram_w_a_data_awaddr_update = ram_w_en && !ram_w_wlast; +assign ram_w_a_data_awaddr_wrap [ADDR_INCR_BASE-1 :0] = ram_w_a_data_awaddr[ADDR_INCR_BASE-1 :0]; +assign ram_w_a_data_awaddr_wrap [BUS_WIDTH-1:ADDR_INCR_BASE+4] = ram_w_a_data_awaddr[BUS_WIDTH-1:ADDR_INCR_BASE+4]; +assign ram_w_a_data_awaddr_wrap [ADDR_INCR_BASE+3:ADDR_INCR_BASE] = ram_w_a_data_awaddr[ADDR_INCR_BASE+3:ADDR_INCR_BASE] & ~ram_w_a_data_awlen | ram_w_a_data_awlen & ram_w_a_data_awaddr[ADDR_INCR_BASE+3:ADDR_INCR_BASE] + 4'h1; +assign ram_w_a_data_awburst_fixed = ram_w_a_data_awburst == 2'h0; +assign ram_w_a_data_awburst_incr = ram_w_a_data_awburst == 2'h1; +assign ram_w_a_data_awburst_wrap = ram_w_a_data_awburst == 2'h2; +assign ram_w_a_data_push = ram_w_a_push && (ram_w_a_pop || !ram_w_a_valid); +assign ram_w_a_full = ram_w_a_queue_full; +assign ram_w_a_pop = ram_w_en && ram_w_wlast ; +assign ram_w_a_push = m_awvalid && !ram_w_a_full; +assign ram_w_a_push_data = {m_awaddr,m_awburst,m_awsize ,m_awlen,m_awid}; +assign ram_w_a_queue_datas_awaddr = ram_w_a_queue_datas[BUS_WIDTH-1+14:14]; +assign ram_w_a_queue_datas_awburst = ram_w_a_queue_datas[13 :12]; +assign ram_w_a_queue_datas_awid = ram_w_a_queue_datas[4 : 0]; +assign ram_w_a_queue_datas_awlen = ram_w_a_queue_datas[8 : 5]; +assign ram_w_a_queue_datas_awsize = ram_w_a_queue_datas[11 : 9]; +assign ram_w_a_queue_empty = !ram_w_a_queue_valid; +assign ram_w_a_queue_full = ram_w_a_queue_valid; +assign ram_w_a_queue_pop = ram_w_a_pop && !ram_w_a_queue_empty; +assign ram_w_a_queue_push = ram_w_a_push && ram_w_a_valid && !ram_w_a_pop && !ram_w_a_queue_full; +assign ram_w_addr = ram_w_a_data_awaddr; +assign ram_w_allow_out = ram_w_a_valid && !ram_w_b_full; +assign ram_w_b_data_push = ram_w_b_push && (ram_w_b_pop || !ram_w_b_valid); +assign ram_w_b_full = ram_w_b_queue_full; +assign ram_w_b_pop = m_bready && ram_w_b_valid; +assign ram_w_b_push = ram_w_a_pop ; +assign ram_w_b_queue_empty = !ram_w_b_queue_valid; +assign ram_w_b_queue_full = ram_w_b_queue_valid; +assign ram_w_b_queue_pop = ram_w_b_pop && !ram_w_b_queue_empty; +assign ram_w_b_queue_push = ram_w_b_push && ram_w_b_valid && !ram_w_b_pop && !ram_w_b_queue_full; +assign ram_w_en = ram_w_wvalid && ram_w_allow_out && aresetn; +assign ram_w_go = m_wvalid && m_wready; +assign ram_w_strb = ram_w_wstrb; +assign ram_raddr = ram_r_addr ; +assign ram_ren = ram_r_en ; +assign ram_waddr = ram_w_addr ; +assign ram_wdata = ram_w_wdata; +assign ram_wen = ram_w_strb & {DATA_WIDTH/8{ram_w_en}}; +always@(posedge aclk) +begin + if(ram_r_rcur_reset) + begin + ram_r_rcur<=4'h0; + end + else + if(ram_r_en) + begin + ram_r_rcur<=ram_r_rcur + 4'h1; + end +end +always@(posedge aclk) +begin + if(ram_r_en) + begin + ram_r_rid<=ram_r_a_data_arid; + end +end +always@(posedge aclk) +begin + if(ram_r_en) + begin + ram_r_rlast<=ram_r_a_data_arlen_last; + end +end +always@(posedge aclk) +begin + if(!aresetn) + begin + ram_r_rvalid<=1'h0; + end + else + if(ram_r_en) + begin + ram_r_rvalid<=1'h1; + end + else + if(m_rready) + begin + ram_r_rvalid<=1'h0; + end +end +always@(posedge aclk) +begin + if(!aresetn) + begin + ram_r_a_valid<=1'h0; + end + else + if(ram_r_a_push) + begin + ram_r_a_valid<=1'h1; + end + else + if(ram_r_a_pop) + begin + ram_r_a_valid<=ram_r_a_queue_valid; + end +end +always@(posedge aclk) +begin + if(!aresetn) + begin + ram_r_a_queue_valid<=1'h0; + end + else + if(ram_r_a_queue_push) + begin + ram_r_a_queue_valid<=1'h1; + end + else + if(ram_r_a_queue_pop) + begin + ram_r_a_queue_valid<=1'h0; + end +end +always@(posedge aclk) +begin + if(ram_r_a_queue_push) + begin + ram_r_a_queue_datas<=ram_r_a_push_data; + end +end +always@(posedge aclk) +begin + if(ram_r_a_data_push) + begin + ram_r_a_data_arburst<=m_arburst; + ram_r_a_data_arid <=m_arid ; + ram_r_a_data_arlen <=m_arlen ; + ram_r_a_data_arsize <=m_arsize ; + end + else + if(ram_r_a_pop) + begin + ram_r_a_data_arburst<=ram_r_a_queue_datas_arburst; + ram_r_a_data_arid <=ram_r_a_queue_datas_arid ; + ram_r_a_data_arlen <=ram_r_a_queue_datas_arlen ; + ram_r_a_data_arsize <=ram_r_a_queue_datas_arsize ; + end +end +always@(posedge aclk) +begin + if(ram_r_a_data_push) + begin + ram_r_a_data_araddr<=m_araddr; + end + else + if(ram_r_a_pop) + begin + ram_r_a_data_araddr<=ram_r_a_queue_datas_araddr; + end + else + begin + if(ram_r_a_data_araddr_update) + begin + ram_r_a_data_araddr<=ram_r_a_data_araddr_next; + end + end +end +always@(posedge aclk) +begin + if(ram_w_go) + begin + ram_w_wdata<=m_wdata; + ram_w_wlast<=m_wlast; + ram_w_wstrb<=m_wstrb; + end +end +always@(posedge aclk) +begin + if(!aresetn) + begin + ram_w_wvalid<=1'h0; + end + else + if(ram_w_go) + begin + ram_w_wvalid<=1'h1; + end + else + if(ram_w_en) + begin + ram_w_wvalid<=1'h0; + end +end +always@(posedge aclk) +begin + if(!aresetn) + begin + ram_w_a_valid<=1'h0; + end + else + if(ram_w_a_push) + begin + ram_w_a_valid<=1'h1; + end + else + if(ram_w_a_pop) + begin + ram_w_a_valid<=ram_w_a_queue_valid; + end +end +always@(posedge aclk) +begin + if(!aresetn) + begin + ram_w_a_queue_valid<=1'h0; + end + else + if(ram_w_a_queue_push) + begin + ram_w_a_queue_valid<=1'h1; + end + else + if(ram_w_a_queue_pop) + begin + ram_w_a_queue_valid<=1'h0; + end +end +always@(posedge aclk) +begin + if(ram_w_a_queue_push) + begin + ram_w_a_queue_datas<=ram_w_a_push_data; + end +end +always@(posedge aclk) +begin + if(ram_w_a_data_push) + begin + ram_w_a_data_awburst<=m_awburst; + ram_w_a_data_awid <=m_awid ; + ram_w_a_data_awlen <=m_awlen ; + ram_w_a_data_awsize <=m_awsize ; + end + else + if(ram_w_a_pop) + begin + ram_w_a_data_awburst<=ram_w_a_queue_datas_awburst; + ram_w_a_data_awid <=ram_w_a_queue_datas_awid ; + ram_w_a_data_awlen <=ram_w_a_queue_datas_awlen ; + ram_w_a_data_awsize <=ram_w_a_queue_datas_awsize ; + end +end +always@(posedge aclk) +begin + if(ram_w_a_data_push) + begin + ram_w_a_data_awaddr<=m_awaddr; + end + else + if(ram_w_a_pop) + begin + ram_w_a_data_awaddr<=ram_w_a_queue_datas_awaddr; + end + else + begin + if(ram_w_a_data_awaddr_update) + begin + ram_w_a_data_awaddr<=ram_w_a_data_awaddr_next; + end + end +end +always@(posedge aclk) +begin + if(!aresetn) + begin + ram_w_b_valid<=1'h0; + end + else + if(ram_w_b_push) + begin + ram_w_b_valid<=1'h1; + end + else + if(ram_w_b_pop) + begin + ram_w_b_valid<=ram_w_b_queue_valid; + end +end +always@(posedge aclk) +begin + if(!aresetn) + begin + ram_w_b_queue_valid<=1'h0; + end + else + if(ram_w_b_queue_push) + begin + ram_w_b_queue_valid<=1'h1; + end + else + if(ram_w_b_queue_pop) + begin + ram_w_b_queue_valid<=1'h0; + end +end +always@(posedge aclk) +begin + if(ram_w_b_queue_push) + begin + ram_w_b_queue_datas<=ram_w_a_data_awid; + end +end +always@(posedge aclk) +begin + if(ram_w_b_data_push) + begin + ram_w_b_data<=ram_w_a_data_awid; + end + else + if(ram_w_b_pop) + begin + ram_w_b_data<=ram_w_b_queue_datas; + end +end +endmodule // soc_axi_sram_bridge diff --git a/rtl/ip/Bus_interconnects/axi2sram_sp.v b/rtl/ip/Bus_interconnects/axi2sram_sp.v new file mode 100644 index 0000000..78ed1d2 --- /dev/null +++ b/rtl/ip/Bus_interconnects/axi2sram_sp.v @@ -0,0 +1,350 @@ +// Copyright 2018 ETH Zurich and University of Bologna. +// Copyright and related rights are licensed under the Solderpad Hardware +// License, Version 0.51 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://solderpad.org/licenses/SHL-0.51. Unless required by applicable law +// or agreed to in writing, software, hardware and materials distributed under +// this License 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. +// +// ---------------------------- +// AXI to SRAM Adapter +// ---------------------------- +// Author: Florian Zaruba (zarubaf@iis.ee.ethz.ch) +// +// Description: Manages AXI transactions +// Supports all burst accesses but only on aligned addresses and with full data width. +// Assertions should guide you if there is something unsupported happening. +// +module axi2sram_sp #( + parameter AXI_ID_WIDTH = 5, + parameter AXI_ADDR_WIDTH = 32, + parameter AXI_DATA_WIDTH = 32 +)( + input clk, + input resetn, + + input [AXI_ADDR_WIDTH-1:0] s_araddr , + input [1 :0] s_arburst, + input [3 :0] s_arcache, + input [AXI_ID_WIDTH-1 :0] s_arid , + input [3 :0] s_arlen , + input [1 :0] s_arlock , + input [2 :0] s_arprot , + output reg s_arready, + input [2 :0] s_arsize , + input s_arvalid, + input [AXI_ADDR_WIDTH-1:0] s_awaddr , + input [1 :0] s_awburst, + input [3 :0] s_awcache, + input [AXI_ID_WIDTH :0] s_awid , + input [3 :0] s_awlen , + input [1 :0] s_awlock , + input [2 :0] s_awprot , + output reg s_awready, + input [2 :0] s_awsize , + input s_awvalid, + output reg [AXI_ID_WIDTH-1 :0] s_bid , + input s_bready , + output reg [1 :0] s_bresp , + output reg s_bvalid , + output reg [AXI_DATA_WIDTH-1:0] s_rdata , + output reg [AXI_ID_WIDTH :0] s_rid , + output reg s_rlast , + input s_rready , + output reg [1 :0] s_rresp , + output reg s_rvalid , + input [AXI_DATA_WIDTH-1:0] s_wdata , + input s_wlast , + output reg s_wready , + input [AXI_DATA_WIDTH/8-1:0] s_wstrb , + input s_wvalid , + + output reg req_o, + output reg we_o, + output reg [AXI_ADDR_WIDTH-1:0] addr_o, + output reg [AXI_DATA_WIDTH/8-1:0] be_o, + output reg [AXI_DATA_WIDTH-1:0] data_o, + input [AXI_DATA_WIDTH-1:0] data_i +); + // AXI has the following rules governing the use of bursts: + // - for wrapping bursts, the burst length must be 2, 4, 8, or 16 + // - a burst must not cross a 4KB address boundary + // - early termination of bursts is not supported. + + localparam LOG_NR_BYTES = $clog2(AXI_DATA_WIDTH/8); + + reg [AXI_ID_WIDTH-1:0] ax_req_d_id; + reg [AXI_ADDR_WIDTH-1:0] ax_req_d_addr; + reg [7:0] ax_req_d_len; + reg [2:0] ax_req_d_size; + reg [1:0] ax_req_d_burst; + + reg [AXI_ID_WIDTH-1:0] ax_req_q_id; + reg [AXI_ADDR_WIDTH-1:0] ax_req_q_addr; + reg [7:0] ax_req_q_len; + reg [2:0] ax_req_q_size; + reg [1:0] ax_req_q_burst; + + reg [2:0] state_d; + reg [2:0] state_q; + + localparam IDLE = 3'h0; + localparam READ = 3'h1; + localparam WRITE = 3'h2; + localparam SEND_B = 3'h3; + localparam WAIT_WVALID = 3'h4; + + localparam FIXED = 2'b00; + localparam INCR = 2'b01; + localparam WRAP = 2'b10; + + reg [AXI_ADDR_WIDTH-1:0] req_addr_d, req_addr_q; + reg [7:0] cnt_d, cnt_q; + + function automatic [AXI_ADDR_WIDTH-1:0] get_wrap_boundary; + input [AXI_ADDR_WIDTH-1:0] unaligned_address; + input [7:0] len; + begin + get_wrap_boundary = 'h0; + // for wrapping transfers ax_len can only be of size 1, 3, 7 or 15 + if (len == 4'b1) + get_wrap_boundary[AXI_ADDR_WIDTH-1:1+LOG_NR_BYTES] = unaligned_address[AXI_ADDR_WIDTH-1:1+LOG_NR_BYTES]; + else if (len == 4'b11) + get_wrap_boundary[AXI_ADDR_WIDTH-1:2+LOG_NR_BYTES] = unaligned_address[AXI_ADDR_WIDTH-1:2+LOG_NR_BYTES]; + else if (len == 4'b111) + get_wrap_boundary[AXI_ADDR_WIDTH-1:3+LOG_NR_BYTES] = unaligned_address[AXI_ADDR_WIDTH-3:2+LOG_NR_BYTES]; + else if (len == 4'b1111) + get_wrap_boundary[AXI_ADDR_WIDTH-1:4+LOG_NR_BYTES] = unaligned_address[AXI_ADDR_WIDTH-3:4+LOG_NR_BYTES]; + end + endfunction + + reg [AXI_ADDR_WIDTH-1:0] aligned_address; + reg [AXI_ADDR_WIDTH-1:0] wrap_boundary; + reg [AXI_ADDR_WIDTH-1:0] upper_wrap_boundary; + reg [AXI_ADDR_WIDTH-1:0] cons_addr; + + always @ (*) begin + // address generation + aligned_address = {ax_req_q_addr[AXI_ADDR_WIDTH-1:LOG_NR_BYTES], {{LOG_NR_BYTES}{1'b0}}}; + wrap_boundary = get_wrap_boundary(ax_req_q_addr, ax_req_q_len); + // this will overflow + upper_wrap_boundary = wrap_boundary + ((ax_req_q_len + 1) << LOG_NR_BYTES); + // calculate consecutive address + cons_addr = aligned_address + (cnt_q << LOG_NR_BYTES); + + // Transaction attributes + // default assignments + state_d = state_q; + ax_req_d_id = ax_req_q_id; + ax_req_d_addr = ax_req_q_addr; + ax_req_d_len = ax_req_q_len; + ax_req_d_size = ax_req_q_size; + ax_req_d_burst = ax_req_q_burst; + req_addr_d = req_addr_q; + cnt_d = cnt_q; + // Memory default assignments + data_o = s_wdata; + be_o = s_wstrb; + we_o = 1'b0; + req_o = 1'b0; + addr_o = 'h0; + // AXI assignments + // request + s_awready = 1'b0; + s_arready = 1'b0; + // read response channel + s_rvalid = 1'b0; + s_rdata = data_i; + s_rresp = 'h0; + s_rlast = 'h0; + s_rid = ax_req_q_id; + // slave write data channel + s_wready = 1'b0; + // write response channel + s_bvalid = 1'b0; + s_bresp = 1'b0; + s_bid = 1'b0; + + case (state_q) + + IDLE: begin + // Wait for a read or write + // ------------ + // Read + // ------------ + if (s_arvalid) begin + s_arready = 1'b1; + // sample ax + ax_req_d_id = s_arid; + ax_req_d_addr = s_araddr; + ax_req_d_len = s_arlen; + ax_req_d_size = s_arsize; + ax_req_d_burst = s_arburst; + state_d = READ; + // we can request the first address, this saves us time + req_o = 1'b1; + addr_o = s_araddr; + // save the address + req_addr_d = s_araddr; + // save the ar_len + cnt_d = 1; + // ------------ + // Write + // ------------ + end else if (s_awvalid) begin + s_awready = 1'b1; + s_wready = 1'b1; + addr_o = s_awaddr; + // sample ax + ax_req_d_id = s_awid; + ax_req_d_addr = s_awaddr; + ax_req_d_len = s_awlen; + ax_req_d_size = s_awsize; + ax_req_d_burst = s_awburst; + // we've got our first w_valid so start the write process + if (s_wvalid) begin + req_o = 1'b1; + we_o = 1'b1; + state_d = (s_wlast) ? SEND_B : WRITE; + cnt_d = 1; + // we still have to wait for the first w_valid to arrive + end else + state_d = WAIT_WVALID; + end + end + + // ~> we are still missing a w_valid + WAIT_WVALID: begin + s_wready = 1'b1; + addr_o = ax_req_q_addr; + // we can now make our first request + if (s_wvalid) begin + req_o = 1'b1; + we_o = 1'b1; + state_d = (s_wlast) ? SEND_B : WRITE; + cnt_d = 1; + end + end + + READ: begin + // keep request to memory high + req_o = 1'b1; + addr_o = req_addr_q; + // send the response + s_rvalid = 1'b1; + s_rdata = data_i; + s_rid = ax_req_q_id; + s_rlast = (cnt_q == ax_req_q_len + 1); + + // check that the master is ready, the slave must not wait on this + if (s_rready) begin + // ---------------------------- + // Next address generation + // ---------------------------- + // handle the correct burst type + case (ax_req_q_burst) + FIXED, INCR: addr_o = cons_addr; + WRAP: begin + // check if the address reached warp boundary + if (cons_addr == upper_wrap_boundary) begin + addr_o = wrap_boundary; + // address warped beyond boundary + end else if (cons_addr > upper_wrap_boundary) begin + addr_o = ax_req_q_addr + ((cnt_q - ax_req_q_len) << LOG_NR_BYTES); + // we are still in the incremental regime + end else begin + addr_o = cons_addr; + end + end + endcase + // we need to change the address here for the upcoming request + // we sent the last byte -> go back to idle + if (s_rlast) begin + state_d = IDLE; + // we already got everything + req_o = 1'b0; + end + // save the request address for the next cycle + req_addr_d = addr_o; + // we can decrease the counter as the master has consumed the read data + cnt_d = cnt_q + 1; + // TODO: configure correct byte-lane + end + end + // ~> we already wrote the first word here + WRITE: begin + + s_wready = 1'b1; + + // consume a word here + if (s_wvalid) begin + req_o = 1'b1; + we_o = 1'b1; + // ---------------------------- + // Next address generation + // ---------------------------- + // handle the correct burst type + case (ax_req_q_burst) + + FIXED, INCR: addr_o = cons_addr; + WRAP: begin + // check if the address reached warp boundary + if (cons_addr == upper_wrap_boundary) begin + addr_o = wrap_boundary; + // address warped beyond boundary + end else if (cons_addr > upper_wrap_boundary) begin + addr_o = ax_req_q_addr + ((cnt_q - ax_req_q_len) << LOG_NR_BYTES); + // we are still in the incremental regime + end else begin + addr_o = cons_addr; + end + end + endcase + // save the request address for the next cycle + req_addr_d = addr_o; + // we can decrease the counter as the master has consumed the read data + cnt_d = cnt_q + 1; + + if (s_wlast) + state_d = SEND_B; + end + end + // ~> send a write acknowledge back + SEND_B: begin + s_bvalid = 1'b1; + s_bid = ax_req_q_id; + if (s_bready) + state_d = IDLE; + end + + endcase + end + + // -------------- + // Registers + // -------------- + always @(posedge clk or negedge resetn) begin + if (~resetn) begin + state_q <= IDLE; + ax_req_q_addr <= 32'h0; + ax_req_q_burst <= 2'h0; + ax_req_q_id <= 'h0; + ax_req_q_len <= 8'h0; + ax_req_q_size <= 3'h0; + req_addr_q <= 'h0; + cnt_q <= 8'h0; + end else begin + state_q <= state_d; + ax_req_q_addr <= ax_req_d_addr; + ax_req_q_burst <= ax_req_d_burst; + ax_req_q_id <= ax_req_d_id; + ax_req_q_len <= ax_req_d_len; + ax_req_q_size <= ax_req_d_size; + req_addr_q <= req_addr_d; + cnt_q <= cnt_d; + end + end +endmodule + diff --git a/rtl/ip/Bus_interconnects/axi2sram_sp_external.v b/rtl/ip/Bus_interconnects/axi2sram_sp_external.v new file mode 100644 index 0000000..1bb30d1 --- /dev/null +++ b/rtl/ip/Bus_interconnects/axi2sram_sp_external.v @@ -0,0 +1,380 @@ +// Copyright 2018 ETH Zurich and University of Bologna. +// Copyright and related rights are licensed under the Solderpad Hardware +// License, Version 0.51 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://solderpad.org/licenses/SHL-0.51. Unless required by applicable law +// or agreed to in writing, software, hardware and materials distributed under +// this License 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. +// +// ---------------------------- +// AXI to SRAM Adapter +// ---------------------------- +// Author: Florian Zaruba (zarubaf@iis.ee.ethz.ch) +// +// Description: Manages AXI transactions +// Supports all burst accesses but only on aligned addresses and with full data width. +// Assertions should guide you if there is something unsupported happening. +// +module axi2sram_sp_external #( + parameter AXI_ID_WIDTH = 5, + parameter AXI_ADDR_WIDTH = 32, + parameter AXI_DATA_WIDTH = 32 +)( + input clk, + input resetn, + + input [AXI_ADDR_WIDTH-1:0] s_araddr , + input [1 :0] s_arburst, + input [3 :0] s_arcache, + input [AXI_ID_WIDTH-1 :0] s_arid , + input [7 :0] s_arlen , + input s_arlock , + input [2 :0] s_arprot , + output reg s_arready, + input [2 :0] s_arsize , + input s_arvalid, + input [AXI_ADDR_WIDTH-1:0] s_awaddr , + input [1 :0] s_awburst, + input [3 :0] s_awcache, + input [AXI_ID_WIDTH-1 :0] s_awid , + input [7 :0] s_awlen , + input s_awlock , + input [2 :0] s_awprot , + output reg s_awready, + input [2 :0] s_awsize , + input s_awvalid, + output reg [AXI_ID_WIDTH-1 :0] s_bid , + input s_bready , + output reg [1 :0] s_bresp , + output reg s_bvalid , + output reg [AXI_DATA_WIDTH-1:0] s_rdata , + output reg [AXI_ID_WIDTH-1 :0] s_rid , + output reg s_rlast , + input s_rready , + output reg [1 :0] s_rresp , + output reg s_rvalid , + input [AXI_DATA_WIDTH-1:0] s_wdata , + input s_wlast , + output reg s_wready , + input [AXI_DATA_WIDTH/8-1:0] s_wstrb , + input s_wvalid , + + output reg req_o, + output reg we_o, + output reg [AXI_ADDR_WIDTH-1:0] addr_o, + output reg [AXI_DATA_WIDTH/8-1:0] be_o, + output reg [AXI_DATA_WIDTH-1:0] data_o, + input [AXI_DATA_WIDTH-1:0] data_i +); + // AXI has the following rules governing the use of bursts: + // - for wrapping bursts, the burst length must be 2, 4, 8, or 16 + // - a burst must not cross a 4KB address boundary + // - early termination of bursts is not supported. + + localparam LOG_NR_BYTES = $clog2(AXI_DATA_WIDTH/8); + + reg [AXI_ID_WIDTH-1:0] ax_req_d_id; + reg [AXI_ADDR_WIDTH-1:0] ax_req_d_addr; + reg [7:0] ax_req_d_len; + reg [2:0] ax_req_d_size; + reg [1:0] ax_req_d_burst; + + reg [AXI_ID_WIDTH-1:0] ax_req_q_id; + reg [AXI_ADDR_WIDTH-1:0] ax_req_q_addr; + reg [7:0] ax_req_q_len; + reg [2:0] ax_req_q_size; + reg [1:0] ax_req_q_burst; + + reg [2:0] state_d; + reg [2:0] state_q; + + localparam IDLE = 3'h0; + localparam READ = 3'h1; + localparam WRITE = 3'h2; + localparam SEND_B = 3'h3; + localparam WAIT_WVALID = 3'h4; + localparam WRITE_NOP = 3'h5; + localparam READ_ADDR = 3'h6; + + localparam FIXED = 2'b00; + localparam INCR = 2'b01; + localparam WRAP = 2'b10; + + reg [AXI_ADDR_WIDTH-1:0] req_addr_d, req_addr_q; + reg [7:0] cnt_d, cnt_q; + + function automatic [AXI_ADDR_WIDTH-1:0] get_wrap_boundary; + input [AXI_ADDR_WIDTH-1:0] unaligned_address; + input [7:0] len; + begin + get_wrap_boundary = 'h0; + // for wrapping transfers ax_len can only be of size 1, 3, 7 or 15 + if (len == 4'b1) + get_wrap_boundary[AXI_ADDR_WIDTH-1:1+LOG_NR_BYTES] = unaligned_address[AXI_ADDR_WIDTH-1:1+LOG_NR_BYTES]; + else if (len == 4'b11) + get_wrap_boundary[AXI_ADDR_WIDTH-1:2+LOG_NR_BYTES] = unaligned_address[AXI_ADDR_WIDTH-1:2+LOG_NR_BYTES]; + else if (len == 4'b111) + get_wrap_boundary[AXI_ADDR_WIDTH-1:3+LOG_NR_BYTES] = unaligned_address[AXI_ADDR_WIDTH-3:2+LOG_NR_BYTES]; + else if (len == 4'b1111) + get_wrap_boundary[AXI_ADDR_WIDTH-1:4+LOG_NR_BYTES] = unaligned_address[AXI_ADDR_WIDTH-3:4+LOG_NR_BYTES]; + end + endfunction + + reg [AXI_ADDR_WIDTH-1:0] aligned_address; + reg [AXI_ADDR_WIDTH-1:0] wrap_boundary; + reg [AXI_ADDR_WIDTH-1:0] upper_wrap_boundary; + reg [AXI_ADDR_WIDTH-1:0] cons_addr; + + always @ (*) begin + // address generation + aligned_address = {ax_req_q_addr[AXI_ADDR_WIDTH-1:LOG_NR_BYTES], {{LOG_NR_BYTES}{1'b0}}}; + wrap_boundary = get_wrap_boundary(ax_req_q_addr, ax_req_q_len); + // this will overflow + upper_wrap_boundary = wrap_boundary + ((ax_req_q_len + 1) << LOG_NR_BYTES); + // calculate consecutive address + cons_addr = aligned_address + (cnt_q << LOG_NR_BYTES); + + // Transaction attributes + // default assignments + state_d = state_q; + ax_req_d_id = ax_req_q_id; + ax_req_d_addr = ax_req_q_addr; + ax_req_d_len = ax_req_q_len; + ax_req_d_size = ax_req_q_size; + ax_req_d_burst = ax_req_q_burst; + req_addr_d = req_addr_q; + cnt_d = cnt_q; + // Memory default assignments + data_o = s_wdata; + be_o = s_wstrb; + we_o = 1'b0; + req_o = 1'b0; + addr_o = 'h0; + // AXI assignments + // request + s_awready = 1'b0; + s_arready = 1'b0; + // read response channel + s_rvalid = 1'b0; + s_rresp = 'h0; + s_rlast = 'h0; + s_rid = ax_req_q_id; + // slave write data channel + s_wready = 1'b0; + // write response channel + s_bvalid = 1'b0; + s_bresp = 1'b0; + s_bid = 1'b0; + + case (state_q) + + IDLE: begin + // Wait for a read or write + // ------------ + // Read + // ------------ + if (s_arvalid) begin + s_arready = 1'b1; + // sample ax + ax_req_d_id = s_arid; + ax_req_d_addr = s_araddr; + ax_req_d_len = s_arlen; + ax_req_d_size = s_arsize; + ax_req_d_burst = s_arburst; + state_d = READ; + // we can request the first address, this saves us time + req_o = 1'b1; + addr_o = s_araddr; + // save the address + req_addr_d = s_araddr; + // save the ar_len + cnt_d = 1; + // ------------ + // Write + // ------------ + end else if (s_awvalid) begin + s_awready = 1'b1; + s_wready = 1'b1; + addr_o = s_awaddr; + // sample ax + ax_req_d_id = s_awid; + ax_req_d_addr = s_awaddr; + ax_req_d_len = s_awlen; + ax_req_d_size = s_awsize; + ax_req_d_burst = s_awburst; + // we've got our first w_valid so start the write process + if (s_wvalid) begin + req_o = 1'b1; + we_o = 1'b1; + state_d = (s_wlast) ? SEND_B : WRITE_NOP; + cnt_d = 1; + // we still have to wait for the first w_valid to arrive + end else + state_d = WAIT_WVALID; + end + end + + // ~> we are still missing a w_valid + WAIT_WVALID: begin + s_wready = 1'b1; + addr_o = ax_req_q_addr; + // we can now make our first request + if (s_wvalid) begin + req_o = 1'b1; + we_o = 1'b1; + state_d = (s_wlast) ? SEND_B : WRITE; + cnt_d = 1; + end + end + + READ: begin + // keep request to memory high + req_o = 1'b1; + addr_o = req_addr_q; + // send the response + s_rvalid = 1'b1; + s_rdata = data_i; + s_rid = ax_req_q_id; + s_rlast = (cnt_q == ax_req_q_len + 1); + // check that the master is ready, the slave must not wait on this + if (s_rready) begin + // we sent the last byte -> go back to idle + if (s_rlast) begin + state_d = IDLE; + // we already got everything + end + else begin + state_d = READ_ADDR; + end + end + end + + READ_ADDR: begin + // keep request to memory high + req_o = 1'b1; + // send the response + s_rvalid = 1'b0; + // ---------------------------- + // Next address generation + // ---------------------------- + // handle the correct burst type + case (ax_req_q_burst) + FIXED, INCR: addr_o = cons_addr; + WRAP: begin + // check if the address reached warp boundary + if (cons_addr == upper_wrap_boundary) begin + addr_o = wrap_boundary; + // address warped beyond boundary + end else if (cons_addr > upper_wrap_boundary) begin + addr_o = ax_req_q_addr + ((cnt_q - ax_req_q_len) << LOG_NR_BYTES); + // we are still in the incremental regime + end else begin + addr_o = cons_addr; + end + end + endcase + // we need to change the address here for the upcoming request + // we can decrease the counter as the master has consumed the read data + cnt_d = cnt_q + 1; + // save the request address for the next cycle + req_addr_d = addr_o; + state_d = READ; + end + + //ext SRAM need nop between continuous write operations + WRITE_NOP: begin + s_wready = 1'b0; + state_d = WRITE; + end + + // ~> we already wrote the first word here + WRITE: begin + + s_wready = 1'b1; + state_d = WRITE_NOP; + + // consume a word here + if (s_wvalid) begin + req_o = 1'b1; + we_o = 1'b1; + // ---------------------------- + // Next address generation + // ---------------------------- + // handle the correct burst type + case (ax_req_q_burst) + + FIXED, INCR: addr_o = cons_addr; + WRAP: begin + // check if the address reached warp boundary + if (cons_addr == upper_wrap_boundary) begin + addr_o = wrap_boundary; + // address warped beyond boundary + end else if (cons_addr > upper_wrap_boundary) begin + addr_o = ax_req_q_addr + ((cnt_q - ax_req_q_len) << LOG_NR_BYTES); + // we are still in the incremental regime + end else begin + addr_o = cons_addr; + end + end + endcase + // save the request address for the next cycle + req_addr_d = addr_o; + // we can decrease the counter as the master has consumed the read data + cnt_d = cnt_q + 1; + + if (s_wlast) + state_d = SEND_B; + end + end + // ~> send a write acknowledge back + SEND_B: begin + s_bvalid = 1'b1; + s_bid = ax_req_q_id; + if (s_bready) + state_d = IDLE; + end + + endcase + end + + // -------------- + // Registers + // -------------- + always @(posedge clk or negedge resetn) begin + if (~resetn) begin + state_q <= IDLE; + ax_req_q_addr <= 32'h0; + ax_req_q_burst <= 2'h0; + ax_req_q_id <= 'h0; + ax_req_q_len <= 8'h0; + ax_req_q_size <= 3'h0; + req_addr_q <= 'h0; + cnt_q <= 8'h0; + end else begin + state_q <= state_d; + ax_req_q_addr <= ax_req_d_addr; + ax_req_q_burst <= ax_req_d_burst; + ax_req_q_id <= ax_req_d_id; + ax_req_q_len <= ax_req_d_len; + ax_req_q_size <= ax_req_d_size; + req_addr_q <= req_addr_d; + cnt_q <= cnt_d; + end + end + + + // always @(posedge clk or negedge resetn) begin + // if (~resetn) begin + // s_rdata <= 'h0; + // end else begin + // if(req_o == 1'b1 && we_o == 1'b0) + // s_rdata <= data_i; + // else + // s_rdata <= s_rdata; + // end + // end + +endmodule + diff --git a/rtl/ip/DVI/axi_dvi.v b/rtl/ip/DVI/axi_dvi.v new file mode 100644 index 0000000..b77b165 --- /dev/null +++ b/rtl/ip/DVI/axi_dvi.v @@ -0,0 +1,258 @@ +module axi_dvi # +( + parameter WIDTH = 12, // hdata and vdata width (in bits) + parameter HSIZE = 800, // Horizontal size of visible area + parameter HFP = 856, // Horizontal front porch + parameter HSP = 976, // Horizontal sync pulse + parameter HMAX = 1040, // Horizontal total size + parameter VSIZE = 600, // Vertical size of visible area + parameter VFP = 637, // Vertical front porch + parameter VSP = 643, // Vertical sync pulse + parameter VMAX = 666, // Vertical total size + parameter HSPP = 1, // Horizontal sync pulse polarity (1 for positive) + parameter VSPP = 1 // Vertical sync pulse polarity (1 for positive) +) +( + input s_awvalid, + output s_awready, + input [31:0] s_awaddr, + input [4:0] s_awid, + input [7:0] s_awlen, + input [2:0] s_awsize, + input [1:0] s_awburst, + input [0:0] s_awlock, + input [3:0] s_awcache, + input [2:0] s_awprot, + input s_wvalid, + output s_wready, + input [31:0] s_wdata, + input [3:0] s_wstrb, + input s_wlast, + output s_bvalid, + input s_bready, + output [4:0] s_bid, + output [1:0] s_bresp, + input s_arvalid, + output s_arready, + input [31:0] s_araddr, + input [4:0] s_arid, + input [7:0] s_arlen, + input [2:0] s_arsize, + input [1:0] s_arburst, + input [0:0] s_arlock, + input [3:0] s_arcache, + input [2:0] s_arprot, + output s_rvalid, + input s_rready, + output [31:0] s_rdata, + output [4:0] s_rid, + output [1:0] s_rresp, + output s_rlast, + + output video_clk, // Video clock signal + output hsync, // Horizontal sync signal + output vsync, // Vertical sync signal + output data_enable, // Data enable signal + output [2:0] video_red, // Red color signal (3 bits) + output [2:0] video_green, // Green color signal (3 bits) + output [1:0] video_blue, // Blue color signal (2 bits) + + input aclk, + input aresetn +); + + reg [31:0] DVI_RECT_DIR,DVI_RECT_L_W,DVI_SQU_DIR,DVI_SQU_R; + + reg busy,write,R_or_W; + reg s_wready; + + wire ar_enter = s_arvalid & s_arready; + wire r_retire = s_rvalid & s_rready & s_rlast; + wire aw_enter = s_awvalid & s_awready; + wire w_enter = s_wvalid & s_wready & s_wlast; + wire b_retire = s_bvalid & s_bready; + + assign s_arready = ~busy & (!R_or_W| !s_awvalid); + assign s_awready = ~busy & ( R_or_W| !s_arvalid); + + always@(posedge aclk) + if(~aresetn) busy <= 1'b0; + else if(ar_enter|aw_enter) busy <= 1'b1; + else if(r_retire|b_retire) busy <= 1'b0; + + reg [3 :0] buf_id; + reg [31:0] buf_addr; + reg [7 :0] buf_len; + reg [2 :0] buf_size; + reg [1 :0] buf_burst; + reg buf_lock; + reg [3 :0] buf_cache; + reg [2 :0] buf_prot; + + always@(posedge aclk) begin + if(~aresetn) begin + R_or_W <= 1'b0; + buf_id <= 'b0; + buf_addr <= 'b0; + buf_len <= 'b0; + buf_size <= 'b0; + buf_burst <= 'b0; + buf_lock <= 'b0; + buf_cache <= 'b0; + buf_prot <= 'b0; + end + else + if(ar_enter | aw_enter) begin + R_or_W <= ar_enter; + buf_id <= ar_enter ? s_arid : s_awid ; + buf_addr <= ar_enter ? s_araddr : s_awaddr ; + buf_len <= ar_enter ? s_arlen : s_awlen ; + buf_size <= ar_enter ? s_arsize : s_awsize ; + buf_burst <= ar_enter ? s_arburst: s_awburst; + buf_lock <= ar_enter ? s_arlock : s_awlock ; + buf_cache <= ar_enter ? s_arcache: s_awcache; + buf_prot <= ar_enter ? s_arprot : s_awprot ; + end + end + + always@(posedge aclk) + if(~aresetn) write <= 1'b0; + else if(aw_enter) write <= 1'b1; + else if(ar_enter) write <= 1'b0; + + always@(posedge aclk) + if(~aresetn) s_wready <= 1'b0; + else if(aw_enter) s_wready <= 1'b1; + else if(w_enter & s_wlast) s_wready <= 1'b0; + + + reg [31:0] s_rdata; + reg s_rvalid,s_rlast; + wire [31:0] rdata_d = buf_addr[15:0] == 16'h0 ? DVI_RECT_DIR : + buf_addr[15:0] == 16'h4 ? DVI_RECT_L_W : + buf_addr[15:0] == 16'h8 ? DVI_SQU_DIR : + buf_addr[15:0] == 16'hc ? DVI_SQU_R : + 32'd0; + + always@(posedge aclk)begin + if(~aresetn) begin + s_rdata <= 'b0; + s_rvalid <= 1'b0; + s_rlast <= 1'b0; + end + else if(busy & !write & !r_retire) + begin + s_rdata <= rdata_d; + s_rvalid <= 1'b1; + s_rlast <= 1'b1; + end + else if(r_retire) + begin + s_rvalid <= 1'b0; + end + end + + reg s_bvalid; + always@(posedge aclk) begin + if(~aresetn) s_bvalid <= 1'b0; + else if(w_enter) s_bvalid <= 1'b1; + else if(b_retire) s_bvalid <= 1'b0; + end + assign s_rid = buf_id; + assign s_bid = buf_id; + assign s_bresp = 2'b0; + assign s_rresp = 2'b0; + + +//-------------------------------{dvi controller}begin----------------------------// + wire write_reg_en[3:0]; + assign write_reg_en[0] = w_enter & (buf_addr[15:0]==16'h0); + assign write_reg_en[1] = w_enter & (buf_addr[15:0]==16'h4); + assign write_reg_en[2] = w_enter & (buf_addr[15:0]==16'h8); + assign write_reg_en[3] = w_enter & (buf_addr[15:0]==16'hc); + + always @(posedge aclk) begin + if(!aresetn) begin + DVI_RECT_DIR <= 32'h0; + end + else if (write_reg_en[0]) begin + DVI_RECT_DIR <= s_wdata; + end + end + + always @(posedge aclk) begin + if(!aresetn) begin + DVI_RECT_L_W <= 32'h0; + end + else if (write_reg_en[1]) begin + DVI_RECT_L_W <= s_wdata; + end + end + + always @(posedge aclk) begin + if(!aresetn) begin + DVI_SQU_DIR <= 32'h0; + end + else if (write_reg_en[2]) begin + DVI_SQU_DIR <= s_wdata; + end + end + + always @(posedge aclk) begin + if(!aresetn) begin + DVI_SQU_R <= 32'h0; + end + else if (write_reg_en[3]) begin + DVI_SQU_R <= s_wdata; + end + end + + reg [WIDTH-1:0] hdata = 0; // Horizontal position counter + reg [WIDTH-1:0] vdata = 0; // Vertical position counter + + wire hdata_in_range; + wire vdata_in_range; + + wire hdata1_in_range; + wire vdata1_in_range; + + always @(posedge aclk) begin + if (hdata == (HMAX - 1)) // If horizontal counter reaches max + hdata <= 0; // Reset horizontal counter + else + hdata <= hdata + 1; // Increment horizontal counter + end + + // Vertical counter (vdata) logic + always @(posedge aclk) begin + if (hdata == (HMAX - 1)) begin + if (vdata == (VMAX - 1)) // If vertical counter reaches max + vdata <= 0; // Reset vertical counter + else + vdata <= vdata + 1; // Increment vertical counter + end + end + + // Horizontal sync signal generation (hsync) + assign video_clk = aclk; // Example: using input clock as video clock + assign hsync = ((hdata >= HFP) && (hdata < HSP)) ? HSPP : !HSPP; + assign vsync = ((vdata >= VFP) && (vdata < VSP)) ? VSPP : !VSPP; + assign data_enable = ((hdata < HSIZE) & (vdata < VSIZE)); + + assign hdata_in_range = (hdata > (DVI_RECT_DIR[31:16]-DVI_RECT_L_W[31:16])) && (hdata < (DVI_RECT_DIR[31:16]+DVI_RECT_L_W[31:16])); + // Check if vdata is in the range specified by DVI_RECT_L_W + assign vdata_in_range = (vdata > DVI_RECT_DIR[15:0]) && (vdata <(DVI_RECT_DIR[15:0]+DVI_RECT_L_W[15:0])); + + assign hdata1_in_range = (hdata > (DVI_SQU_DIR[31:16]-DVI_SQU_R[31:16])) && (hdata < (DVI_SQU_DIR[31:16]+DVI_SQU_R[31:16])); + // Check if vdata is in the range specified by DVI_RECT_L_W + assign vdata1_in_range = (vdata > (DVI_SQU_DIR[15:0]-DVI_SQU_R[15:0])) && (vdata <(DVI_SQU_DIR[15:0]+DVI_SQU_R[15:0])); + + // Set video output colors based on conditions + assign video_red = ((hdata_in_range && vdata_in_range)||(hdata1_in_range && vdata1_in_range)) ? 3'b111 : 3'b0; + assign video_green = 3'b0; + assign video_blue = 2'b0; + +//--------------------------------{dvi controller}end-----------------------------// + + +endmodule \ No newline at end of file diff --git a/rtl/ip/PLL_2019_2/clk_pll_sim_netlist.v b/rtl/ip/PLL_2019_2/clk_pll_sim_netlist.v new file mode 100644 index 0000000..bf7a3d9 --- /dev/null +++ b/rtl/ip/PLL_2019_2/clk_pll_sim_netlist.v @@ -0,0 +1,224 @@ +// Copyright 1986-2019 Xilinx, Inc. All Rights Reserved. +// -------------------------------------------------------------------------------- +// Tool Version: Vivado v.2019.2 (lin64) Build 2708876 Wed Nov 6 21:39:14 MST 2019 +// Date : Tue Jun 23 00:27:14 2026 +// Host : fedora running 64-bit unknown +// Command : write_verilog -force -mode funcsim +// /home/fallensigh/Dev/ciciec2026_loongson_regional/rtl/ip/PLL_2019_2/clk_pll_sim_netlist.v +// Design : clk_pll +// Purpose : This verilog netlist is a functional simulation representation of the design and should not be modified +// or synthesized. This netlist cannot be used for SDF annotated simulation. +// Device : xc7a200tfbg676-1 +// -------------------------------------------------------------------------------- +`timescale 1 ps / 1 ps + +(* NotValidForBitStream *) +module clk_pll + (cpu_clk, + sys_clk, + resetn, + locked, + clk_in1); + output cpu_clk; + output sys_clk; + input resetn; + output locked; + input clk_in1; + + (* IBUF_LOW_PWR *) wire clk_in1; + wire cpu_clk; + wire locked; + wire resetn; + wire sys_clk; + + clk_pll_clk_pll_clk_wiz inst + (.clk_in1(clk_in1), + .cpu_clk(cpu_clk), + .locked(locked), + .resetn(resetn), + .sys_clk(sys_clk)); +endmodule + +(* ORIG_REF_NAME = "clk_pll_clk_wiz" *) +module clk_pll_clk_pll_clk_wiz + (cpu_clk, + sys_clk, + resetn, + locked, + clk_in1); + output cpu_clk; + output sys_clk; + input resetn; + output locked; + input clk_in1; + + wire clk_in1; + wire clk_in1_clk_pll; + wire clkfbout_buf_clk_pll; + wire clkfbout_clk_pll; + wire cpu_clk; + wire cpu_clk_clk_pll; + wire locked; + wire reset_high; + wire resetn; + wire sys_clk; + wire sys_clk_clk_pll; + wire NLW_plle2_adv_inst_CLKOUT2_UNCONNECTED; + wire NLW_plle2_adv_inst_CLKOUT3_UNCONNECTED; + wire NLW_plle2_adv_inst_CLKOUT4_UNCONNECTED; + wire NLW_plle2_adv_inst_CLKOUT5_UNCONNECTED; + wire NLW_plle2_adv_inst_DRDY_UNCONNECTED; + wire [15:0]NLW_plle2_adv_inst_DO_UNCONNECTED; + + (* BOX_TYPE = "PRIMITIVE" *) + BUFG clkf_buf + (.I(clkfbout_clk_pll), + .O(clkfbout_buf_clk_pll)); + (* BOX_TYPE = "PRIMITIVE" *) + (* CAPACITANCE = "DONT_CARE" *) + (* IBUF_DELAY_VALUE = "0" *) + (* IFD_DELAY_VALUE = "AUTO" *) + IBUF #( + .IOSTANDARD("DEFAULT")) + clkin1_ibufg + (.I(clk_in1), + .O(clk_in1_clk_pll)); + (* BOX_TYPE = "PRIMITIVE" *) + BUFG clkout1_buf + (.I(cpu_clk_clk_pll), + .O(cpu_clk)); + (* BOX_TYPE = "PRIMITIVE" *) + BUFG clkout2_buf + (.I(sys_clk_clk_pll), + .O(sys_clk)); + (* BOX_TYPE = "PRIMITIVE" *) + PLLE2_ADV #( + .BANDWIDTH("OPTIMIZED"), + .CLKFBOUT_MULT(31), + .CLKFBOUT_PHASE(0.000000), + .CLKIN1_PERIOD(20.000000), + .CLKIN2_PERIOD(0.000000), + .CLKOUT0_DIVIDE(47), + .CLKOUT0_DUTY_CYCLE(0.500000), + .CLKOUT0_PHASE(0.000000), + .CLKOUT1_DIVIDE(31), + .CLKOUT1_DUTY_CYCLE(0.500000), + .CLKOUT1_PHASE(0.000000), + .CLKOUT2_DIVIDE(1), + .CLKOUT2_DUTY_CYCLE(0.500000), + .CLKOUT2_PHASE(0.000000), + .CLKOUT3_DIVIDE(1), + .CLKOUT3_DUTY_CYCLE(0.500000), + .CLKOUT3_PHASE(0.000000), + .CLKOUT4_DIVIDE(1), + .CLKOUT4_DUTY_CYCLE(0.500000), + .CLKOUT4_PHASE(0.000000), + .CLKOUT5_DIVIDE(1), + .CLKOUT5_DUTY_CYCLE(0.500000), + .CLKOUT5_PHASE(0.000000), + .COMPENSATION("ZHOLD"), + .DIVCLK_DIVIDE(1), + .IS_CLKINSEL_INVERTED(1'b0), + .IS_PWRDWN_INVERTED(1'b0), + .IS_RST_INVERTED(1'b0), + .REF_JITTER1(0.010000), + .REF_JITTER2(0.010000), + .STARTUP_WAIT("FALSE")) + plle2_adv_inst + (.CLKFBIN(clkfbout_buf_clk_pll), + .CLKFBOUT(clkfbout_clk_pll), + .CLKIN1(clk_in1_clk_pll), + .CLKIN2(1'b0), + .CLKINSEL(1'b1), + .CLKOUT0(cpu_clk_clk_pll), + .CLKOUT1(sys_clk_clk_pll), + .CLKOUT2(NLW_plle2_adv_inst_CLKOUT2_UNCONNECTED), + .CLKOUT3(NLW_plle2_adv_inst_CLKOUT3_UNCONNECTED), + .CLKOUT4(NLW_plle2_adv_inst_CLKOUT4_UNCONNECTED), + .CLKOUT5(NLW_plle2_adv_inst_CLKOUT5_UNCONNECTED), + .DADDR({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .DCLK(1'b0), + .DEN(1'b0), + .DI({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .DO(NLW_plle2_adv_inst_DO_UNCONNECTED[15:0]), + .DRDY(NLW_plle2_adv_inst_DRDY_UNCONNECTED), + .DWE(1'b0), + .LOCKED(locked), + .PWRDWN(1'b0), + .RST(reset_high)); + LUT1 #( + .INIT(2'h1)) + plle2_adv_inst_i_1 + (.I0(resetn), + .O(reset_high)); +endmodule +`ifndef GLBL +`define GLBL +`timescale 1 ps / 1 ps + +module glbl (); + + parameter ROC_WIDTH = 100000; + parameter TOC_WIDTH = 0; + +//-------- STARTUP Globals -------------- + wire GSR; + wire GTS; + wire GWE; + wire PRLD; + tri1 p_up_tmp; + tri (weak1, strong0) PLL_LOCKG = p_up_tmp; + + wire PROGB_GLBL; + wire CCLKO_GLBL; + wire FCSBO_GLBL; + wire [3:0] DO_GLBL; + wire [3:0] DI_GLBL; + + reg GSR_int; + reg GTS_int; + reg PRLD_int; + +//-------- JTAG Globals -------------- + wire JTAG_TDO_GLBL; + wire JTAG_TCK_GLBL; + wire JTAG_TDI_GLBL; + wire JTAG_TMS_GLBL; + wire JTAG_TRST_GLBL; + + reg JTAG_CAPTURE_GLBL; + reg JTAG_RESET_GLBL; + reg JTAG_SHIFT_GLBL; + reg JTAG_UPDATE_GLBL; + reg JTAG_RUNTEST_GLBL; + + reg JTAG_SEL1_GLBL = 0; + reg JTAG_SEL2_GLBL = 0 ; + reg JTAG_SEL3_GLBL = 0; + reg JTAG_SEL4_GLBL = 0; + + reg JTAG_USER_TDO1_GLBL = 1'bz; + reg JTAG_USER_TDO2_GLBL = 1'bz; + reg JTAG_USER_TDO3_GLBL = 1'bz; + reg JTAG_USER_TDO4_GLBL = 1'bz; + + assign (strong1, weak0) GSR = GSR_int; + assign (strong1, weak0) GTS = GTS_int; + assign (weak1, weak0) PRLD = PRLD_int; + + initial begin + GSR_int = 1'b1; + PRLD_int = 1'b1; + #(ROC_WIDTH) + GSR_int = 1'b0; + PRLD_int = 1'b0; + end + + initial begin + GTS_int = 1'b1; + #(TOC_WIDTH) + GTS_int = 1'b0; + end + +endmodule +`endif diff --git a/rtl/ip/PLL_2019_2/clk_pll_sim_netlist.vhdl b/rtl/ip/PLL_2019_2/clk_pll_sim_netlist.vhdl new file mode 100644 index 0000000..39ea676 --- /dev/null +++ b/rtl/ip/PLL_2019_2/clk_pll_sim_netlist.vhdl @@ -0,0 +1,170 @@ +-- Copyright 1986-2019 Xilinx, Inc. All Rights Reserved. +-- -------------------------------------------------------------------------------- +-- Tool Version: Vivado v.2019.2 (lin64) Build 2708876 Wed Nov 6 21:39:14 MST 2019 +-- Date : Tue Jun 23 00:27:14 2026 +-- Host : fedora running 64-bit unknown +-- Command : write_vhdl -force -mode funcsim +-- /home/fallensigh/Dev/ciciec2026_loongson_regional/rtl/ip/PLL_2019_2/clk_pll_sim_netlist.vhdl +-- Design : clk_pll +-- Purpose : This VHDL netlist is a functional simulation representation of the design and should not be modified or +-- synthesized. This netlist cannot be used for SDF annotated simulation. +-- Device : xc7a200tfbg676-1 +-- -------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +library UNISIM; +use UNISIM.VCOMPONENTS.ALL; +entity clk_pll_clk_pll_clk_wiz is + port ( + cpu_clk : out STD_LOGIC; + sys_clk : out STD_LOGIC; + resetn : in STD_LOGIC; + locked : out STD_LOGIC; + clk_in1 : in STD_LOGIC + ); + attribute ORIG_REF_NAME : string; + attribute ORIG_REF_NAME of clk_pll_clk_pll_clk_wiz : entity is "clk_pll_clk_wiz"; +end clk_pll_clk_pll_clk_wiz; + +architecture STRUCTURE of clk_pll_clk_pll_clk_wiz is + signal clk_in1_clk_pll : STD_LOGIC; + signal clkfbout_buf_clk_pll : STD_LOGIC; + signal clkfbout_clk_pll : STD_LOGIC; + signal cpu_clk_clk_pll : STD_LOGIC; + signal reset_high : STD_LOGIC; + signal sys_clk_clk_pll : STD_LOGIC; + signal NLW_plle2_adv_inst_CLKOUT2_UNCONNECTED : STD_LOGIC; + signal NLW_plle2_adv_inst_CLKOUT3_UNCONNECTED : STD_LOGIC; + signal NLW_plle2_adv_inst_CLKOUT4_UNCONNECTED : STD_LOGIC; + signal NLW_plle2_adv_inst_CLKOUT5_UNCONNECTED : STD_LOGIC; + signal NLW_plle2_adv_inst_DRDY_UNCONNECTED : STD_LOGIC; + signal NLW_plle2_adv_inst_DO_UNCONNECTED : STD_LOGIC_VECTOR ( 15 downto 0 ); + attribute BOX_TYPE : string; + attribute BOX_TYPE of clkf_buf : label is "PRIMITIVE"; + attribute BOX_TYPE of clkin1_ibufg : label is "PRIMITIVE"; + attribute CAPACITANCE : string; + attribute CAPACITANCE of clkin1_ibufg : label is "DONT_CARE"; + attribute IBUF_DELAY_VALUE : string; + attribute IBUF_DELAY_VALUE of clkin1_ibufg : label is "0"; + attribute IFD_DELAY_VALUE : string; + attribute IFD_DELAY_VALUE of clkin1_ibufg : label is "AUTO"; + attribute BOX_TYPE of clkout1_buf : label is "PRIMITIVE"; + attribute BOX_TYPE of clkout2_buf : label is "PRIMITIVE"; + attribute BOX_TYPE of plle2_adv_inst : label is "PRIMITIVE"; +begin +clkf_buf: unisim.vcomponents.BUFG + port map ( + I => clkfbout_clk_pll, + O => clkfbout_buf_clk_pll + ); +clkin1_ibufg: unisim.vcomponents.IBUF + generic map( + IOSTANDARD => "DEFAULT" + ) + port map ( + I => clk_in1, + O => clk_in1_clk_pll + ); +clkout1_buf: unisim.vcomponents.BUFG + port map ( + I => cpu_clk_clk_pll, + O => cpu_clk + ); +clkout2_buf: unisim.vcomponents.BUFG + port map ( + I => sys_clk_clk_pll, + O => sys_clk + ); +plle2_adv_inst: unisim.vcomponents.PLLE2_ADV + generic map( + BANDWIDTH => "OPTIMIZED", + CLKFBOUT_MULT => 31, + CLKFBOUT_PHASE => 0.000000, + CLKIN1_PERIOD => 20.000000, + CLKIN2_PERIOD => 0.000000, + CLKOUT0_DIVIDE => 47, + CLKOUT0_DUTY_CYCLE => 0.500000, + CLKOUT0_PHASE => 0.000000, + CLKOUT1_DIVIDE => 31, + CLKOUT1_DUTY_CYCLE => 0.500000, + CLKOUT1_PHASE => 0.000000, + CLKOUT2_DIVIDE => 1, + CLKOUT2_DUTY_CYCLE => 0.500000, + CLKOUT2_PHASE => 0.000000, + CLKOUT3_DIVIDE => 1, + CLKOUT3_DUTY_CYCLE => 0.500000, + CLKOUT3_PHASE => 0.000000, + CLKOUT4_DIVIDE => 1, + CLKOUT4_DUTY_CYCLE => 0.500000, + CLKOUT4_PHASE => 0.000000, + CLKOUT5_DIVIDE => 1, + CLKOUT5_DUTY_CYCLE => 0.500000, + CLKOUT5_PHASE => 0.000000, + COMPENSATION => "ZHOLD", + DIVCLK_DIVIDE => 1, + IS_CLKINSEL_INVERTED => '0', + IS_PWRDWN_INVERTED => '0', + IS_RST_INVERTED => '0', + REF_JITTER1 => 0.010000, + REF_JITTER2 => 0.010000, + STARTUP_WAIT => "FALSE" + ) + port map ( + CLKFBIN => clkfbout_buf_clk_pll, + CLKFBOUT => clkfbout_clk_pll, + CLKIN1 => clk_in1_clk_pll, + CLKIN2 => '0', + CLKINSEL => '1', + CLKOUT0 => cpu_clk_clk_pll, + CLKOUT1 => sys_clk_clk_pll, + CLKOUT2 => NLW_plle2_adv_inst_CLKOUT2_UNCONNECTED, + CLKOUT3 => NLW_plle2_adv_inst_CLKOUT3_UNCONNECTED, + CLKOUT4 => NLW_plle2_adv_inst_CLKOUT4_UNCONNECTED, + CLKOUT5 => NLW_plle2_adv_inst_CLKOUT5_UNCONNECTED, + DADDR(6 downto 0) => B"0000000", + DCLK => '0', + DEN => '0', + DI(15 downto 0) => B"0000000000000000", + DO(15 downto 0) => NLW_plle2_adv_inst_DO_UNCONNECTED(15 downto 0), + DRDY => NLW_plle2_adv_inst_DRDY_UNCONNECTED, + DWE => '0', + LOCKED => locked, + PWRDWN => '0', + RST => reset_high + ); +plle2_adv_inst_i_1: unisim.vcomponents.LUT1 + generic map( + INIT => X"1" + ) + port map ( + I0 => resetn, + O => reset_high + ); +end STRUCTURE; +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +library UNISIM; +use UNISIM.VCOMPONENTS.ALL; +entity clk_pll is + port ( + cpu_clk : out STD_LOGIC; + sys_clk : out STD_LOGIC; + resetn : in STD_LOGIC; + locked : out STD_LOGIC; + clk_in1 : in STD_LOGIC + ); + attribute NotValidForBitStream : boolean; + attribute NotValidForBitStream of clk_pll : entity is true; +end clk_pll; + +architecture STRUCTURE of clk_pll is +begin +inst: entity work.clk_pll_clk_pll_clk_wiz + port map ( + clk_in1 => clk_in1, + cpu_clk => cpu_clk, + locked => locked, + resetn => resetn, + sys_clk => sys_clk + ); +end STRUCTURE; diff --git a/rtl/ip/PLL_2019_2/clk_pll_stub.v b/rtl/ip/PLL_2019_2/clk_pll_stub.v new file mode 100644 index 0000000..d6ce4de --- /dev/null +++ b/rtl/ip/PLL_2019_2/clk_pll_stub.v @@ -0,0 +1,23 @@ +// Copyright 1986-2019 Xilinx, Inc. All Rights Reserved. +// -------------------------------------------------------------------------------- +// Tool Version: Vivado v.2019.2 (lin64) Build 2708876 Wed Nov 6 21:39:14 MST 2019 +// Date : Tue Jun 23 00:27:14 2026 +// Host : fedora running 64-bit unknown +// Command : write_verilog -force -mode synth_stub +// /home/fallensigh/Dev/ciciec2026_loongson_regional/rtl/ip/PLL_2019_2/clk_pll_stub.v +// Design : clk_pll +// Purpose : Stub declaration of top-level module interface +// Device : xc7a200tfbg676-1 +// -------------------------------------------------------------------------------- + +// This empty module with port declaration file causes synthesis tools to infer a black box for IP. +// The synthesis directives are for Synopsys Synplify support to prevent IO buffer insertion. +// Please paste the declaration into a Verilog source file or add the file as an additional source. +module clk_pll(cpu_clk, sys_clk, resetn, locked, clk_in1) +/* synthesis syn_black_box black_box_pad_pin="cpu_clk,sys_clk,resetn,locked,clk_in1" */; + output cpu_clk; + output sys_clk; + input resetn; + output locked; + input clk_in1; +endmodule diff --git a/rtl/ip/PLL_2019_2/clk_pll_stub.vhdl b/rtl/ip/PLL_2019_2/clk_pll_stub.vhdl new file mode 100644 index 0000000..e5ecdc3 --- /dev/null +++ b/rtl/ip/PLL_2019_2/clk_pll_stub.vhdl @@ -0,0 +1,32 @@ +-- Copyright 1986-2019 Xilinx, Inc. All Rights Reserved. +-- -------------------------------------------------------------------------------- +-- Tool Version: Vivado v.2019.2 (lin64) Build 2708876 Wed Nov 6 21:39:14 MST 2019 +-- Date : Tue Jun 23 00:27:14 2026 +-- Host : fedora running 64-bit unknown +-- Command : write_vhdl -force -mode synth_stub +-- /home/fallensigh/Dev/ciciec2026_loongson_regional/rtl/ip/PLL_2019_2/clk_pll_stub.vhdl +-- Design : clk_pll +-- Purpose : Stub declaration of top-level module interface +-- Device : xc7a200tfbg676-1 +-- -------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; + +entity clk_pll is + Port ( + cpu_clk : out STD_LOGIC; + sys_clk : out STD_LOGIC; + resetn : in STD_LOGIC; + locked : out STD_LOGIC; + clk_in1 : in STD_LOGIC + ); + +end clk_pll; + +architecture stub of clk_pll is +attribute syn_black_box : boolean; +attribute black_box_pad_pin : string; +attribute syn_black_box of stub : architecture is true; +attribute black_box_pad_pin of stub : architecture is "cpu_clk,sys_clk,resetn,locked,clk_in1"; +begin +end; diff --git a/rtl/ip/axi_axil_adapter/axi_axil_adapter.v b/rtl/ip/axi_axil_adapter/axi_axil_adapter.v new file mode 100644 index 0000000..4593ea3 --- /dev/null +++ b/rtl/ip/axi_axil_adapter/axi_axil_adapter.v @@ -0,0 +1,223 @@ +/* + +Copyright (c) 2019 Alex Forencich + +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: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +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. + +*/ + +// Language: Verilog 2001 + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * AXI4 to AXI4-Lite adapter + */ +module axi_axil_adapter # +( + // Width of address bus in bits + parameter ADDR_WIDTH = 32, + // Width of input (slave) AXI interface data bus in bits + parameter AXI_DATA_WIDTH = 32, + // Width of input (slave) AXI interface wstrb (width of data bus in words) + parameter AXI_STRB_WIDTH = (AXI_DATA_WIDTH/8), + // Width of AXI ID signal + parameter AXI_ID_WIDTH = 8, + // Width of output (master) AXI lite interface data bus in bits + parameter AXIL_DATA_WIDTH = 32, + // Width of output (master) AXI lite interface wstrb (width of data bus in words) + parameter AXIL_STRB_WIDTH = (AXIL_DATA_WIDTH/8), + // When adapting to a wider bus, re-pack full-width burst instead of passing through narrow burst if possible + parameter CONVERT_BURST = 1, + // When adapting to a wider bus, re-pack all bursts instead of passing through narrow burst if possible + parameter CONVERT_NARROW_BURST = 0 +) +( + input wire clk, + input wire rst, + + /* + * AXI slave interface + */ + input wire [AXI_ID_WIDTH-1:0] s_axi_awid, + input wire [ADDR_WIDTH-1:0] s_axi_awaddr, + input wire [7:0] s_axi_awlen, + input wire [2:0] s_axi_awsize, + input wire [1:0] s_axi_awburst, + input wire s_axi_awlock, + input wire [3:0] s_axi_awcache, + input wire [2:0] s_axi_awprot, + input wire s_axi_awvalid, + output wire s_axi_awready, + input wire [AXI_DATA_WIDTH-1:0] s_axi_wdata, + input wire [AXI_STRB_WIDTH-1:0] s_axi_wstrb, + input wire s_axi_wlast, + input wire s_axi_wvalid, + output wire s_axi_wready, + output wire [AXI_ID_WIDTH-1:0] s_axi_bid, + output wire [1:0] s_axi_bresp, + output wire s_axi_bvalid, + input wire s_axi_bready, + input wire [AXI_ID_WIDTH-1:0] s_axi_arid, + input wire [ADDR_WIDTH-1:0] s_axi_araddr, + input wire [7:0] s_axi_arlen, + input wire [2:0] s_axi_arsize, + input wire [1:0] s_axi_arburst, + input wire s_axi_arlock, + input wire [3:0] s_axi_arcache, + input wire [2:0] s_axi_arprot, + input wire s_axi_arvalid, + output wire s_axi_arready, + output wire [AXI_ID_WIDTH-1:0] s_axi_rid, + output wire [AXI_DATA_WIDTH-1:0] s_axi_rdata, + output wire [1:0] s_axi_rresp, + output wire s_axi_rlast, + output wire s_axi_rvalid, + input wire s_axi_rready, + + /* + * AXI lite master interface + */ + output wire [ADDR_WIDTH-1:0] m_axil_awaddr, + output wire [2:0] m_axil_awprot, + output wire m_axil_awvalid, + input wire m_axil_awready, + output wire [AXIL_DATA_WIDTH-1:0] m_axil_wdata, + output wire [AXIL_STRB_WIDTH-1:0] m_axil_wstrb, + output wire m_axil_wvalid, + input wire m_axil_wready, + input wire [1:0] m_axil_bresp, + input wire m_axil_bvalid, + output wire m_axil_bready, + output wire [ADDR_WIDTH-1:0] m_axil_araddr, + output wire [2:0] m_axil_arprot, + output wire m_axil_arvalid, + input wire m_axil_arready, + input wire [AXIL_DATA_WIDTH-1:0] m_axil_rdata, + input wire [1:0] m_axil_rresp, + input wire m_axil_rvalid, + output wire m_axil_rready +); + + +axi_axil_adapter_wr #( + .ADDR_WIDTH(ADDR_WIDTH), + .AXI_DATA_WIDTH(AXI_DATA_WIDTH), + .AXI_STRB_WIDTH(AXI_STRB_WIDTH), + .AXI_ID_WIDTH(AXI_ID_WIDTH), + .AXIL_DATA_WIDTH(AXIL_DATA_WIDTH), + .AXIL_STRB_WIDTH(AXIL_STRB_WIDTH), + .CONVERT_BURST(CONVERT_BURST), + .CONVERT_NARROW_BURST(CONVERT_NARROW_BURST) +) +axi_axil_adapter_wr_inst ( + .clk(clk), + .rst(rst), + + /* + * AXI slave interface + */ + .s_axi_awid(s_axi_awid), + .s_axi_awaddr(s_axi_awaddr), + .s_axi_awlen(s_axi_awlen), + .s_axi_awsize(s_axi_awsize), + .s_axi_awburst(s_axi_awburst), + .s_axi_awlock(s_axi_awlock), + .s_axi_awcache(s_axi_awcache), + .s_axi_awprot(s_axi_awprot), + .s_axi_awvalid(s_axi_awvalid), + .s_axi_awready(s_axi_awready), + .s_axi_wdata(s_axi_wdata), + .s_axi_wstrb(s_axi_wstrb), + .s_axi_wlast(s_axi_wlast), + .s_axi_wvalid(s_axi_wvalid), + .s_axi_wready(s_axi_wready), + .s_axi_bid(s_axi_bid), + .s_axi_bresp(s_axi_bresp), + .s_axi_bvalid(s_axi_bvalid), + .s_axi_bready(s_axi_bready), + + /* + * AXI lite master interface + */ + .m_axil_awaddr(m_axil_awaddr), + .m_axil_awprot(m_axil_awprot), + .m_axil_awvalid(m_axil_awvalid), + .m_axil_awready(m_axil_awready), + .m_axil_wdata(m_axil_wdata), + .m_axil_wstrb(m_axil_wstrb), + .m_axil_wvalid(m_axil_wvalid), + .m_axil_wready(m_axil_wready), + .m_axil_bresp(m_axil_bresp), + .m_axil_bvalid(m_axil_bvalid), + .m_axil_bready(m_axil_bready) +); + +axi_axil_adapter_rd #( + .ADDR_WIDTH(ADDR_WIDTH), + .AXI_DATA_WIDTH(AXI_DATA_WIDTH), + .AXI_STRB_WIDTH(AXI_STRB_WIDTH), + .AXI_ID_WIDTH(AXI_ID_WIDTH), + .AXIL_DATA_WIDTH(AXIL_DATA_WIDTH), + .AXIL_STRB_WIDTH(AXIL_STRB_WIDTH), + .CONVERT_BURST(CONVERT_BURST), + .CONVERT_NARROW_BURST(CONVERT_NARROW_BURST) +) +axi_axil_adapter_rd_inst ( + .clk(clk), + .rst(rst), + + /* + * AXI slave interface + */ + .s_axi_arid(s_axi_arid), + .s_axi_araddr(s_axi_araddr), + .s_axi_arlen(s_axi_arlen), + .s_axi_arsize(s_axi_arsize), + .s_axi_arburst(s_axi_arburst), + .s_axi_arlock(s_axi_arlock), + .s_axi_arcache(s_axi_arcache), + .s_axi_arprot(s_axi_arprot), + .s_axi_arvalid(s_axi_arvalid), + .s_axi_arready(s_axi_arready), + .s_axi_rid(s_axi_rid), + .s_axi_rdata(s_axi_rdata), + .s_axi_rresp(s_axi_rresp), + .s_axi_rlast(s_axi_rlast), + .s_axi_rvalid(s_axi_rvalid), + .s_axi_rready(s_axi_rready), + + /* + * AXI lite master interface + */ + .m_axil_araddr(m_axil_araddr), + .m_axil_arprot(m_axil_arprot), + .m_axil_arvalid(m_axil_arvalid), + .m_axil_arready(m_axil_arready), + .m_axil_rdata(m_axil_rdata), + .m_axil_rresp(m_axil_rresp), + .m_axil_rvalid(m_axil_rvalid), + .m_axil_rready(m_axil_rready) +); + +endmodule + +`resetall diff --git a/rtl/ip/axi_axil_adapter/axi_axil_adapter_rd.v b/rtl/ip/axi_axil_adapter/axi_axil_adapter_rd.v new file mode 100644 index 0000000..e27dfa4 --- /dev/null +++ b/rtl/ip/axi_axil_adapter/axi_axil_adapter_rd.v @@ -0,0 +1,507 @@ +/* + +Copyright (c) 2019 Alex Forencich + +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: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +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. + +*/ + +// Language: Verilog 2001 + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * AXI4 to AXI4-Lite adapter (read) + */ +module axi_axil_adapter_rd # +( + // Width of address bus in bits + parameter ADDR_WIDTH = 32, + // Width of input (slave) AXI interface data bus in bits + parameter AXI_DATA_WIDTH = 32, + // Width of input (slave) AXI interface wstrb (width of data bus in words) + parameter AXI_STRB_WIDTH = (AXI_DATA_WIDTH/8), + // Width of AXI ID signal + parameter AXI_ID_WIDTH = 8, + // Width of output (master) AXI lite interface data bus in bits + parameter AXIL_DATA_WIDTH = 32, + // Width of output (master) AXI lite interface wstrb (width of data bus in words) + parameter AXIL_STRB_WIDTH = (AXIL_DATA_WIDTH/8), + // When adapting to a wider bus, re-pack full-width burst instead of passing through narrow burst if possible + parameter CONVERT_BURST = 1, + // When adapting to a wider bus, re-pack all bursts instead of passing through narrow burst if possible + parameter CONVERT_NARROW_BURST = 0 +) +( + input wire clk, + input wire rst, + + /* + * AXI slave interface + */ + input wire [AXI_ID_WIDTH-1:0] s_axi_arid, + input wire [ADDR_WIDTH-1:0] s_axi_araddr, + input wire [7:0] s_axi_arlen, + input wire [2:0] s_axi_arsize, + input wire [1:0] s_axi_arburst, + input wire s_axi_arlock, + input wire [3:0] s_axi_arcache, + input wire [2:0] s_axi_arprot, + input wire s_axi_arvalid, + output wire s_axi_arready, + output wire [AXI_ID_WIDTH-1:0] s_axi_rid, + output wire [AXI_DATA_WIDTH-1:0] s_axi_rdata, + output wire [1:0] s_axi_rresp, + output wire s_axi_rlast, + output wire s_axi_rvalid, + input wire s_axi_rready, + + /* + * AXI lite master interface + */ + output wire [ADDR_WIDTH-1:0] m_axil_araddr, + output wire [2:0] m_axil_arprot, + output wire m_axil_arvalid, + input wire m_axil_arready, + input wire [AXIL_DATA_WIDTH-1:0] m_axil_rdata, + input wire [1:0] m_axil_rresp, + input wire m_axil_rvalid, + output wire m_axil_rready +); + +parameter AXI_ADDR_BIT_OFFSET = $clog2(AXI_STRB_WIDTH); +parameter AXIL_ADDR_BIT_OFFSET = $clog2(AXIL_STRB_WIDTH); +parameter AXI_WORD_WIDTH = AXI_STRB_WIDTH; +parameter AXIL_WORD_WIDTH = AXIL_STRB_WIDTH; +parameter AXI_WORD_SIZE = AXI_DATA_WIDTH/AXI_WORD_WIDTH; +parameter AXIL_WORD_SIZE = AXIL_DATA_WIDTH/AXIL_WORD_WIDTH; +parameter AXI_BURST_SIZE = $clog2(AXI_STRB_WIDTH); +parameter AXIL_BURST_SIZE = $clog2(AXIL_STRB_WIDTH); + +// output bus is wider +parameter EXPAND = AXIL_STRB_WIDTH > AXI_STRB_WIDTH; +parameter DATA_WIDTH = EXPAND ? AXIL_DATA_WIDTH : AXI_DATA_WIDTH; +parameter STRB_WIDTH = EXPAND ? AXIL_STRB_WIDTH : AXI_STRB_WIDTH; +// required number of segments in wider bus +parameter SEGMENT_COUNT = EXPAND ? (AXIL_STRB_WIDTH / AXI_STRB_WIDTH) : (AXI_STRB_WIDTH / AXIL_STRB_WIDTH); +// data width and keep width per segment +parameter SEGMENT_DATA_WIDTH = DATA_WIDTH / SEGMENT_COUNT; +parameter SEGMENT_STRB_WIDTH = STRB_WIDTH / SEGMENT_COUNT; + +// bus width assertions +initial begin + if (AXI_WORD_SIZE * AXI_STRB_WIDTH != AXI_DATA_WIDTH) begin + $error("Error: AXI slave interface data width not evenly divisble (instance %m)"); + $finish; + end + + if (AXIL_WORD_SIZE * AXIL_STRB_WIDTH != AXIL_DATA_WIDTH) begin + $error("Error: AXI lite master interface data width not evenly divisble (instance %m)"); + $finish; + end + + if (AXI_WORD_SIZE != AXIL_WORD_SIZE) begin + $error("Error: word size mismatch (instance %m)"); + $finish; + end + + if (2**$clog2(AXI_WORD_WIDTH) != AXI_WORD_WIDTH) begin + $error("Error: AXI slave interface word width must be even power of two (instance %m)"); + $finish; + end + + if (2**$clog2(AXIL_WORD_WIDTH) != AXIL_WORD_WIDTH) begin + $error("Error: AXI lite master interface word width must be even power of two (instance %m)"); + $finish; + end +end + +localparam SAFE_EXP_MSB = (AXIL_ADDR_BIT_OFFSET > AXI_ADDR_BIT_OFFSET) ? AXIL_ADDR_BIT_OFFSET - 1 : AXI_ADDR_BIT_OFFSET; +localparam SAFE_EXP_LSB = AXI_ADDR_BIT_OFFSET; + +localparam SAFE_NAR_MSB = (AXI_ADDR_BIT_OFFSET > AXIL_ADDR_BIT_OFFSET) ? AXI_ADDR_BIT_OFFSET - 1 : AXIL_ADDR_BIT_OFFSET; +localparam SAFE_NAR_LSB = AXIL_ADDR_BIT_OFFSET; + +localparam [1:0] + STATE_IDLE = 2'd0, + STATE_DATA = 2'd1, + STATE_DATA_READ = 2'd2, + STATE_DATA_SPLIT = 2'd3; + +reg [1:0] state_reg = STATE_IDLE, state_next; + +reg [AXI_ID_WIDTH-1:0] id_reg = {AXI_ID_WIDTH{1'b0}}, id_next; +reg [ADDR_WIDTH-1:0] addr_reg = {ADDR_WIDTH{1'b0}}, addr_next; +reg [DATA_WIDTH-1:0] data_reg = {DATA_WIDTH{1'b0}}, data_next; +reg [1:0] resp_reg = 2'd0, resp_next; +reg [7:0] burst_reg = 8'd0, burst_next; +reg [2:0] burst_size_reg = 3'd0, burst_size_next; +reg [7:0] master_burst_reg = 8'd0, master_burst_next; +reg [2:0] master_burst_size_reg = 3'd0, master_burst_size_next; + +reg s_axi_arready_reg = 1'b0, s_axi_arready_next; +reg [AXI_ID_WIDTH-1:0] s_axi_rid_reg = {AXI_ID_WIDTH{1'b0}}, s_axi_rid_next; +reg [AXI_DATA_WIDTH-1:0] s_axi_rdata_reg = {AXI_DATA_WIDTH{1'b0}}, s_axi_rdata_next; +reg [1:0] s_axi_rresp_reg = 2'd0, s_axi_rresp_next; +reg s_axi_rlast_reg = 1'b0, s_axi_rlast_next; +reg s_axi_rvalid_reg = 1'b0, s_axi_rvalid_next; + +reg [ADDR_WIDTH-1:0] m_axil_araddr_reg = {ADDR_WIDTH{1'b0}}, m_axil_araddr_next; +reg [2:0] m_axil_arprot_reg = 3'd0, m_axil_arprot_next; +reg m_axil_arvalid_reg = 1'b0, m_axil_arvalid_next; +reg m_axil_rready_reg = 1'b0, m_axil_rready_next; + +assign s_axi_arready = s_axi_arready_reg; +assign s_axi_rid = s_axi_rid_reg; +assign s_axi_rdata = s_axi_rdata_reg; +assign s_axi_rresp = s_axi_rresp_reg; +assign s_axi_rlast = s_axi_rlast_reg; +assign s_axi_rvalid = s_axi_rvalid_reg; + +assign m_axil_araddr = m_axil_araddr_reg; +assign m_axil_arprot = m_axil_arprot_reg; +assign m_axil_arvalid = m_axil_arvalid_reg; +assign m_axil_rready = m_axil_rready_reg; + +always @* begin + state_next = STATE_IDLE; + + id_next = id_reg; + addr_next = addr_reg; + data_next = data_reg; + resp_next = resp_reg; + burst_next = burst_reg; + burst_size_next = burst_size_reg; + master_burst_next = master_burst_reg; + master_burst_size_next = master_burst_size_reg; + + s_axi_arready_next = 1'b0; + s_axi_rid_next = s_axi_rid_reg; + s_axi_rdata_next = s_axi_rdata_reg; + s_axi_rresp_next = s_axi_rresp_reg; + s_axi_rlast_next = s_axi_rlast_reg; + s_axi_rvalid_next = s_axi_rvalid_reg && !s_axi_rready; + m_axil_araddr_next = m_axil_araddr_reg; + m_axil_arprot_next = m_axil_arprot_reg; + m_axil_arvalid_next = m_axil_arvalid_reg && !m_axil_arready; + m_axil_rready_next = 1'b0; + + if (SEGMENT_COUNT == 1) begin + // master output is same width; direct transfer with no splitting/merging + case (state_reg) + STATE_IDLE: begin + // idle state; wait for new burst + s_axi_arready_next = !m_axil_arvalid; + + if (s_axi_arready && s_axi_arvalid) begin + s_axi_arready_next = 1'b0; + id_next = s_axi_arid; + m_axil_araddr_next = s_axi_araddr; + addr_next = s_axi_araddr; + burst_next = s_axi_arlen; + burst_size_next = s_axi_arsize; + m_axil_arprot_next = s_axi_arprot; + m_axil_arvalid_next = 1'b1; + m_axil_rready_next = 1'b0; + state_next = STATE_DATA; + end else begin + state_next = STATE_IDLE; + end + end + STATE_DATA: begin + // data state; transfer read data + m_axil_rready_next = !s_axi_rvalid && !m_axil_arvalid; + + if (m_axil_rready && m_axil_rvalid) begin + s_axi_rid_next = id_reg; + s_axi_rdata_next = m_axil_rdata; + s_axi_rresp_next = m_axil_rresp; + s_axi_rlast_next = 1'b0; + s_axi_rvalid_next = 1'b1; + burst_next = burst_reg - 1; + addr_next = addr_reg + (1 << burst_size_reg); + if (burst_reg == 0) begin + // last data word, return to idle + m_axil_rready_next = 1'b0; + s_axi_rlast_next = 1'b1; + s_axi_arready_next = !m_axil_arvalid; + state_next = STATE_IDLE; + end else begin + // start new AXI lite read + m_axil_araddr_next = addr_next; + m_axil_arvalid_next = 1'b1; + m_axil_rready_next = 1'b0; + state_next = STATE_DATA; + end + end else begin + state_next = STATE_DATA; + end + end + endcase + end else if (EXPAND) begin + // master output is wider; split reads + case (state_reg) + STATE_IDLE: begin + // idle state; wait for new burst + s_axi_arready_next = !m_axil_arvalid; + + if (s_axi_arready && s_axi_arvalid) begin + s_axi_arready_next = 1'b0; + id_next = s_axi_arid; + m_axil_araddr_next = s_axi_araddr; + addr_next = s_axi_araddr; + burst_next = s_axi_arlen; + burst_size_next = s_axi_arsize; + if (CONVERT_BURST && s_axi_arcache[1] && (CONVERT_NARROW_BURST || s_axi_arsize == AXI_BURST_SIZE)) begin + // split reads + // require CONVERT_BURST and arcache[1] set + master_burst_size_next = AXIL_BURST_SIZE; + state_next = STATE_DATA_READ; + end else begin + // output narrow burst + master_burst_size_next = s_axi_arsize; + state_next = STATE_DATA; + end + m_axil_arprot_next = s_axi_arprot; + m_axil_arvalid_next = 1'b1; + m_axil_rready_next = 1'b0; + end else begin + state_next = STATE_IDLE; + end + end + STATE_DATA: begin + m_axil_rready_next = !s_axi_rvalid && !m_axil_arvalid; + + if (m_axil_rready && m_axil_rvalid) begin + s_axi_rid_next = id_reg; + s_axi_rdata_next = m_axil_rdata >> (addr_reg[SAFE_EXP_MSB:SAFE_EXP_LSB] * AXI_DATA_WIDTH); + s_axi_rresp_next = m_axil_rresp; + s_axi_rlast_next = 1'b0; + s_axi_rvalid_next = 1'b1; + burst_next = burst_reg - 1; + addr_next = addr_reg + (1 << burst_size_reg); + if (burst_reg == 0) begin + // last data word, return to idle + m_axil_rready_next = 1'b0; + s_axi_rlast_next = 1'b1; + s_axi_arready_next = !m_axil_arvalid; + state_next = STATE_IDLE; + end else begin + // start new AXI lite read + m_axil_araddr_next = addr_next; + m_axil_arvalid_next = 1'b1; + m_axil_rready_next = 1'b0; + state_next = STATE_DATA; + end + end else begin + state_next = STATE_DATA; + end + end + STATE_DATA_READ: begin + m_axil_rready_next = !s_axi_rvalid && !m_axil_arvalid; + + if (m_axil_rready && m_axil_rvalid) begin + s_axi_rid_next = id_reg; + data_next = m_axil_rdata; + resp_next = m_axil_rresp; + s_axi_rdata_next = m_axil_rdata >> (addr_reg[SAFE_EXP_MSB:SAFE_EXP_LSB] * AXI_DATA_WIDTH); + s_axi_rresp_next = m_axil_rresp; + s_axi_rlast_next = 1'b0; + s_axi_rvalid_next = 1'b1; + burst_next = burst_reg - 1; + addr_next = addr_reg + (1 << burst_size_reg); + if (burst_reg == 0) begin + m_axil_rready_next = 1'b0; + s_axi_arready_next = !m_axil_arvalid; + s_axi_rlast_next = 1'b1; + state_next = STATE_IDLE; + end else if (addr_next[master_burst_size_reg] != addr_reg[master_burst_size_reg]) begin + // start new AXI lite read + m_axil_araddr_next = addr_next; + m_axil_arvalid_next = 1'b1; + m_axil_rready_next = 1'b0; + state_next = STATE_DATA_READ; + end else begin + m_axil_rready_next = 1'b0; + state_next = STATE_DATA_SPLIT; + end + end else begin + state_next = STATE_DATA_READ; + end + end + STATE_DATA_SPLIT: begin + m_axil_rready_next = 1'b0; + + if (s_axi_rready || !s_axi_rvalid) begin + s_axi_rid_next = id_reg; + s_axi_rdata_next = data_reg >> (addr_reg[SAFE_EXP_MSB:SAFE_EXP_LSB] * AXI_DATA_WIDTH); + s_axi_rresp_next = resp_reg; + s_axi_rlast_next = 1'b0; + s_axi_rvalid_next = 1'b1; + burst_next = burst_reg - 1; + addr_next = addr_reg + (1 << burst_size_reg); + if (burst_reg == 0) begin + s_axi_arready_next = !m_axil_arvalid; + s_axi_rlast_next = 1'b1; + state_next = STATE_IDLE; + end else if (addr_next[master_burst_size_reg] != addr_reg[master_burst_size_reg]) begin + // start new AXI lite read + m_axil_araddr_next = addr_next; + m_axil_arvalid_next = 1'b1; + m_axil_rready_next = 1'b0; + state_next = STATE_DATA_READ; + end else begin + state_next = STATE_DATA_SPLIT; + end + end else begin + state_next = STATE_DATA_SPLIT; + end + end + endcase + end else begin + // master output is narrower; merge reads and possibly split burst + case (state_reg) + STATE_IDLE: begin + // idle state; wait for new burst + s_axi_arready_next = !m_axil_arvalid; + + resp_next = 2'd0; + + if (s_axi_arready && s_axi_arvalid) begin + s_axi_arready_next = 1'b0; + id_next = s_axi_arid; + m_axil_araddr_next = s_axi_araddr; + addr_next = s_axi_araddr; + burst_next = s_axi_arlen; + burst_size_next = s_axi_arsize; + if (s_axi_arsize > AXIL_BURST_SIZE) begin + // need to adjust burst size + if (s_axi_arlen >> (8+AXIL_BURST_SIZE-s_axi_arsize) != 0) begin + // limit burst length to max + master_burst_next = (8'd255 << (s_axi_arsize-AXIL_BURST_SIZE)) | ((~s_axi_araddr & (8'hff >> (8-s_axi_arsize))) >> AXIL_BURST_SIZE); + end else begin + master_burst_next = (s_axi_arlen << (s_axi_arsize-AXIL_BURST_SIZE)) | ((~s_axi_araddr & (8'hff >> (8-s_axi_arsize))) >> AXIL_BURST_SIZE); + end + master_burst_size_next = AXIL_BURST_SIZE; + end else begin + // pass through narrow (enough) burst + master_burst_next = s_axi_arlen; + master_burst_size_next = s_axi_arsize; + end + m_axil_arprot_next = s_axi_arprot; + m_axil_arvalid_next = 1'b1; + m_axil_rready_next = 1'b0; + state_next = STATE_DATA; + end else begin + state_next = STATE_IDLE; + end + end + STATE_DATA: begin + m_axil_rready_next = !s_axi_rvalid && !m_axil_arvalid; + + if (m_axil_rready && m_axil_rvalid) begin + data_next[addr_reg[SAFE_NAR_MSB:SAFE_NAR_LSB]*SEGMENT_DATA_WIDTH +: SEGMENT_DATA_WIDTH] = m_axil_rdata; + if (m_axil_rresp) begin + resp_next = m_axil_rresp; + end + s_axi_rid_next = id_reg; + s_axi_rdata_next = data_next; + s_axi_rresp_next = resp_next; + s_axi_rlast_next = 1'b0; + s_axi_rvalid_next = 1'b0; + master_burst_next = master_burst_reg - 1; + addr_next = (addr_reg + (1 << master_burst_size_reg)) & ({ADDR_WIDTH{1'b1}} << master_burst_size_reg); + m_axil_araddr_next = addr_next; + if (addr_next[burst_size_reg] != addr_reg[burst_size_reg]) begin + data_next = {DATA_WIDTH{1'b0}}; + burst_next = burst_reg - 1; + s_axi_rvalid_next = 1'b1; + end + if (master_burst_reg == 0) begin + if (burst_next >> (8+AXIL_BURST_SIZE-burst_size_reg) != 0) begin + // limit burst length to max + master_burst_next = 8'd255; + end else begin + master_burst_next = (burst_next << (burst_size_reg-AXIL_BURST_SIZE)) | (8'hff >> (8-burst_size_reg) >> AXIL_BURST_SIZE); + end + + if (burst_reg == 0) begin + m_axil_rready_next = 1'b0; + s_axi_rlast_next = 1'b1; + s_axi_rvalid_next = 1'b1; + s_axi_arready_next = !m_axil_arvalid; + state_next = STATE_IDLE; + end else begin + m_axil_arvalid_next = 1'b1; + m_axil_rready_next = 1'b0; + state_next = STATE_DATA; + end + end else begin + m_axil_arvalid_next = 1'b1; + m_axil_rready_next = 1'b0; + state_next = STATE_DATA; + end + end else begin + state_next = STATE_DATA; + end + end + endcase + end +end + +always @(posedge clk) begin + state_reg <= state_next; + + id_reg <= id_next; + addr_reg <= addr_next; + data_reg <= data_next; + resp_reg <= resp_next; + burst_reg <= burst_next; + burst_size_reg <= burst_size_next; + master_burst_reg <= master_burst_next; + master_burst_size_reg <= master_burst_size_next; + + s_axi_arready_reg <= s_axi_arready_next; + s_axi_rid_reg <= s_axi_rid_next; + s_axi_rdata_reg <= s_axi_rdata_next; + s_axi_rresp_reg <= s_axi_rresp_next; + s_axi_rlast_reg <= s_axi_rlast_next; + s_axi_rvalid_reg <= s_axi_rvalid_next; + + m_axil_araddr_reg <= m_axil_araddr_next; + m_axil_arprot_reg <= m_axil_arprot_next; + m_axil_arvalid_reg <= m_axil_arvalid_next; + m_axil_rready_reg <= m_axil_rready_next; + + if (rst) begin + state_reg <= STATE_IDLE; + + s_axi_arready_reg <= 1'b0; + s_axi_rvalid_reg <= 1'b0; + + m_axil_arvalid_reg <= 1'b0; + m_axil_rready_reg <= 1'b0; + end +end + +endmodule + +`resetall diff --git a/rtl/ip/axi_axil_adapter/axi_axil_adapter_wr.v b/rtl/ip/axi_axil_adapter/axi_axil_adapter_wr.v new file mode 100644 index 0000000..44822d5 --- /dev/null +++ b/rtl/ip/axi_axil_adapter/axi_axil_adapter_wr.v @@ -0,0 +1,570 @@ +/* + +Copyright (c) 2019 Alex Forencich + +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: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +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. + +*/ + +// Language: Verilog 2001 + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * AXI4 to AXI4-Lite adapter (write) + */ +module axi_axil_adapter_wr # +( + // Width of address bus in bits + parameter ADDR_WIDTH = 32, + // Width of input (slave) AXI interface data bus in bits + parameter AXI_DATA_WIDTH = 32, + // Width of input (slave) AXI interface wstrb (width of data bus in words) + parameter AXI_STRB_WIDTH = (AXI_DATA_WIDTH/8), + // Width of AXI ID signal + parameter AXI_ID_WIDTH = 8, + // Width of output (master) AXI lite interface data bus in bits + parameter AXIL_DATA_WIDTH = 32, + // Width of output (master) AXI lite interface wstrb (width of data bus in words) + parameter AXIL_STRB_WIDTH = (AXIL_DATA_WIDTH/8), + // When adapting to a wider bus, re-pack full-width burst instead of passing through narrow burst if possible + parameter CONVERT_BURST = 1, + // When adapting to a wider bus, re-pack all bursts instead of passing through narrow burst if possible + parameter CONVERT_NARROW_BURST = 0 +) +( + input wire clk, + input wire rst, + + /* + * AXI slave interface + */ + input wire [AXI_ID_WIDTH-1:0] s_axi_awid, + input wire [ADDR_WIDTH-1:0] s_axi_awaddr, + input wire [7:0] s_axi_awlen, + input wire [2:0] s_axi_awsize, + input wire [1:0] s_axi_awburst, + input wire s_axi_awlock, + input wire [3:0] s_axi_awcache, + input wire [2:0] s_axi_awprot, + input wire s_axi_awvalid, + output wire s_axi_awready, + input wire [AXI_DATA_WIDTH-1:0] s_axi_wdata, + input wire [AXI_STRB_WIDTH-1:0] s_axi_wstrb, + input wire s_axi_wlast, + input wire s_axi_wvalid, + output wire s_axi_wready, + output wire [AXI_ID_WIDTH-1:0] s_axi_bid, + output wire [1:0] s_axi_bresp, + output wire s_axi_bvalid, + input wire s_axi_bready, + + /* + * AXI lite master interface + */ + output wire [ADDR_WIDTH-1:0] m_axil_awaddr, + output wire [2:0] m_axil_awprot, + output wire m_axil_awvalid, + input wire m_axil_awready, + output wire [AXIL_DATA_WIDTH-1:0] m_axil_wdata, + output wire [AXIL_STRB_WIDTH-1:0] m_axil_wstrb, + output wire m_axil_wvalid, + input wire m_axil_wready, + input wire [1:0] m_axil_bresp, + input wire m_axil_bvalid, + output wire m_axil_bready +); + +parameter AXI_ADDR_BIT_OFFSET = $clog2(AXI_STRB_WIDTH); +parameter AXIL_ADDR_BIT_OFFSET = $clog2(AXIL_STRB_WIDTH); +parameter AXI_WORD_WIDTH = AXI_STRB_WIDTH; +parameter AXIL_WORD_WIDTH = AXIL_STRB_WIDTH; +parameter AXI_WORD_SIZE = AXI_DATA_WIDTH/AXI_WORD_WIDTH; +parameter AXIL_WORD_SIZE = AXIL_DATA_WIDTH/AXIL_WORD_WIDTH; +parameter AXI_BURST_SIZE = $clog2(AXI_STRB_WIDTH); +parameter AXIL_BURST_SIZE = $clog2(AXIL_STRB_WIDTH); + +// output bus is wider +parameter EXPAND = AXIL_STRB_WIDTH > AXI_STRB_WIDTH; +parameter DATA_WIDTH = EXPAND ? AXIL_DATA_WIDTH : AXI_DATA_WIDTH; +parameter STRB_WIDTH = EXPAND ? AXIL_STRB_WIDTH : AXI_STRB_WIDTH; +// required number of segments in wider bus +parameter SEGMENT_COUNT = EXPAND ? (AXIL_STRB_WIDTH / AXI_STRB_WIDTH) : (AXI_STRB_WIDTH / AXIL_STRB_WIDTH); +// data width and keep width per segment +parameter SEGMENT_DATA_WIDTH = DATA_WIDTH / SEGMENT_COUNT; +parameter SEGMENT_STRB_WIDTH = STRB_WIDTH / SEGMENT_COUNT; + +// bus width assertions +initial begin + if (AXI_WORD_SIZE * AXI_STRB_WIDTH != AXI_DATA_WIDTH) begin + $error("Error: AXI slave interface data width not evenly divisble (instance %m)"); + $finish; + end + + if (AXIL_WORD_SIZE * AXIL_STRB_WIDTH != AXIL_DATA_WIDTH) begin + $error("Error: AXI lite master interface data width not evenly divisble (instance %m)"); + $finish; + end + + if (AXI_WORD_SIZE != AXIL_WORD_SIZE) begin + $error("Error: word size mismatch (instance %m)"); + $finish; + end + + if (2**$clog2(AXI_WORD_WIDTH) != AXI_WORD_WIDTH) begin + $error("Error: AXI slave interface word width must be even power of two (instance %m)"); + $finish; + end + + if (2**$clog2(AXIL_WORD_WIDTH) != AXIL_WORD_WIDTH) begin + $error("Error: AXI lite master interface word width must be even power of two (instance %m)"); + $finish; + end +end + +localparam [1:0] + STATE_IDLE = 2'd0, + STATE_DATA = 2'd1, + STATE_DATA_2 = 2'd2, + STATE_RESP = 2'd3; + +// 添加安全的位选边界,防止 ModelSim 报 Range Reversed 错误 +localparam SAFE_EXP_MSB = (AXIL_ADDR_BIT_OFFSET > AXI_ADDR_BIT_OFFSET) ? AXIL_ADDR_BIT_OFFSET - 1 : AXI_ADDR_BIT_OFFSET; +localparam SAFE_EXP_LSB = AXI_ADDR_BIT_OFFSET; + +localparam SAFE_NAR_MSB = (AXI_ADDR_BIT_OFFSET > AXIL_ADDR_BIT_OFFSET) ? AXI_ADDR_BIT_OFFSET - 1 : AXIL_ADDR_BIT_OFFSET; +localparam SAFE_NAR_LSB = AXIL_ADDR_BIT_OFFSET; +reg [1:0] state_reg = STATE_IDLE, state_next; + +reg [AXI_ID_WIDTH-1:0] id_reg = {AXI_ID_WIDTH{1'b0}}, id_next; +reg [ADDR_WIDTH-1:0] addr_reg = {ADDR_WIDTH{1'b0}}, addr_next; +reg [DATA_WIDTH-1:0] data_reg = {DATA_WIDTH{1'b0}}, data_next; +reg [STRB_WIDTH-1:0] strb_reg = {STRB_WIDTH{1'b0}}, strb_next; +reg [7:0] burst_reg = 8'd0, burst_next; +reg [2:0] burst_size_reg = 3'd0, burst_size_next; +reg [2:0] master_burst_size_reg = 3'd0, master_burst_size_next; +reg burst_active_reg = 1'b0, burst_active_next; +reg convert_burst_reg = 1'b0, convert_burst_next; +reg first_transfer_reg = 1'b0, first_transfer_next; +reg last_segment_reg = 1'b0, last_segment_next; + +reg s_axi_awready_reg = 1'b0, s_axi_awready_next; +reg s_axi_wready_reg = 1'b0, s_axi_wready_next; +reg [AXI_ID_WIDTH-1:0] s_axi_bid_reg = {AXI_ID_WIDTH{1'b0}}, s_axi_bid_next; +reg [1:0] s_axi_bresp_reg = 2'd0, s_axi_bresp_next; +reg s_axi_bvalid_reg = 1'b0, s_axi_bvalid_next; + +reg [ADDR_WIDTH-1:0] m_axil_awaddr_reg = {ADDR_WIDTH{1'b0}}, m_axil_awaddr_next; +reg [2:0] m_axil_awprot_reg = 3'd0, m_axil_awprot_next; +reg m_axil_awvalid_reg = 1'b0, m_axil_awvalid_next; +reg [AXIL_DATA_WIDTH-1:0] m_axil_wdata_reg = {AXIL_DATA_WIDTH{1'b0}}, m_axil_wdata_next; +reg [AXIL_STRB_WIDTH-1:0] m_axil_wstrb_reg = {AXIL_STRB_WIDTH{1'b0}}, m_axil_wstrb_next; +reg m_axil_wvalid_reg = 1'b0, m_axil_wvalid_next; +reg m_axil_bready_reg = 1'b0, m_axil_bready_next; + +assign s_axi_awready = s_axi_awready_reg; +assign s_axi_wready = s_axi_wready_reg; +assign s_axi_bid = s_axi_bid_reg; +assign s_axi_bresp = s_axi_bresp_reg; +assign s_axi_bvalid = s_axi_bvalid_reg; + +assign m_axil_awaddr = m_axil_awaddr_reg; +//assign m_axil_awlen = m_axil_awlen_reg; +//assign m_axil_awsize = m_axil_awsize_reg; +//assign m_axil_awburst = m_axil_awburst_reg; +assign m_axil_awprot = m_axil_awprot_reg; +assign m_axil_awvalid = m_axil_awvalid_reg; +assign m_axil_wdata = m_axil_wdata_reg; +assign m_axil_wstrb = m_axil_wstrb_reg; +assign m_axil_wvalid = m_axil_wvalid_reg; +assign m_axil_bready = m_axil_bready_reg; + +integer i; + +always @* begin + state_next = STATE_IDLE; + + id_next = id_reg; + addr_next = addr_reg; + data_next = data_reg; + strb_next = strb_reg; + burst_next = burst_reg; + burst_size_next = burst_size_reg; + master_burst_size_next = master_burst_size_reg; + burst_active_next = burst_active_reg; + convert_burst_next = convert_burst_reg; + first_transfer_next = first_transfer_reg; + last_segment_next = last_segment_reg; + + s_axi_awready_next = 1'b0; + s_axi_wready_next = 1'b0; + s_axi_bid_next = s_axi_bid_reg; + s_axi_bresp_next = s_axi_bresp_reg; + s_axi_bvalid_next = s_axi_bvalid_reg && !s_axi_bready; + m_axil_awaddr_next = m_axil_awaddr_reg; + m_axil_awprot_next = m_axil_awprot_reg; + m_axil_awvalid_next = m_axil_awvalid_reg && !m_axil_awready; + m_axil_wdata_next = m_axil_wdata_reg; + m_axil_wstrb_next = m_axil_wstrb_reg; + m_axil_wvalid_next = m_axil_wvalid_reg && !m_axil_wready; + m_axil_bready_next = 1'b0; + + if (SEGMENT_COUNT == 1) begin + // master output is same width; direct transfer with no splitting/merging + case (state_reg) + STATE_IDLE: begin + // idle state; wait for new burst + s_axi_awready_next = !m_axil_awvalid; + first_transfer_next = 1'b1; + + if (s_axi_awready && s_axi_awvalid) begin + s_axi_awready_next = 1'b0; + id_next = s_axi_awid; + m_axil_awaddr_next = s_axi_awaddr; + addr_next = s_axi_awaddr; + burst_next = s_axi_awlen; + burst_size_next = s_axi_awsize; + burst_active_next = 1'b1; + m_axil_awprot_next = s_axi_awprot; + m_axil_awvalid_next = 1'b1; + s_axi_wready_next = !m_axil_wvalid; + state_next = STATE_DATA; + end else begin + state_next = STATE_IDLE; + end + end + STATE_DATA: begin + // data state; transfer write data + s_axi_wready_next = !m_axil_wvalid; + + if (s_axi_wready && s_axi_wvalid) begin + m_axil_wdata_next = s_axi_wdata; + m_axil_wstrb_next = s_axi_wstrb; + m_axil_wvalid_next = 1'b1; + burst_next = burst_reg - 1; + burst_active_next = burst_reg != 0; + addr_next = addr_reg + (1 << burst_size_reg); + s_axi_wready_next = 1'b0; + m_axil_bready_next = !s_axi_bvalid && !m_axil_awvalid; + state_next = STATE_RESP; + end else begin + state_next = STATE_DATA; + end + end + STATE_RESP: begin + // resp state; transfer write response + m_axil_bready_next = !s_axi_bvalid && !m_axil_awvalid; + + if (m_axil_bready && m_axil_bvalid) begin + m_axil_bready_next = 1'b0; + s_axi_bid_next = id_reg; + first_transfer_next = 1'b0; + if (first_transfer_reg || m_axil_bresp != 0) begin + s_axi_bresp_next = m_axil_bresp; + end + if (burst_active_reg) begin + // burst on slave interface still active; start new AXI lite write + m_axil_awaddr_next = addr_reg; + m_axil_awvalid_next = 1'b1; + s_axi_wready_next = !m_axil_wvalid; + state_next = STATE_DATA; + end else begin + // burst on slave interface finished; return to idle + s_axi_bvalid_next = 1'b1; + s_axi_awready_next = !m_axil_awvalid; + state_next = STATE_IDLE; + end + end else begin + state_next = STATE_RESP; + end + end + endcase + end else if (EXPAND) begin + // master output is wider; merge writes + case (state_reg) + STATE_IDLE: begin + // idle state; wait for new burst + s_axi_awready_next = !m_axil_awvalid; + + first_transfer_next = 1'b1; + + data_next = {DATA_WIDTH{1'b0}}; + strb_next = {STRB_WIDTH{1'b0}}; + + if (s_axi_awready && s_axi_awvalid) begin + s_axi_awready_next = 1'b0; + id_next = s_axi_awid; + m_axil_awaddr_next = s_axi_awaddr; + addr_next = s_axi_awaddr; + burst_next = s_axi_awlen; + burst_size_next = s_axi_awsize; + if (CONVERT_BURST && s_axi_awcache[1] && (CONVERT_NARROW_BURST || s_axi_awsize == AXI_BURST_SIZE)) begin + // merge writes + // require CONVERT_BURST and awcache[1] set + convert_burst_next = 1'b1; + master_burst_size_next = AXIL_BURST_SIZE; + state_next = STATE_DATA_2; + end else begin + // output narrow burst + convert_burst_next = 1'b0; + master_burst_size_next = s_axi_awsize; + state_next = STATE_DATA; + end + m_axil_awprot_next = s_axi_awprot; + m_axil_awvalid_next = 1'b1; + s_axi_wready_next = !m_axil_wvalid; + end else begin + state_next = STATE_IDLE; + end + end + STATE_DATA: begin + // data state; transfer write data + s_axi_wready_next = !m_axil_wvalid || m_axil_wready; + + if (s_axi_wready && s_axi_wvalid) begin + m_axil_wdata_next = {(AXIL_WORD_WIDTH/AXI_WORD_WIDTH){s_axi_wdata}}; + m_axil_wstrb_next = s_axi_wstrb << (addr_reg[SAFE_EXP_MSB:SAFE_EXP_LSB] * AXI_STRB_WIDTH); + m_axil_wvalid_next = 1'b1; + burst_next = burst_reg - 1; + burst_active_next = burst_reg != 0; + addr_next = addr_reg + (1 << burst_size_reg); + s_axi_wready_next = 1'b0; + m_axil_bready_next = !s_axi_bvalid && !m_axil_awvalid; + state_next = STATE_RESP; + end else begin + state_next = STATE_DATA; + end + end + STATE_DATA_2: begin + s_axi_wready_next = !m_axil_wvalid; + + if (s_axi_wready && s_axi_wvalid) begin + if (CONVERT_NARROW_BURST) begin + for (i = 0; i < AXI_WORD_WIDTH; i = i + 1) begin + if (s_axi_wstrb[i]) begin + data_next[addr_reg[SAFE_EXP_MSB:SAFE_EXP_LSB]*SEGMENT_DATA_WIDTH+i*AXIL_WORD_SIZE +: AXIL_WORD_SIZE] = s_axi_wdata[i*AXIL_WORD_SIZE +: AXIL_WORD_SIZE]; + strb_next[addr_reg[SAFE_EXP_MSB:SAFE_EXP_LSB]*SEGMENT_STRB_WIDTH+i] = 1'b1; + end + end + end else begin + data_next[addr_reg[SAFE_EXP_MSB:SAFE_EXP_LSB]*SEGMENT_DATA_WIDTH +: SEGMENT_DATA_WIDTH] = s_axi_wdata; + strb_next[addr_reg[SAFE_EXP_MSB:SAFE_EXP_LSB]*SEGMENT_STRB_WIDTH +: SEGMENT_STRB_WIDTH] = s_axi_wstrb; + end + m_axil_wdata_next = data_next; + m_axil_wstrb_next = strb_next; + burst_next = burst_reg - 1; + burst_active_next = burst_reg != 0; + addr_next = addr_reg + (1 << burst_size_reg); + if (burst_reg == 0 || addr_next[master_burst_size_reg] != addr_reg[master_burst_size_reg]) begin + data_next = {DATA_WIDTH{1'b0}}; + strb_next = {STRB_WIDTH{1'b0}}; + m_axil_wvalid_next = 1'b1; + s_axi_wready_next = 1'b0; + m_axil_bready_next = !s_axi_bvalid && !m_axil_awvalid; + state_next = STATE_RESP; + end else begin + state_next = STATE_DATA_2; + end + end else begin + state_next = STATE_DATA_2; + end + end + STATE_RESP: begin + // resp state; transfer write response + m_axil_bready_next = !s_axi_bvalid && !m_axil_awvalid; + + if (m_axil_bready && m_axil_bvalid) begin + m_axil_bready_next = 1'b0; + s_axi_bid_next = id_reg; + first_transfer_next = 1'b0; + if (first_transfer_reg || m_axil_bresp != 0) begin + s_axi_bresp_next = m_axil_bresp; + end + if (burst_active_reg) begin + // burst on slave interface still active; start new AXI lite write + m_axil_awaddr_next = addr_reg; + m_axil_awvalid_next = 1'b1; + s_axi_wready_next = !m_axil_wvalid || m_axil_wready; + if (convert_burst_reg) begin + state_next = STATE_DATA_2; + end else begin + state_next = STATE_DATA; + end + end else begin + // burst on slave interface finished; return to idle + s_axi_bvalid_next = 1'b1; + s_axi_awready_next = !m_axil_awvalid; + state_next = STATE_IDLE; + end + end else begin + state_next = STATE_RESP; + end + end + endcase + end else begin + // master output is narrower; split writes, and possibly split burst + case (state_reg) + STATE_IDLE: begin + // idle state; wait for new burst + s_axi_awready_next = !m_axil_awvalid; + + first_transfer_next = 1'b1; + + if (s_axi_awready && s_axi_awvalid) begin + s_axi_awready_next = 1'b0; + id_next = s_axi_awid; + m_axil_awaddr_next = s_axi_awaddr; + addr_next = s_axi_awaddr; + burst_next = s_axi_awlen; + burst_size_next = s_axi_awsize; + burst_active_next = 1'b1; + if (s_axi_awsize > AXIL_BURST_SIZE) begin + // need to adjust burst size + master_burst_size_next = AXIL_BURST_SIZE; + end else begin + // pass through narrow (enough) burst + master_burst_size_next = s_axi_awsize; + end + m_axil_awprot_next = s_axi_awprot; + m_axil_awvalid_next = 1'b1; + s_axi_wready_next = !m_axil_wvalid; + state_next = STATE_DATA; + end else begin + state_next = STATE_IDLE; + end + end + STATE_DATA: begin + s_axi_wready_next = !m_axil_wvalid; + + if (s_axi_wready && s_axi_wvalid) begin + data_next = s_axi_wdata; + strb_next = s_axi_wstrb; + m_axil_wdata_next = s_axi_wdata >> (addr_reg[SAFE_NAR_MSB:SAFE_NAR_LSB] * AXIL_DATA_WIDTH); + m_axil_wstrb_next = s_axi_wstrb >> (addr_reg[SAFE_NAR_MSB:SAFE_NAR_LSB] * AXIL_STRB_WIDTH); + m_axil_wvalid_next = 1'b1; + burst_next = burst_reg - 1; + burst_active_next = burst_reg != 0; + addr_next = (addr_reg + (1 << master_burst_size_reg)) & ({ADDR_WIDTH{1'b1}} << master_burst_size_reg); + last_segment_next = addr_next[burst_size_reg] != addr_reg[burst_size_reg]; + s_axi_wready_next = 1'b0; + m_axil_bready_next = !s_axi_bvalid && !m_axil_awvalid; + state_next = STATE_RESP; + end else begin + state_next = STATE_DATA; + end + end + STATE_DATA_2: begin + s_axi_wready_next = 1'b0; + + if (!m_axil_wvalid || m_axil_wready) begin + m_axil_wdata_next = data_reg >> (addr_reg[SAFE_NAR_MSB:SAFE_NAR_LSB] * AXIL_DATA_WIDTH); + m_axil_wstrb_next = strb_reg >> (addr_reg[SAFE_NAR_MSB:SAFE_NAR_LSB] * AXIL_STRB_WIDTH); + m_axil_wvalid_next = 1'b1; + addr_next = (addr_reg + (1 << master_burst_size_reg)) & ({ADDR_WIDTH{1'b1}} << master_burst_size_reg); + last_segment_next = addr_next[burst_size_reg] != addr_reg[burst_size_reg]; + s_axi_wready_next = 1'b0; + m_axil_bready_next = !s_axi_bvalid && !m_axil_awvalid; + state_next = STATE_RESP; + end else begin + state_next = STATE_DATA_2; + end + end + STATE_RESP: begin + // resp state; transfer write response + m_axil_bready_next = !s_axi_bvalid && !m_axil_awvalid; + + if (m_axil_bready && m_axil_bvalid) begin + first_transfer_next = 1'b0; + m_axil_awaddr_next = addr_reg; + m_axil_bready_next = 1'b0; + s_axi_bid_next = id_reg; + if (first_transfer_reg || m_axil_bresp != 0) begin + s_axi_bresp_next = m_axil_bresp; + end + if (burst_active_reg || !last_segment_reg) begin + // burst on slave interface still active; start new burst + m_axil_awvalid_next = 1'b1; + if (last_segment_reg) begin + s_axi_wready_next = !m_axil_wvalid; + state_next = STATE_DATA; + end else begin + s_axi_wready_next = 1'b0; + state_next = STATE_DATA_2; + end + end else begin + // burst on slave interface finished; return to idle + s_axi_bvalid_next = 1'b1; + s_axi_awready_next = !m_axil_awvalid; + state_next = STATE_IDLE; + end + end else begin + state_next = STATE_RESP; + end + end + endcase + end +end + +always @(posedge clk) begin + state_reg <= state_next; + + id_reg <= id_next; + addr_reg <= addr_next; + data_reg <= data_next; + strb_reg <= strb_next; + burst_reg <= burst_next; + burst_size_reg <= burst_size_next; + master_burst_size_reg <= master_burst_size_next; + burst_active_reg <= burst_active_next; + convert_burst_reg <= convert_burst_next; + first_transfer_reg <= first_transfer_next; + last_segment_reg <= last_segment_next; + + s_axi_awready_reg <= s_axi_awready_next; + s_axi_wready_reg <= s_axi_wready_next; + s_axi_bid_reg <= s_axi_bid_next; + s_axi_bresp_reg <= s_axi_bresp_next; + s_axi_bvalid_reg <= s_axi_bvalid_next; + + m_axil_awaddr_reg <= m_axil_awaddr_next; + m_axil_awprot_reg <= m_axil_awprot_next; + m_axil_awvalid_reg <= m_axil_awvalid_next; + m_axil_wdata_reg <= m_axil_wdata_next; + m_axil_wstrb_reg <= m_axil_wstrb_next; + m_axil_wvalid_reg <= m_axil_wvalid_next; + m_axil_bready_reg <= m_axil_bready_next; + + if (rst) begin + state_reg <= STATE_IDLE; + + s_axi_awready_reg <= 1'b0; + s_axi_wready_reg <= 1'b0; + s_axi_bvalid_reg <= 1'b0; + + m_axil_awvalid_reg <= 1'b0; + m_axil_wvalid_reg <= 1'b0; + m_axil_bready_reg <= 1'b0; + end +end + +endmodule + +`resetall diff --git a/rtl/ip/bram0/my_bram0.v b/rtl/ip/bram0/my_bram0.v new file mode 100644 index 0000000..e6fb4f1 --- /dev/null +++ b/rtl/ip/bram0/my_bram0.v @@ -0,0 +1,47 @@ +`timescale 1ns / 1ps + +module my_bram0 #( + parameter DATA_WIDTH = 32, // 数据位宽,默认 32 bit + parameter ADDR_WIDTH = 10 // 地址位宽 10 bit,对应深度 1024 +)( + // ======== Port A (Write Only) ======== + input wire clka, + input wire ena, + input wire wea, + input wire [ADDR_WIDTH-1:0] addra, + input wire [DATA_WIDTH-1:0] dina, + + // ======== Port B (Read Only) ======== + input wire clkb, + input wire enb, + input wire [ADDR_WIDTH-1:0] addrb, + output reg [DATA_WIDTH-1:0] doutb +); + + // 声明二维数组作为存储介质 + // 使用 (* ram_style = "block" *) 强制 Vivado 综合器将其映射为 BRAM 资源 + (* ram_style = "block" *) reg [DATA_WIDTH-1:0] ram [0:(1<>1); + end + + always_ff @(posedge rclk or negedge rrst_n) + if(!rrst_n) begin + rd_addr <= (ADDR_W+1)'(0); + rgray <= (ADDR_W+1)'(0); + end + else if(lcl_read && !lcl_rd_empty) begin + rd_addr <= next_rd_addr; + rgray <= next_rd_addr ^ (next_rd_addr>>1); + end + + + always_ff @(posedge wclk) + mem[wr_addr[ADDR_W-1:0]] <= wdata; + + + assign next_rd_addr = rd_addr + 1'b1; + assign lcl_rd_data = mem[rd_addr[ADDR_W-1:0]]; + + always_ff @(posedge wclk or negedge wrst_n) + if(!wrst_n) begin + wr_rgray <= (ADDR_W+1)'(0); + rgray_cross <= (ADDR_W+1)'(0); + end + else begin + {wr_rgray, rgray_cross} <= {rgray_cross, rgray}; + end + + always_ff @(posedge rclk or negedge rrst_n) + if(!rrst_n) begin + rd_wgray <= (ADDR_W+1)'(0); + wgray_cross <= (ADDR_W+1)'(0); + rd_n_items <= (ADDR_W+1)'(0); + end + else begin + {rd_wgray, wgray_cross} <= {wgray_cross, wgray}; + rd_n_items <= (rd_wbin - rd_addr) & ((1 << (ADDR_W + 1)) - 1); + end + + always_comb begin + rd_wbin[ADDR_W] = rd_wgray[ADDR_W]; + for (int i = ADDR_W-1; i >= 0; i--) begin + rd_wbin[i] = rd_wbin[i+1] ^ rd_wgray[i]; + end + end + + assign wfull = wr_rgray == {~wgray[ADDR_W], wgray[ADDR_W-1:0]}; + assign lcl_rd_empty = rd_wgray == rgray; + assign lcl_read = rempty || rd_en; + + always_ff @(posedge rclk or negedge rrst_n) + if(!rrst_n) begin + rempty <= 1'b1; + end + else if(lcl_read) begin + rempty <= lcl_rd_empty; + end + + always_ff @(posedge rclk) + if(lcl_read) + rdata <= lcl_rd_data; + + +endmodule: snix_async_fifo diff --git a/rtl/ip/cdma/snix_axi_cdma.sv b/rtl/ip/cdma/snix_axi_cdma.sv new file mode 100644 index 0000000..c09c6d0 --- /dev/null +++ b/rtl/ip/cdma/snix_axi_cdma.sv @@ -0,0 +1,219 @@ +// ============================================================================ +// snix_axi_cdma.sv +// Central DMA — memory-to-memory transfers via snix_axi_mm2mm +// +// Instantiates: +// snix_axi_cdma_csr — AXI-Lite register interface +// snix_axi_mm2mm — read-then-write AXI4 engine +// +// Software register map (see snix_axi_cdma_csr.sv for full detail): +// 0x00 CDMA_CTRL [0]=start [1]=stop [5:3]=size [13:6]=len +// 0x04 CDMA_NUM_BYTES [31:0]=transfer_len +// 0x08 CDMA_SRC_ADDR [31:0]=source base address +// 0x0C CDMA_DST_ADDR [31:0]=destination base address +// 0x10 STATUS [0]=done (sticky, read-only) +// ============================================================================ +module snix_axi_cdma #( + parameter int ADDR_WIDTH = 32, + parameter int DATA_WIDTH = 64, + parameter int AXIL_ADDR_WIDTH = 32, + parameter int AXIL_DATA_WIDTH = 32, + parameter int ID_WIDTH = 4, + parameter int USER_WIDTH = 1) + (// Global signals + input logic clk, + input logic rst_n, + // AXI-Lite CSR interface + input logic [AXIL_ADDR_WIDTH-1:0] s_axil_awaddr, + input logic s_axil_awvalid, + output logic s_axil_awready, + input logic [AXIL_DATA_WIDTH-1:0] s_axil_wdata, + input logic [AXIL_DATA_WIDTH/8-1:0] s_axil_wstrb, + input logic s_axil_wvalid, + output logic s_axil_wready, + output logic [1:0] s_axil_bresp, + output logic s_axil_bvalid, + input logic s_axil_bready, + input logic [AXIL_ADDR_WIDTH-1:0] s_axil_araddr, + input logic s_axil_arvalid, + output logic s_axil_arready, + output logic [AXIL_DATA_WIDTH-1:0] s_axil_rdata, + output logic [1:0] s_axil_rresp, + output logic s_axil_rvalid, + input logic s_axil_rready, + // AXI4 memory port — AW channel + output logic [ID_WIDTH-1:0] mm2mm_awid, + output logic [ADDR_WIDTH-1:0] mm2mm_awaddr, + output logic [7:0] mm2mm_awlen, + output logic [2:0] mm2mm_awsize, + output logic [1:0] mm2mm_awburst, + output logic mm2mm_awlock, + output logic [3:0] mm2mm_awcache, + output logic [2:0] mm2mm_awprot, + output logic [3:0] mm2mm_awqos, + output logic [USER_WIDTH-1:0] mm2mm_awuser, + output logic mm2mm_awvalid, + input logic mm2mm_awready, + // W channel + output logic [DATA_WIDTH-1:0] mm2mm_wdata, + output logic [DATA_WIDTH/8-1:0] mm2mm_wstrb, + output logic mm2mm_wlast, + output logic [USER_WIDTH-1:0] mm2mm_wuser, + output logic mm2mm_wvalid, + input logic mm2mm_wready, + // B channel + input logic [ID_WIDTH-1:0] mm2mm_bid, + input logic [1:0] mm2mm_bresp, + input logic [USER_WIDTH-1:0] mm2mm_buser, + input logic mm2mm_bvalid, + output logic mm2mm_bready, + // AR channel + output logic [ID_WIDTH-1:0] mm2mm_arid, + output logic [ADDR_WIDTH-1:0] mm2mm_araddr, + output logic [7:0] mm2mm_arlen, + output logic [2:0] mm2mm_arsize, + output logic [1:0] mm2mm_arburst, + output logic mm2mm_arlock, + output logic [3:0] mm2mm_arcache, + output logic [2:0] mm2mm_arprot, + output logic [3:0] mm2mm_arqos, + output logic [USER_WIDTH-1:0] mm2mm_aruser, + output logic mm2mm_arvalid, + input logic mm2mm_arready, + // R channel + input logic [ID_WIDTH-1:0] mm2mm_rid, + input logic [DATA_WIDTH-1:0] mm2mm_rdata, + input logic [1:0] mm2mm_rresp, + input logic mm2mm_rlast, + input logic [USER_WIDTH-1:0] mm2mm_ruser, + input logic mm2mm_rvalid, + output logic mm2mm_rready, + + output logic dma_finish); + +localparam int NUM_REGS = 8; +localparam int FIFO_DEPTH = 16; + +localparam int CDMA_CTRL_IDX = 0; +localparam int CDMA_NUM_BYTES_IDX = 1; +localparam int CDMA_SRC_ADDR_IDX = 2; +localparam int CDMA_DST_ADDR_IDX = 3; +// Index 4 = STATUS — write-protected inside snix_axi_cdma_csr + + logic [NUM_REGS-1:0][AXIL_DATA_WIDTH-1:0] config_status_reg; + logic [AXIL_DATA_WIDTH-1:0] read_status_reg; + +// ------------------------------------------------------------------------- +// Decode control registers +// ------------------------------------------------------------------------- + logic ctrl_start, ctrl_stop; + logic [2:0] ctrl_size; + logic [7:0] ctrl_len; + logic [31:0] ctrl_transfer_len; + logic [ADDR_WIDTH-1:0] ctrl_src_addr, ctrl_dst_addr; + logic ctrl_done; + +assign ctrl_start = config_status_reg[CDMA_CTRL_IDX][0]; +assign ctrl_stop = config_status_reg[CDMA_CTRL_IDX][1]; +assign ctrl_size = config_status_reg[CDMA_CTRL_IDX][5:3]; +assign ctrl_len = config_status_reg[CDMA_CTRL_IDX][13:6]; +assign ctrl_transfer_len = config_status_reg[CDMA_NUM_BYTES_IDX]; +assign ctrl_src_addr = config_status_reg[CDMA_SRC_ADDR_IDX][ADDR_WIDTH-1:0]; +assign ctrl_dst_addr = config_status_reg[CDMA_DST_ADDR_IDX][ADDR_WIDTH-1:0]; + +assign read_status_reg = {{(AXIL_DATA_WIDTH-1){1'b0}}, ctrl_done}; +assign dma_finish = ctrl_done; +// ------------------------------------------------------------------------- +// CSR +// ------------------------------------------------------------------------- +snix_axi_cdma_csr #( + .DATA_WIDTH(AXIL_DATA_WIDTH), + .ADDR_WIDTH(AXIL_ADDR_WIDTH), + .NUM_REGS (NUM_REGS)) +cdma_csr ( + .clk (clk), + .rst_n (rst_n), + .s_axil_awaddr (s_axil_awaddr), + .s_axil_awvalid (s_axil_awvalid), + .s_axil_awready (s_axil_awready), + .s_axil_wdata (s_axil_wdata), + .s_axil_wstrb (s_axil_wstrb), + .s_axil_wvalid (s_axil_wvalid), + .s_axil_wready (s_axil_wready), + .s_axil_bresp (s_axil_bresp), + .s_axil_bvalid (s_axil_bvalid), + .s_axil_bready (s_axil_bready), + .s_axil_araddr (s_axil_araddr), + .s_axil_arvalid (s_axil_arvalid), + .s_axil_arready (s_axil_arready), + .s_axil_rdata (s_axil_rdata), + .s_axil_rresp (s_axil_rresp), + .s_axil_rvalid (s_axil_rvalid), + .s_axil_rready (s_axil_rready), + .read_status_reg (read_status_reg), + .config_status_reg (config_status_reg)); + +// ------------------------------------------------------------------------- +// MM2MM engine +// ------------------------------------------------------------------------- +snix_axi_mm2mm #( + .ADDR_WIDTH(ADDR_WIDTH), + .DATA_WIDTH(DATA_WIDTH), + .ID_WIDTH (ID_WIDTH), + .USER_WIDTH(USER_WIDTH), + .FIFO_DEPTH(FIFO_DEPTH)) +axi_mm2mm ( + .clk (clk), + .rst_n (rst_n), + .ctrl_start (ctrl_start), + .ctrl_stop (ctrl_stop), + .ctrl_src_addr (ctrl_src_addr), + .ctrl_dst_addr (ctrl_dst_addr), + .ctrl_len (ctrl_len), + .ctrl_size (ctrl_size), + .ctrl_transfer_len(ctrl_transfer_len), + .ctrl_done (ctrl_done), + .mm2mm_awid (mm2mm_awid), + .mm2mm_awaddr (mm2mm_awaddr), + .mm2mm_awlen (mm2mm_awlen), + .mm2mm_awsize (mm2mm_awsize), + .mm2mm_awburst (mm2mm_awburst), + .mm2mm_awlock (mm2mm_awlock), + .mm2mm_awcache (mm2mm_awcache), + .mm2mm_awprot (mm2mm_awprot), + .mm2mm_awqos (mm2mm_awqos), + .mm2mm_awuser (mm2mm_awuser), + .mm2mm_awvalid (mm2mm_awvalid), + .mm2mm_awready (mm2mm_awready), + .mm2mm_wdata (mm2mm_wdata), + .mm2mm_wstrb (mm2mm_wstrb), + .mm2mm_wlast (mm2mm_wlast), + .mm2mm_wuser (mm2mm_wuser), + .mm2mm_wvalid (mm2mm_wvalid), + .mm2mm_wready (mm2mm_wready), + .mm2mm_bid (mm2mm_bid), + .mm2mm_bresp (mm2mm_bresp), + .mm2mm_buser (mm2mm_buser), + .mm2mm_bvalid (mm2mm_bvalid), + .mm2mm_bready (mm2mm_bready), + .mm2mm_arid (mm2mm_arid), + .mm2mm_araddr (mm2mm_araddr), + .mm2mm_arlen (mm2mm_arlen), + .mm2mm_arsize (mm2mm_arsize), + .mm2mm_arburst (mm2mm_arburst), + .mm2mm_arlock (mm2mm_arlock), + .mm2mm_arcache (mm2mm_arcache), + .mm2mm_arprot (mm2mm_arprot), + .mm2mm_arqos (mm2mm_arqos), + .mm2mm_aruser (mm2mm_aruser), + .mm2mm_arvalid (mm2mm_arvalid), + .mm2mm_arready (mm2mm_arready), + .mm2mm_rid (mm2mm_rid), + .mm2mm_rdata (mm2mm_rdata), + .mm2mm_rresp (mm2mm_rresp), + .mm2mm_rlast (mm2mm_rlast), + .mm2mm_ruser (mm2mm_ruser), + .mm2mm_rvalid (mm2mm_rvalid), + .mm2mm_rready (mm2mm_rready)); + +endmodule : snix_axi_cdma diff --git a/rtl/ip/cdma/snix_axi_cdma_csr.sv b/rtl/ip/cdma/snix_axi_cdma_csr.sv new file mode 100644 index 0000000..880cf01 --- /dev/null +++ b/rtl/ip/cdma/snix_axi_cdma_csr.sv @@ -0,0 +1,192 @@ +// ============================================================================ +// snix_axi_cdma_csr.sv +// AXI-Lite CSR for snix_axi_cdma (memory-to-memory central DMA) +// +// Register Map (word-addressed, 32-bit registers): +// +// Offset Index Name Bits +// 0x00 0 CDMA_CTRL [0] = start (write-1 pulse) +// [1] = stop (write-1 pulse) +// [5:3] = size (AXI AxSIZE) +// [13:6] = len (AXI AxLEN) +// [31:14] = reserved +// 0x04 1 CDMA_NUM_BYTES [31:0] = transfer_len (byte count) +// 0x08 2 CDMA_SRC_ADDR [31:0] = source base address +// 0x0C 3 CDMA_DST_ADDR [31:0] = destination base address +// 0x10 4 STATUS (read-only) [0] = done (sticky; cleared on start) +// [31:1] = reserved +// 0x14– 5–7 Reserved +// +// Differences from snix_axi_dma_csr: +// - Single CTRL register (no separate WR/RD paths) +// - Separate SRC_ADDR and DST_ADDR registers +// - STATUS[0] is write-protected; hardware sets it, start clears it +// ============================================================================ +module snix_axi_cdma_csr #( + parameter int DATA_WIDTH = 32, + parameter int ADDR_WIDTH = 4, + parameter int NUM_REGS = 8) + (input logic clk, + input logic rst_n, + // AXI-Lite interface + input logic [ADDR_WIDTH-1:0] s_axil_awaddr, + input logic s_axil_awvalid, + output logic s_axil_awready, + input logic [DATA_WIDTH-1:0] s_axil_wdata, + input logic [DATA_WIDTH/8-1:0] s_axil_wstrb, + input logic s_axil_wvalid, + output logic s_axil_wready, + output logic [1:0] s_axil_bresp, + output logic s_axil_bvalid, + input logic s_axil_bready, + input logic [ADDR_WIDTH-1:0] s_axil_araddr, + input logic s_axil_arvalid, + output logic s_axil_arready, + output logic [DATA_WIDTH-1:0] s_axil_rdata, + output logic [1:0] s_axil_rresp, + output logic s_axil_rvalid, + input logic s_axil_rready, + // Status from mm2mm engine: [0] = ctrl_done (single-cycle pulse) + input logic [DATA_WIDTH-1:0] read_status_reg, + // Register file + output logic [NUM_REGS-1:0][DATA_WIDTH-1:0] config_status_reg); + +localparam int AXIL_DATA_WIDTH = DATA_WIDTH; +localparam int AXIL_ADDR_WIDTH = ADDR_WIDTH; +localparam int ADDRLSB = $clog2(AXIL_DATA_WIDTH / 8); +localparam int REG_INDEX_WIDTH = $clog2(NUM_REGS); + +localparam int CDMA_CTRL_IDX = 0; // 0x00 used: pulse-clear start/stop bits +//localparam int CDMA_NUM_BYTES_IDX = 1; // 0x04 decoded in snix_axi_cdma top +//localparam int CDMA_SRC_ADDR_IDX = 2; // 0x08 decoded in snix_axi_cdma top +//localparam int CDMA_DST_ADDR_IDX = 3; // 0x0C decoded in snix_axi_cdma top +localparam int STATUS_IDX = 4; // 0x10 used: write-protect + done latch + +// ------------------------------------------------------------------------- +// AXI-Lite skid-buffer register slices (same topology as snix_axi_dma_csr) +// ------------------------------------------------------------------------- + logic s_axil_awvalid_reg; + logic [AXIL_ADDR_WIDTH-ADDRLSB-1:0] s_axil_awaddr_reg; + logic s_axil_arvalid_reg; + logic [AXIL_ADDR_WIDTH-ADDRLSB-1:0] s_axil_araddr_reg; + logic s_axil_wvalid_reg; + logic [AXIL_DATA_WIDTH-1:0] s_axil_wdata_reg; + logic [AXIL_DATA_WIDTH/8-1:0] s_axil_wstrb_reg; + + logic s_axil_write_ready, s_axil_read_ready; + logic [31:0] awaddr_index, araddr_index; + +assign s_axil_write_ready = s_axil_awvalid_reg & s_axil_wvalid_reg & + (!s_axil_bvalid | s_axil_bready); +assign s_axil_read_ready = s_axil_arvalid_reg & (!s_axil_rvalid | s_axil_rready); + +assign awaddr_index = {{(32-REG_INDEX_WIDTH){1'b0}}, s_axil_awaddr_reg[REG_INDEX_WIDTH-1:0]}; +assign araddr_index = {{(32-REG_INDEX_WIDTH){1'b0}}, s_axil_araddr_reg[REG_INDEX_WIDTH-1:0]}; + +snix_register_slice #(.DATA_WIDTH(AXIL_ADDR_WIDTH - ADDRLSB)) reg_slice_u0 ( + .clk (clk), + .rst_n (rst_n), + .s_axis_tdata (s_axil_awaddr[AXIL_ADDR_WIDTH-1:ADDRLSB]), + .s_axis_tvalid(s_axil_awvalid), + .s_axis_tready(s_axil_awready), + .m_axis_tdata (s_axil_awaddr_reg), + .m_axis_tvalid(s_axil_awvalid_reg), + .m_axis_tready(s_axil_write_ready)); + +snix_register_slice #(.DATA_WIDTH(AXIL_DATA_WIDTH + AXIL_DATA_WIDTH/8)) reg_slice_u1 ( + .clk (clk), + .rst_n (rst_n), + .s_axis_tdata ({s_axil_wdata, s_axil_wstrb}), + .s_axis_tvalid(s_axil_wvalid), + .s_axis_tready(s_axil_wready), + .m_axis_tdata ({s_axil_wdata_reg, s_axil_wstrb_reg}), + .m_axis_tvalid(s_axil_wvalid_reg), + .m_axis_tready(s_axil_write_ready)); + +snix_register_slice #(.DATA_WIDTH(AXIL_ADDR_WIDTH - ADDRLSB)) reg_slice_u2 ( + .clk (clk), + .rst_n (rst_n), + .s_axis_tdata (s_axil_araddr[AXIL_ADDR_WIDTH-1:ADDRLSB]), + .s_axis_tvalid(s_axil_arvalid), + .s_axis_tready(s_axil_arready), + .m_axis_tdata (s_axil_araddr_reg), + .m_axis_tvalid(s_axil_arvalid_reg), + .m_axis_tready(s_axil_read_ready)); + +// ------------------------------------------------------------------------- +// B channel +// ------------------------------------------------------------------------- +always_ff @(posedge clk or negedge rst_n) + if (!rst_n) s_axil_bvalid <= 1'b0; + else if (s_axil_write_ready) s_axil_bvalid <= 1'b1; + else if (s_axil_bready) s_axil_bvalid <= 1'b0; + +// ------------------------------------------------------------------------- +// R channel +// ------------------------------------------------------------------------- +always_ff @(posedge clk or negedge rst_n) + if (!rst_n) s_axil_rvalid <= 1'b0; + else if (s_axil_read_ready) s_axil_rvalid <= 1'b1; + else if (s_axil_rready) s_axil_rvalid <= 1'b0; + +// ------------------------------------------------------------------------- +// Control / status signal aliases (combinatorial from register file) +// ------------------------------------------------------------------------- + logic ctrl_start, ctrl_stop, ctrl_done; + +assign ctrl_start = config_status_reg[CDMA_CTRL_IDX][0]; +assign ctrl_stop = config_status_reg[CDMA_CTRL_IDX][1]; +assign ctrl_done = read_status_reg[0]; + +// ------------------------------------------------------------------------- +// Register file +// +// Write priority (highest to lowest within an always_ff block): +// 1. AXI-Lite write (byte-enable; STATUS_IDX is write-protected) +// 2. Pulse-clear: start[0] and stop[1] are single-cycle strobes +// 3. STATUS latch: done bit set by hardware, cleared when start fires +// +// Note on NBA priority: later assignments in program order win, so +// "config_status_reg <= config_status_reg" is safely overridden by +// the per-bit assignments that follow in the else branch. +// ------------------------------------------------------------------------- +always_ff @(posedge clk or negedge rst_n) begin + if (!rst_n) begin + config_status_reg <= '0; + + end else if (s_axil_write_ready && + awaddr_index < NUM_REGS && + awaddr_index != STATUS_IDX) begin // STATUS is read-only + for (int i = 0; i < AXIL_DATA_WIDTH/8; i++) begin + config_status_reg[awaddr_index][8*i +: 8] <= + s_axil_wstrb_reg[i] ? s_axil_wdata_reg[8*i +: 8] + : config_status_reg[awaddr_index][8*i +: 8]; + end + + end else begin + config_status_reg <= config_status_reg; + + // Pulse-clear: start and stop are one-cycle strobes + if (ctrl_start) config_status_reg[CDMA_CTRL_IDX][0] <= 1'b0; + if (ctrl_stop) config_status_reg[CDMA_CTRL_IDX][1] <= 1'b0; + + // STATUS[0]: cleared when a new transfer starts; set sticky on done + if (ctrl_start) config_status_reg[STATUS_IDX][0] <= 1'b0; + if (ctrl_done) config_status_reg[STATUS_IDX][0] <= 1'b1; + end +end + +// ------------------------------------------------------------------------- +// Read data mux +// ------------------------------------------------------------------------- +always_ff @(posedge clk or negedge rst_n) begin + if (!rst_n) + s_axil_rdata <= '0; + else if (s_axil_read_ready && araddr_index < NUM_REGS) + s_axil_rdata <= config_status_reg[araddr_index]; +end + +assign s_axil_bresp = 2'b00; +assign s_axil_rresp = 2'b00; + +endmodule : snix_axi_cdma_csr diff --git a/rtl/ip/cdma/snix_axi_mm2mm.sv b/rtl/ip/cdma/snix_axi_mm2mm.sv new file mode 100644 index 0000000..4be1b3e --- /dev/null +++ b/rtl/ip/cdma/snix_axi_mm2mm.sv @@ -0,0 +1,455 @@ +module snix_axi_mm2mm #(parameter int ADDR_WIDTH = 32, + parameter int DATA_WIDTH = 64, + parameter int ID_WIDTH = 4, + parameter int USER_WIDTH = 1, + parameter int FIFO_DEPTH = 16) + (// Global signals + input logic clk, + input logic rst_n, + + // Control interface + input logic ctrl_start, + input logic ctrl_stop, + input logic [ADDR_WIDTH-1:0] ctrl_src_addr, + input logic [ADDR_WIDTH-1:0] ctrl_dst_addr, + input logic [7:0] ctrl_len, + input logic [2:0] ctrl_size, + input logic [31:0] ctrl_transfer_len, + output logic ctrl_done, + + // AW Channel + output logic [ID_WIDTH-1:0] mm2mm_awid, + output logic [ADDR_WIDTH-1:0] mm2mm_awaddr, + output logic [7:0] mm2mm_awlen, + output logic [2:0] mm2mm_awsize, + output logic [1:0] mm2mm_awburst, + output logic mm2mm_awlock, + output logic [3:0] mm2mm_awcache, + output logic [2:0] mm2mm_awprot, + output logic [3:0] mm2mm_awqos, + output logic [USER_WIDTH-1:0] mm2mm_awuser, + output logic mm2mm_awvalid, + input logic mm2mm_awready, + + // W Channel + output logic [DATA_WIDTH-1:0] mm2mm_wdata, + output logic [DATA_WIDTH/8-1:0] mm2mm_wstrb, + output logic mm2mm_wlast, + output logic [USER_WIDTH-1:0] mm2mm_wuser, + output logic mm2mm_wvalid, + input logic mm2mm_wready, + + // B Channel + input logic [ID_WIDTH-1:0] mm2mm_bid, + input logic [1:0] mm2mm_bresp, + input logic [USER_WIDTH-1:0] mm2mm_buser, + input logic mm2mm_bvalid, + output logic mm2mm_bready, + + // AR Channel + output logic [ID_WIDTH-1:0] mm2mm_arid, + output logic [ADDR_WIDTH-1:0] mm2mm_araddr, + output logic [7:0] mm2mm_arlen, + output logic [2:0] mm2mm_arsize, + output logic [1:0] mm2mm_arburst, + output logic mm2mm_arlock, + output logic [3:0] mm2mm_arcache, + output logic [2:0] mm2mm_arprot, + output logic [3:0] mm2mm_arqos, + output logic [USER_WIDTH-1:0] mm2mm_aruser, + output logic mm2mm_arvalid, + input logic mm2mm_arready, + + // R Channel + input logic [ID_WIDTH-1:0] mm2mm_rid, + input logic [DATA_WIDTH-1:0] mm2mm_rdata, + input logic [1:0] mm2mm_rresp, + input logic mm2mm_rlast, + input logic [USER_WIDTH-1:0] mm2mm_ruser, + input logic mm2mm_rvalid, + output logic mm2mm_rready + ); + + // ------------------------------------------------------------------------- + // Local parameters + // ------------------------------------------------------------------------- + localparam int STRB_WIDTH = DATA_WIDTH / 8; + localparam int STRB_IDX_WIDTH = $clog2(STRB_WIDTH) + 1; // +1 to hold full-width value + + // ------------------------------------------------------------------------- + // Start / stop edge detection + // ------------------------------------------------------------------------- + logic ctrl_start_r, wr_start_edge; + logic ctrl_stop_r, wr_stop_edge; + + always_ff @(posedge clk or negedge rst_n) + if (!rst_n) begin + ctrl_start_r <= 1'b0; + ctrl_stop_r <= 1'b0; + end else begin + ctrl_start_r <= ctrl_start; + ctrl_stop_r <= ctrl_stop; + end + + assign wr_start_edge = ctrl_start & ~ctrl_start_r; + assign wr_stop_edge = ctrl_stop & ~ctrl_stop_r; + + // ------------------------------------------------------------------------- + // Abort latch — set on stop edge, cleared on start edge + // ------------------------------------------------------------------------- + logic wr_abort; + + always_ff @(posedge clk or negedge rst_n) + if (!rst_n) wr_abort <= 1'b0; + else if (wr_stop_edge) wr_abort <= 1'b1; + else if (wr_start_edge) wr_abort <= 1'b0; + + // ------------------------------------------------------------------------- + // FSM + // ------------------------------------------------------------------------- + typedef enum logic [2:0] {IDLE, PREP1, PREP2, AR, READ, AW, WRITE, WAIT_BRESP} state_t; + state_t state, next_state; + + logic transfer_done; + + always_ff @(posedge clk or negedge rst_n) + if (!rst_n) state <= IDLE; + else state <= next_state; + + always_comb begin + next_state = state; // default holds state; prevents latches + case (state) + IDLE: begin + next_state = (ctrl_start && !wr_abort) ? PREP1 : IDLE; + end + PREP1: begin + next_state = wr_abort ? IDLE : PREP2; + end + PREP2: begin + next_state = AR; + end + AR: begin + if (wr_abort) + next_state = IDLE; + else + next_state = (mm2mm_arvalid && mm2mm_arready) ? READ : AR; + end + READ: begin + next_state = (mm2mm_rvalid && mm2mm_rready && mm2mm_rlast) ? AW : READ; + end + AW: begin + if (wr_abort) + next_state = IDLE; + else + next_state = (mm2mm_awvalid && mm2mm_awready) ? WRITE : AW; + end + WRITE: begin + next_state = (mm2mm_wvalid && mm2mm_wready && mm2mm_wlast) ? WAIT_BRESP : WRITE; + end + WAIT_BRESP: begin + if (mm2mm_bvalid && mm2mm_bready) begin + if (wr_abort || transfer_done) + next_state = IDLE; + else + next_state = PREP1; + end + end + default: ; + endcase + end + + // ------------------------------------------------------------------------- + // 4K boundary & burst-length computation — pipelined across PREP1 / PREP2 + // + // Identical two-stage pipeline to s2mm / mm2s. The src address is used + // for the 4K check; burst_actual_bytes is applied to both pointers so + // they stay in lock-step. + // + // PREP1 [Stage 1]: max_len, next_size, src_axi_addr (all regs) + // → next_bytes → cross_4k → bytes_to_4k + // → register bytes_to_4k_r + // + // PREP2 [Stage 2]: bytes_to_4k_r, pending_bytes, next_size (all regs) + // → num_bytes_comb → next_len_o + // → register next_arlen / next_awlen | burst_actual_bytes + // ------------------------------------------------------------------------- + logic [7:0] max_len; + logic [2:0] next_size; + logic [ADDR_WIDTH-1:0] src_axi_addr; + logic [ADDR_WIDTH-1:0] dst_axi_addr; + logic [31:0] pending_bytes; + + // Stage 1 wires + logic [14:0] next_bytes; + logic cross_4k; + logic [14:0] bytes_to_4k; + // Stage 1 → Stage 2 pipeline register + logic [14:0] bytes_to_4k_r; + // Stage 2 wires + logic [14:0] num_bytes_comb; + logic [7:0] next_len_o; + + // Stage 1 combinatorial + assign next_bytes = compute_num_bytes(max_len, next_size); + assign cross_4k = ({1'b0, next_bytes} + {4'b0, src_axi_addr[11:0]}) >= 16'd4096; + assign bytes_to_4k = cross_4k ? (15'd4096 - {3'b0, src_axi_addr[11:0]}) : next_bytes; + + // Stage 2 combinatorial + assign num_bytes_comb = ({{17{1'b0}}, bytes_to_4k_r} <= pending_bytes) + ? bytes_to_4k_r + : pending_bytes[14:0]; + assign next_len_o = compute_next_len(num_bytes_comb, next_size); + + // ------------------------------------------------------------------------- + // Transfer-state registers + // ------------------------------------------------------------------------- + logic [31:0] transfer_len; + logic [31:0] copied_bytes; + logic [7:0] next_arlen; + logic [7:0] next_awlen; + logic [14:0] burst_actual_bytes; + + always_ff @(posedge clk or negedge rst_n) + if (!rst_n) begin + src_axi_addr <= '0; + dst_axi_addr <= '0; + next_arlen <= '0; + next_awlen <= '0; + max_len <= '0; + next_size <= '0; + copied_bytes <= '0; + transfer_len <= '0; + bytes_to_4k_r <= '0; + burst_actual_bytes <= '0; + end else if (wr_start_edge) begin + src_axi_addr <= ctrl_src_addr; + dst_axi_addr <= ctrl_dst_addr; + next_arlen <= ctrl_len; + next_awlen <= ctrl_len; + max_len <= ctrl_len; + next_size <= ctrl_size; + copied_bytes <= '0; + transfer_len <= ctrl_transfer_len; + burst_actual_bytes <= '0; + end else if (state == PREP1) begin + bytes_to_4k_r <= bytes_to_4k; + end else if (state == PREP2) begin + next_arlen <= next_len_o; + next_awlen <= next_len_o; + burst_actual_bytes <= num_bytes_comb; + end else if (state == AR && mm2mm_arready) begin + src_axi_addr <= src_axi_addr + {{(ADDR_WIDTH-15){1'b0}}, burst_actual_bytes}; + end else if (state == AW && mm2mm_awready) begin + dst_axi_addr <= dst_axi_addr + {{(ADDR_WIDTH-15){1'b0}}, burst_actual_bytes}; + copied_bytes <= copied_bytes + {17'b0, burst_actual_bytes}; + end + + // pending_bytes — decremented in AR state after burst_actual_bytes is registered. + // TIMING FIX: reg(burst_actual_bytes) → subtractor → reg(pending_bytes) + always_ff @(posedge clk or negedge rst_n) + if (!rst_n) + pending_bytes <= '0; + else if (wr_start_edge) + pending_bytes <= ctrl_transfer_len; + else if (state == AR && mm2mm_arready) + pending_bytes <= pending_bytes - {17'b0, burst_actual_bytes}; + + // ------------------------------------------------------------------------- + // Transfer-done flag + // ------------------------------------------------------------------------- + always_ff @(posedge clk or negedge rst_n) + if (!rst_n) + transfer_done <= 1'b0; + else if (wr_start_edge || state == IDLE || state == AR || + state == PREP1 || state == PREP2) + transfer_done <= 1'b0; + else + transfer_done <= (copied_bytes == transfer_len) && (copied_bytes != '0); + + // ------------------------------------------------------------------------- + // ctrl_done — single-cycle pulse when FSM transitions into IDLE + // ------------------------------------------------------------------------- + always_ff @(posedge clk or negedge rst_n) + if (!rst_n) ctrl_done <= 1'b0; + else ctrl_done <= (next_state == IDLE) && (state != IDLE); + + // ------------------------------------------------------------------------- + // Beat counter — drives wlast + // ------------------------------------------------------------------------- + logic [7:0] beat_cnt; + + always_ff @(posedge clk or negedge rst_n) + if (!rst_n) + beat_cnt <= '0; + else if (state == AW && mm2mm_awready) + beat_cnt <= '0; + else if (mm2mm_wvalid && mm2mm_wready) + beat_cnt <= beat_cnt + 1'b1; + + // ------------------------------------------------------------------------- + // Write strobe generation for partial last beat + // + // partial_strb_mask uses a per-bit comparator loop rather than a hardcoded + // case statement, making it correct for any DATA_WIDTH (including 1024-bit). + // Synthesises as a parallel comparator tree with no barrel shifter. + // ------------------------------------------------------------------------- + logic [14:0] bytes_in_burst; + logic [STRB_WIDTH-1:0] wstrb_mask; + logic [STRB_IDX_WIDTH-1:0] valid_bytes; + + always_ff @(posedge clk or negedge rst_n) + if (!rst_n) + bytes_in_burst <= '0; + else if (state == AW && mm2mm_awready) + bytes_in_burst <= burst_actual_bytes; + else if (mm2mm_wvalid && mm2mm_wready) + bytes_in_burst <= (bytes_in_burst > STRB_WIDTH[14:0]) + ? (bytes_in_burst - STRB_WIDTH[14:0]) + : '0; + + assign valid_bytes = (bytes_in_burst <= STRB_WIDTH[14:0]) + ? bytes_in_burst[STRB_IDX_WIDTH-1:0] + : STRB_WIDTH[STRB_IDX_WIDTH-1:0]; + + logic [STRB_WIDTH-1:0] partial_strb_mask; + + always_comb begin + for (int i = 0; i < STRB_WIDTH; i++) + partial_strb_mask[i] = (i < valid_bytes); + end + + always_comb begin + if (mm2mm_wlast && (bytes_in_burst < STRB_WIDTH[14:0]) && (bytes_in_burst != '0)) + wstrb_mask = partial_strb_mask; + else if (bytes_in_burst == '0) + wstrb_mask = '0; + else + wstrb_mask = {STRB_WIDTH{1'b1}}; + end + + // ------------------------------------------------------------------------- + // FIFO — bridges R channel (read path) to W channel (write path) + // + // R-channel data is accepted only in READ state to prevent beats arriving + // before READ is entered from being silently dropped (same fix as mm2s). + // The write side drains only in WRITE state for symmetric gating. + // ------------------------------------------------------------------------- + logic [DATA_WIDTH-1:0] fifo_tdata; + logic fifo_tvalid; + logic fifo_tlast; + logic fifo_tuser; + logic fifo_s_tready; + + assign mm2mm_rready = fifo_s_tready && (state == READ); + + snix_axis_fifo #( + .DATA_WIDTH(DATA_WIDTH), + .FIFO_DEPTH(FIFO_DEPTH) + ) axis_fifo_u0 ( + .clk (clk), + .rst_n (rst_n), + .s_axis_tdata (mm2mm_rdata), + .s_axis_tlast (mm2mm_rlast), + .s_axis_tuser (1'b0), + .s_axis_tvalid (mm2mm_rvalid && (state == READ)), + .s_axis_tready (fifo_s_tready), + .m_axis_tdata (fifo_tdata), + .m_axis_tlast (fifo_tlast), + .m_axis_tuser (fifo_tuser), + .m_axis_tvalid (fifo_tvalid), + .m_axis_tready (mm2mm_wready && (state == WRITE)) + ); + + // ------------------------------------------------------------------------- + // AXI output assignments — AR channel + // ------------------------------------------------------------------------- + assign mm2mm_arvalid = (state == AR); + assign mm2mm_araddr = src_axi_addr; + assign mm2mm_arlen = next_arlen; + assign mm2mm_arsize = next_size; + assign mm2mm_arburst = 2'b01; + assign mm2mm_arlock = 1'b0; + assign mm2mm_arcache = 4'b0; + assign mm2mm_arprot = 3'b0; + assign mm2mm_arqos = 4'b0; + assign mm2mm_arid = '0; + assign mm2mm_aruser = '0; + + // ------------------------------------------------------------------------- + // AXI output assignments — AW channel + // ------------------------------------------------------------------------- + assign mm2mm_awvalid = (state == AW); + assign mm2mm_awaddr = dst_axi_addr; + assign mm2mm_awlen = next_awlen; + assign mm2mm_awsize = next_size; + assign mm2mm_awburst = 2'b01; + assign mm2mm_awlock = 1'b0; + assign mm2mm_awcache = 4'b0; + assign mm2mm_awprot = 3'b0; + assign mm2mm_awqos = 4'b0; + assign mm2mm_awid = '0; + assign mm2mm_awuser = '0; + + // ------------------------------------------------------------------------- + // AXI output assignments — W channel + // ------------------------------------------------------------------------- + generate + for (genvar i = 0; i < STRB_WIDTH; i++) begin : gen_wdata_mask + assign mm2mm_wdata[i*8 +: 8] = wstrb_mask[i] ? fifo_tdata[i*8 +: 8] : 8'h00; + end + endgenerate + + assign mm2mm_wvalid = (state == WRITE) && fifo_tvalid; + assign mm2mm_wlast = (beat_cnt == next_awlen) && mm2mm_wvalid; + assign mm2mm_wstrb = wstrb_mask; + assign mm2mm_wuser = '0; + + // ------------------------------------------------------------------------- + // AXI output assignments — B channel + // ------------------------------------------------------------------------- + assign mm2mm_bready = (state == WAIT_BRESP); + + // ------------------------------------------------------------------------- + // Functions (identical to s2mm / mm2s) + // ------------------------------------------------------------------------- + + // Returns total byte count for an AXI burst: (len+1) << size. + function automatic [14:0] compute_num_bytes( + input logic [7:0] len, + input logic [2:0] size + ); + case (size) + 3'b000: compute_num_bytes = {7'b0, len + 1'b1}; + 3'b001: compute_num_bytes = {6'b0, len + 1'b1, 1'b0}; + 3'b010: compute_num_bytes = {5'b0, len + 1'b1, 2'b0}; + 3'b011: compute_num_bytes = {4'b0, len + 1'b1, 3'b0}; + 3'b100: compute_num_bytes = {3'b0, len + 1'b1, 4'b0}; + 3'b101: compute_num_bytes = {2'b0, len + 1'b1, 5'b0}; + 3'b110: compute_num_bytes = {1'b0, len + 1'b1, 6'b0}; + 3'b111: compute_num_bytes = { len + 1'b1, 7'b0}; + endcase + endfunction + + // Returns arlen/awlen = ceil(bytes / beat_size) - 1. + function automatic [7:0] compute_next_len( + input logic [14:0] bytes_i, + input logic [2:0] size + ); + logic [14:0] num_beats; + case (size) + 3'b000: num_beats = bytes_i; + 3'b001: num_beats = (bytes_i + 15'd1) >> 1; + 3'b010: num_beats = (bytes_i + 15'd3) >> 2; + 3'b011: num_beats = (bytes_i + 15'd7) >> 3; + 3'b100: num_beats = (bytes_i + 15'd15) >> 4; + 3'b101: num_beats = (bytes_i + 15'd31) >> 5; + 3'b110: num_beats = (bytes_i + 15'd63) >> 6; + 3'b111: num_beats = (bytes_i + 15'd127) >> 7; + endcase + if (num_beats == 15'd0) + compute_next_len = 8'd0; + else + compute_next_len = num_beats[7:0] - 8'd1; + endfunction + +endmodule : snix_axi_mm2mm diff --git a/rtl/ip/cdma/snix_axil_cdma_mux.sv b/rtl/ip/cdma/snix_axil_cdma_mux.sv new file mode 100644 index 0000000..ba82421 --- /dev/null +++ b/rtl/ip/cdma/snix_axil_cdma_mux.sv @@ -0,0 +1,381 @@ +// ============================================================================ +// snix_axil_cdma_mux.sv +// Multi-Channel AXI-Lite MUX Wrapper for snix_axi_mm2mm engine +// +// Register Map (per channel, offset 0x40): +// 0x00: READ_ADDR (Source Address) +// 0x04: WRITE_ADDR (Destination Address) +// 0x08: LENGTH (Transfer length in bytes) +// 0x0C: TAG (User tag, purely for software tracking) +// 0x10: CTRL (Write 1 to bit 0 to trigger) +// [5:3] = AXI AxSIZE (0=1B, 1=2B, 2=4B, 3=8B...) +// [13:6] = AXI AxLEN (0=1 beat, 15=16 beats...) +// 0x14: STATUS (Bit 0: Busy RO, Bit 1: Done W1C) +// ============================================================================ +`timescale 1ns / 1ps + +module snix_axil_cdma_mux #( + parameter int ADDR_WIDTH = 32, + parameter int DATA_WIDTH = 32, // Matches engine default + parameter int AXIL_ADDR_WIDTH = 32, + parameter int AXIL_DATA_WIDTH = 32, + parameter int ID_WIDTH = 4, + parameter int USER_WIDTH = 1, + parameter int PORTS = 8, + parameter int FIFO_DEPTH = 16 +) ( + input logic clk, + input logic rst_n, + + // ========================================== + // AXI-Lite Slave Interface (CPU CSR Access) + // ========================================== + input logic [AXIL_ADDR_WIDTH-1:0] s_axil_awaddr, + input logic s_axil_awvalid, + output logic s_axil_awready, + input logic [AXIL_DATA_WIDTH-1:0] s_axil_wdata, + input logic [AXIL_DATA_WIDTH/8-1:0] s_axil_wstrb, + input logic s_axil_wvalid, + output logic s_axil_wready, + output logic [1:0] s_axil_bresp, + output logic s_axil_bvalid, + input logic s_axil_bready, + input logic [AXIL_ADDR_WIDTH-1:0] s_axil_araddr, + input logic s_axil_arvalid, + output logic s_axil_arready, + output logic [AXIL_DATA_WIDTH-1:0] s_axil_rdata, + output logic [1:0] s_axil_rresp, + output logic s_axil_rvalid, + input logic s_axil_rready, + + // ========================================== + // AXI4 Master Interface (To Crossbar/Memory) + // ========================================== + output logic [ID_WIDTH-1:0] mm2mm_awid, + output logic [ADDR_WIDTH-1:0] mm2mm_awaddr, + output logic [7:0] mm2mm_awlen, + output logic [2:0] mm2mm_awsize, + output logic [1:0] mm2mm_awburst, + output logic mm2mm_awlock, + output logic [3:0] mm2mm_awcache, + output logic [2:0] mm2mm_awprot, + output logic [3:0] mm2mm_awqos, + output logic [USER_WIDTH-1:0] mm2mm_awuser, + output logic mm2mm_awvalid, + input logic mm2mm_awready, + output logic [DATA_WIDTH-1:0] mm2mm_wdata, + output logic [DATA_WIDTH/8-1:0] mm2mm_wstrb, + output logic mm2mm_wlast, + output logic [USER_WIDTH-1:0] mm2mm_wuser, + output logic mm2mm_wvalid, + input logic mm2mm_wready, + input logic [ID_WIDTH-1:0] mm2mm_bid, + input logic [1:0] mm2mm_bresp, + input logic [USER_WIDTH-1:0] mm2mm_buser, + input logic mm2mm_bvalid, + output logic mm2mm_bready, + output logic [ID_WIDTH-1:0] mm2mm_arid, + output logic [ADDR_WIDTH-1:0] mm2mm_araddr, + output logic [7:0] mm2mm_arlen, + output logic [2:0] mm2mm_arsize, + output logic [1:0] mm2mm_arburst, + output logic mm2mm_arlock, + output logic [3:0] mm2mm_arcache, + output logic [2:0] mm2mm_arprot, + output logic [3:0] mm2mm_arqos, + output logic [USER_WIDTH-1:0] mm2mm_aruser, + output logic mm2mm_arvalid, + input logic mm2mm_arready, + input logic [ID_WIDTH-1:0] mm2mm_rid, + input logic [DATA_WIDTH-1:0] mm2mm_rdata, + input logic [1:0] mm2mm_rresp, + input logic mm2mm_rlast, + input logic [USER_WIDTH-1:0] mm2mm_ruser, + input logic mm2mm_rvalid, + output logic mm2mm_rready, + + // Global Interrupt (OR'd from all channels) + output logic dma_finish +); + + // ========================================== + // Local Parameters & Utilities + // ========================================== + localparam int CH_BITS = $clog2(PORTS); + + // Function to safely apply WSTRB to 32-bit registers + function automatic logic [31:0] apply_wstrb( + input logic [31:0] old_val, + input logic [31:0] new_val, + input logic [3:0] wstrb + ); + logic [31:0] res; + res[7:0] = wstrb[0] ? new_val[7:0] : old_val[7:0]; + res[15:8] = wstrb[1] ? new_val[15:8] : old_val[15:8]; + res[23:16] = wstrb[2] ? new_val[23:16] : old_val[23:16]; + res[31:24] = wstrb[3] ? new_val[31:24] : old_val[31:24]; + return res; + endfunction + + // ========================================== + // Internal Registers (Per Channel) + // ========================================== + logic [ADDR_WIDTH-1:0] ch_src_addr [PORTS]; + logic [ADDR_WIDTH-1:0] ch_dst_addr [PORTS]; + logic [31:0] ch_len [PORTS]; + logic [31:0] ch_tag [PORTS]; + logic [31:0] ch_ctrl [PORTS]; + + logic [PORTS-1:0] ch_req; // Pending requests (Busy) + logic [PORTS-1:0] ch_done; // Completion flags + + logic [PORTS-1:0] arb_set_done; // From Arbiter to CSR + + // ========================================== + // Address Decoding (0x40 offset per channel) + // ========================================== + wire [CH_BITS-1:0] wr_ch = s_axil_awaddr[6 +: CH_BITS]; + wire [5:0] wr_reg = s_axil_awaddr[5:0]; + wire [CH_BITS-1:0] rd_ch = s_axil_araddr[6 +: CH_BITS]; + wire [5:0] rd_reg = s_axil_araddr[5:0]; + + // ========================================== + // AXI-Lite Slave Logic (Robust Backpressure) + // ========================================== + assign s_axil_bresp = 2'b00; + assign s_axil_rresp = 2'b00; + + // Write Path Handshake + always_ff @(posedge clk) begin + if (!rst_n) begin + s_axil_awready <= 1'b0; + s_axil_wready <= 1'b0; + end else begin + if (s_axil_awvalid && s_axil_wvalid && !s_axil_awready && (!s_axil_bvalid || s_axil_bready)) begin + s_axil_awready <= 1'b1; + s_axil_wready <= 1'b1; + end else begin + s_axil_awready <= 1'b0; + s_axil_wready <= 1'b0; + end + end + end + + wire do_write = s_axil_awready && s_axil_awvalid && s_axil_wready && s_axil_wvalid; + + always_ff @(posedge clk) begin + if (!rst_n) begin + s_axil_bvalid <= 1'b0; + end else begin + if (do_write) begin + s_axil_bvalid <= 1'b1; + end else if (s_axil_bready && s_axil_bvalid) begin + s_axil_bvalid <= 1'b0; + end + end + end + + // Read Path Handshake + always_ff @(posedge clk) begin + if (!rst_n) begin + s_axil_arready <= 1'b0; + end else begin + if (s_axil_arvalid && !s_axil_arready && (!s_axil_rvalid || s_axil_rready)) begin + s_axil_arready <= 1'b1; + end else begin + s_axil_arready <= 1'b0; + end + end + end + + wire do_read = s_axil_arready && s_axil_arvalid; + + always_ff @(posedge clk) begin + if (!rst_n) begin + s_axil_rvalid <= 1'b0; + s_axil_rdata <= '0; + end else begin + if (do_read) begin + s_axil_rvalid <= 1'b1; + if (rd_ch < PORTS) begin + case (rd_reg) + 6'h00: s_axil_rdata <= ch_src_addr[rd_ch]; + 6'h04: s_axil_rdata <= ch_dst_addr[rd_ch]; + 6'h08: s_axil_rdata <= ch_len[rd_ch]; + 6'h0C: s_axil_rdata <= ch_tag[rd_ch]; + 6'h10: s_axil_rdata <= ch_ctrl[rd_ch]; + 6'h14: s_axil_rdata <= {30'd0, ch_done[rd_ch], ch_req[rd_ch]}; + default: s_axil_rdata <= 32'd0; + endcase + end else begin + s_axil_rdata <= 32'd0; // Out of bounds + end + end else if (s_axil_rready && s_axil_rvalid) begin + s_axil_rvalid <= 1'b0; + end + end + end + + // ========================================== + // Register File Write Logic + // ========================================== + assign dma_finish = |ch_done; + + always_ff @(posedge clk) begin + if (!rst_n) begin + ch_req <= '0; + ch_done <= '0; + for (int i=0; i= PORTS) ? (check_ch_ext - PORTS) : check_ch_ext[CH_BITS-1:0]; + + if (ch_req[check_ch] && !arb_set_done[check_ch]) begin + cur_ch <= check_ch; + rr_ptr <= (check_ch == (PORTS - 1)) ? '0 : (check_ch + 1); + engine_start <= 1'b1; + state <= RUN; + break; + end + end + end + + RUN: begin + if (engine_done) begin + arb_set_done[cur_ch] <= 1'b1; + state <= IDLE; + end + // Optional: Add a watchdog timeout counter here if dealing with untrusted PCIe/AXI endpoints + end + endcase + end + end + + // ========================================== + // Instantiate The Original Core Engine + // ========================================== + snix_axi_mm2mm #( + .ADDR_WIDTH(ADDR_WIDTH), + .DATA_WIDTH(DATA_WIDTH), + .ID_WIDTH (ID_WIDTH), + .USER_WIDTH(USER_WIDTH), + .FIFO_DEPTH(FIFO_DEPTH) + ) u_core_engine ( + .clk (clk), + .rst_n (rst_n), + .ctrl_start (engine_start), + .ctrl_stop (1'b0), // Tied off; can be wired if global abort is needed + .ctrl_src_addr (engine_src), + .ctrl_dst_addr (engine_dst), + .ctrl_len (engine_len), + .ctrl_size (engine_size), + .ctrl_transfer_len (engine_bytes), + .ctrl_done (engine_done), + // AXI4 Port Connections + .mm2mm_awid (mm2mm_awid), .mm2mm_awaddr (mm2mm_awaddr), + .mm2mm_awlen (mm2mm_awlen), .mm2mm_awsize (mm2mm_awsize), + .mm2mm_awburst(mm2mm_awburst),.mm2mm_awlock (mm2mm_awlock), + .mm2mm_awcache(mm2mm_awcache),.mm2mm_awprot (mm2mm_awprot), + .mm2mm_awqos (mm2mm_awqos), .mm2mm_awuser (mm2mm_awuser), + .mm2mm_awvalid(mm2mm_awvalid),.mm2mm_awready(mm2mm_awready), + .mm2mm_wdata (mm2mm_wdata), .mm2mm_wstrb (mm2mm_wstrb), + .mm2mm_wlast (mm2mm_wlast), .mm2mm_wuser (mm2mm_wuser), + .mm2mm_wvalid (mm2mm_wvalid), .mm2mm_wready (mm2mm_wready), + .mm2mm_bid (mm2mm_bid), .mm2mm_bresp (mm2mm_bresp), + .mm2mm_buser (mm2mm_buser), .mm2mm_bvalid (mm2mm_bvalid), + .mm2mm_bready (mm2mm_bready), + .mm2mm_arid (mm2mm_arid), .mm2mm_araddr (mm2mm_araddr), + .mm2mm_arlen (mm2mm_arlen), .mm2mm_arsize (mm2mm_arsize), + .mm2mm_arburst(mm2mm_arburst),.mm2mm_arlock (mm2mm_arlock), + .mm2mm_arcache(mm2mm_arcache),.mm2mm_arprot (mm2mm_arprot), + .mm2mm_arqos (mm2mm_arqos), .mm2mm_aruser (mm2mm_aruser), + .mm2mm_arvalid(mm2mm_arvalid),.mm2mm_arready(mm2mm_arready), + .mm2mm_rid (mm2mm_rid), .mm2mm_rdata (mm2mm_rdata), + .mm2mm_rresp (mm2mm_rresp), .mm2mm_rlast (mm2mm_rlast), + .mm2mm_ruser (mm2mm_ruser), .mm2mm_rvalid (mm2mm_rvalid), + .mm2mm_rready (mm2mm_rready) + ); + +endmodule \ No newline at end of file diff --git a/rtl/ip/cdma/snix_axis_fifo.sv b/rtl/ip/cdma/snix_axis_fifo.sv new file mode 100644 index 0000000..ba6d824 --- /dev/null +++ b/rtl/ip/cdma/snix_axis_fifo.sv @@ -0,0 +1,113 @@ +// ============================================================================ +// snix_axis_fifo.sv +// +// AXI4-Stream FIFO with two operating modes selected by FRAME_FIFO: +// +// FRAME_FIFO = 0 (default) — streaming / cut-through +// Output valid asserts as soon as any data enters the FIFO. +// Downstream can begin reading before the full packet arrives. +// +// FRAME_FIFO = 1 — store-and-forward +// Output valid is suppressed until the complete packet (through tlast) +// has been written into the FIFO. Guarantees the downstream never +// sees a stalled mid-packet transfer. +// ============================================================================ +module snix_axis_fifo #( + parameter int DATA_WIDTH = 32, + parameter int USER_WIDTH = 1, + parameter int FIFO_DEPTH = 16, + parameter bit FRAME_FIFO = 0 // 0 = streaming, 1 = store-and-forward +) ( + input logic clk, + input logic rst_n, + + // AXI4-Stream slave (input) + input logic [DATA_WIDTH-1:0] s_axis_tdata, + input logic [USER_WIDTH-1:0] s_axis_tuser, + input logic s_axis_tvalid, + input logic s_axis_tlast, + output logic s_axis_tready, + + // AXI4-Stream master (output) + output logic [DATA_WIDTH-1:0] m_axis_tdata, + output logic [USER_WIDTH-1:0] m_axis_tuser, + output logic m_axis_tvalid, + output logic m_axis_tlast, + input logic m_axis_tready +); + + localparam int AWIDTH = $clog2(FIFO_DEPTH); + + // Internal FIFO signals + logic [DATA_WIDTH-1:0] fifo_tdata; + logic [USER_WIDTH-1:0] fifo_tuser; + logic fifo_tlast; + logic wr_en, rd_en; + logic fifo_full, fifo_empty; + logic [AWIDTH:0] fill_cnt; + + // Handshake strobes + assign s_axis_tready = ~fifo_full; + assign wr_en = s_axis_tvalid & s_axis_tready; + assign rd_en = m_axis_tvalid & m_axis_tready; + + // Output mapping + assign m_axis_tdata = fifo_tdata; + assign m_axis_tuser = fifo_tuser; + assign m_axis_tlast = fifo_tlast; + + // ------------------------------------------------------------------------- + // Output valid generation + // + // FRAME_FIFO = 1 : store-and-forward FSM + // IDLE -> STREAM when tlast is written into the FIFO + // STREAM -> IDLE when tlast is read out of the FIFO + // + // FRAME_FIFO = 0 : cut-through, valid tracks fifo_empty directly + // ------------------------------------------------------------------------- + generate + if (FRAME_FIFO) begin : gen_frame_mode + + typedef enum logic { IDLE, STREAM } state_t; + state_t state, nxt; + + always_ff @(posedge clk or negedge rst_n) + if (!rst_n) state <= IDLE; + else state <= nxt; + + always_comb begin + nxt = state; + case (state) + IDLE: if (wr_en && s_axis_tlast) nxt = STREAM; + STREAM: if (rd_en && fifo_tlast) nxt = IDLE; + endcase + end + + assign m_axis_tvalid = ~fifo_empty & (state == STREAM); + + end else begin : gen_stream_mode + + assign m_axis_tvalid = ~fifo_empty; + + end + endgenerate + + // ------------------------------------------------------------------------- + // Sync FIFO instance — packs {tdata, tuser, tlast} into one word + // ------------------------------------------------------------------------- + snix_sync_fifo #( + .DATA_WIDTH (DATA_WIDTH + USER_WIDTH + 1), + .FIFO_DEPTH (FIFO_DEPTH) + ) u_fifo ( + .clk (clk), + .rst_n (rst_n), + .data_i ({s_axis_tdata, s_axis_tuser, s_axis_tlast}), + .wr_en (wr_en), + .rd_en (rd_en), + .data_o ({fifo_tdata, fifo_tuser, fifo_tlast}), + .fifo_full (fifo_full), + .fifo_empty (fifo_empty), + .fill_cnt (fill_cnt) + ); + +endmodule : snix_axis_fifo diff --git a/rtl/ip/cdma/snix_register_slice.sv b/rtl/ip/cdma/snix_register_slice.sv new file mode 100644 index 0000000..dedb4ad --- /dev/null +++ b/rtl/ip/cdma/snix_register_slice.sv @@ -0,0 +1,79 @@ +// ============================================================================ +// snix_register_slice.sv +// +// Generic ready/valid register slice (skid buffer). +// +// Same architecture as snix_axis_register but without tuser/tlast — +// used internally by the DMA and CDMA engines for pipeline decoupling +// on raw data paths. +// ============================================================================ +module snix_register_slice #( + parameter DATA_WIDTH = 32 +) ( + input logic clk, + input logic rst_n, + + // Input interface + input logic [DATA_WIDTH-1:0] s_axis_tdata, + input logic s_axis_tvalid, + output logic s_axis_tready, + + // Output interface + output logic [DATA_WIDTH-1:0] m_axis_tdata, + output logic m_axis_tvalid, + input logic m_axis_tready +); + + // Skid register + logic skid_valid; + logic [DATA_WIDTH-1:0] skid_data; + + wire s_hsk = s_axis_tvalid & s_axis_tready; + wire m_stall = m_axis_tvalid & ~m_axis_tready; + + // ----------------------------------------------------------------- + // Skid valid + // ----------------------------------------------------------------- + always_ff @(posedge clk or negedge rst_n) + if (!rst_n) + skid_valid <= 1'b0; + else if (s_hsk & m_stall) + skid_valid <= 1'b1; + else if (m_axis_tready) + skid_valid <= 1'b0; + + // ----------------------------------------------------------------- + // Skid data + // ----------------------------------------------------------------- + always_ff @(posedge clk or negedge rst_n) + if (!rst_n) + skid_data <= '0; + else if (s_hsk) + skid_data <= s_axis_tdata; + + // Ready when skid is empty + assign s_axis_tready = ~skid_valid; + + // ----------------------------------------------------------------- + // Output valid + // ----------------------------------------------------------------- + always_ff @(posedge clk or negedge rst_n) + if (!rst_n) + m_axis_tvalid <= 1'b0; + else if (~m_axis_tvalid | m_axis_tready) + m_axis_tvalid <= s_axis_tvalid | skid_valid; + + // ----------------------------------------------------------------- + // Output data — skid has priority + // ----------------------------------------------------------------- + always_ff @(posedge clk or negedge rst_n) + if (!rst_n) + m_axis_tdata <= '0; + else if (~m_axis_tvalid | m_axis_tready) begin + if (skid_valid) + m_axis_tdata <= skid_data; + else if (s_axis_tvalid) + m_axis_tdata <= s_axis_tdata; + end + +endmodule : snix_register_slice diff --git a/rtl/ip/cdma/snix_sync_fifo.sv b/rtl/ip/cdma/snix_sync_fifo.sv new file mode 100644 index 0000000..9a64927 --- /dev/null +++ b/rtl/ip/cdma/snix_sync_fifo.sv @@ -0,0 +1,130 @@ +// ============================================================================ +// snix_sync_fifo.sv +// +// Synchronous FIFO with first-word-fall-through (FWFT) bypass. +// +// Architecture: +// - Dual-pointer circular buffer with MSB wrap-bit for full detection +// - Write-through bypass path: when the FIFO is empty and a write arrives, +// data is forwarded directly to the output without a one-cycle read delay +// - Block-RAM inference hint for FPGA targets +// ============================================================================ +module snix_sync_fifo #( + parameter int DATA_WIDTH = 32, + parameter int FIFO_DEPTH = 16 +) ( + input logic clk, + input logic rst_n, + + // Write port + input logic [DATA_WIDTH-1:0] data_i, + input logic wr_en, + + // Read port + input logic rd_en, + output logic [DATA_WIDTH-1:0] data_o, + + // Status + output logic [$clog2(FIFO_DEPTH):0] fill_cnt, + output logic fifo_full, + output logic fifo_empty +); + + localparam int AWIDTH = $clog2(FIFO_DEPTH); + + // Storage + (* ram_style="block" *) + logic [DATA_WIDTH-1:0] mem [0:FIFO_DEPTH-1]; + + // Pointers — extra MSB for wrap-around detection + logic [AWIDTH:0] wptr, rptr; + + // Bypass (FWFT) path + logic [DATA_WIDTH-1:0] fwd_data; + logic fwd_valid; + + // Qualified strobes + wire do_wr = wr_en & ~fifo_full; + wire do_rd = rd_en & ~fifo_empty; + + // ----------------------------------------------------------------- + // Write pointer + // ----------------------------------------------------------------- + always_ff @(posedge clk or negedge rst_n) + if (!rst_n) + wptr <= '0; + else if (do_wr) + wptr <= wptr + 1'b1; + + // ----------------------------------------------------------------- + // Read pointer + // ----------------------------------------------------------------- + always_ff @(posedge clk or negedge rst_n) + if (!rst_n) + rptr <= '0; + else if (do_rd) + rptr <= rptr + 1'b1; + + // ----------------------------------------------------------------- + // Memory write + // ----------------------------------------------------------------- + always_ff @(posedge clk) + if (do_wr) + mem[wptr[AWIDTH-1:0]] <= data_i; + + // ----------------------------------------------------------------- + // Memory read — pre-fetch next location for FWFT + // ----------------------------------------------------------------- + logic [DATA_WIDTH-1:0] mem_rd; + + always_ff @(posedge clk) + if (do_rd) + mem_rd <= mem[rptr[AWIDTH-1:0] + 1'b1]; + + // ----------------------------------------------------------------- + // Fill counter and empty flag + // ----------------------------------------------------------------- + always_ff @(posedge clk or negedge rst_n) + if (!rst_n) begin + fifo_empty <= 1'b1; + fill_cnt <= '0; + end else begin + case ({do_wr, do_rd}) + 2'b10: begin + fill_cnt <= fill_cnt + 1'b1; + fifo_empty <= 1'b0; + end + 2'b01: begin + fill_cnt <= fill_cnt - 1'b1; + fifo_empty <= (fill_cnt <= 1); + end + default: ; + endcase + end + + // Full flag — MSB of fill counter + assign fifo_full = fill_cnt[AWIDTH]; + + // ----------------------------------------------------------------- + // FWFT bypass — forward write data directly when FIFO is empty + // ----------------------------------------------------------------- + always_ff @(posedge clk or negedge rst_n) + if (!rst_n) + fwd_valid <= 1'b0; + else if (fifo_empty || rd_en) begin + if (!wr_en) + fwd_valid <= 1'b0; + else if (fifo_empty || (rd_en && fill_cnt == 1)) + fwd_valid <= 1'b1; + else + fwd_valid <= 1'b0; + end + + always_ff @(posedge clk) + if (fifo_empty || rd_en) + fwd_data <= data_i; + + // Output mux — bypass path has priority + assign data_o = fwd_valid ? fwd_data : mem_rd; + +endmodule : snix_sync_fifo diff --git a/rtl/ip/confreg/confreg.v b/rtl/ip/confreg/confreg.v new file mode 100644 index 0000000..26ab8c0 --- /dev/null +++ b/rtl/ip/confreg/confreg.v @@ -0,0 +1,421 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ +`define CONFREG_INT_ADDR 16'hf000 //1f20_f000 +`define TIMER_ADDR 16'hf100 //1f20_f100 +`define DIGITAL_ADDR 16'hf200 //1f20_f200 +`define LED_ADDR 16'hf300 //1f20_f300 +`define SWITCH_ADDR 16'hf400 //1f20_f400 +`define SIMU_FLAG_ADDR 16'hf500 //1f20_f500 + +module confreg #( + parameter SIMULATION=1'b0 +) +( + input aclk, + input aresetn, + + input cpu_clk, + input cpu_resetn, + + input [4 :0] s_awid, + input [31:0] s_awaddr, + input [7 :0] s_awlen, + input [2 :0] s_awsize, + input [1 :0] s_awburst, + input s_awlock, + input [3 :0] s_awcache, + input [2 :0] s_awprot, + input s_awvalid, + output s_awready, + input [4 :0] s_wid, + input [31:0] s_wdata, + input [3 :0] s_wstrb, + input s_wlast, + input s_wvalid, + output reg s_wready, + output [4 :0] s_bid, + output [1 :0] s_bresp, + output reg s_bvalid, + input s_bready, + input [4 :0] s_arid, + input [31:0] s_araddr, + input [7 :0] s_arlen, + input [2 :0] s_arsize, + input [1 :0] s_arburst, + input s_arlock, + input [3 :0] s_arcache, + input [2 :0] s_arprot, + input s_arvalid, + output s_arready, + output [4 :0] s_rid, + output reg [31:0] s_rdata, + output [1 :0] s_rresp, + output reg s_rlast, + output reg s_rvalid, + input s_rready, + + output [15:0] led, + output [7:0] dpy0, + output [7:0] dpy1, + input [31:0] switch, + input [3 :0] touch_btn, + + input uart0_int, + input dma_finish, + input fft_finish, + output confreg_int +); + +wire [3:0] touch_btn_data;//按键中断信号,上升沿触发 +reg [31:0] led_data; +wire [31:0] switch_data; +reg [31:0] simu_flag; + +reg [31:0] confreg_int_en,confreg_int_edge,confreg_int_pol,confreg_int_clr,confreg_int_set; +wire [31:0] confreg_int_state; + +reg [31:0] sys_timer,sys_timer_cmp; +reg sys_timer_en; +reg timer_int;//定时器中断信号,高电平触发 + +reg [31:0] digital_ctrl; +reg [31:0] digital_data; + + +reg busy,write,R_or_W; + +wire ar_enter = s_arvalid & s_arready; +wire r_retire = s_rvalid & s_rready & s_rlast; +wire aw_enter = s_awvalid & s_awready; +wire w_enter = s_wvalid & s_wready & s_wlast; +wire b_retire = s_bvalid & s_bready; + +assign s_arready = ~busy & (!R_or_W| !s_awvalid); +assign s_awready = ~busy & ( R_or_W| !s_arvalid); + +always@(posedge aclk) + if(~aresetn) busy <= 1'b0; + else if(ar_enter|aw_enter) busy <= 1'b1; + else if(r_retire|b_retire) busy <= 1'b0; + +reg [4 :0] buf_id; +reg [31:0] buf_addr; +reg [7 :0] buf_len; +reg [2 :0] buf_size; +reg [1 :0] buf_burst; +reg buf_lock; +reg [3 :0] buf_cache; +reg [2 :0] buf_prot; + +always@(posedge aclk) + if(~aresetn) begin + R_or_W <= 1'b0; + buf_id <= 'b0; + buf_addr <= 'b0; + buf_len <= 'b0; + buf_size <= 'b0; + buf_burst <= 'b0; + buf_lock <= 'b0; + buf_cache <= 'b0; + buf_prot <= 'b0; + end + else + if(ar_enter | aw_enter) begin + R_or_W <= ar_enter; + buf_id <= ar_enter ? s_arid : s_awid ; + buf_addr <= ar_enter ? s_araddr : s_awaddr ; + buf_len <= ar_enter ? s_arlen : s_awlen ; + buf_size <= ar_enter ? s_arsize : s_awsize ; + buf_burst <= ar_enter ? s_arburst: s_awburst; + buf_lock <= ar_enter ? s_arlock : s_awlock ; + buf_cache <= ar_enter ? s_arcache: s_awcache; + buf_prot <= ar_enter ? s_arprot : s_awprot ; + end + +always@(posedge aclk) + if(~aresetn) write <= 1'b0; + else if(aw_enter) write <= 1'b1; + else if(ar_enter) write <= 1'b0; + +always@(posedge aclk) + if(~aresetn) s_wready <= 1'b0; + else if(aw_enter) s_wready <= 1'b1; + else if(w_enter & s_wlast) s_wready <= 1'b0; + +wire [31:0] rdata_d = buf_addr[15:0] == (`CONFREG_INT_ADDR + 16'h0) ? confreg_int_en : + buf_addr[15:0] == (`CONFREG_INT_ADDR + 16'h4) ? confreg_int_edge : + buf_addr[15:0] == (`CONFREG_INT_ADDR + 16'h8) ? confreg_int_pol : + buf_addr[15:0] == (`CONFREG_INT_ADDR + 16'hc) ? confreg_int_clr : + buf_addr[15:0] == (`CONFREG_INT_ADDR + 16'h10) ? confreg_int_set : + buf_addr[15:0] == (`CONFREG_INT_ADDR + 16'h14) ? confreg_int_state : + buf_addr[15:0] == (`TIMER_ADDR + 16'h0) ? sys_timer : + buf_addr[15:0] == (`TIMER_ADDR + 16'h4) ? sys_timer_cmp : + buf_addr[15:0] == (`TIMER_ADDR + 16'h8) ? sys_timer_en : + buf_addr[15:0] == (`DIGITAL_ADDR + 16'h0) ? digital_ctrl : + buf_addr[15:0] == (`DIGITAL_ADDR + 16'h4) ? digital_data : + buf_addr[15:0] == `LED_ADDR ? led_data : + buf_addr[15:0] == `SWITCH_ADDR ? switch_data : + buf_addr[15:0] == `SIMU_FLAG_ADDR ? simu_flag : + 32'd0; + +always@(posedge aclk) + if(~aresetn) begin + s_rdata <= 'b0; + s_rvalid <= 1'b0; + s_rlast <= 1'b0; + end + else if(busy & !write & !r_retire) + begin + s_rdata <= rdata_d; + s_rvalid <= 1'b1; + s_rlast <= 1'b1; + end + else if(r_retire) + begin + s_rvalid <= 1'b0; + end + +always@(posedge aclk) + if(~aresetn) s_bvalid <= 1'b0; + else if(w_enter) s_bvalid <= 1'b1; + else if(b_retire) s_bvalid <= 1'b0; + +assign s_rid = buf_id; +assign s_bid = buf_id; +assign s_bresp = 2'b0; +assign s_rresp = 2'b0; + + +//-------------------------------{touch_btn}begin----------------------------// +assign touch_btn_data = touch_btn; + + // genvar i; + // generate for(i=0;i<4;i=i+1) begin: generate_btn_debounce + // key_debounce u_key_debounce( + // .sys_clk(aclk), + // .key(touch_btn[i]), + // .key_out(touch_btn_data[i]) + // ); + // end + // endgenerate + + + + + +//--------------------------------{touch_btn}end-----------------------------// + +//-------------------------------{timer}begin----------------------------// + +wire write_timer_cmp = w_enter & (buf_addr[15:0]==`TIMER_ADDR+16'h4); +wire write_timer_en = w_enter & (buf_addr[15:0]==`TIMER_ADDR+16'h8); + +always @(posedge aclk) begin + if(!aresetn) begin + sys_timer_cmp <= 32'h0; + end + else if (write_timer_cmp) begin + sys_timer_cmp <= s_wdata; + end +end + +always @(posedge aclk) begin + if(!aresetn) begin + sys_timer_en <= 1'b0; + end + else if (write_timer_en) begin + sys_timer_en <= s_wdata[0]; + end +end + +always @(posedge aclk or negedge aresetn) begin + if (!aresetn) begin + sys_timer <= 32'h0; + timer_int <= 1'b0; + end + else if (sys_timer_en) begin + if (sys_timer >= sys_timer_cmp - 1) begin + sys_timer <= 32'h0; + timer_int <= 1'b1; + end else begin + sys_timer <= sys_timer + 1'b1; + end + end + else begin + sys_timer <= 32'h0; + timer_int <= 1'b0; + end +end +//--------------------------------{timer}end-----------------------------// + +//--------------------------------{led}begin-----------------------------// +//led display +//led_data[31:0] +wire write_led = w_enter & (buf_addr[15:0]==`LED_ADDR); +assign led = led_data[15:0]; +always @(posedge aclk) +begin + if(!aresetn) + begin + led_data <= 32'h0; + end + else if(write_led) + begin + led_data <= s_wdata[31:0]; + end +end +//---------------------------------{led}end------------------------------// + +//-------------------------------{switch}begin---------------------------// +//switch data +//switch_data[31:0] +assign switch_data = switch; +//--------------------------------{switch}end----------------------------// + + +//---------------------------{digital number}begin-----------------------// +wire write_digital_ctrl = w_enter & (buf_addr[15:0]==`DIGITAL_ADDR + 16'h0); +wire write_digital_data = w_enter & (buf_addr[15:0]==`DIGITAL_ADDR + 16'h4); + +always @(posedge aclk) begin + if(!aresetn) begin + digital_ctrl <= 32'd0; + end + else if (write_digital_ctrl) begin + digital_ctrl <= s_wdata; + end +end + +always @(posedge aclk) begin + if(!aresetn) begin + digital_data <= 32'd0; + end + else if (write_digital_data) begin + digital_data <= s_wdata; + end +end + +wire [31:0] digital_data_in = digital_data; +digitaltube_controller u_digitaltube_controller ( + .control_reg ( digital_ctrl ), + .clk ( aclk ), + .rst_n ( aresetn ), + + .dpy0 ( dpy0 ), + .dpy1 ( dpy1 ), + + .data_reg ( digital_data_in ) +); + +//----------------------------{digital number}end------------------------// + +//--------------------------{simulation flag}begin-----------------------// +always @(posedge aclk) +begin + if(!aresetn) begin + simu_flag <= {32{SIMULATION}}; + end + else begin + simu_flag <= {32{SIMULATION}}; + end +end +//---------------------------{simulation flag}end------------------------// + +//-------------------------------{int_ctrl}begin----------------------------// +//add your code +wire [31:0] int_in; +wire [31:0] int_out; + +wire write_int_en = w_enter & (buf_addr[15:0] == (`CONFREG_INT_ADDR + 16'h0)); +wire write_int_edge = w_enter & (buf_addr[15:0] == (`CONFREG_INT_ADDR + 16'h4)); +wire write_int_pol = w_enter & (buf_addr[15:0] == (`CONFREG_INT_ADDR + 16'h8)); +wire write_int_clr = w_enter & (buf_addr[15:0] == (`CONFREG_INT_ADDR + 16'hc)); +wire write_int_set = w_enter & (buf_addr[15:0] == (`CONFREG_INT_ADDR + 16'h10)); + +always @(posedge aclk) begin + if (!aresetn) begin + confreg_int_en <= 32'h0; + confreg_int_edge <= 32'h0; + confreg_int_pol <= 32'h0; + end else begin + if (write_int_en) confreg_int_en <= s_wdata; + if (write_int_edge) confreg_int_edge <= s_wdata; + if (write_int_pol) confreg_int_pol <= s_wdata; + end +end + +always @(posedge aclk) begin + if (!aresetn) begin + confreg_int_clr <= 32'h0; + confreg_int_set <= 32'h0; + end else begin + confreg_int_clr <= write_int_clr ? s_wdata : 32'h0; + confreg_int_set <= write_int_set ? s_wdata : 32'h0; + end +end + +assign int_in = {24'b0, dma_finish, fft_finish, uart0_int, timer_int, touch_btn_data}; + +int_ctrl u_int_ctrl ( + .clk (aclk), + .resetn (aresetn), + .int_en (confreg_int_en), + .int_edge (confreg_int_edge), + .int_pol (confreg_int_pol), + .int_in (int_in), + .int_clr (confreg_int_clr), + .int_set (confreg_int_set), + .int_out (int_out) +); + +assign confreg_int_state = int_out; + +// int_out 进行或操作,再经过延迟打拍处理 +reg int_out_or_q1; +reg int_out_or_q2; + +always @(posedge aclk) begin + if (!aresetn) begin + int_out_or_q1 <= 1'b0; + int_out_or_q2 <= 1'b0; + end else begin + int_out_or_q1 <= |int_out; + int_out_or_q2 <= int_out_or_q1; + end +end + +assign confreg_int = int_out_or_q2; + +//--------------------------------{int_ctrl}end-----------------------------// + +endmodule diff --git a/rtl/ip/confreg/digitaltube_controller.v b/rtl/ip/confreg/digitaltube_controller.v new file mode 100644 index 0000000..0cb1df3 --- /dev/null +++ b/rtl/ip/confreg/digitaltube_controller.v @@ -0,0 +1,101 @@ +module digitaltube_controller( + // ÊäÈëÅäÖüĴæÆ÷ ĬÈÏ 32 λ + // [1:0] ¿ØÖÆÓұߵÄÊýÂë¹Ü £º00£ºÃð 01£º½öÏÔʾÊý×Ö 10£ºÏÔʾÊý×ֺÍСÊýµã + // [3:2] ¿ØÖÆ×ó±ßÊýÂë¹Ü + input wire [31:0] control_reg, + + // Êý¾ݼĴæÆ÷ [15:0] + // 0x0000_000X [3:0] ¶ÔӦµÚһ¸öµƵÄÏÔʾ + // 0x0000_00X0 [7:4] ¶ÔӦµڶþ¸öµƵÄÏÔʾ + inout wire [31:0] data_reg, + + input wire clk, + input wire rst_n, + + output wire [7:0] dpy0, // dpy0 + output wire [7:0] dpy1 // dpy1 +); + + // Äڲ¿¼ĴæÆ÷¶¨Òå + reg [7:0] dpy0_reg; + reg [7:0] dpy1_reg; + + assign dpy0 = dpy0_reg; + assign dpy1 = dpy1_reg; + + reg [3:0] dpy0_data; // dpy0 ÏÔʾÄÚÈݣ¨4 룬0-F£© + reg [3:0] dpy1_data; // dpy1 ÏÔʾÄÚÈݣ¨4 룬0-F£© + + // ÊýÂë¹ܶÎÂë´洢 + reg [6:0] seg_code [0:15]; // ´洢 0-F µıàÂë + + // ³õʼ»¯ÊýÂë¹ܶÎÂë + always @(posedge clk or negedge rst_n) begin + if(!rst_n) begin + seg_code[0] <= 7'b1000000; // 0 + seg_code[1] <= 7'b1110110; // 1 + seg_code[2] <= 7'b0100001; // 2 + seg_code[3] <= 7'b0100100; // 3 + seg_code[4] <= 7'b0010110; // 4 + seg_code[5] <= 7'b0001100; // 5 + seg_code[6] <= 7'b0001000; // 6 + seg_code[7] <= 7'b1100110; // 7 + seg_code[8] <= 7'b0000000; // 8 + seg_code[9] <= 7'b0000110; // 9 + seg_code[10] <= 7'b0000010; // A + seg_code[11] <= 7'b0011000; // B + seg_code[12] <= 7'b1001001; // C + seg_code[13] <= 7'b0110000; // D + seg_code[14] <= 7'b0001001; // E + seg_code[15] <= 7'b0001011; // F + end + end + + + always @(posedge clk or negedge rst_n) begin + if (!rst_n) begin + dpy0_reg <= 8'b0000_0000; + end + else begin + // ½âÎöÊý¾ݼĴæÆ÷ÖеÄÏÔʾÄÚÈÝ + dpy0_data <= data_reg[3:0]; // dpy0 ÏÔʾµÄÄÚÈÝ + + // ¸ù¾Ý control_reg ¿ØÖÆÏÔʾ + case (control_reg[1:0]) + 2'b01: begin + dpy0_reg <= {~seg_code[dpy0_data], 1'b0}; // ÏÔʾ dpy0 + end + 2'b10: begin + dpy0_reg <= {~seg_code[dpy0_data], 1'b1}; // ÏÔʾ dpy0ºÍСÊýµã + end + default: begin + dpy0_reg <= 8'b0000_0000; + end + endcase + end + end + + always @(posedge clk or negedge rst_n) begin + if (!rst_n) begin + dpy1_reg <= 8'b0000_0000; + end + else begin + // ½âÎöÊý¾ݼĴæÆ÷ÖеÄÏÔʾÄÚÈÝ + dpy1_data <= data_reg[7:4]; // dpy0 ÏÔʾµÄÄÚÈÝ + + // ¸ù¾Ý control_reg ¿ØÖÆÏÔʾ + case (control_reg[3:2]) + 2'b01: begin + dpy1_reg <= {~seg_code[dpy1_data], 1'b0}; // ÏÔʾ dpy0 + end + 2'b10: begin + dpy1_reg <= {~seg_code[dpy1_data], 1'b1}; // ÏÔʾ dpy0ºÍСÊýµã + end + default: begin + dpy1_reg <= 8'b0000_0000; + end + endcase + end + end + +endmodule diff --git a/rtl/ip/confreg/int_ctrl.v b/rtl/ip/confreg/int_ctrl.v new file mode 100644 index 0000000..6f12fb9 --- /dev/null +++ b/rtl/ip/confreg/int_ctrl.v @@ -0,0 +1,61 @@ +module int_ctrl ( + input wire clk, + input wire resetn, + input wire [31:0] int_en, + input wire [31:0] int_edge, + input wire [31:0] int_pol, + input wire [31:0] int_in, + input wire [31:0] int_clr, + input wire [31:0] int_set, + output wire [31:0] int_out +); + + // 同步异步输入信号,防止亚稳态 + reg [31:0] int_in_sync_d1; + reg [31:0] int_in_sync_d2; + reg [31:0] int_in_sync_d3; // 用于边沿检测 + + always @(posedge clk or negedge resetn) begin + if (!resetn) begin + int_in_sync_d1 <= 32'b0; + int_in_sync_d2 <= 32'b0; + int_in_sync_d3 <= 32'b0; + end else begin + int_in_sync_d1 <= int_in; + int_in_sync_d2 <= int_in_sync_d1; + int_in_sync_d3 <= int_in_sync_d2; + end + end + + // 生成同步后的边沿信号 + wire [31:0] rising_edge = int_in_sync_d2 & ~int_in_sync_d3; + wire [31:0] falling_edge = ~int_in_sync_d2 & int_in_sync_d3; + + // 边沿触发状态寄存器 + reg [31:0] edge_int_state; + integer i; + always @(posedge clk or negedge resetn) begin + if (!resetn) begin + edge_int_state <= 32'b0; + end else begin + for (i = 0; i < 32; i = i + 1) begin + // 硬件检测优先级通常建议高于软件清除,防止丢失极窄脉冲 + if (int_edge[i]) begin + if ((int_pol[i] && rising_edge[i]) || (!int_pol[i] && falling_edge[i])) + edge_int_state[i] <= 1'b1; + else if (int_set[i]) + edge_int_state[i] <= 1'b1; + else if (int_clr[i]) + edge_int_state[i] <= 1'b0; + end + end + end + end + + // 电平触发逻辑 + wire [31:0] level_int_state = int_in_sync_d2 ^ ~int_pol; + + // 最终输出 + assign int_out = int_en & ((int_edge & edge_int_state) | (~int_edge & level_int_state)); + +endmodule \ No newline at end of file diff --git a/rtl/ip/confreg/key_debounce.v b/rtl/ip/confreg/key_debounce.v new file mode 100644 index 0000000..fbb2ae9 --- /dev/null +++ b/rtl/ip/confreg/key_debounce.v @@ -0,0 +1,40 @@ +module key_debounce( + input sys_clk, //外部时钟20M + + input key, //外部按键输入 + + output wire key_out //按键消抖后的数据 +); + + //reg define + reg [31:0] delay_cnt; //延时计数 + reg key_reg; + reg key_value = 1'b1; + +//***************************************************** +//** main code +//***************************************************** + always @(posedge sys_clk ) begin + key_reg <= key; + if(key_reg != key) //一旦检测到按键状态发生变化(有按键被按下或释放) + delay_cnt <= 32'd400000; //给延时计数器重新装载初始值(计数时间为 20ms) + else if(key_reg == key) begin //在按键状态稳定时,计数器递减,开始 20ms 倒计时 + if(delay_cnt > 32'd0) + delay_cnt <= delay_cnt - 1'b1; + else + delay_cnt <= delay_cnt; + end + end + + always @(posedge sys_clk ) begin + if(delay_cnt == 32'd1) begin //当计数器递减到 1 时,说明按键稳定状态维持了 20ms + key_value <= key; //并寄存此时按键的值 + end + else begin + key_value <= key_out; + end + end + + assign key_out = key & key_value ; + +endmodule \ No newline at end of file diff --git a/rtl/ip/fft/Butterfly.v b/rtl/ip/fft/Butterfly.v new file mode 100644 index 0000000..61df798 --- /dev/null +++ b/rtl/ip/fft/Butterfly.v @@ -0,0 +1,32 @@ +//---------------------------------------------------------------------- +// Butterfly: Add/Sub and Scaling +//---------------------------------------------------------------------- +module Butterfly #( + parameter WIDTH = 16, + parameter RH = 0 // Round Half Up +)( + input signed [WIDTH-1:0] x0_re, // Input Data #0 (Real) + input signed [WIDTH-1:0] x0_im, // Input Data #0 (Imag) + input signed [WIDTH-1:0] x1_re, // Input Data #1 (Real) + input signed [WIDTH-1:0] x1_im, // Input Data #1 (Imag) + output signed [WIDTH-1:0] y0_re, // Output Data #0 (Real) + output signed [WIDTH-1:0] y0_im, // Output Data #0 (Imag) + output signed [WIDTH-1:0] y1_re, // Output Data #1 (Real) + output signed [WIDTH-1:0] y1_im // Output Data #1 (Imag) +); + +wire signed [WIDTH:0] add_re, add_im, sub_re, sub_im; + +// Add/Sub +assign add_re = x0_re + x1_re; +assign add_im = x0_im + x1_im; +assign sub_re = x0_re - x1_re; +assign sub_im = x0_im - x1_im; + +// Scaling +assign y0_re = (add_re + RH) >>> 1; +assign y0_im = (add_im + RH) >>> 1; +assign y1_re = (sub_re + RH) >>> 1; +assign y1_im = (sub_im + RH) >>> 1; + +endmodule diff --git a/rtl/ip/fft/DelayBuffer.v b/rtl/ip/fft/DelayBuffer.v new file mode 100644 index 0000000..19bff72 --- /dev/null +++ b/rtl/ip/fft/DelayBuffer.v @@ -0,0 +1,32 @@ +//---------------------------------------------------------------------- +// DelayBuffer: Generate Constant Delay +//---------------------------------------------------------------------- +module DelayBuffer #( + parameter DEPTH = 32, + parameter WIDTH = 16 +)( + input clock, // Master Clock + input [WIDTH-1:0] di_re, // Data Input (Real) + input [WIDTH-1:0] di_im, // Data Input (Imag) + output [WIDTH-1:0] do_re, // Data Output (Real) + output [WIDTH-1:0] do_im // Data Output (Imag) +); + +reg [WIDTH-1:0] buf_re[0:DEPTH-1]; +reg [WIDTH-1:0] buf_im[0:DEPTH-1]; +integer n; + +// Shift Buffer +always @(posedge clock) begin + for (n = DEPTH-1; n > 0; n = n - 1) begin + buf_re[n] <= buf_re[n-1]; + buf_im[n] <= buf_im[n-1]; + end + buf_re[0] <= di_re; + buf_im[0] <= di_im; +end + +assign do_re = buf_re[DEPTH-1]; +assign do_im = buf_im[DEPTH-1]; + +endmodule diff --git a/rtl/ip/fft/FFT1024_32B.v b/rtl/ip/fft/FFT1024_32B.v new file mode 100644 index 0000000..2875ebc --- /dev/null +++ b/rtl/ip/fft/FFT1024_32B.v @@ -0,0 +1,89 @@ +//---------------------------------------------------------------------- +// FFT: 1024-Point FFT Using Radix-2^2 Single-Path Delay Feedback +//---------------------------------------------------------------------- +module FFT #( + parameter WIDTH = 32 +)( + input clock, // Master Clock + input reset, // Active High Asynchronous Reset + input di_en, // Input Data Enable + input [WIDTH-1:0] di_re, // Input Data (Real) + input [WIDTH-1:0] di_im, // Input Data (Imag) + output do_en, // Output Data Enable + output [WIDTH-1:0] do_re, // Output Data (Real) + output [WIDTH-1:0] do_im // Output Data (Imag) +); +//---------------------------------------------------------------------- +// Data must be input consecutively in natural order. +// The result is scaled to 1/N and output in bit-reversed order. +//---------------------------------------------------------------------- + +wire su1_do_en; +wire[WIDTH-1:0] su1_do_re; +wire[WIDTH-1:0] su1_do_im; +wire su2_do_en; +wire[WIDTH-1:0] su2_do_re; +wire[WIDTH-1:0] su2_do_im; +wire su3_do_en; +wire[WIDTH-1:0] su3_do_re; +wire[WIDTH-1:0] su3_do_im; +wire su4_do_en; +wire[WIDTH-1:0] su4_do_re; +wire[WIDTH-1:0] su4_do_im; + +SdfUnit #(.N(1024),.M(1024),.WIDTH(WIDTH)) SU1 ( + .clock (clock ), // i + .reset (reset ), // i + .di_en (di_en ), // i + .di_re (di_re ), // i + .di_im (di_im ), // i + .do_en (su1_do_en ), // o + .do_re (su1_do_re ), // o + .do_im (su1_do_im ) // o +); + +SdfUnit #(.N(1024),.M(256),.WIDTH(WIDTH)) SU2 ( + .clock (clock ), // i + .reset (reset ), // i + .di_en (su1_do_en ), // i + .di_re (su1_do_re ), // i + .di_im (su1_do_im ), // i + .do_en (su2_do_en ), // o + .do_re (su2_do_re ), // o + .do_im (su2_do_im ) // o +); + +SdfUnit #(.N(1024),.M(64),.WIDTH(WIDTH)) SU3 ( + .clock (clock ), // i + .reset (reset ), // i + .di_en (su2_do_en ), // i + .di_re (su2_do_re ), // i + .di_im (su2_do_im ), // i + .do_en (su3_do_en ), // o + .do_re (su3_do_re ), // o + .do_im (su3_do_im ) // o +); + +SdfUnit #(.N(1024),.M(16),.WIDTH(WIDTH)) SU4 ( + .clock (clock ), // i + .reset (reset ), // i + .di_en (su3_do_en ), // i + .di_re (su3_do_re ), // i + .di_im (su3_do_im ), // i + .do_en (su4_do_en ), // o + .do_re (su4_do_re ), // o + .do_im (su4_do_im ) // o +); + +SdfUnit #(.N(1024),.M(4),.WIDTH(WIDTH)) SU5 ( + .clock (clock ), // i + .reset (reset ), // i + .di_en (su4_do_en ), // i + .di_re (su4_do_re ), // i + .di_im (su4_do_im ), // i + .do_en (do_en ), // o + .do_re (do_re ), // o + .do_im (do_im ) // o +); + +endmodule diff --git a/rtl/ip/fft/Multiply.v b/rtl/ip/fft/Multiply.v new file mode 100644 index 0000000..6172571 --- /dev/null +++ b/rtl/ip/fft/Multiply.v @@ -0,0 +1,35 @@ +//---------------------------------------------------------------------- +// Multiply: Complex Multiplier +//---------------------------------------------------------------------- +module Multiply #( + parameter WIDTH = 16 +)( + input signed [WIDTH-1:0] a_re, + input signed [WIDTH-1:0] a_im, + input signed [WIDTH-1:0] b_re, + input signed [WIDTH-1:0] b_im, + output signed [WIDTH-1:0] m_re, + output signed [WIDTH-1:0] m_im +); + +wire signed [WIDTH*2-1:0] arbr, arbi, aibr, aibi; +wire signed [WIDTH-1:0] sc_arbr, sc_arbi, sc_aibr, sc_aibi; + +// Signed Multiplication +assign arbr = a_re * b_re; +assign arbi = a_re * b_im; +assign aibr = a_im * b_re; +assign aibi = a_im * b_im; + +// Scaling +assign sc_arbr = arbr >>> (WIDTH-1); +assign sc_arbi = arbi >>> (WIDTH-1); +assign sc_aibr = aibr >>> (WIDTH-1); +assign sc_aibi = aibi >>> (WIDTH-1); + +// Sub/Add +// These sub/add may overflow if unnormalized data is input. +assign m_re = sc_arbr - sc_aibi; +assign m_im = sc_arbi + sc_aibr; + +endmodule diff --git a/rtl/ip/fft/SdfUnit.v b/rtl/ip/fft/SdfUnit.v new file mode 100644 index 0000000..67edc49 --- /dev/null +++ b/rtl/ip/fft/SdfUnit.v @@ -0,0 +1,277 @@ +//---------------------------------------------------------------------- +// SdfUnit: Radix-2^2 Single-Path Delay Feedback Unit for N-Point FFT +//---------------------------------------------------------------------- +module SdfUnit #( + parameter N = 64, // Number of FFT Point + parameter M = 64, // Twiddle Resolution + parameter WIDTH = 16 // Data Bit Length +)( + input clock, // Master Clock + input reset, // Active High Asynchronous Reset + input di_en, // Input Data Enable + input [WIDTH-1:0] di_re, // Input Data (Real) + input [WIDTH-1:0] di_im, // Input Data (Imag) + output do_en, // Output Data Enable + output [WIDTH-1:0] do_re, // Output Data (Real) + output [WIDTH-1:0] do_im // Output Data (Imag) +); + +// log2 constant function +function integer log2; + input integer x; + integer value; + begin + value = x-1; + for (log2=0; value>0; log2=log2+1) + value = value>>1; + end +endfunction + +localparam LOG_N = log2(N); // Bit Length of N +localparam LOG_M = log2(M); // Bit Length of M + +//---------------------------------------------------------------------- +// Internal Regs and Nets +//---------------------------------------------------------------------- +// 1st Butterfly +reg [LOG_N-1:0] di_count; // Input Data Count +wire bf1_bf; // Butterfly Add/Sub Enable +wire[WIDTH-1:0] bf1_x0_re; // Data #0 to Butterfly (Real) +wire[WIDTH-1:0] bf1_x0_im; // Data #0 to Butterfly (Imag) +wire[WIDTH-1:0] bf1_x1_re; // Data #1 to Butterfly (Real) +wire[WIDTH-1:0] bf1_x1_im; // Data #1 to Butterfly (Imag) +wire[WIDTH-1:0] bf1_y0_re; // Data #0 from Butterfly (Real) +wire[WIDTH-1:0] bf1_y0_im; // Data #0 from Butterfly (Imag) +wire[WIDTH-1:0] bf1_y1_re; // Data #1 from Butterfly (Real) +wire[WIDTH-1:0] bf1_y1_im; // Data #1 from Butterfly (Imag) +wire[WIDTH-1:0] db1_di_re; // Data to DelayBuffer (Real) +wire[WIDTH-1:0] db1_di_im; // Data to DelayBuffer (Imag) +wire[WIDTH-1:0] db1_do_re; // Data from DelayBuffer (Real) +wire[WIDTH-1:0] db1_do_im; // Data from DelayBuffer (Imag) +wire[WIDTH-1:0] bf1_sp_re; // Single-Path Data Output (Real) +wire[WIDTH-1:0] bf1_sp_im; // Single-Path Data Output (Imag) +reg bf1_sp_en; // Single-Path Data Enable +reg [LOG_N-1:0] bf1_count; // Single-Path Data Count +wire bf1_start; // Single-Path Output Trigger +wire bf1_end; // End of Single-Path Data +wire bf1_mj; // Twiddle (-j) Enable +reg [WIDTH-1:0] bf1_do_re; // 1st Butterfly Output Data (Real) +reg [WIDTH-1:0] bf1_do_im; // 1st Butterfly Output Data (Imag) + +// 2nd Butterfly +reg bf2_bf; // Butterfly Add/Sub Enable +wire[WIDTH-1:0] bf2_x0_re; // Data #0 to Butterfly (Real) +wire[WIDTH-1:0] bf2_x0_im; // Data #0 to Butterfly (Imag) +wire[WIDTH-1:0] bf2_x1_re; // Data #1 to Butterfly (Real) +wire[WIDTH-1:0] bf2_x1_im; // Data #1 to Butterfly (Imag) +wire[WIDTH-1:0] bf2_y0_re; // Data #0 from Butterfly (Real) +wire[WIDTH-1:0] bf2_y0_im; // Data #0 from Butterfly (Imag) +wire[WIDTH-1:0] bf2_y1_re; // Data #1 from Butterfly (Real) +wire[WIDTH-1:0] bf2_y1_im; // Data #1 from Butterfly (Imag) +wire[WIDTH-1:0] db2_di_re; // Data to DelayBuffer (Real) +wire[WIDTH-1:0] db2_di_im; // Data to DelayBuffer (Imag) +wire[WIDTH-1:0] db2_do_re; // Data from DelayBuffer (Real) +wire[WIDTH-1:0] db2_do_im; // Data from DelayBuffer (Imag) +wire[WIDTH-1:0] bf2_sp_re; // Single-Path Data Output (Real) +wire[WIDTH-1:0] bf2_sp_im; // Single-Path Data Output (Imag) +reg bf2_sp_en; // Single-Path Data Enable +reg [LOG_N-1:0] bf2_count; // Single-Path Data Count +reg bf2_start; // Single-Path Output Trigger +wire bf2_end; // End of Single-Path Data +reg [WIDTH-1:0] bf2_do_re; // 2nd Butterfly Output Data (Real) +reg [WIDTH-1:0] bf2_do_im; // 2nd Butterfly Output Data (Imag) +reg bf2_do_en; // 2nd Butterfly Output Data Enable + +// Multiplication +wire[1:0] tw_sel; // Twiddle Select (2n/n/3n) +wire[LOG_N-3:0] tw_num; // Twiddle Number (n) +wire[LOG_N-1:0] tw_addr; // Twiddle Table Address +wire[WIDTH-1:0] tw_re; // Twiddle Factor (Real) +wire[WIDTH-1:0] tw_im; // Twiddle Factor (Imag) +reg mu_en; // Multiplication Enable +wire[WIDTH-1:0] mu_a_re; // Multiplier Input (Real) +wire[WIDTH-1:0] mu_a_im; // Multiplier Input (Imag) +wire[WIDTH-1:0] mu_m_re; // Multiplier Output (Real) +wire[WIDTH-1:0] mu_m_im; // Multiplier Output (Imag) +reg [WIDTH-1:0] mu_do_re; // Multiplication Output Data (Real) +reg [WIDTH-1:0] mu_do_im; // Multiplication Output Data (Imag) +reg mu_do_en; // Multiplication Output Data Enable + +//---------------------------------------------------------------------- +// 1st Butterfly +//---------------------------------------------------------------------- +always @(posedge clock or posedge reset) begin + if (reset) begin + di_count <= {LOG_N{1'b0}}; + end else begin + di_count <= di_en ? (di_count + 1'b1) : {LOG_N{1'b0}}; + end +end +assign bf1_bf = di_count[LOG_M-1]; + +// Set unknown value x for verification +assign bf1_x0_re = bf1_bf ? db1_do_re : {WIDTH{1'bx}}; +assign bf1_x0_im = bf1_bf ? db1_do_im : {WIDTH{1'bx}}; +assign bf1_x1_re = bf1_bf ? di_re : {WIDTH{1'bx}}; +assign bf1_x1_im = bf1_bf ? di_im : {WIDTH{1'bx}}; + +Butterfly #(.WIDTH(WIDTH),.RH(0)) BF1 ( + .x0_re (bf1_x0_re ), // i + .x0_im (bf1_x0_im ), // i + .x1_re (bf1_x1_re ), // i + .x1_im (bf1_x1_im ), // i + .y0_re (bf1_y0_re ), // o + .y0_im (bf1_y0_im ), // o + .y1_re (bf1_y1_re ), // o + .y1_im (bf1_y1_im ) // o +); + +DelayBuffer #(.DEPTH(2**(LOG_M-1)),.WIDTH(WIDTH)) DB1 ( + .clock (clock ), // i + .di_re (db1_di_re ), // i + .di_im (db1_di_im ), // i + .do_re (db1_do_re ), // o + .do_im (db1_do_im ) // o +); + +assign db1_di_re = bf1_bf ? bf1_y1_re : di_re; +assign db1_di_im = bf1_bf ? bf1_y1_im : di_im; +assign bf1_sp_re = bf1_bf ? bf1_y0_re : bf1_mj ? db1_do_im : db1_do_re; +assign bf1_sp_im = bf1_bf ? bf1_y0_im : bf1_mj ? -db1_do_re : db1_do_im; + +always @(posedge clock or posedge reset) begin + if (reset) begin + bf1_sp_en <= 1'b0; + bf1_count <= {LOG_N{1'b0}}; + end else begin + bf1_sp_en <= bf1_start ? 1'b1 : bf1_end ? 1'b0 : bf1_sp_en; + bf1_count <= bf1_sp_en ? (bf1_count + 1'b1) : {LOG_N{1'b0}}; + end +end +assign bf1_start = (di_count == (2**(LOG_M-1)-1)); +assign bf1_end = (bf1_count == (2**LOG_N-1)); +assign bf1_mj = (bf1_count[LOG_M-1:LOG_M-2] == 2'd3); + +always @(posedge clock) begin + bf1_do_re <= bf1_sp_re; + bf1_do_im <= bf1_sp_im; +end + +//---------------------------------------------------------------------- +// 2nd Butterfly +//---------------------------------------------------------------------- +always @(posedge clock) begin + bf2_bf <= bf1_count[LOG_M-2]; +end + +// Set unknown value x for verification +assign bf2_x0_re = bf2_bf ? db2_do_re : {WIDTH{1'bx}}; +assign bf2_x0_im = bf2_bf ? db2_do_im : {WIDTH{1'bx}}; +assign bf2_x1_re = bf2_bf ? bf1_do_re : {WIDTH{1'bx}}; +assign bf2_x1_im = bf2_bf ? bf1_do_im : {WIDTH{1'bx}}; + +// Negative bias occurs when RH=0 and positive bias occurs when RH=1. +// Using both alternately reduces the overall rounding error. +Butterfly #(.WIDTH(WIDTH),.RH(1)) BF2 ( + .x0_re (bf2_x0_re ), // i + .x0_im (bf2_x0_im ), // i + .x1_re (bf2_x1_re ), // i + .x1_im (bf2_x1_im ), // i + .y0_re (bf2_y0_re ), // o + .y0_im (bf2_y0_im ), // o + .y1_re (bf2_y1_re ), // o + .y1_im (bf2_y1_im ) // o +); + +DelayBuffer #(.DEPTH(2**(LOG_M-2)),.WIDTH(WIDTH)) DB2 ( + .clock (clock ), // i + .di_re (db2_di_re ), // i + .di_im (db2_di_im ), // i + .do_re (db2_do_re ), // o + .do_im (db2_do_im ) // o +); + +assign db2_di_re = bf2_bf ? bf2_y1_re : bf1_do_re; +assign db2_di_im = bf2_bf ? bf2_y1_im : bf1_do_im; +assign bf2_sp_re = bf2_bf ? bf2_y0_re : db2_do_re; +assign bf2_sp_im = bf2_bf ? bf2_y0_im : db2_do_im; + +always @(posedge clock or posedge reset) begin + if (reset) begin + bf2_sp_en <= 1'b0; + bf2_count <= {LOG_N{1'b0}}; + end else begin + bf2_sp_en <= bf2_start ? 1'b1 : bf2_end ? 1'b0 : bf2_sp_en; + bf2_count <= bf2_sp_en ? (bf2_count + 1'b1) : {LOG_N{1'b0}}; + end +end + +always @(posedge clock) begin + bf2_start <= (bf1_count == (2**(LOG_M-2)-1)) & bf1_sp_en; +end +assign bf2_end = (bf2_count == (2**LOG_N-1)); + +always @(posedge clock) begin + bf2_do_re <= bf2_sp_re; + bf2_do_im <= bf2_sp_im; +end + +always @(posedge clock or posedge reset) begin + if (reset) begin + bf2_do_en <= 1'b0; + end else begin + bf2_do_en <= bf2_sp_en; + end +end + +//---------------------------------------------------------------------- +// Multiplication +//---------------------------------------------------------------------- +assign tw_sel[1] = bf2_count[LOG_M-2]; +assign tw_sel[0] = bf2_count[LOG_M-1]; +assign tw_num = bf2_count << (LOG_N-LOG_M); +assign tw_addr = tw_num * tw_sel; + +Twiddle TW ( + .clock (clock ), // i + .addr (tw_addr), // i + .tw_re (tw_re ), // o + .tw_im (tw_im ) // o +); + +// Multiplication is bypassed when twiddle address is 0. +always @(posedge clock) begin + mu_en <= (tw_addr != {LOG_N{1'b0}}); +end +// Set unknown value x for verification +assign mu_a_re = mu_en ? bf2_do_re : {WIDTH{1'bx}}; +assign mu_a_im = mu_en ? bf2_do_im : {WIDTH{1'bx}}; + +Multiply #(.WIDTH(WIDTH)) MU ( + .a_re (mu_a_re), // i + .a_im (mu_a_im), // i + .b_re (tw_re ), // i + .b_im (tw_im ), // i + .m_re (mu_m_re), // o + .m_im (mu_m_im) // o +); + +always @(posedge clock) begin + mu_do_re <= mu_en ? mu_m_re : bf2_do_re; + mu_do_im <= mu_en ? mu_m_im : bf2_do_im; +end + +always @(posedge clock or posedge reset) begin + if (reset) begin + mu_do_en <= 1'b0; + end else begin + mu_do_en <= bf2_do_en; + end +end + +// No multiplication required at final stage +assign do_en = (LOG_M == 2) ? bf2_do_en : mu_do_en; +assign do_re = (LOG_M == 2) ? bf2_do_re : mu_do_re; +assign do_im = (LOG_M == 2) ? bf2_do_im : mu_do_im; + +endmodule diff --git a/rtl/ip/fft/Twiddle1024_32B.v b/rtl/ip/fft/Twiddle1024_32B.v new file mode 100644 index 0000000..c6b438d --- /dev/null +++ b/rtl/ip/fft/Twiddle1024_32B.v @@ -0,0 +1,1064 @@ +//---------------------------------------------------------------------- +// Twiddle: 1024-Point Twiddle Table for Radix-2^2 Butterfly +//---------------------------------------------------------------------- +module Twiddle #( + parameter TW_FF = 1 // Use Output Register +)( + input clock, // Master Clock + input [9:0] addr, // Twiddle Factor Number + output [31:0] tw_re, // Twiddle Factor (Real) + output [31:0] tw_im // Twiddle Factor (Imag) +); + +wire[31:0] wn_re[0:1023]; // Twiddle Table (Real) +wire[31:0] wn_im[0:1023]; // Twiddle Table (Imag) +wire[31:0] mx_re; // Multiplexer output (Real) +wire[31:0] mx_im; // Multiplexer output (Imag) +reg [31:0] ff_re; // Register output (Real) +reg [31:0] ff_im; // Register output (Imag) + +assign mx_re = wn_re[addr]; +assign mx_im = wn_im[addr]; + +always @(posedge clock) begin + ff_re <= mx_re; + ff_im <= mx_im; +end + +assign tw_re = TW_FF ? ff_re : mx_re; +assign tw_im = TW_FF ? ff_im : mx_im; + +//---------------------------------------------------------------------- +// Twiddle Factor Value +//---------------------------------------------------------------------- +// Multiplication is bypassed when twiddle address is 0. +// Setting wn_re[0] = 0 and wn_im[0] = 0 makes it easier to check the waveform. +// It may also reduce power consumption slightly. +// +// wn_re = cos(-2pi*n/1024) wn_im = sin(-2pi*n/1024) +assign wn_re[ 0] = 32'h00000000; assign wn_im[ 0] = 32'h00000000; // 0 1.000 -0.000 +assign wn_re[ 1] = 32'h7FFF6216; assign wn_im[ 1] = 32'hFF36F078; // 1 1.000 -0.006 +assign wn_re[ 2] = 32'h7FFD885A; assign wn_im[ 2] = 32'hFE6DE2E0; // 2 1.000 -0.012 +assign wn_re[ 3] = 32'h7FFA72D1; assign wn_im[ 3] = 32'hFDA4D929; // 3 1.000 -0.018 +assign wn_re[ 4] = 32'h7FF62182; assign wn_im[ 4] = 32'hFCDBD541; // 4 1.000 -0.025 +assign wn_re[ 5] = 32'h7FF09478; assign wn_im[ 5] = 32'hFC12D91A; // 5 1.000 -0.031 +assign wn_re[ 6] = 32'h7FE9CBC0; assign wn_im[ 6] = 32'hFB49E6A3; // 6 0.999 -0.037 +assign wn_re[ 7] = 32'h7FE1C76B; assign wn_im[ 7] = 32'hFA80FFCB; // 7 0.999 -0.043 +assign wn_re[ 8] = 32'h7FD8878E; assign wn_im[ 8] = 32'hF9B82684; // 8 0.999 -0.049 +assign wn_re[ 9] = 32'h7FCE0C3E; assign wn_im[ 9] = 32'hF8EF5CBB; // 9 0.998 -0.055 +assign wn_re[10] = 32'h7FC25596; assign wn_im[10] = 32'hF826A462; // 10 0.998 -0.061 +assign wn_re[11] = 32'h7FB563B3; assign wn_im[11] = 32'hF75DFF66; // 11 0.998 -0.067 +assign wn_re[12] = 32'h7FA736B4; assign wn_im[12] = 32'hF6956FB7; // 12 0.997 -0.074 +assign wn_re[13] = 32'h7F97CEBD; assign wn_im[13] = 32'hF5CCF743; // 13 0.997 -0.080 +assign wn_re[14] = 32'h7F872BF3; assign wn_im[14] = 32'hF50497FB; // 14 0.996 -0.086 +assign wn_re[15] = 32'h7F754E80; assign wn_im[15] = 32'hF43C53CB; // 15 0.996 -0.092 +assign wn_re[16] = 32'h7F62368F; assign wn_im[16] = 32'hF3742CA2; // 16 0.995 -0.098 +assign wn_re[17] = 32'h7F4DE451; assign wn_im[17] = 32'hF2AC246E; // 17 0.995 -0.104 +assign wn_re[18] = 32'h7F3857F6; assign wn_im[18] = 32'hF1E43D1C; // 18 0.994 -0.110 +assign wn_re[19] = 32'h7F2191B4; assign wn_im[19] = 32'hF11C789A; // 19 0.993 -0.116 +assign wn_re[20] = 32'h7F0991C4; assign wn_im[20] = 32'hF054D8D5; // 20 0.992 -0.122 +assign wn_re[21] = 32'h7EF05860; assign wn_im[21] = 32'hEF8D5FB8; // 21 0.992 -0.128 +assign wn_re[22] = 32'h7ED5E5C6; assign wn_im[22] = 32'hEEC60F31; // 22 0.991 -0.135 +assign wn_re[23] = 32'h7EBA3A39; assign wn_im[23] = 32'hEDFEE92B; // 23 0.990 -0.141 +assign wn_re[24] = 32'h7E9D55FC; assign wn_im[24] = 32'hED37EF91; // 24 0.989 -0.147 +assign wn_re[25] = 32'h7E7F3957; assign wn_im[25] = 32'hEC71244F; // 25 0.988 -0.153 +assign wn_re[26] = 32'h7E5FE493; assign wn_im[26] = 32'hEBAA894F; // 26 0.987 -0.159 +assign wn_re[27] = 32'h7E3F57FF; assign wn_im[27] = 32'hEAE4207A; // 27 0.986 -0.165 +assign wn_re[28] = 32'h7E1D93EA; assign wn_im[28] = 32'hEA1DEBBB; // 28 0.985 -0.171 +assign wn_re[29] = 32'h7DFA98A8; assign wn_im[29] = 32'hE957ECFB; // 29 0.984 -0.177 +assign wn_re[30] = 32'h7DD6668F; assign wn_im[30] = 32'hE8922622; // 30 0.983 -0.183 +assign wn_re[31] = 32'h7DB0FDF8; assign wn_im[31] = 32'hE7CC9917; // 31 0.982 -0.189 +assign wn_re[32] = 32'h7D8A5F40; assign wn_im[32] = 32'hE70747C4; // 32 0.981 -0.195 +assign wn_re[33] = 32'h7D628AC6; assign wn_im[33] = 32'hE642340D; // 33 0.980 -0.201 +assign wn_re[34] = 32'h7D3980EC; assign wn_im[34] = 32'hE57D5FDA; // 34 0.978 -0.207 +assign wn_re[35] = 32'h7D0F4218; assign wn_im[35] = 32'hE4B8CD11; // 35 0.977 -0.213 +assign wn_re[36] = 32'h7CE3CEB2; assign wn_im[36] = 32'hE3F47D96; // 36 0.976 -0.219 +assign wn_re[37] = 32'h7CB72724; assign wn_im[37] = 32'hE330734D; // 37 0.974 -0.225 +assign wn_re[38] = 32'h7C894BDE; assign wn_im[38] = 32'hE26CB01B; // 38 0.973 -0.231 +assign wn_re[39] = 32'h7C5A3D50; assign wn_im[39] = 32'hE1A935E2; // 39 0.972 -0.237 +assign wn_re[40] = 32'h7C29FBEE; assign wn_im[40] = 32'hE0E60685; // 40 0.970 -0.243 +assign wn_re[41] = 32'h7BF88830; assign wn_im[41] = 32'hE02323E5; // 41 0.969 -0.249 +assign wn_re[42] = 32'h7BC5E290; assign wn_im[42] = 32'hDF608FE4; // 42 0.967 -0.255 +assign wn_re[43] = 32'h7B920B89; assign wn_im[43] = 32'hDE9E4C60; // 43 0.965 -0.261 +assign wn_re[44] = 32'h7B5D039E; assign wn_im[44] = 32'hDDDC5B3B; // 44 0.964 -0.267 +assign wn_re[45] = 32'h7B26CB4F; assign wn_im[45] = 32'hDD1ABE51; // 45 0.962 -0.273 +assign wn_re[46] = 32'h7AEF6323; assign wn_im[46] = 32'hDC597781; // 46 0.960 -0.279 +assign wn_re[47] = 32'h7AB6CBA4; assign wn_im[47] = 32'hDB9888A8; // 47 0.959 -0.284 +assign wn_re[48] = 32'h7A7D055B; assign wn_im[48] = 32'hDAD7F3A2; // 48 0.957 -0.290 +assign wn_re[49] = 32'h7A4210D8; assign wn_im[49] = 32'hDA17BA4A; // 49 0.955 -0.296 +assign wn_re[50] = 32'h7A05EEAD; assign wn_im[50] = 32'hD957DE7A; // 50 0.953 -0.302 +assign wn_re[51] = 32'h79C89F6E; assign wn_im[51] = 32'hD898620C; // 51 0.951 -0.308 +assign wn_re[52] = 32'h798A23B1; assign wn_im[52] = 32'hD7D946D8; // 52 0.950 -0.314 +assign wn_re[53] = 32'h794A7C12; assign wn_im[53] = 32'hD71A8EB5; // 53 0.948 -0.320 +assign wn_re[54] = 32'h7909A92D; assign wn_im[54] = 32'hD65C3B7B; // 54 0.946 -0.325 +assign wn_re[55] = 32'h78C7ABA2; assign wn_im[55] = 32'hD59E4EFF; // 55 0.944 -0.331 +assign wn_re[56] = 32'h78848414; assign wn_im[56] = 32'hD4E0CB15; // 56 0.942 -0.337 +assign wn_re[57] = 32'h78403329; assign wn_im[57] = 32'hD423B191; // 57 0.939 -0.343 +assign wn_re[58] = 32'h77FAB989; assign wn_im[58] = 32'hD3670446; // 58 0.937 -0.348 +assign wn_re[59] = 32'h77B417DF; assign wn_im[59] = 32'hD2AAC504; // 59 0.935 -0.354 +assign wn_re[60] = 32'h776C4EDB; assign wn_im[60] = 32'hD1EEF59E; // 60 0.933 -0.360 +assign wn_re[61] = 32'h77235F2D; assign wn_im[61] = 32'hD13397E2; // 61 0.931 -0.366 +assign wn_re[62] = 32'h76D94989; assign wn_im[62] = 32'hD078AD9E; // 62 0.929 -0.371 +assign wn_re[63] = 32'h768E0EA6; assign wn_im[63] = 32'hCFBE389F; // 63 0.926 -0.377 +assign wn_re[64] = 32'h7641AF3D; assign wn_im[64] = 32'hCF043AB3; // 64 0.924 -0.383 +assign wn_re[65] = 32'h75F42C0B; assign wn_im[65] = 32'hCE4AB5A2; // 65 0.922 -0.388 +assign wn_re[66] = 32'h75A585CF; assign wn_im[66] = 32'hCD91AB39; // 66 0.919 -0.394 +assign wn_re[67] = 32'h7555BD4C; assign wn_im[67] = 32'hCCD91D3D; // 67 0.917 -0.400 +assign wn_re[68] = 32'h7504D345; assign wn_im[68] = 32'hCC210D79; // 68 0.914 -0.405 +assign wn_re[69] = 32'h74B2C884; assign wn_im[69] = 32'hCB697DB0; // 69 0.912 -0.411 +assign wn_re[70] = 32'h745F9DD1; assign wn_im[70] = 32'hCAB26FA9; // 70 0.909 -0.416 +assign wn_re[71] = 32'h740B53FB; assign wn_im[71] = 32'hC9FBE527; // 71 0.907 -0.422 +assign wn_re[72] = 32'h73B5EBD1; assign wn_im[72] = 32'hC945DFEC; // 72 0.904 -0.428 +assign wn_re[73] = 32'h735F6626; assign wn_im[73] = 32'hC89061BA; // 73 0.901 -0.433 +assign wn_re[74] = 32'h7307C3D0; assign wn_im[74] = 32'hC7DB6C50; // 74 0.899 -0.439 +assign wn_re[75] = 32'h72AF05A7; assign wn_im[75] = 32'hC727016D; // 75 0.896 -0.444 +assign wn_re[76] = 32'h72552C85; assign wn_im[76] = 32'hC67322CE; // 76 0.893 -0.450 +assign wn_re[77] = 32'h71FA3949; assign wn_im[77] = 32'hC5BFD22E; // 77 0.890 -0.455 +assign wn_re[78] = 32'h719E2CD2; assign wn_im[78] = 32'hC50D1149; // 78 0.888 -0.461 +assign wn_re[79] = 32'h71410805; assign wn_im[79] = 32'hC45AE1D7; // 79 0.885 -0.466 +assign wn_re[80] = 32'h70E2CBC6; assign wn_im[80] = 32'hC3A94590; // 80 0.882 -0.471 +assign wn_re[81] = 32'h708378FF; assign wn_im[81] = 32'hC2F83E2A; // 81 0.879 -0.477 +assign wn_re[82] = 32'h7023109A; assign wn_im[82] = 32'hC247CD5A; // 82 0.876 -0.482 +assign wn_re[83] = 32'h6FC19385; assign wn_im[83] = 32'hC197F4D4; // 83 0.873 -0.488 +assign wn_re[84] = 32'h6F5F02B2; assign wn_im[84] = 32'hC0E8B648; // 84 0.870 -0.493 +assign wn_re[85] = 32'h6EFB5F12; assign wn_im[85] = 32'hC03A1368; // 85 0.867 -0.498 +assign wn_re[86] = 32'h6E96A99D; assign wn_im[86] = 32'hBF8C0DE3; // 86 0.864 -0.504 +assign wn_re[87] = 32'h6E30E34A; assign wn_im[87] = 32'hBEDEA765; // 87 0.861 -0.509 +assign wn_re[88] = 32'h6DCA0D14; assign wn_im[88] = 32'hBE31E19B; // 88 0.858 -0.514 +assign wn_re[89] = 32'h6D6227FA; assign wn_im[89] = 32'hBD85BE30; // 89 0.855 -0.519 +assign wn_re[90] = 32'h6CF934FC; assign wn_im[90] = 32'hBCDA3ECB; // 90 0.851 -0.525 +assign wn_re[91] = 32'h6C8F351C; assign wn_im[91] = 32'hBC2F6513; // 91 0.848 -0.530 +assign wn_re[92] = 32'h6C242960; assign wn_im[92] = 32'hBB8532B0; // 92 0.845 -0.535 +assign wn_re[93] = 32'h6BB812D1; assign wn_im[93] = 32'hBADBA943; // 93 0.842 -0.540 +assign wn_re[94] = 32'h6B4AF279; assign wn_im[94] = 32'hBA32CA71; // 94 0.838 -0.545 +assign wn_re[95] = 32'h6ADCC964; assign wn_im[95] = 32'hB98A97D8; // 95 0.835 -0.550 +assign wn_re[96] = 32'h6A6D98A4; assign wn_im[96] = 32'hB8E31319; // 96 0.831 -0.556 +assign wn_re[97] = 32'h69FD614A; assign wn_im[97] = 32'hB83C3DD1; // 97 0.828 -0.561 +assign wn_re[98] = 32'h698C246C; assign wn_im[98] = 32'hB796199B; // 98 0.825 -0.566 +assign wn_re[99] = 32'h6919E320; assign wn_im[99] = 32'hB6F0A812; // 99 0.821 -0.571 +assign wn_re[100] = 32'h68A69E81; assign wn_im[100] = 32'hB64BEACD; // 100 0.818 -0.576 +assign wn_re[101] = 32'h683257AB; assign wn_im[101] = 32'hB5A7E362; // 101 0.814 -0.581 +assign wn_re[102] = 32'h67BD0FBD; assign wn_im[102] = 32'hB5049368; // 102 0.810 -0.586 +assign wn_re[103] = 32'h6746C7D8; assign wn_im[103] = 32'hB461FC70; // 103 0.807 -0.591 +assign wn_re[104] = 32'h66CF8120; assign wn_im[104] = 32'hB3C0200C; // 104 0.803 -0.596 +assign wn_re[105] = 32'h66573CBB; assign wn_im[105] = 32'hB31EFFCC; // 105 0.800 -0.601 +assign wn_re[106] = 32'h65DDFBD3; assign wn_im[106] = 32'hB27E9D3C; // 106 0.796 -0.606 +assign wn_re[107] = 32'h6563BF92; assign wn_im[107] = 32'hB1DEF9E9; // 107 0.792 -0.610 +assign wn_re[108] = 32'h64E88926; assign wn_im[108] = 32'hB140175B; // 108 0.788 -0.615 +assign wn_re[109] = 32'h646C59BF; assign wn_im[109] = 32'hB0A1F71D; // 109 0.785 -0.620 +assign wn_re[110] = 32'h63EF3290; assign wn_im[110] = 32'hB0049AB3; // 110 0.781 -0.625 +assign wn_re[111] = 32'h637114CC; assign wn_im[111] = 32'hAF6803A2; // 111 0.777 -0.630 +assign wn_re[112] = 32'h62F201AC; assign wn_im[112] = 32'hAECC336C; // 112 0.773 -0.634 +assign wn_re[113] = 32'h6271FA69; assign wn_im[113] = 32'hAE312B92; // 113 0.769 -0.639 +assign wn_re[114] = 32'h61F1003F; assign wn_im[114] = 32'hAD96ED92; // 114 0.765 -0.644 +assign wn_re[115] = 32'h616F146C; assign wn_im[115] = 32'hACFD7AE8; // 115 0.761 -0.649 +assign wn_re[116] = 32'h60EC3830; assign wn_im[116] = 32'hAC64D510; // 116 0.757 -0.653 +assign wn_re[117] = 32'h60686CCF; assign wn_im[117] = 32'hABCCFD83; // 117 0.753 -0.658 +assign wn_re[118] = 32'h5FE3B38D; assign wn_im[118] = 32'hAB35F5B5; // 118 0.749 -0.662 +assign wn_re[119] = 32'h5F5E0DB3; assign wn_im[119] = 32'hAA9FBF1E; // 119 0.745 -0.667 +assign wn_re[120] = 32'h5ED77C8A; assign wn_im[120] = 32'hAA0A5B2E; // 120 0.741 -0.672 +assign wn_re[121] = 32'h5E50015D; assign wn_im[121] = 32'hA975CB57; // 121 0.737 -0.676 +assign wn_re[122] = 32'h5DC79D7C; assign wn_im[122] = 32'hA8E21106; // 122 0.733 -0.681 +assign wn_re[123] = 32'h5D3E5237; assign wn_im[123] = 32'hA84F2DAA; // 123 0.728 -0.685 +assign wn_re[124] = 32'h5CB420E0; assign wn_im[124] = 32'hA7BD22AC; // 124 0.724 -0.690 +assign wn_re[125] = 32'h5C290ACC; assign wn_im[125] = 32'hA72BF174; // 125 0.720 -0.694 +assign wn_re[126] = 32'h5B9D1154; assign wn_im[126] = 32'hA69B9B68; // 126 0.716 -0.698 +assign wn_re[127] = 32'h5B1035CF; assign wn_im[127] = 32'hA60C21EE; // 127 0.711 -0.703 +assign wn_re[128] = 32'h5A82799A; assign wn_im[128] = 32'hA57D8666; // 128 0.707 -0.707 +assign wn_re[129] = 32'h59F3DE12; assign wn_im[129] = 32'hA4EFCA31; // 129 0.703 -0.711 +assign wn_re[130] = 32'h59646498; assign wn_im[130] = 32'hA462EEAC; // 130 0.698 -0.716 +assign wn_re[131] = 32'h58D40E8C; assign wn_im[131] = 32'hA3D6F534; // 131 0.694 -0.720 +assign wn_re[132] = 32'h5842DD54; assign wn_im[132] = 32'hA34BDF20; // 132 0.690 -0.724 +assign wn_re[133] = 32'h57B0D256; assign wn_im[133] = 32'hA2C1ADC9; // 133 0.685 -0.728 +assign wn_re[134] = 32'h571DEEFA; assign wn_im[134] = 32'hA2386284; // 134 0.681 -0.733 +assign wn_re[135] = 32'h568A34A9; assign wn_im[135] = 32'hA1AFFEA3; // 135 0.676 -0.737 +assign wn_re[136] = 32'h55F5A4D2; assign wn_im[136] = 32'hA1288376; // 136 0.672 -0.741 +assign wn_re[137] = 32'h556040E2; assign wn_im[137] = 32'hA0A1F24D; // 137 0.667 -0.745 +assign wn_re[138] = 32'h54CA0A4B; assign wn_im[138] = 32'hA01C4C73; // 138 0.662 -0.749 +assign wn_re[139] = 32'h5433027D; assign wn_im[139] = 32'h9F979331; // 139 0.658 -0.753 +assign wn_re[140] = 32'h539B2AF0; assign wn_im[140] = 32'h9F13C7D0; // 140 0.653 -0.757 +assign wn_re[141] = 32'h53028518; assign wn_im[141] = 32'h9E90EB94; // 141 0.649 -0.761 +assign wn_re[142] = 32'h5269126E; assign wn_im[142] = 32'h9E0EFFC1; // 142 0.644 -0.765 +assign wn_re[143] = 32'h51CED46E; assign wn_im[143] = 32'h9D8E0597; // 143 0.639 -0.769 +assign wn_re[144] = 32'h5133CC94; assign wn_im[144] = 32'h9D0DFE54; // 144 0.634 -0.773 +assign wn_re[145] = 32'h5097FC5E; assign wn_im[145] = 32'h9C8EEB34; // 145 0.630 -0.777 +assign wn_re[146] = 32'h4FFB654D; assign wn_im[146] = 32'h9C10CD70; // 146 0.625 -0.781 +assign wn_re[147] = 32'h4F5E08E3; assign wn_im[147] = 32'h9B93A641; // 147 0.620 -0.785 +assign wn_re[148] = 32'h4EBFE8A5; assign wn_im[148] = 32'h9B1776DA; // 148 0.615 -0.788 +assign wn_re[149] = 32'h4E210617; assign wn_im[149] = 32'h9A9C406E; // 149 0.610 -0.792 +assign wn_re[150] = 32'h4D8162C4; assign wn_im[150] = 32'h9A22042D; // 150 0.606 -0.796 +assign wn_re[151] = 32'h4CE10034; assign wn_im[151] = 32'h99A8C345; // 151 0.601 -0.800 +assign wn_re[152] = 32'h4C3FDFF4; assign wn_im[152] = 32'h99307EE0; // 152 0.596 -0.803 +assign wn_re[153] = 32'h4B9E0390; assign wn_im[153] = 32'h98B93828; // 153 0.591 -0.807 +assign wn_re[154] = 32'h4AFB6C98; assign wn_im[154] = 32'h9842F043; // 154 0.586 -0.810 +assign wn_re[155] = 32'h4A581C9E; assign wn_im[155] = 32'h97CDA855; // 155 0.581 -0.814 +assign wn_re[156] = 32'h49B41533; assign wn_im[156] = 32'h9759617F; // 156 0.576 -0.818 +assign wn_re[157] = 32'h490F57EE; assign wn_im[157] = 32'h96E61CE0; // 157 0.571 -0.821 +assign wn_re[158] = 32'h4869E665; assign wn_im[158] = 32'h9673DB94; // 158 0.566 -0.825 +assign wn_re[159] = 32'h47C3C22F; assign wn_im[159] = 32'h96029EB6; // 159 0.561 -0.828 +assign wn_re[160] = 32'h471CECE7; assign wn_im[160] = 32'h9592675C; // 160 0.556 -0.831 +assign wn_re[161] = 32'h46756828; assign wn_im[161] = 32'h9523369C; // 161 0.550 -0.835 +assign wn_re[162] = 32'h45CD358F; assign wn_im[162] = 32'h94B50D87; // 162 0.545 -0.838 +assign wn_re[163] = 32'h452456BD; assign wn_im[163] = 32'h9447ED2F; // 163 0.540 -0.842 +assign wn_re[164] = 32'h447ACD50; assign wn_im[164] = 32'h93DBD6A0; // 164 0.535 -0.845 +assign wn_re[165] = 32'h43D09AED; assign wn_im[165] = 32'h9370CAE4; // 165 0.530 -0.848 +assign wn_re[166] = 32'h4325C135; assign wn_im[166] = 32'h9306CB04; // 166 0.525 -0.851 +assign wn_re[167] = 32'h427A41D0; assign wn_im[167] = 32'h929DD806; // 167 0.519 -0.855 +assign wn_re[168] = 32'h41CE1E65; assign wn_im[168] = 32'h9235F2EC; // 168 0.514 -0.858 +assign wn_re[169] = 32'h4121589B; assign wn_im[169] = 32'h91CF1CB6; // 169 0.509 -0.861 +assign wn_re[170] = 32'h4073F21D; assign wn_im[170] = 32'h91695663; // 170 0.504 -0.864 +assign wn_re[171] = 32'h3FC5EC98; assign wn_im[171] = 32'h9104A0EE; // 171 0.498 -0.867 +assign wn_re[172] = 32'h3F1749B8; assign wn_im[172] = 32'h90A0FD4E; // 172 0.493 -0.870 +assign wn_re[173] = 32'h3E680B2C; assign wn_im[173] = 32'h903E6C7B; // 173 0.488 -0.873 +assign wn_re[174] = 32'h3DB832A6; assign wn_im[174] = 32'h8FDCEF66; // 174 0.482 -0.876 +assign wn_re[175] = 32'h3D07C1D6; assign wn_im[175] = 32'h8F7C8701; // 175 0.477 -0.879 +assign wn_re[176] = 32'h3C56BA70; assign wn_im[176] = 32'h8F1D343A; // 176 0.471 -0.882 +assign wn_re[177] = 32'h3BA51E29; assign wn_im[177] = 32'h8EBEF7FB; // 177 0.466 -0.885 +assign wn_re[178] = 32'h3AF2EEB7; assign wn_im[178] = 32'h8E61D32E; // 178 0.461 -0.888 +assign wn_re[179] = 32'h3A402DD2; assign wn_im[179] = 32'h8E05C6B7; // 179 0.455 -0.890 +assign wn_re[180] = 32'h398CDD32; assign wn_im[180] = 32'h8DAAD37B; // 180 0.450 -0.893 +assign wn_re[181] = 32'h38D8FE93; assign wn_im[181] = 32'h8D50FA59; // 181 0.444 -0.896 +assign wn_re[182] = 32'h382493B0; assign wn_im[182] = 32'h8CF83C30; // 182 0.439 -0.899 +assign wn_re[183] = 32'h376F9E46; assign wn_im[183] = 32'h8CA099DA; // 183 0.433 -0.901 +assign wn_re[184] = 32'h36BA2014; assign wn_im[184] = 32'h8C4A142F; // 184 0.428 -0.904 +assign wn_re[185] = 32'h36041AD9; assign wn_im[185] = 32'h8BF4AC05; // 185 0.422 -0.907 +assign wn_re[186] = 32'h354D9057; assign wn_im[186] = 32'h8BA0622F; // 186 0.416 -0.909 +assign wn_re[187] = 32'h34968250; assign wn_im[187] = 32'h8B4D377C; // 187 0.411 -0.912 +assign wn_re[188] = 32'h33DEF287; assign wn_im[188] = 32'h8AFB2CBB; // 188 0.405 -0.914 +assign wn_re[189] = 32'h3326E2C3; assign wn_im[189] = 32'h8AAA42B4; // 189 0.400 -0.917 +assign wn_re[190] = 32'h326E54C7; assign wn_im[190] = 32'h8A5A7A31; // 190 0.394 -0.919 +assign wn_re[191] = 32'h31B54A5E; assign wn_im[191] = 32'h8A0BD3F5; // 191 0.388 -0.922 +assign wn_re[192] = 32'h30FBC54D; assign wn_im[192] = 32'h89BE50C3; // 192 0.383 -0.924 +assign wn_re[193] = 32'h3041C761; assign wn_im[193] = 32'h8971F15A; // 193 0.377 -0.926 +assign wn_re[194] = 32'h2F875262; assign wn_im[194] = 32'h8926B677; // 194 0.371 -0.929 +assign wn_re[195] = 32'h2ECC681E; assign wn_im[195] = 32'h88DCA0D3; // 195 0.366 -0.931 +assign wn_re[196] = 32'h2E110A62; assign wn_im[196] = 32'h8893B125; // 196 0.360 -0.933 +assign wn_re[197] = 32'h2D553AFC; assign wn_im[197] = 32'h884BE821; // 197 0.354 -0.935 +assign wn_re[198] = 32'h2C98FBBA; assign wn_im[198] = 32'h88054677; // 198 0.348 -0.937 +assign wn_re[199] = 32'h2BDC4E6F; assign wn_im[199] = 32'h87BFCCD7; // 199 0.343 -0.939 +assign wn_re[200] = 32'h2B1F34EB; assign wn_im[200] = 32'h877B7BEC; // 200 0.337 -0.942 +assign wn_re[201] = 32'h2A61B101; assign wn_im[201] = 32'h8738545E; // 201 0.331 -0.944 +assign wn_re[202] = 32'h29A3C485; assign wn_im[202] = 32'h86F656D3; // 202 0.325 -0.946 +assign wn_re[203] = 32'h28E5714B; assign wn_im[203] = 32'h86B583EE; // 203 0.320 -0.948 +assign wn_re[204] = 32'h2826B928; assign wn_im[204] = 32'h8675DC4F; // 204 0.314 -0.950 +assign wn_re[205] = 32'h27679DF4; assign wn_im[205] = 32'h86376092; // 205 0.308 -0.951 +assign wn_re[206] = 32'h26A82186; assign wn_im[206] = 32'h85FA1153; // 206 0.302 -0.953 +assign wn_re[207] = 32'h25E845B6; assign wn_im[207] = 32'h85BDEF28; // 207 0.296 -0.955 +assign wn_re[208] = 32'h25280C5E; assign wn_im[208] = 32'h8582FAA5; // 208 0.290 -0.957 +assign wn_re[209] = 32'h24677758; assign wn_im[209] = 32'h8549345C; // 209 0.284 -0.959 +assign wn_re[210] = 32'h23A6887F; assign wn_im[210] = 32'h85109CDD; // 210 0.279 -0.960 +assign wn_re[211] = 32'h22E541AF; assign wn_im[211] = 32'h84D934B1; // 211 0.273 -0.962 +assign wn_re[212] = 32'h2223A4C5; assign wn_im[212] = 32'h84A2FC62; // 212 0.267 -0.964 +assign wn_re[213] = 32'h2161B3A0; assign wn_im[213] = 32'h846DF477; // 213 0.261 -0.965 +assign wn_re[214] = 32'h209F701C; assign wn_im[214] = 32'h843A1D70; // 214 0.255 -0.967 +assign wn_re[215] = 32'h1FDCDC1B; assign wn_im[215] = 32'h840777D0; // 215 0.249 -0.969 +assign wn_re[216] = 32'h1F19F97B; assign wn_im[216] = 32'h83D60412; // 216 0.243 -0.970 +assign wn_re[217] = 32'h1E56CA1E; assign wn_im[217] = 32'h83A5C2B0; // 217 0.237 -0.972 +assign wn_re[218] = 32'h1D934FE5; assign wn_im[218] = 32'h8376B422; // 218 0.231 -0.973 +assign wn_re[219] = 32'h1CCF8CB3; assign wn_im[219] = 32'h8348D8DC; // 219 0.225 -0.974 +assign wn_re[220] = 32'h1C0B826A; assign wn_im[220] = 32'h831C314E; // 220 0.219 -0.976 +assign wn_re[221] = 32'h1B4732EF; assign wn_im[221] = 32'h82F0BDE8; // 221 0.213 -0.977 +assign wn_re[222] = 32'h1A82A026; assign wn_im[222] = 32'h82C67F14; // 222 0.207 -0.978 +assign wn_re[223] = 32'h19BDCBF3; assign wn_im[223] = 32'h829D753A; // 223 0.201 -0.980 +assign wn_re[224] = 32'h18F8B83C; assign wn_im[224] = 32'h8275A0C0; // 224 0.195 -0.981 +assign wn_re[225] = 32'h183366E9; assign wn_im[225] = 32'h824F0208; // 225 0.189 -0.982 +assign wn_re[226] = 32'h176DD9DE; assign wn_im[226] = 32'h82299971; // 226 0.183 -0.983 +assign wn_re[227] = 32'h16A81305; assign wn_im[227] = 32'h82056758; // 227 0.177 -0.984 +assign wn_re[228] = 32'h15E21445; assign wn_im[228] = 32'h81E26C16; // 228 0.171 -0.985 +assign wn_re[229] = 32'h151BDF86; assign wn_im[229] = 32'h81C0A801; // 229 0.165 -0.986 +assign wn_re[230] = 32'h145576B1; assign wn_im[230] = 32'h81A01B6D; // 230 0.159 -0.987 +assign wn_re[231] = 32'h138EDBB1; assign wn_im[231] = 32'h8180C6A9; // 231 0.153 -0.988 +assign wn_re[232] = 32'h12C8106F; assign wn_im[232] = 32'h8162AA04; // 232 0.147 -0.989 +assign wn_re[233] = 32'h120116D5; assign wn_im[233] = 32'h8145C5C7; // 233 0.141 -0.990 +assign wn_re[234] = 32'h1139F0CF; assign wn_im[234] = 32'h812A1A3A; // 234 0.135 -0.991 +assign wn_re[235] = 32'h1072A048; assign wn_im[235] = 32'h810FA7A0; // 235 0.128 -0.992 +assign wn_re[236] = 32'h0FAB272B; assign wn_im[236] = 32'h80F66E3C; // 236 0.122 -0.992 +assign wn_re[237] = 32'h0EE38766; assign wn_im[237] = 32'h80DE6E4C; // 237 0.116 -0.993 +assign wn_re[238] = 32'h0E1BC2E4; assign wn_im[238] = 32'h80C7A80A; // 238 0.110 -0.994 +assign wn_re[239] = 32'h0D53DB92; assign wn_im[239] = 32'h80B21BAF; // 239 0.104 -0.995 +assign wn_re[240] = 32'h0C8BD35E; assign wn_im[240] = 32'h809DC971; // 240 0.098 -0.995 +assign wn_re[241] = 32'h0BC3AC35; assign wn_im[241] = 32'h808AB180; // 241 0.092 -0.996 +assign wn_re[242] = 32'h0AFB6805; assign wn_im[242] = 32'h8078D40D; // 242 0.086 -0.996 +assign wn_re[243] = 32'h0A3308BD; assign wn_im[243] = 32'h80683143; // 243 0.080 -0.997 +assign wn_re[244] = 32'h096A9049; assign wn_im[244] = 32'h8058C94C; // 244 0.074 -0.997 +assign wn_re[245] = 32'h08A2009A; assign wn_im[245] = 32'h804A9C4D; // 245 0.067 -0.998 +assign wn_re[246] = 32'h07D95B9E; assign wn_im[246] = 32'h803DAA6A; // 246 0.061 -0.998 +assign wn_re[247] = 32'h0710A345; assign wn_im[247] = 32'h8031F3C2; // 247 0.055 -0.998 +assign wn_re[248] = 32'h0647D97C; assign wn_im[248] = 32'h80277872; // 248 0.049 -0.999 +assign wn_re[249] = 32'h057F0035; assign wn_im[249] = 32'h801E3895; // 249 0.043 -0.999 +assign wn_re[250] = 32'h04B6195D; assign wn_im[250] = 32'h80163440; // 250 0.037 -0.999 +assign wn_re[251] = 32'h03ED26E6; assign wn_im[251] = 32'h800F6B88; // 251 0.031 -1.000 +assign wn_re[252] = 32'h03242ABF; assign wn_im[252] = 32'h8009DE7E; // 252 0.025 -1.000 +assign wn_re[253] = 32'h025B26D7; assign wn_im[253] = 32'h80058D2F; // 253 0.018 -1.000 +assign wn_re[254] = 32'h01921D20; assign wn_im[254] = 32'h800277A6; // 254 0.012 -1.000 +assign wn_re[255] = 32'h00C90F88; assign wn_im[255] = 32'h80009DEA; // 255 0.006 -1.000 +assign wn_re[256] = 32'h00000000; assign wn_im[256] = 32'h80000000; // 256 0.000 -1.000 +assign wn_re[257] = 32'hxxxxxxxx; assign wn_im[257] = 32'hxxxxxxxx; // 257 -0.006 -1.000 +assign wn_re[258] = 32'hFE6DE2E0; assign wn_im[258] = 32'h800277A6; // 258 -0.012 -1.000 +assign wn_re[259] = 32'hxxxxxxxx; assign wn_im[259] = 32'hxxxxxxxx; // 259 -0.018 -1.000 +assign wn_re[260] = 32'hFCDBD541; assign wn_im[260] = 32'h8009DE7E; // 260 -0.025 -1.000 +assign wn_re[261] = 32'hFC12D91A; assign wn_im[261] = 32'h800F6B88; // 261 -0.031 -1.000 +assign wn_re[262] = 32'hFB49E6A3; assign wn_im[262] = 32'h80163440; // 262 -0.037 -0.999 +assign wn_re[263] = 32'hxxxxxxxx; assign wn_im[263] = 32'hxxxxxxxx; // 263 -0.043 -0.999 +assign wn_re[264] = 32'hF9B82684; assign wn_im[264] = 32'h80277872; // 264 -0.049 -0.999 +assign wn_re[265] = 32'hxxxxxxxx; assign wn_im[265] = 32'hxxxxxxxx; // 265 -0.055 -0.998 +assign wn_re[266] = 32'hF826A462; assign wn_im[266] = 32'h803DAA6A; // 266 -0.061 -0.998 +assign wn_re[267] = 32'hF75DFF66; assign wn_im[267] = 32'h804A9C4D; // 267 -0.067 -0.998 +assign wn_re[268] = 32'hF6956FB7; assign wn_im[268] = 32'h8058C94C; // 268 -0.074 -0.997 +assign wn_re[269] = 32'hxxxxxxxx; assign wn_im[269] = 32'hxxxxxxxx; // 269 -0.080 -0.997 +assign wn_re[270] = 32'hF50497FB; assign wn_im[270] = 32'h8078D40D; // 270 -0.086 -0.996 +assign wn_re[271] = 32'hxxxxxxxx; assign wn_im[271] = 32'hxxxxxxxx; // 271 -0.092 -0.996 +assign wn_re[272] = 32'hF3742CA2; assign wn_im[272] = 32'h809DC971; // 272 -0.098 -0.995 +assign wn_re[273] = 32'hF2AC246E; assign wn_im[273] = 32'h80B21BAF; // 273 -0.104 -0.995 +assign wn_re[274] = 32'hF1E43D1C; assign wn_im[274] = 32'h80C7A80A; // 274 -0.110 -0.994 +assign wn_re[275] = 32'hxxxxxxxx; assign wn_im[275] = 32'hxxxxxxxx; // 275 -0.116 -0.993 +assign wn_re[276] = 32'hF054D8D5; assign wn_im[276] = 32'h80F66E3C; // 276 -0.122 -0.992 +assign wn_re[277] = 32'hxxxxxxxx; assign wn_im[277] = 32'hxxxxxxxx; // 277 -0.128 -0.992 +assign wn_re[278] = 32'hEEC60F31; assign wn_im[278] = 32'h812A1A3A; // 278 -0.135 -0.991 +assign wn_re[279] = 32'hEDFEE92B; assign wn_im[279] = 32'h8145C5C7; // 279 -0.141 -0.990 +assign wn_re[280] = 32'hED37EF91; assign wn_im[280] = 32'h8162AA04; // 280 -0.147 -0.989 +assign wn_re[281] = 32'hxxxxxxxx; assign wn_im[281] = 32'hxxxxxxxx; // 281 -0.153 -0.988 +assign wn_re[282] = 32'hEBAA894F; assign wn_im[282] = 32'h81A01B6D; // 282 -0.159 -0.987 +assign wn_re[283] = 32'hxxxxxxxx; assign wn_im[283] = 32'hxxxxxxxx; // 283 -0.165 -0.986 +assign wn_re[284] = 32'hEA1DEBBB; assign wn_im[284] = 32'h81E26C16; // 284 -0.171 -0.985 +assign wn_re[285] = 32'hE957ECFB; assign wn_im[285] = 32'h82056758; // 285 -0.177 -0.984 +assign wn_re[286] = 32'hE8922622; assign wn_im[286] = 32'h82299971; // 286 -0.183 -0.983 +assign wn_re[287] = 32'hxxxxxxxx; assign wn_im[287] = 32'hxxxxxxxx; // 287 -0.189 -0.982 +assign wn_re[288] = 32'hE70747C4; assign wn_im[288] = 32'h8275A0C0; // 288 -0.195 -0.981 +assign wn_re[289] = 32'hxxxxxxxx; assign wn_im[289] = 32'hxxxxxxxx; // 289 -0.201 -0.980 +assign wn_re[290] = 32'hE57D5FDA; assign wn_im[290] = 32'h82C67F14; // 290 -0.207 -0.978 +assign wn_re[291] = 32'hE4B8CD11; assign wn_im[291] = 32'h82F0BDE8; // 291 -0.213 -0.977 +assign wn_re[292] = 32'hE3F47D96; assign wn_im[292] = 32'h831C314E; // 292 -0.219 -0.976 +assign wn_re[293] = 32'hxxxxxxxx; assign wn_im[293] = 32'hxxxxxxxx; // 293 -0.225 -0.974 +assign wn_re[294] = 32'hE26CB01B; assign wn_im[294] = 32'h8376B422; // 294 -0.231 -0.973 +assign wn_re[295] = 32'hxxxxxxxx; assign wn_im[295] = 32'hxxxxxxxx; // 295 -0.237 -0.972 +assign wn_re[296] = 32'hE0E60685; assign wn_im[296] = 32'h83D60412; // 296 -0.243 -0.970 +assign wn_re[297] = 32'hE02323E5; assign wn_im[297] = 32'h840777D0; // 297 -0.249 -0.969 +assign wn_re[298] = 32'hDF608FE4; assign wn_im[298] = 32'h843A1D70; // 298 -0.255 -0.967 +assign wn_re[299] = 32'hxxxxxxxx; assign wn_im[299] = 32'hxxxxxxxx; // 299 -0.261 -0.965 +assign wn_re[300] = 32'hDDDC5B3B; assign wn_im[300] = 32'h84A2FC62; // 300 -0.267 -0.964 +assign wn_re[301] = 32'hxxxxxxxx; assign wn_im[301] = 32'hxxxxxxxx; // 301 -0.273 -0.962 +assign wn_re[302] = 32'hDC597781; assign wn_im[302] = 32'h85109CDD; // 302 -0.279 -0.960 +assign wn_re[303] = 32'hDB9888A8; assign wn_im[303] = 32'h8549345C; // 303 -0.284 -0.959 +assign wn_re[304] = 32'hDAD7F3A2; assign wn_im[304] = 32'h8582FAA5; // 304 -0.290 -0.957 +assign wn_re[305] = 32'hxxxxxxxx; assign wn_im[305] = 32'hxxxxxxxx; // 305 -0.296 -0.955 +assign wn_re[306] = 32'hD957DE7A; assign wn_im[306] = 32'h85FA1153; // 306 -0.302 -0.953 +assign wn_re[307] = 32'hxxxxxxxx; assign wn_im[307] = 32'hxxxxxxxx; // 307 -0.308 -0.951 +assign wn_re[308] = 32'hD7D946D8; assign wn_im[308] = 32'h8675DC4F; // 308 -0.314 -0.950 +assign wn_re[309] = 32'hD71A8EB5; assign wn_im[309] = 32'h86B583EE; // 309 -0.320 -0.948 +assign wn_re[310] = 32'hD65C3B7B; assign wn_im[310] = 32'h86F656D3; // 310 -0.325 -0.946 +assign wn_re[311] = 32'hxxxxxxxx; assign wn_im[311] = 32'hxxxxxxxx; // 311 -0.331 -0.944 +assign wn_re[312] = 32'hD4E0CB15; assign wn_im[312] = 32'h877B7BEC; // 312 -0.337 -0.942 +assign wn_re[313] = 32'hxxxxxxxx; assign wn_im[313] = 32'hxxxxxxxx; // 313 -0.343 -0.939 +assign wn_re[314] = 32'hD3670446; assign wn_im[314] = 32'h88054677; // 314 -0.348 -0.937 +assign wn_re[315] = 32'hD2AAC504; assign wn_im[315] = 32'h884BE821; // 315 -0.354 -0.935 +assign wn_re[316] = 32'hD1EEF59E; assign wn_im[316] = 32'h8893B125; // 316 -0.360 -0.933 +assign wn_re[317] = 32'hxxxxxxxx; assign wn_im[317] = 32'hxxxxxxxx; // 317 -0.366 -0.931 +assign wn_re[318] = 32'hD078AD9E; assign wn_im[318] = 32'h8926B677; // 318 -0.371 -0.929 +assign wn_re[319] = 32'hxxxxxxxx; assign wn_im[319] = 32'hxxxxxxxx; // 319 -0.377 -0.926 +assign wn_re[320] = 32'hCF043AB3; assign wn_im[320] = 32'h89BE50C3; // 320 -0.383 -0.924 +assign wn_re[321] = 32'hCE4AB5A2; assign wn_im[321] = 32'h8A0BD3F5; // 321 -0.388 -0.922 +assign wn_re[322] = 32'hCD91AB39; assign wn_im[322] = 32'h8A5A7A31; // 322 -0.394 -0.919 +assign wn_re[323] = 32'hxxxxxxxx; assign wn_im[323] = 32'hxxxxxxxx; // 323 -0.400 -0.917 +assign wn_re[324] = 32'hCC210D79; assign wn_im[324] = 32'h8AFB2CBB; // 324 -0.405 -0.914 +assign wn_re[325] = 32'hxxxxxxxx; assign wn_im[325] = 32'hxxxxxxxx; // 325 -0.411 -0.912 +assign wn_re[326] = 32'hCAB26FA9; assign wn_im[326] = 32'h8BA0622F; // 326 -0.416 -0.909 +assign wn_re[327] = 32'hC9FBE527; assign wn_im[327] = 32'h8BF4AC05; // 327 -0.422 -0.907 +assign wn_re[328] = 32'hC945DFEC; assign wn_im[328] = 32'h8C4A142F; // 328 -0.428 -0.904 +assign wn_re[329] = 32'hxxxxxxxx; assign wn_im[329] = 32'hxxxxxxxx; // 329 -0.433 -0.901 +assign wn_re[330] = 32'hC7DB6C50; assign wn_im[330] = 32'h8CF83C30; // 330 -0.439 -0.899 +assign wn_re[331] = 32'hxxxxxxxx; assign wn_im[331] = 32'hxxxxxxxx; // 331 -0.444 -0.896 +assign wn_re[332] = 32'hC67322CE; assign wn_im[332] = 32'h8DAAD37B; // 332 -0.450 -0.893 +assign wn_re[333] = 32'hC5BFD22E; assign wn_im[333] = 32'h8E05C6B7; // 333 -0.455 -0.890 +assign wn_re[334] = 32'hC50D1149; assign wn_im[334] = 32'h8E61D32E; // 334 -0.461 -0.888 +assign wn_re[335] = 32'hxxxxxxxx; assign wn_im[335] = 32'hxxxxxxxx; // 335 -0.466 -0.885 +assign wn_re[336] = 32'hC3A94590; assign wn_im[336] = 32'h8F1D343A; // 336 -0.471 -0.882 +assign wn_re[337] = 32'hxxxxxxxx; assign wn_im[337] = 32'hxxxxxxxx; // 337 -0.477 -0.879 +assign wn_re[338] = 32'hC247CD5A; assign wn_im[338] = 32'h8FDCEF66; // 338 -0.482 -0.876 +assign wn_re[339] = 32'hC197F4D4; assign wn_im[339] = 32'h903E6C7B; // 339 -0.488 -0.873 +assign wn_re[340] = 32'hC0E8B648; assign wn_im[340] = 32'h90A0FD4E; // 340 -0.493 -0.870 +assign wn_re[341] = 32'hxxxxxxxx; assign wn_im[341] = 32'hxxxxxxxx; // 341 -0.498 -0.867 +assign wn_re[342] = 32'hBF8C0DE3; assign wn_im[342] = 32'h91695663; // 342 -0.504 -0.864 +assign wn_re[343] = 32'hxxxxxxxx; assign wn_im[343] = 32'hxxxxxxxx; // 343 -0.509 -0.861 +assign wn_re[344] = 32'hBE31E19B; assign wn_im[344] = 32'h9235F2EC; // 344 -0.514 -0.858 +assign wn_re[345] = 32'hBD85BE30; assign wn_im[345] = 32'h929DD806; // 345 -0.519 -0.855 +assign wn_re[346] = 32'hBCDA3ECB; assign wn_im[346] = 32'h9306CB04; // 346 -0.525 -0.851 +assign wn_re[347] = 32'hxxxxxxxx; assign wn_im[347] = 32'hxxxxxxxx; // 347 -0.530 -0.848 +assign wn_re[348] = 32'hBB8532B0; assign wn_im[348] = 32'h93DBD6A0; // 348 -0.535 -0.845 +assign wn_re[349] = 32'hxxxxxxxx; assign wn_im[349] = 32'hxxxxxxxx; // 349 -0.540 -0.842 +assign wn_re[350] = 32'hBA32CA71; assign wn_im[350] = 32'h94B50D87; // 350 -0.545 -0.838 +assign wn_re[351] = 32'hB98A97D8; assign wn_im[351] = 32'h9523369C; // 351 -0.550 -0.835 +assign wn_re[352] = 32'hB8E31319; assign wn_im[352] = 32'h9592675C; // 352 -0.556 -0.831 +assign wn_re[353] = 32'hxxxxxxxx; assign wn_im[353] = 32'hxxxxxxxx; // 353 -0.561 -0.828 +assign wn_re[354] = 32'hB796199B; assign wn_im[354] = 32'h9673DB94; // 354 -0.566 -0.825 +assign wn_re[355] = 32'hxxxxxxxx; assign wn_im[355] = 32'hxxxxxxxx; // 355 -0.571 -0.821 +assign wn_re[356] = 32'hB64BEACD; assign wn_im[356] = 32'h9759617F; // 356 -0.576 -0.818 +assign wn_re[357] = 32'hB5A7E362; assign wn_im[357] = 32'h97CDA855; // 357 -0.581 -0.814 +assign wn_re[358] = 32'hB5049368; assign wn_im[358] = 32'h9842F043; // 358 -0.586 -0.810 +assign wn_re[359] = 32'hxxxxxxxx; assign wn_im[359] = 32'hxxxxxxxx; // 359 -0.591 -0.807 +assign wn_re[360] = 32'hB3C0200C; assign wn_im[360] = 32'h99307EE0; // 360 -0.596 -0.803 +assign wn_re[361] = 32'hxxxxxxxx; assign wn_im[361] = 32'hxxxxxxxx; // 361 -0.601 -0.800 +assign wn_re[362] = 32'hB27E9D3C; assign wn_im[362] = 32'h9A22042D; // 362 -0.606 -0.796 +assign wn_re[363] = 32'hB1DEF9E9; assign wn_im[363] = 32'h9A9C406E; // 363 -0.610 -0.792 +assign wn_re[364] = 32'hB140175B; assign wn_im[364] = 32'h9B1776DA; // 364 -0.615 -0.788 +assign wn_re[365] = 32'hxxxxxxxx; assign wn_im[365] = 32'hxxxxxxxx; // 365 -0.620 -0.785 +assign wn_re[366] = 32'hB0049AB3; assign wn_im[366] = 32'h9C10CD70; // 366 -0.625 -0.781 +assign wn_re[367] = 32'hxxxxxxxx; assign wn_im[367] = 32'hxxxxxxxx; // 367 -0.630 -0.777 +assign wn_re[368] = 32'hAECC336C; assign wn_im[368] = 32'h9D0DFE54; // 368 -0.634 -0.773 +assign wn_re[369] = 32'hAE312B92; assign wn_im[369] = 32'h9D8E0597; // 369 -0.639 -0.769 +assign wn_re[370] = 32'hAD96ED92; assign wn_im[370] = 32'h9E0EFFC1; // 370 -0.644 -0.765 +assign wn_re[371] = 32'hxxxxxxxx; assign wn_im[371] = 32'hxxxxxxxx; // 371 -0.649 -0.761 +assign wn_re[372] = 32'hAC64D510; assign wn_im[372] = 32'h9F13C7D0; // 372 -0.653 -0.757 +assign wn_re[373] = 32'hxxxxxxxx; assign wn_im[373] = 32'hxxxxxxxx; // 373 -0.658 -0.753 +assign wn_re[374] = 32'hAB35F5B5; assign wn_im[374] = 32'hA01C4C73; // 374 -0.662 -0.749 +assign wn_re[375] = 32'hAA9FBF1E; assign wn_im[375] = 32'hA0A1F24D; // 375 -0.667 -0.745 +assign wn_re[376] = 32'hAA0A5B2E; assign wn_im[376] = 32'hA1288376; // 376 -0.672 -0.741 +assign wn_re[377] = 32'hxxxxxxxx; assign wn_im[377] = 32'hxxxxxxxx; // 377 -0.676 -0.737 +assign wn_re[378] = 32'hA8E21106; assign wn_im[378] = 32'hA2386284; // 378 -0.681 -0.733 +assign wn_re[379] = 32'hxxxxxxxx; assign wn_im[379] = 32'hxxxxxxxx; // 379 -0.685 -0.728 +assign wn_re[380] = 32'hA7BD22AC; assign wn_im[380] = 32'hA34BDF20; // 380 -0.690 -0.724 +assign wn_re[381] = 32'hA72BF174; assign wn_im[381] = 32'hA3D6F534; // 381 -0.694 -0.720 +assign wn_re[382] = 32'hA69B9B68; assign wn_im[382] = 32'hA462EEAC; // 382 -0.698 -0.716 +assign wn_re[383] = 32'hxxxxxxxx; assign wn_im[383] = 32'hxxxxxxxx; // 383 -0.703 -0.711 +assign wn_re[384] = 32'hA57D8666; assign wn_im[384] = 32'hA57D8666; // 384 -0.707 -0.707 +assign wn_re[385] = 32'hxxxxxxxx; assign wn_im[385] = 32'hxxxxxxxx; // 385 -0.711 -0.703 +assign wn_re[386] = 32'hA462EEAC; assign wn_im[386] = 32'hA69B9B68; // 386 -0.716 -0.698 +assign wn_re[387] = 32'hA3D6F534; assign wn_im[387] = 32'hA72BF174; // 387 -0.720 -0.694 +assign wn_re[388] = 32'hA34BDF20; assign wn_im[388] = 32'hA7BD22AC; // 388 -0.724 -0.690 +assign wn_re[389] = 32'hxxxxxxxx; assign wn_im[389] = 32'hxxxxxxxx; // 389 -0.728 -0.685 +assign wn_re[390] = 32'hA2386284; assign wn_im[390] = 32'hA8E21106; // 390 -0.733 -0.681 +assign wn_re[391] = 32'hxxxxxxxx; assign wn_im[391] = 32'hxxxxxxxx; // 391 -0.737 -0.676 +assign wn_re[392] = 32'hA1288376; assign wn_im[392] = 32'hAA0A5B2E; // 392 -0.741 -0.672 +assign wn_re[393] = 32'hA0A1F24D; assign wn_im[393] = 32'hAA9FBF1E; // 393 -0.745 -0.667 +assign wn_re[394] = 32'hA01C4C73; assign wn_im[394] = 32'hAB35F5B5; // 394 -0.749 -0.662 +assign wn_re[395] = 32'hxxxxxxxx; assign wn_im[395] = 32'hxxxxxxxx; // 395 -0.753 -0.658 +assign wn_re[396] = 32'h9F13C7D0; assign wn_im[396] = 32'hAC64D510; // 396 -0.757 -0.653 +assign wn_re[397] = 32'hxxxxxxxx; assign wn_im[397] = 32'hxxxxxxxx; // 397 -0.761 -0.649 +assign wn_re[398] = 32'h9E0EFFC1; assign wn_im[398] = 32'hAD96ED92; // 398 -0.765 -0.644 +assign wn_re[399] = 32'h9D8E0597; assign wn_im[399] = 32'hAE312B92; // 399 -0.769 -0.639 +assign wn_re[400] = 32'h9D0DFE54; assign wn_im[400] = 32'hAECC336C; // 400 -0.773 -0.634 +assign wn_re[401] = 32'hxxxxxxxx; assign wn_im[401] = 32'hxxxxxxxx; // 401 -0.777 -0.630 +assign wn_re[402] = 32'h9C10CD70; assign wn_im[402] = 32'hB0049AB3; // 402 -0.781 -0.625 +assign wn_re[403] = 32'hxxxxxxxx; assign wn_im[403] = 32'hxxxxxxxx; // 403 -0.785 -0.620 +assign wn_re[404] = 32'h9B1776DA; assign wn_im[404] = 32'hB140175B; // 404 -0.788 -0.615 +assign wn_re[405] = 32'h9A9C406E; assign wn_im[405] = 32'hB1DEF9E9; // 405 -0.792 -0.610 +assign wn_re[406] = 32'h9A22042D; assign wn_im[406] = 32'hB27E9D3C; // 406 -0.796 -0.606 +assign wn_re[407] = 32'hxxxxxxxx; assign wn_im[407] = 32'hxxxxxxxx; // 407 -0.800 -0.601 +assign wn_re[408] = 32'h99307EE0; assign wn_im[408] = 32'hB3C0200C; // 408 -0.803 -0.596 +assign wn_re[409] = 32'hxxxxxxxx; assign wn_im[409] = 32'hxxxxxxxx; // 409 -0.807 -0.591 +assign wn_re[410] = 32'h9842F043; assign wn_im[410] = 32'hB5049368; // 410 -0.810 -0.586 +assign wn_re[411] = 32'h97CDA855; assign wn_im[411] = 32'hB5A7E362; // 411 -0.814 -0.581 +assign wn_re[412] = 32'h9759617F; assign wn_im[412] = 32'hB64BEACD; // 412 -0.818 -0.576 +assign wn_re[413] = 32'hxxxxxxxx; assign wn_im[413] = 32'hxxxxxxxx; // 413 -0.821 -0.571 +assign wn_re[414] = 32'h9673DB94; assign wn_im[414] = 32'hB796199B; // 414 -0.825 -0.566 +assign wn_re[415] = 32'hxxxxxxxx; assign wn_im[415] = 32'hxxxxxxxx; // 415 -0.828 -0.561 +assign wn_re[416] = 32'h9592675C; assign wn_im[416] = 32'hB8E31319; // 416 -0.831 -0.556 +assign wn_re[417] = 32'h9523369C; assign wn_im[417] = 32'hB98A97D8; // 417 -0.835 -0.550 +assign wn_re[418] = 32'h94B50D87; assign wn_im[418] = 32'hBA32CA71; // 418 -0.838 -0.545 +assign wn_re[419] = 32'hxxxxxxxx; assign wn_im[419] = 32'hxxxxxxxx; // 419 -0.842 -0.540 +assign wn_re[420] = 32'h93DBD6A0; assign wn_im[420] = 32'hBB8532B0; // 420 -0.845 -0.535 +assign wn_re[421] = 32'hxxxxxxxx; assign wn_im[421] = 32'hxxxxxxxx; // 421 -0.848 -0.530 +assign wn_re[422] = 32'h9306CB04; assign wn_im[422] = 32'hBCDA3ECB; // 422 -0.851 -0.525 +assign wn_re[423] = 32'h929DD806; assign wn_im[423] = 32'hBD85BE30; // 423 -0.855 -0.519 +assign wn_re[424] = 32'h9235F2EC; assign wn_im[424] = 32'hBE31E19B; // 424 -0.858 -0.514 +assign wn_re[425] = 32'hxxxxxxxx; assign wn_im[425] = 32'hxxxxxxxx; // 425 -0.861 -0.509 +assign wn_re[426] = 32'h91695663; assign wn_im[426] = 32'hBF8C0DE3; // 426 -0.864 -0.504 +assign wn_re[427] = 32'hxxxxxxxx; assign wn_im[427] = 32'hxxxxxxxx; // 427 -0.867 -0.498 +assign wn_re[428] = 32'h90A0FD4E; assign wn_im[428] = 32'hC0E8B648; // 428 -0.870 -0.493 +assign wn_re[429] = 32'h903E6C7B; assign wn_im[429] = 32'hC197F4D4; // 429 -0.873 -0.488 +assign wn_re[430] = 32'h8FDCEF66; assign wn_im[430] = 32'hC247CD5A; // 430 -0.876 -0.482 +assign wn_re[431] = 32'hxxxxxxxx; assign wn_im[431] = 32'hxxxxxxxx; // 431 -0.879 -0.477 +assign wn_re[432] = 32'h8F1D343A; assign wn_im[432] = 32'hC3A94590; // 432 -0.882 -0.471 +assign wn_re[433] = 32'hxxxxxxxx; assign wn_im[433] = 32'hxxxxxxxx; // 433 -0.885 -0.466 +assign wn_re[434] = 32'h8E61D32E; assign wn_im[434] = 32'hC50D1149; // 434 -0.888 -0.461 +assign wn_re[435] = 32'h8E05C6B7; assign wn_im[435] = 32'hC5BFD22E; // 435 -0.890 -0.455 +assign wn_re[436] = 32'h8DAAD37B; assign wn_im[436] = 32'hC67322CE; // 436 -0.893 -0.450 +assign wn_re[437] = 32'hxxxxxxxx; assign wn_im[437] = 32'hxxxxxxxx; // 437 -0.896 -0.444 +assign wn_re[438] = 32'h8CF83C30; assign wn_im[438] = 32'hC7DB6C50; // 438 -0.899 -0.439 +assign wn_re[439] = 32'hxxxxxxxx; assign wn_im[439] = 32'hxxxxxxxx; // 439 -0.901 -0.433 +assign wn_re[440] = 32'h8C4A142F; assign wn_im[440] = 32'hC945DFEC; // 440 -0.904 -0.428 +assign wn_re[441] = 32'h8BF4AC05; assign wn_im[441] = 32'hC9FBE527; // 441 -0.907 -0.422 +assign wn_re[442] = 32'h8BA0622F; assign wn_im[442] = 32'hCAB26FA9; // 442 -0.909 -0.416 +assign wn_re[443] = 32'hxxxxxxxx; assign wn_im[443] = 32'hxxxxxxxx; // 443 -0.912 -0.411 +assign wn_re[444] = 32'h8AFB2CBB; assign wn_im[444] = 32'hCC210D79; // 444 -0.914 -0.405 +assign wn_re[445] = 32'hxxxxxxxx; assign wn_im[445] = 32'hxxxxxxxx; // 445 -0.917 -0.400 +assign wn_re[446] = 32'h8A5A7A31; assign wn_im[446] = 32'hCD91AB39; // 446 -0.919 -0.394 +assign wn_re[447] = 32'h8A0BD3F5; assign wn_im[447] = 32'hCE4AB5A2; // 447 -0.922 -0.388 +assign wn_re[448] = 32'h89BE50C3; assign wn_im[448] = 32'hCF043AB3; // 448 -0.924 -0.383 +assign wn_re[449] = 32'hxxxxxxxx; assign wn_im[449] = 32'hxxxxxxxx; // 449 -0.926 -0.377 +assign wn_re[450] = 32'h8926B677; assign wn_im[450] = 32'hD078AD9E; // 450 -0.929 -0.371 +assign wn_re[451] = 32'hxxxxxxxx; assign wn_im[451] = 32'hxxxxxxxx; // 451 -0.931 -0.366 +assign wn_re[452] = 32'h8893B125; assign wn_im[452] = 32'hD1EEF59E; // 452 -0.933 -0.360 +assign wn_re[453] = 32'h884BE821; assign wn_im[453] = 32'hD2AAC504; // 453 -0.935 -0.354 +assign wn_re[454] = 32'h88054677; assign wn_im[454] = 32'hD3670446; // 454 -0.937 -0.348 +assign wn_re[455] = 32'hxxxxxxxx; assign wn_im[455] = 32'hxxxxxxxx; // 455 -0.939 -0.343 +assign wn_re[456] = 32'h877B7BEC; assign wn_im[456] = 32'hD4E0CB15; // 456 -0.942 -0.337 +assign wn_re[457] = 32'hxxxxxxxx; assign wn_im[457] = 32'hxxxxxxxx; // 457 -0.944 -0.331 +assign wn_re[458] = 32'h86F656D3; assign wn_im[458] = 32'hD65C3B7B; // 458 -0.946 -0.325 +assign wn_re[459] = 32'h86B583EE; assign wn_im[459] = 32'hD71A8EB5; // 459 -0.948 -0.320 +assign wn_re[460] = 32'h8675DC4F; assign wn_im[460] = 32'hD7D946D8; // 460 -0.950 -0.314 +assign wn_re[461] = 32'hxxxxxxxx; assign wn_im[461] = 32'hxxxxxxxx; // 461 -0.951 -0.308 +assign wn_re[462] = 32'h85FA1153; assign wn_im[462] = 32'hD957DE7A; // 462 -0.953 -0.302 +assign wn_re[463] = 32'hxxxxxxxx; assign wn_im[463] = 32'hxxxxxxxx; // 463 -0.955 -0.296 +assign wn_re[464] = 32'h8582FAA5; assign wn_im[464] = 32'hDAD7F3A2; // 464 -0.957 -0.290 +assign wn_re[465] = 32'h8549345C; assign wn_im[465] = 32'hDB9888A8; // 465 -0.959 -0.284 +assign wn_re[466] = 32'h85109CDD; assign wn_im[466] = 32'hDC597781; // 466 -0.960 -0.279 +assign wn_re[467] = 32'hxxxxxxxx; assign wn_im[467] = 32'hxxxxxxxx; // 467 -0.962 -0.273 +assign wn_re[468] = 32'h84A2FC62; assign wn_im[468] = 32'hDDDC5B3B; // 468 -0.964 -0.267 +assign wn_re[469] = 32'hxxxxxxxx; assign wn_im[469] = 32'hxxxxxxxx; // 469 -0.965 -0.261 +assign wn_re[470] = 32'h843A1D70; assign wn_im[470] = 32'hDF608FE4; // 470 -0.967 -0.255 +assign wn_re[471] = 32'h840777D0; assign wn_im[471] = 32'hE02323E5; // 471 -0.969 -0.249 +assign wn_re[472] = 32'h83D60412; assign wn_im[472] = 32'hE0E60685; // 472 -0.970 -0.243 +assign wn_re[473] = 32'hxxxxxxxx; assign wn_im[473] = 32'hxxxxxxxx; // 473 -0.972 -0.237 +assign wn_re[474] = 32'h8376B422; assign wn_im[474] = 32'hE26CB01B; // 474 -0.973 -0.231 +assign wn_re[475] = 32'hxxxxxxxx; assign wn_im[475] = 32'hxxxxxxxx; // 475 -0.974 -0.225 +assign wn_re[476] = 32'h831C314E; assign wn_im[476] = 32'hE3F47D96; // 476 -0.976 -0.219 +assign wn_re[477] = 32'h82F0BDE8; assign wn_im[477] = 32'hE4B8CD11; // 477 -0.977 -0.213 +assign wn_re[478] = 32'h82C67F14; assign wn_im[478] = 32'hE57D5FDA; // 478 -0.978 -0.207 +assign wn_re[479] = 32'hxxxxxxxx; assign wn_im[479] = 32'hxxxxxxxx; // 479 -0.980 -0.201 +assign wn_re[480] = 32'h8275A0C0; assign wn_im[480] = 32'hE70747C4; // 480 -0.981 -0.195 +assign wn_re[481] = 32'hxxxxxxxx; assign wn_im[481] = 32'hxxxxxxxx; // 481 -0.982 -0.189 +assign wn_re[482] = 32'h82299971; assign wn_im[482] = 32'hE8922622; // 482 -0.983 -0.183 +assign wn_re[483] = 32'h82056758; assign wn_im[483] = 32'hE957ECFB; // 483 -0.984 -0.177 +assign wn_re[484] = 32'h81E26C16; assign wn_im[484] = 32'hEA1DEBBB; // 484 -0.985 -0.171 +assign wn_re[485] = 32'hxxxxxxxx; assign wn_im[485] = 32'hxxxxxxxx; // 485 -0.986 -0.165 +assign wn_re[486] = 32'h81A01B6D; assign wn_im[486] = 32'hEBAA894F; // 486 -0.987 -0.159 +assign wn_re[487] = 32'hxxxxxxxx; assign wn_im[487] = 32'hxxxxxxxx; // 487 -0.988 -0.153 +assign wn_re[488] = 32'h8162AA04; assign wn_im[488] = 32'hED37EF91; // 488 -0.989 -0.147 +assign wn_re[489] = 32'h8145C5C7; assign wn_im[489] = 32'hEDFEE92B; // 489 -0.990 -0.141 +assign wn_re[490] = 32'h812A1A3A; assign wn_im[490] = 32'hEEC60F31; // 490 -0.991 -0.135 +assign wn_re[491] = 32'hxxxxxxxx; assign wn_im[491] = 32'hxxxxxxxx; // 491 -0.992 -0.128 +assign wn_re[492] = 32'h80F66E3C; assign wn_im[492] = 32'hF054D8D5; // 492 -0.992 -0.122 +assign wn_re[493] = 32'hxxxxxxxx; assign wn_im[493] = 32'hxxxxxxxx; // 493 -0.993 -0.116 +assign wn_re[494] = 32'h80C7A80A; assign wn_im[494] = 32'hF1E43D1C; // 494 -0.994 -0.110 +assign wn_re[495] = 32'h80B21BAF; assign wn_im[495] = 32'hF2AC246E; // 495 -0.995 -0.104 +assign wn_re[496] = 32'h809DC971; assign wn_im[496] = 32'hF3742CA2; // 496 -0.995 -0.098 +assign wn_re[497] = 32'hxxxxxxxx; assign wn_im[497] = 32'hxxxxxxxx; // 497 -0.996 -0.092 +assign wn_re[498] = 32'h8078D40D; assign wn_im[498] = 32'hF50497FB; // 498 -0.996 -0.086 +assign wn_re[499] = 32'hxxxxxxxx; assign wn_im[499] = 32'hxxxxxxxx; // 499 -0.997 -0.080 +assign wn_re[500] = 32'h8058C94C; assign wn_im[500] = 32'hF6956FB7; // 500 -0.997 -0.074 +assign wn_re[501] = 32'h804A9C4D; assign wn_im[501] = 32'hF75DFF66; // 501 -0.998 -0.067 +assign wn_re[502] = 32'h803DAA6A; assign wn_im[502] = 32'hF826A462; // 502 -0.998 -0.061 +assign wn_re[503] = 32'hxxxxxxxx; assign wn_im[503] = 32'hxxxxxxxx; // 503 -0.998 -0.055 +assign wn_re[504] = 32'h80277872; assign wn_im[504] = 32'hF9B82684; // 504 -0.999 -0.049 +assign wn_re[505] = 32'hxxxxxxxx; assign wn_im[505] = 32'hxxxxxxxx; // 505 -0.999 -0.043 +assign wn_re[506] = 32'h80163440; assign wn_im[506] = 32'hFB49E6A3; // 506 -0.999 -0.037 +assign wn_re[507] = 32'h800F6B88; assign wn_im[507] = 32'hFC12D91A; // 507 -1.000 -0.031 +assign wn_re[508] = 32'h8009DE7E; assign wn_im[508] = 32'hFCDBD541; // 508 -1.000 -0.025 +assign wn_re[509] = 32'hxxxxxxxx; assign wn_im[509] = 32'hxxxxxxxx; // 509 -1.000 -0.018 +assign wn_re[510] = 32'h800277A6; assign wn_im[510] = 32'hFE6DE2E0; // 510 -1.000 -0.012 +assign wn_re[511] = 32'hxxxxxxxx; assign wn_im[511] = 32'hxxxxxxxx; // 511 -1.000 -0.006 +assign wn_re[512] = 32'hxxxxxxxx; assign wn_im[512] = 32'hxxxxxxxx; // 512 -1.000 -0.000 +assign wn_re[513] = 32'h80009DEA; assign wn_im[513] = 32'h00C90F88; // 513 -1.000 0.006 +assign wn_re[514] = 32'hxxxxxxxx; assign wn_im[514] = 32'hxxxxxxxx; // 514 -1.000 0.012 +assign wn_re[515] = 32'hxxxxxxxx; assign wn_im[515] = 32'hxxxxxxxx; // 515 -1.000 0.018 +assign wn_re[516] = 32'h8009DE7E; assign wn_im[516] = 32'h03242ABF; // 516 -1.000 0.025 +assign wn_re[517] = 32'hxxxxxxxx; assign wn_im[517] = 32'hxxxxxxxx; // 517 -1.000 0.031 +assign wn_re[518] = 32'hxxxxxxxx; assign wn_im[518] = 32'hxxxxxxxx; // 518 -0.999 0.037 +assign wn_re[519] = 32'h801E3895; assign wn_im[519] = 32'h057F0035; // 519 -0.999 0.043 +assign wn_re[520] = 32'hxxxxxxxx; assign wn_im[520] = 32'hxxxxxxxx; // 520 -0.999 0.049 +assign wn_re[521] = 32'hxxxxxxxx; assign wn_im[521] = 32'hxxxxxxxx; // 521 -0.998 0.055 +assign wn_re[522] = 32'h803DAA6A; assign wn_im[522] = 32'h07D95B9E; // 522 -0.998 0.061 +assign wn_re[523] = 32'hxxxxxxxx; assign wn_im[523] = 32'hxxxxxxxx; // 523 -0.998 0.067 +assign wn_re[524] = 32'hxxxxxxxx; assign wn_im[524] = 32'hxxxxxxxx; // 524 -0.997 0.074 +assign wn_re[525] = 32'h80683143; assign wn_im[525] = 32'h0A3308BD; // 525 -0.997 0.080 +assign wn_re[526] = 32'hxxxxxxxx; assign wn_im[526] = 32'hxxxxxxxx; // 526 -0.996 0.086 +assign wn_re[527] = 32'hxxxxxxxx; assign wn_im[527] = 32'hxxxxxxxx; // 527 -0.996 0.092 +assign wn_re[528] = 32'h809DC971; assign wn_im[528] = 32'h0C8BD35E; // 528 -0.995 0.098 +assign wn_re[529] = 32'hxxxxxxxx; assign wn_im[529] = 32'hxxxxxxxx; // 529 -0.995 0.104 +assign wn_re[530] = 32'hxxxxxxxx; assign wn_im[530] = 32'hxxxxxxxx; // 530 -0.994 0.110 +assign wn_re[531] = 32'h80DE6E4C; assign wn_im[531] = 32'h0EE38766; // 531 -0.993 0.116 +assign wn_re[532] = 32'hxxxxxxxx; assign wn_im[532] = 32'hxxxxxxxx; // 532 -0.992 0.122 +assign wn_re[533] = 32'hxxxxxxxx; assign wn_im[533] = 32'hxxxxxxxx; // 533 -0.992 0.128 +assign wn_re[534] = 32'h812A1A3A; assign wn_im[534] = 32'h1139F0CF; // 534 -0.991 0.135 +assign wn_re[535] = 32'hxxxxxxxx; assign wn_im[535] = 32'hxxxxxxxx; // 535 -0.990 0.141 +assign wn_re[536] = 32'hxxxxxxxx; assign wn_im[536] = 32'hxxxxxxxx; // 536 -0.989 0.147 +assign wn_re[537] = 32'h8180C6A9; assign wn_im[537] = 32'h138EDBB1; // 537 -0.988 0.153 +assign wn_re[538] = 32'hxxxxxxxx; assign wn_im[538] = 32'hxxxxxxxx; // 538 -0.987 0.159 +assign wn_re[539] = 32'hxxxxxxxx; assign wn_im[539] = 32'hxxxxxxxx; // 539 -0.986 0.165 +assign wn_re[540] = 32'h81E26C16; assign wn_im[540] = 32'h15E21445; // 540 -0.985 0.171 +assign wn_re[541] = 32'hxxxxxxxx; assign wn_im[541] = 32'hxxxxxxxx; // 541 -0.984 0.177 +assign wn_re[542] = 32'hxxxxxxxx; assign wn_im[542] = 32'hxxxxxxxx; // 542 -0.983 0.183 +assign wn_re[543] = 32'h824F0208; assign wn_im[543] = 32'h183366E9; // 543 -0.982 0.189 +assign wn_re[544] = 32'hxxxxxxxx; assign wn_im[544] = 32'hxxxxxxxx; // 544 -0.981 0.195 +assign wn_re[545] = 32'hxxxxxxxx; assign wn_im[545] = 32'hxxxxxxxx; // 545 -0.980 0.201 +assign wn_re[546] = 32'h82C67F14; assign wn_im[546] = 32'h1A82A026; // 546 -0.978 0.207 +assign wn_re[547] = 32'hxxxxxxxx; assign wn_im[547] = 32'hxxxxxxxx; // 547 -0.977 0.213 +assign wn_re[548] = 32'hxxxxxxxx; assign wn_im[548] = 32'hxxxxxxxx; // 548 -0.976 0.219 +assign wn_re[549] = 32'h8348D8DC; assign wn_im[549] = 32'h1CCF8CB3; // 549 -0.974 0.225 +assign wn_re[550] = 32'hxxxxxxxx; assign wn_im[550] = 32'hxxxxxxxx; // 550 -0.973 0.231 +assign wn_re[551] = 32'hxxxxxxxx; assign wn_im[551] = 32'hxxxxxxxx; // 551 -0.972 0.237 +assign wn_re[552] = 32'h83D60412; assign wn_im[552] = 32'h1F19F97B; // 552 -0.970 0.243 +assign wn_re[553] = 32'hxxxxxxxx; assign wn_im[553] = 32'hxxxxxxxx; // 553 -0.969 0.249 +assign wn_re[554] = 32'hxxxxxxxx; assign wn_im[554] = 32'hxxxxxxxx; // 554 -0.967 0.255 +assign wn_re[555] = 32'h846DF477; assign wn_im[555] = 32'h2161B3A0; // 555 -0.965 0.261 +assign wn_re[556] = 32'hxxxxxxxx; assign wn_im[556] = 32'hxxxxxxxx; // 556 -0.964 0.267 +assign wn_re[557] = 32'hxxxxxxxx; assign wn_im[557] = 32'hxxxxxxxx; // 557 -0.962 0.273 +assign wn_re[558] = 32'h85109CDD; assign wn_im[558] = 32'h23A6887F; // 558 -0.960 0.279 +assign wn_re[559] = 32'hxxxxxxxx; assign wn_im[559] = 32'hxxxxxxxx; // 559 -0.959 0.284 +assign wn_re[560] = 32'hxxxxxxxx; assign wn_im[560] = 32'hxxxxxxxx; // 560 -0.957 0.290 +assign wn_re[561] = 32'h85BDEF28; assign wn_im[561] = 32'h25E845B6; // 561 -0.955 0.296 +assign wn_re[562] = 32'hxxxxxxxx; assign wn_im[562] = 32'hxxxxxxxx; // 562 -0.953 0.302 +assign wn_re[563] = 32'hxxxxxxxx; assign wn_im[563] = 32'hxxxxxxxx; // 563 -0.951 0.308 +assign wn_re[564] = 32'h8675DC4F; assign wn_im[564] = 32'h2826B928; // 564 -0.950 0.314 +assign wn_re[565] = 32'hxxxxxxxx; assign wn_im[565] = 32'hxxxxxxxx; // 565 -0.948 0.320 +assign wn_re[566] = 32'hxxxxxxxx; assign wn_im[566] = 32'hxxxxxxxx; // 566 -0.946 0.325 +assign wn_re[567] = 32'h8738545E; assign wn_im[567] = 32'h2A61B101; // 567 -0.944 0.331 +assign wn_re[568] = 32'hxxxxxxxx; assign wn_im[568] = 32'hxxxxxxxx; // 568 -0.942 0.337 +assign wn_re[569] = 32'hxxxxxxxx; assign wn_im[569] = 32'hxxxxxxxx; // 569 -0.939 0.343 +assign wn_re[570] = 32'h88054677; assign wn_im[570] = 32'h2C98FBBA; // 570 -0.937 0.348 +assign wn_re[571] = 32'hxxxxxxxx; assign wn_im[571] = 32'hxxxxxxxx; // 571 -0.935 0.354 +assign wn_re[572] = 32'hxxxxxxxx; assign wn_im[572] = 32'hxxxxxxxx; // 572 -0.933 0.360 +assign wn_re[573] = 32'h88DCA0D3; assign wn_im[573] = 32'h2ECC681E; // 573 -0.931 0.366 +assign wn_re[574] = 32'hxxxxxxxx; assign wn_im[574] = 32'hxxxxxxxx; // 574 -0.929 0.371 +assign wn_re[575] = 32'hxxxxxxxx; assign wn_im[575] = 32'hxxxxxxxx; // 575 -0.926 0.377 +assign wn_re[576] = 32'h89BE50C3; assign wn_im[576] = 32'h30FBC54D; // 576 -0.924 0.383 +assign wn_re[577] = 32'hxxxxxxxx; assign wn_im[577] = 32'hxxxxxxxx; // 577 -0.922 0.388 +assign wn_re[578] = 32'hxxxxxxxx; assign wn_im[578] = 32'hxxxxxxxx; // 578 -0.919 0.394 +assign wn_re[579] = 32'h8AAA42B4; assign wn_im[579] = 32'h3326E2C3; // 579 -0.917 0.400 +assign wn_re[580] = 32'hxxxxxxxx; assign wn_im[580] = 32'hxxxxxxxx; // 580 -0.914 0.405 +assign wn_re[581] = 32'hxxxxxxxx; assign wn_im[581] = 32'hxxxxxxxx; // 581 -0.912 0.411 +assign wn_re[582] = 32'h8BA0622F; assign wn_im[582] = 32'h354D9057; // 582 -0.909 0.416 +assign wn_re[583] = 32'hxxxxxxxx; assign wn_im[583] = 32'hxxxxxxxx; // 583 -0.907 0.422 +assign wn_re[584] = 32'hxxxxxxxx; assign wn_im[584] = 32'hxxxxxxxx; // 584 -0.904 0.428 +assign wn_re[585] = 32'h8CA099DA; assign wn_im[585] = 32'h376F9E46; // 585 -0.901 0.433 +assign wn_re[586] = 32'hxxxxxxxx; assign wn_im[586] = 32'hxxxxxxxx; // 586 -0.899 0.439 +assign wn_re[587] = 32'hxxxxxxxx; assign wn_im[587] = 32'hxxxxxxxx; // 587 -0.896 0.444 +assign wn_re[588] = 32'h8DAAD37B; assign wn_im[588] = 32'h398CDD32; // 588 -0.893 0.450 +assign wn_re[589] = 32'hxxxxxxxx; assign wn_im[589] = 32'hxxxxxxxx; // 589 -0.890 0.455 +assign wn_re[590] = 32'hxxxxxxxx; assign wn_im[590] = 32'hxxxxxxxx; // 590 -0.888 0.461 +assign wn_re[591] = 32'h8EBEF7FB; assign wn_im[591] = 32'h3BA51E29; // 591 -0.885 0.466 +assign wn_re[592] = 32'hxxxxxxxx; assign wn_im[592] = 32'hxxxxxxxx; // 592 -0.882 0.471 +assign wn_re[593] = 32'hxxxxxxxx; assign wn_im[593] = 32'hxxxxxxxx; // 593 -0.879 0.477 +assign wn_re[594] = 32'h8FDCEF66; assign wn_im[594] = 32'h3DB832A6; // 594 -0.876 0.482 +assign wn_re[595] = 32'hxxxxxxxx; assign wn_im[595] = 32'hxxxxxxxx; // 595 -0.873 0.488 +assign wn_re[596] = 32'hxxxxxxxx; assign wn_im[596] = 32'hxxxxxxxx; // 596 -0.870 0.493 +assign wn_re[597] = 32'h9104A0EE; assign wn_im[597] = 32'h3FC5EC98; // 597 -0.867 0.498 +assign wn_re[598] = 32'hxxxxxxxx; assign wn_im[598] = 32'hxxxxxxxx; // 598 -0.864 0.504 +assign wn_re[599] = 32'hxxxxxxxx; assign wn_im[599] = 32'hxxxxxxxx; // 599 -0.861 0.509 +assign wn_re[600] = 32'h9235F2EC; assign wn_im[600] = 32'h41CE1E65; // 600 -0.858 0.514 +assign wn_re[601] = 32'hxxxxxxxx; assign wn_im[601] = 32'hxxxxxxxx; // 601 -0.855 0.519 +assign wn_re[602] = 32'hxxxxxxxx; assign wn_im[602] = 32'hxxxxxxxx; // 602 -0.851 0.525 +assign wn_re[603] = 32'h9370CAE4; assign wn_im[603] = 32'h43D09AED; // 603 -0.848 0.530 +assign wn_re[604] = 32'hxxxxxxxx; assign wn_im[604] = 32'hxxxxxxxx; // 604 -0.845 0.535 +assign wn_re[605] = 32'hxxxxxxxx; assign wn_im[605] = 32'hxxxxxxxx; // 605 -0.842 0.540 +assign wn_re[606] = 32'h94B50D87; assign wn_im[606] = 32'h45CD358F; // 606 -0.838 0.545 +assign wn_re[607] = 32'hxxxxxxxx; assign wn_im[607] = 32'hxxxxxxxx; // 607 -0.835 0.550 +assign wn_re[608] = 32'hxxxxxxxx; assign wn_im[608] = 32'hxxxxxxxx; // 608 -0.831 0.556 +assign wn_re[609] = 32'h96029EB6; assign wn_im[609] = 32'h47C3C22F; // 609 -0.828 0.561 +assign wn_re[610] = 32'hxxxxxxxx; assign wn_im[610] = 32'hxxxxxxxx; // 610 -0.825 0.566 +assign wn_re[611] = 32'hxxxxxxxx; assign wn_im[611] = 32'hxxxxxxxx; // 611 -0.821 0.571 +assign wn_re[612] = 32'h9759617F; assign wn_im[612] = 32'h49B41533; // 612 -0.818 0.576 +assign wn_re[613] = 32'hxxxxxxxx; assign wn_im[613] = 32'hxxxxxxxx; // 613 -0.814 0.581 +assign wn_re[614] = 32'hxxxxxxxx; assign wn_im[614] = 32'hxxxxxxxx; // 614 -0.810 0.586 +assign wn_re[615] = 32'h98B93828; assign wn_im[615] = 32'h4B9E0390; // 615 -0.807 0.591 +assign wn_re[616] = 32'hxxxxxxxx; assign wn_im[616] = 32'hxxxxxxxx; // 616 -0.803 0.596 +assign wn_re[617] = 32'hxxxxxxxx; assign wn_im[617] = 32'hxxxxxxxx; // 617 -0.800 0.601 +assign wn_re[618] = 32'h9A22042D; assign wn_im[618] = 32'h4D8162C4; // 618 -0.796 0.606 +assign wn_re[619] = 32'hxxxxxxxx; assign wn_im[619] = 32'hxxxxxxxx; // 619 -0.792 0.610 +assign wn_re[620] = 32'hxxxxxxxx; assign wn_im[620] = 32'hxxxxxxxx; // 620 -0.788 0.615 +assign wn_re[621] = 32'h9B93A641; assign wn_im[621] = 32'h4F5E08E3; // 621 -0.785 0.620 +assign wn_re[622] = 32'hxxxxxxxx; assign wn_im[622] = 32'hxxxxxxxx; // 622 -0.781 0.625 +assign wn_re[623] = 32'hxxxxxxxx; assign wn_im[623] = 32'hxxxxxxxx; // 623 -0.777 0.630 +assign wn_re[624] = 32'h9D0DFE54; assign wn_im[624] = 32'h5133CC94; // 624 -0.773 0.634 +assign wn_re[625] = 32'hxxxxxxxx; assign wn_im[625] = 32'hxxxxxxxx; // 625 -0.769 0.639 +assign wn_re[626] = 32'hxxxxxxxx; assign wn_im[626] = 32'hxxxxxxxx; // 626 -0.765 0.644 +assign wn_re[627] = 32'h9E90EB94; assign wn_im[627] = 32'h53028518; // 627 -0.761 0.649 +assign wn_re[628] = 32'hxxxxxxxx; assign wn_im[628] = 32'hxxxxxxxx; // 628 -0.757 0.653 +assign wn_re[629] = 32'hxxxxxxxx; assign wn_im[629] = 32'hxxxxxxxx; // 629 -0.753 0.658 +assign wn_re[630] = 32'hA01C4C73; assign wn_im[630] = 32'h54CA0A4B; // 630 -0.749 0.662 +assign wn_re[631] = 32'hxxxxxxxx; assign wn_im[631] = 32'hxxxxxxxx; // 631 -0.745 0.667 +assign wn_re[632] = 32'hxxxxxxxx; assign wn_im[632] = 32'hxxxxxxxx; // 632 -0.741 0.672 +assign wn_re[633] = 32'hA1AFFEA3; assign wn_im[633] = 32'h568A34A9; // 633 -0.737 0.676 +assign wn_re[634] = 32'hxxxxxxxx; assign wn_im[634] = 32'hxxxxxxxx; // 634 -0.733 0.681 +assign wn_re[635] = 32'hxxxxxxxx; assign wn_im[635] = 32'hxxxxxxxx; // 635 -0.728 0.685 +assign wn_re[636] = 32'hA34BDF20; assign wn_im[636] = 32'h5842DD54; // 636 -0.724 0.690 +assign wn_re[637] = 32'hxxxxxxxx; assign wn_im[637] = 32'hxxxxxxxx; // 637 -0.720 0.694 +assign wn_re[638] = 32'hxxxxxxxx; assign wn_im[638] = 32'hxxxxxxxx; // 638 -0.716 0.698 +assign wn_re[639] = 32'hA4EFCA31; assign wn_im[639] = 32'h59F3DE12; // 639 -0.711 0.703 +assign wn_re[640] = 32'hxxxxxxxx; assign wn_im[640] = 32'hxxxxxxxx; // 640 -0.707 0.707 +assign wn_re[641] = 32'hxxxxxxxx; assign wn_im[641] = 32'hxxxxxxxx; // 641 -0.703 0.711 +assign wn_re[642] = 32'hA69B9B68; assign wn_im[642] = 32'h5B9D1154; // 642 -0.698 0.716 +assign wn_re[643] = 32'hxxxxxxxx; assign wn_im[643] = 32'hxxxxxxxx; // 643 -0.694 0.720 +assign wn_re[644] = 32'hxxxxxxxx; assign wn_im[644] = 32'hxxxxxxxx; // 644 -0.690 0.724 +assign wn_re[645] = 32'hA84F2DAA; assign wn_im[645] = 32'h5D3E5237; // 645 -0.685 0.728 +assign wn_re[646] = 32'hxxxxxxxx; assign wn_im[646] = 32'hxxxxxxxx; // 646 -0.681 0.733 +assign wn_re[647] = 32'hxxxxxxxx; assign wn_im[647] = 32'hxxxxxxxx; // 647 -0.676 0.737 +assign wn_re[648] = 32'hAA0A5B2E; assign wn_im[648] = 32'h5ED77C8A; // 648 -0.672 0.741 +assign wn_re[649] = 32'hxxxxxxxx; assign wn_im[649] = 32'hxxxxxxxx; // 649 -0.667 0.745 +assign wn_re[650] = 32'hxxxxxxxx; assign wn_im[650] = 32'hxxxxxxxx; // 650 -0.662 0.749 +assign wn_re[651] = 32'hABCCFD83; assign wn_im[651] = 32'h60686CCF; // 651 -0.658 0.753 +assign wn_re[652] = 32'hxxxxxxxx; assign wn_im[652] = 32'hxxxxxxxx; // 652 -0.653 0.757 +assign wn_re[653] = 32'hxxxxxxxx; assign wn_im[653] = 32'hxxxxxxxx; // 653 -0.649 0.761 +assign wn_re[654] = 32'hAD96ED92; assign wn_im[654] = 32'h61F1003F; // 654 -0.644 0.765 +assign wn_re[655] = 32'hxxxxxxxx; assign wn_im[655] = 32'hxxxxxxxx; // 655 -0.639 0.769 +assign wn_re[656] = 32'hxxxxxxxx; assign wn_im[656] = 32'hxxxxxxxx; // 656 -0.634 0.773 +assign wn_re[657] = 32'hAF6803A2; assign wn_im[657] = 32'h637114CC; // 657 -0.630 0.777 +assign wn_re[658] = 32'hxxxxxxxx; assign wn_im[658] = 32'hxxxxxxxx; // 658 -0.625 0.781 +assign wn_re[659] = 32'hxxxxxxxx; assign wn_im[659] = 32'hxxxxxxxx; // 659 -0.620 0.785 +assign wn_re[660] = 32'hB140175B; assign wn_im[660] = 32'h64E88926; // 660 -0.615 0.788 +assign wn_re[661] = 32'hxxxxxxxx; assign wn_im[661] = 32'hxxxxxxxx; // 661 -0.610 0.792 +assign wn_re[662] = 32'hxxxxxxxx; assign wn_im[662] = 32'hxxxxxxxx; // 662 -0.606 0.796 +assign wn_re[663] = 32'hB31EFFCC; assign wn_im[663] = 32'h66573CBB; // 663 -0.601 0.800 +assign wn_re[664] = 32'hxxxxxxxx; assign wn_im[664] = 32'hxxxxxxxx; // 664 -0.596 0.803 +assign wn_re[665] = 32'hxxxxxxxx; assign wn_im[665] = 32'hxxxxxxxx; // 665 -0.591 0.807 +assign wn_re[666] = 32'hB5049368; assign wn_im[666] = 32'h67BD0FBD; // 666 -0.586 0.810 +assign wn_re[667] = 32'hxxxxxxxx; assign wn_im[667] = 32'hxxxxxxxx; // 667 -0.581 0.814 +assign wn_re[668] = 32'hxxxxxxxx; assign wn_im[668] = 32'hxxxxxxxx; // 668 -0.576 0.818 +assign wn_re[669] = 32'hB6F0A812; assign wn_im[669] = 32'h6919E320; // 669 -0.571 0.821 +assign wn_re[670] = 32'hxxxxxxxx; assign wn_im[670] = 32'hxxxxxxxx; // 670 -0.566 0.825 +assign wn_re[671] = 32'hxxxxxxxx; assign wn_im[671] = 32'hxxxxxxxx; // 671 -0.561 0.828 +assign wn_re[672] = 32'hB8E31319; assign wn_im[672] = 32'h6A6D98A4; // 672 -0.556 0.831 +assign wn_re[673] = 32'hxxxxxxxx; assign wn_im[673] = 32'hxxxxxxxx; // 673 -0.550 0.835 +assign wn_re[674] = 32'hxxxxxxxx; assign wn_im[674] = 32'hxxxxxxxx; // 674 -0.545 0.838 +assign wn_re[675] = 32'hBADBA943; assign wn_im[675] = 32'h6BB812D1; // 675 -0.540 0.842 +assign wn_re[676] = 32'hxxxxxxxx; assign wn_im[676] = 32'hxxxxxxxx; // 676 -0.535 0.845 +assign wn_re[677] = 32'hxxxxxxxx; assign wn_im[677] = 32'hxxxxxxxx; // 677 -0.530 0.848 +assign wn_re[678] = 32'hBCDA3ECB; assign wn_im[678] = 32'h6CF934FC; // 678 -0.525 0.851 +assign wn_re[679] = 32'hxxxxxxxx; assign wn_im[679] = 32'hxxxxxxxx; // 679 -0.519 0.855 +assign wn_re[680] = 32'hxxxxxxxx; assign wn_im[680] = 32'hxxxxxxxx; // 680 -0.514 0.858 +assign wn_re[681] = 32'hBEDEA765; assign wn_im[681] = 32'h6E30E34A; // 681 -0.509 0.861 +assign wn_re[682] = 32'hxxxxxxxx; assign wn_im[682] = 32'hxxxxxxxx; // 682 -0.504 0.864 +assign wn_re[683] = 32'hxxxxxxxx; assign wn_im[683] = 32'hxxxxxxxx; // 683 -0.498 0.867 +assign wn_re[684] = 32'hC0E8B648; assign wn_im[684] = 32'h6F5F02B2; // 684 -0.493 0.870 +assign wn_re[685] = 32'hxxxxxxxx; assign wn_im[685] = 32'hxxxxxxxx; // 685 -0.488 0.873 +assign wn_re[686] = 32'hxxxxxxxx; assign wn_im[686] = 32'hxxxxxxxx; // 686 -0.482 0.876 +assign wn_re[687] = 32'hC2F83E2A; assign wn_im[687] = 32'h708378FF; // 687 -0.477 0.879 +assign wn_re[688] = 32'hxxxxxxxx; assign wn_im[688] = 32'hxxxxxxxx; // 688 -0.471 0.882 +assign wn_re[689] = 32'hxxxxxxxx; assign wn_im[689] = 32'hxxxxxxxx; // 689 -0.466 0.885 +assign wn_re[690] = 32'hC50D1149; assign wn_im[690] = 32'h719E2CD2; // 690 -0.461 0.888 +assign wn_re[691] = 32'hxxxxxxxx; assign wn_im[691] = 32'hxxxxxxxx; // 691 -0.455 0.890 +assign wn_re[692] = 32'hxxxxxxxx; assign wn_im[692] = 32'hxxxxxxxx; // 692 -0.450 0.893 +assign wn_re[693] = 32'hC727016D; assign wn_im[693] = 32'h72AF05A7; // 693 -0.444 0.896 +assign wn_re[694] = 32'hxxxxxxxx; assign wn_im[694] = 32'hxxxxxxxx; // 694 -0.439 0.899 +assign wn_re[695] = 32'hxxxxxxxx; assign wn_im[695] = 32'hxxxxxxxx; // 695 -0.433 0.901 +assign wn_re[696] = 32'hC945DFEC; assign wn_im[696] = 32'h73B5EBD1; // 696 -0.428 0.904 +assign wn_re[697] = 32'hxxxxxxxx; assign wn_im[697] = 32'hxxxxxxxx; // 697 -0.422 0.907 +assign wn_re[698] = 32'hxxxxxxxx; assign wn_im[698] = 32'hxxxxxxxx; // 698 -0.416 0.909 +assign wn_re[699] = 32'hCB697DB0; assign wn_im[699] = 32'h74B2C884; // 699 -0.411 0.912 +assign wn_re[700] = 32'hxxxxxxxx; assign wn_im[700] = 32'hxxxxxxxx; // 700 -0.405 0.914 +assign wn_re[701] = 32'hxxxxxxxx; assign wn_im[701] = 32'hxxxxxxxx; // 701 -0.400 0.917 +assign wn_re[702] = 32'hCD91AB39; assign wn_im[702] = 32'h75A585CF; // 702 -0.394 0.919 +assign wn_re[703] = 32'hxxxxxxxx; assign wn_im[703] = 32'hxxxxxxxx; // 703 -0.388 0.922 +assign wn_re[704] = 32'hxxxxxxxx; assign wn_im[704] = 32'hxxxxxxxx; // 704 -0.383 0.924 +assign wn_re[705] = 32'hCFBE389F; assign wn_im[705] = 32'h768E0EA6; // 705 -0.377 0.926 +assign wn_re[706] = 32'hxxxxxxxx; assign wn_im[706] = 32'hxxxxxxxx; // 706 -0.371 0.929 +assign wn_re[707] = 32'hxxxxxxxx; assign wn_im[707] = 32'hxxxxxxxx; // 707 -0.366 0.931 +assign wn_re[708] = 32'hD1EEF59E; assign wn_im[708] = 32'h776C4EDB; // 708 -0.360 0.933 +assign wn_re[709] = 32'hxxxxxxxx; assign wn_im[709] = 32'hxxxxxxxx; // 709 -0.354 0.935 +assign wn_re[710] = 32'hxxxxxxxx; assign wn_im[710] = 32'hxxxxxxxx; // 710 -0.348 0.937 +assign wn_re[711] = 32'hD423B191; assign wn_im[711] = 32'h78403329; // 711 -0.343 0.939 +assign wn_re[712] = 32'hxxxxxxxx; assign wn_im[712] = 32'hxxxxxxxx; // 712 -0.337 0.942 +assign wn_re[713] = 32'hxxxxxxxx; assign wn_im[713] = 32'hxxxxxxxx; // 713 -0.331 0.944 +assign wn_re[714] = 32'hD65C3B7B; assign wn_im[714] = 32'h7909A92D; // 714 -0.325 0.946 +assign wn_re[715] = 32'hxxxxxxxx; assign wn_im[715] = 32'hxxxxxxxx; // 715 -0.320 0.948 +assign wn_re[716] = 32'hxxxxxxxx; assign wn_im[716] = 32'hxxxxxxxx; // 716 -0.314 0.950 +assign wn_re[717] = 32'hD898620C; assign wn_im[717] = 32'h79C89F6E; // 717 -0.308 0.951 +assign wn_re[718] = 32'hxxxxxxxx; assign wn_im[718] = 32'hxxxxxxxx; // 718 -0.302 0.953 +assign wn_re[719] = 32'hxxxxxxxx; assign wn_im[719] = 32'hxxxxxxxx; // 719 -0.296 0.955 +assign wn_re[720] = 32'hDAD7F3A2; assign wn_im[720] = 32'h7A7D055B; // 720 -0.290 0.957 +assign wn_re[721] = 32'hxxxxxxxx; assign wn_im[721] = 32'hxxxxxxxx; // 721 -0.284 0.959 +assign wn_re[722] = 32'hxxxxxxxx; assign wn_im[722] = 32'hxxxxxxxx; // 722 -0.279 0.960 +assign wn_re[723] = 32'hDD1ABE51; assign wn_im[723] = 32'h7B26CB4F; // 723 -0.273 0.962 +assign wn_re[724] = 32'hxxxxxxxx; assign wn_im[724] = 32'hxxxxxxxx; // 724 -0.267 0.964 +assign wn_re[725] = 32'hxxxxxxxx; assign wn_im[725] = 32'hxxxxxxxx; // 725 -0.261 0.965 +assign wn_re[726] = 32'hDF608FE4; assign wn_im[726] = 32'h7BC5E290; // 726 -0.255 0.967 +assign wn_re[727] = 32'hxxxxxxxx; assign wn_im[727] = 32'hxxxxxxxx; // 727 -0.249 0.969 +assign wn_re[728] = 32'hxxxxxxxx; assign wn_im[728] = 32'hxxxxxxxx; // 728 -0.243 0.970 +assign wn_re[729] = 32'hE1A935E2; assign wn_im[729] = 32'h7C5A3D50; // 729 -0.237 0.972 +assign wn_re[730] = 32'hxxxxxxxx; assign wn_im[730] = 32'hxxxxxxxx; // 730 -0.231 0.973 +assign wn_re[731] = 32'hxxxxxxxx; assign wn_im[731] = 32'hxxxxxxxx; // 731 -0.225 0.974 +assign wn_re[732] = 32'hE3F47D96; assign wn_im[732] = 32'h7CE3CEB2; // 732 -0.219 0.976 +assign wn_re[733] = 32'hxxxxxxxx; assign wn_im[733] = 32'hxxxxxxxx; // 733 -0.213 0.977 +assign wn_re[734] = 32'hxxxxxxxx; assign wn_im[734] = 32'hxxxxxxxx; // 734 -0.207 0.978 +assign wn_re[735] = 32'hE642340D; assign wn_im[735] = 32'h7D628AC6; // 735 -0.201 0.980 +assign wn_re[736] = 32'hxxxxxxxx; assign wn_im[736] = 32'hxxxxxxxx; // 736 -0.195 0.981 +assign wn_re[737] = 32'hxxxxxxxx; assign wn_im[737] = 32'hxxxxxxxx; // 737 -0.189 0.982 +assign wn_re[738] = 32'hE8922622; assign wn_im[738] = 32'h7DD6668F; // 738 -0.183 0.983 +assign wn_re[739] = 32'hxxxxxxxx; assign wn_im[739] = 32'hxxxxxxxx; // 739 -0.177 0.984 +assign wn_re[740] = 32'hxxxxxxxx; assign wn_im[740] = 32'hxxxxxxxx; // 740 -0.171 0.985 +assign wn_re[741] = 32'hEAE4207A; assign wn_im[741] = 32'h7E3F57FF; // 741 -0.165 0.986 +assign wn_re[742] = 32'hxxxxxxxx; assign wn_im[742] = 32'hxxxxxxxx; // 742 -0.159 0.987 +assign wn_re[743] = 32'hxxxxxxxx; assign wn_im[743] = 32'hxxxxxxxx; // 743 -0.153 0.988 +assign wn_re[744] = 32'hED37EF91; assign wn_im[744] = 32'h7E9D55FC; // 744 -0.147 0.989 +assign wn_re[745] = 32'hxxxxxxxx; assign wn_im[745] = 32'hxxxxxxxx; // 745 -0.141 0.990 +assign wn_re[746] = 32'hxxxxxxxx; assign wn_im[746] = 32'hxxxxxxxx; // 746 -0.135 0.991 +assign wn_re[747] = 32'hEF8D5FB8; assign wn_im[747] = 32'h7EF05860; // 747 -0.128 0.992 +assign wn_re[748] = 32'hxxxxxxxx; assign wn_im[748] = 32'hxxxxxxxx; // 748 -0.122 0.992 +assign wn_re[749] = 32'hxxxxxxxx; assign wn_im[749] = 32'hxxxxxxxx; // 749 -0.116 0.993 +assign wn_re[750] = 32'hF1E43D1C; assign wn_im[750] = 32'h7F3857F6; // 750 -0.110 0.994 +assign wn_re[751] = 32'hxxxxxxxx; assign wn_im[751] = 32'hxxxxxxxx; // 751 -0.104 0.995 +assign wn_re[752] = 32'hxxxxxxxx; assign wn_im[752] = 32'hxxxxxxxx; // 752 -0.098 0.995 +assign wn_re[753] = 32'hF43C53CB; assign wn_im[753] = 32'h7F754E80; // 753 -0.092 0.996 +assign wn_re[754] = 32'hxxxxxxxx; assign wn_im[754] = 32'hxxxxxxxx; // 754 -0.086 0.996 +assign wn_re[755] = 32'hxxxxxxxx; assign wn_im[755] = 32'hxxxxxxxx; // 755 -0.080 0.997 +assign wn_re[756] = 32'hF6956FB7; assign wn_im[756] = 32'h7FA736B4; // 756 -0.074 0.997 +assign wn_re[757] = 32'hxxxxxxxx; assign wn_im[757] = 32'hxxxxxxxx; // 757 -0.067 0.998 +assign wn_re[758] = 32'hxxxxxxxx; assign wn_im[758] = 32'hxxxxxxxx; // 758 -0.061 0.998 +assign wn_re[759] = 32'hF8EF5CBB; assign wn_im[759] = 32'h7FCE0C3E; // 759 -0.055 0.998 +assign wn_re[760] = 32'hxxxxxxxx; assign wn_im[760] = 32'hxxxxxxxx; // 760 -0.049 0.999 +assign wn_re[761] = 32'hxxxxxxxx; assign wn_im[761] = 32'hxxxxxxxx; // 761 -0.043 0.999 +assign wn_re[762] = 32'hFB49E6A3; assign wn_im[762] = 32'h7FE9CBC0; // 762 -0.037 0.999 +assign wn_re[763] = 32'hxxxxxxxx; assign wn_im[763] = 32'hxxxxxxxx; // 763 -0.031 1.000 +assign wn_re[764] = 32'hxxxxxxxx; assign wn_im[764] = 32'hxxxxxxxx; // 764 -0.025 1.000 +assign wn_re[765] = 32'hFDA4D929; assign wn_im[765] = 32'h7FFA72D1; // 765 -0.018 1.000 +assign wn_re[766] = 32'hxxxxxxxx; assign wn_im[766] = 32'hxxxxxxxx; // 766 -0.012 1.000 +assign wn_re[767] = 32'hxxxxxxxx; assign wn_im[767] = 32'hxxxxxxxx; // 767 -0.006 1.000 +assign wn_re[768] = 32'hxxxxxxxx; assign wn_im[768] = 32'hxxxxxxxx; // 768 -0.000 1.000 +assign wn_re[769] = 32'hxxxxxxxx; assign wn_im[769] = 32'hxxxxxxxx; // 769 0.006 1.000 +assign wn_re[770] = 32'hxxxxxxxx; assign wn_im[770] = 32'hxxxxxxxx; // 770 0.012 1.000 +assign wn_re[771] = 32'hxxxxxxxx; assign wn_im[771] = 32'hxxxxxxxx; // 771 0.018 1.000 +assign wn_re[772] = 32'hxxxxxxxx; assign wn_im[772] = 32'hxxxxxxxx; // 772 0.025 1.000 +assign wn_re[773] = 32'hxxxxxxxx; assign wn_im[773] = 32'hxxxxxxxx; // 773 0.031 1.000 +assign wn_re[774] = 32'hxxxxxxxx; assign wn_im[774] = 32'hxxxxxxxx; // 774 0.037 0.999 +assign wn_re[775] = 32'hxxxxxxxx; assign wn_im[775] = 32'hxxxxxxxx; // 775 0.043 0.999 +assign wn_re[776] = 32'hxxxxxxxx; assign wn_im[776] = 32'hxxxxxxxx; // 776 0.049 0.999 +assign wn_re[777] = 32'hxxxxxxxx; assign wn_im[777] = 32'hxxxxxxxx; // 777 0.055 0.998 +assign wn_re[778] = 32'hxxxxxxxx; assign wn_im[778] = 32'hxxxxxxxx; // 778 0.061 0.998 +assign wn_re[779] = 32'hxxxxxxxx; assign wn_im[779] = 32'hxxxxxxxx; // 779 0.067 0.998 +assign wn_re[780] = 32'hxxxxxxxx; assign wn_im[780] = 32'hxxxxxxxx; // 780 0.074 0.997 +assign wn_re[781] = 32'hxxxxxxxx; assign wn_im[781] = 32'hxxxxxxxx; // 781 0.080 0.997 +assign wn_re[782] = 32'hxxxxxxxx; assign wn_im[782] = 32'hxxxxxxxx; // 782 0.086 0.996 +assign wn_re[783] = 32'hxxxxxxxx; assign wn_im[783] = 32'hxxxxxxxx; // 783 0.092 0.996 +assign wn_re[784] = 32'hxxxxxxxx; assign wn_im[784] = 32'hxxxxxxxx; // 784 0.098 0.995 +assign wn_re[785] = 32'hxxxxxxxx; assign wn_im[785] = 32'hxxxxxxxx; // 785 0.104 0.995 +assign wn_re[786] = 32'hxxxxxxxx; assign wn_im[786] = 32'hxxxxxxxx; // 786 0.110 0.994 +assign wn_re[787] = 32'hxxxxxxxx; assign wn_im[787] = 32'hxxxxxxxx; // 787 0.116 0.993 +assign wn_re[788] = 32'hxxxxxxxx; assign wn_im[788] = 32'hxxxxxxxx; // 788 0.122 0.992 +assign wn_re[789] = 32'hxxxxxxxx; assign wn_im[789] = 32'hxxxxxxxx; // 789 0.128 0.992 +assign wn_re[790] = 32'hxxxxxxxx; assign wn_im[790] = 32'hxxxxxxxx; // 790 0.135 0.991 +assign wn_re[791] = 32'hxxxxxxxx; assign wn_im[791] = 32'hxxxxxxxx; // 791 0.141 0.990 +assign wn_re[792] = 32'hxxxxxxxx; assign wn_im[792] = 32'hxxxxxxxx; // 792 0.147 0.989 +assign wn_re[793] = 32'hxxxxxxxx; assign wn_im[793] = 32'hxxxxxxxx; // 793 0.153 0.988 +assign wn_re[794] = 32'hxxxxxxxx; assign wn_im[794] = 32'hxxxxxxxx; // 794 0.159 0.987 +assign wn_re[795] = 32'hxxxxxxxx; assign wn_im[795] = 32'hxxxxxxxx; // 795 0.165 0.986 +assign wn_re[796] = 32'hxxxxxxxx; assign wn_im[796] = 32'hxxxxxxxx; // 796 0.171 0.985 +assign wn_re[797] = 32'hxxxxxxxx; assign wn_im[797] = 32'hxxxxxxxx; // 797 0.177 0.984 +assign wn_re[798] = 32'hxxxxxxxx; assign wn_im[798] = 32'hxxxxxxxx; // 798 0.183 0.983 +assign wn_re[799] = 32'hxxxxxxxx; assign wn_im[799] = 32'hxxxxxxxx; // 799 0.189 0.982 +assign wn_re[800] = 32'hxxxxxxxx; assign wn_im[800] = 32'hxxxxxxxx; // 800 0.195 0.981 +assign wn_re[801] = 32'hxxxxxxxx; assign wn_im[801] = 32'hxxxxxxxx; // 801 0.201 0.980 +assign wn_re[802] = 32'hxxxxxxxx; assign wn_im[802] = 32'hxxxxxxxx; // 802 0.207 0.978 +assign wn_re[803] = 32'hxxxxxxxx; assign wn_im[803] = 32'hxxxxxxxx; // 803 0.213 0.977 +assign wn_re[804] = 32'hxxxxxxxx; assign wn_im[804] = 32'hxxxxxxxx; // 804 0.219 0.976 +assign wn_re[805] = 32'hxxxxxxxx; assign wn_im[805] = 32'hxxxxxxxx; // 805 0.225 0.974 +assign wn_re[806] = 32'hxxxxxxxx; assign wn_im[806] = 32'hxxxxxxxx; // 806 0.231 0.973 +assign wn_re[807] = 32'hxxxxxxxx; assign wn_im[807] = 32'hxxxxxxxx; // 807 0.237 0.972 +assign wn_re[808] = 32'hxxxxxxxx; assign wn_im[808] = 32'hxxxxxxxx; // 808 0.243 0.970 +assign wn_re[809] = 32'hxxxxxxxx; assign wn_im[809] = 32'hxxxxxxxx; // 809 0.249 0.969 +assign wn_re[810] = 32'hxxxxxxxx; assign wn_im[810] = 32'hxxxxxxxx; // 810 0.255 0.967 +assign wn_re[811] = 32'hxxxxxxxx; assign wn_im[811] = 32'hxxxxxxxx; // 811 0.261 0.965 +assign wn_re[812] = 32'hxxxxxxxx; assign wn_im[812] = 32'hxxxxxxxx; // 812 0.267 0.964 +assign wn_re[813] = 32'hxxxxxxxx; assign wn_im[813] = 32'hxxxxxxxx; // 813 0.273 0.962 +assign wn_re[814] = 32'hxxxxxxxx; assign wn_im[814] = 32'hxxxxxxxx; // 814 0.279 0.960 +assign wn_re[815] = 32'hxxxxxxxx; assign wn_im[815] = 32'hxxxxxxxx; // 815 0.284 0.959 +assign wn_re[816] = 32'hxxxxxxxx; assign wn_im[816] = 32'hxxxxxxxx; // 816 0.290 0.957 +assign wn_re[817] = 32'hxxxxxxxx; assign wn_im[817] = 32'hxxxxxxxx; // 817 0.296 0.955 +assign wn_re[818] = 32'hxxxxxxxx; assign wn_im[818] = 32'hxxxxxxxx; // 818 0.302 0.953 +assign wn_re[819] = 32'hxxxxxxxx; assign wn_im[819] = 32'hxxxxxxxx; // 819 0.308 0.951 +assign wn_re[820] = 32'hxxxxxxxx; assign wn_im[820] = 32'hxxxxxxxx; // 820 0.314 0.950 +assign wn_re[821] = 32'hxxxxxxxx; assign wn_im[821] = 32'hxxxxxxxx; // 821 0.320 0.948 +assign wn_re[822] = 32'hxxxxxxxx; assign wn_im[822] = 32'hxxxxxxxx; // 822 0.325 0.946 +assign wn_re[823] = 32'hxxxxxxxx; assign wn_im[823] = 32'hxxxxxxxx; // 823 0.331 0.944 +assign wn_re[824] = 32'hxxxxxxxx; assign wn_im[824] = 32'hxxxxxxxx; // 824 0.337 0.942 +assign wn_re[825] = 32'hxxxxxxxx; assign wn_im[825] = 32'hxxxxxxxx; // 825 0.343 0.939 +assign wn_re[826] = 32'hxxxxxxxx; assign wn_im[826] = 32'hxxxxxxxx; // 826 0.348 0.937 +assign wn_re[827] = 32'hxxxxxxxx; assign wn_im[827] = 32'hxxxxxxxx; // 827 0.354 0.935 +assign wn_re[828] = 32'hxxxxxxxx; assign wn_im[828] = 32'hxxxxxxxx; // 828 0.360 0.933 +assign wn_re[829] = 32'hxxxxxxxx; assign wn_im[829] = 32'hxxxxxxxx; // 829 0.366 0.931 +assign wn_re[830] = 32'hxxxxxxxx; assign wn_im[830] = 32'hxxxxxxxx; // 830 0.371 0.929 +assign wn_re[831] = 32'hxxxxxxxx; assign wn_im[831] = 32'hxxxxxxxx; // 831 0.377 0.926 +assign wn_re[832] = 32'hxxxxxxxx; assign wn_im[832] = 32'hxxxxxxxx; // 832 0.383 0.924 +assign wn_re[833] = 32'hxxxxxxxx; assign wn_im[833] = 32'hxxxxxxxx; // 833 0.388 0.922 +assign wn_re[834] = 32'hxxxxxxxx; assign wn_im[834] = 32'hxxxxxxxx; // 834 0.394 0.919 +assign wn_re[835] = 32'hxxxxxxxx; assign wn_im[835] = 32'hxxxxxxxx; // 835 0.400 0.917 +assign wn_re[836] = 32'hxxxxxxxx; assign wn_im[836] = 32'hxxxxxxxx; // 836 0.405 0.914 +assign wn_re[837] = 32'hxxxxxxxx; assign wn_im[837] = 32'hxxxxxxxx; // 837 0.411 0.912 +assign wn_re[838] = 32'hxxxxxxxx; assign wn_im[838] = 32'hxxxxxxxx; // 838 0.416 0.909 +assign wn_re[839] = 32'hxxxxxxxx; assign wn_im[839] = 32'hxxxxxxxx; // 839 0.422 0.907 +assign wn_re[840] = 32'hxxxxxxxx; assign wn_im[840] = 32'hxxxxxxxx; // 840 0.428 0.904 +assign wn_re[841] = 32'hxxxxxxxx; assign wn_im[841] = 32'hxxxxxxxx; // 841 0.433 0.901 +assign wn_re[842] = 32'hxxxxxxxx; assign wn_im[842] = 32'hxxxxxxxx; // 842 0.439 0.899 +assign wn_re[843] = 32'hxxxxxxxx; assign wn_im[843] = 32'hxxxxxxxx; // 843 0.444 0.896 +assign wn_re[844] = 32'hxxxxxxxx; assign wn_im[844] = 32'hxxxxxxxx; // 844 0.450 0.893 +assign wn_re[845] = 32'hxxxxxxxx; assign wn_im[845] = 32'hxxxxxxxx; // 845 0.455 0.890 +assign wn_re[846] = 32'hxxxxxxxx; assign wn_im[846] = 32'hxxxxxxxx; // 846 0.461 0.888 +assign wn_re[847] = 32'hxxxxxxxx; assign wn_im[847] = 32'hxxxxxxxx; // 847 0.466 0.885 +assign wn_re[848] = 32'hxxxxxxxx; assign wn_im[848] = 32'hxxxxxxxx; // 848 0.471 0.882 +assign wn_re[849] = 32'hxxxxxxxx; assign wn_im[849] = 32'hxxxxxxxx; // 849 0.477 0.879 +assign wn_re[850] = 32'hxxxxxxxx; assign wn_im[850] = 32'hxxxxxxxx; // 850 0.482 0.876 +assign wn_re[851] = 32'hxxxxxxxx; assign wn_im[851] = 32'hxxxxxxxx; // 851 0.488 0.873 +assign wn_re[852] = 32'hxxxxxxxx; assign wn_im[852] = 32'hxxxxxxxx; // 852 0.493 0.870 +assign wn_re[853] = 32'hxxxxxxxx; assign wn_im[853] = 32'hxxxxxxxx; // 853 0.498 0.867 +assign wn_re[854] = 32'hxxxxxxxx; assign wn_im[854] = 32'hxxxxxxxx; // 854 0.504 0.864 +assign wn_re[855] = 32'hxxxxxxxx; assign wn_im[855] = 32'hxxxxxxxx; // 855 0.509 0.861 +assign wn_re[856] = 32'hxxxxxxxx; assign wn_im[856] = 32'hxxxxxxxx; // 856 0.514 0.858 +assign wn_re[857] = 32'hxxxxxxxx; assign wn_im[857] = 32'hxxxxxxxx; // 857 0.519 0.855 +assign wn_re[858] = 32'hxxxxxxxx; assign wn_im[858] = 32'hxxxxxxxx; // 858 0.525 0.851 +assign wn_re[859] = 32'hxxxxxxxx; assign wn_im[859] = 32'hxxxxxxxx; // 859 0.530 0.848 +assign wn_re[860] = 32'hxxxxxxxx; assign wn_im[860] = 32'hxxxxxxxx; // 860 0.535 0.845 +assign wn_re[861] = 32'hxxxxxxxx; assign wn_im[861] = 32'hxxxxxxxx; // 861 0.540 0.842 +assign wn_re[862] = 32'hxxxxxxxx; assign wn_im[862] = 32'hxxxxxxxx; // 862 0.545 0.838 +assign wn_re[863] = 32'hxxxxxxxx; assign wn_im[863] = 32'hxxxxxxxx; // 863 0.550 0.835 +assign wn_re[864] = 32'hxxxxxxxx; assign wn_im[864] = 32'hxxxxxxxx; // 864 0.556 0.831 +assign wn_re[865] = 32'hxxxxxxxx; assign wn_im[865] = 32'hxxxxxxxx; // 865 0.561 0.828 +assign wn_re[866] = 32'hxxxxxxxx; assign wn_im[866] = 32'hxxxxxxxx; // 866 0.566 0.825 +assign wn_re[867] = 32'hxxxxxxxx; assign wn_im[867] = 32'hxxxxxxxx; // 867 0.571 0.821 +assign wn_re[868] = 32'hxxxxxxxx; assign wn_im[868] = 32'hxxxxxxxx; // 868 0.576 0.818 +assign wn_re[869] = 32'hxxxxxxxx; assign wn_im[869] = 32'hxxxxxxxx; // 869 0.581 0.814 +assign wn_re[870] = 32'hxxxxxxxx; assign wn_im[870] = 32'hxxxxxxxx; // 870 0.586 0.810 +assign wn_re[871] = 32'hxxxxxxxx; assign wn_im[871] = 32'hxxxxxxxx; // 871 0.591 0.807 +assign wn_re[872] = 32'hxxxxxxxx; assign wn_im[872] = 32'hxxxxxxxx; // 872 0.596 0.803 +assign wn_re[873] = 32'hxxxxxxxx; assign wn_im[873] = 32'hxxxxxxxx; // 873 0.601 0.800 +assign wn_re[874] = 32'hxxxxxxxx; assign wn_im[874] = 32'hxxxxxxxx; // 874 0.606 0.796 +assign wn_re[875] = 32'hxxxxxxxx; assign wn_im[875] = 32'hxxxxxxxx; // 875 0.610 0.792 +assign wn_re[876] = 32'hxxxxxxxx; assign wn_im[876] = 32'hxxxxxxxx; // 876 0.615 0.788 +assign wn_re[877] = 32'hxxxxxxxx; assign wn_im[877] = 32'hxxxxxxxx; // 877 0.620 0.785 +assign wn_re[878] = 32'hxxxxxxxx; assign wn_im[878] = 32'hxxxxxxxx; // 878 0.625 0.781 +assign wn_re[879] = 32'hxxxxxxxx; assign wn_im[879] = 32'hxxxxxxxx; // 879 0.630 0.777 +assign wn_re[880] = 32'hxxxxxxxx; assign wn_im[880] = 32'hxxxxxxxx; // 880 0.634 0.773 +assign wn_re[881] = 32'hxxxxxxxx; assign wn_im[881] = 32'hxxxxxxxx; // 881 0.639 0.769 +assign wn_re[882] = 32'hxxxxxxxx; assign wn_im[882] = 32'hxxxxxxxx; // 882 0.644 0.765 +assign wn_re[883] = 32'hxxxxxxxx; assign wn_im[883] = 32'hxxxxxxxx; // 883 0.649 0.761 +assign wn_re[884] = 32'hxxxxxxxx; assign wn_im[884] = 32'hxxxxxxxx; // 884 0.653 0.757 +assign wn_re[885] = 32'hxxxxxxxx; assign wn_im[885] = 32'hxxxxxxxx; // 885 0.658 0.753 +assign wn_re[886] = 32'hxxxxxxxx; assign wn_im[886] = 32'hxxxxxxxx; // 886 0.662 0.749 +assign wn_re[887] = 32'hxxxxxxxx; assign wn_im[887] = 32'hxxxxxxxx; // 887 0.667 0.745 +assign wn_re[888] = 32'hxxxxxxxx; assign wn_im[888] = 32'hxxxxxxxx; // 888 0.672 0.741 +assign wn_re[889] = 32'hxxxxxxxx; assign wn_im[889] = 32'hxxxxxxxx; // 889 0.676 0.737 +assign wn_re[890] = 32'hxxxxxxxx; assign wn_im[890] = 32'hxxxxxxxx; // 890 0.681 0.733 +assign wn_re[891] = 32'hxxxxxxxx; assign wn_im[891] = 32'hxxxxxxxx; // 891 0.685 0.728 +assign wn_re[892] = 32'hxxxxxxxx; assign wn_im[892] = 32'hxxxxxxxx; // 892 0.690 0.724 +assign wn_re[893] = 32'hxxxxxxxx; assign wn_im[893] = 32'hxxxxxxxx; // 893 0.694 0.720 +assign wn_re[894] = 32'hxxxxxxxx; assign wn_im[894] = 32'hxxxxxxxx; // 894 0.698 0.716 +assign wn_re[895] = 32'hxxxxxxxx; assign wn_im[895] = 32'hxxxxxxxx; // 895 0.703 0.711 +assign wn_re[896] = 32'hxxxxxxxx; assign wn_im[896] = 32'hxxxxxxxx; // 896 0.707 0.707 +assign wn_re[897] = 32'hxxxxxxxx; assign wn_im[897] = 32'hxxxxxxxx; // 897 0.711 0.703 +assign wn_re[898] = 32'hxxxxxxxx; assign wn_im[898] = 32'hxxxxxxxx; // 898 0.716 0.698 +assign wn_re[899] = 32'hxxxxxxxx; assign wn_im[899] = 32'hxxxxxxxx; // 899 0.720 0.694 +assign wn_re[900] = 32'hxxxxxxxx; assign wn_im[900] = 32'hxxxxxxxx; // 900 0.724 0.690 +assign wn_re[901] = 32'hxxxxxxxx; assign wn_im[901] = 32'hxxxxxxxx; // 901 0.728 0.685 +assign wn_re[902] = 32'hxxxxxxxx; assign wn_im[902] = 32'hxxxxxxxx; // 902 0.733 0.681 +assign wn_re[903] = 32'hxxxxxxxx; assign wn_im[903] = 32'hxxxxxxxx; // 903 0.737 0.676 +assign wn_re[904] = 32'hxxxxxxxx; assign wn_im[904] = 32'hxxxxxxxx; // 904 0.741 0.672 +assign wn_re[905] = 32'hxxxxxxxx; assign wn_im[905] = 32'hxxxxxxxx; // 905 0.745 0.667 +assign wn_re[906] = 32'hxxxxxxxx; assign wn_im[906] = 32'hxxxxxxxx; // 906 0.749 0.662 +assign wn_re[907] = 32'hxxxxxxxx; assign wn_im[907] = 32'hxxxxxxxx; // 907 0.753 0.658 +assign wn_re[908] = 32'hxxxxxxxx; assign wn_im[908] = 32'hxxxxxxxx; // 908 0.757 0.653 +assign wn_re[909] = 32'hxxxxxxxx; assign wn_im[909] = 32'hxxxxxxxx; // 909 0.761 0.649 +assign wn_re[910] = 32'hxxxxxxxx; assign wn_im[910] = 32'hxxxxxxxx; // 910 0.765 0.644 +assign wn_re[911] = 32'hxxxxxxxx; assign wn_im[911] = 32'hxxxxxxxx; // 911 0.769 0.639 +assign wn_re[912] = 32'hxxxxxxxx; assign wn_im[912] = 32'hxxxxxxxx; // 912 0.773 0.634 +assign wn_re[913] = 32'hxxxxxxxx; assign wn_im[913] = 32'hxxxxxxxx; // 913 0.777 0.630 +assign wn_re[914] = 32'hxxxxxxxx; assign wn_im[914] = 32'hxxxxxxxx; // 914 0.781 0.625 +assign wn_re[915] = 32'hxxxxxxxx; assign wn_im[915] = 32'hxxxxxxxx; // 915 0.785 0.620 +assign wn_re[916] = 32'hxxxxxxxx; assign wn_im[916] = 32'hxxxxxxxx; // 916 0.788 0.615 +assign wn_re[917] = 32'hxxxxxxxx; assign wn_im[917] = 32'hxxxxxxxx; // 917 0.792 0.610 +assign wn_re[918] = 32'hxxxxxxxx; assign wn_im[918] = 32'hxxxxxxxx; // 918 0.796 0.606 +assign wn_re[919] = 32'hxxxxxxxx; assign wn_im[919] = 32'hxxxxxxxx; // 919 0.800 0.601 +assign wn_re[920] = 32'hxxxxxxxx; assign wn_im[920] = 32'hxxxxxxxx; // 920 0.803 0.596 +assign wn_re[921] = 32'hxxxxxxxx; assign wn_im[921] = 32'hxxxxxxxx; // 921 0.807 0.591 +assign wn_re[922] = 32'hxxxxxxxx; assign wn_im[922] = 32'hxxxxxxxx; // 922 0.810 0.586 +assign wn_re[923] = 32'hxxxxxxxx; assign wn_im[923] = 32'hxxxxxxxx; // 923 0.814 0.581 +assign wn_re[924] = 32'hxxxxxxxx; assign wn_im[924] = 32'hxxxxxxxx; // 924 0.818 0.576 +assign wn_re[925] = 32'hxxxxxxxx; assign wn_im[925] = 32'hxxxxxxxx; // 925 0.821 0.571 +assign wn_re[926] = 32'hxxxxxxxx; assign wn_im[926] = 32'hxxxxxxxx; // 926 0.825 0.566 +assign wn_re[927] = 32'hxxxxxxxx; assign wn_im[927] = 32'hxxxxxxxx; // 927 0.828 0.561 +assign wn_re[928] = 32'hxxxxxxxx; assign wn_im[928] = 32'hxxxxxxxx; // 928 0.831 0.556 +assign wn_re[929] = 32'hxxxxxxxx; assign wn_im[929] = 32'hxxxxxxxx; // 929 0.835 0.550 +assign wn_re[930] = 32'hxxxxxxxx; assign wn_im[930] = 32'hxxxxxxxx; // 930 0.838 0.545 +assign wn_re[931] = 32'hxxxxxxxx; assign wn_im[931] = 32'hxxxxxxxx; // 931 0.842 0.540 +assign wn_re[932] = 32'hxxxxxxxx; assign wn_im[932] = 32'hxxxxxxxx; // 932 0.845 0.535 +assign wn_re[933] = 32'hxxxxxxxx; assign wn_im[933] = 32'hxxxxxxxx; // 933 0.848 0.530 +assign wn_re[934] = 32'hxxxxxxxx; assign wn_im[934] = 32'hxxxxxxxx; // 934 0.851 0.525 +assign wn_re[935] = 32'hxxxxxxxx; assign wn_im[935] = 32'hxxxxxxxx; // 935 0.855 0.519 +assign wn_re[936] = 32'hxxxxxxxx; assign wn_im[936] = 32'hxxxxxxxx; // 936 0.858 0.514 +assign wn_re[937] = 32'hxxxxxxxx; assign wn_im[937] = 32'hxxxxxxxx; // 937 0.861 0.509 +assign wn_re[938] = 32'hxxxxxxxx; assign wn_im[938] = 32'hxxxxxxxx; // 938 0.864 0.504 +assign wn_re[939] = 32'hxxxxxxxx; assign wn_im[939] = 32'hxxxxxxxx; // 939 0.867 0.498 +assign wn_re[940] = 32'hxxxxxxxx; assign wn_im[940] = 32'hxxxxxxxx; // 940 0.870 0.493 +assign wn_re[941] = 32'hxxxxxxxx; assign wn_im[941] = 32'hxxxxxxxx; // 941 0.873 0.488 +assign wn_re[942] = 32'hxxxxxxxx; assign wn_im[942] = 32'hxxxxxxxx; // 942 0.876 0.482 +assign wn_re[943] = 32'hxxxxxxxx; assign wn_im[943] = 32'hxxxxxxxx; // 943 0.879 0.477 +assign wn_re[944] = 32'hxxxxxxxx; assign wn_im[944] = 32'hxxxxxxxx; // 944 0.882 0.471 +assign wn_re[945] = 32'hxxxxxxxx; assign wn_im[945] = 32'hxxxxxxxx; // 945 0.885 0.466 +assign wn_re[946] = 32'hxxxxxxxx; assign wn_im[946] = 32'hxxxxxxxx; // 946 0.888 0.461 +assign wn_re[947] = 32'hxxxxxxxx; assign wn_im[947] = 32'hxxxxxxxx; // 947 0.890 0.455 +assign wn_re[948] = 32'hxxxxxxxx; assign wn_im[948] = 32'hxxxxxxxx; // 948 0.893 0.450 +assign wn_re[949] = 32'hxxxxxxxx; assign wn_im[949] = 32'hxxxxxxxx; // 949 0.896 0.444 +assign wn_re[950] = 32'hxxxxxxxx; assign wn_im[950] = 32'hxxxxxxxx; // 950 0.899 0.439 +assign wn_re[951] = 32'hxxxxxxxx; assign wn_im[951] = 32'hxxxxxxxx; // 951 0.901 0.433 +assign wn_re[952] = 32'hxxxxxxxx; assign wn_im[952] = 32'hxxxxxxxx; // 952 0.904 0.428 +assign wn_re[953] = 32'hxxxxxxxx; assign wn_im[953] = 32'hxxxxxxxx; // 953 0.907 0.422 +assign wn_re[954] = 32'hxxxxxxxx; assign wn_im[954] = 32'hxxxxxxxx; // 954 0.909 0.416 +assign wn_re[955] = 32'hxxxxxxxx; assign wn_im[955] = 32'hxxxxxxxx; // 955 0.912 0.411 +assign wn_re[956] = 32'hxxxxxxxx; assign wn_im[956] = 32'hxxxxxxxx; // 956 0.914 0.405 +assign wn_re[957] = 32'hxxxxxxxx; assign wn_im[957] = 32'hxxxxxxxx; // 957 0.917 0.400 +assign wn_re[958] = 32'hxxxxxxxx; assign wn_im[958] = 32'hxxxxxxxx; // 958 0.919 0.394 +assign wn_re[959] = 32'hxxxxxxxx; assign wn_im[959] = 32'hxxxxxxxx; // 959 0.922 0.388 +assign wn_re[960] = 32'hxxxxxxxx; assign wn_im[960] = 32'hxxxxxxxx; // 960 0.924 0.383 +assign wn_re[961] = 32'hxxxxxxxx; assign wn_im[961] = 32'hxxxxxxxx; // 961 0.926 0.377 +assign wn_re[962] = 32'hxxxxxxxx; assign wn_im[962] = 32'hxxxxxxxx; // 962 0.929 0.371 +assign wn_re[963] = 32'hxxxxxxxx; assign wn_im[963] = 32'hxxxxxxxx; // 963 0.931 0.366 +assign wn_re[964] = 32'hxxxxxxxx; assign wn_im[964] = 32'hxxxxxxxx; // 964 0.933 0.360 +assign wn_re[965] = 32'hxxxxxxxx; assign wn_im[965] = 32'hxxxxxxxx; // 965 0.935 0.354 +assign wn_re[966] = 32'hxxxxxxxx; assign wn_im[966] = 32'hxxxxxxxx; // 966 0.937 0.348 +assign wn_re[967] = 32'hxxxxxxxx; assign wn_im[967] = 32'hxxxxxxxx; // 967 0.939 0.343 +assign wn_re[968] = 32'hxxxxxxxx; assign wn_im[968] = 32'hxxxxxxxx; // 968 0.942 0.337 +assign wn_re[969] = 32'hxxxxxxxx; assign wn_im[969] = 32'hxxxxxxxx; // 969 0.944 0.331 +assign wn_re[970] = 32'hxxxxxxxx; assign wn_im[970] = 32'hxxxxxxxx; // 970 0.946 0.325 +assign wn_re[971] = 32'hxxxxxxxx; assign wn_im[971] = 32'hxxxxxxxx; // 971 0.948 0.320 +assign wn_re[972] = 32'hxxxxxxxx; assign wn_im[972] = 32'hxxxxxxxx; // 972 0.950 0.314 +assign wn_re[973] = 32'hxxxxxxxx; assign wn_im[973] = 32'hxxxxxxxx; // 973 0.951 0.308 +assign wn_re[974] = 32'hxxxxxxxx; assign wn_im[974] = 32'hxxxxxxxx; // 974 0.953 0.302 +assign wn_re[975] = 32'hxxxxxxxx; assign wn_im[975] = 32'hxxxxxxxx; // 975 0.955 0.296 +assign wn_re[976] = 32'hxxxxxxxx; assign wn_im[976] = 32'hxxxxxxxx; // 976 0.957 0.290 +assign wn_re[977] = 32'hxxxxxxxx; assign wn_im[977] = 32'hxxxxxxxx; // 977 0.959 0.284 +assign wn_re[978] = 32'hxxxxxxxx; assign wn_im[978] = 32'hxxxxxxxx; // 978 0.960 0.279 +assign wn_re[979] = 32'hxxxxxxxx; assign wn_im[979] = 32'hxxxxxxxx; // 979 0.962 0.273 +assign wn_re[980] = 32'hxxxxxxxx; assign wn_im[980] = 32'hxxxxxxxx; // 980 0.964 0.267 +assign wn_re[981] = 32'hxxxxxxxx; assign wn_im[981] = 32'hxxxxxxxx; // 981 0.965 0.261 +assign wn_re[982] = 32'hxxxxxxxx; assign wn_im[982] = 32'hxxxxxxxx; // 982 0.967 0.255 +assign wn_re[983] = 32'hxxxxxxxx; assign wn_im[983] = 32'hxxxxxxxx; // 983 0.969 0.249 +assign wn_re[984] = 32'hxxxxxxxx; assign wn_im[984] = 32'hxxxxxxxx; // 984 0.970 0.243 +assign wn_re[985] = 32'hxxxxxxxx; assign wn_im[985] = 32'hxxxxxxxx; // 985 0.972 0.237 +assign wn_re[986] = 32'hxxxxxxxx; assign wn_im[986] = 32'hxxxxxxxx; // 986 0.973 0.231 +assign wn_re[987] = 32'hxxxxxxxx; assign wn_im[987] = 32'hxxxxxxxx; // 987 0.974 0.225 +assign wn_re[988] = 32'hxxxxxxxx; assign wn_im[988] = 32'hxxxxxxxx; // 988 0.976 0.219 +assign wn_re[989] = 32'hxxxxxxxx; assign wn_im[989] = 32'hxxxxxxxx; // 989 0.977 0.213 +assign wn_re[990] = 32'hxxxxxxxx; assign wn_im[990] = 32'hxxxxxxxx; // 990 0.978 0.207 +assign wn_re[991] = 32'hxxxxxxxx; assign wn_im[991] = 32'hxxxxxxxx; // 991 0.980 0.201 +assign wn_re[992] = 32'hxxxxxxxx; assign wn_im[992] = 32'hxxxxxxxx; // 992 0.981 0.195 +assign wn_re[993] = 32'hxxxxxxxx; assign wn_im[993] = 32'hxxxxxxxx; // 993 0.982 0.189 +assign wn_re[994] = 32'hxxxxxxxx; assign wn_im[994] = 32'hxxxxxxxx; // 994 0.983 0.183 +assign wn_re[995] = 32'hxxxxxxxx; assign wn_im[995] = 32'hxxxxxxxx; // 995 0.984 0.177 +assign wn_re[996] = 32'hxxxxxxxx; assign wn_im[996] = 32'hxxxxxxxx; // 996 0.985 0.171 +assign wn_re[997] = 32'hxxxxxxxx; assign wn_im[997] = 32'hxxxxxxxx; // 997 0.986 0.165 +assign wn_re[998] = 32'hxxxxxxxx; assign wn_im[998] = 32'hxxxxxxxx; // 998 0.987 0.159 +assign wn_re[999] = 32'hxxxxxxxx; assign wn_im[999] = 32'hxxxxxxxx; // 999 0.988 0.153 +assign wn_re[1000] = 32'hxxxxxxxx; assign wn_im[1000] = 32'hxxxxxxxx; // 1000 0.989 0.147 +assign wn_re[1001] = 32'hxxxxxxxx; assign wn_im[1001] = 32'hxxxxxxxx; // 1001 0.990 0.141 +assign wn_re[1002] = 32'hxxxxxxxx; assign wn_im[1002] = 32'hxxxxxxxx; // 1002 0.991 0.135 +assign wn_re[1003] = 32'hxxxxxxxx; assign wn_im[1003] = 32'hxxxxxxxx; // 1003 0.992 0.128 +assign wn_re[1004] = 32'hxxxxxxxx; assign wn_im[1004] = 32'hxxxxxxxx; // 1004 0.992 0.122 +assign wn_re[1005] = 32'hxxxxxxxx; assign wn_im[1005] = 32'hxxxxxxxx; // 1005 0.993 0.116 +assign wn_re[1006] = 32'hxxxxxxxx; assign wn_im[1006] = 32'hxxxxxxxx; // 1006 0.994 0.110 +assign wn_re[1007] = 32'hxxxxxxxx; assign wn_im[1007] = 32'hxxxxxxxx; // 1007 0.995 0.104 +assign wn_re[1008] = 32'hxxxxxxxx; assign wn_im[1008] = 32'hxxxxxxxx; // 1008 0.995 0.098 +assign wn_re[1009] = 32'hxxxxxxxx; assign wn_im[1009] = 32'hxxxxxxxx; // 1009 0.996 0.092 +assign wn_re[1010] = 32'hxxxxxxxx; assign wn_im[1010] = 32'hxxxxxxxx; // 1010 0.996 0.086 +assign wn_re[1011] = 32'hxxxxxxxx; assign wn_im[1011] = 32'hxxxxxxxx; // 1011 0.997 0.080 +assign wn_re[1012] = 32'hxxxxxxxx; assign wn_im[1012] = 32'hxxxxxxxx; // 1012 0.997 0.074 +assign wn_re[1013] = 32'hxxxxxxxx; assign wn_im[1013] = 32'hxxxxxxxx; // 1013 0.998 0.067 +assign wn_re[1014] = 32'hxxxxxxxx; assign wn_im[1014] = 32'hxxxxxxxx; // 1014 0.998 0.061 +assign wn_re[1015] = 32'hxxxxxxxx; assign wn_im[1015] = 32'hxxxxxxxx; // 1015 0.998 0.055 +assign wn_re[1016] = 32'hxxxxxxxx; assign wn_im[1016] = 32'hxxxxxxxx; // 1016 0.999 0.049 +assign wn_re[1017] = 32'hxxxxxxxx; assign wn_im[1017] = 32'hxxxxxxxx; // 1017 0.999 0.043 +assign wn_re[1018] = 32'hxxxxxxxx; assign wn_im[1018] = 32'hxxxxxxxx; // 1018 0.999 0.037 +assign wn_re[1019] = 32'hxxxxxxxx; assign wn_im[1019] = 32'hxxxxxxxx; // 1019 1.000 0.031 +assign wn_re[1020] = 32'hxxxxxxxx; assign wn_im[1020] = 32'hxxxxxxxx; // 1020 1.000 0.025 +assign wn_re[1021] = 32'hxxxxxxxx; assign wn_im[1021] = 32'hxxxxxxxx; // 1021 1.000 0.018 +assign wn_re[1022] = 32'hxxxxxxxx; assign wn_im[1022] = 32'hxxxxxxxx; // 1022 1.000 0.012 +assign wn_re[1023] = 32'hxxxxxxxx; assign wn_im[1023] = 32'hxxxxxxxx; // 1023 1.000 0.006 + +endmodule diff --git a/rtl/ip/fft/axi_fft_wrapper.v b/rtl/ip/fft/axi_fft_wrapper.v new file mode 100644 index 0000000..d67f2f9 --- /dev/null +++ b/rtl/ip/fft/axi_fft_wrapper.v @@ -0,0 +1,383 @@ +`define FFT_CSR_ADDR 16'hf000 +`define FFT_IN_RE_BASE 16'h1000 +`define FFT_IN_IM_BASE 16'h2000 +`define FFT_OUT_RE_BASE 16'h3000 +`define FFT_OUT_IM_BASE 16'h4000 + +module fft_controller #( + parameter FFT_LEN = 1024, // FFT处理长度 + parameter BRAM_RD_LATENCY = 2 // 适配 BRAM 的读延迟 (通常 Block RAM 开启输出寄存器为 2) +)( + input aclk, + input aresetn, + + // AXI Lite / AXI4 Wrapper ports + input [4 :0] s_awid, + input [31:0] s_awaddr, + input [7 :0] s_awlen, + input [2 :0] s_awsize, + input [1 :0] s_awburst, + input s_awlock, + input [3 :0] s_awcache, + input [2 :0] s_awprot, + input s_awvalid, + output reg s_awready, + input [4 :0] s_wid, + input [31:0] s_wdata, + input [3 :0] s_wstrb, + input s_wlast, + input s_wvalid, + output reg s_wready, + output [4 :0] s_bid, + output [1 :0] s_bresp, + output reg s_bvalid, + input s_bready, + + input [4 :0] s_arid, + input [31:0] s_araddr, + input [7 :0] s_arlen, + input [2 :0] s_arsize, + input [1 :0] s_arburst, + input s_arlock, + input [3 :0] s_arcache, + input [2 :0] s_arprot, + input s_arvalid, + output reg s_arready, + output [4 :0] s_rid, + output reg [31:0] s_rdata, + output [1 :0] s_rresp, + output reg s_rlast, + output reg s_rvalid, + input s_rready, + + output fft_finish +); + + // AXI Burst 内部寄存器 + reg [31:0] aw_addr_reg; + reg [1 :0] aw_burst_reg; + reg [4 :0] aw_id_reg; + + reg [31:0] ar_addr_reg; + reg [7 :0] ar_len_reg; + reg [1 :0] ar_burst_reg; + reg [4 :0] ar_id_reg; + reg [7 :0] ar_cnt; + + // 写通道状态机 (AW, W, B) + localparam W_IDLE = 2'd0; + localparam W_DATA = 2'd1; + localparam W_RESP = 2'd2; + reg [1:0] w_state; + + always @(posedge aclk) begin + if (~aresetn) begin + w_state <= W_IDLE; + s_awready <= 1'b1; + s_wready <= 1'b0; + s_bvalid <= 1'b0; + aw_addr_reg <= 32'h0; + aw_burst_reg <= 2'h0; + aw_id_reg <= 5'h0; + end else begin + case (w_state) + W_IDLE: begin + s_awready <= 1'b1; + if (s_awvalid && s_awready) begin + s_awready <= 1'b0; + s_wready <= 1'b1; + aw_addr_reg <= s_awaddr; + aw_burst_reg <= s_awburst; + aw_id_reg <= s_awid; + w_state <= W_DATA; + end + end + W_DATA: begin + // 接收到有效写数据 + if (s_wvalid && s_wready) begin + // INCR 模式下地址递增 + if (aw_burst_reg == 2'b01) begin + aw_addr_reg <= aw_addr_reg + 4; + end + // 若是最后一拍,跳转到发送响应 + if (s_wlast) begin + s_wready <= 1'b0; + s_bvalid <= 1'b1; + w_state <= W_RESP; + end + end + end + W_RESP: begin + if (s_bvalid && s_bready) begin + s_bvalid <= 1'b0; + s_awready <= 1'b1; // 准备接收下一次写请求 + w_state <= W_IDLE; + end + end + default: w_state <= W_IDLE; + endcase + end + end + + // 产生有效的写动作脉冲,用于触发 BRAM 写使能 + wire w_active = (w_state == W_DATA) && s_wvalid && s_wready; + assign s_bid = aw_id_reg; + assign s_bresp = 2'b00; + + // 读通道状态机(AR, R) + localparam R_IDLE = 2'd0; + localparam R_WAIT = 2'd1; + localparam R_DATA = 2'd2; + reg [1:0] r_state; + reg [3:0] r_wait_cnt; + + always @(posedge aclk) begin + if (~aresetn) begin + r_state <= R_IDLE; + s_arready <= 1'b1; + s_rvalid <= 1'b0; + s_rlast <= 1'b0; + ar_addr_reg <= 32'h0; + ar_len_reg <= 8'h0; + ar_burst_reg <= 2'h0; + ar_id_reg <= 5'h0; + ar_cnt <= 8'h0; + r_wait_cnt <= 4'h0; + end else begin + case (r_state) + R_IDLE: begin + s_arready <= 1'b1; + if (s_arvalid && s_arready) begin + s_arready <= 1'b0; + ar_addr_reg <= s_araddr; + ar_len_reg <= s_arlen; + ar_burst_reg <= s_arburst; + ar_id_reg <= s_arid; + ar_cnt <= 8'h0; + r_wait_cnt <= BRAM_RD_LATENCY; + r_state <= R_WAIT; // 进入等待以拉取第一笔 BRAM 数据 + end + end + R_WAIT: begin + // 等待 BRAM 固定潜伏期结束 + if (r_wait_cnt <= 1) begin + s_rvalid <= 1'b1; + s_rlast <= (ar_cnt == ar_len_reg); + r_state <= R_DATA; + r_wait_cnt <= 4'h0; + end else begin + r_wait_cnt <= r_wait_cnt - 1; + end + end + R_DATA: begin + // 数据被总线成功读取 + if (s_rvalid && s_rready) begin + if (ar_cnt == ar_len_reg) begin + // Burst 结束 + s_rvalid <= 1'b0; + s_rlast <= 1'b0; + s_arready <= 1'b1; + r_state <= R_IDLE; + end else begin + // 准备读取下一拍数据 + ar_cnt <= ar_cnt + 1; + // INCR 模式下地址递增 + if (ar_burst_reg == 2'b01) begin + ar_addr_reg <= ar_addr_reg + 4; + end + s_rvalid <= 1'b0; + s_rlast <= 1'b0; + r_wait_cnt <= BRAM_RD_LATENCY; + r_state <= R_WAIT; // 再次进入等待状态 + end + end + end + default: r_state <= R_IDLE; + endcase + end + end + + assign s_rid = ar_id_reg; + assign s_rresp = 2'b00; + + // 地址译码 + wire hit_in_re = (aw_addr_reg[15:12] == 4'h1); + wire hit_in_im = (aw_addr_reg[15:12] == 4'h2); + wire hit_out_re = (ar_addr_reg[15:12] == 4'h3); + wire hit_out_im = (ar_addr_reg[15:12] == 4'h4); + + // 寄存器控制 + reg [3:0] fft_ctrl; + reg [3:0] fft_status; + + wire [31:0] fft_csr = {24'h0, fft_ctrl, fft_status}; + // 只有发生有效的写握手且地址对应 CSR 时,才写入控制寄存器 + wire write_fft_csr = w_active && (aw_addr_reg[15:0] == `FFT_CSR_ADDR); + + // 状态机 + localparam IDLE = 2'd0; + localparam LOAD = 2'd1; + localparam WAIT_OUT = 2'd2; + localparam DONE = 2'd3; + + reg [1:0] state, next_state; + reg [10:0] in_cnt; + reg [10:0] out_cnt; + + wire do_en; + wire [31:0] do_re; + wire [31:0] do_im; + + always @(posedge aclk) begin + if (~aresetn) state <= IDLE; + else state <= next_state; + end + + always @(*) begin + case (state) + IDLE: if (fft_ctrl[0]) next_state = LOAD; else next_state = IDLE; + LOAD: if (in_cnt == FFT_LEN - 1) next_state = WAIT_OUT; else next_state = LOAD; + WAIT_OUT: if (do_en && out_cnt == FFT_LEN - 1) next_state = DONE; else next_state = WAIT_OUT; + DONE: next_state = IDLE; + default: next_state = IDLE; + endcase + end + + always @(posedge aclk) begin + if (~aresetn) begin + in_cnt <= 0; + out_cnt <= 0; + end else if (state == IDLE) begin + in_cnt <= 0; + out_cnt <= 0; + end else begin + if (state == LOAD) in_cnt <= in_cnt + 1; + if (do_en) out_cnt <= out_cnt + 1; + end + end + + // 更新寄存器与状态 + always @(posedge aclk) begin + if (~aresetn) begin + fft_ctrl <= 4'h0; + fft_status <= 4'h0; + end else begin + if (write_fft_csr) begin + fft_ctrl <= s_wdata[7:4]; + end else if (state != IDLE) begin + fft_ctrl[0] <= 1'b0; + end + + fft_status[0] <= (state != IDLE && state != DONE); + + if (write_fft_csr && s_wdata[4]) begin + fft_status[1] <= 1'b0; + end else if (state == DONE) begin + fft_status[1] <= 1'b1; + end + end + end + + assign fft_finish = fft_status[1]; + + // BRAM 接口连线 + wire [31:0] in_re_dout; + wire [31:0] in_im_dout; + wire [31:0] out_re_dout; + wire [31:0] out_im_dout; + + my_bram0 u_in0( + .clka (aclk), + .ena (w_active && hit_in_re), // 由 burst写逻辑产生 + .wea (1'b1), + .addra (aw_addr_reg[11:2]), // 取当前递增的突发写地址 + .dina (s_wdata), + + .clkb (aclk), + .enb (state == LOAD), + .addrb (in_cnt[9:0]), + .doutb (in_re_dout) + ); + + my_bram0 u_in1( + .clka (aclk), + .ena (w_active && hit_in_im), + .wea (1'b1), + .addra (aw_addr_reg[11:2]), + .dina (s_wdata), + + .clkb (aclk), + .enb (state == LOAD), + .addrb (in_cnt[9:0]), + .doutb (in_im_dout) + ); + + // 对于输出 BRAM,采用原先的位反转(Bit-reverse)读取逻辑 + wire [9:0] b_rd_addr = ar_addr_reg[11:2]; + wire [9:0] bit_reversed_index = { + b_rd_addr[0], b_rd_addr[1], b_rd_addr[2], b_rd_addr[3], b_rd_addr[4], + b_rd_addr[5], b_rd_addr[6], b_rd_addr[7], b_rd_addr[8], b_rd_addr[9] + }; + + my_bram0 u_out0( + .clka (aclk), + .ena (do_en), + .wea (1'b1), + .addra (out_cnt[9:0]), + .dina (do_re), + + .clkb (aclk), + .enb (r_state != R_IDLE), // 当处于读突发事务时始终使能 BRAM + .addrb (bit_reversed_index), + .doutb (out_re_dout) + ); + + my_bram0 u_out1( + .clka (aclk), + .ena (do_en), + .wea (1'b1), + .addra (out_cnt[9:0]), + .dina (do_im), + + .clkb (aclk), + .enb (r_state != R_IDLE), + .addrb (bit_reversed_index), + .doutb (out_im_dout) + ); + + // 支持 1 到 N 拍的读延迟,让 di_en 严格对齐 BRAM 的吐出数据 + reg [3:0] di_en_shift; + always @(posedge aclk) begin + if (~aresetn) di_en_shift <= 0; + else di_en_shift <= {di_en_shift[2:0], (state == LOAD)}; + end + + wire di_en_r = (BRAM_RD_LATENCY == 1) ? di_en_shift[0] : + (BRAM_RD_LATENCY == 2) ? di_en_shift[1] : + (BRAM_RD_LATENCY == 3) ? di_en_shift[2] : di_en_shift[3]; + + FFT #( + .WIDTH(32) + ) u_FFT ( + .clock (aclk), + .reset (~aresetn), + .di_en (di_en_r), + .di_re (in_re_dout), + .di_im (in_im_dout), + .do_en (do_en), + .do_re (do_re), + .do_im (do_im) + ); + + // 读取返回数据选择 + wire [31:0] rdata_d = + (ar_addr_reg[15:0] == `FFT_CSR_ADDR) ? fft_csr : + hit_out_re ? out_re_dout : + hit_out_im ? out_im_dout : + 32'h0; + + always @(*) begin + s_rdata = rdata_d; + end + +endmodule \ No newline at end of file diff --git a/rtl/ip/matmul/matmul_axi_slave.v b/rtl/ip/matmul/matmul_axi_slave.v new file mode 100644 index 0000000..c8d5d02 --- /dev/null +++ b/rtl/ip/matmul/matmul_axi_slave.v @@ -0,0 +1,303 @@ +module matmul_axi_slave ( + input clk, + input resetn, + + input [4:0] s_axi_awid, + input [31:0] s_axi_awaddr, + input [7:0] s_axi_awlen, + input [2:0] s_axi_awsize, + input [1:0] s_axi_awburst, + input s_axi_awlock, + input [3:0] s_axi_awcache, + input [2:0] s_axi_awprot, + input s_axi_awvalid, + output s_axi_awready, + + input [4:0] s_axi_wid, + input [31:0] s_axi_wdata, + input [3:0] s_axi_wstrb, + input s_axi_wlast, + input s_axi_wvalid, + output s_axi_wready, + + output reg [4:0] s_axi_bid, + output [1:0] s_axi_bresp, + output reg s_axi_bvalid, + input s_axi_bready, + + input [4:0] s_axi_arid, + input [31:0] s_axi_araddr, + input [7:0] s_axi_arlen, + input [2:0] s_axi_arsize, + input [1:0] s_axi_arburst, + input s_axi_arlock, + input [3:0] s_axi_arcache, + input [2:0] s_axi_arprot, + input s_axi_arvalid, + output s_axi_arready, + + output reg [4:0] s_axi_rid, + output reg [31:0] s_axi_rdata, + output [1:0] s_axi_rresp, + output s_axi_rlast, + output reg s_axi_rvalid, + input s_axi_rready +); + +localparam ADDR_CTRL = 12'h000; +localparam ADDR_STATUS = 12'h004; +localparam ADDR_SRC_BASE = 12'h008; +localparam ADDR_DST_BASE = 12'h00c; +localparam ADDR_GROUP_NUM = 12'h010; +localparam ADDR_A_BASE = 12'h020; +localparam ADDR_B_BASE = 12'h060; +localparam ADDR_C_BASE = 12'h0a0; + +reg [31:0] src_base; +reg [31:0] dst_base; +reg [31:0] group_num; +reg [31:0] a_data [0:15]; +reg [31:0] b_data [0:15]; +reg [65:0] c_data [0:15]; + +reg [31:0] awaddr_hold; +reg [4:0] awid_hold; +reg aw_hold_valid; +reg [31:0] wdata_hold; +reg [3:0] wstrb_hold; +reg w_hold_valid; + +reg busy; +reg done; +reg error; +reg [3:0] calc_index; + +wire write_fire; +wire start_fire; +wire [11:0] write_offset = awaddr_hold[11:0]; +wire [11:0] read_offset = s_axi_araddr[11:0]; + +assign s_axi_awready = !aw_hold_valid; +assign s_axi_wready = !w_hold_valid; +assign s_axi_bresp = 2'b00; +assign s_axi_arready = !s_axi_rvalid; +assign s_axi_rresp = 2'b00; +assign s_axi_rlast = 1'b1; + +assign write_fire = aw_hold_valid && w_hold_valid && !s_axi_bvalid; +assign start_fire = write_fire && (write_offset == ADDR_CTRL) && wdata_hold[0] && !busy; + +function [31:0] apply_wstrb; + input [31:0] old_value; + input [31:0] new_value; + input [3:0] strobe; + begin + apply_wstrb = old_value; + if (strobe[0]) apply_wstrb[7:0] = new_value[7:0]; + if (strobe[1]) apply_wstrb[15:8] = new_value[15:8]; + if (strobe[2]) apply_wstrb[23:16] = new_value[23:16]; + if (strobe[3]) apply_wstrb[31:24] = new_value[31:24]; + end +endfunction + +function [63:0] mul_u32_shift_add; + input [31:0] lhs; + input [31:0] rhs; + integer bit_index; + begin + mul_u32_shift_add = 64'b0; + for (bit_index = 0; bit_index < 32; bit_index = bit_index + 1) begin + if (rhs[bit_index]) begin + mul_u32_shift_add = mul_u32_shift_add + ({32'b0, lhs} << bit_index); + end + end + end +endfunction + +function [65:0] calc_c_element; + input [3:0] index; + reg [1:0] row; + reg [1:0] col; + begin + row = index[3:2]; + col = index[1:0]; + calc_c_element = {2'b0, mul_u32_shift_add(a_data[{row, 2'd0}], b_data[{2'd0, col}])} + + {2'b0, mul_u32_shift_add(a_data[{row, 2'd1}], b_data[{2'd1, col}])} + + {2'b0, mul_u32_shift_add(a_data[{row, 2'd2}], b_data[{2'd2, col}])} + + {2'b0, mul_u32_shift_add(a_data[{row, 2'd3}], b_data[{2'd3, col}])}; + end +endfunction + +function [31:0] c_read_word; + input [5:0] word_index; + begin + case (word_index) + 6'd0: c_read_word = c_data[0][31:0]; + 6'd1: c_read_word = c_data[0][63:32]; + 6'd2: c_read_word = {30'b0, c_data[0][65:64]}; + 6'd3: c_read_word = c_data[1][31:0]; + 6'd4: c_read_word = c_data[1][63:32]; + 6'd5: c_read_word = {30'b0, c_data[1][65:64]}; + 6'd6: c_read_word = c_data[2][31:0]; + 6'd7: c_read_word = c_data[2][63:32]; + 6'd8: c_read_word = {30'b0, c_data[2][65:64]}; + 6'd9: c_read_word = c_data[3][31:0]; + 6'd10: c_read_word = c_data[3][63:32]; + 6'd11: c_read_word = {30'b0, c_data[3][65:64]}; + 6'd12: c_read_word = c_data[4][31:0]; + 6'd13: c_read_word = c_data[4][63:32]; + 6'd14: c_read_word = {30'b0, c_data[4][65:64]}; + 6'd15: c_read_word = c_data[5][31:0]; + 6'd16: c_read_word = c_data[5][63:32]; + 6'd17: c_read_word = {30'b0, c_data[5][65:64]}; + 6'd18: c_read_word = c_data[6][31:0]; + 6'd19: c_read_word = c_data[6][63:32]; + 6'd20: c_read_word = {30'b0, c_data[6][65:64]}; + 6'd21: c_read_word = c_data[7][31:0]; + 6'd22: c_read_word = c_data[7][63:32]; + 6'd23: c_read_word = {30'b0, c_data[7][65:64]}; + 6'd24: c_read_word = c_data[8][31:0]; + 6'd25: c_read_word = c_data[8][63:32]; + 6'd26: c_read_word = {30'b0, c_data[8][65:64]}; + 6'd27: c_read_word = c_data[9][31:0]; + 6'd28: c_read_word = c_data[9][63:32]; + 6'd29: c_read_word = {30'b0, c_data[9][65:64]}; + 6'd30: c_read_word = c_data[10][31:0]; + 6'd31: c_read_word = c_data[10][63:32]; + 6'd32: c_read_word = {30'b0, c_data[10][65:64]}; + 6'd33: c_read_word = c_data[11][31:0]; + 6'd34: c_read_word = c_data[11][63:32]; + 6'd35: c_read_word = {30'b0, c_data[11][65:64]}; + 6'd36: c_read_word = c_data[12][31:0]; + 6'd37: c_read_word = c_data[12][63:32]; + 6'd38: c_read_word = {30'b0, c_data[12][65:64]}; + 6'd39: c_read_word = c_data[13][31:0]; + 6'd40: c_read_word = c_data[13][63:32]; + 6'd41: c_read_word = {30'b0, c_data[13][65:64]}; + 6'd42: c_read_word = c_data[14][31:0]; + 6'd43: c_read_word = c_data[14][63:32]; + 6'd44: c_read_word = {30'b0, c_data[14][65:64]}; + 6'd45: c_read_word = c_data[15][31:0]; + 6'd46: c_read_word = c_data[15][63:32]; + 6'd47: c_read_word = {30'b0, c_data[15][65:64]}; + default: c_read_word = 32'b0; + endcase + end +endfunction + +integer i; +always @(posedge clk) begin + if (!resetn) begin + src_base <= 32'b0; + dst_base <= 32'b0; + group_num <= 32'd1; + awaddr_hold <= 32'b0; + awid_hold <= 5'b0; + aw_hold_valid <= 1'b0; + wdata_hold <= 32'b0; + wstrb_hold <= 4'b0; + w_hold_valid <= 1'b0; + s_axi_bid <= 5'b0; + s_axi_bvalid <= 1'b0; + s_axi_rid <= 5'b0; + s_axi_rdata <= 32'b0; + s_axi_rvalid <= 1'b0; + busy <= 1'b0; + done <= 1'b0; + error <= 1'b0; + calc_index <= 4'b0; + + for (i = 0; i < 16; i = i + 1) begin + a_data[i] <= 32'b0; + b_data[i] <= 32'b0; + c_data[i] <= 66'b0; + end + end else begin + if (s_axi_awvalid && s_axi_awready) begin + awaddr_hold <= s_axi_awaddr; + awid_hold <= s_axi_awid; + aw_hold_valid <= 1'b1; + end + + if (s_axi_wvalid && s_axi_wready) begin + wdata_hold <= s_axi_wdata; + wstrb_hold <= s_axi_wstrb; + w_hold_valid <= 1'b1; + end + + if (s_axi_bvalid && s_axi_bready) begin + s_axi_bvalid <= 1'b0; + end + + if (write_fire) begin + s_axi_bid <= awid_hold; + s_axi_bvalid <= 1'b1; + aw_hold_valid <= 1'b0; + w_hold_valid <= 1'b0; + + if (write_offset == ADDR_SRC_BASE) begin + src_base <= apply_wstrb(src_base, wdata_hold, wstrb_hold); + end else if (write_offset == ADDR_DST_BASE) begin + dst_base <= apply_wstrb(dst_base, wdata_hold, wstrb_hold); + end else if (write_offset == ADDR_GROUP_NUM) begin + group_num <= apply_wstrb(group_num, wdata_hold, wstrb_hold); + end else if ((write_offset >= ADDR_A_BASE) && (write_offset < ADDR_B_BASE)) begin + a_data[(write_offset - ADDR_A_BASE) >> 2] <= + apply_wstrb(a_data[(write_offset - ADDR_A_BASE) >> 2], wdata_hold, wstrb_hold); + end else if ((write_offset >= ADDR_B_BASE) && (write_offset < ADDR_C_BASE)) begin + b_data[(write_offset - ADDR_B_BASE) >> 2] <= + apply_wstrb(b_data[(write_offset - ADDR_B_BASE) >> 2], wdata_hold, wstrb_hold); + end else if (write_offset == ADDR_STATUS) begin + if (wdata_hold[1]) done <= 1'b0; + if (wdata_hold[2]) error <= 1'b0; + end else if ((write_offset != ADDR_CTRL) && (write_offset < ADDR_C_BASE)) begin + error <= 1'b1; + end + end + + if (s_axi_arvalid && s_axi_arready) begin + s_axi_rid <= s_axi_arid; + s_axi_rvalid <= 1'b1; + + if (read_offset == ADDR_CTRL) begin + s_axi_rdata <= 32'b0; + end else if (read_offset == ADDR_STATUS) begin + s_axi_rdata <= {29'b0, error, done, busy}; + end else if (read_offset == ADDR_SRC_BASE) begin + s_axi_rdata <= src_base; + end else if (read_offset == ADDR_DST_BASE) begin + s_axi_rdata <= dst_base; + end else if (read_offset == ADDR_GROUP_NUM) begin + s_axi_rdata <= group_num; + end else if ((read_offset >= ADDR_A_BASE) && (read_offset < ADDR_B_BASE)) begin + s_axi_rdata <= a_data[(read_offset - ADDR_A_BASE) >> 2]; + end else if ((read_offset >= ADDR_B_BASE) && (read_offset < ADDR_C_BASE)) begin + s_axi_rdata <= b_data[(read_offset - ADDR_B_BASE) >> 2]; + end else if ((read_offset >= ADDR_C_BASE) && (read_offset < (ADDR_C_BASE + 12'h0c0))) begin + s_axi_rdata <= c_read_word((read_offset - ADDR_C_BASE) >> 2); + end else begin + s_axi_rdata <= 32'b0; + end + end else if (s_axi_rvalid && s_axi_rready) begin + s_axi_rvalid <= 1'b0; + end + + if (start_fire) begin + busy <= 1'b1; + done <= 1'b0; + error <= 1'b0; + calc_index <= 4'd0; + end else if (busy) begin + c_data[calc_index] <= calc_c_element(calc_index); + if (calc_index == 4'd15) begin + busy <= 1'b0; + done <= 1'b1; + calc_index <= 4'd0; + end else begin + calc_index <= calc_index + 4'd1; + end + end + end +end + +endmodule \ No newline at end of file diff --git a/rtl/ip/open-la500/LICENSE b/rtl/ip/open-la500/LICENSE new file mode 100644 index 0000000..ee58399 --- /dev/null +++ b/rtl/ip/open-la500/LICENSE @@ -0,0 +1,127 @@ + 木兰宽松许可证, 第2版 + + 木兰宽松许可证, 第2版 + 2020年1月 http://license.coscl.org.cn/MulanPSL2 + + + 您对“软件”的复制、使用、修改及分发受木兰宽松许可证,第2版(“本许可证”)的如下条款的约束: + + 0. 定义 + + “软件”是指由“贡献”构成的许可在“本许可证”下的程序和相关文档的集合。 + + “贡献”是指由任一“贡献者”许可在“本许可证”下的受版权法保护的作品。 + + “贡献者”是指将受版权法保护的作品许可在“本许可证”下的自然人或“法人实体”。 + + “法人实体”是指提交贡献的机构及其“关联实体”。 + + “关联实体”是指,对“本许可证”下的行为方而言,控制、受控制或与其共同受控制的机构,此处的控制是指有受控方或共同受控方至少50%直接或间接的投票权、资金或其他有价证券。 + + 1. 授予版权许可 + + 每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的版权许可,您可以复制、使用、修改、分发其“贡献”,不论修改与否。 + + 2. 授予专利许可 + + 每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的(根据本条规定撤销除外)专利许可,供您制造、委托制造、使用、许诺销售、销售、进口其“贡献”或以其他方式转移其“贡献”。前述专利许可仅限于“贡献者”现在或将来拥有或控制的其“贡献”本身或其“贡献”与许可“贡献”时的“软件”结合而将必然会侵犯的专利权利要求,不包括对“贡献”的修改或包含“贡献”的其他结合。如果您或您的“关联实体”直接或间接地,就“软件”或其中的“贡献”对任何人发起专利侵权诉讼(包括反诉或交叉诉讼)或其他专利维权行动,指控其侵犯专利权,则“本许可证”授予您对“软件”的专利许可自您提起诉讼或发起维权行动之日终止。 + + 3. 无商标许可 + + “本许可证”不提供对“贡献者”的商品名称、商标、服务标志或产品名称的商标许可,但您为满足第4条规定的声明义务而必须使用除外。 + + 4. 分发限制 + + 您可以在任何媒介中将“软件”以源程序形式或可执行形式重新分发,不论修改与否,但您必须向接收者提供“本许可证”的副本,并保留“软件”中的版权、商标、专利及免责声明。 + + 5. 免责声明与责任限制 + + “软件”及其中的“贡献”在提供时不带任何明示或默示的担保。在任何情况下,“贡献者”或版权所有者不对任何人因使用“软件”或其中的“贡献”而引发的任何直接或间接损失承担责任,不论因何种原因导致或者基于何种法律理论,即使其曾被建议有此种损失的可能性。 + + 6. 语言 + “本许可证”以中英文双语表述,中英文版本具有同等法律效力。如果中英文版本存在任何冲突不一致,以中文版为准。 + + 条款结束 + + 如何将木兰宽松许可证,第2版,应用到您的软件 + + 如果您希望将木兰宽松许可证,第2版,应用到您的新软件,为了方便接收者查阅,建议您完成如下三步: + + 1, 请您补充如下声明中的空白,包括软件名、软件的首次发表年份以及您作为版权人的名字; + + 2, 请您在软件包的一级目录下创建以“LICENSE”为名的文件,将整个许可证文本放入该文件中; + + 3, 请将如下声明文本放入每个源文件的头部注释中。 + + Copyright (c) [Year] [name of copyright holder] + [Software Name] is licensed under Mulan PSL v2. + You can use this software according to the terms and conditions of the Mulan PSL v2. + You may obtain a copy of Mulan PSL v2 at: + http://license.coscl.org.cn/MulanPSL2 + THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + See the Mulan PSL v2 for more details. + + + Mulan Permissive Software License,Version 2 + + Mulan Permissive Software License,Version 2 (Mulan PSL v2) + January 2020 http://license.coscl.org.cn/MulanPSL2 + + Your reproduction, use, modification and distribution of the Software shall be subject to Mulan PSL v2 (this License) with the following terms and conditions: + + 0. Definition + + Software means the program and related documents which are licensed under this License and comprise all Contribution(s). + + Contribution means the copyrightable work licensed by a particular Contributor under this License. + + Contributor means the Individual or Legal Entity who licenses its copyrightable work under this License. + + Legal Entity means the entity making a Contribution and all its Affiliates. + + Affiliates means entities that control, are controlled by, or are under common control with the acting entity under this License, ‘control’ means direct or indirect ownership of at least fifty percent (50%) of the voting power, capital or other securities of controlled or commonly controlled entity. + + 1. Grant of Copyright License + + Subject to the terms and conditions of this License, each Contributor hereby grants to you a perpetual, worldwide, royalty-free, non-exclusive, irrevocable copyright license to reproduce, use, modify, or distribute its Contribution, with modification or not. + + 2. Grant of Patent License + + Subject to the terms and conditions of this License, each Contributor hereby grants to you a perpetual, worldwide, royalty-free, non-exclusive, irrevocable (except for revocation under this Section) patent license to make, have made, use, offer for sale, sell, import or otherwise transfer its Contribution, where such patent license is only limited to the patent claims owned or controlled by such Contributor now or in future which will be necessarily infringed by its Contribution alone, or by combination of the Contribution with the Software to which the Contribution was contributed. The patent license shall not apply to any modification of the Contribution, and any other combination which includes the Contribution. If you or your Affiliates directly or indirectly institute patent litigation (including a cross claim or counterclaim in a litigation) or other patent enforcement activities against any individual or entity by alleging that the Software or any Contribution in it infringes patents, then any patent license granted to you under this License for the Software shall terminate as of the date such litigation or activity is filed or taken. + + 3. No Trademark License + + No trademark license is granted to use the trade names, trademarks, service marks, or product names of Contributor, except as required to fulfill notice requirements in Section 4. + + 4. Distribution Restriction + + You may distribute the Software in any medium with or without modification, whether in source or executable forms, provided that you provide recipients with a copy of this License and retain copyright, patent, trademark and disclaimer statements in the Software. + + 5. Disclaimer of Warranty and Limitation of Liability + + THE SOFTWARE AND CONTRIBUTION IN IT ARE PROVIDED WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED. IN NO EVENT SHALL ANY CONTRIBUTOR OR COPYRIGHT HOLDER BE LIABLE TO YOU FOR ANY DAMAGES, INCLUDING, BUT NOT LIMITED TO ANY DIRECT, OR INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING FROM YOUR USE OR INABILITY TO USE THE SOFTWARE OR THE CONTRIBUTION IN IT, NO MATTER HOW IT’S CAUSED OR BASED ON WHICH LEGAL THEORY, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + + 6. Language + + THIS LICENSE IS WRITTEN IN BOTH CHINESE AND ENGLISH, AND THE CHINESE VERSION AND ENGLISH VERSION SHALL HAVE THE SAME LEGAL EFFECT. IN THE CASE OF DIVERGENCE BETWEEN THE CHINESE AND ENGLISH VERSIONS, THE CHINESE VERSION SHALL PREVAIL. + + END OF THE TERMS AND CONDITIONS + + How to Apply the Mulan Permissive Software License,Version 2 (Mulan PSL v2) to Your Software + + To apply the Mulan PSL v2 to your work, for easy identification by recipients, you are suggested to complete following three steps: + + i Fill in the blanks in following statement, including insert your software name, the year of the first publication of your software, and your name identified as the copyright owner; + + ii Create a file named “LICENSE” which contains the whole context of this License in the first directory of your software package; + + iii Attach the statement to the appropriate annotated syntax at the beginning of each source file. + + + Copyright (c) [Year] [name of copyright holder] + [Software Name] is licensed under Mulan PSL v2. + You can use this software according to the terms and conditions of the Mulan PSL v2. + You may obtain a copy of Mulan PSL v2 at: + http://license.coscl.org.cn/MulanPSL2 + THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + See the Mulan PSL v2 for more details. diff --git a/rtl/ip/open-la500/README.md b/rtl/ip/open-la500/README.md new file mode 100644 index 0000000..beaa043 --- /dev/null +++ b/rtl/ip/open-la500/README.md @@ -0,0 +1,7 @@ +# openLA500 +## 前言 +openLA500是一款实现了龙芯架构32位精简版指令集(loongarch32r)的处理器核。其结构为单发射五级流水,分为取指、译码、执行、访存、写回五个流水级。并且含有两路组相连结构的指令和数据cache;32项tlb;以及简易的分支预测器。此外,处理器核对外为AXI接口,容易集成。 + +OpenLA500已经过流片验证,.13工艺下频率为100M,dhrystone,coremark分数分别为0.78 DMIPS/MHz(指令数有点高),2.75 coremark/Mhz。软件方面,uboot、linux 5.14、ucore、rt-thread等常用工具及内核已完成对openLA500的适配。 + +详细设计报告见doc目录。 diff --git a/rtl/ip/open-la500/addr_trans.v b/rtl/ip/open-la500/addr_trans.v new file mode 100644 index 0000000..e03fafb --- /dev/null +++ b/rtl/ip/open-la500/addr_trans.v @@ -0,0 +1,250 @@ +`include "csr.h" + +module addr_trans +#( + parameter TLBNUM = 32 +) +( + input clk , + input [ 9:0] asid , + //trans mode + input inst_addr_trans_en , + input data_addr_trans_en , + //inst addr trans + input inst_fetch , + input [31:0] inst_vaddr , + input inst_dmw0_en , + input inst_dmw1_en , + output [ 7:0] inst_index , + output [19:0] inst_tag , + output [ 3:0] inst_offset , + output inst_tlb_found , + output inst_tlb_v , + output inst_tlb_d , + output [ 1:0] inst_tlb_mat , + output [ 1:0] inst_tlb_plv , + //data addr trans + input data_fetch , + input [31:0] data_vaddr , + input data_dmw0_en , + input data_dmw1_en , + input cacop_op_mode_di , + output [ 7:0] data_index , + output [19:0] data_tag , + output [ 3:0] data_offset , + output data_tlb_found , + output [ 4:0] data_tlb_index , + output data_tlb_v , + output data_tlb_d , + output [ 1:0] data_tlb_mat , + output [ 1:0] data_tlb_plv , + //tlbwi tlbwr tlb write + input tlbfill_en , + input tlbwr_en , + input [ 4:0] rand_index , + input [31:0] tlbehi_in , + input [31:0] tlbelo0_in , + input [31:0] tlbelo1_in , + input [31:0] tlbidx_in , + input [ 5:0] ecode_in , + //tlbr tlb read + output [31:0] tlbehi_out , + output [31:0] tlbelo0_out , + output [31:0] tlbelo1_out , + output [31:0] tlbidx_out , + output [ 9:0] asid_out , + //invtlb + input invtlb_en , + input [ 9:0] invtlb_asid , + input [18:0] invtlb_vpn , + input [ 4:0] invtlb_op , + //from csr + input [31:0] csr_dmw0 , + input [31:0] csr_dmw1 , + input csr_da , + input csr_pg +); + +wire [18:0] s0_vppn ; +wire s0_odd_page ; +wire [ 5:0] s0_ps ; +wire [19:0] s0_ppn ; + +wire [18:0] s1_vppn ; +wire s1_odd_page ; +wire [ 5:0] s1_ps ; +wire [19:0] s1_ppn ; + +wire we ; +wire [ 4:0] w_index ; +wire [18:0] w_vppn ; +wire w_g ; +wire [ 5:0] w_ps ; +wire w_e ; +wire w_v0 ; +wire w_d0 ; +wire [ 1:0] w_mat0 ; +wire [ 1:0] w_plv0 ; +wire [19:0] w_ppn0 ; +wire w_v1 ; +wire w_d1 ; +wire [ 1:0] w_mat1 ; +wire [ 1:0] w_plv1 ; +wire [19:0] w_ppn1 ; + +wire [ 4:0] r_index ; +wire [18:0] r_vppn ; +wire [ 9:0] r_asid ; +wire r_g ; +wire [ 5:0] r_ps ; +wire r_e ; +wire r_v0 ; +wire r_d0 ; +wire [ 1:0] r_mat0 ; +wire [ 1:0] r_plv0 ; +wire [19:0] r_ppn0 ; +wire r_v1 ; +wire r_d1 ; +wire [ 1:0] r_mat1 ; +wire [ 1:0] r_plv1 ; +wire [19:0] r_ppn1 ; + +reg [31:0] inst_vaddr_buffer ; +reg [31:0] data_vaddr_buffer ; +wire [31:0] inst_paddr; +wire [31:0] data_paddr; + +wire pg_mode; +wire da_mode; + +always @(posedge clk) begin + if (inst_fetch) begin + inst_vaddr_buffer <= inst_vaddr; + end + + if (data_fetch) begin + data_vaddr_buffer <= data_vaddr; + end +end + +//trans search port sig +assign s0_vppn = inst_vaddr[31:13]; +assign s0_odd_page = inst_vaddr[12]; + +assign s1_vppn = data_vaddr[31:13]; +assign s1_odd_page = data_vaddr[12]; + +//trans write port sig +assign we = tlbfill_en || tlbwr_en; +assign w_index = ({5{tlbfill_en}} & rand_index) | ({5{tlbwr_en}} & tlbidx_in[`INDEX]); +assign w_vppn = tlbehi_in[`VPPN]; +assign w_g = tlbelo0_in[`TLB_G] && tlbelo1_in[`TLB_G]; +assign w_ps = tlbidx_in[`PS]; +assign w_e = (ecode_in == 6'h3f) ? 1'b1 : !tlbidx_in[`NE]; +assign w_v0 = tlbelo0_in[`TLB_V]; +assign w_d0 = tlbelo0_in[`TLB_D]; +assign w_plv0 = tlbelo0_in[`TLB_PLV]; +assign w_mat0 = tlbelo0_in[`TLB_MAT]; +assign w_ppn0 = tlbelo0_in[`TLB_PPN_EN]; +assign w_v1 = tlbelo1_in[`TLB_V]; +assign w_d1 = tlbelo1_in[`TLB_D]; +assign w_plv1 = tlbelo1_in[`TLB_PLV]; +assign w_mat1 = tlbelo1_in[`TLB_MAT]; +assign w_ppn1 = tlbelo1_in[`TLB_PPN_EN]; + +//trans read port sig +assign r_index = tlbidx_in[`INDEX]; +assign tlbehi_out = {r_vppn, 13'b0}; +assign tlbelo0_out = {4'b0, r_ppn0, 1'b0, r_g, r_mat0, r_plv0, r_d0, r_v0}; +assign tlbelo1_out = {4'b0, r_ppn1, 1'b0, r_g, r_mat1, r_plv1, r_d1, r_v1}; +assign tlbidx_out = {!r_e, 1'b0, r_ps, 24'b0}; //note do not write index +assign asid_out = r_asid; + +tlb_entry tlb_entry( + .clk (clk ), + // search port 0 + .s0_fetch (inst_fetch ), + .s0_vppn (s0_vppn ), + .s0_odd_page (s0_odd_page ), + .s0_asid (asid ), + .s0_found (inst_tlb_found ), + .s0_index (), + .s0_ps (s0_ps ), + .s0_ppn (s0_ppn ), + .s0_v (inst_tlb_v ), + .s0_d (inst_tlb_d ), + .s0_mat (inst_tlb_mat ), + .s0_plv (inst_tlb_plv ), + // search port 1 + .s1_fetch (data_fetch ), + .s1_vppn (s1_vppn ), + .s1_odd_page (s1_odd_page ), + .s1_asid (asid ), + .s1_found (data_tlb_found ), + .s1_index (data_tlb_index ), + .s1_ps (s1_ps ), + .s1_ppn (s1_ppn ), + .s1_v (data_tlb_v ), + .s1_d (data_tlb_d ), + .s1_mat (data_tlb_mat ), + .s1_plv (data_tlb_plv ), + // write port + .we (we ), + .w_index (w_index ), + .w_vppn (w_vppn ), + .w_asid (asid ), + .w_g (w_g ), + .w_ps (w_ps ), + .w_e (w_e ), + .w_v0 (w_v0 ), + .w_d0 (w_d0 ), + .w_plv0 (w_plv0 ), + .w_mat0 (w_mat0 ), + .w_ppn0 (w_ppn0 ), + .w_v1 (w_v1 ), + .w_d1 (w_d1 ), + .w_plv1 (w_plv1 ), + .w_mat1 (w_mat1 ), + .w_ppn1 (w_ppn1 ), + //read port + .r_index (r_index ), + .r_vppn (r_vppn ), + .r_asid (r_asid ), + .r_g (r_g ), + .r_ps (r_ps ), + .r_e (r_e ), + .r_v0 (r_v0 ), + .r_d0 (r_d0 ), + .r_mat0 (r_mat0 ), + .r_plv0 (r_plv0 ), + .r_ppn0 (r_ppn0 ), + .r_v1 (r_v1 ), + .r_d1 (r_d1 ), + .r_mat1 (r_mat1 ), + .r_plv1 (r_plv1 ), + .r_ppn1 (r_ppn1 ), + //invalid port + .inv_en (invtlb_en ), + .inv_op (invtlb_op ), + .inv_asid (invtlb_asid ), + .inv_vpn (invtlb_vpn ) +); + +assign pg_mode = !csr_da && csr_pg; +assign da_mode = csr_da && !csr_pg; + +assign inst_paddr = (pg_mode && inst_dmw0_en) ? {csr_dmw0[`PSEG], inst_vaddr_buffer[28:0]} : + (pg_mode && inst_dmw1_en) ? {csr_dmw1[`PSEG], inst_vaddr_buffer[28:0]} : inst_vaddr_buffer; + +assign inst_offset = inst_vaddr[3:0]; +assign inst_index = inst_vaddr[11:4]; +assign inst_tag = inst_addr_trans_en ? ((s0_ps == 6'd12) ? s0_ppn : {s0_ppn[19:10], inst_paddr[21:12]}) : inst_paddr[31:12]; + +assign data_paddr = (pg_mode && data_dmw0_en && !cacop_op_mode_di) ? {csr_dmw0[`PSEG], data_vaddr_buffer[28:0]} : + (pg_mode && data_dmw1_en && !cacop_op_mode_di) ? {csr_dmw1[`PSEG], data_vaddr_buffer[28:0]} : data_vaddr_buffer; + +assign data_offset = data_vaddr[3:0]; +assign data_index = data_vaddr[11:4]; +assign data_tag = data_addr_trans_en ? ((s1_ps == 6'd12) ? s1_ppn : {s1_ppn[19:10], data_paddr[21:12]}) : data_paddr[31:12]; + +endmodule diff --git a/rtl/ip/open-la500/alu.v b/rtl/ip/open-la500/alu.v new file mode 100644 index 0000000..8569fe9 --- /dev/null +++ b/rtl/ip/open-la500/alu.v @@ -0,0 +1,109 @@ +module alu( + input [13:0] alu_op, + input [31:0] alu_src1, + input [31:0] alu_src2, + output [31:0] alu_result +); + +wire op_add; +wire op_sub; +wire op_slt; +wire op_sltu; +wire op_and; +wire op_nor; +wire op_or; +wire op_xor; +wire op_sll; +wire op_srl; +wire op_sra; +wire op_lui; +wire op_andn; +wire op_orn; + +// control code decomposition +assign op_add = alu_op[ 0]; +assign op_sub = alu_op[ 1]; +assign op_slt = alu_op[ 2]; +assign op_sltu = alu_op[ 3]; +assign op_and = alu_op[ 4]; +assign op_nor = alu_op[ 5]; +assign op_or = alu_op[ 6]; +assign op_xor = alu_op[ 7]; +assign op_sll = alu_op[ 8]; +assign op_srl = alu_op[ 9]; +assign op_sra = alu_op[10]; +assign op_lui = alu_op[11]; +assign op_andn = alu_op[12]; +assign op_orn = alu_op[13]; + +wire [31:0] add_sub_result; +wire [31:0] slt_result; +wire [31:0] sltu_result; +wire [31:0] and_result; +wire [31:0] nor_result; +wire [31:0] or_result; +wire [31:0] xor_result; +wire [31:0] lui_result; +wire [31:0] sll_result; +wire [63:0] sr64_result; +wire [31:0] sr_result; +wire [31:0] andn_result; +wire [31:0] orn_result; + + +// 32-bit adder +wire [31:0] adder_a; +wire [31:0] adder_b; +wire adder_cin; +wire [31:0] adder_result; +wire adder_cout; + +assign adder_a = alu_src1; +assign adder_b = (op_sub | op_slt | op_sltu) ? ~alu_src2 : alu_src2; //src1 - src2 rj-rk +assign adder_cin = (op_sub | op_slt | op_sltu) ? 1'b1 : 1'b0; +assign {adder_cout, adder_result} = adder_a + adder_b + adder_cin; + +// ADD, SUB result +assign add_sub_result = adder_result; + +// SLT result +assign slt_result[31:1] = 31'b0; //rj < rk 1 +assign slt_result[0] = (alu_src1[31] & ~alu_src2[31]) + | ((alu_src1[31] ~^ alu_src2[31]) & adder_result[31]); + +// SLTU result +assign sltu_result[31:1] = 31'b0; +assign sltu_result[0] = ~adder_cout; + +// bitwise operation +assign and_result = alu_src1 & alu_src2; +assign andn_result= alu_src1 & ~alu_src2; +assign or_result = alu_src1 | alu_src2; //bug6 cycle +assign orn_result = alu_src1 | ~alu_src2; +assign nor_result = ~or_result; +assign xor_result = alu_src1 ^ alu_src2; +assign lui_result = alu_src2; + +// SLL result +assign sll_result = alu_src1 << alu_src2[4:0]; //rj << i5 + +// SRL, SRA result +assign sr64_result = {{32{op_sra & alu_src1[31]}}, alu_src1[31:0]} >> alu_src2[4:0]; //rj >> i5 + +assign sr_result = sr64_result[31:0]; + +// final result mux +assign alu_result = ({32{op_add|op_sub}} & add_sub_result) + | ({32{op_slt }} & slt_result) + | ({32{op_sltu }} & sltu_result) + | ({32{op_and }} & and_result) + | ({32{op_andn }} & andn_result) + | ({32{op_nor }} & nor_result) + | ({32{op_or }} & or_result) + | ({32{op_orn }} & orn_result) + | ({32{op_xor }} & xor_result) + | ({32{op_lui }} & lui_result) + | ({32{op_sll }} & sll_result) + | ({32{op_srl|op_sra}} & sr_result); //bug7 srl and sra sign + +endmodule diff --git a/rtl/ip/open-la500/axi_bridge.v b/rtl/ip/open-la500/axi_bridge.v new file mode 100644 index 0000000..4219790 --- /dev/null +++ b/rtl/ip/open-la500/axi_bridge.v @@ -0,0 +1,317 @@ +module axi_bridge( + input clk, + input reset, + + output reg[ 3:0] arid, + output reg[31:0] araddr, + output reg[ 7:0] arlen, + output reg[ 2:0] arsize, + output [ 1:0] arburst, + output [ 1:0] arlock, + output [ 3:0] arcache, + output [ 2:0] arprot, + output reg arvalid, + input arready, + + input [ 3:0] rid, + input [31:0] rdata, + input [ 1:0] rresp, + input rlast, + input rvalid, + output reg rready, + + output [ 3:0] awid, + output reg[31:0] awaddr, + output reg[ 7:0] awlen, + output reg[ 2:0] awsize, + output [ 1:0] awburst, + output [ 1:0] awlock, + output [ 3:0] awcache, + output [ 2:0] awprot, + output reg awvalid, + input awready, + + output [ 3:0] wid, + output reg[31:0] wdata, + output reg[ 3:0] wstrb, + output reg wlast, + output reg wvalid, + input wready, + + input [ 3:0] bid, + input [ 1:0] bresp, + input bvalid, + output reg bready, + //cache sign + input inst_rd_req , + input [ 2:0] inst_rd_type , + input [31:0] inst_rd_addr , + output inst_rd_rdy , + output inst_ret_valid , + output inst_ret_last , + output [31:0] inst_ret_data , + input inst_wr_req , + input [ 2:0] inst_wr_type , + input [31:0] inst_wr_addr , + input [ 3:0] inst_wr_wstrb , + input [127:0] inst_wr_data , + output inst_wr_rdy , + + input data_rd_req , + input [ 2:0] data_rd_type , + input [31:0] data_rd_addr , + output data_rd_rdy , + output data_ret_valid , + output data_ret_last , + output [31:0] data_ret_data , + input data_wr_req , + input [ 2:0] data_wr_type , + input [31:0] data_wr_addr , + input [ 3:0] data_wr_wstrb , + input [127:0] data_wr_data , + output data_wr_rdy , + output write_buffer_empty +); + +//fixed signal +assign arburst = 2'b1; +assign arlock = 2'b0; +assign arcache = 4'b0; +assign arprot = 3'b0; +assign awid = 4'b1; +assign awburst = 2'b1; +assign awlock = 2'b0; +assign awcache = 4'b0; +assign awprot = 3'b0; +assign wid = 4'b1; + +assign inst_wr_rdy = 1'b1; + +localparam read_requst_empty = 1'b0; +localparam read_requst_ready = 1'b1; +localparam read_respond_empty = 1'b0; +localparam read_respond_transfer = 1'b1; +localparam write_request_empty = 3'b000; +localparam write_addr_ready = 3'b001; +localparam write_data_ready = 3'b010; +localparam write_all_ready = 3'b011; +localparam write_data_transform = 3'b100; +localparam write_data_wait = 3'b101; +localparam write_wait_b = 3'b110; + +reg read_requst_state; +reg read_respond_state; +reg [2:0] write_requst_state; + +wire write_wait_enable; + +wire rd_requst_state_is_empty; +wire rd_requst_can_receive; + +assign rd_requst_state_is_empty = read_requst_state == read_requst_empty; + +wire data_rd_cache_line; +wire inst_rd_cache_line; +wire [ 2:0] data_real_rd_size; +wire [ 7:0] data_real_rd_len ; +wire [ 2:0] inst_real_rd_size; +wire [ 7:0] inst_real_rd_len ; +wire data_wr_cache_line; +wire [ 2:0] data_real_wr_size; +wire [ 7:0] data_real_wr_len ; + +reg [127:0] write_buffer_data; +reg [ 2:0] write_buffer_num; + +wire write_buffer_last; + +assign write_buffer_empty = (write_buffer_num == 3'b0) && !write_wait_enable; + +assign rd_requst_can_receive = rd_requst_state_is_empty && !(write_wait_enable && !(bvalid && bready)); + +assign data_rd_rdy = rd_requst_can_receive; +assign inst_rd_rdy = !data_rd_req && rd_requst_can_receive; + +//read type must be cache line +assign data_rd_cache_line = data_rd_type == 3'b100 ; +assign data_real_rd_size = data_rd_cache_line ? 3'b10 : data_rd_type; +assign data_real_rd_len = data_rd_cache_line ? 8'b11 : 8'b0 ; + +assign inst_rd_cache_line = inst_rd_type == 3'b100 ; +assign inst_real_rd_size = inst_rd_cache_line ? 3'b10 : inst_rd_type; +assign inst_real_rd_len = inst_rd_cache_line ? 8'b11 : 8'b0 ; + +//write size can be special +assign data_wr_cache_line = data_wr_type == 3'b100; +assign data_real_wr_size = data_wr_cache_line ? 3'b10 : data_wr_type; +assign data_real_wr_len = data_wr_cache_line ? 8'b11 : 8'b0 ; + +assign inst_ret_valid = !rid[0] && rvalid; +assign inst_ret_last = !rid[0] && rlast; +assign inst_ret_data = rdata; //this signal needed buffer??? +assign data_ret_valid = rid[0] && rvalid; +assign data_ret_last = rid[0] && rlast; +assign data_ret_data = rdata; + +assign data_wr_rdy = (write_requst_state == write_request_empty); + +assign write_buffer_last = write_buffer_num == 3'b1; + +always @(posedge clk) begin + if (reset) begin + read_requst_state <= read_requst_empty; + arvalid <= 1'b0; + end + else case (read_requst_state) + read_requst_empty: begin + if (data_rd_req) begin + if (write_wait_enable) begin + if (bvalid && bready) begin //when wait write back, stop send read request. easiest way. + read_requst_state <= read_requst_ready; + arid <= 4'b1; + araddr <= data_rd_addr; + arsize <= data_real_rd_size; + arlen <= data_real_rd_len; + arvalid <= 1'b1; + end + end + else begin + read_requst_state <= read_requst_ready; + arid <= 4'b1; + araddr <= data_rd_addr; + arsize <= data_real_rd_size; + arlen <= data_real_rd_len; + arvalid <= 1'b1; + end + end + else if (inst_rd_req) begin + if (write_wait_enable) begin + if (bvalid && bready) begin + read_requst_state <= read_requst_ready; + arid <= 4'b0; + araddr <= inst_rd_addr; + arsize <= inst_real_rd_size; + arlen <= inst_real_rd_len; + arvalid <= 1'b1; + end + end + else begin + read_requst_state <= read_requst_ready; + arid <= 4'b0; + araddr <= inst_rd_addr; + arsize <= inst_real_rd_size; + arlen <= inst_real_rd_len; + arvalid <= 1'b1; + end + end + end + read_requst_ready: begin + if (arready && arid[0]) begin + read_requst_state <= read_requst_empty; + arvalid <= 1'b0; + end + else if (arready && !arid[0]) begin + read_requst_state <= read_requst_empty; + arvalid <= 1'b0; + end + end + endcase +end + +always @(posedge clk) begin + if (reset) begin + read_respond_state <= read_respond_empty; + rready <= 1'b1; + end + else case (read_respond_state) + read_respond_empty: begin + if (rvalid && rready) begin + read_respond_state <= read_respond_transfer; + end + end + read_respond_transfer: begin + if (rlast && rvalid) begin + read_respond_state <= read_respond_empty; + end + end + endcase +end + +always @(posedge clk) begin + if (reset) begin + write_requst_state <= write_request_empty; + awvalid <= 1'b0; + wvalid <= 1'b0; + wlast <= 1'b0; + bready <= 1'b0; + + write_buffer_num <= 3'b0; + write_buffer_data <= 128'b0; + end + else case (write_requst_state) + write_request_empty: begin + if (data_wr_req) begin + write_requst_state <= write_data_wait; + //end + awaddr <= data_wr_addr; + awsize <= data_real_wr_size; + awlen <= data_real_wr_len; + awvalid <= 1'b1; + wdata <= data_wr_data[31:0]; //from write 128 bit buffer + wstrb <= data_wr_wstrb; + + write_buffer_data <= {32'b0, data_wr_data[127:32]}; + + if (data_wr_type == 3'b100) begin + write_buffer_num <= 3'b011; + end + else begin + write_buffer_num <= 3'b0; + wlast <= 1'b1; + end + end + end + write_data_wait: begin + if (awready) begin + write_requst_state <= write_data_transform; + awvalid <= 1'b0; + wvalid <= 1'b1; + end + end + write_data_transform: begin + if (wready) begin + if (wlast) begin + write_requst_state <= write_wait_b; + wvalid <= 1'b0; + wlast <= 1'b0; + bready <= 1'b1; + end + else begin + if (write_buffer_last) begin + wlast <= 1'b1; + end + + write_requst_state <= write_data_transform; + + wdata <= write_buffer_data[31:0]; + wvalid <= 1'b1; + write_buffer_data <= {32'b0, write_buffer_data[127:32]}; + write_buffer_num <= write_buffer_num - 3'b1; + end + end + end + write_wait_b: begin + if (bvalid && bready) begin + write_requst_state <= write_request_empty; + bready <= 1'b0; + end + end + default: begin + write_requst_state <= write_request_empty; + end + endcase +end + +assign write_wait_enable = ~(write_requst_state == write_request_empty); + +endmodule diff --git a/rtl/ip/open-la500/btb.v b/rtl/ip/open-la500/btb.v new file mode 100644 index 0000000..e2f6e34 --- /dev/null +++ b/rtl/ip/open-la500/btb.v @@ -0,0 +1,238 @@ +module btb +#( + parameter BTBNUM = 32, + parameter RASNUM = 16 +) +( + input clk , + input reset , + //from/to if + input [31:0] fetch_pc , + input fetch_en , + output [31:0] ret_pc , + output taken , + output ret_en , + output [ 4:0] ret_index , + //from id + input operate_en , + input [31:0] operate_pc , + input [ 4:0] operate_index , + input pop_ras , + input push_ras , + input add_entry , + input delete_entry , + input pre_error , + input pre_right , + input target_error , + input right_orien , + input [31:0] right_target +); + +/* +* btb_pc record all branch inst pc except jirl +* ras_pc only record jirl pc +*/ +reg [29:0] btb_pc [BTBNUM-1:0]; +reg [29:0] btb_target [BTBNUM-1:0]; +reg [ 1:0] btb_counter [BTBNUM-1:0]; + +reg [BTBNUM-1:0] btb_valid; + +reg [29:0] ras_pc [RASNUM-1:0]; + +reg [RASNUM-1:0] ras_valid; + +reg [31:0] fetch_pc_r; +reg fetch_en_r; + +//reg [BTBNUM-1:0] jirl_flag; + +reg [29:0] ras [7:0]; +reg [ 3:0] ras_ptr; + +wire [29:0] ras_top; + +wire ras_full; +wire ras_empty; + +wire [31:0] btb_match_rd; +wire [15:0] ras_match_rd; + +wire btb_match; +wire ras_match; + +wire [29:0] btb_match_target; +wire [ 1:0] btb_match_counter; +wire [ 4:0] btb_match_index; +wire [ 4:0] btb_random_index; + +wire [ 3:0] ras_match_index; +wire [ 3:0] ras_random_index; + +wire btb_all_entry_valid; +wire [4:0] btb_select_one_invalid_entry; +wire [4:0] btb_add_entry_index; +reg [4:0] btb_add_entry_index_r; +wire [31:0] btb_add_entry_dec; + +wire ras_all_entry_valid; +wire [3:0] ras_select_one_invalid_entry; +wire [3:0] ras_add_entry_index; + +wire [31:0] btb_untaken_entry; +reg [31:0] btb_untaken_entry_r; +wire [31:0] btb_untaken_entry_t; +reg btb_add_entry_r; +wire [4:0] btb_sel_one_untaken_entry; +wire btb_has_one_untaken_entry; + +reg [5:0] fcsr; + +always @(posedge clk) begin + if (reset) + fetch_en_r <= 1'b0; + else + fetch_en_r <= fetch_en; + + if (fetch_en) + fetch_pc_r <= fetch_pc; +end + +always @(posedge clk) begin + btb_untaken_entry_r <= btb_untaken_entry; + btb_add_entry_r <= operate_en && !pop_ras && add_entry; + btb_add_entry_index_r <= btb_add_entry_index; +end + +//untaken entry list cal at previous clock +assign btb_untaken_entry_t = btb_untaken_entry_r & ({32{!btb_add_entry_r}} | ~btb_add_entry_dec); +assign btb_has_one_untaken_entry = |btb_untaken_entry_t; + +decoder_5_32 dec_btb_add_entry (.in(btb_add_entry_index_r), .out(btb_add_entry_dec)); +one_valid_32 sel_one_untaken_entry (.in(btb_untaken_entry_t), .out_en(btb_sel_one_untaken_entry)); + +//assign btb_random_index = (btb_match && (fcsr[4:0] == btb_match_index)) ? (fcsr[4:0]+1'b1) : fcsr[4:0]; +//untaken entry can exit first, make no difference, except lose history infor. +assign btb_add_entry_index = !btb_all_entry_valid ? btb_select_one_invalid_entry : + btb_has_one_untaken_entry ? btb_sel_one_untaken_entry : + fcsr[4:0] ; + +assign btb_all_entry_valid = &btb_valid; +one_valid_32 sel_one_btb_entry (.in(~btb_valid), .out_en(btb_select_one_invalid_entry)); + +//assign ras_random_index = (ras_match && (fcsr[3:0] == ras_match_index)) ? (fcsr[3:0]+1'b1) : fcsr[3:0]; +assign ras_add_entry_index = ras_all_entry_valid ? fcsr[3:0] : ras_select_one_invalid_entry; +assign ras_all_entry_valid = &ras_valid; +one_valid_16 sel_one_ras_entry (.in(~ras_valid), .out_en(ras_select_one_invalid_entry)); + +always @(posedge clk) begin + if (reset) begin + btb_valid <= 32'b0; + ras_valid <= 16'b0; + end + else if (operate_en && !pop_ras) begin + if (add_entry) begin + btb_valid[btb_add_entry_index] <= 1'b1; + btb_pc[btb_add_entry_index] <= operate_pc[31:2]; + btb_target[btb_add_entry_index] <= right_target[31:2]; + btb_counter[btb_add_entry_index] <= 2'b10; + end + else if (target_error) begin + btb_target[operate_index] <= right_target[31:2]; + btb_counter[operate_index] <= 2'b10; + end + else if (pre_error || pre_right) begin + if (right_orien) begin + if (btb_counter[operate_index] != 2'b11) begin + btb_counter[operate_index] <= btb_counter[operate_index] + 2'b1; + end + end + else begin + if (btb_counter[operate_index] != 2'b00) begin + btb_counter[operate_index] <= btb_counter[operate_index] - 2'b1; + end + end + end + end + else if (operate_en && pop_ras) begin + if (add_entry) begin + ras_valid[ras_add_entry_index] <= 1'b1; + ras_pc[ras_add_entry_index] <= operate_pc[31:2]; + end + end + +end + +genvar i; +generate + for (i = 0; i < BTBNUM; i = i + 1) + begin: btb_match_com + assign btb_match_rd[i] = fetch_en_r && ((fetch_pc_r[31:2] == btb_pc[i]) && btb_valid[i]); + end +endgenerate + +generate + for (i = 0; i < RASNUM; i = i + 1) + begin: ras_match_com + assign ras_match_rd[i] = fetch_en_r && ((fetch_pc_r[31:2] == ras_pc[i]) && ras_valid[i]); + end +endgenerate + +generate + for (i = 0; i < BTBNUM; i = i + 1) + begin: sel_untaken_entry + assign btb_untaken_entry[i] = btb_valid[i] && ~|btb_counter[i]; + end +endgenerate + +assign btb_match = |btb_match_rd; +assign ras_match = |ras_match_rd && !ras_empty; + +assign ras_top = ras[ras_ptr - 4'b1]; //ras modify may before inst fetch + +encoder_32_5 encode_btb_match (.in(btb_match_rd), .out(btb_match_index)); +encoder_16_4 encode_ras_match (.in(ras_match_rd), .out(ras_match_index)); + +assign btb_match_target = btb_target[btb_match_index]; +assign btb_match_counter = btb_counter[btb_match_index]; + +assign ret_pc = {32{ras_match}} & {ras_top, 2'b0} | + {32{btb_match}} & {btb_match_target, 2'b0}; +assign ret_en = btb_match || ras_match; +assign taken = btb_match && btb_match_counter[1] || ras_match; +assign ret_index = {5{btb_match}} & {btb_match_index} | + {5{ras_match}} & {1'b0,ras_match_index}; + +assign ras_full = ras_ptr[3]; +assign ras_empty = (ras_ptr == 4'd0); + +always @(posedge clk) begin + if (reset) begin + ras_ptr <= 4'b0; + end + else if (operate_en) begin + if (push_ras && !ras_full) begin + ras[ras_ptr] <= operate_pc[31:2] + 30'b1; + ras_ptr <= ras_ptr + 4'b1; + end + else if (pop_ras && !ras_empty) begin + ras_ptr <= ras_ptr - 4'b1; + end + end +end + +always @(posedge clk) begin + if (reset) begin + fcsr <= 6'b100010; + end + else begin + fcsr[0] <= fcsr[5]; + fcsr[1] <= fcsr[0]; + fcsr[2] <= fcsr[1]; + fcsr[3] <= fcsr[2] ^ fcsr[5]; + fcsr[4] <= fcsr[3] ^ fcsr[5]; + fcsr[5] <= fcsr[4]; + end +end + +endmodule diff --git a/rtl/ip/open-la500/csr.h b/rtl/ip/open-la500/csr.h new file mode 100644 index 0000000..a1d8a43 --- /dev/null +++ b/rtl/ip/open-la500/csr.h @@ -0,0 +1,73 @@ +//CRMD +`define PLV 1:0 +`define IE 2 +`define DA 3 +`define PG 4 +`define DATF 6:5 +`define DATM 8:7 +//PRMD +`define PPLV 1:0 +`define PIE 2 +//ECTL +`define LIE 12:0 +`define LIE_1 9:0 +`define LIE_2 12:11 +//ESTAT +`define IS 12:0 +`define ECODE 21:16 +`define ESUBCODE 30:22 +//TLBIDX +`define INDEX 4:0 +`define PS 29:24 +`define NE 31 +//TLBEHI +`define VPPN 31:13 +//TLBELO +`define TLB_V 0 +`define TLB_D 1 +`define TLB_PLV 3:2 +`define TLB_MAT 5:4 +`define TLB_G 6 +`define TLB_PPN 31:8 +`define TLB_PPN_EN 27:8 //todo +//ASID +`define TLB_ASID 9:0 +//CPUID +`define COREID 8:0 +//LLBCTL +`define ROLLB 0 +`define WCLLB 1 +`define KLO 2 +//TCFG +`define EN 0 +`define PERIODIC 1 +`define INITVAL 31:2 +//TICLR +`define CLR 0 +//TLBRENTRY +`define TLBRENTRY_PA 31:6 +//DMW +`define PLV0 0 +`define PLV3 3 +`define DMW_MAT 5:4 +`define PSEG 27:25 +`define VSEG 31:29 +//PGDL PGDH PGD +`define BASE 31:12 + +`define ECODE_INT 6'h0 +`define ECODE_PIL 6'h1 +`define ECODE_PIS 6'h2 +`define ECODE_PIF 6'h3 +`define ECODE_PME 6'h4 +`define ECODE_PPI 6'h7 +`define ECODE_ADEF 6'h8 +`define ECODE_ALE 6'h9 +`define ECODE_SYS 6'hb +`define ECODE_BRK 6'hc +`define ECODE_INE 6'hd +`define ECODE_IPE 6'he +`define ECODE_FPD 6'hf +`define ECODE_TLBR 6'h3f + +`define ESUBCODE_ADEF 9'h0 diff --git a/rtl/ip/open-la500/csr.v b/rtl/ip/open-la500/csr.v new file mode 100644 index 0000000..b43d83d --- /dev/null +++ b/rtl/ip/open-la500/csr.v @@ -0,0 +1,856 @@ +`include "mycpu.h" +`include "csr.h" + +module csr +#( + parameter TLBNUM = 32 +) +( + input clk , + input reset , + //from to ds + input [13:0] rd_addr , + output [31:0] rd_data , + //timer 64 + output [63:0] timer_64_out , + output [31:0] tid_out , + //from ws + input csr_wr_en , + input [13:0] wr_addr , + input [31:0] wr_data , + //interrupt + input [ 7:0] interrupt , + output has_int , + //from ws + input excp_flush , + input ertn_flush , + input [31:0] era_in , + input [ 8:0] esubcode_in , + input [ 5:0] ecode_in , + input va_error_in , + input [31:0] bad_va_in , + input tlbsrch_en , + input tlbsrch_found , + input [ 4:0] tlbsrch_index , + input excp_tlbrefill, + input excp_tlb , + input [18:0] excp_tlb_vppn, + //from ws llbit + input llbit_in , + input llbit_set_in , + input [27:0] lladdr_in , + input lladdr_set_in, + //to es + output llbit_out , + output [18:0] vppn_out , + //to ms + output [27:0] lladdr_out , + //to fs + output [31:0] eentry_out , + output [31:0] era_out , + output [31:0] tlbrentry_out, + output disable_cache_out, + //to addr trans + output [ 9:0] asid_out , + output [ 4:0] rand_index , + output [31:0] tlbehi_out , + output [31:0] tlbelo0_out , + output [31:0] tlbelo1_out , + output [31:0] tlbidx_out , + output pg_out , + output da_out , + output [31:0] dmw0_out , + output [31:0] dmw1_out , + output [ 1:0] datf_out , + output [ 1:0] datm_out , + output [ 5:0] ecode_out , + //from addr trans + input tlbrd_en , + input [31:0] tlbehi_in , + input [31:0] tlbelo0_in , + input [31:0] tlbelo1_in , + input [31:0] tlbidx_in , + input [ 9:0] asid_in , + //general use + output [ 1:0] plv_out + // csr regs for diff +`ifdef DIFFTEST_EN + , + output [31:0] csr_crmd_diff, + output [31:0] csr_prmd_diff, + output [31:0] csr_ectl_diff, + output [31:0] csr_estat_diff, + output [31:0] csr_era_diff, + output [31:0] csr_badv_diff, + output [31:0] csr_eentry_diff, + output [31:0] csr_tlbidx_diff, + output [31:0] csr_tlbehi_diff, + output [31:0] csr_tlbelo0_diff, + output [31:0] csr_tlbelo1_diff, + output [31:0] csr_asid_diff, + output [31:0] csr_save0_diff, + output [31:0] csr_save1_diff, + output [31:0] csr_save2_diff, + output [31:0] csr_save3_diff, + output [31:0] csr_tid_diff, + output [31:0] csr_tcfg_diff, + output [31:0] csr_tval_diff, + output [31:0] csr_ticlr_diff, + output [31:0] csr_llbctl_diff, + output [31:0] csr_tlbrentry_diff, + output [31:0] csr_dmw0_diff, + output [31:0] csr_dmw1_diff, + output [31:0] csr_pgdl_diff, + output [31:0] csr_pgdh_diff +`endif +); + +localparam CRMD = 14'h0; +localparam PRMD = 14'h1; +localparam ECTL = 14'h4; +localparam ESTAT = 14'h5; +localparam ERA = 14'h6; +localparam BADV = 14'h7; +localparam EENTRY = 14'hc; +localparam TLBIDX= 14'h10; +localparam TLBEHI= 14'h11; +localparam TLBELO0=14'h12; +localparam TLBELO1=14'h13; +localparam ASID = 14'h18; +localparam PGDL = 14'h19; +localparam PGDH = 14'h1a; +localparam PGD = 14'h1b; +localparam CPUID = 14'h20; +localparam SAVE0 = 14'h30; +localparam SAVE1 = 14'h31; +localparam SAVE2 = 14'h32; +localparam SAVE3 = 14'h33; +localparam TID = 14'h40; +localparam TCFG = 14'h41; +localparam TVAL = 14'h42; +localparam CNTC = 14'h43; +localparam TICLR = 14'h44; +localparam LLBCTL= 14'h60; +localparam TLBRENTRY = 14'h88; +localparam DMW0 = 14'h180; +localparam DMW1 = 14'h181; +localparam BRK = 14'h100; +localparam DISABLE_CACHE = 14'h101; +localparam CPUCFG_1 = 14'hb1; +localparam CPUCFG_2 = 14'hb2; +localparam CPUCFG_10 = 14'hc0; +localparam CPUCFG_11 = 14'hc1; +localparam CPUCFG_12 = 14'hc2; +localparam CPUCFG_13 = 14'hc3; + +wire crmd_wen = csr_wr_en & (wr_addr == CRMD); +wire prmd_wen = csr_wr_en & (wr_addr == PRMD); +wire ectl_wen = csr_wr_en & (wr_addr == ECTL); +wire estat_wen = csr_wr_en & (wr_addr == ESTAT); +wire era_wen = csr_wr_en & (wr_addr == ERA); +wire badv_wen = csr_wr_en & (wr_addr == BADV); +wire eentry_wen = csr_wr_en & (wr_addr == EENTRY); +wire tlbidx_wen = csr_wr_en & (wr_addr == TLBIDX); +wire tlbehi_wen = csr_wr_en & (wr_addr == TLBEHI); +wire tlbelo0_wen= csr_wr_en & (wr_addr == TLBELO0); +wire tlbelo1_wen= csr_wr_en & (wr_addr == TLBELO1); +wire asid_wen = csr_wr_en & (wr_addr == ASID); +wire pgdl_wen = csr_wr_en & (wr_addr == PGDL); +wire pgdh_wen = csr_wr_en & (wr_addr == PGDH); +wire pgd_wen = csr_wr_en & (wr_addr == PGD); +wire cpuid_wen = csr_wr_en & (wr_addr == CPUID); +wire save0_wen = csr_wr_en & (wr_addr == SAVE0); +wire save1_wen = csr_wr_en & (wr_addr == SAVE1); +wire save2_wen = csr_wr_en & (wr_addr == SAVE2); +wire save3_wen = csr_wr_en & (wr_addr == SAVE3); +wire tid_wen = csr_wr_en & (wr_addr == TID); +wire tcfg_wen = csr_wr_en & (wr_addr == TCFG); +wire tval_wen = csr_wr_en & (wr_addr == TVAL); +wire cntc_wen = csr_wr_en & (wr_addr == CNTC); +wire ticlr_wen = csr_wr_en & (wr_addr == TICLR); +wire llbctl_wen = csr_wr_en & (wr_addr == LLBCTL); +wire tlbrentry_wen = csr_wr_en & (wr_addr == TLBRENTRY); +wire DMW0_wen = csr_wr_en & (wr_addr == DMW0); +wire DMW1_wen = csr_wr_en & (wr_addr == DMW1); +wire BRK_wen = csr_wr_en & (wr_addr == BRK); +wire disable_cache_wen = csr_wr_en & (wr_addr == DISABLE_CACHE); + +reg [31:0] csr_crmd; +reg [31:0] csr_prmd; +reg [31:0] csr_ectl; +reg [31:0] csr_estat; +reg [31:0] csr_era; +reg [31:0] csr_badv; +reg [31:0] csr_eentry; +reg [31:0] csr_tlbidx; +reg [31:0] csr_tlbehi; +reg [31:0] csr_tlbelo0; +reg [31:0] csr_tlbelo1; +reg [31:0] csr_asid; +reg [31:0] csr_cpuid; +reg [31:0] csr_save0; +reg [31:0] csr_save1; +reg [31:0] csr_save2; +reg [31:0] csr_save3; +reg [31:0] csr_tid; +reg [31:0] csr_tcfg; +reg [31:0] csr_tval; +reg [31:0] csr_cntc; +reg [31:0] csr_ticlr; +reg [31:0] csr_llbctl; +reg [31:0] csr_tlbrentry; +reg [31:0] csr_dmw0; +reg [31:0] csr_dmw1; +reg [31:0] csr_pgdl; +reg [31:0] csr_pgdh; +reg [31:0] csr_brk; +reg [31:0] csr_disable_cache; +reg [31:0] csr_cpucfg1; +reg [31:0] csr_cpucfg2; +reg [31:0] csr_cpucfg10; +reg [31:0] csr_cpucfg11; +reg [31:0] csr_cpucfg12; +reg [31:0] csr_cpucfg13; + + +wire [31:0] csr_pgd; + +reg timer_en; +reg [63:0] timer_64; + +reg llbit; +reg [27:0] lladdr; + +wire tlbrd_valid_wr_en; +wire tlbrd_invalid_wr_en; + +wire eret_tlbrefill_excp; + +wire no_forward; + +assign csr_pgd = csr_badv[31] ? csr_pgdh : csr_pgdl; + +assign eret_tlbrefill_excp = csr_estat[`ECODE] == 6'h3f; + +assign tlbrd_valid_wr_en = tlbrd_en && !tlbidx_in[`NE]; +assign tlbrd_invalid_wr_en = tlbrd_en && tlbidx_in[`NE]; + +assign has_int = ((csr_ectl[`LIE] & csr_estat[`IS]) != 13'b0) & csr_crmd[`IE]; + +assign eentry_out = csr_eentry; +assign era_out = csr_era; +assign timer_64_out = timer_64 + {{32{csr_cntc[31]}}, csr_cntc}; +assign tid_out = csr_tid; +assign llbit_out = llbit; +assign lladdr_out = lladdr; +assign asid_out = csr_asid[`TLB_ASID]; +assign vppn_out = (csr_wr_en && wr_addr == TLBEHI) ? wr_data[`VPPN] : csr_tlbehi[`VPPN]; +assign tlbehi_out = csr_tlbehi; +assign tlbelo0_out = csr_tlbelo0; +assign tlbelo1_out = csr_tlbelo1; +assign tlbidx_out = csr_tlbidx; +assign rand_index = timer_64[4:0]; +assign disable_cache_out = csr_disable_cache[0]; + +//forward to if stage +assign no_forward = !excp_tlbrefill && !(eret_tlbrefill_excp && ertn_flush) && !crmd_wen; + +assign pg_out = excp_tlbrefill & 1'b0 | + (eret_tlbrefill_excp && ertn_flush) & 1'b1 | + crmd_wen & wr_data[`PG] | + no_forward & csr_crmd[`PG]; + +assign da_out = excp_tlbrefill & 1'b1 | + (eret_tlbrefill_excp && ertn_flush) & 1'b0 | + crmd_wen & wr_data[`DA] | + no_forward & csr_crmd[`DA]; + +assign dmw0_out = DMW0_wen ? wr_data : csr_dmw0; +assign dmw1_out = DMW1_wen ? wr_data : csr_dmw1; + +assign plv_out = {2{excp_flush}} & 2'b0 | + {2{ertn_flush}} & csr_prmd[`PPLV] | + {2{crmd_wen }} & wr_data[`PLV] | + {2{!excp_flush && !ertn_flush && !crmd_wen}} & csr_crmd[`PLV]; + +assign tlbrentry_out= csr_tlbrentry; +assign datf_out = csr_crmd[`DATF]; +assign datm_out = csr_crmd[`DATM]; + +assign ecode_out = csr_estat[`ECODE]; + +assign rd_data = {32{rd_addr == CRMD }} & csr_crmd | + {32{rd_addr == PRMD }} & csr_prmd | + {32{rd_addr == ECTL }} & csr_ectl | + {32{rd_addr == ESTAT }} & csr_estat | + {32{rd_addr == ERA }} & csr_era | + {32{rd_addr == BADV }} & csr_badv | + {32{rd_addr == EENTRY}} & csr_eentry | + {32{rd_addr == TLBIDX}} & csr_tlbidx | + {32{rd_addr == TLBEHI}} & csr_tlbehi | + {32{rd_addr == TLBELO0}} & csr_tlbelo0 | + {32{rd_addr == TLBELO1}} & csr_tlbelo1 | + {32{rd_addr == ASID }} & csr_asid | + {32{rd_addr == PGDL }} & csr_pgdl | + {32{rd_addr == PGDH }} & csr_pgdh | + {32{rd_addr == PGD }} & csr_pgd | + {32{rd_addr == CPUID }} & csr_cpuid | + {32{rd_addr == SAVE0 }} & csr_save0 | + {32{rd_addr == SAVE1 }} & csr_save1 | + {32{rd_addr == SAVE2 }} & csr_save2 | + {32{rd_addr == SAVE3 }} & csr_save3 | + {32{rd_addr == TID }} & csr_tid | + {32{rd_addr == TCFG }} & csr_tcfg | + {32{rd_addr == CNTC }} & csr_cntc | + {32{rd_addr == TICLR }} & csr_ticlr | + {32{rd_addr == LLBCTL}} & {csr_llbctl[31:1], llbit} | + {32{rd_addr == TVAL }} & csr_tval | + {32{rd_addr == TLBRENTRY}} & csr_tlbrentry | + {32{rd_addr == DMW0}} & csr_dmw0 | + {32{rd_addr == DMW1}} & csr_dmw1 | + {32{rd_addr == CPUCFG_1 }} & csr_cpucfg1 | + {32{rd_addr == CPUCFG_2 }} & csr_cpucfg2 | + {32{rd_addr == CPUCFG_10 }} & csr_cpucfg10 | + {32{rd_addr == CPUCFG_11 }} & csr_cpucfg11 | + {32{rd_addr == CPUCFG_12 }} & csr_cpucfg12 | + {32{rd_addr == CPUCFG_13 }} & csr_cpucfg13 ; + +//crmd +always @(posedge clk) begin + if (reset) begin + csr_crmd[ `PLV] <= 2'b0; + csr_crmd[ `IE] <= 1'b0; + csr_crmd[ `DA] <= 1'b1; + csr_crmd[ `PG] <= 1'b0; + csr_crmd[`DATF] <= 2'b0; + csr_crmd[`DATM] <= 2'b0; + csr_crmd[31: 9] <= 23'b0; + end + else if (excp_flush) begin + csr_crmd[ `PLV] <= 2'b0; + csr_crmd[ `IE] <= 1'b0; + if (excp_tlbrefill) begin + csr_crmd [`DA] <= 1'b1; + csr_crmd [`PG] <= 1'b0; + end + end + else if (ertn_flush) begin + csr_crmd[ `PLV] <= csr_prmd[`PPLV]; + csr_crmd[ `IE] <= csr_prmd[`PIE ]; + if (eret_tlbrefill_excp) begin + csr_crmd[`DA] <= 1'b0; + csr_crmd[`PG] <= 1'b1; + end + end + else if (crmd_wen) begin + csr_crmd[ `PLV] <= wr_data[ `PLV]; + csr_crmd[ `IE] <= wr_data[ `IE]; + csr_crmd[ `DA] <= wr_data[ `DA]; + csr_crmd[ `PG] <= wr_data[ `PG]; + csr_crmd[`DATF] <= wr_data[`DATF]; + csr_crmd[`DATM] <= wr_data[`DATM]; + end +end + +//prmd +always @(posedge clk) begin + if (reset) begin + csr_prmd[31:3] <= 29'b0; + end + else if (excp_flush) begin + csr_prmd[`PPLV] <= csr_crmd[`PLV]; + csr_prmd[ `PIE] <= csr_crmd[`IE ]; + end + else if (prmd_wen) begin + csr_prmd[`PPLV] <= wr_data[`PPLV]; + csr_prmd[ `PIE] <= wr_data[ `PIE]; + end +end + +//ectl +always @(posedge clk) begin + if (reset) begin + csr_ectl <= 32'b0; + end + else if (ectl_wen) begin + csr_ectl[ `LIE_1] <= wr_data[ `LIE_1]; + csr_ectl[ `LIE_2] <= wr_data[ `LIE_2]; + end +end + +//estat +always @(posedge clk) begin + if (reset) begin + csr_estat[ 1: 0] <= 2'b0; + csr_estat[10] <= 1'b0; + csr_estat[12] <= 1'b0; + csr_estat[15:13] <= 3'b0; + csr_estat[31] <= 1'b0; + csr_estat[21:16] <= 6'b0; + + timer_en <= 1'b0; + end + else begin + if (ticlr_wen && wr_data[`CLR]) begin + csr_estat[11] <= 1'b0; + end + else if (tcfg_wen) begin + timer_en <= wr_data[`EN]; + end + else if (timer_en && (csr_tval == 32'b0)) begin + csr_estat[11] <= 1'b1; + timer_en <= csr_tcfg[`PERIODIC]; + end + csr_estat[9:2] <= interrupt; + if (excp_flush) begin + csr_estat[ `ECODE] <= ecode_in; + csr_estat[`ESUBCODE] <= esubcode_in; + end + else if (estat_wen) begin + csr_estat[ 1:0] <= wr_data[ 1:0]; + end + end +end + +//era +always @(posedge clk) begin + if (excp_flush) begin + csr_era <= era_in; + end + else if (era_wen) begin + csr_era <= wr_data; + end +end + +//badv +always @(posedge clk) begin + if (badv_wen) begin + csr_badv <= wr_data; + end + else if (va_error_in) begin + csr_badv <= bad_va_in; + end +end + +//eentry +always @(posedge clk) begin + if (reset) begin + csr_eentry[5:0] <= 6'b0; + end + else if (eentry_wen) begin + csr_eentry[31:6] <= wr_data[31:6]; + end +end + +//tlbidx +always @(posedge clk) begin + if (reset) begin + csr_tlbidx[23: 5] <= 19'b0; + csr_tlbidx[30] <= 1'b0; + csr_tlbidx[`INDEX]<= 5'b0; + end + else if (tlbidx_wen) begin + csr_tlbidx[$clog2(TLBNUM)-1:0] <= wr_data[$clog2(TLBNUM)-1:0]; + csr_tlbidx[`PS] <= wr_data[`PS]; + csr_tlbidx[`NE] <= wr_data[`NE]; + end + else if (tlbsrch_en) begin + if (tlbsrch_found) begin + csr_tlbidx[`INDEX] <= tlbsrch_index; + csr_tlbidx[`NE] <= 1'b0; + end + else begin + csr_tlbidx[`NE] <= 1'b1; + end + end + else if (tlbrd_valid_wr_en) begin + csr_tlbidx[`PS] <= tlbidx_in[`PS]; + csr_tlbidx[`NE] <= tlbidx_in[`NE]; + end + else if (tlbrd_invalid_wr_en) begin + csr_tlbidx[`PS] <= 6'b0; + csr_tlbidx[`NE] <= tlbidx_in[`NE]; + end +end + +//tlbehi +always @(posedge clk) begin + if (reset) begin + csr_tlbehi[12:0] <= 13'b0; + end + else if (tlbehi_wen) begin + csr_tlbehi[`VPPN] <= wr_data[`VPPN]; + end + else if (tlbrd_valid_wr_en) begin + csr_tlbehi[`VPPN] <= tlbehi_in[`VPPN]; + end + else if (tlbrd_invalid_wr_en) begin + csr_tlbehi[`VPPN] <= 19'b0; + end + else if (excp_tlb) begin + csr_tlbehi[`VPPN] <= excp_tlb_vppn; + end +end + +//tlbelo0 +always @(posedge clk) begin + if (reset) begin + csr_tlbelo0[7] <= 1'b0; + end + else if (tlbelo0_wen) begin + csr_tlbelo0[`TLB_V] <= wr_data[`TLB_V]; + csr_tlbelo0[`TLB_D] <= wr_data[`TLB_D]; + csr_tlbelo0[`TLB_PLV] <= wr_data[`TLB_PLV]; + csr_tlbelo0[`TLB_MAT] <= wr_data[`TLB_MAT]; + csr_tlbelo0[`TLB_G] <= wr_data[`TLB_G]; + csr_tlbelo0[`TLB_PPN_EN] <= wr_data[`TLB_PPN_EN]; + end + else if (tlbrd_valid_wr_en) begin + csr_tlbelo0[`TLB_V] <= tlbelo0_in[`TLB_V]; + csr_tlbelo0[`TLB_D] <= tlbelo0_in[`TLB_D]; + csr_tlbelo0[`TLB_PLV] <= tlbelo0_in[`TLB_PLV]; + csr_tlbelo0[`TLB_MAT] <= tlbelo0_in[`TLB_MAT]; + csr_tlbelo0[`TLB_G] <= tlbelo0_in[`TLB_G]; + csr_tlbelo0[`TLB_PPN_EN] <= tlbelo0_in[`TLB_PPN_EN]; + end + else if (tlbrd_invalid_wr_en) begin + csr_tlbelo0[`TLB_V] <= 1'b0; + csr_tlbelo0[`TLB_D] <= 1'b0; + csr_tlbelo0[`TLB_PLV] <= 2'b0; + csr_tlbelo0[`TLB_MAT] <= 2'b0; + csr_tlbelo0[`TLB_G] <= 1'b0; + csr_tlbelo0[`TLB_PPN_EN] <= 20'b0; + end +end + +//tlbelo1 +always @(posedge clk) begin + if (reset) begin + csr_tlbelo1[7] <= 1'b0; + end + else if (tlbelo1_wen) begin + csr_tlbelo1[`TLB_V] <= wr_data[`TLB_V]; + csr_tlbelo1[`TLB_D] <= wr_data[`TLB_D]; + csr_tlbelo1[`TLB_PLV] <= wr_data[`TLB_PLV]; + csr_tlbelo1[`TLB_MAT] <= wr_data[`TLB_MAT]; + csr_tlbelo1[`TLB_G] <= wr_data[`TLB_G]; + csr_tlbelo1[`TLB_PPN_EN] <= wr_data[`TLB_PPN_EN]; + end + else if (tlbrd_valid_wr_en) begin + csr_tlbelo1[`TLB_V] <= tlbelo1_in[`TLB_V]; + csr_tlbelo1[`TLB_D] <= tlbelo1_in[`TLB_D]; + csr_tlbelo1[`TLB_PLV] <= tlbelo1_in[`TLB_PLV]; + csr_tlbelo1[`TLB_MAT] <= tlbelo1_in[`TLB_MAT]; + csr_tlbelo1[`TLB_G] <= tlbelo1_in[`TLB_G]; + csr_tlbelo1[`TLB_PPN_EN] <= tlbelo1_in[`TLB_PPN_EN]; + end + else if (tlbrd_invalid_wr_en) begin + csr_tlbelo1[`TLB_V] <= 1'b0; + csr_tlbelo1[`TLB_D] <= 1'b0; + csr_tlbelo1[`TLB_PLV] <= 2'b0; + csr_tlbelo1[`TLB_MAT] <= 2'b0; + csr_tlbelo1[`TLB_G] <= 1'b0; + csr_tlbelo1[`TLB_PPN_EN] <= 20'b0; + end +end + +//asid +always @(posedge clk) begin + if (reset) begin + csr_asid[31:10] <= 22'h280; //ASIDBITS = 10 + end + else if (asid_wen) begin + csr_asid[`TLB_ASID] <= wr_data[`TLB_ASID]; + end + else if (tlbrd_valid_wr_en) begin + csr_asid[`TLB_ASID] <= asid_in; + end + else if (tlbrd_invalid_wr_en) begin + csr_asid[`TLB_ASID] <= 10'b0; + end +end + +//TLBRENTRY +always @(posedge clk) begin + if (reset) begin + csr_tlbrentry[5:0] <= 6'b0; + end + else if (tlbrentry_wen) begin + csr_tlbrentry[`TLBRENTRY_PA] <= wr_data[`TLBRENTRY_PA]; + end +end + +//dmw0 +always @(posedge clk) begin + if (reset) begin + csr_dmw0[ 2:1] <= 2'b0; + csr_dmw0[24:6] <= 19'b0; + csr_dmw0[28] <= 1'b0; + end + else if (DMW0_wen) begin + csr_dmw0[`PLV0] <= wr_data[`PLV0]; + csr_dmw0[`PLV3] <= wr_data[`PLV3]; + csr_dmw0[`DMW_MAT] <= wr_data[`DMW_MAT]; + csr_dmw0[`PSEG] <= wr_data[`PSEG]; + csr_dmw0[`VSEG] <= wr_data[`VSEG]; + end +end + +//dmw1 +always @(posedge clk) begin + if (reset) begin + csr_dmw1[ 2:1] <= 2'b0; + csr_dmw1[24:6] <= 19'b0; + csr_dmw1[28] <= 1'b0; + end + else if (DMW1_wen) begin + csr_dmw1[`PLV0] <= wr_data[`PLV0]; + csr_dmw1[`PLV3] <= wr_data[`PLV3]; + csr_dmw1[`DMW_MAT] <= wr_data[`DMW_MAT]; + csr_dmw1[`PSEG] <= wr_data[`PSEG]; + csr_dmw1[`VSEG] <= wr_data[`VSEG]; + end +end + +//cpuid +always @(posedge clk) begin + if (reset) begin + csr_cpuid <= 32'b0; + end +end + +//save0 +always @(posedge clk) begin + if (save0_wen) begin + csr_save0 <= wr_data; + end +end + +//save1 +always @(posedge clk) begin + if (save1_wen) begin + csr_save1 <= wr_data; + end +end + +//save2 +always @(posedge clk) begin + if (save2_wen) begin + csr_save2 <= wr_data; + end +end + +//save3 +always @(posedge clk) begin + if (save3_wen) begin + csr_save3 <= wr_data; + end +end + +//tid +always @(posedge clk) begin + if (reset) begin + csr_tid <= 32'b0; + end + else if (tid_wen) begin + csr_tid <= wr_data; + end +end + +//tcfg +always @(posedge clk) begin + if (reset) begin + csr_tcfg[`EN] <= 1'b0; + end + else if (tcfg_wen) begin + csr_tcfg[ `EN] <= wr_data[ `EN]; + csr_tcfg[`PERIODIC] <= wr_data[`PERIODIC]; + csr_tcfg[ `INITVAL] <= wr_data[ `INITVAL]; + end +end + +//cntc +always @(posedge clk) begin + if (reset) begin + csr_cntc <= 32'b0; + end + else if (cntc_wen) begin + csr_cntc <= wr_data; + end +end + +//tval +always @(posedge clk) begin + if (tcfg_wen) begin + csr_tval <= {wr_data[ `INITVAL], 2'b0}; + end + else if (timer_en) begin + if (csr_tval != 32'b0) begin + csr_tval <= csr_tval - 32'b1; + end + else if (csr_tval == 32'b0) begin + csr_tval <= csr_tcfg[`PERIODIC] ? {csr_tcfg[`INITVAL], 2'b0} : 32'hffffffff; + end + end +end + +//ticlr +always @(posedge clk) begin + if (reset) begin + csr_ticlr <= 32'b0; + end +end + +//llbctl +always @(posedge clk) begin + if (reset) begin + csr_llbctl[`KLO] <= 1'b0; + csr_llbctl[31:3] <= 29'b0; + csr_llbctl[`WCLLB] <= 1'b0; + llbit <= 1'b0; + end + else if (ertn_flush) begin + if (csr_llbctl[`KLO]) begin + csr_llbctl[`KLO] <= 1'b0; + end + else begin + llbit <= 1'b0; + end + end + else if (llbctl_wen) begin + csr_llbctl[ `KLO] <= wr_data[ `KLO]; + if (wr_data[`WCLLB] == 1'b1) begin + llbit <= 1'b0; + end + end + else if (llbit_set_in) begin + llbit <= llbit_in; + end +end + +always @(posedge clk) begin + if (reset) begin + lladdr <= 28'b0; + end + else if (lladdr_set_in) begin + lladdr <= lladdr_in; + end +end + +//timer_64 +always @(posedge clk) begin + if (reset) begin + timer_64 <= 64'b0; + end + else begin + timer_64 <= timer_64 + 1'b1; + end +end + +//pgdl +always @(posedge clk) begin + if (pgdl_wen) begin + csr_pgdl[`BASE] <= wr_data[`BASE]; + end +end + +//pgdh +always @(posedge clk) begin + if (pgdh_wen) begin + csr_pgdh[`BASE] <= wr_data[`BASE]; + end +end + +//use for break in chipscope in software +always @(posedge clk) begin + if (reset) begin + csr_brk <= 32'b0; + end + if (BRK_wen) begin + csr_brk <= wr_data; + end +end + +//use for disable cache or enable cache +always @(posedge clk) begin + if (reset) begin + csr_disable_cache <= 32'b0; + end + if (disable_cache_wen) begin + csr_disable_cache <= wr_data; + end +end + +//cpucfg1 +always @(posedge clk) begin + if (reset) begin + csr_cpucfg1 <= 32'h1f1f4; + end +end + +//cpucfg2 +always @(posedge clk) begin + if (reset) begin + csr_cpucfg2 <= 32'h0; + end +end + +//cpucfg10 +always @(posedge clk) begin + if (reset) begin + csr_cpucfg10 <= 32'h5; + end +end + +//cpucfg11 +always @(posedge clk) begin + if (reset) begin + csr_cpucfg11 <= 32'h04080001; + end +end + +//cpucfg12 +always @(posedge clk) begin + if (reset) begin + csr_cpucfg12 <= 32'h04080001; + end +end + +//cpucfg13 +always @(posedge clk) begin + if (reset) begin + csr_cpucfg13 <= 32'h0; + end +end + +// difftest +`ifdef DIFFTEST_EN +assign csr_crmd_diff = csr_crmd; +assign csr_prmd_diff = csr_prmd; +assign csr_ectl_diff = csr_ectl; +assign csr_estat_diff = csr_estat; +assign csr_era_diff = csr_era; +assign csr_badv_diff = csr_badv; +assign csr_eentry_diff = csr_eentry; +assign csr_tlbidx_diff = csr_tlbidx; +assign csr_tlbehi_diff = csr_tlbehi; +assign csr_tlbelo0_diff = csr_tlbelo0; +assign csr_tlbelo1_diff = csr_tlbelo1; +assign csr_asid_diff = csr_asid; +assign csr_save0_diff = csr_save0; +assign csr_save1_diff = csr_save1; +assign csr_save2_diff = csr_save2; +assign csr_save3_diff = csr_save3; +assign csr_tid_diff = csr_tid; +assign csr_tcfg_diff = csr_tcfg; +assign csr_tval_diff = csr_tval; +assign csr_ticlr_diff = csr_ticlr; +assign csr_llbctl_diff = {csr_llbctl[31:1], llbit}; +assign csr_tlbrentry_diff = csr_tlbrentry; +assign csr_dmw0_diff = csr_dmw0; +assign csr_dmw1_diff = csr_dmw1; +assign csr_pgdl_diff = csr_pgdl; +assign csr_pgdh_diff = csr_pgdh; +`endif + +endmodule diff --git a/rtl/ip/open-la500/dcache.v b/rtl/ip/open-la500/dcache.v new file mode 100644 index 0000000..d9c2045 --- /dev/null +++ b/rtl/ip/open-la500/dcache.v @@ -0,0 +1,651 @@ +module dcache +( + input clk , + input reset , + //to from cpu + input valid , + input op , //cache inst treat as load, op is zero + input [ 2:0] size , + input [ 7:0] index , + input [19:0] tag , + input [ 3:0] offset , + input [ 3:0] wstrb , + input [31:0] wdata , + output addr_ok , + output data_ok , + output [31:0] rdata , + input uncache_en , + input dcacop_op_en , + input [ 1:0] cacop_op_mode, + input [ 4:0] preld_hint , + input preld_en , + input tlb_excp_cancel_req, + input sc_cancel_req, + output dcache_empty , + //to from axi + output rd_req , + output [ 2:0] rd_type , + output [31:0] rd_addr , + input rd_rdy , + input ret_valid , + input ret_last , + input [31:0] ret_data , + output reg wr_req , + output [ 2:0] wr_type , + output [31:0] wr_addr , + output [ 3:0] wr_wstrb , + output [127:0] wr_data , + input wr_rdy , + //to perf_counter + output cache_miss +); + +reg [1:0] way_d_reg [255:0]; + +wire request_uncache_en ; +reg request_buffer_op ; +reg request_buffer_preld ; +reg [ 2:0] request_buffer_size ; +reg [ 7:0] request_buffer_index ; +reg [19:0] request_buffer_tag ; +reg [ 3:0] request_buffer_offset ; +reg [ 3:0] request_buffer_wstrb ; +reg [31:0] request_buffer_wdata ; +reg request_buffer_uncache_en ; +reg request_buffer_dcacop ; +reg [ 1:0] request_buffer_cacop_op_mode; + +reg [ 1:0] miss_buffer_replace_way ; +reg [ 1:0] miss_buffer_ret_num ; +wire [ 1:0] ret_num_add_one ; + +reg [ 7:0] write_buffer_index ; +reg [ 3:0] write_buffer_wstrb ; +reg [31:0] write_buffer_wdata ; +reg [ 1:0] write_buffer_way ; +reg [ 3:0] write_buffer_offset ; + +wire [ 7:0] way_bank_addra [1:0][3:0]; +wire [31:0] way_bank_dina [1:0][3:0]; +wire [31:0] way_bank_douta [1:0][3:0]; +wire way_bank_ena [1:0][3:0]; +wire [ 3:0] way_bank_wea [1:0][3:0]; + +wire [ 7:0] way_tagv_addra [1:0]; +wire [20:0] way_tagv_dina [1:0]; +wire [20:0] way_tagv_douta [1:0]; +wire way_tagv_ena [1:0]; +wire way_tagv_wea [1:0]; + +wire wr_match_way_bank[1:0][3:0]; + +wire [ 1:0] way_d ; + +wire [ 1:0] way_hit ; +wire cache_hit ; + +wire [31:0] way_load_word [1:0]; +wire [127:0] way_data [1:0]; +wire [31:0] load_res ; + +wire [127:0] replace_data ; +wire replace_d ; +wire replace_v ; +wire [19:0] replace_tag ; +wire [ 1:0] random_val ; +wire [ 3:0] chosen_way ; +wire [ 1:0] replace_way ; +wire [ 1:0] invalid_way ; +wire has_invalid_way ; +wire [ 1:0] rand_repl_way ; +wire [ 3:0] cacop_chose_way ; + +wire main_idle2lookup ; +wire main_lookup2lookup; + +wire main_state_is_idle ; +wire main_state_is_lookup ; +wire main_state_is_miss ; +wire main_state_is_replace; +wire main_state_is_refill ; + +wire write_state_is_idle; +wire write_state_is_full; + +wire uncache_wr ; +reg uncache_wr_buffer; +wire [ 2:0] uncache_wr_type; + +wire [ 1:0] way_wr_en; + +wire [31:0] refill_data; +wire [31:0] write_in; + +wire cacop_op_mode0; +wire cacop_op_mode1; +wire cacop_op_mode2; + +wire cacop_op_mode2_hit_wr; +reg cacop_op_mode2_hit_wr_buffer; + +wire preld_st_en; +wire preld_ld_en; +wire preld_ld_st_en; + +wire req_or_inst_valid; + +reg [1:0] lookup_way_hit_buffer; + +localparam main_idle = 5'b00001; +localparam main_lookup = 5'b00010; +localparam main_miss = 5'b00100; +localparam main_replace = 5'b01000; +localparam main_refill = 5'b10000; +localparam write_buffer_idle = 1'b0; +localparam write_buffer_write = 1'b1; + +genvar i,j; + +reg [4:0] main_state; +reg write_buffer_state; + +reg rd_req_buffer; + +// wire invalid_way; + +wire cancel_req = tlb_excp_cancel_req || sc_cancel_req; + +//state machine +//main loop +always @(posedge clk) begin + if (reset) begin + main_state <= main_idle; + + request_buffer_op <= 1'b0; + request_buffer_preld <= 1'b0; + request_buffer_size <= 3'b0; + request_buffer_index <= 8'b0; + request_buffer_tag <= 20'b0; + request_buffer_offset <= 4'b0; + request_buffer_wstrb <= 4'b0; + request_buffer_wdata <= 32'b0; + request_buffer_uncache_en <= 1'b0; + + request_buffer_cacop_op_mode <= 2'b0; + request_buffer_dcacop <= 1'b0; + + miss_buffer_replace_way <= 2'b0; + + wr_req <= 1'b0; + end + else case (main_state) + main_idle: begin + if (req_or_inst_valid && main_idle2lookup) begin + main_state <= main_lookup; + + request_buffer_op <= op ; + request_buffer_preld <= preld_en ; + request_buffer_size <= size ; + request_buffer_index <= index ; + request_buffer_offset <= offset ; + request_buffer_wstrb <= wstrb ; + request_buffer_wdata <= wdata ; + + request_buffer_cacop_op_mode <= cacop_op_mode ; + request_buffer_dcacop <= dcacop_op_en ; + end + end + main_lookup: begin + if (req_or_inst_valid && main_lookup2lookup) begin + main_state <= main_lookup; + + request_buffer_op <= op ; + request_buffer_preld <= preld_en ; + request_buffer_size <= size ; + request_buffer_index <= index ; + request_buffer_offset <= offset ; + request_buffer_wstrb <= wstrb ; + request_buffer_wdata <= wdata ; + + request_buffer_cacop_op_mode <= cacop_op_mode ; + request_buffer_dcacop <= dcacop_op_en ; + end + else if (cancel_req) begin + main_state <= main_idle; + end + else if (!cache_hit) begin + //uncache wr --> wr_req 1 + //uncache rd, cacop(code==0) --> wr_req 0 + //cacop(code==1, 2), cache st, cache ld --> wr_req (dirty && valid) + if (uncache_wr || ((replace_d && replace_v) && (!request_uncache_en || cacop_op_mode2_hit_wr) && !cacop_op_mode0)) + main_state <= main_miss; + else + main_state <= main_replace; + + request_buffer_tag <= tag; + request_buffer_uncache_en <= request_uncache_en; + uncache_wr_buffer <= uncache_wr; + miss_buffer_replace_way <= replace_way; + cacop_op_mode2_hit_wr_buffer <= cacop_op_mode2_hit_wr; + end + else begin + main_state <= main_idle; + end + end + main_miss: begin + if (wr_rdy) begin + main_state <= main_replace; + wr_req <= 1'b1; + end + end + main_replace: begin + if (rd_rdy) begin + main_state <= main_refill; + miss_buffer_ret_num <= 2'b0; //when get ret data, it will be sent to cpu directly. + end + wr_req <= 1'b0; + end + main_refill: begin + if ((ret_valid && ret_last) || !rd_req_buffer) begin //when rd_req is not set, go to next state directly + main_state <= main_idle; + end + else begin + if (ret_valid) begin + miss_buffer_ret_num <= ret_num_add_one; + end + end + end + default: begin + main_state <= main_idle; + end + endcase +end + +//hit write state +always @(posedge clk) begin + if (reset) begin + write_buffer_state <= write_buffer_idle; + + write_buffer_index <= 8'b0; + write_buffer_wstrb <= 4'b0; + write_buffer_wdata <= 32'b0; + write_buffer_offset <= 4'b0; + write_buffer_way <= 2'b0; + end + else case (write_buffer_state) + write_buffer_idle: begin + if (main_state_is_lookup && cache_hit && request_buffer_op && !cancel_req) begin + write_buffer_state <= write_buffer_write; + + write_buffer_index <= request_buffer_index; + write_buffer_wstrb <= request_buffer_wstrb; + write_buffer_wdata <= request_buffer_wdata; + write_buffer_offset <= request_buffer_offset; + write_buffer_way <= way_hit; + end + end + write_buffer_write: begin + if (main_state_is_lookup && cache_hit && request_buffer_op && !cancel_req) begin + write_buffer_state <= write_buffer_write; + + write_buffer_index <= request_buffer_index; + write_buffer_wstrb <= request_buffer_wstrb; + write_buffer_wdata <= request_buffer_wdata; + write_buffer_offset <= request_buffer_offset; + write_buffer_way <= way_hit; + end + else begin + write_buffer_state <= write_buffer_idle; + end + end + endcase +end + +/*====================================main state idle=======================================*/ + +assign req_or_inst_valid = valid || dcacop_op_en || preld_en; + +//state change condition, write hit cache block write do not conflict with lookup read and cacop +assign main_idle2lookup = !(write_state_is_full && ((write_buffer_offset[3:2] == offset[3:2]) || dcacop_op_en)); + +assign dcache_empty = main_state_is_idle; +//addr_ok logic + +/*===================================main state lookup======================================*/ + +//tag compare +generate for(i=0;i<2;i=i+1) begin:gen_way_hit + assign way_hit[i] = way_tagv_douta[i][0] && (tag == way_tagv_douta[i][20:1]); //this signal will not maintain +end endgenerate + +assign cache_hit = |way_hit && !(uncache_en || cacop_op_mode0 || cacop_op_mode1 || cacop_op_mode2); //uncache road reuse +//when cache inst op mode2 no hit, main state machine will still go a round. implement easy. + +assign main_lookup2lookup = !(write_state_is_full && ((write_buffer_offset[3:2] == offset[3:2]) || dcacop_op_en)) && + !(request_buffer_op && !op && ((request_buffer_offset[3:2] == offset[3:2]) || dcacop_op_en)) && + cache_hit; + +assign addr_ok = (main_state_is_idle && main_idle2lookup) || (main_state_is_lookup && main_lookup2lookup); //request can be get + +//data select +generate for(i=0;i<2;i=i+1) begin:gen_way_data + assign way_data[i] = {way_bank_douta[i][3],way_bank_douta[i][2],way_bank_douta[i][1],way_bank_douta[i][0]}; + + assign way_load_word[i] = way_data[i][request_buffer_offset[3:2]*32 +: 32]; +end endgenerate + +assign load_res = {32{way_hit[0]}} & way_load_word[0] | + {32{way_hit[1]}} & way_load_word[1] ; + +assign request_uncache_en = (uncache_en && !request_buffer_dcacop); + +assign uncache_wr = request_uncache_en && request_buffer_op && !cacop_op_mode1 && !cacop_op_mode2_hit_wr; +//data_ok logic + +decoder_2_4 dec_rand_way (.in({1'b0,random_val[0]}),.out(chosen_way)); + +one_valid_n #(2) sel_one_invalid (.in(~{way_tagv_douta[1][0],way_tagv_douta[0][0]}),.out(invalid_way),.nozero(has_invalid_way)); + +assign rand_repl_way = has_invalid_way ? invalid_way : chosen_way[1:0]; //chose invalid way first. + +decoder_2_4 dec_cacop_way (.in({1'b0,request_buffer_offset[0]}),.out(cacop_chose_way)); + +assign replace_way = {2{cacop_op_mode0 || cacop_op_mode1}} & cacop_chose_way[1:0] | + {2{cacop_op_mode2}} & way_hit | + {2{!request_buffer_dcacop}} & rand_repl_way; + +assign way_d = way_d_reg[request_buffer_index] | + {2{(write_buffer_index==request_buffer_index)&&write_state_is_full}}&write_buffer_way; + +assign replace_d = |(replace_way & way_d); +assign replace_v = |(replace_way & {way_tagv_douta[1][0],way_tagv_douta[0][0]}); + +/*====================================main state miss=======================================*/ + +assign replace_tag = {20{miss_buffer_replace_way[0]}} & way_tagv_douta[0][20:1] | + {20{miss_buffer_replace_way[1]}} & way_tagv_douta[1][20:1] ; + +assign replace_data = {128{miss_buffer_replace_way[0]}} & way_data[0] | + {128{miss_buffer_replace_way[1]}} & way_data[1] ; + +assign wr_type = uncache_wr_buffer ? uncache_wr_type : 3'b100; //replace cache line +assign wr_addr = uncache_wr_buffer ? {request_buffer_tag, request_buffer_index, request_buffer_offset} : + {replace_tag, request_buffer_index, 4'b0}; +assign wr_data = uncache_wr_buffer ? {96'b0, request_buffer_wdata} : replace_data; +assign wr_wstrb = uncache_wr_buffer ? request_buffer_wstrb : 4'hf; + +//assign wr_req = main_state_is_miss; + +/*==================================main state replace======================================*/ + +assign uncache_wr_type = request_buffer_size; + +assign rd_req = main_state_is_replace && !(uncache_wr_buffer || cacop_op_mode0 || cacop_op_mode1 || cacop_op_mode2); + +assign rd_type = request_buffer_uncache_en ? request_buffer_size : 3'b100; +assign rd_addr = request_buffer_uncache_en ? {request_buffer_tag, request_buffer_index, request_buffer_offset} : {request_buffer_tag, request_buffer_index, 4'b0}; +/*===================================main state refill======================================*/ + +//write process will not block pipeline +//preld ins will not block pipeline ps:preld is not real mem inst, this operation is controled in pipeline +assign data_ok = ((main_state_is_lookup && (cache_hit || request_buffer_op || cancel_req)) || + (main_state_is_refill && (!request_buffer_op && (ret_valid && ((miss_buffer_ret_num == request_buffer_offset[3:2]) || request_buffer_uncache_en))))) && + !(request_buffer_preld || request_buffer_dcacop); //when rd_req is not set, set data_ok directly. +//rdate connect with ret_data dirctly. maintain one clock only + +assign write_in = {(request_buffer_wstrb[3] ? request_buffer_wdata[31:24] : ret_data[31:24]), + (request_buffer_wstrb[2] ? request_buffer_wdata[23:16] : ret_data[23:16]), + (request_buffer_wstrb[1] ? request_buffer_wdata[15: 8] : ret_data[15: 8]), + (request_buffer_wstrb[0] ? request_buffer_wdata[ 7: 0] : ret_data[ 7: 0])}; + +assign refill_data = (request_buffer_op && (request_buffer_offset[3:2] == miss_buffer_ret_num)) ? write_in : ret_data; + +assign way_wr_en = miss_buffer_replace_way & {2{ret_valid}}; //when rd_req is not set, ret_valid and ret_last will not be set. block will not be wr also. + +assign cache_miss = main_state_is_refill && ret_last && !(request_buffer_uncache_en || request_buffer_dcacop || request_buffer_preld); + +//add one +assign ret_num_add_one[0] = miss_buffer_ret_num[0] ^ 1'b1; +assign ret_num_add_one[1] = miss_buffer_ret_num[1] ^ miss_buffer_ret_num[0]; + +always @(posedge clk) begin + if (reset) begin + rd_req_buffer <= 1'b0; + end + else if (rd_req) begin + rd_req_buffer <= 1'b1; + end + else if (main_state_is_refill && (ret_valid && ret_last)) begin + rd_req_buffer <= 1'b0; + end +end + +/*==========================================================================================*/ + +//refill or write state update dirty reg +always @(posedge clk) begin + if (main_state_is_refill && ((ret_valid && ret_last) || !rd_req_buffer) && (!(request_buffer_uncache_en || cacop_op_mode0))) begin + way_d_reg[request_buffer_index][0] <= miss_buffer_replace_way[0] ? request_buffer_op : way_d_reg[request_buffer_index][0]; + way_d_reg[request_buffer_index][1] <= miss_buffer_replace_way[1] ? request_buffer_op : way_d_reg[request_buffer_index][1]; + end + else if (write_state_is_full) begin + way_d_reg[write_buffer_index] <= way_d_reg[write_buffer_index] | write_buffer_way; + end +end + +//cache ins control signal +assign cacop_op_mode0 = request_buffer_dcacop && (request_buffer_cacop_op_mode == 2'b00); +assign cacop_op_mode1 = request_buffer_dcacop && ((request_buffer_cacop_op_mode == 2'b01) || (request_buffer_cacop_op_mode == 2'b11)); +assign cacop_op_mode2 = request_buffer_dcacop && (request_buffer_cacop_op_mode == 2'b10); + +assign cacop_op_mode2_hit_wr = cacop_op_mode2 && |way_hit; + +//output +assign rdata = {32{main_state_is_lookup}} & load_res | + {32{main_state_is_refill}} & ret_data ; + +generate +for(i=0;i<2;i=i+1) begin:gen_data_way + for(j=0;j<4;j=j+1) begin:gen_data_bank +/*===============================bank addra logic==============================*/ + + assign wr_match_way_bank[i][j] = write_state_is_full && (write_buffer_way[i] && (write_buffer_offset[3:2] == j[1:0])); + + assign way_bank_addra[i][j] = wr_match_way_bank[i][j] ? write_buffer_index : ({8{addr_ok}} & index | /*lookup*/ + {8{!addr_ok}} & request_buffer_index); + +/*===============================bank we logic=================================*/ + + assign way_bank_wea[i][j] = {4{wr_match_way_bank[i][j]}} & write_buffer_wstrb | + {4{main_state_is_refill && (way_wr_en[i] && (miss_buffer_ret_num == j[1:0]))}} & 4'hf; + +/*===============================bank dina logic=================================*/ + + assign way_bank_dina[i][j] = {32{write_state_is_full}} & write_buffer_wdata | + {32{main_state_is_refill}} & refill_data ; + +/*===============================bank ena logic=================================*/ + + assign way_bank_ena[i][j] = (!(request_buffer_uncache_en || cacop_op_mode0)) || main_state_is_idle || main_state_is_lookup; + end +end +endgenerate + +generate +for(i=0;i<2;i=i+1) begin:gen_tagv_way +/*===============================tagv addra logic=================================*/ + +assign way_tagv_addra[i] = {8{addr_ok }} & index | + {8{!addr_ok}} & request_buffer_index ; + +/*===============================tagv ena logic=================================*/ + +assign way_tagv_ena[i] = (!request_buffer_uncache_en) || main_state_is_idle || main_state_is_lookup; + +/*===============================tagv wea logic=================================*/ + +assign way_tagv_wea[i] = miss_buffer_replace_way[i] && main_state_is_refill && + ((ret_valid && ret_last) || cacop_op_mode0 || cacop_op_mode1 || cacop_op_mode2_hit_wr_buffer); //write at least 4B + +/*===============================tagv dina logic=================================*/ + +assign way_tagv_dina[i] = (cacop_op_mode0 || cacop_op_mode1 || cacop_op_mode2_hit_wr_buffer) ? 21'b0 : {request_buffer_tag, 1'b1}; +end +endgenerate +/*==============================================================================*/ + +generate +for(i=0;i<2;i=i+1) begin:data_ram_way + for(j=0;j<4;j=j+1) begin:data_ram_bank + data_bank_sram u( + .addra (way_bank_addra[i][j]), + .clka (clk ), + .dina (way_bank_dina[i][j] ), + .douta (way_bank_douta[i][j]), + .ena (way_bank_ena[i][j] ), + .wea (way_bank_wea[i][j] ) + ); + end +end +endgenerate + +generate +for(i=0;i<2;i=i+1) begin:tagv_ram_way + //[20:1] tag [0:0] v + tagv_sram u( + .addra (way_tagv_addra[i]), + .clka (clk ), + .dina (way_tagv_dina[i] ), + .douta (way_tagv_douta[i]), + .ena (way_tagv_ena[i] ), + .wea (way_tagv_wea[i] ) + ); +end +endgenerate + +lfsr lfsr( + .clk (clk ), + .reset (reset ), + .random_val (random_val ) +); + +assign main_state_is_idle = main_state == main_idle ; +assign main_state_is_lookup = main_state == main_lookup ; +assign main_state_is_miss = main_state == main_miss ; +assign main_state_is_replace = main_state == main_replace; +assign main_state_is_refill = main_state == main_refill ; + +assign write_state_is_idle = (write_buffer_state == write_buffer_idle) ; +assign write_state_is_full = (write_buffer_state == write_buffer_write); + +endmodule + +`ifdef SIMU +module data_bank_sram +#( + parameter WIDTH = 32 , + parameter DEPTH = 256 +) +( + input [ 7:0] addra , + input clka , + input [31:0] dina , + output [31:0] douta , + input ena , + input [ 3:0] wea +); + +reg [31:0] mem_reg [255:0]; +reg [31:0] output_buffer; + +always @(posedge clka) begin + if (ena) begin + if (wea) begin + if (wea[0]) begin + mem_reg[addra][ 7: 0] <= dina[ 7: 0]; + end + + if (wea[1]) begin + mem_reg[addra][15: 8] <= dina[15: 8]; + end + + if (wea[2]) begin + mem_reg[addra][23:16] <= dina[23:16]; + end + + if (wea[3]) begin + mem_reg[addra][31:24] <= dina[31:24]; + end + end + else begin + output_buffer <= mem_reg[addra]; + end + end +end + +assign douta = output_buffer; + +endmodule + +module tagv_sram +#( + parameter WIDTH = 21 , + parameter DEPTH = 256 +) +( + input [ 7:0] addra , + input clka , + input [20:0] dina , + output [20:0] douta , + input ena , + input wea +); + +reg [20:0] mem_reg [255:0]; +reg [20:0] output_buffer; + +always @(posedge clka) begin + if (ena) begin + if (wea) begin + mem_reg[addra] <= dina; + end + else begin + output_buffer <= mem_reg[addra]; + end + end +end + +assign douta = output_buffer; + +endmodule +`endif + +module lfsr +( + input clk , + input reset , + + output [1:0] random_val +); + +reg [7:0] r_lfsr; + +always @(posedge clk) begin + if (reset) begin + r_lfsr <= 8'b1; + end + else begin + r_lfsr[0] <= r_lfsr[7]; + r_lfsr[1] <= r_lfsr[0]; + r_lfsr[2] <= r_lfsr[1]; + r_lfsr[3] <= r_lfsr[2]; + r_lfsr[4] <= r_lfsr[3] ^ r_lfsr[7]; + r_lfsr[5] <= r_lfsr[4] ^ r_lfsr[7]; + r_lfsr[6] <= r_lfsr[5] ^ r_lfsr[7]; + r_lfsr[7] <= r_lfsr[6]; + end +end + +assign random_val = r_lfsr[7:6]; + +endmodule diff --git a/rtl/ip/open-la500/div.v b/rtl/ip/open-la500/div.v new file mode 100644 index 0000000..225827c --- /dev/null +++ b/rtl/ip/open-la500/div.v @@ -0,0 +1,99 @@ +//x/y //执行需要34个周期 +module div( + input div_clk, reset, + input div, + input div_signed, + input [31:0] x, y, + output [31:0] s, r, + output complete + ); + +reg [32:0] UnsignS; +reg [32:0] UnsignR; +reg [32:0] tmp_r; +reg [7:0] count; +wire [32:0] tmp_d; +wire [32:0] result_r; +wire [32:0] UnsignX, UnsignY; + +reg div_signed_buffer; +reg x_31_buffer; +reg y_31_buffer; +wire real_div_signed; +wire real_x_31; +wire real_y_31; +wire complete_delay; +wire real_complete; + +assign complete_delay = (count == 8'hf0); +assign real_complete = complete_delay || complete; + +always @(posedge div_clk) begin + if (reset) begin + div_signed_buffer <= 1'b0; + x_31_buffer <= 1'b0; + y_31_buffer <= 1'b0; + end + else if (div) begin + div_signed_buffer <= div_signed; //when div inst go to ms, div_signed will be changed. so buffer it. + x_31_buffer <= x[31]; + y_31_buffer <= y[31]; + end +end + +assign real_div_signed = real_complete ? div_signed_buffer : div_signed; +assign real_x_31 = real_complete ? x_31_buffer : x[31]; +assign real_y_31 = real_complete ? y_31_buffer : y[31]; + +assign UnsignX = {1'b0, (real_div_signed ? (x[31] ? (~x + 32'b1) : x) : x)}; //取绝对值并扩展至33位 +assign UnsignY = {1'b0, (real_div_signed ? (y[31] ? (~y + 32'b1) : y) : y)}; + +always @(posedge div_clk) begin //33位除法计算 + if (reset) begin + count <= 8'd32; + tmp_r <= 33'b0; + UnsignS <= 33'b0; + UnsignR <= 33'b0; + end + else if (~div || complete_delay) begin + count <= 8'd32; //计算33次 + tmp_r <= 33'b0; + end + else if (~(count[7])) begin + if (tmp_d[32]) begin //tmp_d为负数 + UnsignS <= {UnsignS[31:0], 1'b0}; + tmp_r <= result_r; + end + else begin + UnsignS <= {UnsignS[31:0], 1'b1}; + tmp_r <= tmp_d; + end + count <= count - 8'd1; + end + else begin + UnsignR <= tmp_r; + count <= 8'hf0; //complete signal only maintain one clock + end + +end + +assign complete = (count == 8'hff);//chenji + +assign result_r = {tmp_r[31:0], UnsignX[count]}; +assign tmp_d = result_r - UnsignY; + +wire [32:0] TmpS, TmpR; +assign TmpS = (real_div_signed ? ((real_x_31 == real_y_31) ? UnsignS : ~(UnsignS - 1)) : UnsignS); //去绝对值并截位 +assign TmpR = (real_div_signed ? (real_x_31 ? ~(UnsignR - 1) : UnsignR) : UnsignR); + +assign s = TmpS[31:0]; +assign r = TmpR[31:0]; + +endmodule + +//表达式的符号关系 +//x[31] y[31] s[31] r[31] +// 0 0 0 0 +// 0 1 1 0 +// 1 0 1 1 +// 1 1 0 1 diff --git a/rtl/ip/open-la500/doc/lacc接口.md b/rtl/ip/open-la500/doc/lacc接口.md new file mode 100644 index 0000000..81e9cab --- /dev/null +++ b/rtl/ip/open-la500/doc/lacc接口.md @@ -0,0 +1,135 @@ +# LaCC 接口 + +LaCC(Loongarch32R Custom Coprocessor Interface) 接口是 Open-LA500 用于扩展自定义指令的接口。 + +# 指令格式 + +![](./picture/lacc_inst.png) + +| 域 | 描述 | +| ------ | --------------------------------------------------- | +| opcode | 固定为1100,用于确定当前指令 | +| command| 用于编码多个自定义指令,将发送至lacc接口 | +| imm | 额外的立即数 | +| rj | 第一个寄存器的编码 | +| rk | 第二个寄存器的编码 | +| rd | 目的寄存器编码,当目的寄存器不为0时会写回寄存器堆中 | + +# 接口定义 + +> 方向为协处理器视角 + +| 通道 | 方向 | 宽度 | 信号名 | 描述 | +| -------- | ------ | ------------- | --------------- | ------------------------------------------------------------ | +| 全局 | input | 1 | lacc_flush | 当处理器触发异常或分支预测失败时将该信号置位 | +| 请求 | input | 1 | lacc_req_valid | 处理器核发送请求 | +| 请求 | input | LACC_OP_WIDTH | lacc_req_command| 指令中的command域 | +| 请求 | input | 7 | lacc_req_imm | 指令中的imm域 | +| 请求 | input | 32 | lacc_req_rj | 第一个寄存器的值 | +| 请求 | input | 32 | lacc_req_rk | 第二个寄存器的值 | +| 回复 | output | 1 | lacc_rsp_valid | 指令完成信号,处理器将继续执行 | +| 回复 | output | 32 | lacc_rsp_rdat | 写回寄存器的数据 | +| 访存请求 | output | 1 | lacc_data_valid | 向dcache发送的访存请求信号 | +| 访存请求 | input | 1 | lacc_data_ready | dcache当前是否可以接受请求 | +| 访存请求 | output | 32 | lacc_data_addr | 访存地址 | +| 访存请求 | output | 1 | lacc_data_read | 是否为读请求 | +| 访存请求 | output | 32 | lacc_data_wdata | 写入数据 | +| 访存请求 | output | 2 | lacc_data_size | 访存数据大小
    2'b00: byte
    2'b01: half
    2'b10: word | +| 访存回复 | input | 1 | lacc_drsp_valid | dcache发送的回复信号
    写请求将会在第二周期接收到该回复
    读请求将会在dcache成功后接收 | +| 访存回复 | input | 32 | lacc_drsp_data | 访存得到的数据 | + +# 运行流程 + +1. 在解码阶段解析 lacc 指令,并将 op 和 imm 发送给执行阶段 +2. 在执行阶段`lacc_req_valid`为1,lacc接口将接受 lacc 指令并暂停,直到`lacc_rsp_valid`为高才会将指令发送给下一级 +3. 如果需要访存,可以将 `lacc_data_valid` 置高并设置访存地址及大小等信息。当`lacc_data_valid`和`lacc_data_ready`同时为高则当前请求成功发送至dcache。 +4. 当指令执行完成之后将`lacc_rsp_valid`置高,指令将从 exe 级继续执行 + + + +lacc读请求时序,读取地址为0x1C0FFF38,读取数据为0x00000000 + +![](./picture/lacc_read.png) + +lacc写请求时序,写入地址为0x1C0FFEE8,写入数据为0x70A3A52B + +![](./picture/lacc_write.png) + +# 自定义指令 + +添加自定义指令只需两步: + +1. 修改`mycpu.h`中的`LACC_OP_SIZE`为自定义指令数量(若`LACC_OP_SIZE`为1需要修改`LACC_OP_WIDTH`为1),并且取消`HAS_LACC`的注释 +2. 在`lacc_core.v`中删除示例`lacc_demo`,写入自定指令代码 + +# demo + +demo实现了从两个地址载入向量,点乘之后再存入缓存中的功能,代码位于`lacc_demo.v`中。 + +## 指令 + +| 指令 | op | rj | rk | 描述 | +| -------- | ---- | ----- | ----- | ----------------------------------------------- | +| op_cfg | 1 | size | waddr | 设置写回地址及向量长度 | +| op_lmadd | 0 | addr1 | addr2 | 设置需要计算的两个内存地址,对位相加再存入waddr | + +## 状态机 + +| 状态 | 说明 | 转换条件 | 下一状态 | +| --------- | --------------- | ----------------------------------------- | --------- | +| IDLE | | lacc_req_valid & op_lmadd | REQ_ADDR1 | +| REQ_ADDR1 | 访问addr1的数据 | data_hsk(访问addr1数据) | REQ_ADDR2 | +| REQ_ADDR2 | 访问addr2的数据 | data_hsk(访问addr2数据) | FINAL | +| FINAL | 计算结果并写回 | data_hsk & req_size_nz(写入数据且size!=0) | REQ_ADDR1 | +| FINAL | | data_hsk & ~req_size_nz | IDLE | + +data_hsk即`lacc_data_valid & lacc_data_ready`,表明当前访存请求发送成功。 + +**数据控制** + +使用buffer_valid信号表示第一个地址的数据是否被接收。wdata_valid表示写回数据准备完成 + +当`buffer_valid & lacc_drsp_valid`为高时说明第二个地址的数据已经返回,在该周期计算`buffer_data+lacc_drsp_rdata`并写入wdata + +# 修改编译器 + +我们可以使用".word xxxxxxx"的格式在汇编中添加自定义指令。但是这种方式阅读不够友好,并且不利于操作数读写,例如 + +```c + asm volatile ( + "move $r5, %[addr]\n\t" + "move $r6, %[para]\n\t" + ".word 0xc00018a0\n\t" + ::[addr]"r"(addr),[para]"r"(para) + :"$r5", "$r6" + ); +``` + +**修改编译器** + +我们可以修改binutils使得编译器可以识别自定义指令。 + +- 下载loongarch toolchain: https://gitee.com/loongson-edu/la32r-toolchains/tree/master +- 进入src/la32r_binutils/opcodes,打开loongarch-opc.c,在`loongarch_fix_opcodes`结构体中添加 +```c +{0xc0000000, 0xf0000000, "lacc", "u22:6,r0:5,r5:5,r10:5,u15:7", 0, 0, 0, 0} +``` +- 根据toolchina的README编译,并将bin目录添加到path中 + + + +自定义指令的格式为: + +``` +lacc command, rd, rj, rk, imm +``` + +上例可以修改为: + +```c + asm volatile ( + "lacc 0x0, $r0, %[addr], %[para], 0x0\n\t" + ::[addr]"r"(addr), [para]"r"(para) + ); +``` + diff --git a/rtl/ip/open-la500/doc/picture/lacc_inst.png b/rtl/ip/open-la500/doc/picture/lacc_inst.png new file mode 100644 index 0000000000000000000000000000000000000000..2a95ed04083847b2a4723fb244134957f6755d72 GIT binary patch literal 2925 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ûWpg0UyQ*%kZthJaQCuo!K-?fN-FN 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�d_ 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