From 7a48835c4e0fcc6b2863437e65f6b63039fca191 Mon Sep 17 00:00:00 2001 From: Joseph Rahmeh Date: Wed, 22 Jan 2020 14:22:50 -0800 Subject: [PATCH] Initial checkin. --- LICENSE | 69 + README.md | 194 +- configs/README.md | 41 + configs/swerv.config | 2234 ++++++++++++++++++++++++ design/dbg/el2_dbg.sv | 607 +++++++ design/dec/cdecode | 254 +++ design/dec/csrdecode | 240 +++ design/dec/decode | 323 ++++ design/dec/el2_dec.sv | 434 +++++ design/dec/el2_dec_decode_ctl.sv | 1544 ++++++++++++++++ design/dec/el2_dec_gpr_ctl.sv | 95 + design/dec/el2_dec_ib_ctl.sv | 156 ++ design/dec/el2_dec_tlu_ctl.sv | 2622 ++++++++++++++++++++++++++++ design/dec/el2_dec_trigger.sv | 49 + design/dmi/dmi_jtag_to_core_sync.v | 64 + design/dmi/dmi_wrapper.v | 90 + design/dmi/rvjtag_tap.v | 223 +++ design/el2_dma_ctrl.sv | 609 +++++++ design/el2_mem.sv | 132 ++ design/el2_pic_ctrl.sv | 502 ++++++ design/el2_swerv.sv | 1261 +++++++++++++ design/el2_swerv_wrapper.sv | 712 ++++++++ design/exu/el2_exu.sv | 357 ++++ design/exu/el2_exu_alu_ctl.sv | 255 +++ design/exu/el2_exu_div_ctl.sv | 313 ++++ design/exu/el2_exu_mul_ctl.sv | 75 + design/ifu/el2_ifu.sv | 354 ++++ design/ifu/el2_ifu_aln_ctl.sv | 627 +++++++ design/ifu/el2_ifu_bp_ctl.sv | 752 ++++++++ design/ifu/el2_ifu_compress_ctl.sv | 383 ++++ design/ifu/el2_ifu_ic_mem.sv | 1802 +++++++++++++++++++ design/ifu/el2_ifu_iccm_mem.sv | 315 ++++ design/ifu/el2_ifu_ifc_ctl.sv | 234 +++ design/ifu/el2_ifu_mem_ctl.sv | 1630 +++++++++++++++++ design/ifu/el2_ifu_tb_memread.sv | 90 + design/include/el2_def.sv | 325 ++++ design/lib/ahb_to_axi4.sv | 288 +++ design/lib/axi4_to_ahb.sv | 475 +++++ design/lib/beh_lib.sv | 506 ++++++ design/lib/el2_lib.sv | 64 + design/lib/mem_lib.sv | 202 +++ design/lsu/el2_lsu.sv | 408 +++++ design/lsu/el2_lsu_addrcheck.sv | 191 ++ design/lsu/el2_lsu_bus_buffer.sv | 946 ++++++++++ design/lsu/el2_lsu_bus_intf.sv | 369 ++++ design/lsu/el2_lsu_clkdomain.sv | 137 ++ design/lsu/el2_lsu_dccm_ctl.sv | 411 +++++ design/lsu/el2_lsu_dccm_mem.sv | 232 +++ design/lsu/el2_lsu_ecc.sv | 242 +++ design/lsu/el2_lsu_lsc_ctl.sv | 328 ++++ design/lsu/el2_lsu_stbuf.sv | 350 ++++ design/lsu/el2_lsu_trigger.sv | 58 + docs/RISC-V SweRV EL2 PRM.pdf | Bin 0 -> 2051374 bytes testbench/ahb_sif.sv | 195 +++ testbench/asm/cmark.c | 2399 +++++++++++++++++++++++++ testbench/asm/cmark_dccm.c | 1 + testbench/asm/cmark_dccm.ld | 1 + testbench/asm/hello_world.s | 67 + testbench/asm/hello_world2.s | 71 + testbench/asm/hello_world_dccm.ld | 12 + testbench/asm/hello_world_dccm.s | 1 + testbench/flist | 52 + testbench/hex/data.hex | 8 + testbench/hex/program.hex | 18 + testbench/input.tcl | 4 + testbench/link.ld | 12 + testbench/tb_top.sv | 882 ++++++++++ testbench/test_tb_top.cpp | 71 + tools/JSON.pm | 2267 ++++++++++++++++++++++++ tools/Makefile | 152 ++ tools/addassign | 46 + tools/coredecode | 198 +++ tools/picmap | 59 + tools/smalldiv | 121 ++ tools/unrollforverilator | 169 ++ 75 files changed, 31978 insertions(+), 2 deletions(-) create mode 100644 LICENSE create mode 100644 configs/README.md create mode 100755 configs/swerv.config create mode 100644 design/dbg/el2_dbg.sv create mode 100644 design/dec/cdecode create mode 100644 design/dec/csrdecode create mode 100644 design/dec/decode create mode 100644 design/dec/el2_dec.sv create mode 100644 design/dec/el2_dec_decode_ctl.sv create mode 100644 design/dec/el2_dec_gpr_ctl.sv create mode 100644 design/dec/el2_dec_ib_ctl.sv create mode 100644 design/dec/el2_dec_tlu_ctl.sv create mode 100644 design/dec/el2_dec_trigger.sv create mode 100644 design/dmi/dmi_jtag_to_core_sync.v create mode 100644 design/dmi/dmi_wrapper.v create mode 100644 design/dmi/rvjtag_tap.v create mode 100644 design/el2_dma_ctrl.sv create mode 100644 design/el2_mem.sv create mode 100644 design/el2_pic_ctrl.sv create mode 100644 design/el2_swerv.sv create mode 100644 design/el2_swerv_wrapper.sv create mode 100644 design/exu/el2_exu.sv create mode 100644 design/exu/el2_exu_alu_ctl.sv create mode 100644 design/exu/el2_exu_div_ctl.sv create mode 100644 design/exu/el2_exu_mul_ctl.sv create mode 100644 design/ifu/el2_ifu.sv create mode 100644 design/ifu/el2_ifu_aln_ctl.sv create mode 100644 design/ifu/el2_ifu_bp_ctl.sv create mode 100644 design/ifu/el2_ifu_compress_ctl.sv create mode 100644 design/ifu/el2_ifu_ic_mem.sv create mode 100644 design/ifu/el2_ifu_iccm_mem.sv create mode 100644 design/ifu/el2_ifu_ifc_ctl.sv create mode 100644 design/ifu/el2_ifu_mem_ctl.sv create mode 100644 design/ifu/el2_ifu_tb_memread.sv create mode 100644 design/include/el2_def.sv create mode 100644 design/lib/ahb_to_axi4.sv create mode 100644 design/lib/axi4_to_ahb.sv create mode 100644 design/lib/beh_lib.sv create mode 100644 design/lib/el2_lib.sv create mode 100644 design/lib/mem_lib.sv create mode 100644 design/lsu/el2_lsu.sv create mode 100644 design/lsu/el2_lsu_addrcheck.sv create mode 100644 design/lsu/el2_lsu_bus_buffer.sv create mode 100644 design/lsu/el2_lsu_bus_intf.sv create mode 100644 design/lsu/el2_lsu_clkdomain.sv create mode 100644 design/lsu/el2_lsu_dccm_ctl.sv create mode 100644 design/lsu/el2_lsu_dccm_mem.sv create mode 100644 design/lsu/el2_lsu_ecc.sv create mode 100644 design/lsu/el2_lsu_lsc_ctl.sv create mode 100644 design/lsu/el2_lsu_stbuf.sv create mode 100644 design/lsu/el2_lsu_trigger.sv create mode 100755 docs/RISC-V SweRV EL2 PRM.pdf create mode 100644 testbench/ahb_sif.sv create mode 100644 testbench/asm/cmark.c create mode 120000 testbench/asm/cmark_dccm.c create mode 120000 testbench/asm/cmark_dccm.ld create mode 100644 testbench/asm/hello_world.s create mode 100644 testbench/asm/hello_world2.s create mode 100644 testbench/asm/hello_world_dccm.ld create mode 120000 testbench/asm/hello_world_dccm.s create mode 100644 testbench/flist create mode 100755 testbench/hex/data.hex create mode 100644 testbench/hex/program.hex create mode 100644 testbench/input.tcl create mode 100644 testbench/link.ld create mode 100644 testbench/tb_top.sv create mode 100644 testbench/test_tb_top.cpp create mode 100644 tools/JSON.pm create mode 100755 tools/Makefile create mode 100755 tools/addassign create mode 100755 tools/coredecode create mode 100755 tools/picmap create mode 100755 tools/smalldiv create mode 100755 tools/unrollforverilator diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..4b24f09 --- /dev/null +++ b/LICENSE @@ -0,0 +1,69 @@ +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. diff --git a/README.md b/README.md index 2310d7a..a3c34ed 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,192 @@ -# Cores-SweRV-EL2 -Coming soon. +# EL2 SweRV RISC-V CoreTM 1.0 from Western Digital + +This repository contains the SweRV EL2 CoreTM design RTL + +## License + +By contributing to this project, you agree that your contribution is governed by [Apache-2.0](LICENSE). +Files under the [tools](tools/) directory may be available under a different license. Please review individual file for details. + +## Directory Structure + + ├── configs # Configurations Dir + │   └── snapshots # Where generated configuration files are created + ├── design # Design root dir + │   ├── dbg # Debugger + │   ├── dec # Decode, Registers and Exceptions + │   ├── dmi # DMI block + │   ├── exu # EXU (ALU/MUL/DIV) + │   ├── ifu # Fetch & Branch Prediction + │   ├── include + │   ├── lib + │   └── lsu # Load/Store + ├── docs + ├── tools # Scripts/Makefiles + └── testbench # (Very) simple testbench +    ├── asm # Example assembly files +    └── hex # Canned demo hex files + +## Dependencies + +- Verilator **(4.020 or later)** must be installed on the system if running with verilator +- If adding/removing instructions, espresso must be installed (used by *tools/coredecode*) +- RISCV tool chain (based on gcc version 7.3 or higher) must be +installed so that it can be used to prepare RISCV binaries to run. + +## Quickstart guide +1. Clone the repository +1. Setup RV_ROOT to point to the path in your local filesystem +1. Determine your configuration {optional} +1. Run make with tools/Makefile + +## Release Notes for this version +Please see [release notes](release-notes.md) for changes and bug fixes in this version of SweRV + +### Configurations + +SweRV can be configured by running the `$RV_ROOT/configs/swerv.config` script: + +`% $RV_ROOT/configs/swerv.config -h` for detailed help options + +For example to build with a DCCM of size 64 Kb: + +`% $RV_ROOT/configs/swerv.config -dccm_size=64` + +This will update the **default** snapshot in $RV_ROOT/configs/snapshots/default/ with parameters for a 64K DCCM. + +Add `-snapshot=dccm64`, for example, if you wish to name your build snapshot *dccm64* and refer to it during the build. + +There are 4 predefined target configurations: `default`, `default_ahb`, `typical_pd` and `high_perf` that can be selected via +the `-target=name` option to swerv.config. + +This script derives the following consistent set of include files : + + $RV_ROOT/configs/snapshots/default + ├── common_defines.vh # `defines for testbench or design + ├── defines.h # #defines for C/assembly headers + ├── el2_param.vh # Design parameters + ├── el2_pdef.vh # Parameter structure + ├── pd_defines.vh # `defines for physical design + ├── perl_configs.pl # Perl %configs hash for scripting + ├── pic_map_auto.h # PIC memory map based on configure size + └── whisper.json # JSON file for swerv-iss + + + +### Building a model + +while in a work directory: + +1. Set the RV_ROOT environment variable to the root of the SweRV directory structure. +Example for bash shell: + `export RV_ROOT=/path/to/swerv` +Example for csh or its derivatives: + `setenv RV_ROOT /path/to/swerv` + +1. Create your specific configuration + + *(Skip if default is sufficient)* + *(Name your snapshot to distinguish it from the default. Without an explicit name, it will update/override the __default__ snapshot)* + For example if `mybuild` is the name for the snapshot: + + set BUILD_PATH environment variable: + + `setenv BUILD_PATH snapshots/mybuild` + + `$RV_ROOT/configs/swerv.config [configuration options..] -snapshot=mybuild` + + Snapshots are placed in `$BUILD_PATH` directory + + +1. Running a simple Hello World program (verilator) + + `make -f $RV_ROOT/tools/Makefile` + +This command will build a verilator model of SweRV EL2 with AXI bus, and +execute a short sequence of instructions that writes out "HELLO WORLD" +to the bus. + + +The simulation produces output on the screen like: +``` + +VerilatorTB: Start of sim + +---------------------------------- +Hello World from SweRV EL2 @WDC !! +---------------------------------- +TEST_PASSED + +Finished : minstret = 437, mcycle = 922 +See "exec.log" for execution trace with register updates.. + +``` +The simulation generates following files: + + `console.log` contains what the cpu writes to the console address of 0xd0580000. + `exec.log` shows instruction trace with GPR updates. + `trace_port.csv` contains a log of the trace port. + When `debug=1` is provided, a vcd file `sim.vcd` is created and can be browsed by + gtkwave or similar waveform viewers. + +You can re-execute simulation using: + ` ./obj_dir/Vtb_top ` +or + `make -f $RV_ROOT/tools/Makefile verilator` + + + +The simulation run/build command has following generic form: + + make -f $RV_ROOT/tools/Makefile [] [debug=1] [snapshot=mybuild] [target=] [TEST=] [TEST_DIR=] + +where: +``` + - can be 'verilator' (by default) 'irun' - Cadence xrun, 'vcs' - Synopsys VCS + if not provided, 'make' cleans work directory, builds verilator executable and runs a test. +debug=1 - allows VCD generation for verilator and VCS and SHM waves for irun option. + - predefined CPU configurations 'default' ( by default), 'default_ahb', 'typical_pd', 'high_perf' +TEST - allows to run a C (.c) or assembly (.s) test, hello_world2 is run by default +TEST_DIR - alternative to test source directory testbench/asm + - run and build executable model of custom CPU configuration, remember to provide 'snapshot' argument + for runs on custom configurations. + +``` +Example: + + make -f $RV_ROOT/tools/Makefile verilator TEST=cmark + +will simulate testbench/asm/cmark.c program with verilator + + +If you want to compile a test only, you can run: + + make -f $RV_ROOT/tools/Makefile program.hex TEST= [TEST_DIR=/path/to/dir] + + +For the cmark test, the script in `$RV_ROOT/tools/calc_cmarks.pl` can be used +to extract the core-marks score by invoking that script in the run +directory. + +The Makefile uses `$RV_ROOT/testbench/linker.ld` file by default to build test executable. +User can provide test specific linker file in form `.ld` to build the test executable, + in the same directory with the test source. + +User also can create a test specific makefile in form `.makefile`, containing building instructions +how to create `program.hex` and `data.hex` files used by simulation. The private makefile should be in the same directory +as the test source. +*(`program.hex` file is loaded to instruction bus memory slave and 'data.hex' file is loaded to LSU bus memory slave and +optionally to DCCM at the beginning of simulation)*. + +The `$RV_ROOT/testbench/asm` directory contains following tests ready to simulate: +``` +hello_world2 - default tes to run, prints Hello World message to screen and console.log +hello_world_dccm - the same as above, but takes the string from preloaded DCCM. +cmark - coremark benchmark running with code and data in external memories +cmark_dccm - the same as above, running data and stack from DCCM (faster) +``` + +---- +Western Digital, the Western Digital logo, G-Technology, SanDisk, Tegile, Upthere, WD, SweRV Core, SweRV ISS, +and OmniXtend are registered trademarks or trademarks of Western Digital Corporation or its affiliates in the US +and/or other countries. All other marks are the property of their respective owners. diff --git a/configs/README.md b/configs/README.md new file mode 100644 index 0000000..dd2e59a --- /dev/null +++ b/configs/README.md @@ -0,0 +1,41 @@ +# SweRV RISC-V EL2 core from Western Digital + +## Configuration + +### Contents +Name | Description +---------------------- | ------------------------------ +swerv.config | Configuration script for SweRV-EL2 + + +This script will generate a consistent set of `defines/#defines/parameters` needed for the design and testbench. +A perl hash (*perl_configs.pl*) and a JSON format for SweRV-iss are also generated. +This set of include files : + + $RV_ROOT/configs/snapshots/ + ├── common_defines.vh # `defines for testbench + ├── defines.h # #defines for C/assembly headers + ├── el2_param.vh # Actual Design parameters + ├── el2_pdef.vh # Parameter structure definition + ├── pd_defines.vh # `defines for physical design + ├── perl_configs.pl # Perl %configs hash for scripting + ├── el2_pic_ctrl_verilator_unroll.sv # Unrolled verilog based on PIC size (for verilator only) + ├── pic_map_auto.h # PIC memory map based on configure size + └── whisper.json # JSON file for swerv-iss + + + +While the defines may be modified by hand, it is recommended that this script be used to generate a consistent set. + +### Targets +There are 4 predefined target configurations: `default`, `default_ahb`, `typical_pd` and `high_perf` that can be selected via the `-target=name` option to swerv.config. + +Target | Description +---------------------- | ------------------------------ +default | Default configuration. AXI4 bus interface. +default_ahb | Default configuration, AHB-Lite bus interface +typical_pd | No ICCM, AXI4 bus interface +high_perf | Large BTB/BHT, AXI4 interface + + +`swerv.config` may be edited to add additional target configurations, or new configurations may be created via the command line `-set` or `-unset` options. diff --git a/configs/swerv.config b/configs/swerv.config new file mode 100755 index 0000000..ab3dda3 --- /dev/null +++ b/configs/swerv.config @@ -0,0 +1,2234 @@ +#! /usr/bin/env perl + +use strict; # Do not turn this off or else +use Data::Dumper; +use Getopt::Long; +##use Bit::Vector; +use lib "$ENV{RV_ROOT}/tools"; +use JSON; + +my ($self) = $0 =~ m/.*\/(\w+)/o; +my @argv_orig = @ARGV; + + +# Master configuration file +# +# Configuration is perl hash +# Output are define files for various flows +# Verilog (`defines common to RTL/TB) +# Software (#defines) +# Whisper (JSON/#defines) +# +# Default values and valid ranges should be specified +# Can be overridden via the cmd line (-set=name=value-string) +# +# Format of the hash is +# name => VALUE | LIST | HASH +# +# Special name "inside" followed by list .. values must be one of provided list +# Special name "derive" followed by equation to derive +# + +# Dump verilog/assembly macros in upper case +my $defines_case = "U"; + +# Include these macros in verilog (pattern matched) +my @verilog_vars = qw (xlen config_key reset_vec tec_rv_icg numiregs nmi_vec target protection.* testbench.* dccm.* retstack core.* iccm.* btb.* bht.* icache.* pic.* regwidth memmap bus.*); + +# Include these macros in assembly (pattern matched) +my @asm_vars = qw (xlen reset_vec nmi_vec target dccm.* iccm.* pic.* memmap bus.* testbench.* protection.* core.*); +my @asm_overridable = qw (reset_vec nmi_vec) ; + +# Include these macros in PD (pattern matched) +my @pd_vars = qw (physical retstack target btb.* bht.* dccm.* iccm.* icache.* pic.* reset_vec nmi_vec build_ahb_lite datawidth bus.*); + +# Dump non-derived/settable vars/values for these vars in stdout : +my @dvars = qw(retstack btb bht core dccm iccm icache pic bus protection memmap); + +# Prefix all macros with +my $prefix = "RV_"; +# No prefix if keyword has +my $no_prefix = 'RV|TOP|^tec_|regwidth|clock_period|assert_on|^datawidth|^physical|verilator|SDVT_AHB'; + +my $vlog_use__wh = 1; + +my %regions_used = (); + +# Cmd Line options#{{{ +our %sets; +our %unsets; +my $help; +my @sets = (); +my @unsets = (); + +#Configurations may be changed via the -set option +# +# -set=name=value : Change the default config parameter value (lowercase)\n"; +# -unset=name : Remove the default config parameter (lowercase)\n"; +# : Do not prepend RV_ prefex to -set/-unset variables\n"; +# : multiple -set/-unset options accepted\n\n"; +# + +my $helpusage = " + +Main configuration database for SWERV + +This script documents, and generates the {`#} define/include files for verilog/assembly/backend flows + +It is run by vsim (with defaults) every time the file changes, or when -config_set=VAR=value options are passed to vsim + +This script can be run stand-alone by processes not running vsim + +User options: + + -target = {default, typical_pd, high_perf, default_ahb} + use default settings for one of the targets + + -set=var=value + set arbitrary variable(parameter) to a value + -unset=var + unset any definitions for var + -snapshot=name + name the configuration (only if no -target specified) + +Parameters that can be set by the end user: + + -set=ret_stack_size = {2, 3, 4, ... 8} + size of return stack + -set=btb_size = { 32, 64, 128, 256, 512 } + size of branch target buffer + -set=bht_size = {32, 64, 128, 256, 512, 1024, 2048} + size of branch history buffer + -set=dccm_enable = {0,1} + DCCM enabled + -set=dccm_num_banks = {2, 4} + DCCM number of banks + -set=dccm_region = { 0x0, 0x1, ... 0xf } + number of 256Mb memory region containig DCCM + -set=dccm_offset = hexadecimal + offset (in bytes) of DCCM witin dccm_region + dccm address will be: 256M * dccm_region + dccm_offset\", and that must be aligned + to the dccm size or the next larger power of 2 if size is not a power of 2 + -set=dccm_size = { 4, 8, 16, 32, 48, 64, 128, 256, 512 } kB + size of DCCM + -set=dma_buf_depth = {2,4,5} + DMA buffer depth + -set=fast_interrupt_redirect = {0, 1} + Fast interrupt redirect mechanism + -set=iccm_enable = { 0, 1 } + whether or not ICCM is enabled + -set=icache_enable = { 0, 1 } + whether or not icache is enabled + -set=icache_waypack = { 0, 1 } + whether or not icache packing is enabled + -set=icache_ecc = { 0, 1 } + whether or not icache has ecc - EXPENSIVE 30% sram growth + default: icache_ecc==0 (parity) + -set=icache_size = { 8, 16, 32, 64, 128, 256 } kB + size of icache + -set=icache_num_ways { 2,4} + Number of ways in icache + -set=iccm_region = { 0x0, 0x1, ... 0xf } + number of 256Mb memory region containing ICCM + -set=iccm_offset = hexadecimal + offcet (in bytes) of ICCM within iccm_region + iccm address will be: \"256M * iccm_region + iccm_offset\", and that must be aligned + to the iccm size or the next larger power of 2 if size is not a power of 2 + -set=iccm_size = { 4 , 8 , 16 , 32, 64, 128, 256, 512 } kB + size of ICCM + -set=iccm_num_banks = {2,4,8,16} + Number of ICCM banks + -set=lsu_stbuf_depth = {2,4,8 } + LSU stbuf depth + -set=lsu_num_nbload = {2,4,8 } + LSU number of outstanding Non Blocking loads + -set=load_to_use_plus1 = {0 1} + Load to use latency (fast or +1cycle) + -set=pic_2cycle = { 0, 1 } + whether or not 2-cycle PIC is enabled (2 cycle pic may result + in an overall smaller cycle time) + -set=pic_region = { 0x0, 0x1, ... 0xf } + number of 256Mb memory region containing PIC memory-mapped registers + -set=pic_offset = hexadecial + offset (in bytes) of PIC within pic_region + pic address will be: \"256M * pic_region + pic_offset\", and that must be aligned + to the pic size or the next larger power of 2 if size is not a power of 2 + -set=pic_size = { 32, 64, 128, 256 } kB + size of PIC + -set=pic_total_int = { 1, 2, 3, ..., 255 } + number of interrupt sources in PIC + + + {inst|data}_access_enable[0-7] : default 0 + {inst|data}_access_addr[0-7] : default 0x00000000 + {inst|data}_access_mask[0-7] : default 0xffffffff +"; + + +my $ret_stack_size; +my $btb_size; +my $bht_size; +my $dccm_region; +my $dccm_offset; +my $dccm_size; +my $iccm_enable; +my $icache_enable; +my $icache_waypack; +my $icache_num_ways; +my $icache_banks_way; +my $icache_ln_sz; +my $icache_bank_width; +my $icache_ecc; +my $iccm_region; +my $iccm_offset; +my $iccm_size; +my $icache_size; +my $pic_2cycle; +my $pic_region; +my $pic_offset; +my $pic_size; +my $pic_total_int; + +my $top_align_iccm = 0; + +my $target = "default"; +my $snapshot ; +my $build_path ; +my $verbose; +my $load_to_use_plus1; +my $dccm_enable; +my $icache_2banks; +my $lsu_stbuf_depth; +my $dma_buf_depth; +my $lsu_num_nbload; +my $dccm_num_banks; +my $iccm_num_banks; +my $verilator; + +my $fast_interrupt_redirect = 1; # ON by default +$ret_stack_size=8; +$btb_size=512; +$bht_size=512; +$dccm_enable=1; +$dccm_region="0xf"; +$dccm_offset="0x40000"; #1*256*1024 +$dccm_size=64; +$dccm_num_banks=4; +$iccm_enable=1; +$iccm_region="0xe"; +$top_align_iccm = 1; +$iccm_offset="0xe000000"; #0x380*256*1024 +$iccm_size=64; +$iccm_num_banks=4; +$icache_enable=1; +$icache_waypack=0; +$icache_num_ways=2; +$icache_banks_way=2; +$icache_2banks=1; +$icache_bank_width=8; +$icache_ln_sz=64; +$icache_ecc=1; +$icache_size=16; +$pic_2cycle=0; +$pic_region="0xf"; +$pic_offset="0xc0000"; # 3*256*1024 +$pic_size=32; +$pic_total_int=31; +$load_to_use_plus1=0; +$lsu_stbuf_depth=4; +$dma_buf_depth=5; +$lsu_num_nbload=4; + +GetOptions( + "help" => \$help, + "target=s" => \$target, + "snapshot=s" => \$snapshot, + "verbose" => \$verbose, + "load_to_use_plus1" => \$load_to_use_plus1, + "ret_stack_size=s" => \$ret_stack_size, + "btb_size=s" => \$btb_size, + "bht_size=s" => \$bht_size, + "dccm_enable=s" => \$dccm_enable, + "dccm_region=s" => \$dccm_region, + "dccm_offset=s" => \$dccm_offset, + "dccm_size=s" => \$dccm_size, + "dma_buf_depth" => \$dma_buf_depth, + "iccm_enable=s" => \$iccm_enable, + "icache_enable=s" => \$icache_enable, + "icache_waypack=s" => \$icache_waypack, + "icache_num_ways=s" => \$icache_num_ways, + "icache_ln_sz=s" => \$icache_ln_sz, + "icache_ecc=s" => \$icache_ecc, + "icache_2banks=s" => \$icache_2banks, + "iccm_region=s" => \$iccm_region, + "iccm_offset=s" => \$iccm_offset, + "iccm_size=s" => \$iccm_size, + "lsu_stbuf_depth" => \$lsu_stbuf_depth, + "lsu_num_nbload" => \$lsu_num_nbload, + "pic_2cycle=s" => \$pic_2cycle, + "pic_region=s" => \$pic_region, + "pic_offset=s" => \$pic_offset, + "pic_size=s" => \$pic_size, + "pic_total_int=s" => \$pic_total_int, + "icache_size=s" => \$icache_size, + "set=s@" => \@sets, + "unset=s@" => \@unsets, +) || die("$helpusage"); + +if ($help) { + print "$helpusage\n"; + exit; +} + +if (!defined $snapshot ) { + $snapshot = $target; +} + +if (!defined $ENV{BUILD_PATH}) { + $build_path = "$ENV{RV_ROOT}/configs/snapshots/$snapshot" ; +} else { + $build_path = $ENV{BUILD_PATH}; +} + +if (! -d "$build_path") { + system ("mkdir -p $build_path"); +} + +# Parameter file +my $tdfile = "$build_path/el2_pdef.vh"; +my $paramfile = "$build_path/el2_param.vh"; + +# Verilog defines file path +my $vlogfile = "$build_path/common_defines.vh"; + +# Assembly defines file path +my $asmfile = "$build_path/defines.h"; + +# PD defines file path +my $pdfile = "$build_path/pd_defines.vh"; + +# Whisper config file path +my $whisperfile = "$build_path/whisper.json"; + +# Perl defines file path +my $perlfile = "$build_path/perl_configs.pl"; + +my $opensource=0; + + + +# IDEA: is ghr at 5b the right size for el2 core + +if ($target eq "default") { +} +elsif ($target eq "typical_pd") { + print "$self: Using target \"typical_pd\"\n"; + $ret_stack_size=2; + $btb_size=32; + $bht_size=128; + $dccm_size=16; + $dccm_num_banks=2; + $iccm_enable=0; +} +elsif ($target eq "high_perf") { + print "$self: Using target \"high_perf\"\n"; + $btb_size=512; + $bht_size=2048; +} +elsif ($target eq "default_ahb") { + print "$self: Using target \"default_ahb\"\n"; +} +else { + die "$self: ERROR! Unsupported target \"$target\". Supported are 'default', 'default_ahb', 'typical_pd', 'high_perf'\n" ; +} + + + +# Configure triggers +our @triggers = (#{{{ + { + "reset" => ["0x23e00000", "0x00000000", "0x00000000"], + "mask" => ["0x081818c7", "0xffffffff", "0x00000000"], + "poke_mask" => ["0x081818c7", "0xffffffff", "0x00000000"] + }, + { + "reset" => ["0x23e00000", "0x00000000", "0x00000000"], + "mask" => ["0x081818c7", "0xffffffff", "0x00000000"], + "poke_mask" => ["0x081818c7", "0xffffffff", "0x00000000"] + }, + { + "reset" => ["0x23e00000", "0x00000000", "0x00000000"], + "mask" => ["0x081818c7", "0xffffffff", "0x00000000"], + "poke_mask" => ["0x081818c7", "0xffffffff", "0x00000000"] + }, + { + "reset" => ["0x23e00000", "0x00000000", "0x00000000"], + "mask" => ["0x081818c7", "0xffffffff", "0x00000000"], + "poke_mask" => ["0x081818c7", "0xffffffff", "0x00000000"] + }, + );#}}} + + +# Configure CSRs +our %csr = (#{{{ + "mstatus" => { + "reset" => "0x1800", # MPP bits hard wired to binrary 11. + "mask" => "0x88", # Only mpie(7) & mie(3) bits writeable + "exists" => "true", + }, + "mie" => { + "reset" => "0x0", + # Only external, timer, local, and software writeable + "mask" => "0x40000888", + "exists" => "true", + }, + "mip" => { + "reset" => "0x0", + # None of the bits are writeable using CSR instructions + "mask" => "0x0", + # Bits corresponding to error overflow, external, timer and stoftware + # interrupts are modifiable + "poke_mask" => "0x40000888", + "exists" => "true", + }, + "mcountinhibit" => { + "commnet" => "Performance counter inhibit. One bit per counter.", + "reset" => "0x0", + "mask" => "0x7d", + "poke_mask" => "0x7d", + "exists" => "true", + }, + "mvendorid" => { + "reset" => "0x45", + "mask" => "0x0", + "exists" => "true", + }, + "marchid" => { + "reset" => "0x00000010", + "mask" => "0x0", + "exists" => "true", + }, + "mimpid" => { + "reset" => "0x1", + "mask" => "0x0", + "exists" => "true", + }, + "misa" => { + "reset" => "0x40001104", + "mask" => "0x0", + "exists" => "true", + }, + "tselect" => { + "reset" => "0x0", + "mask" => "0x3", # Four triggers + "exists" => "true", + }, + "mhartid" => { + "reset" => "0x0", + "mask" => "0x0", + "poke_mask" => "0xfffffff0", + "exists" => "true", + }, + "dcsr" => { + "reset" => "0x40000003", + "mask" => "0x00008c04", + "poke_mask" => "0x00008dcc", # cause field modifiable, nmip modifiable + "exists" => "true", + "debug" => "true", + }, + "cycle" => { + "exists" => "false", + }, + "time" => { + "exists" => "false", + }, + "instret" => { + "exists" => "false", + }, + "mhpmcounter3" => { + "reset" => "0x0", + "mask" => "0xffffffff", + "exists" => "true", + }, + "mhpmcounter4" => { + "reset" => "0x0", + "mask" => "0xffffffff", + "exists" => "true", + }, + "mhpmcounter5" => { + "reset" => "0x0", + "mask" => "0xffffffff", + "exists" => "true", + }, + "mhpmcounter6" => { + "reset" => "0x0", + "mask" => "0xffffffff", + "exists" => "true", + }, + "mhpmcounter3h" => { + "reset" => "0x0", + "mask" => "0xffffffff", + "exists" => "true", + }, + "mhpmcounter4h" => { + "reset" => "0x0", + "mask" => "0xffffffff", + "exists" => "true", + }, + "mhpmcounter5h" => { + "reset" => "0x0", + "mask" => "0xffffffff", + "exists" => "true", + }, + "mhpmcounter6h" => { + "reset" => "0x0", + "mask" => "0xffffffff", + "exists" => "true", + }, + "mhpmevent3" => { + "reset" => "0x0", + "mask" => "0xffffffff", + "exists" => "true", + }, + "mhpmevent4" => { + "reset" => "0x0", + "mask" => "0xffffffff", + "exists" => "true", + }, + "mhpmevent5" => { + "reset" => "0x0", + "mask" => "0xffffffff", + "exists" => "true", + }, + "mhpmevent6" => { + "reset" => "0x0", + "mask" => "0xffffffff", + "exists" => "true", + }, +# Remaining CSRs are non-standard. These are specific to SWERV + "dicawics" => { + "number" => "0x7c8", + "reset" => "0x0", + "mask" => "0x0130fffc", + "exists" => "true", + }, + "dicad0" => { + "number" => "0x7c9", + "reset" => "0x0", + "mask" => "0xffffffff", + "exists" => "true", + }, + "dicad1" => { + "number" => "0x7ca", + "reset" => "0x0", + "mask" => "0x3", + "exists" => "true", + }, + "dicago" => { + "number" => "0x7cb", + "reset" => "0x0", + "mask" => "0x0", + "exists" => "true", + }, + "mcpc" => { + "comment" => "Core pause", + "number" => "0x7c2", + "reset" => "0x0", + "mask" => "0x0", + "exists" => "true", + }, + "mpmc" => { + "number" => "0x7c6", + "reset" => "0x2", + "mask" => "0x2", + "exists" => "true", + }, + "micect" => { + "number" => "0x7f0", + "reset" => "0x0", + "mask" => "0xffffffff", + "exists" => "true", + }, + "miccmect" => { + "number" => "0x7f1", + "reset" => "0x0", + "mask" => "0xffffffff", + "exists" => "true", + }, + "mdccmect" => { + "number" => "0x7f2", + "reset" => "0x0", + "mask" => "0xffffffff", + "exists" => "true", + }, + "mcgc" => { + "number" => "0x7f8", + "reset" => "0x0", + "mask" => "0x000001ff", + "poke_mask" => "0x000001ff", + "exists" => "true", + }, + "mfdc" => { + "number" => "0x7f9", + "reset" => "0x00070000", + "mask" => "0x00070fff", + "exists" => "true", + }, + "mrac" => { + "comment" => "Memory region io and cache control.", + "number" => "0x7c0", + "reset" => "0x0", + "mask" => "0xffffffff", + "exists" => "true", + "shared" => "true", + }, + "dmst" => { + "comment" => "Memory synch trigger: Flush caches in debug mode.", + "number" => "0x7c4", + "reset" => "0x0", + "mask" => "0x0", + "exists" => "true", + "debug" => "true", + }, + "dicawics" => { + "comment" => "Cache diagnostics.", + "number" => "0x7c8", + "reset" => "0x0", + "mask" => "0x0130fffc", + "exists" => "true", + "debug" => "true", + }, + "dicad0" => { + "comment" => "Cache diagnostics.", + "number" => "0x7c9", + "reset" => "0x0", + "mask" => "0xffffffff", + "exists" => "true", + "debug" => "true", + }, + "dicad1" => { + "comment" => "Cache diagnostics.", + "number" => "0x7ca", + "reset" => "0x0", + "mask" => "0x3", + "exists" => "true", + "debug" => "true", + }, + "dicago" => { + "comment" => "Cache diagnostics.", + "number" => "0x7cb", + "reset" => "0x0", + "mask" => "0x0", + "exists" => "true", + "debug" => "true", + }, + "meipt" => { + "comment" => "External interrupt priority threshold.", + "number" => "0xbc9", + "reset" => "0x0", + "mask" => "0xf", + "exists" => "true", + }, + "meicpct" => { + "comment" => "External claim id/priority capture.", + "number" => "0xbca", + "reset" => "0x0", + "mask" => "0x0", + "exists" => "true", + }, + "meicidpl" => { + "comment" => "External interrupt claim id priority level.", + "number" => "0xbcb", + "reset" => "0x0", + "mask" => "0xf", + "exists" => "true", + }, + "meicurpl" => { + "comment" => "External interrupt current priority level.", + "number" => "0xbcc", + "reset" => "0x0", + "mask" => "0xf", + "exists" => "true", + }, + "mscause" => { + "number" => "0x7ff", + "reset" => "0x0", + "mask" => "0x00000007", + "exists" => "true", + }, +);#}}} + + +foreach my $i (0 .. 3) { + $csr{"pmpcfg$i"} = { "exists" => "false" }; +} + +foreach my $i (0 .. 15) { + $csr{"pmpaddr$i"} = { "exists" => "false" }; +} + + + +# }}} +# Main config hash, with default values +# +# Hash can be hierarchical with arbitrary levels +# Hexadecimal values are prefixed with 0x +# +# For verilog, if bit width is expected, add to %width hash below +# +# NOTE: params/keys marked 'derived' are not settable via cmd line, unless they ALSO have the 'overridable' tag +# +our %config = (#{{{ + "harts" => "1", + "xlen" => "32", # Testbench, Do Not Override + "numiregs" => "32", # Testbench, Do Not Override + "regwidth" => "32", # Testbench, Do Not Override + "reset_vec" => "0x80000000", # Testbench, Overridable + "nmi_vec" => "0x11110000", # Testbench, Overridable + "physical" => "1", + "num_mmode_perf_regs" => "4", # Whisper only + "max_mmode_perf_event" => "516", # Whisper only: performance counters event ids will be clamped to this + "target" => $target, # Flow Infrastructure + "config_key" => "derived", + "tec_rv_icg" => "clockhdr", + + "retstack" => { + "ret_stack_size" => "$ret_stack_size", # Design Parm, Overridable + }, + + "btb" => { + "btb_size" => "$btb_size", # Design Parm, Overridable + "btb_index1_hi" => "derived", + "btb_index1_lo" => "2", # Constant, Do Not Override + "btb_index2_hi" => "derived", + "btb_index2_lo" => "derived", + "btb_index3_hi" => "derived", + "btb_index3_lo" => "derived", + "btb_addr_hi" => "derived", + "btb_array_depth" => "derived", + "btb_addr_lo" => "2", # Constant, Do Not Override + "btb_btag_size" => "derived", + "btb_btag_fold" => "derived", + "btb_fold2_index_hash" => "derived", + }, + "bht" => { + "bht_size" => "$bht_size", # Design Parm, Overridable + "bht_addr_hi" => "derived", + "bht_addr_lo" => "2", # Constant, Do Not Override + "bht_array_depth" => "derived", + "bht_ghr_size" => "derived", + "bht_ghr_range" => "derived", + "bht_hash_string" => "derived", + "bht_ghr_hash_1" => "derived", + }, + + "core" => { + "lsu_stbuf_depth" => "$lsu_stbuf_depth", # Design Parm, Overridable + "dma_buf_depth" => "$dma_buf_depth", # Design Parm, Overridable + "lsu_num_nbload" => "$lsu_num_nbload", # Design Parm, Overridable + "opensource" => "$opensource", # Flow Infrastructure + "verilator" => "$verilator", # Flow Infrastructure + "load_to_use_plus1" => "$load_to_use_plus1", # Design Parm, Overridable + "iccm_icache" => 'derived', # Used by design + "iccm_only" => 'derived', # Used by design + "icache_only" => 'derived', # Used by design + "no_iccm_no_icache" => 'derived', # Used by design + "fast_interrupt_redirect" => "$fast_interrupt_redirect" # Design Parm, Overridable + }, + + "dccm" => { + "dccm_enable" => "$dccm_enable", # Design Parm, Overridable + "dccm_region" => "$dccm_region", # Design Parm, Overridable + "dccm_offset" => "$dccm_offset", # Design Parm, Overridable + "dccm_size" => "$dccm_size", # Design Parm, Overridable + "dccm_num_banks" => "$dccm_num_banks", # Design Parm, Overridable + "dccm_sadr" => 'derived', + "dccm_eadr" => 'derived', + "dccm_bits" => 'derived', + "dccm_bank_bits" => 'derived', + "dccm_data_width" => 'derived', + "dccm_fdata_width" => 'derived', + "dccm_byte_width" => 'derived', + "dccm_width_bits" => 'derived', + "dccm_index_bits" => 'derived', + "dccm_ecc_width" => 'derived', + "lsu_sb_bits" => 'derived', + "dccm_data_cell" => 'derived', + "dccm_rows" => 'derived', + "dccm_reserved" => 'derived', # Testbench use only : reserve dccm space for SW/stack - no random r/w + }, + + + "iccm" => { + "iccm_enable" => "$iccm_enable", # Design Parm, Overridable + "iccm_region" => "$iccm_region", # Design Parm, Overridable + "iccm_offset" => "$iccm_offset", # Design Parm, Overridable + "iccm_size" => "$iccm_size", # Design Parm, Overridable + "iccm_num_banks" => "$iccm_num_banks", # Design Parm, Overridable + "iccm_bank_bits" => 'derived', + "iccm_index_bits" => 'derived', + "iccm_rows" => 'derived', + "iccm_data_cell" => 'derived', + "iccm_sadr" => 'derived', + "iccm_eadr" => 'derived', + "iccm_reserved" => 'derived', # Testbench use only : reserve iccm space for SW/handlers - no random r/w + "iccm_bank_hi" => 'derived', + "iccm_bank_index_lo" => 'derived', + }, + "icache" => { + "icache_enable" => "$icache_enable", # Design Parm, Overridable + "icache_waypack" => "$icache_waypack", # Design Parm, Overridable + "icache_num_ways" => "$icache_num_ways", # Design Parm, Overridable + "icache_banks_way" => "2", # Design Parm, Constant + "icache_bank_width" => "8", # Design Parm, Constant + "icache_ln_sz" => "$icache_ln_sz", # Design Parm, Overridable + "icache_size" => "$icache_size", # Design Parm, Overridable + "icache_bank_hi" => 'derived', + "icache_bank_lo" => 'derived', + "icache_data_cell" => 'derived', + "icache_tag_cell" => 'derived', + "icache_tag_depth" => 'derived', + "icache_data_depth" => 'derived', + "icache_num_lines" => 'derived', + "icache_num_lines_bank" => 'derived', + "icache_num_lines_way" => 'derived', + "icache_data_depth" => 'derived', + "icache_tag_lo" => 'derived', + "icache_index_hi" => 'derived', + "icache_data_index_lo" => 'derived', + "icache_data_width" => 'derived', + "icache_fdata_width" => 'derived', + "icache_tag_index_lo" => 'derived', + "icache_ecc" => "$icache_ecc", # Design Parm, Overridable + "icache_2banks" => "$icache_2banks", # Design Parm, Overridable + "icache_bank_bits" => "derived", + "icache_status_bits" => "derived", + "icache_num_beats" => "derived", + "icache_beat_bits" => "derived", + "icache_scnd_last" => "derived", + "icache_beat_addr_hi" => "derived", + }, + "pic" => { + "pic_2cycle" => "$pic_2cycle", # Design Parm, Overridable + "pic_region" => "$pic_region", # Design Parm, Overridable + "pic_offset" => "$pic_offset", # Design Parm, Overridable + "pic_size" => "$pic_size", # Design Parm, Overridable + "pic_base_addr" => 'derived', + "pic_total_int_plus1" => 'derived', # pic_total_int + 1 + "pic_total_int" => "$pic_total_int", # Design Parm, Overridable + "pic_int_words" => 'derived', # number of 32 bit words for packed registers (Xmax) + "pic_bits" => 'derived', # of bits needs to address the PICM + "pic_meipl_offset" => '0x0000', # Testbench only: Offset of meipl relative to pic_base_addr + "pic_meip_offset" => '0x1000', # Testbench only: Offset of meip relative to pic_base_addr + "pic_meie_offset" => '0x2000', # Testbench only: Offset of meie relative to pic_base_addr + "pic_mpiccfg_offset" => '0x3000', # Testbench only: Offset of mpiccfg relative to pic_base_addr + "pic_meipt_offset" => '0x3004', # Testbench only: Offset of meipt relative to pic_base_addr -- deprecated + "pic_meigwctrl_offset" => '0x4000', # Testbench only: gateway control regs relative to pic_base_addr + "pic_meigwclr_offset" => '0x5000' # Testbench only: gateway clear regs relative to pic_base_addr + + }, + "testbench" => { + "TOP" => "tb_top", + "RV_TOP" => "`TOP.rvtop", + "CPU_TOP" => "`RV_TOP.swerv", + "clock_period" => "100", + "build_ahb_lite" => "0", + "build_axi4" => "1", + "build_axi_native" => "1", + "assert_on" => "", + "ext_datawidth" => "64", + "ext_addrwidth" => "32", + "sterr_rollback" => "0", + "lderr_rollback" => "1", + "SDVT_AHB" => "1", + }, + "protection" => { # Design parms, Overridable + "inst_access_enable0" => "0x0", + "inst_access_addr0" => "0x00000000", + "inst_access_mask0" => "0xffffffff", + "inst_access_enable1" => "0x0", + "inst_access_addr1" => "0x00000000", + "inst_access_mask1" => "0xffffffff", + "inst_access_enable2" => "0x0", + "inst_access_addr2" => "0x00000000", + "inst_access_mask2" => "0xffffffff", + "inst_access_enable3" => "0x0", + "inst_access_addr3" => "0x00000000", + "inst_access_mask3" => "0xffffffff", + "inst_access_enable4" => "0x0", + "inst_access_addr4" => "0x00000000", + "inst_access_mask4" => "0xffffffff", + "inst_access_enable5" => "0x0", + "inst_access_addr5" => "0x00000000", + "inst_access_mask5" => "0xffffffff", + "inst_access_enable6" => "0x0", + "inst_access_addr6" => "0x00000000", + "inst_access_mask6" => "0xffffffff", + "inst_access_enable7" => "0x0", + "inst_access_addr7" => "0x00000000", + "inst_access_mask7" => "0xffffffff", + "data_access_enable0" => "0x0", + "data_access_addr0" => "0x00000000", + "data_access_mask0" => "0xffffffff", + "data_access_enable1" => "0x0", + "data_access_addr1" => "0x00000000", + "data_access_mask1" => "0xffffffff", + "data_access_enable2" => "0x0", + "data_access_addr2" => "0x00000000", + "data_access_mask2" => "0xffffffff", + "data_access_enable3" => "0x0", + "data_access_addr3" => "0x00000000", + "data_access_mask3" => "0xffffffff", + "data_access_enable4" => "0x0", + "data_access_addr4" => "0x00000000", + "data_access_mask4" => "0xffffffff", + "data_access_enable5" => "0x0", + "data_access_addr5" => "0x00000000", + "data_access_mask5" => "0xffffffff", + "data_access_enable6" => "0x0", + "data_access_addr6" => "0x00000000", + "data_access_mask6" => "0xffffffff", + "data_access_enable7" => "0x0", + "data_access_addr7" => "0x00000000", + "data_access_mask7" => "0xffffffff", + }, + "memmap" => { # Testbench only + "serialio" => 'derived, overridable', # Testbench only + "external_data" => 'derived, overridable', # Testbench only + "external_prog" => 'derived, overridable', # Testbench only + "debug_sb_mem" => 'derived, overridable', # Testbench only + "external_data_1" => 'derived, overridable', # Testbench only + "external_mem_hole" => 'derived, overridable', # Testbench only +# "consoleio" => 'derived', # Part of serial io. + }, + "bus" => { + "lsu_bus_tag" => 'derived', + "lsu_bus_id" => '1', # Design parm, Overridable, + "lsu_bus_prty" => '2', # Design parm, Overridable, + "dma_bus_tag" => '1', # Design parm, Overridable + "dma_bus_id" => '1', # Design parm, Overridable + "dma_bus_prty" => '2', # Design parm, Overridable + "sb_bus_tag" => '1', # Design parm, Overridable + "sb_bus_id" => '1', # Design parm, Overridable + "sb_bus_prty" => '2', # Design parm, Overridable + "ifu_bus_tag" => 'derived', + "ifu_bus_id" => '1', # Design parm, Overridable + "ifu_bus_prty" => '2', # Design parm, Overridable + "bus_prty_default" => '3', # Design parm, Overridable + }, + "triggers" => \@triggers, # Whisper only + "csr" => \%csr, # Whisper only + "even_odd_trigger_chains" => "true", # Whisper only +); + + +# These parms are used in the verilog and will be part of global parm structure +# need to have this be width in binary +# for now autosize to the data +our %verilog_parms = ( + "fast_interrupt_redirect" => '1', + "inst_access_enable0" => '1', + "inst_access_addr0" => '32', + "inst_access_mask0" => '32', + "inst_access_enable1" => '1', + "inst_access_addr1" => '32', + "inst_access_mask1" => '32', + "inst_access_enable2" => '1', + "inst_access_addr2" => '32', + "inst_access_mask2" => '32', + "inst_access_enable3" => '1', + "inst_access_addr3" => '32', + "inst_access_mask3" => '32', + "inst_access_enable4" => '1', + "inst_access_addr4" => '32', + "inst_access_mask4" => '32', + "inst_access_enable5" => '1', + "inst_access_addr5" => '32', + "inst_access_mask5" => '32', + "inst_access_enable6" => '1', + "inst_access_addr6" => '32', + "inst_access_mask6" => '32', + "inst_access_enable7" => '1', + "inst_access_addr7" => '32', + "inst_access_mask7" => '32', + "data_access_enable0" => '1', + "data_access_addr0" => '32', + "data_access_mask0" => '32', + "data_access_enable1" => '1', + "data_access_addr1" => '32', + "data_access_mask1" => '32', + "data_access_enable2" => '1', + "data_access_addr2" => '32', + "data_access_mask2" => '32', + "data_access_enable3" => '1', + "data_access_addr3" => '32', + "data_access_mask3" => '32', + "data_access_enable4" => '1', + "data_access_addr4" => '32', + "data_access_mask4" => '32', + "data_access_enable5" => '1', + "data_access_addr5" => '32', + "data_access_mask5" => '32', + "data_access_enable6" => '1', + "data_access_addr6" => '32', + "data_access_mask6" => '32', + "data_access_enable7" => '1', + "data_access_addr7" => '32', + "data_access_mask7" => '32', + "iccm_bits" => '5', + "iccm_bank_hi" => '5', + "iccm_bank_index_lo" => '5', + "icache_bank_bits" => '3', + "icache_status_bits" => '3', + "icache_num_beats" => '4', + "icache_beat_bits" => '4', + "icache_scnd_last" => '4', + "icache_beat_addr_hi" => '4', + "iccm_icache" => '1', + "iccm_only" => '1', + "icache_only" => '1', + "no_iccm_no_icache" => '1', + "build_axi4" => '1', + "build_ahb_lite" => '1', + "build_axi_native" => '1', + "lsu_num_nbload_width" => '3', + "lsu_num_nbload" => '5', + "ret_stack_size" => '4', + "btb_size" => '10', + "btb_index1_hi" => '5', + "btb_index1_lo" => '5', + "btb_index2_hi" => '5', + "btb_index2_lo" => '5', + "btb_index3_hi" => '5', + "btb_index3_lo" => '5', + "btb_addr_hi" => '5', + "btb_array_depth" => '9', + "btb_addr_lo" => '2', + "btb_btag_size" => '4', + "btb_btag_fold" => '1', + "btb_fold2_index_hash" => '1', + "bht_size" => '12', + "bht_addr_hi" => '4', + "bht_addr_lo" => '2', + "bht_array_depth" => '11', + "bht_ghr_size" => '4', + "bht_ghr_hash_1" => '1', + "lsu_stbuf_depth" => '4', + "dma_buf_depth" => '3', + "load_to_use_plus1" => '1', + "dccm_enable" => '1', + "dccm_region" => '4', + "dccm_size" => '10', + "dccm_num_banks" => '5', + "dccm_sadr" => '32', + "dccm_bits" => '5', + "dccm_bank_bits" => '3', + "dccm_data_width" => '6', + "dccm_fdata_width" => '6', + "dccm_byte_width" => '3', + "dccm_width_bits" => '2', + "dccm_index_bits" => '4', + "dccm_ecc_width" => '3', + "lsu_sb_bits" => '5', + "iccm_enable" => '1', + "iccm_region" => '4', + "iccm_size" => '10', + "iccm_num_banks" => '5', + "iccm_bank_bits" => '3', + "iccm_index_bits" => '4', + "iccm_sadr" => '32', + "icache_enable" => '1', + "icache_waypack" => '1', + "icache_num_ways" => '3', + "icache_banks_way" => '3', + "icache_bank_width" => '4', + "icache_ln_sz" => '7', + "icache_size" => '9', + "icache_bank_hi" => '3', + "icache_bank_lo" => '2', + "icache_tag_depth" => '13', + "icache_data_depth" => '14', + "icache_tag_lo" => '5', + "icache_index_hi" => '5', + "icache_data_index_lo" => '3', + "icache_data_width" => '7', + "icache_fdata_width" => '7', + "icache_tag_index_lo" => '3', + "icache_ecc" => '1', + "icache_2banks" => '1', + "pic_2cycle" => '1', + "pic_region" => '4', + "pic_size" => '9', + "pic_base_addr" => '32', + "pic_total_int_plus1" => '9', + "pic_total_int" => '8', + "pic_int_words" => '4', + "pic_bits" => '5', + "lsu_bus_tag" => '4', + "lsu_bus_id" => '1', + "lsu_bus_prty" => '2', + "dma_bus_tag" => '4', + "dma_bus_id" => '1', + "dma_bus_prty" => '2', + "sb_bus_tag" => '4', + "sb_bus_id" => '1', + "sb_bus_prty" => '2', + "ifu_bus_tag" => '4', + "ifu_bus_id" => '1', + "ifu_bus_prty" => '2', + "bus_prty_default" => '2', +); + + +# need to figure out what to do here +# for now none of these can be parameters + + +# move deletes lower + +# Perform any overrides first before derived values +map_set_unset(); + +gen_define("","", \%config,"",[]); + + +# perform final checks +my $c; +$c=$config{retstack}{ret_stack_size}; if (!($c >=2 && $c <=8)) { die("$helpusage\n\nFAIL: ret_stack_size == $c; ILLEGAL !!!\n\n"); } +$c=$config{btb}{btb_size}; if (!($c==32||$c==64||$c==128||$c==256||$c==512)) { die("$helpusage\n\nFAIL: btb_size == $c; ILLEGAL !!!\n\n"); } +$c=$config{iccm}{iccm_region}; if (!($c>=0 && $c<16)) { die("$helpusage\n\nFAIL: iccm_region == $c ILLEGAL !!!\n\n"); } +$c=$config{iccm}{iccm_offset}; if (!($c>=0 && $c<256*1024*1024 && ($c&0xfff)==0)) { die("$helpusage\n\nFAIL: iccm_offset == $c ILLEGAL !!!\n\n"); } +$c=$config{iccm}{iccm_size}; if (!($c==2||$c==4||$c==8||$c==16||$c==32||$c==64||$c==128||$c==256||$c==512)) { die("$helpusage\n\nFAIL: iccm_size == $c ILLEGAL !!!\n\n"); } +$c=$config{iccm}{iccm_num_banks}; if (!($c==2 || $c==4 || ($c==8 && $config{iccm}{iccm_size} != 2) || ($c==16 && $config{iccm}{iccm_size} > 4))) { die("$helpusage\n\nFAIL: iccm_num_banks == $c ILLEGAL !!!\n\n"); } +$c=$config{iccm}{iccm_enable}; if (!($c==0 || $c==1)) { die("$helpusage\n\nFAIL: iccm_enable == $c ILLEGAL !!!\n\n"); } +$c=$config{dccm}{dccm_region}; if (!($c>=0 && $c<16)) { die("$helpusage\n\nFAIL: dccm_region == $c ILLEGAL !!!\n\n"); } +$c=$config{dccm}{dccm_num_banks}; if (!(($c==2 && $config{dccm}{dccm_size} != 48) || $c==4 || ($c==8 && $config{dccm}{dccm_size} != 48) || ($c==16 && $config{dccm}{dccm_size} != 4 && $config{dccm}{dccm_size} != 48))) + { die("$helpusage\n\nFAIL: dccm_num_banks == $c ILLEGAL !!!\n\n"); } +$c=$config{dccm}{dccm_offset}; if (!($c>=0 && $c<256*1024*1024 && ($c&0xfff)==0)) { die("$helpusage\n\nFAIL: dccm_offset == $c ILLEGAL !!!\n\n"); } +$c=$config{dccm}{dccm_size}; if (!($c==4||$c==8||$c==16||$c==32||$c==48||$c==64||$c==128||$c==256||$c==512)) { die("$helpusage\n\nFAIL: dccm_size == $c ILLEGAL !!!\n\n"); } +$c=$config{pic}{pic_2cycle}; if (!($c==0 || $c==1)) { die("$helpusage\n\nFAIL: pic_2cycle == $c ILLEGAL !!!\n\n"); } +$c=$config{pic}{pic_region}; if (!($c>=0 && $c<16)) { die("$helpusage\n\nFAIL: pic_region == $c ILLEGAL !!!\n\n"); } +$c=$config{pic}{pic_offset}; if (!($c>=0 && $c<256*1024*1024 && ($c&0xfff)==0)) { die("$helpusage\n\nFAIL: pic_offset == $c ILLEGAL !!!\n\n"); } +$c=$config{pic}{pic_size}; if (!($c==32 || $c==64 || $c==128 || $c==256)) { die("$helpusage\n\nFAIL: pic_size == $c ILLEGAL !!!\n\n"); } +$c=$config{pic}{pic_total_int}; if ( $c<1 || $c>255) { die("$helpusage\n\nFAIL: pic_total_int == $c ILLEGAL !!!\n\n"); } +$c=$config{icache}{icache_enable}; if (!($c==0 || $c==1)) { die("$helpusage\n\nFAIL: icache_enable == $c ILLEGAL !!!\n\n"); } +$c=$config{icache}{icache_waypack}; if (!($c==0 || $c==1)) { die("$helpusage\n\nFAIL: icache_waypack == $c ILLEGAL !!!\n\n"); } +$c=$config{icache}{icache_num_ways}; if (!($c==2 || $c==4)) { die("$helpusage\n\nFAIL: icache_num_ways == $c ILLEGAL !!!\n\n"); } +$c=$config{icache}{icache_ln_sz}; if (!($c==32 || $c==64)) { die("$helpusage\n\nFAIL: icache_ln_sz == $c ILLEGAL !!!\n\n"); } +$c=$config{icache}{icache_size}; if (!($c==8 || $c==16 || $c==32 || $c==64 || $c==128 || $c==256)) { die("$helpusage\n\nFAIL: icache_size == $c ILLEGAL !!!\n\n"); } +$c=$config{core}{lsu_stbuf_depth}; if (!($c==2 || $c==4 || $c==8)) { die("$helpusage\n\nFAIL: lsu_stbuf_depth == $c ILLEGAL !!!\n\n"); } +$c=$config{core}{dma_buf_depth}; if (!($c==2 || $c==4 || $c==5)) { die("$helpusage\n\nFAIL: dma_buf_depth == $c ILLEGAL !!!\n\n"); } +$c=$config{core}{lsu_num_nbload}; if (!($c==2 || $c==4 || $c==8)) { die("$helpusage\n\nFAIL: lsu_num_nbload == $c ILLEGAL !!!\n\n"); } + +$c=$config{protection}{inst_access_addr0}; if ((hex($c)&0x3f) != 0) { die("$helpusage\n\nFAIL: inst_access_addr0 lower 6b must be 0s $c !!!\n\n"); } +$c=$config{protection}{inst_access_addr1}; if ((hex($c)&0x3f) != 0) { die("$helpusage\n\nFAIL: inst_access_addr1 lower 6b must be 0s !!!\n\n"); } +$c=$config{protection}{inst_access_addr2}; if ((hex($c)&0x3f) != 0) { die("$helpusage\n\nFAIL: inst_access_addr2 lower 6b must be 0s !!!\n\n"); } +$c=$config{protection}{inst_access_addr3}; if ((hex($c)&0x3f) != 0) { die("$helpusage\n\nFAIL: inst_access_addr3 lower 6b must be 0s !!!\n\n"); } +$c=$config{protection}{inst_access_addr4}; if ((hex($c)&0x3f) != 0) { die("$helpusage\n\nFAIL: inst_access_addr4 lower 6b must be 0s !!!\n\n"); } +$c=$config{protection}{inst_access_addr5}; if ((hex($c)&0x3f) != 0) { die("$helpusage\n\nFAIL: inst_access_addr5 lower 6b must be 0s !!!\n\n"); } +$c=$config{protection}{inst_access_addr6}; if ((hex($c)&0x3f) != 0) { die("$helpusage\n\nFAIL: inst_access_addr6 lower 6b must be 0s !!!\n\n"); } +$c=$config{protection}{inst_access_addr7}; if ((hex($c)&0x3f) != 0) { die("$helpusage\n\nFAIL: inst_access_addr7 lower 6b must be 0s !!!\n\n"); } +$c=$config{protection}{inst_access_mask0}; if ((hex($c)&0x3f) != 63 || invalid_mask($c)) { die("$helpusage\n\nFAIL: inst_access_mask0 invalid !!!\n\n"); } +$c=$config{protection}{inst_access_mask1}; if ((hex($c)&0x3f) != 63 || invalid_mask($c)) { die("$helpusage\n\nFAIL: inst_access_mask1 invalid !!!\n\n"); } +$c=$config{protection}{inst_access_mask2}; if ((hex($c)&0x3f) != 63 || invalid_mask($c)) { die("$helpusage\n\nFAIL: inst_access_mask2 invalid !!!\n\n"); } +$c=$config{protection}{inst_access_mask3}; if ((hex($c)&0x3f) != 63 || invalid_mask($c)) { die("$helpusage\n\nFAIL: inst_access_mask3 invalid !!!\n\n"); } +$c=$config{protection}{inst_access_mask4}; if ((hex($c)&0x3f) != 63 || invalid_mask($c)) { die("$helpusage\n\nFAIL: inst_access_mask4 invalid !!!\n\n"); } +$c=$config{protection}{inst_access_mask5}; if ((hex($c)&0x3f) != 63 || invalid_mask($c)) { die("$helpusage\n\nFAIL: inst_access_mask5 invalid !!!\n\n"); } +$c=$config{protection}{inst_access_mask6}; if ((hex($c)&0x3f) != 63 || invalid_mask($c)) { die("$helpusage\n\nFAIL: inst_access_mask6 invalid !!!\n\n"); } +$c=$config{protection}{inst_access_mask7}; if ((hex($c)&0x3f) != 63 || invalid_mask($c)) { die("$helpusage\n\nFAIL: inst_access_mask7 invalid !!!\n\n"); } +$c=$config{protection}{data_access_addr0}; if ((hex($c)&0x3f) != 0) { die("$helpusage\n\nFAIL: data_access_addr0 lower 6b must be 0s !!!\n\n"); } +$c=$config{protection}{data_access_addr1}; if ((hex($c)&0x3f) != 0) { die("$helpusage\n\nFAIL: data_access_addr1 lower 6b must be 0s !!!\n\n"); } +$c=$config{protection}{data_access_addr2}; if ((hex($c)&0x3f) != 0) { die("$helpusage\n\nFAIL: data_access_addr2 lower 6b must be 0s !!!\n\n"); } +$c=$config{protection}{data_access_addr3}; if ((hex($c)&0x3f) != 0) { die("$helpusage\n\nFAIL: data_access_addr3 lower 6b must be 0s !!!\n\n"); } +$c=$config{protection}{data_access_addr4}; if ((hex($c)&0x3f) != 0) { die("$helpusage\n\nFAIL: data_access_addr4 lower 6b must be 0s !!!\n\n"); } +$c=$config{protection}{data_access_addr5}; if ((hex($c)&0x3f) != 0) { die("$helpusage\n\nFAIL: data_access_addr5 lower 6b must be 0s !!!\n\n"); } +$c=$config{protection}{data_access_addr6}; if ((hex($c)&0x3f) != 0) { die("$helpusage\n\nFAIL: data_access_addr6 lower 6b must be 0s !!!\n\n"); } +$c=$config{protection}{data_access_addr7}; if ((hex($c)&0x3f) != 0) { die("$helpusage\n\nFAIL: data_access_addr7 lower 6b must be 0s !!!\n\n"); } +$c=$config{protection}{data_access_mask0}; if ((hex($c)&0x3f) != 63 || invalid_mask($c)) { die("$helpusage\n\nFAIL: data_access_mask0 invalid !!!\n\n"); } +$c=$config{protection}{data_access_mask1}; if ((hex($c)&0x3f) != 63 || invalid_mask($c)) { die("$helpusage\n\nFAIL: data_access_mask1 invalid !!!\n\n"); } +$c=$config{protection}{data_access_mask2}; if ((hex($c)&0x3f) != 63 || invalid_mask($c)) { die("$helpusage\n\nFAIL: data_access_mask2 invalid !!!\n\n"); } +$c=$config{protection}{data_access_mask3}; if ((hex($c)&0x3f) != 63 || invalid_mask($c)) { die("$helpusage\n\nFAIL: data_access_mask3 invalid !!!\n\n"); } +$c=$config{protection}{data_access_mask4}; if ((hex($c)&0x3f) != 63 || invalid_mask($c)) { die("$helpusage\n\nFAIL: data_access_mask4 invalid !!!\n\n"); } +$c=$config{protection}{data_access_mask5}; if ((hex($c)&0x3f) != 63 || invalid_mask($c)) { die("$helpusage\n\nFAIL: data_access_mask5 invalid !!!\n\n"); } +$c=$config{protection}{data_access_mask6}; if ((hex($c)&0x3f) != 63 || invalid_mask($c)) { die("$helpusage\n\nFAIL: data_access_mask6 invalid !!!\n\n"); } +$c=$config{protection}{data_access_mask7}; if ((hex($c)&0x3f) != 63 || invalid_mask($c)) { die("$helpusage\n\nFAIL: data_access_mask7 invalid !!!\n\n"); } + +if ((hex($config{protection}{inst_access_addr0}) & hex($config{protection}{inst_access_mask0}))!=0) { die("$helpusage\n\nFAIL: inst_access_addr0 and inst_access_mask0 must be orthogonal!!!\n\n"); } +if ((hex($config{protection}{inst_access_addr1}) & hex($config{protection}{inst_access_mask1}))!=0) { die("$helpusage\n\nFAIL: inst_access_addr1 and inst_access_mask1 must be orthogonal!!!\n\n"); } +if ((hex($config{protection}{inst_access_addr2}) & hex($config{protection}{inst_access_mask2}))!=0) { die("$helpusage\n\nFAIL: inst_access_addr2 and inst_access_mask2 must be orthogonal!!!\n\n"); } +if ((hex($config{protection}{inst_access_addr3}) & hex($config{protection}{inst_access_mask3}))!=0) { die("$helpusage\n\nFAIL: inst_access_addr3 and inst_access_mask3 must be orthogonal!!!\n\n"); } +if ((hex($config{protection}{inst_access_addr4}) & hex($config{protection}{inst_access_mask4}))!=0) { die("$helpusage\n\nFAIL: inst_access_addr4 and inst_access_mask4 must be orthogonal!!!\n\n"); } +if ((hex($config{protection}{inst_access_addr5}) & hex($config{protection}{inst_access_mask5}))!=0) { die("$helpusage\n\nFAIL: inst_access_addr5 and inst_access_mask5 must be orthogonal!!!\n\n"); } +if ((hex($config{protection}{inst_access_addr6}) & hex($config{protection}{inst_access_mask6}))!=0) { die("$helpusage\n\nFAIL: inst_access_addr6 and inst_access_mask6 must be orthogonal!!!\n\n"); } +if ((hex($config{protection}{inst_access_addr7}) & hex($config{protection}{inst_access_mask7}))!=0) { die("$helpusage\n\nFAIL: inst_access_addr7 and inst_access_mask7 must be orthogonal!!!\n\n"); } + +if ((hex($config{protection}{data_access_addr0}) & hex($config{protection}{data_access_mask0}))!=0) { die("$helpusage\n\nFAIL: data_access_addr0 and data_access_mask0 must be orthogonal!!!\n\n"); } +if ((hex($config{protection}{data_access_addr1}) & hex($config{protection}{data_access_mask1}))!=0) { die("$helpusage\n\nFAIL: data_access_addr1 and data_access_mask1 must be orthogonal!!!\n\n"); } +if ((hex($config{protection}{data_access_addr2}) & hex($config{protection}{data_access_mask2}))!=0) { die("$helpusage\n\nFAIL: data_access_addr2 and data_access_mask2 must be orthogonal!!!\n\n"); } +if ((hex($config{protection}{data_access_addr3}) & hex($config{protection}{data_access_mask3}))!=0) { die("$helpusage\n\nFAIL: data_access_addr3 and data_access_mask3 must be orthogonal!!!\n\n"); } +if ((hex($config{protection}{data_access_addr4}) & hex($config{protection}{data_access_mask4}))!=0) { die("$helpusage\n\nFAIL: data_access_addr4 and data_access_mask4 must be orthogonal!!!\n\n"); } +if ((hex($config{protection}{data_access_addr5}) & hex($config{protection}{data_access_mask5}))!=0) { die("$helpusage\n\nFAIL: data_access_addr5 and data_access_mask5 must be orthogonal!!!\n\n"); } +if ((hex($config{protection}{data_access_addr6}) & hex($config{protection}{data_access_mask6}))!=0) { die("$helpusage\n\nFAIL: data_access_addr6 and data_access_mask6 must be orthogonal!!!\n\n"); } +if ((hex($config{protection}{data_access_addr7}) & hex($config{protection}{data_access_mask7}))!=0) { die("$helpusage\n\nFAIL: data_access_addr7 and data_access_mask7 must be orthogonal!!!\n\n"); } + +if ($config{bus}{dma_bus_tag} < 1) {die "$self : ERROR! dma_bus_tag cannot be less than 1\n"} +if ($config{bus}{sb_bus_tag} < 1) {die "$self : ERROR! sb_bus_tag cannot be less than 1\n"} + +# deletes + +# Fill in derived configuration entries. + +if ($config{icache}{icache_enable}==0 && $config{iccm}{iccm_enable}==0) { + $config{core}{no_iccm_no_icache}=1; +} +elsif ($config{icache}{icache_enable}==0 && $config{iccm}{iccm_enable}==1) { + $config{core}{iccm_only}=1; +} +elsif ($config{icache}{icache_enable}==1 && $config{iccm}{iccm_enable}==0) { + $config{core}{icache_only}=1; +} +elsif ($config{icache}{icache_enable}==1 && $config{iccm}{iccm_enable}==1) { + $config{core}{iccm_icache}=1; +} + +$config{btb}{btb_btag_fold} = 0; +$config{btb}{btb_fold2_index_hash} = 0; + +if($config{btb}{btb_size}==512){ + $config{btb}{btb_index1_hi} = 9; + $config{btb}{btb_index2_hi} = 17; + $config{btb}{btb_index3_hi} = 25; + $config{btb}{btb_array_depth}= 256; + $config{btb}{btb_btag_size} = 5; +} elsif($config{btb}{btb_size}==256){ + $config{btb}{btb_index1_hi} = 8; + $config{btb}{btb_index2_hi} = 15; + $config{btb}{btb_index3_hi} = 22; + $config{btb}{btb_array_depth}= 128; + $config{btb}{btb_btag_size} = 6; +} elsif($config{btb}{btb_size}==128){ + $config{btb}{btb_index1_hi} = 7; + $config{btb}{btb_index2_hi} = 13; + $config{btb}{btb_index3_hi} = 19; + $config{btb}{btb_array_depth}= 64; + $config{btb}{btb_btag_size} = 7; +} elsif($config{btb}{btb_size}==64){ + $config{btb}{btb_index1_hi} = 6; + $config{btb}{btb_index2_hi} = 11; + $config{btb}{btb_index3_hi} = 16; + $config{btb}{btb_array_depth}= 32; + $config{btb}{btb_btag_size} = 8; +} elsif($config{btb}{btb_size}==32){ + $config{btb}{btb_index1_hi} = 5; + $config{btb}{btb_index2_hi} = 9; + $config{btb}{btb_index3_hi} = 13; + $config{btb}{btb_array_depth}= 16; + $config{btb}{btb_btag_size} = 9; + $config{btb}{btb_btag_fold} = 1; +} + +$config{btb}{btb_index2_lo} = $config{btb}{btb_index1_hi}+1; +$config{btb}{btb_index3_lo} = $config{btb}{btb_index2_hi}+1; +$config{btb}{btb_addr_hi} = $config{btb}{btb_index1_hi}; + +if($config{bht}{bht_size}==2048){ + $config{bht}{bht_ghr_size}= 10; + $config{bht}{bht_ghr_range}= "9:0"; + $config{bht}{bht_array_depth}= 1024; + $config{bht}{bht_addr_hi}= 11; +} elsif($config{bht}{bht_size}==1024){ + $config{bht}{bht_ghr_size}= 9; + $config{bht}{bht_ghr_range}= "8:0"; + $config{bht}{bht_array_depth}= 512; + $config{bht}{bht_addr_hi}= 10; +} elsif($config{bht}{bht_size}==512){ + $config{bht}{bht_ghr_size}= 8; + $config{bht}{bht_ghr_range}= "7:0"; + $config{bht}{bht_array_depth}= 256; + $config{bht}{bht_addr_hi}= 9; +} elsif($config{bht}{bht_size}==256){ + $config{bht}{bht_ghr_size}= 7; + $config{bht}{bht_ghr_range}= "6:0"; + $config{bht}{bht_addr_hi} = 8; + $config{bht}{bht_array_depth}= 128; +} elsif($config{bht}{bht_size}==128){ + $config{bht}{bht_ghr_size}= 6; + $config{bht}{bht_ghr_range}= "5:0"; + $config{bht}{bht_addr_hi} = 7; + $config{bht}{bht_array_depth}= 64; +} elsif($config{bht}{bht_size}==64){ + $config{bht}{bht_ghr_size}= 5; + $config{bht}{bht_ghr_range}= "4:0"; + $config{bht}{bht_addr_hi} = 6; + $config{bht}{bht_array_depth}= 32; +} elsif($config{bht}{bht_size}==32){ + $config{bht}{bht_ghr_size}= 4; + $config{bht}{bht_ghr_range}= "3:0"; + $config{bht}{bht_addr_hi} = 5; + $config{bht}{bht_array_depth}= 16; +} +$config{bht}{bht_ghr_hash_1} = ($config{bht}{bht_ghr_size} > ($config{btb}{btb_index1_hi}-1)); + +$config{bht}{bht_hash_string} = &ghrhash($config{btb}{btb_index1_hi}, $config{bht}{bht_ghr_size}); + +$config{pic}{pic_base_addr} = (hex($config{pic}{pic_region})<<28) + + (hex($config{pic}{pic_offset})); +$config{pic}{pic_base_addr} = sprintf("0x%x", $config{pic}{pic_base_addr}); + +$config{pic}{pic_int_words} = int($config{pic}{pic_total_int}/32 +0.9); +$config{pic}{pic_bits} = 10 + log2($config{pic}{pic_size}); + +$config{core}{lsu_num_nbload_width} = log2($config{core}{lsu_num_nbload}); + +$config{bus}{lsu_bus_tag} = log2($config{core}{lsu_num_nbload}) + 1; + +$config{bus}{ifu_bus_tag} = log2($config{icache}{icache_ln_sz}/8); + +$config{dccm}{dccm_sadr} = (hex($config{dccm}{dccm_region})<<28) + + (hex($config{dccm}{dccm_offset})); +$config{dccm}{dccm_sadr} = sprintf("0x%x", $config{dccm}{dccm_sadr}); + +$config{dccm}{dccm_eadr} = (hex($config{dccm}{dccm_region})<<28) + + (hex($config{dccm}{dccm_offset})) + size($config{dccm}{dccm_size})-1; +$config{dccm}{dccm_eadr} = sprintf("0x%x", $config{dccm}{dccm_eadr}); + +$config{dccm}{dccm_reserved} = sprintf("0x%x", ($config{dccm}{dccm_size}>=16)? 5120 : ($config{dccm}{dccm_size}*1024)/4); + +$config{dccm}{dccm_bits} = ($config{dccm}{dccm_size}==48 ) ? 16 : 10 + log2($config{dccm}{dccm_size}); + +$config{dccm}{dccm_bank_bits} = log2($config{dccm}{dccm_num_banks}); +$config{dccm}{dccm_data_width} = 32; +$config{dccm}{dccm_fdata_width} = $config{dccm}{dccm_data_width} + log2($config{dccm}{dccm_data_width}) + 2; +$config{dccm}{dccm_byte_width} = $config{dccm}{dccm_data_width}/8; + +$config{dccm}{dccm_width_bits} = log2($config{dccm}{dccm_byte_width}); +$config{dccm}{dccm_index_bits} = $config{dccm}{dccm_bits} - $config{dccm}{dccm_bank_bits} - $config{dccm}{dccm_width_bits}; + +$config{dccm}{dccm_ecc_width} = log2($config{dccm}{dccm_data_width}) + 2; +$config{dccm}{lsu_sb_bits} = $config{dccm}{dccm_bits}; +$config{dccm}{dccm_rows} = ($config{dccm}{dccm_size}==48 ) ? (2**($config{dccm}{dccm_index_bits}-1) + 2**$config{dccm}{dccm_index_bits})/2 : 2**$config{dccm}{dccm_index_bits}; +$config{dccm}{dccm_data_cell} = "ram_$config{dccm}{dccm_rows}x39"; + + +$config{icache}{icache_num_lines} = $config{icache}{icache_size}*1024/$config{icache}{icache_ln_sz}; +$config{icache}{icache_num_lines_way} = $config{icache}{icache_num_lines}/$config{icache}{icache_num_ways}; +$config{icache}{icache_num_lines_bank} = $config{icache}{icache_num_lines}/($config{icache}{icache_num_ways} * $config{icache}{icache_banks_way}); +$config{icache}{icache_data_depth} = $config{icache}{icache_num_lines_bank} * $config{icache}{icache_ln_sz} /$config{icache}{icache_bank_width}; +$config{icache}{icache_data_index_lo} = log2($config{icache}{icache_bank_width}) + log2($config{icache}{icache_banks_way}); +$config{icache}{icache_index_hi} = $config{icache}{icache_data_index_lo} + log2($config{icache}{icache_data_depth}) -1; +$config{icache}{icache_bank_hi} = $config{icache}{icache_data_index_lo} - 1; +$config{icache}{icache_bank_lo} = log2($config{icache}{icache_bank_width}); +$config{icache}{icache_tag_index_lo} = log2($config{icache}{icache_ln_sz}); +$config{icache}{icache_tag_lo} = log2($config{icache}{icache_num_lines_way}) + $config{icache}{icache_tag_index_lo}; +$config{icache}{icache_tag_depth} = $config{icache}{icache_num_lines}/$config{icache}{icache_num_ways}; +$config{icache}{icache_data_width} = 8*$config{icache}{icache_bank_width}; + +$config{icache}{icache_bank_bits} = 1+$config{icache}{icache_bank_hi}-$config{icache}{icache_bank_lo}; +$config{icache}{icache_status_bits} = $config{icache}{icache_num_ways}-1; +$config{icache}{icache_num_beats} = ($config{icache}{icache_ln_sz}==64) ? 8 : 4; +$config{icache}{icache_beat_bits} = ($config{icache}{icache_ln_sz}==64) ? 3 : 2; +$config{icache}{icache_scnd_last} = ($config{icache}{icache_ln_sz}==64) ? 6 : 2; +$config{icache}{icache_beat_addr_hi} = ($config{icache}{icache_ln_sz}==64) ? 5 : 4; + + +if (($config{icache}{icache_ecc})) { +$config{icache}{icache_fdata_width} = $config{icache}{icache_data_width} + 7; +$config{icache}{icache_data_cell} = "ram_$config{icache}{icache_data_depth}x$config{icache}{icache_fdata_width}"; +$config{icache}{icache_tag_cell} = ($config{icache}{icache_tag_depth} == 32) ? "ram_$config{icache}{icache_tag_depth}x26" : "ram_$config{icache}{icache_tag_depth}x25"; + +} +else { +$config{icache}{icache_fdata_width} = $config{icache}{icache_data_width} + 4; +$config{icache}{icache_data_cell} = "ram_$config{icache}{icache_data_depth}x$config{icache}{icache_fdata_width}"; +$config{icache}{icache_tag_cell} = "ram_$config{icache}{icache_tag_depth}x21"; +} +$config{pic}{pic_total_int_plus1} = $config{pic}{pic_total_int} + 1; +# Defines with explicit values in the macro name +$config{dccm}{"dccm_num_banks_$config{dccm}{dccm_num_banks}"} = ""; +$config{dccm}{"dccm_size_$config{dccm}{dccm_size}"} = ""; + +# If ICCM offset not explicitly provided, align to TOP of the region +if ($top_align_iccm && ($config{iccm}{iccm_offset} eq $iccm_offset) && ($config{iccm}{iccm_size} < 32)) { + $config{iccm}{iccm_region} = "0xa"; + print "$self: Setting default iccm region to region $config{iccm}{iccm_region}\n"; + $config{iccm}{iccm_offset} = sprintf("0x%08x",256*1024*1024-size($config{iccm}{iccm_size})); + print "$self: Aligning default iccm offset to top of region @ $config{iccm}{iccm_offset}\n"; +} +$config{iccm}{iccm_sadr} = (hex($config{iccm}{iccm_region})<<28) + + (hex($config{iccm}{iccm_offset})); +$config{iccm}{iccm_sadr} = sprintf("0x%08x", $config{iccm}{iccm_sadr}); + +$config{iccm}{iccm_eadr} = (hex($config{iccm}{iccm_region})<<28) + + (hex($config{iccm}{iccm_offset})) + size($config{iccm}{iccm_size})-1; +$config{iccm}{iccm_eadr} = sprintf("0x%08x", $config{iccm}{iccm_eadr}); + +$config{iccm}{iccm_reserved} = sprintf("0x%x", ($config{iccm}{iccm_size}>30)? 4096 : ($config{iccm}{iccm_size}*1024)/4); + +$config{iccm}{iccm_bits} = 10 + log2($config{iccm}{iccm_size}); +$config{iccm}{iccm_bank_bits} = log2($config{iccm}{iccm_num_banks}); //-1; +$config{iccm}{iccm_index_bits} = $config{iccm}{iccm_bits} - $config{iccm}{iccm_bank_bits} - 2; # always 4 bytes +$config{iccm}{iccm_rows} = 2**$config{iccm}{iccm_index_bits}; +$config{iccm}{iccm_data_cell} = "ram_$config{iccm}{iccm_rows}x39"; + +$config{iccm}{iccm_bank_hi} = 2+$config{iccm}{iccm_bank_bits}-1; +$config{iccm}{iccm_bank_index_lo} = 1+$config{iccm}{iccm_bank_hi}; + +# Defines with explicit values in the macro name +$config{iccm}{"iccm_num_banks_$config{iccm}{iccm_num_banks}"} = ""; +$config{iccm}{"iccm_size_$config{iccm}{iccm_size}"} = ""; + +# Track used regions + +$regions_used{hex($config{iccm}{iccm_region})} = 1; +$regions_used{hex($config{dccm}{dccm_region})} = 1; +$regions_used{hex($config{pic}{pic_region})} = 1; +$regions_used{hex($config{reset_vec})>>28} = 1; + +# Find an unused region for serial IO +for (my $rgn = 15;$rgn >= 0; $rgn--) { + if (($rgn != hex($config{iccm}{iccm_region})) && + ($rgn != hex($config{dccm}{dccm_region})) && + ($rgn != (hex($config{pic}{pic_region})))) { + $config{memmap}{serialio} = ($rgn << 28) + (22<<18); + $regions_used{$rgn} = 1; + last; + } +} + +$config{memmap}{serialio} = sprintf("0x%08x", $config{memmap}{serialio}); + +# Find an unused region for external data +for (my $rgn = 15;$rgn >= 0; $rgn--) { + if (($rgn != hex($config{iccm}{iccm_region})) && + ($rgn != hex($config{dccm}{dccm_region})) && + ($rgn != (hex($config{memmap}{serialio})>>28)) && + ($rgn != (hex($config{pic}{pic_region})))) { + $config{memmap}{external_data} = ($rgn << 28) + (22<<18); + $regions_used{$rgn} = 1; + last; + } +} +$config{memmap}{external_data} = sprintf("0x%08x", $config{memmap}{external_data}); +# +# Find an unused region for external prog +for (my $rgn = 15;$rgn >= 0; $rgn--) { + if (($rgn != hex($config{iccm}{iccm_region})) && + ($rgn != hex($config{dccm}{dccm_region})) && + ($rgn != (hex($config{memmap}{serialio})>>28)) && + ($rgn != (hex($config{memmap}{external_data})>>28)) && + ($rgn != (hex($config{pic}{pic_region})))) { + $config{memmap}{external_prog} = ($rgn << 28); + $regions_used{$rgn} = 1; + last; + } +} +$config{memmap}{external_prog} = sprintf("0x%08x", $config{memmap}{external_prog}); + +# Unused region for second data +for (my $rgn = 15;$rgn >= 0; $rgn--) { + if (($rgn != hex($config{iccm}{iccm_region})) && + ($rgn != hex($config{dccm}{dccm_region})) && + ($rgn != (hex($config{memmap}{serialio})>>28)) && + ($rgn != (hex($config{memmap}{external_data})>>28)) && + ($rgn != (hex($config{memmap}{external_prog})>>28) && + ($rgn != (hex($config{pic}{pic_region}))) + )) { + $config{memmap}{external_data_1} = ($rgn << 28); + $regions_used{$rgn} = 1; + last; + } +} +$config{memmap}{external_data_1} = sprintf("0x%08x", $config{memmap}{data_1}); + + +#$config{memmap}{consoleio} = hex($config{memmap}{serialio}) + 0x100; +#$config{memmap}{consoleio} = sprintf("0x%x", $config{memmap}{consoleio}); + +# Find an unused region for debug_sb_memory data +for (my $rgn = 15;$rgn >= 0; $rgn--) { + if (($rgn != hex($config{iccm}{iccm_region})) && + ($rgn != hex($config{dccm}{dccm_region})) && + ($rgn != (hex($config{memmap}{serialio})>>28)) && + ($rgn != (hex($config{memmap}{external_data})>>28)) && + ($rgn != (hex($config{memmap}{external_data_1})>>28)) && + ($rgn != (hex($config{pic}{pic_region})))) { + $config{memmap}{debug_sb_mem} = ($rgn << 28) + (22<<18); + $regions_used{$rgn} = 1; + last; + } +} +$config{memmap}{debug_sb_mem} = sprintf("0x%08x", $config{memmap}{debug_sb_mem}); + + +# Create the memory map hole for random testing +# Only do this if masks are not enabled already +if (hex($config{protection}{data_access_enable0}) > 0 || + hex($config{protection}{data_access_enable1}) > 0 || + hex($config{protection}{data_access_enable2}) > 0 || + hex($config{protection}{data_access_enable3}) > 0 || + hex($config{protection}{data_access_enable4}) > 0 || + hex($config{protection}{data_access_enable5}) > 0 || + hex($config{protection}{data_access_enable6}) > 0 || + hex($config{protection}{data_access_enable7}) > 0 || + hex($config{protection}{inst_access_enable0}) > 0 || + hex($config{protection}{inst_access_enable1}) > 0 || + hex($config{protection}{inst_access_enable2}) > 0 || + hex($config{protection}{inst_access_enable3}) > 0 || + hex($config{protection}{inst_access_enable4}) > 0 || + hex($config{protection}{inst_access_enable5}) > 0 || + hex($config{protection}{inst_access_enable6}) > 0 || + hex($config{protection}{inst_access_enable7}) > 0) { + delete($config{memmap}{external_mem_hole}) ; +} else { + # Unused region to create a memory map hole + for (my $rgn = 15;$rgn >= 0; $rgn--) { + if (!defined($regions_used{$rgn})) { + $config{memmap}{external_mem_hole} = ($rgn << 28); + $regions_used{$rgn} = 1; + last; + } + } + if ($config{memmap}{external_mem_hole} == 0) { + $config{protection}{data_access_addr0} = "0x10000000"; + $config{protection}{data_access_mask0} = "0xffffffff"; + $config{protection}{data_access_enable0} = "1"; + } elsif (($config{memmap}{external_mem_hole}>>28) == 16) { + $config{protection}{data_access_addr0} = "0x00000000"; + $config{protection}{data_access_mask0} = "0xefffffff"; + $config{protection}{data_access_enable0} = "1"; + } else { + my $hreg = hex($config{memmap}{external_mem_hole}>>28); + $config{protection}{data_access_addr0} = sprintf("0x%x", (($hreg^8)&8)<<28); + $config{protection}{data_access_mask0} = "0x7fffffff"; + $config{protection}{data_access_addr1} = sprintf("0x%x", ($hreg&8) << 28 |(($hreg^4)&4)<<28); + $config{protection}{data_access_mask1} = "0x3fffffff"; + $config{protection}{data_access_addr2} = sprintf("0x%x", ($hreg&12) <<28 | (($hreg^2)&2) <<28); + $config{protection}{data_access_mask2} = "0x1fffffff"; + $config{protection}{data_access_addr3} = sprintf("0x%x", ($hreg&14) << 28 |(($hreg^1)&1)<<28); + $config{protection}{data_access_mask3} = "0x0fffffff"; + $config{protection}{data_access_enable0} = "1"; + $config{protection}{data_access_enable1} = "1"; + $config{protection}{data_access_enable2} = "1"; + $config{protection}{data_access_enable3} = "1"; + $config{protection}{inst_access_addr0} = sprintf("0x%x", (($hreg^8)&8)<<28); + $config{protection}{inst_access_mask0} = "0x7fffffff"; + $config{protection}{inst_access_addr1} = sprintf("0x%x", ($hreg&8) << 28 |(($hreg^4)&4)<<28); + $config{protection}{inst_access_mask1} = "0x3fffffff"; + $config{protection}{inst_access_addr2} = sprintf("0x%x", ($hreg&12) <<28 | (($hreg^2)&2) <<28); + $config{protection}{inst_access_mask2} = "0x1fffffff"; + $config{protection}{inst_access_addr3} = sprintf("0x%x", ($hreg&14) << 28 |(($hreg^1)&1)<<28); + $config{protection}{inst_access_mask3} = "0x0fffffff"; + $config{protection}{inst_access_enable0} = "1"; + $config{protection}{inst_access_enable1} = "1"; + $config{protection}{inst_access_enable2} = "1"; + $config{protection}{inst_access_enable3} = "1"; + } + $config{memmap}{external_mem_hole} = sprintf("0x%08x", $config{memmap}{external_mem_hole}); +} + +#Define 5 unused regions for used in TG + +foreach my $unr (reverse(0 .. 15)) { + if (!defined($regions_used{$unr})) { + $config{memmap}{"unused_region$unr"} = sprintf("0x%08x",($unr << 28)); + $regions_used{$unr} = 1; + } +} + +if ($target eq "baseline") { + $config{reset_vec} = $config{iccm}{iccm_sadr}; + $config{testbench}{magellan} = 1; + print "$self: Setting reset_vec = ICCM start address for Baseline\n"; +} + + +# Output bit-width specifiers for these variables +our %widths = ( + "dccm_region" => "4", + "dccm_offset" => "28", + "dccm_sadr" => "32", + "dccm_eadr" => "32", + "pic_region" => "4", + "pic_offset" => "10", + "pic_base_addr" => "32", + "iccm_region" => "4", + "iccm_offset" => "10", + "iccm_sadr" => "32", + "iccm_eadr" => "32", + "bus_prty_default" => "2", + "inst_access_enable0" => "1", + "inst_access_enable1" => "1", + "inst_access_enable2" => "1", + "inst_access_enable3" => "1", + "inst_access_enable4" => "1", + "inst_access_enable5" => "1", + "inst_access_enable6" => "1", + "inst_access_enable7" => "1", + "data_access_enable0" => "1", + "data_access_enable1" => "1", + "data_access_enable2" => "1", + "data_access_enable3" => "1", + "data_access_enable4" => "1", + "data_access_enable5" => "1", + "data_access_enable6" => "1", + "data_access_enable7" => "1", +); +#}}} + +print "\nSweRV configuration for target=$target\n\n"; +dump_define("","", \%config,[]); + + +#print Dumper(\%config); +#print Dumper(\%width); + +#print Dumper(\%sets); +#print Dumper(\%unsets); + +# Sanity checks +check_addr_align("dccm", hex($config{dccm}{dccm_sadr}), $config{dccm}{dccm_size}*1024); +check_addr_align("iccm", hex($config{iccm}{iccm_sadr}), $config{iccm}{iccm_size}*1024); +check_addr_align("pic", hex($config{pic}{pic_base_addr}), $config{pic}{pic_size}*1024); + +# Prevent overlap of internal memories +if ((hex($config{pic}{pic_region}) == hex($config{iccm}{iccm_region})) && (hex($config{pic}{pic_offset}) == hex($config{iccm}{iccm_offset}))) { + die "$self: ERROR! PIC and ICCM blocks collide (region $config{iccm}{iccm_region}, offset $config{pic}{pic_offset})!\n"; +} +if ((hex($config{pic}{pic_region}) == hex($config{dccm}{dccm_region})) && (hex($config{pic}{pic_offset}) == hex($config{dccm}{dccm_offset}))) { + die "$self: ERROR! PIC and DCCM blocks collide (region $config{dccm}{dccm_region}, offset $config{pic}{pic_offset})!\n"; +} +if ((hex($config{iccm}{iccm_region}) == hex($config{dccm}{dccm_region})) && (hex($config{iccm}{iccm_offset}) == hex($config{dccm}{dccm_offset}))) { + die "$self: ERROR! ICCM and DCCM blocks collide (region $config{iccm}{iccm_region}, offset $config{dccm}{dccm_offset})!\n"; +} + + + +# all targets default to axi +if (($target eq "default_ahb") || ($config{testbench}{build_ahb_lite} == 1)) { + delete $config{testbench}{build_axi4}; + $config{testbench}{build_axi_native}=1; + $verilog_parms{build_axi4} = 0; + $config{testbench}{build_ahb_lite}=1; +} else { + $config{testbench}{build_axi_native}=1; + $config{testbench}{build_axi4} = 1; + delete $config{testbench}{build_ahb_lite}; + $verilog_parms{build_ahb_lite} = 0; +} + + +# Over-ride MFDC reset value for AXI. +# Disable Bus barrier and 64b for AXI +if (defined($config{"testbench"}{"build_axi_native"}) && ($config{"testbench"}{"build_axi_native"} ne "0")) { + if (! (defined($config{testbench}{build_ahb_lite}) && $config{testbench}{build_ahb_lite} ne "0")) { + $config{csr}{mfdc}{reset} = "0x00070040" if exists $config{csr}{mfdc}; + } +} + +# AHB overrides +if (defined($config{"testbench"}{"build_ahb_lite"}) && ($config{"testbench"}{"build_ahb_lite"} ne "0")) { +} + + +# parm processing before any values are deleted from the hash + + + +print "$self: Writing $tdfile\n"; +print "$self: Writing $paramfile\n"; +open (FILE1, ">$tdfile") || die "Cannot open $tdfile for writing $!\n"; +open (FILE2, ">$paramfile") || die "Cannot open $paramfile for writing $!\n"; +print_header("//"); +gen_define("","`", \%config, \%verilog_parms, \@verilog_vars); +dump_parms(\%verilog_parms); +close FILE1; +close FILE2; + +$config{config_key}="32'hdeadbeef"; + +# end parms + +# deletes +if (($load_to_use_plus1==0) && !grep(/load_to_use_plus1/, @sets)) { delete $config{"core"}{"load_to_use_plus1"}; } +if (($iccm_enable==0) && !grep(/iccm_enable/, @sets)) { delete $config{"iccm"}{"iccm_enable"}; } +if (($dccm_enable==0) && !grep(/dccm_enable/, @sets)) { delete $config{"dccm"}{"dccm_enable"}; } +if (($icache_enable==0) && !grep(/icache_enable/, @sets)) { delete $config{"icache"}{"icache_enable"}; } +if (($icache_waypack==0) && !grep(/icache_waypack/, @sets)) { delete $config{"icache"}{"icache_waypack"}; } +if (($opensource==0) && !grep(/opensource/, @sets)) { delete $config{"core"}{"opensource"}; } +if (($verilator==0) && !grep(/verilator/, @sets)) { delete $config{"core"}{"verilator"}; } +if (($pic_2cycle==0) && !grep(/pic_2cycle/, @sets)) { delete $config{"pic"}{"pic_2cycle"}; } +if (($icache_ecc==0) && !grep(/icache_ecc/, @sets)) { delete $config{"icache"}{"icache_ecc"}; } +if (($icache_2banks==0) && !grep(/icache_2banks/, @sets)) { delete $config{"icache"}{"icache_2banks"}; } + + +# new +if ($config{"testbench"}{"build_axi4"} == 1) { + delete $config{"testbench"}{"build_ahb_lite"}; + delete $config{"testbench"}{"build_axi_native_ahb"}; +} +elsif (($target eq "default_ahb") || ($config{"testbench"}{"build_ahb_lite"} == 1)) { + $config{"testbench"}{"build_ahb_lite"} = 1; + delete $config{"testbench"}{"build_axi4"}; + $config{"testbench"}{"build_axi_native_ahb"} = 1; +} + + + + +##################### Add dumper routines here ########################## + + +# +# Dump Verilog $RV_ROOT/configs/common_defines.vh +print "$self: Writing $vlogfile\n"; +open (FILE, ">$vlogfile") || die "Cannot open $vlogfile for writing $!\n"; +print_header("//"); +print FILE "`define RV_ROOT \"".$ENV{RV_ROOT}."\"\n"; +gen_define("","`", \%config, "", \@verilog_vars); +close FILE; + +print "$self: Writing $asmfile\n"; +open (FILE, ">$asmfile") || die "Cannot open $asmfile for writing $!\n"; +# Dump ASM/C $RV_ROOT/diags/env/defines.h +print_header("//"); +gen_define("","#", \%config, "", \@asm_vars, \@asm_overridable); +close FILE; + +# add `define PHYSICAL 1 +# remove `undef RV_ICCM_ENABLE + +my $pddata=' +`include "common_defines.vh" +`undef ASSERT_ON +`undef TEC_RV_ICG +`define TEC_RV_ICG HDBLVT16_CKGTPLT_V5_12 +`define PHYSICAL 1 +'; + + +print "$self: Writing $pdfile\n"; +open (FILE, ">$pdfile") || die "Cannot open $pdfile for writing $!\n"; +# Dump PD $RV_ROOT/$RV_ROOT/configs/pd_defines.vh +print_header("//"); +printf (FILE "$pddata"); +close FILE; + +print "$self: Writing $whisperfile\n"; +dump_whisper_config(\%config, $whisperfile); + + +# change this to use config version +`$ENV{RV_ROOT}/tools/picmap -t $config{pic}{pic_total_int} > $build_path/pic_map_auto.h`; +#`$ENV{RV_ROOT}/tools/unrollforverilator $config{pic}{pic_total_int_plus1} > $build_path/el2_pic_ctrl_verilator_unroll.sv`; + +# Perl vars for use by scripts +print "$self: Writing $perlfile\n"; +open (FILE, ">$perlfile") || die "Cannot open $perlfile for writing $!\n"; +print_header("# "); +print FILE "# To use this in a perf script, use 'require \$RV_ROOT/configs/config.pl'\n"; +print FILE "# Reference the hash via \$config{name}..\n\n\n"; +print FILE Data::Dumper->Dump([\%config], [ qw(*config) ]); +print FILE "1;\n"; +close FILE; + + + +# Done ################################################################## +# +exit(0); + +# ###################### Helper subroutines ##########################{{{ +# Convert size in kilobytes to real value + +sub size {#{{{ + my $ksize = shift; + my $size = sprintf("%d",$ksize*1024); + return $size; +}#}}} + +# Print the defines with prefix +sub print_define {#{{{ + my ($sym, $key,$value, $override) = @_; + my $lprefix = $prefix if ($key !~ /$no_prefix/); + if ($sym eq "`") { + if (defined($widths{$key})) { + $value =~ s/^(0x)*/$widths{$key}'h/; + } else { + $value =~ s/^0x/'h/; + } + } + if ($defines_case eq "U") { + print FILE "${sym}ifndef \U$lprefix$key\E\n" if ($override); + print FILE "${sym}define \U$lprefix$key\E $value\n"; + print FILE "${sym}endif\n" if ($override); + } else { + print FILE "${sym}ifndef $lprefix$key\n" if ($override); + print FILE "${sym}define $lprefix$key $value\n"; + print FILE "${sym}endif\n" if ($override); + } +}#}}} + +# print header +sub print_header {#{{{ + my $cs = shift; + print FILE "$cs NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE\n"; + print FILE "$cs This is an automatically generated file by $ENV{USER} on ",`date`; + print FILE "$cs\n$cs cmd: $self @argv_orig \n"; + print FILE "$cs\n"; +}#}}} + +# evaluate derivations +sub derive {#{{{ + my $eqn = shift; + return sprintf("0x%x", eval($eqn)); +}#}}} + +# traverse the database and extract the key/value pair +sub gen_define {#{{{ + my $matched = shift; + my $prefix = shift; + my $hash = @_[0]; + my $parms = @_[1]; + my @printvars = @{@_[2]}; + my @overridable = @{@_[3]} if defined @_[3]; + my $re = join("|",@printvars); + $re = qr/($re)/; + #print Dumper($hash); + foreach my $key (keys %$hash) { + next if $key eq "csr"; + #print "looking at $key:$matched ($re)\n"; + if (defined($unsets{$key})) { + print "$self:unsetting $key\n"; + delete($config{$key}); + if ($parms and defined($parms->{$key})) { + $parms->{$key} = 0; + } + next + } + if (defined($sets{$key}) && $sets{$key} ne $$hash{$key}) { + if (($$hash{$key} =~ /derived/i) && ($$hash{$key} !~ /overridable/i)) { + die ("$self: ERROR! $key is a derived and non-overridable parameter!\n"); + } else { + print "$self: Overriding $key value $$hash{$key} with $sets{$key}\n"; + $$hash{$key} = $sets{$key}; + } + } + my $value = $$hash{$key}; + if (ref($value) eq "HASH") { + if ($key =~ /$re/) { + $matched = 1; + } + gen_define($matched,$prefix, $value, $parms, \@printvars, \@overridable); + $matched = 0; + } elsif (ref($value) eq "ARRAY") { + # print "$key : @{$value}\n"; + $matched = 0; + } else { + if ($matched eq "1" || $key =~ /$re/) { + if($value =~ /derive\(.*\)/o) { + $value = eval($value); + } + my $override = grep(/^$key$/, @overridable); + print_define($prefix, $key, $value, $override); + #printf("$key = $value\n"); + if ($parms and defined($parms->{$key})) { + $value=decimal($value); + #printf("verilog parm $key = $value %s\n",$parms->{$key}); + $value=d2b($key,$value,$parms->{$key}); + #printf("verilog parm $key = $value\n"); + $parms->{$key}=$value; + } + } + } + } +}#}}} + +sub dump_define {#{{{ + my $matched = shift; + my $prefix = shift; + my $hash = @_[0]; + my @printvars = @{@_[1]}; + my @overridable = @{@_[2]} if defined @_[2]; + my $re = join("|",@printvars); + $re = qr/($re)/; + #print Dumper($hash); + foreach my $key (keys %$hash) { + next if $key eq "csr"; + next unless $matched || grep(/^$key$/,@dvars); + #print "looking at $key:$matched ($re)\n"; + if (defined($unsets{$key})) { + print "$self:unsetting $key\n"; + delete($config{$key}); + next + } + if (defined($sets{$key}) && $sets{$key} ne $$hash{$key}) { + if (($$hash{$key} =~ /derived/i) && ($$hash{$key} !~ /overridable/i)) { + die ("$self: ERROR! $key is a derived and non-overridable parameter!\n"); + } else { + print "$self: Overriding $key value $$hash{$key} with $sets{$key}\n"; + $$hash{$key} = $sets{$key}; + } + } + my $value = $$hash{$key}; + if (ref($value) eq "HASH") { + if ($key =~ /$re/) { + $matched = 1; + } + dump_define($matched,$prefix, $value, \@printvars, \@overridable); + $matched = 0; + } elsif (ref($value) eq "ARRAY") { + # print "$key : @{$value}\n"; + $matched = 0; + } else { + if ($matched eq "1" || $key =~ /$re/) { + if($value =~ /derive\(.*\)/o) { + $value = eval($value); + } + printf ("swerv: %-30s = $value\n",$key) if ($value !~ /derived/); + } + } + } +}#}}} + +# Perform cmd line set/unset ############################################{{{ +sub map_set_unset { + if (scalar(@sets)) { + print "$self: Set(s) requested : @sets\n"; + foreach (@sets) { + my ($key,$value) = m/(\w+)=*(\w+)*/o; + $value = 1 if (!defined($value)); + $sets{$key} = $value; + } + } + if (scalar(@unsets)) { + print "$self: Unset(s) requested : @sets\n"; + foreach (@unsets) { + $unsets{$_} = 1; + } + } +} #}}} +#}}} + + +# If arg looks like a hexadecimal string, then convert it to decimal.#{{{ +# Otherwise, return arg. +sub decimal { + my ($x) = @_; + return hex($x) if $x =~ /^0x/o; + return $x; +}#}}} + + +# Collect memory protection specs (array of address pairs) in the given +# resutls array. Tag is either "data" or "inst". +sub collect_mem_protection { + my ($tag, $config, $results) = @_; + return unless exists $config{protection}; + + my $prot = $config{protection}; + + my $enable_tag = $tag . "_access_enable"; + my $addr_tag = $tag . "_access_addr"; + my $mask_tag = $tag . "_access_mask"; + + foreach my $key (keys %{$prot}) { + next unless $key =~ /^$enable_tag(\d+)$/; + my $ix = $1; + + my $enable = $prot->{$key}; + if ($enable !~ /[01]$/) { + warn("Invalid value for protection entry $key: $enable\n"); + next; + } + + next unless ($enable eq "1" or $enable eq "1'b1"); + + if (! exists $prot->{"$addr_tag$ix"}) { + warn("Missing $addr_tag$ix\n"); + next; + } + + if (! exists $prot->{"$mask_tag$ix"}) { + warn("Missing $mask_tag$ix\n"); + next; + } + + my $addr = $prot->{"$addr_tag$ix"}; + my $mask = $prot->{"$mask_tag$ix"}; + + if ($addr !~ /^0x[0-9a-fA-F]+$/) { + warn("Invalid $addr_tag$ix: $addr\n"); + next; + } + + if ($mask !~ /^0x[0-9a-fA-F]+$/) { + warn("Invalid $mask_tag$ix: $mask\n"); + next; + } + + if ((hex($addr) & hex($mask)) != 0) { + warn("Protection mask bits overlap address bits in $tag mask $mask and addr $addr\n"); + } + + if ($mask !~ /^0x0*[137]?f*$/) { + warn("Protection $tag mask ($mask) must have all its one bits to the right of its zero bits\n"); + next; + } + + my $start = hex($addr) & ~hex($mask) & 0xffffffff; + my $end = (hex($addr) | hex($mask)) & 0xffffffff; + + $start = sprintf("0x%08x", $start); + $end = sprintf("0x%08x", $end); + + push(@{$results}, [ $start, $end ]); + } +} + + +sub dump_whisper_config{#{{{ + my ($config, $path) = @_; + + open(my $fh, ">", "$path") or die ("Failed to open $path for writing: $!\n"); + + # Put the configuration parameters relevant to whisper into a hash + # in preparation for a JSON dump. + my %jh; # Json hash + + # Collect top-level integer entries. + foreach my $tag (qw( harts xlen )) { + $jh{$tag} = $config{$tag} + 0 if exists $config{$tag}; + } + + # Collect top-level string/hex entries. + foreach my $tag (qw ( reset_vec nmi_vec num_mmode_perf_regs max_mmode_perf_event + even_odd_trigger_chains)) { + $jh{$tag} = $config{$tag} if exists $config{$tag}; + } + + # Collect memory map configs. + my (@inst_mem_prot, @data_mem_prot); + collect_mem_protection("inst", $config, \@inst_mem_prot); + collect_mem_protection("data", $config, \@data_mem_prot); + $jh{memmap}{inst} = [@inst_mem_prot] if @inst_mem_prot; + $jh{memmap}{data} = [@data_mem_prot] if @data_mem_prot; + foreach my $tag (qw ( size page_size serialio )) { + $jh{memmap}{tag} = $config{memmap}{ta} if exists $config{memmap}{tag}; + } + + # Collect load/store-error rollback parameter. + if (exists $config{testbench} and exists $config{testbench}{sterr_rollback}) { + $jh{store_error_rollback} = $config{testbench}{sterr_rollback}; + } + if (exists $config{testbench} and exists $config{testbench}{lderr_rollback}) { + $jh{load_error_rollback} = $config{testbench}{lderr_rollback}; + } + + # Collect dccm configs + if (exists $config{dccm} and exists $config{dccm}{dccm_enable}) { + $jh{dccm}{region} = $config{dccm}{dccm_region}; + $jh{dccm}{size} = 1024*decimal($config{dccm}{dccm_size}); # From 1k to bytes + $jh{dccm}{offset} = $config{dccm}{dccm_offset}; + + $jh{dccm}{size} = sprintf("0x%x", $jh{dccm}{size}); + } + + # Collect icccm configs. + if (exists $config{iccm} and exists $config{iccm}{iccm_enable}) { + $jh{iccm}{region} = $config{iccm}{iccm_region}; + $jh{iccm}{size} = 1024*decimal($config{iccm}{iccm_size}); # From 1k to bytes + $jh{iccm}{offset} = $config{iccm}{iccm_offset}; + + $jh{iccm}{size} = sprintf("0x%x", $jh{iccm}{size}); + } + + # Collect CSRs + $jh{csr} = $config{csr} if exists $config{csr}; + + # Collect CSRs not included in verilog. + my @removed_csrs; + + # Collect fast interrupt enable. + if (exists $config{core}{fast_interrupt_redirect}) { + $jh{fast_interrupt_redirect} = $config{core}{fast_interrupt_redirect}; + # meicpct CSR is not built if fast interrupt. + push(@removed_csrs, 'meicpct') if $jh{fast_interrupt_redirect}; + } + + # Remove CSRs not configured into verilog. + delete $jh{csr}{$_} foreach @removed_csrs; + + + + # Collect pic configs. + if (exists $config{pic}) { + while (my ($k, $v) = each %{$config{pic}}) { + next if $k eq 'pic_base_addr'; # derived from region and offset + if ($k eq 'pic_size') { + $v *= 1024; # from kbytes to bytes + $v = sprintf("0x%x", $v); + } + $k =~ s/^pic_//o; + $v += 0 if $v =~ /^\d+$/o; + $jh{pic}{$k} = $v; + } + } + + # Make atomic instructions illegal outside of DCCM. + $jh{amo_illegal_outside_dccm} = "true"; + + # Make ld/st instructions trigger misaligned exceptions if base + # address (value in rs1) and effective address refer to regions of + # different types. + $jh{effective_address_compatible_with_base} = "true"; + + # Collect triggers. + $jh{triggers} = $config{triggers} if exists $config{triggers}; + + # Dump JSON config file. + my $json = JSON->new->allow_nonref; + my $text = $json->pretty->encode(\%jh); + print($fh $text); + + close $fh; +}#}}} + + +# Checker for iccm/dccm/pic sub-region address alignment. Address must be a multiple +# of size or next higher power of 2 if size is not a power of 2. +sub check_addr_align { + my ($section, $addr, $size) = @_; + + die("Invalid $section size: $size\n") if $size <= 0; + + my $log_size = log2($size); + my $p2 = 1 << $log_size; + $size = 2*$p2 if $size != $p2; + + if (($addr % $size) != 0) { + printf("Address of $section area(0x%x) is not a multiple of its size (0x%x)\n", + $addr, $size); + exit(1); + } +} + + +sub log2 { + my ($n) = @_; + return log($n)/log(2); +} + +sub b2d { + my ($v) = @_; + + $v = oct("0b" . $v); + + return($v); +} + +sub d2b { + my ($key,$v,$LEN) = @_; + + my $repeat; + + $v = sprintf "%b",$v; + if (length($v)<$LEN) { + $repeat=$LEN-length($v); + $v="0"x$repeat.$v; + } + elsif (length($v)>$LEN) { + die("d2b: parm $key value $v > len $LEN"); + } + + return($v); +} + + +sub invalid_mask { + my ($m) = @_; + + if ($m =~ /^0x(0)*([137]?f+)$/) { return(0); } + + return(1); +} + + +sub b2h { + my ($bin) = @_; + + # Make input bit string a multiple of 4 + $bin = substr("0000",length($bin)%4) . $bin if length($bin)%4; + + my ($hex, $nybble) = (""); + while (length($bin)) { + ($nybble,$bin) = (substr($bin,0,4), substr($bin,4)); + $nybble = eval "0b$nybble"; + $hex .= substr("0123456789ABCDEF", $nybble, 1); + } + return $hex; +} + +# BHT index is a hash of the GHR and PC_HASH +sub ghrhash{ + my($btb_index_hi,$ghr_size) = @_; + + $btb_size = $btb_index_hi - 1; + + my $ghr_hi = $ghr_size - 1; + my $ghr_lo = $btb_size; + + my $ghr_start = "{"; + if($ghr_size > $btb_size){ + return "{ghr[$ghr_hi:$ghr_lo], hashin[$btb_index_hi:2]^ghr[$ghr_lo-1:0]} // cf1"; + } + else { + return "{hashin[$ghr_size+1:2]^ghr[$ghr_size-1:0]}// cf2"; + } +} + +sub dump_parms { + my ($hash) = @_; + + my ($bvalue, $blen, $upper); + printf(FILE1 "typedef struct packed {\n"); + foreach my $key (sort keys %$hash) { + $bvalue=$hash->{$key}; + $blen=length($bvalue); + $upper=$key; + $upper=~ tr/a-z/A-Z/; + if ($blen==1) { + printf(FILE1 "\tbit %-10s $upper;\n"); + } + else { + printf(FILE1 "\tbit %-10s $upper;\n",sprintf("[%d:0]",$blen-1)); + } + } + printf(FILE1 "} el2_param_t;\n\n"); + + my $bcat=""; + my $parmcnt=0; + foreach my $key (sort keys %$hash) { + #printf("// $key = %s\n",$verilog_parms{$key}); + $bcat.=$hash->{$key}; + $parmcnt++; + } + + my $bvalue=""; + my $pcnt=0; + my $delim=","; + printf(FILE2 "parameter el2_param_t pt = '{\n"); + foreach my $key (sort keys %$hash) { + $upper=$key; + $upper=~ tr/a-z/A-Z/; + $pcnt++; + if ($pcnt==$parmcnt) { undef $delim; } + printf(FILE2 "\t%-22s : %d\'h%-10s $delim\n",$upper,length($hash->{$key}),b2h($hash->{$key})); + } + printf(FILE2 "}\n"); + + printf(FILE2 "// parameter el2_param_t pt = %d'h%s\n",length($bcat),b2h($bcat)); + +} + + diff --git a/design/dbg/el2_dbg.sv b/design/dbg/el2_dbg.sv new file mode 100644 index 0000000..5cfa548 --- /dev/null +++ b/design/dbg/el2_dbg.sv @@ -0,0 +1,607 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright 2020 Western Digital Corporation or it's affiliates. +// +// 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. +//******************************************************************************** +// $Id$ +// +// Function: Top level SWERV core file to control the debug mode +// Comments: Responsible to put the rest of the core in quiesce mode, +// Send the commands/address. sends WrData and Recieve read Data. +// And then Resume the core to do the normal mode +// Author : +//******************************************************************************** +module el2_dbg +import el2_pkg::*; +#( +`include "el2_param.vh" + )( + // outputs to the core for command and data interface + output logic [31:0] dbg_cmd_addr, + output logic [31:0] dbg_cmd_wrdata, + output logic dbg_cmd_valid, + output logic dbg_cmd_write, // 1: write command, 0: read_command + output logic [1:0] dbg_cmd_type, // 0:gpr 1:csr 2: memory + output logic [1:0] dbg_cmd_size, // size of the abstract mem access debug command + output logic dbg_core_rst_l, // core reset from dm + + // inputs back from the core/dec + input logic [31:0] core_dbg_rddata, + input logic core_dbg_cmd_done, // This will be treated like a valid signal + input logic core_dbg_cmd_fail, // Exception during command run + + // Signals to dma to get a bubble + output logic dbg_dma_bubble, // Debug needs a bubble to send a valid + input logic dma_dbg_ready, // DMA is ready to accept debug request + + // interface with the rest of the core to halt/resume handshaking + output logic dbg_halt_req, // This is a pulse + output logic dbg_resume_req, // Debug sends a resume requests. Pulse + input logic dec_tlu_debug_mode, // Core is in debug mode + input logic dec_tlu_dbg_halted, // The core has finished the queiscing sequence. Core is halted now + input logic dec_tlu_mpc_halted_only, // Only halted due to MPC + input logic dec_tlu_resume_ack, // core sends back an ack for the resume (pulse) + + // inputs from the JTAG + input logic dmi_reg_en, // read or write + input logic [6:0] dmi_reg_addr, // address of DM register + input logic dmi_reg_wr_en, // write instruction + input logic [31:0] dmi_reg_wdata, // write data + + // output + output logic [31:0] dmi_reg_rdata, // read data + + // AXI Write Channels + output logic sb_axi_awvalid, + input logic sb_axi_awready, + output logic [pt.SB_BUS_TAG-1:0] sb_axi_awid, + output logic [31:0] sb_axi_awaddr, + output logic [3:0] sb_axi_awregion, + output logic [7:0] sb_axi_awlen, + output logic [2:0] sb_axi_awsize, + output logic [1:0] sb_axi_awburst, + output logic sb_axi_awlock, + output logic [3:0] sb_axi_awcache, + output logic [2:0] sb_axi_awprot, + output logic [3:0] sb_axi_awqos, + + output logic sb_axi_wvalid, + input logic sb_axi_wready, + output logic [63:0] sb_axi_wdata, + output logic [7:0] sb_axi_wstrb, + output logic sb_axi_wlast, + + input logic sb_axi_bvalid, + output logic sb_axi_bready, + input logic [1:0] sb_axi_bresp, + + // AXI Read Channels + output logic sb_axi_arvalid, + input logic sb_axi_arready, + output logic [pt.SB_BUS_TAG-1:0] sb_axi_arid, + output logic [31:0] sb_axi_araddr, + output logic [3:0] sb_axi_arregion, + output logic [7:0] sb_axi_arlen, + output logic [2:0] sb_axi_arsize, + output logic [1:0] sb_axi_arburst, + output logic sb_axi_arlock, + output logic [3:0] sb_axi_arcache, + output logic [2:0] sb_axi_arprot, + output logic [3:0] sb_axi_arqos, + + input logic sb_axi_rvalid, + output logic sb_axi_rready, + input logic [63:0] sb_axi_rdata, + input logic [1:0] sb_axi_rresp, + + input logic dbg_bus_clk_en, + + // general inputs + input logic clk, + input logic rst_l, + input logic clk_override, + input logic scan_mode +); + + + typedef enum logic [2:0] {IDLE=3'b000, HALTING=3'b001, HALTED=3'b010, CMD_START=3'b011, CMD_WAIT=3'b100, CMD_DONE=3'b101, RESUMING=3'b110} state_t; + typedef enum logic [3:0] {SBIDLE=4'h0, WAIT_RD=4'h1, WAIT_WR=4'h2, CMD_RD=4'h3, CMD_WR=4'h4, CMD_WR_ADDR=4'h5, CMD_WR_DATA=4'h6, RSP_RD=4'h7, RSP_WR=4'h8, DONE=4'h9} sb_state_t; + + state_t dbg_state; + state_t dbg_nxtstate; + logic dbg_state_en; + // these are the registers that the debug module implements + logic [31:0] dmstatus_reg; // [26:24]-dmerr, [17:16]-resume ack, [9:8]-halted, [3:0]-version + logic [31:0] dmcontrol_reg; // dmcontrol register has only 6 bits implemented. 31: haltreq, 30: resumereq, 29: haltreset, 28: ackhavereset, 1: ndmreset, 0: dmactive. + logic [31:0] command_reg; + logic [31:0] abstractcs_reg; // bits implemted are [12] - busy and [10:8]= command error + logic [31:0] haltsum0_reg; + logic [31:0] data0_reg; + logic [31:0] data1_reg; + + // data 0 + logic [31:0] data0_din; + logic data0_reg_wren, data0_reg_wren0, data0_reg_wren1; + // data 1 + logic [31:0] data1_din; + logic data1_reg_wren, data1_reg_wren0; + // abstractcs + logic abstractcs_busy_wren; + logic abstractcs_busy_din; + logic [2:0] abstractcs_error_din; + logic abstractcs_error_sel0, abstractcs_error_sel1, abstractcs_error_sel2, abstractcs_error_sel3, abstractcs_error_sel4, abstractcs_error_sel5; + logic abstractcs_error_selor; + // dmstatus + logic dmstatus_resumeack_wren; + logic dmstatus_resumeack_din; + logic dmstatus_havereset_wren; + logic dmstatus_havereset_rst; + logic dmstatus_resumeack; + logic dmstatus_halted; + logic dmstatus_havereset; + + // dmcontrol + logic dmcontrol_wren, dmcontrol_wren_Q; + // command + logic command_wren; + logic [31:0] command_din; + // needed to send the read data back for dmi reads + logic [31:0] dmi_reg_rdata_din; + + sb_state_t sb_state; + sb_state_t sb_nxtstate; + logic sb_state_en; + + //System bus section + logic sbcs_wren; + logic sbcs_sbbusy_wren; + logic sbcs_sbbusy_din; + logic sbcs_sbbusyerror_wren; + logic sbcs_sbbusyerror_din; + + logic sbcs_sberror_wren; + logic [2:0] sbcs_sberror_din; + logic sbcs_unaligned; + logic sbcs_illegal_size; + + // data + logic sbdata0_reg_wren0; + logic sbdata0_reg_wren1; + logic sbdata0_reg_wren; + logic [31:0] sbdata0_din; + + logic sbdata1_reg_wren0; + logic sbdata1_reg_wren1; + logic sbdata1_reg_wren; + logic [31:0] sbdata1_din; + + logic sbaddress0_reg_wren0; + logic sbaddress0_reg_wren1; + logic sbaddress0_reg_wren; + logic [31:0] sbaddress0_reg_din; + logic [3:0] sbaddress0_incr; + logic sbreadonaddr_access; + logic sbreadondata_access; + logic sbdata0wr_access; + + logic sb_bus_cmd_read, sb_bus_cmd_write_addr, sb_bus_cmd_write_data; + logic sb_bus_rsp_read, sb_bus_rsp_write; + logic sb_bus_rsp_error; + logic [63:0] sb_bus_rdata; + + //registers + logic [31:0] sbcs_reg; + logic [31:0] sbaddress0_reg; + logic [31:0] sbdata0_reg; + logic [31:0] sbdata1_reg; + + logic dbg_dm_rst_l; + + //clken + logic dbg_free_clken; + logic dbg_free_clk; + + logic sb_free_clken; + logic sb_free_clk; + + // clocking + // used for the abstract commands. + assign dbg_free_clken = dmi_reg_en | (dbg_state != IDLE) | dbg_state_en | dec_tlu_dbg_halted | clk_override; + + // used for the system bus + assign sb_free_clken = dmi_reg_en | sb_state_en | (sb_state != SBIDLE) | clk_override; + + rvoclkhdr dbg_free_cgc (.en(dbg_free_clken), .l1clk(dbg_free_clk), .*); + rvoclkhdr sb_free_cgc (.en(sb_free_clken), .l1clk(sb_free_clk), .*); + + // end clocking section + + // Reset logic + assign dbg_dm_rst_l = rst_l & (dmcontrol_reg[0] | scan_mode); + assign dbg_core_rst_l = ~dmcontrol_reg[1]; + + // system bus register + // sbcs[31:29], sbcs - [22]:sbbusyerror, [21]: sbbusy, [20]:sbreadonaddr, [19:17]:sbaccess, [16]:sbautoincrement, [15]:sbreadondata, [14:12]:sberror, sbsize=32, 128=0, 64/32/16/8 are legal + assign sbcs_reg[31:29] = 3'b1; + assign sbcs_reg[28:23] = '0; + assign sbcs_reg[11:5] = 7'h20; + assign sbcs_reg[4:0] = 5'b01111; + assign sbcs_wren = (dmi_reg_addr == 7'h38) & dmi_reg_en & dmi_reg_wr_en & (sb_state == SBIDLE); // & (sbcs_reg[14:12] == 3'b000); + assign sbcs_sbbusyerror_wren = (sbcs_wren & dmi_reg_wdata[22]) | + ((sb_state != SBIDLE) & dmi_reg_en & ((dmi_reg_addr == 7'h39) | (dmi_reg_addr == 7'h3c) | (dmi_reg_addr == 7'h3d))); + assign sbcs_sbbusyerror_din = ~(sbcs_wren & dmi_reg_wdata[22]); // Clear when writing one + + rvdffs #(1) sbcs_sbbusyerror_reg (.din(sbcs_sbbusyerror_din), .dout(sbcs_reg[22]), .en(sbcs_sbbusyerror_wren), .rst_l(dbg_dm_rst_l), .clk(sb_free_clk)); + rvdffs #(1) sbcs_sbbusy_reg (.din(sbcs_sbbusy_din), .dout(sbcs_reg[21]), .en(sbcs_sbbusy_wren), .rst_l(dbg_dm_rst_l), .clk(sb_free_clk)); + rvdffs #(1) sbcs_sbreadonaddr_reg (.din(dmi_reg_wdata[20]), .dout(sbcs_reg[20]), .en(sbcs_wren), .rst_l(dbg_dm_rst_l), .clk(sb_free_clk)); + rvdffs #(5) sbcs_misc_reg (.din(dmi_reg_wdata[19:15]), .dout(sbcs_reg[19:15]), .en(sbcs_wren), .rst_l(dbg_dm_rst_l), .clk(sb_free_clk)); + rvdffs #(3) sbcs_error_reg (.din(sbcs_sberror_din[2:0]), .dout(sbcs_reg[14:12]), .en(sbcs_sberror_wren), .rst_l(dbg_dm_rst_l), .clk(sb_free_clk)); + + assign sbcs_unaligned = ((sbcs_reg[19:17] == 3'b001) & sbaddress0_reg[0]) | + ((sbcs_reg[19:17] == 3'b010) & (|sbaddress0_reg[1:0])) | + ((sbcs_reg[19:17] == 3'b011) & (|sbaddress0_reg[2:0])); + + assign sbcs_illegal_size = sbcs_reg[19]; // Anything bigger than 64 bits is illegal + + assign sbaddress0_incr[3:0] = ({4{(sbcs_reg[19:17] == 3'b000)}} & 4'b0001) | + ({4{(sbcs_reg[19:17] == 3'b001)}} & 4'b0010) | + ({4{(sbcs_reg[19:17] == 3'b010)}} & 4'b0100) | + ({4{(sbcs_reg[19:17] == 3'b100)}} & 4'b1000); + + // sbdata + assign sbdata0_reg_wren0 = dmi_reg_en & dmi_reg_wr_en & (dmi_reg_addr == 7'h3c); // write data only when single read is 0 + assign sbdata0_reg_wren1 = (sb_state == RSP_RD) & sb_state_en & ~sbcs_sberror_wren; + assign sbdata0_reg_wren = sbdata0_reg_wren0 | sbdata0_reg_wren1; + + assign sbdata1_reg_wren0 = dmi_reg_en & dmi_reg_wr_en & (dmi_reg_addr == 7'h3d); // write data only when single read is 0; + assign sbdata1_reg_wren1 = (sb_state == RSP_RD) & sb_state_en & ~sbcs_sberror_wren; + assign sbdata1_reg_wren = sbdata1_reg_wren0 | sbdata1_reg_wren1; + + assign sbdata0_din[31:0] = ({32{sbdata0_reg_wren0}} & dmi_reg_wdata[31:0]) | + ({32{sbdata0_reg_wren1}} & sb_bus_rdata[31:0]); + assign sbdata1_din[31:0] = ({32{sbdata1_reg_wren0}} & dmi_reg_wdata[31:0]) | + ({32{sbdata1_reg_wren1}} & sb_bus_rdata[63:32]); + + rvdffe #(32) dbg_sbdata0_reg (.*, .din(sbdata0_din[31:0]), .dout(sbdata0_reg[31:0]), .en(sbdata0_reg_wren), .rst_l(dbg_dm_rst_l)); + rvdffe #(32) dbg_sbdata1_reg (.*, .din(sbdata1_din[31:0]), .dout(sbdata1_reg[31:0]), .en(sbdata1_reg_wren), .rst_l(dbg_dm_rst_l)); + + // sbaddress + assign sbaddress0_reg_wren0 = dmi_reg_en & dmi_reg_wr_en & (dmi_reg_addr == 7'h39); + assign sbaddress0_reg_wren = sbaddress0_reg_wren0 | sbaddress0_reg_wren1; + assign sbaddress0_reg_din[31:0]= ({32{sbaddress0_reg_wren0}} & dmi_reg_wdata[31:0]) | + ({32{sbaddress0_reg_wren1}} & (sbaddress0_reg[31:0] + {28'b0,sbaddress0_incr[3:0]})); + rvdffe #(32) dbg_sbaddress0_reg (.*, .din(sbaddress0_reg_din[31:0]), .dout(sbaddress0_reg[31:0]), .en(sbaddress0_reg_wren), .rst_l(dbg_dm_rst_l)); + + assign sbreadonaddr_access = dmi_reg_en & dmi_reg_wr_en & (dmi_reg_addr == 7'h39) & sbcs_reg[20]; // if readonaddr is set the next command will start upon writing of addr0 + assign sbreadondata_access = dmi_reg_en & ~dmi_reg_wr_en & (dmi_reg_addr == 7'h3c) & sbcs_reg[15]; // if readondata is set the next command will start upon reading of data0 + assign sbdata0wr_access = dmi_reg_en & dmi_reg_wr_en & (dmi_reg_addr == 7'h3c); // write to sbdata0 will start write command to system bus + + // memory mapped registers + // dmcontrol register has only 6 bits implemented. 31: haltreq, 30: resumereq, 29: haltreset, 28: ackhavereset, 1: ndmreset, 0: dmactive. + // rest all the bits are zeroed out + // dmactive flop is reset based on core rst_l, all other flops use dm_rst_l + assign dmcontrol_wren = (dmi_reg_addr == 7'h10) & dmi_reg_en & dmi_reg_wr_en; + assign dmcontrol_reg[27:2] = '0; + rvdffs #(5) dmcontrolff (.din({dmi_reg_wdata[31:28],dmi_reg_wdata[1]}), .dout({dmcontrol_reg[31:28], dmcontrol_reg[1]}), .en(dmcontrol_wren), .rst_l(dbg_dm_rst_l), .clk(dbg_free_clk)); + rvdffs #(1) dmcontrol_dmactive_ff (.din(dmi_reg_wdata[0]), .dout(dmcontrol_reg[0]), .en(dmcontrol_wren), .rst_l(rst_l), .clk(dbg_free_clk)); + rvdff #(1) dmcontrol_wrenff(.din(dmcontrol_wren), .dout(dmcontrol_wren_Q), .rst_l(dbg_dm_rst_l), .clk(dbg_free_clk)); + + // dmstatus register bits that are implemented + // [19:18]-havereset,[17:16]-resume ack, [9:8]-halted, [3:0]-version + // rest all the bits are zeroed out + assign dmstatus_reg[31:20] = '0; + assign dmstatus_reg[19:18] = {2{dmstatus_havereset}}; + assign dmstatus_reg[15:10] = '0; + assign dmstatus_reg[7] = '1; + assign dmstatus_reg[6:4] = '0; + assign dmstatus_reg[17:16] = {2{dmstatus_resumeack}}; + assign dmstatus_reg[9:8] = {2{dmstatus_halted}}; + assign dmstatus_reg[3:0] = 4'h2; + + assign dmstatus_resumeack_wren = ((dbg_state == RESUMING) & dec_tlu_resume_ack) | (dmstatus_resumeack & ~dmcontrol_reg[30]); + assign dmstatus_resumeack_din = (dbg_state == RESUMING) & dec_tlu_resume_ack; + + assign dmstatus_havereset_wren = (dmi_reg_addr == 7'h10) & dmi_reg_wdata[1] & dmi_reg_en & dmi_reg_wr_en; + assign dmstatus_havereset_rst = (dmi_reg_addr == 7'h10) & dmi_reg_wdata[28] & dmi_reg_en & dmi_reg_wr_en; + + rvdffs #(1) dmstatus_resumeack_reg (.din(dmstatus_resumeack_din), .dout(dmstatus_resumeack), .en(dmstatus_resumeack_wren), .rst_l(dbg_dm_rst_l), .clk(dbg_free_clk)); + rvdff #(1) dmstatus_halted_reg (.din(dec_tlu_dbg_halted & ~dec_tlu_mpc_halted_only), .dout(dmstatus_halted), .rst_l(dbg_dm_rst_l), .clk(dbg_free_clk)); + rvdffsc #(1) dmstatus_havereset_reg (.din(1'b1), .dout(dmstatus_havereset), .en(dmstatus_havereset_wren), .clear(dmstatus_havereset_rst), .rst_l(dbg_dm_rst_l), .clk(dbg_free_clk)); + + // haltsum0 register + assign haltsum0_reg[31:1] = '0; + assign haltsum0_reg[0] = dmstatus_halted; + + // abstractcs register + // bits implemted are [12] - busy and [10:8]= command error + assign abstractcs_reg[31:13] = '0; + assign abstractcs_reg[11] = '0; + assign abstractcs_reg[7:4] = '0; + assign abstractcs_reg[3:0] = 4'h2; // One data register + assign abstractcs_error_sel0 = abstractcs_reg[12] & dmi_reg_en & ((dmi_reg_wr_en & ( (dmi_reg_addr == 7'h16) | (dmi_reg_addr == 7'h17))) | (dmi_reg_addr == 7'h4)); + assign abstractcs_error_sel1 = dmi_reg_en & dmi_reg_wr_en & (dmi_reg_addr == 7'h17) & ~((dmi_reg_wdata[31:24] == 8'b0) | (dmi_reg_wdata[31:24] == 8'h2)); + assign abstractcs_error_sel2 = core_dbg_cmd_done & core_dbg_cmd_fail; + assign abstractcs_error_sel3 = dmi_reg_en & dmi_reg_wr_en & (dmi_reg_addr == 7'h17) & ~dmstatus_reg[9]; //(dbg_state != HALTED); + assign abstractcs_error_sel4 = (dmi_reg_addr == 7'h17) & dmi_reg_en & dmi_reg_wr_en & (dmi_reg_wdata[31:24] == 8'h2) & + ( ((dmi_reg_wdata[22:20] == 3'b001) & data1_reg[0]) | + ((dmi_reg_wdata[22:20] == 3'b010) & (|data1_reg[1:0])) | + dmi_reg_wdata[22] | (dmi_reg_wdata[22:20] == 3'b011) + ); + + assign abstractcs_error_sel5 = (dmi_reg_addr == 7'h16) & dmi_reg_en & dmi_reg_wr_en; + + assign abstractcs_error_selor = abstractcs_error_sel0 | abstractcs_error_sel1 | abstractcs_error_sel2 | abstractcs_error_sel3 | abstractcs_error_sel4 | abstractcs_error_sel5; + + assign abstractcs_error_din[2:0] = ({3{abstractcs_error_sel0}} & 3'b001) | // writing command or abstractcs while a command was executing. Or accessing data0 + ({3{abstractcs_error_sel1}} & 3'b010) | // writing a non-zero command to cmd field of command + ({3{abstractcs_error_sel2}} & 3'b011) | // exception while running command + ({3{abstractcs_error_sel3}} & 3'b100) | // writing a comnand when not in the halted state + ({3{abstractcs_error_sel4}} & 3'b111) | // unaligned abstract memory command + ({3{abstractcs_error_sel5}} & ~dmi_reg_wdata[10:8] & abstractcs_reg[10:8]) | // W1C + ({3{~abstractcs_error_selor}} & abstractcs_reg[10:8]); // hold + + rvdffs #(1) dmabstractcs_busy_reg (.din(abstractcs_busy_din), .dout(abstractcs_reg[12]), .en(abstractcs_busy_wren), .rst_l(dbg_dm_rst_l), .clk(dbg_free_clk)); + rvdff #(3) dmabstractcs_error_reg (.din(abstractcs_error_din[2:0]), .dout(abstractcs_reg[10:8]), .rst_l(dbg_dm_rst_l), .clk(dbg_free_clk)); + + + // command register - implemented all the bits in this register + // command[16] = 1: write, 0: read + // Size - 2, Bits Not implemented: 23 (aamvirtual), 19-autoincrement, 18-postexec, 17-transfer + assign command_wren = (dmi_reg_addr == 7'h17) & dmi_reg_en & dmi_reg_wr_en & (dbg_state == HALTED); + assign command_din[31:0] = {dmi_reg_wdata[31:24],1'b0,3'b010,3'b0,dmi_reg_wdata[16:0]}; + rvdffe #(32) dmcommand_reg (.*, .din(command_din[31:0]), .dout(command_reg[31:0]), .en(command_wren), .rst_l(dbg_dm_rst_l)); + + // data0 reg + assign data0_reg_wren0 = (dmi_reg_en & dmi_reg_wr_en & (dmi_reg_addr == 7'h4) & (dbg_state == HALTED)); + assign data0_reg_wren1 = core_dbg_cmd_done & (dbg_state == CMD_WAIT) & ~command_reg[16]; + assign data0_reg_wren = data0_reg_wren0 | data0_reg_wren1; + + assign data0_din[31:0] = ({32{data0_reg_wren0}} & dmi_reg_wdata[31:0]) | + ({32{data0_reg_wren1}} & core_dbg_rddata[31:0]); + + rvdffe #(32) dbg_data0_reg (.*, .din(data0_din[31:0]), .dout(data0_reg[31:0]), .en(data0_reg_wren), .rst_l(dbg_dm_rst_l)); + + // data 1 + assign data1_reg_wren0 = (dmi_reg_en & dmi_reg_wr_en & (dmi_reg_addr == 7'h5) & (dbg_state == HALTED)); + assign data1_reg_wren = data1_reg_wren0; + + assign data1_din[31:0] = ({32{data1_reg_wren0}} & dmi_reg_wdata[31:0]); + + rvdffe #(32) dbg_data1_reg (.*, .din(data1_din[31:0]), .dout(data1_reg[31:0]), .en(data1_reg_wren), .rst_l(dbg_dm_rst_l)); + + + // FSM to control the debug mode entry, command send/recieve, and Resume flow. + always_comb begin + dbg_nxtstate = IDLE; + dbg_state_en = 1'b0; + abstractcs_busy_wren = 1'b0; + abstractcs_busy_din = 1'b0; + dbg_halt_req = dmcontrol_wren_Q & dmcontrol_reg[31]; // single pulse output to the core. Need to drive every time this register is written since core might be halted due to MPC + dbg_resume_req = 1'b0; // single pulse output to the core + + case (dbg_state) + IDLE: begin + dbg_nxtstate = (dmstatus_reg[9] | dec_tlu_mpc_halted_only) ? HALTED : HALTING; // initiate the halt command to the core + dbg_state_en = ((dmcontrol_reg[31] & ~dec_tlu_debug_mode) | dmstatus_reg[9] | dec_tlu_mpc_halted_only) & ~dmcontrol_reg[1]; // when the jtag writes the halt bit in the DM register, OR when the status indicates H + dbg_halt_req = dmcontrol_reg[31]; // only when jtag has written the halt_req bit in the control. Removed debug mode qualification during MPC changes + end + HALTING : begin + dbg_nxtstate = HALTED; // Goto HALTED once the core sends an ACK + dbg_state_en = dmstatus_reg[9]; // core indicates halted + end + HALTED: begin + // wait for halted to go away before send to resume. Else start of new command + dbg_nxtstate = (dmstatus_reg[9] & ~dmcontrol_reg[1]) ? ((dmcontrol_reg[30] & ~dmcontrol_reg[31]) ? RESUMING : CMD_START) : + (dmcontrol_reg[31] ? HALTING : IDLE); // This is MPC halted case + dbg_state_en = (dmstatus_reg[9] & dmcontrol_reg[30] & ~dmcontrol_reg[31] & dmcontrol_wren_Q) | command_wren | dmcontrol_reg[1] | ~(dmstatus_reg[9] | dec_tlu_mpc_halted_only); // need to be exclusive ??? + abstractcs_busy_wren = dbg_state_en & (dbg_nxtstate == CMD_START); // write busy when a new command was written by jtag + abstractcs_busy_din = 1'b1; + dbg_resume_req = dbg_state_en & (dbg_nxtstate == RESUMING); // single cycle pulse to core if resuming + end + CMD_START: begin + dbg_nxtstate = (|abstractcs_reg[10:8]) ? CMD_DONE : CMD_WAIT; // new command sent to the core + dbg_state_en = dbg_cmd_valid | (|abstractcs_reg[10:8]); + end + CMD_WAIT: begin + dbg_nxtstate = CMD_DONE; + dbg_state_en = core_dbg_cmd_done; // go to done state for one cycle after completing current command + end + CMD_DONE: begin + dbg_nxtstate = HALTED; + dbg_state_en = 1'b1; + abstractcs_busy_wren = dbg_state_en; // remove the busy bit from the abstracts ( bit 12 ) + abstractcs_busy_din = 1'b0; + end + RESUMING : begin + dbg_nxtstate = IDLE; + dbg_state_en = dmstatus_reg[17]; // resume ack has been updated in the dmstatus register + end + default : begin + dbg_nxtstate = IDLE; + dbg_state_en = 1'b0; + abstractcs_busy_wren = 1'b0; + abstractcs_busy_din = 1'b0; + dbg_halt_req = 1'b0; // single pulse output to the core + dbg_resume_req = 1'b0; // single pulse output to the core + end + endcase + end // always_comb begin + + assign dmi_reg_rdata_din[31:0] = ({32{dmi_reg_addr == 7'h4}} & data0_reg[31:0]) | + ({32{dmi_reg_addr == 7'h5}} & data1_reg[31:0]) | + ({32{dmi_reg_addr == 7'h10}} & dmcontrol_reg[31:0]) | + ({32{dmi_reg_addr == 7'h11}} & dmstatus_reg[31:0]) | + ({32{dmi_reg_addr == 7'h16}} & abstractcs_reg[31:0]) | + ({32{dmi_reg_addr == 7'h17}} & command_reg[31:0]) | + ({32{dmi_reg_addr == 7'h40}} & haltsum0_reg[31:0]) | + ({32{dmi_reg_addr == 7'h38}} & sbcs_reg[31:0]) | + ({32{dmi_reg_addr == 7'h39}} & sbaddress0_reg[31:0]) | + ({32{dmi_reg_addr == 7'h3c}} & sbdata0_reg[31:0]) | + ({32{dmi_reg_addr == 7'h3d}} & sbdata1_reg[31:0]); + + + rvdffs #($bits(state_t)) dbg_state_reg (.din(dbg_nxtstate), .dout({dbg_state}), .en(dbg_state_en), .rst_l(dbg_dm_rst_l), .clk(dbg_free_clk)); + // Ack will use the power on reset only otherwise there won't be any ack until dmactive is 1 + rvdffs #(32) dmi_rddata_reg (.din(dmi_reg_rdata_din[31:0]), .dout(dmi_reg_rdata[31:0]), .en(dmi_reg_en), .rst_l(dbg_dm_rst_l), .clk(dbg_free_clk)); + + // interface for the core + assign dbg_cmd_addr[31:0] = (command_reg[31:24] == 8'h2) ? {data1_reg[31:2],2'b0} : {20'b0, command_reg[11:0]}; // Only word addresses for abstract memory + assign dbg_cmd_wrdata[31:0] = data0_reg[31:0]; + assign dbg_cmd_valid = (dbg_state == CMD_START) & ~(|abstractcs_reg[10:8]) & dma_dbg_ready; + assign dbg_cmd_write = command_reg[16]; + assign dbg_cmd_type[1:0] = (command_reg[31:24] == 8'h2) ? 2'b10 : {1'b0, (command_reg[15:12] == 4'b0)}; + assign dbg_cmd_size[1:0] = command_reg[21:20]; + + // Ask DMA to stop taking bus trxns since debug request is done + assign dbg_dma_bubble = ((dbg_state == CMD_START) & ~(|abstractcs_reg[10:8])) | (dbg_state == CMD_WAIT); + + // system bus FSM + always_comb begin + sb_nxtstate = SBIDLE; + sb_state_en = 1'b0; + sbcs_sbbusy_wren = 1'b0; + sbcs_sbbusy_din = 1'b0; + sbcs_sberror_wren = 1'b0; + sbcs_sberror_din[2:0] = 3'b0; + sbaddress0_reg_wren1 = 1'b0; + case (sb_state) + SBIDLE: begin + sb_nxtstate = sbdata0wr_access ? WAIT_WR : WAIT_RD; + sb_state_en = sbdata0wr_access | sbreadondata_access | sbreadonaddr_access; + sbcs_sbbusy_wren = sb_state_en; // set the single read bit if it is a singlread command + sbcs_sbbusy_din = 1'b1; + sbcs_sberror_wren = sbcs_wren & (|dmi_reg_wdata[14:12]); // write to clear the error bits + sbcs_sberror_din[2:0] = ~dmi_reg_wdata[14:12] & sbcs_reg[14:12]; + end + WAIT_RD: begin + sb_nxtstate = (sbcs_unaligned | sbcs_illegal_size) ? DONE : CMD_RD; + sb_state_en = dbg_bus_clk_en | sbcs_unaligned | sbcs_illegal_size; + sbcs_sberror_wren = sbcs_unaligned | sbcs_illegal_size; + sbcs_sberror_din[2:0] = sbcs_unaligned ? 3'b011 : 3'b100; + end + WAIT_WR: begin + sb_nxtstate = (sbcs_unaligned | sbcs_illegal_size) ? DONE : CMD_WR; + sb_state_en = dbg_bus_clk_en | sbcs_unaligned | sbcs_illegal_size; + sbcs_sberror_wren = sbcs_unaligned | sbcs_illegal_size; + sbcs_sberror_din[2:0] = sbcs_unaligned ? 3'b011 : 3'b100; + end + CMD_RD : begin + sb_nxtstate = RSP_RD; + sb_state_en = sb_bus_cmd_read & dbg_bus_clk_en; + end + CMD_WR : begin + sb_nxtstate = (sb_bus_cmd_write_addr & sb_bus_cmd_write_data) ? RSP_WR : (sb_bus_cmd_write_data ? CMD_WR_ADDR : CMD_WR_DATA); + sb_state_en = (sb_bus_cmd_write_addr | sb_bus_cmd_write_data) & dbg_bus_clk_en; + end + CMD_WR_ADDR : begin + sb_nxtstate = RSP_WR; + sb_state_en = sb_bus_cmd_write_addr & dbg_bus_clk_en; + end + CMD_WR_DATA : begin + sb_nxtstate = RSP_WR; + sb_state_en = sb_bus_cmd_write_data & dbg_bus_clk_en; + end + RSP_RD: begin + sb_nxtstate = DONE; + sb_state_en = sb_bus_rsp_read & dbg_bus_clk_en; + sbcs_sberror_wren = sb_state_en & sb_bus_rsp_error; + sbcs_sberror_din[2:0] = 3'b010; + end + RSP_WR: begin + sb_nxtstate = DONE; + sb_state_en = sb_bus_rsp_write & dbg_bus_clk_en; + sbcs_sberror_wren = sb_state_en & sb_bus_rsp_error; + sbcs_sberror_din[2:0] = 3'b010; + end + DONE: begin + sb_nxtstate = SBIDLE; + sb_state_en = 1'b1; + sbcs_sbbusy_wren = 1'b1; // reset the single read + sbcs_sbbusy_din = 1'b0; + sbaddress0_reg_wren1 = sbcs_reg[16]; // auto increment was set. Update to new address after completing the current command + + end + default : begin + sb_nxtstate = SBIDLE; + sb_state_en = 1'b0; + sbcs_sbbusy_wren = 1'b0; + sbcs_sbbusy_din = 1'b0; + sbcs_sberror_wren = 1'b0; + sbcs_sberror_din[2:0] = 3'b0; + sbaddress0_reg_wren1 = 1'b0; + end + endcase + end // always_comb begin + + rvdffs #($bits(sb_state_t)) sb_state_reg (.din(sb_nxtstate), .dout({sb_state}), .en(sb_state_en), .rst_l(dbg_dm_rst_l), .clk(sb_free_clk)); + + // Generic bus response signals + assign sb_bus_cmd_read = sb_axi_arvalid & sb_axi_arready; + assign sb_bus_cmd_write_addr = sb_axi_awvalid & sb_axi_awready; + assign sb_bus_cmd_write_data = sb_axi_wvalid & sb_axi_wready; + + assign sb_bus_rsp_read = sb_axi_rvalid & sb_axi_rready; + assign sb_bus_rsp_write = sb_axi_bvalid & sb_axi_bready; + assign sb_bus_rsp_error = (sb_bus_rsp_read & (|(sb_axi_rresp[1:0]))) | (sb_bus_rsp_write & (|(sb_axi_bresp[1:0]))); + + // AXI Request signals + assign sb_axi_awvalid = (sb_state == CMD_WR) | (sb_state == CMD_WR_ADDR); + assign sb_axi_awaddr[31:0] = sbaddress0_reg[31:0]; + assign sb_axi_awid[pt.SB_BUS_TAG-1:0] = '0; + assign sb_axi_awsize[2:0] = sbcs_reg[19:17]; + assign sb_axi_awprot[2:0] = '0; + assign sb_axi_awcache[3:0] = 4'b1111; + assign sb_axi_awregion[3:0] = sbaddress0_reg[31:28]; + assign sb_axi_awlen[7:0] = '0; + assign sb_axi_awburst[1:0] = 2'b01; + assign sb_axi_awqos[3:0] = '0; + assign sb_axi_awlock = '0; + + assign sb_axi_wvalid = (sb_state == CMD_WR) | (sb_state == CMD_WR_DATA); + assign sb_axi_wdata[63:0] = ({64{(sbcs_reg[19:17] == 3'h0)}} & {8{sbdata0_reg[7:0]}}) | + ({64{(sbcs_reg[19:17] == 3'h1)}} & {4{sbdata0_reg[15:0]}}) | + ({64{(sbcs_reg[19:17] == 3'h2)}} & {2{sbdata0_reg[31:0]}}) | + ({64{(sbcs_reg[19:17] == 3'h3)}} & {sbdata1_reg[31:0],sbdata0_reg[31:0]}); + assign sb_axi_wstrb[7:0] = ({8{(sbcs_reg[19:17] == 3'h0)}} & (8'h1 << sbaddress0_reg[2:0])) | + ({8{(sbcs_reg[19:17] == 3'h1)}} & (8'h3 << {sbaddress0_reg[2:1],1'b0})) | + ({8{(sbcs_reg[19:17] == 3'h2)}} & (8'hf << {sbaddress0_reg[2],2'b0})) | + ({8{(sbcs_reg[19:17] == 3'h3)}} & 8'hff); + assign sb_axi_wlast = '1; + + assign sb_axi_arvalid = (sb_state == CMD_RD); + assign sb_axi_araddr[31:0] = sbaddress0_reg[31:0]; + assign sb_axi_arid[pt.SB_BUS_TAG-1:0] = '0; + assign sb_axi_arsize[2:0] = sbcs_reg[19:17]; + assign sb_axi_arprot[2:0] = '0; + assign sb_axi_arcache[3:0] = 4'b0; + assign sb_axi_arregion[3:0] = sbaddress0_reg[31:28]; + assign sb_axi_arlen[7:0] = '0; + assign sb_axi_arburst[1:0] = 2'b01; + assign sb_axi_arqos[3:0] = '0; + assign sb_axi_arlock = '0; + + // AXI Response signals + assign sb_axi_bready = 1'b1; + + assign sb_axi_rready = 1'b1; + assign sb_bus_rdata[63:0] = ({64{sbcs_reg[19:17] == 3'h0}} & ((sb_axi_rdata[63:0] >> 8*sbaddress0_reg[2:0]) & 64'hff)) | + ({64{sbcs_reg[19:17] == 3'h1}} & ((sb_axi_rdata[63:0] >> 16*sbaddress0_reg[2:1]) & 64'hffff)) | + ({64{sbcs_reg[19:17] == 3'h2}} & ((sb_axi_rdata[63:0] >> 32*sbaddress0_reg[2]) & 64'hffff_ffff)) | + ({64{sbcs_reg[19:17] == 3'h3}} & sb_axi_rdata[63:0]); + +`ifdef ASSERT_ON +// assertion. +// when the resume_ack is asserted then the dec_tlu_dbg_halted should be 0 + dm_check_resume_and_halted: assert property (@(posedge clk) disable iff(~rst_l) (~dec_tlu_resume_ack | ~dec_tlu_dbg_halted)); +`endif +endmodule diff --git a/design/dec/cdecode b/design/dec/cdecode new file mode 100644 index 0000000..d98b523 --- /dev/null +++ b/design/dec/cdecode @@ -0,0 +1,254 @@ + +.definition + + + +# invalid rs2=0 +c.add0 = [1001.....1....10] +c.add1 = [1001......1...10] +c.add2 = [1001.......1..10] +c.add3 = [1001........1.10] +c.add4 = [1001.........110] + +# invalid rs2=0 +c.mv0 = [1000.....1....10] +c.mv1 = [1000......1...10] +c.mv2 = [1000.......1..10] +c.mv3 = [1000........1.10] +c.mv4 = [1000.........110] + + +# invalid if rs1=0 +c.jalr0 = [10011....0000010] +c.jalr1 = [1001.1...0000010] +c.jalr2 = [1001..1..0000010] +c.jalr3 = [1001...1.0000010] +c.jalr4 = [1001....10000010] + +c.addi = [000...........01] + +# invalid imm=0 +c.addi16sp0 = [011100010.....01] +c.addi16sp1 = [011.000101....01] +c.addi16sp2 = [011.00010.1...01] +c.addi16sp3 = [011.00010..1..01] +c.addi16sp4 = [011.00010...1.01] +c.addi16sp5 = [011.00010....101] + +# invalid uimm=0 +c.addi4spn0 = [0001..........00] +c.addi4spn1 = [000.1.........00] +c.addi4spn2 = [000..1........00] +c.addi4spn3 = [000...1.......00] +c.addi4spn4 = [000....1......00] +c.addi4spn5 = [000.....1.....00] +c.addi4spn6 = [000......1....00] +c.addi4spn7 = [000.......1...00] + + +c.and = [100011...11...01] +c.andi = [100.10........01] +c.beqz = [110...........01] +c.bnez = [111...........01] +c.ebreak = [1001000000000010] +c.j = [101...........01] +c.jal = [001...........01] + + +c.jr0 = [10001....0000010] +c.jr1 = [1000.1...0000010] +c.jr2 = [1000..1..0000010] +c.jr3 = [1000...1.0000010] +c.jr4 = [1000....10000010] + +c.li = [010...........01] + +# invalid rd=x2 or imm=0 +c.lui0 = [01111.........01] +c.lui1 = [0111.1........01] +c.lui2 = [0111..1.......01] +c.lui3 = [0111...0......01] +c.lui4 = [0111....1.....01] +c.lui5 = [011.1....1....01] +c.lui6 = [011..1...1....01] +c.lui7 = [011...1..1....01] +c.lui8 = [011....0.1....01] +c.lui9 = [011.....11....01] +c.lui10= [011.1.....1...01] +c.lui11= [011..1....1...01] +c.lui12 = [011...1...1...01] +c.lui13 = [011....0..1...01] +c.lui14 = [011.....1.1...01] +c.lui15 = [011.1......1..01] +c.lui16 = [011..1.....1..01] +c.lui17 = [011...1....1..01] +c.lui18 = [011....0...1..01] +c.lui19 = [011.....1..1..01] +c.lui20 = [011.1.......1.01] +c.lui21 = [011..1......1.01] +c.lui22 = [011...1.....1.01] +c.lui23 = [011....0....1.01] +c.lui24 = [011.....1...1.01] +c.lui25 = [011.1........101] +c.lui26 = [011..1.......101] +c.lui27 = [011...1......101] +c.lui28 = [011....0.....101] +c.lui29 = [011.....1....101] + + +c.lw = [010...........00] + + +c.lwsp = [010...........10] + +c.or = [100011...10...01] + +# bit 5 of the shift must be 0 to be legal +c.slli = [0000..........10] + +c.srai = [100001........01] + +c.srli = [100000........01] + +c.sub = [100011...00...01] +c.sw = [110...........00] +c.swsp = [110...........10] +c.xor = [100011...01...01] + + +.input +rv32c = { + i[15] + i[14] + i[13] + i[12] + i[11] + i[10] + i[9] + i[8] + i[7] + i[6] + i[5] + i[4] + i[3] + i[2] + i[1] + i[0] +} + +.output +rv32c = { + rdrd + rdrs1 + rs2rs2 + rdprd + rdprs1 + rs2prs2 + rs2prd + uimm9_2 + ulwimm6_2 + ulwspimm7_2 + rdeq2 + rdeq1 + rs1eq2 + sbroffset8_1 + simm9_4 + simm5_0 + sjaloffset11_1 + sluimm17_12 + uimm5_0 + uswimm6_2 + uswspimm7_2 + o[31] + o[30] + o[29] + o[28] + o[27] + o[26] + o[25] + o[24] + o[23] + o[22] + o[21] + o[20] + o[19] + o[18] + o[17] + o[16] + o[15] + o[14] + o[13] + o[12] + o[11] + o[10] + o[9] + o[8] + o[7] + o[6] + o[5] + o[4] + o[3] + o[2] + o[1] + o[0] + } + +# assign rs2d[4:0] = i[6:2]; +# +# assign rdd[4:0] = i[11:7]; +# +# assign rdpd[4:0] = {2'b01, i[9:7]}; +# +# assign rs2pd[4:0] = {2'b01, i[4:2]}; + +.decode + + + + +rv32c[c.add{0-4}] = { rdrd rdrs1 rs2rs2 o[5] o[4] o[1] o[0] } + +rv32c[c.mv{0-4}] = { rdrd rs2rs2 o[5] o[4] o[1] o[0] } + +rv32c[c.addi] = { rdrd rdrs1 simm5_0 o[4] o[1] o[0] } + +rv32c[c.addi16sp{0-5}] = { rdeq2 rs1eq2 simm9_4 o[4] o[1] o[0] } +rv32c[c.addi4spn{0-7}] = { rs2prd rs1eq2 uimm9_2 o[4] o[1] o[0] } + + +rv32c[c.and] = { rdprd rdprs1 rs2prs2 o[14] o[13] o[12] o[5] o[4] o[1] o[0] } +rv32c[c.andi] = { rdprd rdprs1 simm5_0 o[14] o[13] o[12] o[4] o[1] o[0] } +rv32c[c.beqz] = { rdprs1 sbroffset8_1 o[6] o[5] o[1] o[0] } +rv32c[c.bnez] = { rdprs1 sbroffset8_1 o[12] o[6] o[5] o[1] o[0] } + + +rv32c[c.ebreak] = { o[20] o[6] o[5] o[4] o[1] o[0] } + +rv32c[c.j] = { sjaloffset11_1 o[6] o[5] o[3] o[2] o[1] o[0] } +rv32c[c.jal] = { sjaloffset11_1 rdeq1 o[6] o[5] o[3] o[2] o[1] o[0] } + + +rv32c[c.jalr{0-4}] = { rdeq1 rdrs1 o[6] o[5] o[2] o[1] o[0] } +rv32c[c.jr{0-4}] = { rdrs1 o[6] o[5] o[2] o[1] o[0] } +rv32c[c.li] = { rdrd simm5_0 o[4] o[1] o[0] } + +rv32c[c.lui{0-29}] = { rdrd sluimm17_12 o[5] o[4] o[2] o[1] o[0] } +rv32c[c.lw] = { rs2prd rdprs1 ulwimm6_2 o[13] o[1] o[0] } +rv32c[c.lwsp] = { rdrd rs1eq2 ulwspimm7_2 o[13] o[1] o[0] } + + +rv32c[c.or] = { rdprd rdprs1 rs2prs2 o[14] o[13] o[5] o[4] o[1] o[0] } + +rv32c[c.slli] = { rdrd rdrs1 uimm5_0 o[12] o[4] o[1] o[0] } +rv32c[c.srai] = { rdprd rdprs1 uimm5_0 o[30] o[14] o[12] o[4] o[1] o[0] } +rv32c[c.srli] = { rdprd rdprs1 uimm5_0 o[14] o[12] o[4] o[1] o[0] } + + +rv32c[c.sub] = { rdprd rdprs1 rs2prs2 o[30] o[5] o[4] o[1] o[0] } +rv32c[c.sw] = { rdprs1 rs2prs2 uswimm6_2 o[13] o[5] o[1] o[0] } +rv32c[c.swsp] = { rs2rs2 rs1eq2 uswspimm7_2 o[13] o[5] o[1] o[0] } +rv32c[c.xor] = { rdprd rdprs1 rs2prs2 o[14] o[5] o[4] o[1] o[0] } + + + +.end \ No newline at end of file diff --git a/design/dec/csrdecode b/design/dec/csrdecode new file mode 100644 index 0000000..5fa2ba2 --- /dev/null +++ b/design/dec/csrdecode @@ -0,0 +1,240 @@ +.definition + +csr_misa = [001100000001] +csr_mvendorid = [111100010001] +csr_marchid = [111100010010] +csr_mimpid = [111100010011] +csr_mhartid = [111100010100] +csr_mstatus = [001100000000] +csr_mtvec = [001100000101] +csr_mip = [001101000100] +csr_mie = [001100000100] +csr_mcyclel = [101100000000] +csr_mcycleh = [101110000000] +csr_minstretl = [101100000010] +csr_minstreth = [101110000010] +csr_mscratch = [001101000000] +csr_mepc = [001101000001] +csr_mcause = [001101000010] +csr_mscause = [011111111111] +csr_mtval = [001101000011] +csr_mrac = [011111000000] +csr_dmst = [011111000100] +csr_mdeau = [101111000000] +csr_mdseac = [111111000000] +csr_meivt = [101111001000] +csr_meihap = [111111001000] +csr_meipt = [101111001001] +csr_meicpct = [101111001010] +csr_meicurpl = [101111001100] +csr_meicidpl = [101111001011] +csr_dcsr = [011110110000] +csr_dpc = [011110110001] +csr_dicawics = [011111001000] +csr_dicad0h = [011111001100] +csr_dicad0 = [011111001001] +csr_dicad1 = [011111001010] +csr_dicago = [011111001011] +csr_mtsel = [011110100000] +csr_mtdata1 = [011110100001] +csr_mtdata2 = [011110100010] +csr_mhpmc3 = [101100000011] +csr_mhpmc4 = [101100000100] +csr_mhpmc5 = [101100000101] +csr_mhpmc6 = [101100000110] +csr_mhpmc3h = [101110000011] +csr_mhpmc4h = [101110000100] +csr_mhpmc5h = [101110000101] +csr_mhpmc6h = [101110000110] +csr_mhpme3 = [001100100011] +csr_mhpme4 = [001100100100] +csr_mhpme5 = [001100100101] +csr_mhpme6 = [001100100110] +csr_micect = [011111110000] +csr_miccmect = [011111110001] +csr_mdccmect = [011111110010] +csr_mpmc = [011111000110] +csr_mcgc = [011111111000] +csr_mcpc = [011111000010] +csr_mfdc = [011111111001] +csr_perfva = [101100000111] +csr_perfvb = [101100001...] +csr_perfvc = [10110001....] +csr_perfvd = [101110000111] +csr_perfve = [101110001...] +csr_perfvf = [10111001....] +csr_perfvg = [001100100111] +csr_perfvh = [001100101...] +csr_perfvi = [00110011....] +csr_mcountinhibit = [001100100000] +csr_mfdht = [011111001110] +csr_mfdhs = [011111001111] + +.input + +csr = { + dec_csr_rdaddr_d[11] + dec_csr_rdaddr_d[10] + dec_csr_rdaddr_d[9] + dec_csr_rdaddr_d[8] + dec_csr_rdaddr_d[7] + dec_csr_rdaddr_d[6] + dec_csr_rdaddr_d[5] + dec_csr_rdaddr_d[4] + dec_csr_rdaddr_d[3] + dec_csr_rdaddr_d[2] + dec_csr_rdaddr_d[1] + dec_csr_rdaddr_d[0] +} + +.output + +csr = { + csr_misa + csr_mvendorid + csr_marchid + csr_mimpid + csr_mhartid + csr_mstatus + csr_mtvec + csr_mip + csr_mie + csr_mcyclel + csr_mcycleh + csr_minstretl + csr_minstreth + csr_mscratch + csr_mepc + csr_mcause + csr_mscause + csr_mtval + csr_mrac + csr_dmst + csr_mdseac + csr_meihap + csr_meivt + csr_meipt + csr_meicurpl + csr_meicidpl + csr_dcsr + csr_mcgc + csr_mfdc + csr_dpc + csr_mtsel + csr_mtdata1 + csr_mtdata2 + csr_mhpmc3 + csr_mhpmc4 + csr_mhpmc5 + csr_mhpmc6 + csr_mhpmc3h + csr_mhpmc4h + csr_mhpmc5h + csr_mhpmc6h + csr_mhpme3 + csr_mhpme4 + csr_mhpme5 + csr_mhpme6 + csr_mcountinhibit +csr_perfva +csr_perfvb +csr_perfvc +csr_perfvd +csr_perfve +csr_perfvf +csr_perfvg +csr_perfvh +csr_perfvi + csr_mpmc + csr_mcpc + csr_meicpct + csr_mdeau + csr_micect + csr_miccmect + csr_mdccmect +csr_mfdht +csr_mfdhs +csr_dicawics +csr_dicad0h +csr_dicad0 +csr_dicad1 +csr_dicago + valid_only + presync + postsync +} + +.decode + +csr[ csr_misa ] = { csr_misa } +csr[ csr_mvendorid ] = { csr_mvendorid } +csr[ csr_marchid ] = { csr_marchid } +csr[ csr_mimpid ] = { csr_mimpid } +csr[ csr_mhartid ] = { csr_mhartid } +csr[ csr_mstatus ] = { csr_mstatus postsync } +csr[ csr_mtvec ] = { csr_mtvec postsync} +csr[ csr_mip ] = { csr_mip } +csr[ csr_mie ] = { csr_mie } +csr[ csr_mcyclel ] = { csr_mcyclel } +csr[ csr_mcycleh ] = { csr_mcycleh } +csr[ csr_minstretl ] = { csr_minstretl presync } +csr[ csr_minstreth ] = { csr_minstreth presync } +csr[ csr_mscratch ] = { csr_mscratch } +csr[ csr_mepc ] = { csr_mepc postsync} +csr[ csr_mcause ] = { csr_mcause } +csr[ csr_mscause ] = { csr_mscause } +csr[ csr_mtval ] = { csr_mtval } +csr[ csr_mrac ] = { csr_mrac postsync } +csr[ csr_dmst ] = { csr_dmst postsync} +csr[ csr_mdseac ] = { csr_mdseac } +csr[ csr_meipt ] = { csr_meipt } +csr[ csr_meihap ] = { csr_meihap } +csr[ csr_meivt ] = { csr_meivt } +csr[ csr_meicurpl ] = { csr_meicurpl } +csr[ csr_mdeau ] = { csr_mdeau } +csr[ csr_meicpct ] = { csr_meicpct } +csr[ csr_mpmc ] = { csr_mpmc } +csr[ csr_mcpc ] = { csr_mcpc presync postsync } +csr[ csr_meicidpl ] = { csr_meicidpl } +csr[ csr_mcgc ] = { csr_mcgc } +csr[ csr_mfdc ] = { csr_mfdc presync postsync } +csr[ csr_dcsr ] = { csr_dcsr } +csr[ csr_dpc ] = { csr_dpc } +csr[ csr_mtsel ] = { csr_mtsel } +csr[ csr_mtdata1 ] = { csr_mtdata1 postsync } +csr[ csr_mtdata2 ] = { csr_mtdata2 postsync } +csr[ csr_mhpmc3 ] = { csr_mhpmc3 presync } +csr[ csr_mhpmc4 ] = { csr_mhpmc4 presync } +csr[ csr_mhpmc5 ] = { csr_mhpmc5 presync } +csr[ csr_mhpmc6 ] = { csr_mhpmc6 presync } +csr[ csr_mhpmc3h ] = { csr_mhpmc3h presync } +csr[ csr_mhpmc4h ] = { csr_mhpmc4h presync } +csr[ csr_mhpmc5h ] = { csr_mhpmc5h presync } +csr[ csr_mhpmc6h ] = { csr_mhpmc6h presync } +csr[ csr_mhpme3 ] = { csr_mhpme3 } +csr[ csr_mhpme4 ] = { csr_mhpme4 } +csr[ csr_mhpme5 ] = { csr_mhpme5 } +csr[ csr_mhpme6 ] = { csr_mhpme6 } +csr[ csr_micect ] = { csr_micect } +csr[ csr_miccmect ] = { csr_miccmect } +csr[ csr_mdccmect ] = { csr_mdccmect } +csr[ csr_dicawics ] = { csr_dicawics } +csr[ csr_dicad0h ] = { csr_dicad0h } +csr[ csr_dicad0 ] = { csr_dicad0 } +csr[ csr_dicad1 ] = { csr_dicad1 } +csr[ csr_dicago ] = { csr_dicago } +csr[ csr_mfdht ] = { csr_mfdht } +csr[ csr_mfdhs ] = { csr_mfdhs } +csr[ csr_mcountinhibit] = { csr_mcountinhibit presync postsync } + +csr[ csr_perfva ] = { valid_only } +csr[ csr_perfvb ] = { valid_only } +csr[ csr_perfvc ] = { valid_only } +csr[ csr_perfvd ] = { valid_only } +csr[ csr_perfve ] = { valid_only } +csr[ csr_perfvf ] = { valid_only } +csr[ csr_perfvg ] = { valid_only } +csr[ csr_perfvh ] = { valid_only } +csr[ csr_perfvi ] = { valid_only } + +.end diff --git a/design/dec/decode b/design/dec/decode new file mode 100644 index 0000000..d4435e0 --- /dev/null +++ b/design/dec/decode @@ -0,0 +1,323 @@ + +.definition + +add = [0000000..........000.....0110011] +addi = [.................000.....0010011] + +sub = [0100000..........000.....0110011] + +and = [0000000..........111.....0110011] +andi = [.................111.....0010011] + +or = [0000000..........110.....0110011] +ori = [.................110.....0010011] + +xor = [0000000..........100.....0110011] +xori = [.................100.....0010011] + +sll = [0000000..........001.....0110011] +slli = [0000000..........001.....0010011] + +sra = [0100000..........101.....0110011] +srai = [0100000..........101.....0010011] + +srl = [0000000..........101.....0110011] +srli = [0000000..........101.....0010011] + +lui = [.........................0110111] +auipc = [.........................0010111] + +slt = [0000000..........010.....0110011] +sltu = [0000000..........011.....0110011] +slti = [.................010.....0010011] +sltiu = [.................011.....0010011] + +beq = [.................000.....1100011] +bne = [.................001.....1100011] +bge = [.................101.....1100011] +blt = [.................100.....1100011] +bgeu = [.................111.....1100011] +bltu = [.................110.....1100011] + +jal = [.........................1101111] +jalr = [.................000.....1100111] + +lb = [.................000.....0000011] +lh = [.................001.....0000011] +lw = [.................010.....0000011] + +sb = [.................000.....0100011] +sh = [.................001.....0100011] +sw = [.................010.....0100011] + +lbu = [.................100.....0000011] +lhu = [.................101.....0000011] + +fence = [0000........00000000000000001111] +fence.i = [00000000000000000001000000001111] + +ebreak = [00000000000100000000000001110011] +ecall = [00000000000000000000000001110011] + +mret = [00110000001000000000000001110011] + +wfi = [00010000010100000000000001110011] + +csrrc_ro = [............00000011.....1110011] +csrrc_rw0 = [............1....011.....1110011] +csrrc_rw1 = [.............1...011.....1110011] +csrrc_rw2 = [..............1..011.....1110011] +csrrc_rw3 = [...............1.011.....1110011] +csrrc_rw4 = [................1011.....1110011] + +csrrci_ro = [............00000111.....1110011] +csrrci_rw0 = [............1....111.....1110011] +csrrci_rw1 = [.............1...111.....1110011] +csrrci_rw2 = [..............1..111.....1110011] +csrrci_rw3 = [...............1.111.....1110011] +csrrci_rw4 = [................1111.....1110011] + +csrrs_ro = [............00000010.....1110011] +csrrs_rw0 = [............1....010.....1110011] +csrrs_rw1 = [.............1...010.....1110011] +csrrs_rw2 = [..............1..010.....1110011] +csrrs_rw3 = [...............1.010.....1110011] +csrrs_rw4 = [................1010.....1110011] + +csrrsi_ro = [............00000110.....1110011] +csrrsi_rw0 = [............1....110.....1110011] +csrrsi_rw1 = [.............1...110.....1110011] +csrrsi_rw2 = [..............1..110.....1110011] +csrrsi_rw3 = [...............1.110.....1110011] +csrrsi_rw4 = [................1110.....1110011] + + +csrw = [.................001000001110011] +csrrw0 = [.................001....11110011] +csrrw1 = [.................001...1.1110011] +csrrw2 = [.................001..1..1110011] +csrrw3 = [.................001.1...1110011] +csrrw4 = [.................0011....1110011] + +csrwi = [.................101000001110011] +csrrwi0 = [.................101....11110011] +csrrwi1 = [.................101...1.1110011] +csrrwi2 = [.................101..1..1110011] +csrrwi3 = [.................101.1...1110011] +csrrwi4 = [.................1011....1110011] + +mul = [0000001..........000.....0110011] +mulh = [0000001..........001.....0110011] +mulhsu = [0000001..........010.....0110011] +mulhu = [0000001..........011.....0110011] + +div = [0000001..........100.....0110011] +divu = [0000001..........101.....0110011] +rem = [0000001..........110.....0110011] +remu = [0000001..........111.....0110011] + + +.input + +rv32i = { + i[31] + i[30] + i[29] + i[28] + i[27] + i[26] + i[25] + i[24] + i[23] + i[22] + i[21] + i[20] + i[19] + i[18] + i[17] + i[16] + i[15] + i[14] + i[13] + i[12] + i[11] + i[10] + i[9] + i[8] + i[7] + i[6] + i[5] + i[4] + i[3] + i[2] + i[1] + i[0] +} + + +.output + +rv32i = { + alu + rs1 + rs2 + imm12 + rd + shimm5 + imm20 + pc + load + store + lsu + add + sub + land + lor + lxor + sll + sra + srl + slt + unsign + condbr + beq + bne + bge + blt + jal + by + half + word + csr_read + csr_clr + csr_set + csr_write + csr_imm + presync + postsync + ebreak + ecall + mret + mul + rs1_sign + rs2_sign + low + div + rem + fence + fence_i + pm_alu +} + +.decode + +rv32i[mul] = { mul rs1 rs2 rd low } +rv32i[mulh] = { mul rs1 rs2 rd rs1_sign rs2_sign } +rv32i[mulhu] = { mul rs1 rs2 rd } +rv32i[mulhsu] = { mul rs1 rs2 rd rs1_sign } + +rv32i[div] = { div rs1 rs2 rd } +rv32i[divu] = { div rs1 rs2 rd unsign } +rv32i[rem] = { div rs1 rs2 rd rem} +rv32i[remu] = { div rs1 rs2 rd unsign rem} + +rv32i[add] = { alu rs1 rs2 rd add pm_alu } +rv32i[addi] = { alu rs1 imm12 rd add pm_alu } + +rv32i[sub] = { alu rs1 rs2 rd sub pm_alu } + +rv32i[and] = { alu rs1 rs2 rd land pm_alu } +rv32i[andi] = { alu rs1 imm12 rd land pm_alu } + +rv32i[or] = { alu rs1 rs2 rd lor pm_alu } +rv32i[ori] = { alu rs1 imm12 rd lor pm_alu } + +rv32i[xor] = { alu rs1 rs2 rd lxor pm_alu } +rv32i[xori] = { alu rs1 imm12 rd lxor pm_alu } + +rv32i[sll] = { alu rs1 rs2 rd sll pm_alu } +rv32i[slli] = { alu rs1 shimm5 rd sll pm_alu } + +rv32i[sra] = { alu rs1 rs2 rd sra pm_alu } +rv32i[srai] = { alu rs1 shimm5 rd sra pm_alu } + +rv32i[srl] = { alu rs1 rs2 rd srl pm_alu } +rv32i[srli] = { alu rs1 shimm5 rd srl pm_alu } + +rv32i[lui] = { alu imm20 rd lor pm_alu } +rv32i[auipc] = { alu imm20 pc rd add pm_alu } + + +rv32i[slt] = { alu rs1 rs2 rd sub slt pm_alu } +rv32i[sltu] = { alu rs1 rs2 rd sub slt unsign pm_alu } +rv32i[slti] = { alu rs1 imm12 rd sub slt pm_alu } +rv32i[sltiu] = { alu rs1 imm12 rd sub slt unsign pm_alu } + +rv32i[beq] = { alu rs1 rs2 sub condbr beq } +rv32i[bne] = { alu rs1 rs2 sub condbr bne } +rv32i[bge] = { alu rs1 rs2 sub condbr bge } +rv32i[blt] = { alu rs1 rs2 sub condbr blt } +rv32i[bgeu] = { alu rs1 rs2 sub condbr bge unsign } +rv32i[bltu] = { alu rs1 rs2 sub condbr blt unsign } + +rv32i[jal] = { alu imm20 rd pc jal } +rv32i[jalr] = { alu rs1 rd imm12 jal } + + + +rv32i[lb] = { lsu load rs1 rd by } +rv32i[lh] = { lsu load rs1 rd half } +rv32i[lw] = { lsu load rs1 rd word } +rv32i[lbu] = { lsu load rs1 rd by unsign } +rv32i[lhu] = { lsu load rs1 rd half unsign } + +rv32i[sb] = { lsu store rs1 rs2 by } +rv32i[sh] = { lsu store rs1 rs2 half } +rv32i[sw] = { lsu store rs1 rs2 word } + + +rv32i[fence] = { alu lor fence presync} + +# fence.i has fence effect in addtion to flush I$ and redirect +rv32i[fence.i] = { alu lor fence fence_i presync postsync} + +# nops for now + +rv32i[ebreak] = { alu rs1 imm12 rd lor ebreak postsync} +rv32i[ecall] = { alu rs1 imm12 rd lor ecall postsync} +rv32i[mret] = { alu rs1 imm12 rd lor mret postsync} + +rv32i[wfi] = { alu rs1 imm12 rd lor pm_alu } + +# csr means read + +# csr_read - put csr on rs2 and rs1 0's +rv32i[csrrc_ro] = { alu rd csr_read } + +# put csr on rs2 and make rs1 0's into alu. Save rs1 for csr_clr later +rv32i[csrrc_rw{0-4}] = { alu rd csr_read rs1 csr_clr presync postsync } + +rv32i[csrrci_ro] = { alu rd csr_read } + +rv32i[csrrci_rw{0-4}] = { alu rd csr_read rs1 csr_clr csr_imm presync postsync } + +rv32i[csrrs_ro] = { alu rd csr_read } + +rv32i[csrrs_rw{0-4}] = { alu rd csr_read rs1 csr_set presync postsync } + +rv32i[csrrsi_ro] = { alu rd csr_read } + +rv32i[csrrsi_rw{0-4}] = { alu rd csr_read rs1 csr_set csr_imm presync postsync } + +rv32i[csrrw{0-4}] = { alu rd csr_read rs1 csr_write presync postsync } + + +rv32i[csrrwi{0-4}] = { alu rd csr_read rs1 csr_write csr_imm presync postsync } + +# optimize csr write only - pipelined +rv32i[csrw] = { alu rd rs1 csr_write } + +rv32i[csrwi] = { alu rd csr_write csr_imm } + + +.end diff --git a/design/dec/el2_dec.sv b/design/dec/el2_dec.sv new file mode 100644 index 0000000..2b50c55 --- /dev/null +++ b/design/dec/el2_dec.sv @@ -0,0 +1,434 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright 2020 Western Digital Corporation or it's affiliates. +// +// 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. + +// dec: decode unit - decode, bypassing, ARF, interrupts +// +//******************************************************************************** +// $Id$ +// +// +// Function: Decode +// Comments: Decode, dependency scoreboard, ARF +// +// +// A -> D -> EX1 ... WB +// +//******************************************************************************** + +module el2_dec +import el2_pkg::*; +#( +`include "el2_param.vh" + ) + ( + input logic clk, + input logic free_clk, + input logic active_clk, + + input logic lsu_fastint_stall_any, // needed by lsu for 2nd pass of dma with ecc correction, stall next cycle + +// fast interrupt + output logic dec_extint_stall, + + output logic dec_i0_decode_d, + output logic dec_pause_state_cg, // to top for active state clock gating + + input logic rst_l, // reset, active low + input logic [31:1] rst_vec, // reset vector, from core pins + + input logic nmi_int, // NMI pin + input logic [31:1] nmi_vec, // NMI vector, from pins + + input logic i_cpu_halt_req, // Asynchronous Halt request to CPU + input logic i_cpu_run_req, // Asynchronous Restart request to CPU + + output logic o_cpu_halt_status, // Halt status of core (pmu/fw) + output logic o_cpu_halt_ack, // Halt request ack + output logic o_cpu_run_ack, // Run request ack + output logic o_debug_mode_status, // Core to the PMU that core is in debug mode. When core is in debug mode, the PMU should refrain from sendng a halt or run request + + input logic [31:4] core_id, // CORE ID + // + // external MPC halt/run interface + input logic mpc_debug_halt_req, // Async halt request + input logic mpc_debug_run_req, // Async run request + input logic mpc_reset_run_req, // Run/halt after reset + output logic mpc_debug_halt_ack, // Halt ack + output logic mpc_debug_run_ack, // Run ack + output logic debug_brkpt_status, // debug breakpoint + + input logic exu_pmu_i0_br_misp, // slot 0 branch misp + input logic exu_pmu_i0_br_ataken, // slot 0 branch actual taken + input logic exu_pmu_i0_pc4, // slot 0 4 byte branch + + + input logic lsu_nonblock_load_valid_m, // valid nonblock load at m + input logic [pt.LSU_NUM_NBLOAD_WIDTH-1:0] lsu_nonblock_load_tag_m, // -> corresponding tag + input logic lsu_nonblock_load_inv_r, // invalidate request for nonblock load r + input logic [pt.LSU_NUM_NBLOAD_WIDTH-1:0] lsu_nonblock_load_inv_tag_r, // -> corresponding tag + input logic lsu_nonblock_load_data_valid, // valid nonblock load data back + input logic lsu_nonblock_load_data_error, // nonblock load bus error + input logic [pt.LSU_NUM_NBLOAD_WIDTH-1:0] lsu_nonblock_load_data_tag, // -> corresponding tag + input logic [31:0] lsu_nonblock_load_data, // nonblock load data + + input logic lsu_pmu_bus_trxn, // D side bus transaction + input logic lsu_pmu_bus_misaligned, // D side bus misaligned + input logic lsu_pmu_bus_error, // D side bus error + input logic lsu_pmu_bus_busy, // D side bus busy + input logic lsu_pmu_misaligned_m, // D side load or store misaligned + input logic lsu_pmu_load_external_m, // D side bus load + input logic lsu_pmu_store_external_m, // D side bus store + input logic dma_pmu_dccm_read, // DMA DCCM read + input logic dma_pmu_dccm_write, // DMA DCCM write + input logic dma_pmu_any_read, // DMA read + input logic dma_pmu_any_write, // DMA write + + input logic [31:1] lsu_fir_addr, // Fast int address + input logic [1:0] lsu_fir_error, // Fast int lookup error + + input logic ifu_pmu_instr_aligned, // aligned instructions + input logic ifu_pmu_fetch_stall, // fetch unit stalled + input logic ifu_pmu_ic_miss, // icache miss + input logic ifu_pmu_ic_hit, // icache hit + input logic ifu_pmu_bus_error, // Instruction side bus error + input logic ifu_pmu_bus_busy, // Instruction side bus busy + input logic ifu_pmu_bus_trxn, // Instruction side bus transaction + + input logic ifu_ic_error_start, // IC single bit error + input logic ifu_iccm_rd_ecc_single_err, // ICCM single bit error + + input logic [3:0] lsu_trigger_match_m, + input logic dbg_cmd_valid, // debugger abstract command valid + input logic dbg_cmd_write, // command is a write + input logic [1:0] dbg_cmd_type, // command type + input logic [31:0] dbg_cmd_addr, // command address + input logic [1:0] dbg_cmd_wrdata, // command write data, for fence/fence_i + + + input logic ifu_i0_icaf, // icache access fault + input logic [1:0] ifu_i0_icaf_type, + + input logic ifu_i0_icaf_f1, // i0 has access fault on second fetch group + input logic ifu_i0_dbecc, // icache/iccm double-bit error + + input logic lsu_idle_any, // lsu idle for halting + + input el2_br_pkt_t i0_brp, // branch packet + input logic [pt.BTB_ADDR_HI:pt.BTB_ADDR_LO] ifu_i0_bp_index, // BP index + input logic [pt.BHT_GHR_SIZE-1:0] ifu_i0_bp_fghr, // BP FGHR + input logic [pt.BTB_BTAG_SIZE-1:0] ifu_i0_bp_btag, // BP tag + + input el2_lsu_error_pkt_t lsu_error_pkt_r, // LSU exception/error packet + input logic lsu_single_ecc_error_incr, // LSU inc SB error counter + + input logic lsu_imprecise_error_load_any, // LSU imprecise load bus error + input logic lsu_imprecise_error_store_any, // LSU imprecise store bus error + input logic [31:0] lsu_imprecise_error_addr_any, // LSU imprecise bus error address + + input logic [31:0] exu_div_result, // final div result + input logic exu_div_wren, // Divide write enable to GPR + + input logic [31:0] exu_csr_rs1_x, // rs1 for csr instruction + + input logic [31:0] lsu_result_m, // load result + input logic [31:0] lsu_result_corr_r, // load result - corrected load data + + input logic lsu_load_stall_any, // This is for blocking loads + input logic lsu_store_stall_any, // This is for blocking stores + input logic dma_dccm_stall_any, // stall any load/store at decode, pmu event + input logic dma_iccm_stall_any, // iccm stalled, pmu event + + input logic iccm_dma_sb_error, // ICCM DMA single bit error + + input logic exu_flush_final, // slot0 flush + + input logic [31:1] exu_npc_r, // next PC + + input logic [31:0] exu_i0_result_x, // alu result x + + + input logic ifu_i0_valid, // fetch valids to instruction buffer + input logic [31:0] ifu_i0_instr, // fetch inst's to instruction buffer + input logic [31:1] ifu_i0_pc, // pc's for instruction buffer + input logic ifu_i0_pc4, // indication of 4B or 2B for corresponding inst + input logic [31:1] exu_i0_pc_x, // pc's for e1 from the alu's + + input logic mexintpend, // External interrupt pending + input logic timer_int, // Timer interrupt pending (from pin) + input logic soft_int, // Software interrupt pending (from pin) + + input logic [7:0] pic_claimid, // PIC claimid + input logic [3:0] pic_pl, // PIC priv level + input logic mhwakeup, // High priority wakeup + + output logic [3:0] dec_tlu_meicurpl, // to PIC, Current priv level + output logic [3:0] dec_tlu_meipt, // to PIC + + input logic [70:0] ifu_ic_debug_rd_data, // diagnostic icache read data + input logic ifu_ic_debug_rd_data_valid, // diagnostic icache read data valid + output el2_cache_debug_pkt_t dec_tlu_ic_diag_pkt, // packet of DICAWICS, DICAD0/1, DICAGO info for icache diagnostics + + +// Debug start + input logic dbg_halt_req, // DM requests a halt + input logic dbg_resume_req, // DM requests a resume + input logic ifu_miss_state_idle, // I-side miss buffer empty + + output logic dec_tlu_dbg_halted, // Core is halted and ready for debug command + output logic dec_tlu_debug_mode, // Core is in debug mode + output logic dec_tlu_resume_ack, // Resume acknowledge + output logic dec_tlu_flush_noredir_r, // Tell fetch to idle on this flush + output logic dec_tlu_mpc_halted_only, // Core is halted only due to MPC + output logic dec_tlu_flush_leak_one_r, // single step + output logic dec_tlu_flush_err_r, // iside perr/ecc rfpc + output logic [31:2] dec_tlu_meihap, // Fast ext int base + + output logic dec_debug_wdata_rs1_d, // insert debug write data into rs1 at decode + + output logic [31:0] dec_dbg_rddata, // debug command read data + + output logic dec_dbg_cmd_done, // abstract command is done + output logic dec_dbg_cmd_fail, // abstract command failed (illegal reg address) + + output el2_trigger_pkt_t [3:0] trigger_pkt_any, // info needed by debug trigger blocks + + output logic dec_tlu_force_halt, // halt has been forced +// Debug end + // branch info from pipe0 for errors or counter updates + input logic [1:0] exu_i0_br_hist_r, // history + input logic exu_i0_br_error_r, // error + input logic exu_i0_br_start_error_r, // start error + input logic exu_i0_br_valid_r, // valid + input logic exu_i0_br_mp_r, // mispredict + input logic exu_i0_br_middle_r, // middle of bank + + input logic exu_i0_br_way_r, // way hit or repl + + output logic dec_i0_rs1_en_d, // Qualify GPR RS1 data + output logic dec_i0_rs2_en_d, // Qualify GPR RS2 data + output logic [31:0] gpr_i0_rs1_d, // gpr rs1 data + output logic [31:0] gpr_i0_rs2_d, // gpr rs2 data + + output logic [31:0] dec_i0_immed_d, // immediate data + output logic [12:1] dec_i0_br_immed_d, // br immediate data + + output el2_alu_pkt_t i0_ap, // alu packet + + output logic dec_i0_alu_decode_d, // schedule on D-stage alu + + output logic dec_i0_select_pc_d, // select pc onto rs1 for jal's + + output logic [31:1] dec_i0_pc_d, // pc's at decode + output logic [1:0] dec_i0_rs1_bypass_en_d, // rs1 bypass enable + output logic [1:0] dec_i0_rs2_bypass_en_d, // rs2 bypass enable + + output logic [31:0] dec_i0_rs1_bypass_data_d, // rs1 bypass data + output logic [31:0] dec_i0_rs2_bypass_data_d, // rs2 bypass data + + output el2_lsu_pkt_t lsu_p, // lsu packet + output el2_mul_pkt_t mul_p, // mul packet + output el2_div_pkt_t div_p, // div packet + output logic dec_div_cancel, // cancel divide operation + + output logic [11:0] dec_lsu_offset_d, // 12b offset for load/store addresses + + output logic dec_csr_ren_d, // csr read enable + + + output logic dec_tlu_flush_lower_r, // tlu flush due to late mp, exception, rfpc, or int + output logic [31:1] dec_tlu_flush_path_r, // tlu flush target + output logic dec_tlu_i0_kill_writeb_r, // I0 is flushed, don't writeback any results to arch state + output logic dec_tlu_fence_i_r, // flush is a fence_i rfnpc, flush icache + + output logic [31:1] pred_correct_npc_x, // npc if prediction is correct at e2 stage + + output el2_br_tlu_pkt_t dec_tlu_br0_r_pkt, // slot 0 branch predictor update packet + + output logic dec_tlu_perfcnt0, // toggles when slot0 perf counter 0 has an event inc + output logic dec_tlu_perfcnt1, // toggles when slot0 perf counter 1 has an event inc + output logic dec_tlu_perfcnt2, // toggles when slot0 perf counter 2 has an event inc + output logic dec_tlu_perfcnt3, // toggles when slot0 perf counter 3 has an event inc + + output el2_predict_pkt_t dec_i0_predict_p_d, // prediction packet to alus + output logic [pt.BHT_GHR_SIZE-1:0] i0_predict_fghr_d, // DEC predict fghr + output logic [pt.BTB_ADDR_HI:pt.BTB_ADDR_LO] i0_predict_index_d, // DEC predict index + output logic [pt.BTB_BTAG_SIZE-1:0] i0_predict_btag_d, // DEC predict branch tag + + output logic dec_lsu_valid_raw_d, + + output logic [31:0] dec_tlu_mrac_ff, // CSR for memory region control + + output logic [1:0] dec_data_en, // clock-gate control logic + output logic [1:0] dec_ctl_en, + + input logic [15:0] ifu_i0_cinst, // 16b compressed instruction + + output el2_trace_pkt_t rv_trace_pkt, // trace packet + + // feature disable from mfdc + output logic dec_tlu_external_ldfwd_disable, // disable external load forwarding + output logic dec_tlu_sideeffect_posted_disable, // disable posted stores to side-effect address + output logic dec_tlu_core_ecc_disable, // disable core ECC + output logic dec_tlu_bpred_disable, // disable branch prediction + output logic dec_tlu_wb_coalescing_disable, // disable writebuffer coalescing + output logic [2:0] dec_tlu_dma_qos_prty, // DMA QoS priority coming from MFDC [18:16] + + // clock gating overrides from mcgc + output logic dec_tlu_misc_clk_override, // override misc clock domain gating + output logic dec_tlu_ifu_clk_override, // override fetch clock domain gating + output logic dec_tlu_lsu_clk_override, // override load/store clock domain gating + output logic dec_tlu_bus_clk_override, // override bus clock domain gating + output logic dec_tlu_pic_clk_override, // override PIC clock domain gating + output logic dec_tlu_dccm_clk_override, // override DCCM clock domain gating + output logic dec_tlu_icm_clk_override, // override ICCM clock domain gating + + output logic dec_tlu_i0_commit_cmt, // committed i0 instruction + input logic scan_mode + + ); + + + logic dec_tlu_dec_clk_override; // to and from dec blocks + logic clk_override; + + logic dec_ib0_valid_d; + + logic dec_pmu_instr_decoded; + logic dec_pmu_decode_stall; + logic dec_pmu_presync_stall; + logic dec_pmu_postsync_stall; + + logic dec_tlu_wr_pause_r; // CSR write to pause reg is at R. + + logic [4:0] dec_i0_rs1_d; + logic [4:0] dec_i0_rs2_d; + + logic [31:0] dec_i0_instr_d; + + logic dec_tlu_pipelining_disable; + + + logic [4:0] dec_i0_waddr_r; + logic dec_i0_wen_r; + logic [31:0] dec_i0_wdata_r; + logic dec_csr_wen_r; // csr write enable at wb + logic [11:0] dec_csr_wraddr_r; // write address for csryes + logic [31:0] dec_csr_wrdata_r; // csr write data at wb + + logic [11:0] dec_csr_rdaddr_d; // read address for csr + logic [31:0] dec_csr_rddata_d; // csr read data at wb + logic dec_csr_legal_d; // csr indicates legal operation + + logic dec_csr_wen_unq_d; // valid csr with write - for csr legal + logic dec_csr_any_unq_d; // valid csr - for csr legal + logic dec_csr_stall_int_ff; // csr is mie/mstatus + + el2_trap_pkt_t dec_tlu_packet_r; + + logic dec_i0_pc4_d; + logic dec_tlu_presync_d; + logic dec_tlu_postsync_d; + logic dec_tlu_debug_stall; + + logic [31:0] dec_illegal_inst; + + logic dec_i0_icaf_d; + + logic dec_i0_dbecc_d; + logic dec_i0_icaf_f1_d; + logic [3:0] dec_i0_trigger_match_d; + logic dec_debug_fence_d; + logic dec_nonblock_load_wen; + logic [4:0] dec_nonblock_load_waddr; + logic dec_tlu_flush_pause_r; + el2_br_pkt_t dec_i0_brp; + logic [pt.BTB_ADDR_HI:pt.BTB_ADDR_LO] dec_i0_bp_index; + logic [pt.BHT_GHR_SIZE-1:0] dec_i0_bp_fghr; + logic [pt.BTB_BTAG_SIZE-1:0] dec_i0_bp_btag; + + logic [31:1] dec_tlu_i0_pc_r; + logic dec_tlu_i0_kill_writeb_wb; + logic dec_tlu_flush_lower_wb; + logic dec_tlu_i0_valid_r; + + logic dec_pause_state; + + logic [1:0] dec_i0_icaf_type_d; // i0 instruction access fault type + + logic dec_tlu_flush_extint; // Fast ext int started + + logic [31:0] dec_i0_inst_wb1; + logic [31:1] dec_i0_pc_wb1; + logic dec_tlu_i0_valid_wb1, dec_tlu_int_valid_wb1; + logic [4:0] dec_tlu_exc_cause_wb1; + logic [31:0] dec_tlu_mtval_wb1; + logic dec_tlu_i0_exc_valid_wb1; + + logic [4:0] div_waddr_wb; + + logic dec_div_active; // non-block divide is active + + + + assign clk_override = dec_tlu_dec_clk_override; + + + assign dec_dbg_rddata[31:0] = dec_i0_wdata_r[31:0]; + + + el2_dec_ib_ctl #(.pt(pt)) instbuff (.*); + + + el2_dec_decode_ctl #(.pt(pt)) decode (.*); + + + el2_dec_tlu_ctl #(.pt(pt)) tlu (.*); + + + el2_dec_gpr_ctl #(.pt(pt)) arf (.*, + // inputs + .raddr0(dec_i0_rs1_d[4:0]), + .raddr1(dec_i0_rs2_d[4:0]), + + .wen0(dec_i0_wen_r), .waddr0(dec_i0_waddr_r[4:0]), .wd0(dec_i0_wdata_r[31:0]), + .wen1(dec_nonblock_load_wen), .waddr1(dec_nonblock_load_waddr[4:0]), .wd1(lsu_nonblock_load_data[31:0]), + .wen2(exu_div_wren), .waddr2(div_waddr_wb), .wd2(exu_div_result[31:0]), + + // outputs + .rd0(gpr_i0_rs1_d[31:0]), .rd1(gpr_i0_rs2_d[31:0]) + ); + + +// Trigger + + el2_dec_trigger #(.pt(pt)) dec_trigger (.*); + + + + +// trace + assign rv_trace_pkt.rv_i_insn_ip = dec_i0_inst_wb1[31:0]; + assign rv_trace_pkt.rv_i_address_ip = { dec_i0_pc_wb1[31:1], 1'b0}; + assign rv_trace_pkt.rv_i_valid_ip = {dec_tlu_int_valid_wb1, // always int + dec_tlu_i0_valid_wb1 | dec_tlu_i0_exc_valid_wb1}; + assign rv_trace_pkt.rv_i_exception_ip = {dec_tlu_int_valid_wb1, dec_tlu_i0_exc_valid_wb1}; + assign rv_trace_pkt.rv_i_ecause_ip = dec_tlu_exc_cause_wb1[4:0]; // replicate across ports + assign rv_trace_pkt.rv_i_interrupt_ip = {dec_tlu_int_valid_wb1,2'b0}; + assign rv_trace_pkt.rv_i_tval_ip = dec_tlu_mtval_wb1[31:0]; // replicate across ports +// end trace + + +endmodule // el2_dec + diff --git a/design/dec/el2_dec_decode_ctl.sv b/design/dec/el2_dec_decode_ctl.sv new file mode 100644 index 0000000..2a30241 --- /dev/null +++ b/design/dec/el2_dec_decode_ctl.sv @@ -0,0 +1,1544 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright 2020 Western Digital Corporation or it's affiliates. +// +// 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. + + +module el2_dec_decode_ctl +import el2_pkg::*; +#( +`include "el2_param.vh" + ) + ( + + input logic dec_tlu_flush_extint, + + input logic dec_tlu_force_halt, // invalidate nonblock load cam on a force halt event + + output logic dec_extint_stall, + + input logic [15:0] ifu_i0_cinst, // 16b compressed instruction + output logic [31:0] dec_i0_inst_wb1, // 32b instruction at wb+1 for trace encoder + output logic [31:1] dec_i0_pc_wb1, // 31b pc at wb+1 for trace encoder + + + input logic lsu_nonblock_load_valid_m, // valid nonblock load at m + input logic [pt.LSU_NUM_NBLOAD_WIDTH-1:0] lsu_nonblock_load_tag_m, // -> corresponding tag + input logic lsu_nonblock_load_inv_r, // invalidate request for nonblock load r + input logic [pt.LSU_NUM_NBLOAD_WIDTH-1:0] lsu_nonblock_load_inv_tag_r, // -> corresponding tag + input logic lsu_nonblock_load_data_valid, // valid nonblock load data back + input logic lsu_nonblock_load_data_error, // nonblock load bus error + input logic [pt.LSU_NUM_NBLOAD_WIDTH-1:0] lsu_nonblock_load_data_tag, // -> corresponding tag + + input logic [31:0] lsu_nonblock_load_data, // nonblock load data + + + input logic [3:0] dec_i0_trigger_match_d, // i0 decode trigger matches + + input logic dec_tlu_wr_pause_r, // pause instruction at r + input logic dec_tlu_pipelining_disable, // pipeline disable - presync, i0 decode only + + input logic [3:0] lsu_trigger_match_m, // lsu trigger matches + + input logic lsu_pmu_misaligned_m, // perf mon: load/store misalign + input logic dec_tlu_debug_stall, // debug stall decode + input logic dec_tlu_flush_leak_one_r, // leak1 instruction + + input logic dec_debug_fence_d, // debug fence instruction + + input logic [1:0] dbg_cmd_wrdata, // disambiguate fence, fence_i + + input logic dec_i0_icaf_d, // icache access fault + input logic dec_i0_icaf_f1_d, // i0 instruction access fault at decode for f1 fetch group + input logic [1:0] dec_i0_icaf_type_d, // i0 instruction access fault type + + input logic dec_i0_dbecc_d, // icache/iccm double-bit error + + input el2_br_pkt_t dec_i0_brp, // branch packet + input logic [pt.BTB_ADDR_HI:pt.BTB_ADDR_LO] dec_i0_bp_index, // i0 branch index + input logic [pt.BHT_GHR_SIZE-1:0] dec_i0_bp_fghr, // BP FGHR + input logic [pt.BTB_BTAG_SIZE-1:0] dec_i0_bp_btag, // BP tag + + input logic [31:1] dec_i0_pc_d, // pc + + input logic lsu_idle_any, // lsu idle: if fence instr & ~lsu_idle then stall decode + + input logic lsu_load_stall_any, // stall any load at decode + input logic lsu_store_stall_any, // stall any store at decode + input logic dma_dccm_stall_any, // stall any load/store at decode + + input logic exu_div_wren, // nonblocking divide write enable to GPR. + + input logic dec_tlu_i0_kill_writeb_wb, // I0 is flushed, don't writeback any results to arch state + input logic dec_tlu_flush_lower_wb, // trap lower flush + input logic dec_tlu_i0_kill_writeb_r, // I0 is flushed, don't writeback any results to arch state + input logic dec_tlu_flush_lower_r, // trap lower flush + input logic dec_tlu_flush_pause_r, // don't clear pause state on initial lower flush + input logic dec_tlu_presync_d, // CSR read needs to be presync'd + input logic dec_tlu_postsync_d, // CSR ops that need to be postsync'd + + input logic dec_i0_pc4_d, // inst is 4B inst else 2B + + input logic [31:0] dec_csr_rddata_d, // csr read data at wb + input logic dec_csr_legal_d, // csr indicates legal operation + + input logic [31:0] exu_csr_rs1_x, // rs1 for csr instr + + input logic [31:0] lsu_result_m, // load result + input logic [31:0] lsu_result_corr_r, // load result - corrected data for writing gpr's, not for bypassing + + input logic exu_flush_final, // lower flush or i0 flush at X or D + + input logic [31:1] exu_i0_pc_x, // pcs at e1 + + input logic [31:0] dec_i0_instr_d, // inst at decode + + input logic dec_ib0_valid_d, // inst valid at decode + + input logic [31:0] exu_i0_result_x, // from primary alu's + + input logic clk, // for rvdffe's + input logic free_clk, + input logic active_clk, // clk except for halt / pause + + input logic clk_override, // test stuff + input logic rst_l, + + + + output logic dec_i0_rs1_en_d, // rs1 enable at decode + output logic dec_i0_rs2_en_d, + + output logic [4:0] dec_i0_rs1_d, // rs1 logical source + output logic [4:0] dec_i0_rs2_d, + + output logic [31:0] dec_i0_immed_d, // 32b immediate data decode + + + output logic [12:1] dec_i0_br_immed_d, // 12b branch immediate + + output el2_alu_pkt_t i0_ap, // alu packets + + output logic dec_i0_decode_d, // i0 decode + + output logic dec_i0_alu_decode_d, // decode to D-stage alu + + output logic [31:0] dec_i0_rs1_bypass_data_d, // i0 rs1 bypass data + output logic [31:0] dec_i0_rs2_bypass_data_d, // i0 rs2 bypass data + + + output logic [4:0] dec_i0_waddr_r, // i0 logical source to write to gpr's + output logic dec_i0_wen_r, // i0 write enable + output logic [31:0] dec_i0_wdata_r, // i0 write data + + output logic dec_i0_select_pc_d, // i0 select pc for rs1 - branches + + output logic [1:0] dec_i0_rs1_bypass_en_d, // i0 rs1 bypass enable + output logic [1:0] dec_i0_rs2_bypass_en_d, // i0 rs2 bypass enable + + output el2_lsu_pkt_t lsu_p, // load/store packet + + output el2_mul_pkt_t mul_p, // multiply packet + + output el2_div_pkt_t div_p, // divide packet + output logic [4:0] div_waddr_wb, // DIV write address to GPR + output logic dec_div_cancel, // cancel the divide operation + + output logic dec_lsu_valid_raw_d, + output logic [11:0] dec_lsu_offset_d, + + output logic dec_csr_ren_d, // valid csr decode + output logic dec_csr_wen_unq_d, // valid csr with write - for csr legal + output logic dec_csr_any_unq_d, // valid csr - for csr legal + output logic [11:0] dec_csr_rdaddr_d, // read address for csr + output logic dec_csr_wen_r, // csr write enable at r + output logic [11:0] dec_csr_wraddr_r, // write address for csr + output logic [31:0] dec_csr_wrdata_r, // csr write data at r + output logic dec_csr_stall_int_ff, // csr is mie/mstatus + + output dec_tlu_i0_valid_r, // i0 valid inst at c + + output el2_trap_pkt_t dec_tlu_packet_r, // trap packet + + output logic [31:1] dec_tlu_i0_pc_r, // i0 trap pc + + output logic [31:0] dec_illegal_inst, // illegal inst + output logic [31:1] pred_correct_npc_x, // npc e2 if the prediction is correct + + output el2_predict_pkt_t dec_i0_predict_p_d, // i0 predict packet decode + output logic [pt.BHT_GHR_SIZE-1:0] i0_predict_fghr_d, // i0 predict fghr + output logic [pt.BTB_ADDR_HI:pt.BTB_ADDR_LO] i0_predict_index_d, // i0 predict index + output logic [pt.BTB_BTAG_SIZE-1:0] i0_predict_btag_d, // i0_predict branch tag + + output logic [1:0] dec_data_en, // clock-gating logic + output logic [1:0] dec_ctl_en, + + output logic dec_pmu_instr_decoded, // number of instructions decode this cycle encoded + output logic dec_pmu_decode_stall, // decode is stalled + output logic dec_pmu_presync_stall, // decode has presync stall + output logic dec_pmu_postsync_stall, // decode has postsync stall + + output logic dec_nonblock_load_wen, // write enable for nonblock load + output logic [4:0] dec_nonblock_load_waddr, // logical write addr for nonblock load + output logic dec_pause_state, // core in pause state + output logic dec_pause_state_cg, // pause state for clock-gating + + output logic dec_div_active, // non-block divide is active + + input logic scan_mode + ); + + + + + el2_dec_pkt_t i0_dp_raw, i0_dp; + + logic [31:0] i0; + logic i0_valid_d; + + logic [31:0] i0_result_r; + + logic [2:0] i0_rs1bypass, i0_rs2bypass; + + logic i0_jalimm20; + logic i0_uiimm20; + + logic lsu_decode_d; + logic [31:0] i0_immed_d; + logic i0_presync; + logic i0_postsync; + + logic postsync_stall; + logic ps_stall; + + logic prior_inflight, prior_inflight_wb; + + logic csr_clr_d, csr_set_d, csr_write_d; + + logic csr_clr_x,csr_set_x,csr_write_x,csr_imm_x; + logic [31:0] csr_mask_x; + logic [31:0] write_csr_data_x; + logic [31:0] write_csr_data_in; + logic [31:0] write_csr_data; + logic csr_data_wen; + + logic [4:0] csrimm_x; + + logic [31:0] csr_rddata_x; + + logic mul_decode_d; + logic div_decode_d; + logic div_e1_to_r; + logic div_flush; + logic div_active_in; + logic div_active; + logic i0_nonblock_div_stall; + logic i0_div_prior_div_stall; + logic nonblock_div_cancel; + + logic i0_legal; + logic shift_illegal; + logic illegal_inst_en; + logic illegal_lockout_in, illegal_lockout; + logic i0_legal_decode_d; + logic i0_exulegal_decode_d, i0_exudecode_d, i0_exublock_d; + + logic [12:1] last_br_immed_d; + logic i0_rs1_depend_i0_x, i0_rs1_depend_i0_r; + logic i0_rs2_depend_i0_x, i0_rs2_depend_i0_r; + + logic i0_div_decode_d; + logic i0_load_block_d; + logic [1:0] i0_rs1_depth_d, i0_rs2_depth_d; + + logic i0_load_stall_d; + logic i0_store_stall_d; + + logic i0_predict_nt, i0_predict_t; + + logic i0_notbr_error, i0_br_toffset_error; + logic i0_ret_error; + logic i0_br_error; + logic i0_br_error_all; + logic [11:0] i0_br_offset; + + logic [20:1] i0_pcall_imm; // predicted jal's + logic i0_pcall_12b_offset; + logic i0_pcall_raw; + logic i0_pcall_case; + logic i0_pcall; + + logic i0_pja_raw; + logic i0_pja_case; + logic i0_pja; + + logic i0_pret_case; + logic i0_pret_raw, i0_pret; + + logic i0_jal; // jal's that are not predicted + + + logic i0_predict_br; + + logic store_data_bypass_d, store_data_bypass_m; + + el2_class_pkt_t i0_rs1_class_d, i0_rs2_class_d; + + el2_class_pkt_t i0_d_c, i0_x_c, i0_r_c; + + + logic i0_ap_pc2, i0_ap_pc4; + + logic i0_rd_en_d; + + logic load_ldst_bypass_d; + + logic leak1_i0_stall_in, leak1_i0_stall; + logic leak1_i1_stall_in, leak1_i1_stall; + logic leak1_mode; + + logic i0_csr_write_only_d; + + logic prior_inflight_x, prior_inflight_eff; + logic any_csr_d; + + logic prior_csr_write; + + logic [3:0] i0_pipe_en; + logic i0_r_ctl_en, i0_x_ctl_en, i0_wb_ctl_en; + logic i0_x_data_en, i0_r_data_en, i0_wb_data_en, i0_wb1_data_en; + + logic debug_fence_i; + logic debug_fence; + + logic i0_csr_write; + logic presync_stall; + + logic i0_instr_error; + logic i0_icaf_d; + + logic clear_pause; + logic pause_state_in, pause_state; + logic pause_stall; + + logic i0_brp_valid; + logic nonblock_load_cancel; + logic lsu_idle; + logic lsu_pmu_misaligned_r; + logic csr_ren_qual_d; + logic csr_read_x; + logic i0_block_d; + logic i0_block_raw_d; // This is use to create the raw valid + logic ps_stall_in; + logic [31:0] i0_result_x; + + el2_dest_pkt_t d_d, x_d, r_d, wbd; + el2_dest_pkt_t x_d_in, r_d_in; + + el2_trap_pkt_t d_t, x_t, x_t_in, r_t_in, r_t; + + logic [3:0] lsu_trigger_match_r; + + logic [31:1] dec_i0_pc_r; + + logic csr_read, csr_write; + logic i0_br_unpred; + + logic nonblock_load_valid_m_delay; + logic i0_wen_r; + + logic tlu_wr_pause_r1; + logic tlu_wr_pause_r2; + + logic flush_final_r; + + logic data_gate_en; + logic data_gate_clk; + + + localparam NBLOAD_SIZE = pt.LSU_NUM_NBLOAD; + localparam NBLOAD_SIZE_MSB = int'(pt.LSU_NUM_NBLOAD)-1; + localparam NBLOAD_TAG_MSB = pt.LSU_NUM_NBLOAD_WIDTH-1; + + + logic cam_write, cam_inv_reset, cam_data_reset; + logic [NBLOAD_TAG_MSB:0] cam_write_tag, cam_inv_reset_tag, cam_data_reset_tag; + logic [NBLOAD_SIZE_MSB:0] cam_wen; + + logic [NBLOAD_TAG_MSB:0] load_data_tag; + logic [NBLOAD_SIZE_MSB:0] nonblock_load_write; + + el2_load_cam_pkt_t [NBLOAD_SIZE_MSB:0] cam; + el2_load_cam_pkt_t [NBLOAD_SIZE_MSB:0] cam_in; + el2_load_cam_pkt_t [NBLOAD_SIZE_MSB:0] cam_raw; + + logic [4:0] nonblock_load_rd; + logic i0_nonblock_load_stall; + logic i0_nonblock_boundary_stall; + + logic i0_rs1_nonblock_load_bypass_en_d, i0_rs2_nonblock_load_bypass_en_d; + + logic i0_load_kill_wen_r; + + logic found; + + logic [NBLOAD_SIZE_MSB:0] cam_inv_reset_val, cam_data_reset_val; + + logic debug_fence_raw; + + logic [31:0] i0_result_r_raw; + logic [31:0] i0_result_corr_r; + + logic [12:1] last_br_immed_x; + + logic [24:7] div_inst; + logic [31:0] i0_inst_d; + logic [31:0] i0_inst_x; + logic [31:0] i0_inst_r; + logic [31:0] i0_inst_wb_in; + logic [31:0] i0_inst_wb; + + logic [31:1] i0_pc_wb; + + logic i0_wb_en; + logic i0_wb1_en; + + el2_inst_pkt_t i0_itype; + el2_reg_pkt_t i0r; + + + + + // Start - Data gating {{ + + + assign data_gate_en = (dec_tlu_wr_pause_r ^ tlu_wr_pause_r1 ) | // replaces free_clk + (tlu_wr_pause_r1 ^ tlu_wr_pause_r2 ) | // replaces free_clk + (dec_tlu_flush_extint ^ dec_extint_stall ) | + (leak1_i1_stall_in ^ leak1_i1_stall ) | // replaces free_clk + (leak1_i0_stall_in ^ leak1_i0_stall ) | // replaces free_clk + (pause_state_in ^ pause_state ) | // replaces free_clk + (ps_stall_in ^ ps_stall ) | // replaces free_clk + (exu_flush_final ^ flush_final_r ) | // replaces free_clk + (illegal_lockout_in ^ illegal_lockout ); // replaces active_clk + + rvclkhdr data_gated_cgc (.*, .en(data_gate_en), .l1clk(data_gate_clk)); + + // End - Data gating }} + + + +// branch prediction + + + // in leak1_mode, ignore any predictions for i0, treat branch as if we haven't seen it before + // in leak1 mode, also ignore branch errors for i0 + assign i0_brp_valid = dec_i0_brp.valid & ~leak1_mode; + + assign dec_i0_predict_p_d.misp = '0; + assign dec_i0_predict_p_d.ataken = '0; + assign dec_i0_predict_p_d.boffset = '0; + + assign dec_i0_predict_p_d.pcall = i0_pcall; // don't mark as pcall if branch error + assign dec_i0_predict_p_d.pja = i0_pja; + assign dec_i0_predict_p_d.pret = i0_pret; + assign dec_i0_predict_p_d.prett[31:1] = dec_i0_brp.prett[31:1]; + assign dec_i0_predict_p_d.pc4 = dec_i0_pc4_d; + assign dec_i0_predict_p_d.hist[1:0] = dec_i0_brp.hist[1:0]; + assign dec_i0_predict_p_d.valid = i0_brp_valid & i0_legal_decode_d; + assign i0_notbr_error = i0_brp_valid & ~(i0_dp_raw.condbr | i0_pcall_raw | i0_pja_raw | i0_pret_raw); + + // no toffset error for a pret + assign i0_br_toffset_error = i0_brp_valid & dec_i0_brp.hist[1] & (dec_i0_brp.toffset[11:0] != i0_br_offset[11:0]) & ~i0_pret_raw; + assign i0_ret_error = i0_brp_valid & dec_i0_brp.ret & ~i0_pret_raw; + assign i0_br_error = dec_i0_brp.br_error | i0_notbr_error | i0_br_toffset_error | i0_ret_error; + assign dec_i0_predict_p_d.br_error = i0_br_error & i0_legal_decode_d & ~leak1_mode; + assign dec_i0_predict_p_d.br_start_error = dec_i0_brp.br_start_error & i0_legal_decode_d & ~leak1_mode; + assign i0_predict_index_d[pt.BTB_ADDR_HI:pt.BTB_ADDR_LO] = dec_i0_bp_index; + + assign i0_predict_btag_d[pt.BTB_BTAG_SIZE-1:0] = dec_i0_bp_btag[pt.BTB_BTAG_SIZE-1:0]; + assign i0_br_error_all = (i0_br_error | dec_i0_brp.br_start_error) & ~leak1_mode; + assign dec_i0_predict_p_d.toffset[11:0] = i0_br_offset[11:0]; + assign i0_predict_fghr_d[pt.BHT_GHR_SIZE-1:0] = dec_i0_bp_fghr[pt.BHT_GHR_SIZE-1:0]; + assign dec_i0_predict_p_d.way = dec_i0_brp.way; + + // end + + // on br error turn anything into a nop + // on i0 instruction fetch access fault turn anything into a nop + // nop => alu rs1 imm12 rd lor + + assign i0_icaf_d = dec_i0_icaf_d | dec_i0_dbecc_d; + + assign i0_instr_error = i0_icaf_d; + + always_comb begin + i0_dp = i0_dp_raw; + if (i0_br_error_all | i0_instr_error) begin + i0_dp = '0; + i0_dp.alu = 1'b1; + i0_dp.rs1 = 1'b1; + i0_dp.rs2 = 1'b1; + i0_dp.lor = 1'b1; + i0_dp.legal = 1'b1; + i0_dp.postsync = 1'b1; + end + end + + assign i0[31:0] = dec_i0_instr_d[31:0]; + + assign dec_i0_select_pc_d = i0_dp.pc; + + // branches that can be predicted + + assign i0_predict_br = i0_dp.condbr | i0_pcall | i0_pja | i0_pret; + + assign i0_predict_nt = ~(dec_i0_brp.hist[1] & i0_brp_valid) & i0_predict_br; + assign i0_predict_t = (dec_i0_brp.hist[1] & i0_brp_valid) & i0_predict_br; + + assign i0_ap.add = i0_dp.add; + assign i0_ap.sub = i0_dp.sub; + assign i0_ap.land = i0_dp.land; + assign i0_ap.lor = i0_dp.lor; + assign i0_ap.lxor = i0_dp.lxor; + assign i0_ap.sll = i0_dp.sll; + assign i0_ap.srl = i0_dp.srl; + assign i0_ap.sra = i0_dp.sra; + assign i0_ap.slt = i0_dp.slt; + assign i0_ap.unsign = i0_dp.unsign; + assign i0_ap.beq = i0_dp.beq; + assign i0_ap.bne = i0_dp.bne; + assign i0_ap.blt = i0_dp.blt; + assign i0_ap.bge = i0_dp.bge; + + assign i0_ap.csr_write = i0_csr_write_only_d; + assign i0_ap.csr_imm = i0_dp.csr_imm; + assign i0_ap.jal = i0_jal; + + assign i0_ap_pc2 = ~dec_i0_pc4_d; + assign i0_ap_pc4 = dec_i0_pc4_d; + + assign i0_ap.predict_nt = i0_predict_nt; + assign i0_ap.predict_t = i0_predict_t; + + +// non block load cam logic + + always_comb begin + found = 0; + cam_wen[NBLOAD_SIZE_MSB:0] = '0; + for (int i=0; i<32'(NBLOAD_SIZE); i++) begin + if (~found) begin + if (~cam[i].valid) begin + cam_wen[i] = cam_write; + found = 1'b1; + end + end + end + end + + + assign cam_write = lsu_nonblock_load_valid_m; + assign cam_write_tag[NBLOAD_TAG_MSB:0] = lsu_nonblock_load_tag_m[NBLOAD_TAG_MSB:0]; + + assign cam_inv_reset = lsu_nonblock_load_inv_r; + assign cam_inv_reset_tag[NBLOAD_TAG_MSB:0] = lsu_nonblock_load_inv_tag_r[NBLOAD_TAG_MSB:0]; + + assign cam_data_reset = lsu_nonblock_load_data_valid | lsu_nonblock_load_data_error; + assign cam_data_reset_tag[NBLOAD_TAG_MSB:0] = lsu_nonblock_load_data_tag[NBLOAD_TAG_MSB:0]; + + assign nonblock_load_rd[4:0] = (x_d.i0load) ? x_d.i0rd[4:0] : 5'b0; // rd data + + + // checks + +`ifdef ASSERT_ON + assert_dec_data_valid_data_error_onehot: assert #0 ($onehot0({lsu_nonblock_load_data_valid,lsu_nonblock_load_data_error})); + assert_dec_cam_inv_reset_onehot: assert #0 ($onehot0(cam_inv_reset_val[NBLOAD_SIZE_MSB:0])); + assert_dec_cam_data_reset_onehot: assert #0 ($onehot0(cam_data_reset_val[NBLOAD_SIZE_MSB:0])); +`endif + + + + // case of multiple loads to same dest ie. x1 ... you have to invalidate the older one + + for (genvar i=0; i coredecode.e + +// 2) espresso -Dso -oeqntott coredecode.e | addassign -pre out. > equations + +// to generate the legal (32b instruction is legal) equation below: + +// 1) coredecode -in decode -legal > legal.e + +// 2) espresso -Dso -oeqntott legal.e | addassign -pre out. > legal_equation + +module el2_dec_dec_ctl +import el2_pkg::*; + ( + input logic [31:0] inst, + + output el2_dec_pkt_t out + ); + + logic [31:0] i; + + + assign i[31:0] = inst[31:0]; + + +assign out.alu = (i[2]) | (i[6]) | (!i[25]&i[4]) | (!i[5]&i[4]); + +assign out.rs1 = (!i[14]&!i[13]&!i[2]) | (!i[13]&i[11]&!i[2]) | (i[19]&i[13]&!i[2]) | ( + !i[13]&i[10]&!i[2]) | (i[18]&i[13]&!i[2]) | (!i[13]&i[9]&!i[2]) | ( + i[17]&i[13]&!i[2]) | (!i[13]&i[8]&!i[2]) | (i[16]&i[13]&!i[2]) | ( + !i[13]&i[7]&!i[2]) | (i[15]&i[13]&!i[2]) | (!i[4]&!i[3]) | (!i[6] + &!i[2]); + +assign out.rs2 = (i[5]&!i[4]&!i[2]) | (!i[6]&i[5]&!i[2]); + +assign out.imm12 = (!i[4]&!i[3]&i[2]) | (i[13]&!i[5]&i[4]&!i[2]) | (!i[13]&!i[12] + &i[6]&i[4]) | (!i[12]&!i[5]&i[4]&!i[2]); + +assign out.rd = (!i[5]&!i[2]) | (i[5]&i[2]) | (i[4]); + +assign out.shimm5 = (!i[13]&i[12]&!i[5]&i[4]&!i[2]); + +assign out.imm20 = (i[5]&i[3]) | (i[4]&i[2]); + +assign out.pc = (!i[5]&!i[3]&i[2]) | (i[5]&i[3]); + +assign out.load = (!i[5]&!i[4]&!i[2]); + +assign out.store = (!i[6]&i[5]&!i[4]); + +assign out.lsu = (!i[6]&!i[4]&!i[2]); + +assign out.add = (!i[14]&!i[13]&!i[12]&!i[5]&i[4]) | (!i[5]&!i[3]&i[2]) | (!i[30] + &!i[25]&!i[14]&!i[13]&!i[12]&!i[6]&i[4]&!i[2]); + +assign out.sub = (i[30]&!i[12]&!i[6]&i[5]&i[4]&!i[2]) | (!i[25]&!i[14]&i[13]&!i[6] + &i[4]&!i[2]) | (!i[14]&i[13]&!i[5]&i[4]&!i[2]) | (i[6]&!i[4]&!i[2]); + +assign out.land = (i[14]&i[13]&i[12]&!i[5]&!i[2]) | (!i[25]&i[14]&i[13]&i[12]&!i[6] + &!i[2]); + +assign out.lor = (!i[6]&i[3]) | (!i[25]&i[14]&i[13]&!i[12]&!i[6]&!i[2]) | (i[5]&i[4] + &i[2]) | (!i[13]&!i[12]&i[6]&i[4]) | (i[14]&i[13]&!i[12]&!i[5]&!i[2]); + +assign out.lxor = (!i[25]&i[14]&!i[13]&!i[12]&i[4]&!i[2]) | (i[14]&!i[13]&!i[12] + &!i[5]&i[4]&!i[2]); + +assign out.sll = (!i[25]&!i[14]&!i[13]&i[12]&!i[6]&i[4]&!i[2]); + +assign out.sra = (i[30]&!i[13]&i[12]&!i[6]&i[4]&!i[2]); + +assign out.srl = (!i[30]&!i[25]&i[14]&!i[13]&i[12]&!i[6]&i[4]&!i[2]); + +assign out.slt = (!i[25]&!i[14]&i[13]&!i[6]&i[4]&!i[2]) | (!i[14]&i[13]&!i[5]&i[4] + &!i[2]); + +assign out.unsign = (!i[14]&i[13]&i[12]&!i[5]&!i[2]) | (i[13]&i[6]&!i[4]&!i[2]) | ( + i[14]&!i[5]&!i[4]) | (!i[25]&!i[14]&i[13]&i[12]&!i[6]&!i[2]) | ( + i[25]&i[14]&i[12]&!i[6]&i[5]&!i[2]); + +assign out.condbr = (i[6]&!i[4]&!i[2]); + +assign out.beq = (!i[14]&!i[12]&i[6]&!i[4]&!i[2]); + +assign out.bne = (!i[14]&i[12]&i[6]&!i[4]&!i[2]); + +assign out.bge = (i[14]&i[12]&i[5]&!i[4]&!i[2]); + +assign out.blt = (i[14]&!i[12]&i[5]&!i[4]&!i[2]); + +assign out.jal = (i[6]&i[2]); + +assign out.by = (!i[13]&!i[12]&!i[6]&!i[4]&!i[2]); + +assign out.half = (i[12]&!i[6]&!i[4]&!i[2]); + +assign out.word = (i[13]&!i[6]&!i[4]); + +assign out.csr_read = (i[13]&i[6]&i[4]) | (i[7]&i[6]&i[4]) | (i[8]&i[6]&i[4]) | ( + i[9]&i[6]&i[4]) | (i[10]&i[6]&i[4]) | (i[11]&i[6]&i[4]); + +assign out.csr_clr = (i[15]&i[13]&i[12]&i[6]&i[4]) | (i[16]&i[13]&i[12]&i[6]&i[4]) | ( + i[17]&i[13]&i[12]&i[6]&i[4]) | (i[18]&i[13]&i[12]&i[6]&i[4]) | ( + i[19]&i[13]&i[12]&i[6]&i[4]); + +assign out.csr_set = (i[15]&!i[12]&i[6]&i[4]) | (i[16]&!i[12]&i[6]&i[4]) | (i[17] + &!i[12]&i[6]&i[4]) | (i[18]&!i[12]&i[6]&i[4]) | (i[19]&!i[12]&i[6] + &i[4]); + +assign out.csr_write = (!i[13]&i[12]&i[6]&i[4]); + +assign out.csr_imm = (i[14]&!i[13]&i[6]&i[4]) | (i[15]&i[14]&i[6]&i[4]) | (i[16] + &i[14]&i[6]&i[4]) | (i[17]&i[14]&i[6]&i[4]) | (i[18]&i[14]&i[6]&i[4]) | ( + i[19]&i[14]&i[6]&i[4]); + +assign out.presync = (!i[5]&i[3]) | (!i[13]&i[7]&i[6]&i[4]) | (!i[13]&i[8]&i[6]&i[4]) | ( + !i[13]&i[9]&i[6]&i[4]) | (!i[13]&i[10]&i[6]&i[4]) | (!i[13]&i[11] + &i[6]&i[4]) | (i[15]&i[13]&i[6]&i[4]) | (i[16]&i[13]&i[6]&i[4]) | ( + i[17]&i[13]&i[6]&i[4]) | (i[18]&i[13]&i[6]&i[4]) | (i[19]&i[13]&i[6] + &i[4]); + +assign out.postsync = (i[12]&!i[5]&i[3]) | (!i[22]&!i[13]&!i[12]&i[6]&i[4]) | ( + !i[13]&i[7]&i[6]&i[4]) | (!i[13]&i[8]&i[6]&i[4]) | (!i[13]&i[9]&i[6] + &i[4]) | (!i[13]&i[10]&i[6]&i[4]) | (!i[13]&i[11]&i[6]&i[4]) | ( + i[15]&i[13]&i[6]&i[4]) | (i[16]&i[13]&i[6]&i[4]) | (i[17]&i[13]&i[6] + &i[4]) | (i[18]&i[13]&i[6]&i[4]) | (i[19]&i[13]&i[6]&i[4]); + +assign out.ebreak = (!i[22]&i[20]&!i[13]&!i[12]&i[6]&i[4]); + +assign out.ecall = (!i[21]&!i[20]&!i[13]&!i[12]&i[6]&i[4]); + +assign out.mret = (i[29]&!i[13]&!i[12]&i[6]&i[4]); + +assign out.mul = (i[25]&!i[14]&!i[6]&i[5]&i[4]&!i[2]); + +assign out.rs1_sign = (i[25]&!i[14]&i[13]&!i[12]&!i[6]&i[5]&i[4]&!i[2]) | (i[25] + &!i[14]&!i[13]&i[12]&!i[6]&i[4]&!i[2]); + +assign out.rs2_sign = (i[25]&!i[14]&!i[13]&i[12]&!i[6]&i[4]&!i[2]); + +assign out.low = (i[25]&!i[14]&!i[13]&!i[12]&i[5]&i[4]&!i[2]); + +assign out.div = (i[25]&i[14]&!i[6]&i[5]&!i[2]); + +assign out.rem = (i[25]&i[14]&i[13]&!i[6]&i[5]&!i[2]); + +assign out.fence = (!i[5]&i[3]); + +assign out.fence_i = (i[12]&!i[5]&i[3]); + +assign out.pm_alu = (i[28]&i[22]&!i[13]&!i[12]&i[4]) | (i[4]&i[2]) | (!i[25]&!i[6] + &i[4]) | (!i[5]&i[4]); + + + +assign out.legal = (!i[31]&!i[30]&i[29]&i[28]&!i[27]&!i[26]&!i[25]&!i[24]&!i[23] + &!i[22]&i[21]&!i[20]&!i[19]&!i[18]&!i[17]&!i[16]&!i[15]&!i[14]&!i[11] + &!i[10]&!i[9]&!i[8]&!i[7]&i[6]&i[5]&i[4]&!i[3]&!i[2]&i[1]&i[0]) | ( + !i[31]&!i[30]&!i[29]&i[28]&!i[27]&!i[26]&!i[25]&!i[24]&!i[23]&i[22] + &!i[21]&i[20]&!i[19]&!i[18]&!i[17]&!i[16]&!i[15]&!i[14]&!i[11]&!i[10] + &!i[9]&!i[8]&!i[7]&i[6]&i[5]&i[4]&!i[3]&!i[2]&i[1]&i[0]) | (!i[31] + &!i[30]&!i[29]&!i[28]&!i[27]&!i[26]&!i[25]&!i[24]&!i[23]&!i[22]&!i[21] + &!i[19]&!i[18]&!i[17]&!i[16]&!i[15]&!i[14]&!i[11]&!i[10]&!i[9]&!i[8] + &!i[7]&i[5]&i[4]&!i[3]&!i[2]&i[1]&i[0]) | (!i[31]&!i[30]&!i[29]&!i[28] + &!i[27]&!i[26]&!i[25]&!i[6]&i[4]&!i[3]&i[1]&i[0]) | (!i[31]&!i[29] + &!i[28]&!i[27]&!i[26]&!i[25]&!i[14]&!i[13]&!i[12]&!i[6]&!i[3]&!i[2] + &i[1]&i[0]) | (!i[31]&!i[29]&!i[28]&!i[27]&!i[26]&!i[25]&i[14]&!i[13] + &i[12]&!i[6]&i[4]&!i[3]&i[1]&i[0]) | (!i[31]&!i[30]&!i[29]&!i[28] + &!i[27]&!i[26]&!i[6]&i[5]&i[4]&!i[3]&i[1]&i[0]) | (!i[14]&!i[13] + &!i[12]&i[6]&i[5]&!i[4]&!i[3]&i[1]&i[0]) | (i[14]&i[6]&i[5]&!i[4] + &!i[3]&!i[2]&i[1]&i[0]) | (!i[12]&!i[6]&!i[5]&i[4]&!i[3]&i[1]&i[0]) | ( + !i[14]&!i[13]&i[5]&!i[4]&!i[3]&!i[2]&i[1]&i[0]) | (i[12]&i[6]&i[5] + &i[4]&!i[3]&!i[2]&i[1]&i[0]) | (!i[31]&!i[30]&!i[29]&!i[28]&!i[27] + &!i[26]&!i[25]&!i[24]&!i[23]&!i[22]&!i[21]&!i[20]&!i[19]&!i[18]&!i[17] + &!i[16]&!i[15]&!i[14]&!i[13]&!i[11]&!i[10]&!i[9]&!i[8]&!i[7]&!i[6] + &!i[5]&!i[4]&i[3]&i[2]&i[1]&i[0]) | (!i[31]&!i[30]&!i[29]&!i[28] + &!i[19]&!i[18]&!i[17]&!i[16]&!i[15]&!i[14]&!i[13]&!i[12]&!i[11]&!i[10] + &!i[9]&!i[8]&!i[7]&!i[6]&!i[5]&!i[4]&i[3]&i[2]&i[1]&i[0]) | (i[13] + &i[6]&i[5]&i[4]&!i[3]&!i[2]&i[1]&i[0]) | (!i[13]&!i[6]&!i[5]&!i[4] + &!i[3]&!i[2]&i[1]&i[0]) | (i[6]&i[5]&!i[4]&i[3]&i[2]&i[1]&i[0]) | ( + i[13]&!i[6]&!i[5]&i[4]&!i[3]&i[1]&i[0]) | (!i[14]&!i[12]&!i[6]&!i[4] + &!i[3]&!i[2]&i[1]&i[0]) | (!i[6]&i[4]&!i[3]&i[2]&i[1]&i[0]); + + + +endmodule // el2_dec_dec_ctl diff --git a/design/dec/el2_dec_gpr_ctl.sv b/design/dec/el2_dec_gpr_ctl.sv new file mode 100644 index 0000000..a9ac52f --- /dev/null +++ b/design/dec/el2_dec_gpr_ctl.sv @@ -0,0 +1,95 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright 2020 Western Digital Corporation or it's affiliates. +// +// 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. + +module el2_dec_gpr_ctl +import el2_pkg::*; +#( + `include "el2_param.vh" + ) ( + input logic [4:0] raddr0, // logical read addresses + input logic [4:0] raddr1, + + input logic wen0, // write enable + input logic [4:0] waddr0, // write address + input logic [31:0] wd0, // write data + + input logic wen1, // write enable + input logic [4:0] waddr1, // write address + input logic [31:0] wd1, // write data + + input logic wen2, // write enable + input logic [4:0] waddr2, // write address + input logic [31:0] wd2, // write data + + input logic clk, + input logic rst_l, + + output logic [31:0] rd0, // read data + output logic [31:0] rd1, + + input logic scan_mode +); + + logic [31:1] [31:0] gpr_out; // 31 x 32 bit GPRs + logic [31:1] [31:0] gpr_in; + logic [31:1] w0v,w1v,w2v; + logic [31:1] gpr_wr_en; + + // GPR Write Enables for power savings + assign gpr_wr_en[31:1] = (w0v[31:1] | w1v[31:1] | w2v[31:1]); + for ( genvar j=1; j<32; j++ ) begin : gpr + rvdffe #(32) gprff (.*, .en(gpr_wr_en[j]), .din(gpr_in[j][31:0]), .dout(gpr_out[j][31:0])); + end : gpr + +// the read out + always_comb begin + rd0[31:0] = 32'b0; + rd1[31:0] = 32'b0; + w0v[31:1] = 31'b0; + w1v[31:1] = 31'b0; + w2v[31:1] = 31'b0; + gpr_in[31:1] = '0; + + // GPR Read logic + for (int j=1; j<32; j++ ) begin + rd0[31:0] |= ({32{(raddr0[4:0]== 5'(j))}} & gpr_out[j][31:0]); + rd1[31:0] |= ({32{(raddr1[4:0]== 5'(j))}} & gpr_out[j][31:0]); + end + + // GPR Write logic + for (int j=1; j<32; j++ ) begin + w0v[j] = wen0 & (waddr0[4:0]== 5'(j) ); + w1v[j] = wen1 & (waddr1[4:0]== 5'(j) ); + w2v[j] = wen2 & (waddr2[4:0]== 5'(j) ); + gpr_in[j] = ({32{w0v[j]}} & wd0[31:0]) | + ({32{w1v[j]}} & wd1[31:0]) | + ({32{w2v[j]}} & wd2[31:0]); + end + end // always_comb begin + +`ifdef ASSERT_ON + + logic write_collision_unused; + assign write_collision_unused = ( (w0v[31:1] == w1v[31:1]) & wen0 & wen1 ) | + ( (w0v[31:1] == w2v[31:1]) & wen0 & wen2 ) | + ( (w1v[31:1] == w2v[31:1]) & wen1 & wen2 ); + + + // asserting that no 2 ports will write to the same gpr simultaneously + assert_multiple_wen_to_same_gpr: assert #0 (~( write_collision_unused ) ); + +`endif + +endmodule diff --git a/design/dec/el2_dec_ib_ctl.sv b/design/dec/el2_dec_ib_ctl.sv new file mode 100644 index 0000000..9ad8051 --- /dev/null +++ b/design/dec/el2_dec_ib_ctl.sv @@ -0,0 +1,156 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright 2020 Western Digital Corporation or it's affiliates. +// +// 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. + +module el2_dec_ib_ctl +import el2_pkg::*; +#( +`include "el2_param.vh" + ) + ( + input logic dbg_cmd_valid, // valid dbg cmd + + input logic dbg_cmd_write, // dbg cmd is write + input logic [1:0] dbg_cmd_type, // dbg type + input logic [31:0] dbg_cmd_addr, // expand to 31:0 + + input el2_br_pkt_t i0_brp, // i0 branch packet from aligner + input logic [pt.BTB_ADDR_HI:pt.BTB_ADDR_LO] ifu_i0_bp_index, // BP index + input logic [pt.BHT_GHR_SIZE-1:0] ifu_i0_bp_fghr, // BP FGHR + input logic [pt.BTB_BTAG_SIZE-1:0] ifu_i0_bp_btag, // BP tag + input logic ifu_i0_pc4, // i0 is 4B inst else 2B + input logic ifu_i0_valid, // i0 valid from ifu + input logic ifu_i0_icaf, // i0 instruction access fault + input logic [1:0] ifu_i0_icaf_type, // i0 instruction access fault type + + input logic ifu_i0_icaf_f1, // i0 has access fault on second fetch group + input logic ifu_i0_dbecc, // i0 double-bit error + input logic [31:0] ifu_i0_instr, // i0 instruction from the aligner + input logic [31:1] ifu_i0_pc, // i0 pc from the aligner + + + output logic dec_ib0_valid_d, // ib0 valid + + + output logic [31:0] dec_i0_instr_d, // i0 inst at decode + + output logic [31:1] dec_i0_pc_d, // i0 pc at decode + + output logic dec_i0_pc4_d, // i0 is 4B inst else 2B + + output el2_br_pkt_t dec_i0_brp, // i0 branch packet at decode + output logic [pt.BTB_ADDR_HI:pt.BTB_ADDR_LO] dec_i0_bp_index, // i0 branch index + output logic [pt.BHT_GHR_SIZE-1:0] dec_i0_bp_fghr, // BP FGHR + output logic [pt.BTB_BTAG_SIZE-1:0] dec_i0_bp_btag, // BP tag + output logic dec_i0_icaf_d, // i0 instruction access fault at decode + output logic dec_i0_icaf_f1_d, // i0 instruction access fault at decode for f1 fetch group + output logic [1:0] dec_i0_icaf_type_d, // i0 instruction access fault type + output logic dec_i0_dbecc_d, // i0 double-bit error at decode + output logic dec_debug_wdata_rs1_d, // put debug write data onto rs1 source: machine is halted + + output logic dec_debug_fence_d // debug fence inst + + ); + + + logic debug_valid; + logic [4:0] dreg; + logic [11:0] dcsr; + logic [31:0] ib0, ib0_debug_in; + + logic debug_read; + logic debug_write; + logic debug_read_gpr; + logic debug_write_gpr; + logic debug_read_csr; + logic debug_write_csr; + + logic [34:0] ifu_i0_pcdata, pc0; + + assign ifu_i0_pcdata[34:0] = { ifu_i0_icaf_f1, ifu_i0_dbecc, ifu_i0_icaf, + ifu_i0_pc[31:1], ifu_i0_pc4 }; + + assign pc0[34:0] = ifu_i0_pcdata[34:0]; + + assign dec_i0_icaf_f1_d = pc0[34]; // icaf's can only decode as i0 + + assign dec_i0_dbecc_d = pc0[33]; + + assign dec_i0_icaf_d = pc0[32]; + assign dec_i0_pc_d[31:1] = pc0[31:1]; + assign dec_i0_pc4_d = pc0[0]; + + assign dec_i0_icaf_type_d[1:0] = ifu_i0_icaf_type[1:0]; + +// GPR accesses + +// put reg to read on rs1 +// read -> or %x0, %reg,%x0 {000000000000,reg[4:0],110000000110011} + +// put write date on rs1 +// write -> or %reg, %x0, %x0 {00000000000000000110,reg[4:0],0110011} + + +// CSR accesses +// csr is of form rd, csr, rs1 + +// read -> csrrs %x0, %csr, %x0 {csr[11:0],00000010000001110011} + +// put write data on rs1 +// write -> csrrw %x0, %csr, %x0 {csr[11:0],00000001000001110011} + +// abstract memory command not done here + assign debug_valid = dbg_cmd_valid & (dbg_cmd_type[1:0] != 2'h2); + + + assign debug_read = debug_valid & ~dbg_cmd_write; + assign debug_write = debug_valid & dbg_cmd_write; + + assign debug_read_gpr = debug_read & (dbg_cmd_type[1:0]==2'h0); + assign debug_write_gpr = debug_write & (dbg_cmd_type[1:0]==2'h0); + assign debug_read_csr = debug_read & (dbg_cmd_type[1:0]==2'h1); + assign debug_write_csr = debug_write & (dbg_cmd_type[1:0]==2'h1); + + assign dreg[4:0] = dbg_cmd_addr[4:0]; + assign dcsr[11:0] = dbg_cmd_addr[11:0]; + + + assign ib0_debug_in[31:0] = ({32{debug_read_gpr}} & {12'b000000000000,dreg[4:0],15'b110000000110011}) | + ({32{debug_write_gpr}} & {20'b00000000000000000110,dreg[4:0],7'b0110011}) | + ({32{debug_read_csr}} & {dcsr[11:0],20'b00000010000001110011}) | + ({32{debug_write_csr}} & {dcsr[11:0],20'b00000001000001110011}); + + + + // machine is in halted state, pipe empty, write will always happen next cycle + + assign dec_debug_wdata_rs1_d = debug_write_gpr | debug_write_csr; + + + // special fence csr for use only in debug mode + + assign dec_debug_fence_d = debug_write_csr & (dcsr[11:0] == 12'h7c4); + + assign ib0[31:0] = (debug_valid) ? ib0_debug_in[31:0] : ifu_i0_instr[31:0]; + + assign dec_ib0_valid_d = ifu_i0_valid | debug_valid; + + assign dec_i0_instr_d[31:0] = ib0[31:0]; + + assign dec_i0_brp = i0_brp; + assign dec_i0_bp_index = ifu_i0_bp_index; + assign dec_i0_bp_fghr = ifu_i0_bp_fghr; + assign dec_i0_bp_btag = ifu_i0_bp_btag; + +endmodule diff --git a/design/dec/el2_dec_tlu_ctl.sv b/design/dec/el2_dec_tlu_ctl.sv new file mode 100644 index 0000000..a24caeb --- /dev/null +++ b/design/dec/el2_dec_tlu_ctl.sv @@ -0,0 +1,2622 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright 2020 Western Digital Corporation or it's affiliates. +// +// 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. + + +//******************************************************************************** +// el2_dec_tlu_ctl.sv +// +// +// Function: CSRs, Commit/WB, flushing, exceptions, interrupts +// Comments: +// +//******************************************************************************** + +module el2_dec_tlu_ctl +import el2_pkg::*; +#( +`include "el2_param.vh" + ) + ( + input logic clk, + input logic active_clk, + input logic free_clk, + input logic rst_l, + input logic scan_mode, + + input logic [31:1] rst_vec, // reset vector, from core pins + input logic nmi_int, // nmi pin + input logic [31:1] nmi_vec, // nmi vector + input logic i_cpu_halt_req, // Asynchronous Halt request to CPU + input logic i_cpu_run_req, // Asynchronous Restart request to CPU + + input logic lsu_fastint_stall_any, // needed by lsu for 2nd pass of dma with ecc correction, stall next cycle + + + // perf counter inputs + input logic ifu_pmu_instr_aligned, // aligned instructions + input logic ifu_pmu_fetch_stall, // fetch unit stalled + input logic ifu_pmu_ic_miss, // icache miss + input logic ifu_pmu_ic_hit, // icache hit + input logic ifu_pmu_bus_error, // Instruction side bus error + input logic ifu_pmu_bus_busy, // Instruction side bus busy + input logic ifu_pmu_bus_trxn, // Instruction side bus transaction + input logic dec_pmu_instr_decoded, // decoded instructions + input logic dec_pmu_decode_stall, // decode stall + input logic dec_pmu_presync_stall, // decode stall due to presync'd inst + input logic dec_pmu_postsync_stall,// decode stall due to postsync'd inst + input logic lsu_store_stall_any, // SB or WB is full, stall decode + input logic dma_dccm_stall_any, // DMA stall of lsu + input logic dma_iccm_stall_any, // DMA stall of ifu + input logic exu_pmu_i0_br_misp, // pipe 0 branch misp + input logic exu_pmu_i0_br_ataken, // pipe 0 branch actual taken + input logic exu_pmu_i0_pc4, // pipe 0 4 byte branch + input logic lsu_pmu_bus_trxn, // D side bus transaction + input logic lsu_pmu_bus_misaligned, // D side bus misaligned + input logic lsu_pmu_bus_error, // D side bus error + input logic lsu_pmu_bus_busy, // D side bus busy + input logic lsu_pmu_load_external_m, // D side bus load + input logic lsu_pmu_store_external_m, // D side bus store + input logic dma_pmu_dccm_read, // DMA DCCM read + input logic dma_pmu_dccm_write, // DMA DCCM write + input logic dma_pmu_any_read, // DMA read + input logic dma_pmu_any_write, // DMA write + + input logic [31:1] lsu_fir_addr, // Fast int address + input logic [1:0] lsu_fir_error, // Fast int lookup error + + input logic iccm_dma_sb_error, // I side dma single bit error + + input el2_lsu_error_pkt_t lsu_error_pkt_r, // lsu precise exception/error packet + input logic lsu_single_ecc_error_incr, // LSU inc SB error counter + + input logic dec_pause_state, // Pause counter not zero + input logic lsu_imprecise_error_store_any, // store bus error + input logic lsu_imprecise_error_load_any, // store bus error + input logic [31:0] lsu_imprecise_error_addr_any, // store bus error address + + input logic dec_csr_wen_unq_d, // valid csr with write - for csr legal + input logic dec_csr_any_unq_d, // valid csr - for csr legal + input logic [11:0] dec_csr_rdaddr_d, // read address for csr + + input logic dec_csr_wen_r, // csr write enable at wb + input logic [11:0] dec_csr_wraddr_r, // write address for csr + input logic [31:0] dec_csr_wrdata_r, // csr write data at wb + + input logic dec_csr_stall_int_ff, // csr is mie/mstatus + + input logic dec_tlu_i0_valid_r, // pipe 0 op at e4 is valid + + input logic [31:1] exu_npc_r, // for NPC tracking + + input logic [31:1] dec_tlu_i0_pc_r, // for PC/NPC tracking + + input el2_trap_pkt_t dec_tlu_packet_r, // exceptions known at decode + + input logic [31:0] dec_illegal_inst, // For mtval + input logic dec_i0_decode_d, // decode valid, used for clean icache diagnostics + + // branch info from pipe0 for errors or counter updates + input logic [1:0] exu_i0_br_hist_r, // history + input logic exu_i0_br_error_r, // error + input logic exu_i0_br_start_error_r, // start error + input logic exu_i0_br_valid_r, // valid + input logic exu_i0_br_mp_r, // mispredict + input logic exu_i0_br_middle_r, // middle of bank + + // branch info from pipe1 for errors or counter updates + + input logic exu_i0_br_way_r, // way hit or repl + + // Debug start + output logic dec_dbg_cmd_done, // abstract command done + output logic dec_dbg_cmd_fail, // abstract command failed + output logic dec_tlu_dbg_halted, // Core is halted and ready for debug command + output logic dec_tlu_debug_mode, // Core is in debug mode + output logic dec_tlu_resume_ack, // Resume acknowledge + output logic dec_tlu_debug_stall, // stall decode while waiting on core to empty + + output logic dec_tlu_flush_noredir_r , // Tell fetch to idle on this flush + output logic dec_tlu_mpc_halted_only, // Core is halted only due to MPC + output logic dec_tlu_flush_leak_one_r, // single step + output logic dec_tlu_flush_err_r, // iside perr/ecc rfpc. This is the D stage of the error + + output logic dec_tlu_flush_extint, // fast ext int started + output logic [31:2] dec_tlu_meihap, // meihap for fast int + + input logic dbg_halt_req, // DM requests a halt + input logic dbg_resume_req, // DM requests a resume + input logic ifu_miss_state_idle, // I-side miss buffer empty + input logic lsu_idle_any, // lsu is idle + input logic dec_div_active, // oop div is active + output el2_trigger_pkt_t [3:0] trigger_pkt_any, // trigger info for trigger blocks + + input logic ifu_ic_error_start, // IC single bit error + input logic ifu_iccm_rd_ecc_single_err, // ICCM single bit error + + + input logic [70:0] ifu_ic_debug_rd_data, // diagnostic icache read data + input logic ifu_ic_debug_rd_data_valid, // diagnostic icache read data valid + output el2_cache_debug_pkt_t dec_tlu_ic_diag_pkt, // packet of DICAWICS, DICAD0/1, DICAGO info for icache diagnostics + // Debug end + + input logic [7:0] pic_claimid, // pic claimid for csr + input logic [3:0] pic_pl, // pic priv level for csr + input logic mhwakeup, // high priority external int, wakeup if halted + + input logic mexintpend, // external interrupt pending + input logic timer_int, // timer interrupt pending + input logic soft_int, // software interrupt pending + + output logic o_cpu_halt_status, // PMU interface, halted + output logic o_cpu_halt_ack, // halt req ack + output logic o_cpu_run_ack, // run req ack + output logic o_debug_mode_status, // Core to the PMU that core is in debug mode. When core is in debug mode, the PMU should refrain from sendng a halt or run request + + input logic [31:4] core_id, // Core ID + + // external MPC halt/run interface + input logic mpc_debug_halt_req, // Async halt request + input logic mpc_debug_run_req, // Async run request + input logic mpc_reset_run_req, // Run/halt after reset + output logic mpc_debug_halt_ack, // Halt ack + output logic mpc_debug_run_ack, // Run ack + output logic debug_brkpt_status, // debug breakpoint + + output logic [3:0] dec_tlu_meicurpl, // to PIC + output logic [3:0] dec_tlu_meipt, // to PIC + + + output logic [31:0] dec_csr_rddata_d, // csr read data at wb + output logic dec_csr_legal_d, // csr indicates legal operation + + output el2_br_tlu_pkt_t dec_tlu_br0_r_pkt, // branch pkt to bp + + output logic dec_tlu_i0_kill_writeb_wb, // I0 is flushed, don't writeback any results to arch state + output logic dec_tlu_flush_lower_wb, // commit has a flush (exception, int, mispredict at e4) + output logic dec_tlu_i0_commit_cmt, // committed an instruction + + output logic dec_tlu_i0_kill_writeb_r, // I0 is flushed, don't writeback any results to arch state + output logic dec_tlu_flush_lower_r, // commit has a flush (exception, int) + output logic [31:1] dec_tlu_flush_path_r, // flush pc + output logic dec_tlu_fence_i_r, // flush is a fence_i rfnpc, flush icache + output logic dec_tlu_wr_pause_r, // CSR write to pause reg is at R. + output logic dec_tlu_flush_pause_r, // Flush is due to pause + + output logic dec_tlu_presync_d, // CSR read needs to be presync'd + output logic dec_tlu_postsync_d, // CSR needs to be presync'd + + + output logic [31:0] dec_tlu_mrac_ff, // CSR for memory region control + + output logic dec_tlu_force_halt, // halt has been forced + + output logic dec_tlu_perfcnt0, // toggles when pipe0 perf counter 0 has an event inc + output logic dec_tlu_perfcnt1, // toggles when pipe0 perf counter 1 has an event inc + output logic dec_tlu_perfcnt2, // toggles when pipe0 perf counter 2 has an event inc + output logic dec_tlu_perfcnt3, // toggles when pipe0 perf counter 3 has an event inc + + output logic dec_tlu_i0_exc_valid_wb1, // pipe 0 exception valid + output logic dec_tlu_i0_valid_wb1, // pipe 0 valid + output logic dec_tlu_int_valid_wb1, // pipe 2 int valid + output logic [4:0] dec_tlu_exc_cause_wb1, // exception or int cause + output logic [31:0] dec_tlu_mtval_wb1, // MTVAL value + + // feature disable from mfdc + output logic dec_tlu_external_ldfwd_disable, // disable external load forwarding + output logic dec_tlu_sideeffect_posted_disable, // disable posted stores to side-effect address + output logic dec_tlu_core_ecc_disable, // disable core ECC + output logic dec_tlu_bpred_disable, // disable branch prediction + output logic dec_tlu_wb_coalescing_disable, // disable writebuffer coalescing + output logic dec_tlu_pipelining_disable, // disable pipelining + output logic [2:0] dec_tlu_dma_qos_prty, // DMA QoS priority coming from MFDC [18:16] + + // clock gating overrides from mcgc + output logic dec_tlu_misc_clk_override, // override misc clock domain gating + output logic dec_tlu_dec_clk_override, // override decode clock domain gating + output logic dec_tlu_ifu_clk_override, // override fetch clock domain gating + output logic dec_tlu_lsu_clk_override, // override load/store clock domain gating + output logic dec_tlu_bus_clk_override, // override bus clock domain gating + output logic dec_tlu_pic_clk_override, // override PIC clock domain gating + output logic dec_tlu_dccm_clk_override, // override DCCM clock domain gating + output logic dec_tlu_icm_clk_override // override ICCM clock domain gating + + ); + + logic clk_override, e4e5_int_clk, nmi_lsu_load_type, nmi_lsu_store_type, nmi_int_detected_f, nmi_lsu_load_type_f, + nmi_lsu_store_type_f, allow_dbg_halt_csr_write, dbg_cmd_done_ns, i_cpu_run_req_d1_raw, debug_mode_status, lsu_single_ecc_error_r_d1, + sel_npc_r, sel_npc_resume, ce_int, + nmi_in_debug_mode, dpc_capture_npc, dpc_capture_pc, tdata_load, tdata_opcode, tdata_action, perfcnt_halted; + + + logic reset_delayed, reset_detect, reset_detected; + logic wr_mstatus_r, wr_mtvec_r, wr_mcyclel_r, wr_mcycleh_r, + wr_minstretl_r, wr_minstreth_r, wr_mscratch_r, wr_mepc_r, wr_mcause_r, wr_mscause_r, wr_mtval_r, + wr_mrac_r, wr_meihap_r, wr_meicurpl_r, wr_meipt_r, wr_dcsr_r, + wr_dpc_r, wr_meicidpl_r, wr_meivt_r, wr_meicpct_r, wr_micect_r, wr_miccmect_r, wr_mfdht_r, wr_mfdhs_r, + wr_mdccmect_r,wr_mhpme3_r, wr_mhpme4_r, wr_mhpme5_r, wr_mhpme6_r; + logic wr_mpmc_r; + logic [1:1] mpmc_b_ns, mpmc, mpmc_b; + logic set_mie_pmu_fw_halt, fw_halted_ns, fw_halted; + logic wr_mcountinhibit_r; + logic [6:0] mcountinhibit; + logic wr_mtsel_r, wr_mtdata1_t0_r, wr_mtdata1_t1_r, wr_mtdata1_t2_r, wr_mtdata1_t3_r, wr_mtdata2_t0_r, wr_mtdata2_t1_r, wr_mtdata2_t2_r, wr_mtdata2_t3_r; + logic [31:0] mtdata2_t0, mtdata2_t1, mtdata2_t2, mtdata2_t3, mtdata2_tsel_out, mtdata1_tsel_out; + logic [9:0] mtdata1_t0_ns, mtdata1_t0, mtdata1_t1_ns, mtdata1_t1, mtdata1_t2_ns, mtdata1_t2, mtdata1_t3_ns, mtdata1_t3; + logic [9:0] tdata_wrdata_r; + logic [1:0] mtsel_ns, mtsel; + logic tlu_i0_kill_writeb_r; + logic [1:0] mstatus_ns, mstatus; + logic [1:0] mfdhs_ns, mfdhs; + logic [31:0] force_halt_ctr, force_halt_ctr_f; + logic force_halt; + logic [5:0] mfdht, mfdht_ns; + logic mstatus_mie_ns; + logic [30:0] mtvec_ns, mtvec; + logic [15:2] dcsr_ns, dcsr; + logic [3:0] mip_ns, mip; + logic [3:0] mie_ns, mie; + logic [31:0] mcyclel_ns, mcyclel; + logic [31:0] mcycleh_ns, mcycleh; + logic [31:0] minstretl_ns, minstretl; + logic [31:0] minstreth_ns, minstreth; + logic [31:0] micect_ns, micect, miccmect_ns, miccmect, mdccmect_ns, mdccmect; + logic [26:0] micect_inc, miccmect_inc, mdccmect_inc; + logic [31:0] mscratch; + logic [31:0] mhpmc3, mhpmc3_ns, mhpmc4, mhpmc4_ns, mhpmc5, mhpmc5_ns, mhpmc6, mhpmc6_ns; + logic [31:0] mhpmc3h, mhpmc3h_ns, mhpmc4h, mhpmc4h_ns, mhpmc5h, mhpmc5h_ns, mhpmc6h, mhpmc6h_ns; + logic [9:0] mhpme3, mhpme4, mhpme5, mhpme6; + logic [31:0] mrac; + logic [9:2] meihap; + logic [31:10] meivt; + logic [3:0] meicurpl_ns, meicurpl; + logic [3:0] meicidpl_ns, meicidpl; + logic [3:0] meipt_ns, meipt; + logic [31:0] mdseac; + logic mdseac_locked_ns, mdseac_locked_f, mdseac_en, nmi_lsu_detected; + logic [31:1] mepc_ns, mepc; + logic [31:1] dpc_ns, dpc; + logic [31:0] mcause_ns, mcause; + logic [2:0] mscause_ns, mscause, mscause_type; + logic [31:0] mtval_ns, mtval; + logic dec_pause_state_f, dec_tlu_wr_pause_r_d1, pause_expired_r, pause_expired_wb; + logic tlu_flush_lower_r, tlu_flush_lower_r_d1; + logic [31:1] tlu_flush_path_r, tlu_flush_path_r_d1; + logic i0_valid_wb; + logic tlu_i0_commit_cmt; + logic [31:1] vectored_path, interrupt_path; + logic [16:0] dicawics_ns, dicawics; + logic wr_dicawics_r, wr_dicad0_r, wr_dicad1_r, wr_dicad0h_r; + logic [31:0] dicad0_ns, dicad0, dicad0h_ns, dicad0h; + logic [6:0] dicad1_ns, dicad1_raw; + logic [31:0] dicad1; + logic ebreak_r, ebreak_to_debug_mode_r, ecall_r, illegal_r, mret_r, inst_acc_r, fence_i_r, + ic_perr_r, iccm_sbecc_r, ebreak_to_debug_mode_r_d1, kill_ebreak_count_r, inst_acc_second_r; + logic ic_perr_r_d1, iccm_sbecc_r_d1; + logic ce_int_ready, ext_int_ready, timer_int_ready, soft_int_ready, mhwakeup_ready, + take_ext_int, take_ce_int, take_timer_int, take_soft_int, take_nmi, take_nmi_r_d1; + logic i0_exception_valid_r, interrupt_valid_r, i0_exception_valid_r_d1, interrupt_valid_r_d1, exc_or_int_valid_r, exc_or_int_valid_r_d1, + mdccme_ce_req, miccme_ce_req, mice_ce_req; + logic synchronous_flush_r; + logic [4:0] exc_cause_r, exc_cause_wb; + logic mcyclel_cout, mcyclel_cout_f; + logic [31:0] mcyclel_inc; + logic [31:0] mcycleh_inc; + logic minstretl_cout, minstretl_cout_f, minstret_enable; + logic [31:0] minstretl_inc, minstretl_read; + logic [31:0] minstreth_inc, minstreth_read; + logic [31:1] pc_r, pc_r_d1, npc_r, npc_r_d1; + logic valid_csr; + logic rfpc_i0_r; + logic lsu_i0_rfnpc_r; + logic dec_tlu_br0_error_r, dec_tlu_br0_start_error_r, dec_tlu_br0_v_r; + logic lsu_i0_exc_r, lsu_i0_exc_r_raw, lsu_exc_ma_r, lsu_exc_acc_r, lsu_exc_st_r, + lsu_exc_valid_r, lsu_exc_valid_r_raw, lsu_exc_valid_r_d1, lsu_i0_exc_r_d1, block_interrupts; + logic i0_trigger_eval_r; + logic request_debug_mode_r, request_debug_mode_r_d1, request_debug_mode_done, request_debug_mode_done_f; + logic take_halt, halt_taken, halt_taken_f, internal_dbg_halt_mode, dbg_tlu_halted_f, take_reset, + dbg_tlu_halted, core_empty, lsu_idle_any_f, ifu_miss_state_idle_f, resume_ack_ns, + debug_halt_req_f, debug_resume_req_f, enter_debug_halt_req, dcsr_single_step_done, dcsr_single_step_done_f, + debug_halt_req_d1, debug_halt_req_ns, dcsr_single_step_running, dcsr_single_step_running_f, internal_dbg_halt_timers; + + logic [3:0] i0_trigger_r, trigger_action, trigger_enabled, + i0_trigger_chain_masked_r; + logic i0_trigger_hit_r, i0_trigger_hit_raw_r, i0_trigger_action_r, + trigger_hit_r_d1, + mepc_trigger_hit_sel_pc_r; + logic [3:0] update_hit_bit_r, i0_iside_trigger_has_pri_r,i0trigger_qual_r, i0_lsu_trigger_has_pri_r; + logic cpu_halt_status, cpu_halt_ack, cpu_run_ack, ext_halt_pulse, i_cpu_halt_req_d1, i_cpu_run_req_d1; + + logic inst_acc_r_raw, trigger_hit_dmode_r, trigger_hit_dmode_r_d1; + logic [8:0] mcgc; + logic [18:0] mfdc; + logic i_cpu_halt_req_sync_qual, i_cpu_run_req_sync_qual, pmu_fw_halt_req_ns, pmu_fw_halt_req_f, + fw_halt_req, enter_pmu_fw_halt_req, pmu_fw_tlu_halted, pmu_fw_tlu_halted_f, internal_pmu_fw_halt_mode, + internal_pmu_fw_halt_mode_f; + logic nmi_int_delayed, nmi_int_detected; + logic [3:0] trigger_execute, trigger_data, trigger_store; + logic dec_tlu_pmu_fw_halted; + + logic mpc_run_state_ns, debug_brkpt_status_ns, mpc_debug_halt_ack_ns, mpc_debug_run_ack_ns, dbg_halt_state_ns, dbg_run_state_ns, + dbg_halt_state_f, mpc_debug_halt_req_sync_f, mpc_debug_run_req_sync_f, mpc_halt_state_f, mpc_halt_state_ns, mpc_run_state_f, debug_brkpt_status_f, + mpc_debug_halt_ack_f, mpc_debug_run_ack_f, dbg_run_state_f, mpc_debug_halt_req_sync_pulse, + mpc_debug_run_req_sync_pulse, debug_brkpt_valid, debug_halt_req, debug_resume_req, dec_tlu_mpc_halted_only_ns; + logic take_ext_int_start, ext_int_freeze, take_ext_int_start_d1, take_ext_int_start_d2, + take_ext_int_start_d3, ext_int_freeze_d1, csr_meicpct, ignore_ext_int_due_to_lsu_stall; + logic mcause_sel_nmi_store, mcause_sel_nmi_load, mcause_sel_nmi_ext, fast_int_meicpct; + logic [1:0] mcause_fir_error_type; + logic dbg_halt_req_held_ns, dbg_halt_req_held, dbg_halt_req_final; + logic iccm_repair_state_ns, iccm_repair_state_d1, iccm_repair_state_rfnpc; + + logic nmi_int_sync, timer_int_sync, soft_int_sync, i_cpu_halt_req_sync, i_cpu_run_req_sync, mpc_debug_halt_req_sync, mpc_debug_run_req_sync, mpc_debug_halt_req_sync_raw; + logic csr_wr_clk; + logic lsu_r_wb_clk; + logic e4e5_clk, e4_valid, e5_valid, e4e5_valid, internal_dbg_halt_mode_f, internal_dbg_halt_mode_f2; + logic lsu_pmu_load_external_r, lsu_pmu_store_external_r; + logic dec_tlu_flush_noredir_r_d1, dec_tlu_flush_pause_r_d1; + logic lsu_single_ecc_error_r; + logic [31:0] lsu_error_pkt_addr_r; + logic mcyclel_cout_in; + logic i0_valid_no_ebreak_ecall_r; + logic minstret_enable_f; + logic sel_exu_npc_r, sel_flush_npc_r, sel_hold_npc_r; + logic pc0_valid_r; + logic [14:0] mfdc_int, mfdc_ns; + logic [31:0] mrac_in; + logic [31:27] csr_sat; + logic [8:6] dcsr_cause; + logic enter_debug_halt_req_le, dcsr_cause_upgradeable; + logic icache_rd_valid, icache_wr_valid, icache_rd_valid_f, icache_wr_valid_f; + logic [3:0] mhpmc_inc_r, mhpmc_inc_r_d1; + + logic [3:0][9:0] mhpme_vec; + logic mhpmc3_wr_en0, mhpmc3_wr_en1, mhpmc3_wr_en; + logic mhpmc4_wr_en0, mhpmc4_wr_en1, mhpmc4_wr_en; + logic mhpmc5_wr_en0, mhpmc5_wr_en1, mhpmc5_wr_en; + logic mhpmc6_wr_en0, mhpmc6_wr_en1, mhpmc6_wr_en; + logic mhpmc3h_wr_en0, mhpmc3h_wr_en; + logic mhpmc4h_wr_en0, mhpmc4h_wr_en; + logic mhpmc5h_wr_en0, mhpmc5h_wr_en; + logic mhpmc6h_wr_en0, mhpmc6h_wr_en; + logic [63:0] mhpmc3_incr, mhpmc4_incr, mhpmc5_incr, mhpmc6_incr; + logic perfcnt_halted_d1; + logic [3:0] perfcnt_during_sleep; + logic [9:0] event_saturate_r; + logic trace_tclk; + + el2_inst_pkt_t pmu_i0_itype_qual; + + logic csr_mfdht; + logic csr_mfdhs; + logic csr_misa; + logic csr_mvendorid; + logic csr_marchid; + logic csr_mimpid; + logic csr_mhartid; + logic csr_mstatus; + logic csr_mtvec; + logic csr_mip; + logic csr_mie; + logic csr_mcyclel; + logic csr_mcycleh; + logic csr_minstretl; + logic csr_minstreth; + logic csr_mscratch; + logic csr_mepc; + logic csr_mcause; + logic csr_mscause; + logic csr_mtval; + logic csr_mrac; + logic csr_dmst; + logic csr_mdseac; + logic csr_meihap; + logic csr_meivt; + logic csr_meipt; + logic csr_meicurpl; + logic csr_meicidpl; + logic csr_dcsr; + logic csr_mcgc; + logic csr_mfdc; + logic csr_dpc; + logic csr_mtsel; + logic csr_mtdata1; + logic csr_mtdata2; + logic csr_mhpmc3; + logic csr_mhpmc4; + logic csr_mhpmc5; + logic csr_mhpmc6; + logic csr_mhpmc3h; + logic csr_mhpmc4h; + logic csr_mhpmc5h; + logic csr_mhpmc6h; + logic csr_mhpme3; + logic csr_mhpme4; + logic csr_mhpme5; + logic csr_mhpme6; + logic csr_mcountinhibit; + logic csr_mpmc; + logic csr_mcpc; + logic csr_mdeau; + logic csr_micect; + logic csr_miccmect; + logic csr_mdccmect; + logic csr_dicawics; + logic csr_dicad0h; + logic csr_dicad0; + logic csr_dicad1; + logic csr_dicago; + logic presync; + logic postsync; + logic legal; + logic dec_csr_wen_r_mod; + + logic flush_clkvalid; + logic sel_fir_addr; + logic wr_mie_r; + logic mtval_capture_pc_r; + logic mtval_capture_pc_plus2_r; + logic mtval_capture_inst_r; + logic mtval_capture_lsu_r; + logic mtval_clear_r; + logic wr_mcgc_r; + logic wr_mfdc_r; + logic wr_mdeau_r; + logic trigger_hit_for_dscr_cause_r_d1; + + + assign clk_override = dec_tlu_dec_clk_override; + + // Async inputs to the core have to be sync'd to the core clock. + rvsyncss #(7) syncro_ff(.*, + .clk(free_clk), + .din ({nmi_int, timer_int, soft_int, i_cpu_halt_req, i_cpu_run_req, mpc_debug_halt_req, mpc_debug_run_req}), + .dout({nmi_int_sync, timer_int_sync, soft_int_sync, i_cpu_halt_req_sync, i_cpu_run_req_sync, mpc_debug_halt_req_sync_raw, mpc_debug_run_req_sync})); + + // for CSRs that have inpipe writes only + + rvoclkhdr csrwr_r_cgc ( .en(dec_csr_wen_r_mod | clk_override), .l1clk(csr_wr_clk), .* ); + rvoclkhdr lsu_r_wb_cgc ( .en(lsu_error_pkt_r.exc_valid | lsu_exc_valid_r_d1 | clk_override), .l1clk(lsu_r_wb_clk), .* ); + + assign e4_valid = dec_tlu_i0_valid_r; + assign e4e5_valid = e4_valid | e5_valid; + assign flush_clkvalid = internal_dbg_halt_mode_f | i_cpu_run_req_d1 | interrupt_valid_r | interrupt_valid_r_d1 | + reset_delayed | pause_expired_r | pause_expired_wb | ic_perr_r | ic_perr_r_d1 | iccm_sbecc_r | iccm_sbecc_r_d1 | + clk_override; + rvoclkhdr e4e5_cgc ( .en(e4e5_valid | clk_override), .l1clk(e4e5_clk), .* ); + rvoclkhdr e4e5_int_cgc ( .en(e4e5_valid | flush_clkvalid), .l1clk(e4e5_int_clk), .* ); + + rvdff #(11) freeff (.*, .clk(free_clk), .din ({iccm_repair_state_ns, ic_perr_r, iccm_sbecc_r, e4_valid, internal_dbg_halt_mode, + lsu_pmu_load_external_m, lsu_pmu_store_external_m, tlu_flush_lower_r, tlu_i0_kill_writeb_r, + internal_dbg_halt_mode_f, force_halt}), + .dout({iccm_repair_state_d1, ic_perr_r_d1, iccm_sbecc_r_d1, e5_valid, internal_dbg_halt_mode_f, + lsu_pmu_load_external_r, lsu_pmu_store_external_r, tlu_flush_lower_r_d1, dec_tlu_i0_kill_writeb_wb, + internal_dbg_halt_mode_f2, dec_tlu_force_halt})); + + assign dec_tlu_i0_kill_writeb_r = tlu_i0_kill_writeb_r; + + rvdff #(2) reset_ff (.*, .clk(free_clk), .din({1'b1, reset_detect}), .dout({reset_detect, reset_detected})); + assign reset_delayed = reset_detect ^ reset_detected; + + rvdff #(4) nmi_ff (.*, .clk(free_clk), .din({nmi_int_sync, nmi_int_detected, nmi_lsu_load_type, nmi_lsu_store_type}), .dout({nmi_int_delayed, nmi_int_detected_f, nmi_lsu_load_type_f, nmi_lsu_store_type_f})); + + // Filter subsequent bus errors after the first, until the lock on MDSEAC is cleared + assign nmi_lsu_detected = ~mdseac_locked_f & (lsu_imprecise_error_load_any | lsu_imprecise_error_store_any); + + assign nmi_int_detected = (nmi_int_sync & ~nmi_int_delayed) | nmi_lsu_detected | (nmi_int_detected_f & ~take_nmi_r_d1) | (take_ext_int_start_d3 & |lsu_fir_error[1:0]); + // if the first nmi is a lsu type, note it. If there's already an nmi pending, ignore + assign nmi_lsu_load_type = (nmi_lsu_detected & lsu_imprecise_error_load_any & ~(nmi_int_detected_f & ~take_nmi_r_d1)) | (nmi_lsu_load_type_f & ~take_nmi_r_d1); + assign nmi_lsu_store_type = (nmi_lsu_detected & lsu_imprecise_error_store_any & ~(nmi_int_detected_f & ~take_nmi_r_d1)) | (nmi_lsu_store_type_f & ~take_nmi_r_d1); + +`define MSTATUS_MIE 0 +`define MIP_MCEIP 3 +`define MIP_MEIP 2 +`define MIP_MTIP 1 +`define MIP_MSIP 0 + +`define MIE_MCEIE 3 +`define MIE_MEIE 2 +`define MIE_MTIE 1 +`define MIE_MSIE 0 + +`define DCSR_EBREAKM 15 +`define DCSR_STEPIE 11 +`define DCSR_STOPC 10 +`define DCSR_STEP 2 + // ---------------------------------------------------------------------- + // MPC halt + // - can interact with debugger halt and v-v + + // fast ints in progress have priority + assign mpc_debug_halt_req_sync = mpc_debug_halt_req_sync_raw & ~ext_int_freeze_d1; + + rvdff #(10) mpvhalt_ff (.*, .clk(free_clk), + .din({mpc_debug_halt_req_sync, mpc_debug_run_req_sync, + mpc_halt_state_ns, mpc_run_state_ns, debug_brkpt_status_ns, + mpc_debug_halt_ack_ns, mpc_debug_run_ack_ns, + dbg_halt_state_ns, dbg_run_state_ns, + dec_tlu_mpc_halted_only_ns}), + .dout({mpc_debug_halt_req_sync_f, mpc_debug_run_req_sync_f, + mpc_halt_state_f, mpc_run_state_f, debug_brkpt_status_f, + mpc_debug_halt_ack_f, mpc_debug_run_ack_f, + dbg_halt_state_f, dbg_run_state_f, + dec_tlu_mpc_halted_only})); + + // turn level sensitive requests into pulses + assign mpc_debug_halt_req_sync_pulse = mpc_debug_halt_req_sync & ~mpc_debug_halt_req_sync_f; + assign mpc_debug_run_req_sync_pulse = mpc_debug_run_req_sync & ~mpc_debug_run_req_sync_f; + + // states + assign mpc_halt_state_ns = (mpc_halt_state_f | mpc_debug_halt_req_sync_pulse | (reset_delayed & ~mpc_reset_run_req)) & ~mpc_debug_run_req_sync; + assign mpc_run_state_ns = (mpc_run_state_f | (mpc_debug_run_req_sync_pulse & ~mpc_debug_run_ack_f)) & (internal_dbg_halt_mode_f & ~dcsr_single_step_running_f); + + assign dbg_halt_state_ns = (dbg_halt_state_f | (dbg_halt_req_final | dcsr_single_step_done_f | trigger_hit_dmode_r_d1 | ebreak_to_debug_mode_r_d1)) & ~dbg_resume_req; + assign dbg_run_state_ns = (dbg_run_state_f | dbg_resume_req) & (internal_dbg_halt_mode_f & ~dcsr_single_step_running_f); + + // tell dbg we are only MPC halted + assign dec_tlu_mpc_halted_only_ns = ~dbg_halt_state_f & mpc_halt_state_f; + + // this asserts from detection of bkpt until after we leave debug mode + assign debug_brkpt_valid = ebreak_to_debug_mode_r_d1 | trigger_hit_dmode_r_d1; + assign debug_brkpt_status_ns = (debug_brkpt_valid | debug_brkpt_status_f) & (internal_dbg_halt_mode & ~dcsr_single_step_running_f); + + // acks back to interface + assign mpc_debug_halt_ack_ns = mpc_halt_state_f & internal_dbg_halt_mode_f & mpc_debug_halt_req_sync & core_empty; + assign mpc_debug_run_ack_ns = (mpc_debug_run_req_sync & ~dbg_halt_state_ns & ~mpc_debug_halt_req_sync) | (mpc_debug_run_ack_f & mpc_debug_run_req_sync) ; + + // Pins + assign mpc_debug_halt_ack = mpc_debug_halt_ack_f; + assign mpc_debug_run_ack = mpc_debug_run_ack_f; + assign debug_brkpt_status = debug_brkpt_status_f; + + // DBG halt req is a pulse, fast ext int in progress has priority + assign dbg_halt_req_held_ns = (dbg_halt_req | dbg_halt_req_held) & ext_int_freeze_d1; + assign dbg_halt_req_final = (dbg_halt_req | dbg_halt_req_held) & ~ext_int_freeze_d1; + + // combine MPC and DBG halt requests + assign debug_halt_req = (dbg_halt_req_final | mpc_debug_halt_req_sync | (reset_delayed & ~mpc_reset_run_req)) & ~internal_dbg_halt_mode_f & ~ext_int_freeze_d1; + + assign debug_resume_req = ~debug_resume_req_f & // squash back to back resumes + ((mpc_run_state_ns & ~dbg_halt_state_ns) | // MPC run req + (dbg_run_state_ns & ~mpc_halt_state_ns)); // dbg request is a pulse + + + // HALT + // dbg/pmu/fw requests halt, service as soon as lsu is not blocking interrupts + assign take_halt = (debug_halt_req_f | pmu_fw_halt_req_f) & ~synchronous_flush_r & ~mret_r & ~halt_taken_f & ~dec_tlu_flush_noredir_r_d1 & ~take_reset; + + // hold after we take a halt, so we don't keep taking halts + assign halt_taken = (dec_tlu_flush_noredir_r_d1 & ~dec_tlu_flush_pause_r_d1 & ~take_ext_int_start_d1) | (halt_taken_f & ~dbg_tlu_halted_f & ~pmu_fw_tlu_halted_f & ~interrupt_valid_r_d1); + + // After doing halt flush (RFNPC) wait until core is idle before asserting a particular halt mode + // It takes a cycle for mb_empty to assert after a fetch, take_halt covers that cycle + assign core_empty = force_halt | + (lsu_idle_any & lsu_idle_any_f & ifu_miss_state_idle & ifu_miss_state_idle_f & ~debug_halt_req & ~debug_halt_req_d1 & ~dec_div_active); + +//-------------------------------------------------------------------------------- +// Debug start +// + + assign enter_debug_halt_req = (~internal_dbg_halt_mode_f & debug_halt_req) | dcsr_single_step_done_f | trigger_hit_dmode_r_d1 | ebreak_to_debug_mode_r_d1; + + // dbg halt state active from request until non-step resume + assign internal_dbg_halt_mode = debug_halt_req_ns | (internal_dbg_halt_mode_f & ~(debug_resume_req_f & ~dcsr[`DCSR_STEP])); + // dbg halt can access csrs as long as we are not stepping + assign allow_dbg_halt_csr_write = internal_dbg_halt_mode_f & ~dcsr_single_step_running_f; + + + // hold debug_halt_req_ns high until we enter debug halt + assign debug_halt_req_ns = enter_debug_halt_req | (debug_halt_req_f & ~dbg_tlu_halted); + + assign dbg_tlu_halted = (debug_halt_req_f & core_empty & halt_taken) | (dbg_tlu_halted_f & ~debug_resume_req_f); + + assign resume_ack_ns = (debug_resume_req_f & dbg_tlu_halted_f & dbg_run_state_ns); + + assign dcsr_single_step_done = dec_tlu_i0_valid_r & ~dec_tlu_dbg_halted & dcsr[`DCSR_STEP] & ~rfpc_i0_r; + + assign dcsr_single_step_running = (debug_resume_req_f & dcsr[`DCSR_STEP]) | (dcsr_single_step_running_f & ~dcsr_single_step_done_f); + + assign dbg_cmd_done_ns = dec_tlu_i0_valid_r & dec_tlu_dbg_halted; + + // used to hold off commits after an in-pipe debug mode request (triggers, DCSR) + assign request_debug_mode_r = (trigger_hit_dmode_r | ebreak_to_debug_mode_r) | (request_debug_mode_r_d1 & ~dec_tlu_flush_lower_wb); + + assign request_debug_mode_done = (request_debug_mode_r_d1 | request_debug_mode_done_f) & ~dbg_tlu_halted_f; + + rvdff #(18) halt_ff (.*, .clk(free_clk), + .din({dec_tlu_flush_noredir_r, halt_taken, lsu_idle_any, ifu_miss_state_idle, dbg_tlu_halted, + resume_ack_ns, debug_halt_req_ns, debug_resume_req, trigger_hit_dmode_r, + dcsr_single_step_done, debug_halt_req, dec_tlu_wr_pause_r, dec_pause_state, + request_debug_mode_r, request_debug_mode_done, dcsr_single_step_running, dec_tlu_flush_pause_r, + dbg_halt_req_held_ns}), + .dout({dec_tlu_flush_noredir_r_d1, halt_taken_f, lsu_idle_any_f, ifu_miss_state_idle_f, dbg_tlu_halted_f, + dec_tlu_resume_ack , debug_halt_req_f, debug_resume_req_f, trigger_hit_dmode_r_d1, + dcsr_single_step_done_f, debug_halt_req_d1, dec_tlu_wr_pause_r_d1, dec_pause_state_f, + request_debug_mode_r_d1, request_debug_mode_done_f, dcsr_single_step_running_f, dec_tlu_flush_pause_r_d1, + dbg_halt_req_held})); + + assign dec_tlu_debug_stall = debug_halt_req_f; + assign dec_tlu_dbg_halted = dbg_tlu_halted_f; + assign dec_tlu_debug_mode = internal_dbg_halt_mode_f; + assign dec_tlu_pmu_fw_halted = pmu_fw_tlu_halted_f; + + // kill fetch redirection on flush if going to halt, or if there's a fence during db-halt + assign dec_tlu_flush_noredir_r = take_halt | (fence_i_r & internal_dbg_halt_mode) | dec_tlu_flush_pause_r | (i0_trigger_hit_r & trigger_hit_dmode_r) | take_ext_int_start; + + assign dec_tlu_flush_extint = take_ext_int_start; + + // 1 cycle after writing the PAUSE counter, flush with noredir to idle F1-D. + assign dec_tlu_flush_pause_r = dec_tlu_wr_pause_r_d1 & ~interrupt_valid_r & ~take_ext_int_start; + + // detect end of pause counter and rfpc + assign pause_expired_r = ~dec_pause_state & dec_pause_state_f & ~(ext_int_ready | ce_int_ready | timer_int_ready | soft_int_ready | nmi_int_detected | ext_int_freeze_d1) & ~interrupt_valid_r_d1 & ~debug_halt_req_f & ~pmu_fw_halt_req_f & ~halt_taken_f; + + assign dec_tlu_flush_leak_one_r = dec_tlu_flush_lower_r & dcsr[`DCSR_STEP] & (dec_tlu_resume_ack | dcsr_single_step_running) & ~dec_tlu_flush_noredir_r; + assign dec_tlu_flush_err_r = dec_tlu_flush_lower_r & (ic_perr_r_d1 | iccm_sbecc_r_d1); + + // If DM attempts to access an illegal CSR, send cmd_fail back + assign dec_dbg_cmd_done = dbg_cmd_done_ns; + assign dec_dbg_cmd_fail = illegal_r & dec_dbg_cmd_done; + + + //-------------------------------------------------------------------------------- + //-------------------------------------------------------------------------------- + // Triggers + // +`define MTDATA1_DMODE 9 +`define MTDATA1_SEL 7 +`define MTDATA1_ACTION 6 +`define MTDATA1_CHAIN 5 +`define MTDATA1_MATCH 4 +`define MTDATA1_M_ENABLED 3 +`define MTDATA1_EXE 2 +`define MTDATA1_ST 1 +`define MTDATA1_LD 0 + + // Prioritize trigger hits with other exceptions. + // + // Trigger should have highest priority except: + // - trigger is an execute-data and there is an inst_access exception (lsu triggers won't fire, inst. is nop'd by decode) + // - trigger is a store-data and there is a lsu_acc_exc or lsu_ma_exc. + assign trigger_execute[3:0] = {mtdata1_t3[`MTDATA1_EXE], mtdata1_t2[`MTDATA1_EXE], mtdata1_t1[`MTDATA1_EXE], mtdata1_t0[`MTDATA1_EXE]}; + assign trigger_data[3:0] = {mtdata1_t3[`MTDATA1_SEL], mtdata1_t2[`MTDATA1_SEL], mtdata1_t1[`MTDATA1_SEL], mtdata1_t0[`MTDATA1_SEL]}; + assign trigger_store[3:0] = {mtdata1_t3[`MTDATA1_ST], mtdata1_t2[`MTDATA1_ST], mtdata1_t1[`MTDATA1_ST], mtdata1_t0[`MTDATA1_ST]}; + + // MSTATUS[MIE] needs to be on to take triggers unless the action is trigger to debug mode. + assign trigger_enabled[3:0] = {(mtdata1_t3[`MTDATA1_ACTION] | mstatus[`MSTATUS_MIE]) & mtdata1_t3[`MTDATA1_M_ENABLED], + (mtdata1_t2[`MTDATA1_ACTION] | mstatus[`MSTATUS_MIE]) & mtdata1_t2[`MTDATA1_M_ENABLED], + (mtdata1_t1[`MTDATA1_ACTION] | mstatus[`MSTATUS_MIE]) & mtdata1_t1[`MTDATA1_M_ENABLED], + (mtdata1_t0[`MTDATA1_ACTION] | mstatus[`MSTATUS_MIE]) & mtdata1_t0[`MTDATA1_M_ENABLED]}; + + // iside exceptions are always in i0 + assign i0_iside_trigger_has_pri_r[3:0] = ~( (trigger_execute[3:0] & trigger_data[3:0] & {4{inst_acc_r_raw}}) | // exe-data with inst_acc + ({4{exu_i0_br_error_r | exu_i0_br_start_error_r}})); // branch error in i0 + + // lsu excs have to line up with their respective triggers since the lsu op can be i0 + assign i0_lsu_trigger_has_pri_r[3:0] = ~(trigger_store[3:0] & trigger_data[3:0] & {4{lsu_i0_exc_r_raw}}); + + // trigger hits have to be eval'd to cancel side effect lsu ops even though the pipe is already frozen + assign i0_trigger_eval_r = dec_tlu_i0_valid_r; + + assign i0trigger_qual_r[3:0] = {4{i0_trigger_eval_r}} & dec_tlu_packet_r.i0trigger[3:0] & i0_iside_trigger_has_pri_r[3:0] & i0_lsu_trigger_has_pri_r[3:0] & trigger_enabled[3:0]; + + // Qual trigger hits + assign i0_trigger_r[3:0] = ~{4{dec_tlu_flush_lower_wb | dec_tlu_dbg_halted}} & i0trigger_qual_r[3:0]; + + // chaining can mask raw trigger info + assign i0_trigger_chain_masked_r[3:0] = {i0_trigger_r[3] & (~mtdata1_t2[`MTDATA1_CHAIN] | i0_trigger_r[2]), + i0_trigger_r[2] & (~mtdata1_t2[`MTDATA1_CHAIN] | i0_trigger_r[3]), + i0_trigger_r[1] & (~mtdata1_t0[`MTDATA1_CHAIN] | i0_trigger_r[0]), + i0_trigger_r[0] & (~mtdata1_t0[`MTDATA1_CHAIN] | i0_trigger_r[1])}; + + // This is the highest priority by this point. + assign i0_trigger_hit_raw_r = |i0_trigger_chain_masked_r[3:0]; + + assign i0_trigger_hit_r = i0_trigger_hit_raw_r; + + // Actions include breakpoint, or dmode. Dmode is only possible if the DMODE bit is set. + // Otherwise, take a breakpoint. + assign trigger_action[3:0] = {mtdata1_t3[`MTDATA1_ACTION] & mtdata1_t3[`MTDATA1_DMODE], + mtdata1_t2[`MTDATA1_ACTION] & mtdata1_t2[`MTDATA1_DMODE], + mtdata1_t1[`MTDATA1_ACTION] & mtdata1_t1[`MTDATA1_DMODE], + mtdata1_t0[`MTDATA1_ACTION] & mtdata1_t0[`MTDATA1_DMODE]}; + + // this is needed to set the HIT bit in the triggers + assign update_hit_bit_r[3:0] = ({4{i0_trigger_hit_r}} & i0_trigger_chain_masked_r[3:0]); + + // action, 1 means dmode. Simultaneous triggers with at least 1 set for dmode force entire action to dmode. + assign i0_trigger_action_r = |(i0_trigger_chain_masked_r[3:0] & trigger_action[3:0]); + + assign trigger_hit_dmode_r = (i0_trigger_hit_r & i0_trigger_action_r); + + assign mepc_trigger_hit_sel_pc_r = i0_trigger_hit_r & ~trigger_hit_dmode_r; + + +// +// Debug end +//-------------------------------------------------------------------------------- + + //---------------------------------------------------------------------- + // + // Commit + // + //---------------------------------------------------------------------- + + + + //-------------------------------------------------------------------------------- + // External halt (not debug halt) + // - Fully interlocked handshake + // i_cpu_halt_req ____|--------------|_______________ + // core_empty ---------------|___________ + // o_cpu_halt_ack _________________|----|__________ + // o_cpu_halt_status _______________|---------------------|_________ + // i_cpu_run_req ______|----------|____ + // o_cpu_run_ack ____________|------|________ + // + + + // debug mode has priority, ignore PMU/FW halt/run while in debug mode + assign i_cpu_halt_req_sync_qual = i_cpu_halt_req_sync & ~dec_tlu_debug_mode & ~ext_int_freeze_d1; + assign i_cpu_run_req_sync_qual = i_cpu_run_req_sync & ~dec_tlu_debug_mode & pmu_fw_tlu_halted_f & ~ext_int_freeze_d1; + + rvdff #(8) exthaltff (.*, .clk(free_clk), .din({i_cpu_halt_req_sync_qual, i_cpu_run_req_sync_qual, cpu_halt_status, + cpu_halt_ack, cpu_run_ack, internal_pmu_fw_halt_mode, + pmu_fw_halt_req_ns, pmu_fw_tlu_halted}), + .dout({i_cpu_halt_req_d1, i_cpu_run_req_d1_raw, o_cpu_halt_status, + o_cpu_halt_ack, o_cpu_run_ack, internal_pmu_fw_halt_mode_f, + pmu_fw_halt_req_f, pmu_fw_tlu_halted_f})); + + // only happens if we aren't in dgb_halt + assign ext_halt_pulse = i_cpu_halt_req_sync_qual & ~i_cpu_halt_req_d1; + + assign enter_pmu_fw_halt_req = ext_halt_pulse | fw_halt_req; + + assign pmu_fw_halt_req_ns = (enter_pmu_fw_halt_req | (pmu_fw_halt_req_f & ~pmu_fw_tlu_halted)) & ~debug_halt_req_f; + + assign internal_pmu_fw_halt_mode = pmu_fw_halt_req_ns | (internal_pmu_fw_halt_mode_f & ~i_cpu_run_req_d1 & ~debug_halt_req_f); + + // debug halt has priority + assign pmu_fw_tlu_halted = ((pmu_fw_halt_req_f & core_empty & halt_taken & ~enter_debug_halt_req) | (pmu_fw_tlu_halted_f & ~i_cpu_run_req_d1)) & ~debug_halt_req_f; + + assign cpu_halt_ack = i_cpu_halt_req_d1 & pmu_fw_tlu_halted_f; + assign cpu_halt_status = (pmu_fw_tlu_halted_f & ~i_cpu_run_req_d1) | (o_cpu_halt_status & ~i_cpu_run_req_d1 & ~internal_dbg_halt_mode_f); + assign cpu_run_ack = (o_cpu_halt_status & i_cpu_run_req_sync_qual) | (o_cpu_run_ack & i_cpu_run_req_sync_qual); + assign debug_mode_status = internal_dbg_halt_mode_f; + assign o_debug_mode_status = debug_mode_status; + +`ifdef ASSERT_ON + assert_commit_while_halted: assert #0 (~(tlu_i0_commit_cmt & o_cpu_halt_status)) else $display("ERROR: Commiting while cpu_halt_status asserted!"); + assert_flush_while_fastint: assert #0 (~((take_ext_int_start_d1 | take_ext_int_start_d2) & dec_tlu_flush_lower_r)) else $display("ERROR: TLU Flushing inside fast interrupt procedure!"); +`endif + + // high priority interrupts can wakeup from external halt, so can unmasked timer interrupts + assign i_cpu_run_req_d1 = i_cpu_run_req_d1_raw | ((nmi_int_detected | timer_int_ready | soft_int_ready | (mhwakeup & mhwakeup_ready)) & o_cpu_halt_status & ~i_cpu_halt_req_d1); + + //-------------------------------------------------------------------------------- + //-------------------------------------------------------------------------------- + + assign lsu_single_ecc_error_r = lsu_single_ecc_error_incr; + rvdff #(2) lsu_dccm_errorff (.*, .clk(free_clk), .din({mdseac_locked_ns, lsu_single_ecc_error_r}), .dout({mdseac_locked_f, lsu_single_ecc_error_r_d1})); + + assign lsu_error_pkt_addr_r[31:0] = lsu_error_pkt_r.addr[31:0]; + rvdff #(2) lsu_error_wbff (.*, .clk(lsu_r_wb_clk), .din({lsu_exc_valid_r, lsu_i0_exc_r}), .dout({lsu_exc_valid_r_d1, lsu_i0_exc_r_d1})); + + + assign lsu_exc_valid_r_raw = lsu_error_pkt_r.exc_valid & ~dec_tlu_flush_lower_wb; + + assign lsu_i0_exc_r_raw = lsu_error_pkt_r.exc_valid; + + assign lsu_i0_exc_r = lsu_i0_exc_r_raw & lsu_exc_valid_r_raw & ~i0_trigger_hit_r & ~rfpc_i0_r; + + assign lsu_exc_valid_r = lsu_i0_exc_r; + + assign lsu_exc_ma_r = lsu_i0_exc_r & ~lsu_error_pkt_r.exc_type; + assign lsu_exc_acc_r = lsu_i0_exc_r & lsu_error_pkt_r.exc_type; + assign lsu_exc_st_r = lsu_i0_exc_r & lsu_error_pkt_r.inst_type; + + // Single bit ECC errors on loads are RFNPC corrected, with the corrected data written to the GPR. + // LSU turns the load into a store and patches the data in the DCCM + assign lsu_i0_rfnpc_r = dec_tlu_i0_valid_r & ~i0_trigger_hit_r & + (~lsu_error_pkt_r.inst_type & lsu_error_pkt_r.single_ecc_error); + + // Final commit valids + assign tlu_i0_commit_cmt = dec_tlu_i0_valid_r & + ~rfpc_i0_r & + ~lsu_i0_exc_r & + ~inst_acc_r & + ~dec_tlu_dbg_halted & + ~request_debug_mode_r_d1 & + ~i0_trigger_hit_r; + + // unified place to manage the killing of arch state writebacks + assign tlu_i0_kill_writeb_r = rfpc_i0_r | lsu_i0_exc_r | inst_acc_r | (illegal_r & dec_tlu_dbg_halted) | i0_trigger_hit_r; + assign dec_tlu_i0_commit_cmt = tlu_i0_commit_cmt; + + + // refetch PC, microarch flush + // ic errors only in pipe0 + assign rfpc_i0_r = ((dec_tlu_i0_valid_r & ~tlu_flush_lower_r_d1 & (exu_i0_br_error_r | exu_i0_br_start_error_r)) | // inst commit with rfpc + ((ic_perr_r_d1 | iccm_sbecc_r_d1) & ~ext_int_freeze_d1)) & // ic/iccm without inst commit + ~i0_trigger_hit_r & // unless there's a trigger. Err signal to ic/iccm will assert anyway to clear the error. + ~lsu_i0_rfnpc_r; + + // From the indication of a iccm single bit error until the first commit or flush, maintain a repair state. In the repair state, rfnpc i0 commits. + assign iccm_repair_state_ns = iccm_sbecc_r_d1 | (iccm_repair_state_d1 & ~dec_tlu_flush_lower_r); + + + `define MCPC 12'h7c2 + + // this is a flush of last resort, meaning only assert it if there is no other flush happening. + assign iccm_repair_state_rfnpc = tlu_i0_commit_cmt & iccm_repair_state_d1 & + ~(ebreak_r | ecall_r | mret_r | take_reset | illegal_r | (dec_csr_wen_r_mod & (dec_csr_wraddr_r[11:0] == `MCPC))); + + // go ahead and repair the branch error on other flushes, doesn't have to be the rfpc flush + assign dec_tlu_br0_error_r = exu_i0_br_error_r & dec_tlu_i0_valid_r & ~tlu_flush_lower_r_d1; + assign dec_tlu_br0_start_error_r = exu_i0_br_start_error_r & dec_tlu_i0_valid_r & ~tlu_flush_lower_r_d1; + assign dec_tlu_br0_v_r = exu_i0_br_valid_r & dec_tlu_i0_valid_r & ~tlu_flush_lower_r_d1 & (~exu_i0_br_mp_r | ~exu_pmu_i0_br_ataken); + + + assign dec_tlu_br0_r_pkt.hist[1:0] = exu_i0_br_hist_r[1:0]; + assign dec_tlu_br0_r_pkt.br_error = dec_tlu_br0_error_r; + assign dec_tlu_br0_r_pkt.br_start_error = dec_tlu_br0_start_error_r; + assign dec_tlu_br0_r_pkt.valid = dec_tlu_br0_v_r; + assign dec_tlu_br0_r_pkt.way = exu_i0_br_way_r; + assign dec_tlu_br0_r_pkt.middle = exu_i0_br_middle_r; + + + assign ebreak_r = (dec_tlu_packet_r.pmu_i0_itype == EBREAK) & dec_tlu_i0_valid_r & ~i0_trigger_hit_r & ~dcsr[`DCSR_EBREAKM] & ~rfpc_i0_r; + assign ecall_r = (dec_tlu_packet_r.pmu_i0_itype == ECALL) & dec_tlu_i0_valid_r & ~i0_trigger_hit_r & ~rfpc_i0_r; + assign illegal_r = ~dec_tlu_packet_r.legal & dec_tlu_i0_valid_r & ~i0_trigger_hit_r & ~rfpc_i0_r; + assign mret_r = (dec_tlu_packet_r.pmu_i0_itype == MRET) & dec_tlu_i0_valid_r & ~i0_trigger_hit_r & ~rfpc_i0_r; + // fence_i includes debug only fence_i's + assign fence_i_r = (dec_tlu_packet_r.fence_i & dec_tlu_i0_valid_r & ~i0_trigger_hit_r) & ~rfpc_i0_r; + assign ic_perr_r = ifu_ic_error_start & ~ext_int_freeze_d1 & (~internal_dbg_halt_mode_f | dcsr_single_step_running) & ~internal_pmu_fw_halt_mode_f; + assign iccm_sbecc_r = ifu_iccm_rd_ecc_single_err & ~ext_int_freeze_d1 & (~internal_dbg_halt_mode_f | dcsr_single_step_running) & ~internal_pmu_fw_halt_mode_f; + assign inst_acc_r_raw = dec_tlu_packet_r.icaf & dec_tlu_i0_valid_r; + assign inst_acc_r = inst_acc_r_raw & ~rfpc_i0_r & ~i0_trigger_hit_r; + assign inst_acc_second_r = dec_tlu_packet_r.icaf_f1; + + assign ebreak_to_debug_mode_r = (dec_tlu_packet_r.pmu_i0_itype == EBREAK) & dec_tlu_i0_valid_r & ~i0_trigger_hit_r & dcsr[`DCSR_EBREAKM] & ~rfpc_i0_r; + + rvdff #(1) exctype_wb_ff (.*, .clk(e4e5_clk), + .din (ebreak_to_debug_mode_r ), + .dout(ebreak_to_debug_mode_r_d1)); + + assign dec_tlu_fence_i_r = fence_i_r; + // + // Exceptions + // + // - MEPC <- PC + // - PC <- MTVEC, assert flush_lower + // - MCAUSE <- cause + // - MSCAUSE <- secondary cause + // - MTVAL <- + // - MPIE <- MIE + // - MIE <- 0 + // + assign i0_exception_valid_r = (ebreak_r | ecall_r | illegal_r | inst_acc_r) & ~rfpc_i0_r & ~dec_tlu_dbg_halted; + + // Cause: + // + // 0x2 : illegal + // 0x3 : breakpoint + // 0xb : Environment call M-mode + + + assign exc_cause_r[4:0] = ( ({5{take_ext_int}} & 5'h0b) | + ({5{take_timer_int}} & 5'h07) | + ({5{take_soft_int}} & 5'h03) | + ({5{take_ce_int}} & 5'h1e) | + ({5{illegal_r}} & 5'h02) | + ({5{ecall_r}} & 5'h0b) | + ({5{inst_acc_r}} & 5'h01) | + ({5{ebreak_r | i0_trigger_hit_r}} & 5'h03) | + ({5{lsu_exc_ma_r & ~lsu_exc_st_r}} & 5'h04) | + ({5{lsu_exc_acc_r & ~lsu_exc_st_r}} & 5'h05) | + ({5{lsu_exc_ma_r & lsu_exc_st_r}} & 5'h06) | + ({5{lsu_exc_acc_r & lsu_exc_st_r}} & 5'h07) + ) & ~{5{take_nmi}}; + + // + // Interrupts + // + // exceptions that are committed have already happened and will cause an int at E4 to wait a cycle + // or more if MSTATUS[MIE] is cleared. + // + // -in priority order, highest to lowest + // -single cycle window where a csr write to MIE/MSTATUS is at E4 when the other conditions for externals are met. + // Hold off externals for a cycle to make sure we are consistent with what was just written + assign mhwakeup_ready = ~dec_csr_stall_int_ff & mstatus_mie_ns & mip[`MIP_MEIP] & mie_ns[`MIE_MEIE]; + assign ext_int_ready = ~dec_csr_stall_int_ff & mstatus_mie_ns & mip[`MIP_MEIP] & mie_ns[`MIE_MEIE] & ~ignore_ext_int_due_to_lsu_stall; + assign ce_int_ready = ~dec_csr_stall_int_ff & mstatus_mie_ns & mip[`MIP_MCEIP] & mie_ns[`MIE_MCEIE]; + assign soft_int_ready = ~dec_csr_stall_int_ff & mstatus_mie_ns & mip[`MIP_MSIP] & mie_ns[`MIE_MSIE]; + assign timer_int_ready = ~dec_csr_stall_int_ff & mstatus_mie_ns & mip[`MIP_MTIP] & mie_ns[`MIE_MTIE]; + + assign internal_dbg_halt_timers = internal_dbg_halt_mode_f & ~dcsr_single_step_running; + + + assign block_interrupts = ( (internal_dbg_halt_mode & (~dcsr_single_step_running | dec_tlu_i0_valid_r)) | // No ints in db-halt unless we are single stepping + internal_pmu_fw_halt_mode | i_cpu_halt_req_d1 |// No ints in PMU/FW halt. First we exit halt + take_nmi | // NMI is top priority + ebreak_to_debug_mode_r | // Heading to debug mode, hold off ints + synchronous_flush_r | // exception flush this cycle + exc_or_int_valid_r_d1 | // ext/int past cycle (need time for MIE to update) + mret_r | // mret in progress, for cases were ISR enables ints before mret + ext_int_freeze_d1 // Fast interrupt in progress (optional) + ); + + +if (pt.FAST_INTERRUPT_REDIRECT) begin + + rvdff #(4) fastint_ff (.*, .clk(free_clk), + .din({take_ext_int_start, take_ext_int_start_d1, take_ext_int_start_d2, ext_int_freeze}), + .dout({take_ext_int_start_d1, take_ext_int_start_d2, take_ext_int_start_d3, ext_int_freeze_d1})); + + assign take_ext_int_start = ext_int_ready & ~block_interrupts; + + assign ext_int_freeze = take_ext_int_start | take_ext_int_start_d1 | take_ext_int_start_d2 | take_ext_int_start_d3; + assign take_ext_int = take_ext_int_start_d3 & ~|lsu_fir_error[1:0]; + assign fast_int_meicpct = csr_meicpct & dec_csr_any_unq_d; // MEICPCT becomes illegal if fast ints are enabled + + assign ignore_ext_int_due_to_lsu_stall = lsu_fastint_stall_any; +end +else begin + assign take_ext_int_start = 1'b0; + assign ext_int_freeze = 1'b0; + assign ext_int_freeze_d1 = 1'b0; + assign take_ext_int_start_d1 = 1'b0; + assign take_ext_int_start_d2 = 1'b0; + assign take_ext_int_start_d3 = 1'b0; + assign fast_int_meicpct = 1'b0; + assign ignore_ext_int_due_to_lsu_stall = 1'b0; + + assign take_ext_int = ext_int_ready & ~block_interrupts; +end + + assign take_ce_int = ce_int_ready & ~ext_int_ready & ~block_interrupts; + assign take_soft_int = soft_int_ready & ~ext_int_ready & ~ce_int_ready & ~block_interrupts; + assign take_timer_int = timer_int_ready & ~soft_int_ready & ~ext_int_ready & ~ce_int_ready & ~block_interrupts; + + assign take_reset = reset_delayed & mpc_reset_run_req; + assign take_nmi = nmi_int_detected & ~internal_pmu_fw_halt_mode & (~internal_dbg_halt_mode | (dcsr_single_step_running_f & dcsr[`DCSR_STEPIE] & ~dec_tlu_i0_valid_r & ~dcsr_single_step_done_f)) & + ~synchronous_flush_r & ~mret_r & ~take_reset & ~ebreak_to_debug_mode_r & (~ext_int_freeze_d1 | (take_ext_int_start_d3 & |lsu_fir_error[1:0])); + + assign interrupt_valid_r = take_ext_int | take_timer_int | take_soft_int | take_nmi | take_ce_int; + + + // Compute interrupt path: + // If vectored async is set in mtvec, flush path for interrupts is MTVEC + (4 * CAUSE); + assign vectored_path[31:1] = {mtvec[30:1], 1'b0} + {25'b0, exc_cause_r[4:0], 1'b0}; + assign interrupt_path[31:1] = take_nmi ? nmi_vec[31:1] : ((mtvec[0] == 1'b1) ? vectored_path[31:1] : {mtvec[30:1], 1'b0}); + + assign sel_npc_r = lsu_i0_rfnpc_r | fence_i_r | iccm_repair_state_rfnpc | (i_cpu_run_req_d1 & ~interrupt_valid_r) | (rfpc_i0_r & ~dec_tlu_i0_valid_r); + assign sel_npc_resume = (i_cpu_run_req_d1 & pmu_fw_tlu_halted_f) | pause_expired_r; + + assign sel_fir_addr = take_ext_int_start_d3 & ~|lsu_fir_error[1:0]; + + assign synchronous_flush_r = i0_exception_valid_r | // exception + rfpc_i0_r | // rfpc + lsu_exc_valid_r | // lsu exception in either pipe 0 or pipe 1 + fence_i_r | // fence, a rfnpc + lsu_i0_rfnpc_r | // lsu dccm sb ecc + iccm_repair_state_rfnpc | // Iccm sb ecc + debug_resume_req_f | // resume from debug halt, fetch the dpc + sel_npc_resume | // resume from pmu/fw halt, or from pause and fetch the NPC + dec_tlu_wr_pause_r_d1 | // flush at start of pause + i0_trigger_hit_r; // trigger hit, ebreak or goto debug mode + + assign tlu_flush_lower_r = interrupt_valid_r | mret_r | synchronous_flush_r | take_halt | take_reset | take_ext_int_start; + + assign tlu_flush_path_r[31:1] = take_reset ? rst_vec[31:1] : + + ( ({31{sel_fir_addr}} & lsu_fir_addr[31:1]) | + ({31{~take_nmi & sel_npc_r}} & npc_r[31:1]) | + ({31{~take_nmi & rfpc_i0_r & dec_tlu_i0_valid_r & ~sel_npc_r}} & dec_tlu_i0_pc_r[31:1]) | + ({31{interrupt_valid_r & ~sel_fir_addr}} & interrupt_path[31:1]) | + ({31{(i0_exception_valid_r | lsu_exc_valid_r | + (i0_trigger_hit_r & ~trigger_hit_dmode_r)) & ~interrupt_valid_r & ~sel_fir_addr}} & {mtvec[30:1],1'b0}) | + ({31{~take_nmi & mret_r}} & mepc[31:1]) | + ({31{~take_nmi & debug_resume_req_f}} & dpc[31:1]) | + ({31{~take_nmi & sel_npc_resume}} & npc_r_d1[31:1]) ); + + rvdff #(31) flush_lower_ff (.*, .clk(e4e5_int_clk), + .din({tlu_flush_path_r[31:1]}), + .dout({tlu_flush_path_r_d1[31:1]})); + + assign dec_tlu_flush_lower_wb = tlu_flush_lower_r_d1; + assign dec_tlu_flush_lower_r = tlu_flush_lower_r; + assign dec_tlu_flush_path_r[31:1] = tlu_flush_path_r[31:1]; + + + // this is used to capture mepc, etc. + assign exc_or_int_valid_r = lsu_exc_valid_r | i0_exception_valid_r | interrupt_valid_r | (i0_trigger_hit_r & ~trigger_hit_dmode_r); + + + rvdff #(12) excinfo_wb_ff (.*, .clk(e4e5_int_clk), + .din({interrupt_valid_r, i0_exception_valid_r, exc_or_int_valid_r, + exc_cause_r[4:0], tlu_i0_commit_cmt & ~illegal_r, i0_trigger_hit_r, + take_nmi, pause_expired_r }), + .dout({interrupt_valid_r_d1, i0_exception_valid_r_d1, exc_or_int_valid_r_d1, + exc_cause_wb[4:0], i0_valid_wb, trigger_hit_r_d1, + take_nmi_r_d1, pause_expired_wb})); + + //---------------------------------------------------------------------- + // + // CSRs + // + //---------------------------------------------------------------------- + + + // ---------------------------------------------------------------------- + // MISA (RO) + // [31:30] XLEN - implementation width, 2'b01 - 32 bits + // [12] M - integer mul/div + // [8] I - RV32I + // [2] C - Compressed extension + `define MISA 12'h301 + + // MVENDORID, MARCHID, MIMPID, MHARTID + `define MVENDORID 12'hf11 + `define MARCHID 12'hf12 + `define MIMPID 12'hf13 + `define MHARTID 12'hf14 + + + // ---------------------------------------------------------------------- + // MSTATUS (RW) + // [12:11] MPP : Prior priv level, always 2'b11, not flopped + // [7] MPIE : Int enable previous [1] + // [3] MIE : Int enable [0] + `define MSTATUS 12'h300 + + + //When executing a MRET instruction, supposing MPP holds the value 3, MIE + //is set to MPIE; the privilege mode is changed to 3; MPIE is set to 1; and MPP is set to 3 + + assign dec_csr_wen_r_mod = dec_csr_wen_r & ~i0_trigger_hit_r & ~rfpc_i0_r; + assign wr_mstatus_r = dec_csr_wen_r_mod & (dec_csr_wraddr_r[11:0] == `MSTATUS); + + // set this even if we don't go to fwhalt due to debug halt. We committed the inst, so ... + assign set_mie_pmu_fw_halt = ~mpmc_b_ns[1] & fw_halt_req; + + assign mstatus_ns[1:0] = ( ({2{~wr_mstatus_r & exc_or_int_valid_r}} & {mstatus[`MSTATUS_MIE], 1'b0}) | + ({2{ wr_mstatus_r & exc_or_int_valid_r}} & {dec_csr_wrdata_r[3], 1'b0}) | + ({2{mret_r & ~exc_or_int_valid_r}} & {1'b1, mstatus[1]}) | + ({2{set_mie_pmu_fw_halt}} & {mstatus[1], 1'b1}) | + ({2{wr_mstatus_r & ~exc_or_int_valid_r}} & {dec_csr_wrdata_r[7], dec_csr_wrdata_r[3]}) | + ({2{~wr_mstatus_r & ~exc_or_int_valid_r & ~mret_r & ~set_mie_pmu_fw_halt}} & mstatus[1:0]) ); + + // gate MIE if we are single stepping and DCSR[STEPIE] is off + assign mstatus_mie_ns = mstatus[`MSTATUS_MIE] & (~dcsr_single_step_running_f | dcsr[`DCSR_STEPIE]); + rvdff #(2) mstatus_ff (.*, .clk(free_clk), .din(mstatus_ns[1:0]), .dout(mstatus[1:0])); + + // ---------------------------------------------------------------------- + // MTVEC (RW) + // [31:2] BASE : Trap vector base address + // [1] - Reserved, not implemented, reads zero + // [0] MODE : 0 = Direct, 1 = Asyncs are vectored to BASE + (4 * CAUSE) + `define MTVEC 12'h305 + + assign wr_mtvec_r = dec_csr_wen_r_mod & (dec_csr_wraddr_r[11:0] == `MTVEC); + assign mtvec_ns[30:0] = {dec_csr_wrdata_r[31:2], dec_csr_wrdata_r[0]} ; + rvdffe #(31) mtvec_ff (.*, .en(wr_mtvec_r), .din(mtvec_ns[30:0]), .dout(mtvec[30:0])); + + // ---------------------------------------------------------------------- + // MIP (RW) + // + // [30] MCEIP : (RO) M-Mode Correctable Error interrupt pending + // [11] MEIP : (RO) M-Mode external interrupt pending + // [7] MTIP : (RO) M-Mode timer interrupt pending + // [3] MSIP : (RO) M-Mode software interrupt pending + `define MIP 12'h344 + + assign ce_int = (mdccme_ce_req | miccme_ce_req | mice_ce_req); + + assign mip_ns[3:0] = {ce_int, mexintpend, timer_int_sync, soft_int_sync}; + rvdff #(4) mip_ff (.*, .clk(free_clk), .din(mip_ns[3:0]), .dout(mip[3:0])); + + // ---------------------------------------------------------------------- + // MIE (RW) + // [30] MCEIE : (RO) M-Mode Correctable Error interrupt enable + // [11] MEIE : (RW) M-Mode external interrupt enable + // [7] MTIE : (RW) M-Mode timer interrupt enable + // [3] MSIE : (RW) M-Mode software interrupt enable + `define MIE 12'h304 + + assign wr_mie_r = dec_csr_wen_r_mod & (dec_csr_wraddr_r[11:0] == `MIE); + assign mie_ns[3:0] = wr_mie_r ? {dec_csr_wrdata_r[30], dec_csr_wrdata_r[11], dec_csr_wrdata_r[7], dec_csr_wrdata_r[3]} : mie[3:0]; + rvdff #(4) mie_ff (.*, .clk(csr_wr_clk), .din(mie_ns[3:0]), .dout(mie[3:0])); + + + // ---------------------------------------------------------------------- + // MCYCLEL (RW) + // [31:0] : Lower Cycle count + + `define MCYCLEL 12'hb00 + + assign kill_ebreak_count_r = ebreak_to_debug_mode_r & dcsr[`DCSR_STOPC]; + + assign wr_mcyclel_r = dec_csr_wen_r_mod & (dec_csr_wraddr_r[11:0] == `MCYCLEL); + + assign mcyclel_cout_in = ~(kill_ebreak_count_r | (dec_tlu_dbg_halted & dcsr[`DCSR_STOPC]) | dec_tlu_pmu_fw_halted | mcountinhibit[0]); + + assign {mcyclel_cout, mcyclel_inc[31:0]} = mcyclel[31:0] + {31'b0, mcyclel_cout_in}; + assign mcyclel_ns[31:0] = wr_mcyclel_r ? dec_csr_wrdata_r[31:0] : mcyclel_inc[31:0]; + + rvdffe #(32) mcyclel_ff (.*, .en(wr_mcyclel_r | mcyclel_cout_in), .din(mcyclel_ns[31:0]), .dout(mcyclel[31:0])); + rvdff #(1) mcyclef_cout_ff (.*, .clk(free_clk), .din(mcyclel_cout & ~wr_mcycleh_r), .dout(mcyclel_cout_f)); + // ---------------------------------------------------------------------- + // MCYCLEH (RW) + // [63:32] : Higher Cycle count + // Chained with mcyclel. Note: mcyclel overflow due to a mcycleh write gets ignored. + + `define MCYCLEH 12'hb80 + + assign wr_mcycleh_r = dec_csr_wen_r_mod & (dec_csr_wraddr_r[11:0] == `MCYCLEH); + + assign mcycleh_inc[31:0] = mcycleh[31:0] + {31'b0, mcyclel_cout_f}; + assign mcycleh_ns[31:0] = wr_mcycleh_r ? dec_csr_wrdata_r[31:0] : mcycleh_inc[31:0]; + + rvdffe #(32) mcycleh_ff (.*, .en(wr_mcycleh_r | mcyclel_cout_f), .din(mcycleh_ns[31:0]), .dout(mcycleh[31:0])); + + // ---------------------------------------------------------------------- + // MINSTRETL (RW) + // [31:0] : Lower Instruction retired count + // From the spec "Some CSRs, such as the instructions retired counter, instret, may be modified as side effects + // of instruction execution. In these cases, if a CSR access instruction reads a CSR, it reads the + // value prior to the execution of the instruction. If a CSR access instruction writes a CSR, the + // update occurs after the execution of the instruction. In particular, a value written to instret by + // one instruction will be the value read by the following instruction (i.e., the increment of instret + // caused by the first instruction retiring happens before the write of the new value)." + `define MINSTRETL 12'hb02 + + assign i0_valid_no_ebreak_ecall_r = tlu_i0_commit_cmt & ~(ebreak_r | ecall_r | ebreak_to_debug_mode_r | illegal_r | mcountinhibit[2]); + + assign wr_minstretl_r = dec_csr_wen_r_mod & (dec_csr_wraddr_r[11:0] == `MINSTRETL); + + assign {minstretl_cout, minstretl_inc[31:0]} = minstretl[31:0] + {31'b0,i0_valid_no_ebreak_ecall_r}; + + assign minstret_enable = i0_valid_no_ebreak_ecall_r | wr_minstretl_r; + + assign minstretl_ns[31:0] = wr_minstretl_r ? dec_csr_wrdata_r[31:0] : minstretl_inc[31:0]; + rvdffe #(32) minstretl_ff (.*, .en(minstret_enable), .din(minstretl_ns[31:0]), .dout(minstretl[31:0])); + rvdff #(2) minstretf_cout_ff (.*, .clk(free_clk), .din({minstret_enable, minstretl_cout & ~wr_minstreth_r}), .dout({minstret_enable_f, minstretl_cout_f})); + + assign minstretl_read[31:0] = minstretl[31:0]; + // ---------------------------------------------------------------------- + // MINSTRETH (RW) + // [63:32] : Higher Instret count + // Chained with minstretl. Note: minstretl overflow due to a minstreth write gets ignored. + + `define MINSTRETH 12'hb82 + + assign wr_minstreth_r = dec_csr_wen_r_mod & (dec_csr_wraddr_r[11:0] == `MINSTRETH); + + assign minstreth_inc[31:0] = minstreth[31:0] + {31'b0, minstretl_cout_f}; + assign minstreth_ns[31:0] = wr_minstreth_r ? dec_csr_wrdata_r[31:0] : minstreth_inc[31:0]; + rvdffe #(32) minstreth_ff (.*, .en(minstret_enable_f | wr_minstreth_r), .din(minstreth_ns[31:0]), .dout(minstreth[31:0])); + + assign minstreth_read[31:0] = minstreth_inc[31:0]; + + // ---------------------------------------------------------------------- + // MSCRATCH (RW) + // [31:0] : Scratch register + `define MSCRATCH 12'h340 + + assign wr_mscratch_r = dec_csr_wen_r_mod & (dec_csr_wraddr_r[11:0] == `MSCRATCH); + + rvdffe #(32) mscratch_ff (.*, .en(wr_mscratch_r), .din(dec_csr_wrdata_r[31:0]), .dout(mscratch[31:0])); + + // ---------------------------------------------------------------------- + // MEPC (RW) + // [31:1] : Exception PC + `define MEPC 12'h341 + + // NPC + + assign sel_exu_npc_r = ~dec_tlu_dbg_halted & ~tlu_flush_lower_r_d1 & dec_tlu_i0_valid_r; + assign sel_flush_npc_r = ~dec_tlu_dbg_halted & tlu_flush_lower_r_d1 & ~dec_tlu_flush_noredir_r_d1; + assign sel_hold_npc_r = ~sel_exu_npc_r & ~sel_flush_npc_r; + + assign npc_r[31:1] = ( ({31{sel_exu_npc_r}} & exu_npc_r[31:1]) | + ({31{~mpc_reset_run_req & reset_delayed}} & rst_vec[31:1]) | // init to reset vector for mpc halt on reset case + ({31{(sel_flush_npc_r)}} & tlu_flush_path_r_d1[31:1]) | + ({31{(sel_hold_npc_r)}} & npc_r_d1[31:1]) ); + + rvdffe #(31) npwbc_ff (.*, .en(sel_exu_npc_r | sel_flush_npc_r | reset_delayed), .din(npc_r[31:1]), .dout(npc_r_d1[31:1])); + + // PC has to be captured for exceptions and interrupts. For MRET, we could execute it and then take an + // interrupt before the next instruction. + assign pc0_valid_r = ~dec_tlu_dbg_halted & dec_tlu_i0_valid_r; + + assign pc_r[31:1] = ( ({31{ pc0_valid_r}} & dec_tlu_i0_pc_r[31:1]) | + ({31{~pc0_valid_r}} & pc_r_d1[31:1])); + + rvdffe #(31) pwbc_ff (.*, .en(pc0_valid_r), .din(pc_r[31:1]), .dout(pc_r_d1[31:1])); + + assign wr_mepc_r = dec_csr_wen_r_mod & (dec_csr_wraddr_r[11:0] == `MEPC); + + assign mepc_ns[31:1] = ( ({31{i0_exception_valid_r | lsu_exc_valid_r | mepc_trigger_hit_sel_pc_r}} & pc_r[31:1]) | + ({31{interrupt_valid_r}} & npc_r[31:1]) | + ({31{wr_mepc_r & ~exc_or_int_valid_r}} & dec_csr_wrdata_r[31:1]) | + ({31{~wr_mepc_r & ~exc_or_int_valid_r}} & mepc[31:1]) ); + + + rvdff #(31) mepc_ff (.*, .clk(e4e5_int_clk), .din(mepc_ns[31:1]), .dout(mepc[31:1])); + + // ---------------------------------------------------------------------- + // MCAUSE (RW) + // [31:0] : Exception Cause + `define MCAUSE 12'h342 + + assign wr_mcause_r = dec_csr_wen_r_mod & (dec_csr_wraddr_r[11:0] == `MCAUSE); + assign mcause_sel_nmi_store = exc_or_int_valid_r & take_nmi & nmi_lsu_store_type; + assign mcause_sel_nmi_load = exc_or_int_valid_r & take_nmi & nmi_lsu_load_type; + assign mcause_sel_nmi_ext = exc_or_int_valid_r & take_nmi & |lsu_fir_error[1:0]; + // FIR value decoder + // 0 –no error + // 1 –uncorrectable ecc => f000_1000 + // 2 –dccm region access error => f000_1001 + // 3 –non dccm region access error => f000_1002 + assign mcause_fir_error_type[1:0] = {&lsu_fir_error[1:0], lsu_fir_error[1] & ~lsu_fir_error[0]}; + + assign mcause_ns[31:0] = ( ({32{mcause_sel_nmi_store}} & {32'hf000_0000}) | + ({32{mcause_sel_nmi_load}} & {32'hf000_0001}) | + ({32{mcause_sel_nmi_ext}} & {28'hf000_100, 2'b0, mcause_fir_error_type[1:0]}) | + ({32{exc_or_int_valid_r & ~take_nmi}} & {interrupt_valid_r, 26'b0, exc_cause_r[4:0]}) | + ({32{wr_mcause_r & ~exc_or_int_valid_r}} & dec_csr_wrdata_r[31:0]) | + ({32{~wr_mcause_r & ~exc_or_int_valid_r}} & mcause[31:0]) ); + + rvdff #(32) mcause_ff (.*, .clk(e4e5_int_clk), .din(mcause_ns[31:0]), .dout(mcause[31:0])); + // ---------------------------------------------------------------------- + // MSCAUSE (RW) + // [2:0] : Secondary exception Cause + `define MSCAUSE 12'h7ff + + assign wr_mscause_r = dec_csr_wen_r_mod & (dec_csr_wraddr_r[11:0] == `MSCAUSE); + + assign mscause_type[2:0] = ( ({3{lsu_i0_exc_r}} & lsu_error_pkt_r.mscause[2:0]) | + ({3{i0_trigger_hit_r}} & 3'b001) | + ({3{inst_acc_r}} & {1'b0,dec_tlu_packet_r.icaf_type[1:0]}) + ); + + + assign mscause_ns[2:0] = ( ({3{exc_or_int_valid_r}} & mscause_type[2:0]) | + ({3{ wr_mscause_r & ~exc_or_int_valid_r}} & dec_csr_wrdata_r[2:0]) | + ({3{~wr_mscause_r & ~exc_or_int_valid_r}} & mscause[2:0]) + ); + + rvdff #(3) mscause_ff (.*, .clk(e4e5_int_clk), .din(mscause_ns[2:0]), .dout(mscause[2:0])); + // ---------------------------------------------------------------------- + // MTVAL (RW) + // [31:0] : Exception address if relevant + `define MTVAL 12'h343 + + assign wr_mtval_r = dec_csr_wen_r_mod & (dec_csr_wraddr_r[11:0] == `MTVAL); + assign mtval_capture_pc_r = exc_or_int_valid_r & (ebreak_r | (inst_acc_r & ~inst_acc_second_r) | mepc_trigger_hit_sel_pc_r) & ~take_nmi; + assign mtval_capture_pc_plus2_r = exc_or_int_valid_r & (inst_acc_r & inst_acc_second_r) & ~take_nmi; + assign mtval_capture_inst_r = exc_or_int_valid_r & illegal_r & ~take_nmi; + assign mtval_capture_lsu_r = exc_or_int_valid_r & lsu_exc_valid_r & ~take_nmi; + assign mtval_clear_r = exc_or_int_valid_r & ~mtval_capture_pc_r & ~mtval_capture_inst_r & ~mtval_capture_lsu_r & ~mepc_trigger_hit_sel_pc_r; + + + assign mtval_ns[31:0] = (({32{mtval_capture_pc_r}} & {pc_r[31:1], 1'b0}) | + ({32{mtval_capture_pc_plus2_r}} & {pc_r[31:1] + 31'b1, 1'b0}) | + ({32{mtval_capture_inst_r}} & dec_illegal_inst[31:0]) | + ({32{mtval_capture_lsu_r}} & lsu_error_pkt_addr_r[31:0]) | + ({32{wr_mtval_r & ~interrupt_valid_r}} & dec_csr_wrdata_r[31:0]) | + ({32{~take_nmi & ~wr_mtval_r & ~mtval_capture_pc_r & ~mtval_capture_inst_r & ~mtval_clear_r & ~mtval_capture_lsu_r}} & mtval[31:0]) ); + + + rvdff #(32) mtval_ff (.*, .clk(e4e5_int_clk), .din(mtval_ns[31:0]), .dout(mtval[31:0])); + + // ---------------------------------------------------------------------- + // MCGC (RW) Clock gating control + // [31:9] : Reserved, reads 0x0 + // [8] : misc_clk_override + // [7] : dec_clk_override + // [6] : unused + // [5] : ifu_clk_override + // [4] : lsu_clk_override + // [3] : bus_clk_override + // [2] : pic_clk_override + // [1] : dccm_clk_override + // [0] : icm_clk_override + // + `define MCGC 12'h7f8 + assign wr_mcgc_r = dec_csr_wen_r_mod & (dec_csr_wraddr_r[11:0] == `MCGC); + + rvdffe #(9) mcgc_ff (.*, .en(wr_mcgc_r), .din(dec_csr_wrdata_r[8:0]), .dout(mcgc[8:0])); + + assign dec_tlu_misc_clk_override = mcgc[8]; + assign dec_tlu_dec_clk_override = mcgc[7]; + assign dec_tlu_ifu_clk_override = mcgc[5]; + assign dec_tlu_lsu_clk_override = mcgc[4]; + assign dec_tlu_bus_clk_override = mcgc[3]; + assign dec_tlu_pic_clk_override = mcgc[2]; + assign dec_tlu_dccm_clk_override = mcgc[1]; + assign dec_tlu_icm_clk_override = mcgc[0]; + + // ---------------------------------------------------------------------- + // MFDC (RW) Feature Disable Control + // [31:19] : Reserved, reads 0x0 + // [18:16] : DMA QoS Prty + // [15:12] : Reserved, reads 0x0 + // [11] : Disable external load forwarding + // [10] : Disable dual issue + // [9] : Disable pic multiple ints + // [8] : Disable core ecc + // [7] : Unused, 0x0 + // [6] : Disable Sideeffect lsu posting + // [5:4] : Unused, 0x0 + // [3] : Disable branch prediction and return stack + // [2] : Disable write buffer coalescing + // [1] : Unused, 0x0 + // [0] : Disable pipelining - Enable single instruction execution + // + `define MFDC 12'h7f9 + + assign wr_mfdc_r = dec_csr_wen_r_mod & (dec_csr_wraddr_r[11:0] == `MFDC); + + rvdffe #(15) mfdc_ff (.*, .en(wr_mfdc_r), .din({mfdc_ns[14:0]}), .dout(mfdc_int[14:0])); + +if(pt.BUILD_AXI4==1) begin : axi4 + // flip poweron value of bit 6 for AXI build + assign mfdc_ns[14:0] = {~dec_csr_wrdata_r[18:16],dec_csr_wrdata_r[11:7], ~dec_csr_wrdata_r[6], dec_csr_wrdata_r[5:0]}; + assign mfdc[18:0] = {~mfdc_int[14:12], 4'b0, mfdc_int[11:7], ~mfdc_int[6], mfdc_int[5:0]}; +end +else begin + assign mfdc_ns[14:0] = {~dec_csr_wrdata_r[18:16],dec_csr_wrdata_r[11:0]}; + assign mfdc[18:0] = {~mfdc_int[14:12], 4'b0, mfdc_int[11:0]}; +end + + + assign dec_tlu_dma_qos_prty[2:0] = mfdc[18:16]; + assign dec_tlu_external_ldfwd_disable = mfdc[11]; + assign dec_tlu_core_ecc_disable = mfdc[8]; + assign dec_tlu_sideeffect_posted_disable = mfdc[6]; + assign dec_tlu_bpred_disable = mfdc[3]; + assign dec_tlu_wb_coalescing_disable = mfdc[2]; + assign dec_tlu_pipelining_disable = mfdc[0]; + + // ---------------------------------------------------------------------- + // MCPC (RW) Pause counter + // [31:0] : Reads 0x0, decs in the wb register in decode_ctl + + assign dec_tlu_wr_pause_r = dec_csr_wen_r_mod & (dec_csr_wraddr_r[11:0] == `MCPC) & ~interrupt_valid_r & ~take_ext_int_start; + + // ---------------------------------------------------------------------- + // MRAC (RW) + // [31:0] : Region Access Control Register, 16 regions, {side_effect, cachable} pairs + `define MRAC 12'h7c0 + + assign wr_mrac_r = dec_csr_wen_r_mod & (dec_csr_wraddr_r[11:0] == `MRAC); + + // prevent pairs of 0x11, side_effect and cacheable + assign mrac_in[31:0] = {dec_csr_wrdata_r[31], dec_csr_wrdata_r[30] & ~dec_csr_wrdata_r[31], + dec_csr_wrdata_r[29], dec_csr_wrdata_r[28] & ~dec_csr_wrdata_r[29], + dec_csr_wrdata_r[27], dec_csr_wrdata_r[26] & ~dec_csr_wrdata_r[27], + dec_csr_wrdata_r[25], dec_csr_wrdata_r[24] & ~dec_csr_wrdata_r[25], + dec_csr_wrdata_r[23], dec_csr_wrdata_r[22] & ~dec_csr_wrdata_r[23], + dec_csr_wrdata_r[21], dec_csr_wrdata_r[20] & ~dec_csr_wrdata_r[21], + dec_csr_wrdata_r[19], dec_csr_wrdata_r[18] & ~dec_csr_wrdata_r[19], + dec_csr_wrdata_r[17], dec_csr_wrdata_r[16] & ~dec_csr_wrdata_r[17], + dec_csr_wrdata_r[15], dec_csr_wrdata_r[14] & ~dec_csr_wrdata_r[15], + dec_csr_wrdata_r[13], dec_csr_wrdata_r[12] & ~dec_csr_wrdata_r[13], + dec_csr_wrdata_r[11], dec_csr_wrdata_r[10] & ~dec_csr_wrdata_r[11], + dec_csr_wrdata_r[9], dec_csr_wrdata_r[8] & ~dec_csr_wrdata_r[9], + dec_csr_wrdata_r[7], dec_csr_wrdata_r[6] & ~dec_csr_wrdata_r[7], + dec_csr_wrdata_r[5], dec_csr_wrdata_r[4] & ~dec_csr_wrdata_r[5], + dec_csr_wrdata_r[3], dec_csr_wrdata_r[2] & ~dec_csr_wrdata_r[3], + dec_csr_wrdata_r[1], dec_csr_wrdata_r[0] & ~dec_csr_wrdata_r[1]}; + + rvdffe #(32) mrac_ff (.*, .en(wr_mrac_r), .din(mrac_in[31:0]), .dout(mrac[31:0])); + + // drive to LSU/IFU + assign dec_tlu_mrac_ff[31:0] = mrac[31:0]; + + // ---------------------------------------------------------------------- + // MDEAU (WAR0) + // [31:0] : Dbus Error Address Unlock register + // + `define MDEAU 12'hbc0 + + assign wr_mdeau_r = dec_csr_wen_r_mod & (dec_csr_wraddr_r[11:0] == `MDEAU); + + + // ---------------------------------------------------------------------- + // MDSEAC (R) + // [31:0] : Dbus Store Error Address Capture register + // + `define MDSEAC 12'hfc0 + + // only capture error bus if the MDSEAC reg is not locked + assign mdseac_locked_ns = mdseac_en | (mdseac_locked_f & ~wr_mdeau_r); + + assign mdseac_en = (lsu_imprecise_error_store_any | lsu_imprecise_error_load_any) & ~nmi_int_detected_f & ~mdseac_locked_f; + + rvdffe #(32) mdseac_ff (.*, .en(mdseac_en), .din(lsu_imprecise_error_addr_any[31:0]), .dout(mdseac[31:0])); + + // ---------------------------------------------------------------------- + // MPMC (R0W1) + // [0] : FW halt + // [1] : Set MSTATUS[MIE] on halt + + `define MPMC 12'h7c6 + + assign wr_mpmc_r = dec_csr_wen_r_mod & (dec_csr_wraddr_r[11:0] == `MPMC); + + // allow the cycle of the dbg halt flush that contains the wr_mpmc_r to + // set the mstatus bit potentially, use delayed version of internal dbg halt. + assign fw_halt_req = wr_mpmc_r & dec_csr_wrdata_r[0] & ~internal_dbg_halt_mode_f2 & ~ext_int_freeze_d1; + + assign fw_halted_ns = (fw_halt_req | fw_halted) & ~set_mie_pmu_fw_halt; + assign mpmc_b_ns[1] = wr_mpmc_r ? ~dec_csr_wrdata_r[1] : ~mpmc[1]; + rvdff #(1) mpmc_ff (.*, .clk(csr_wr_clk), .din(mpmc_b_ns[1]), .dout(mpmc_b[1])); + rvdff #(1) fwh_ff (.*, .clk(free_clk), .din(fw_halted_ns), .dout(fw_halted)); + assign mpmc[1] = ~mpmc_b[1]; + + // ---------------------------------------------------------------------- + // MICECT (I-Cache error counter/threshold) + // [31:27] : Icache parity error threshold + // [26:0] : Icache parity error count + `define MICECT 12'h7f0 + + assign csr_sat[31:27] = (dec_csr_wrdata_r[31:27] > 5'd26) ? 5'd26 : dec_csr_wrdata_r[31:27]; + + assign wr_micect_r = dec_csr_wen_r_mod & (dec_csr_wraddr_r[11:0] == `MICECT); + assign micect_inc[26:0] = micect[26:0] + {26'b0, ic_perr_r_d1}; + assign micect_ns = wr_micect_r ? {csr_sat[31:27], dec_csr_wrdata_r[26:0]} : {micect[31:27], micect_inc[26:0]}; + + rvdffe #(32) micect_ff (.*, .en(wr_micect_r | ic_perr_r_d1), .din(micect_ns[31:0]), .dout(micect[31:0])); + + assign mice_ce_req = |({32'hffffffff << micect[31:27]} & {5'b0, micect[26:0]}); + + // ---------------------------------------------------------------------- + // MICCMECT (ICCM error counter/threshold) + // [31:27] : ICCM parity error threshold + // [26:0] : ICCM parity error count + `define MICCMECT 12'h7f1 + + assign wr_miccmect_r = dec_csr_wen_r_mod & (dec_csr_wraddr_r[11:0] == `MICCMECT); + assign miccmect_inc[26:0] = miccmect[26:0] + {26'b0, iccm_sbecc_r_d1 | iccm_dma_sb_error}; + assign miccmect_ns = wr_miccmect_r ? {csr_sat[31:27], dec_csr_wrdata_r[26:0]} : {miccmect[31:27], miccmect_inc[26:0]}; + + rvdffe #(32) miccmect_ff (.*, .en(wr_miccmect_r | iccm_sbecc_r_d1 | iccm_dma_sb_error), .din(miccmect_ns[31:0]), .dout(miccmect[31:0])); + + assign miccme_ce_req = |({32'hffffffff << miccmect[31:27]} & {5'b0, miccmect[26:0]}); + + // ---------------------------------------------------------------------- + // MDCCMECT (DCCM error counter/threshold) + // [31:27] : DCCM parity error threshold + // [26:0] : DCCM parity error count + `define MDCCMECT 12'h7f2 + + assign wr_mdccmect_r = dec_csr_wen_r_mod & (dec_csr_wraddr_r[11:0] == `MDCCMECT); + assign mdccmect_inc[26:0] = mdccmect[26:0] + {26'b0, lsu_single_ecc_error_r_d1}; + assign mdccmect_ns = wr_mdccmect_r ? {csr_sat[31:27], dec_csr_wrdata_r[26:0]} : {mdccmect[31:27], mdccmect_inc[26:0]}; + + rvdffe #(32) mdccmect_ff (.*, .en(wr_mdccmect_r | lsu_single_ecc_error_r_d1), .din(mdccmect_ns[31:0]), .dout(mdccmect[31:0])); + + assign mdccme_ce_req = |({32'hffffffff << mdccmect[31:27]} & {5'b0, mdccmect[26:0]}); + + + // ---------------------------------------------------------------------- + // MFDHT (Force Debug Halt Threshold) + // [5:1] : Halt timeout threshold (power of 2) + // [0] : Halt timeout enabled + `define MFDHT 12'h7ce + + assign wr_mfdht_r = dec_csr_wen_r_mod & (dec_csr_wraddr_r[11:0] == `MFDHT); + + assign mfdht_ns[5:0] = wr_mfdht_r ? dec_csr_wrdata_r[5:0] : mfdht[5:0]; + + rvdff #(6) mfdht_ff (.*, .clk(active_clk), .din(mfdht_ns[5:0]), .dout(mfdht[5:0])); + + // ---------------------------------------------------------------------- + // MFDHS(RW) + // [1] : LSU operation pending when debug halt threshold reached + // [0] : IFU operation pending when debug halt threshold reached + + `define MFDHS 12'h7cf + + assign wr_mfdhs_r = dec_csr_wen_r_mod & (dec_csr_wraddr_r[11:0] == `MFDHS); + + assign mfdhs_ns[1:0] = wr_mfdhs_r ? dec_csr_wrdata_r[1:0] : ((dbg_tlu_halted & ~dbg_tlu_halted_f) ? {~lsu_idle_any_f, ~ifu_miss_state_idle_f} : mfdhs[1:0]); + + rvdffs #(2) mfdhs_ff (.*, .clk(active_clk), .en(wr_mfdhs_r | dbg_tlu_halted), .din(mfdhs_ns[1:0]), .dout(mfdhs[1:0])); + + assign force_halt_ctr[31:0] = debug_halt_req_f ? (force_halt_ctr_f[31:0] + 32'b1) : (dbg_tlu_halted_f ? 32'b0 : force_halt_ctr_f[31:0]); + + rvdffs #(32) forcehaltctr_ff (.*, .clk(active_clk), .en(mfdht[0]), .din(force_halt_ctr[31:0]), .dout(force_halt_ctr_f[31:0])); + + assign force_halt = mfdht[0] & |(force_halt_ctr_f[31:0] & (32'hffffffff << mfdht[5:1])); + + + // ---------------------------------------------------------------------- + // MEIVT (External Interrupt Vector Table (R/W)) + // [31:10]: Base address (R/W) + // [9:0] : Reserved, reads 0x0 + `define MEIVT 12'hbc8 + + assign wr_meivt_r = dec_csr_wen_r_mod & (dec_csr_wraddr_r[11:0] == `MEIVT); + + rvdffe #(22) meivt_ff (.*, .en(wr_meivt_r), .din(dec_csr_wrdata_r[31:10]), .dout(meivt[31:10])); + + + // ---------------------------------------------------------------------- + // MEIHAP (External Interrupt Handler Access Pointer (R)) + // [31:10]: Base address (R/W) + // [9:2] : ClaimID (R) + // [1:0] : Reserved, 0x0 + `define MEIHAP 12'hfc8 + + assign wr_meihap_r = wr_meicpct_r; + + rvdffe #(8) meihap_ff (.*, .en(wr_meihap_r), .din(pic_claimid[7:0]), .dout(meihap[9:2])); + + assign dec_tlu_meihap[31:2] = {meivt[31:10], meihap[9:2]}; + // ---------------------------------------------------------------------- + // MEICURPL (R/W) + // [31:4] : Reserved (read 0x0) + // [3:0] : CURRPRI - Priority level of current interrupt service routine (R/W) + `define MEICURPL 12'hbcc + + assign wr_meicurpl_r = dec_csr_wen_r_mod & (dec_csr_wraddr_r[11:0] == `MEICURPL); + assign meicurpl_ns[3:0] = wr_meicurpl_r ? dec_csr_wrdata_r[3:0] : meicurpl[3:0]; + + rvdff #(4) meicurpl_ff (.*, .clk(csr_wr_clk), .din(meicurpl_ns[3:0]), .dout(meicurpl[3:0])); + + // PIC needs this reg + assign dec_tlu_meicurpl[3:0] = meicurpl[3:0]; + + + // ---------------------------------------------------------------------- + // MEICIDPL (R/W) + // [31:4] : Reserved (read 0x0) + // [3:0] : External Interrupt Claim ID's Priority Level Register + `define MEICIDPL 12'hbcb + + assign wr_meicidpl_r = (dec_csr_wen_r_mod & (dec_csr_wraddr_r[11:0] == `MEICIDPL)) | take_ext_int_start; + + assign meicidpl_ns[3:0] = wr_meicpct_r ? pic_pl[3:0] : (wr_meicidpl_r ? dec_csr_wrdata_r[3:0] : meicidpl[3:0]); + + rvdff #(4) meicidpl_ff (.*, .clk(free_clk), .din(meicidpl_ns[3:0]), .dout(meicidpl[3:0])); + + // ---------------------------------------------------------------------- + // MEICPCT (Capture CLAIMID in MEIHAP and PL in MEICIDPL + // [31:1] : Reserved (read 0x0) + // [0] : Capture (W1, Read 0) + `define MEICPCT 12'hbca + + assign wr_meicpct_r = (dec_csr_wen_r_mod & (dec_csr_wraddr_r[11:0] == `MEICPCT)) | take_ext_int_start; + + // ---------------------------------------------------------------------- + // MEIPT (External Interrupt Priority Threshold) + // [31:4] : Reserved (read 0x0) + // [3:0] : PRITHRESH + `define MEIPT 12'hbc9 + + assign wr_meipt_r = dec_csr_wen_r_mod & (dec_csr_wraddr_r[11:0] == `MEIPT); + assign meipt_ns[3:0] = wr_meipt_r ? dec_csr_wrdata_r[3:0] : meipt[3:0]; + + rvdff #(4) meipt_ff (.*, .clk(active_clk), .din(meipt_ns[3:0]), .dout(meipt[3:0])); + + // to PIC + assign dec_tlu_meipt[3:0] = meipt[3:0]; + // ---------------------------------------------------------------------- + // DCSR (R/W) (Only accessible in debug mode) + // [31:28] : xdebugver (hard coded to 0x4) RO + // [27:16] : 0x0, reserved + // [15] : ebreakm + // [14] : 0x0, reserved + // [13] : ebreaks (0x0 for this core) + // [12] : ebreaku (0x0 for this core) + // [11] : stepie + // [10] : stopcount + // [9] : 0x0 //stoptime + // [8:6] : cause (RO) + // [5:4] : 0x0, reserved + // [3] : nmip + // [2] : step + // [1:0] : prv (0x3 for this core) + // + `define DCSR 12'h7b0 + + // RV has clarified that 'priority 4' in the spec means top priority. + // 4. single step. 3. Debugger request. 2. Ebreak. 1. Trigger. + + // RV debug spec indicates a cause priority change for trigger hits during single step. + assign trigger_hit_for_dscr_cause_r_d1 = trigger_hit_dmode_r_d1 | (trigger_hit_r_d1 & dcsr_single_step_done_f); + + assign dcsr_cause[8:6] = ( ({3{dcsr_single_step_done_f & ~ebreak_to_debug_mode_r_d1 & ~trigger_hit_for_dscr_cause_r_d1 & ~debug_halt_req}} & 3'b100) | + ({3{debug_halt_req & ~ebreak_to_debug_mode_r_d1 & ~trigger_hit_for_dscr_cause_r_d1}} & 3'b011) | + ({3{ebreak_to_debug_mode_r_d1 & ~trigger_hit_for_dscr_cause_r_d1}} & 3'b001) | + ({3{trigger_hit_for_dscr_cause_r_d1}} & 3'b010)); + + assign wr_dcsr_r = allow_dbg_halt_csr_write & dec_csr_wen_r_mod & (dec_csr_wraddr_r[11:0] == `DCSR); + + + + // Multiple halt enter requests can happen before we are halted. + // We have to continue to upgrade based on dcsr_cause priority but we can't downgrade. + assign dcsr_cause_upgradeable = internal_dbg_halt_mode_f & (dcsr[8:6] == 3'b011); + assign enter_debug_halt_req_le = enter_debug_halt_req & (~dbg_tlu_halted | dcsr_cause_upgradeable); + + assign nmi_in_debug_mode = nmi_int_detected_f & internal_dbg_halt_mode_f; + assign dcsr_ns[15:2] = enter_debug_halt_req_le ? {dcsr[15:9], dcsr_cause[8:6], dcsr[5:2]} : + (wr_dcsr_r ? {dec_csr_wrdata_r[15], 3'b0, dec_csr_wrdata_r[11:10], 1'b0, dcsr[8:6], 2'b00, nmi_in_debug_mode | dcsr[3], dec_csr_wrdata_r[2]} : + {dcsr[15:4], nmi_in_debug_mode, dcsr[2]}); + + rvdffe #(14) dcsr_ff (.*, .en(enter_debug_halt_req_le | wr_dcsr_r | internal_dbg_halt_mode | take_nmi), .din(dcsr_ns[15:2]), .dout(dcsr[15:2])); + + // ---------------------------------------------------------------------- + // DPC (R/W) (Only accessible in debug mode) + // [31:0] : Debug PC + `define DPC 12'h7b1 + + assign wr_dpc_r = allow_dbg_halt_csr_write & dec_csr_wen_r_mod & (dec_csr_wraddr_r[11:0] == `DPC); + assign dpc_capture_npc = dbg_tlu_halted & ~dbg_tlu_halted_f & ~request_debug_mode_done; + assign dpc_capture_pc = request_debug_mode_r; + + assign dpc_ns[31:1] = ( ({31{~dpc_capture_pc & ~dpc_capture_npc & wr_dpc_r}} & dec_csr_wrdata_r[31:1]) | + ({31{dpc_capture_pc}} & pc_r[31:1]) | + ({31{~dpc_capture_pc & dpc_capture_npc}} & npc_r[31:1]) ); + + rvdffe #(31) dpc_ff (.*, .en(wr_dpc_r | dpc_capture_pc | dpc_capture_npc), .din(dpc_ns[31:1]), .dout(dpc[31:1])); + + // ---------------------------------------------------------------------- + // DICAWICS (R/W) (Only accessible in debug mode) + // [31:25] : Reserved + // [24] : Array select, 0 is data, 1 is tag + // [23:22] : Reserved + // [21:20] : Way select + // [19:17] : Reserved + // [16:3] : Index + // [2:0] : Reserved + `define DICAWICS 12'h7c8 + + assign dicawics_ns[16:0] = {dec_csr_wrdata_r[24], dec_csr_wrdata_r[21:20], dec_csr_wrdata_r[16:3]}; + assign wr_dicawics_r = allow_dbg_halt_csr_write & dec_csr_wen_r_mod & (dec_csr_wraddr_r[11:0] == `DICAWICS); + + rvdffe #(17) dicawics_ff (.*, .en(wr_dicawics_r), .din(dicawics_ns[16:0]), .dout(dicawics[16:0])); + + // ---------------------------------------------------------------------- + // DICAD0 (R/W) (Only accessible in debug mode) + // + // If dicawics[array] is 0 + // [31:0] : inst data + // + // If dicawics[array] is 1 + // [31:16] : Tag + // [15:7] : Reserved + // [6:4] : LRU + // [3:1] : Reserved + // [0] : Valid + `define DICAD0 12'h7c9 + + assign dicad0_ns[31:0] = wr_dicad0_r ? dec_csr_wrdata_r[31:0] : ifu_ic_debug_rd_data[31:0]; + + assign wr_dicad0_r = allow_dbg_halt_csr_write & dec_csr_wen_r_mod & (dec_csr_wraddr_r[11:0] == `DICAD0); + + rvdffe #(32) dicad0_ff (.*, .en(wr_dicad0_r | ifu_ic_debug_rd_data_valid), .din(dicad0_ns[31:0]), .dout(dicad0[31:0])); + + // ---------------------------------------------------------------------- + // DICAD0H (R/W) (Only accessible in debug mode) + // + // If dicawics[array] is 0 + // [63:32] : inst data + // + `define DICAD0H 12'h7cc + + assign dicad0h_ns[31:0] = wr_dicad0h_r ? dec_csr_wrdata_r[31:0] : ifu_ic_debug_rd_data[63:32]; + + assign wr_dicad0h_r = allow_dbg_halt_csr_write & dec_csr_wen_r_mod & (dec_csr_wraddr_r[11:0] == `DICAD0H); + + rvdffe #(32) dicad0h_ff (.*, .en(wr_dicad0h_r | ifu_ic_debug_rd_data_valid), .din(dicad0h_ns[31:0]), .dout(dicad0h[31:0])); + + +if (pt.ICACHE_ECC == 1) begin + // ---------------------------------------------------------------------- + // DICAD1 (R/W) (Only accessible in debug mode) + // [6:0] : ECC + `define DICAD1 12'h7ca + + assign dicad1_ns[6:0] = wr_dicad1_r ? dec_csr_wrdata_r[6:0] : ifu_ic_debug_rd_data[70:64]; + + assign wr_dicad1_r = allow_dbg_halt_csr_write & dec_csr_wen_r_mod & (dec_csr_wraddr_r[11:0] == `DICAD1); + + rvdffs #(7) dicad1_ff (.*, .clk(active_clk), .en(wr_dicad1_r | ifu_ic_debug_rd_data_valid), .din(dicad1_ns[6:0]), .dout(dicad1_raw[6:0])); + + assign dicad1[31:0] = {25'b0, dicad1_raw[6:0]}; + +end +else begin + // ---------------------------------------------------------------------- + // DICAD1 (R/W) (Only accessible in debug mode) + // [3:0] : Parity + `define DICAD1 12'h7ca + + assign dicad1_ns[3:0] = wr_dicad1_r ? dec_csr_wrdata_r[3:0] : ifu_ic_debug_rd_data[67:64]; + + assign wr_dicad1_r = allow_dbg_halt_csr_write & dec_csr_wen_r_mod & (dec_csr_wraddr_r[11:0] == `DICAD1); + + rvdffs #(4) dicad1_ff (.*, .clk(active_clk), .en(wr_dicad1_r | ifu_ic_debug_rd_data_valid), .din(dicad1_ns[3:0]), .dout(dicad1_raw[3:0])); + + assign dicad1[31:0] = {28'b0, dicad1_raw[3:0]}; +end + // ---------------------------------------------------------------------- + // DICAGO (R/W) (Only accessible in debug mode) + // [0] : Go + `define DICAGO 12'h7cb + +if (pt.ICACHE_ECC == 1) + assign dec_tlu_ic_diag_pkt.icache_wrdata[70:0] = {dicad1[6:0], dicad0h[31:0], dicad0[31:0]}; +else + assign dec_tlu_ic_diag_pkt.icache_wrdata[67:0] = {dicad1[3:0], dicad0h[31:0], dicad0[31:0]}; + + + assign dec_tlu_ic_diag_pkt.icache_dicawics[16:0] = dicawics[16:0]; + + assign icache_rd_valid = allow_dbg_halt_csr_write & dec_csr_any_unq_d & dec_i0_decode_d & ~dec_csr_wen_unq_d & (dec_csr_rdaddr_d[11:0] == `DICAGO); + assign icache_wr_valid = allow_dbg_halt_csr_write & dec_csr_wen_r_mod & (dec_csr_wraddr_r[11:0] == `DICAGO); + + rvdff #(2) dicgo_ff (.*, .clk(active_clk), .din({icache_rd_valid, icache_wr_valid}), .dout({icache_rd_valid_f, icache_wr_valid_f})); + + assign dec_tlu_ic_diag_pkt.icache_rd_valid = icache_rd_valid_f; + assign dec_tlu_ic_diag_pkt.icache_wr_valid = icache_wr_valid_f; + + // ---------------------------------------------------------------------- + // MTSEL (R/W) + // [1:0] : Trigger select : 00, 01, 10 are data/address triggers. 11 is inst count + `define MTSEL 12'h7a0 + + assign wr_mtsel_r = dec_csr_wen_r_mod & (dec_csr_wraddr_r[11:0] == `MTSEL); + assign mtsel_ns[1:0] = wr_mtsel_r ? {dec_csr_wrdata_r[1:0]} : mtsel[1:0]; + + rvdff #(2) mtsel_ff (.*, .clk(csr_wr_clk), .din(mtsel_ns[1:0]), .dout(mtsel[1:0])); + + // ---------------------------------------------------------------------- + // MTDATA1 (R/W) + // [31:0] : Trigger Data 1 + `define MTDATA1 12'h7a1 + + // for triggers 0, 1, 2 and 3 aka Match Control + // [31:28] : type, hard coded to 0x2 + // [27] : dmode + // [26:21] : hard coded to 0x1f + // [20] : hit + // [19] : select (0 - address, 1 - data) + // [18] : timing, always 'before', reads 0x0 + // [17:12] : action, bits [17:13] not implemented and reads 0x0 + // [11] : chain + // [10:7] : match, bits [10:8] not implemented and reads 0x0 + // [6] : M + // [5:3] : not implemented, reads 0x0 + // [2] : execute + // [1] : store + // [0] : load + // + // decoder ring + // [27] : => 9 + // [20] : => 8 + // [19] : => 7 + // [12] : => 6 + // [11] : => 5 + // [7] : => 4 + // [6] : => 3 + // [2] : => 2 + // [1] : => 1 + // [0] : => 0 + + + // don't allow setting load-data. + assign tdata_load = dec_csr_wrdata_r[0] & ~dec_csr_wrdata_r[19]; + // don't allow setting execute-data. + assign tdata_opcode = dec_csr_wrdata_r[2] & ~dec_csr_wrdata_r[19]; + // don't allow clearing DMODE and action=1 + assign tdata_action = (dec_csr_wrdata_r[27] & dbg_tlu_halted_f) & dec_csr_wrdata_r[12]; + + assign tdata_wrdata_r[9:0] = {dec_csr_wrdata_r[27] & dbg_tlu_halted_f, + dec_csr_wrdata_r[20:19], + tdata_action, + dec_csr_wrdata_r[11], + dec_csr_wrdata_r[7:6], + tdata_opcode, + dec_csr_wrdata_r[1], + tdata_load}; + + // If the DMODE bit is set, tdata1 can only be updated in debug_mode + assign wr_mtdata1_t0_r = dec_csr_wen_r_mod & (dec_csr_wraddr_r[11:0] == `MTDATA1) & (mtsel[1:0] == 2'b0) & (~mtdata1_t0[`MTDATA1_DMODE] | dbg_tlu_halted_f); + assign mtdata1_t0_ns[9:0] = wr_mtdata1_t0_r ? tdata_wrdata_r[9:0] : + {mtdata1_t0[9], update_hit_bit_r[0] | mtdata1_t0[8], mtdata1_t0[7:0]}; + + assign wr_mtdata1_t1_r = dec_csr_wen_r_mod & (dec_csr_wraddr_r[11:0] == `MTDATA1) & (mtsel[1:0] == 2'b01) & (~mtdata1_t1[`MTDATA1_DMODE] | dbg_tlu_halted_f); + assign mtdata1_t1_ns[9:0] = wr_mtdata1_t1_r ? tdata_wrdata_r[9:0] : + {mtdata1_t1[9], update_hit_bit_r[1] | mtdata1_t1[8], mtdata1_t1[7:0]}; + + assign wr_mtdata1_t2_r = dec_csr_wen_r_mod & (dec_csr_wraddr_r[11:0] == `MTDATA1) & (mtsel[1:0] == 2'b10) & (~mtdata1_t2[`MTDATA1_DMODE] | dbg_tlu_halted_f); + assign mtdata1_t2_ns[9:0] = wr_mtdata1_t2_r ? tdata_wrdata_r[9:0] : + {mtdata1_t2[9], update_hit_bit_r[2] | mtdata1_t2[8], mtdata1_t2[7:0]}; + + assign wr_mtdata1_t3_r = dec_csr_wen_r_mod & (dec_csr_wraddr_r[11:0] == `MTDATA1) & (mtsel[1:0] == 2'b11) & (~mtdata1_t3[`MTDATA1_DMODE] | dbg_tlu_halted_f); + assign mtdata1_t3_ns[9:0] = wr_mtdata1_t3_r ? tdata_wrdata_r[9:0] : + {mtdata1_t3[9], update_hit_bit_r[3] | mtdata1_t3[8], mtdata1_t3[7:0]}; + + + rvdff #(10) mtdata1_t0_ff (.*, .clk(active_clk), .din(mtdata1_t0_ns[9:0]), .dout(mtdata1_t0[9:0])); + rvdff #(10) mtdata1_t1_ff (.*, .clk(active_clk), .din(mtdata1_t1_ns[9:0]), .dout(mtdata1_t1[9:0])); + rvdff #(10) mtdata1_t2_ff (.*, .clk(active_clk), .din(mtdata1_t2_ns[9:0]), .dout(mtdata1_t2[9:0])); + rvdff #(10) mtdata1_t3_ff (.*, .clk(active_clk), .din(mtdata1_t3_ns[9:0]), .dout(mtdata1_t3[9:0])); + + assign mtdata1_tsel_out[31:0] = ( ({32{(mtsel[1:0] == 2'b00)}} & {4'h2, mtdata1_t0[9], 6'b011111, mtdata1_t0[8:7], 6'b0, mtdata1_t0[6:5], 3'b0, mtdata1_t0[4:3], 3'b0, mtdata1_t0[2:0]}) | + ({32{(mtsel[1:0] == 2'b01)}} & {4'h2, mtdata1_t1[9], 6'b011111, mtdata1_t1[8:7], 6'b0, mtdata1_t1[6:5], 3'b0, mtdata1_t1[4:3], 3'b0, mtdata1_t1[2:0]}) | + ({32{(mtsel[1:0] == 2'b10)}} & {4'h2, mtdata1_t2[9], 6'b011111, mtdata1_t2[8:7], 6'b0, mtdata1_t2[6:5], 3'b0, mtdata1_t2[4:3], 3'b0, mtdata1_t2[2:0]}) | + ({32{(mtsel[1:0] == 2'b11)}} & {4'h2, mtdata1_t3[9], 6'b011111, mtdata1_t3[8:7], 6'b0, mtdata1_t3[6:5], 3'b0, mtdata1_t3[4:3], 3'b0, mtdata1_t3[2:0]})); + + assign trigger_pkt_any[0].select = mtdata1_t0[`MTDATA1_SEL]; + assign trigger_pkt_any[0].match = mtdata1_t0[`MTDATA1_MATCH]; + assign trigger_pkt_any[0].store = mtdata1_t0[`MTDATA1_ST]; + assign trigger_pkt_any[0].load = mtdata1_t0[`MTDATA1_LD]; + assign trigger_pkt_any[0].execute = mtdata1_t0[`MTDATA1_EXE]; + assign trigger_pkt_any[0].m = mtdata1_t0[`MTDATA1_M_ENABLED]; + + assign trigger_pkt_any[1].select = mtdata1_t1[`MTDATA1_SEL]; + assign trigger_pkt_any[1].match = mtdata1_t1[`MTDATA1_MATCH]; + assign trigger_pkt_any[1].store = mtdata1_t1[`MTDATA1_ST]; + assign trigger_pkt_any[1].load = mtdata1_t1[`MTDATA1_LD]; + assign trigger_pkt_any[1].execute = mtdata1_t1[`MTDATA1_EXE]; + assign trigger_pkt_any[1].m = mtdata1_t1[`MTDATA1_M_ENABLED]; + + assign trigger_pkt_any[2].select = mtdata1_t2[`MTDATA1_SEL]; + assign trigger_pkt_any[2].match = mtdata1_t2[`MTDATA1_MATCH]; + assign trigger_pkt_any[2].store = mtdata1_t2[`MTDATA1_ST]; + assign trigger_pkt_any[2].load = mtdata1_t2[`MTDATA1_LD]; + assign trigger_pkt_any[2].execute = mtdata1_t2[`MTDATA1_EXE]; + assign trigger_pkt_any[2].m = mtdata1_t2[`MTDATA1_M_ENABLED]; + + assign trigger_pkt_any[3].select = mtdata1_t3[`MTDATA1_SEL]; + assign trigger_pkt_any[3].match = mtdata1_t3[`MTDATA1_MATCH]; + assign trigger_pkt_any[3].store = mtdata1_t3[`MTDATA1_ST]; + assign trigger_pkt_any[3].load = mtdata1_t3[`MTDATA1_LD]; + assign trigger_pkt_any[3].execute = mtdata1_t3[`MTDATA1_EXE]; + assign trigger_pkt_any[3].m = mtdata1_t3[`MTDATA1_M_ENABLED]; + + // ---------------------------------------------------------------------- + // MTDATA2 (R/W) + // [31:0] : Trigger Data 2 + `define MTDATA2 12'h7a2 + + // If the DMODE bit is set, tdata2 can only be updated in debug_mode + assign wr_mtdata2_t0_r = dec_csr_wen_r_mod & (dec_csr_wraddr_r[11:0] == `MTDATA2) & (mtsel[1:0] == 2'b0) & (~mtdata1_t0[`MTDATA1_DMODE] | dbg_tlu_halted_f); + assign wr_mtdata2_t1_r = dec_csr_wen_r_mod & (dec_csr_wraddr_r[11:0] == `MTDATA2) & (mtsel[1:0] == 2'b01) & (~mtdata1_t1[`MTDATA1_DMODE] | dbg_tlu_halted_f); + assign wr_mtdata2_t2_r = dec_csr_wen_r_mod & (dec_csr_wraddr_r[11:0] == `MTDATA2) & (mtsel[1:0] == 2'b10) & (~mtdata1_t2[`MTDATA1_DMODE] | dbg_tlu_halted_f); + assign wr_mtdata2_t3_r = dec_csr_wen_r_mod & (dec_csr_wraddr_r[11:0] == `MTDATA2) & (mtsel[1:0] == 2'b11) & (~mtdata1_t3[`MTDATA1_DMODE] | dbg_tlu_halted_f); + + rvdffe #(32) mtdata2_t0_ff (.*, .en(wr_mtdata2_t0_r), .din(dec_csr_wrdata_r[31:0]), .dout(mtdata2_t0[31:0])); + rvdffe #(32) mtdata2_t1_ff (.*, .en(wr_mtdata2_t1_r), .din(dec_csr_wrdata_r[31:0]), .dout(mtdata2_t1[31:0])); + rvdffe #(32) mtdata2_t2_ff (.*, .en(wr_mtdata2_t2_r), .din(dec_csr_wrdata_r[31:0]), .dout(mtdata2_t2[31:0])); + rvdffe #(32) mtdata2_t3_ff (.*, .en(wr_mtdata2_t3_r), .din(dec_csr_wrdata_r[31:0]), .dout(mtdata2_t3[31:0])); + + assign mtdata2_tsel_out[31:0] = ( ({32{(mtsel[1:0] == 2'b00)}} & mtdata2_t0[31:0]) | + ({32{(mtsel[1:0] == 2'b01)}} & mtdata2_t1[31:0]) | + ({32{(mtsel[1:0] == 2'b10)}} & mtdata2_t2[31:0]) | + ({32{(mtsel[1:0] == 2'b11)}} & mtdata2_t3[31:0])); + + assign trigger_pkt_any[0].tdata2[31:0] = mtdata2_t0[31:0]; + assign trigger_pkt_any[1].tdata2[31:0] = mtdata2_t1[31:0]; + assign trigger_pkt_any[2].tdata2[31:0] = mtdata2_t2[31:0]; + assign trigger_pkt_any[3].tdata2[31:0] = mtdata2_t3[31:0]; + + + //---------------------------------------------------------------------- + // Performance Monitor Counters section starts + //---------------------------------------------------------------------- + `define MHPME_NOEVENT 10'd0 + `define MHPME_CLK_ACTIVE 10'd1 // OOP - out of pipe + `define MHPME_ICACHE_HIT 10'd2 // OOP + `define MHPME_ICACHE_MISS 10'd3 // OOP + `define MHPME_INST_COMMIT 10'd4 + `define MHPME_INST_COMMIT_16B 10'd5 + `define MHPME_INST_COMMIT_32B 10'd6 + `define MHPME_INST_ALIGNED 10'd7 // OOP + `define MHPME_INST_DECODED 10'd8 // OOP + `define MHPME_INST_MUL 10'd9 + `define MHPME_INST_DIV 10'd10 + `define MHPME_INST_LOAD 10'd11 + `define MHPME_INST_STORE 10'd12 + `define MHPME_INST_MALOAD 10'd13 + `define MHPME_INST_MASTORE 10'd14 + `define MHPME_INST_ALU 10'd15 + `define MHPME_INST_CSRREAD 10'd16 + `define MHPME_INST_CSRRW 10'd17 + `define MHPME_INST_CSRWRITE 10'd18 + `define MHPME_INST_EBREAK 10'd19 + `define MHPME_INST_ECALL 10'd20 + `define MHPME_INST_FENCE 10'd21 + `define MHPME_INST_FENCEI 10'd22 + `define MHPME_INST_MRET 10'd23 + `define MHPME_INST_BRANCH 10'd24 + `define MHPME_BRANCH_MP 10'd25 + `define MHPME_BRANCH_TAKEN 10'd26 + `define MHPME_BRANCH_NOTP 10'd27 + `define MHPME_FETCH_STALL 10'd28 // OOP + `define MHPME_ALGNR_STALL 10'd29 // OOP + `define MHPME_DECODE_STALL 10'd30 // OOP + `define MHPME_POSTSYNC_STALL 10'd31 // OOP + `define MHPME_PRESYNC_STALL 10'd32 // OOP + `define MHPME_LSU_SB_WB_STALL 10'd34 // OOP + `define MHPME_DMA_DCCM_STALL 10'd35 // OOP + `define MHPME_DMA_ICCM_STALL 10'd36 // OOP + `define MHPME_EXC_TAKEN 10'd37 + `define MHPME_TIMER_INT_TAKEN 10'd38 + `define MHPME_EXT_INT_TAKEN 10'd39 + `define MHPME_FLUSH_LOWER 10'd40 + `define MHPME_BR_ERROR 10'd41 + `define MHPME_IBUS_TRANS 10'd42 // OOP + `define MHPME_DBUS_TRANS 10'd43 // OOP + `define MHPME_DBUS_MA_TRANS 10'd44 // OOP + `define MHPME_IBUS_ERROR 10'd45 // OOP + `define MHPME_DBUS_ERROR 10'd46 // OOP + `define MHPME_IBUS_STALL 10'd47 // OOP + `define MHPME_DBUS_STALL 10'd48 // OOP + `define MHPME_INT_DISABLED 10'd49 // OOP + `define MHPME_INT_STALLED 10'd50 // OOP + `define MHPME_INST_BITMANIP 10'd54 + `define MHPME_DBUS_LOAD 10'd55 + `define MHPME_DBUS_STORE 10'd56 + // Counts even during sleep state + `define MHPME_SLEEP_CYC 10'd512 // OOP + `define MHPME_DMA_READ_ALL 10'd513 // OOP + `define MHPME_DMA_WRITE_ALL 10'd514 // OOP + `define MHPME_DMA_READ_DCCM 10'd515 // OOP + `define MHPME_DMA_WRITE_DCCM 10'd516 // OOP + + // Pack the event selects into a vector for genvar + assign mhpme_vec[0][9:0] = mhpme3[9:0]; + assign mhpme_vec[1][9:0] = mhpme4[9:0]; + assign mhpme_vec[2][9:0] = mhpme5[9:0]; + assign mhpme_vec[3][9:0] = mhpme6[9:0]; + + // only consider committed itypes + //logic [3:0] pmu_i0_itype_qual; + assign pmu_i0_itype_qual[3:0] = dec_tlu_packet_r.pmu_i0_itype[3:0] & {4{tlu_i0_commit_cmt}}; + + // Generate the muxed incs for all counters based on event type + for (genvar i=0 ; i < 4; i++) begin + assign mhpmc_inc_r[i] = {{~mcountinhibit[i+3]}} & + ( + ({1{(mhpme_vec[i][9:0] == `MHPME_CLK_ACTIVE )}} & 1'b1) | + ({1{(mhpme_vec[i][9:0] == `MHPME_ICACHE_HIT )}} & {ifu_pmu_ic_hit}) | + ({1{(mhpme_vec[i][9:0] == `MHPME_ICACHE_MISS )}} & {ifu_pmu_ic_miss}) | + ({1{(mhpme_vec[i][9:0] == `MHPME_INST_COMMIT )}} & {tlu_i0_commit_cmt & ~illegal_r}) | + ({1{(mhpme_vec[i][9:0] == `MHPME_INST_COMMIT_16B )}} & {tlu_i0_commit_cmt & ~exu_pmu_i0_pc4 & ~illegal_r}) | + ({1{(mhpme_vec[i][9:0] == `MHPME_INST_COMMIT_32B )}} & {tlu_i0_commit_cmt & exu_pmu_i0_pc4 & ~illegal_r}) | + ({1{(mhpme_vec[i][9:0] == `MHPME_INST_ALIGNED )}} & ifu_pmu_instr_aligned) | + ({1{(mhpme_vec[i][9:0] == `MHPME_INST_DECODED )}} & dec_pmu_instr_decoded) | + ({1{(mhpme_vec[i][9:0] == `MHPME_DECODE_STALL )}} & {dec_pmu_decode_stall}) | + ({1{(mhpme_vec[i][9:0] == `MHPME_INST_MUL )}} & {(pmu_i0_itype_qual == MUL)}) | + ({1{(mhpme_vec[i][9:0] == `MHPME_INST_DIV )}} & {dec_tlu_packet_r.pmu_divide & tlu_i0_commit_cmt}) | + ({1{(mhpme_vec[i][9:0] == `MHPME_INST_LOAD )}} & {(pmu_i0_itype_qual == LOAD)}) | + ({1{(mhpme_vec[i][9:0] == `MHPME_INST_STORE )}} & {(pmu_i0_itype_qual == STORE)}) | + ({1{(mhpme_vec[i][9:0] == `MHPME_INST_MALOAD )}} & {(pmu_i0_itype_qual == LOAD)} & + {1{dec_tlu_packet_r.pmu_lsu_misaligned}}) | + ({1{(mhpme_vec[i][9:0] == `MHPME_INST_MASTORE )}} & {(pmu_i0_itype_qual == STORE)} & + {1{dec_tlu_packet_r.pmu_lsu_misaligned}}) | + ({1{(mhpme_vec[i][9:0] == `MHPME_INST_ALU )}} & {(pmu_i0_itype_qual == ALU)}) | + ({1{(mhpme_vec[i][9:0] == `MHPME_INST_CSRREAD )}} & {(pmu_i0_itype_qual == CSRREAD)}) | + ({1{(mhpme_vec[i][9:0] == `MHPME_INST_CSRWRITE )}} & {(pmu_i0_itype_qual == CSRWRITE)})| + ({1{(mhpme_vec[i][9:0] == `MHPME_INST_CSRRW )}} & {(pmu_i0_itype_qual == CSRRW)}) | + ({1{(mhpme_vec[i][9:0] == `MHPME_INST_EBREAK )}} & {(pmu_i0_itype_qual == EBREAK)}) | + ({1{(mhpme_vec[i][9:0] == `MHPME_INST_ECALL )}} & {(pmu_i0_itype_qual == ECALL)}) | + ({1{(mhpme_vec[i][9:0] == `MHPME_INST_FENCE )}} & {(pmu_i0_itype_qual == FENCE)}) | + ({1{(mhpme_vec[i][9:0] == `MHPME_INST_FENCEI )}} & {(pmu_i0_itype_qual == FENCEI)}) | + ({1{(mhpme_vec[i][9:0] == `MHPME_INST_MRET )}} & {(pmu_i0_itype_qual == MRET)}) | + ({1{(mhpme_vec[i][9:0] == `MHPME_INST_BRANCH )}} & { + ((pmu_i0_itype_qual == CONDBR) | (pmu_i0_itype_qual == JAL))}) | + ({1{(mhpme_vec[i][9:0] == `MHPME_BRANCH_MP )}} & {exu_pmu_i0_br_misp & tlu_i0_commit_cmt}) | + ({1{(mhpme_vec[i][9:0] == `MHPME_BRANCH_TAKEN )}} & {exu_pmu_i0_br_ataken & tlu_i0_commit_cmt}) | + ({1{(mhpme_vec[i][9:0] == `MHPME_BRANCH_NOTP )}} & {dec_tlu_packet_r.pmu_i0_br_unpred & tlu_i0_commit_cmt}) | + ({1{(mhpme_vec[i][9:0] == `MHPME_FETCH_STALL )}} & { ifu_pmu_fetch_stall}) | + ({1{(mhpme_vec[i][9:0] == `MHPME_DECODE_STALL )}} & { dec_pmu_decode_stall}) | + ({1{(mhpme_vec[i][9:0] == `MHPME_POSTSYNC_STALL )}} & {dec_pmu_postsync_stall}) | + ({1{(mhpme_vec[i][9:0] == `MHPME_PRESYNC_STALL )}} & {dec_pmu_presync_stall}) | + ({1{(mhpme_vec[i][9:0] == `MHPME_LSU_SB_WB_STALL )}} & { lsu_store_stall_any}) | + ({1{(mhpme_vec[i][9:0] == `MHPME_DMA_DCCM_STALL )}} & { dma_dccm_stall_any}) | + ({1{(mhpme_vec[i][9:0] == `MHPME_DMA_ICCM_STALL )}} & { dma_iccm_stall_any}) | + ({1{(mhpme_vec[i][9:0] == `MHPME_EXC_TAKEN )}} & { (i0_exception_valid_r | i0_trigger_hit_r | lsu_exc_valid_r)}) | + ({1{(mhpme_vec[i][9:0] == `MHPME_TIMER_INT_TAKEN )}} & { take_timer_int}) | + ({1{(mhpme_vec[i][9:0] == `MHPME_EXT_INT_TAKEN )}} & { take_ext_int}) | + ({1{(mhpme_vec[i][9:0] == `MHPME_FLUSH_LOWER )}} & { tlu_flush_lower_r}) | + ({1{(mhpme_vec[i][9:0] == `MHPME_BR_ERROR )}} & {(dec_tlu_br0_error_r | dec_tlu_br0_start_error_r) & rfpc_i0_r}) | + ({1{(mhpme_vec[i][9:0] == `MHPME_IBUS_TRANS )}} & {ifu_pmu_bus_trxn}) | + ({1{(mhpme_vec[i][9:0] == `MHPME_DBUS_TRANS )}} & {lsu_pmu_bus_trxn}) | + ({1{(mhpme_vec[i][9:0] == `MHPME_DBUS_MA_TRANS )}} & {lsu_pmu_bus_misaligned}) | + ({1{(mhpme_vec[i][9:0] == `MHPME_IBUS_ERROR )}} & {ifu_pmu_bus_error}) | + ({1{(mhpme_vec[i][9:0] == `MHPME_DBUS_ERROR )}} & {lsu_pmu_bus_error}) | + ({1{(mhpme_vec[i][9:0] == `MHPME_IBUS_STALL )}} & {ifu_pmu_bus_busy}) | + ({1{(mhpme_vec[i][9:0] == `MHPME_DBUS_STALL )}} & {lsu_pmu_bus_busy}) | + ({1{(mhpme_vec[i][9:0] == `MHPME_INT_DISABLED )}} & {~mstatus[`MSTATUS_MIE]}) | + ({1{(mhpme_vec[i][9:0] == `MHPME_INT_STALLED )}} & {~mstatus[`MSTATUS_MIE] & |(mip[3:0] & mie[3:0])}) | + ({1{(mhpme_vec[i][9:0] == `MHPME_INST_BITMANIP )}} & {(pmu_i0_itype_qual == BITMANIPU)}) | + ({1{(mhpme_vec[i][9:0] == `MHPME_DBUS_LOAD )}} & {tlu_i0_commit_cmt & lsu_pmu_load_external_r}) | + ({1{(mhpme_vec[i][9:0] == `MHPME_DBUS_STORE )}} & {tlu_i0_commit_cmt & lsu_pmu_store_external_r}) | + // These count even during sleep + ({1{(mhpme_vec[i][9:0] == `MHPME_SLEEP_CYC )}} & {dec_tlu_pmu_fw_halted}) | + ({1{(mhpme_vec[i][9:0] == `MHPME_DMA_READ_ALL )}} & {dma_pmu_any_read}) | + ({1{(mhpme_vec[i][9:0] == `MHPME_DMA_WRITE_ALL )}} & {dma_pmu_any_write}) | + ({1{(mhpme_vec[i][9:0] == `MHPME_DMA_READ_DCCM )}} & {dma_pmu_dccm_read}) | + ({1{(mhpme_vec[i][9:0] == `MHPME_DMA_WRITE_DCCM )}} & {dma_pmu_dccm_write}) + ); + end + + + rvdff #(1) pmu0inc_ff (.*, .clk(free_clk), .din(mhpmc_inc_r[0]), .dout(mhpmc_inc_r_d1[0])); + rvdff #(1) pmu1inc_ff (.*, .clk(free_clk), .din(mhpmc_inc_r[1]), .dout(mhpmc_inc_r_d1[1])); + rvdff #(1) pmu2inc_ff (.*, .clk(free_clk), .din(mhpmc_inc_r[2]), .dout(mhpmc_inc_r_d1[2])); + rvdff #(1) pmu3inc_ff (.*, .clk(free_clk), .din(mhpmc_inc_r[3]), .dout(mhpmc_inc_r_d1[3])); + rvdff #(1) perfhlt_ff (.*, .clk(free_clk), .din(perfcnt_halted), .dout(perfcnt_halted_d1)); + + assign perfcnt_halted = ((dec_tlu_dbg_halted & dcsr[`DCSR_STOPC]) | dec_tlu_pmu_fw_halted); + assign perfcnt_during_sleep[3:0] = {4{~(dec_tlu_dbg_halted & dcsr[`DCSR_STOPC])}} & {mhpme_vec[3][9],mhpme_vec[2][9],mhpme_vec[1][9],mhpme_vec[0][9]}; + + assign dec_tlu_perfcnt0 = mhpmc_inc_r_d1[0] & ~(perfcnt_halted_d1 & ~perfcnt_during_sleep[0]); + assign dec_tlu_perfcnt1 = mhpmc_inc_r_d1[1] & ~(perfcnt_halted_d1 & ~perfcnt_during_sleep[1]); + assign dec_tlu_perfcnt2 = mhpmc_inc_r_d1[2] & ~(perfcnt_halted_d1 & ~perfcnt_during_sleep[2]); + assign dec_tlu_perfcnt3 = mhpmc_inc_r_d1[3] & ~(perfcnt_halted_d1 & ~perfcnt_during_sleep[3]); + + // ---------------------------------------------------------------------- + // MHPMC3H(RW), MHPMC3(RW) + // [63:32][31:0] : Hardware Performance Monitor Counter 3 + `define MHPMC3 12'hB03 + `define MHPMC3H 12'hB83 + + assign mhpmc3_wr_en0 = dec_csr_wen_r_mod & (dec_csr_wraddr_r[11:0] == `MHPMC3); + assign mhpmc3_wr_en1 = (~perfcnt_halted | perfcnt_during_sleep[0]) & (|(mhpmc_inc_r[0])); + assign mhpmc3_wr_en = mhpmc3_wr_en0 | mhpmc3_wr_en1; + assign mhpmc3_incr[63:0] = {mhpmc3h[31:0],mhpmc3[31:0]} + {63'b0,mhpmc_inc_r[0]}; + assign mhpmc3_ns[31:0] = mhpmc3_wr_en0 ? dec_csr_wrdata_r[31:0] : mhpmc3_incr[31:0]; + rvdffe #(32) mhpmc3_ff (.*, .en(mhpmc3_wr_en), .din(mhpmc3_ns[31:0]), .dout(mhpmc3[31:0])); + + assign mhpmc3h_wr_en0 = dec_csr_wen_r_mod & (dec_csr_wraddr_r[11:0] == `MHPMC3H); + assign mhpmc3h_wr_en = mhpmc3h_wr_en0 | mhpmc3_wr_en1; + assign mhpmc3h_ns[31:0] = mhpmc3h_wr_en0 ? dec_csr_wrdata_r[31:0] : mhpmc3_incr[63:32]; + rvdffe #(32) mhpmc3h_ff (.*, .en(mhpmc3h_wr_en), .din(mhpmc3h_ns[31:0]), .dout(mhpmc3h[31:0])); + + // ---------------------------------------------------------------------- + // MHPMC4H(RW), MHPMC4(RW) + // [63:32][31:0] : Hardware Performance Monitor Counter 4 + `define MHPMC4 12'hB04 + `define MHPMC4H 12'hB84 + + assign mhpmc4_wr_en0 = dec_csr_wen_r_mod & (dec_csr_wraddr_r[11:0] == `MHPMC4); + assign mhpmc4_wr_en1 = (~perfcnt_halted | perfcnt_during_sleep[1]) & (|(mhpmc_inc_r[1])); + assign mhpmc4_wr_en = mhpmc4_wr_en0 | mhpmc4_wr_en1; + assign mhpmc4_incr[63:0] = {mhpmc4h[31:0],mhpmc4[31:0]} + {63'b0,mhpmc_inc_r[1]}; + assign mhpmc4_ns[31:0] = mhpmc4_wr_en0 ? dec_csr_wrdata_r[31:0] : mhpmc4_incr[31:0]; + rvdffe #(32) mhpmc4_ff (.*, .en(mhpmc4_wr_en), .din(mhpmc4_ns[31:0]), .dout(mhpmc4[31:0])); + + assign mhpmc4h_wr_en0 = dec_csr_wen_r_mod & (dec_csr_wraddr_r[11:0] == `MHPMC4H); + assign mhpmc4h_wr_en = mhpmc4h_wr_en0 | mhpmc4_wr_en1; + assign mhpmc4h_ns[31:0] = mhpmc4h_wr_en0 ? dec_csr_wrdata_r[31:0] : mhpmc4_incr[63:32]; + rvdffe #(32) mhpmc4h_ff (.*, .en(mhpmc4h_wr_en), .din(mhpmc4h_ns[31:0]), .dout(mhpmc4h[31:0])); + + // ---------------------------------------------------------------------- + // MHPMC5H(RW), MHPMC5(RW) + // [63:32][31:0] : Hardware Performance Monitor Counter 5 + `define MHPMC5 12'hB05 + `define MHPMC5H 12'hB85 + + assign mhpmc5_wr_en0 = dec_csr_wen_r_mod & (dec_csr_wraddr_r[11:0] == `MHPMC5); + assign mhpmc5_wr_en1 = (~perfcnt_halted | perfcnt_during_sleep[2]) & (|(mhpmc_inc_r[2])); + assign mhpmc5_wr_en = mhpmc5_wr_en0 | mhpmc5_wr_en1; + assign mhpmc5_incr[63:0] = {mhpmc5h[31:0],mhpmc5[31:0]} + {63'b0,mhpmc_inc_r[2]}; + assign mhpmc5_ns[31:0] = mhpmc5_wr_en0 ? dec_csr_wrdata_r[31:0] : mhpmc5_incr[31:0]; + rvdffe #(32) mhpmc5_ff (.*, .en(mhpmc5_wr_en), .din(mhpmc5_ns[31:0]), .dout(mhpmc5[31:0])); + + assign mhpmc5h_wr_en0 = dec_csr_wen_r_mod & (dec_csr_wraddr_r[11:0] == `MHPMC5H); + assign mhpmc5h_wr_en = mhpmc5h_wr_en0 | mhpmc5_wr_en1; + assign mhpmc5h_ns[31:0] = mhpmc5h_wr_en0 ? dec_csr_wrdata_r[31:0] : mhpmc5_incr[63:32]; + rvdffe #(32) mhpmc5h_ff (.*, .en(mhpmc5h_wr_en), .din(mhpmc5h_ns[31:0]), .dout(mhpmc5h[31:0])); + + // ---------------------------------------------------------------------- + // MHPMC6H(RW), MHPMC6(RW) + // [63:32][31:0] : Hardware Performance Monitor Counter 6 + `define MHPMC6 12'hB06 + `define MHPMC6H 12'hB86 + + assign mhpmc6_wr_en0 = dec_csr_wen_r_mod & (dec_csr_wraddr_r[11:0] == `MHPMC6); + assign mhpmc6_wr_en1 = (~perfcnt_halted | perfcnt_during_sleep[3]) & (|(mhpmc_inc_r[3])); + assign mhpmc6_wr_en = mhpmc6_wr_en0 | mhpmc6_wr_en1; + assign mhpmc6_incr[63:0] = {mhpmc6h[31:0],mhpmc6[31:0]} + {63'b0,mhpmc_inc_r[3]}; + assign mhpmc6_ns[31:0] = mhpmc6_wr_en0 ? dec_csr_wrdata_r[31:0] : mhpmc6_incr[31:0]; + rvdffe #(32) mhpmc6_ff (.*, .en(mhpmc6_wr_en), .din(mhpmc6_ns[31:0]), .dout(mhpmc6[31:0])); + + assign mhpmc6h_wr_en0 = dec_csr_wen_r_mod & (dec_csr_wraddr_r[11:0] == `MHPMC6H); + assign mhpmc6h_wr_en = mhpmc6h_wr_en0 | mhpmc6_wr_en1; + assign mhpmc6h_ns[31:0] = mhpmc6h_wr_en0 ? dec_csr_wrdata_r[31:0] : mhpmc6_incr[63:32]; + rvdffe #(32) mhpmc6h_ff (.*, .en(mhpmc6h_wr_en), .din(mhpmc6h_ns[31:0]), .dout(mhpmc6h[31:0])); + + // ---------------------------------------------------------------------- + // MHPME3(RW) + // [9:0] : Hardware Performance Monitor Event 3 + `define MHPME3 12'h323 + + // we only have events 0-56, 512-516, HPME* are WARL so saturate otherwise + assign event_saturate_r[9:0] = ((dec_csr_wrdata_r[9:0] > 10'd516) | (|dec_csr_wrdata_r[31:10])) ? 10'd516 : dec_csr_wrdata_r[9:0]; + + assign wr_mhpme3_r = dec_csr_wen_r_mod & (dec_csr_wraddr_r[11:0] == `MHPME3); + rvdffs #(10) mhpme3_ff (.*, .clk(active_clk), .en(wr_mhpme3_r), .din(event_saturate_r[9:0]), .dout(mhpme3[9:0])); + // ---------------------------------------------------------------------- + // MHPME4(RW) + // [9:0] : Hardware Performance Monitor Event 4 + `define MHPME4 12'h324 + + assign wr_mhpme4_r = dec_csr_wen_r_mod & (dec_csr_wraddr_r[11:0] == `MHPME4); + rvdffs #(10) mhpme4_ff (.*, .clk(active_clk), .en(wr_mhpme4_r), .din(event_saturate_r[9:0]), .dout(mhpme4[9:0])); + // ---------------------------------------------------------------------- + // MHPME5(RW) + // [9:0] : Hardware Performance Monitor Event 5 + `define MHPME5 12'h325 + + assign wr_mhpme5_r = dec_csr_wen_r_mod & (dec_csr_wraddr_r[11:0] == `MHPME5); + rvdffs #(10) mhpme5_ff (.*, .clk(active_clk), .en(wr_mhpme5_r), .din(event_saturate_r[9:0]), .dout(mhpme5[9:0])); + // ---------------------------------------------------------------------- + // MHPME6(RW) + // [9:0] : Hardware Performance Monitor Event 6 + `define MHPME6 12'h326 + + assign wr_mhpme6_r = dec_csr_wen_r_mod & (dec_csr_wraddr_r[11:0] == `MHPME6); + rvdffs #(10) mhpme6_ff (.*, .clk(active_clk), .en(wr_mhpme6_r), .din(event_saturate_r[9:0]), .dout(mhpme6[9:0])); + + //---------------------------------------------------------------------- + // Performance Monitor Counters section ends + //---------------------------------------------------------------------- + // ---------------------------------------------------------------------- + + // MCOUNTINHIBIT(RW) + // [31:7] : Reserved, read 0x0 + // [6] : HPM6 disable + // [5] : HPM5 disable + // [4] : HPM4 disable + // [3] : HPM3 disable + // [2] : MINSTRET disable + // [1] : reserved, read 0x0 + // [0] : MCYCLE disable + + `define MCOUNTINHIBIT 12'h320 + + assign wr_mcountinhibit_r = dec_csr_wen_r_mod & (dec_csr_wraddr_r[11:0] == `MCOUNTINHIBIT); + rvdffs #(6) mcountinhibit_ff (.*, .clk(active_clk), .en(wr_mcountinhibit_r), .din({dec_csr_wrdata_r[6:2], dec_csr_wrdata_r[0]}), .dout({mcountinhibit[6:2], mcountinhibit[0]})); + assign mcountinhibit[1] = 1'b0; + + //-------------------------------------------------------------------------------- + // trace + //-------------------------------------------------------------------------------- + + rvoclkhdr trace_cgc ( .en(i0_valid_wb | exc_or_int_valid_r_d1 | interrupt_valid_r_d1 | dec_tlu_i0_valid_wb1 | + dec_tlu_i0_exc_valid_wb1 | dec_tlu_int_valid_wb1 | clk_override), .l1clk(trace_tclk), .* ); + rvdff #(8) traceff (.*, .clk(trace_tclk), + .din ({i0_valid_wb, + i0_exception_valid_r_d1 | lsu_i0_exc_r_d1 | (trigger_hit_r_d1 & ~trigger_hit_dmode_r_d1), + exc_cause_wb[4:0], + interrupt_valid_r_d1}), + .dout({dec_tlu_i0_valid_wb1, + dec_tlu_i0_exc_valid_wb1, + dec_tlu_exc_cause_wb1[4:0], + dec_tlu_int_valid_wb1})); + + assign dec_tlu_mtval_wb1 = mtval[31:0]; + + // end trace + //-------------------------------------------------------------------------------- + + + // ---------------------------------------------------------------------- + // CSR read mux + // ---------------------------------------------------------------------- + +// file "csrdecode" is human readable file that has all of the CSR decodes defined and is part of git repo +// modify this file as needed + +// to generate all the equations below from "csrdecode" except legal equation: + +// 1) coredecode -in csrdecode > corecsrdecode.e + +// 2) espresso -Dso -oeqntott corecsrdecode.e | addassign > csrequations + +// to generate the legal CSR equation below: + +// 1) coredecode -in csrdecode -legal > csrlegal.e + +// 2) espresso -Dso -oeqntott csrlegal.e | addassign > csrlegal_equation +// coredecode -in csrdecode > corecsrdecode.e; espresso -Dso -oeqntott corecsrdecode.e | addassign > csrequations; coredecode -in csrdecode -legal > csrlegal.e; espresso -Dso -oeqntott csrlegal.e | addassign > csrlegal_equation + +assign csr_misa = (!dec_csr_rdaddr_d[11]&!dec_csr_rdaddr_d[6] + &!dec_csr_rdaddr_d[5]&!dec_csr_rdaddr_d[2]&dec_csr_rdaddr_d[0]); + +assign csr_mvendorid = (dec_csr_rdaddr_d[10]&!dec_csr_rdaddr_d[7] + &!dec_csr_rdaddr_d[1]&dec_csr_rdaddr_d[0]); + +assign csr_marchid = (dec_csr_rdaddr_d[10]&!dec_csr_rdaddr_d[7] + &dec_csr_rdaddr_d[1]&!dec_csr_rdaddr_d[0]); + +assign csr_mimpid = (dec_csr_rdaddr_d[10]&!dec_csr_rdaddr_d[3] + &dec_csr_rdaddr_d[1]&dec_csr_rdaddr_d[0]); + +assign csr_mhartid = (dec_csr_rdaddr_d[10]&!dec_csr_rdaddr_d[7] + &dec_csr_rdaddr_d[2]); + +assign csr_mstatus = (!dec_csr_rdaddr_d[11]&!dec_csr_rdaddr_d[6] + &!dec_csr_rdaddr_d[5]&!dec_csr_rdaddr_d[2]&!dec_csr_rdaddr_d[0]); + +assign csr_mtvec = (!dec_csr_rdaddr_d[11]&!dec_csr_rdaddr_d[5] + &dec_csr_rdaddr_d[2]&!dec_csr_rdaddr_d[1]&dec_csr_rdaddr_d[0]); + +assign csr_mip = (!dec_csr_rdaddr_d[7]&dec_csr_rdaddr_d[6]&dec_csr_rdaddr_d[2]); + +assign csr_mie = (!dec_csr_rdaddr_d[11]&!dec_csr_rdaddr_d[6]&!dec_csr_rdaddr_d[5] + &dec_csr_rdaddr_d[2]&!dec_csr_rdaddr_d[0]); + +assign csr_mcyclel = (dec_csr_rdaddr_d[11]&!dec_csr_rdaddr_d[7] + &!dec_csr_rdaddr_d[4]&!dec_csr_rdaddr_d[3]&!dec_csr_rdaddr_d[2] + &!dec_csr_rdaddr_d[1]); + +assign csr_mcycleh = (dec_csr_rdaddr_d[7]&!dec_csr_rdaddr_d[6] + &!dec_csr_rdaddr_d[5]&!dec_csr_rdaddr_d[4]&!dec_csr_rdaddr_d[3] + &!dec_csr_rdaddr_d[2]&!dec_csr_rdaddr_d[1]); + +assign csr_minstretl = (!dec_csr_rdaddr_d[7]&!dec_csr_rdaddr_d[6] + &!dec_csr_rdaddr_d[4]&!dec_csr_rdaddr_d[3]&!dec_csr_rdaddr_d[2] + &dec_csr_rdaddr_d[1]&!dec_csr_rdaddr_d[0]); + +assign csr_minstreth = (!dec_csr_rdaddr_d[10]&dec_csr_rdaddr_d[7] + &!dec_csr_rdaddr_d[4]&!dec_csr_rdaddr_d[3]&!dec_csr_rdaddr_d[2] + &dec_csr_rdaddr_d[1]&!dec_csr_rdaddr_d[0]); + +assign csr_mscratch = (!dec_csr_rdaddr_d[7]&dec_csr_rdaddr_d[6] + &!dec_csr_rdaddr_d[2]&!dec_csr_rdaddr_d[1]&!dec_csr_rdaddr_d[0]); + +assign csr_mepc = (!dec_csr_rdaddr_d[7]&dec_csr_rdaddr_d[6]&!dec_csr_rdaddr_d[1] + &dec_csr_rdaddr_d[0]); + +assign csr_mcause = (!dec_csr_rdaddr_d[7]&dec_csr_rdaddr_d[6] + &dec_csr_rdaddr_d[1]&!dec_csr_rdaddr_d[0]); + +assign csr_mscause = (dec_csr_rdaddr_d[6]&dec_csr_rdaddr_d[5] + &dec_csr_rdaddr_d[2]); + +assign csr_mtval = (dec_csr_rdaddr_d[6]&!dec_csr_rdaddr_d[3]&dec_csr_rdaddr_d[1] + &dec_csr_rdaddr_d[0]); + +assign csr_mrac = (!dec_csr_rdaddr_d[11]&dec_csr_rdaddr_d[7]&!dec_csr_rdaddr_d[5] + &!dec_csr_rdaddr_d[3]&!dec_csr_rdaddr_d[2]&!dec_csr_rdaddr_d[1]); + +assign csr_dmst = (dec_csr_rdaddr_d[10]&dec_csr_rdaddr_d[6]&!dec_csr_rdaddr_d[3] + &dec_csr_rdaddr_d[2]&!dec_csr_rdaddr_d[1]); + +assign csr_mdseac = (dec_csr_rdaddr_d[11]&dec_csr_rdaddr_d[10] + &!dec_csr_rdaddr_d[4]&!dec_csr_rdaddr_d[3]); + +assign csr_meihap = (dec_csr_rdaddr_d[11]&dec_csr_rdaddr_d[10] + &dec_csr_rdaddr_d[3]); + +assign csr_meivt = (!dec_csr_rdaddr_d[10]&dec_csr_rdaddr_d[6] + &dec_csr_rdaddr_d[3]&!dec_csr_rdaddr_d[2]&!dec_csr_rdaddr_d[1] + &!dec_csr_rdaddr_d[0]); + +assign csr_meipt = (dec_csr_rdaddr_d[11]&dec_csr_rdaddr_d[6]&!dec_csr_rdaddr_d[1] + &dec_csr_rdaddr_d[0]); + +assign csr_meicurpl = (dec_csr_rdaddr_d[11]&dec_csr_rdaddr_d[6] + &dec_csr_rdaddr_d[2]); + +assign csr_meicidpl = (dec_csr_rdaddr_d[11]&dec_csr_rdaddr_d[6] + &dec_csr_rdaddr_d[1]&dec_csr_rdaddr_d[0]); + +assign csr_dcsr = (dec_csr_rdaddr_d[10]&!dec_csr_rdaddr_d[6]&dec_csr_rdaddr_d[5] + &dec_csr_rdaddr_d[4]&!dec_csr_rdaddr_d[0]); + +assign csr_mcgc = (dec_csr_rdaddr_d[10]&dec_csr_rdaddr_d[4]&dec_csr_rdaddr_d[3] + &!dec_csr_rdaddr_d[0]); + +assign csr_mfdc = (dec_csr_rdaddr_d[10]&dec_csr_rdaddr_d[4]&dec_csr_rdaddr_d[3] + &!dec_csr_rdaddr_d[1]&dec_csr_rdaddr_d[0]); + +assign csr_dpc = (dec_csr_rdaddr_d[10]&!dec_csr_rdaddr_d[6]&dec_csr_rdaddr_d[5] + &dec_csr_rdaddr_d[4]&dec_csr_rdaddr_d[0]); + +assign csr_mtsel = (dec_csr_rdaddr_d[10]&dec_csr_rdaddr_d[5]&!dec_csr_rdaddr_d[4] + &!dec_csr_rdaddr_d[1]&!dec_csr_rdaddr_d[0]); + +assign csr_mtdata1 = (dec_csr_rdaddr_d[10]&!dec_csr_rdaddr_d[4] + &!dec_csr_rdaddr_d[3]&dec_csr_rdaddr_d[0]); + +assign csr_mtdata2 = (dec_csr_rdaddr_d[10]&dec_csr_rdaddr_d[5] + &!dec_csr_rdaddr_d[4]&dec_csr_rdaddr_d[1]); + +assign csr_mhpmc3 = (dec_csr_rdaddr_d[11]&!dec_csr_rdaddr_d[7] + &!dec_csr_rdaddr_d[4]&!dec_csr_rdaddr_d[3]&!dec_csr_rdaddr_d[2] + &dec_csr_rdaddr_d[0]); + +assign csr_mhpmc4 = (dec_csr_rdaddr_d[11]&!dec_csr_rdaddr_d[7] + &!dec_csr_rdaddr_d[4]&!dec_csr_rdaddr_d[3]&dec_csr_rdaddr_d[2] + &!dec_csr_rdaddr_d[1]&!dec_csr_rdaddr_d[0]); + +assign csr_mhpmc5 = (dec_csr_rdaddr_d[11]&!dec_csr_rdaddr_d[7] + &!dec_csr_rdaddr_d[4]&!dec_csr_rdaddr_d[3]&!dec_csr_rdaddr_d[1] + &dec_csr_rdaddr_d[0]); + +assign csr_mhpmc6 = (!dec_csr_rdaddr_d[7]&!dec_csr_rdaddr_d[5] + &!dec_csr_rdaddr_d[4]&!dec_csr_rdaddr_d[3]&dec_csr_rdaddr_d[2] + &dec_csr_rdaddr_d[1]&!dec_csr_rdaddr_d[0]); + +assign csr_mhpmc3h = (dec_csr_rdaddr_d[7]&!dec_csr_rdaddr_d[4] + &!dec_csr_rdaddr_d[3]&!dec_csr_rdaddr_d[2]&dec_csr_rdaddr_d[1] + &dec_csr_rdaddr_d[0]); + +assign csr_mhpmc4h = (dec_csr_rdaddr_d[7]&!dec_csr_rdaddr_d[6] + &!dec_csr_rdaddr_d[4]&!dec_csr_rdaddr_d[3]&dec_csr_rdaddr_d[2] + &!dec_csr_rdaddr_d[1]&!dec_csr_rdaddr_d[0]); + +assign csr_mhpmc5h = (dec_csr_rdaddr_d[7]&!dec_csr_rdaddr_d[4] + &!dec_csr_rdaddr_d[3]&dec_csr_rdaddr_d[2]&!dec_csr_rdaddr_d[1] + &dec_csr_rdaddr_d[0]); + +assign csr_mhpmc6h = (dec_csr_rdaddr_d[7]&!dec_csr_rdaddr_d[6] + &!dec_csr_rdaddr_d[4]&!dec_csr_rdaddr_d[3]&dec_csr_rdaddr_d[2] + &dec_csr_rdaddr_d[1]&!dec_csr_rdaddr_d[0]); + +assign csr_mhpme3 = (!dec_csr_rdaddr_d[7]&dec_csr_rdaddr_d[5] + &!dec_csr_rdaddr_d[4]&!dec_csr_rdaddr_d[3]&!dec_csr_rdaddr_d[2] + &dec_csr_rdaddr_d[0]); + +assign csr_mhpme4 = (dec_csr_rdaddr_d[5]&!dec_csr_rdaddr_d[4] + &!dec_csr_rdaddr_d[3]&dec_csr_rdaddr_d[2]&!dec_csr_rdaddr_d[1] + &!dec_csr_rdaddr_d[0]); + +assign csr_mhpme5 = (dec_csr_rdaddr_d[5]&!dec_csr_rdaddr_d[4] + &!dec_csr_rdaddr_d[3]&dec_csr_rdaddr_d[2]&!dec_csr_rdaddr_d[1] + &dec_csr_rdaddr_d[0]); + +assign csr_mhpme6 = (dec_csr_rdaddr_d[5]&!dec_csr_rdaddr_d[4] + &!dec_csr_rdaddr_d[3]&dec_csr_rdaddr_d[2]&dec_csr_rdaddr_d[1] + &!dec_csr_rdaddr_d[0]); + +assign csr_mcountinhibit = (!dec_csr_rdaddr_d[7]&dec_csr_rdaddr_d[5] + &!dec_csr_rdaddr_d[4]&!dec_csr_rdaddr_d[3]&!dec_csr_rdaddr_d[2] + &!dec_csr_rdaddr_d[0]); + +assign csr_mpmc = (dec_csr_rdaddr_d[6]&!dec_csr_rdaddr_d[3]&dec_csr_rdaddr_d[2] + &dec_csr_rdaddr_d[1]); + +assign csr_mcpc = (dec_csr_rdaddr_d[10]&!dec_csr_rdaddr_d[5]&!dec_csr_rdaddr_d[4] + &!dec_csr_rdaddr_d[3]&!dec_csr_rdaddr_d[2]&dec_csr_rdaddr_d[1]); + +assign csr_meicpct = (dec_csr_rdaddr_d[11]&dec_csr_rdaddr_d[6] + &dec_csr_rdaddr_d[1]&!dec_csr_rdaddr_d[0]); + +assign csr_mdeau = (!dec_csr_rdaddr_d[10]&dec_csr_rdaddr_d[7] + &dec_csr_rdaddr_d[6]&!dec_csr_rdaddr_d[3]); + +assign csr_micect = (dec_csr_rdaddr_d[6]&dec_csr_rdaddr_d[4]&!dec_csr_rdaddr_d[3] + &!dec_csr_rdaddr_d[1]&!dec_csr_rdaddr_d[0]); + +assign csr_miccmect = (dec_csr_rdaddr_d[6]&dec_csr_rdaddr_d[4] + &!dec_csr_rdaddr_d[3]&dec_csr_rdaddr_d[0]); + +assign csr_mdccmect = (dec_csr_rdaddr_d[6]&dec_csr_rdaddr_d[4] + &dec_csr_rdaddr_d[1]&!dec_csr_rdaddr_d[0]); + +assign csr_mfdht = (dec_csr_rdaddr_d[6]&dec_csr_rdaddr_d[3]&dec_csr_rdaddr_d[2] + &dec_csr_rdaddr_d[1]&!dec_csr_rdaddr_d[0]); + +assign csr_mfdhs = (dec_csr_rdaddr_d[6]&!dec_csr_rdaddr_d[4]&dec_csr_rdaddr_d[2] + &dec_csr_rdaddr_d[0]); + +assign csr_dicawics = (!dec_csr_rdaddr_d[11]&!dec_csr_rdaddr_d[5] + &dec_csr_rdaddr_d[3]&!dec_csr_rdaddr_d[2]&!dec_csr_rdaddr_d[1] + &!dec_csr_rdaddr_d[0]); + +assign csr_dicad0h = (dec_csr_rdaddr_d[10]&dec_csr_rdaddr_d[3] + &dec_csr_rdaddr_d[2]&!dec_csr_rdaddr_d[1]); + +assign csr_dicad0 = (dec_csr_rdaddr_d[10]&!dec_csr_rdaddr_d[5] + &dec_csr_rdaddr_d[3]&!dec_csr_rdaddr_d[1]&dec_csr_rdaddr_d[0]); + +assign csr_dicad1 = (dec_csr_rdaddr_d[10]&dec_csr_rdaddr_d[3] + &!dec_csr_rdaddr_d[2]&dec_csr_rdaddr_d[1]&!dec_csr_rdaddr_d[0]); + +assign csr_dicago = (dec_csr_rdaddr_d[10]&dec_csr_rdaddr_d[7] + &!dec_csr_rdaddr_d[2]&dec_csr_rdaddr_d[1]&dec_csr_rdaddr_d[0]); + +assign presync = (dec_csr_rdaddr_d[10]&dec_csr_rdaddr_d[4]&dec_csr_rdaddr_d[3] + &!dec_csr_rdaddr_d[1]&dec_csr_rdaddr_d[0]) | (!dec_csr_rdaddr_d[7] + &dec_csr_rdaddr_d[5]&!dec_csr_rdaddr_d[4]&!dec_csr_rdaddr_d[3] + &!dec_csr_rdaddr_d[2]&!dec_csr_rdaddr_d[0]) | (!dec_csr_rdaddr_d[6] + &!dec_csr_rdaddr_d[5]&!dec_csr_rdaddr_d[4]&!dec_csr_rdaddr_d[3] + &!dec_csr_rdaddr_d[2]&dec_csr_rdaddr_d[1]) | (dec_csr_rdaddr_d[11] + &!dec_csr_rdaddr_d[4]&!dec_csr_rdaddr_d[3]&dec_csr_rdaddr_d[2] + &!dec_csr_rdaddr_d[1]) | (dec_csr_rdaddr_d[11]&!dec_csr_rdaddr_d[4] + &!dec_csr_rdaddr_d[3]&dec_csr_rdaddr_d[1]&!dec_csr_rdaddr_d[0]) | ( + dec_csr_rdaddr_d[7]&!dec_csr_rdaddr_d[5]&!dec_csr_rdaddr_d[4] + &!dec_csr_rdaddr_d[3]&!dec_csr_rdaddr_d[2]&dec_csr_rdaddr_d[1]); + +assign postsync = (dec_csr_rdaddr_d[10]&dec_csr_rdaddr_d[4]&dec_csr_rdaddr_d[3] + &!dec_csr_rdaddr_d[1]&dec_csr_rdaddr_d[0]) | (!dec_csr_rdaddr_d[11] + &!dec_csr_rdaddr_d[5]&dec_csr_rdaddr_d[2]&!dec_csr_rdaddr_d[1] + &dec_csr_rdaddr_d[0]) | (!dec_csr_rdaddr_d[7]&dec_csr_rdaddr_d[6] + &!dec_csr_rdaddr_d[1]&dec_csr_rdaddr_d[0]) | (dec_csr_rdaddr_d[10] + &!dec_csr_rdaddr_d[4]&!dec_csr_rdaddr_d[3]&dec_csr_rdaddr_d[0]) | ( + !dec_csr_rdaddr_d[11]&!dec_csr_rdaddr_d[7]&!dec_csr_rdaddr_d[6] + &!dec_csr_rdaddr_d[4]&!dec_csr_rdaddr_d[3]&!dec_csr_rdaddr_d[2] + &!dec_csr_rdaddr_d[0]) | (!dec_csr_rdaddr_d[11]&dec_csr_rdaddr_d[7] + &!dec_csr_rdaddr_d[5]&!dec_csr_rdaddr_d[3]&!dec_csr_rdaddr_d[1]) | ( + dec_csr_rdaddr_d[10]&!dec_csr_rdaddr_d[4]&!dec_csr_rdaddr_d[3] + &!dec_csr_rdaddr_d[2]&dec_csr_rdaddr_d[1]); + +assign legal = (!dec_csr_rdaddr_d[11]&!dec_csr_rdaddr_d[10]&dec_csr_rdaddr_d[9] + &dec_csr_rdaddr_d[8]&!dec_csr_rdaddr_d[7]&!dec_csr_rdaddr_d[6] + &dec_csr_rdaddr_d[5]&!dec_csr_rdaddr_d[1]&!dec_csr_rdaddr_d[0]) | ( + dec_csr_rdaddr_d[11]&dec_csr_rdaddr_d[9]&dec_csr_rdaddr_d[8] + &dec_csr_rdaddr_d[7]&dec_csr_rdaddr_d[6]&!dec_csr_rdaddr_d[5] + &!dec_csr_rdaddr_d[4]&!dec_csr_rdaddr_d[2]&!dec_csr_rdaddr_d[1] + &!dec_csr_rdaddr_d[0]) | (!dec_csr_rdaddr_d[11]&!dec_csr_rdaddr_d[10] + &dec_csr_rdaddr_d[9]&dec_csr_rdaddr_d[8]&!dec_csr_rdaddr_d[7] + &!dec_csr_rdaddr_d[6]&!dec_csr_rdaddr_d[5]&!dec_csr_rdaddr_d[4] + &!dec_csr_rdaddr_d[3]&!dec_csr_rdaddr_d[1]) | (dec_csr_rdaddr_d[11] + &!dec_csr_rdaddr_d[10]&dec_csr_rdaddr_d[9]&dec_csr_rdaddr_d[8] + &!dec_csr_rdaddr_d[6]&!dec_csr_rdaddr_d[5]&!dec_csr_rdaddr_d[0]) | ( + !dec_csr_rdaddr_d[11]&dec_csr_rdaddr_d[10]&dec_csr_rdaddr_d[9] + &dec_csr_rdaddr_d[8]&dec_csr_rdaddr_d[7]&dec_csr_rdaddr_d[6] + &dec_csr_rdaddr_d[5]&dec_csr_rdaddr_d[4]&dec_csr_rdaddr_d[3] + &dec_csr_rdaddr_d[2]&dec_csr_rdaddr_d[1]&dec_csr_rdaddr_d[0]) | ( + !dec_csr_rdaddr_d[11]&dec_csr_rdaddr_d[10]&dec_csr_rdaddr_d[9] + &dec_csr_rdaddr_d[8]&dec_csr_rdaddr_d[7]&dec_csr_rdaddr_d[6] + &dec_csr_rdaddr_d[5]&dec_csr_rdaddr_d[4]&!dec_csr_rdaddr_d[2] + &!dec_csr_rdaddr_d[1]) | (!dec_csr_rdaddr_d[11]&dec_csr_rdaddr_d[10] + &dec_csr_rdaddr_d[9]&dec_csr_rdaddr_d[8]&dec_csr_rdaddr_d[7] + &dec_csr_rdaddr_d[6]&dec_csr_rdaddr_d[5]&dec_csr_rdaddr_d[4] + &!dec_csr_rdaddr_d[3]&!dec_csr_rdaddr_d[2]&!dec_csr_rdaddr_d[0]) | ( + !dec_csr_rdaddr_d[11]&dec_csr_rdaddr_d[10]&dec_csr_rdaddr_d[9] + &dec_csr_rdaddr_d[8]&dec_csr_rdaddr_d[7]&!dec_csr_rdaddr_d[6] + &dec_csr_rdaddr_d[5]&!dec_csr_rdaddr_d[3]&!dec_csr_rdaddr_d[2] + &!dec_csr_rdaddr_d[1]) | (dec_csr_rdaddr_d[11]&dec_csr_rdaddr_d[9] + &dec_csr_rdaddr_d[8]&!dec_csr_rdaddr_d[7]&!dec_csr_rdaddr_d[6] + &!dec_csr_rdaddr_d[5]&dec_csr_rdaddr_d[4]&!dec_csr_rdaddr_d[3] + &!dec_csr_rdaddr_d[2]&dec_csr_rdaddr_d[0]) | (!dec_csr_rdaddr_d[11] + &dec_csr_rdaddr_d[10]&dec_csr_rdaddr_d[9]&dec_csr_rdaddr_d[8] + &dec_csr_rdaddr_d[7]&dec_csr_rdaddr_d[6]&!dec_csr_rdaddr_d[5] + &!dec_csr_rdaddr_d[4]&dec_csr_rdaddr_d[3]&dec_csr_rdaddr_d[1]) | ( + dec_csr_rdaddr_d[11]&dec_csr_rdaddr_d[9]&dec_csr_rdaddr_d[8] + &!dec_csr_rdaddr_d[7]&!dec_csr_rdaddr_d[6]&!dec_csr_rdaddr_d[5] + &dec_csr_rdaddr_d[4]&!dec_csr_rdaddr_d[3]&dec_csr_rdaddr_d[2] + &!dec_csr_rdaddr_d[1]&!dec_csr_rdaddr_d[0]) | (dec_csr_rdaddr_d[11] + &dec_csr_rdaddr_d[9]&dec_csr_rdaddr_d[8]&!dec_csr_rdaddr_d[7] + &!dec_csr_rdaddr_d[6]&!dec_csr_rdaddr_d[5]&dec_csr_rdaddr_d[4] + &!dec_csr_rdaddr_d[3]&!dec_csr_rdaddr_d[2]&dec_csr_rdaddr_d[1]) | ( + !dec_csr_rdaddr_d[11]&!dec_csr_rdaddr_d[10]&dec_csr_rdaddr_d[9] + &dec_csr_rdaddr_d[8]&!dec_csr_rdaddr_d[7]&!dec_csr_rdaddr_d[6] + &dec_csr_rdaddr_d[5]&dec_csr_rdaddr_d[2]) | (dec_csr_rdaddr_d[11] + &!dec_csr_rdaddr_d[10]&dec_csr_rdaddr_d[9]&dec_csr_rdaddr_d[8] + &dec_csr_rdaddr_d[7]&!dec_csr_rdaddr_d[5]&!dec_csr_rdaddr_d[4] + &dec_csr_rdaddr_d[3]&!dec_csr_rdaddr_d[2]) | (!dec_csr_rdaddr_d[11] + &dec_csr_rdaddr_d[10]&dec_csr_rdaddr_d[9]&dec_csr_rdaddr_d[8] + &dec_csr_rdaddr_d[7]&dec_csr_rdaddr_d[6]&!dec_csr_rdaddr_d[5] + &!dec_csr_rdaddr_d[4]&!dec_csr_rdaddr_d[0]) | (!dec_csr_rdaddr_d[11] + &!dec_csr_rdaddr_d[10]&dec_csr_rdaddr_d[9]&dec_csr_rdaddr_d[8] + &!dec_csr_rdaddr_d[7]&!dec_csr_rdaddr_d[6]&dec_csr_rdaddr_d[5] + &dec_csr_rdaddr_d[1]&dec_csr_rdaddr_d[0]) | (dec_csr_rdaddr_d[11] + &!dec_csr_rdaddr_d[10]&dec_csr_rdaddr_d[9]&dec_csr_rdaddr_d[8] + &dec_csr_rdaddr_d[7]&!dec_csr_rdaddr_d[5]&!dec_csr_rdaddr_d[4] + &dec_csr_rdaddr_d[3]&!dec_csr_rdaddr_d[1]&!dec_csr_rdaddr_d[0]) | ( + !dec_csr_rdaddr_d[11]&dec_csr_rdaddr_d[10]&dec_csr_rdaddr_d[9] + &dec_csr_rdaddr_d[8]&dec_csr_rdaddr_d[7]&dec_csr_rdaddr_d[6] + &!dec_csr_rdaddr_d[5]&!dec_csr_rdaddr_d[4]&dec_csr_rdaddr_d[3] + &!dec_csr_rdaddr_d[2]) | (dec_csr_rdaddr_d[11]&!dec_csr_rdaddr_d[10] + &dec_csr_rdaddr_d[9]&dec_csr_rdaddr_d[8]&!dec_csr_rdaddr_d[6] + &!dec_csr_rdaddr_d[5]&dec_csr_rdaddr_d[2]) | (!dec_csr_rdaddr_d[11] + &dec_csr_rdaddr_d[10]&dec_csr_rdaddr_d[9]&dec_csr_rdaddr_d[8] + &dec_csr_rdaddr_d[7]&!dec_csr_rdaddr_d[6]&dec_csr_rdaddr_d[5] + &!dec_csr_rdaddr_d[4]&!dec_csr_rdaddr_d[3]&!dec_csr_rdaddr_d[2] + &!dec_csr_rdaddr_d[0]) | (dec_csr_rdaddr_d[11]&!dec_csr_rdaddr_d[10] + &dec_csr_rdaddr_d[9]&dec_csr_rdaddr_d[8]&!dec_csr_rdaddr_d[6] + &!dec_csr_rdaddr_d[5]&dec_csr_rdaddr_d[1]) | (!dec_csr_rdaddr_d[11] + &!dec_csr_rdaddr_d[10]&dec_csr_rdaddr_d[9]&dec_csr_rdaddr_d[8] + &!dec_csr_rdaddr_d[7]&dec_csr_rdaddr_d[6]&!dec_csr_rdaddr_d[5] + &!dec_csr_rdaddr_d[4]&!dec_csr_rdaddr_d[3]&!dec_csr_rdaddr_d[2]) | ( + !dec_csr_rdaddr_d[11]&!dec_csr_rdaddr_d[10]&dec_csr_rdaddr_d[9] + &dec_csr_rdaddr_d[8]&!dec_csr_rdaddr_d[7]&!dec_csr_rdaddr_d[5] + &!dec_csr_rdaddr_d[4]&!dec_csr_rdaddr_d[3]&!dec_csr_rdaddr_d[1] + &!dec_csr_rdaddr_d[0]) | (!dec_csr_rdaddr_d[11]&!dec_csr_rdaddr_d[10] + &dec_csr_rdaddr_d[9]&dec_csr_rdaddr_d[8]&!dec_csr_rdaddr_d[7] + &!dec_csr_rdaddr_d[6]&dec_csr_rdaddr_d[5]&dec_csr_rdaddr_d[3]) | ( + !dec_csr_rdaddr_d[11]&!dec_csr_rdaddr_d[10]&dec_csr_rdaddr_d[9] + &dec_csr_rdaddr_d[8]&!dec_csr_rdaddr_d[7]&!dec_csr_rdaddr_d[6] + &dec_csr_rdaddr_d[5]&dec_csr_rdaddr_d[4]) | (dec_csr_rdaddr_d[11] + &!dec_csr_rdaddr_d[10]&dec_csr_rdaddr_d[9]&dec_csr_rdaddr_d[8] + &!dec_csr_rdaddr_d[6]&!dec_csr_rdaddr_d[5]&dec_csr_rdaddr_d[3]) | ( + dec_csr_rdaddr_d[11]&!dec_csr_rdaddr_d[10]&dec_csr_rdaddr_d[9] + &dec_csr_rdaddr_d[8]&!dec_csr_rdaddr_d[6]&!dec_csr_rdaddr_d[5] + &dec_csr_rdaddr_d[4]); + +assign dec_tlu_presync_d = presync & dec_csr_any_unq_d & ~dec_csr_wen_unq_d; +assign dec_tlu_postsync_d = postsync & dec_csr_any_unq_d; + +assign valid_csr = ( legal & (~(csr_dcsr | csr_dpc | csr_dmst | csr_dicawics | csr_dicad0 | csr_dicad0h | csr_dicad1 | csr_dicago) | dbg_tlu_halted_f) + & ~fast_int_meicpct); + +assign dec_csr_legal_d = ( dec_csr_any_unq_d & + valid_csr & // of a valid CSR + ~(dec_csr_wen_unq_d & (csr_mvendorid | csr_marchid | csr_mimpid | csr_mhartid | csr_mdseac | csr_meihap)) // that's not a write to a RO CSR + ); + // CSR read mux +assign dec_csr_rddata_d[31:0] = ( ({32{csr_misa}} & 32'h40001104) | + ({32{csr_mvendorid}} & 32'h00000045) | + ({32{csr_marchid}} & 32'h00000010) | + ({32{csr_mimpid}} & 32'h1) | + ({32{csr_mhartid}} & {core_id[31:4], 4'b0}) | + ({32{csr_mstatus}} & {19'b0, 2'b11, 3'b0, mstatus[1], 3'b0, mstatus[0], 3'b0}) | + ({32{csr_mtvec}} & {mtvec[30:1], 1'b0, mtvec[0]}) | + ({32{csr_mip}} & {1'b0, mip[3], 18'b0, mip[2], 3'b0, mip[1], 3'b0, mip[0], 3'b0}) | + ({32{csr_mie}} & {1'b0, mie[3], 18'b0, mie[2], 3'b0, mie[1], 3'b0, mie[0], 3'b0}) | + ({32{csr_mcyclel}} & mcyclel[31:0]) | + ({32{csr_mcycleh}} & mcycleh_inc[31:0]) | + ({32{csr_minstretl}} & minstretl_read[31:0]) | + ({32{csr_minstreth}} & minstreth_read[31:0]) | + ({32{csr_mscratch}} & mscratch[31:0]) | + ({32{csr_mepc}} & {mepc[31:1], 1'b0}) | + ({32{csr_mcause}} & mcause[31:0]) | + ({32{csr_mscause}} & {29'b0, mscause[2:0]}) | + ({32{csr_mtval}} & mtval[31:0]) | + ({32{csr_mrac}} & mrac[31:0]) | + ({32{csr_mdseac}} & mdseac[31:0]) | + ({32{csr_meivt}} & {meivt[31:10], 10'b0}) | + ({32{csr_meihap}} & {meivt[31:10], meihap[9:2], 2'b0}) | + ({32{csr_meicurpl}} & {28'b0, meicurpl[3:0]}) | + ({32{csr_meicidpl}} & {28'b0, meicidpl[3:0]}) | + ({32{csr_meipt}} & {28'b0, meipt[3:0]}) | + ({32{csr_mcgc}} & {23'b0, mcgc[8:0]}) | + ({32{csr_mfdc}} & {13'b0, mfdc[18:0]}) | + ({32{csr_dcsr}} & {16'h4000, dcsr[15:2], 2'b11}) | + ({32{csr_dpc}} & {dpc[31:1], 1'b0}) | + ({32{csr_dicad0}} & dicad0[31:0]) | + ({32{csr_dicad0h}} & dicad0h[31:0]) | + ({32{csr_dicad1}} & dicad1[31:0]) | + ({32{csr_dicawics}} & {7'b0, dicawics[16], 2'b0, dicawics[15:14], 3'b0, dicawics[13:0], 3'b0}) | + ({32{csr_mtsel}} & {30'b0, mtsel[1:0]}) | + ({32{csr_mtdata1}} & {mtdata1_tsel_out[31:0]}) | + ({32{csr_mtdata2}} & {mtdata2_tsel_out[31:0]}) | + ({32{csr_micect}} & {micect[31:0]}) | + ({32{csr_miccmect}} & {miccmect[31:0]}) | + ({32{csr_mdccmect}} & {mdccmect[31:0]}) | + ({32{csr_mhpmc3}} & mhpmc3[31:0]) | + ({32{csr_mhpmc4}} & mhpmc4[31:0]) | + ({32{csr_mhpmc5}} & mhpmc5[31:0]) | + ({32{csr_mhpmc6}} & mhpmc6[31:0]) | + ({32{csr_mhpmc3h}} & mhpmc3h[31:0]) | + ({32{csr_mhpmc4h}} & mhpmc4h[31:0]) | + ({32{csr_mhpmc5h}} & mhpmc5h[31:0]) | + ({32{csr_mhpmc6h}} & mhpmc6h[31:0]) | + ({32{csr_mfdht}} & {26'b0, mfdht[5:0]}) | + ({32{csr_mfdhs}} & {30'b0, mfdhs[1:0]}) | + ({32{csr_mhpme3}} & {22'b0,mhpme3[9:0]}) | + ({32{csr_mhpme4}} & {22'b0,mhpme4[9:0]}) | + ({32{csr_mhpme5}} & {22'b0,mhpme5[9:0]}) | + ({32{csr_mhpme6}} & {22'b0,mhpme6[9:0]}) | + ({32{csr_mcountinhibit}} & {25'b0, mcountinhibit[6:0]}) | + ({32{csr_mpmc}} & {30'b0, mpmc[1], 1'b0}) + ); + +endmodule // el2_dec_tlu_ctl diff --git a/design/dec/el2_dec_trigger.sv b/design/dec/el2_dec_trigger.sv new file mode 100644 index 0000000..6a8b165 --- /dev/null +++ b/design/dec/el2_dec_trigger.sv @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright 2020 Western Digital Corporation or it's affiliates. +// +// 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. + +//******************************************************************************** +// $Id$ +// +// +// Owner: +// Function: DEC Trigger Logic +// Comments: +// +//******************************************************************************** +module el2_dec_trigger +import el2_pkg::*; +#( +`include "el2_param.vh" + )( + + input el2_trigger_pkt_t [3:0] trigger_pkt_any, // Packet from tlu. 'select':0-pc,1-Opcode 'Execute' needs to be set for dec triggers to fire. 'match'-1 do mask, 0: full match + input logic [31:1] dec_i0_pc_d, // i0 pc + + output logic [3:0] dec_i0_trigger_match_d +); + + logic [3:0][31:0] dec_i0_match_data; + logic [3:0] dec_i0_trigger_data_match; + + for (genvar i=0; i<4; i++) begin + assign dec_i0_match_data[i][31:0] = ({32{~trigger_pkt_any[i].select & trigger_pkt_any[i].execute}} & {dec_i0_pc_d[31:1], trigger_pkt_any[i].tdata2[0]}); // select=0; do a PC match + + rvmaskandmatch trigger_i0_match (.mask(trigger_pkt_any[i].tdata2[31:0]), .data(dec_i0_match_data[i][31:0]), .masken(trigger_pkt_any[i].match), .match(dec_i0_trigger_data_match[i])); + + assign dec_i0_trigger_match_d[i] = trigger_pkt_any[i].execute & trigger_pkt_any[i].m & dec_i0_trigger_data_match[i]; + end + +endmodule // el2_dec_trigger + diff --git a/design/dmi/dmi_jtag_to_core_sync.v b/design/dmi/dmi_jtag_to_core_sync.v new file mode 100644 index 0000000..562f815 --- /dev/null +++ b/design/dmi/dmi_jtag_to_core_sync.v @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright 2018 Western Digital Corporation or it's affiliates. +// +// 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. +//------------------------------------------------------------------------------------ +// +// Copyright Western Digital, 2019 +// Owner : Alex Grobman +// Description: +// This module Synchronizes the signals between JTAG (TCK) and +// processor (Core_clk) +// +//------------------------------------------------------------------------------------- + +module dmi_jtag_to_core_sync ( +// JTAG signals +input rd_en, // 1 bit Read Enable from JTAG +input wr_en, // 1 bit Write enable from JTAG + +// Processor Signals +input rst_n, // Core reset +input clk, // Core clock + +output reg_en, // 1 bit Write interface bit to Processor +output reg_wr_en // 1 bit Write enable to Processor +); + +wire c_rd_en; +wire c_wr_en; +reg [2:0] rden, wren; + + +// Outputs +assign reg_en = c_wr_en | c_rd_en; +assign reg_wr_en = c_wr_en; + + +// synchronizers +always @ ( posedge clk or negedge rst_n) begin + if(!rst_n) begin + rden <= '0; + wren <= '0; + end + else begin + rden <= {rden[1:0], rd_en}; + wren <= {wren[1:0], wr_en}; + end +end + +assign c_rd_en = rden[1] & ~rden[2]; +assign c_wr_en = wren[1] & ~wren[2]; + + +endmodule diff --git a/design/dmi/dmi_wrapper.v b/design/dmi/dmi_wrapper.v new file mode 100644 index 0000000..d9fd741 --- /dev/null +++ b/design/dmi/dmi_wrapper.v @@ -0,0 +1,90 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright 2018 Western Digital Corporation or it's affiliates. +// +// 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. +//------------------------------------------------------------------------------------ +// +// Copyright Western Digital, 2018 +// Owner : Anusha Narayanamoorthy +// Description: +// Wrapper module for JTAG_TAP and DMI synchronizer +// +//------------------------------------------------------------------------------------- + +module dmi_wrapper( + + // JTAG signals + input trst_n, // JTAG reset + input tck, // JTAG clock + input tms, // Test mode select + input tdi, // Test Data Input + output tdo, // Test Data Output + output tdoEnable, // Test Data Output enable + + // Processor Signals + input core_rst_n, // Core reset + input core_clk, // Core clock + input [31:1] jtag_id, // JTAG ID + input [31:0] rd_data, // 32 bit Read data from Processor + output [31:0] reg_wr_data, // 32 bit Write data to Processor + output [6:0] reg_wr_addr, // 7 bit reg address to Processor + output reg_en, // 1 bit Read enable to Processor + output reg_wr_en, // 1 bit Write enable to Processor + output dmi_hard_reset +); + + + + + + //Wire Declaration + wire rd_en; + wire wr_en; + wire dmireset; + + + //jtag_tap instantiation + rvjtag_tap i_jtag_tap( + .trst(trst_n), // dedicated JTAG TRST (active low) pad signal or asynchronous active low power on reset + .tck(tck), // dedicated JTAG TCK pad signal + .tms(tms), // dedicated JTAG TMS pad signal + .tdi(tdi), // dedicated JTAG TDI pad signal + .tdo(tdo), // dedicated JTAG TDO pad signal + .tdoEnable(tdoEnable), // enable for TDO pad + .wr_data(reg_wr_data), // 32 bit Write data + .wr_addr(reg_wr_addr), // 7 bit Write address + .rd_en(rd_en), // 1 bit read enable + .wr_en(wr_en), // 1 bit Write enable + .rd_data(rd_data), // 32 bit Read data + .rd_status(2'b0), + .idle(3'h0), // no need to wait to sample data + .dmi_stat(2'b0), // no need to wait or error possible + .version(4'h1), // debug spec 0.13 compliant + .jtag_id(jtag_id), + .dmi_hard_reset(dmi_hard_reset), + .dmi_reset(dmireset) +); + + + // dmi_jtag_to_core_sync instantiation + dmi_jtag_to_core_sync i_dmi_jtag_to_core_sync( + .wr_en(wr_en), // 1 bit Write enable + .rd_en(rd_en), // 1 bit Read enable + + .rst_n(core_rst_n), + .clk(core_clk), + .reg_en(reg_en), // 1 bit Write interface bit + .reg_wr_en(reg_wr_en) // 1 bit Write enable + ); + +endmodule diff --git a/design/dmi/rvjtag_tap.v b/design/dmi/rvjtag_tap.v new file mode 100644 index 0000000..2463434 --- /dev/null +++ b/design/dmi/rvjtag_tap.v @@ -0,0 +1,223 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright 2019 Western Digital Corporation or it's affiliates. +// +// 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 + +module rvjtag_tap #( +parameter AWIDTH = 7 +) +( +input trst, +input tck, +input tms, +input tdi, +output reg tdo, +output tdoEnable, + +output [31:0] wr_data, +output [AWIDTH-1:0] wr_addr, +output wr_en, +output rd_en, + +input [31:0] rd_data, +input [1:0] rd_status, + +output reg dmi_reset, +output reg dmi_hard_reset, + +input [2:0] idle, +input [1:0] dmi_stat, +/* +-- revisionCode : 4'h0; +-- manufacturersIdCode : 11'h45; +-- deviceIdCode : 16'h0001; +-- order MSB .. LSB -> [4 bit version or revision] [16 bit part number] [11 bit manufacturer id] [value of 1'b1 in LSB] +*/ +input [31:1] jtag_id, +input [3:0] version +); + +localparam USER_DR_LENGTH = AWIDTH + 34; + + +reg [USER_DR_LENGTH-1:0] sr, nsr, dr; + +/////////////////////////////////////////////////////// +// Tap controller +/////////////////////////////////////////////////////// +logic[3:0] state, nstate; +logic [4:0] ir; +wire jtag_reset; +wire shift_dr; +wire pause_dr; +wire update_dr; +wire capture_dr; +wire shift_ir; +wire pause_ir ; +wire update_ir ; +wire capture_ir; +wire[1:0] dr_en; +wire devid_sel; +wire [5:0] abits; + +assign abits = AWIDTH[5:0]; + + +localparam TEST_LOGIC_RESET_STATE = 0; +localparam RUN_TEST_IDLE_STATE = 1; +localparam SELECT_DR_SCAN_STATE = 2; +localparam CAPTURE_DR_STATE = 3; +localparam SHIFT_DR_STATE = 4; +localparam EXIT1_DR_STATE = 5; +localparam PAUSE_DR_STATE = 6; +localparam EXIT2_DR_STATE = 7; +localparam UPDATE_DR_STATE = 8; +localparam SELECT_IR_SCAN_STATE = 9; +localparam CAPTURE_IR_STATE = 10; +localparam SHIFT_IR_STATE = 11; +localparam EXIT1_IR_STATE = 12; +localparam PAUSE_IR_STATE = 13; +localparam EXIT2_IR_STATE = 14; +localparam UPDATE_IR_STATE = 15; + +always_comb begin + nstate = state; + case(state) + TEST_LOGIC_RESET_STATE: nstate = tms ? TEST_LOGIC_RESET_STATE : RUN_TEST_IDLE_STATE; + RUN_TEST_IDLE_STATE: nstate = tms ? SELECT_DR_SCAN_STATE : RUN_TEST_IDLE_STATE; + SELECT_DR_SCAN_STATE: nstate = tms ? SELECT_IR_SCAN_STATE : CAPTURE_DR_STATE; + CAPTURE_DR_STATE: nstate = tms ? EXIT1_DR_STATE : SHIFT_DR_STATE; + SHIFT_DR_STATE: nstate = tms ? EXIT1_DR_STATE : SHIFT_DR_STATE; + EXIT1_DR_STATE: nstate = tms ? UPDATE_DR_STATE : PAUSE_DR_STATE; + PAUSE_DR_STATE: nstate = tms ? EXIT2_DR_STATE : PAUSE_DR_STATE; + EXIT2_DR_STATE: nstate = tms ? UPDATE_DR_STATE : SHIFT_DR_STATE; + UPDATE_DR_STATE: nstate = tms ? SELECT_DR_SCAN_STATE : RUN_TEST_IDLE_STATE; + SELECT_IR_SCAN_STATE: nstate = tms ? TEST_LOGIC_RESET_STATE : CAPTURE_IR_STATE; + CAPTURE_IR_STATE: nstate = tms ? EXIT1_IR_STATE : SHIFT_IR_STATE; + SHIFT_IR_STATE: nstate = tms ? EXIT1_IR_STATE : SHIFT_IR_STATE; + EXIT1_IR_STATE: nstate = tms ? UPDATE_IR_STATE : PAUSE_IR_STATE; + PAUSE_IR_STATE: nstate = tms ? EXIT2_IR_STATE : PAUSE_IR_STATE; + EXIT2_IR_STATE: nstate = tms ? UPDATE_IR_STATE : SHIFT_IR_STATE; + UPDATE_IR_STATE: nstate = tms ? SELECT_DR_SCAN_STATE : RUN_TEST_IDLE_STATE; + default: nstate = TEST_LOGIC_RESET_STATE; + endcase +end + +always @ (posedge tck or negedge trst) begin + if(!trst) state <= TEST_LOGIC_RESET_STATE; + else state <= nstate; +end + +assign jtag_reset = state == TEST_LOGIC_RESET_STATE; +assign shift_dr = state == SHIFT_DR_STATE; +assign pause_dr = state == PAUSE_DR_STATE; +assign update_dr = state == UPDATE_DR_STATE; +assign capture_dr = state == CAPTURE_DR_STATE; +assign shift_ir = state == SHIFT_IR_STATE; +assign pause_ir = state == PAUSE_IR_STATE; +assign update_ir = state == UPDATE_IR_STATE; +assign capture_ir = state == CAPTURE_IR_STATE; + +assign tdoEnable = shift_dr | shift_ir; + +/////////////////////////////////////////////////////// +// IR register +/////////////////////////////////////////////////////// + +always @ (negedge tck or negedge trst) begin + if (!trst) ir <= 5'b1; + else begin + if (jtag_reset) ir <= 5'b1; + else if (update_ir) ir <= (sr[4:0] == '0) ? 5'h1f :sr[4:0]; + end +end + + +assign devid_sel = ir == 5'b00001; +assign dr_en[0] = ir == 5'b10000; +assign dr_en[1] = ir == 5'b10001; + +/////////////////////////////////////////////////////// +// Shift register +/////////////////////////////////////////////////////// +always @ (posedge tck or negedge trst) begin + if(!trst)begin + sr <= '0; + end + else begin + sr <= nsr; + end +end + +// SR next value +always_comb begin + nsr = sr; + case(1) + shift_dr: begin + case(1) + dr_en[1]: nsr = {tdi, sr[USER_DR_LENGTH-1:1]}; + + dr_en[0], + devid_sel: nsr = {{USER_DR_LENGTH-32{1'b0}},tdi, sr[31:1]}; + default: nsr = {{USER_DR_LENGTH-1{1'b0}},tdi}; // bypass + endcase + end + capture_dr: begin + case(1) + dr_en[0]: nsr = {{USER_DR_LENGTH-15{1'b0}}, idle, dmi_stat, abits, version}; + dr_en[1]: nsr = {{AWIDTH{1'b0}}, rd_data, rd_status}; + devid_sel: nsr = {{USER_DR_LENGTH-32{1'b0}}, jtag_id, 1'b1}; + endcase + end + shift_ir: nsr = {{USER_DR_LENGTH-5{1'b0}},tdi, sr[4:1]}; + capture_ir: nsr = {{USER_DR_LENGTH-1{1'b0}},1'b1}; + endcase +end + +// TDO retiming +always @ (negedge tck ) tdo <= sr[0]; + +// DMI CS register +always @ (posedge tck or negedge trst) begin + if(!trst) begin + dmi_hard_reset <= 1'b0; + dmi_reset <= 1'b0; + end + else if (update_dr & dr_en[0]) begin + dmi_hard_reset <= sr[17]; + dmi_reset <= sr[16]; + end + else begin + dmi_hard_reset <= 1'b0; + dmi_reset <= 1'b0; + end +end + +// DR register +always @ (posedge tck or negedge trst) begin + if(!trst) + dr <= '0; + else begin + if (update_dr & dr_en[1]) + dr <= sr; + else + dr <= {dr[USER_DR_LENGTH-1:2],2'b0}; + end +end + +assign {wr_addr, wr_data, wr_en, rd_en} = dr; + + + + +endmodule diff --git a/design/el2_dma_ctrl.sv b/design/el2_dma_ctrl.sv new file mode 100644 index 0000000..13ff113 --- /dev/null +++ b/design/el2_dma_ctrl.sv @@ -0,0 +1,609 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright 2020 Western Digital Corporation or it's affiliates. +// +// 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. + +//******************************************************************************** +// $Id$ +// +// Function: Top level SWERV core file +// Comments: +// +//******************************************************************************** + +module el2_dma_ctrl #( +`include "el2_param.vh" + )( + input logic clk, + input logic free_clk, + input logic rst_l, + input logic dma_bus_clk_en, // slave bus clock enable + input logic clk_override, + input logic scan_mode, + + // Debug signals + input logic [31:0] dbg_cmd_addr, + input logic [31:0] dbg_cmd_wrdata, + input logic dbg_cmd_valid, + input logic dbg_cmd_write, // 1: write command, 0: read_command + input logic [1:0] dbg_cmd_type, // 0:gpr 1:csr 2: memory + input logic [1:0] dbg_cmd_size, // size of the abstract mem access debug command + + input logic dbg_dma_bubble, // Debug needs a bubble to send a valid + output logic dma_dbg_ready, // DMA is ready to accept debug request + + output logic dma_dbg_cmd_done, + output logic dma_dbg_cmd_fail, + output logic [31:0] dma_dbg_rddata, + + // Core side signals + output logic dma_dccm_req, // DMA dccm request (only one of dccm/iccm will be set) + output logic dma_iccm_req, // DMA iccm request + output logic [2:0] dma_mem_tag, // DMA Buffer entry number + output logic [31:0] dma_mem_addr, // DMA request address + output logic [2:0] dma_mem_sz, // DMA request size + output logic dma_mem_write, // DMA write to dccm/iccm + output logic [63:0] dma_mem_wdata, // DMA write data + + input logic dccm_dma_rvalid, // dccm data valid for DMA read + input logic dccm_dma_ecc_error, // ECC error on DMA read + input logic [2:0] dccm_dma_rtag, // Tag of the DMA req + input logic [63:0] dccm_dma_rdata, // dccm data for DMA read + input logic iccm_dma_rvalid, // iccm data valid for DMA read + input logic iccm_dma_ecc_error, // ECC error on DMA read + input logic [2:0] iccm_dma_rtag, // Tag of the DMA req + input logic [63:0] iccm_dma_rdata, // iccm data for DMA read + + output logic dma_dccm_stall_any, // stall dccm pipe (bubble) so that DMA can proceed + output logic dma_iccm_stall_any, // stall iccm pipe (bubble) so that DMA can proceed + input logic dccm_ready, // dccm ready to accept DMA request + input logic iccm_ready, // iccm ready to accept DMA request + input logic [2:0] dec_tlu_dma_qos_prty, // DMA QoS priority coming from MFDC [18:15] + + // PMU signals + output logic dma_pmu_dccm_read, + output logic dma_pmu_dccm_write, + output logic dma_pmu_any_read, + output logic dma_pmu_any_write, + + // AXI Write Channels + input logic dma_axi_awvalid, + output logic dma_axi_awready, + input logic [pt.DMA_BUS_TAG-1:0] dma_axi_awid, + input logic [31:0] dma_axi_awaddr, + input logic [2:0] dma_axi_awsize, + + + input logic dma_axi_wvalid, + output logic dma_axi_wready, + input logic [63:0] dma_axi_wdata, + input logic [7:0] dma_axi_wstrb, + + output logic dma_axi_bvalid, + input logic dma_axi_bready, + output logic [1:0] dma_axi_bresp, + output logic [pt.DMA_BUS_TAG-1:0] dma_axi_bid, + + // AXI Read Channels + input logic dma_axi_arvalid, + output logic dma_axi_arready, + input logic [pt.DMA_BUS_TAG-1:0] dma_axi_arid, + input logic [31:0] dma_axi_araddr, + input logic [2:0] dma_axi_arsize, + + output logic dma_axi_rvalid, + input logic dma_axi_rready, + output logic [pt.DMA_BUS_TAG-1:0] dma_axi_rid, + output logic [63:0] dma_axi_rdata, + output logic [1:0] dma_axi_rresp, + output logic dma_axi_rlast +); + + + localparam DEPTH = pt.DMA_BUF_DEPTH; + localparam DEPTH_PTR = $clog2(DEPTH); + localparam NACK_COUNT = 7; + + logic [DEPTH-1:0] fifo_valid; + logic [DEPTH-1:0][1:0] fifo_error; + logic [DEPTH-1:0] fifo_error_bus; + logic [DEPTH-1:0] fifo_rpend; + logic [DEPTH-1:0] fifo_done; // DMA trxn is done in core + logic [DEPTH-1:0] fifo_done_bus; // DMA trxn is done in core but synced to bus clock + logic [DEPTH-1:0][31:0] fifo_addr; + logic [DEPTH-1:0][2:0] fifo_sz; + logic [DEPTH-1:0][7:0] fifo_byteen; + logic [DEPTH-1:0] fifo_write; + logic [DEPTH-1:0] fifo_posted_write; + logic [DEPTH-1:0] fifo_dbg; + logic [DEPTH-1:0][63:0] fifo_data; + logic [DEPTH-1:0][pt.DMA_BUS_TAG-1:0] fifo_tag; + logic [DEPTH-1:0][pt.DMA_BUS_ID-1:0] fifo_mid; + logic [DEPTH-1:0][pt.DMA_BUS_PRTY-1:0] fifo_prty; + + logic [DEPTH-1:0] fifo_cmd_en; + logic [DEPTH-1:0] fifo_data_en; + logic [DEPTH-1:0] fifo_pend_en; + logic [DEPTH-1:0] fifo_done_en; + logic [DEPTH-1:0] fifo_done_bus_en; + logic [DEPTH-1:0] fifo_error_en; + logic [DEPTH-1:0] fifo_error_bus_en; + logic [DEPTH-1:0] fifo_reset; + logic [DEPTH-1:0][1:0] fifo_error_in; + logic [DEPTH-1:0][63:0] fifo_data_in; + + logic fifo_write_in; + logic fifo_posted_write_in; + logic fifo_dbg_in; + logic [31:0] fifo_addr_in; + logic [2:0] fifo_sz_in; + logic [7:0] fifo_byteen_in; + + logic [DEPTH_PTR-1:0] RspPtr, NxtRspPtr; + logic [DEPTH_PTR-1:0] WrPtr, NxtWrPtr; + logic [DEPTH_PTR-1:0] RdPtr, NxtRdPtr; + logic WrPtrEn, RdPtrEn, RspPtrEn; + + logic dma_dbg_cmd_error; + logic dma_dbg_cmd_done_q; + + logic fifo_full, fifo_full_spec, fifo_empty; + logic dma_address_error, dma_alignment_error; + logic [3:0] num_fifo_vld; + logic dma_mem_req; + logic [31:0] dma_mem_addr_int; + logic [2:0] dma_mem_sz_int; + logic [7:0] dma_mem_byteen; + logic dma_mem_addr_in_dccm; + logic dma_mem_addr_in_iccm; + logic dma_mem_addr_in_pic; + logic dma_mem_addr_in_pic_region_nc; + logic dma_mem_addr_in_dccm_region_nc; + logic dma_mem_addr_in_iccm_region_nc; + + logic [2:0] dma_nack_count, dma_nack_count_d, dma_nack_count_csr; + + logic dma_buffer_c1_clken; + logic dma_free_clken; + logic dma_buffer_c1_clk; + logic dma_free_clk; + logic dma_bus_clk; + + logic bus_rsp_valid, bus_rsp_sent; + logic bus_cmd_valid, bus_cmd_sent; + logic bus_cmd_write, bus_cmd_posted_write; + logic [7:0] bus_cmd_byteen; + logic [2:0] bus_cmd_sz; + logic [31:0] bus_cmd_addr; + logic [63:0] bus_cmd_wdata; + logic [pt.DMA_BUS_TAG-1:0] bus_cmd_tag; + logic [pt.DMA_BUS_ID-1:0] bus_cmd_mid; + logic [pt.DMA_BUS_PRTY-1:0] bus_cmd_prty; + logic bus_posted_write_done; + + logic fifo_full_spec_bus; + logic dbg_dma_bubble_bus; + logic dma_fifo_ready; + + logic wrbuf_en, wrbuf_data_en; + logic wrbuf_cmd_sent, wrbuf_rst, wrbuf_data_rst; + logic wrbuf_vld, wrbuf_data_vld; + logic [pt.DMA_BUS_TAG-1:0] wrbuf_tag; + logic [2:0] wrbuf_sz; + logic [31:0] wrbuf_addr; + logic [63:0] wrbuf_data; + logic [7:0] wrbuf_byteen; + + logic rdbuf_en; + logic rdbuf_cmd_sent, rdbuf_rst; + logic rdbuf_vld; + logic [pt.DMA_BUS_TAG-1:0] rdbuf_tag; + logic [2:0] rdbuf_sz; + logic [31:0] rdbuf_addr; + + logic axi_mstr_prty_in, axi_mstr_prty_en; + logic axi_mstr_priority; + logic axi_mstr_sel; + + logic axi_rsp_valid, axi_rsp_sent; + logic axi_rsp_write; + logic [pt.DMA_BUS_TAG-1:0] axi_rsp_tag; + logic [1:0] axi_rsp_error; + logic [63:0] axi_rsp_rdata; + + //------------------------LOGIC STARTS HERE--------------------------------- + + // FIFO inputs + assign fifo_addr_in[31:0] = dbg_cmd_valid ? dbg_cmd_addr[31:0] : bus_cmd_addr[31:0]; + assign fifo_byteen_in[7:0] = dbg_cmd_valid ? (8'h0f << 4*dbg_cmd_addr[2]) : bus_cmd_byteen[7:0]; + assign fifo_sz_in[2:0] = dbg_cmd_valid ? {1'b0,dbg_cmd_size[1:0]} : bus_cmd_sz[2:0]; + assign fifo_write_in = dbg_cmd_valid ? dbg_cmd_write : bus_cmd_write; + assign fifo_posted_write_in = ~dbg_cmd_valid & bus_cmd_posted_write; + assign fifo_dbg_in = dbg_cmd_valid; + + for (genvar i=0 ;i<32'(DEPTH); i++) begin: GenFifo + assign fifo_cmd_en[i] = ((bus_cmd_sent & dma_bus_clk_en) | (dbg_cmd_valid & dbg_cmd_type[1])) & (DEPTH_PTR'(i) == WrPtr[DEPTH_PTR-1:0]); + assign fifo_data_en[i] = (((bus_cmd_sent & fifo_write_in & dma_bus_clk_en) | (dbg_cmd_valid & dbg_cmd_type[1] & dbg_cmd_write)) & (i == WrPtr[DEPTH_PTR-1:0])) | + ((dma_address_error | dma_alignment_error) & (i == RdPtr[DEPTH_PTR-1:0])) | + (dccm_dma_rvalid & (i == DEPTH_PTR'(dccm_dma_rtag[2:0]))) | + (iccm_dma_rvalid & (i == DEPTH_PTR'(iccm_dma_rtag[2:0]))); + assign fifo_pend_en[i] = (dma_dccm_req | dma_iccm_req) & ~dma_mem_write & (i == RdPtr[DEPTH_PTR-1:0]); + assign fifo_error_en[i] = ((dma_address_error | dma_alignment_error | dma_dbg_cmd_error) & (i == RdPtr[DEPTH_PTR-1:0])) | + ((dccm_dma_rvalid & dccm_dma_ecc_error) & (i == DEPTH_PTR'(dccm_dma_rtag[2:0]))) | + ((iccm_dma_rvalid & iccm_dma_ecc_error) & (i == DEPTH_PTR'(iccm_dma_rtag[2:0]))); + assign fifo_error_bus_en[i] = (((|fifo_error_in[i][1:0]) & fifo_error_en[i]) | (|fifo_error[i])) & dma_bus_clk_en; + assign fifo_done_en[i] = ((|fifo_error[i] | fifo_error_en[i] | ((dma_dccm_req | dma_iccm_req) & dma_mem_write)) & (i == RdPtr[DEPTH_PTR-1:0])) | + (dccm_dma_rvalid & (i == DEPTH_PTR'(dccm_dma_rtag[2:0]))) | + (iccm_dma_rvalid & (i == DEPTH_PTR'(iccm_dma_rtag[2:0]))); + assign fifo_done_bus_en[i] = (fifo_done_en[i] | fifo_done[i]) & dma_bus_clk_en; + assign fifo_reset[i] = (((bus_rsp_sent | bus_posted_write_done) & dma_bus_clk_en) | dma_dbg_cmd_done) & (i == RspPtr[DEPTH_PTR-1:0]); + assign fifo_error_in[i] = (dccm_dma_rvalid & (i == DEPTH_PTR'(dccm_dma_rtag[2:0]))) ? {1'b0,dccm_dma_ecc_error} : (iccm_dma_rvalid & (i == DEPTH_PTR'(iccm_dma_rtag[2:0]))) ? {1'b0,iccm_dma_ecc_error} : + {(dma_address_error | dma_alignment_error | dma_dbg_cmd_error), dma_alignment_error}; + assign fifo_data_in[i] = (fifo_error_en[i] & (|fifo_error_in[i])) ? {32'b0,fifo_addr[i]} : + ((dccm_dma_rvalid & (i == DEPTH_PTR'(dccm_dma_rtag[2:0]))) ? dccm_dma_rdata[63:0] : (iccm_dma_rvalid & (i == DEPTH_PTR'(iccm_dma_rtag[2:0]))) ? iccm_dma_rdata[63:0] : + (dbg_cmd_valid ? {2{dbg_cmd_wrdata[31:0]}} : bus_cmd_wdata[63:0])); + + rvdffsc #(1) fifo_valid_dff (.din(1'b1), .dout(fifo_valid[i]), .en(fifo_cmd_en[i]), .clear(fifo_reset[i]), .clk(dma_free_clk), .*); + rvdffsc #(2) fifo_error_dff (.din(fifo_error_in[i]), .dout(fifo_error[i]), .en(fifo_error_en[i]), .clear(fifo_reset[i]), .clk(dma_free_clk), .*); + rvdffsc #(1) fifo_error_bus_dff (.din(1'b1), .dout(fifo_error_bus[i]), .en(fifo_error_bus_en[i]), .clear(fifo_reset[i]), .clk(dma_free_clk), .*); + rvdffsc #(1) fifo_rpend_dff (.din(1'b1), .dout(fifo_rpend[i]), .en(fifo_pend_en[i]), .clear(fifo_reset[i]), .clk(dma_free_clk), .*); + rvdffsc #(1) fifo_done_dff (.din(1'b1), .dout(fifo_done[i]), .en(fifo_done_en[i]), .clear(fifo_reset[i]), .clk(dma_free_clk), .*); + rvdffsc #(1) fifo_done_bus_dff (.din(1'b1), .dout(fifo_done_bus[i]), .en(fifo_done_bus_en[i]), .clear(fifo_reset[i]), .clk(dma_free_clk), .*); + rvdffe #(32) fifo_addr_dff (.din(fifo_addr_in[31:0]), .dout(fifo_addr[i]), .en(fifo_cmd_en[i]), .*); + rvdffs #(3) fifo_sz_dff (.din(fifo_sz_in[2:0]), .dout(fifo_sz[i]), .en(fifo_cmd_en[i]), .clk(dma_buffer_c1_clk), .*); + rvdffs #(8) fifo_byteen_dff (.din(fifo_byteen_in[7:0]), .dout(fifo_byteen[i]), .en(fifo_cmd_en[i]), .clk(dma_buffer_c1_clk), .*); + rvdffs #(1) fifo_write_dff (.din(fifo_write_in), .dout(fifo_write[i]), .en(fifo_cmd_en[i]), .clk(dma_buffer_c1_clk), .*); + rvdffs #(1) fifo_posted_write_dff (.din(fifo_posted_write_in), .dout(fifo_posted_write[i]), .en(fifo_cmd_en[i]), .clk(dma_buffer_c1_clk), .*); + rvdffs #(1) fifo_dbg_dff (.din(fifo_dbg_in), .dout(fifo_dbg[i]), .en(fifo_cmd_en[i]), .clk(dma_buffer_c1_clk), .*); + rvdffe #(64) fifo_data_dff (.din(fifo_data_in[i]), .dout(fifo_data[i]), .en(fifo_data_en[i]), .*); + rvdffs #(pt.DMA_BUS_TAG) fifo_tag_dff(.din(bus_cmd_tag[pt.DMA_BUS_TAG-1:0]), .dout(fifo_tag[i][pt.DMA_BUS_TAG-1:0]), .en(fifo_cmd_en[i]), .clk(dma_buffer_c1_clk), .*); + rvdffs #(pt.DMA_BUS_ID) fifo_mid_dff(.din(bus_cmd_mid[pt.DMA_BUS_ID-1:0]), .dout(fifo_mid[i][pt.DMA_BUS_ID-1:0]), .en(fifo_cmd_en[i]), .clk(dma_buffer_c1_clk), .*); + rvdffs #(pt.DMA_BUS_PRTY) fifo_prty_dff(.din(bus_cmd_prty[pt.DMA_BUS_PRTY-1:0]), .dout(fifo_prty[i][pt.DMA_BUS_PRTY-1:0]), .en(fifo_cmd_en[i]), .clk(dma_buffer_c1_clk), .*); + end + + // Pointer logic + assign NxtWrPtr[DEPTH_PTR-1:0] = (WrPtr[DEPTH_PTR-1:0] == (DEPTH-1)) ? '0 : WrPtr[DEPTH_PTR-1:0] + 1'b1; + assign NxtRdPtr[DEPTH_PTR-1:0] = (RdPtr[DEPTH_PTR-1:0] == (DEPTH-1)) ? '0 : RdPtr[DEPTH_PTR-1:0] + 1'b1; + assign NxtRspPtr[DEPTH_PTR-1:0] = (RspPtr[DEPTH_PTR-1:0] == (DEPTH-1)) ? '0 : RspPtr[DEPTH_PTR-1:0] + 1'b1; + + assign WrPtrEn = |fifo_cmd_en[DEPTH-1:0]; + assign RdPtrEn = dma_dccm_req | dma_iccm_req | (dma_address_error | dma_alignment_error | dma_dbg_cmd_error); + assign RspPtrEn = (dma_dbg_cmd_done | (bus_rsp_sent | bus_posted_write_done) & dma_bus_clk_en); + + rvdffs #(DEPTH_PTR) WrPtr_dff(.din(NxtWrPtr[DEPTH_PTR-1:0]), .dout(WrPtr[DEPTH_PTR-1:0]), .en(WrPtrEn), .clk(dma_free_clk), .*); + rvdffs #(DEPTH_PTR) RdPtr_dff(.din(NxtRdPtr[DEPTH_PTR-1:0]), .dout(RdPtr[DEPTH_PTR-1:0]), .en(RdPtrEn), .clk(dma_free_clk), .*); + rvdffs #(DEPTH_PTR) RspPtr_dff(.din(NxtRspPtr[DEPTH_PTR-1:0]), .dout(RspPtr[DEPTH_PTR-1:0]), .en(RspPtrEn), .clk(dma_free_clk), .*); + + // Miscellaneous signals + assign fifo_full = fifo_full_spec_bus; + + always_comb begin + num_fifo_vld[3:0] = {3'b0,bus_cmd_sent} - {3'b0,bus_rsp_sent}; + for (int i=0; i= DEPTH); + + assign dma_fifo_ready = ~(fifo_full | dbg_dma_bubble_bus); + + // Error logic + assign dma_address_error = fifo_valid[RdPtr] & ~fifo_done[RdPtr] & ~fifo_dbg[RdPtr] & (~(dma_mem_addr_in_dccm | dma_mem_addr_in_iccm)); // request not for ICCM or DCCM + assign dma_alignment_error = fifo_valid[RdPtr] & ~fifo_done[RdPtr] & ~dma_address_error & + (((dma_mem_sz_int[2:0] == 3'h1) & dma_mem_addr_int[0]) | // HW size but unaligned + ((dma_mem_sz_int[2:0] == 3'h2) & (|dma_mem_addr_int[1:0])) | // W size but unaligned + ((dma_mem_sz_int[2:0] == 3'h3) & (|dma_mem_addr_int[2:0])) | // DW size but unaligned + (dma_mem_addr_in_iccm & ~((dma_mem_sz_int[1:0] == 2'b10) | (dma_mem_sz_int[1:0] == 2'b11))) | // ICCM access not word size + (dma_mem_addr_in_dccm & dma_mem_write & ~((dma_mem_sz_int[1:0] == 2'b10) | (dma_mem_sz_int[1:0] == 2'b11))) | // DCCM write not word size + (dma_mem_write & (dma_mem_sz_int[2:0] == 3'h2) & (dma_mem_byteen[dma_mem_addr_int[2:0]+:4] != 4'hf)) | // Write byte enables not aligned for word store + (dma_mem_write & (dma_mem_sz_int[2:0] == 3'h3) & ~((dma_mem_byteen[7:0] == 8'h0f) | (dma_mem_byteen[7:0] == 8'hf0) | (dma_mem_byteen[7:0] == 8'hff)))); // Write byte enables not aligned for dword store + + + //Dbg outputs + assign dma_dbg_ready = fifo_empty & dbg_dma_bubble_bus; + assign dma_dbg_cmd_done = (fifo_valid[RspPtr] & fifo_dbg[RspPtr] & fifo_done[RspPtr]); + assign dma_dbg_rddata[31:0] = fifo_addr[RspPtr][2] ? fifo_data[RspPtr][63:32] : fifo_data[RspPtr][31:0]; + assign dma_dbg_cmd_fail = |fifo_error[RspPtr]; + + assign dma_dbg_cmd_error = fifo_valid[RdPtr] & ~fifo_done[RdPtr] & fifo_dbg[RdPtr] & + ((~(dma_mem_addr_in_dccm | dma_mem_addr_in_iccm | dma_mem_addr_in_pic)) | (dma_mem_sz_int[1:0] != 2'b10)); // Only word accesses allowed + + // Block the decode if fifo full + assign dma_dccm_stall_any = dma_mem_req & (dma_mem_addr_in_dccm | dma_mem_addr_in_pic) & (dma_nack_count >= dma_nack_count_csr); + assign dma_iccm_stall_any = dma_mem_req & dma_mem_addr_in_iccm & (dma_nack_count >= dma_nack_count_csr); + + // Used to indicate ready to debug + assign fifo_empty = ~(|(fifo_valid[DEPTH-1:0])); + + // Nack counter, stall the lsu pipe if 7 nacks + assign dma_nack_count_csr[2:0] = dec_tlu_dma_qos_prty[2:0]; + assign dma_nack_count_d[2:0] = (dma_nack_count[2:0] >= dma_nack_count_csr[2:0]) ? ({3{~(dma_dccm_req | dma_iccm_req)}} & dma_nack_count[2:0]) : + (dma_mem_req & ~(dma_dccm_req | dma_iccm_req)) ? (dma_nack_count[2:0] + 1'b1) : 3'b0; + + rvdffs #(3) nack_count_dff(.din(dma_nack_count_d[2:0]), .dout(dma_nack_count[2:0]), .en(dma_mem_req), .clk(dma_free_clk), .*); + + // Core outputs + assign dma_mem_req = fifo_valid[RdPtr] & ~fifo_rpend[RdPtr] & ~fifo_done[RdPtr] & ~(dma_address_error | dma_alignment_error | dma_dbg_cmd_error); + assign dma_dccm_req = dma_mem_req & (dma_mem_addr_in_dccm | dma_mem_addr_in_pic) & dccm_ready; + assign dma_iccm_req = dma_mem_req & dma_mem_addr_in_iccm & iccm_ready; + assign dma_mem_tag[2:0] = 3'(RdPtr); + assign dma_mem_addr_int[31:0] = fifo_addr[RdPtr]; + assign dma_mem_sz_int[2:0] = fifo_sz[RdPtr]; + assign dma_mem_addr[31:0] = (dma_mem_write & (dma_mem_byteen[7:0] == 8'hf0)) ? {dma_mem_addr_int[31:3],1'b1,dma_mem_addr_int[1:0]} : dma_mem_addr_int[31:0]; + assign dma_mem_sz[2:0] = (dma_mem_write & ((dma_mem_byteen[7:0] == 8'h0f) | (dma_mem_byteen[7:0] == 8'hf0))) ? 3'h2 : dma_mem_sz_int[2:0]; + assign dma_mem_byteen[7:0] = fifo_byteen[RdPtr]; + assign dma_mem_write = fifo_write[RdPtr]; + assign dma_mem_wdata[63:0] = fifo_data[RdPtr]; + + // PMU outputs + assign dma_pmu_dccm_read = dma_dccm_req & ~dma_mem_write; + assign dma_pmu_dccm_write = dma_dccm_req & dma_mem_write; + assign dma_pmu_any_read = (dma_dccm_req | dma_iccm_req) & ~dma_mem_write; + assign dma_pmu_any_write = (dma_dccm_req | dma_iccm_req) & dma_mem_write; + + // Address check dccm + rvrangecheck #(.CCM_SADR(pt.DCCM_SADR), + .CCM_SIZE(pt.DCCM_SIZE)) addr_dccm_rangecheck ( + .addr(dma_mem_addr_int[31:0]), + .in_range(dma_mem_addr_in_dccm), + .in_region(dma_mem_addr_in_dccm_region_nc) + ); + + // Address check iccm + if (pt.ICCM_ENABLE) begin + rvrangecheck #(.CCM_SADR(pt.ICCM_SADR), + .CCM_SIZE(pt.ICCM_SIZE)) addr_iccm_rangecheck ( + .addr(dma_mem_addr_int[31:0]), + .in_range(dma_mem_addr_in_iccm), + .in_region(dma_mem_addr_in_iccm_region_nc) + ); + end + else begin + assign dma_mem_addr_in_iccm = '0; + assign dma_mem_addr_in_iccm_region_nc = '0; + end // else: !if(pt.ICCM_ENABLE) + + + // PIC memory address check + rvrangecheck #(.CCM_SADR(pt.PIC_BASE_ADDR), + .CCM_SIZE(pt.PIC_SIZE)) addr_pic_rangecheck ( + .addr(dma_mem_addr_int[31:0]), + .in_range(dma_mem_addr_in_pic), + .in_region(dma_mem_addr_in_pic_region_nc) + ); + + + // Inputs + rvdff #(1) fifo_full_bus_ff (.din(fifo_full_spec), .dout(fifo_full_spec_bus), .clk(dma_bus_clk), .*); + rvdff #(1) dbg_dma_bubble_ff (.din(dbg_dma_bubble), .dout(dbg_dma_bubble_bus), .clk(dma_bus_clk), .*); + rvdff #(1) dma_dbg_cmd_doneff (.din(dma_dbg_cmd_done), .dout(dma_dbg_cmd_done_q), .clk(free_clk), .*); + + // Clock Gating logic + assign dma_buffer_c1_clken = (bus_cmd_valid & dma_bus_clk_en) | dbg_cmd_valid | clk_override; + assign dma_free_clken = (bus_cmd_valid | bus_rsp_valid | dbg_cmd_valid | dma_dbg_cmd_done | dma_dbg_cmd_done_q | (|fifo_valid[DEPTH-1:0]) | clk_override); + + rvoclkhdr dma_buffer_c1cgc ( .en(dma_buffer_c1_clken), .l1clk(dma_buffer_c1_clk), .* ); + rvoclkhdr dma_free_cgc (.en(dma_free_clken), .l1clk(dma_free_clk), .*); + rvclkhdr dma_bus_cgc (.en(dma_bus_clk_en), .l1clk(dma_bus_clk), .*); + + // Write channel buffer + assign wrbuf_en = dma_axi_awvalid & dma_axi_awready; + assign wrbuf_data_en = dma_axi_wvalid & dma_axi_wready; + assign wrbuf_cmd_sent = bus_cmd_sent & bus_cmd_write; + assign wrbuf_rst = wrbuf_cmd_sent & ~wrbuf_en; + assign wrbuf_data_rst = wrbuf_cmd_sent & ~wrbuf_data_en; + + rvdffsc #(.WIDTH(1)) wrbuf_vldff(.din(1'b1), .dout(wrbuf_vld), .en(wrbuf_en), .clear(wrbuf_rst), .clk(dma_bus_clk), .*); + rvdffsc #(.WIDTH(1)) wrbuf_data_vldff(.din(1'b1), .dout(wrbuf_data_vld), .en(wrbuf_data_en), .clear(wrbuf_data_rst), .clk(dma_bus_clk), .*); + rvdffs #(.WIDTH(pt.DMA_BUS_TAG)) wrbuf_tagff(.din(dma_axi_awid[pt.DMA_BUS_TAG-1:0]), .dout(wrbuf_tag[pt.DMA_BUS_TAG-1:0]), .en(wrbuf_en), .clk(dma_bus_clk), .*); + rvdffs #(.WIDTH(3)) wrbuf_szff(.din(dma_axi_awsize[2:0]), .dout(wrbuf_sz[2:0]), .en(wrbuf_en), .clk(dma_bus_clk), .*); + rvdffe #(.WIDTH(32)) wrbuf_addrff(.din(dma_axi_awaddr[31:0]), .dout(wrbuf_addr[31:0]), .en(wrbuf_en & dma_bus_clk_en), .*); + rvdffe #(.WIDTH(64)) wrbuf_dataff(.din(dma_axi_wdata[63:0]), .dout(wrbuf_data[63:0]), .en(wrbuf_data_en & dma_bus_clk_en), .*); + rvdffs #(.WIDTH(8)) wrbuf_byteenff(.din(dma_axi_wstrb[7:0]), .dout(wrbuf_byteen[7:0]), .en(wrbuf_data_en), .clk(dma_bus_clk), .*); + + // Read channel buffer + assign rdbuf_en = dma_axi_arvalid & dma_axi_arready; + assign rdbuf_cmd_sent = bus_cmd_sent & ~bus_cmd_write; + assign rdbuf_rst = rdbuf_cmd_sent & ~rdbuf_en; + + rvdffsc #(.WIDTH(1)) rdbuf_vldff(.din(1'b1), .dout(rdbuf_vld), .en(rdbuf_en), .clear(rdbuf_rst), .clk(dma_bus_clk), .*); + rvdffs #(.WIDTH(pt.DMA_BUS_TAG)) rdbuf_tagff(.din(dma_axi_arid[pt.DMA_BUS_TAG-1:0]), .dout(rdbuf_tag[pt.DMA_BUS_TAG-1:0]), .en(rdbuf_en), .clk(dma_bus_clk), .*); + rvdffs #(.WIDTH(3)) rdbuf_szff(.din(dma_axi_arsize[2:0]), .dout(rdbuf_sz[2:0]), .en(rdbuf_en), .clk(dma_bus_clk), .*); + rvdffe #(.WIDTH(32)) rdbuf_addrff(.din(dma_axi_araddr[31:0]), .dout(rdbuf_addr[31:0]), .en(rdbuf_en & dma_bus_clk_en), .*); + + assign dma_axi_awready = ~(wrbuf_vld & ~wrbuf_cmd_sent); + assign dma_axi_wready = ~(wrbuf_data_vld & ~wrbuf_cmd_sent); + assign dma_axi_arready = ~(rdbuf_vld & ~rdbuf_cmd_sent); + + //Generate a single request from read/write channel + assign bus_cmd_valid = (wrbuf_vld & wrbuf_data_vld) | rdbuf_vld; + assign bus_cmd_sent = bus_cmd_valid & dma_fifo_ready; + assign bus_cmd_write = axi_mstr_sel; + assign bus_cmd_posted_write = '0; + assign bus_cmd_addr[31:0] = axi_mstr_sel ? wrbuf_addr[31:0] : rdbuf_addr[31:0]; + assign bus_cmd_sz[2:0] = axi_mstr_sel ? wrbuf_sz[2:0] : rdbuf_sz[2:0]; + assign bus_cmd_wdata[63:0] = wrbuf_data[63:0]; + assign bus_cmd_byteen[7:0] = wrbuf_byteen[7:0]; + assign bus_cmd_tag[pt.DMA_BUS_TAG-1:0] = axi_mstr_sel ? wrbuf_tag[pt.DMA_BUS_TAG-1:0] : rdbuf_tag[pt.DMA_BUS_TAG-1:0]; + assign bus_cmd_mid[pt.DMA_BUS_ID-1:0] = '0; + assign bus_cmd_prty[pt.DMA_BUS_PRTY-1:0] = '0; + + // Sel=1 -> write has higher priority + assign axi_mstr_sel = (wrbuf_vld & wrbuf_data_vld & rdbuf_vld) ? axi_mstr_priority : (wrbuf_vld & wrbuf_data_vld); + assign axi_mstr_prty_in = ~axi_mstr_priority; + assign axi_mstr_prty_en = bus_cmd_sent; + rvdffs #(.WIDTH(1)) mstr_prtyff(.din(axi_mstr_prty_in), .dout(axi_mstr_priority), .en(axi_mstr_prty_en), .clk(dma_bus_clk), .*); + + assign axi_rsp_valid = fifo_valid[RspPtr] & ~fifo_dbg[RspPtr] & fifo_done_bus[RspPtr]; + assign axi_rsp_rdata[63:0] = fifo_data[RspPtr]; + assign axi_rsp_write = fifo_write[RspPtr]; + assign axi_rsp_error[1:0] = fifo_error[RspPtr][0] ? 2'b10 : (fifo_error[RspPtr][1] ? 2'b11 : 2'b0); + assign axi_rsp_tag[pt.DMA_BUS_TAG-1:0] = fifo_tag[RspPtr]; + + // AXI response channel signals + assign dma_axi_bvalid = axi_rsp_valid & axi_rsp_write; + assign dma_axi_bresp[1:0] = axi_rsp_error[1:0]; + assign dma_axi_bid[pt.DMA_BUS_TAG-1:0] = axi_rsp_tag[pt.DMA_BUS_TAG-1:0]; + + assign dma_axi_rvalid = axi_rsp_valid & ~axi_rsp_write; + assign dma_axi_rresp[1:0] = axi_rsp_error; + assign dma_axi_rdata[63:0] = axi_rsp_rdata[63:0]; + assign dma_axi_rlast = 1'b1; + assign dma_axi_rid[pt.DMA_BUS_TAG-1:0] = axi_rsp_tag[pt.DMA_BUS_TAG-1:0]; + + assign bus_posted_write_done = 1'b0; + assign bus_rsp_valid = (dma_axi_bvalid | dma_axi_rvalid); + assign bus_rsp_sent = (dma_axi_bvalid & dma_axi_bready) | (dma_axi_rvalid & dma_axi_rready); + +`ifdef ASSERT_ON + + for (genvar i=0; i $past(dma_bus_clk_en); + endproperty + assert_dma_axi_awvalid_stable: assert property (dma_axi_awvalid_stable) else + $display("DMA AXI awvalid changed in middle of bus clock"); + + // Assertion to check awid stays stable during entire bus clock + property dma_axi_awid_stable; + @(posedge clk) disable iff(~rst_l) (dma_axi_awvalid & (dma_axi_awid[pt.DMA_BUS_TAG-1:0] != $past(dma_axi_awid[pt.DMA_BUS_TAG-1:0]))) |-> $past(dma_bus_clk_en); + endproperty + assert_dma_axi_awid_stable: assert property (dma_axi_awid_stable) else + $display("DMA AXI awid changed in middle of bus clock"); + + // Assertion to check awaddr stays stable during entire bus clock + property dma_axi_awaddr_stable; + @(posedge clk) disable iff(~rst_l) (dma_axi_awvalid & (dma_axi_awaddr[31:0] != $past(dma_axi_awaddr[31:0]))) |-> $past(dma_bus_clk_en); + endproperty + assert_dma_axi_awaddr_stable: assert property (dma_axi_awaddr_stable) else + $display("DMA AXI awaddr changed in middle of bus clock"); + + // Assertion to check awsize stays stable during entire bus clock + property dma_axi_awsize_stable; + @(posedge clk) disable iff(~rst_l) (dma_axi_awvalid & (dma_axi_awsize[2:0] != $past(dma_axi_awsize[2:0]))) |-> $past(dma_bus_clk_en); + endproperty + assert_dma_axi_awsize_stable: assert property (dma_axi_awsize_stable) else + $display("DMA AXI awsize changed in middle of bus clock"); + + // Assertion to check wstrb stays stable during entire bus clock + property dma_axi_wstrb_stable; + @(posedge clk) disable iff(~rst_l) (dma_axi_wvalid & (dma_axi_wstrb[7:0] != $past(dma_axi_wstrb[7:0]))) |-> $past(dma_bus_clk_en); + endproperty + assert_dma_axi_wstrb_stable: assert property (dma_axi_wstrb_stable) else + $display("DMA AXI wstrb changed in middle of bus clock"); + + // Assertion to check wdata stays stable during entire bus clock + property dma_axi_wdata_stable; + @(posedge clk) disable iff(~rst_l) (dma_axi_wvalid & (dma_axi_wdata[63:0] != $past(dma_axi_wdata[63:0]))) |-> $past(dma_bus_clk_en); + endproperty + assert_dma_axi_wdata_stable: assert property (dma_axi_wdata_stable) else + $display("DMA AXI wdata changed in middle of bus clock"); + + // Assertion to check awvalid stays stable during entire bus clock + property dma_axi_arvalid_stable; + @(posedge clk) disable iff(~rst_l) (dma_axi_arvalid != $past(dma_axi_arvalid)) |-> $past(dma_bus_clk_en); + endproperty + assert_dma_axi_arvalid_stable: assert property (dma_axi_arvalid_stable) else + $display("DMA AXI awvalid changed in middle of bus clock"); + + // Assertion to check awid stays stable during entire bus clock + property dma_axi_arid_stable; + @(posedge clk) disable iff(~rst_l) (dma_axi_arvalid & (dma_axi_arid[pt.DMA_BUS_TAG-1:0] != $past(dma_axi_arid[pt.DMA_BUS_TAG-1:0]))) |-> $past(dma_bus_clk_en); + endproperty + assert_dma_axi_arid_stable: assert property (dma_axi_arid_stable) else + $display("DMA AXI awid changed in middle of bus clock"); + + // Assertion to check awaddr stays stable during entire bus clock + property dma_axi_araddr_stable; + @(posedge clk) disable iff(~rst_l) (dma_axi_arvalid & (dma_axi_araddr[31:0] != $past(dma_axi_araddr[31:0]))) |-> $past(dma_bus_clk_en); + endproperty + assert_dma_axi_araddr_stable: assert property (dma_axi_araddr_stable) else + $display("DMA AXI awaddr changed in middle of bus clock"); + + // Assertion to check awsize stays stable during entire bus clock + property dma_axi_arsize_stable; + @(posedge clk) disable iff(~rst_l) (dma_axi_awvalid & (dma_axi_arsize[2:0] != $past(dma_axi_arsize[2:0]))) |-> $past(dma_bus_clk_en); + endproperty + assert_dma_axi_arsize_stable: assert property (dma_axi_arsize_stable) else + $display("DMA AXI awsize changed in middle of bus clock"); + + // Assertion to check bvalid stays stable during entire bus clock + property dma_axi_bvalid_stable; + @(posedge clk) disable iff(~rst_l) (dma_axi_bvalid != $past(dma_axi_bvalid)) |-> $past(dma_bus_clk_en); + endproperty + assert_dma_axi_bvalid_stable: assert property (dma_axi_bvalid_stable) else + $display("DMA AXI bvalid changed in middle of bus clock"); + + // Assertion to check bvalid stays stable if bready is low + property dma_axi_bvalid_stable_till_bready; + @(posedge clk) disable iff(~rst_l) (~dma_axi_bvalid && $past(dma_axi_bvalid)) |-> $past(dma_axi_bready); + endproperty + assert_dma_axi_bvalid_stable_till_bready: assert property (dma_axi_bvalid_stable_till_bready) else + $display("DMA AXI bvalid deasserted without bready"); + + // Assertion to check bresp stays stable during entire bus clock + property dma_axi_bresp_stable; + @(posedge clk) disable iff(~rst_l) (dma_axi_bvalid & (dma_axi_bresp[1:0] != $past(dma_axi_bresp[1:0]))) |-> $past(dma_bus_clk_en); + endproperty + assert_dma_axi_bresp_stable: assert property (dma_axi_bresp_stable) else + $display("DMA AXI bresp changed in middle of bus clock"); + + // Assertion to check bid stays stable during entire bus clock + property dma_axi_bid_stable; + @(posedge clk) disable iff(~rst_l) (dma_axi_bvalid & (dma_axi_bid[pt.DMA_BUS_TAG-1:0] != $past(dma_axi_bid[pt.DMA_BUS_TAG-1:0]))) |-> $past(dma_bus_clk_en); + endproperty + assert_dma_axi_bid_stable: assert property (dma_axi_bid_stable) else + $display("DMA AXI bid changed in middle of bus clock"); + + // Assertion to check rvalid stays stable during entire bus clock + property dma_axi_rvalid_stable; + @(posedge clk) disable iff(~rst_l) (dma_axi_rvalid != $past(dma_axi_rvalid)) |-> $past(dma_bus_clk_en); + endproperty + assert_dma_axi_rvalid_stable: assert property (dma_axi_rvalid_stable) else + $display("DMA AXI bvalid changed in middle of bus clock"); + + // Assertion to check rvalid stays stable if bready is low + property dma_axi_rvalid_stable_till_ready; + @(posedge clk) disable iff(~rst_l) (~dma_axi_rvalid && $past(dma_axi_rvalid)) |-> $past(dma_axi_rready); + endproperty + assert_dma_axi_rvalid_stable_till_ready: assert property (dma_axi_rvalid_stable_till_ready) else + $display("DMA AXI bvalid changed in middle of bus clock"); + + // Assertion to check rresp stays stable during entire bus clock + property dma_axi_rresp_stable; + @(posedge clk) disable iff(~rst_l) (dma_axi_rvalid & (dma_axi_rresp[1:0] != $past(dma_axi_rresp[1:0]))) |-> $past(dma_bus_clk_en); + endproperty + assert_dma_axi_rresp_stable: assert property (dma_axi_rresp_stable) else + $display("DMA AXI bresp changed in middle of bus clock"); + + // Assertion to check rid stays stable during entire bus clock + property dma_axi_rid_stable; + @(posedge clk) disable iff(~rst_l) (dma_axi_rvalid & (dma_axi_rid[pt.DMA_BUS_TAG-1:0] != $past(dma_axi_rid[pt.DMA_BUS_TAG-1:0]))) |-> $past(dma_bus_clk_en); + endproperty + assert_dma_axi_rid_stable: assert property (dma_axi_rid_stable) else + $display("DMA AXI bid changed in middle of bus clock"); + + // Assertion to check rdata stays stable during entire bus clock + property dma_axi_rdata_stable; + @(posedge clk) disable iff(~rst_l) (dma_axi_rvalid & (dma_axi_rdata[63:0] != $past(dma_axi_rdata[63:0]))) |-> $past(dma_bus_clk_en); + endproperty + assert_dma_axi_rdata_stable: assert property (dma_axi_rdata_stable) else + $display("DMA AXI bid changed in middle of bus clock"); + +`endif + +endmodule // el2_dma_ctrl diff --git a/design/el2_mem.sv b/design/el2_mem.sv new file mode 100644 index 0000000..49186e7 --- /dev/null +++ b/design/el2_mem.sv @@ -0,0 +1,132 @@ +//******************************************************************************** +// SPDX-License-Identifier: Apache-2.0 +// Copyright 2020 Western Digital Corporation or it's affiliates. +// +// 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. +//******************************************************************************** + +module el2_mem +import el2_pkg::*; +#( +`include "el2_param.vh" + ) +( + input logic clk, + input logic rst_l, + input logic dccm_clk_override, + input logic icm_clk_override, + input logic dec_tlu_core_ecc_disable, + + //DCCM ports + input logic dccm_wren, + input logic dccm_rden, + input logic [pt.DCCM_BITS-1:0] dccm_wr_addr_lo, + input logic [pt.DCCM_BITS-1:0] dccm_wr_addr_hi, + input logic [pt.DCCM_BITS-1:0] dccm_rd_addr_lo, + input logic [pt.DCCM_BITS-1:0] dccm_rd_addr_hi, + input logic [pt.DCCM_FDATA_WIDTH-1:0] dccm_wr_data_lo, + input logic [pt.DCCM_FDATA_WIDTH-1:0] dccm_wr_data_hi, + + + output logic [pt.DCCM_FDATA_WIDTH-1:0] dccm_rd_data_lo, + output logic [pt.DCCM_FDATA_WIDTH-1:0] dccm_rd_data_hi, + +//`ifdef pt.DCCM_ENABLE + +//`endif + + //ICCM ports + + input logic [pt.ICCM_BITS-1:1] iccm_rw_addr, + input logic iccm_buf_correct_ecc, // ICCM is doing a single bit error correct cycle + input logic iccm_correction_state, // ICCM is doing a single bit error correct cycle + input logic iccm_wren, + input logic iccm_rden, + input logic [2:0] iccm_wr_size, + input logic [77:0] iccm_wr_data, + + output logic [63:0] iccm_rd_data, + output logic [77:0] iccm_rd_data_ecc, + + // Icache and Itag Ports + + input logic [31:1] ic_rw_addr, + input logic [pt.ICACHE_NUM_WAYS-1:0] ic_tag_valid, + input logic [pt.ICACHE_NUM_WAYS-1:0] ic_wr_en, + input logic ic_rd_en, + input logic [63:0] ic_premux_data, // Premux data to be muxed with each way of the Icache. + input logic ic_sel_premux_data, // Premux data sel + + input logic [pt.ICACHE_BANKS_WAY-1:0][70:0] ic_wr_data, // Data to fill to the Icache. With ECC + input logic [70:0] ic_debug_wr_data, // Debug wr cache. + output logic [70:0] ic_debug_rd_data , // Data read from Icache. 2x64bits + parity bits. F2 stage. With ECC + input logic [pt.ICACHE_INDEX_HI:3] ic_debug_addr, // Read/Write addresss to the Icache. + input logic ic_debug_rd_en, // Icache debug rd + input logic ic_debug_wr_en, // Icache debug wr + input logic ic_debug_tag_array, // Debug tag array + input logic [pt.ICACHE_NUM_WAYS-1:0] ic_debug_way, // Debug way. Rd or Wr. + + output logic [63:0] ic_rd_data , // Data read from Icache. 2x64bits + parity bits. F2 stage. With ECC + output logic [25:0] ictag_debug_rd_data,// Debug icache tag. + + + output logic [pt.ICACHE_BANKS_WAY-1:0] ic_eccerr, // ecc error per bank + output logic [pt.ICACHE_BANKS_WAY-1:0] ic_parerr, // parity error per bank + output logic [pt.ICACHE_NUM_WAYS-1:0] ic_rd_hit, + output logic ic_tag_perr, // Icache Tag parity error + + + input logic scan_mode + +); + + // DCCM Instantiation + if (pt.DCCM_ENABLE == 1) begin: Gen_dccm_enable + el2_lsu_dccm_mem #(.pt(pt)) dccm ( + .clk_override(dccm_clk_override), + .* + ); + end else begin: Gen_dccm_disable + assign dccm_rd_data_lo = '0; + assign dccm_rd_data_hi = '0; + end + +if ( pt.ICACHE_ENABLE ) begin: icache + el2_ifu_ic_mem #(.pt(pt)) icm ( + .clk_override(icm_clk_override), + .* + ); +end +else begin + assign ic_rd_hit[pt.ICACHE_NUM_WAYS-1:0] = '0; + assign ic_tag_perr = '0 ; + assign ic_rd_data = '0 ; + assign ictag_debug_rd_data = '0 ; +end // else: !if( pt.ICACHE_ENABLE ) + + + +if (pt.ICCM_ENABLE) begin : iccm + el2_ifu_iccm_mem #(.pt(pt)) iccm (.*, + .clk_override(icm_clk_override), + .iccm_rw_addr(iccm_rw_addr[pt.ICCM_BITS-1:1]), + .iccm_rd_data(iccm_rd_data[63:0]) + ); +end +else begin + assign iccm_rd_data = '0 ; + assign iccm_rd_data_ecc = '0 ; +end + + +endmodule diff --git a/design/el2_pic_ctrl.sv b/design/el2_pic_ctrl.sv new file mode 100644 index 0000000..b39dae3 --- /dev/null +++ b/design/el2_pic_ctrl.sv @@ -0,0 +1,502 @@ +//******************************************************************************** +// SPDX-License-Identifier: Apache-2.0 +// Copyright 2020 Western Digital Corporation or it's affiliates. +// +// 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. +//******************************************************************************** + +//******************************************************************************** +// Function: Programmable Interrupt Controller +// Comments: +//******************************************************************************** + +module el2_pic_ctrl #( +`include "el2_param.vh" + ) + ( + + input logic clk, // Core clock + input logic free_clk, // free clock + input logic active_clk, // active clock + input logic rst_l, // Reset for all flops + input logic clk_override, // Clock over-ride for gating + input logic [pt.PIC_TOTAL_INT_PLUS1-1:0] extintsrc_req, // Interrupt requests + input logic [31:0] picm_rdaddr, // Address of the register + input logic [31:0] picm_wraddr, // Address of the register + input logic [31:0] picm_wr_data, // Data to be written to the register + input logic picm_wren, // Write enable to the register + input logic picm_rden, // Read enable for the register + input logic picm_mken, // Read the Mask for the register + input logic [3:0] meicurpl, // Current Priority Level + input logic [3:0] meipt, // Current Priority Threshold + + output logic mexintpend, // External Inerrupt request to the core + output logic [7:0] claimid, // Claim Id of the requested interrupt + output logic [3:0] pl, // Priority level of the requested interrupt + output logic [31:0] picm_rd_data, // Read data of the register + output logic mhwakeup, // Wake-up interrupt request + input logic scan_mode // scan mode + +); + +localparam NUM_LEVELS = $clog2(pt.PIC_TOTAL_INT_PLUS1); +localparam INTPRIORITY_BASE_ADDR = pt.PIC_BASE_ADDR ; +localparam INTPEND_BASE_ADDR = pt.PIC_BASE_ADDR + 32'h00001000 ; +localparam INTENABLE_BASE_ADDR = pt.PIC_BASE_ADDR + 32'h00002000 ; +localparam EXT_INTR_PIC_CONFIG = pt.PIC_BASE_ADDR + 32'h00003000 ; +localparam EXT_INTR_GW_CONFIG = pt.PIC_BASE_ADDR + 32'h00004000 ; +localparam EXT_INTR_GW_CLEAR = pt.PIC_BASE_ADDR + 32'h00005000 ; + + +localparam INTPEND_SIZE = (pt.PIC_TOTAL_INT_PLUS1 < 32) ? 32 : + (pt.PIC_TOTAL_INT_PLUS1 < 64) ? 64 : + (pt.PIC_TOTAL_INT_PLUS1 < 128) ? 128 : + (pt.PIC_TOTAL_INT_PLUS1 < 256) ? 256 : + (pt.PIC_TOTAL_INT_PLUS1 < 512) ? 512 : 1024 ; + +localparam INT_GRPS = INTPEND_SIZE / 32 ; +localparam INTPRIORITY_BITS = 4 ; +localparam ID_BITS = 8 ; +localparam int GW_CONFIG[pt.PIC_TOTAL_INT_PLUS1-1:0] = '{default:0} ; + +logic addr_intpend_base_match; + +logic raddr_config_pic_match ; +logic raddr_intenable_base_match; +logic raddr_intpriority_base_match; +logic raddr_config_gw_base_match ; + +logic waddr_config_pic_match ; +logic waddr_intpriority_base_match; +logic waddr_intenable_base_match; +logic waddr_config_gw_base_match ; +logic addr_clear_gw_base_match ; + +logic mexintpend_in; +logic mhwakeup_in ; +logic intpend_reg_read ; + +logic [31:0] picm_rd_data_in, intpend_rd_out; +logic intenable_rd_out ; +logic [INTPRIORITY_BITS-1:0] intpriority_rd_out; +logic [1:0] gw_config_rd_out; + +logic [pt.PIC_TOTAL_INT_PLUS1-1:0] [INTPRIORITY_BITS-1:0] intpriority_reg; +logic [pt.PIC_TOTAL_INT_PLUS1-1:0] [INTPRIORITY_BITS-1:0] intpriority_reg_inv; +logic [pt.PIC_TOTAL_INT_PLUS1-1:0] intpriority_reg_we; +logic [pt.PIC_TOTAL_INT_PLUS1-1:0] intpriority_reg_re; +logic [pt.PIC_TOTAL_INT_PLUS1-1:0] [1:0] gw_config_reg; + +logic [pt.PIC_TOTAL_INT_PLUS1-1:0] intenable_reg; +logic [pt.PIC_TOTAL_INT_PLUS1-1:0] intenable_reg_we; +logic [pt.PIC_TOTAL_INT_PLUS1-1:0] intenable_reg_re; +logic [pt.PIC_TOTAL_INT_PLUS1-1:0] gw_config_reg_we; +logic [pt.PIC_TOTAL_INT_PLUS1-1:0] gw_config_reg_re; +logic [pt.PIC_TOTAL_INT_PLUS1-1:0] gw_clear_reg_we; + +logic [INTPEND_SIZE-1:0] intpend_reg_extended; + +logic [pt.PIC_TOTAL_INT_PLUS1-1:0] [INTPRIORITY_BITS-1:0] intpend_w_prior_en; +logic [pt.PIC_TOTAL_INT_PLUS1-1:0] [ID_BITS-1:0] intpend_id; +logic [INTPRIORITY_BITS-1:0] maxint; +logic [INTPRIORITY_BITS-1:0] selected_int_priority; +logic [INT_GRPS-1:0] [31:0] intpend_rd_part_out ; + + +logic [NUM_LEVELS:NUM_LEVELS/2] [(pt.PIC_TOTAL_INT_PLUS1/2**(NUM_LEVELS/2))+1:0] [INTPRIORITY_BITS-1:0] levelx_intpend_w_prior_en; +logic [NUM_LEVELS:NUM_LEVELS/2] [(pt.PIC_TOTAL_INT_PLUS1/2**(NUM_LEVELS/2))+1:0] [ID_BITS-1:0] levelx_intpend_id; +logic [(pt.PIC_TOTAL_INT_PLUS1/2**(NUM_LEVELS/2)):0] [INTPRIORITY_BITS-1:0] l2_intpend_w_prior_en_ff; +logic [(pt.PIC_TOTAL_INT_PLUS1/2**(NUM_LEVELS/2)):0] [ID_BITS-1:0] l2_intpend_id_ff; + +logic config_reg; +logic intpriord; +logic config_reg_we ; +logic config_reg_re ; +logic config_reg_in ; +logic prithresh_reg_write , prithresh_reg_read; +logic intpriority_reg_read ; +logic intenable_reg_read ; +logic gw_config_reg_read ; +logic picm_wren_ff , picm_rden_ff ; +logic [31:0] picm_raddr_ff; +logic [31:0] picm_waddr_ff; +logic [31:0] picm_wr_data_ff; +logic [3:0] mask; +logic picm_mken_ff; +logic [ID_BITS-1:0] claimid_in ; +logic [INTPRIORITY_BITS-1:0] pl_in ; +logic [INTPRIORITY_BITS-1:0] pl_in_q ; + +logic [pt.PIC_TOTAL_INT_PLUS1-1:0] extintsrc_req_sync; +logic [pt.PIC_TOTAL_INT_PLUS1-1:0] extintsrc_req_gw; + logic picm_bypass_ff; + +// clkens + logic pic_raddr_c1_clken; + logic pic_waddr_c1_clken; + logic pic_data_c1_clken; + logic pic_pri_c1_clken; + logic pic_int_c1_clken; + logic gw_config_c1_clken; + +// clocks + logic pic_raddr_c1_clk; + logic pic_data_c1_clk; + logic pic_pri_c1_clk; + logic pic_int_c1_clk; + logic gw_config_c1_clk; + +// ---- Clock gating section ------ +// c1 clock enables + assign pic_raddr_c1_clken = picm_mken | picm_rden | clk_override; + assign pic_data_c1_clken = picm_wren | clk_override; + assign pic_pri_c1_clken = (waddr_intpriority_base_match & picm_wren_ff) | (raddr_intpriority_base_match & picm_rden_ff) | clk_override; + assign pic_int_c1_clken = (waddr_intenable_base_match & picm_wren_ff) | (raddr_intenable_base_match & picm_rden_ff) | clk_override; + assign gw_config_c1_clken = (waddr_config_gw_base_match & picm_wren_ff) | (raddr_config_gw_base_match & picm_rden_ff) | clk_override; + + // C1 - 1 clock pulse for data + rvoclkhdr pic_addr_c1_cgc ( .en(pic_raddr_c1_clken), .l1clk(pic_raddr_c1_clk), .* ); + rvoclkhdr pic_data_c1_cgc ( .en(pic_data_c1_clken), .l1clk(pic_data_c1_clk), .* ); + rvoclkhdr pic_pri_c1_cgc ( .en(pic_pri_c1_clken), .l1clk(pic_pri_c1_clk), .* ); + rvoclkhdr pic_int_c1_cgc ( .en(pic_int_c1_clken), .l1clk(pic_int_c1_clk), .* ); + rvoclkhdr gw_config_c1_cgc ( .en(gw_config_c1_clken), .l1clk(gw_config_c1_clk), .* ); + +// ------ end clock gating section ------------------------ + +assign raddr_intenable_base_match = (picm_raddr_ff[31:NUM_LEVELS+2] == INTENABLE_BASE_ADDR[31:NUM_LEVELS+2]) ; +assign raddr_intpriority_base_match = (picm_raddr_ff[31:NUM_LEVELS+2] == INTPRIORITY_BASE_ADDR[31:NUM_LEVELS+2]) ; +assign raddr_config_gw_base_match = (picm_raddr_ff[31:NUM_LEVELS+2] == EXT_INTR_GW_CONFIG[31:NUM_LEVELS+2]) ; +assign raddr_config_pic_match = (picm_raddr_ff[31:0] == EXT_INTR_PIC_CONFIG[31:0]) ; + +assign addr_intpend_base_match = (picm_raddr_ff[31:6] == INTPEND_BASE_ADDR[31:6]) ; + +assign waddr_config_pic_match = (picm_waddr_ff[31:0] == EXT_INTR_PIC_CONFIG[31:0]) ; +assign addr_clear_gw_base_match = (picm_waddr_ff[31:NUM_LEVELS+2] == EXT_INTR_GW_CLEAR[31:NUM_LEVELS+2]) ; +assign waddr_intpriority_base_match = (picm_waddr_ff[31:NUM_LEVELS+2] == INTPRIORITY_BASE_ADDR[31:NUM_LEVELS+2]) ; +assign waddr_intenable_base_match = (picm_waddr_ff[31:NUM_LEVELS+2] == INTENABLE_BASE_ADDR[31:NUM_LEVELS+2]) ; +assign waddr_config_gw_base_match = (picm_waddr_ff[31:NUM_LEVELS+2] == EXT_INTR_GW_CONFIG[31:NUM_LEVELS+2]) ; + + assign picm_bypass_ff = picm_rden_ff & picm_wren_ff & ( picm_raddr_ff[31:0] == picm_waddr_ff[31:0] ); // pic writes and reads to same address together + + +rvdff #(32) picm_radd_flop (.*, .din (picm_rdaddr), .dout(picm_raddr_ff), .clk(pic_raddr_c1_clk)); +rvdff #(32) picm_wadd_flop (.*, .din (picm_wraddr), .dout(picm_waddr_ff), .clk(pic_data_c1_clk)); +rvdff #(1) picm_wre_flop (.*, .din (picm_wren), .dout(picm_wren_ff), .clk(active_clk)); +rvdff #(1) picm_rde_flop (.*, .din (picm_rden), .dout(picm_rden_ff), .clk(active_clk)); +rvdff #(1) picm_mke_flop (.*, .din (picm_mken), .dout(picm_mken_ff), .clk(active_clk)); +rvdff #(32) picm_dat_flop (.*, .din (picm_wr_data[31:0]), .dout(picm_wr_data_ff[31:0]), .clk(pic_data_c1_clk)); + +rvsyncss #(pt.PIC_TOTAL_INT_PLUS1-1) sync_inst +( + .clk (free_clk), + .dout(extintsrc_req_sync[pt.PIC_TOTAL_INT_PLUS1-1:1]), + .din (extintsrc_req[pt.PIC_TOTAL_INT_PLUS1-1:1]), + .*) ; + +assign extintsrc_req_sync[0] = extintsrc_req[0]; + +genvar i ; +for (i=0; i 0 ) begin : NON_ZERO_INT + assign intpriority_reg_we[i] = waddr_intpriority_base_match & (picm_waddr_ff[NUM_LEVELS+1:2] == i) & picm_wren_ff; + assign intpriority_reg_re[i] = raddr_intpriority_base_match & (picm_raddr_ff[NUM_LEVELS+1:2] == i) & picm_rden_ff; + + assign intenable_reg_we[i] = waddr_intenable_base_match & (picm_waddr_ff[NUM_LEVELS+1:2] == i) & picm_wren_ff; + assign intenable_reg_re[i] = raddr_intenable_base_match & (picm_raddr_ff[NUM_LEVELS+1:2] == i) & picm_rden_ff; + + assign gw_config_reg_we[i] = waddr_config_gw_base_match & (picm_waddr_ff[NUM_LEVELS+1:2] == i) & picm_wren_ff; + assign gw_config_reg_re[i] = raddr_config_gw_base_match & (picm_raddr_ff[NUM_LEVELS+1:2] == i) & picm_rden_ff; + + assign gw_clear_reg_we[i] = addr_clear_gw_base_match & (picm_waddr_ff[NUM_LEVELS+1:2] == i) & picm_wren_ff ; + + rvdffs #(INTPRIORITY_BITS) intpriority_ff (.*, .en( intpriority_reg_we[i]), .din (picm_wr_data_ff[INTPRIORITY_BITS-1:0]), .dout(intpriority_reg[i]), .clk(pic_pri_c1_clk)); + rvdffs #(1) intenable_ff (.*, .en( intenable_reg_we[i]), .din (picm_wr_data_ff[0]), .dout(intenable_reg[i]), .clk(pic_int_c1_clk)); + + + rvdffs #(2) gw_config_ff (.*, .en( gw_config_reg_we[i]), .din (picm_wr_data_ff[1:0]), .dout(gw_config_reg[i]), .clk(gw_config_c1_clk)); + el2_configurable_gw config_gw_inst(.*, .clk(free_clk), + .extintsrc_req_sync(extintsrc_req_sync[i]) , + .meigwctrl_polarity(gw_config_reg[i][0]) , + .meigwctrl_type(gw_config_reg[i][1]) , + .meigwclr(gw_clear_reg_we[i]) , + .extintsrc_req_config(extintsrc_req_gw[i]) + ); + + end else begin : INT_ZERO + assign intpriority_reg_we[i] = 1'b0 ; + assign intpriority_reg_re[i] = 1'b0 ; + assign intenable_reg_we[i] = 1'b0 ; + assign intenable_reg_re[i] = 1'b0 ; + + assign gw_config_reg_we[i] = 1'b0 ; + assign gw_config_reg_re[i] = 1'b0 ; + assign gw_clear_reg_we[i] = 1'b0 ; + + assign gw_config_reg[i] = '0 ; + + assign intpriority_reg[i] = {INTPRIORITY_BITS{1'b0}} ; + assign intenable_reg[i] = 1'b0 ; + assign extintsrc_req_gw[i] = 1'b0 ; + end + + + assign intpriority_reg_inv[i] = intpriord ? ~intpriority_reg[i] : intpriority_reg[i] ; + + assign intpend_w_prior_en[i] = {INTPRIORITY_BITS{(extintsrc_req_gw[i] & intenable_reg[i])}} & intpriority_reg_inv[i] ; + assign intpend_id[i] = i ; +end + + + assign pl_in[INTPRIORITY_BITS-1:0] = selected_int_priority[INTPRIORITY_BITS-1:0] ; + + + genvar l, m , j, k; + +if (pt.PIC_2CYCLE == 1) begin : genblock + logic [NUM_LEVELS/2:0] [pt.PIC_TOTAL_INT_PLUS1+2:0] [INTPRIORITY_BITS-1:0] level_intpend_w_prior_en; + logic [NUM_LEVELS/2:0] [pt.PIC_TOTAL_INT_PLUS1+2:0] [ID_BITS-1:0] level_intpend_id; + + assign level_intpend_w_prior_en[0][pt.PIC_TOTAL_INT_PLUS1+2:0] = {4'b0,4'b0,4'b0,intpend_w_prior_en[pt.PIC_TOTAL_INT_PLUS1-1:0]} ; + assign level_intpend_id[0][pt.PIC_TOTAL_INT_PLUS1+2:0] = {8'b0,8'b0,8'b0,intpend_id[pt.PIC_TOTAL_INT_PLUS1-1:0]} ; + + + assign levelx_intpend_w_prior_en[NUM_LEVELS/2][(pt.PIC_TOTAL_INT_PLUS1/2**(NUM_LEVELS/2))+1:0] = {{1*INTPRIORITY_BITS{1'b0}},l2_intpend_w_prior_en_ff[(pt.PIC_TOTAL_INT_PLUS1/2**(NUM_LEVELS/2)):0]} ; + assign levelx_intpend_id[NUM_LEVELS/2][(pt.PIC_TOTAL_INT_PLUS1/2**(NUM_LEVELS/2))+1:0] = {{1*ID_BITS{1'b1}},l2_intpend_id_ff[(pt.PIC_TOTAL_INT_PLUS1/2**(NUM_LEVELS/2)):0]} ; +/// Do the prioritization of the interrupts here //////////// + for (l=0; l meipt_inv[INTPRIORITY_BITS-1:0]) & + ( selected_int_priority[INTPRIORITY_BITS-1:0] > meicurpl_inv[INTPRIORITY_BITS-1:0]) ); +rvdff #(1) mexintpend_ff (.*, .clk(free_clk), .din (mexintpend_in), .dout(mexintpend)); + +assign maxint[INTPRIORITY_BITS-1:0] = intpriord ? 0 : 15 ; +assign mhwakeup_in = ( pl_in_q[INTPRIORITY_BITS-1:0] == maxint) ; +rvdff #(1) wake_up_ff (.*, .clk(free_clk), .din (mhwakeup_in), .dout(mhwakeup)); + + + +////////////////////////////////////////////////////////////////////////// +// Reads of register. +// 1- intpending +////////////////////////////////////////////////////////////////////////// + +assign intpend_reg_read = addr_intpend_base_match & picm_rden_ff ; +assign intpriority_reg_read = raddr_intpriority_base_match & picm_rden_ff; +assign intenable_reg_read = raddr_intenable_base_match & picm_rden_ff; +assign gw_config_reg_read = raddr_config_gw_base_match & picm_rden_ff; + +assign intpend_reg_extended[INTPEND_SIZE-1:0] = {{INTPEND_SIZE-pt.PIC_TOTAL_INT_PLUS1{1'b0}},extintsrc_req_gw[pt.PIC_TOTAL_INT_PLUS1-1:0]} ; + + for (i=0; i<(INT_GRPS); i++) begin + assign intpend_rd_part_out[i] = (({32{intpend_reg_read & picm_raddr_ff[5:2] == i}}) & intpend_reg_extended[((32*i)+31):(32*i)]) ; + end + + always_comb begin : INTPEND_RD + intpend_rd_out = '0 ; + for (int i=0; i AHB Gasket for LSU + axi4_to_ahb #(.pt(pt), + .TAG(pt.LSU_BUS_TAG)) lsu_axi4_to_ahb ( + .clk_override(dec_tlu_bus_clk_override), + .bus_clk_en(lsu_bus_clk_en), + + // AXI Write Channels + .axi_awvalid(lsu_axi_awvalid), + .axi_awready(lsu_axi_awready_ahb), + .axi_awid(lsu_axi_awid[pt.LSU_BUS_TAG-1:0]), + .axi_awaddr(lsu_axi_awaddr[31:0]), + .axi_awsize(lsu_axi_awsize[2:0]), + .axi_awprot(lsu_axi_awprot[2:0]), + + .axi_wvalid(lsu_axi_wvalid), + .axi_wready(lsu_axi_wready_ahb), + .axi_wdata(lsu_axi_wdata[63:0]), + .axi_wstrb(lsu_axi_wstrb[7:0]), + .axi_wlast(lsu_axi_wlast), + + .axi_bvalid(lsu_axi_bvalid_ahb), + .axi_bready(lsu_axi_bready), + .axi_bresp(lsu_axi_bresp_ahb[1:0]), + .axi_bid(lsu_axi_bid_ahb[pt.LSU_BUS_TAG-1:0]), + + // AXI Read Channels + .axi_arvalid(lsu_axi_arvalid), + .axi_arready(lsu_axi_arready_ahb), + .axi_arid(lsu_axi_arid[pt.LSU_BUS_TAG-1:0]), + .axi_araddr(lsu_axi_araddr[31:0]), + .axi_arsize(lsu_axi_arsize[2:0]), + .axi_arprot(lsu_axi_arprot[2:0]), + + .axi_rvalid(lsu_axi_rvalid_ahb), + .axi_rready(lsu_axi_rready), + .axi_rid(lsu_axi_rid_ahb[pt.LSU_BUS_TAG-1:0]), + .axi_rdata(lsu_axi_rdata_ahb[63:0]), + .axi_rresp(lsu_axi_rresp_ahb[1:0]), + .axi_rlast(lsu_axi_rlast_ahb), + + // AHB-LITE signals + .ahb_haddr(lsu_haddr[31:0]), + .ahb_hburst(lsu_hburst), + .ahb_hmastlock(lsu_hmastlock), + .ahb_hprot(lsu_hprot[3:0]), + .ahb_hsize(lsu_hsize[2:0]), + .ahb_htrans(lsu_htrans[1:0]), + .ahb_hwrite(lsu_hwrite), + .ahb_hwdata(lsu_hwdata[63:0]), + + .ahb_hrdata(lsu_hrdata[63:0]), + .ahb_hready(lsu_hready), + .ahb_hresp(lsu_hresp), + + .* + ); + + axi4_to_ahb #(.pt(pt), + .TAG(pt.IFU_BUS_TAG)) ifu_axi4_to_ahb ( + .clk(clk), + .clk_override(dec_tlu_bus_clk_override), + .bus_clk_en(ifu_bus_clk_en), + + // AHB-Lite signals + .ahb_haddr(haddr[31:0]), + .ahb_hburst(hburst), + .ahb_hmastlock(hmastlock), + .ahb_hprot(hprot[3:0]), + .ahb_hsize(hsize[2:0]), + .ahb_htrans(htrans[1:0]), + .ahb_hwrite(hwrite), + .ahb_hwdata(hwdata_nc[63:0]), + + .ahb_hrdata(hrdata[63:0]), + .ahb_hready(hready), + .ahb_hresp(hresp), + + // AXI Write Channels + .axi_awvalid(ifu_axi_awvalid), + .axi_awready(ifu_axi_awready_ahb), + .axi_awid(ifu_axi_awid[pt.IFU_BUS_TAG-1:0]), + .axi_awaddr(ifu_axi_awaddr[31:0]), + .axi_awsize(ifu_axi_awsize[2:0]), + .axi_awprot(ifu_axi_awprot[2:0]), + + .axi_wvalid(ifu_axi_wvalid), + .axi_wready(ifu_axi_wready_ahb), + .axi_wdata(ifu_axi_wdata[63:0]), + .axi_wstrb(ifu_axi_wstrb[7:0]), + .axi_wlast(ifu_axi_wlast), + + .axi_bvalid(ifu_axi_bvalid_ahb), + .axi_bready(1'b1), + .axi_bresp(ifu_axi_bresp_ahb[1:0]), + .axi_bid(ifu_axi_bid_ahb[pt.IFU_BUS_TAG-1:0]), + + // AXI Read Channels + .axi_arvalid(ifu_axi_arvalid), + .axi_arready(ifu_axi_arready_ahb), + .axi_arid(ifu_axi_arid[pt.IFU_BUS_TAG-1:0]), + .axi_araddr(ifu_axi_araddr[31:0]), + .axi_arsize(ifu_axi_arsize[2:0]), + .axi_arprot(ifu_axi_arprot[2:0]), + + .axi_rvalid(ifu_axi_rvalid_ahb), + .axi_rready(ifu_axi_rready), + .axi_rid(ifu_axi_rid_ahb[pt.IFU_BUS_TAG-1:0]), + .axi_rdata(ifu_axi_rdata_ahb[63:0]), + .axi_rresp(ifu_axi_rresp_ahb[1:0]), + .axi_rlast(ifu_axi_rlast_ahb), + .* + ); + + // AXI4 -> AHB Gasket for System Bus + axi4_to_ahb #(.pt(pt), + .TAG(pt.SB_BUS_TAG)) sb_axi4_to_ahb ( + .clk_override(dec_tlu_bus_clk_override), + .bus_clk_en(dbg_bus_clk_en), + + // AXI Write Channels + .axi_awvalid(sb_axi_awvalid), + .axi_awready(sb_axi_awready_ahb), + .axi_awid(sb_axi_awid[pt.SB_BUS_TAG-1:0]), + .axi_awaddr(sb_axi_awaddr[31:0]), + .axi_awsize(sb_axi_awsize[2:0]), + .axi_awprot(sb_axi_awprot[2:0]), + + .axi_wvalid(sb_axi_wvalid), + .axi_wready(sb_axi_wready_ahb), + .axi_wdata(sb_axi_wdata[63:0]), + .axi_wstrb(sb_axi_wstrb[7:0]), + .axi_wlast(sb_axi_wlast), + + .axi_bvalid(sb_axi_bvalid_ahb), + .axi_bready(sb_axi_bready), + .axi_bresp(sb_axi_bresp_ahb[1:0]), + .axi_bid(sb_axi_bid_ahb[pt.SB_BUS_TAG-1:0]), + + // AXI Read Channels + .axi_arvalid(sb_axi_arvalid), + .axi_arready(sb_axi_arready_ahb), + .axi_arid(sb_axi_arid[pt.SB_BUS_TAG-1:0]), + .axi_araddr(sb_axi_araddr[31:0]), + .axi_arsize(sb_axi_arsize[2:0]), + .axi_arprot(sb_axi_arprot[2:0]), + + .axi_rvalid(sb_axi_rvalid_ahb), + .axi_rready(sb_axi_rready), + .axi_rid(sb_axi_rid_ahb[pt.SB_BUS_TAG-1:0]), + .axi_rdata(sb_axi_rdata_ahb[63:0]), + .axi_rresp(sb_axi_rresp_ahb[1:0]), + .axi_rlast(sb_axi_rlast_ahb), + // AHB-LITE signals + .ahb_haddr(sb_haddr[31:0]), + .ahb_hburst(sb_hburst), + .ahb_hmastlock(sb_hmastlock), + .ahb_hprot(sb_hprot[3:0]), + .ahb_hsize(sb_hsize[2:0]), + .ahb_htrans(sb_htrans[1:0]), + .ahb_hwrite(sb_hwrite), + .ahb_hwdata(sb_hwdata[63:0]), + + .ahb_hrdata(sb_hrdata[63:0]), + .ahb_hready(sb_hready), + .ahb_hresp(sb_hresp), + + .* + ); + + //AHB -> AXI4 Gasket for DMA + ahb_to_axi4 #(.pt(pt), + .TAG(pt.DMA_BUS_TAG)) dma_ahb_to_axi4 ( + .clk_override(dec_tlu_bus_clk_override), + .bus_clk_en(dma_bus_clk_en), + + // AXI Write Channels + .axi_awvalid(dma_axi_awvalid_ahb), + .axi_awready(dma_axi_awready), + .axi_awid(dma_axi_awid_ahb[pt.DMA_BUS_TAG-1:0]), + .axi_awaddr(dma_axi_awaddr_ahb[31:0]), + .axi_awsize(dma_axi_awsize_ahb[2:0]), + .axi_awprot(dma_axi_awprot_ahb[2:0]), + .axi_awlen(dma_axi_awlen_ahb[7:0]), + .axi_awburst(dma_axi_awburst_ahb[1:0]), + + .axi_wvalid(dma_axi_wvalid_ahb), + .axi_wready(dma_axi_wready), + .axi_wdata(dma_axi_wdata_ahb[63:0]), + .axi_wstrb(dma_axi_wstrb_ahb[7:0]), + .axi_wlast(dma_axi_wlast_ahb), + + .axi_bvalid(dma_axi_bvalid), + .axi_bready(dma_axi_bready_ahb), + .axi_bresp(dma_axi_bresp[1:0]), + .axi_bid(dma_axi_bid[pt.DMA_BUS_TAG-1:0]), + + // AXI Read Channels + .axi_arvalid(dma_axi_arvalid_ahb), + .axi_arready(dma_axi_arready), + .axi_arid(dma_axi_arid_ahb[pt.DMA_BUS_TAG-1:0]), + .axi_araddr(dma_axi_araddr_ahb[31:0]), + .axi_arsize(dma_axi_arsize_ahb[2:0]), + .axi_arprot(dma_axi_arprot_ahb[2:0]), + .axi_arlen(dma_axi_arlen_ahb[7:0]), + .axi_arburst(dma_axi_arburst_ahb[1:0]), + + .axi_rvalid(dma_axi_rvalid), + .axi_rready(dma_axi_rready_ahb), + .axi_rid(dma_axi_rid[pt.DMA_BUS_TAG-1:0]), + .axi_rdata(dma_axi_rdata[63:0]), + .axi_rresp(dma_axi_rresp[1:0]), + + // AHB signals + .ahb_haddr(dma_haddr[31:0]), + .ahb_hburst(dma_hburst), + .ahb_hmastlock(dma_hmastlock), + .ahb_hprot(dma_hprot[3:0]), + .ahb_hsize(dma_hsize[2:0]), + .ahb_htrans(dma_htrans[1:0]), + .ahb_hwrite(dma_hwrite), + .ahb_hwdata(dma_hwdata[63:0]), + + .ahb_hrdata(dma_hrdata[63:0]), + .ahb_hreadyout(dma_hreadyout), + .ahb_hresp(dma_hresp), + .ahb_hreadyin(dma_hreadyin), + .ahb_hsel(dma_hsel), + .* + ); + + end + + // Drive the final AXI inputs + assign lsu_axi_awready_int = pt.BUILD_AHB_LITE ? lsu_axi_awready_ahb : lsu_axi_awready; + assign lsu_axi_wready_int = pt.BUILD_AHB_LITE ? lsu_axi_wready_ahb : lsu_axi_wready; + assign lsu_axi_bvalid_int = pt.BUILD_AHB_LITE ? lsu_axi_bvalid_ahb : lsu_axi_bvalid; + assign lsu_axi_bready_int = pt.BUILD_AHB_LITE ? lsu_axi_bready_ahb : lsu_axi_bready; + assign lsu_axi_bresp_int[1:0] = pt.BUILD_AHB_LITE ? lsu_axi_bresp_ahb[1:0] : lsu_axi_bresp[1:0]; + assign lsu_axi_bid_int[pt.LSU_BUS_TAG-1:0] = pt.BUILD_AHB_LITE ? lsu_axi_bid_ahb[pt.LSU_BUS_TAG-1:0] : lsu_axi_bid[pt.LSU_BUS_TAG-1:0]; + assign lsu_axi_arready_int = pt.BUILD_AHB_LITE ? lsu_axi_arready_ahb : lsu_axi_arready; + assign lsu_axi_rvalid_int = pt.BUILD_AHB_LITE ? lsu_axi_rvalid_ahb : lsu_axi_rvalid; + assign lsu_axi_rid_int[pt.LSU_BUS_TAG-1:0] = pt.BUILD_AHB_LITE ? lsu_axi_rid_ahb[pt.LSU_BUS_TAG-1:0] : lsu_axi_rid[pt.LSU_BUS_TAG-1:0]; + assign lsu_axi_rdata_int[63:0] = pt.BUILD_AHB_LITE ? lsu_axi_rdata_ahb[63:0] : lsu_axi_rdata[63:0]; + assign lsu_axi_rresp_int[1:0] = pt.BUILD_AHB_LITE ? lsu_axi_rresp_ahb[1:0] : lsu_axi_rresp[1:0]; + assign lsu_axi_rlast_int = pt.BUILD_AHB_LITE ? lsu_axi_rlast_ahb : lsu_axi_rlast; + + assign ifu_axi_awready_int = pt.BUILD_AHB_LITE ? ifu_axi_awready_ahb : ifu_axi_awready; + assign ifu_axi_wready_int = pt.BUILD_AHB_LITE ? ifu_axi_wready_ahb : ifu_axi_wready; + assign ifu_axi_bvalid_int = pt.BUILD_AHB_LITE ? ifu_axi_bvalid_ahb : ifu_axi_bvalid; + assign ifu_axi_bready_int = pt.BUILD_AHB_LITE ? ifu_axi_bready_ahb : ifu_axi_bready; + assign ifu_axi_bresp_int[1:0] = pt.BUILD_AHB_LITE ? ifu_axi_bresp_ahb[1:0] : ifu_axi_bresp[1:0]; + assign ifu_axi_bid_int[pt.IFU_BUS_TAG-1:0] = pt.BUILD_AHB_LITE ? ifu_axi_bid_ahb[pt.IFU_BUS_TAG-1:0] : ifu_axi_bid[pt.IFU_BUS_TAG-1:0]; + assign ifu_axi_arready_int = pt.BUILD_AHB_LITE ? ifu_axi_arready_ahb : ifu_axi_arready; + assign ifu_axi_rvalid_int = pt.BUILD_AHB_LITE ? ifu_axi_rvalid_ahb : ifu_axi_rvalid; + assign ifu_axi_rid_int[pt.IFU_BUS_TAG-1:0] = pt.BUILD_AHB_LITE ? ifu_axi_rid_ahb[pt.IFU_BUS_TAG-1:0] : ifu_axi_rid[pt.IFU_BUS_TAG-1:0]; + assign ifu_axi_rdata_int[63:0] = pt.BUILD_AHB_LITE ? ifu_axi_rdata_ahb[63:0] : ifu_axi_rdata[63:0]; + assign ifu_axi_rresp_int[1:0] = pt.BUILD_AHB_LITE ? ifu_axi_rresp_ahb[1:0] : ifu_axi_rresp[1:0]; + assign ifu_axi_rlast_int = pt.BUILD_AHB_LITE ? ifu_axi_rlast_ahb : ifu_axi_rlast; + + assign sb_axi_awready_int = pt.BUILD_AHB_LITE ? sb_axi_awready_ahb : sb_axi_awready; + assign sb_axi_wready_int = pt.BUILD_AHB_LITE ? sb_axi_wready_ahb : sb_axi_wready; + assign sb_axi_bvalid_int = pt.BUILD_AHB_LITE ? sb_axi_bvalid_ahb : sb_axi_bvalid; + assign sb_axi_bready_int = pt.BUILD_AHB_LITE ? sb_axi_bready_ahb : sb_axi_bready; + assign sb_axi_bresp_int[1:0] = pt.BUILD_AHB_LITE ? sb_axi_bresp_ahb[1:0] : sb_axi_bresp[1:0]; + assign sb_axi_bid_int[pt.SB_BUS_TAG-1:0] = pt.BUILD_AHB_LITE ? sb_axi_bid_ahb[pt.SB_BUS_TAG-1:0] : sb_axi_bid[pt.SB_BUS_TAG-1:0]; + assign sb_axi_arready_int = pt.BUILD_AHB_LITE ? sb_axi_arready_ahb : sb_axi_arready; + assign sb_axi_rvalid_int = pt.BUILD_AHB_LITE ? sb_axi_rvalid_ahb : sb_axi_rvalid; + assign sb_axi_rid_int[pt.SB_BUS_TAG-1:0] = pt.BUILD_AHB_LITE ? sb_axi_rid_ahb[pt.SB_BUS_TAG-1:0] : sb_axi_rid[pt.SB_BUS_TAG-1:0]; + assign sb_axi_rdata_int[63:0] = pt.BUILD_AHB_LITE ? sb_axi_rdata_ahb[63:0] : sb_axi_rdata[63:0]; + assign sb_axi_rresp_int[1:0] = pt.BUILD_AHB_LITE ? sb_axi_rresp_ahb[1:0] : sb_axi_rresp[1:0]; + assign sb_axi_rlast_int = pt.BUILD_AHB_LITE ? sb_axi_rlast_ahb : sb_axi_rlast; + + assign dma_axi_awvalid_int = pt.BUILD_AHB_LITE ? dma_axi_awvalid_ahb : dma_axi_awvalid; + assign dma_axi_awid_int[pt.DMA_BUS_TAG-1:0] = pt.BUILD_AHB_LITE ? dma_axi_awid_ahb[pt.DMA_BUS_TAG-1:0] : dma_axi_awid[pt.DMA_BUS_TAG-1:0]; + assign dma_axi_awaddr_int[31:0] = pt.BUILD_AHB_LITE ? dma_axi_awaddr_ahb[31:0] : dma_axi_awaddr[31:0]; + assign dma_axi_awsize_int[2:0] = pt.BUILD_AHB_LITE ? dma_axi_awsize_ahb[2:0] : dma_axi_awsize[2:0]; + assign dma_axi_awprot_int[2:0] = pt.BUILD_AHB_LITE ? dma_axi_awprot_ahb[2:0] : dma_axi_awprot[2:0]; + assign dma_axi_awlen_int[7:0] = pt.BUILD_AHB_LITE ? dma_axi_awlen_ahb[7:0] : dma_axi_awlen[7:0]; + assign dma_axi_awburst_int[1:0] = pt.BUILD_AHB_LITE ? dma_axi_awburst_ahb[1:0] : dma_axi_awburst[1:0]; + assign dma_axi_wvalid_int = pt.BUILD_AHB_LITE ? dma_axi_wvalid_ahb : dma_axi_wvalid; + assign dma_axi_wdata_int[63:0] = pt.BUILD_AHB_LITE ? dma_axi_wdata_ahb[63:0] : dma_axi_wdata; + assign dma_axi_wstrb_int[7:0] = pt.BUILD_AHB_LITE ? dma_axi_wstrb_ahb[7:0] : dma_axi_wstrb[7:0]; + assign dma_axi_wlast_int = pt.BUILD_AHB_LITE ? dma_axi_wlast_ahb : dma_axi_wlast; + assign dma_axi_bready_int = pt.BUILD_AHB_LITE ? dma_axi_bready_ahb : dma_axi_bready; + assign dma_axi_arvalid_int = pt.BUILD_AHB_LITE ? dma_axi_arvalid_ahb : dma_axi_arvalid; + assign dma_axi_arid_int[pt.DMA_BUS_TAG-1:0] = pt.BUILD_AHB_LITE ? dma_axi_arid_ahb[pt.DMA_BUS_TAG-1:0] : dma_axi_arid[pt.DMA_BUS_TAG-1:0]; + assign dma_axi_araddr_int[31:0] = pt.BUILD_AHB_LITE ? dma_axi_araddr_ahb[31:0] : dma_axi_araddr[31:0]; + assign dma_axi_arsize_int[2:0] = pt.BUILD_AHB_LITE ? dma_axi_arsize_ahb[2:0] : dma_axi_arsize[2:0]; + assign dma_axi_arprot_int[2:0] = pt.BUILD_AHB_LITE ? dma_axi_arprot_ahb[2:0] : dma_axi_arprot[2:0]; + assign dma_axi_arlen_int[7:0] = pt.BUILD_AHB_LITE ? dma_axi_arlen_ahb[7:0] : dma_axi_arlen[7:0]; + assign dma_axi_arburst_int[1:0] = pt.BUILD_AHB_LITE ? dma_axi_arburst_ahb[1:0] : dma_axi_arburst[1:0]; + assign dma_axi_rready_int = pt.BUILD_AHB_LITE ? dma_axi_rready_ahb : dma_axi_rready; + + +if (pt.BUILD_AHB_LITE == 1) begin +`ifdef ASSERT_ON + property ahb_trxn_aligned; + @(posedge clk) disable iff(~rst_l) (lsu_htrans[1:0] != 2'b0) |-> ((lsu_hsize[2:0] == 3'h0) | + ((lsu_hsize[2:0] == 3'h1) & (lsu_haddr[0] == 1'b0)) | + ((lsu_hsize[2:0] == 3'h2) & (lsu_haddr[1:0] == 2'b0)) | + ((lsu_hsize[2:0] == 3'h3) & (lsu_haddr[2:0] == 3'b0))); + endproperty + assert_ahb_trxn_aligned: assert property (ahb_trxn_aligned) else + $display("Assertion ahb_trxn_aligned failed: lsu_htrans=2'h%h, lsu_hsize=3'h%h, lsu_haddr=32'h%h",lsu_htrans[1:0], lsu_hsize[2:0], lsu_haddr[31:0]); + + property dma_trxn_aligned; + @(posedge clk) disable iff(~rst_l) (dma_htrans[1:0] != 2'b0) |-> ((dma_hsize[2:0] == 3'h0) | + ((dma_hsize[2:0] == 3'h1) & (dma_haddr[0] == 1'b0)) | + ((dma_hsize[2:0] == 3'h2) & (dma_haddr[1:0] == 2'b0)) | + ((dma_hsize[2:0] == 3'h3) & (dma_haddr[2:0] == 3'b0))); + endproperty + + +`endif + end // if (pt.BUILD_AHB_LITE == 1) + + + // unpack packet + // also need retires_p==3 + + assign trace_rv_i_insn_ip[31:0] = rv_trace_pkt.rv_i_insn_ip[31:0]; + assign trace_rv_i_address_ip[31:0] = rv_trace_pkt.rv_i_address_ip[31:0]; + assign trace_rv_i_valid_ip[1:0] = rv_trace_pkt.rv_i_valid_ip[1:0]; + assign trace_rv_i_exception_ip[1:0] = rv_trace_pkt.rv_i_exception_ip[1:0]; + assign trace_rv_i_ecause_ip[4:0] = rv_trace_pkt.rv_i_ecause_ip[4:0]; + assign trace_rv_i_interrupt_ip[2:0] = rv_trace_pkt.rv_i_interrupt_ip[2:0]; + assign trace_rv_i_tval_ip[31:0] = rv_trace_pkt.rv_i_tval_ip[31:0]; + + + + + +endmodule // el2_swerv + diff --git a/design/el2_swerv_wrapper.sv b/design/el2_swerv_wrapper.sv new file mode 100644 index 0000000..b52194e --- /dev/null +++ b/design/el2_swerv_wrapper.sv @@ -0,0 +1,712 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright 2020 Western Digital Corporation or it's affiliates. +// +// 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. + +//******************************************************************************** +// $Id$ +// +// Function: Top wrapper file with el2_swerv/mem instantiated inside +// Comments: +// +//******************************************************************************** +module el2_swerv_wrapper +import el2_pkg::*; + #( +`include "el2_param.vh" +) +( + input logic clk, + input logic rst_l, + input logic [31:1] rst_vec, + input logic nmi_int, + input logic [31:1] nmi_vec, + input logic [31:1] jtag_id, + + + output logic [31:0] trace_rv_i_insn_ip, + output logic [31:0] trace_rv_i_address_ip, + output logic [1:0] trace_rv_i_valid_ip, + output logic [1:0] trace_rv_i_exception_ip, + output logic [4:0] trace_rv_i_ecause_ip, + output logic [2:0] trace_rv_i_interrupt_ip, + output logic [31:0] trace_rv_i_tval_ip, + + // Bus signals +`ifdef RV_BUILD_AXI4 + //-------------------------- LSU AXI signals-------------------------- + // AXI Write Channels + output logic lsu_axi_awvalid, + input logic lsu_axi_awready, + output logic [pt.LSU_BUS_TAG-1:0] lsu_axi_awid, + output logic [31:0] lsu_axi_awaddr, + output logic [3:0] lsu_axi_awregion, + output logic [7:0] lsu_axi_awlen, + output logic [2:0] lsu_axi_awsize, + output logic [1:0] lsu_axi_awburst, + output logic lsu_axi_awlock, + output logic [3:0] lsu_axi_awcache, + output logic [2:0] lsu_axi_awprot, + output logic [3:0] lsu_axi_awqos, + + output logic lsu_axi_wvalid, + input logic lsu_axi_wready, + output logic [63:0] lsu_axi_wdata, + output logic [7:0] lsu_axi_wstrb, + output logic lsu_axi_wlast, + + input logic lsu_axi_bvalid, + output logic lsu_axi_bready, + input logic [1:0] lsu_axi_bresp, + input logic [pt.LSU_BUS_TAG-1:0] lsu_axi_bid, + + // AXI Read Channels + output logic lsu_axi_arvalid, + input logic lsu_axi_arready, + output logic [pt.LSU_BUS_TAG-1:0] lsu_axi_arid, + output logic [31:0] lsu_axi_araddr, + output logic [3:0] lsu_axi_arregion, + output logic [7:0] lsu_axi_arlen, + output logic [2:0] lsu_axi_arsize, + output logic [1:0] lsu_axi_arburst, + output logic lsu_axi_arlock, + output logic [3:0] lsu_axi_arcache, + output logic [2:0] lsu_axi_arprot, + output logic [3:0] lsu_axi_arqos, + + input logic lsu_axi_rvalid, + output logic lsu_axi_rready, + input logic [pt.LSU_BUS_TAG-1:0] lsu_axi_rid, + input logic [63:0] lsu_axi_rdata, + input logic [1:0] lsu_axi_rresp, + input logic lsu_axi_rlast, + + //-------------------------- IFU AXI signals-------------------------- + // AXI Write Channels + output logic ifu_axi_awvalid, + input logic ifu_axi_awready, + output logic [pt.IFU_BUS_TAG-1:0] ifu_axi_awid, + output logic [31:0] ifu_axi_awaddr, + output logic [3:0] ifu_axi_awregion, + output logic [7:0] ifu_axi_awlen, + output logic [2:0] ifu_axi_awsize, + output logic [1:0] ifu_axi_awburst, + output logic ifu_axi_awlock, + output logic [3:0] ifu_axi_awcache, + output logic [2:0] ifu_axi_awprot, + output logic [3:0] ifu_axi_awqos, + + output logic ifu_axi_wvalid, + input logic ifu_axi_wready, + output logic [63:0] ifu_axi_wdata, + output logic [7:0] ifu_axi_wstrb, + output logic ifu_axi_wlast, + + input logic ifu_axi_bvalid, + output logic ifu_axi_bready, + input logic [1:0] ifu_axi_bresp, + input logic [pt.IFU_BUS_TAG-1:0] ifu_axi_bid, + + // AXI Read Channels + output logic ifu_axi_arvalid, + input logic ifu_axi_arready, + output logic [pt.IFU_BUS_TAG-1:0] ifu_axi_arid, + output logic [31:0] ifu_axi_araddr, + output logic [3:0] ifu_axi_arregion, + output logic [7:0] ifu_axi_arlen, + output logic [2:0] ifu_axi_arsize, + output logic [1:0] ifu_axi_arburst, + output logic ifu_axi_arlock, + output logic [3:0] ifu_axi_arcache, + output logic [2:0] ifu_axi_arprot, + output logic [3:0] ifu_axi_arqos, + + input logic ifu_axi_rvalid, + output logic ifu_axi_rready, + input logic [pt.IFU_BUS_TAG-1:0] ifu_axi_rid, + input logic [63:0] ifu_axi_rdata, + input logic [1:0] ifu_axi_rresp, + input logic ifu_axi_rlast, + + //-------------------------- SB AXI signals-------------------------- + // AXI Write Channels + output logic sb_axi_awvalid, + input logic sb_axi_awready, + output logic [pt.SB_BUS_TAG-1:0] sb_axi_awid, + output logic [31:0] sb_axi_awaddr, + output logic [3:0] sb_axi_awregion, + output logic [7:0] sb_axi_awlen, + output logic [2:0] sb_axi_awsize, + output logic [1:0] sb_axi_awburst, + output logic sb_axi_awlock, + output logic [3:0] sb_axi_awcache, + output logic [2:0] sb_axi_awprot, + output logic [3:0] sb_axi_awqos, + + output logic sb_axi_wvalid, + input logic sb_axi_wready, + output logic [63:0] sb_axi_wdata, + output logic [7:0] sb_axi_wstrb, + output logic sb_axi_wlast, + + input logic sb_axi_bvalid, + output logic sb_axi_bready, + input logic [1:0] sb_axi_bresp, + input logic [pt.SB_BUS_TAG-1:0] sb_axi_bid, + + // AXI Read Channels + output logic sb_axi_arvalid, + input logic sb_axi_arready, + output logic [pt.SB_BUS_TAG-1:0] sb_axi_arid, + output logic [31:0] sb_axi_araddr, + output logic [3:0] sb_axi_arregion, + output logic [7:0] sb_axi_arlen, + output logic [2:0] sb_axi_arsize, + output logic [1:0] sb_axi_arburst, + output logic sb_axi_arlock, + output logic [3:0] sb_axi_arcache, + output logic [2:0] sb_axi_arprot, + output logic [3:0] sb_axi_arqos, + + input logic sb_axi_rvalid, + output logic sb_axi_rready, + input logic [pt.SB_BUS_TAG-1:0] sb_axi_rid, + input logic [63:0] sb_axi_rdata, + input logic [1:0] sb_axi_rresp, + input logic sb_axi_rlast, + + //-------------------------- DMA AXI signals-------------------------- + // AXI Write Channels + input logic dma_axi_awvalid, + output logic dma_axi_awready, + input logic [pt.DMA_BUS_TAG-1:0] dma_axi_awid, + input logic [31:0] dma_axi_awaddr, + input logic [2:0] dma_axi_awsize, + input logic [2:0] dma_axi_awprot, + input logic [7:0] dma_axi_awlen, + input logic [1:0] dma_axi_awburst, + + + input logic dma_axi_wvalid, + output logic dma_axi_wready, + input logic [63:0] dma_axi_wdata, + input logic [7:0] dma_axi_wstrb, + input logic dma_axi_wlast, + + output logic dma_axi_bvalid, + input logic dma_axi_bready, + output logic [1:0] dma_axi_bresp, + output logic [pt.DMA_BUS_TAG-1:0] dma_axi_bid, + + // AXI Read Channels + input logic dma_axi_arvalid, + output logic dma_axi_arready, + input logic [pt.DMA_BUS_TAG-1:0] dma_axi_arid, + input logic [31:0] dma_axi_araddr, + input logic [2:0] dma_axi_arsize, + input logic [2:0] dma_axi_arprot, + input logic [7:0] dma_axi_arlen, + input logic [1:0] dma_axi_arburst, + + output logic dma_axi_rvalid, + input logic dma_axi_rready, + output logic [pt.DMA_BUS_TAG-1:0] dma_axi_rid, + output logic [63:0] dma_axi_rdata, + output logic [1:0] dma_axi_rresp, + output logic dma_axi_rlast, +`endif + +`ifdef RV_BUILD_AHB_LITE + //// AHB LITE BUS + output logic [31:0] haddr, + output logic [2:0] hburst, + output logic hmastlock, + output logic [3:0] hprot, + output logic [2:0] hsize, + output logic [1:0] htrans, + output logic hwrite, + + input logic [63:0] hrdata, + input logic hready, + input logic hresp, + + // LSU AHB Master + output logic [31:0] lsu_haddr, + output logic [2:0] lsu_hburst, + output logic lsu_hmastlock, + output logic [3:0] lsu_hprot, + output logic [2:0] lsu_hsize, + output logic [1:0] lsu_htrans, + output logic lsu_hwrite, + output logic [63:0] lsu_hwdata, + + input logic [63:0] lsu_hrdata, + input logic lsu_hready, + input logic lsu_hresp, + // Debug Syster Bus AHB + output logic [31:0] sb_haddr, + output logic [2:0] sb_hburst, + output logic sb_hmastlock, + output logic [3:0] sb_hprot, + output logic [2:0] sb_hsize, + output logic [1:0] sb_htrans, + output logic sb_hwrite, + output logic [63:0] sb_hwdata, + + input logic [63:0] sb_hrdata, + input logic sb_hready, + input logic sb_hresp, + + // DMA Slave + input logic dma_hsel, + input logic [31:0] dma_haddr, + input logic [2:0] dma_hburst, + input logic dma_hmastlock, + input logic [3:0] dma_hprot, + input logic [2:0] dma_hsize, + input logic [1:0] dma_htrans, + input logic dma_hwrite, + input logic [63:0] dma_hwdata, + input logic dma_hreadyin, + + output logic [63:0] dma_hrdata, + output logic dma_hreadyout, + output logic dma_hresp, +`endif + // clk ratio signals + input logic lsu_bus_clk_en, // Clock ratio b/w cpu core clk & AHB master interface + input logic ifu_bus_clk_en, // Clock ratio b/w cpu core clk & AHB master interface + input logic dbg_bus_clk_en, // Clock ratio b/w cpu core clk & AHB master interface + input logic dma_bus_clk_en, // Clock ratio b/w cpu core clk & AHB slave interface + + +// input logic ext_int, + input logic timer_int, + input logic soft_int, + input logic [pt.PIC_TOTAL_INT:1] extintsrc_req, + + output logic dec_tlu_perfcnt0, // toggles when slot0 perf counter 0 has an event inc + output logic dec_tlu_perfcnt1, + output logic dec_tlu_perfcnt2, + output logic dec_tlu_perfcnt3, + + input logic jtag_tck, // JTAG clk + input logic jtag_tms, // JTAG TMS + input logic jtag_tdi, // JTAG tdi + input logic jtag_trst_n, // JTAG Reset + output logic jtag_tdo, // JTAG TDO + + input logic [31:4] core_id, + + // external MPC halt/run interface + input logic mpc_debug_halt_req, // Async halt request + input logic mpc_debug_run_req, // Async run request + input logic mpc_reset_run_req, // Run/halt after reset + output logic mpc_debug_halt_ack, // Halt ack + output logic mpc_debug_run_ack, // Run ack + output logic debug_brkpt_status, // debug breakpoint + + input logic i_cpu_halt_req, // Async halt req to CPU + output logic o_cpu_halt_ack, // core response to halt + output logic o_cpu_halt_status, // 1'b1 indicates core is halted + output logic o_debug_mode_status, // Core to the PMU that core is in debug mode. When core is in debug mode, the PMU should refrain from sendng a halt or run request + input logic i_cpu_run_req, // Async restart req to CPU + output logic o_cpu_run_ack, // Core response to run req + input logic scan_mode, // To enable scan mode + input logic mbist_mode // to enable mbist +); + + + // DCCM ports + logic dccm_wren; + logic dccm_rden; + logic [pt.DCCM_BITS-1:0] dccm_wr_addr_lo; + logic [pt.DCCM_BITS-1:0] dccm_wr_addr_hi; + logic [pt.DCCM_BITS-1:0] dccm_rd_addr_lo; + logic [pt.DCCM_BITS-1:0] dccm_rd_addr_hi; + logic [pt.DCCM_FDATA_WIDTH-1:0] dccm_wr_data_lo; + logic [pt.DCCM_FDATA_WIDTH-1:0] dccm_wr_data_hi; + + logic [pt.DCCM_FDATA_WIDTH-1:0] dccm_rd_data_lo; + logic [pt.DCCM_FDATA_WIDTH-1:0] dccm_rd_data_hi; + + // PIC ports + + // Icache & Itag ports + logic [31:1] ic_rw_addr; + logic [pt.ICACHE_NUM_WAYS-1:0] ic_wr_en ; // Which way to write + logic ic_rd_en ; + + + logic [pt.ICACHE_NUM_WAYS-1:0] ic_tag_valid; // Valid from the I$ tag valid outside (in flops). + + logic [pt.ICACHE_NUM_WAYS-1:0] ic_rd_hit; // ic_rd_hit[3:0] + logic ic_tag_perr; // Ic tag parity error + + logic [pt.ICACHE_INDEX_HI:3] ic_debug_addr; // Read/Write addresss to the Icache. + logic ic_debug_rd_en; // Icache debug rd + logic ic_debug_wr_en; // Icache debug wr + logic ic_debug_tag_array; // Debug tag array + logic [pt.ICACHE_NUM_WAYS-1:0] ic_debug_way; // Debug way. Rd or Wr. + + logic [25:0] ictag_debug_rd_data;// Debug icache tag. + logic [pt.ICACHE_BANKS_WAY-1:0][70:0] ic_wr_data; + logic [63:0] ic_rd_data; + logic [70:0] ic_debug_rd_data; // Data read from Icache. 2x64bits + parity bits. F2 stage. With ECC + logic [70:0] ic_debug_wr_data; // Debug wr cache. + + logic [pt.ICACHE_BANKS_WAY-1:0] ic_eccerr; // ecc error per bank + logic [pt.ICACHE_BANKS_WAY-1:0] ic_parerr; // parity error per bank + + logic [63:0] ic_premux_data; + logic ic_sel_premux_data; + + // ICCM ports + logic [pt.ICCM_BITS-1:1] iccm_rw_addr; + logic iccm_wren; + logic iccm_rden; + logic [2:0] iccm_wr_size; + logic [77:0] iccm_wr_data; + logic iccm_buf_correct_ecc; + logic iccm_correction_state; + + logic [63:0] iccm_rd_data; + logic [77:0] iccm_rd_data_ecc; + + logic core_rst_l; // Core reset including rst_l and dbg_rst_l + logic jtag_tdoEn; + logic dmi_reg_en; + logic [6:0] dmi_reg_addr; + logic dmi_reg_wr_en; + logic [31:0] dmi_reg_wdata; + logic [31:0] dmi_reg_rdata; + logic dmi_hard_reset; + + logic dccm_clk_override; + logic icm_clk_override; + logic dec_tlu_core_ecc_disable; + + + // zero out the signals not presented at the wrapper instantiation level +`ifdef RV_BUILD_AXI4 + + //// AHB LITE BUS + logic [31:0] haddr; + logic [2:0] hburst; + logic hmastlock; + logic [3:0] hprot; + logic [2:0] hsize; + logic [1:0] htrans; + logic hwrite; + + logic [63:0] hrdata; + logic hready; + logic hresp; + + // LSU AHB Master + logic [31:0] lsu_haddr; + logic [2:0] lsu_hburst; + logic lsu_hmastlock; + logic [3:0] lsu_hprot; + logic [2:0] lsu_hsize; + logic [1:0] lsu_htrans; + logic lsu_hwrite; + logic [63:0] lsu_hwdata; + + logic [63:0] lsu_hrdata; + logic lsu_hready; + logic lsu_hresp; + // Debug Syster Bus AHB + logic [31:0] sb_haddr; + logic [2:0] sb_hburst; + logic sb_hmastlock; + logic [3:0] sb_hprot; + logic [2:0] sb_hsize; + logic [1:0] sb_htrans; + logic sb_hwrite; + logic [63:0] sb_hwdata; + + logic [63:0] sb_hrdata; + logic sb_hready; + logic sb_hresp; + + // DMA Slave + logic dma_hsel; + logic [31:0] dma_haddr; + logic [2:0] dma_hburst; + logic dma_hmastlock; + logic [3:0] dma_hprot; + logic [2:0] dma_hsize; + logic [1:0] dma_htrans; + logic dma_hwrite; + logic [63:0] dma_hwdata; + logic dma_hreadyin; + + logic [63:0] dma_hrdata; + logic dma_hreadyout; + logic dma_hresp; + + + // AHB + assign hrdata[63:0] = '0; + assign hready = '0; + assign hresp = '0; + // LSU + assign lsu_hrdata[63:0] = '0; + assign lsu_hready = '0; + assign lsu_hresp = '0; + // Debu + assign sb_hrdata[63:0] = '0; + assign sb_hready = '0; + assign sb_hresp = '0; + + // DMA + assign dma_hsel = '0; + assign dma_haddr[31:0] = '0; + assign dma_hburst[2:0] = '0; + assign dma_hmastlock = '0; + assign dma_hprot[3:0] = '0; + assign dma_hsize[2:0] = '0; + assign dma_htrans[1:0] = '0; + assign dma_hwrite = '0; + assign dma_hwdata[63:0] = '0; + assign dma_hreadyin = '0; + +`endif // `ifdef RV_BUILD_AXI4 + +`ifdef RV_BUILD_AHB_LITE + wire lsu_axi_awvalid; + wire lsu_axi_awready; + wire [pt.LSU_BUS_TAG-1:0] lsu_axi_awid; + wire [31:0] lsu_axi_awaddr; + wire [3:0] lsu_axi_awregion; + wire [7:0] lsu_axi_awlen; + wire [2:0] lsu_axi_awsize; + wire [1:0] lsu_axi_awburst; + wire lsu_axi_awlock; + wire [3:0] lsu_axi_awcache; + wire [2:0] lsu_axi_awprot; + wire [3:0] lsu_axi_awqos; + + wire lsu_axi_wvalid; + wire lsu_axi_wready; + wire [63:0] lsu_axi_wdata; + wire [7:0] lsu_axi_wstrb; + wire lsu_axi_wlast; + + wire lsu_axi_bvalid; + wire lsu_axi_bready; + wire [1:0] lsu_axi_bresp; + wire [pt.LSU_BUS_TAG-1:0] lsu_axi_bid; + + // AXI Read Channels + wire lsu_axi_arvalid; + wire lsu_axi_arready; + wire [pt.LSU_BUS_TAG-1:0] lsu_axi_arid; + wire [31:0] lsu_axi_araddr; + wire [3:0] lsu_axi_arregion; + wire [7:0] lsu_axi_arlen; + wire [2:0] lsu_axi_arsize; + wire [1:0] lsu_axi_arburst; + wire lsu_axi_arlock; + wire [3:0] lsu_axi_arcache; + wire [2:0] lsu_axi_arprot; + wire [3:0] lsu_axi_arqos; + + wire lsu_axi_rvalid; + wire lsu_axi_rready; + wire [pt.LSU_BUS_TAG-1:0] lsu_axi_rid; + wire [63:0] lsu_axi_rdata; + wire [1:0] lsu_axi_rresp; + wire lsu_axi_rlast; + + //-------------------------- IFU AXI signals-------------------------- + // AXI Write Channels + wire ifu_axi_awvalid; + wire ifu_axi_awready; + wire [pt.IFU_BUS_TAG-1:0] ifu_axi_awid; + wire [31:0] ifu_axi_awaddr; + wire [3:0] ifu_axi_awregion; + wire [7:0] ifu_axi_awlen; + wire [2:0] ifu_axi_awsize; + wire [1:0] ifu_axi_awburst; + wire ifu_axi_awlock; + wire [3:0] ifu_axi_awcache; + wire [2:0] ifu_axi_awprot; + wire [3:0] ifu_axi_awqos; + + wire ifu_axi_wvalid; + wire ifu_axi_wready; + wire [63:0] ifu_axi_wdata; + wire [7:0] ifu_axi_wstrb; + wire ifu_axi_wlast; + + wire ifu_axi_bvalid; + wire ifu_axi_bready; + wire [1:0] ifu_axi_bresp; + wire [pt.IFU_BUS_TAG-1:0] ifu_axi_bid; + + // AXI Read Channels + wire ifu_axi_arvalid; + wire ifu_axi_arready; + wire [pt.IFU_BUS_TAG-1:0] ifu_axi_arid; + wire [31:0] ifu_axi_araddr; + wire [3:0] ifu_axi_arregion; + wire [7:0] ifu_axi_arlen; + wire [2:0] ifu_axi_arsize; + wire [1:0] ifu_axi_arburst; + wire ifu_axi_arlock; + wire [3:0] ifu_axi_arcache; + wire [2:0] ifu_axi_arprot; + wire [3:0] ifu_axi_arqos; + + wire ifu_axi_rvalid; + wire ifu_axi_rready; + wire [pt.IFU_BUS_TAG-1:0] ifu_axi_rid; + wire [63:0] ifu_axi_rdata; + wire [1:0] ifu_axi_rresp; + wire ifu_axi_rlast; + + //-------------------------- SB AXI signals-------------------------- + // AXI Write Channels + wire sb_axi_awvalid; + wire sb_axi_awready; + wire [pt.SB_BUS_TAG-1:0] sb_axi_awid; + wire [31:0] sb_axi_awaddr; + wire [3:0] sb_axi_awregion; + wire [7:0] sb_axi_awlen; + wire [2:0] sb_axi_awsize; + wire [1:0] sb_axi_awburst; + wire sb_axi_awlock; + wire [3:0] sb_axi_awcache; + wire [2:0] sb_axi_awprot; + wire [3:0] sb_axi_awqos; + + wire sb_axi_wvalid; + wire sb_axi_wready; + wire [63:0] sb_axi_wdata; + wire [7:0] sb_axi_wstrb; + wire sb_axi_wlast; + + wire sb_axi_bvalid; + wire sb_axi_bready; + wire [1:0] sb_axi_bresp; + wire [pt.SB_BUS_TAG-1:0] sb_axi_bid; + + // AXI Read Channels + wire sb_axi_arvalid; + wire sb_axi_arready; + wire [pt.SB_BUS_TAG-1:0] sb_axi_arid; + wire [31:0] sb_axi_araddr; + wire [3:0] sb_axi_arregion; + wire [7:0] sb_axi_arlen; + wire [2:0] sb_axi_arsize; + wire [1:0] sb_axi_arburst; + wire sb_axi_arlock; + wire [3:0] sb_axi_arcache; + wire [2:0] sb_axi_arprot; + wire [3:0] sb_axi_arqos; + + wire sb_axi_rvalid; + wire sb_axi_rready; + wire [pt.SB_BUS_TAG-1:0] sb_axi_rid; + wire [63:0] sb_axi_rdata; + wire [1:0] sb_axi_rresp; + wire sb_axi_rlast; + + //-------------------------- DMA AXI signals-------------------------- + // AXI Write Channels + wire dma_axi_awvalid; + wire dma_axi_awready; + wire [pt.DMA_BUS_TAG-1:0] dma_axi_awid; + wire [31:0] dma_axi_awaddr; + wire [2:0] dma_axi_awsize; + wire [2:0] dma_axi_awprot; + wire [7:0] dma_axi_awlen; + wire [1:0] dma_axi_awburst; + + + wire dma_axi_wvalid; + wire dma_axi_wready; + wire [63:0] dma_axi_wdata; + wire [7:0] dma_axi_wstrb; + wire dma_axi_wlast; + + wire dma_axi_bvalid; + wire dma_axi_bready; + wire [1:0] dma_axi_bresp; + wire [pt.DMA_BUS_TAG-1:0] dma_axi_bid; + + // AXI Read Channels + wire dma_axi_arvalid; + wire dma_axi_arready; + wire [pt.DMA_BUS_TAG-1:0] dma_axi_arid; + wire [31:0] dma_axi_araddr; + wire [2:0] dma_axi_arsize; + wire [2:0] dma_axi_arprot; + wire [7:0] dma_axi_arlen; + wire [1:0] dma_axi_arburst; + + wire dma_axi_rvalid; + wire dma_axi_rready; + wire [pt.DMA_BUS_TAG-1:0] dma_axi_rid; + wire [63:0] dma_axi_rdata; + wire [1:0] dma_axi_rresp; + wire dma_axi_rlast; + + // AXI + assign ifu_axi_awready = 1'b1; + assign ifu_axi_wready = 1'b1; + assign ifu_axi_bvalid = '0; + assign ifu_axi_bresp[1:0] = '0; + assign ifu_axi_bid[pt.IFU_BUS_TAG-1:0] = '0; + +`endif // `ifdef RV_BUILD_AHB_LITE + + // Instantiate the el2_swerv core + el2_swerv #(.pt(pt)) swerv ( + .* + ); + + // Instantiate the mem + el2_mem #(.pt(pt)) mem( + .rst_l(core_rst_l), + .* + ); + + // Instantiate the JTAG/DMI + dmi_wrapper dmi_wrapper ( + // JTAG signals + .trst_n(jtag_trst_n), // JTAG reset + .tck (jtag_tck), // JTAG clock + .tms (jtag_tms), // Test mode select + .tdi (jtag_tdi), // Test Data Input + .tdo (jtag_tdo), // Test Data Output + .tdoEnable (), // Test Data Output enable + + // Processor Signals + .core_rst_n (core_rst_l), // Core reset, active low + .core_clk (clk), // Core clock + .jtag_id (jtag_id), // 32 bit JTAG ID + .rd_data (dmi_reg_rdata), // 32 bit Read data from Processor + .reg_wr_data (dmi_reg_wdata), // 32 bit Write data to Processor + .reg_wr_addr (dmi_reg_addr), // 32 bit Write address to Processor + .reg_en (dmi_reg_en), // 1 bit Write interface bit to Processor + .reg_wr_en (dmi_reg_wr_en), // 1 bit Write enable to Processor + .dmi_hard_reset (dmi_hard_reset) //a hard reset of the DTM, causing the DTM to forget about any outstanding DMI transactions +); + + + +endmodule + diff --git a/design/exu/el2_exu.sv b/design/exu/el2_exu.sv new file mode 100644 index 0000000..fc5f547 --- /dev/null +++ b/design/exu/el2_exu.sv @@ -0,0 +1,357 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright 2020 Western Digital Corporation or it's affiliates. +// +// 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. + + +module el2_exu +import el2_pkg::*; +#( +`include "el2_param.vh" +) + ( + input logic clk, // Top level clock + input logic rst_l, // Reset + input logic scan_mode, // Scan control + + input logic [1:0] dec_data_en, // Clock enable {x,r}, one cycle pulse + input logic [1:0] dec_ctl_en, // Clock enable {x,r}, two cycle pulse + input logic [31:0] dbg_cmd_wrdata, // Debug data to primary I0 RS1 + input el2_alu_pkt_t i0_ap, // DEC alu {valid,predecodes} + + input logic dec_debug_wdata_rs1_d, // Debug select to primary I0 RS1 + + input el2_predict_pkt_t dec_i0_predict_p_d, // DEC branch predict packet + input logic [pt.BHT_GHR_SIZE-1:0] i0_predict_fghr_d, // DEC predict fghr + input logic [pt.BTB_ADDR_HI:pt.BTB_ADDR_LO] i0_predict_index_d, // DEC predict index + input logic [pt.BTB_BTAG_SIZE-1:0] i0_predict_btag_d, // DEC predict branch tag + + input logic dec_i0_rs1_en_d, // Qualify GPR RS1 data + input logic dec_i0_rs2_en_d, // Qualify GPR RS2 data + input logic [31:0] gpr_i0_rs1_d, // DEC data gpr + input logic [31:0] gpr_i0_rs2_d, // DEC data gpr + input logic [31:0] dec_i0_immed_d, // DEC data immediate + input logic [31:0] dec_i0_rs1_bypass_data_d, // DEC bypass data + input logic [31:0] dec_i0_rs2_bypass_data_d, // DEC bypass data + input logic [12:1] dec_i0_br_immed_d, // Branch immediate + input logic dec_i0_alu_decode_d, // Valid to X-stage ALU + input logic dec_i0_select_pc_d, // PC select to RS1 + input logic [31:1] dec_i0_pc_d, // Instruction PC + input logic [1:0] dec_i0_rs1_bypass_en_d, // DEC bypass select 1 - X-stage, 0 - dec bypass data + input logic [1:0] dec_i0_rs2_bypass_en_d, // DEC bypass select 1 - X-stage, 0 - dec bypass data + input logic dec_csr_ren_d, // Clear I0 RS1 primary + + input el2_mul_pkt_t mul_p, // DEC {valid, operand signs, low, operand bypass} + input el2_div_pkt_t div_p, // DEC {valid, unsigned, rem} + input logic dec_div_cancel, // Cancel the divide operation + + input logic [31:1] pred_correct_npc_x, // DEC NPC for correctly predicted branch + + input logic dec_tlu_flush_lower_r, // Flush divide and secondary ALUs + input logic [31:1] dec_tlu_flush_path_r, // Redirect target + + + input logic dec_extint_stall, // External stall mux select + input logic [31:2] dec_tlu_meihap, // External stall mux data + + + output logic [31:0] exu_lsu_rs1_d, // LSU operand + output logic [31:0] exu_lsu_rs2_d, // LSU operand + + output logic exu_flush_final, // Pipe is being flushed this cycle + output logic [31:1] exu_flush_path_final, // Target for the oldest flush source + + output logic [31:0] exu_i0_result_x, // Primary ALU result to DEC + output logic [31:1] exu_i0_pc_x, // Primary PC result to DEC + output logic [31:0] exu_csr_rs1_x, // RS1 source for a CSR instruction + + output logic [31:1] exu_npc_r, // Divide NPC + output logic [1:0] exu_i0_br_hist_r, // to DEC I0 branch history + output logic exu_i0_br_error_r, // to DEC I0 branch error + output logic exu_i0_br_start_error_r, // to DEC I0 branch start error + output logic [pt.BTB_ADDR_HI:pt.BTB_ADDR_LO] exu_i0_br_index_r, // to DEC I0 branch index + output logic exu_i0_br_valid_r, // to DEC I0 branch valid + output logic exu_i0_br_mp_r, // to DEC I0 branch mispredict + output logic exu_i0_br_middle_r, // to DEC I0 branch middle + output logic [pt.BHT_GHR_SIZE-1:0] exu_i0_br_fghr_r, // to DEC I0 branch fghr + output logic exu_i0_br_way_r, // to DEC I0 branch way + + output el2_predict_pkt_t exu_mp_pkt, // Mispredict branch packet + output logic [pt.BHT_GHR_SIZE-1:0] exu_mp_eghr, // Mispredict global history + output logic [pt.BHT_GHR_SIZE-1:0] exu_mp_fghr, // Mispredict fghr + output logic [pt.BTB_ADDR_HI:pt.BTB_ADDR_LO] exu_mp_index, // Mispredict index + output logic [pt.BTB_BTAG_SIZE-1:0] exu_mp_btag, // Mispredict btag + + + output logic exu_pmu_i0_br_misp, // to PMU - I0 E4 branch mispredict + output logic exu_pmu_i0_br_ataken, // to PMU - I0 E4 taken + output logic exu_pmu_i0_pc4, // to PMU - I0 E4 PC + + + output logic [31:0] exu_div_result, // Divide result + output logic exu_div_wren // Divide write enable to GPR + ); + + + + + logic data_gate_en; + logic [31:0] i0_rs1_bypass_data_d; + logic [31:0] i0_rs2_bypass_data_d; + logic i0_rs1_bypass_en_d; + logic i0_rs2_bypass_en_d; + logic [31:0] i0_rs1_d, i0_rs2_d; + logic [31:0] muldiv_rs1_d, muldiv_rs2_d; + logic [31:1] pred_correct_npc_r; + logic i0_pred_correct_upper_r; + logic [31:0] csr_rs1_in_d; + logic [31:1] i0_flush_path_upper_r; + logic x_data_en, r_data_en; + logic x_ctl_en, r_ctl_en; + + logic [pt.BHT_GHR_SIZE-1:0] ghr_d_ns, ghr_d; + logic [pt.BHT_GHR_SIZE-1:0] ghr_x_ns, ghr_x; + logic i0_taken_d; + logic i0_taken_x; + logic i0_valid_d; + logic i0_valid_x; + logic [pt.BHT_GHR_SIZE-1:0] after_flush_eghr; + + el2_predict_pkt_t final_predict_mp; + el2_predict_pkt_t i0_predict_newp_d; + + logic flush_lower_ff; + logic flush_in_d; + logic [31:0] alu_result_x; + + logic mul_valid_x; + logic [31:0] mul_result_x; + + el2_predict_pkt_t i0_pp_r; + + logic i0_flush_upper_d; + logic [31:1] i0_flush_path_d; + el2_predict_pkt_t i0_predict_p_d; + logic i0_pred_correct_upper_d; + + logic i0_flush_upper_x; + logic [31:1] i0_flush_path_x; + el2_predict_pkt_t i0_predict_p_x; + logic i0_pred_correct_upper_x; + + localparam PREDPIPESIZE = pt.BTB_ADDR_HI-pt.BTB_ADDR_LO+1+pt.BHT_GHR_SIZE+pt.BTB_BTAG_SIZE; + logic [PREDPIPESIZE-1:0] predpipe_d, predpipe_x, predpipe_r, final_predpipe_mp; + + + + + rvdffe #(31) i_flush_path_x_ff (.*, .en ( x_data_en ), .din( i0_flush_path_d[31:1] ), .dout( i0_flush_path_x[31:1] ) ); + rvdffe #(32) i_csr_rs1_x_ff (.*, .en ( x_data_en ), .din( csr_rs1_in_d[31:0] ), .dout( exu_csr_rs1_x[31:0] ) ); + rvdffe #($bits(el2_predict_pkt_t)) i_predictpacket_x_ff (.*, .en ( x_data_en ), .din( i0_predict_p_d ), .dout( i0_predict_p_x ) ); + rvdffe #(PREDPIPESIZE) i_predpipe_x_ff (.*, .en ( x_data_en ), .din( predpipe_d ), .dout( predpipe_x ) ); + rvdffe #(PREDPIPESIZE) i_predpipe_r_ff (.*, .en ( r_data_en ), .din( predpipe_x ), .dout( predpipe_r ) ); + + rvdffe #(4+pt.BHT_GHR_SIZE) i_x_ff (.*, .en ( x_ctl_en ), .din ({i0_valid_d,i0_taken_d,i0_flush_upper_d,i0_pred_correct_upper_d,ghr_x_ns[pt.BHT_GHR_SIZE-1:0]} ), + .dout({i0_valid_x,i0_taken_x,i0_flush_upper_x,i0_pred_correct_upper_x,ghr_x[pt.BHT_GHR_SIZE-1:0]} ) ); + + rvdffe #($bits(el2_predict_pkt_t)+7) i_r_ff0 (.*, .en ( r_ctl_en ), .din ({i0_predict_p_x ,pred_correct_npc_x[6:1],i0_pred_correct_upper_x}), + .dout({i0_pp_r ,pred_correct_npc_r[6:1],i0_pred_correct_upper_r}) ); + + rvdffe #(56) i_r_ff1 (.*, .en ( r_data_en ), .din ({i0_flush_path_x[31:1] ,pred_correct_npc_x[31:7]}), + .dout({i0_flush_path_upper_r[31:1],pred_correct_npc_r[31:7]}) ); + + if (pt.BHT_SIZE==32 || pt.BHT_SIZE==64) + begin + rvdffs #(pt.BHT_GHR_SIZE+2) i_data_gate_ff (.*, .en( data_gate_en ), .din ({ghr_d_ns[pt.BHT_GHR_SIZE-1:0],mul_p.valid,dec_tlu_flush_lower_r}), + .dout({ghr_d[pt.BHT_GHR_SIZE-1:0] ,mul_valid_x,flush_lower_ff} ) ); + end + else + begin + rvdffe #(pt.BHT_GHR_SIZE+2) i_data_gate_ff (.*, .en( data_gate_en ), .din ({ghr_d_ns[pt.BHT_GHR_SIZE-1:0],mul_p.valid,dec_tlu_flush_lower_r}), + .dout({ghr_d[pt.BHT_GHR_SIZE-1:0] ,mul_valid_x,flush_lower_ff} ) ); + end + + + + + + assign data_gate_en = ( ghr_d_ns[pt.BHT_GHR_SIZE-1:0] != ghr_d[pt.BHT_GHR_SIZE-1:0]) | + ( mul_p.valid != mul_valid_x ) | + ( dec_tlu_flush_lower_r != flush_lower_ff ); + + assign predpipe_d[PREDPIPESIZE-1:0] + = {i0_predict_fghr_d, i0_predict_index_d, i0_predict_btag_d}; + + + assign i0_rs1_bypass_en_d = dec_i0_rs1_bypass_en_d[0] | dec_i0_rs1_bypass_en_d[1]; + assign i0_rs2_bypass_en_d = dec_i0_rs2_bypass_en_d[0] | dec_i0_rs2_bypass_en_d[1]; + + assign i0_rs1_bypass_data_d[31:0]=({32{dec_i0_rs1_bypass_en_d[0]}} & dec_i0_rs1_bypass_data_d[31:0]) | + ({32{dec_i0_rs1_bypass_en_d[1]}} & exu_i0_result_x[31:0] ); + + assign i0_rs2_bypass_data_d[31:0]=({32{dec_i0_rs2_bypass_en_d[0]}} & dec_i0_rs2_bypass_data_d[31:0]) | + ({32{dec_i0_rs2_bypass_en_d[1]}} & exu_i0_result_x[31:0] ); + + + assign i0_rs1_d[31:0] = ({32{ i0_rs1_bypass_en_d }} & i0_rs1_bypass_data_d[31:0]) | + ({32{~i0_rs1_bypass_en_d & dec_i0_select_pc_d }} & {dec_i0_pc_d[31:1],1'b0} ) | // for jal's + ({32{~i0_rs1_bypass_en_d & dec_debug_wdata_rs1_d }} & dbg_cmd_wrdata[31:0] ) | + ({32{~i0_rs1_bypass_en_d & ~dec_debug_wdata_rs1_d & dec_i0_rs1_en_d}} & gpr_i0_rs1_d[31:0] ); + + assign i0_rs2_d[31:0] = ({32{~i0_rs2_bypass_en_d & dec_i0_rs2_en_d}} & gpr_i0_rs2_d[31:0] ) | + ({32{~i0_rs2_bypass_en_d }} & dec_i0_immed_d[31:0] ) | + ({32{ i0_rs2_bypass_en_d }} & i0_rs2_bypass_data_d[31:0]); + + + assign exu_lsu_rs1_d[31:0] = ({32{~i0_rs1_bypass_en_d & ~dec_extint_stall & dec_i0_rs1_en_d}} & gpr_i0_rs1_d[31:0] ) | + ({32{ i0_rs1_bypass_en_d & ~dec_extint_stall }} & i0_rs1_bypass_data_d[31:0]) | + ({32{ dec_extint_stall }} & {dec_tlu_meihap[31:2],2'b0}); + + assign exu_lsu_rs2_d[31:0] = ({32{~i0_rs2_bypass_en_d & ~dec_extint_stall & dec_i0_rs2_en_d}} & gpr_i0_rs2_d[31:0] ) | + ({32{ i0_rs2_bypass_en_d & ~dec_extint_stall }} & i0_rs2_bypass_data_d[31:0]); + + + assign muldiv_rs1_d[31:0] = ({32{~i0_rs1_bypass_en_d & dec_i0_rs1_en_d}} & gpr_i0_rs1_d[31:0] ) | + ({32{ i0_rs1_bypass_en_d }} & i0_rs1_bypass_data_d[31:0]); + + assign muldiv_rs2_d[31:0] = ({32{~i0_rs2_bypass_en_d & dec_i0_rs2_en_d}} & gpr_i0_rs2_d[31:0] ) | + ({32{~i0_rs2_bypass_en_d }} & dec_i0_immed_d[31:0] ) | + ({32{ i0_rs2_bypass_en_d }} & i0_rs2_bypass_data_d[31:0]); + + + assign csr_rs1_in_d[31:0] = ( dec_csr_ren_d ) ? i0_rs1_d[31:0] : exu_csr_rs1_x[31:0]; + + assign x_data_en = dec_data_en[1]; + assign r_data_en = dec_data_en[0]; + assign x_ctl_en = dec_ctl_en[1]; + assign r_ctl_en = dec_ctl_en[0]; + + + + + el2_exu_alu_ctl #(.pt(pt)) i_alu (.*, + .enable ( x_ctl_en ), // I + .pp_in ( i0_predict_newp_d ), // I + .valid_in ( dec_i0_alu_decode_d ), // I + .flush_upper_x ( i0_flush_upper_x ), // I + .flush_lower_r ( dec_tlu_flush_lower_r ), // I + .a_in ( i0_rs1_d[31:0] ), // I + .b_in ( i0_rs2_d[31:0] ), // I + .pc_in ( dec_i0_pc_d[31:1] ), // I + .brimm_in ( dec_i0_br_immed_d[12:1] ), // I + .ap ( i0_ap ), // I + .csr_ren_in ( dec_csr_ren_d ), // I + .result_ff ( alu_result_x[31:0] ), // O + .flush_upper_out ( i0_flush_upper_d ), // O + .flush_final_out ( exu_flush_final ), // O + .flush_path_out ( i0_flush_path_d[31:1] ), // O + .predict_p_out ( i0_predict_p_d ), // O + .pred_correct_out ( i0_pred_correct_upper_d ), // O + .pc_ff ( exu_i0_pc_x[31:1] )); // O + + + + el2_exu_mul_ctl #(.pt(pt)) i_mul (.*, + .mul_p ( mul_p ), // I + .rs1_in ( muldiv_rs1_d[31:0] ), // I + .rs2_in ( muldiv_rs2_d[31:0] ), // I + .result_x ( mul_result_x[31:0] )); // O + + + + el2_exu_div_ctl #(.pt(pt)) i_div (.*, + .cancel ( dec_div_cancel ), // I + .dp ( div_p ), // I + .dividend ( muldiv_rs1_d[31:0] ), // I + .divisor ( muldiv_rs2_d[31:0] ), // I + .finish_dly ( exu_div_wren ), // O + .out ( exu_div_result[31:0] )); // O + + + + assign exu_i0_result_x[31:0] = (mul_valid_x) ? mul_result_x[31:0] : alu_result_x[31:0]; + + + + + always_comb begin + i0_predict_newp_d = dec_i0_predict_p_d; + i0_predict_newp_d.boffset = dec_i0_pc_d[1]; // from the start of inst + end + + + assign exu_pmu_i0_br_misp = i0_pp_r.misp; + assign exu_pmu_i0_br_ataken = i0_pp_r.ataken; + assign exu_pmu_i0_pc4 = i0_pp_r.pc4; + + + assign i0_valid_d = i0_predict_p_d.valid & dec_i0_alu_decode_d & ~dec_tlu_flush_lower_r; + assign i0_taken_d = (i0_predict_p_d.ataken & dec_i0_alu_decode_d); + + + // maintain GHR at D + assign ghr_d_ns[pt.BHT_GHR_SIZE-1:0] + = ({pt.BHT_GHR_SIZE{~dec_tlu_flush_lower_r & i0_valid_d}} & {ghr_d[pt.BHT_GHR_SIZE-2:0], i0_taken_d}) | + ({pt.BHT_GHR_SIZE{~dec_tlu_flush_lower_r & ~i0_valid_d}} & ghr_d[pt.BHT_GHR_SIZE-1:0] ) | + ({pt.BHT_GHR_SIZE{ dec_tlu_flush_lower_r }} & ghr_x[pt.BHT_GHR_SIZE-1:0] ); + + // maintain GHR at X + assign ghr_x_ns[pt.BHT_GHR_SIZE-1:0] + = ({pt.BHT_GHR_SIZE{ i0_valid_x}} & {ghr_x[pt.BHT_GHR_SIZE-2:0], i0_taken_x}) | + ({pt.BHT_GHR_SIZE{~i0_valid_x}} & ghr_x[pt.BHT_GHR_SIZE-1:0] ) ; + + + assign exu_i0_br_valid_r = i0_pp_r.valid; + assign exu_i0_br_mp_r = i0_pp_r.misp; + assign exu_i0_br_way_r = i0_pp_r.way; + assign exu_i0_br_hist_r[1:0] = i0_pp_r.hist[1:0]; + assign exu_i0_br_error_r = i0_pp_r.br_error; + assign exu_i0_br_middle_r = i0_pp_r.pc4 ^ i0_pp_r.boffset; + assign exu_i0_br_start_error_r = i0_pp_r.br_start_error; + + assign {exu_i0_br_fghr_r[pt.BHT_GHR_SIZE-1:0], + exu_i0_br_index_r[pt.BTB_ADDR_HI:pt.BTB_ADDR_LO]}= predpipe_r[PREDPIPESIZE-1:pt.BTB_BTAG_SIZE]; + + + assign final_predict_mp = (i0_flush_upper_x) ? i0_predict_p_x : '0; + + assign final_predpipe_mp[PREDPIPESIZE-1:0] = (i0_flush_upper_x) ? predpipe_x : '0; + + assign after_flush_eghr[pt.BHT_GHR_SIZE-1:0] = (i0_flush_upper_x & ~dec_tlu_flush_lower_r) ? ghr_d[pt.BHT_GHR_SIZE-1:0] : ghr_x[pt.BHT_GHR_SIZE-1:0]; + + + assign exu_mp_pkt.way = final_predict_mp.way; + assign exu_mp_pkt.misp = final_predict_mp.misp; + assign exu_mp_pkt.pcall = final_predict_mp.pcall; + assign exu_mp_pkt.pja = final_predict_mp.pja; + assign exu_mp_pkt.pret = final_predict_mp.pret; + assign exu_mp_pkt.ataken = final_predict_mp.ataken; + assign exu_mp_pkt.boffset = final_predict_mp.boffset; + assign exu_mp_pkt.pc4 = final_predict_mp.pc4; + assign exu_mp_pkt.hist[1:0] = final_predict_mp.hist[1:0]; + assign exu_mp_pkt.toffset[11:0] = final_predict_mp.toffset[11:0]; + + assign exu_mp_fghr[pt.BHT_GHR_SIZE-1:0] = after_flush_eghr[pt.BHT_GHR_SIZE-1:0]; + + assign {exu_mp_index[pt.BTB_ADDR_HI:pt.BTB_ADDR_LO], + exu_mp_btag[pt.BTB_BTAG_SIZE-1:0]} = final_predpipe_mp[PREDPIPESIZE-pt.BHT_GHR_SIZE-1:0]; + + assign exu_mp_eghr[pt.BHT_GHR_SIZE-1:0] = final_predpipe_mp[PREDPIPESIZE-1:pt.BTB_ADDR_HI-pt.BTB_ADDR_LO+pt.BTB_BTAG_SIZE+1]; // mp ghr for bht write + + assign exu_flush_path_final[31:1] = (dec_tlu_flush_lower_r) ? dec_tlu_flush_path_r[31:1] : i0_flush_path_d[31:1]; + + assign exu_npc_r[31:1] = (i0_pred_correct_upper_r) ? pred_correct_npc_r[31:1] : + i0_flush_path_upper_r[31:1]; + + +endmodule // el2_exu diff --git a/design/exu/el2_exu_alu_ctl.sv b/design/exu/el2_exu_alu_ctl.sv new file mode 100644 index 0000000..ed195dc --- /dev/null +++ b/design/exu/el2_exu_alu_ctl.sv @@ -0,0 +1,255 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright 2020 Western Digital Corporation or it's affiliates. +// +// 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. + + +module el2_exu_alu_ctl +import el2_pkg::*; +#( +`include "el2_param.vh" +) + ( + input logic clk, // Top level clock + input logic rst_l, // Reset + input logic scan_mode, // Scan control + + input logic flush_upper_x, // Branch flush from previous cycle + input logic flush_lower_r, // Master flush of entire pipeline + input logic enable, // Clock enable + input logic valid_in, // Valid + input el2_alu_pkt_t ap, // predecodes + input logic csr_ren_in, // extra decode + input logic signed [31:0] a_in, // A operand + input logic [31:0] b_in, // B operand + input logic [31:1] pc_in, // for pc=pc+2,4 calculations + input el2_predict_pkt_t pp_in, // Predicted branch structure + input logic [12:1] brimm_in, // Branch offset + + + output logic [31:0] result_ff, // final result + output logic flush_upper_out, // Branch flush + output logic flush_final_out, // Branch flush or flush entire pipeline + output logic [31:1] flush_path_out, // Branch flush PC + output logic [31:1] pc_ff, // flopped PC + output logic pred_correct_out, // NPC control + output el2_predict_pkt_t predict_p_out // Predicted branch structure + ); + + + logic [31:0] aout; + logic cout,ov,neg; + logic [31:0] lout; + logic [5:0] shift_amount; + logic [31:0] shift_mask; + logic [62:0] shift_extend; + logic [62:0] shift_long; + logic [31:0] sout; + logic sel_shift; + logic sel_adder; + logic slt_one; + logic actual_taken; + logic [31:1] pcout; + logic cond_mispredict; + logic target_mispredict; + logic eq, ne, lt, ge; + logic any_jal; + logic [1:0] newhist; + logic sel_pc; + logic [31:0] csr_write_data; + logic [31:0] result; + + + + + + + rvdffe #(31) i_pc_ff (.*, .en(enable), .din(pc_in[31:1]), .dout(pc_ff[31:1])); // any PC is run through here - doesn't have to be alu + rvdffe #(32) i_result_ff (.*, .en(enable), .din(result[31:0]), .dout(result_ff[31:0])); + + + + // immediates are just muxed into rs2 + + // add => add=1; + // sub => add=1; sub=1; + + // and => lctl=3 + // or => lctl=2 + // xor => lctl=1 + + // sll => sctl=3 + // srl => sctl=2 + // sra => sctl=1 + + // slt => slt + + // lui => lctl=2; or x0, imm20 previously << 12 + // auipc => add; add pc, imm20 previously << 12 + + // beq => bctl=4; add; add x0, pc, sext(offset[12:1]) + // bne => bctl=3; add; add x0, pc, sext(offset[12:1]) + // blt => bctl=2; add; add x0, pc, sext(offset[12:1]) + // bge => bctl=1; add; add x0, pc, sext(offset[12:1]) + + // jal => rs1=pc {pc[31:1],1'b0}, rs2=sext(offset20:1]); rd=pc+[2,4] + // jalr => rs1=rs1, rs2=sext(offset20:1]); rd=pc+[2,4] + + + logic [31:0] bm; + + assign bm[31:0] = ( ap.sub ) ? ~b_in[31:0] : b_in[31:0]; + + assign {cout, aout[31:0]} = {1'b0, a_in[31:0]} + {1'b0, bm[31:0]} + {32'b0, ap.sub}; + + assign ov = (~a_in[31] & ~bm[31] & aout[31]) | + ( a_in[31] & bm[31] & ~aout[31] ); + + assign lt = (~ap.unsign & (neg ^ ov)) | + ( ap.unsign & ~cout); + + + assign eq = (a_in[31:0] == b_in[31:0]); + assign ne = ~eq; + assign neg = aout[31]; + assign ge = ~lt; + + + + assign lout[31:0] = ( {32{csr_ren_in}} & b_in[31:0] ) | + ( {32{ap.land }} & a_in[31:0] & b_in[31:0] ) | + ( {32{ap.lor }} & (a_in[31:0] | b_in[31:0]) ) | + ( {32{ap.lxor }} & (a_in[31:0] ^ b_in[31:0]) ); + + + + + + assign shift_amount[5:0] = ( { 6{ap.sll}} & (6'd32 - {1'b0,b_in[4:0]}) ) | // [5] unused + ( { 6{ap.srl}} & {1'b0,b_in[4:0]} ) | + ( { 6{ap.sra}} & {1'b0,b_in[4:0]} ); + + + assign shift_mask[31:0] = ( 32'hffffffff << ({5{ap.sll}} & b_in[4:0]) ); + + + assign shift_extend[31:0] = a_in[31:0]; + + assign shift_extend[62:32] = ( {31{ap.sra}} & {31{a_in[31]}} ) | + ( {31{ap.sll}} & a_in[30:0] ); + + + assign shift_long[62:0] = ( shift_extend[62:0] >> shift_amount[4:0] ); // 62-32 unused + + assign sout[31:0] = ( shift_long[31:0] & shift_mask[31:0] ); + + + + + + assign sel_shift = ap.sll | ap.srl | ap.sra; + assign sel_adder = (ap.add | ap.sub) & ~ap.slt; + assign sel_pc = ap.jal | pp_in.pcall | pp_in.pja | pp_in.pret; + assign csr_write_data[31:0]= (ap.csr_imm) ? b_in[31:0] : a_in[31:0]; + + assign slt_one = ap.slt & lt; + + + + assign result[31:0] = lout[31:0] | + ({32{sel_shift}} & sout[31:0] ) | + ({32{sel_adder}} & aout[31:0] ) | + ({32{sel_pc}} & {pcout[31:1],1'b0} ) | + ({32{ap.csr_write}} & csr_write_data[31:0] ) | + {31'b0, slt_one} ; + + + + // *** branch handling *** + + assign any_jal = ap.jal | + pp_in.pcall | + pp_in.pja | + pp_in.pret; + + assign actual_taken = (ap.beq & eq) | + (ap.bne & ne) | + (ap.blt & lt) | + (ap.bge & ge) | + any_jal; + + // for a conditional br pcout[] will be the opposite of the branch prediction + // for jal or pcall, it will be the link address pc+2 or pc+4 + + rvbradder ibradder ( + .pc ( pc_in[31:1] ), + .offset ( brimm_in[12:1] ), + .dout ( pcout[31:1] )); + + + // pred_correct is for the npc logic + // pred_correct indicates not to use the flush_path + // for any_jal pred_correct==0 + + assign pred_correct_out = (valid_in & ap.predict_nt & ~actual_taken & ~any_jal) | + (valid_in & ap.predict_t & actual_taken & ~any_jal); + + + // for any_jal adder output is the flush path + assign flush_path_out[31:1]= (any_jal) ? aout[31:1] : pcout[31:1]; + + + // pcall and pret are included here + assign cond_mispredict = (ap.predict_t & ~actual_taken) | + (ap.predict_nt & actual_taken); + + + // target mispredicts on ret's + + assign target_mispredict = pp_in.pret & (pp_in.prett[31:1] != aout[31:1]); + + assign flush_upper_out = (ap.jal | cond_mispredict | target_mispredict) & valid_in & ~flush_upper_x & ~flush_lower_r; + assign flush_final_out = ( (ap.jal | cond_mispredict | target_mispredict) & valid_in & ~flush_upper_x ) | flush_lower_r; + + + // .i 3 + // .o 2 + // .ilb hist[1] hist[0] taken + // .ob newhist[1] newhist[0] + // .type fd + // + // 00 0 01 + // 01 0 01 + // 10 0 00 + // 11 0 10 + // 00 1 10 + // 01 1 00 + // 10 1 11 + // 11 1 11 + + assign newhist[1] = ( pp_in.hist[1] & pp_in.hist[0]) | (~pp_in.hist[0] & actual_taken); + assign newhist[0] = (~pp_in.hist[1] & ~actual_taken) | ( pp_in.hist[1] & actual_taken); + + always_comb begin + predict_p_out = pp_in; + + predict_p_out.misp = ~flush_upper_x & ~flush_lower_r & (cond_mispredict | target_mispredict); + predict_p_out.ataken = actual_taken; + predict_p_out.hist[1] = newhist[1]; + predict_p_out.hist[0] = newhist[0]; + + end + + + +endmodule // el2_exu_alu_ctl diff --git a/design/exu/el2_exu_div_ctl.sv b/design/exu/el2_exu_div_ctl.sv new file mode 100644 index 0000000..1beef7d --- /dev/null +++ b/design/exu/el2_exu_div_ctl.sv @@ -0,0 +1,313 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright 2020 Western Digital Corporation or it's affiliates. +// +// 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. + + +module el2_exu_div_ctl +import el2_pkg::*; +#( +`include "el2_param.vh" +) + ( + input logic clk, // Top level clock + input logic rst_l, // Reset + input logic scan_mode, // Scan mode + + input el2_div_pkt_t dp, // valid, sign, rem + input logic [31:0] dividend, // Numerator + input logic [31:0] divisor, // Denominator + + input logic cancel, // Cancel divide + + + output logic finish_dly, // Finish to match data + output logic [31:0] out // Result + ); + + + logic div_clken; + logic exu_div_clk; + logic run_in, run_state; + logic [5:0] count_in, count; + logic [32:0] m_ff; + logic qff_enable; + logic aff_enable; + logic [32:0] q_in, q_ff; + logic [32:0] a_in, a_ff; + logic [32:0] m_eff; + logic [32:0] a_shift; + logic dividend_neg_ff, divisor_neg_ff; + logic [31:0] dividend_comp; + logic [31:0] dividend_eff; + logic [31:0] q_ff_comp; + logic [31:0] q_ff_eff; + logic [31:0] a_ff_comp; + logic [31:0] a_ff_eff; + logic sign_ff, sign_eff; + logic rem_ff; + logic add; + logic [32:0] a_eff; + logic [55:0] a_eff_shift; + logic rem_correct; + logic valid_ff_x; + logic valid_x; + logic finish; + logic finish_ff; + + logic smallnum_case, smallnum_case_ff; + logic [3:0] smallnum, smallnum_ff; + logic m_already_comp; + + + rvoclkhdr exu_div_cgc (.*, .en(div_clken), .l1clk(exu_div_clk)); + + rvdff #(1) e1val_ff (.*, .clk(exu_div_clk), .din(dp.valid & ~cancel), .dout(valid_ff_x)); + rvdff #(1) i_finish_ff (.*, .clk(exu_div_clk), .din(finish & ~cancel), .dout(finish_ff)); + + rvdff #(1) runff (.*, .clk(exu_div_clk), .din(run_in), .dout(run_state)); + rvdff #(6) countff (.*, .clk(exu_div_clk), .din(count_in[5:0]), .dout(count[5:0])); + rvdffs #(4) miscf (.*, .clk(exu_div_clk), .din({dividend[31],divisor[31],sign_eff,dp.rem}), .dout({dividend_neg_ff,divisor_neg_ff,sign_ff,rem_ff}), .en(dp.valid)); + rvdff #(5) smallnumff (.*, .clk(exu_div_clk), .din({smallnum_case,smallnum[3:0]}), .dout({smallnum_case_ff,smallnum_ff[3:0]})); + rvdffe #(33) mff (.*, .en(dp.valid), .din({ ~dp.unsign & divisor[31], divisor[31:0]}), .dout(m_ff[32:0])); + rvdffe #(33) qff (.*, .en(qff_enable), .din(q_in[32:0]), .dout(q_ff[32:0])); + rvdffe #(33) aff (.*, .en(aff_enable), .din(a_in[32:0]), .dout(a_ff[32:0])); + + rvtwoscomp #(32) i_dividend_comp (.din(q_ff[31:0]), .dout(dividend_comp[31:0])); + rvtwoscomp #(32) i_q_ff_comp (.din(q_ff[31:0]), .dout(q_ff_comp[31:0])); + rvtwoscomp #(32) i_a_ff_comp (.din(a_ff[31:0]), .dout(a_ff_comp[31:0])); + + + assign valid_x = valid_ff_x & ~cancel; + + + // START - short circuit logic for small numbers {{ + + // small number divides - any 4b / 4b is done in 1 cycle (divisor != 0) + // to generate espresso equations: + // 1) smalldiv > smalldiv.e + // 2) espresso -Dso -oeqntott smalldiv.e | addassign > smalldiv + + // smallnum case does not cover divide by 0 + assign smallnum_case = ((q_ff[31:4] == 28'b0) & (m_ff[31:4] == 28'b0) & (m_ff[31:0] != 32'b0) & ~rem_ff & valid_x) | + ((q_ff[31:0] == 32'b0) & (m_ff[31:0] != 32'b0) & ~rem_ff & valid_x); + + + assign smallnum[3] = ( q_ff[3] & ~m_ff[3] & ~m_ff[2] & ~m_ff[1] ); + + + assign smallnum[2] = ( q_ff[3] & ~m_ff[3] & ~m_ff[2] & ~m_ff[0]) | + ( q_ff[2] & ~m_ff[3] & ~m_ff[2] & ~m_ff[1] ) | + ( q_ff[3] & q_ff[2] & ~m_ff[3] & ~m_ff[2] ); + + + assign smallnum[1] = ( q_ff[2] & ~m_ff[3] & ~m_ff[2] & ~m_ff[0]) | + ( q_ff[1] & ~m_ff[3] & ~m_ff[2] & ~m_ff[1] ) | + ( q_ff[3] & ~m_ff[3] & ~m_ff[1] & ~m_ff[0]) | + ( q_ff[3] & ~q_ff[2] & ~m_ff[3] & ~m_ff[2] & m_ff[1] & m_ff[0]) | + (~q_ff[3] & q_ff[2] & q_ff[1] & ~m_ff[3] & ~m_ff[2] ) | + ( q_ff[3] & q_ff[2] & ~m_ff[3] & ~m_ff[0]) | + ( q_ff[3] & q_ff[2] & ~m_ff[3] & m_ff[2] & ~m_ff[1] ) | + ( q_ff[3] & q_ff[1] & ~m_ff[3] & ~m_ff[1] ) | + ( q_ff[3] & q_ff[2] & q_ff[1] & ~m_ff[3] & m_ff[2] ); + + + assign smallnum[0] = ( q_ff[2] & q_ff[1] & q_ff[0] & ~m_ff[3] & ~m_ff[1] ) | + ( q_ff[3] & ~q_ff[2] & q_ff[0] & ~m_ff[3] & m_ff[1] & m_ff[0]) | + ( q_ff[2] & ~m_ff[3] & ~m_ff[1] & ~m_ff[0]) | + ( q_ff[1] & ~m_ff[3] & ~m_ff[2] & ~m_ff[0]) | + ( q_ff[0] & ~m_ff[3] & ~m_ff[2] & ~m_ff[1] ) | + (~q_ff[3] & q_ff[2] & ~q_ff[1] & ~m_ff[3] & ~m_ff[2] & m_ff[1] & m_ff[0]) | + (~q_ff[3] & q_ff[2] & q_ff[1] & ~m_ff[3] & ~m_ff[0]) | + ( q_ff[3] & ~m_ff[2] & ~m_ff[1] & ~m_ff[0]) | + ( q_ff[3] & ~q_ff[2] & ~m_ff[3] & m_ff[2] & m_ff[1] ) | + (~q_ff[3] & q_ff[2] & q_ff[1] & ~m_ff[3] & m_ff[2] & ~m_ff[1] ) | + (~q_ff[3] & q_ff[2] & q_ff[0] & ~m_ff[3] & ~m_ff[1] ) | + ( q_ff[3] & ~q_ff[2] & ~q_ff[1] & ~m_ff[3] & m_ff[2] & m_ff[0]) | + ( ~q_ff[2] & q_ff[1] & q_ff[0] & ~m_ff[3] & ~m_ff[2] ) | + ( q_ff[3] & q_ff[2] & ~m_ff[1] & ~m_ff[0]) | + ( q_ff[3] & q_ff[1] & ~m_ff[2] & ~m_ff[0]) | + (~q_ff[3] & q_ff[2] & q_ff[1] & q_ff[0] & ~m_ff[3] & m_ff[2] ) | + ( q_ff[3] & q_ff[2] & m_ff[3] & ~m_ff[2] ) | + ( q_ff[3] & q_ff[1] & m_ff[3] & ~m_ff[2] & ~m_ff[1] ) | + ( q_ff[3] & q_ff[0] & ~m_ff[2] & ~m_ff[1] ) | + ( q_ff[3] & ~q_ff[1] & ~m_ff[3] & m_ff[2] & m_ff[1] & m_ff[0]) | + ( q_ff[3] & q_ff[2] & q_ff[1] & m_ff[3] & ~m_ff[0]) | + ( q_ff[3] & q_ff[2] & q_ff[1] & m_ff[3] & ~m_ff[1] ) | + ( q_ff[3] & q_ff[2] & q_ff[0] & m_ff[3] & ~m_ff[1] ) | + ( q_ff[3] & ~q_ff[2] & q_ff[1] & ~m_ff[3] & m_ff[1] ) | + ( q_ff[3] & q_ff[1] & q_ff[0] & ~m_ff[2] ) | + ( q_ff[3] & q_ff[2] & q_ff[1] & q_ff[0] & m_ff[3] ); + + + // END - short circuit logic for small numbers }} + + +// *** Start Short Q *** {{ + + logic [2:0] a_cls; + logic [2:0] b_cls; + logic [3:0] shortq_shift; + logic [4:0] shortq_shift_ff; + logic shortq_enable; + logic shortq_enable_ff; + logic [32:0] short_dividend; + + assign short_dividend[31:0] = q_ff[31:0]; + assign short_dividend[32] = sign_ff & q_ff[31]; + + +// A B +// 210 210 SH +// --- --- -- +// 1xx 000 0 +// 1xx 001 8 +// 1xx 01x 16 +// 1xx 1xx 24 +// 01x 000 8 +// 01x 001 16 +// 01x 01x 24 +// 01x 1xx 32 +// 001 000 16 +// 001 001 24 +// 001 01x 32 +// 001 1xx 32 +// 000 000 24 +// 000 001 32 +// 000 01x 32 +// 000 1xx 32 + + logic [3:0] shortq_raw; + logic [3:0] shortq_shift_xx; + + assign a_cls[2] = (~short_dividend[32] & (short_dividend[31:24] != {8{1'b0}})) | ( short_dividend[32] & (short_dividend[31:23] != {9{1'b1}})); + assign a_cls[1] = (~short_dividend[32] & (short_dividend[23:16] != {8{1'b0}})) | ( short_dividend[32] & (short_dividend[22:15] != {8{1'b1}})); + assign a_cls[0] = (~short_dividend[32] & (short_dividend[15:08] != {8{1'b0}})) | ( short_dividend[32] & (short_dividend[14:07] != {8{1'b1}})); + + assign b_cls[2] = (~m_ff[32] & ( m_ff[31:24] != {8{1'b0}})) | ( m_ff[32] & ( m_ff[31:24] != {8{1'b1}})); + assign b_cls[1] = (~m_ff[32] & ( m_ff[23:16] != {8{1'b0}})) | ( m_ff[32] & ( m_ff[23:16] != {8{1'b1}})); + assign b_cls[0] = (~m_ff[32] & ( m_ff[15:08] != {8{1'b0}})) | ( m_ff[32] & ( m_ff[15:08] != {8{1'b1}})); + + assign shortq_raw[3] = ( (a_cls[2:1] == 2'b01 ) & (b_cls[2] == 1'b1 ) ) | // Shift by 32 + ( (a_cls[2:0] == 3'b001) & (b_cls[2] == 1'b1 ) ) | + ( (a_cls[2:0] == 3'b000) & (b_cls[2] == 1'b1 ) ) | + ( (a_cls[2:0] == 3'b001) & (b_cls[2:1] == 2'b01 ) ) | + ( (a_cls[2:0] == 3'b000) & (b_cls[2:1] == 2'b01 ) ) | + ( (a_cls[2:0] == 3'b000) & (b_cls[2:0] == 3'b001) ); + + assign shortq_raw[2] = ( (a_cls[2] == 1'b1 ) & (b_cls[2] == 1'b1 ) ) | // Shift by 24 + ( (a_cls[2:1] == 2'b01 ) & (b_cls[2:1] == 2'b01 ) ) | + ( (a_cls[2:0] == 3'b001) & (b_cls[2:0] == 3'b001) ) | + ( (a_cls[2:0] == 3'b000) & (b_cls[2:0] == 3'b000) ); + + assign shortq_raw[1] = ( (a_cls[2] == 1'b1 ) & (b_cls[2:1] == 2'b01 ) ) | // Shift by 16 + ( (a_cls[2:1] == 2'b01 ) & (b_cls[2:0] == 3'b001) ) | + ( (a_cls[2:0] == 3'b001) & (b_cls[2:0] == 3'b000) ); + + assign shortq_raw[0] = ( (a_cls[2] == 1'b1 ) & (b_cls[2:0] == 3'b001) ) | // Shift by 8 + ( (a_cls[2:1] == 2'b01 ) & (b_cls[2:0] == 3'b000) ); + + + assign shortq_enable = valid_ff_x & (m_ff[31:0] != 32'b0) & (shortq_raw[3:0] != 4'b0); + + assign shortq_shift[3:0] = ({4{shortq_enable}} & shortq_raw[3:0]); + + rvdff #(5) i_shortq_ff (.*, .clk(exu_div_clk), .din({shortq_enable,shortq_shift[3:0]}), .dout({shortq_enable_ff,shortq_shift_xx[3:0]})); + + assign shortq_shift_ff[4:0] = ({5{shortq_shift_xx[3]}} & 5'b1_1111) | // 31 + ({5{shortq_shift_xx[2]}} & 5'b1_1000) | // 24 + ({5{shortq_shift_xx[1]}} & 5'b1_0000) | // 16 + ({5{shortq_shift_xx[0]}} & 5'b0_1000); // 8 + +`ifdef ASSERT_ON + + logic div_assert_fail; + + assign div_assert_fail = (shortq_shift_xx[3] & shortq_shift_xx[2]) | + (shortq_shift_xx[3] & shortq_shift_xx[1]) | + (shortq_shift_xx[3] & shortq_shift_xx[0]) | + (shortq_shift_xx[2] & shortq_shift_xx[1]) | + (shortq_shift_xx[2] & shortq_shift_xx[0]) | + (shortq_shift_xx[1] & shortq_shift_xx[0]); + + assert_exu_div_shortq_shift_error: assert #0 (~div_assert_fail) else $display("ERROR: SHORTQ_SHIFT_XX with multiple shifts ON!"); + +`endif + + +// *** End Short *** }} + + + + + + assign div_clken = dp.valid | run_state | finish | finish_ff; + + assign run_in = (dp.valid | run_state) & ~finish & ~cancel; + + assign count_in[5:0] = {6{run_state & ~finish & ~cancel & ~shortq_enable}} & (count[5:0] + {1'b0,shortq_shift_ff[4:0]} + 6'd1); + + + assign finish = (smallnum_case | ((~rem_ff) ? (count[5:0] == 6'd32) : (count[5:0] == 6'd33))); + + assign finish_dly = finish_ff & ~cancel; + + assign sign_eff = ~dp.unsign & (divisor[31:0] != 32'b0); + + + assign q_in[32:0] = ({33{~run_state }} & {1'b0,dividend[31:0]}) | + ({33{ run_state & (valid_ff_x | shortq_enable_ff)}} & ({dividend_eff[31:0], ~a_in[32]} << shortq_shift_ff[4:0])) | + ({33{ run_state & ~(valid_ff_x | shortq_enable_ff)}} & {q_ff[31:0], ~a_in[32]}); + + assign qff_enable = dp.valid | (run_state & ~shortq_enable); + + + + + assign dividend_eff[31:0] = (sign_ff & dividend_neg_ff) ? dividend_comp[31:0] : q_ff[31:0]; + + + assign m_eff[32:0] = ( add ) ? m_ff[32:0] : ~m_ff[32:0]; + + assign a_eff_shift[55:0] = {24'b0, dividend_eff[31:0]} << shortq_shift_ff[4:0]; + + assign a_eff[32:0] = ({33{ rem_correct }} & a_ff[32:0] ) | + ({33{~rem_correct & ~shortq_enable_ff}} & {a_ff[31:0], q_ff[32]} ) | + ({33{~rem_correct & shortq_enable_ff}} & {9'b0,a_eff_shift[55:32]}); + + assign a_shift[32:0] = {33{run_state}} & a_eff[32:0]; + + assign a_in[32:0] = {33{run_state}} & (a_shift[32:0] + m_eff[32:0] + {32'b0,~add}); + + assign aff_enable = dp.valid | (run_state & ~shortq_enable & (count[5:0]!=6'd33)) | rem_correct; + + + assign m_already_comp = (divisor_neg_ff & sign_ff); + + // if m already complemented, then invert operation add->sub, sub->add + assign add = (a_ff[32] | rem_correct) ^ m_already_comp; + + assign rem_correct = (count[5:0] == 6'd33) & rem_ff & a_ff[32]; + + + + assign q_ff_eff[31:0] = (sign_ff & (dividend_neg_ff ^ divisor_neg_ff)) ? q_ff_comp[31:0] : q_ff[31:0]; + + assign a_ff_eff[31:0] = (sign_ff & dividend_neg_ff) ? a_ff_comp[31:0] : a_ff[31:0]; + + assign out[31:0] = ({32{ smallnum_case_ff }} & {28'b0, smallnum_ff[3:0]}) | + ({32{ rem_ff}} & a_ff_eff[31:0] ) | + ({32{~smallnum_case_ff & ~rem_ff}} & q_ff_eff[31:0] ); + + +endmodule // el2_exu_div_ctl diff --git a/design/exu/el2_exu_mul_ctl.sv b/design/exu/el2_exu_mul_ctl.sv new file mode 100644 index 0000000..b9b68ba --- /dev/null +++ b/design/exu/el2_exu_mul_ctl.sv @@ -0,0 +1,75 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright 2020 Western Digital Corporation or it's affiliates. +// +// 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. + + +module el2_exu_mul_ctl +import el2_pkg::*; +#( +`include "el2_param.vh" + ) + ( + input logic clk, // Top level clock + input logic rst_l, // Reset + input logic scan_mode, // Scan mode + + input el2_mul_pkt_t mul_p, // {Valid, RS1 signed operand, RS2 signed operand, Select low 32-bits of result} + + input logic [31:0] rs1_in, // A operand + input logic [31:0] rs2_in, // B operand + + + output logic [31:0] result_x // Result + ); + + + logic mul_x_enable; + logic signed [32:0] rs1_ext_in; + logic signed [32:0] rs2_ext_in; + logic [65:0] prod_x; + logic low_x; + + + + + assign mul_x_enable = mul_p.valid; + + assign rs1_ext_in[32] = mul_p.rs1_sign & rs1_in[31]; + assign rs2_ext_in[32] = mul_p.rs2_sign & rs2_in[31]; + + assign rs1_ext_in[31:0] = rs1_in[31:0]; + assign rs2_ext_in[31:0] = rs2_in[31:0]; + + + + // --------------------------- Multiply ---------------------------------- + + + logic signed [32:0] rs1_x; + logic signed [32:0] rs2_x; + + rvdffe #(34) i_a_x_ff (.*, .din({mul_p.low,rs1_ext_in[32:0]}), .dout({low_x,rs1_x[32:0]}), .en(mul_x_enable)); + rvdffe #(33) i_b_x_ff (.*, .din( rs2_ext_in[32:0] ), .dout( rs2_x[32:0] ), .en(mul_x_enable)); + + + assign prod_x[65:0] = rs1_x * rs2_x; + + + assign result_x[31:0] = ( {32{~low_x}} & prod_x[63:32] ) | + ( {32{ low_x}} & prod_x[31:0] ); + + + + +endmodule // el2_exu_mul_ctl diff --git a/design/ifu/el2_ifu.sv b/design/ifu/el2_ifu.sv new file mode 100644 index 0000000..35588b1 --- /dev/null +++ b/design/ifu/el2_ifu.sv @@ -0,0 +1,354 @@ +//******************************************************************************** +// SPDX-License-Identifier: Apache-2.0 +// Copyright 2020 Western Digital Corporation or it's affiliates. +// +// 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. +//******************************************************************************** +//******************************************************************************** +// Function: Top level file for Icache, Fetch, Branch prediction & Aligner +// BFF -> F1 -> F2 -> A +//******************************************************************************** + +module el2_ifu +import el2_pkg::*; +#( +`include "el2_param.vh" + ) + ( + input logic free_clk, + input logic active_clk, + input logic clk, + input logic rst_l, + + input logic dec_i0_decode_d, + + input logic exu_flush_final, // flush, includes upper and lower + input logic dec_tlu_i0_commit_cmt , // committed i0 + input logic dec_tlu_flush_err_wb , // flush due to parity error. + input logic dec_tlu_flush_noredir_wb, // don't fetch, validated with exu_flush_final + input logic [31:1] exu_flush_path_final, // flush fetch address + + input logic [31:0] dec_tlu_mrac_ff ,// Side_effect , cacheable for each region + input logic dec_tlu_fence_i_wb, // fence.i, invalidate icache, validated with exu_flush_final + input logic dec_tlu_flush_leak_one_wb, // ignore bp for leak one fetches + + input logic dec_tlu_bpred_disable, // disable all branch prediction + input logic dec_tlu_core_ecc_disable, // disable ecc checking and flagging + input logic dec_tlu_force_halt, // force halt + + //-------------------------- IFU AXI signals-------------------------- + // AXI Write Channels + output logic ifu_axi_awvalid, + output logic [pt.IFU_BUS_TAG-1:0] ifu_axi_awid, + output logic [31:0] ifu_axi_awaddr, + output logic [3:0] ifu_axi_awregion, + output logic [7:0] ifu_axi_awlen, + output logic [2:0] ifu_axi_awsize, + output logic [1:0] ifu_axi_awburst, + output logic ifu_axi_awlock, + output logic [3:0] ifu_axi_awcache, + output logic [2:0] ifu_axi_awprot, + output logic [3:0] ifu_axi_awqos, + + output logic ifu_axi_wvalid, + output logic [63:0] ifu_axi_wdata, + output logic [7:0] ifu_axi_wstrb, + output logic ifu_axi_wlast, + + output logic ifu_axi_bready, + + // AXI Read Channels + output logic ifu_axi_arvalid, + input logic ifu_axi_arready, + output logic [pt.IFU_BUS_TAG-1:0] ifu_axi_arid, + output logic [31:0] ifu_axi_araddr, + output logic [3:0] ifu_axi_arregion, + output logic [7:0] ifu_axi_arlen, + output logic [2:0] ifu_axi_arsize, + output logic [1:0] ifu_axi_arburst, + output logic ifu_axi_arlock, + output logic [3:0] ifu_axi_arcache, + output logic [2:0] ifu_axi_arprot, + output logic [3:0] ifu_axi_arqos, + + input logic ifu_axi_rvalid, + output logic ifu_axi_rready, + input logic [pt.IFU_BUS_TAG-1:0] ifu_axi_rid, + input logic [63:0] ifu_axi_rdata, + input logic [1:0] ifu_axi_rresp, + + + input logic ifu_bus_clk_en, + + input logic dma_iccm_req, + input logic [31:0] dma_mem_addr, + input logic [2:0] dma_mem_sz, + input logic dma_mem_write, + input logic [63:0] dma_mem_wdata, + input logic [2:0] dma_mem_tag, // DMA Buffer entry number + + + input logic dma_iccm_stall_any, + output logic iccm_dma_ecc_error, + output logic iccm_dma_rvalid, + output logic [63:0] iccm_dma_rdata, + output logic [2:0] iccm_dma_rtag, // Tag of the DMA req + output logic iccm_ready, + + output logic ifu_pmu_instr_aligned, + output logic ifu_pmu_fetch_stall, + output logic ifu_ic_error_start, // has all of the I$ ecc/parity for data/tag + +// I$ & ITAG Ports + output logic [31:1] ic_rw_addr, // Read/Write addresss to the Icache. + output logic [pt.ICACHE_NUM_WAYS-1:0] ic_wr_en, // Icache write enable, when filling the Icache. + output logic ic_rd_en, // Icache read enable. + + output logic [pt.ICACHE_BANKS_WAY-1:0][70:0] ic_wr_data, // Data to fill to the Icache. With ECC + input logic [63:0] ic_rd_data , // Data read from Icache. 2x64bits + parity bits. F2 stage. With ECC + input logic [70:0] ic_debug_rd_data , // Data read from Icache. 2x64bits + parity bits. F2 stage. With ECC + input logic [25:0] ictag_debug_rd_data,// Debug icache tag. + output logic [70:0] ic_debug_wr_data, // Debug wr cache. + + output logic [70:0] ifu_ic_debug_rd_data, + + input logic [pt.ICACHE_BANKS_WAY-1:0] ic_eccerr, // + input logic [pt.ICACHE_BANKS_WAY-1:0] ic_parerr, + output logic [63:0] ic_premux_data, // Premux data to be muxed with each way of the Icache. + output logic ic_sel_premux_data, // Select the premux data. + + output logic [pt.ICACHE_INDEX_HI:3] ic_debug_addr, // Read/Write addresss to the Icache. + output logic ic_debug_rd_en, // Icache debug rd + output logic ic_debug_wr_en, // Icache debug wr + output logic ic_debug_tag_array, // Debug tag array + output logic [pt.ICACHE_NUM_WAYS-1:0] ic_debug_way, // Debug way. Rd or Wr. + + + output logic [pt.ICACHE_NUM_WAYS-1:0] ic_tag_valid, // Valid bits when accessing the Icache. One valid bit per way. F2 stage + + input logic [pt.ICACHE_NUM_WAYS-1:0] ic_rd_hit, // Compare hits from Icache tags. Per way. F2 stage + input logic ic_tag_perr, // Icache Tag parity error + + + // ICCM ports + output logic [pt.ICCM_BITS-1:1] iccm_rw_addr, // ICCM read/write address. + output logic iccm_wren, // ICCM write enable (through the DMA) + output logic iccm_rden, // ICCM read enable. + output logic [77:0] iccm_wr_data, // ICCM write data. + output logic [2:0] iccm_wr_size, // ICCM write location within DW. + + input logic [63:0] iccm_rd_data, // Data read from ICCM. + input logic [77:0] iccm_rd_data_ecc, // Data + ECC read from ICCM. + + output logic ifu_iccm_rd_ecc_single_err, // This fetch has a single ICCM ecc error. + +// Perf counter sigs + output logic ifu_pmu_ic_miss, // ic miss + output logic ifu_pmu_ic_hit, // ic hit + output logic ifu_pmu_bus_error, // iside bus error + output logic ifu_pmu_bus_busy, // iside bus busy + output logic ifu_pmu_bus_trxn, // iside bus transactions + + + output logic ifu_i0_icaf, // Instructio 0 access fault. From Aligner to Decode + output logic [1:0] ifu_i0_icaf_type, // Instruction 0 access fault type + + output logic ifu_i0_valid, // Instructio 0 valid. From Aligner to Decode + output logic ifu_i0_icaf_f1, // Instruction 0 has access fault on second fetch group + output logic ifu_i0_dbecc, // Instruction 0 has double bit ecc error + output logic iccm_dma_sb_error, // Single Bit ECC error from a DMA access + output logic[31:0] ifu_i0_instr, // Instructio 0 . From Aligner to Decode + output logic[31:1] ifu_i0_pc, // Instructio 0 pc. From Aligner to Decode + output logic ifu_i0_pc4, // Instructio 0 is 4 byte. From Aligner to Decode + + output logic ifu_miss_state_idle, // There is no outstanding miss. Cache miss state is idle. + + + output el2_br_pkt_t i0_brp, // Instructio 0 branch packet. From Aligner to Decode + output logic [pt.BTB_ADDR_HI:pt.BTB_ADDR_LO] ifu_i0_bp_index, // BP index + output logic [pt.BHT_GHR_SIZE-1:0] ifu_i0_bp_fghr, // BP FGHR + output logic [pt.BTB_BTAG_SIZE-1:0] ifu_i0_bp_btag, // BP tag + + input el2_predict_pkt_t exu_mp_pkt, // mispredict packet + input logic [pt.BHT_GHR_SIZE-1:0] exu_mp_eghr, // execute ghr + input logic [pt.BHT_GHR_SIZE-1:0] exu_mp_fghr, // Mispredict fghr + input logic [pt.BTB_ADDR_HI:pt.BTB_ADDR_LO] exu_mp_index, // Mispredict index + input logic [pt.BTB_BTAG_SIZE-1:0] exu_mp_btag, // Mispredict btag + + input el2_br_tlu_pkt_t dec_tlu_br0_r_pkt, // slot0 update/error pkt + input logic [pt.BHT_GHR_SIZE-1:0] exu_i0_br_fghr_r, // fghr to bp + input logic [pt.BTB_ADDR_HI:pt.BTB_ADDR_LO] exu_i0_br_index_r, // bp index + + input dec_tlu_flush_lower_wb, + + output logic [15:0] ifu_i0_cinst, + +/// Icache debug + input el2_cache_debug_pkt_t dec_tlu_ic_diag_pkt , + output logic ifu_ic_debug_rd_data_valid, + output logic iccm_buf_correct_ecc, + output logic iccm_correction_state, + + input logic scan_mode + ); + + localparam TAGWIDTH = 2 ; + localparam IDWIDTH = 2 ; + + logic ifu_fb_consume1, ifu_fb_consume2; + logic [31:1] ifc_fetch_addr_f; + logic [31:1] ifc_fetch_addr_bf; + + logic [1:0] ifu_fetch_val; // valids on a 2B boundary, left justified [7] implies valid fetch + logic [31:1] ifu_fetch_pc; // starting pc of fetch + + logic iccm_rd_ecc_single_err, ic_error_start; + assign ifu_iccm_rd_ecc_single_err = iccm_rd_ecc_single_err; + assign ifu_ic_error_start = ic_error_start; + + + logic ic_write_stall; + logic ic_dma_active; + logic ifc_dma_access_ok; + logic ic_access_fault_f; + logic [1:0] ic_access_fault_type_f; + logic ifu_ic_mb_empty; + + + logic ic_hit_f; + + // fetch control + el2_ifu_ifc_ctl #(.pt(pt)) ifc (.* + ); + + logic [1:0] ifu_bp_way_f; // way indication; right justified + logic ifu_bp_hit_taken_f; // kill next fetch; taken target found + logic [31:1] ifu_bp_btb_target_f; // predicted target PC + logic ifu_bp_inst_mask_f; // tell ic which valids to kill because of a taken branch; right justified + + logic [1:0] ifu_bp_hist1_f; // history counters for all 4 potential branches; right justified + logic [1:0] ifu_bp_hist0_f; // history counters for all 4 potential branches; right justified + logic [11:0] ifu_bp_poffset_f; // predicted target + logic [1:0] ifu_bp_ret_f; // predicted ret ; right justified + logic [1:0] ifu_bp_pc4_f; // pc4 indication; right justified + logic [1:0] ifu_bp_valid_f; // branch valid, right justified + logic [pt.BHT_GHR_SIZE-1:0] ifu_bp_fghr_f; + + // branch predictor + el2_ifu_bp_ctl #(.pt(pt)) bp (.*); + + + logic [1:0] ic_fetch_val_f; + logic [31:0] ic_data_f; + logic [31:0] ifu_fetch_data_f; + logic ifc_fetch_req_f; + logic ifc_fetch_req_f_raw; + logic iccm_rd_ecc_double_err; // This fetch has an iccm double error. + + logic ifu_async_error_start; + + + assign ifu_fetch_data_f[31:0] = ic_data_f[31:0]; + assign ifu_fetch_val[1:0] = ic_fetch_val_f[1:0]; + assign ifu_fetch_pc[31:1] = ifc_fetch_addr_f[31:1]; + + logic ifc_fetch_uncacheable_bf; // The fetch request is uncacheable space. BF stage + logic ifc_fetch_req_bf; // Fetch request. Comes with the address. BF stage + logic ifc_fetch_req_bf_raw; // Fetch request without some qualifications. Used for clock-gating. BF stage + logic ifc_iccm_access_bf; // This request is to the ICCM. Do not generate misses to the bus. + logic ifc_region_acc_fault_bf; // Access fault. in ICCM region but offset is outside defined ICCM. + + // aligner + el2_ifu_aln_ctl #(.pt(pt)) aln (.*); + + + // icache + el2_ifu_mem_ctl #(.pt(pt)) mem_ctl + (.*, + .ic_data_f(ic_data_f[31:0]) + ); + + + + // Performance debug info + // + // +`ifdef DUMP_BTB_ON + logic exu_mp_valid; // conditional branch mispredict + logic exu_mp_way; // conditional branch mispredict + logic exu_mp_ataken; // direction is actual taken + logic exu_mp_boffset; // branch offsett + logic exu_mp_pc4; // branch is a 4B inst + logic exu_mp_call; // branch is a call inst + logic exu_mp_ret; // branch is a ret inst + logic exu_mp_ja; // branch is a jump always + logic [1:0] exu_mp_hist; // new history + logic [11:0] exu_mp_tgt; // target offset + logic [pt.BTB_ADDR_HI:pt.BTB_ADDR_LO] exu_mp_addr; // BTB/BHT address + + assign exu_mp_valid = exu_mp_pkt.misp; // conditional branch mispredict + assign exu_mp_ataken = exu_mp_pkt.ataken; // direction is actual taken + assign exu_mp_boffset = exu_mp_pkt.boffset; // branch offset + assign exu_mp_pc4 = exu_mp_pkt.pc4; // branch is a 4B inst + assign exu_mp_call = exu_mp_pkt.pcall; // branch is a call inst + assign exu_mp_ret = exu_mp_pkt.pret; // branch is a ret inst + assign exu_mp_ja = exu_mp_pkt.pja; // branch is a jump always + assign exu_mp_way = exu_mp_pkt.way; // branch is a jump always + assign exu_mp_hist[1:0] = exu_mp_pkt.hist[1:0]; // new history + assign exu_mp_tgt[11:0] = exu_mp_pkt.toffset[11:0] ; // target offset + assign exu_mp_addr[pt.BTB_ADDR_HI:pt.BTB_ADDR_LO] = exu_mp_index[pt.BTB_ADDR_HI:pt.BTB_ADDR_LO] ; // BTB/BHT address + + logic [pt.BTB_ADDR_HI:pt.BTB_ADDR_LO] btb_rd_addr_f; + `define DEC `CPU_TOP.dec + `define EXU `CPU_TOP.exu + el2_btb_addr_hash f2hash(.pc(ifc_fetch_addr_f[pt.BTB_INDEX3_HI:pt.BTB_INDEX1_LO]), .hash(btb_rd_addr_f[pt.BTB_ADDR_HI:pt.BTB_ADDR_LO])); + logic [31:0] mppc_ns, mppc; + logic exu_flush_final_d1; + assign mppc_ns[31:1] = `EXU.i0_flush_upper_x ? `EXU.exu_i0_pc_x : `EXU.dec_i0_pc_d; + assign mppc_ns[0] = 1'b0; + rvdff #(33) mdseal_ff (.*, .din({mppc_ns[31:0], exu_flush_final}), .dout({mppc[31:0], exu_flush_final_d1})); + logic tmp_bnk; + assign tmp_bnk = bp.btb_sel_f[1]; + + always @(negedge clk) begin + if(`DEC.tlu.mcyclel[31:0] == 32'h0000_0010) begin + $display("BTB_CONFIG: %d",pt.BTB_ARRAY_DEPTH*4); + `ifndef BP_NOGSHARE + $display("BHT_CONFIG: %d gshare: 1",pt.BHT_ARRAY_DEPTH*4); + `else + $display("BHT_CONFIG: %d gshare: 0",pt.BHT_ARRAY_DEPTH*4); + `endif + $display("RS_CONFIG: %d", pt.RET_STACK_SIZE); + end + if(exu_flush_final_d1 & ~(dec_tlu_br0_r_pkt.br_error | dec_tlu_br0_r_pkt.br_start_error) & (exu_mp_pkt.misp | exu_mp_pkt.ataken)) + $display("%7d BTB_MP : index: %0h bank: %0h call: %b ret: %b ataken: %b hist: %h valid: %b tag: %h targ: %h eghr: %b pred: %b ghr_index: %h brpc: %h way: %h", `DEC.tlu.mcyclel[31:0]+32'ha, exu_mp_addr[pt.BTB_ADDR_HI:pt.BTB_ADDR_LO], 1'b0, exu_mp_call, exu_mp_ret, exu_mp_ataken, exu_mp_hist[1:0], exu_mp_valid, exu_mp_btag[pt.BTB_BTAG_SIZE-1:0], {exu_flush_path_final[31:1], 1'b0}, exu_mp_eghr[pt.BHT_GHR_SIZE-1:0], exu_mp_valid, bp.bht_wr_addr0, mppc[31:0], exu_mp_pkt.way); + + for(int i = 0; i < 8; i++) begin + if(ifu_bp_valid_f[i] & ifc_fetch_req_f) + $display("%7d BTB_HIT : index: %0h bank: %0h call: %b ret: %b taken: %b strength: %b tag: %h targ: %0h ghr: %4b ghr_index: %h way: %h", `DEC.tlu.mcyclel[31:0]+32'ha,btb_rd_addr_f[pt.BTB_ADDR_HI:pt.BTB_ADDR_LO],bp.btb_sel_f[1], bp.btb_rd_call_f, bp.btb_rd_ret_f, ifu_bp_hist1_f[tmp_bnk], ifu_bp_hist0_f[tmp_bnk], bp.fetch_rd_tag_f[pt.BTB_BTAG_SIZE-1:0], {ifu_bp_btb_target_f[31:1], 1'b0}, bp.fghr[pt.BHT_GHR_SIZE-1:0], bp.bht_rd_addr_f, ifu_bp_way_f[tmp_bnk]); + end + if(dec_tlu_br0_r_pkt.valid & ~(dec_tlu_br0_r_pkt.br_error | dec_tlu_br0_r_pkt.br_start_error)) + $display("%7d BTB_UPD0: ghr_index: %0h bank: %0h hist: %h way: %h", `DEC.tlu.mcyclel[31:0]+32'ha,bp.br0_hashed_wb[pt.BHT_ADDR_HI:pt.BHT_ADDR_LO],{dec_tlu_br0_r_pkt.middle}, dec_tlu_br0_r_pkt.hist, dec_tlu_br0_r_pkt.way); + + if(dec_tlu_br0_r_pkt.br_error | dec_tlu_br0_r_pkt.br_start_error) + $display("%7d BTB_ERR0: index: %0h bank: %0h start: %b rfpc: %h way: %h", `DEC.tlu.mcyclel[31:0]+32'ha,exu_i0_br_index_r[pt.BTB_ADDR_HI:pt.BTB_ADDR_LO],1'b0, dec_tlu_br0_r_pkt.br_start_error, {exu_flush_path_final[31:1], 1'b0}, dec_tlu_br0_r_pkt.way); + end // always @ (negedge clk) + function [1:0] encode4_2; + input [3:0] in; + + encode4_2[1] = in[3] | in[2]; + encode4_2[0] = in[3] | in[1]; + + endfunction +`endif +endmodule // el2_ifu diff --git a/design/ifu/el2_ifu_aln_ctl.sv b/design/ifu/el2_ifu_aln_ctl.sv new file mode 100644 index 0000000..55e17db --- /dev/null +++ b/design/ifu/el2_ifu_aln_ctl.sv @@ -0,0 +1,627 @@ +//******************************************************************************** +// SPDX-License-Identifier: Apache-2.0 +// Copyright 2020 Western Digital Corporation or it's affiliates. +// +// 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. +//******************************************************************************** + +//******************************************************************************** +// Function: Instruction aligner +//******************************************************************************** +module el2_ifu_aln_ctl +import el2_pkg::*; +#( +`include "el2_param.vh" + ) + ( + + input logic scan_mode, + input logic rst_l, + input logic clk, + input logic active_clk, + + input logic ifu_async_error_start, // ecc/parity related errors with current fetch - not sent down the pipe + + input logic iccm_rd_ecc_double_err, // This fetch has a double ICCM ecc error. + + input logic ic_access_fault_f, // Instruction access fault for the current fetch. + input logic [1:0] ic_access_fault_type_f, // Instruction access fault types + input logic [pt.BHT_GHR_SIZE-1:0] ifu_bp_fghr_f, // fetch GHR + input logic [31:1] ifu_bp_btb_target_f, // predicted RET target + input logic [11:0] ifu_bp_poffset_f, // predicted target offset + + input logic [1:0] ifu_bp_hist0_f, // history counters for all 4 potential branches, bit 1, right justified + input logic [1:0] ifu_bp_hist1_f, // history counters for all 4 potential branches, bit 1, right justified + input logic [1:0] ifu_bp_pc4_f, // pc4 indication, right justified + input logic [1:0] ifu_bp_way_f, // way indication, right justified + input logic [1:0] ifu_bp_valid_f, // branch valid, right justified + input logic [1:0] ifu_bp_ret_f, // predicted ret indication, right justified + + input logic exu_flush_final, // Flush from the pipeline. + + input logic dec_i0_decode_d, + + input logic [31:0] ifu_fetch_data_f, // fetch data in memory format - not right justified + + input logic [1:0] ifu_fetch_val, // valids on a 2B boundary, right justified + input logic [31:1] ifu_fetch_pc, // starting pc of fetch + + + + output logic ifu_i0_valid, // Instruction 0 is valid + output logic ifu_i0_icaf, // Instruction 0 has access fault + output logic [1:0] ifu_i0_icaf_type, // Instruction 0 access fault type + output logic ifu_i0_icaf_f1, // Instruction 0 has access fault on second fetch group + + output logic ifu_i0_dbecc, // Instruction 0 has double bit ecc error + output logic [31:0] ifu_i0_instr, // Instruction 0 + output logic [31:1] ifu_i0_pc, // Instruction 0 PC + output logic ifu_i0_pc4, + + output logic ifu_fb_consume1, // Consumed one buffer. To fetch control fetch for buffer mass balance + output logic ifu_fb_consume2, // Consumed two buffers.To fetch control fetch for buffer mass balance + output el2_br_pkt_t i0_brp, // Branch packet for I0. + output logic [pt.BTB_ADDR_HI:pt.BTB_ADDR_LO] ifu_i0_bp_index, // BP index + output logic [pt.BHT_GHR_SIZE-1:0] ifu_i0_bp_fghr, // BP FGHR + output logic [pt.BTB_BTAG_SIZE-1:0] ifu_i0_bp_btag, // BP tag + output logic ifu_pmu_instr_aligned, // number of inst aligned this cycle + + output logic [15:0] ifu_i0_cinst // 16b compress inst for i0 + ); + + + + logic ifvalid; + logic shift_f1_f0, shift_f2_f0, shift_f2_f1; + logic fetch_to_f0, fetch_to_f1, fetch_to_f2; + + logic [1:0] f2val_in, f2val; + logic [1:0] f1val_in, f1val; + logic [1:0] f0val_in, f0val; + logic [1:0] sf1val, sf0val; + + logic [31:1] f2pc_in, f2pc; + logic [31:1] f1pc_in, f1pc; + logic [31:1] f0pc_in, f0pc; + logic [31:1] sf1pc; + + logic [31:0] aligndata; + logic first4B, first2B; + + logic [31:0] uncompress0; + logic i0_shift; + logic shift_2B, shift_4B; + logic f1_shift_2B; + logic f2_valid, sf1_valid, sf0_valid; + + logic [31:0] ifirst; + logic [31:1] f0pc_plus1; + logic [31:1] f1pc_plus1; + logic [1:0] alignval; + logic [31:1] firstpc, secondpc; + + logic [11:0] f1poffset; + logic [11:0] f0poffset; + logic [pt.BHT_GHR_SIZE-1:0] f1fghr; + logic [pt.BHT_GHR_SIZE-1:0] f0fghr; + logic [1:0] f1hist1; + logic [1:0] f0hist1; + logic [1:0] f1hist0; + logic [1:0] f0hist0; + + logic [1:0] f1ictype; + logic [1:0] f0ictype; + + logic [1:0] f1pc4; + logic [1:0] f0pc4; + + logic [1:0] f1ret; + logic [1:0] f0ret; + logic [1:0] f1way; + logic [1:0] f0way; + + logic [1:0] f1brend; + logic [1:0] f0brend; + + logic [1:0] alignbrend; + logic [1:0] alignpc4; + + logic [1:0] alignret; + logic [1:0] alignway; + logic [1:0] alignhist1; + logic [1:0] alignhist0; + logic [1:1] alignfromf1; + logic i0_ends_f1; + logic i0_br_start_error; + + logic [31:1] f1prett; + logic [31:1] f0prett; + logic f1dbecc; + logic f0dbecc; + logic f1icaf; + logic f0icaf; + + logic [1:0] aligndbecc; + logic [1:0] alignicaf; + logic i0_brp_pc4; + + logic [pt.BTB_ADDR_HI:pt.BTB_ADDR_LO] firstpc_hash, secondpc_hash; + + logic first_legal; + + logic f2_wr_en; + logic f0_shift_wr_en; + logic f1_shift_wr_en; + + logic [1:0] wrptr, wrptr_in; + logic [1:0] rdptr, rdptr_in; + logic [2:0] qwen; + logic [31:0] q2,q1,q0; + logic q2off_in, q2off; + logic q1off_in, q1off; + logic q0off_in, q0off; + logic f0_shift_2B; + + logic [31:0] q0eff; + logic [31:0] q0final; + logic q0ptr; + logic [1:0] q0sel; + + logic [31:0] q1eff; + logic [15:0] q1final; + logic q1ptr; + logic [1:0] q1sel; + + logic [2:0] qren; + + logic consume_fb1, consume_fb0; + logic [1:1] icaf_eff; + + localparam BRDATA_SIZE = 12; + localparam BRDATA_WIDTH = 6; + logic [BRDATA_SIZE-1:0] brdata_in, brdata2, brdata1, brdata0; + logic [BRDATA_SIZE-1:0] brdata1eff, brdata0eff; + logic [BRDATA_SIZE-1:0] brdata1final, brdata0final; + + localparam MHI = 46+pt.BHT_GHR_SIZE; + localparam MSIZE = 47+pt.BHT_GHR_SIZE; + logic [MHI:0] misc_data_in, misc2, misc1, misc0; + logic [MHI:0] misc1eff, misc0eff; + + logic [pt.BTB_BTAG_SIZE-1:0] firstbrtag_hash, secondbrtag_hash; + + logic error_stall_in, error_stall; + + assign error_stall_in = (error_stall | ifu_async_error_start) & ~exu_flush_final; + + rvdff #(1) error_stallff (.*, .clk(active_clk), .din(error_stall_in), .dout(error_stall)); + + rvdff #(2) wrpff (.*, .clk(active_clk), .din(wrptr_in[1:0]), .dout(wrptr[1:0])); + rvdff #(2) rdpff (.*, .clk(active_clk), .din(rdptr_in[1:0]), .dout(rdptr[1:0])); + + rvdff #(2) f2valff (.*, .clk(active_clk), .din(f2val_in[1:0]), .dout(f2val[1:0])); + rvdff #(2) f1valff (.*, .clk(active_clk), .din(f1val_in[1:0]), .dout(f1val[1:0])); + rvdff #(2) f0valff (.*, .clk(active_clk), .din(f0val_in[1:0]), .dout(f0val[1:0])); + + rvdff #(1) q2offsetff (.*, .clk(active_clk), .din(q2off_in), .dout(q2off)); + rvdff #(1) q1offsetff (.*, .clk(active_clk), .din(q1off_in), .dout(q1off)); + rvdff #(1) q0offsetff (.*, .clk(active_clk), .din(q0off_in), .dout(q0off)); + rvdffe #(31) f2pcff (.*, .en(f2_wr_en), .din(f2pc_in[31:1]), .dout(f2pc[31:1])); + rvdffe #(31) f1pcff (.*, .en(f1_shift_wr_en), .din(f1pc_in[31:1]), .dout(f1pc[31:1])); + rvdffe #(31) f0pcff (.*, .en(f0_shift_wr_en), .din(f0pc_in[31:1]), .dout(f0pc[31:1])); + rvdffe #(BRDATA_SIZE) brdata2ff (.*, .en(qwen[2]), .din(brdata_in[BRDATA_SIZE-1:0]), .dout(brdata2[BRDATA_SIZE-1:0])); + rvdffe #(BRDATA_SIZE) brdata1ff (.*, .en(qwen[1]), .din(brdata_in[BRDATA_SIZE-1:0]), .dout(brdata1[BRDATA_SIZE-1:0])); + rvdffe #(BRDATA_SIZE) brdata0ff (.*, .en(qwen[0]), .din(brdata_in[BRDATA_SIZE-1:0]), .dout(brdata0[BRDATA_SIZE-1:0])); + rvdffe #(MSIZE) misc2ff (.*, .en(qwen[2]), .din(misc_data_in[MHI:0]), .dout(misc2[MHI:0])); + rvdffe #(MSIZE) misc1ff (.*, .en(qwen[1]), .din(misc_data_in[MHI:0]), .dout(misc1[MHI:0])); + rvdffe #(MSIZE) misc0ff (.*, .en(qwen[0]), .din(misc_data_in[MHI:0]), .dout(misc0[MHI:0])); + + rvdffe #(32) q2ff (.*, .en(qwen[2]), .din(ifu_fetch_data_f[31:0]), .dout(q2[31:0])); + rvdffe #(32) q1ff (.*, .en(qwen[1]), .din(ifu_fetch_data_f[31:0]), .dout(q1[31:0])); + rvdffe #(32) q0ff (.*, .en(qwen[0]), .din(ifu_fetch_data_f[31:0]), .dout(q0[31:0])); + + + + + + assign f2_wr_en = fetch_to_f2; + assign f1_shift_wr_en = fetch_to_f1 | shift_f2_f1 | f1_shift_2B; + assign f0_shift_wr_en = fetch_to_f0 | shift_f2_f0 | shift_f1_f0 | shift_2B | shift_4B; + + + + // new queue control logic + + assign qren[2:0] = { rdptr[1:0] == 2'b10, + rdptr[1:0] == 2'b01, + rdptr[1:0] == 2'b00 }; + + assign qwen[2:0] = { (wrptr[1:0] == 2'b10) & ifvalid, + (wrptr[1:0] == 2'b01) & ifvalid, + (wrptr[1:0] == 2'b00) & ifvalid }; + + + assign rdptr_in[1:0] = ({2{ qren[0] & ifu_fb_consume1 & ~exu_flush_final}} & 2'b01 ) | + ({2{ qren[1] & ifu_fb_consume1 & ~exu_flush_final}} & 2'b10 ) | + ({2{ qren[2] & ifu_fb_consume1 & ~exu_flush_final}} & 2'b00 ) | + ({2{ qren[0] & ifu_fb_consume2 & ~exu_flush_final}} & 2'b10 ) | + ({2{ qren[1] & ifu_fb_consume2 & ~exu_flush_final}} & 2'b00 ) | + ({2{ qren[2] & ifu_fb_consume2 & ~exu_flush_final}} & 2'b01 ) | + ({2{~ifu_fb_consume1 & ~ifu_fb_consume2 & ~exu_flush_final}} & rdptr[1:0]); + + assign wrptr_in[1:0] = ({2{ qwen[0] & ~exu_flush_final}} & 2'b01 ) | + ({2{ qwen[1] & ~exu_flush_final}} & 2'b10 ) | + ({2{ qwen[2] & ~exu_flush_final}} & 2'b00 ) | + ({2{~ifvalid & ~exu_flush_final}} & wrptr[1:0]); + + + + assign q2off_in = ( ~qwen[2] & (rdptr[1:0]==2'd2) & (q2off | f0_shift_2B) ) | + ( ~qwen[2] & (rdptr[1:0]==2'd1) & (q2off | f1_shift_2B) ) | + ( ~qwen[2] & (rdptr[1:0]==2'd0) & q2off ); + + assign q1off_in = ( ~qwen[1] & (rdptr[1:0]==2'd1) & (q1off | f0_shift_2B) ) | + ( ~qwen[1] & (rdptr[1:0]==2'd0) & (q1off | f1_shift_2B) ) | + ( ~qwen[1] & (rdptr[1:0]==2'd2) & q1off ); + + assign q0off_in = ( ~qwen[0] & (rdptr[1:0]==2'd0) & (q0off | f0_shift_2B) ) | + ( ~qwen[0] & (rdptr[1:0]==2'd2) & (q0off | f1_shift_2B) ) | + ( ~qwen[0] & (rdptr[1:0]==2'd1) & q0off ); + + + + assign q0ptr = ( (rdptr[1:0]==2'b00) & q0off ) | + ( (rdptr[1:0]==2'b01) & q1off ) | + ( (rdptr[1:0]==2'b10) & q2off ); + + assign q1ptr = ( (rdptr[1:0]==2'b00) & q1off ) | + ( (rdptr[1:0]==2'b01) & q2off ) | + ( (rdptr[1:0]==2'b10) & q0off ); + + assign q0sel[1:0] = {q0ptr,~q0ptr}; + + assign q1sel[1:0] = {q1ptr,~q1ptr}; + + // end new queue control logic + + + // misc data that is associated with each fetch buffer + + assign misc_data_in[MHI:0] = { iccm_rd_ecc_double_err, + ic_access_fault_f, + ic_access_fault_type_f[1:0], + ifu_bp_btb_target_f[31:1], + ifu_bp_poffset_f[11:0], + ifu_bp_fghr_f[pt.BHT_GHR_SIZE-1:0] + }; + + + assign {misc1eff[MHI:0],misc0eff[MHI:0]} = (({MSIZE*2{qren[0]}} & {misc1[MHI:0],misc0[MHI:0]}) | + ({MSIZE*2{qren[1]}} & {misc2[MHI:0],misc1[MHI:0]}) | + ({MSIZE*2{qren[2]}} & {misc0[MHI:0],misc2[MHI:0]})); + + assign { f1dbecc, + f1icaf, + f1ictype[1:0], + f1prett[31:1], + f1poffset[11:0], + f1fghr[pt.BHT_GHR_SIZE-1:0] + } = misc1eff[MHI:0]; + + assign { f0dbecc, + f0icaf, + f0ictype[1:0], + f0prett[31:1], + f0poffset[11:0], + f0fghr[pt.BHT_GHR_SIZE-1:0] + } = misc0eff[MHI:0]; + + + assign brdata_in[BRDATA_SIZE-1:0] = { + ifu_bp_hist1_f[1],ifu_bp_hist0_f[1],ifu_bp_pc4_f[1],ifu_bp_way_f[1],ifu_bp_valid_f[1],ifu_bp_ret_f[1], + ifu_bp_hist1_f[0],ifu_bp_hist0_f[0],ifu_bp_pc4_f[0],ifu_bp_way_f[0],ifu_bp_valid_f[0],ifu_bp_ret_f[0] + }; + + + + assign {brdata1eff[BRDATA_SIZE-1:0],brdata0eff[BRDATA_SIZE-1:0]} = (({BRDATA_SIZE*2{qren[0]}} & {brdata1[BRDATA_SIZE-1:0],brdata0[BRDATA_SIZE-1:0]}) | + ({BRDATA_SIZE*2{qren[1]}} & {brdata2[BRDATA_SIZE-1:0],brdata1[BRDATA_SIZE-1:0]}) | + ({BRDATA_SIZE*2{qren[2]}} & {brdata0[BRDATA_SIZE-1:0],brdata2[BRDATA_SIZE-1:0]})); + + assign brdata0final[BRDATA_SIZE-1:0] = (({BRDATA_SIZE{q0sel[0]}} & { brdata0eff[2*BRDATA_WIDTH-1:0]}) | + ({BRDATA_SIZE{q0sel[1]}} & {{BRDATA_WIDTH{1'b0}},brdata0eff[BRDATA_SIZE-1:BRDATA_WIDTH]})); + + assign brdata1final[BRDATA_SIZE-1:0] = (({BRDATA_SIZE{q1sel[0]}} & { brdata1eff[2*BRDATA_WIDTH-1:0]}) | + ({BRDATA_SIZE{q1sel[1]}} & {{BRDATA_WIDTH{1'b0}},brdata1eff[BRDATA_SIZE-1:BRDATA_WIDTH]})); + + assign {f0hist1[1],f0hist0[1],f0pc4[1],f0way[1],f0brend[1],f0ret[1], + f0hist1[0],f0hist0[0],f0pc4[0],f0way[0],f0brend[0],f0ret[0]} = brdata0final[BRDATA_SIZE-1:0]; + + assign {f1hist1[1],f1hist0[1],f1pc4[1],f1way[1],f1brend[1],f1ret[1], + f1hist1[0],f1hist0[0],f1pc4[0],f1way[0],f1brend[0],f1ret[0]} = brdata1final[BRDATA_SIZE-1:0]; + + + // possible states of { sf0_valid, sf1_valid, f2_valid } + // + // 000 if->f0 + // 100 if->f1 + // 101 illegal + // 010 if->f1, f1->f0 + // 110 if->f2 + // 001 if->f1, f2->f0 + // 011 if->f2, f2->f1, f1->f0 + // 111 !if, no shift + + assign f2_valid = f2val[0]; + assign sf1_valid = sf1val[0]; + assign sf0_valid = sf0val[0]; + + // interface to fetch + + assign consume_fb0 = ~sf0val[0] & f0val[0]; + + assign consume_fb1 = ~sf1val[0] & f1val[0]; + + assign ifu_fb_consume1 = consume_fb0 & ~consume_fb1 & ~exu_flush_final; + assign ifu_fb_consume2 = consume_fb0 & consume_fb1 & ~exu_flush_final; + + assign ifvalid = ifu_fetch_val[0]; + + assign shift_f1_f0 = ~sf0_valid & sf1_valid; + assign shift_f2_f0 = ~sf0_valid & ~sf1_valid & f2_valid; + assign shift_f2_f1 = ~sf0_valid & sf1_valid & f2_valid; + + assign fetch_to_f0 = ~sf0_valid & ~sf1_valid & ~f2_valid & ifvalid; + + assign fetch_to_f1 = (~sf0_valid & ~sf1_valid & f2_valid & ifvalid) | + (~sf0_valid & sf1_valid & ~f2_valid & ifvalid) | + ( sf0_valid & ~sf1_valid & ~f2_valid & ifvalid); + + assign fetch_to_f2 = (~sf0_valid & sf1_valid & f2_valid & ifvalid) | + ( sf0_valid & sf1_valid & ~f2_valid & ifvalid); + + + + assign f0pc_plus1[31:1] = f0pc[31:1] + 31'd1; + assign f1pc_plus1[31:1] = f1pc[31:1] + 31'd1; + + assign f2pc_in[31:1] = ifu_fetch_pc[31:1]; + + + assign sf1pc[31:1] = ({31{ f1_shift_2B}} & f1pc_plus1[31:1]) | + ({31{~f1_shift_2B}} & f1pc[31:1] ); + + assign f1pc_in[31:1] = ({31{ fetch_to_f1 }} & ifu_fetch_pc[31:1]) | + ({31{ shift_f2_f1}} & f2pc[31:1] ) | + ({31{~fetch_to_f1 & ~shift_f2_f1}} & sf1pc[31:1] ); + + + assign f0pc_in[31:1] = ({31{ fetch_to_f0 }} & ifu_fetch_pc[31:1]) | + ({31{ shift_f2_f0 }} & f2pc[31:1] ) | + ({31{ shift_f1_f0}} & sf1pc[31:1] ) | + ({31{~fetch_to_f0 & ~shift_f2_f0 & ~shift_f1_f0}} & f0pc_plus1[31:1] ); + + + + assign f2val_in[1:0] = ({2{ fetch_to_f2 & ~exu_flush_final}} & ifu_fetch_val[1:0]) | + ({2{~fetch_to_f2 & ~shift_f2_f1 & ~shift_f2_f0 & ~exu_flush_final}} & f2val[1:0] ); + + + assign sf1val[1:0] = ({2{ f1_shift_2B}} & {1'b0,f1val[1]}) | + ({2{~f1_shift_2B}} & f1val[1:0] ); + + assign f1val_in[1:0] = ({2{ fetch_to_f1 & ~exu_flush_final}} & ifu_fetch_val[1:0]) | + ({2{ shift_f2_f1 & ~exu_flush_final}} & f2val[1:0] ) | + ({2{~fetch_to_f1 & ~shift_f2_f1 & ~shift_f1_f0 & ~exu_flush_final}} & sf1val[1:0] ); + + + + assign sf0val[1:0] = ({2{ shift_2B }} & {1'b0,f0val[1]}) | + ({2{~shift_2B & ~shift_4B}} & f0val[1:0]); + + assign f0val_in[1:0] = ({2{fetch_to_f0 & ~exu_flush_final}} & ifu_fetch_val[1:0]) | + ({2{ shift_f2_f0 & ~exu_flush_final}} & f2val[1:0] ) | + ({2{ shift_f1_f0 & ~exu_flush_final}} & sf1val[1:0] ) | + ({2{~fetch_to_f0 & ~shift_f2_f0 & ~shift_f1_f0 & ~exu_flush_final}} & sf0val[1:0] ); + + + + + + + assign {q1eff[31:0],q0eff[31:0]} = (({64{qren[0]}} & {q1[31:0],q0[31:0]}) | + ({64{qren[1]}} & {q2[31:0],q1[31:0]}) | + ({64{qren[2]}} & {q0[31:0],q2[31:0]})); + + assign q0final[31:0] = ({32{q0sel[0]}} & { q0eff[31:0]}) | + ({32{q0sel[1]}} & {16'b0,q0eff[31:16]}); + + assign q1final[15:0] = ({16{q1sel[0]}} & q1eff[15:0] ) | + ({16{q1sel[1]}} & q1eff[31:16]); + + assign aligndata[31:0] = ({32{ f0val[1] }} & {q0final[31:0]}) | + ({32{~f0val[1] & f0val[0]}} & {q1final[15:0],q0final[15:0]}); + + assign alignval[1:0] = ({ 2{ f0val[1] }} & {2'b11}) | + ({ 2{~f0val[1] & f0val[0]}} & {f1val[0],1'b1}); + + assign alignicaf[1:0] = ({ 2{ f0val[1] }} & {{2{f0icaf}}}) | + ({ 2{~f0val[1] & f0val[0]}} & {f1icaf,f0icaf}); + + assign aligndbecc[1:0] = ({ 2{ f0val[1] }} & {{2{f0dbecc}}}) | + ({ 2{~f0val[1] & f0val[0]}} & {f1dbecc,f0dbecc}); + + // for branch prediction + assign alignbrend[1:0] = ({ 2{ f0val[1] }} & f0brend[1:0] ) | + ({ 2{~f0val[1] & f0val[0]}} & {f1brend[0],f0brend[0]}); + + assign alignpc4[1:0] = ({ 2{ f0val[1] }} & f0pc4[1:0] ) | + ({ 2{~f0val[1] & f0val[0]}} & {f1pc4[0],f0pc4[0]}); + + + assign alignret[1:0] = ({ 2{ f0val[1] }} & f0ret[1:0] ) | + ({ 2{~f0val[1] & f0val[0]}} & {f1ret[0],f0ret[0]}); + + assign alignway[1:0] = ({ 2{ f0val[1] }} & f0way[1:0] ) | + ({ 2{~f0val[1] & f0val[0]}} & {f1way[0],f0way[0]}); + + assign alignhist1[1:0] = ({ 2{ f0val[1] }} & f0hist1[1:0] ) | + ({ 2{~f0val[1] & f0val[0]}} & {f1hist1[0],f0hist1[0]}); + + assign alignhist0[1:0] = ({ 2{ f0val[1] }} & f0hist0[1:0] ) | + ({ 2{~f0val[1] & f0val[0]}} & {f1hist0[0],f0hist0[0]}); + + assign alignfromf1[1] = ~f0val[1] & f0val[0]; + + assign secondpc[31:1] = ({31{ f0val[1] }} & f0pc_plus1[31:1]) | + ({31{~f0val[1] & f0val[0]}} & f1pc[31:1] ); + + + assign ifu_i0_pc[31:1] = f0pc[31:1]; + + assign firstpc[31:1] = f0pc[31:1]; + + assign ifu_i0_pc4 = first4B; + + + + assign ifu_i0_cinst[15:0] = aligndata[15:0]; + + assign first4B = (aligndata[1:0] == 2'b11); + assign first2B = ~first4B; + + assign ifu_i0_valid = (first4B & alignval[1]) | + (first2B & alignval[0]); + + // inst access fault on any byte of inst results in access fault for the inst + assign ifu_i0_icaf = (first4B & (|alignicaf[1:0])) | + (first2B & alignicaf[0] ); + + assign ifu_i0_icaf_type[1:0] = (first4B & ~f0val[1] & f0val[0] & ~alignicaf[0] & ~aligndbecc[0]) ? f1ictype[1:0] : f0ictype[1:0]; + + + assign icaf_eff[1] = alignicaf[1] | aligndbecc[1]; + + assign ifu_i0_icaf_f1 = first4B & icaf_eff[1] & alignfromf1[1]; + + assign ifu_i0_dbecc = (first4B & (|aligndbecc[1:0])) | + (first2B & aligndbecc[0] ); + + + assign ifirst[31:0] = aligndata[31:0]; + + + assign ifu_i0_instr[31:0] = ({32{first4B}} & ifirst[31:0]) | + ({32{first2B}} & uncompress0[31:0]); + + + // if you detect br does not start on instruction boundary + + el2_btb_addr_hash #(.pt(pt)) firsthash (.pc(firstpc [pt.BTB_INDEX3_HI:pt.BTB_INDEX1_LO]), .hash(firstpc_hash [pt.BTB_ADDR_HI:pt.BTB_ADDR_LO])); + el2_btb_addr_hash #(.pt(pt)) secondhash(.pc(secondpc[pt.BTB_INDEX3_HI:pt.BTB_INDEX1_LO]), .hash(secondpc_hash[pt.BTB_ADDR_HI:pt.BTB_ADDR_LO])); + +if(pt.BTB_BTAG_FOLD) begin : btbfold + el2_btb_tag_hash_fold #(.pt(pt)) first_brhash (.pc(firstpc [pt.BTB_ADDR_HI+pt.BTB_BTAG_SIZE+pt.BTB_BTAG_SIZE:pt.BTB_ADDR_HI+1]), .hash(firstbrtag_hash [pt.BTB_BTAG_SIZE-1:0])); + el2_btb_tag_hash_fold #(.pt(pt)) second_brhash(.pc(secondpc[pt.BTB_ADDR_HI+pt.BTB_BTAG_SIZE+pt.BTB_BTAG_SIZE:pt.BTB_ADDR_HI+1]), .hash(secondbrtag_hash[pt.BTB_BTAG_SIZE-1:0])); +end +else begin + el2_btb_tag_hash #(.pt(pt)) first_brhash (.pc(firstpc [pt.BTB_ADDR_HI+pt.BTB_BTAG_SIZE+pt.BTB_BTAG_SIZE+pt.BTB_BTAG_SIZE:pt.BTB_ADDR_HI+1]), .hash(firstbrtag_hash [pt.BTB_BTAG_SIZE-1:0])); + el2_btb_tag_hash #(.pt(pt)) second_brhash(.pc(secondpc[pt.BTB_ADDR_HI+pt.BTB_BTAG_SIZE+pt.BTB_BTAG_SIZE+pt.BTB_BTAG_SIZE:pt.BTB_ADDR_HI+1]), .hash(secondbrtag_hash[pt.BTB_BTAG_SIZE-1:0])); +end + // start_indexing - you want pc to be based on where the end of branch is prediction + // normal indexing pc based that's incorrect now for pc4 cases it's pc4 + 2 + + always_comb begin + + i0_brp = '0; + + i0_br_start_error = (first4B & alignval[1] & alignbrend[0]); + + i0_brp.valid = (first2B & alignbrend[0]) | + (first4B & alignbrend[1]) | + i0_br_start_error; + + i0_brp_pc4 = (first2B & alignpc4[0]) | + (first4B & alignpc4[1]); + + i0_brp.ret = (first2B & alignret[0]) | + (first4B & alignret[1]); + + i0_brp.way = (first2B | alignbrend[0]) ? alignway[0] : alignway[1]; + + i0_brp.hist[1] = (first2B & alignhist1[0]) | + (first4B & alignhist1[1]); + + i0_brp.hist[0] = (first2B & alignhist0[0]) | + (first4B & alignhist0[1]); + + i0_ends_f1 = first4B & alignfromf1[1]; + + i0_brp.toffset[11:0] = (i0_ends_f1) ? f1poffset[11:0] : f0poffset[11:0]; + + i0_brp.prett[31:1] = (i0_ends_f1) ? f1prett[31:1] : f0prett[31:1]; + + i0_brp.br_start_error = i0_br_start_error; + + i0_brp.bank = (first2B | alignbrend[0]) ? firstpc[1] : secondpc[1]; + + i0_brp.br_error = (i0_brp.valid & i0_brp_pc4 & first2B) | + (i0_brp.valid & ~i0_brp_pc4 & first4B); + + end + + + assign ifu_i0_bp_index[pt.BTB_ADDR_HI:pt.BTB_ADDR_LO] = (first2B | alignbrend[0]) ? firstpc_hash[pt.BTB_ADDR_HI:pt.BTB_ADDR_LO] : + secondpc_hash[pt.BTB_ADDR_HI:pt.BTB_ADDR_LO]; + + assign ifu_i0_bp_fghr[pt.BHT_GHR_SIZE-1:0] = (i0_ends_f1) ? f1fghr[pt.BHT_GHR_SIZE-1:0] : + f0fghr[pt.BHT_GHR_SIZE-1:0]; + + assign ifu_i0_bp_btag[pt.BTB_BTAG_SIZE-1:0] = (first2B | alignbrend[0]) ? firstbrtag_hash[pt.BTB_BTAG_SIZE-1:0] : + secondbrtag_hash[pt.BTB_BTAG_SIZE-1:0]; + + + // decompress + + el2_ifu_compress_ctl compress0 (.din(aligndata[15:0]), .dout(uncompress0[31:0])); + + + + assign i0_shift = dec_i0_decode_d & ~error_stall; + + assign ifu_pmu_instr_aligned = i0_shift; + + + // compute how many bytes are being shifted from f0 + + // assign shift_0B = ~i0_shift; + + assign shift_2B = i0_shift & first2B; + + assign shift_4B = i0_shift & first4B; + + // exact equations for the queue logic + assign f0_shift_2B = (shift_2B & f0val[0] ) | + (shift_4B & f0val[0] & ~f0val[1]); + + + // f0 valid states + // 11 + // 10 + // 00 + + assign f1_shift_2B = f0val[0] & ~f0val[1] & shift_4B; + + + +endmodule diff --git a/design/ifu/el2_ifu_bp_ctl.sv b/design/ifu/el2_ifu_bp_ctl.sv new file mode 100644 index 0000000..ad1c501 --- /dev/null +++ b/design/ifu/el2_ifu_bp_ctl.sv @@ -0,0 +1,752 @@ +//******************************************************************************** +// SPDX-License-Identifier: Apache-2.0 +// Copyright 2020 Western Digital Corporation or it's affiliates. +// +// 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. +//******************************************************************************** + +//******************************************************************************** +// Function: Branch predictor +// Comments: +// +// +// Bank3 : Bank2 : Bank1 : Bank0 +// FA C 8 4 0 +//******************************************************************************** + +module el2_ifu_bp_ctl +import el2_pkg::*; +#( +`include "el2_param.vh" + ) + ( + + input logic clk, + input logic active_clk, + input logic rst_l, + + input logic ic_hit_f, // Icache hit, enables F address capture + + input logic [31:1] ifc_fetch_addr_f, // look up btb address + input logic ifc_fetch_req_f, // F1 valid + + input el2_br_tlu_pkt_t dec_tlu_br0_r_pkt, // BP commit update packet, includes errors + input logic [pt.BHT_GHR_SIZE-1:0] exu_i0_br_fghr_r, // fghr to bp + input logic [pt.BTB_ADDR_HI:pt.BTB_ADDR_LO] exu_i0_br_index_r, // bp index + + input logic dec_tlu_flush_lower_wb, // used to move EX4 RS to EX1 and F + input logic dec_tlu_flush_leak_one_wb, // don't hit for leak one fetches + + input logic dec_tlu_bpred_disable, // disable all branch prediction + + input el2_predict_pkt_t exu_mp_pkt, // mispredict packet + + input logic [pt.BHT_GHR_SIZE-1:0] exu_mp_eghr, // execute ghr (for patching fghr) + input logic [pt.BHT_GHR_SIZE-1:0] exu_mp_fghr, // Mispredict fghr + input logic [pt.BTB_ADDR_HI:pt.BTB_ADDR_LO] exu_mp_index, // Mispredict index + input logic [pt.BTB_BTAG_SIZE-1:0] exu_mp_btag, // Mispredict btag + + input logic exu_flush_final, // all flushes + + output logic ifu_bp_hit_taken_f, // btb hit, select target + output logic [31:1] ifu_bp_btb_target_f, // predicted target PC + output logic ifu_bp_inst_mask_f, // tell ic which valids to kill because of a taken branch, right justified + + output logic [pt.BHT_GHR_SIZE-1:0] ifu_bp_fghr_f, // fetch ghr + + output logic [1:0] ifu_bp_way_f, // way + output logic [1:0] ifu_bp_ret_f, // predicted ret + output logic [1:0] ifu_bp_hist1_f, // history counters for all 4 potential branches, bit 1, right justified + output logic [1:0] ifu_bp_hist0_f, // history counters for all 4 potential branches, bit 0, right justified + output logic [1:0] ifu_bp_pc4_f, // pc4 indication, right justified + output logic [1:0] ifu_bp_valid_f, // branch valid, right justified + output logic [11:0] ifu_bp_poffset_f, // predicted target + + input logic scan_mode + ); + + localparam TAG_START=16+pt.BTB_BTAG_SIZE; + localparam PC4=4; + localparam BOFF=3; + localparam CALL=2; + localparam RET=1; + localparam BV=0; + + localparam LRU_SIZE=pt.BTB_ARRAY_DEPTH; + localparam NUM_BHT_LOOP = (pt.BHT_ARRAY_DEPTH > 16 ) ? 16 : pt.BHT_ARRAY_DEPTH; + localparam NUM_BHT_LOOP_INNER_HI = (pt.BHT_ARRAY_DEPTH > 16 ) ? pt.BHT_ADDR_LO+3 : pt.BHT_ADDR_HI; + localparam NUM_BHT_LOOP_OUTER_LO = (pt.BHT_ARRAY_DEPTH > 16 ) ? pt.BHT_ADDR_LO+4 : pt.BHT_ADDR_LO; + localparam BHT_NO_ADDR_MATCH = ( pt.BHT_ARRAY_DEPTH <= 16 ); + + logic exu_mp_valid_write; + logic exu_mp_ataken; + logic exu_mp_valid; // conditional branch mispredict + logic exu_mp_boffset; // branch offsett + logic exu_mp_pc4; // branch is a 4B inst + logic exu_mp_call; // branch is a call inst + logic exu_mp_ret; // branch is a ret inst + logic exu_mp_ja; // branch is a jump always + logic [1:0] exu_mp_hist; // new history + logic [11:0] exu_mp_tgt; // target offset + logic [pt.BTB_ADDR_HI:pt.BTB_ADDR_LO] exu_mp_addr; // BTB/BHT address + logic dec_tlu_br0_v_wb; // WB stage history update + logic [1:0] dec_tlu_br0_hist_wb; // new history + logic [pt.BTB_ADDR_HI:pt.BTB_ADDR_LO] dec_tlu_br0_addr_wb; // addr + logic dec_tlu_br0_error_wb; // error; invalidate bank + logic dec_tlu_br0_start_error_wb; // error; invalidate all 4 banks in fg + logic [pt.BHT_GHR_SIZE-1:0] exu_i0_br_fghr_wb; + + logic use_mp_way, use_mp_way_p1; + logic [pt.RET_STACK_SIZE-1:0][31:0] rets_out, rets_in; + logic [pt.RET_STACK_SIZE-1:0] rsenable; + + + logic [11:0] btb_rd_tgt_f; + logic btb_rd_pc4_f, btb_rd_call_f, btb_rd_ret_f; + logic [1:1] bp_total_branch_offset_f; + + logic [31:1] bp_btb_target_adder_f; + logic [31:1] bp_rs_call_target_f; + logic rs_push, rs_pop, rs_hold; + logic [pt.BTB_ADDR_HI:pt.BTB_ADDR_LO] btb_rd_addr_p1_f, btb_wr_addr, btb_rd_addr_f; + logic [pt.BTB_BTAG_SIZE-1:0] btb_wr_tag, fetch_rd_tag_f, fetch_rd_tag_p1_f; + logic [16+pt.BTB_BTAG_SIZE:0] btb_wr_data; + logic btb_wr_en_way0, btb_wr_en_way1; + + + logic dec_tlu_error_wb, btb_valid, dec_tlu_br0_middle_wb; + logic [pt.BTB_ADDR_HI:pt.BTB_ADDR_LO] btb_error_addr_wb; + + logic branch_error_collision_f, fetch_mp_collision_f, branch_error_collision_p1_f, fetch_mp_collision_p1_f; + + logic branch_error_bank_conflict_f; + logic [pt.BHT_GHR_SIZE-1:0] merged_ghr, fghr_ns, fghr; + logic [1:0] num_valids; + logic [LRU_SIZE-1:0] btb_lru_b0_f, btb_lru_b0_hold, btb_lru_b0_ns, + fetch_wrindex_dec, fetch_wrindex_p1_dec, fetch_wrlru_b0, fetch_wrlru_p1_b0, + mp_wrindex_dec, mp_wrlru_b0; + logic btb_lru_rd_f, btb_lru_rd_p1_f, lru_update_valid_f; + logic tag_match_way0_f, tag_match_way1_f; + logic [1:0] way_raw, bht_dir_f, btb_sel_f, wayhit_f, vwayhit_f, wayhit_p1_f; + logic [1:0] bht_valid_f, bht_force_taken_f; + + logic leak_one_f, leak_one_f_d1; + + logic [LRU_SIZE-1:0][16+pt.BTB_BTAG_SIZE:0] btb_bank0_rd_data_way0_out ; + + logic [LRU_SIZE-1:0][16+pt.BTB_BTAG_SIZE:0] btb_bank0_rd_data_way1_out ; + + logic [16+pt.BTB_BTAG_SIZE:0] btb_bank0_rd_data_way0_f ; + logic [16+pt.BTB_BTAG_SIZE:0] btb_bank0_rd_data_way1_f ; + + logic [16+pt.BTB_BTAG_SIZE:0] btb_bank0_rd_data_way0_p1_f ; + logic [16+pt.BTB_BTAG_SIZE:0] btb_bank0_rd_data_way1_p1_f ; + + logic [16+pt.BTB_BTAG_SIZE:0] btb_vbank0_rd_data_f, btb_vbank1_rd_data_f; + + logic final_h; + logic btb_fg_crossing_f; + logic middle_of_bank; + + + logic [1:0] bht_vbank0_rd_data_f, bht_vbank1_rd_data_f; + logic branch_error_bank_conflict_p1_f; + logic tag_match_way0_p1_f, tag_match_way1_p1_f; + + logic [1:0] btb_vlru_rd_f, fetch_start_f, tag_match_vway1_expanded_f, tag_match_way0_expanded_p1_f, tag_match_way1_expanded_p1_f; + logic [31:2] fetch_addr_p1_f; + + + logic exu_mp_way, exu_mp_way_f, dec_tlu_br0_way_wb, dec_tlu_way_wb, dec_tlu_way_wb_f; + logic [16+pt.BTB_BTAG_SIZE:0] btb_bank0e_rd_data_f, btb_bank0e_rd_data_p1_f; + + logic [16+pt.BTB_BTAG_SIZE:0] btb_bank0o_rd_data_f; + + logic [1:0] tag_match_way0_expanded_f, tag_match_way1_expanded_f; + + + logic [1:0] bht_bank0_rd_data_f; + logic [1:0] bht_bank1_rd_data_f; + logic [1:0] bht_bank0_rd_data_p1_f; +logic exu_flush_final_d1; + + assign exu_mp_valid = exu_mp_pkt.misp & ~leak_one_f; // conditional branch mispredict + assign exu_mp_boffset = exu_mp_pkt.boffset; // branch offset + assign exu_mp_pc4 = exu_mp_pkt.pc4; // branch is a 4B inst + assign exu_mp_call = exu_mp_pkt.pcall; // branch is a call inst + assign exu_mp_ret = exu_mp_pkt.pret; // branch is a ret inst + assign exu_mp_ja = exu_mp_pkt.pja; // branch is a jump always + assign exu_mp_way = exu_mp_pkt.way; // repl way + assign exu_mp_hist[1:0] = exu_mp_pkt.hist[1:0]; // new history + assign exu_mp_tgt[11:0] = exu_mp_pkt.toffset[11:0] ; // target offset + assign exu_mp_addr[pt.BTB_ADDR_HI:pt.BTB_ADDR_LO] = exu_mp_index[pt.BTB_ADDR_HI:pt.BTB_ADDR_LO] ; // BTB/BHT address + assign exu_mp_ataken = exu_mp_pkt.ataken; + + + assign dec_tlu_br0_v_wb = dec_tlu_br0_r_pkt.valid; + assign dec_tlu_br0_hist_wb[1:0] = dec_tlu_br0_r_pkt.hist[1:0]; + assign dec_tlu_br0_addr_wb[pt.BTB_ADDR_HI:pt.BTB_ADDR_LO] = exu_i0_br_index_r[pt.BTB_ADDR_HI:pt.BTB_ADDR_LO]; + assign dec_tlu_br0_error_wb = dec_tlu_br0_r_pkt.br_error; + assign dec_tlu_br0_middle_wb = dec_tlu_br0_r_pkt.middle; + assign dec_tlu_br0_way_wb = dec_tlu_br0_r_pkt.way; + assign dec_tlu_br0_start_error_wb = dec_tlu_br0_r_pkt.br_start_error; + assign exu_i0_br_fghr_wb[pt.BHT_GHR_SIZE-1:0] = exu_i0_br_fghr_r[pt.BHT_GHR_SIZE-1:0]; + + + + + // ---------------------------------------------------------------------- + // READ + // ---------------------------------------------------------------------- + + // hash the incoming fetch PC, first guess at hashing algorithm + el2_btb_addr_hash #(.pt(pt)) f1hash(.pc(ifc_fetch_addr_f[pt.BTB_INDEX3_HI:pt.BTB_INDEX1_LO]), .hash(btb_rd_addr_f[pt.BTB_ADDR_HI:pt.BTB_ADDR_LO])); + + + assign fetch_addr_p1_f[31:2] = ifc_fetch_addr_f[31:2] + 30'b1; + el2_btb_addr_hash #(.pt(pt)) f1hash_p1(.pc(fetch_addr_p1_f[pt.BTB_INDEX3_HI:pt.BTB_INDEX1_LO]), .hash(btb_rd_addr_p1_f[pt.BTB_ADDR_HI:pt.BTB_ADDR_LO])); + + assign btb_sel_f[1] = ~bht_dir_f[0]; + assign btb_sel_f[0] = bht_dir_f[0]; + + assign fetch_start_f[1:0] = {ifc_fetch_addr_f[1], ~ifc_fetch_addr_f[1]}; + + // Errors colliding with fetches must kill the btb/bht hit. + + assign branch_error_collision_f = dec_tlu_error_wb & (btb_error_addr_wb[pt.BTB_ADDR_HI:pt.BTB_ADDR_LO] == btb_rd_addr_f[pt.BTB_ADDR_HI:pt.BTB_ADDR_LO]); + assign branch_error_collision_p1_f = dec_tlu_error_wb & (btb_error_addr_wb[pt.BTB_ADDR_HI:pt.BTB_ADDR_LO] == btb_rd_addr_p1_f[pt.BTB_ADDR_HI:pt.BTB_ADDR_LO]); + + assign branch_error_bank_conflict_f = branch_error_collision_f & dec_tlu_error_wb; + assign branch_error_bank_conflict_p1_f = branch_error_collision_p1_f & dec_tlu_error_wb; + + assign fetch_mp_collision_f = ( (exu_mp_btag[pt.BTB_BTAG_SIZE-1:0] == fetch_rd_tag_f[pt.BTB_BTAG_SIZE-1:0]) & + exu_mp_valid & ifc_fetch_req_f & + (exu_mp_addr[pt.BTB_ADDR_HI:pt.BTB_ADDR_LO] == btb_rd_addr_f[pt.BTB_ADDR_HI:pt.BTB_ADDR_LO]) + ); + assign fetch_mp_collision_p1_f = ( (exu_mp_btag[pt.BTB_BTAG_SIZE-1:0] == fetch_rd_tag_p1_f[pt.BTB_BTAG_SIZE-1:0]) & + exu_mp_valid & ifc_fetch_req_f & + (exu_mp_addr[pt.BTB_ADDR_HI:pt.BTB_ADDR_LO] == btb_rd_addr_p1_f[pt.BTB_ADDR_HI:pt.BTB_ADDR_LO]) + ); + // set on leak one, hold until next flush without leak one + assign leak_one_f = (dec_tlu_flush_leak_one_wb & dec_tlu_flush_lower_wb) | (leak_one_f_d1 & ~dec_tlu_flush_lower_wb); + + + rvdff #(4) coll_ff (.*, .clk(active_clk), + .din({exu_flush_final, exu_mp_way, dec_tlu_way_wb, leak_one_f}), + .dout({exu_flush_final_d1, exu_mp_way_f, dec_tlu_way_wb_f, leak_one_f_d1})); + + // 2 -way SA, figure out the way hit and mux accordingly + assign tag_match_way0_f = btb_bank0_rd_data_way0_f[BV] & (btb_bank0_rd_data_way0_f[TAG_START:17] == fetch_rd_tag_f[pt.BTB_BTAG_SIZE-1:0]) & + ~(dec_tlu_way_wb_f & branch_error_bank_conflict_f) & ifc_fetch_req_f & ~leak_one_f; + + assign tag_match_way1_f = btb_bank0_rd_data_way1_f[BV] & (btb_bank0_rd_data_way1_f[TAG_START:17] == fetch_rd_tag_f[pt.BTB_BTAG_SIZE-1:0]) & + ~(dec_tlu_way_wb_f & branch_error_bank_conflict_f) & ifc_fetch_req_f & ~leak_one_f; + + assign tag_match_way0_p1_f = btb_bank0_rd_data_way0_p1_f[BV] & (btb_bank0_rd_data_way0_p1_f[TAG_START:17] == fetch_rd_tag_p1_f[pt.BTB_BTAG_SIZE-1:0]) & + ~(dec_tlu_way_wb_f & branch_error_bank_conflict_p1_f) & ifc_fetch_req_f & ~leak_one_f; + + assign tag_match_way1_p1_f = btb_bank0_rd_data_way1_p1_f[BV] & (btb_bank0_rd_data_way1_p1_f[TAG_START:17] == fetch_rd_tag_p1_f[pt.BTB_BTAG_SIZE-1:0]) & + ~(dec_tlu_way_wb_f & branch_error_bank_conflict_p1_f) & ifc_fetch_req_f & ~leak_one_f; + + + // Both ways could hit, use the offset bit to reorder + + assign tag_match_way0_expanded_f[1:0] = {tag_match_way0_f & (btb_bank0_rd_data_way0_f[BOFF] ^ btb_bank0_rd_data_way0_f[PC4]), + tag_match_way0_f & ~(btb_bank0_rd_data_way0_f[BOFF] ^ btb_bank0_rd_data_way0_f[PC4])}; + + assign tag_match_way1_expanded_f[1:0] = {tag_match_way1_f & (btb_bank0_rd_data_way1_f[BOFF] ^ btb_bank0_rd_data_way1_f[PC4]), + tag_match_way1_f & ~(btb_bank0_rd_data_way1_f[BOFF] ^ btb_bank0_rd_data_way1_f[PC4])}; + + assign tag_match_way0_expanded_p1_f[1:0] = {tag_match_way0_p1_f & (btb_bank0_rd_data_way0_p1_f[BOFF] ^ btb_bank0_rd_data_way0_p1_f[PC4]), + tag_match_way0_p1_f & ~(btb_bank0_rd_data_way0_p1_f[BOFF] ^ btb_bank0_rd_data_way0_p1_f[PC4])}; + + assign tag_match_way1_expanded_p1_f[1:0] = {tag_match_way1_p1_f & (btb_bank0_rd_data_way1_p1_f[BOFF] ^ btb_bank0_rd_data_way1_p1_f[PC4]), + tag_match_way1_p1_f & ~(btb_bank0_rd_data_way1_p1_f[BOFF] ^ btb_bank0_rd_data_way1_p1_f[PC4])}; + + assign wayhit_f[1:0] = tag_match_way0_expanded_f[1:0] | tag_match_way1_expanded_f[1:0]; + assign wayhit_p1_f[1:0] = tag_match_way0_expanded_p1_f[1:0] | tag_match_way1_expanded_p1_f[1:0]; + + assign btb_bank0o_rd_data_f[16+pt.BTB_BTAG_SIZE:0] = ( ({17+pt.BTB_BTAG_SIZE{tag_match_way0_expanded_f[1]}} & btb_bank0_rd_data_way0_f[16+pt.BTB_BTAG_SIZE:0]) | + ({17+pt.BTB_BTAG_SIZE{tag_match_way1_expanded_f[1]}} & btb_bank0_rd_data_way1_f[16+pt.BTB_BTAG_SIZE:0]) ); + assign btb_bank0e_rd_data_f[16+pt.BTB_BTAG_SIZE:0] = ( ({17+pt.BTB_BTAG_SIZE{tag_match_way0_expanded_f[0]}} & btb_bank0_rd_data_way0_f[16+pt.BTB_BTAG_SIZE:0]) | + ({17+pt.BTB_BTAG_SIZE{tag_match_way1_expanded_f[0]}} & btb_bank0_rd_data_way1_f[16+pt.BTB_BTAG_SIZE:0]) ); + + assign btb_bank0e_rd_data_p1_f[16+pt.BTB_BTAG_SIZE:0] = ( ({17+pt.BTB_BTAG_SIZE{tag_match_way0_expanded_p1_f[0]}} & btb_bank0_rd_data_way0_p1_f[16+pt.BTB_BTAG_SIZE:0]) | + ({17+pt.BTB_BTAG_SIZE{tag_match_way1_expanded_p1_f[0]}} & btb_bank0_rd_data_way1_p1_f[16+pt.BTB_BTAG_SIZE:0]) ); + + // virtual bank order + + assign btb_vbank0_rd_data_f[16+pt.BTB_BTAG_SIZE:0] = ( ({17+pt.BTB_BTAG_SIZE{fetch_start_f[0]}} & btb_bank0e_rd_data_f[16+pt.BTB_BTAG_SIZE:0]) | + ({17+pt.BTB_BTAG_SIZE{fetch_start_f[1]}} & btb_bank0o_rd_data_f[16+pt.BTB_BTAG_SIZE:0]) ); + assign btb_vbank1_rd_data_f[16+pt.BTB_BTAG_SIZE:0] = ( ({17+pt.BTB_BTAG_SIZE{fetch_start_f[0]}} & btb_bank0o_rd_data_f[16+pt.BTB_BTAG_SIZE:0]) | + ({17+pt.BTB_BTAG_SIZE{fetch_start_f[1]}} & btb_bank0e_rd_data_p1_f[16+pt.BTB_BTAG_SIZE:0]) ); + + + // -------------------------------------------------------------------------------- + // -------------------------------------------------------------------------------- + // update lru + // mp + + // create a onehot lru write vector + assign mp_wrindex_dec[LRU_SIZE-1:0] = {{LRU_SIZE-1{1'b0}},1'b1} << exu_mp_addr[pt.BTB_ADDR_HI:pt.BTB_ADDR_LO]; + + // fetch + assign fetch_wrindex_dec[LRU_SIZE-1:0] = {{LRU_SIZE-1{1'b0}},1'b1} << btb_rd_addr_f[pt.BTB_ADDR_HI:pt.BTB_ADDR_LO]; + assign fetch_wrindex_p1_dec[LRU_SIZE-1:0] = {{LRU_SIZE-1{1'b0}},1'b1} << btb_rd_addr_p1_f[pt.BTB_ADDR_HI:pt.BTB_ADDR_LO]; + + assign mp_wrlru_b0[LRU_SIZE-1:0] = mp_wrindex_dec[LRU_SIZE-1:0] & {LRU_SIZE{exu_mp_valid}}; + + genvar j, i; + + + assign lru_update_valid_f = (vwayhit_f[0] | vwayhit_f[1]) & ifc_fetch_req_f & ~leak_one_f; + + + assign fetch_wrlru_b0[LRU_SIZE-1:0] = fetch_wrindex_dec[LRU_SIZE-1:0] & + {LRU_SIZE{lru_update_valid_f}}; + assign fetch_wrlru_p1_b0[LRU_SIZE-1:0] = fetch_wrindex_p1_dec[LRU_SIZE-1:0] & + {LRU_SIZE{lru_update_valid_f}}; + + assign btb_lru_b0_hold[LRU_SIZE-1:0] = ~mp_wrlru_b0[LRU_SIZE-1:0] & ~fetch_wrlru_b0[LRU_SIZE-1:0]; + + // Forward the mp lru information to the fetch, avoids multiple way hits later + assign use_mp_way = fetch_mp_collision_f; + assign use_mp_way_p1 = fetch_mp_collision_p1_f; + + + assign btb_lru_b0_ns[LRU_SIZE-1:0] = ( (btb_lru_b0_hold[LRU_SIZE-1:0] & btb_lru_b0_f[LRU_SIZE-1:0]) | + (mp_wrlru_b0[LRU_SIZE-1:0] & {LRU_SIZE{~exu_mp_way}}) | + (fetch_wrlru_b0[LRU_SIZE-1:0] & {LRU_SIZE{tag_match_way0_f}}) | + (fetch_wrlru_p1_b0[LRU_SIZE-1:0] & {LRU_SIZE{tag_match_way0_p1_f}}) ); + + assign btb_lru_rd_f = use_mp_way ? exu_mp_way_f : |(fetch_wrindex_dec[LRU_SIZE-1:0] & btb_lru_b0_f[LRU_SIZE-1:0]); + + assign btb_lru_rd_p1_f = use_mp_way_p1 ? exu_mp_way_f : |(fetch_wrindex_p1_dec[LRU_SIZE-1:0] & btb_lru_b0_f[LRU_SIZE-1:0]); + + // rotated + assign btb_vlru_rd_f[1:0] = ( ({2{fetch_start_f[0]}} & {btb_lru_rd_f, btb_lru_rd_f}) | + ({2{fetch_start_f[1]}} & {btb_lru_rd_p1_f, btb_lru_rd_f})); + + assign tag_match_vway1_expanded_f[1:0] = ( ({2{fetch_start_f[0]}} & {tag_match_way1_expanded_f[1:0]}) | + ({2{fetch_start_f[1]}} & {tag_match_way1_expanded_p1_f[0], tag_match_way1_expanded_f[1]}) ); + + assign way_raw[1:0] = tag_match_vway1_expanded_f[1:0] | (~vwayhit_f[1:0] & btb_vlru_rd_f[1:0]); + + rvdffe #(LRU_SIZE) btb_lru_ff (.*, .en(ifc_fetch_req_f | exu_mp_valid), + .din(btb_lru_b0_ns[(LRU_SIZE)-1:0]), + .dout(btb_lru_b0_f[(LRU_SIZE)-1:0])); + + // Detect end of cache line and mask as needed + logic eoc_near; + logic eoc_mask; + assign eoc_near = &ifc_fetch_addr_f[pt.ICACHE_BEAT_ADDR_HI:3]; + assign eoc_mask = ~eoc_near| (|(~ifc_fetch_addr_f[2:1])); + + + assign vwayhit_f[1:0] = ( ({2{fetch_start_f[0]}} & {wayhit_f[1:0]}) | + ({2{fetch_start_f[1]}} & {wayhit_p1_f[0], wayhit_f[1]})) & {eoc_mask, 1'b1}; + + // -------------------------------------------------------------------------------- + // -------------------------------------------------------------------------------- + + // mux out critical hit bank for pc computation + // This is only useful for the first taken branch in the fetch group + logic [16:1] btb_sel_data_f; + + assign btb_rd_tgt_f[11:0] = btb_sel_data_f[16:5]; + assign btb_rd_pc4_f = btb_sel_data_f[4]; + assign btb_rd_call_f = btb_sel_data_f[2]; + assign btb_rd_ret_f = btb_sel_data_f[1]; + + assign btb_sel_data_f[16:1] = ( ({16{btb_sel_f[1]}} & btb_vbank1_rd_data_f[16:1]) | + ({16{btb_sel_f[0]}} & btb_vbank0_rd_data_f[16:1]) ); + + + logic [1:0] hist0_raw, hist1_raw, pc4_raw, pret_raw; + + // a valid taken target needs to kill the next fetch as we compute the target address + assign ifu_bp_hit_taken_f = |(vwayhit_f[1:0] & hist1_raw[1:0]) & ifc_fetch_req_f & ~leak_one_f_d1 & ~dec_tlu_bpred_disable; + + + // Don't put calls/rets/ja in the predictor, force the bht taken instead + assign bht_force_taken_f[1:0] = {(btb_vbank1_rd_data_f[CALL] | btb_vbank1_rd_data_f[RET]), + (btb_vbank0_rd_data_f[CALL] | btb_vbank0_rd_data_f[RET])}; + + + // taken and valid, otherwise, branch errors must clear the bht + assign bht_valid_f[1:0] = vwayhit_f[1:0]; + + assign bht_vbank0_rd_data_f[1:0] = ( ({2{fetch_start_f[0]}} & bht_bank0_rd_data_f[1:0]) | + ({2{fetch_start_f[1]}} & bht_bank1_rd_data_f[1:0]) ); + + assign bht_vbank1_rd_data_f[1:0] = ( ({2{fetch_start_f[0]}} & bht_bank1_rd_data_f[1:0]) | + ({2{fetch_start_f[1]}} & bht_bank0_rd_data_p1_f[1:0]) ); + + + assign bht_dir_f[1:0] = {(bht_force_taken_f[1] | bht_vbank1_rd_data_f[1]) & bht_valid_f[1], + (bht_force_taken_f[0] | bht_vbank0_rd_data_f[1]) & bht_valid_f[0]}; + + assign ifu_bp_inst_mask_f = (ifu_bp_hit_taken_f & btb_sel_f[1]) | ~ifu_bp_hit_taken_f; + + + + + // Branch prediction info is sent with the 2byte lane associated with the end of the branch. + // Cases + // BANK1 BANK0 + // ------------------------------- + // | : | : | + // ------------------------------- + // <------------> : PC4 branch, offset, should be in B1 (indicated on [2]) + // <------------> : PC4 branch, no offset, indicate PC4, VALID, HIST on [1] + // <------------> : PC4 branch, offset, indicate PC4, VALID, HIST on [0] + // <------> : PC2 branch, offset, indicate VALID, HIST on [1] + // <------> : PC2 branch, no offset, indicate VALID, HIST on [0] + // + + + + assign hist1_raw[1:0] = bht_force_taken_f[1:0] | {bht_vbank1_rd_data_f[1], + bht_vbank0_rd_data_f[1]}; + + assign hist0_raw[1:0] = {bht_vbank1_rd_data_f[0], + bht_vbank0_rd_data_f[0]}; + + + assign pc4_raw[1:0] = {vwayhit_f[1] & btb_vbank1_rd_data_f[PC4], + vwayhit_f[0] & btb_vbank0_rd_data_f[PC4]}; + + assign pret_raw[1:0] = {vwayhit_f[1] & ~btb_vbank1_rd_data_f[CALL] & btb_vbank1_rd_data_f[RET], + vwayhit_f[0] & ~btb_vbank0_rd_data_f[CALL] & btb_vbank0_rd_data_f[RET]}; + + // GHR + + + // count the valids with masking based on first taken + assign num_valids[1:0] = countones(bht_valid_f[1:0]); + + // Note that the following property holds + // P: prior ghr, H: history bit of last valid branch in line (could be 1 or 0) + // Num valid branches What new GHR must be + // 2 0H + // 1 PH + // 0 PP + + assign final_h = |(btb_sel_f[1:0] & bht_dir_f[1:0]); + + assign merged_ghr[pt.BHT_GHR_SIZE-1:0] = ( + ({pt.BHT_GHR_SIZE{num_valids[1:0] == 2'h2}} & {fghr[pt.BHT_GHR_SIZE-3:0], 1'b0, final_h}) | // 0H + ({pt.BHT_GHR_SIZE{num_valids[1:0] == 2'h1}} & {fghr[pt.BHT_GHR_SIZE-2:0], final_h}) | // PH + ({pt.BHT_GHR_SIZE{num_valids[1:0] == 2'h0}} & {fghr[pt.BHT_GHR_SIZE-1:0]}) ); // PP + + logic [pt.BHT_GHR_SIZE-1:0] exu_flush_ghr; + assign exu_flush_ghr[pt.BHT_GHR_SIZE-1:0] = exu_mp_fghr[pt.BHT_GHR_SIZE-1:0]; + + assign fghr_ns[pt.BHT_GHR_SIZE-1:0] = ( ({pt.BHT_GHR_SIZE{exu_flush_final_d1}} & exu_flush_ghr[pt.BHT_GHR_SIZE-1:0]) | + ({pt.BHT_GHR_SIZE{~exu_flush_final_d1 & ifc_fetch_req_f & ic_hit_f & ~leak_one_f_d1}} & merged_ghr[pt.BHT_GHR_SIZE-1:0]) | + ({pt.BHT_GHR_SIZE{~exu_flush_final_d1 & ~(ifc_fetch_req_f & ic_hit_f & ~leak_one_f_d1)}} & fghr[pt.BHT_GHR_SIZE-1:0])); + + rvdff #(pt.BHT_GHR_SIZE) fetchghr (.*, .clk(active_clk), .din(fghr_ns[pt.BHT_GHR_SIZE-1:0]), .dout(fghr[pt.BHT_GHR_SIZE-1:0])); + assign ifu_bp_fghr_f[pt.BHT_GHR_SIZE-1:0] = fghr[pt.BHT_GHR_SIZE-1:0]; + + + assign ifu_bp_way_f[1:0] = way_raw[1:0]; + assign ifu_bp_hist1_f[1:0] = hist1_raw[1:0]; + assign ifu_bp_hist0_f[1:0] = hist0_raw[1:0]; + assign ifu_bp_pc4_f[1:0] = pc4_raw[1:0]; + + assign ifu_bp_valid_f[1:0] = vwayhit_f[1:0] & ~{2{dec_tlu_bpred_disable}}; + assign ifu_bp_ret_f[1:0] = pret_raw[1:0]; + + + // compute target + // Form the fetch group offset based on the btb hit location and the location of the branch within the 4 byte chunk + +// .i 5 +// .o 3 +// .ilb bht_dir_f[1] bht_dir_f[0] fetch_start_f[1] fetch_start_f[0] btb_rd_pc4_f +// .ob bloc_f[1] bloc_f[0] use_fa_plus +// .type fr +// +// +// ## rotdir[1:0] fs pc4 off fapl +// -1 01 - 01 0 +// 10 01 - 10 0 +// +// -1 10 - 10 0 +// 10 10 0 01 1 +// 10 10 1 01 0 +logic [1:0] bloc_f; +logic use_fa_plus; +assign bloc_f[1] = (bht_dir_f[0] & ~fetch_start_f[0]) | (~bht_dir_f[0] + & fetch_start_f[0]); +assign bloc_f[0] = (bht_dir_f[0] & fetch_start_f[0]) | (~bht_dir_f[0] + & ~fetch_start_f[0]); +assign use_fa_plus = (~bht_dir_f[0] & ~fetch_start_f[0] & ~btb_rd_pc4_f); + + + + + assign btb_fg_crossing_f = fetch_start_f[0] & btb_sel_f[0] & btb_rd_pc4_f; + + assign bp_total_branch_offset_f = bloc_f[1] ^ btb_rd_pc4_f; + + logic [31:2] adder_pc_in_f, ifc_fetch_adder_prior; + rvdffe #(30) faddrf_ff (.*, .en(ifc_fetch_req_f & ~ifu_bp_hit_taken_f & ic_hit_f), .din(ifc_fetch_addr_f[31:2]), .dout(ifc_fetch_adder_prior[31:2])); + + assign ifu_bp_poffset_f[11:0] = btb_rd_tgt_f[11:0]; + + assign adder_pc_in_f[31:2] = ( ({30{ use_fa_plus}} & fetch_addr_p1_f[31:2]) | + ({30{ btb_fg_crossing_f}} & ifc_fetch_adder_prior[31:2]) | + ({30{~btb_fg_crossing_f & ~use_fa_plus}} & ifc_fetch_addr_f[31:2])); + + rvbradder predtgt_addr (.pc({adder_pc_in_f[31:2], bp_total_branch_offset_f}), + .offset(btb_rd_tgt_f[11:0]), + .dout(bp_btb_target_adder_f[31:1]) + ); + // mux in the return stack address here for a predicted return assuming the RS is valid + assign ifu_bp_btb_target_f[31:1] = (btb_rd_ret_f & ~btb_rd_call_f & rets_out[0][0]) ? rets_out[0][31:1] : bp_btb_target_adder_f[31:1]; + + + // ---------------------------------------------------------------------- + // Return Stack + // ---------------------------------------------------------------------- + + rvbradder rs_addr (.pc({adder_pc_in_f[31:2], bp_total_branch_offset_f}), + .offset({11'b0, ~btb_rd_pc4_f}), + .dout(bp_rs_call_target_f[31:1]) + ); + + assign rs_push = (btb_rd_call_f & ~btb_rd_ret_f & ifu_bp_hit_taken_f); + assign rs_pop = (btb_rd_ret_f & ~btb_rd_call_f & ifu_bp_hit_taken_f); + assign rs_hold = ~rs_push & ~rs_pop; + + + + // Fetch based (bit 0 is a valid) + assign rets_in[0][31:0] = ( ({32{rs_push}} & {bp_rs_call_target_f[31:1], 1'b1}) | // target[31:1], valid + ({32{rs_pop}} & rets_out[1][31:0]) ); + + assign rsenable[0] = ~rs_hold; + + for (i=0; i<32'(pt.RET_STACK_SIZE); i++) begin : retstack + + // for the last entry in the stack, we don't have a pop position + if(i==pt.RET_STACK_SIZE-1) begin + assign rets_in[i][31:0] = rets_out[i-1][31:0]; + assign rsenable[i] = rs_push; + end + else if(i>0) begin + assign rets_in[i][31:0] = ( ({32{rs_push}} & rets_out[i-1][31:0]) | + ({32{rs_pop}} & rets_out[i+1][31:0]) ); + assign rsenable[i] = rs_push | rs_pop; + end + rvdffe #(32) rets_ff (.*, .en(rsenable[i]), .din(rets_in[i][31:0]), .dout(rets_out[i][31:0])); + + end : retstack + + // ---------------------------------------------------------------------- + // WRITE + // ---------------------------------------------------------------------- + + + assign dec_tlu_error_wb = dec_tlu_br0_start_error_wb | dec_tlu_br0_error_wb; + + assign btb_error_addr_wb[pt.BTB_ADDR_HI:pt.BTB_ADDR_LO] = dec_tlu_br0_addr_wb[pt.BTB_ADDR_HI:pt.BTB_ADDR_LO]; + + assign dec_tlu_way_wb = dec_tlu_br0_way_wb; + + assign btb_valid = exu_mp_valid & ~dec_tlu_error_wb; + + assign btb_wr_tag[pt.BTB_BTAG_SIZE-1:0] = exu_mp_btag[pt.BTB_BTAG_SIZE-1:0]; + +if(pt.BTB_BTAG_FOLD) begin : btbfold + el2_btb_tag_hash_fold #(.pt(pt)) rdtagf (.hash(fetch_rd_tag_f[pt.BTB_BTAG_SIZE-1:0]), .pc({ifc_fetch_addr_f[pt.BTB_ADDR_HI+pt.BTB_BTAG_SIZE+pt.BTB_BTAG_SIZE:pt.BTB_ADDR_HI+1]})); + el2_btb_tag_hash_fold #(.pt(pt)) rdtagp1f(.hash(fetch_rd_tag_p1_f[pt.BTB_BTAG_SIZE-1:0]), .pc({fetch_addr_p1_f[ pt.BTB_ADDR_HI+pt.BTB_BTAG_SIZE+pt.BTB_BTAG_SIZE:pt.BTB_ADDR_HI+1]})); +end +else begin + el2_btb_tag_hash #(.pt(pt)) rdtagf(.hash(fetch_rd_tag_f[pt.BTB_BTAG_SIZE-1:0]), .pc({ifc_fetch_addr_f[pt.BTB_ADDR_HI+pt.BTB_BTAG_SIZE+pt.BTB_BTAG_SIZE+pt.BTB_BTAG_SIZE:pt.BTB_ADDR_HI+1]})); + el2_btb_tag_hash #(.pt(pt)) rdtagp1f(.hash(fetch_rd_tag_p1_f[pt.BTB_BTAG_SIZE-1:0]), .pc({fetch_addr_p1_f[pt.BTB_ADDR_HI+pt.BTB_BTAG_SIZE+pt.BTB_BTAG_SIZE+pt.BTB_BTAG_SIZE:pt.BTB_ADDR_HI+1]})); +end + + assign btb_wr_data[16+pt.BTB_BTAG_SIZE:0] = {btb_wr_tag[pt.BTB_BTAG_SIZE-1:0], exu_mp_tgt[11:0], exu_mp_pc4, exu_mp_boffset, exu_mp_call | exu_mp_ja, exu_mp_ret | exu_mp_ja, btb_valid} ; + + assign exu_mp_valid_write = exu_mp_valid & exu_mp_ataken; + assign btb_wr_en_way0 = ( ({{~exu_mp_way & exu_mp_valid_write & ~dec_tlu_error_wb}}) | + ({{~dec_tlu_way_wb & dec_tlu_error_wb}})); + + assign btb_wr_en_way1 = ( ({{exu_mp_way & exu_mp_valid_write & ~dec_tlu_error_wb}}) | + ({{dec_tlu_way_wb & dec_tlu_error_wb}})); + assign btb_wr_addr[pt.BTB_ADDR_HI:pt.BTB_ADDR_LO] = dec_tlu_error_wb ? btb_error_addr_wb[pt.BTB_ADDR_HI:pt.BTB_ADDR_LO] : exu_mp_addr[pt.BTB_ADDR_HI:pt.BTB_ADDR_LO]; + + logic [1:0] bht_wr_data0, bht_wr_data2; + logic [1:0] bht_wr_en0, bht_wr_en2; + + assign middle_of_bank = exu_mp_pc4 ^ exu_mp_boffset; + assign bht_wr_en0[1:0] = {2{exu_mp_valid & ~exu_mp_call & ~exu_mp_ret & ~exu_mp_ja}} & {middle_of_bank, ~middle_of_bank}; + assign bht_wr_en2[1:0] = {2{dec_tlu_br0_v_wb}} & {dec_tlu_br0_middle_wb, ~dec_tlu_br0_middle_wb} ; + + // Experiments show this is the best priority scheme for same bank/index writes at the same time. + assign bht_wr_data0[1:0] = exu_mp_hist[1:0]; // lowest priority + assign bht_wr_data2[1:0] = dec_tlu_br0_hist_wb[1:0]; // highest priority + + + + logic [pt.BHT_ADDR_HI:pt.BHT_ADDR_LO] bht_rd_addr_f, bht_rd_addr_p1_f, bht_wr_addr0, bht_wr_addr2; + + logic [pt.BHT_ADDR_HI:pt.BHT_ADDR_LO] mp_hashed, br0_hashed_wb, bht_rd_addr_hashed_f, bht_rd_addr_hashed_p1_f; + el2_btb_ghr_hash #(.pt(pt)) mpghrhs (.hashin(exu_mp_addr[pt.BTB_ADDR_HI:pt.BTB_ADDR_LO]), .ghr(exu_mp_eghr[pt.BHT_GHR_SIZE-1:0]), .hash(mp_hashed[pt.BHT_ADDR_HI:pt.BHT_ADDR_LO])); + el2_btb_ghr_hash #(.pt(pt)) br0ghrhs (.hashin(dec_tlu_br0_addr_wb[pt.BTB_ADDR_HI:pt.BTB_ADDR_LO]), .ghr(exu_i0_br_fghr_wb[pt.BHT_GHR_SIZE-1:0]), .hash(br0_hashed_wb[pt.BHT_ADDR_HI:pt.BHT_ADDR_LO])); + el2_btb_ghr_hash #(.pt(pt)) fghrhs (.hashin(btb_rd_addr_f[pt.BTB_ADDR_HI:pt.BTB_ADDR_LO]), .ghr(fghr[pt.BHT_GHR_SIZE-1:0]), .hash(bht_rd_addr_hashed_f[pt.BHT_ADDR_HI:pt.BHT_ADDR_LO])); + el2_btb_ghr_hash #(.pt(pt)) fghrhs_p1 (.hashin(btb_rd_addr_p1_f[pt.BTB_ADDR_HI:pt.BTB_ADDR_LO]), .ghr(fghr[pt.BHT_GHR_SIZE-1:0]), .hash(bht_rd_addr_hashed_p1_f[pt.BHT_ADDR_HI:pt.BHT_ADDR_LO])); + + assign bht_wr_addr0[pt.BHT_ADDR_HI:pt.BHT_ADDR_LO] = mp_hashed[pt.BHT_ADDR_HI:pt.BHT_ADDR_LO]; + assign bht_wr_addr2[pt.BHT_ADDR_HI:pt.BHT_ADDR_LO] = br0_hashed_wb[pt.BHT_ADDR_HI:pt.BHT_ADDR_LO]; + assign bht_rd_addr_f[pt.BHT_ADDR_HI:pt.BHT_ADDR_LO] = bht_rd_addr_hashed_f[pt.BHT_ADDR_HI:pt.BHT_ADDR_LO]; + assign bht_rd_addr_p1_f[pt.BHT_ADDR_HI:pt.BHT_ADDR_LO] = bht_rd_addr_hashed_p1_f[pt.BHT_ADDR_HI:pt.BHT_ADDR_LO]; + + + // ---------------------------------------------------------------------- + // Structures. Using FLOPS + // ---------------------------------------------------------------------- + // BTB + // Entry -> tag[pt.BTB_BTAG_SIZE-1:0], toffset[11:0], pc4, boffset, call, ret, valid + + + for (j=0 ; j<32'(LRU_SIZE) ; j++) begin : BTB_FLOPS + // Way 0 + rvdffe #(17+pt.BTB_BTAG_SIZE) btb_bank0_way0 (.*, + .en(((btb_wr_addr[pt.BTB_ADDR_HI:pt.BTB_ADDR_LO] == j) & btb_wr_en_way0)), + .din (btb_wr_data[16+pt.BTB_BTAG_SIZE:0]), + .dout (btb_bank0_rd_data_way0_out[j])); + + // Way 1 + rvdffe #(17+pt.BTB_BTAG_SIZE) btb_bank0_way1 (.*, + .en(((btb_wr_addr[pt.BTB_ADDR_HI:pt.BTB_ADDR_LO] == j) & btb_wr_en_way1)), + .din (btb_wr_data[16+pt.BTB_BTAG_SIZE:0]), + .dout (btb_bank0_rd_data_way1_out[j])); + + end + + + always_comb begin : BTB_rd_mux + btb_bank0_rd_data_way0_f[16+pt.BTB_BTAG_SIZE:0] = '0 ; + btb_bank0_rd_data_way1_f[16+pt.BTB_BTAG_SIZE:0] = '0 ; + btb_bank0_rd_data_way0_p1_f[16+pt.BTB_BTAG_SIZE:0] = '0 ; + btb_bank0_rd_data_way1_p1_f[16+pt.BTB_BTAG_SIZE:0] = '0 ; + + for (int j=0; j< LRU_SIZE; j++) begin + if (btb_rd_addr_f[pt.BTB_ADDR_HI:pt.BTB_ADDR_LO] == (pt.BTB_ADDR_HI-pt.BTB_ADDR_LO+1)'(j)) begin + + btb_bank0_rd_data_way0_f[16+pt.BTB_BTAG_SIZE:0] = btb_bank0_rd_data_way0_out[j]; + btb_bank0_rd_data_way1_f[16+pt.BTB_BTAG_SIZE:0] = btb_bank0_rd_data_way1_out[j]; + + end + end + for (int j=0; j< LRU_SIZE; j++) begin + if (btb_rd_addr_p1_f[pt.BTB_ADDR_HI:pt.BTB_ADDR_LO] == (pt.BTB_ADDR_HI-pt.BTB_ADDR_LO+1)'(j)) begin + + btb_bank0_rd_data_way0_p1_f[16+pt.BTB_BTAG_SIZE:0] = btb_bank0_rd_data_way0_out[j]; + btb_bank0_rd_data_way1_p1_f[16+pt.BTB_BTAG_SIZE:0] = btb_bank0_rd_data_way1_out[j]; + + end + end + end + + //----------------------------------------------------------------------------- + // BHT + // 2 bit Entry -> direction, strength + // + //----------------------------------------------------------------------------- + + logic [1:0] [(pt.BHT_ARRAY_DEPTH/NUM_BHT_LOOP)-1:0][NUM_BHT_LOOP-1:0][1:0] bht_bank_wr_data ; + logic [1:0] [pt.BHT_ARRAY_DEPTH-1:0] [1:0] bht_bank_rd_data_out ; + logic [1:0] [(pt.BHT_ARRAY_DEPTH/NUM_BHT_LOOP)-1:0] bht_bank_clken ; + logic [1:0] [(pt.BHT_ARRAY_DEPTH/NUM_BHT_LOOP)-1:0] bht_bank_clk ; + logic [1:0] [(pt.BHT_ARRAY_DEPTH/NUM_BHT_LOOP)-1:0][NUM_BHT_LOOP-1:0] bht_bank_sel ; + + for ( i=0; i<2; i++) begin : BANKS + for (genvar k=0 ; k < 32'((pt.BHT_ARRAY_DEPTH)/NUM_BHT_LOOP) ; k++) begin : BHT_CLK_GROUP + assign bht_bank_clken[i][k] = (bht_wr_en0[i] & ((bht_wr_addr0[pt.BHT_ADDR_HI: NUM_BHT_LOOP_OUTER_LO]==k) | BHT_NO_ADDR_MATCH)) | + (bht_wr_en2[i] & ((bht_wr_addr2[pt.BHT_ADDR_HI: NUM_BHT_LOOP_OUTER_LO]==k) | BHT_NO_ADDR_MATCH)); + + rvclkhdr bht_bank_grp_cgc ( .en(bht_bank_clken[i][k]), .l1clk(bht_bank_clk[i][k]), .* ); + + for (j=0 ; j cdecode.e + +// 2) espresso -Dso -oeqntott cdecode.e | addassign > compress_equations + +// to generate the legal (16b compressed instruction is legal) equation below: + +// 1) coredecode -in cdecode -legal > clegal.e + +// 2) espresso -Dso -oeqntott clegal.e | addassign > clegal_equation + + + + + +// espresso decodes +assign rdrd = (!i[14]&i[6]&i[1]) | (!i[15]&i[14]&i[11]&i[0]) | (!i[14]&i[5]&i[1]) | ( + !i[15]&i[14]&i[10]&i[0]) | (!i[14]&i[4]&i[1]) | (!i[15]&i[14]&i[9] + &i[0]) | (!i[14]&i[3]&i[1]) | (!i[15]&i[14]&!i[8]&i[0]) | (!i[14] + &i[2]&i[1]) | (!i[15]&i[14]&i[7]&i[0]) | (!i[15]&i[1]) | (!i[15] + &!i[13]&i[0]); + +assign rdrs1 = (!i[14]&i[12]&i[11]&i[1]) | (!i[14]&i[12]&i[10]&i[1]) | (!i[14] + &i[12]&i[9]&i[1]) | (!i[14]&i[12]&i[8]&i[1]) | (!i[14]&i[12]&i[7] + &i[1]) | (!i[14]&!i[12]&!i[6]&!i[5]&!i[4]&!i[3]&!i[2]&i[1]) | (!i[14] + &i[12]&i[6]&i[1]) | (!i[14]&i[12]&i[5]&i[1]) | (!i[14]&i[12]&i[4] + &i[1]) | (!i[14]&i[12]&i[3]&i[1]) | (!i[14]&i[12]&i[2]&i[1]) | ( + !i[15]&!i[14]&!i[13]&i[0]) | (!i[15]&!i[14]&i[1]); + +assign rs2rs2 = (i[15]&i[6]&i[1]) | (i[15]&i[5]&i[1]) | (i[15]&i[4]&i[1]) | ( + i[15]&i[3]&i[1]) | (i[15]&i[2]&i[1]) | (i[15]&i[14]&i[1]); + +assign rdprd = (i[15]&!i[14]&!i[13]&i[0]); + +assign rdprs1 = (i[15]&!i[13]&i[0]) | (i[15]&i[14]&i[0]) | (i[14]&!i[1]&!i[0]); + +assign rs2prs2 = (i[15]&!i[14]&!i[13]&i[11]&i[10]&i[0]) | (i[15]&!i[1]&!i[0]); + +assign rs2prd = (!i[15]&!i[1]&!i[0]); + +assign uimm9_2 = (!i[14]&!i[1]&!i[0]); + +assign ulwimm6_2 = (!i[15]&i[14]&!i[1]&!i[0]); + +assign ulwspimm7_2 = (!i[15]&i[14]&i[1]); + +assign rdeq2 = (!i[15]&i[14]&i[13]&!i[11]&!i[10]&!i[9]&i[8]&!i[7]); + +assign rdeq1 = (!i[14]&i[12]&i[11]&!i[6]&!i[5]&!i[4]&!i[3]&!i[2]&i[1]) | (!i[14] + &i[12]&i[10]&!i[6]&!i[5]&!i[4]&!i[3]&!i[2]&i[1]) | (!i[14]&i[12]&i[9] + &!i[6]&!i[5]&!i[4]&!i[3]&!i[2]&i[1]) | (!i[14]&i[12]&i[8]&!i[6]&!i[5] + &!i[4]&!i[3]&!i[2]&i[1]) | (!i[14]&i[12]&i[7]&!i[6]&!i[5]&!i[4]&!i[3] + &!i[2]&i[1]) | (!i[15]&!i[14]&i[13]); + +assign rs1eq2 = (!i[15]&i[14]&i[13]&!i[11]&!i[10]&!i[9]&i[8]&!i[7]) | (i[14] + &i[1]) | (!i[14]&!i[1]&!i[0]); + +assign sbroffset8_1 = (i[15]&i[14]&i[0]); + +assign simm9_4 = (!i[15]&i[14]&i[13]&!i[11]&!i[10]&!i[9]&i[8]&!i[7]); + +assign simm5_0 = (!i[14]&!i[13]&i[11]&!i[10]&i[0]) | (!i[15]&!i[13]&i[0]); + +assign sjaloffset11_1 = (!i[14]&i[13]); + +assign sluimm17_12 = (!i[15]&i[14]&i[13]&i[7]) | (!i[15]&i[14]&i[13]&!i[8]) | ( + !i[15]&i[14]&i[13]&i[9]) | (!i[15]&i[14]&i[13]&i[10]) | (!i[15]&i[14] + &i[13]&i[11]); + +assign uimm5_0 = (i[15]&!i[14]&!i[13]&!i[11]&i[0]) | (!i[15]&!i[14]&i[1]); + +assign uswimm6_2 = (i[15]&!i[1]&!i[0]); + +assign uswspimm7_2 = (i[15]&i[14]&i[1]); + +assign o[31] = 1'b0; + +assign o[30] = (i[15]&!i[14]&!i[13]&i[10]&!i[6]&!i[5]&i[0]) | (i[15]&!i[14] + &!i[13]&!i[11]&i[10]&i[0]); + +assign o[29] = 1'b0; + +assign o[28] = 1'b0; + +assign o[27] = 1'b0; + +assign o[26] = 1'b0; + +assign o[25] = 1'b0; + +assign o[24] = 1'b0; + +assign o[23] = 1'b0; + +assign o[22] = 1'b0; + +assign o[21] = 1'b0; + +assign o[20] = (!i[14]&i[12]&!i[11]&!i[10]&!i[9]&!i[8]&!i[7]&!i[6]&!i[5]&!i[4] + &!i[3]&!i[2]&i[1]); + +assign o[19] = 1'b0; + +assign o[18] = 1'b0; + +assign o[17] = 1'b0; + +assign o[16] = 1'b0; + +assign o[15] = 1'b0; + +assign o[14] = (i[15]&!i[14]&!i[13]&!i[11]&i[0]) | (i[15]&!i[14]&!i[13]&!i[10] + &i[0]) | (i[15]&!i[14]&!i[13]&i[6]&i[0]) | (i[15]&!i[14]&!i[13]&i[5] + &i[0]); + +assign o[13] = (i[15]&!i[14]&!i[13]&i[11]&!i[10]&i[0]) | (i[15]&!i[14]&!i[13] + &i[11]&i[6]&i[0]) | (i[14]&!i[0]); + +assign o[12] = (i[15]&!i[14]&!i[13]&i[6]&i[5]&i[0]) | (i[15]&!i[14]&!i[13]&!i[11] + &i[0]) | (i[15]&!i[14]&!i[13]&!i[10]&i[0]) | (!i[15]&!i[14]&i[1]) | ( + i[15]&i[14]&i[13]); + +assign o[11] = 1'b0; + +assign o[10] = 1'b0; + +assign o[9] = 1'b0; + +assign o[8] = 1'b0; + +assign o[7] = 1'b0; + +assign o[6] = (i[15]&!i[14]&!i[6]&!i[5]&!i[4]&!i[3]&!i[2]&!i[0]) | (!i[14]&i[13]) | ( + i[15]&i[14]&i[0]); + +assign o[5] = (i[15]&!i[0]) | (i[15]&i[11]&i[10]) | (i[13]&!i[8]) | (i[13]&i[7]) | ( + i[13]&i[9]) | (i[13]&i[10]) | (i[13]&i[11]) | (!i[14]&i[13]) | ( + i[15]&i[14]); + +assign o[4] = (!i[14]&!i[11]&!i[10]&!i[9]&!i[8]&!i[7]&!i[0]) | (!i[15]&!i[14] + &!i[0]) | (!i[14]&i[6]&!i[0]) | (!i[15]&i[14]&i[0]) | (!i[14]&i[5] + &!i[0]) | (!i[14]&i[4]&!i[0]) | (!i[14]&!i[13]&i[0]) | (!i[14]&i[3] + &!i[0]) | (!i[14]&i[2]&!i[0]); + +assign o[3] = (!i[14]&i[13]); + +assign o[2] = (!i[14]&i[12]&i[11]&!i[6]&!i[5]&!i[4]&!i[3]&!i[2]&i[1]) | (!i[14] + &i[12]&i[10]&!i[6]&!i[5]&!i[4]&!i[3]&!i[2]&i[1]) | (!i[14]&i[12]&i[9] + &!i[6]&!i[5]&!i[4]&!i[3]&!i[2]&i[1]) | (!i[14]&i[12]&i[8]&!i[6]&!i[5] + &!i[4]&!i[3]&!i[2]&i[1]) | (!i[14]&i[12]&i[7]&!i[6]&!i[5]&!i[4]&!i[3] + &!i[2]&i[1]) | (i[15]&!i[14]&!i[12]&!i[6]&!i[5]&!i[4]&!i[3]&!i[2] + &!i[0]) | (!i[15]&i[13]&!i[8]) | (!i[15]&i[13]&i[7]) | (!i[15]&i[13] + &i[9]) | (!i[15]&i[13]&i[10]) | (!i[15]&i[13]&i[11]) | (!i[14]&i[13]); + +// 32b instruction has lower two bits 2'b11 + +assign o[1] = 1'b1; + +assign o[0] = 1'b1; + +assign legal = (!i[13]&!i[12]&i[11]&i[1]&!i[0]) | (!i[13]&!i[12]&i[6]&i[1]&!i[0]) | ( + !i[15]&!i[13]&i[11]&!i[1]) | (!i[13]&!i[12]&i[5]&i[1]&!i[0]) | ( + !i[13]&!i[12]&i[10]&i[1]&!i[0]) | (!i[15]&!i[13]&i[6]&!i[1]) | ( + i[15]&!i[12]&!i[1]&i[0]) | (!i[13]&!i[12]&i[9]&i[1]&!i[0]) | (!i[12] + &i[6]&!i[1]&i[0]) | (!i[15]&!i[13]&i[5]&!i[1]) | (!i[13]&!i[12]&i[8] + &i[1]&!i[0]) | (!i[12]&i[5]&!i[1]&i[0]) | (!i[15]&!i[13]&i[10]&!i[1]) | ( + !i[13]&!i[12]&i[7]&i[1]&!i[0]) | (i[12]&i[11]&!i[10]&!i[1]&i[0]) | ( + !i[15]&!i[13]&i[9]&!i[1]) | (!i[13]&!i[12]&i[4]&i[1]&!i[0]) | (i[13] + &i[12]&!i[1]&i[0]) | (!i[15]&!i[13]&i[8]&!i[1]) | (!i[13]&!i[12]&i[3] + &i[1]&!i[0]) | (i[13]&i[4]&!i[1]&i[0]) | (!i[13]&!i[12]&i[2]&i[1] + &!i[0]) | (!i[15]&!i[13]&i[7]&!i[1]) | (i[13]&i[3]&!i[1]&i[0]) | ( + i[13]&i[2]&!i[1]&i[0]) | (i[14]&!i[13]&!i[1]) | (!i[14]&!i[12]&!i[1] + &i[0]) | (i[15]&!i[13]&i[12]&i[1]&!i[0]) | (!i[15]&!i[13]&!i[12]&i[1] + &!i[0]) | (!i[15]&!i[13]&i[12]&!i[1]) | (i[14]&!i[13]&!i[0]); + + + + +endmodule diff --git a/design/ifu/el2_ifu_ic_mem.sv b/design/ifu/el2_ifu_ic_mem.sv new file mode 100644 index 0000000..22ac22d --- /dev/null +++ b/design/ifu/el2_ifu_ic_mem.sv @@ -0,0 +1,1802 @@ +//******************************************************************************** +// SPDX-License-Identifier: Apache-2.0 +// Copyright 2020 Western Digital Corporation or it's affiliates. +// +// 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. +//******************************************************************************** +//////////////////////////////////////////////////// +// ICACHE DATA & TAG MODULE WRAPPER // +///////////////////////////////////////////////////// +module el2_ifu_ic_mem +import el2_pkg::*; + #( +`include "el2_param.vh" + ) + ( + input logic clk, + input logic rst_l, + input logic clk_override, + input logic dec_tlu_core_ecc_disable, + + input logic [31:1] ic_rw_addr, + input logic [pt.ICACHE_NUM_WAYS-1:0] ic_wr_en , // Which way to write + input logic ic_rd_en , // Read enable + input logic [pt.ICACHE_INDEX_HI:3] ic_debug_addr, // Read/Write addresss to the Icache. + input logic ic_debug_rd_en, // Icache debug rd + input logic ic_debug_wr_en, // Icache debug wr + input logic ic_debug_tag_array, // Debug tag array + input logic [pt.ICACHE_NUM_WAYS-1:0] ic_debug_way, // Debug way. Rd or Wr. + input logic [63:0] ic_premux_data, // Premux data to be muxed with each way of the Icache. + input logic ic_sel_premux_data, // Select the pre_muxed data + + input logic [pt.ICACHE_BANKS_WAY-1:0][70:0] ic_wr_data, // Data to fill to the Icache. With ECC + output logic [63:0] ic_rd_data , // Data read from Icache. 2x64bits + parity bits. F2 stage. With ECC + output logic [70:0] ic_debug_rd_data , // Data read from Icache. 2x64bits + parity bits. F2 stage. With ECC + output logic [25:0] ictag_debug_rd_data,// Debug icache tag. + input logic [70:0] ic_debug_wr_data, // Debug wr cache. + + output logic [pt.ICACHE_BANKS_WAY-1:0] ic_eccerr, // ecc error per bank + output logic [pt.ICACHE_BANKS_WAY-1:0] ic_parerr, // ecc error per bank + input logic [pt.ICACHE_NUM_WAYS-1:0] ic_tag_valid, // Valid from the I$ tag valid outside (in flops). + + output logic [pt.ICACHE_NUM_WAYS-1:0] ic_rd_hit, // ic_rd_hit[3:0] + output logic ic_tag_perr, // Tag Parity error + input logic scan_mode + ) ; + + + EL2_IC_TAG #(.pt(pt)) ic_tag_inst + ( + .*, + .ic_wr_en (ic_wr_en[pt.ICACHE_NUM_WAYS-1:0]), + .ic_debug_addr(ic_debug_addr[pt.ICACHE_INDEX_HI:3]), + .ic_rw_addr (ic_rw_addr[31:3]) + ) ; + + EL2_IC_DATA #(.pt(pt)) ic_data_inst + ( + .*, + .ic_wr_en (ic_wr_en[pt.ICACHE_NUM_WAYS-1:0]), + .ic_debug_addr(ic_debug_addr[pt.ICACHE_INDEX_HI:3]), + .ic_rw_addr (ic_rw_addr[pt.ICACHE_INDEX_HI:1]) + ) ; + + endmodule + + +///////////////////////////////////////////////// +////// ICACHE DATA MODULE //////////////////// +///////////////////////////////////////////////// +module EL2_IC_DATA +import el2_pkg::*; +#( +`include "el2_param.vh" + ) + ( + input logic clk, + input logic rst_l, + input logic clk_override, + + input logic [pt.ICACHE_INDEX_HI:1] ic_rw_addr, + input logic [pt.ICACHE_NUM_WAYS-1:0]ic_wr_en, + input logic ic_rd_en, // Read enable + + input logic [pt.ICACHE_BANKS_WAY-1:0][70:0] ic_wr_data, // Data to fill to the Icache. With ECC + output logic [63:0] ic_rd_data , // Data read from Icache. 2x64bits + parity bits. F2 stage. With ECC + input logic [70:0] ic_debug_wr_data, // Debug wr cache. + output logic [70:0] ic_debug_rd_data , // Data read from Icache. 2x64bits + parity bits. F2 stage. With ECC + output logic [pt.ICACHE_BANKS_WAY-1:0] ic_parerr, + output logic [pt.ICACHE_BANKS_WAY-1:0] ic_eccerr, // ecc error per bank + input logic [pt.ICACHE_INDEX_HI:3] ic_debug_addr, // Read/Write addresss to the Icache. + input logic ic_debug_rd_en, // Icache debug rd + input logic ic_debug_wr_en, // Icache debug wr + input logic ic_debug_tag_array, // Debug tag array + input logic [pt.ICACHE_NUM_WAYS-1:0] ic_debug_way, // Debug way. Rd or Wr. + input logic [63:0] ic_premux_data, // Premux data to be muxed with each way of the Icache. + input logic ic_sel_premux_data, // Select the pre_muxed data + + input logic [pt.ICACHE_NUM_WAYS-1:0]ic_rd_hit, + input logic scan_mode + + ) ; + + logic [pt.ICACHE_TAG_INDEX_LO-1:1] ic_rw_addr_ff; + logic [pt.ICACHE_BANKS_WAY-1:0][pt.ICACHE_NUM_WAYS-1:0] ic_b_sb_wren; //bank x ways + logic [pt.ICACHE_BANKS_WAY-1:0][pt.ICACHE_NUM_WAYS-1:0] ic_b_sb_rden; //bank x ways + logic [pt.ICACHE_BANKS_WAY-1:0] ic_b_rden; //bank + logic [pt.ICACHE_BANKS_WAY-1:0] ic_b_rden_ff; //bank + logic [pt.ICACHE_BANKS_WAY-1:0] ic_debug_sel_sb; + + logic [pt.ICACHE_NUM_WAYS-1:0][pt.ICACHE_BANKS_WAY-1:0][70:0] wb_dout ; // ways x bank + logic [pt.ICACHE_BANKS_WAY-1:0][70:0] ic_sb_wr_data, ic_bank_wr_data, wb_dout_ecc_bank; + logic [pt.ICACHE_NUM_WAYS-1:0] [141:0] wb_dout_way_pre; + logic [pt.ICACHE_NUM_WAYS-1:0] [63:0] wb_dout_way, wb_dout_way_with_premux; + logic [141:0] wb_dout_ecc; + + logic [pt.ICACHE_BANKS_WAY-1:0] bank_check_en; + + logic [pt.ICACHE_BANKS_WAY-1:0][pt.ICACHE_NUM_WAYS-1:0] ic_bank_way_clken; // ; + logic [pt.ICACHE_NUM_WAYS-1:0] ic_debug_rd_way_en; // debug wr_way + logic [pt.ICACHE_NUM_WAYS-1:0] ic_debug_rd_way_en_ff; // debug wr_way + logic [pt.ICACHE_NUM_WAYS-1:0] ic_debug_wr_way_en; // debug wr_way + logic [pt.ICACHE_INDEX_HI:1] ic_rw_addr_q; + logic [pt.ICACHE_BANKS_WAY-1:0] [pt.ICACHE_INDEX_HI : pt.ICACHE_DATA_INDEX_LO] ic_rw_addr_bank_q; + logic [pt.ICACHE_TAG_LO-1 : pt.ICACHE_DATA_INDEX_LO] ic_rw_addr_q_inc; + logic [pt.ICACHE_NUM_WAYS-1:0] ic_rd_hit_q; + + logic ic_rd_en_with_debug; + logic ic_rw_addr_wrap, ic_cacheline_wrap_ff; + logic ic_debug_rd_en_ff; + + +//----------------------------------------------------------- +// ----------- Logic section starts here -------------------- +//----------------------------------------------------------- + assign ic_debug_rd_way_en[pt.ICACHE_NUM_WAYS-1:0] = {pt.ICACHE_NUM_WAYS{ic_debug_rd_en & ~ic_debug_tag_array}} & ic_debug_way[pt.ICACHE_NUM_WAYS-1:0] ; + assign ic_debug_wr_way_en[pt.ICACHE_NUM_WAYS-1:0] = {pt.ICACHE_NUM_WAYS{ic_debug_wr_en & ~ic_debug_tag_array}} & ic_debug_way[pt.ICACHE_NUM_WAYS-1:0] ; + + always_comb begin : clkens + ic_bank_way_clken = '0; + + for ( int i=0; i> (16*iccm_rd_addr_lo_q[1]))}); + assign iccm_rd_data[63:0] = {iccm_data[63:0]}; + assign iccm_rd_data_ecc[77:0] = {iccm_bank_dout_fn[iccm_rd_addr_hi_q][38:0], iccm_bank_dout_fn[iccm_rd_addr_lo_q[pt.ICCM_BANK_HI:2]][38:0]}; + +endmodule // el2_ifu_iccm_mem diff --git a/design/ifu/el2_ifu_ifc_ctl.sv b/design/ifu/el2_ifu_ifc_ctl.sv new file mode 100644 index 0000000..33c1401 --- /dev/null +++ b/design/ifu/el2_ifu_ifc_ctl.sv @@ -0,0 +1,234 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright 2020 Western Digital Corporation or it's affiliates. +// +// 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. + +//******************************************************************************** +// el2_ifu_ifc_ctl.sv +// Function: Fetch pipe control +// +// Comments: +//******************************************************************************** + +module el2_ifu_ifc_ctl +import el2_pkg::*; +#( +`include "el2_param.vh" + ) + ( + input logic clk, + input logic free_clk, + input logic active_clk, + + input logic rst_l, // reset enable, from core pin + input logic scan_mode, // scan + + input logic ic_hit_f, // Icache hit + input logic ifu_ic_mb_empty, // Miss buffer empty + + input logic ifu_fb_consume1, // Aligner consumed 1 fetch buffer + input logic ifu_fb_consume2, // Aligner consumed 2 fetch buffers + + input logic dec_tlu_flush_noredir_wb, // Don't fetch on flush + input logic exu_flush_final, // FLush + input logic [31:1] exu_flush_path_final, // Flush path + + input logic ifu_bp_hit_taken_f, // btb hit, select the target path + input logic [31:1] ifu_bp_btb_target_f, // predicted target PC + + input logic ic_dma_active, // IC DMA active, stop fetching + input logic ic_write_stall, // IC is writing, stop fetching + input logic dma_iccm_stall_any, // force a stall in the fetch pipe for DMA ICCM access + + input logic [31:0] dec_tlu_mrac_ff , // side_effect and cacheable for each region + + output logic [31:1] ifc_fetch_addr_f, // fetch addr F + output logic [31:1] ifc_fetch_addr_bf, // fetch addr BF + + output logic ifc_fetch_req_f, // fetch request valid F + + output logic ifu_pmu_fetch_stall, // pmu event measuring fetch stall + + output logic ifc_fetch_uncacheable_bf, // The fetch request is uncacheable space. BF stage + output logic ifc_fetch_req_bf, // Fetch request. Comes with the address. BF stage + output logic ifc_fetch_req_bf_raw, // Fetch request without some qualifications. Used for clock-gating. BF stage + output logic ifc_iccm_access_bf, // This request is to the ICCM. Do not generate misses to the bus. + output logic ifc_region_acc_fault_bf, // Access fault. in ICCM region but offset is outside defined ICCM. + + output logic ifc_dma_access_ok // fetch is not accessing the ICCM, DMA can proceed + + + ); + + logic [31:1] fetch_addr_bf; + logic [31:1] fetch_addr_next; + logic [3:0] fb_write_f, fb_write_ns; + + logic fb_full_f_ns, fb_full_f; + logic fb_right, fb_right2, fb_left, wfm, idle; + logic sel_last_addr_bf, sel_btb_addr_bf, sel_next_addr_bf; + logic miss_f, miss_a; + logic flush_fb, dma_iccm_stall_any_f; + logic mb_empty_mod, goto_idle, leave_idle; + logic fetch_bf_en; + logic line_wrap; + logic fetch_addr_next_1; + + // FSM assignment + typedef enum logic [1:0] { IDLE = 2'b00 , + FETCH = 2'b01 , + STALL = 2'b10 , + WFM = 2'b11 } state_t ; + state_t state ; + state_t next_state ; + + logic dma_stall; + assign dma_stall = ic_dma_active | dma_iccm_stall_any_f; + + rvdff #(2) ran_ff (.*, .clk(free_clk), .din({dma_iccm_stall_any, miss_f}), .dout({dma_iccm_stall_any_f, miss_a})); + + // Fetch address mux + // - flush + // - Miss *or* flush during WFM (icache miss buffer is blocking) + // - Sequential + + + assign sel_last_addr_bf = ~exu_flush_final & (~ifc_fetch_req_f | ~ic_hit_f); + assign sel_btb_addr_bf = ~exu_flush_final & ifc_fetch_req_f & ifu_bp_hit_taken_f & ic_hit_f; + assign sel_next_addr_bf = ~exu_flush_final & ifc_fetch_req_f & ~ifu_bp_hit_taken_f & ic_hit_f; + + + assign fetch_addr_bf[31:1] = ( ({31{exu_flush_final}} & exu_flush_path_final[31:1]) | // FLUSH path + ({31{sel_last_addr_bf}} & ifc_fetch_addr_f[31:1]) | // MISS path + ({31{sel_btb_addr_bf}} & {ifu_bp_btb_target_f[31:1]})| // BTB target + ({31{sel_next_addr_bf}} & {fetch_addr_next[31:1]})); // SEQ path + + + assign fetch_addr_next[31:1] = {({ifc_fetch_addr_f[31:2]} + 31'b1), fetch_addr_next_1 }; + assign line_wrap = (fetch_addr_next[pt.ICACHE_TAG_INDEX_LO] ^ ifc_fetch_addr_f[pt.ICACHE_TAG_INDEX_LO]); + + assign fetch_addr_next_1 = line_wrap ? 1'b0 : ifc_fetch_addr_f[1]; + + assign ifc_fetch_req_bf_raw = ~idle; + assign ifc_fetch_req_bf = ifc_fetch_req_bf_raw & + + ~(fb_full_f_ns & ~(ifu_fb_consume2 | ifu_fb_consume1)) & + ~dma_stall & + ~ic_write_stall & + ~dec_tlu_flush_noredir_wb; + + + assign fetch_bf_en = exu_flush_final | ifc_fetch_req_f; + + assign miss_f = ifc_fetch_req_f & ~ic_hit_f & ~exu_flush_final; + + assign mb_empty_mod = (ifu_ic_mb_empty | exu_flush_final) & ~dma_stall & ~miss_f & ~miss_a; + + // Halt flushes and takes us to IDLE + assign goto_idle = exu_flush_final & dec_tlu_flush_noredir_wb; + // If we're in IDLE, and we get a flush, goto FETCH + assign leave_idle = exu_flush_final & ~dec_tlu_flush_noredir_wb & idle; + +//.i 7 +//.o 2 +//.ilb state[1] state[0] reset_delayed miss_f mb_empty_mod goto_idle leave_idle +//.ob next_state[1] next_state[0] +//.type fr +// +//# fetch 01, stall 10, wfm 11, idle 00 +//-- 1---- 01 +//-- 0--1- 00 +//00 0--00 00 +//00 0--01 01 +// +//01 01-0- 11 +//01 00-0- 01 +// +//11 0-10- 01 +//11 0-00- 11 + + assign next_state[1] = (~state[1] & state[0] & miss_f & ~goto_idle) | + (state[1] & ~mb_empty_mod & ~goto_idle); + + assign next_state[0] = (~goto_idle & leave_idle) | (state[0] & ~goto_idle); + + assign flush_fb = exu_flush_final; + + // model fb write logic to mass balance the fetch buffers + assign fb_right = ( ifu_fb_consume1 & ~ifu_fb_consume2 & (~ifc_fetch_req_f | miss_f)) | // Consumed and no new fetch + (ifu_fb_consume2 & ifc_fetch_req_f); // Consumed 2 and new fetch + + + assign fb_right2 = (ifu_fb_consume2 & (~ifc_fetch_req_f | miss_f)); // Consumed 2 and no new fetch + + assign fb_left = ifc_fetch_req_f & ~(ifu_fb_consume1 | ifu_fb_consume2) & ~miss_f; + +// CBH + assign fb_write_ns[3:0] = ( ({4{(flush_fb)}} & 4'b0001) | + ({4{~flush_fb & fb_right }} & {1'b0, fb_write_f[3:1]}) | + ({4{~flush_fb & fb_right2}} & {2'b0, fb_write_f[3:2]}) | + ({4{~flush_fb & fb_left }} & {fb_write_f[2:0], 1'b0}) | + ({4{~flush_fb & ~fb_right & ~fb_right2 & ~fb_left}} & fb_write_f[3:0])); + + + assign fb_full_f_ns = fb_write_ns[3]; + + assign idle = state == IDLE ; + assign wfm = state == WFM ; + + rvdff #(2) fsm_ff (.*, .clk(active_clk), .din({next_state[1:0]}), .dout({state[1:0]})); + rvdff #(5) fbwrite_ff (.*, .clk(active_clk), .din({fb_full_f_ns, fb_write_ns[3:0]}), .dout({fb_full_f, fb_write_f[3:0]})); + + assign ifu_pmu_fetch_stall = wfm | + (ifc_fetch_req_bf_raw & + ( (fb_full_f & ~(ifu_fb_consume2 | ifu_fb_consume1 | exu_flush_final)) | + dma_stall)); + + + rvdff #(1) req_ff (.*, .clk(active_clk), .din(ifc_fetch_req_bf), .dout(ifc_fetch_req_f)); + + assign ifc_fetch_addr_bf[31:1] = fetch_addr_bf[31:1]; + + rvdffe #(31) faddrf1_ff (.*, .en(fetch_bf_en), .din(fetch_addr_bf[31:1]), .dout(ifc_fetch_addr_f[31:1])); + + + if (pt.ICCM_ENABLE) begin + logic iccm_acc_in_region_bf; + logic iccm_acc_in_range_bf; + rvrangecheck #( .CCM_SADR (pt.ICCM_SADR), + .CCM_SIZE (pt.ICCM_SIZE) ) iccm_rangecheck ( + .addr ({ifc_fetch_addr_bf[31:1],1'b0}) , + .in_range (iccm_acc_in_range_bf) , + .in_region(iccm_acc_in_region_bf) + ); + + assign ifc_iccm_access_bf = iccm_acc_in_range_bf ; + + assign ifc_dma_access_ok = ( (~ifc_iccm_access_bf | + (fb_full_f & ~(ifu_fb_consume2 | ifu_fb_consume1)) | + (wfm & ~ifc_fetch_req_bf) | + idle ) & ~exu_flush_final) | + dma_iccm_stall_any_f; + + assign ifc_region_acc_fault_bf = ~iccm_acc_in_range_bf & iccm_acc_in_region_bf ; + end + else begin + assign ifc_iccm_access_bf = 1'b0 ; + assign ifc_dma_access_ok = 1'b0 ; + assign ifc_region_acc_fault_bf = 1'b0 ; + end + + assign ifc_fetch_uncacheable_bf = ~dec_tlu_mrac_ff[{ifc_fetch_addr_bf[31:28] , 1'b0 }] ; // bit 0 of each region description is the cacheable bit + +endmodule // el2_ifu_ifc_ctl + diff --git a/design/ifu/el2_ifu_mem_ctl.sv b/design/ifu/el2_ifu_mem_ctl.sv new file mode 100644 index 0000000..edb10db --- /dev/null +++ b/design/ifu/el2_ifu_mem_ctl.sv @@ -0,0 +1,1630 @@ + //******************************************************************************** +// SPDX-License-Identifier: Apache-2.0 +// Copyright 2020 Western Digital Corporation or it's affiliates. +// +// 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. +//******************************************************************************** + + +//******************************************************************************** +// Function: Icache , iccm control +// BFF -> F1 -> F2 -> A +//******************************************************************************** + +module el2_ifu_mem_ctl +import el2_pkg::*; +#( +`include "el2_param.vh" + ) + ( + input logic clk, + input logic free_clk, // free clock always except during pause + input logic active_clk, // Active always except during pause + input logic rst_l, + + input logic exu_flush_final, // Flush from the pipeline., includes flush lower + input logic dec_tlu_flush_lower_wb, // Flush lower from the pipeline. + input logic dec_tlu_flush_err_wb, // Flush from the pipeline due to perr. + input logic dec_tlu_i0_commit_cmt, // committed i0 instruction + input logic dec_tlu_force_halt, // force halt. + + input logic [31:1] ifc_fetch_addr_bf, // Fetch Address byte aligned always. F1 stage. + input logic ifc_fetch_uncacheable_bf, // The fetch request is uncacheable space. F1 stage + input logic ifc_fetch_req_bf, // Fetch request. Comes with the address. F1 stage + input logic ifc_fetch_req_bf_raw, // Fetch request without some qualifications. Used for clock-gating. F1 stage + input logic ifc_iccm_access_bf, // This request is to the ICCM. Do not generate misses to the bus. + input logic ifc_region_acc_fault_bf, // Access fault. in ICCM region but offset is outside defined ICCM. + input logic ifc_dma_access_ok, // It is OK to give dma access to the ICCM. (ICCM is not busy this cycle). + input logic dec_tlu_fence_i_wb, // Fence.i instruction is committing. Clear all Icache valids. + input logic ifu_bp_hit_taken_f, // Branch is predicted taken. Kill the fetch next cycle. + + input logic ifu_bp_inst_mask_f, // tell ic which valids to kill because of a taken branch, right justified + + output logic ifu_miss_state_idle, // No icache misses are outstanding. + output logic ifu_ic_mb_empty, // Continue with normal fetching. This does not mean that miss is finished. + output logic ic_dma_active , // In the middle of servicing dma request to ICCM. Do not make any new requests. + output logic ic_write_stall, // Stall fetch the cycle we are writing the cache. + +/// PMU signals + output logic ifu_pmu_ic_miss, // IC miss event + output logic ifu_pmu_ic_hit, // IC hit event + output logic ifu_pmu_bus_error, // Bus error event + output logic ifu_pmu_bus_busy, // Bus busy event + output logic ifu_pmu_bus_trxn, // Bus transaction + + //-------------------------- IFU AXI signals-------------------------- + // AXI Write Channels + output logic ifu_axi_awvalid, + output logic [pt.IFU_BUS_TAG-1:0] ifu_axi_awid, + output logic [31:0] ifu_axi_awaddr, + output logic [3:0] ifu_axi_awregion, + output logic [7:0] ifu_axi_awlen, + output logic [2:0] ifu_axi_awsize, + output logic [1:0] ifu_axi_awburst, + output logic ifu_axi_awlock, + output logic [3:0] ifu_axi_awcache, + output logic [2:0] ifu_axi_awprot, + output logic [3:0] ifu_axi_awqos, + + output logic ifu_axi_wvalid, + output logic [63:0] ifu_axi_wdata, + output logic [7:0] ifu_axi_wstrb, + output logic ifu_axi_wlast, + + output logic ifu_axi_bready, + + // AXI Read Channels + output logic ifu_axi_arvalid, + input logic ifu_axi_arready, + output logic [pt.IFU_BUS_TAG-1:0] ifu_axi_arid, + output logic [31:0] ifu_axi_araddr, + output logic [3:0] ifu_axi_arregion, + output logic [7:0] ifu_axi_arlen, + output logic [2:0] ifu_axi_arsize, + output logic [1:0] ifu_axi_arburst, + output logic ifu_axi_arlock, + output logic [3:0] ifu_axi_arcache, + output logic [2:0] ifu_axi_arprot, + output logic [3:0] ifu_axi_arqos, + + input logic ifu_axi_rvalid, + output logic ifu_axi_rready, + input logic [pt.IFU_BUS_TAG-1:0] ifu_axi_rid, + input logic [63:0] ifu_axi_rdata, + input logic [1:0] ifu_axi_rresp, + + input logic ifu_bus_clk_en, + + + input logic dma_iccm_req, // dma iccm command (read or write) + input logic [31:0] dma_mem_addr, // dma address + input logic [2:0] dma_mem_sz, // size + input logic dma_mem_write, // write + input logic [63:0] dma_mem_wdata, // write data + input logic [2:0] dma_mem_tag, // DMA Buffer entry number + + output logic iccm_dma_ecc_error,// Data read from iccm has an ecc error + output logic iccm_dma_rvalid, // Data read from iccm is valid + output logic [63:0] iccm_dma_rdata, // dma data read from iccm + output logic [2:0] iccm_dma_rtag, // Tag of the DMA req + output logic iccm_ready, // iccm ready to accept new command. + + +// I$ & ITAG Ports + output logic [31:1] ic_rw_addr, // Read/Write addresss to the Icache. + output logic [pt.ICACHE_NUM_WAYS-1:0] ic_wr_en, // Icache write enable, when filling the Icache. + output logic ic_rd_en, // Icache read enable. + + output logic [pt.ICACHE_BANKS_WAY-1:0] [70:0] ic_wr_data, // Data to fill to the Icache. With ECC + input logic [63:0] ic_rd_data , // Data read from Icache. 2x64bits + parity bits. F2 stage. With ECC + input logic [70:0] ic_debug_rd_data , // Data read from Icache. 2x64bits + parity bits. F2 stage. With ECC + input logic [25:0] ictag_debug_rd_data, // Debug icache tag. + output logic [70:0] ic_debug_wr_data, // Debug wr cache. + output logic [70:0] ifu_ic_debug_rd_data, // debug data read + + + input logic [pt.ICACHE_BANKS_WAY-1:0] ic_eccerr, // + input logic [pt.ICACHE_BANKS_WAY-1:0] ic_parerr, + + output logic [pt.ICACHE_INDEX_HI:3] ic_debug_addr, // Read/Write addresss to the Icache. + output logic ic_debug_rd_en, // Icache debug rd + output logic ic_debug_wr_en, // Icache debug wr + output logic ic_debug_tag_array, // Debug tag array + output logic [pt.ICACHE_NUM_WAYS-1:0] ic_debug_way, // Debug way. Rd or Wr. + + + output logic [pt.ICACHE_NUM_WAYS-1:0] ic_tag_valid, // Valid bits when accessing the Icache. One valid bit per way. F2 stage + + input logic [pt.ICACHE_NUM_WAYS-1:0] ic_rd_hit, // Compare hits from Icache tags. Per way. F2 stage + input logic ic_tag_perr, // Icache Tag parity error + + // ICCM ports + output logic [pt.ICCM_BITS-1:1] iccm_rw_addr, // ICCM read/write address. + output logic iccm_wren, // ICCM write enable (through the DMA) + output logic iccm_rden, // ICCM read enable. + output logic [77:0] iccm_wr_data, // ICCM write data. + output logic [2:0] iccm_wr_size, // ICCM write location within DW. + + input logic [63:0] iccm_rd_data, // Data read from ICCM. + input logic [77:0] iccm_rd_data_ecc, // Data + ECC read from ICCM. + input logic [1:0] ifu_fetch_val, + // IFU control signals + output logic ic_hit_f, // Hit in Icache(if Icache access) or ICCM access( ICCM always has ic_hit_f) + output logic ic_access_fault_f, // Access fault (bus error or ICCM access in region but out of offset range). + output logic [1:0] ic_access_fault_type_f, // Access fault types + output logic iccm_rd_ecc_single_err, // This fetch has a single ICCM ecc error. + output logic iccm_rd_ecc_double_err, // This fetch has a double ICCM ecc error. + output logic ic_error_start, // This has any I$ errors ( data/tag/ecc/parity ) + + output logic ifu_async_error_start, // Or of the sb iccm, and all the icache errors sent to aligner to stop + output logic iccm_dma_sb_error, // Single Bit ECC error from a DMA access + output logic [1:0] ic_fetch_val_f, // valid bytes for fetch. To the Aligner. + output logic [31:0] ic_data_f, // Data read from Icache or ICCM. To the Aligner. + output logic [63:0] ic_premux_data, // Premuxed data to be muxed with Icache data + output logic ic_sel_premux_data, // Select premux data. + +///// Debug + input el2_cache_debug_pkt_t dec_tlu_ic_diag_pkt , // Icache/tag debug read/write packet + input logic dec_tlu_core_ecc_disable, // disable the ecc checking and flagging + output logic ifu_ic_debug_rd_data_valid, // debug data valid. + output logic iccm_buf_correct_ecc, + output logic iccm_correction_state, + + + input logic scan_mode + ); + + +// Create different defines for ICACHE and ICCM enable combinations + + localparam NUM_OF_BEATS = 8 ; + + + + logic [31:3] ifu_ic_req_addr_f; + logic uncacheable_miss_in ; + logic uncacheable_miss_ff; + + + + logic bus_ifu_wr_en ; + logic bus_ifu_wr_en_ff ; + logic bus_ifu_wr_en_ff_q ; + logic bus_ifu_wr_en_ff_wo_err ; + logic [pt.ICACHE_NUM_WAYS-1:0] bus_ic_wr_en ; + + logic reset_tag_valid_for_miss ; + + + logic [pt.ICACHE_STATUS_BITS-1:0] way_status; + logic [pt.ICACHE_STATUS_BITS-1:0] way_status_mb_in; + logic [pt.ICACHE_STATUS_BITS-1:0] way_status_rep_new; + logic [pt.ICACHE_STATUS_BITS-1:0] way_status_mb_ff; + logic [pt.ICACHE_STATUS_BITS-1:0] way_status_new; + logic [pt.ICACHE_STATUS_BITS-1:0] way_status_hit_new; + logic [pt.ICACHE_STATUS_BITS-1:0] way_status_new_w_debug; + logic [pt.ICACHE_NUM_WAYS-1:0] tagv_mb_in; + logic [pt.ICACHE_NUM_WAYS-1:0] tagv_mb_ff; + + + logic ifu_wr_data_comb_err ; + logic ifu_byp_data_err_new; + logic ifu_wr_cumulative_err_data; + logic ifu_wr_cumulative_err; + logic ifu_wr_data_comb_err_ff; + logic scnd_miss_index_match ; + + + logic ifc_dma_access_q_ok; + logic ifc_iccm_access_f ; + logic ifc_region_acc_fault_f; + logic ifc_region_acc_fault_final_f; + logic ifc_bus_acc_fault_f; + logic ic_act_miss_f; + logic ic_miss_under_miss_f; + logic ic_ignore_2nd_miss_f; + logic ic_act_hit_f; + logic miss_pending; + logic [31:1] imb_in , imb_ff ; + logic [31:pt.ICACHE_BEAT_ADDR_HI+1] miss_addr_in , miss_addr ; + logic miss_wrap_f ; + logic flush_final_f; + logic ifc_fetch_req_f; + logic ifc_fetch_req_f_raw; + logic fetch_req_f_qual ; + logic ifc_fetch_req_qual_bf ; + logic [pt.ICACHE_NUM_WAYS-1:0] replace_way_mb_any; + logic last_beat; + logic reset_beat_cnt ; + logic [pt.ICACHE_BEAT_ADDR_HI:3] ic_req_addr_bits_hi_3 ; + logic [pt.ICACHE_BEAT_ADDR_HI:3] ic_wr_addr_bits_hi_3 ; + logic [31:1] ifu_fetch_addr_int_f ; + logic [31:1] ifu_ic_rw_int_addr ; + logic crit_wd_byp_ok_ff ; + logic ic_crit_wd_rdy_new_ff; + logic [79:0] ic_byp_data_only_pre_new; + logic [79:0] ic_byp_data_only_new; + logic ic_byp_hit_f ; + logic ic_valid ; + logic ic_valid_ff; + logic reset_all_tags; + logic ic_valid_w_debug; + + logic [pt.ICACHE_NUM_WAYS-1:0] ifu_tag_wren,ifu_tag_wren_ff; + logic [pt.ICACHE_NUM_WAYS-1:0] ic_debug_tag_wr_en; + logic [pt.ICACHE_NUM_WAYS-1:0] ifu_tag_wren_w_debug; + logic [pt.ICACHE_NUM_WAYS-1:0] ic_debug_way_ff; + logic ic_debug_rd_en_ff ; + logic fetch_bf_f_c1_clken ; + logic fetch_bf_f_c1_clk; + logic debug_c1_clken; + logic debug_c1_clk; + + logic reset_ic_in ; + logic reset_ic_ff ; + logic [pt.ICACHE_BEAT_ADDR_HI:1] vaddr_f ; + logic [31:1] ifu_status_wr_addr; + logic sel_mb_addr ; + logic sel_mb_addr_ff ; + logic sel_mb_status_addr ; + logic [63:0] ic_final_data; + + logic [pt.ICACHE_INDEX_HI:pt.ICACHE_TAG_INDEX_LO] ifu_ic_rw_int_addr_ff ; + logic [pt.ICACHE_INDEX_HI:pt.ICACHE_TAG_INDEX_LO] ifu_status_wr_addr_ff ; + logic [pt.ICACHE_INDEX_HI:pt.ICACHE_TAG_INDEX_LO] ifu_ic_rw_int_addr_w_debug ; + logic [pt.ICACHE_INDEX_HI:pt.ICACHE_TAG_INDEX_LO] ifu_status_wr_addr_w_debug ; + + logic [pt.ICACHE_STATUS_BITS-1:0] way_status_new_ff ; + logic way_status_wr_en_ff ; + logic [pt.ICACHE_TAG_DEPTH-1:0][pt.ICACHE_STATUS_BITS-1:0] way_status_out ; + logic [1:0] ic_debug_way_enc; + + logic [pt.IFU_BUS_TAG-1:0] ifu_bus_rid_ff; + + logic fetch_req_icache_f; + logic fetch_req_iccm_f; + logic ic_iccm_hit_f; + logic fetch_uncacheable_ff; + logic way_status_wr_en; + logic sel_byp_data; + logic sel_ic_data; + logic sel_iccm_data; + logic ic_rd_parity_final_err; + logic ic_act_miss_f_delayed; + logic bus_ifu_wr_data_error; + logic bus_ifu_wr_data_error_ff; + logic way_status_wr_en_w_debug; + logic ic_debug_tag_val_rd_out; + logic ifu_pmu_ic_miss_in; + logic ifu_pmu_ic_hit_in; + logic ifu_pmu_bus_error_in; + logic ifu_pmu_bus_trxn_in; + logic ifu_pmu_bus_busy_in; + logic ic_debug_ict_array_sel_in; + logic ic_debug_ict_array_sel_ff; + logic debug_data_clk; + logic debug_data_clken; + logic last_data_recieved_in ; + logic last_data_recieved_ff ; + + logic ifu_bus_rvalid ; + logic ifu_bus_rvalid_ff ; + logic ifu_bus_rvalid_unq ; + logic ifu_bus_rvalid_unq_ff ; + logic ifu_bus_arready_unq ; + logic ifu_bus_arready_unq_ff ; + logic ifu_bus_arvalid ; + logic ifu_bus_arvalid_ff ; + logic ifu_bus_arready ; + logic ifu_bus_arready_ff ; + logic [63:0] ifu_bus_rdata_ff ; + logic [1:0] ifu_bus_rresp_ff ; + logic ifu_bus_rsp_valid ; + logic ifu_bus_rsp_ready ; + logic [pt.IFU_BUS_TAG-1:0] ifu_bus_rsp_tag; + logic [63:0] ifu_bus_rsp_rdata; + logic [1:0] ifu_bus_rsp_opc; + + logic [pt.ICACHE_NUM_BEATS-1:0] write_fill_data; + logic [pt.ICACHE_NUM_BEATS-1:0] wr_data_c1_clk; + logic [pt.ICACHE_NUM_BEATS-1:0] ic_miss_buff_data_valid_in; + logic [pt.ICACHE_NUM_BEATS-1:0] ic_miss_buff_data_valid; + logic [pt.ICACHE_NUM_BEATS-1:0] ic_miss_buff_data_error_in; + logic [pt.ICACHE_NUM_BEATS-1:0] ic_miss_buff_data_error; + logic [pt.ICACHE_BEAT_ADDR_HI:1] byp_fetch_index; + logic [pt.ICACHE_BEAT_ADDR_HI:2] byp_fetch_index_0; + logic [pt.ICACHE_BEAT_ADDR_HI:2] byp_fetch_index_1; + logic [pt.ICACHE_BEAT_ADDR_HI:3] byp_fetch_index_inc; + logic [pt.ICACHE_BEAT_ADDR_HI:2] byp_fetch_index_inc_0; + logic [pt.ICACHE_BEAT_ADDR_HI:2] byp_fetch_index_inc_1; + logic miss_buff_hit_unq_f ; + logic stream_hit_f ; + logic stream_miss_f ; + logic stream_eol_f ; + logic crit_byp_hit_f ; + logic [pt.IFU_BUS_TAG-1:0] other_tag ; + logic [(2*pt.ICACHE_NUM_BEATS)-1:0] [31:0] ic_miss_buff_data; + logic [63:0] ic_miss_buff_half; + logic scnd_miss_req, scnd_miss_req_q, scnd_miss_req_ff2; + logic scnd_miss_req_in; + + + logic [pt.ICCM_BITS-1:2] iccm_ecc_corr_index_ff; + logic [pt.ICCM_BITS-1:2] iccm_ecc_corr_index_in; + logic [38:0] iccm_ecc_corr_data_ff; + logic iccm_ecc_write_status ; + logic iccm_rd_ecc_single_err_ff ; + logic iccm_error_start; // start the error fsm + logic perr_state_en; + logic miss_state_en; + + logic busclk; + logic busclk_force; + logic busclk_reset; + logic bus_ifu_bus_clk_en_ff; + logic bus_ifu_bus_clk_en ; + + logic ifc_bus_ic_req_ff_in; + logic ifu_bus_cmd_valid ; + logic ifu_bus_cmd_ready ; + + logic bus_inc_data_beat_cnt ; + logic bus_reset_data_beat_cnt ; + logic bus_hold_data_beat_cnt ; + + logic bus_inc_cmd_beat_cnt ; + logic bus_reset_cmd_beat_cnt_0 ; + logic bus_reset_cmd_beat_cnt_secondlast ; + logic bus_hold_cmd_beat_cnt ; + + logic [pt.ICACHE_BEAT_BITS-1:0] bus_new_data_beat_count ; + logic [pt.ICACHE_BEAT_BITS-1:0] bus_data_beat_count ; + + logic [pt.ICACHE_BEAT_BITS-1:0] bus_new_cmd_beat_count ; + logic [pt.ICACHE_BEAT_BITS-1:0] bus_cmd_beat_count ; + + + logic [pt.ICACHE_BEAT_BITS-1:0] bus_new_rd_addr_count; + logic [pt.ICACHE_BEAT_BITS-1:0] bus_rd_addr_count; + + + logic bus_cmd_sent ; + logic bus_last_data_beat ; + + + logic [pt.ICACHE_NUM_WAYS-1:0] bus_wren ; + + logic [pt.ICACHE_NUM_WAYS-1:0] bus_wren_last ; + logic [pt.ICACHE_NUM_WAYS-1:0] wren_reset_miss ; + logic ifc_dma_access_ok_d; + logic ifc_dma_access_ok_prev; + + logic bus_cmd_req_in ; + logic bus_cmd_req_hold ; + + logic second_half_available ; + logic write_ic_16_bytes ; + + logic ifc_region_acc_fault_final_bf; + logic ifc_region_acc_fault_memory_bf; + logic ifc_region_acc_fault_memory_f; + logic ifc_region_acc_okay; + + logic iccm_correct_ecc; + logic dma_sb_err_state, dma_sb_err_state_ff; + logic two_byte_instr; + + typedef enum logic [2:0] {IDLE=3'b000, CRIT_BYP_OK=3'b001, HIT_U_MISS=3'b010, MISS_WAIT=3'b011,CRIT_WRD_RDY=3'b100,SCND_MISS=3'b101,STREAM=3'b110 , STALL_SCND_MISS=3'b111} miss_state_t; + miss_state_t miss_state, miss_nxtstate; + + typedef enum logic [1:0] {ERR_STOP_IDLE=2'b00, ERR_FETCH1=2'b01 , ERR_FETCH2=2'b10 , ERR_STOP_FETCH=2'b11} err_stop_state_t; + err_stop_state_t err_stop_state, err_stop_nxtstate; + logic err_stop_state_en ; + logic err_stop_fetch ; + + logic ic_crit_wd_rdy; // Critical fetch is ready to be bypassed. + + logic ifu_bp_hit_taken_q_f; + logic bus_cmd_beat_en; + + +// ---- Clock gating section ----- +// c1 clock enables + + + assign fetch_bf_f_c1_clken = ifc_fetch_req_bf_raw | ifc_fetch_req_f | miss_pending | exu_flush_final | scnd_miss_req; + assign debug_c1_clken = ic_debug_rd_en | ic_debug_wr_en ; + // C1 - 1 clock pulse for data + + rvclkhdr fetch_bf_f_c1_cgc ( .en(fetch_bf_f_c1_clken), .l1clk(fetch_bf_f_c1_clk), .* ); + rvclkhdr debug_c1_cgc ( .en(debug_c1_clken), .l1clk(debug_c1_clk), .* ); + +// ------ end clock gating section ------------------------ + + logic [1:0] iccm_single_ecc_error; + logic dma_iccm_req_f ; + assign iccm_dma_sb_error = (|iccm_single_ecc_error[1:0] ) & dma_iccm_req_f ; + assign ifu_async_error_start = iccm_rd_ecc_single_err | ic_error_start; + + + typedef enum logic [2:0] {ERR_IDLE=3'b000, IC_WFF=3'b001 , ECC_WFF=3'b010 , ECC_CORR=3'b011, DMA_SB_ERR=3'b100} perr_state_t; + perr_state_t perr_state, perr_nxtstate; + + + assign ic_dma_active = iccm_correct_ecc | (perr_state == DMA_SB_ERR) | (err_stop_state == ERR_STOP_FETCH) | err_stop_fetch | + dec_tlu_flush_err_wb; // The last term is to give a error-correction a chance to finish before refetch starts + + assign scnd_miss_req_in = ifu_bus_rsp_valid & bus_ifu_bus_clk_en & ifu_bus_rsp_ready & + (&bus_new_data_beat_count[pt.ICACHE_BEAT_BITS-1:0]) & + ~uncacheable_miss_ff & ((miss_state == SCND_MISS) | (miss_nxtstate == SCND_MISS)) & ~exu_flush_final; + + assign ifu_bp_hit_taken_q_f = ifu_bp_hit_taken_f & ic_hit_f ; + + //////////////////////////////////// Create Miss State Machine /////////////////////// + // Create Miss State Machine // + // Create Miss State Machine // + // Create Miss State Machine // + //////////////////////////////////// Create Miss State Machine /////////////////////// + // FIFO state machine + always_comb begin : MISS_SM + miss_nxtstate = IDLE; + miss_state_en = 1'b0; + case (miss_state) + IDLE: begin : idle + miss_nxtstate = (ic_act_miss_f & ~exu_flush_final) ? CRIT_BYP_OK : HIT_U_MISS ; + miss_state_en = ic_act_miss_f & ~dec_tlu_force_halt ; + end + CRIT_BYP_OK: begin : crit_byp_ok + miss_nxtstate = (dec_tlu_force_halt ) ? IDLE : + ( ic_byp_hit_f & (last_data_recieved_ff | (bus_ifu_wr_en_ff & last_beat)) & uncacheable_miss_ff) ? IDLE : + ( ic_byp_hit_f & ~last_data_recieved_ff & uncacheable_miss_ff) ? MISS_WAIT : + (~ic_byp_hit_f & ~exu_flush_final & (bus_ifu_wr_en_ff & last_beat) & uncacheable_miss_ff) ? CRIT_WRD_RDY : + ( (bus_ifu_wr_en_ff & last_beat) & ~uncacheable_miss_ff) ? IDLE : + ( ic_byp_hit_f & ~exu_flush_final & ~(bus_ifu_wr_en_ff & last_beat) & ~ifu_bp_hit_taken_q_f & ~uncacheable_miss_ff) ? STREAM : + ( bus_ifu_wr_en_ff & ~exu_flush_final & ~(bus_ifu_wr_en_ff & last_beat) & ~ifu_bp_hit_taken_q_f & ~uncacheable_miss_ff) ? STREAM : + (~ic_byp_hit_f & ~exu_flush_final & (bus_ifu_wr_en_ff & last_beat) & ~uncacheable_miss_ff) ? IDLE : + ( (exu_flush_final | ifu_bp_hit_taken_q_f) & ~(bus_ifu_wr_en_ff & last_beat) ) ? HIT_U_MISS : IDLE; + miss_state_en = dec_tlu_force_halt | exu_flush_final | ic_byp_hit_f | ifu_bp_hit_taken_q_f | (bus_ifu_wr_en_ff & last_beat) | (bus_ifu_wr_en_ff & ~uncacheable_miss_ff) ; + end + CRIT_WRD_RDY: begin : crit_wrd_rdy + miss_nxtstate = IDLE ; + miss_state_en = exu_flush_final | flush_final_f | ic_byp_hit_f | dec_tlu_force_halt ; + end + STREAM: begin : stream + miss_nxtstate = ((exu_flush_final | ifu_bp_hit_taken_q_f | stream_eol_f ) & ~(bus_ifu_wr_en_ff & last_beat) & ~dec_tlu_force_halt) ? HIT_U_MISS : IDLE ; + miss_state_en = exu_flush_final | ifu_bp_hit_taken_q_f | stream_eol_f | (bus_ifu_wr_en_ff & last_beat) | dec_tlu_force_halt ; + end + MISS_WAIT: begin : miss_wait + miss_nxtstate = (exu_flush_final & ~(bus_ifu_wr_en_ff & last_beat) & ~dec_tlu_force_halt) ? HIT_U_MISS : IDLE ; + miss_state_en = exu_flush_final | (bus_ifu_wr_en_ff & last_beat) | dec_tlu_force_halt ; + end + HIT_U_MISS: begin : hit_u_miss + miss_nxtstate = ic_miss_under_miss_f & ~(bus_ifu_wr_en_ff & last_beat) & ~dec_tlu_force_halt ? SCND_MISS : + ic_ignore_2nd_miss_f & ~(bus_ifu_wr_en_ff & last_beat) & ~dec_tlu_force_halt ? STALL_SCND_MISS : IDLE ; + miss_state_en = (bus_ifu_wr_en_ff & last_beat) | ic_miss_under_miss_f | ic_ignore_2nd_miss_f | dec_tlu_force_halt; + end + SCND_MISS: begin : scnd_miss + miss_nxtstate = dec_tlu_force_halt ? IDLE : + exu_flush_final ? ((bus_ifu_wr_en_ff & last_beat) ? IDLE : HIT_U_MISS) : CRIT_BYP_OK; + miss_state_en = (bus_ifu_wr_en_ff & last_beat) | exu_flush_final | dec_tlu_force_halt; + end + STALL_SCND_MISS: begin : stall_scnd_miss + miss_nxtstate = dec_tlu_force_halt ? IDLE : + exu_flush_final ? ((bus_ifu_wr_en_ff & last_beat) ? IDLE : HIT_U_MISS) : IDLE; + miss_state_en = (bus_ifu_wr_en_ff & last_beat) | exu_flush_final | dec_tlu_force_halt; + end + default: begin : def_case + miss_nxtstate = IDLE; + miss_state_en = 1'b0; + end + endcase + end + rvdffs #(($bits(miss_state_t))) miss_state_ff (.clk(free_clk), .din(miss_nxtstate), .dout({miss_state}), .en(miss_state_en), .*); + + logic sel_hold_imb ; + + assign miss_pending = (miss_state != IDLE) ; + assign crit_wd_byp_ok_ff = (miss_state == CRIT_BYP_OK) | ((miss_state == CRIT_WRD_RDY) & ~flush_final_f); + assign sel_hold_imb = (miss_pending & ~(bus_ifu_wr_en_ff & last_beat) & ~((miss_state == CRIT_WRD_RDY) & exu_flush_final) & + ~((miss_state == CRIT_WRD_RDY) & crit_byp_hit_f) ) | ic_act_miss_f | + (miss_pending & (miss_nxtstate == CRIT_WRD_RDY)) ; + + + logic sel_hold_imb_scnd; + logic [31:1] imb_scnd_in; + logic [31:1] imb_scnd_ff; + logic uncacheable_miss_scnd_in ; + logic uncacheable_miss_scnd_ff ; + + logic [pt.ICACHE_NUM_WAYS-1:0] tagv_mb_scnd_in; + logic [pt.ICACHE_NUM_WAYS-1:0] tagv_mb_scnd_ff; + + logic [pt.ICACHE_STATUS_BITS-1:0] way_status_mb_scnd_in; + logic [pt.ICACHE_STATUS_BITS-1:0] way_status_mb_scnd_ff; + + assign sel_hold_imb_scnd =((miss_state == SCND_MISS) | ic_miss_under_miss_f) & ~flush_final_f ; + assign way_status_mb_scnd_in[pt.ICACHE_STATUS_BITS-1:0] = (miss_state == SCND_MISS) ? way_status_mb_scnd_ff[pt.ICACHE_STATUS_BITS-1:0] : {way_status[pt.ICACHE_STATUS_BITS-1:0]} ; + assign tagv_mb_scnd_in[pt.ICACHE_NUM_WAYS-1:0] = (miss_state == SCND_MISS) ? tagv_mb_scnd_ff[pt.ICACHE_NUM_WAYS-1:0] : ({ic_tag_valid[pt.ICACHE_NUM_WAYS-1:0]} & {pt.ICACHE_NUM_WAYS{~reset_all_tags}}); + assign uncacheable_miss_scnd_in = sel_hold_imb_scnd ? uncacheable_miss_scnd_ff : ifc_fetch_uncacheable_bf ; + + + rvdff #(1) unc_miss_scnd_ff (.*, .clk(fetch_bf_f_c1_clk), .din (uncacheable_miss_scnd_in), .dout(uncacheable_miss_scnd_ff)); + rvdff #(31) imb_f_scnd_ff (.*, .clk(fetch_bf_f_c1_clk), .din ({imb_scnd_in[31:1]}), .dout({imb_scnd_ff[31:1]})); + rvdff #(pt.ICACHE_STATUS_BITS) mb_rep_wayf2_scnd_ff (.*, .clk(fetch_bf_f_c1_clk), .din ({way_status_mb_scnd_in[pt.ICACHE_STATUS_BITS-1:0]}), .dout({way_status_mb_scnd_ff[pt.ICACHE_STATUS_BITS-1:0]})); + rvdff #(pt.ICACHE_NUM_WAYS) mb_tagv_scnd_ff (.*, .clk(fetch_bf_f_c1_clk), .din ({tagv_mb_scnd_in[pt.ICACHE_NUM_WAYS-1:0]}), .dout({tagv_mb_scnd_ff[pt.ICACHE_NUM_WAYS-1:0]})); + + + + + assign ic_req_addr_bits_hi_3[pt.ICACHE_BEAT_ADDR_HI:3] = bus_rd_addr_count[pt.ICACHE_BEAT_BITS-1:0] ; + assign ic_wr_addr_bits_hi_3[pt.ICACHE_BEAT_ADDR_HI:3] = ifu_bus_rid_ff[pt.ICACHE_BEAT_BITS-1:0] & {pt.ICACHE_BEAT_BITS{bus_ifu_wr_en_ff}}; + // NOTE: Cacheline size is 16 bytes in this example. + // Tag Index Bank Offset + // [31:16] [15:5] [4] [3:0] + + + assign fetch_req_icache_f = ifc_fetch_req_f & ~ifc_iccm_access_f & ~ifc_region_acc_fault_final_f; + assign fetch_req_iccm_f = ifc_fetch_req_f & ifc_iccm_access_f; + + assign ic_iccm_hit_f = fetch_req_iccm_f & (~miss_pending | (miss_state==HIT_U_MISS) | (miss_state==STREAM)); + assign ic_byp_hit_f = (crit_byp_hit_f | stream_hit_f) & fetch_req_icache_f & miss_pending ; + assign ic_act_hit_f = (|ic_rd_hit[pt.ICACHE_NUM_WAYS-1:0]) & fetch_req_icache_f & ~reset_all_tags & (~miss_pending | (miss_state==HIT_U_MISS)) & ~sel_mb_addr_ff; + assign ic_act_miss_f = (((~(|ic_rd_hit[pt.ICACHE_NUM_WAYS-1:0]) | reset_all_tags) & fetch_req_icache_f & ~miss_pending) | scnd_miss_req) & ~ifc_region_acc_fault_final_f; + assign ic_miss_under_miss_f = (~(|ic_rd_hit[pt.ICACHE_NUM_WAYS-1:0]) | reset_all_tags) & fetch_req_icache_f & (miss_state == HIT_U_MISS) & + (imb_ff[31:pt.ICACHE_TAG_INDEX_LO] != ifu_fetch_addr_int_f[31:pt.ICACHE_TAG_INDEX_LO]) & ~uncacheable_miss_ff & ~sel_mb_addr_ff & ~ifc_region_acc_fault_final_f; + assign ic_ignore_2nd_miss_f = (~(|ic_rd_hit[pt.ICACHE_NUM_WAYS-1:0]) | reset_all_tags) & fetch_req_icache_f & (miss_state == HIT_U_MISS) & + ((imb_ff[31:pt.ICACHE_TAG_INDEX_LO] == ifu_fetch_addr_int_f[31:pt.ICACHE_TAG_INDEX_LO]) | uncacheable_miss_ff) ; + assign ic_hit_f = ic_act_hit_f | ic_byp_hit_f | ic_iccm_hit_f | (ifc_region_acc_fault_final_f & ifc_fetch_req_f); + + assign uncacheable_miss_in = scnd_miss_req ? uncacheable_miss_scnd_ff : sel_hold_imb ? uncacheable_miss_ff : ifc_fetch_uncacheable_bf ; + assign imb_in[31:1] = scnd_miss_req ? imb_scnd_ff[31:1] : sel_hold_imb ? imb_ff[31:1] : {ifc_fetch_addr_bf[31:1]} ; + + assign imb_scnd_in[31:1] = sel_hold_imb_scnd ? imb_scnd_ff[31:1] : {ifc_fetch_addr_bf[31:1]} ; + + assign scnd_miss_index_match = (imb_ff[pt.ICACHE_INDEX_HI:pt.ICACHE_TAG_INDEX_LO] == imb_scnd_ff[pt.ICACHE_INDEX_HI:pt.ICACHE_TAG_INDEX_LO]) & scnd_miss_req & ~ifu_wr_cumulative_err_data; + assign way_status_mb_in[pt.ICACHE_STATUS_BITS-1:0] = (scnd_miss_req & ~scnd_miss_index_match) ? way_status_mb_scnd_ff[pt.ICACHE_STATUS_BITS-1:0] : + (scnd_miss_req & scnd_miss_index_match) ? way_status_rep_new[pt.ICACHE_STATUS_BITS-1:0] : + miss_pending ? way_status_mb_ff[pt.ICACHE_STATUS_BITS-1:0] : + {way_status[pt.ICACHE_STATUS_BITS-1:0]} ; + assign tagv_mb_in[pt.ICACHE_NUM_WAYS-1:0] = scnd_miss_req ? (tagv_mb_scnd_ff[pt.ICACHE_NUM_WAYS-1:0] | ({pt.ICACHE_NUM_WAYS {scnd_miss_index_match}} & replace_way_mb_any[pt.ICACHE_NUM_WAYS-1:0])) : + miss_pending ? tagv_mb_ff[pt.ICACHE_NUM_WAYS-1:0] : ({ic_tag_valid[pt.ICACHE_NUM_WAYS-1:0]} & {pt.ICACHE_NUM_WAYS{~reset_all_tags}}) ; + + assign reset_ic_in = miss_pending & ~scnd_miss_req_q & (reset_all_tags | reset_ic_ff) ; + + rvdff #(1) reset_ic_f (.*, .clk(free_clk), .din (reset_ic_in), .dout(reset_ic_ff)); + rvdff #(1) uncache_ff (.*, .clk(active_clk), .din (ifc_fetch_uncacheable_bf), .dout(fetch_uncacheable_ff)); + + + + rvdff #(31) ifu_fetch_addr_f_ff (.*, + .clk (fetch_bf_f_c1_clk), + .din ({ifc_fetch_addr_bf[31:1]}), + .dout({ifu_fetch_addr_int_f[31:1]})); + + assign vaddr_f[pt.ICACHE_BEAT_ADDR_HI:1] = ifu_fetch_addr_int_f[pt.ICACHE_BEAT_ADDR_HI:1] ; + + rvdff #(1) unc_miss_ff (.*, .clk(fetch_bf_f_c1_clk), .din (uncacheable_miss_in), .dout(uncacheable_miss_ff)); + rvdff #(31) imb_f_ff (.*, .clk(fetch_bf_f_c1_clk), .din ({imb_in[31:1]}), .dout({imb_ff[31:1]})); + + + assign miss_addr_in[31:pt.ICACHE_BEAT_ADDR_HI+1] = (~miss_pending ) ? imb_ff[31:pt.ICACHE_BEAT_ADDR_HI+1] : + ( scnd_miss_req_q ) ? imb_scnd_ff[31:pt.ICACHE_BEAT_ADDR_HI+1] : miss_addr[31:pt.ICACHE_BEAT_ADDR_HI+1] ; + + rvdff #(31-pt.ICACHE_BEAT_ADDR_HI) miss_f_ff (.*, .clk(busclk_reset), .din ({miss_addr_in[31:pt.ICACHE_BEAT_ADDR_HI+1]}), .dout({miss_addr[31:pt.ICACHE_BEAT_ADDR_HI+1]})); + + + + rvdff #(pt.ICACHE_STATUS_BITS) mb_rep_wayf2_ff (.*, .clk(fetch_bf_f_c1_clk), .din ({way_status_mb_in[pt.ICACHE_STATUS_BITS-1:0]}), .dout({way_status_mb_ff[pt.ICACHE_STATUS_BITS-1:0]})); + + rvdff #(pt.ICACHE_NUM_WAYS) mb_tagv_ff (.*, .clk(fetch_bf_f_c1_clk), .din ({tagv_mb_in[pt.ICACHE_NUM_WAYS-1:0]}), .dout({tagv_mb_ff[pt.ICACHE_NUM_WAYS-1:0]})); + + assign ifc_fetch_req_qual_bf = ifc_fetch_req_bf & ~((miss_state == CRIT_WRD_RDY) & flush_final_f) & ~stream_miss_f ;// & ~exu_flush_final ; + rvdff #(1) fetch_req_f_ff (.*, .clk(active_clk), .din(ifc_fetch_req_qual_bf), .dout(ifc_fetch_req_f_raw)); + + assign ifc_fetch_req_f = ifc_fetch_req_f_raw & ~exu_flush_final ; + + rvdff #(1) ifu_iccm_acc_ff (.*, .clk(fetch_bf_f_c1_clk), .din(ifc_iccm_access_bf), .dout(ifc_iccm_access_f)); + rvdff #(1) ifu_iccm_reg_acc_ff (.*, .clk(fetch_bf_f_c1_clk), .din(ifc_region_acc_fault_final_bf), .dout(ifc_region_acc_fault_final_f)); + rvdff #(1) rgn_acc_ff (.*, .clk(fetch_bf_f_c1_clk), .din(ifc_region_acc_fault_bf), .dout(ifc_region_acc_fault_f)); + + + assign ifu_ic_req_addr_f[31:3] = {miss_addr[31:pt.ICACHE_BEAT_ADDR_HI+1] , ic_req_addr_bits_hi_3[pt.ICACHE_BEAT_ADDR_HI:3] }; + assign ifu_ic_mb_empty = (((miss_state == HIT_U_MISS) | (miss_state == STREAM)) & ~(bus_ifu_wr_en_ff & last_beat)) | ~miss_pending ; + assign ifu_miss_state_idle = (miss_state == IDLE) ; + + + assign sel_mb_addr = ((miss_pending & write_ic_16_bytes & ~uncacheable_miss_ff) | reset_tag_valid_for_miss) ; + assign ifu_ic_rw_int_addr[31:1] = ({31{ sel_mb_addr}} & {imb_ff[31:pt.ICACHE_BEAT_ADDR_HI+1] , ic_wr_addr_bits_hi_3[pt.ICACHE_BEAT_ADDR_HI:3] , imb_ff[2:1]}) | + ({31{~sel_mb_addr}} & ifc_fetch_addr_bf[31:1] ) ; + + assign sel_mb_status_addr = ((miss_pending & write_ic_16_bytes & ~uncacheable_miss_ff & last_beat & bus_ifu_wr_en_ff_q) | reset_tag_valid_for_miss) ; + assign ifu_status_wr_addr[31:1] = ({31{ sel_mb_status_addr}} & {imb_ff[31:pt.ICACHE_BEAT_ADDR_HI+1] , ic_wr_addr_bits_hi_3[pt.ICACHE_BEAT_ADDR_HI:3] , imb_ff[2:1]}) | + ({31{~sel_mb_status_addr}} & ifu_fetch_addr_int_f[31:1] ) ; + + + assign ic_rw_addr[31:1] = ifu_ic_rw_int_addr[31:1] ; + + rvdff #(1) sel_mb_ff (.*, .clk(free_clk), .din (sel_mb_addr), .dout(sel_mb_addr_ff)); + +if (pt.ICACHE_ECC == 1) begin: icache_ecc_1 + logic [6:0] ic_wr_ecc; + logic [6:0] ic_miss_buff_ecc; + logic [141:0] ic_wr_16bytes_data ; + logic [70:0] ifu_ic_debug_rd_data_in ; + + rvecc_encode_64 ic_ecc_encode_64_bus ( + .din (ifu_bus_rdata_ff[63:0]), + .ecc_out(ic_wr_ecc[6:0])); + rvecc_encode_64 ic_ecc_encode_64_buff ( + .din (ic_miss_buff_half[63:0]), + .ecc_out(ic_miss_buff_ecc[6:0])); + + for (genvar i=0; i < 32'(pt.ICACHE_BANKS_WAY) ; i++) begin : ic_wr_data_loop + assign ic_wr_data[i][70:0] = ic_wr_16bytes_data[((71*i)+70): (71*i)]; + end + + + assign ic_debug_wr_data[70:0] = {dec_tlu_ic_diag_pkt.icache_wrdata[70:0]} ; + assign ic_error_start = ((|ic_eccerr[pt.ICACHE_BANKS_WAY-1:0]) & ic_act_hit_f) | ic_rd_parity_final_err; + + + + assign ifu_ic_debug_rd_data_in[70:0] = ic_debug_ict_array_sel_ff ? {2'b0,ictag_debug_rd_data[25:21],32'b0,ictag_debug_rd_data[20:0],{7-pt.ICACHE_STATUS_BITS{1'b0}}, way_status[pt.ICACHE_STATUS_BITS-1:0],3'b0,ic_debug_tag_val_rd_out} : + ic_debug_rd_data[70:0]; + + rvdff #(71) ifu_debug_data_ff (.*, .clk (debug_data_clk), + .din ({ + ifu_ic_debug_rd_data_in[70:0] + }), + .dout({ + ifu_ic_debug_rd_data[70:0] + })); + + assign ic_wr_16bytes_data[141:0] = ifu_bus_rid_ff[0] ? {ic_wr_ecc[6:0] , ifu_bus_rdata_ff[63:0] , ic_miss_buff_ecc[6:0] , ic_miss_buff_half[63:0] } : + {ic_miss_buff_ecc[6:0] , ic_miss_buff_half[63:0] , ic_wr_ecc[6:0] , ifu_bus_rdata_ff[63:0] } ; + + +end +else begin : icache_parity_1 + logic [3:0] ic_wr_parity; + logic [3:0] ic_miss_buff_parity; + logic [135:0] ic_wr_16bytes_data ; + logic [70:0] ifu_ic_debug_rd_data_in ; + for (genvar i=0 ; i < 4 ; i++) begin : DATA_PGEN + rveven_paritygen #(16) par_bus (.data_in (ifu_bus_rdata_ff[((16*i)+15):(16*i)]), + .parity_out(ic_wr_parity[i])); + rveven_paritygen #(16) par_buff (.data_in (ic_miss_buff_half[((16*i)+15):(16*i)]), + .parity_out(ic_miss_buff_parity[i])); + end + + + for (genvar i=0; i < pt.ICACHE_BANKS_WAY ; i++) begin : ic_wr_data_loop + assign ic_wr_data[i][67:0] = ic_wr_16bytes_data[((68*i)+67): (68*i)]; + end + + + + + + assign ic_debug_wr_data[70:0] = {dec_tlu_ic_diag_pkt.icache_wrdata[70:0]} ; + assign ic_error_start = ((|ic_parerr[pt.ICACHE_BANKS_WAY-1:0]) & ic_act_hit_f) | ic_rd_parity_final_err; + + assign ifu_ic_debug_rd_data_in[70:0] = ic_debug_ict_array_sel_ff ? {6'b0,ictag_debug_rd_data[21],32'b0,ictag_debug_rd_data[20:0],{7-pt.ICACHE_STATUS_BITS{1'b0}},way_status[pt.ICACHE_STATUS_BITS-1:0],3'b0,ic_debug_tag_val_rd_out} : + ic_debug_rd_data[70:0] ; + + rvdff #(71) ifu_debug_data_ff (.*, .clk (debug_data_clk), + .din ({ + ifu_ic_debug_rd_data_in[70:0] + }), + .dout({ + ifu_ic_debug_rd_data[70:0] + })); + + assign ic_wr_16bytes_data[135:0] = ifu_bus_rid_ff[0] ? {ic_wr_parity[3:0] , ifu_bus_rdata_ff[63:0] , ic_miss_buff_parity[3:0] , ic_miss_buff_half[63:0] } : + {ic_miss_buff_parity[3:0] , ic_miss_buff_half[63:0] , ic_wr_parity[3:0] , ifu_bus_rdata_ff[63:0] } ; + +end + + + assign ifu_wr_data_comb_err = bus_ifu_wr_data_error_ff ; + assign ifu_wr_cumulative_err = (ifu_wr_data_comb_err | ifu_wr_data_comb_err_ff) & ~reset_beat_cnt; + assign ifu_wr_cumulative_err_data = ifu_wr_data_comb_err | ifu_wr_data_comb_err_ff ; + + rvdff #(1) cumul_err_ff (.*, .clk(free_clk), .din (ifu_wr_cumulative_err), .dout(ifu_wr_data_comb_err_ff)); + + + assign sel_byp_data = (ic_crit_wd_rdy | (miss_state == STREAM) | (miss_state == CRIT_BYP_OK)) & ~ifu_byp_data_err_new; + assign sel_ic_data = ~(ic_crit_wd_rdy | (miss_state == STREAM) | (miss_state == CRIT_BYP_OK)) & ~fetch_req_iccm_f ; + + if (pt.ICCM_ICACHE==1) begin: iccm_icache + assign sel_iccm_data = fetch_req_iccm_f ; + + assign ic_final_data[63:0] = ({64{sel_byp_data | sel_iccm_data | sel_ic_data}} & {ic_rd_data[63:0]} ) ; + + assign ic_premux_data[63:0] = ({64{sel_byp_data }} & {ic_byp_data_only_new[63:0]} ) | + ({64{sel_iccm_data}} & {iccm_rd_data[63:0]}); + + assign ic_sel_premux_data = sel_iccm_data | sel_byp_data ; + end + +if (pt.ICCM_ONLY == 1 ) begin: iccm_only + assign sel_iccm_data = fetch_req_iccm_f ; + assign ic_final_data[63:0] = ({64{sel_byp_data }} & {ic_byp_data_only_new[63:0]} ) | + ({64{sel_iccm_data}} & {iccm_rd_data[63:0]}); + assign ic_premux_data = '0 ; + assign ic_sel_premux_data = '0 ; +end + +if (pt.ICACHE_ONLY == 1 ) begin: icache_only + assign ic_final_data[63:0] = ({64{sel_byp_data | sel_ic_data}} & {ic_rd_data[63:0]} ) ; + assign ic_premux_data[63:0] = ({64{sel_byp_data }} & {ic_byp_data_only_new[63:0]} ) ; + assign ic_sel_premux_data = sel_byp_data ; +end + + +if (pt.NO_ICCM_NO_ICACHE == 1 ) begin: no_iccm_no_icache + assign ic_final_data[63:0] = ({64{sel_byp_data }} & {ic_byp_data_only_new[63:0]} ) ; + assign ic_premux_data = 0 ; + assign ic_sel_premux_data = '0 ; +end + + + assign ifc_bus_acc_fault_f = ic_byp_hit_f & ifu_byp_data_err_new ; + assign ic_data_f[31:0] = ic_final_data[31:0]; + + +rvdff #(1) flush_final_ff (.*, .clk(free_clk), .din({exu_flush_final}), .dout({flush_final_f})); +assign fetch_req_f_qual = ic_hit_f & ~exu_flush_final; +assign ic_access_fault_f = (ifc_region_acc_fault_final_f | ifc_bus_acc_fault_f) & ~exu_flush_final; +assign ic_access_fault_type_f[1:0] = iccm_rd_ecc_double_err ? 2'b01 : + ifc_region_acc_fault_f ? 2'b10 : + ifc_region_acc_fault_memory_f ? 2'b11 : 2'b00 ; + + // right justified + +assign ic_fetch_val_f[1] = fetch_req_f_qual & ifu_bp_inst_mask_f & ~(vaddr_f[pt.ICACHE_BEAT_ADDR_HI:1] == {pt.ICACHE_BEAT_ADDR_HI{1'b1}}) & (err_stop_state != ERR_FETCH2); +assign ic_fetch_val_f[0] = fetch_req_f_qual ; +assign two_byte_instr = (ic_data_f[1:0] != 2'b11 ) ; + +///////////////////////////////////////////////////////////////////////////////////// +// Create full buffer... // +///////////////////////////////////////////////////////////////////////////////////// + logic [63:0] ic_miss_buff_data_in; + assign ic_miss_buff_data_in[63:0] = ifu_bus_rsp_rdata[63:0]; + + for (genvar i=0; i<32'(pt.ICACHE_NUM_BEATS); i++) begin : wr_flop + assign write_fill_data[i] = bus_ifu_wr_en & ( (pt.IFU_BUS_TAG)'(i) == ifu_bus_rsp_tag[pt.IFU_BUS_TAG-1:0]); + rvclkhdr data_c1_cgc ( .en(write_fill_data[i]), .l1clk(wr_data_c1_clk[i]), .* ); + rvdff #(32) byp_data_0_ff (.*, + .clk (wr_data_c1_clk[i]), + .din (ic_miss_buff_data_in[31:0]), + .dout(ic_miss_buff_data[i*2][31:0])); + + rvdff #(32) byp_data_1_ff (.*, + .clk (wr_data_c1_clk[i]), + .din (ic_miss_buff_data_in[63:32]), + .dout(ic_miss_buff_data[i*2+1][31:0])); + + assign ic_miss_buff_data_valid_in[i] = write_fill_data[i] ? 1'b1 : (ic_miss_buff_data_valid[i] & ~ic_act_miss_f) ; + rvdff #(1) byp_data_valid_ff (.*, + .clk (free_clk), + .din (ic_miss_buff_data_valid_in[i]), + .dout(ic_miss_buff_data_valid[i])); + + assign ic_miss_buff_data_error_in[i] = write_fill_data[i] ? bus_ifu_wr_data_error : (ic_miss_buff_data_error[i] & ~ic_act_miss_f) ; + rvdff #(1) byp_data_error_ff (.*, + .clk (free_clk), + .din (ic_miss_buff_data_error_in[i] ), + .dout(ic_miss_buff_data_error[i])); + end + +///////////////////////////////////////////////////////////////////////////////////// +// New bypass ready // +///////////////////////////////////////////////////////////////////////////////////// + logic [pt.ICACHE_BEAT_ADDR_HI:1] bypass_index; + logic [pt.ICACHE_BEAT_ADDR_HI:3] bypass_index_5_3_inc; + logic bypass_data_ready_in; + logic ic_crit_wd_rdy_new_in; + + assign bypass_index[pt.ICACHE_BEAT_ADDR_HI:1] = imb_ff[pt.ICACHE_BEAT_ADDR_HI:1] ; + assign bypass_index_5_3_inc[pt.ICACHE_BEAT_ADDR_HI:3] = bypass_index[pt.ICACHE_BEAT_ADDR_HI:3] + 1 ; + + + assign bypass_data_ready_in = ((ic_miss_buff_data_valid_in[bypass_index[pt.ICACHE_BEAT_ADDR_HI:3]] & ~bypass_index[2] & ~bypass_index[1])) | + ((ic_miss_buff_data_valid_in[bypass_index[pt.ICACHE_BEAT_ADDR_HI:3]] & ~bypass_index[2] & bypass_index[1])) | + ((ic_miss_buff_data_valid_in[bypass_index[pt.ICACHE_BEAT_ADDR_HI:3]] & bypass_index[2] & ~bypass_index[1])) | + ((ic_miss_buff_data_valid_in[bypass_index[pt.ICACHE_BEAT_ADDR_HI:3]] & ic_miss_buff_data_valid_in[bypass_index_5_3_inc[pt.ICACHE_BEAT_ADDR_HI:3]] & bypass_index[2] & bypass_index[1])) | + ((ic_miss_buff_data_valid_in[bypass_index[pt.ICACHE_BEAT_ADDR_HI:3]] & (bypass_index[pt.ICACHE_BEAT_ADDR_HI:3] == {pt.ICACHE_BEAT_ADDR_HI{1'b1}}))) ; + + + + assign ic_crit_wd_rdy_new_in = ( bypass_data_ready_in & crit_wd_byp_ok_ff & uncacheable_miss_ff & ~exu_flush_final & ~ifu_bp_hit_taken_q_f) | + ( crit_wd_byp_ok_ff & ~uncacheable_miss_ff & ~exu_flush_final & ~ifu_bp_hit_taken_q_f) | + (ic_crit_wd_rdy_new_ff & ~fetch_req_icache_f & crit_wd_byp_ok_ff & ~exu_flush_final) ; + + rvdff #(1) crit_wd_new_ff (.*, .clk(free_clk), .din(ic_crit_wd_rdy_new_in), .dout(ic_crit_wd_rdy_new_ff)); + + assign byp_fetch_index[pt.ICACHE_BEAT_ADDR_HI:1] = ifu_fetch_addr_int_f[pt.ICACHE_BEAT_ADDR_HI:1] ; + assign byp_fetch_index_0[pt.ICACHE_BEAT_ADDR_HI:2] = {ifu_fetch_addr_int_f[pt.ICACHE_BEAT_ADDR_HI:3],1'b0} ; + assign byp_fetch_index_1[pt.ICACHE_BEAT_ADDR_HI:2] = {ifu_fetch_addr_int_f[pt.ICACHE_BEAT_ADDR_HI:3],1'b1} ; + assign byp_fetch_index_inc[pt.ICACHE_BEAT_ADDR_HI:3] = ifu_fetch_addr_int_f[pt.ICACHE_BEAT_ADDR_HI:3]+1'b1 ; + assign byp_fetch_index_inc_0[pt.ICACHE_BEAT_ADDR_HI:2] = {byp_fetch_index_inc[pt.ICACHE_BEAT_ADDR_HI:3], 1'b0} ; + assign byp_fetch_index_inc_1[pt.ICACHE_BEAT_ADDR_HI:2] = {byp_fetch_index_inc[pt.ICACHE_BEAT_ADDR_HI:3], 1'b1} ; + + assign ifu_byp_data_err_new = (~ifu_fetch_addr_int_f[2] & ~ifu_fetch_addr_int_f[1] & ic_miss_buff_data_error[byp_fetch_index[pt.ICACHE_BEAT_ADDR_HI:3]] ) | + (~ifu_fetch_addr_int_f[2] & ifu_fetch_addr_int_f[1] & ic_miss_buff_data_error[byp_fetch_index[pt.ICACHE_BEAT_ADDR_HI:3]] ) | + ( ifu_fetch_addr_int_f[2] & ~ifu_fetch_addr_int_f[1] & ic_miss_buff_data_error[byp_fetch_index[pt.ICACHE_BEAT_ADDR_HI:3]] ) | + ( ifu_fetch_addr_int_f[2] & ifu_fetch_addr_int_f[1] & (ic_miss_buff_data_error[byp_fetch_index_inc[pt.ICACHE_BEAT_ADDR_HI:3]] | ic_miss_buff_data_error[byp_fetch_index[pt.ICACHE_BEAT_ADDR_HI:3]] )) ; + + assign ic_byp_data_only_pre_new[79:0] = ({80{~ifu_fetch_addr_int_f[2]}} & {ic_miss_buff_data[byp_fetch_index_inc_0][15:0],ic_miss_buff_data[byp_fetch_index_1][31:0] , ic_miss_buff_data[byp_fetch_index_0][31:0]}) | + ({80{ ifu_fetch_addr_int_f[2]}} & {ic_miss_buff_data[byp_fetch_index_inc_1][15:0],ic_miss_buff_data[byp_fetch_index_inc_0][31:0] , ic_miss_buff_data[byp_fetch_index_1][31:0]}) ; + + assign ic_byp_data_only_new[79:0] = ~ifu_fetch_addr_int_f[1] ? {ic_byp_data_only_pre_new[79:0]} : + {16'b0,ic_byp_data_only_pre_new[79:16]} ; + + assign miss_wrap_f = (imb_ff[pt.ICACHE_TAG_INDEX_LO] != ifu_fetch_addr_int_f[pt.ICACHE_TAG_INDEX_LO] ) ; + + assign miss_buff_hit_unq_f = ((ic_miss_buff_data_valid[byp_fetch_index[pt.ICACHE_BEAT_ADDR_HI:3]] & ~byp_fetch_index[2] & ~byp_fetch_index[1])) | + ((ic_miss_buff_data_valid[byp_fetch_index[pt.ICACHE_BEAT_ADDR_HI:3]] & ~byp_fetch_index[2] & byp_fetch_index[1])) | + ((ic_miss_buff_data_valid[byp_fetch_index[pt.ICACHE_BEAT_ADDR_HI:3]] & byp_fetch_index[2] & ~byp_fetch_index[1])) | + ((ic_miss_buff_data_valid[byp_fetch_index[pt.ICACHE_BEAT_ADDR_HI:3]] & ic_miss_buff_data_valid[byp_fetch_index_inc[pt.ICACHE_BEAT_ADDR_HI:3]] & byp_fetch_index[2] & byp_fetch_index[1])) | + ((ic_miss_buff_data_valid[byp_fetch_index[pt.ICACHE_BEAT_ADDR_HI:3]] & (byp_fetch_index[pt.ICACHE_BEAT_ADDR_HI:3] == {pt.ICACHE_BEAT_BITS{1'b1}}))) ; + + assign stream_hit_f = (miss_buff_hit_unq_f & ~miss_wrap_f ) & (miss_state==STREAM) ; + assign stream_miss_f = ~(miss_buff_hit_unq_f & ~miss_wrap_f ) & (miss_state==STREAM) & ifc_fetch_req_f; + assign stream_eol_f = (byp_fetch_index[pt.ICACHE_BEAT_ADDR_HI:2] == {pt.ICACHE_BEAT_BITS+1{1'b1}}) & ifc_fetch_req_f & stream_hit_f; + + assign crit_byp_hit_f = (miss_buff_hit_unq_f ) & ((miss_state == CRIT_WRD_RDY) | (miss_state==CRIT_BYP_OK)) ; + +///////////////////////////////////////////////////////////////////////////////////// +// Figure out if you have the data to write. // +///////////////////////////////////////////////////////////////////////////////////// + +assign other_tag[pt.IFU_BUS_TAG-1:0] = {ifu_bus_rid_ff[pt.IFU_BUS_TAG-1:1] , ~ifu_bus_rid_ff[0] } ; +assign second_half_available = ic_miss_buff_data_valid[other_tag] ; +assign write_ic_16_bytes = second_half_available & bus_ifu_wr_en_ff ; +assign ic_miss_buff_half[63:0] = {ic_miss_buff_data[{other_tag,1'b1}],ic_miss_buff_data[{other_tag,1'b0}] } ; + + +///////////////////////////////////////////////////////////////////////////////////// +// Parity checking logic for Icache logic. // +///////////////////////////////////////////////////////////////////////////////////// + + +assign ic_rd_parity_final_err = ic_tag_perr & sel_ic_data & ~(ifc_region_acc_fault_final_f | ifc_bus_acc_fault_f) ; + +logic [pt.ICACHE_NUM_WAYS-1:0] perr_err_inv_way; +logic [pt.ICACHE_INDEX_HI:pt.ICACHE_TAG_INDEX_LO] perr_ic_index_ff; +logic perr_sel_invalidate; +logic perr_sb_write_status ; + + + + rvdffs #(pt.ICACHE_INDEX_HI-pt.ICACHE_TAG_INDEX_LO+1) perr_dat_ff (.clk(active_clk), .din(ifu_ic_rw_int_addr_ff[pt.ICACHE_INDEX_HI:pt.ICACHE_TAG_INDEX_LO]), .dout(perr_ic_index_ff[pt.ICACHE_INDEX_HI : pt.ICACHE_TAG_INDEX_LO]), .en(perr_sb_write_status), .*); + + assign perr_err_inv_way[pt.ICACHE_NUM_WAYS-1:0] = {pt.ICACHE_NUM_WAYS{perr_sel_invalidate}} ; + assign iccm_correct_ecc = (perr_state == ECC_CORR); + assign dma_sb_err_state = (perr_state == DMA_SB_ERR); + assign iccm_buf_correct_ecc = iccm_correct_ecc & ~dma_sb_err_state_ff; + rvdff #((1)) dma_sb_err_ff (.clk(active_clk), .din(dma_sb_err_state), .dout(dma_sb_err_state_ff), .*); + + + + //////////////////////////////////// Create Parity Error State Machine /////////////////////// + // Create Parity Error State Machine // + // Create Parity Error State Machine // + // Create Parity Error State Machine // + //////////////////////////////////// Create Parity Error State Machine /////////////////////// + + + // FIFO state machine + always_comb begin : ERROR_SM + perr_nxtstate = ERR_IDLE; + perr_state_en = 1'b0; + perr_sb_write_status = 1'b0; + perr_sel_invalidate = 1'b0; + + case (perr_state) + ERR_IDLE: begin : err_idle + perr_nxtstate = iccm_dma_sb_error ? DMA_SB_ERR : (ic_error_start & ~exu_flush_final) ? IC_WFF : ECC_WFF; + perr_state_en = (((iccm_error_start | ic_error_start) & ~exu_flush_final) | iccm_dma_sb_error) & ~dec_tlu_force_halt; + perr_sb_write_status = perr_state_en; + end + IC_WFF: begin : icache_wff // All the I$ data and/or Tag errors ( parity/ECC ) will come to this state + perr_nxtstate = ERR_IDLE ; + perr_state_en = dec_tlu_flush_lower_wb | dec_tlu_force_halt ; + perr_sel_invalidate = (dec_tlu_flush_err_wb & dec_tlu_flush_lower_wb); + end + ECC_WFF: begin : ecc_wff + perr_nxtstate = ((~dec_tlu_flush_err_wb & dec_tlu_flush_lower_wb ) | dec_tlu_force_halt) ? ERR_IDLE : ECC_CORR ; + perr_state_en = dec_tlu_flush_lower_wb | dec_tlu_force_halt ; + end + DMA_SB_ERR : begin : dma_sb_ecc + perr_nxtstate = dec_tlu_force_halt ? ERR_IDLE : ECC_CORR; + perr_state_en = 1'b1; + end + ECC_CORR: begin : ecc_corr + perr_nxtstate = ERR_IDLE ; + perr_state_en = 1'b1 ; + end + default: begin : def_case + perr_nxtstate = ERR_IDLE; + perr_state_en = 1'b0; + perr_sb_write_status = 1'b0; + perr_sel_invalidate = 1'b0; + end + endcase + end + rvdffs #(($bits(perr_state_t))) perr_state_ff (.clk(free_clk), .din(perr_nxtstate), .dout({perr_state}), .en(perr_state_en), .*); + + //////////////////////////////////// Create stop fetch State Machine ///////////////////////// + //////////////////////////////////// Create stop fetch State Machine ///////////////////////// + //////////////////////////////////// Create stop fetch State Machine ///////////////////////// + //////////////////////////////////// Create stop fetch State Machine ///////////////////////// + //////////////////////////////////// Create stop fetch State Machine ///////////////////////// + always_comb begin : ERROR_STOP_FETCH + err_stop_nxtstate = ERR_STOP_IDLE; + err_stop_state_en = 1'b0; + err_stop_fetch = 1'b0; + iccm_correction_state = 1'b0; + + case (err_stop_state) + ERR_STOP_IDLE: begin : err_stop_idle + err_stop_nxtstate = ERR_FETCH1; + err_stop_state_en = dec_tlu_flush_err_wb & (perr_state == ECC_WFF) & ~dec_tlu_force_halt; + end + ERR_FETCH1: begin : err_fetch1 // All the I$ data and/or Tag errors ( parity/ECC ) will come to this state + err_stop_nxtstate = (dec_tlu_flush_lower_wb | dec_tlu_i0_commit_cmt | dec_tlu_force_halt) ? ERR_STOP_IDLE : ((ifu_fetch_val[1:0] == 2'b11) | (ifu_fetch_val[0] & two_byte_instr)) ? ERR_STOP_FETCH : ifu_fetch_val[0] ? ERR_FETCH2 : ERR_FETCH1; + err_stop_state_en = dec_tlu_flush_lower_wb | dec_tlu_i0_commit_cmt | ifu_fetch_val[0] | ifu_bp_hit_taken_q_f | dec_tlu_force_halt; + err_stop_fetch = ((ifu_fetch_val[1:0] == 2'b11) | (ifu_fetch_val[0] & two_byte_instr)) & ~(exu_flush_final | dec_tlu_i0_commit_cmt); + iccm_correction_state = 1'b1; + + end + ERR_FETCH2: begin : err_fetch2 // All the I$ data and/or Tag errors ( parity/ECC ) will come to this state + err_stop_nxtstate = (dec_tlu_flush_lower_wb | dec_tlu_i0_commit_cmt | dec_tlu_force_halt) ? ERR_STOP_IDLE : ifu_fetch_val[0] ? ERR_STOP_FETCH : ERR_FETCH2; + err_stop_state_en = dec_tlu_flush_lower_wb | dec_tlu_i0_commit_cmt | ifu_fetch_val[0] | dec_tlu_force_halt ; + err_stop_fetch = ifu_fetch_val[0] & ~exu_flush_final & ~dec_tlu_i0_commit_cmt ; + iccm_correction_state = 1'b1; + + end + ERR_STOP_FETCH: begin : ecc_wff + err_stop_nxtstate = ( (dec_tlu_flush_lower_wb & ~dec_tlu_flush_err_wb) | dec_tlu_i0_commit_cmt | dec_tlu_force_halt) ? ERR_STOP_IDLE : dec_tlu_flush_err_wb ? ERR_FETCH1 : ERR_STOP_FETCH ; + err_stop_state_en = dec_tlu_flush_lower_wb | dec_tlu_i0_commit_cmt | dec_tlu_force_halt ; + err_stop_fetch = 1'b1; + iccm_correction_state = 1'b1; + + end + default: begin : def_case + err_stop_nxtstate = ERR_STOP_IDLE; + err_stop_state_en = 1'b0; + err_stop_fetch = 1'b0 ; + iccm_correction_state = 1'b1; + + end + endcase + end + rvdffs #(($bits(err_stop_state_t))) err_stop_state_ff (.clk(free_clk), .din(err_stop_nxtstate), .dout({err_stop_state}), .en(err_stop_state_en), .*); + + + + assign bus_ifu_bus_clk_en = ifu_bus_clk_en ; + + rvclkhdr bus_clk_f(.en(bus_ifu_bus_clk_en), + .l1clk(busclk), .*); + + rvclkhdr bus_clk(.en(bus_ifu_bus_clk_en | dec_tlu_force_halt), + .l1clk(busclk_force), .*); + + rvdff #(1) bus_clken_ff (.*, .clk(free_clk), .din(bus_ifu_bus_clk_en), .dout(bus_ifu_bus_clk_en_ff)); + rvdff #(1) scnd_mss_req_ff (.*, .clk(free_clk), .din(scnd_miss_req_in), .dout(scnd_miss_req_q)); + rvdff #(1) scnd_mss_req_ff2 (.*, .clk(free_clk), .din(scnd_miss_req), .dout(scnd_miss_req_ff2)); + assign scnd_miss_req = scnd_miss_req_q & ~exu_flush_final; + + assign ifc_bus_ic_req_ff_in = (ic_act_miss_f | bus_cmd_req_hold | ifu_bus_cmd_valid) & ~dec_tlu_force_halt & ~((bus_cmd_beat_count== {pt.ICACHE_BEAT_BITS{1'b1}}) & ifu_bus_cmd_valid & ifu_bus_cmd_ready & miss_pending); + rvdff #(1) bus_ic_req_ff2(.*, .clk(busclk_force), .din(ifc_bus_ic_req_ff_in), .dout(ifu_bus_cmd_valid)); + + assign bus_cmd_req_in = (ic_act_miss_f | bus_cmd_req_hold) & ~bus_cmd_sent & ~dec_tlu_force_halt ; // hold until first command sent + // changes for making the bus blocking + rvdff #(1) bus_cmd_req_ff (.*, .clk(free_clk), .din(bus_cmd_req_in), .dout(bus_cmd_req_hold)); + + + // AXI command signals + // Read Channel + assign ifu_axi_arvalid = ifu_bus_cmd_valid ; + assign ifu_axi_arid[pt.IFU_BUS_TAG-1:0] = ((pt.IFU_BUS_TAG)'(bus_rd_addr_count[pt.ICACHE_BEAT_BITS-1:0])) & {pt.IFU_BUS_TAG{ifu_bus_cmd_valid}}; + assign ifu_axi_araddr[31:0] = {ifu_ic_req_addr_f[31:3],3'b0} & {32{ifu_bus_cmd_valid}}; + assign ifu_axi_arsize[2:0] = 3'b011; + assign ifu_axi_arprot[2:0] = '0; + assign ifu_axi_arcache[3:0] = 4'b1111; + assign ifu_axi_arregion[3:0] = ifu_ic_req_addr_f[31:28]; + assign ifu_axi_arlen[7:0] = '0; + assign ifu_axi_arburst[1:0] = 2'b01; + assign ifu_axi_arqos[3:0] = '0; + assign ifu_axi_arlock = '0; + assign ifu_axi_rready = 1'b1; + + // Write Channel + assign ifu_axi_awvalid = '0 ; + assign ifu_axi_awid[pt.IFU_BUS_TAG-1:0] = '0 ; + assign ifu_axi_awaddr[31:0] = '0 ; + assign ifu_axi_awsize[2:0] = '0 ; + assign ifu_axi_awprot[2:0] = '0; + assign ifu_axi_awcache[3:0] = '0 ; + assign ifu_axi_awregion[3:0] = '0 ; + assign ifu_axi_awlen[7:0] = '0; + assign ifu_axi_awburst[1:0] = '0 ; + assign ifu_axi_awqos[3:0] = '0; + assign ifu_axi_awlock = '0; + + assign ifu_axi_wvalid = '0; + assign ifu_axi_wstrb[7:0] = '0; + assign ifu_axi_wdata[63:0] = '0; + assign ifu_axi_wlast = '0; + assign ifu_axi_bready = '0; + + + assign ifu_bus_arready_unq = ifu_axi_arready ; + assign ifu_bus_rvalid_unq = ifu_axi_rvalid ; + assign ifu_bus_arvalid = ifu_axi_arvalid ; + + rvdff #(1) bus_rdy_ff (.*, .clk(busclk), .din(ifu_bus_arready_unq), .dout(ifu_bus_arready_unq_ff)); + rvdff #(1) bus_rsp_vld_ff (.*, .clk(busclk), .din(ifu_bus_rvalid_unq), .dout(ifu_bus_rvalid_unq_ff)); + rvdff #(1) bus_cmd_ff (.*, .clk(busclk), .din(ifu_bus_arvalid), .dout(ifu_bus_arvalid_ff)); + rvdff #(2) bus_rsp_cmd_ff (.*, .clk(busclk), .din(ifu_axi_rresp[1:0]), .dout(ifu_bus_rresp_ff[1:0])); + rvdff #(64) bus_data_ff (.*, .clk(busclk), .din(ifu_axi_rdata[63:0]), .dout(ifu_bus_rdata_ff[63:0])); + rvdff #(pt.IFU_BUS_TAG) bus_rsp_tag_ff (.*, .clk(busclk), .din(ifu_axi_rid[pt.IFU_BUS_TAG-1:0]),.dout(ifu_bus_rid_ff[pt.IFU_BUS_TAG-1:0])); + + assign ifu_bus_cmd_ready = ifu_axi_arready ; + assign ifu_bus_rsp_valid = ifu_axi_rvalid ; + assign ifu_bus_rsp_ready = ifu_axi_rready ; + assign ifu_bus_rsp_tag[pt.IFU_BUS_TAG-1:0] = ifu_axi_rid[pt.IFU_BUS_TAG-1:0] ; + assign ifu_bus_rsp_rdata[63:0] = ifu_axi_rdata[63:0] ; + assign ifu_bus_rsp_opc[1:0] = {ifu_axi_rresp[1:0]} ; + + + + + + + + + + + + + // Create write signals so we can write to the miss-buffer directly from + // the bus. + + assign ifu_bus_rvalid = ifu_bus_rsp_valid & bus_ifu_bus_clk_en ; + + + + assign ifu_bus_arready = ifu_bus_arready_unq & bus_ifu_bus_clk_en ; + assign ifu_bus_arready_ff = ifu_bus_arready_unq_ff & bus_ifu_bus_clk_en_ff ; + + assign ifu_bus_rvalid_ff = ifu_bus_rvalid_unq_ff & bus_ifu_bus_clk_en_ff ; + assign bus_cmd_sent = ifu_bus_arvalid & ifu_bus_arready & miss_pending & ~dec_tlu_force_halt; + assign bus_inc_data_beat_cnt = (bus_ifu_wr_en_ff & ~bus_last_data_beat & ~dec_tlu_force_halt) ; + assign bus_reset_data_beat_cnt = ic_act_miss_f | (bus_ifu_wr_en_ff & bus_last_data_beat) | dec_tlu_force_halt; + assign bus_hold_data_beat_cnt = ~bus_inc_data_beat_cnt & ~bus_reset_data_beat_cnt ; + + assign bus_new_data_beat_count[pt.ICACHE_BEAT_BITS-1:0] = ({pt.ICACHE_BEAT_BITS{bus_reset_data_beat_cnt}} & (pt.ICACHE_BEAT_BITS)'(0)) | + ({pt.ICACHE_BEAT_BITS{bus_inc_data_beat_cnt}} & (bus_data_beat_count[pt.ICACHE_BEAT_BITS-1:0] + {{pt.ICACHE_BEAT_BITS-1{1'b0}},1'b1})) | + ({pt.ICACHE_BEAT_BITS{bus_hold_data_beat_cnt}} & bus_data_beat_count[pt.ICACHE_BEAT_BITS-1:0]); + + rvdff #(pt.ICACHE_BEAT_BITS) bus_mb_beat_count_ff (.*, .clk(free_clk), .din ({bus_new_data_beat_count[pt.ICACHE_BEAT_BITS-1:0]}), .dout({bus_data_beat_count[pt.ICACHE_BEAT_BITS-1:0]})); + + assign last_data_recieved_in = (bus_ifu_wr_en_ff & bus_last_data_beat & ~scnd_miss_req) | (last_data_recieved_ff & ~ic_act_miss_f) ; + rvdff #(1) last_beat_ff (.*, .clk(free_clk), .din (last_data_recieved_in), .dout(last_data_recieved_ff)); + + +// Request Address Count + assign bus_new_rd_addr_count[pt.ICACHE_BEAT_BITS-1:0] = (~miss_pending ) ? imb_ff[pt.ICACHE_BEAT_ADDR_HI:3] : + ( scnd_miss_req_q ) ? imb_scnd_ff[pt.ICACHE_BEAT_ADDR_HI:3] : + ( bus_cmd_sent ) ? (bus_rd_addr_count[pt.ICACHE_BEAT_BITS-1:0] + 3'b001) : + bus_rd_addr_count[pt.ICACHE_BEAT_BITS-1:0]; + + rvdff #(pt.ICACHE_BEAT_BITS) bus_rd_addr_ff (.*, .clk(busclk_reset), .din ({bus_new_rd_addr_count[pt.ICACHE_BEAT_BITS-1:0]}), .dout({bus_rd_addr_count[pt.ICACHE_BEAT_BITS-1:0]})); + + + +// command beat Count + assign bus_inc_cmd_beat_cnt = ifu_bus_cmd_valid & ifu_bus_cmd_ready & miss_pending & ~dec_tlu_force_halt; + assign bus_reset_cmd_beat_cnt_0 = (ic_act_miss_f & ~uncacheable_miss_in) | dec_tlu_force_halt ; + assign bus_reset_cmd_beat_cnt_secondlast = ic_act_miss_f & uncacheable_miss_in ; + assign bus_hold_cmd_beat_cnt = ~bus_inc_cmd_beat_cnt & ~(ic_act_miss_f | scnd_miss_req | dec_tlu_force_halt) ; + assign bus_cmd_beat_en = bus_inc_cmd_beat_cnt | ic_act_miss_f | dec_tlu_force_halt; + + assign bus_new_cmd_beat_count[pt.ICACHE_BEAT_BITS-1:0] = ({pt.ICACHE_BEAT_BITS{bus_reset_cmd_beat_cnt_0}} & (pt.ICACHE_BEAT_BITS)'(0) ) | + ({pt.ICACHE_BEAT_BITS{bus_reset_cmd_beat_cnt_secondlast}} & (pt.ICACHE_BEAT_BITS)'(pt.ICACHE_SCND_LAST)) | + ({pt.ICACHE_BEAT_BITS{bus_inc_cmd_beat_cnt}} & (bus_cmd_beat_count[pt.ICACHE_BEAT_BITS-1:0] + {{pt.ICACHE_BEAT_BITS-1{1'b0}}, 1'b1})) | + ({pt.ICACHE_BEAT_BITS{bus_hold_cmd_beat_cnt}} & bus_cmd_beat_count[pt.ICACHE_BEAT_BITS-1:0]) ; + + rvclkhdr bus_clk_reset(.en(bus_ifu_bus_clk_en | ic_act_miss_f | dec_tlu_force_halt), + .l1clk(busclk_reset), .*); + + + rvdffs #(pt.ICACHE_BEAT_BITS) bus_cmd_beat_ff (.*, .clk(busclk_reset), .en (bus_cmd_beat_en), .din ({bus_new_cmd_beat_count[pt.ICACHE_BEAT_BITS-1:0]}), + .dout({bus_cmd_beat_count[pt.ICACHE_BEAT_BITS-1:0]})); + + + assign bus_last_data_beat = uncacheable_miss_ff ? (bus_data_beat_count[pt.ICACHE_BEAT_BITS-1:0] == {{pt.ICACHE_BEAT_BITS-1{1'b0}},1'b1}) : (&bus_data_beat_count[pt.ICACHE_BEAT_BITS-1:0]); + + assign bus_ifu_wr_en = ifu_bus_rvalid & miss_pending ; + assign bus_ifu_wr_en_ff = ifu_bus_rvalid_ff & miss_pending ; + assign bus_ifu_wr_en_ff_q = ifu_bus_rvalid_ff & miss_pending & ~uncacheable_miss_ff & ~(|ifu_bus_rresp_ff[1:0]) & write_ic_16_bytes; // qualify with no-error conditions ; + assign bus_ifu_wr_en_ff_wo_err = ifu_bus_rvalid_ff & miss_pending & ~uncacheable_miss_ff; + + + rvdff #(1) act_miss_ff (.*, .clk(free_clk), .din (ic_act_miss_f), .dout(ic_act_miss_f_delayed)); + assign reset_tag_valid_for_miss = ic_act_miss_f_delayed & (miss_state == CRIT_BYP_OK) & ~uncacheable_miss_ff; + assign bus_ifu_wr_data_error = |ifu_bus_rsp_opc[1:0] & ifu_bus_rvalid & miss_pending; + assign bus_ifu_wr_data_error_ff = |ifu_bus_rresp_ff[1:0] & ifu_bus_rvalid_ff & miss_pending; + + rvdff #(1) dma_ok_prev_ff (.*, .clk(free_clk), .din(ifc_dma_access_ok_d), .dout(ifc_dma_access_ok_prev)); + + assign ic_crit_wd_rdy = ic_crit_wd_rdy_new_in | ic_crit_wd_rdy_new_ff ; + assign last_beat = bus_last_data_beat & bus_ifu_wr_en_ff; + assign reset_beat_cnt = bus_reset_data_beat_cnt ; + +// DMA + // Making sure that the dma_access is allowed when we have 2 back to back dma_access_ok. Also gating with current state == idle + assign ifc_dma_access_ok_d = ifc_dma_access_ok & ~iccm_correct_ecc & ~iccm_dma_sb_error; + assign ifc_dma_access_q_ok = ifc_dma_access_ok & ~iccm_correct_ecc & ifc_dma_access_ok_prev & (perr_state == ERR_IDLE) & ~iccm_dma_sb_error; + assign iccm_ready = ifc_dma_access_q_ok ; + rvdff #(1) dma_req_ff (.*, .clk(free_clk), .din (dma_iccm_req), .dout(dma_iccm_req_f)); + + logic [1:0] iccm_ecc_word_enable; + + if (pt.ICCM_ENABLE == 1 ) begin: iccm_enabled + logic [3:2] dma_mem_addr_ff ; + logic iccm_dma_rden ; + + logic iccm_dma_ecc_error_in; + logic [13:0] dma_mem_ecc; + logic [63:0] iccm_dma_rdata_in; + logic [31:0] iccm_dma_rdata_1_muxed; + logic [1:0] [31:0] iccm_corrected_data; + logic [1:0] [06:0] iccm_corrected_ecc; + + + logic [1:0] iccm_double_ecc_error; + + + logic [pt.ICCM_BITS-1:2] iccm_rw_addr_f; + + logic [31:0] iccm_corrected_data_f_mux; + logic [06:0] iccm_corrected_ecc_f_mux; + logic iccm_dma_rvalid_in; + logic [77:0] iccm_rdmux_data; + logic iccm_rd_ecc_single_err_hold_in ; + logic [2:0] dma_mem_tag_ff; + + + + + assign iccm_wren = (ifc_dma_access_q_ok & dma_iccm_req & dma_mem_write) | iccm_correct_ecc; + assign iccm_rden = (ifc_dma_access_q_ok & dma_iccm_req & ~dma_mem_write) | (ifc_iccm_access_bf & ifc_fetch_req_bf); + assign iccm_dma_rden = (ifc_dma_access_q_ok & dma_iccm_req & ~dma_mem_write) ; + assign iccm_wr_size[2:0] = {3{dma_iccm_req}} & dma_mem_sz[2:0] ; + + rvecc_encode iccm_ecc_encode0 ( + .din(dma_mem_wdata[31:0]), + .ecc_out(dma_mem_ecc[6:0])); + + rvecc_encode iccm_ecc_encode1 ( + .din(dma_mem_wdata[63:32]), + .ecc_out(dma_mem_ecc[13:7])); + + assign iccm_wr_data[77:0] = (iccm_correct_ecc & ~(ifc_dma_access_q_ok & dma_iccm_req)) ? {iccm_ecc_corr_data_ff[38:0], iccm_ecc_corr_data_ff[38:0]} : + {dma_mem_ecc[13:7],dma_mem_wdata[63:32], dma_mem_ecc[6:0],dma_mem_wdata[31:0]}; + + assign iccm_dma_rdata_1_muxed[31:0] = dma_mem_addr_ff[2] ? iccm_corrected_data[0][31:0] : iccm_corrected_data[1][31:0] ; + assign iccm_dma_rdata_in[63:0] = iccm_dma_ecc_error_in ? {2{dma_mem_addr[31:0]}} : {iccm_dma_rdata_1_muxed[31:0], iccm_corrected_data[0]}; + assign iccm_dma_ecc_error_in = |(iccm_double_ecc_error[1:0]); + + rvdff #(3) dma_tag_ff1 (.*, .clk(free_clk), .din(dma_mem_tag[2:0]), .dout(dma_mem_tag_ff[2:0])); + rvdff #(3) dma_tag_ff2 (.*, .clk(free_clk), .din(dma_mem_tag_ff[2:0]), .dout(iccm_dma_rtag[2:0])); + rvdff #(2) dma_addr_bt3_ff (.*, .clk(free_clk), .din(dma_mem_addr[3:2]), .dout(dma_mem_addr_ff[3:2])); + rvdff #(1) ccm_rdy_in_ff (.*, .clk(free_clk), .din(iccm_dma_rden), .dout(iccm_dma_rvalid_in)); + rvdff #(1) ccm_rdy_ff (.*, .clk(free_clk), .din(iccm_dma_rvalid_in), .dout(iccm_dma_rvalid)); + rvdff #(1) ccm_err_ff (.*, .clk(free_clk), .din(iccm_dma_ecc_error_in), .dout(iccm_dma_ecc_error)); + rvdff #(64)dma_data_ff (.*, .clk(free_clk), .din(iccm_dma_rdata_in[63:0]), .dout(iccm_dma_rdata[63:0])); + + assign iccm_rw_addr[pt.ICCM_BITS-1:1] = ( ifc_dma_access_q_ok & dma_iccm_req & ~iccm_correct_ecc) ? dma_mem_addr[pt.ICCM_BITS-1:1] : + (~(ifc_dma_access_q_ok & dma_iccm_req) & iccm_correct_ecc) ? {iccm_ecc_corr_index_ff[pt.ICCM_BITS-1:2],1'b0} : ifc_fetch_addr_bf[pt.ICCM_BITS-1:1] ; + + + + +///////////////////////////////////////////////////////////////////////////////////// +// ECC checking logic for ICCM data. // +///////////////////////////////////////////////////////////////////////////////////// + + logic [3:0] ic_fetch_val_int_f; + logic [3:0] ic_fetch_val_shift_right; + assign ic_fetch_val_int_f[3:0] = {2'b00 , ic_fetch_val_f[1:0] } ; + assign ic_fetch_val_shift_right[3:0] = {ic_fetch_val_int_f << ifu_fetch_addr_int_f[1] } ; + + assign iccm_rdmux_data[77:0] = iccm_rd_data_ecc[77:0]; + for (genvar i=0; i < 2 ; i++) begin : ICCM_ECC_CHECK + assign iccm_ecc_word_enable[i] = ((|ic_fetch_val_shift_right[(2*i+1):(2*i)] & ~exu_flush_final & sel_iccm_data) | iccm_dma_rvalid_in) & ~dec_tlu_core_ecc_disable; + rvecc_decode ecc_decode ( + .en(iccm_ecc_word_enable[i]), + .sed_ded ( 1'b0 ), // 1 : means only detection + .din(iccm_rdmux_data[(39*i+31):(39*i)]), + .ecc_in(iccm_rdmux_data[(39*i+38):(39*i+32)]), + .dout(iccm_corrected_data[i][31:0]), + .ecc_out(iccm_corrected_ecc[i][6:0]), + .single_ecc_error(iccm_single_ecc_error[i]), + .double_ecc_error(iccm_double_ecc_error[i])); +end + + assign iccm_rd_ecc_single_err = (|iccm_single_ecc_error[1:0] ) & ifc_iccm_access_f & ifc_fetch_req_f; + assign iccm_rd_ecc_double_err = (|iccm_double_ecc_error[1:0] ) & ifc_iccm_access_f; + + assign iccm_corrected_data_f_mux[31:0] = iccm_single_ecc_error[0] ? iccm_corrected_data[0] : iccm_corrected_data[1]; + assign iccm_corrected_ecc_f_mux[6:0] = iccm_single_ecc_error[0] ? iccm_corrected_ecc[0] : iccm_corrected_ecc[1]; + + assign iccm_ecc_write_status = ((iccm_rd_ecc_single_err & ~iccm_rd_ecc_single_err_ff) & ~exu_flush_final) | iccm_dma_sb_error; + assign iccm_rd_ecc_single_err_hold_in = (iccm_rd_ecc_single_err | iccm_rd_ecc_single_err_ff) & ~exu_flush_final ; // & ~(perr_state == ERR_IDLE); + assign iccm_error_start = iccm_rd_ecc_single_err; + assign iccm_ecc_corr_index_in[pt.ICCM_BITS-1:2] = iccm_single_ecc_error[0] ? iccm_rw_addr_f[pt.ICCM_BITS-1:2] : iccm_rw_addr_f[pt.ICCM_BITS-1:2] + 1'b1 ; + + rvdff #(pt.ICCM_BITS-2) iccm_index_f (.*, .clk(free_clk), .din(iccm_rw_addr[pt.ICCM_BITS-1:2]), .dout(iccm_rw_addr_f[pt.ICCM_BITS-1:2])); + rvdff #((1)) ecc_rr_ff (.clk(free_clk), .din(iccm_rd_ecc_single_err_hold_in), .dout(iccm_rd_ecc_single_err_ff), .*); + rvdffs #((32)) ecc_dat0_ff (.clk(free_clk), .din(iccm_corrected_data_f_mux[31:0]), .dout(iccm_ecc_corr_data_ff[31:0]), .en(iccm_ecc_write_status), .*); + rvdffs #((7)) ecc_dat1_ff (.clk(free_clk), .din(iccm_corrected_ecc_f_mux[6:0]), .dout(iccm_ecc_corr_data_ff[38:32]), .en(iccm_ecc_write_status), .*); + rvdffs #((pt.ICCM_BITS-2))ecc_ind0_ff (.clk(free_clk), .din(iccm_ecc_corr_index_in[pt.ICCM_BITS-1:2]), .dout(iccm_ecc_corr_index_ff[pt.ICCM_BITS-1:2]),.en(iccm_ecc_write_status), .*); + + end else begin : iccm_disabled + assign iccm_dma_rvalid = 1'b0 ; + assign iccm_dma_ecc_error = 1'b0 ; + assign iccm_dma_rdata[63:0] = '0 ; + assign iccm_single_ecc_error = '0 ; + assign iccm_dma_rtag = '0 ; + + + + + + + assign iccm_rd_ecc_single_err = 1'b0 ; + assign iccm_rd_ecc_double_err = 1'b0 ; + assign iccm_rd_ecc_single_err_ff = 1'b0 ; + assign iccm_error_start = 1'b0; + assign iccm_ecc_corr_index_ff[pt.ICCM_BITS-1:2] = '0; + assign iccm_ecc_corr_data_ff[38:0] = '0; + assign iccm_ecc_write_status = '0; + + + + + + + end + + +////// ICCM signals + + +// Use the equation below for more power savings. + assign ic_rd_en = (ifc_fetch_req_bf & ~ifc_fetch_uncacheable_bf & ~ifc_iccm_access_bf & + ~(((miss_state == STREAM) & ~miss_state_en) | + ((miss_state == CRIT_BYP_OK) & ~miss_state_en) | + ((miss_state == STALL_SCND_MISS) & ~miss_state_en) | + ((miss_state == MISS_WAIT) & ~miss_state_en) | + ((miss_state == CRIT_WRD_RDY) & ~miss_state_en) | + ((miss_state == CRIT_BYP_OK) & miss_state_en & (miss_nxtstate == MISS_WAIT)) )) | + ( ifc_fetch_req_bf & exu_flush_final & ~ifc_fetch_uncacheable_bf & ~ifc_iccm_access_bf ) ; + + +logic ic_real_rd_wp_unused; +assign ic_real_rd_wp_unused = (ifc_fetch_req_bf & ~ifc_iccm_access_bf & ~ifc_region_acc_fault_final_bf & ~dec_tlu_fence_i_wb & ~stream_miss_f & ~ic_act_miss_f & + ~(((miss_state == STREAM) & ~miss_state_en) | + ((miss_state == CRIT_BYP_OK) & ~miss_state_en & ~(miss_nxtstate == MISS_WAIT)) | + ((miss_state == CRIT_BYP_OK) & miss_state_en & (miss_nxtstate == MISS_WAIT)) | + ((miss_state == MISS_WAIT) & ~miss_state_en) | + ((miss_state == STALL_SCND_MISS) & ~miss_state_en) | + ((miss_state == CRIT_WRD_RDY) & ~miss_state_en) | + ((miss_nxtstate == STREAM) & miss_state_en) | + ((miss_state == SCND_MISS) & ~miss_state_en))) | + (ifc_fetch_req_bf & ~ifc_iccm_access_bf & ~ifc_region_acc_fault_final_bf & ~dec_tlu_fence_i_wb & ~stream_miss_f & exu_flush_final) ; + + +assign ic_wr_en[pt.ICACHE_NUM_WAYS-1:0] = bus_ic_wr_en[pt.ICACHE_NUM_WAYS-1:0] & {pt.ICACHE_NUM_WAYS{write_ic_16_bytes}}; +assign ic_write_stall = write_ic_16_bytes & ~((((miss_state== CRIT_BYP_OK) | (miss_state==STREAM)) & ~(bus_ifu_wr_en_ff & last_beat & ~uncacheable_miss_ff))); + + rvdff #(1) reset_all_tag_ff (.*, .clk(active_clk), .din(dec_tlu_fence_i_wb), .dout(reset_all_tags)); + + + +/////////////////////////////////////////////////////////////// +// Icache status and LRU +/////////////////////////////////////////////////////////////// +logic [pt.ICACHE_NUM_WAYS-1:0] ic_tag_valid_unq; +if (pt.ICACHE_ENABLE == 1 ) begin: icache_enabled + assign ic_valid = ~ifu_wr_cumulative_err_data & ~(reset_ic_in | reset_ic_ff) & ~reset_tag_valid_for_miss; + + assign ifu_status_wr_addr_w_debug[pt.ICACHE_INDEX_HI:pt.ICACHE_TAG_INDEX_LO] = ((ic_debug_rd_en | ic_debug_wr_en ) & ic_debug_tag_array) ? + ic_debug_addr[pt.ICACHE_INDEX_HI:pt.ICACHE_TAG_INDEX_LO] : + ifu_status_wr_addr[pt.ICACHE_INDEX_HI:pt.ICACHE_TAG_INDEX_LO]; + + // status + rvdff #(pt.ICACHE_TAG_LO-pt.ICACHE_TAG_INDEX_LO) status_wr_addr_ff (.*, .clk(free_clk), .din(ifu_status_wr_addr_w_debug[pt.ICACHE_INDEX_HI:pt.ICACHE_TAG_INDEX_LO]), + .dout(ifu_status_wr_addr_ff[pt.ICACHE_INDEX_HI:pt.ICACHE_TAG_INDEX_LO])); + + assign way_status_wr_en_w_debug = way_status_wr_en | (ic_debug_wr_en & ic_debug_tag_array); + rvdff #(1) status_wren_ff (.*, .clk(free_clk), .din(way_status_wr_en_w_debug), .dout(way_status_wr_en_ff)); + + assign way_status_new_w_debug[pt.ICACHE_STATUS_BITS-1:0] = (ic_debug_wr_en & ic_debug_tag_array) ? (pt.ICACHE_STATUS_BITS == 1) ? ic_debug_wr_data[4] : ic_debug_wr_data[6:4] : + way_status_new[pt.ICACHE_STATUS_BITS-1:0] ; + rvdff #(pt.ICACHE_STATUS_BITS) status_data_ff (.*, .clk(free_clk), .din(way_status_new_w_debug[pt.ICACHE_STATUS_BITS-1:0]), .dout(way_status_new_ff[pt.ICACHE_STATUS_BITS-1:0])); + + logic [(pt.ICACHE_TAG_DEPTH/8)-1 : 0] way_status_clken; + logic [(pt.ICACHE_TAG_DEPTH/8)-1 : 0] way_status_clk; + + for (genvar i=0 ; i<32'(pt.ICACHE_TAG_DEPTH)/8 ; i++) begin : CLK_GRP_WAY_STATUS + assign way_status_clken[i] = (ifu_status_wr_addr_ff[pt.ICACHE_INDEX_HI:pt.ICACHE_TAG_INDEX_LO+3] == i ); + rvclkhdr way_status_cgc ( .en(way_status_clken[i]), .l1clk(way_status_clk[i]), .* ); + + for (genvar j=0 ; j<8 ; j++) begin : WAY_STATUS + rvdffs #(pt.ICACHE_STATUS_BITS) ic_way_status (.*, + .clk(way_status_clk[i]), + .en(((ifu_status_wr_addr_ff[pt.ICACHE_TAG_INDEX_LO+2:pt.ICACHE_TAG_INDEX_LO] == j) & way_status_wr_en_ff)), + .din(way_status_new_ff[pt.ICACHE_STATUS_BITS-1:0]), + .dout(way_status_out[8*i+j])); + end // WAY_STATUS + end // CLK_GRP_WAY_STATUS + + always_comb begin : way_status_out_mux + way_status[pt.ICACHE_STATUS_BITS-1:0] = '0 ; + for (int j=0; j< 32'(pt.ICACHE_TAG_DEPTH); j++) begin : status_mux_loop + if (ifu_ic_rw_int_addr_ff[pt.ICACHE_INDEX_HI:pt.ICACHE_TAG_INDEX_LO] == (pt.ICACHE_TAG_LO-pt.ICACHE_TAG_INDEX_LO)'(j)) begin : mux_out + way_status[pt.ICACHE_STATUS_BITS-1:0] = way_status_out[j]; + end + end + end + +assign ifu_ic_rw_int_addr_w_debug[pt.ICACHE_INDEX_HI:pt.ICACHE_TAG_INDEX_LO] = ((ic_debug_rd_en | ic_debug_wr_en ) & ic_debug_tag_array) ? + ic_debug_addr[pt.ICACHE_INDEX_HI:pt.ICACHE_TAG_INDEX_LO] : + ifu_ic_rw_int_addr[pt.ICACHE_INDEX_HI:pt.ICACHE_TAG_INDEX_LO]; + + rvdff #(pt.ICACHE_TAG_LO-pt.ICACHE_TAG_INDEX_LO) tag_addr_ff (.*, .clk(free_clk), + .din(ifu_ic_rw_int_addr_w_debug[pt.ICACHE_INDEX_HI:pt.ICACHE_TAG_INDEX_LO]), + .dout(ifu_ic_rw_int_addr_ff[pt.ICACHE_INDEX_HI:pt.ICACHE_TAG_INDEX_LO])); + + assign ifu_tag_wren_w_debug[pt.ICACHE_NUM_WAYS-1:0] = ifu_tag_wren[pt.ICACHE_NUM_WAYS-1:0] | ic_debug_tag_wr_en[pt.ICACHE_NUM_WAYS-1:0] ; + rvdff #(pt.ICACHE_NUM_WAYS) tag_v_we_ff (.*, .clk(free_clk), + .din(ifu_tag_wren_w_debug[pt.ICACHE_NUM_WAYS-1:0]), + .dout(ifu_tag_wren_ff[pt.ICACHE_NUM_WAYS-1:0])); + + assign ic_valid_w_debug = (ic_debug_wr_en & ic_debug_tag_array) ? ic_debug_wr_data[0] : ic_valid; + rvdff #(1) tag_v_ff (.*, .clk(free_clk), + .din(ic_valid_w_debug), + .dout(ic_valid_ff)); + + logic [pt.ICACHE_NUM_WAYS-1:0] [pt.ICACHE_TAG_DEPTH-1:0] ic_tag_valid_out ; + + logic [(pt.ICACHE_TAG_DEPTH/32)-1:0] [pt.ICACHE_NUM_WAYS-1:0] tag_valid_clken ; + logic [(pt.ICACHE_TAG_DEPTH/32)-1:0] [pt.ICACHE_NUM_WAYS-1:0] tag_valid_clk ; + + for (genvar i=0 ; i<32'(pt.ICACHE_TAG_DEPTH)/32 ; i++) begin : CLK_GRP_TAG_VALID + for (genvar j=0; j<32'(pt.ICACHE_NUM_WAYS); j++) begin : way_clken + if (pt.ICACHE_TAG_DEPTH == 32 ) begin + assign tag_valid_clken[i][j] = ifu_tag_wren_ff[j] | perr_err_inv_way[j] | reset_all_tags; + end else begin + assign tag_valid_clken[i][j] = (((ifu_ic_rw_int_addr_ff[pt.ICACHE_INDEX_HI:pt.ICACHE_TAG_INDEX_LO+5] == i ) & ifu_tag_wren_ff[j] ) | + ((perr_ic_index_ff [pt.ICACHE_INDEX_HI:pt.ICACHE_TAG_INDEX_LO+5] == i ) & perr_err_inv_way[j]) | reset_all_tags); + end + + rvclkhdr way_status_cgc ( .en(tag_valid_clken[i][j]), .l1clk(tag_valid_clk[i][j]), .* ); + + for (genvar k=0 ; k<32 ; k++) begin : TAG_VALID + rvdffs #(1) ic_way_tagvalid_dup (.*, + .clk(tag_valid_clk[i][j]), + .en(((ifu_ic_rw_int_addr_ff[pt.ICACHE_INDEX_HI:pt.ICACHE_TAG_INDEX_LO] == (k + 32*i)) & ifu_tag_wren_ff[j] ) | + ((perr_ic_index_ff [pt.ICACHE_INDEX_HI:pt.ICACHE_TAG_INDEX_LO] == (k + 32*i)) & perr_err_inv_way[j]) | reset_all_tags), + .din(ic_valid_ff & ~reset_all_tags & ~perr_sel_invalidate), + .dout(ic_tag_valid_out[j][32*i+k])); + end + end + end + + + always_comb begin : tag_valid_out_mux + ic_tag_valid_unq[pt.ICACHE_NUM_WAYS-1:0] = '0; + for (int j=0; j< pt.ICACHE_TAG_DEPTH; j++) begin : tag_valid_loop + if (ifu_ic_rw_int_addr_ff[pt.ICACHE_INDEX_HI:pt.ICACHE_TAG_INDEX_LO] == (pt.ICACHE_TAG_LO-pt.ICACHE_TAG_INDEX_LO)'(j)) begin : valid_out + for ( int k=0; k=1 & clk_count<=3) rst_l <= 1'b0; + else rst_l <= 1'b1; + + if (clk_count > 3) begin + + compressed_din[15:0] <= compressed[clk_count-3]; // c.mv + expected_val[31:0] <= expected[clk_count-3]; + + end + + if (clk_count == 65000) begin + $dumpoff; + $finish; + end + end // always @ (posedge clk) + + always @(negedge clk) begin + if (clk_count > 3 & error) begin + $display("clock: %d compressed %h error actual %h expected %h",clk_count,compressed_din,actual,expected_val); + end + end + + + el2_ifu_compress_ctl align (.*,.din(compressed_din[15:0]),.dout(actual[31:0])); + + assign error = actual[31:0] != expected_val[31:0]; + + + +endmodule // el2_ifu_tb_memread + + diff --git a/design/include/el2_def.sv b/design/include/el2_def.sv new file mode 100644 index 0000000..ae7e2bd --- /dev/null +++ b/design/include/el2_def.sv @@ -0,0 +1,325 @@ +// performance monitor stuff +//`ifndef EL2_DEF_SV +//`define EL2_DEF_SV +package el2_pkg; + +typedef struct packed { + logic [1:0] rv_i_valid_ip; + logic [31:0] rv_i_insn_ip; + logic [31:0] rv_i_address_ip; + logic [1:0] rv_i_exception_ip; + logic [4:0] rv_i_ecause_ip; + logic [2:0] rv_i_interrupt_ip; + logic [31:0] rv_i_tval_ip; + } el2_trace_pkt_t; + + +typedef enum logic [3:0] { + NULL = 4'b0000, + MUL = 4'b0001, + LOAD = 4'b0010, + STORE = 4'b0011, + ALU = 4'b0100, + CSRREAD = 4'b0101, + CSRWRITE = 4'b0110, + CSRRW = 4'b0111, + EBREAK = 4'b1000, + ECALL = 4'b1001, + FENCE = 4'b1010, + FENCEI = 4'b1011, + MRET = 4'b1100, + CONDBR = 4'b1101, + JAL = 4'b1110, + BITMANIPU = 4'b1111 + } el2_inst_pkt_t; + +typedef struct packed { + logic valid; + logic wb; + logic [2:0] tag; + logic [4:0] rd; + } el2_load_cam_pkt_t; + +typedef struct packed { + logic pc0_call; + logic pc0_ret; + logic pc0_pc4; + } el2_rets_pkt_t; +typedef struct packed { + logic valid; + logic [11:0] toffset; + logic [1:0] hist; + logic br_error; + logic br_start_error; + logic bank; + logic [31:1] prett; // predicted ret target + logic way; + logic ret; + } el2_br_pkt_t; + +typedef struct packed { + logic valid; + logic [1:0] hist; + logic br_error; + logic br_start_error; + logic way; + logic middle; + } el2_br_tlu_pkt_t; + +typedef struct packed { + logic misp; + logic ataken; + logic boffset; + logic pc4; + logic [1:0] hist; + logic [11:0] toffset; + logic valid; + logic br_error; + logic br_start_error; + logic [31:1] prett; + logic pcall; + logic pret; + logic pja; + logic way; + } el2_predict_pkt_t; + +typedef struct packed { + logic legal; + logic icaf; + logic icaf_f1; + logic [1:0] icaf_type; + logic fence_i; + logic [3:0] i0trigger; + el2_inst_pkt_t pmu_i0_itype; // pmu - instruction type + logic pmu_i0_br_unpred; // pmu + logic pmu_divide; + logic pmu_lsu_misaligned; + } el2_trap_pkt_t; + +typedef struct packed { + logic [4:0] i0rd; + logic i0load; + logic i0store; + logic i0div; + logic i0v; + logic i0valid; + logic csrwen; + logic csrwonly; + logic [11:0] csrwaddr; + } el2_dest_pkt_t; + +typedef struct packed { + logic mul; + logic load; + logic alu; + } el2_class_pkt_t; + +typedef struct packed { + logic [4:0] rs1; + logic [4:0] rs2; + logic [4:0] rd; + } el2_reg_pkt_t; + + +typedef struct packed { + logic land; + logic lor; + logic lxor; + logic sll; + logic srl; + logic sra; + logic beq; + logic bne; + logic blt; + logic bge; + logic add; + logic sub; + logic slt; + logic unsign; + logic jal; + logic predict_t; + logic predict_nt; + logic csr_write; + logic csr_imm; + } el2_alu_pkt_t; + +typedef struct packed { + logic fast_int; + logic by; + logic half; + logic word; + logic dword; // for dma + logic load; + logic store; + logic unsign; + logic dma; // dma pkt + logic store_data_bypass_d; + logic load_ldst_bypass_d; + logic store_data_bypass_m; + logic valid; + } el2_lsu_pkt_t; + +typedef struct packed { + logic exc_valid; + logic single_ecc_error; + logic inst_type; //0: Load, 1: Store + logic exc_type; //0: MisAligned, 1: Access Fault + logic [2:0] mscause; + logic [31:0] addr; + } el2_lsu_error_pkt_t; + +typedef struct packed { + logic alu; + logic rs1; + logic rs2; + logic imm12; + logic rd; + logic shimm5; + logic imm20; + logic pc; + logic load; + logic store; + logic lsu; + logic add; + logic sub; + logic land; + logic lor; + logic lxor; + logic sll; + logic sra; + logic srl; + logic slt; + logic unsign; + logic condbr; + logic beq; + logic bne; + logic bge; + logic blt; + logic jal; + logic by; + logic half; + logic word; + logic csr_read; + logic csr_clr; + logic csr_set; + logic csr_write; + logic csr_imm; + logic presync; + logic postsync; + logic ebreak; + logic ecall; + logic mret; + logic mul; + logic rs1_sign; + logic rs2_sign; + logic low; + logic div; + logic rem; + logic fence; + logic fence_i; + logic pm_alu; + logic legal; + } el2_dec_pkt_t; + + +typedef struct packed { + logic valid; + logic rs1_sign; + logic rs2_sign; + logic low; + logic bext; + logic bdep; + logic clmul; + logic clmulh; + logic clmulr; + logic grev; + logic shfl; + logic unshfl; + logic crc32_b; + logic crc32_h; + logic crc32_w; + logic crc32c_b; + logic crc32c_h; + logic crc32c_w; + logic bfp; + } el2_mul_pkt_t; + +typedef struct packed { + logic valid; + logic unsign; + logic rem; + } el2_div_pkt_t; + +typedef struct packed { + logic TEST1; + logic RME; + logic [3:0] RM; + + logic LS; + logic DS; + logic SD; + logic TEST_RNM; + logic BC1; + logic BC2; + } el2_ccm_ext_in_pkt_t; + +typedef struct packed { + logic TEST1; + logic RME; + logic [3:0] RM; + logic LS; + logic DS; + logic SD; + logic TEST_RNM; + logic BC1; + logic BC2; + } el2_dccm_ext_in_pkt_t; + + +typedef struct packed { + logic TEST1; + logic RME; + logic [3:0] RM; + logic LS; + logic DS; + logic SD; + logic TEST_RNM; + logic BC1; + logic BC2; + } el2_ic_data_ext_in_pkt_t; + + +typedef struct packed { + logic TEST1; + logic RME; + logic [3:0] RM; + logic LS; + logic DS; + logic SD; + logic TEST_RNM; + logic BC1; + logic BC2; + } el2_ic_tag_ext_in_pkt_t; + + + +typedef struct packed { + logic select; + logic match; + logic store; + logic load; + logic execute; + logic m; + logic [31:0] tdata2; + } el2_trigger_pkt_t; + + +typedef struct packed { + logic [70:0] icache_wrdata; // {dicad1[1:0], dicad0h[31:0], dicad0[31:0]} + logic [16:0] icache_dicawics; // Arraysel:24, Waysel:21:20, Index:16:3 + logic icache_rd_valid; + logic icache_wr_valid; + } el2_cache_debug_pkt_t; + + +endpackage // el2_pkg diff --git a/design/lib/ahb_to_axi4.sv b/design/lib/ahb_to_axi4.sv new file mode 100644 index 0000000..82d125e --- /dev/null +++ b/design/lib/ahb_to_axi4.sv @@ -0,0 +1,288 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright 2020 Western Digital Corporation or it's affiliates. +// +// 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. +//******************************************************************************** +// $Id$ +// +// Owner: +// Function: AHB to AXI4 Bridge +// Comments: +// +//******************************************************************************** +module ahb_to_axi4 +import el2_pkg::*; +#( + TAG = 1, + `include "el2_param.vh" +) +// ,TAG = 1) +( + input clk, + input rst_l, + input scan_mode, + input bus_clk_en, + input clk_override, + + // AXI signals + // AXI Write Channels + output logic axi_awvalid, + input logic axi_awready, + output logic [TAG-1:0] axi_awid, + output logic [31:0] axi_awaddr, + output logic [2:0] axi_awsize, + output logic [2:0] axi_awprot, + output logic [7:0] axi_awlen, + output logic [1:0] axi_awburst, + + output logic axi_wvalid, + input logic axi_wready, + output logic [63:0] axi_wdata, + output logic [7:0] axi_wstrb, + output logic axi_wlast, + + input logic axi_bvalid, + output logic axi_bready, + input logic [1:0] axi_bresp, + input logic [TAG-1:0] axi_bid, + + // AXI Read Channels + output logic axi_arvalid, + input logic axi_arready, + output logic [TAG-1:0] axi_arid, + output logic [31:0] axi_araddr, + output logic [2:0] axi_arsize, + output logic [2:0] axi_arprot, + output logic [7:0] axi_arlen, + output logic [1:0] axi_arburst, + + input logic axi_rvalid, + output logic axi_rready, + input logic [TAG-1:0] axi_rid, + input logic [63:0] axi_rdata, + input logic [1:0] axi_rresp, + + // AHB-Lite signals + input logic [31:0] ahb_haddr, // ahb bus address + input logic [2:0] ahb_hburst, // tied to 0 + input logic ahb_hmastlock, // tied to 0 + input logic [3:0] ahb_hprot, // tied to 4'b0011 + input logic [2:0] ahb_hsize, // size of bus transaction (possible values 0,1,2,3) + input logic [1:0] ahb_htrans, // Transaction type (possible values 0,2 only right now) + input logic ahb_hwrite, // ahb bus write + input logic [63:0] ahb_hwdata, // ahb bus write data + input logic ahb_hsel, // this slave was selected + input logic ahb_hreadyin, // previous hready was accepted or not + + output logic [63:0] ahb_hrdata, // ahb bus read data + output logic ahb_hreadyout, // slave ready to accept transaction + output logic ahb_hresp // slave response (high indicates erro) + +); + + logic [7:0] master_wstrb; + + typedef enum logic [1:0] { IDLE = 2'b00, // Nothing in the buffer. No commands yet recieved + WR = 2'b01, // Write Command recieved + RD = 2'b10, // Read Command recieved + PEND = 2'b11 // Waiting on Read Data from core + } state_t; + state_t buf_state, buf_nxtstate; + logic buf_state_en; + + // Buffer signals (one entry buffer) + logic buf_read_error_in, buf_read_error; + logic [63:0] buf_rdata; + + logic ahb_hready; + logic ahb_hready_q; + logic [1:0] ahb_htrans_in, ahb_htrans_q; + logic [2:0] ahb_hsize_q; + logic ahb_hwrite_q; + logic [31:0] ahb_haddr_q; + logic [63:0] ahb_hwdata_q; + logic ahb_hresp_q; + + //Miscellaneous signals + logic ahb_addr_in_dccm, ahb_addr_in_iccm, ahb_addr_in_pic; + logic ahb_addr_in_dccm_region_nc, ahb_addr_in_iccm_region_nc, ahb_addr_in_pic_region_nc; + // signals needed for the read data coming back from the core and to block any further commands as AHB is a blocking bus + logic buf_rdata_en; + + logic ahb_bus_addr_clk_en, buf_rdata_clk_en; + logic ahb_clk, ahb_addr_clk, buf_rdata_clk; + // Command buffer is the holding station where we convert to AXI and send to core + logic cmdbuf_wr_en, cmdbuf_rst; + logic cmdbuf_full; + logic cmdbuf_vld, cmdbuf_write; + logic [1:0] cmdbuf_size; + logic [7:0] cmdbuf_wstrb; + logic [31:0] cmdbuf_addr; + logic [63:0] cmdbuf_wdata; + + logic bus_clk; + +// FSM to control the bus states and when to block the hready and load the command buffer + always_comb begin + buf_nxtstate = IDLE; + buf_state_en = 1'b0; + buf_rdata_en = 1'b0; // signal to load the buffer when the core sends read data back + buf_read_error_in = 1'b0; // signal indicating that an error came back with the read from the core + cmdbuf_wr_en = 1'b0; // all clear from the gasket to load the buffer with the command for reads, command/dat for writes + case (buf_state) + IDLE: begin // No commands recieved + buf_nxtstate = ahb_hwrite ? WR : RD; + buf_state_en = ahb_hready & ahb_htrans[1] & ahb_hsel; // only transition on a valid hrtans + end + WR: begin // Write command recieved last cycle + buf_nxtstate = (ahb_hresp | (ahb_htrans[1:0] == 2'b0) | ~ahb_hsel) ? IDLE : ahb_hwrite ? WR : RD; + buf_state_en = (~cmdbuf_full | ahb_hresp) ; + cmdbuf_wr_en = ~cmdbuf_full & ~(ahb_hresp | ((ahb_htrans[1:0] == 2'b01) & ahb_hsel)); // Dont send command to the buffer in case of an error or when the master is not ready with the data now. + end + RD: begin // Read command recieved last cycle. + buf_nxtstate = ahb_hresp ? IDLE :PEND; // If error go to idle, else wait for read data + buf_state_en = (~cmdbuf_full | ahb_hresp); // only when command can go, or if its an error + cmdbuf_wr_en = ~ahb_hresp & ~cmdbuf_full; // send command only when no error + end + PEND: begin // Read Command has been sent. Waiting on Data. + buf_nxtstate = IDLE; // go back for next command and present data next cycle + buf_state_en = axi_rvalid & ~cmdbuf_write; // read data is back + buf_rdata_en = buf_state_en; // buffer the read data coming back from core + buf_read_error_in = buf_state_en & |axi_rresp[1:0]; // buffer error flag if return has Error ( ECC ) + end + endcase + end // always_comb begin + + rvdffs #($bits(state_t)) state_reg (.*, .din(buf_nxtstate), .dout({buf_state}), .en(buf_state_en), .clk(ahb_clk)); + + assign master_wstrb[7:0] = ({8{ahb_hsize_q[2:0] == 3'b0}} & (8'b1 << ahb_haddr_q[2:0])) | + ({8{ahb_hsize_q[2:0] == 3'b1}} & (8'b11 << ahb_haddr_q[2:0])) | + ({8{ahb_hsize_q[2:0] == 3'b10}} & (8'b1111 << ahb_haddr_q[2:0])) | + ({8{ahb_hsize_q[2:0] == 3'b11}} & 8'b1111_1111); + + // AHB signals + assign ahb_hreadyout = ahb_hresp ? (ahb_hresp_q & ~ahb_hready_q) : + ((~cmdbuf_full | (buf_state == IDLE)) & ~(buf_state == RD | buf_state == PEND) & ~buf_read_error); + + assign ahb_hready = ahb_hreadyout & ahb_hreadyin; + assign ahb_htrans_in[1:0] = {2{ahb_hsel}} & ahb_htrans[1:0]; + assign ahb_hrdata[63:0] = buf_rdata[63:0]; + assign ahb_hresp = ((ahb_htrans_q[1:0] != 2'b0) & (buf_state != IDLE) & + + ((~(ahb_addr_in_dccm | ahb_addr_in_iccm)) | // request not for ICCM or DCCM + ((ahb_addr_in_iccm | (ahb_addr_in_dccm & ahb_hwrite_q)) & ~((ahb_hsize_q[1:0] == 2'b10) | (ahb_hsize_q[1:0] == 2'b11))) | // ICCM Rd/Wr OR DCCM Wr not the right size + ((ahb_hsize_q[2:0] == 3'h1) & ahb_haddr_q[0]) | // HW size but unaligned + ((ahb_hsize_q[2:0] == 3'h2) & (|ahb_haddr_q[1:0])) | // W size but unaligned + ((ahb_hsize_q[2:0] == 3'h3) & (|ahb_haddr_q[2:0])))) | // DW size but unaligned + buf_read_error | // Read ECC error + (ahb_hresp_q & ~ahb_hready_q); + + // Buffer signals - needed for the read data and ECC error response + rvdff #(.WIDTH(64)) buf_rdata_ff (.din(axi_rdata[63:0]), .dout(buf_rdata[63:0]), .clk(buf_rdata_clk), .*); + rvdff #(.WIDTH(1)) buf_read_error_ff(.din(buf_read_error_in), .dout(buf_read_error), .clk(ahb_clk), .*); // buf_read_error will be high only one cycle + + // All the Master signals are captured before presenting it to the command buffer. We check for Hresp before sending it to the cmd buffer. + rvdff #(.WIDTH(1)) hresp_ff (.din(ahb_hresp), .dout(ahb_hresp_q), .clk(ahb_clk), .*); + rvdff #(.WIDTH(1)) hready_ff (.din(ahb_hready), .dout(ahb_hready_q), .clk(ahb_clk), .*); + rvdff #(.WIDTH(2)) htrans_ff (.din(ahb_htrans_in[1:0]), .dout(ahb_htrans_q[1:0]), .clk(ahb_clk), .*); + rvdff #(.WIDTH(3)) hsize_ff (.din(ahb_hsize[2:0]), .dout(ahb_hsize_q[2:0]), .clk(ahb_addr_clk), .*); + rvdff #(.WIDTH(1)) hwrite_ff (.din(ahb_hwrite), .dout(ahb_hwrite_q), .clk(ahb_addr_clk), .*); + rvdff #(.WIDTH(32)) haddr_ff (.din(ahb_haddr[31:0]), .dout(ahb_haddr_q[31:0]), .clk(ahb_addr_clk), .*); + + // Clock header logic + assign ahb_bus_addr_clk_en = bus_clk_en & (ahb_hready & ahb_htrans[1]); + assign buf_rdata_clk_en = bus_clk_en & buf_rdata_en; + + rvclkhdr ahb_cgc (.en(bus_clk_en), .l1clk(ahb_clk), .*); + rvclkhdr ahb_addr_cgc (.en(ahb_bus_addr_clk_en), .l1clk(ahb_addr_clk), .*); + rvclkhdr buf_rdata_cgc (.en(buf_rdata_clk_en), .l1clk(buf_rdata_clk), .*); + + // Address check dccm + rvrangecheck #(.CCM_SADR(pt.DCCM_SADR), + .CCM_SIZE(pt.DCCM_SIZE)) addr_dccm_rangecheck ( + .addr(ahb_haddr_q[31:0]), + .in_range(ahb_addr_in_dccm), + .in_region(ahb_addr_in_dccm_region_nc) + ); + + // Address check iccm + if (pt.ICCM_ENABLE == 1) begin: GenICCM + rvrangecheck #(.CCM_SADR(pt.ICCM_SADR), + .CCM_SIZE(pt.ICCM_SIZE)) addr_iccm_rangecheck ( + .addr(ahb_haddr_q[31:0]), + .in_range(ahb_addr_in_iccm), + .in_region(ahb_addr_in_iccm_region_nc) + ); + end else begin: GenNoICCM + assign ahb_addr_in_iccm = '0; + assign ahb_addr_in_iccm_region_nc = '0; + end + + // PIC memory address check + rvrangecheck #(.CCM_SADR(pt.PIC_BASE_ADDR), + .CCM_SIZE(pt.PIC_SIZE)) addr_pic_rangecheck ( + .addr(ahb_haddr_q[31:0]), + .in_range(ahb_addr_in_pic), + .in_region(ahb_addr_in_pic_region_nc) + ); + + // Command Buffer - Holding for the commands to be sent for the AXI. It will be converted to the AXI signals. + assign cmdbuf_rst = (((axi_awvalid & axi_awready) | (axi_arvalid & axi_arready)) & ~cmdbuf_wr_en) | (ahb_hresp & ~cmdbuf_write); + assign cmdbuf_full = (cmdbuf_vld & ~((axi_awvalid & axi_awready) | (axi_arvalid & axi_arready))); + + rvdffsc #(.WIDTH(1)) cmdbuf_vldff (.din(1'b1), .dout(cmdbuf_vld), .en(cmdbuf_wr_en), .clear(cmdbuf_rst), .clk(bus_clk), .*); + rvdffs #(.WIDTH(1)) cmdbuf_writeff (.din(ahb_hwrite_q), .dout(cmdbuf_write), .en(cmdbuf_wr_en), .clk(bus_clk), .*); + rvdffs #(.WIDTH(2)) cmdbuf_sizeff (.din(ahb_hsize_q[1:0]), .dout(cmdbuf_size[1:0]), .en(cmdbuf_wr_en), .clk(bus_clk), .*); + rvdffs #(.WIDTH(8)) cmdbuf_wstrbff (.din(master_wstrb[7:0]), .dout(cmdbuf_wstrb[7:0]), .en(cmdbuf_wr_en), .clk(bus_clk), .*); + rvdffe #(.WIDTH(32)) cmdbuf_addrff (.din(ahb_haddr_q[31:0]), .dout(cmdbuf_addr[31:0]), .en(cmdbuf_wr_en), .clk(bus_clk), .*); + rvdffe #(.WIDTH(64)) cmdbuf_wdataff (.din(ahb_hwdata[63:0]), .dout(cmdbuf_wdata[63:0]), .en(cmdbuf_wr_en), .clk(bus_clk), .*); + + // AXI Write Command Channel + assign axi_awvalid = cmdbuf_vld & cmdbuf_write; + assign axi_awid[TAG-1:0] = '0; + assign axi_awaddr[31:0] = cmdbuf_addr[31:0]; + assign axi_awsize[2:0] = {1'b0, cmdbuf_size[1:0]}; + assign axi_awprot[2:0] = 3'b0; + assign axi_awlen[7:0] = '0; + assign axi_awburst[1:0] = 2'b01; + // AXI Write Data Channel - This is tied to the command channel as we only write the command buffer once we have the data. + assign axi_wvalid = cmdbuf_vld & cmdbuf_write; + assign axi_wdata[63:0] = cmdbuf_wdata[63:0]; + assign axi_wstrb[7:0] = cmdbuf_wstrb[7:0]; + assign axi_wlast = 1'b1; + // AXI Write Response - Always ready. AHB does not require a write response. + assign axi_bready = 1'b1; + // AXI Read Channels + assign axi_arvalid = cmdbuf_vld & ~cmdbuf_write; + assign axi_arid[TAG-1:0] = '0; + assign axi_araddr[31:0] = cmdbuf_addr[31:0]; + assign axi_arsize[2:0] = {1'b0, cmdbuf_size[1:0]}; + assign axi_arprot = 3'b0; + assign axi_arlen[7:0] = '0; + assign axi_arburst[1:0] = 2'b01; + // AXI Read Response Channel - Always ready as AHB reads are blocking and the the buffer is available for the read coming back always. + assign axi_rready = 1'b1; + + // Clock header logic + rvclkhdr bus_cgc (.en(bus_clk_en), .l1clk(bus_clk), .*); + +`ifdef ASSERT_ON + property ahb_error_protocol; + @(posedge ahb_clk) (ahb_hready & ahb_hresp) |-> (~$past(ahb_hready) & $past(ahb_hresp)); + endproperty + assert_ahb_error_protocol: assert property (ahb_error_protocol) else + $display("Bus Error with hReady isn't preceded with Bus Error without hready"); + +`endif + +endmodule // ahb_to_axi4 \ No newline at end of file diff --git a/design/lib/axi4_to_ahb.sv b/design/lib/axi4_to_ahb.sv new file mode 100644 index 0000000..481ad88 --- /dev/null +++ b/design/lib/axi4_to_ahb.sv @@ -0,0 +1,475 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright 2020 Western Digital Corporation or it's affiliates. +// +// 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. + +//******************************************************************************** +// $Id$ +// +// Owner: +// Function: AXI4 -> AHB Bridge +// Comments: +// +//******************************************************************************** +module axi4_to_ahb +import el2_pkg::*; +#( +`include "el2_param.vh" +,parameter TAG = 1) ( + + input clk, + input rst_l, + input scan_mode, + input bus_clk_en, + input clk_override, + + // AXI signals + // AXI Write Channels + input logic axi_awvalid, + output logic axi_awready, + input logic [TAG-1:0] axi_awid, + input logic [31:0] axi_awaddr, + input logic [2:0] axi_awsize, + input logic [2:0] axi_awprot, + + input logic axi_wvalid, + output logic axi_wready, + input logic [63:0] axi_wdata, + input logic [7:0] axi_wstrb, + input logic axi_wlast, + + output logic axi_bvalid, + input logic axi_bready, + output logic [1:0] axi_bresp, + output logic [TAG-1:0] axi_bid, + + // AXI Read Channels + input logic axi_arvalid, + output logic axi_arready, + input logic [TAG-1:0] axi_arid, + input logic [31:0] axi_araddr, + input logic [2:0] axi_arsize, + input logic [2:0] axi_arprot, + + output logic axi_rvalid, + input logic axi_rready, + output logic [TAG-1:0] axi_rid, + output logic [63:0] axi_rdata, + output logic [1:0] axi_rresp, + output logic axi_rlast, + + // AHB-Lite signals + output logic [31:0] ahb_haddr, // ahb bus address + output logic [2:0] ahb_hburst, // tied to 0 + output logic ahb_hmastlock, // tied to 0 + output logic [3:0] ahb_hprot, // tied to 4'b0011 + output logic [2:0] ahb_hsize, // size of bus transaction (possible values 0,1,2,3) + output logic [1:0] ahb_htrans, // Transaction type (possible values 0,2 only right now) + output logic ahb_hwrite, // ahb bus write + output logic [63:0] ahb_hwdata, // ahb bus write data + + input logic [63:0] ahb_hrdata, // ahb bus read data + input logic ahb_hready, // slave ready to accept transaction + input logic ahb_hresp // slave response (high indicates erro) + +); + + localparam ID = 1; + localparam PRTY = 1; + typedef enum logic [2:0] {IDLE=3'b000, CMD_RD=3'b001, CMD_WR=3'b010, DATA_RD=3'b011, DATA_WR=3'b100, DONE=3'b101, STREAM_RD=3'b110, STREAM_ERR_RD=3'b111} state_t; + state_t buf_state, buf_nxtstate; + + logic slave_valid; + logic slave_ready; + logic [TAG-1:0] slave_tag; + logic [63:0] slave_rdata; + logic [3:0] slave_opc; + + logic wrbuf_en, wrbuf_data_en; + logic wrbuf_cmd_sent, wrbuf_rst; + logic wrbuf_vld; + logic wrbuf_data_vld; + logic [TAG-1:0] wrbuf_tag; + logic [2:0] wrbuf_size; + logic [31:0] wrbuf_addr; + logic [63:0] wrbuf_data; + logic [7:0] wrbuf_byteen; + + logic bus_write_clk_en; + logic bus_clk, bus_write_clk; + + logic master_valid; + logic master_ready; + logic [TAG-1:0] master_tag; + logic [31:0] master_addr; + logic [63:0] master_wdata; + logic [2:0] master_size; + logic [2:0] master_opc; + logic [7:0] master_byteen; + + // Buffer signals (one entry buffer) + logic [31:0] buf_addr; + logic [1:0] buf_size; + logic buf_write; + logic [7:0] buf_byteen; + logic buf_aligned; + logic [63:0] buf_data; + logic [TAG-1:0] buf_tag; + + //Miscellaneous signals + logic buf_rst; + logic [TAG-1:0] buf_tag_in; + logic [31:0] buf_addr_in; + logic [7:0] buf_byteen_in; + logic [63:0] buf_data_in; + logic buf_write_in; + logic buf_aligned_in; + logic [2:0] buf_size_in; + + logic buf_state_en; + logic buf_wr_en; + logic buf_data_wr_en; + logic slvbuf_error_en; + logic wr_cmd_vld; + + logic cmd_done_rst, cmd_done, cmd_doneQ; + logic trxn_done; + logic [2:0] buf_cmd_byte_ptr, buf_cmd_byte_ptrQ, buf_cmd_nxtbyte_ptr; + logic buf_cmd_byte_ptr_en; + logic found; + + logic slave_valid_pre; + logic ahb_hready_q; + logic ahb_hresp_q; + logic [1:0] ahb_htrans_q; + logic ahb_hwrite_q; + logic [63:0] ahb_hrdata_q; + + + logic slvbuf_write; + logic slvbuf_error; + logic [TAG-1:0] slvbuf_tag; + + logic slvbuf_error_in; + logic slvbuf_wr_en; + logic bypass_en; + logic rd_bypass_idle; + + logic last_addr_en; + logic [31:0] last_bus_addr; + + // Clocks + logic buf_clken, slvbuf_clken; + logic ahbm_addr_clken; + logic ahbm_data_clken; + + logic buf_clk, slvbuf_clk; + logic ahbm_clk; + logic ahbm_addr_clk; + logic ahbm_data_clk; + + // Function to get the length from byte enable + function automatic logic [1:0] get_write_size; + input logic [7:0] byteen; + + logic [1:0] size; + + size[1:0] = (2'b11 & {2{(byteen[7:0] == 8'hff)}}) | + (2'b10 & {2{((byteen[7:0] == 8'hf0) | (byteen[7:0] == 8'h0f))}}) | + (2'b01 & {2{((byteen[7:0] == 8'hc0) | (byteen[7:0] == 8'h30) | (byteen[7:0] == 8'h0c) | (byteen[7:0] == 8'h03))}}); + + return size[1:0]; + endfunction // get_write_size + + // Function to get the length from byte enable + function automatic logic [2:0] get_write_addr; + input logic [7:0] byteen; + + logic [2:0] addr; + + addr[2:0] = (3'h0 & {3{((byteen[7:0] == 8'hff) | (byteen[7:0] == 8'h0f) | (byteen[7:0] == 8'h03))}}) | + (3'h2 & {3{(byteen[7:0] == 8'h0c)}}) | + (3'h4 & {3{((byteen[7:0] == 8'hf0) | (byteen[7:0] == 8'h03))}}) | + (3'h6 & {3{(byteen[7:0] == 8'hc0)}}); + + return addr[2:0]; + endfunction // get_write_addr + + // Function to get the next byte pointer + function automatic logic [2:0] get_nxtbyte_ptr (logic [2:0] current_byte_ptr, logic [7:0] byteen, logic get_next); + logic [2:0] start_ptr; + logic found; + found = '0; + start_ptr[2:0] = get_next ? (current_byte_ptr[2:0] + 3'b1) : current_byte_ptr[2:0]; + for (int j=0; j<8; j++) begin + if (~found) begin + get_nxtbyte_ptr[2:0] = 3'(j); + found |= (byteen[j] & (3'(j) >= start_ptr[2:0])) ; + end + end + endfunction // get_nextbyte_ptr + + + // Write buffer + assign wrbuf_en = axi_awvalid & axi_awready & master_ready; + assign wrbuf_data_en = axi_wvalid & axi_wready & master_ready; + assign wrbuf_cmd_sent = master_valid & master_ready & (master_opc[2:1] == 2'b01); + assign wrbuf_rst = wrbuf_cmd_sent & ~wrbuf_en; + + assign axi_awready = ~(wrbuf_vld & ~wrbuf_cmd_sent) & master_ready; + assign axi_wready = ~(wrbuf_data_vld & ~wrbuf_cmd_sent) & master_ready; + assign axi_arready = ~(wrbuf_vld & wrbuf_data_vld) & master_ready; + assign axi_rlast = 1'b1; + + assign wr_cmd_vld = (wrbuf_vld & wrbuf_data_vld); + assign master_valid = wr_cmd_vld | axi_arvalid; + assign master_tag[TAG-1:0] = wr_cmd_vld ? wrbuf_tag[TAG-1:0] : axi_arid[TAG-1:0]; + assign master_opc[2:0] = wr_cmd_vld ? 3'b011 : 3'b0; + assign master_addr[31:0] = wr_cmd_vld ? wrbuf_addr[31:0] : axi_araddr[31:0]; + assign master_size[2:0] = wr_cmd_vld ? wrbuf_size[2:0] : axi_arsize[2:0]; + assign master_byteen[7:0] = wrbuf_byteen[7:0]; + assign master_wdata[63:0] = wrbuf_data[63:0]; + + // AXI response channel signals + assign axi_bvalid = slave_valid & slave_ready & slave_opc[3]; + assign axi_bresp[1:0] = slave_opc[0] ? 2'b10 : (slave_opc[1] ? 2'b11 : 2'b0); + assign axi_bid[TAG-1:0] = slave_tag[TAG-1:0]; + + assign axi_rvalid = slave_valid & slave_ready & (slave_opc[3:2] == 2'b0); + assign axi_rresp[1:0] = slave_opc[0] ? 2'b10 : (slave_opc[1] ? 2'b11 : 2'b0); + assign axi_rid[TAG-1:0] = slave_tag[TAG-1:0]; + assign axi_rdata[63:0] = slave_rdata[63:0]; + assign slave_ready = axi_bready & axi_rready; + + // Clock header logic + assign bus_write_clk_en = bus_clk_en & ((axi_awvalid & axi_awready) | (axi_wvalid & axi_wready)); + + rvclkhdr bus_cgc (.en(bus_clk_en), .l1clk(bus_clk), .*); + rvclkhdr bus_write_cgc (.en(bus_write_clk_en), .l1clk(bus_write_clk), .*); + + + // FIFO state machine + always_comb begin + buf_nxtstate = IDLE; + buf_state_en = 1'b0; + buf_wr_en = 1'b0; + buf_data_wr_en = 1'b0; + slvbuf_error_in = 1'b0; + slvbuf_error_en = 1'b0; + buf_write_in = 1'b0; + cmd_done = 1'b0; + trxn_done = 1'b0; + buf_cmd_byte_ptr_en = 1'b0; + buf_cmd_byte_ptr[2:0] = '0; + slave_valid_pre = 1'b0; + master_ready = 1'b0; + ahb_htrans[1:0] = 2'b0; + slvbuf_wr_en = 1'b0; + bypass_en = 1'b0; + rd_bypass_idle = 1'b0; + + case (buf_state) + IDLE: begin + master_ready = 1'b1; + buf_write_in = (master_opc[2:1] == 2'b01); + buf_nxtstate = buf_write_in ? CMD_WR : CMD_RD; + buf_state_en = master_valid & master_ready; + buf_wr_en = buf_state_en; + buf_data_wr_en = buf_state_en & (buf_nxtstate == CMD_WR); + buf_cmd_byte_ptr_en = buf_state_en; + buf_cmd_byte_ptr[2:0] = buf_write_in ? get_nxtbyte_ptr(3'b0,buf_byteen_in[7:0],1'b0) : master_addr[2:0]; + bypass_en = buf_state_en; + rd_bypass_idle = bypass_en & (buf_nxtstate == CMD_RD); + ahb_htrans[1:0] = {2{bypass_en}} & 2'b10; + end + CMD_RD: begin + buf_nxtstate = (master_valid & (master_opc[2:0] == 3'b000))? STREAM_RD : DATA_RD; + buf_state_en = ahb_hready_q & (ahb_htrans_q[1:0] != 2'b0) & ~ahb_hwrite_q; + cmd_done = buf_state_en & ~master_valid; + slvbuf_wr_en = buf_state_en; + master_ready = buf_state_en & (buf_nxtstate == STREAM_RD); + buf_wr_en = master_ready; + bypass_en = master_ready & master_valid; + buf_cmd_byte_ptr[2:0] = bypass_en ? master_addr[2:0] : buf_addr[2:0]; + ahb_htrans[1:0] = 2'b10 & {2{~buf_state_en | bypass_en}}; + end + STREAM_RD: begin + master_ready = (ahb_hready_q & ~ahb_hresp_q) & ~(master_valid & master_opc[2:1] == 2'b01); + buf_wr_en = (master_valid & master_ready & (master_opc[2:0] == 3'b000)); // update the fifo if we are streaming the read commands + buf_nxtstate = ahb_hresp_q ? STREAM_ERR_RD : (buf_wr_en ? STREAM_RD : DATA_RD); // assuming that the master accpets the slave response right away. + buf_state_en = (ahb_hready_q | ahb_hresp_q); + buf_data_wr_en = buf_state_en; + slvbuf_error_in = ahb_hresp_q; + slvbuf_error_en = buf_state_en; + slave_valid_pre = buf_state_en & ~ahb_hresp_q; // send a response right away if we are not going through an error response. + cmd_done = buf_state_en & ~master_valid; // last one of the stream should not send a htrans + bypass_en = master_ready & master_valid & (buf_nxtstate == STREAM_RD) & buf_state_en; + buf_cmd_byte_ptr[2:0] = bypass_en ? master_addr[2:0] : buf_addr[2:0]; + ahb_htrans[1:0] = 2'b10 & {2{~((buf_nxtstate != STREAM_RD) & buf_state_en)}}; + slvbuf_wr_en = buf_wr_en; // shifting the contents from the buf to slv_buf for streaming cases + end // case: STREAM_RD + STREAM_ERR_RD: begin + buf_nxtstate = DATA_RD; + buf_state_en = ahb_hready_q & (ahb_htrans_q[1:0] != 2'b0) & ~ahb_hwrite_q; + slave_valid_pre = buf_state_en; + slvbuf_wr_en = buf_state_en; // Overwrite slvbuf with buffer + buf_cmd_byte_ptr[2:0] = buf_addr[2:0]; + ahb_htrans[1:0] = 2'b10 & {2{~buf_state_en}}; + end + DATA_RD: begin + buf_nxtstate = DONE; + buf_state_en = (ahb_hready_q | ahb_hresp_q); + buf_data_wr_en = buf_state_en; + slvbuf_error_in= ahb_hresp_q; + slvbuf_error_en= buf_state_en; + slvbuf_wr_en = buf_state_en; + + end + CMD_WR: begin + buf_nxtstate = DATA_WR; + trxn_done = ahb_hready_q & ahb_hwrite_q & (ahb_htrans_q[1:0] != 2'b0); + buf_state_en = trxn_done; + buf_cmd_byte_ptr_en = buf_state_en; + slvbuf_wr_en = buf_state_en; + buf_cmd_byte_ptr = trxn_done ? get_nxtbyte_ptr(buf_cmd_byte_ptrQ[2:0],buf_byteen[7:0],1'b1) : buf_cmd_byte_ptrQ; + cmd_done = trxn_done & (buf_aligned | (buf_cmd_byte_ptrQ == 3'b111) | + (buf_byteen[get_nxtbyte_ptr(buf_cmd_byte_ptrQ[2:0],buf_byteen[7:0],1'b1)] == 1'b0)); + ahb_htrans[1:0] = {2{~(cmd_done | cmd_doneQ)}} & 2'b10; + end + DATA_WR: begin + buf_state_en = (cmd_doneQ & ahb_hready_q) | ahb_hresp_q; + master_ready = buf_state_en & ~ahb_hresp_q & slave_ready; // Ready to accept new command if current command done and no error + buf_nxtstate = (ahb_hresp_q | ~slave_ready) ? DONE : + ((master_valid & master_ready) ? ((master_opc[2:1] == 2'b01) ? CMD_WR : CMD_RD) : IDLE); + slvbuf_error_in = ahb_hresp_q; + slvbuf_error_en = buf_state_en; + + buf_write_in = (master_opc[2:1] == 2'b01); + buf_wr_en = buf_state_en & ((buf_nxtstate == CMD_WR) | (buf_nxtstate == CMD_RD)); + buf_data_wr_en = buf_wr_en; + + cmd_done = (ahb_hresp_q | (ahb_hready_q & (ahb_htrans_q[1:0] != 2'b0) & + ((buf_cmd_byte_ptrQ == 3'b111) | (buf_byteen[get_nxtbyte_ptr(buf_cmd_byte_ptrQ[2:0],buf_byteen[7:0],1'b1)] == 1'b0)))); + bypass_en = buf_state_en & buf_write_in & (buf_nxtstate == CMD_WR); // Only bypass for writes for the time being + ahb_htrans[1:0] = {2{(~(cmd_done | cmd_doneQ) | bypass_en)}} & 2'b10; + slave_valid_pre = buf_state_en & (buf_nxtstate != DONE); + + trxn_done = ahb_hready_q & ahb_hwrite_q & (ahb_htrans_q[1:0] != 2'b0); + buf_cmd_byte_ptr_en = trxn_done | bypass_en; + buf_cmd_byte_ptr = bypass_en ? get_nxtbyte_ptr(3'b0,buf_byteen_in[7:0],1'b0) : + trxn_done ? get_nxtbyte_ptr(buf_cmd_byte_ptrQ[2:0],buf_byteen[7:0],1'b1) : buf_cmd_byte_ptrQ; + end + DONE: begin + buf_nxtstate = IDLE; + buf_state_en = slave_ready; + slvbuf_error_en = 1'b1; + slave_valid_pre = 1'b1; + end + endcase + end + + assign buf_rst = 1'b0; + assign cmd_done_rst = slave_valid_pre; + assign buf_addr_in[31:3] = master_addr[31:3]; + assign buf_addr_in[2:0] = (buf_aligned_in & (master_opc[2:1] == 2'b01)) ? get_write_addr(master_byteen[7:0]) : master_addr[2:0]; + assign buf_tag_in[TAG-1:0] = master_tag[TAG-1:0]; + assign buf_byteen_in[7:0] = wrbuf_byteen[7:0]; + assign buf_data_in[63:0] = (buf_state == DATA_RD) ? ahb_hrdata_q[63:0] : master_wdata[63:0]; + assign buf_size_in[1:0] = (buf_aligned_in & (master_size[1:0] == 2'b11) & (master_opc[2:1] == 2'b01)) ? get_write_size(master_byteen[7:0]) : master_size[1:0]; + assign buf_aligned_in = (master_opc[2:0] == 3'b0) | // reads are always aligned since they are either DW or sideeffects + (master_size[1:0] == 2'b0) | (master_size[1:0] == 2'b01) | (master_size[1:0] == 2'b10) | // Always aligned for Byte/HW/Word since they can be only for non-idempotent. IFU/SB are always aligned + ((master_size[1:0] == 2'b11) & + ((master_byteen[7:0] == 8'h3) | (master_byteen[7:0] == 8'hc) | (master_byteen[7:0] == 8'h30) | (master_byteen[7:0] == 8'hc0) | + (master_byteen[7:0] == 8'hf) | (master_byteen[7:0] == 8'hf0) | (master_byteen[7:0] == 8'hff))); + + // Generate the ahb signals + assign ahb_haddr[31:0] = bypass_en ? {master_addr[31:3],buf_cmd_byte_ptr[2:0]} : {buf_addr[31:3],buf_cmd_byte_ptr[2:0]}; + assign ahb_hsize[2:0] = bypass_en ? {1'b0, ({2{buf_aligned_in}} & buf_size_in[1:0])} : + {1'b0, ({2{buf_aligned}} & buf_size[1:0])}; // Send the full size for aligned trxn + assign ahb_hburst[2:0] = 3'b0; + assign ahb_hmastlock = 1'b0; + assign ahb_hprot[3:0] = {3'b001,~axi_arprot[2]}; + assign ahb_hwrite = bypass_en ? (master_opc[2:1] == 2'b01) : buf_write; + assign ahb_hwdata[63:0] = buf_data[63:0]; + + assign slave_valid = slave_valid_pre; + assign slave_opc[3:2] = slvbuf_write ? 2'b11 : 2'b00; + assign slave_opc[1:0] = {2{slvbuf_error}} & 2'b10; + assign slave_rdata[63:0] = slvbuf_error ? {2{last_bus_addr[31:0]}} : ((buf_state == DONE) ? buf_data[63:0] : ahb_hrdata_q[63:0]); + assign slave_tag[TAG-1:0] = slvbuf_tag[TAG-1:0]; + + assign last_addr_en = (ahb_htrans[1:0] != 2'b0) & ahb_hready & ahb_hwrite ; + + + rvdffsc #(.WIDTH(1)) wrbuf_vldff (.din(1'b1), .dout(wrbuf_vld), .en(wrbuf_en), .clear(wrbuf_rst), .clk(bus_clk), .*); + rvdffsc #(.WIDTH(1)) wrbuf_data_vldff(.din(1'b1), .dout(wrbuf_data_vld), .en(wrbuf_data_en), .clear(wrbuf_rst), .clk(bus_clk), .*); + rvdffs #(.WIDTH(TAG)) wrbuf_tagff (.din(axi_awid[TAG-1:0]), .dout(wrbuf_tag[TAG-1:0]), .en(wrbuf_en), .clk(bus_clk), .*); + rvdffs #(.WIDTH(3)) wrbuf_sizeff (.din(axi_awsize[2:0]), .dout(wrbuf_size[2:0]), .en(wrbuf_en), .clk(bus_clk), .*); + rvdffe #(.WIDTH(32)) wrbuf_addrff (.din(axi_awaddr[31:0]), .dout(wrbuf_addr[31:0]), .en(wrbuf_en), .clk(bus_clk), .*); + rvdffe #(.WIDTH(64)) wrbuf_dataff (.din(axi_wdata[63:0]), .dout(wrbuf_data[63:0]), .en(wrbuf_data_en), .clk(bus_clk), .*); + rvdffs #(.WIDTH(8)) wrbuf_byteenff (.din(axi_wstrb[7:0]), .dout(wrbuf_byteen[7:0]), .en(wrbuf_data_en), .clk(bus_clk), .*); + + rvdffs #(.WIDTH(32)) last_bus_addrff (.din(ahb_haddr[31:0]), .dout(last_bus_addr[31:0]), .en(last_addr_en), .clk(ahbm_clk), .*); + + rvdffsc #(.WIDTH($bits(state_t))) buf_state_ff (.din(buf_nxtstate), .dout({buf_state}), .en(buf_state_en), .clear(buf_rst), .clk(ahbm_clk), .*); + rvdffs #(.WIDTH(1)) buf_writeff (.din(buf_write_in), .dout(buf_write), .en(buf_wr_en), .clk(buf_clk), .*); + rvdffs #(.WIDTH(TAG)) buf_tagff (.din(buf_tag_in[TAG-1:0]), .dout(buf_tag[TAG-1:0]), .en(buf_wr_en), .clk(buf_clk), .*); + rvdffe #(.WIDTH(32)) buf_addrff (.din(buf_addr_in[31:0]), .dout(buf_addr[31:0]), .en(buf_wr_en & bus_clk_en), .*); + rvdffs #(.WIDTH(2)) buf_sizeff (.din(buf_size_in[1:0]), .dout(buf_size[1:0]), .en(buf_wr_en), .clk(buf_clk), .*); + rvdffs #(.WIDTH(1)) buf_alignedff (.din(buf_aligned_in), .dout(buf_aligned), .en(buf_wr_en), .clk(buf_clk), .*); + rvdffs #(.WIDTH(8)) buf_byteenff (.din(buf_byteen_in[7:0]), .dout(buf_byteen[7:0]), .en(buf_wr_en), .clk(buf_clk), .*); + rvdffe #(.WIDTH(64)) buf_dataff (.din(buf_data_in[63:0]), .dout(buf_data[63:0]), .en(buf_data_wr_en & bus_clk_en), .*); + + + rvdffs #(.WIDTH(1)) slvbuf_writeff (.din(buf_write), .dout(slvbuf_write), .en(slvbuf_wr_en), .clk(buf_clk), .*); + rvdffs #(.WIDTH(TAG)) slvbuf_tagff (.din(buf_tag[TAG-1:0]), .dout(slvbuf_tag[TAG-1:0]), .en(slvbuf_wr_en), .clk(buf_clk), .*); + rvdffs #(.WIDTH(1)) slvbuf_errorff (.din(slvbuf_error_in), .dout(slvbuf_error), .en(slvbuf_error_en), .clk(ahbm_clk), .*); + + rvdffsc #(.WIDTH(1)) buf_cmd_doneff (.din(1'b1), .en(cmd_done), .dout(cmd_doneQ), .clear(cmd_done_rst), .clk(ahbm_clk), .*); + rvdffs #(.WIDTH(3)) buf_cmd_byte_ptrff (.din(buf_cmd_byte_ptr[2:0]), .dout(buf_cmd_byte_ptrQ[2:0]), .en(buf_cmd_byte_ptr_en), .clk(ahbm_clk), .*); + + rvdff #(.WIDTH(1)) hready_ff (.din(ahb_hready), .dout(ahb_hready_q), .clk(ahbm_clk), .*); + rvdff #(.WIDTH(2)) htrans_ff (.din(ahb_htrans[1:0]), .dout(ahb_htrans_q[1:0]), .clk(ahbm_clk), .*); + rvdff #(.WIDTH(1)) hwrite_ff (.din(ahb_hwrite), .dout(ahb_hwrite_q), .clk(ahbm_addr_clk), .*); + rvdff #(.WIDTH(1)) hresp_ff (.din(ahb_hresp), .dout(ahb_hresp_q), .clk(ahbm_clk), .*); + rvdff #(.WIDTH(64)) hrdata_ff (.din(ahb_hrdata[63:0]), .dout(ahb_hrdata_q[63:0]), .clk(ahbm_data_clk), .*); + + // Clock headers + // clock enables for ahbm addr/data + assign buf_clken = bus_clk_en & (buf_wr_en | slvbuf_wr_en | clk_override); + assign ahbm_addr_clken = bus_clk_en & ((ahb_hready & ahb_htrans[1]) | clk_override); + assign ahbm_data_clken = bus_clk_en & ((buf_state != IDLE) | clk_override); + + rvclkhdr buf_cgc (.en(buf_clken), .l1clk(buf_clk), .*); + rvclkhdr ahbm_cgc (.en(bus_clk_en), .l1clk(ahbm_clk), .*); + rvclkhdr ahbm_addr_cgc (.en(ahbm_addr_clken), .l1clk(ahbm_addr_clk), .*); + rvclkhdr ahbm_data_cgc (.en(ahbm_data_clken), .l1clk(ahbm_data_clk), .*); + +`ifdef ASSERT_ON + property ahb_trxn_aligned; + @(posedge ahbm_clk) ahb_htrans[1] |-> ((ahb_hsize[2:0] == 3'h0) | + ((ahb_hsize[2:0] == 3'h1) & (ahb_haddr[0] == 1'b0)) | + ((ahb_hsize[2:0] == 3'h2) & (ahb_haddr[1:0] == 2'b0)) | + ((ahb_hsize[2:0] == 3'h3) & (ahb_haddr[2:0] == 3'b0))); + endproperty + assert_ahb_trxn_aligned: assert property (ahb_trxn_aligned) else + $display("Assertion ahb_trxn_aligned failed: ahb_htrans=2'h%h, ahb_hsize=3'h%h, ahb_haddr=32'h%h",ahb_htrans[1:0], ahb_hsize[2:0], ahb_haddr[31:0]); + + property ahb_error_protocol; + @(posedge ahbm_clk) (ahb_hready & ahb_hresp) |-> (~$past(ahb_hready) & $past(ahb_hresp)); + endproperty + assert_ahb_error_protocol: assert property (ahb_error_protocol) else + $display("Bus Error with hReady isn't preceded with Bus Error without hready"); +`endif + +endmodule // axi4_to_ahb diff --git a/design/lib/beh_lib.sv b/design/lib/beh_lib.sv new file mode 100644 index 0000000..96612b0 --- /dev/null +++ b/design/lib/beh_lib.sv @@ -0,0 +1,506 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright 2020 Western Digital Corporation or it's affiliates. +// +// 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. + +// all flops call the rvdff flop + + +module rvdff #( parameter WIDTH=1, SHORT=0 ) + ( + input logic [WIDTH-1:0] din, + input logic clk, + input logic rst_l, + + output logic [WIDTH-1:0] dout + ); + +if (SHORT == 1) begin + assign dout = din; +end +else begin +`ifdef CLOCKGATE + always @(posedge tb_top.clk) begin + #0 $strobe("CG: %0t %m din %x dout %x clk %b width %d",$time,din,dout,clk,WIDTH); + end +`endif + + always_ff @(posedge clk or negedge rst_l) begin + if (rst_l == 0) + dout[WIDTH-1:0] <= 0; + else + dout[WIDTH-1:0] <= din[WIDTH-1:0]; + end + +end +endmodule + +// rvdff with 2:1 input mux to flop din iff sel==1 +module rvdffs #( parameter WIDTH=1, SHORT=0 ) + ( + input logic [WIDTH-1:0] din, + input logic en, + input logic clk, + input logic rst_l, + output logic [WIDTH-1:0] dout + ); + +if (SHORT == 1) begin : genblock + assign dout = din; +end +else begin : genblock + rvdff #(WIDTH) dffs (.din((en) ? din[WIDTH-1:0] : dout[WIDTH-1:0]), .*); +end + +endmodule + +// rvdff with en and clear +module rvdffsc #( parameter WIDTH=1, SHORT=0 ) + ( + input logic [WIDTH-1:0] din, + input logic en, + input logic clear, + input logic clk, + input logic rst_l, + output logic [WIDTH-1:0] dout + ); + + logic [WIDTH-1:0] din_new; +if (SHORT == 1) begin + assign dout = din; +end +else begin + assign din_new = {WIDTH{~clear}} & (en ? din[WIDTH-1:0] : dout[WIDTH-1:0]); + rvdff #(WIDTH) dffsc (.din(din_new[WIDTH-1:0]), .*); +end +endmodule + +module rvdffe #( parameter WIDTH=1, SHORT=0 ) + ( + input logic [WIDTH-1:0] din, + input logic en, + input logic clk, + input logic rst_l, + input logic scan_mode, + output logic [WIDTH-1:0] dout + ); + + logic l1clk; + +if (SHORT == 1) begin : genblock + if (1) begin : genblock + assign dout = din; + end +end +else begin : genblock + +`ifndef PHYSICAL + if (WIDTH >= 8) begin: genblock +`endif + +`ifdef RV_FPGA_OPTIMIZE + rvdffs #(WIDTH) dff ( .* ); +`else + rvclkhdr clkhdr ( .* ); + rvdff #(WIDTH) dff (.*, .clk(l1clk)); +`endif + +`ifndef PHYSICAL + end + else + $error("%m: rvdffe width must be >= 8"); +`endif +end // else: !if(SHORT == 1) + +endmodule // rvdffe + +module rvsyncss #(parameter WIDTH = 251) + ( + input logic clk, + input logic rst_l, + input logic [WIDTH-1:0] din, + output logic [WIDTH-1:0] dout + ); + + logic [WIDTH-1:0] din_ff1; + + rvdff #(WIDTH) sync_ff1 (.*, .din (din[WIDTH-1:0]), .dout(din_ff1[WIDTH-1:0])); + rvdff #(WIDTH) sync_ff2 (.*, .din (din_ff1[WIDTH-1:0]), .dout(dout[WIDTH-1:0])); + +endmodule // rvsyncss + +module rvlsadder + ( + input logic [31:0] rs1, + input logic [11:0] offset, + + output logic [31:0] dout + ); + + logic cout; + logic sign; + + logic [31:12] rs1_inc; + logic [31:12] rs1_dec; + + assign {cout,dout[11:0]} = {1'b0,rs1[11:0]} + {1'b0,offset[11:0]}; + + assign rs1_inc[31:12] = rs1[31:12] + 1; + + assign rs1_dec[31:12] = rs1[31:12] - 1; + + assign sign = offset[11]; + + assign dout[31:12] = ({20{ sign ^~ cout}} & rs1[31:12]) | + ({20{ ~sign & cout}} & rs1_inc[31:12]) | + ({20{ sign & ~cout}} & rs1_dec[31:12]); + +endmodule // rvlsadder + +// assume we only maintain pc[31:1] in the pipe + +module rvbradder + ( + input [31:1] pc, + input [12:1] offset, + + output [31:1] dout + ); + + logic cout; + logic sign; + + logic [31:13] pc_inc; + logic [31:13] pc_dec; + + assign {cout,dout[12:1]} = {1'b0,pc[12:1]} + {1'b0,offset[12:1]}; + + assign pc_inc[31:13] = pc[31:13] + 1; + + assign pc_dec[31:13] = pc[31:13] - 1; + + assign sign = offset[12]; + + + assign dout[31:13] = ({19{ sign ^~ cout}} & pc[31:13]) | + ({19{ ~sign & cout}} & pc_inc[31:13]) | + ({19{ sign & ~cout}} & pc_dec[31:13]); + + +endmodule // rvbradder + + +// 2s complement circuit +module rvtwoscomp #( parameter WIDTH=32 ) + ( + input logic [WIDTH-1:0] din, + + output logic [WIDTH-1:0] dout + ); + + logic [WIDTH-1:1] dout_temp; // holding for all other bits except for the lsb. LSB is always din + + genvar i; + + for ( i = 1; i < WIDTH; i++ ) begin : flip_after_first_one + assign dout_temp[i] = (|din[i-1:0]) ? ~din[i] : din[i]; + end : flip_after_first_one + + assign dout[WIDTH-1:0] = { dout_temp[WIDTH-1:1], din[0] }; + +endmodule // 2'scomp + +// find first +module rvfindfirst1 #( parameter WIDTH=32, SHIFT=$clog2(WIDTH) ) + ( + input logic [WIDTH-1:0] din, + + output logic [SHIFT-1:0] dout + ); + logic done; + + always_comb begin + dout[SHIFT-1:0] = {SHIFT{1'b0}}; + done = 1'b0; + + for ( int i = WIDTH-1; i > 0; i-- ) begin : find_first_one + done |= din[i]; + dout[SHIFT-1:0] += done ? 1'b0 : 1'b1; + end : find_first_one + end +endmodule // rvfindfirst1 + +module rvfindfirst1hot #( parameter WIDTH=32 ) + ( + input logic [WIDTH-1:0] din, + + output logic [WIDTH-1:0] dout + ); + logic done; + + always_comb begin + dout[WIDTH-1:0] = {WIDTH{1'b0}}; + done = 1'b0; + for ( int i = 0; i < WIDTH; i++ ) begin : find_first_one + dout[i] = ~done & din[i]; + done |= din[i]; + end : find_first_one + end +endmodule // rvfindfirst1hot + +// mask and match function matches bits after finding the first 0 position +// find first starting from LSB. Skip that location and match the rest of the bits +module rvmaskandmatch #( parameter WIDTH=32 ) + ( + input logic [WIDTH-1:0] mask, // this will have the mask in the lower bit positions + input logic [WIDTH-1:0] data, // this is what needs to be matched on the upper bits with the mask's upper bits + input logic masken, // when 1 : do mask. 0 : full match + output logic match + ); + + logic [WIDTH-1:0] matchvec; + logic masken_or_fullmask; + + assign masken_or_fullmask = masken & ~(&mask[WIDTH-1:0]); + + assign matchvec[0] = masken_or_fullmask | (mask[0] == data[0]); + genvar i; + + for ( i = 1; i < WIDTH; i++ ) begin : match_after_first_zero + assign matchvec[i] = (&mask[i-1:0] & masken_or_fullmask) ? 1'b1 : (mask[i] == data[i]); + end : match_after_first_zero + + assign match = &matchvec[WIDTH-1:0]; // all bits either matched or were masked off + +endmodule // rvmaskandmatch + + + + +// Check if the S_ADDR <= addr < E_ADDR +module rvrangecheck #(CCM_SADR = 32'h0, + CCM_SIZE = 128) ( + input logic [31:0] addr, // Address to be checked for range + output logic in_range, // S_ADDR <= start_addr < E_ADDR + output logic in_region +); + + localparam REGION_BITS = 4; + localparam MASK_BITS = 10 + $clog2(CCM_SIZE); + + logic [31:0] start_addr; + logic [3:0] region; + + assign start_addr[31:0] = CCM_SADR; + assign region[REGION_BITS-1:0] = start_addr[31:(32-REGION_BITS)]; + + assign in_region = (addr[31:(32-REGION_BITS)] == region[REGION_BITS-1:0]); + if (CCM_SIZE == 48) + assign in_range = (addr[31:MASK_BITS] == start_addr[31:MASK_BITS]) & ~(&addr[MASK_BITS-1 : MASK_BITS-2]); + else + assign in_range = (addr[31:MASK_BITS] == start_addr[31:MASK_BITS]); + +endmodule // rvrangechecker + +// 16 bit even parity generator +module rveven_paritygen #(WIDTH = 16) ( + input logic [WIDTH-1:0] data_in, // Data + output logic parity_out // generated even parity + ); + + assign parity_out = ^(data_in[WIDTH-1:0]) ; + +endmodule // rveven_paritygen + +module rveven_paritycheck #(WIDTH = 16) ( + input logic [WIDTH-1:0] data_in, // Data + input logic parity_in, + output logic parity_err // Parity error + ); + + assign parity_err = ^(data_in[WIDTH-1:0]) ^ parity_in ; + +endmodule // rveven_paritycheck + +module rvecc_encode ( + input [31:0] din, + output [6:0] ecc_out + ); +logic [5:0] ecc_out_temp; + + assign ecc_out_temp[0] = din[0]^din[1]^din[3]^din[4]^din[6]^din[8]^din[10]^din[11]^din[13]^din[15]^din[17]^din[19]^din[21]^din[23]^din[25]^din[26]^din[28]^din[30]; + assign ecc_out_temp[1] = din[0]^din[2]^din[3]^din[5]^din[6]^din[9]^din[10]^din[12]^din[13]^din[16]^din[17]^din[20]^din[21]^din[24]^din[25]^din[27]^din[28]^din[31]; + assign ecc_out_temp[2] = din[1]^din[2]^din[3]^din[7]^din[8]^din[9]^din[10]^din[14]^din[15]^din[16]^din[17]^din[22]^din[23]^din[24]^din[25]^din[29]^din[30]^din[31]; + assign ecc_out_temp[3] = din[4]^din[5]^din[6]^din[7]^din[8]^din[9]^din[10]^din[18]^din[19]^din[20]^din[21]^din[22]^din[23]^din[24]^din[25]; + assign ecc_out_temp[4] = din[11]^din[12]^din[13]^din[14]^din[15]^din[16]^din[17]^din[18]^din[19]^din[20]^din[21]^din[22]^din[23]^din[24]^din[25]; + assign ecc_out_temp[5] = din[26]^din[27]^din[28]^din[29]^din[30]^din[31]; + + assign ecc_out[6:0] = {(^din[31:0])^(^ecc_out_temp[5:0]),ecc_out_temp[5:0]}; + +endmodule // rvecc_encode + +module rvecc_decode ( + input en, + input [31:0] din, + input [6:0] ecc_in, + input sed_ded, // only do detection and no correction. Used for the I$ + output [31:0] dout, + output [6:0] ecc_out, + output single_ecc_error, + output double_ecc_error + + ); + + logic [6:0] ecc_check; + logic [38:0] error_mask; + logic [38:0] din_plus_parity, dout_plus_parity; + + // Generate the ecc bits + assign ecc_check[0] = ecc_in[0]^din[0]^din[1]^din[3]^din[4]^din[6]^din[8]^din[10]^din[11]^din[13]^din[15]^din[17]^din[19]^din[21]^din[23]^din[25]^din[26]^din[28]^din[30]; + assign ecc_check[1] = ecc_in[1]^din[0]^din[2]^din[3]^din[5]^din[6]^din[9]^din[10]^din[12]^din[13]^din[16]^din[17]^din[20]^din[21]^din[24]^din[25]^din[27]^din[28]^din[31]; + assign ecc_check[2] = ecc_in[2]^din[1]^din[2]^din[3]^din[7]^din[8]^din[9]^din[10]^din[14]^din[15]^din[16]^din[17]^din[22]^din[23]^din[24]^din[25]^din[29]^din[30]^din[31]; + assign ecc_check[3] = ecc_in[3]^din[4]^din[5]^din[6]^din[7]^din[8]^din[9]^din[10]^din[18]^din[19]^din[20]^din[21]^din[22]^din[23]^din[24]^din[25]; + assign ecc_check[4] = ecc_in[4]^din[11]^din[12]^din[13]^din[14]^din[15]^din[16]^din[17]^din[18]^din[19]^din[20]^din[21]^din[22]^din[23]^din[24]^din[25]; + assign ecc_check[5] = ecc_in[5]^din[26]^din[27]^din[28]^din[29]^din[30]^din[31]; + + // This is the parity bit + assign ecc_check[6] = ((^din[31:0])^(^ecc_in[6:0])) & ~sed_ded; + + assign single_ecc_error = en & (ecc_check[6:0] != 0) & ecc_check[6]; // this will never be on for sed_ded + assign double_ecc_error = en & (ecc_check[6:0] != 0) & ~ecc_check[6]; // all errors in the sed_ded case will be recorded as DE + + // Generate the mask for error correctiong + for (genvar i=1; i<40; i++) begin + assign error_mask[i-1] = (ecc_check[5:0] == i); + end + + // Generate the corrected data + assign din_plus_parity[38:0] = {ecc_in[6], din[31:26], ecc_in[5], din[25:11], ecc_in[4], din[10:4], ecc_in[3], din[3:1], ecc_in[2], din[0], ecc_in[1:0]}; + + assign dout_plus_parity[38:0] = single_ecc_error ? (error_mask[38:0] ^ din_plus_parity[38:0]) : din_plus_parity[38:0]; + assign dout[31:0] = {dout_plus_parity[37:32], dout_plus_parity[30:16], dout_plus_parity[14:8], dout_plus_parity[6:4], dout_plus_parity[2]}; + assign ecc_out[6:0] = {(dout_plus_parity[38] ^ (ecc_check[6:0] == 7'b1000000)), dout_plus_parity[31], dout_plus_parity[15], dout_plus_parity[7], dout_plus_parity[3], dout_plus_parity[1:0]}; + +endmodule // rvecc_decode + +module rvecc_encode_64 ( + input [63:0] din, + output [6:0] ecc_out + ); + assign ecc_out[0] = din[0]^din[1]^din[3]^din[4]^din[6]^din[8]^din[10]^din[11]^din[13]^din[15]^din[17]^din[19]^din[21]^din[23]^din[25]^din[26]^din[28]^din[30]^din[32]^din[34]^din[36]^din[38]^din[40]^din[42]^din[44]^din[46]^din[48]^din[50]^din[52]^din[54]^din[56]^din[57]^din[59]^din[61]^din[63]; + + assign ecc_out[1] = din[0]^din[2]^din[3]^din[5]^din[6]^din[9]^din[10]^din[12]^din[13]^din[16]^din[17]^din[20]^din[21]^din[24]^din[25]^din[27]^din[28]^din[31]^din[32]^din[35]^din[36]^din[39]^din[40]^din[43]^din[44]^din[47]^din[48]^din[51]^din[52]^din[55]^din[56]^din[58]^din[59]^din[62]^din[63]; + + assign ecc_out[2] = din[1]^din[2]^din[3]^din[7]^din[8]^din[9]^din[10]^din[14]^din[15]^din[16]^din[17]^din[22]^din[23]^din[24]^din[25]^din[29]^din[30]^din[31]^din[32]^din[37]^din[38]^din[39]^din[40]^din[45]^din[46]^din[47]^din[48]^din[53]^din[54]^din[55]^din[56]^din[60]^din[61]^din[62]^din[63]; + + assign ecc_out[3] = din[4]^din[5]^din[6]^din[7]^din[8]^din[9]^din[10]^din[18]^din[19]^din[20]^din[21]^din[22]^din[23]^din[24]^din[25]^din[33]^din[34]^din[35]^din[36]^din[37]^din[38]^din[39]^din[40]^din[49]^din[50]^din[51]^din[52]^din[53]^din[54]^din[55]^din[56]; + + assign ecc_out[4] = din[11]^din[12]^din[13]^din[14]^din[15]^din[16]^din[17]^din[18]^din[19]^din[20]^din[21]^din[22]^din[23]^din[24]^din[25]^din[41]^din[42]^din[43]^din[44]^din[45]^din[46]^din[47]^din[48]^din[49]^din[50]^din[51]^din[52]^din[53]^din[54]^din[55]^din[56]; + + assign ecc_out[5] = din[26]^din[27]^din[28]^din[29]^din[30]^din[31]^din[32]^din[33]^din[34]^din[35]^din[36]^din[37]^din[38]^din[39]^din[40]^din[41]^din[42]^din[43]^din[44]^din[45]^din[46]^din[47]^din[48]^din[49]^din[50]^din[51]^din[52]^din[53]^din[54]^din[55]^din[56]; + + assign ecc_out[6] = din[57]^din[58]^din[59]^din[60]^din[61]^din[62]^din[63]; + +endmodule // rvecc_encode_64 + + +module rvecc_decode_64 ( + input en, + input [63:0] din, + input [6:0] ecc_in, + output ecc_error + ); + + logic [6:0] ecc_check; + + // Generate the ecc bits + assign ecc_check[0] = ecc_in[0]^din[0]^din[1]^din[3]^din[4]^din[6]^din[8]^din[10]^din[11]^din[13]^din[15]^din[17]^din[19]^din[21]^din[23]^din[25]^din[26]^din[28]^din[30]^din[32]^din[34]^din[36]^din[38]^din[40]^din[42]^din[44]^din[46]^din[48]^din[50]^din[52]^din[54]^din[56]^din[57]^din[59]^din[61]^din[63]; + + assign ecc_check[1] = ecc_in[1]^din[0]^din[2]^din[3]^din[5]^din[6]^din[9]^din[10]^din[12]^din[13]^din[16]^din[17]^din[20]^din[21]^din[24]^din[25]^din[27]^din[28]^din[31]^din[32]^din[35]^din[36]^din[39]^din[40]^din[43]^din[44]^din[47]^din[48]^din[51]^din[52]^din[55]^din[56]^din[58]^din[59]^din[62]^din[63]; + + assign ecc_check[2] = ecc_in[2]^din[1]^din[2]^din[3]^din[7]^din[8]^din[9]^din[10]^din[14]^din[15]^din[16]^din[17]^din[22]^din[23]^din[24]^din[25]^din[29]^din[30]^din[31]^din[32]^din[37]^din[38]^din[39]^din[40]^din[45]^din[46]^din[47]^din[48]^din[53]^din[54]^din[55]^din[56]^din[60]^din[61]^din[62]^din[63]; + + assign ecc_check[3] = ecc_in[3]^din[4]^din[5]^din[6]^din[7]^din[8]^din[9]^din[10]^din[18]^din[19]^din[20]^din[21]^din[22]^din[23]^din[24]^din[25]^din[33]^din[34]^din[35]^din[36]^din[37]^din[38]^din[39]^din[40]^din[49]^din[50]^din[51]^din[52]^din[53]^din[54]^din[55]^din[56]; + + assign ecc_check[4] = ecc_in[4]^din[11]^din[12]^din[13]^din[14]^din[15]^din[16]^din[17]^din[18]^din[19]^din[20]^din[21]^din[22]^din[23]^din[24]^din[25]^din[41]^din[42]^din[43]^din[44]^din[45]^din[46]^din[47]^din[48]^din[49]^din[50]^din[51]^din[52]^din[53]^din[54]^din[55]^din[56]; + + assign ecc_check[5] = ecc_in[5]^din[26]^din[27]^din[28]^din[29]^din[30]^din[31]^din[32]^din[33]^din[34]^din[35]^din[36]^din[37]^din[38]^din[39]^din[40]^din[41]^din[42]^din[43]^din[44]^din[45]^din[46]^din[47]^din[48]^din[49]^din[50]^din[51]^din[52]^din[53]^din[54]^din[55]^din[56]; + + assign ecc_check[6] = ecc_in[6]^din[57]^din[58]^din[59]^din[60]^din[61]^din[62]^din[63]; + + assign ecc_error = en & (ecc_check[6:0] != 0); // all errors in the sed_ded case will be recorded as DE + + endmodule // rvecc_decode_64 + + +module `TEC_RV_ICG + ( + input logic SE, EN, CK, + output Q + ); + + logic en_ff; + logic enable; + + assign enable = EN | SE; + +`ifdef VERILATOR + always @(negedge CK) begin + en_ff <= enable; + end +`else + always @(CK, enable) begin + if(!CK) + en_ff = enable; + end +`endif + assign Q = CK & en_ff; + +endmodule + +module rvclkhdr + ( + input logic en, + input logic clk, + input logic scan_mode, + output logic l1clk + ); + + logic SE; + assign SE = scan_mode; + + `TEC_RV_ICG clkhdr ( .*, .EN(en), .CK(clk), .Q(l1clk)); + +endmodule // rvclkhdr + +module rvoclkhdr + ( + input logic en, + input logic clk, + input logic scan_mode, + output logic l1clk + ); + + logic SE; + assign SE = scan_mode; + +`ifdef RV_FPGA_OPTIMIZE + assign l1clk = clk; +`else + `TEC_RV_ICG clkhdr ( .*, .EN(en), .CK(clk), .Q(l1clk)); +`endif + +endmodule + + + diff --git a/design/lib/el2_lib.sv b/design/lib/el2_lib.sv new file mode 100644 index 0000000..6f71a3c --- /dev/null +++ b/design/lib/el2_lib.sv @@ -0,0 +1,64 @@ +module el2_btb_tag_hash #( +`include "el2_param.vh" + ) ( + input logic [pt.BTB_ADDR_HI+pt.BTB_BTAG_SIZE+pt.BTB_BTAG_SIZE+pt.BTB_BTAG_SIZE:pt.BTB_ADDR_HI+1] pc, + output logic [pt.BTB_BTAG_SIZE-1:0] hash + ); + + assign hash = {(pc[pt.BTB_ADDR_HI+pt.BTB_BTAG_SIZE+pt.BTB_BTAG_SIZE+pt.BTB_BTAG_SIZE:pt.BTB_ADDR_HI+pt.BTB_BTAG_SIZE+pt.BTB_BTAG_SIZE+1] ^ + pc[pt.BTB_ADDR_HI+pt.BTB_BTAG_SIZE+pt.BTB_BTAG_SIZE:pt.BTB_ADDR_HI+pt.BTB_BTAG_SIZE+1] ^ + pc[pt.BTB_ADDR_HI+pt.BTB_BTAG_SIZE:pt.BTB_ADDR_HI+1])}; +endmodule + +module el2_btb_tag_hash_fold #( +`include "el2_param.vh" + )( + input logic [pt.BTB_ADDR_HI+pt.BTB_BTAG_SIZE+pt.BTB_BTAG_SIZE:pt.BTB_ADDR_HI+1] pc, + output logic [pt.BTB_BTAG_SIZE-1:0] hash + ); + + assign hash = {( + pc[pt.BTB_ADDR_HI+pt.BTB_BTAG_SIZE+pt.BTB_BTAG_SIZE:pt.BTB_ADDR_HI+pt.BTB_BTAG_SIZE+1] ^ + pc[pt.BTB_ADDR_HI+pt.BTB_BTAG_SIZE:pt.BTB_ADDR_HI+1])}; + +endmodule + +module el2_btb_addr_hash #( +`include "el2_param.vh" + )( + input logic [pt.BTB_INDEX3_HI:pt.BTB_INDEX1_LO] pc, + output logic [pt.BTB_ADDR_HI:pt.BTB_ADDR_LO] hash + ); + + +if(pt.BTB_FOLD2_INDEX_HASH) begin : fold2 + assign hash[pt.BTB_ADDR_HI:pt.BTB_ADDR_LO] = pc[pt.BTB_INDEX1_HI:pt.BTB_INDEX1_LO] ^ + pc[pt.BTB_INDEX3_HI:pt.BTB_INDEX3_LO]; +end + else begin + assign hash[pt.BTB_ADDR_HI:pt.BTB_ADDR_LO] = pc[pt.BTB_INDEX1_HI:pt.BTB_INDEX1_LO] ^ + pc[pt.BTB_INDEX2_HI:pt.BTB_INDEX2_LO] ^ + pc[pt.BTB_INDEX3_HI:pt.BTB_INDEX3_LO]; +end + +endmodule + +module el2_btb_ghr_hash #( +`include "el2_param.vh" + )( + input logic [pt.BTB_ADDR_HI:pt.BTB_ADDR_LO] hashin, + input logic [pt.BHT_GHR_SIZE-1:0] ghr, + output logic [pt.BHT_ADDR_HI:pt.BHT_ADDR_LO] hash + ); + + // The hash function is too complex to write in verilog for all cases. + // The config script generates the logic string based on the bp config. + if(pt.BHT_GHR_HASH_1) begin : ghrhash_cfg1 + assign hash[pt.BHT_ADDR_HI:pt.BHT_ADDR_LO] = { ghr[pt.BHT_GHR_SIZE-1:pt.BTB_INDEX1_HI-1], hashin[pt.BTB_INDEX1_HI:2]^ghr[pt.BTB_INDEX1_HI-2:0]}; + end + else begin : ghrhash_cfg2 + assign hash[pt.BHT_ADDR_HI:pt.BHT_ADDR_LO] = { hashin[pt.BHT_GHR_SIZE+1:2]^ghr[pt.BHT_GHR_SIZE-1:0]}; + end + + +endmodule diff --git a/design/lib/mem_lib.sv b/design/lib/mem_lib.sv new file mode 100644 index 0000000..e741c61 --- /dev/null +++ b/design/lib/mem_lib.sv @@ -0,0 +1,202 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright 2020 Western Digital Corporation or it's affiliates. +// +// 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. + +`define EL2_LOCAL_RAM_TEST_IO \ +input logic WE, \ +input logic ME, \ +input logic CLK + +`define EL2_RAM(depth, width) \ +module ram_``depth``x``width( \ + input logic [$clog2(depth)-1:0] ADR, \ + input logic [(width-1):0] D, \ + output logic [(width-1):0] Q, \ + `EL2_LOCAL_RAM_TEST_IO \ +); \ +reg [(width-1):0] ram_core [(depth-1):0]; \ + \ +always @(posedge CLK) begin \ + if (ME && WE) ram_core[ADR] = D; \ + if (ME && ~WE) Q <= ram_core[ADR]; \ +end \ + \ +endmodule + +`define EL2_RAM_BE(depth, width) \ +module ram_be_``depth``x``width( \ + input logic [$clog2(depth)-1:0] ADR, \ + input logic [(width-1):0] D, WEM, \ + output logic [(width-1):0] Q, \ + `EL2_LOCAL_RAM_TEST_IO \ +); \ +reg [(width-1):0] ram_core [(depth-1):0]; \ + \ +always @(posedge CLK) begin \ + if (ME && WE) ram_core[ADR] = D & WEM | ~WEM & ram_core[ADR];\ + if (ME && ~WE) Q <= ram_core[ADR]; \ +end \ + \ + \ +endmodule + +// parameterizable RAM for verilator sims +module el2_ram #(depth=4096, width=39) ( +input logic [$clog2(depth)-1:0] ADR, +input logic [(width-1):0] D, +output logic [(width-1):0] Q, + `EL2_LOCAL_RAM_TEST_IO +); +reg [(width-1):0] ram_core [(depth-1):0]; + +always @(posedge CLK) begin + if (ME && WE) ram_core[ADR] = D; + if (ME && ~WE) Q <= ram_core[ADR]; +end +endmodule + +//========================================================================================================================= +//=================================== START OF CCM ======================================================================= +//============= Possible sram sizes for a 39 bit wide memory ( 4 bytes + 7 bits ECC ) ===================================== +//------------------------------------------------------------------------------------------------------------------------- +`EL2_RAM(32768, 39) +`EL2_RAM(16384, 39) +`EL2_RAM(8192, 39) +`EL2_RAM(4096, 39) +`EL2_RAM(3072, 39) +`EL2_RAM(2048, 39) +`EL2_RAM(1536, 39) // need this for the 48KB DCCM option) +`EL2_RAM(1024, 39) +`EL2_RAM(768, 39) +`EL2_RAM(512, 39) +`EL2_RAM(256, 39) +`EL2_RAM(128, 39) +`EL2_RAM(1024, 20) +`EL2_RAM(512, 20) +`EL2_RAM(256, 20) +`EL2_RAM(128, 20) +`EL2_RAM(64, 20) +`EL2_RAM(4096, 34) +`EL2_RAM(2048, 34) +`EL2_RAM(1024, 34) +`EL2_RAM(512, 34) +`EL2_RAM(256, 34) +`EL2_RAM(128, 34) +`EL2_RAM(64, 34) +`EL2_RAM(8192, 68) +`EL2_RAM(4096, 68) +`EL2_RAM(2048, 68) +`EL2_RAM(1024, 68) +`EL2_RAM(512, 68) +`EL2_RAM(256, 68) +`EL2_RAM(128, 68) +`EL2_RAM(64, 68) +`EL2_RAM(8192, 71) +`EL2_RAM(4096, 71) +`EL2_RAM(2048, 71) +`EL2_RAM(1024, 71) +`EL2_RAM(512, 71) +`EL2_RAM(256, 71) +`EL2_RAM(128, 71) +`EL2_RAM(64, 71) +`EL2_RAM(4096, 42) +`EL2_RAM(2048, 42) +`EL2_RAM(1024, 42) +`EL2_RAM(512, 42) +`EL2_RAM(256, 42) +`EL2_RAM(128, 42) +`EL2_RAM(64, 42) +`EL2_RAM(4096, 22) +`EL2_RAM(2048, 22) +`EL2_RAM(1024, 22) +`EL2_RAM(512, 22) +`EL2_RAM(256, 22) +`EL2_RAM(128, 22) +`EL2_RAM(64, 22) +`EL2_RAM(1024, 26) +`EL2_RAM(4096, 26) +`EL2_RAM(2048, 26) +`EL2_RAM(512, 26) +`EL2_RAM(256, 26) +`EL2_RAM(128, 26) +`EL2_RAM(64, 26) +`EL2_RAM(32, 26) +`EL2_RAM(32, 22) +`EL2_RAM_BE(8192, 142) +`EL2_RAM_BE(4096, 142) +`EL2_RAM_BE(2048, 142) +`EL2_RAM_BE(1024, 142) +`EL2_RAM_BE(512, 142) +`EL2_RAM_BE(256, 142) +`EL2_RAM_BE(128, 142) +`EL2_RAM_BE(64, 142) +`EL2_RAM_BE(8192, 284) +`EL2_RAM_BE(4096, 284) +`EL2_RAM_BE(2048, 284) +`EL2_RAM_BE(1024, 284) +`EL2_RAM_BE(512, 284) +`EL2_RAM_BE(256, 284) +`EL2_RAM_BE(128, 284) +`EL2_RAM_BE(64, 284) +`EL2_RAM_BE(8192, 136) +`EL2_RAM_BE(4096, 136) +`EL2_RAM_BE(2048, 136) +`EL2_RAM_BE(1024, 136) +`EL2_RAM_BE(512, 136) +`EL2_RAM_BE(256, 136) +`EL2_RAM_BE(128, 136) +`EL2_RAM_BE(64, 136) +`EL2_RAM_BE(8192, 272) +`EL2_RAM_BE(4096, 272) +`EL2_RAM_BE(2048, 272) +`EL2_RAM_BE(1024, 272) +`EL2_RAM_BE(512, 272) +`EL2_RAM_BE(256, 272) +`EL2_RAM_BE(128, 272) +`EL2_RAM_BE(64, 272) +`EL2_RAM_BE(4096, 52) +`EL2_RAM_BE(2048, 52) +`EL2_RAM_BE(1024, 52) +`EL2_RAM_BE(512, 52) +`EL2_RAM_BE(256, 52) +`EL2_RAM_BE(128, 52) +`EL2_RAM_BE(64, 52) +`EL2_RAM_BE(4096, 104) +`EL2_RAM_BE(2048, 104) +`EL2_RAM_BE(1024, 104) +`EL2_RAM_BE(512, 104) +`EL2_RAM_BE(256, 104) +`EL2_RAM_BE(128, 104) +`EL2_RAM_BE(64, 104) +`EL2_RAM_BE(4096, 44) +`EL2_RAM_BE(2048, 44) +`EL2_RAM_BE(1024, 44) +`EL2_RAM_BE(512, 44) +`EL2_RAM_BE(256, 44) +`EL2_RAM_BE(128, 44) +`EL2_RAM_BE(64, 44) +`EL2_RAM_BE(4096, 88) +`EL2_RAM_BE(2048, 88) +`EL2_RAM_BE(1024, 88) +`EL2_RAM_BE(512, 88) +`EL2_RAM_BE(256, 88) +`EL2_RAM_BE(128, 88) +`EL2_RAM_BE(64, 88) + + +`undef EL2_RAM +`undef EL2_RAM_BE +`undef EL2_LOCAL_RAM_TEST_IO + + diff --git a/design/lsu/el2_lsu.sv b/design/lsu/el2_lsu.sv new file mode 100644 index 0000000..cd2a097 --- /dev/null +++ b/design/lsu/el2_lsu.sv @@ -0,0 +1,408 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright 2020 Western Digital Corporation or it's affiliates. +// +// 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. + +//******************************************************************************** +// $Id$ +// +// +// Function: Top level file for load store unit +// Comments: +// +// +// DC1 -> DC2 -> DC3 -> DC4 (Commit) +// +//******************************************************************************** + +module el2_lsu +import el2_pkg::*; +#( +`include "el2_param.vh" + ) +( + + input logic clk_override, // Override non-functional clock gating + input logic dec_tlu_flush_lower_r, // I0/I1 writeback flush. This is used to flush the old packets only + input logic dec_tlu_i0_kill_writeb_r, // I0 is flushed, don't writeback any results to arch state + input logic dec_tlu_force_halt, // This will be high till TLU goes to debug halt + + // chicken signals + input logic dec_tlu_external_ldfwd_disable, // disable load to load forwarding for externals + input logic dec_tlu_wb_coalescing_disable, // disable the write buffer coalesce + input logic dec_tlu_sideeffect_posted_disable, // disable the posted sideeffect load store to the bus + input logic dec_tlu_core_ecc_disable, // disable the generation of the ecc + + + input logic [31:0] exu_lsu_rs1_d, // address rs operand + input logic [31:0] exu_lsu_rs2_d, // store data + input logic [11:0] dec_lsu_offset_d, // address offset operand + + input el2_lsu_pkt_t lsu_p, // lsu control packet + input logic dec_lsu_valid_raw_d, // Raw valid for address computation + input logic [31:0] dec_tlu_mrac_ff, // CSR for memory region control + + output logic [31:0] lsu_result_m, // lsu load data + output logic [31:0] lsu_result_corr_r, // This is the ECC corrected data going to RF + output logic lsu_load_stall_any, // This is for blocking loads in the decode + output logic lsu_store_stall_any, // This is for blocking stores in the decode + output logic lsu_fastint_stall_any, // Stall the fastint in decode-1 stage + output logic lsu_idle_any, // lsu buffers are empty and no instruction in the pipeline. Doesn't include DMA + + output logic [31:1] lsu_fir_addr, // fast interrupt address + output logic [1:0] lsu_fir_error, // Error during fast interrupt lookup + + output logic lsu_single_ecc_error_incr, // Increment the ecc counter + output el2_lsu_error_pkt_t lsu_error_pkt_r, // lsu exception packet + output logic lsu_imprecise_error_load_any, // bus load imprecise error + output logic lsu_imprecise_error_store_any, // bus store imprecise error + output logic [31:0] lsu_imprecise_error_addr_any, // bus store imprecise error address + + // Non-blocking loads + output logic lsu_nonblock_load_valid_m, // there is an external load -> put in the cam + output logic [pt.LSU_NUM_NBLOAD_WIDTH-1:0] lsu_nonblock_load_tag_m, // the tag of the external non block load + output logic lsu_nonblock_load_inv_r, // invalidate signal for the cam entry for non block loads + output logic [pt.LSU_NUM_NBLOAD_WIDTH-1:0] lsu_nonblock_load_inv_tag_r, // tag of the enrty which needs to be invalidated + output logic lsu_nonblock_load_data_valid, // the non block is valid - sending information back to the cam + output logic lsu_nonblock_load_data_error, // non block load has an error + output logic [pt.LSU_NUM_NBLOAD_WIDTH-1:0] lsu_nonblock_load_data_tag, // the tag of the non block load sending the data/error + output logic [31:0] lsu_nonblock_load_data, // Data of the non block load + + + output logic lsu_pmu_load_external_m, // PMU : Bus loads + output logic lsu_pmu_store_external_m, // PMU : Bus loads + output logic lsu_pmu_misaligned_m, // PMU : misaligned + output logic lsu_pmu_bus_trxn, // PMU : bus transaction + output logic lsu_pmu_bus_misaligned, // PMU : misaligned access going to the bus + output logic lsu_pmu_bus_error, // PMU : bus sending error back + output logic lsu_pmu_bus_busy, // PMU : bus is not ready + + // Trigger signals + input el2_trigger_pkt_t [3:0] trigger_pkt_any, // Trigger info from the decode + output logic [3:0] lsu_trigger_match_m, // lsu trigger hit (one bit per trigger) + + // DCCM ports + output logic dccm_wren, // DCCM write enable + output logic dccm_rden, // DCCM read enable + output logic [pt.DCCM_BITS-1:0] dccm_wr_addr_lo, // DCCM write address low bank + output logic [pt.DCCM_BITS-1:0] dccm_wr_addr_hi, // DCCM write address hi bank + output logic [pt.DCCM_BITS-1:0] dccm_rd_addr_lo, // DCCM read address low bank + output logic [pt.DCCM_BITS-1:0] dccm_rd_addr_hi, // DCCM read address hi bank (hi and low same if aligned read) + output logic [pt.DCCM_FDATA_WIDTH-1:0] dccm_wr_data_lo, // DCCM write data for lo bank + output logic [pt.DCCM_FDATA_WIDTH-1:0] dccm_wr_data_hi, // DCCM write data for hi bank + + input logic [pt.DCCM_FDATA_WIDTH-1:0] dccm_rd_data_lo, // DCCM read data low bank + input logic [pt.DCCM_FDATA_WIDTH-1:0] dccm_rd_data_hi, // DCCM read data hi bank + + // PIC ports + output logic picm_wren, // PIC memory write enable + output logic picm_rden, // PIC memory read enable + output logic picm_mken, // Need to read the mask for stores to determine which bits to write/forward + output logic [31:0] picm_rdaddr, // address for pic read access + output logic [31:0] picm_wraddr, // address for pic write access + output logic [31:0] picm_wr_data, // PIC memory write data + input logic [31:0] picm_rd_data, // PIC memory read/mask data + + // AXI Write Channels + output logic lsu_axi_awvalid, + input logic lsu_axi_awready, + output logic [pt.LSU_BUS_TAG-1:0] lsu_axi_awid, + output logic [31:0] lsu_axi_awaddr, + output logic [3:0] lsu_axi_awregion, + output logic [7:0] lsu_axi_awlen, + output logic [2:0] lsu_axi_awsize, + output logic [1:0] lsu_axi_awburst, + output logic lsu_axi_awlock, + output logic [3:0] lsu_axi_awcache, + output logic [2:0] lsu_axi_awprot, + output logic [3:0] lsu_axi_awqos, + + output logic lsu_axi_wvalid, + input logic lsu_axi_wready, + output logic [63:0] lsu_axi_wdata, + output logic [7:0] lsu_axi_wstrb, + output logic lsu_axi_wlast, + + input logic lsu_axi_bvalid, + output logic lsu_axi_bready, + input logic [1:0] lsu_axi_bresp, + input logic [pt.LSU_BUS_TAG-1:0] lsu_axi_bid, + + // AXI Read Channels + output logic lsu_axi_arvalid, + input logic lsu_axi_arready, + output logic [pt.LSU_BUS_TAG-1:0] lsu_axi_arid, + output logic [31:0] lsu_axi_araddr, + output logic [3:0] lsu_axi_arregion, + output logic [7:0] lsu_axi_arlen, + output logic [2:0] lsu_axi_arsize, + output logic [1:0] lsu_axi_arburst, + output logic lsu_axi_arlock, + output logic [3:0] lsu_axi_arcache, + output logic [2:0] lsu_axi_arprot, + output logic [3:0] lsu_axi_arqos, + + input logic lsu_axi_rvalid, + output logic lsu_axi_rready, + input logic [pt.LSU_BUS_TAG-1:0] lsu_axi_rid, + input logic [63:0] lsu_axi_rdata, + input logic [1:0] lsu_axi_rresp, + input logic lsu_axi_rlast, + + input logic lsu_bus_clk_en, // external drives a clock_en to control bus ratio + + // DMA slave + input logic dma_dccm_req, // DMA read/write to dccm + input logic [2:0] dma_mem_tag, // DMA request tag + input logic [31:0] dma_mem_addr, // DMA address + input logic [2:0] dma_mem_sz, // DMA access size + input logic dma_mem_write, // DMA access is a write + input logic [63:0] dma_mem_wdata, // DMA write data + + output logic dccm_dma_rvalid, // lsu data valid for DMA dccm read + output logic dccm_dma_ecc_error, // DMA load had ecc error + output logic [2:0] dccm_dma_rtag, // DMA request tag + output logic [63:0] dccm_dma_rdata, // lsu data for DMA dccm read + output logic dccm_ready, // lsu ready for DMA access + + input logic scan_mode, // scan + input logic clk, + input logic free_clk, + input logic rst_l + + ); + + + logic lsu_dccm_rden_m; + logic lsu_dccm_rden_r; + logic [31:0] store_data_m; + logic [31:0] store_data_r; + logic [31:0] store_data_hi_r, store_data_lo_r; + logic [31:0] store_datafn_hi_r, store_datafn_lo_r; + logic [31:0] sec_data_lo_m, sec_data_hi_m; + logic [31:0] sec_data_lo_r, sec_data_hi_r; + + logic [31:0] lsu_ld_data_m; + logic [31:0] dccm_rdata_hi_m, dccm_rdata_lo_m; + logic [6:0] dccm_data_ecc_hi_m, dccm_data_ecc_lo_m; + logic lsu_single_ecc_error_m; + logic lsu_double_ecc_error_m; + + logic [31:0] lsu_ld_data_r; + logic [31:0] lsu_ld_data_corr_r; + logic [31:0] dccm_rdata_hi_r, dccm_rdata_lo_r; + logic [6:0] dccm_data_ecc_hi_r, dccm_data_ecc_lo_r; + logic single_ecc_error_hi_r, single_ecc_error_lo_r; + logic lsu_single_ecc_error_r; + logic lsu_double_ecc_error_r; + logic ld_single_ecc_error_r, ld_single_ecc_error_r_ff; + + logic [31:0] picm_mask_data_m; + + logic [31:0] lsu_addr_d, lsu_addr_m, lsu_addr_r; + logic [31:0] end_addr_d, end_addr_m, end_addr_r; + + el2_lsu_pkt_t lsu_pkt_d, lsu_pkt_m, lsu_pkt_r; + logic lsu_i0_valid_d, lsu_i0_valid_m, lsu_i0_valid_r; + + // Store Buffer signals + logic store_stbuf_reqvld_r; + logic ldst_stbuf_reqvld_r; + + logic lsu_commit_r; + logic lsu_exc_m; + + logic addr_in_dccm_d, addr_in_dccm_m, addr_in_dccm_r; + logic addr_in_pic_d, addr_in_pic_m, addr_in_pic_r; + logic addr_external_m; + + logic stbuf_reqvld_any; + logic stbuf_reqvld_flushed_any; + logic [pt.LSU_SB_BITS-1:0] stbuf_addr_any; + logic [pt.DCCM_DATA_WIDTH-1:0] stbuf_data_any; + logic [pt.DCCM_ECC_WIDTH-1:0] stbuf_ecc_any; + logic [pt.DCCM_DATA_WIDTH-1:0] sec_data_lo_r_ff, sec_data_hi_r_ff; + logic [pt.DCCM_ECC_WIDTH-1:0] sec_data_ecc_hi_r_ff, sec_data_ecc_lo_r_ff; + + logic lsu_cmpen_m; + logic [pt.DCCM_DATA_WIDTH-1:0] stbuf_fwddata_hi_m; + logic [pt.DCCM_DATA_WIDTH-1:0] stbuf_fwddata_lo_m; + logic [pt.DCCM_BYTE_WIDTH-1:0] stbuf_fwdbyteen_hi_m; + logic [pt.DCCM_BYTE_WIDTH-1:0] stbuf_fwdbyteen_lo_m; + + logic lsu_stbuf_commit_any; + logic lsu_stbuf_empty_any; // This is for blocking loads + logic lsu_stbuf_full_any; + + // Bus signals + logic lsu_busreq_r; + logic lsu_bus_buffer_pend_any; + logic lsu_bus_buffer_empty_any; + logic lsu_bus_buffer_full_any; + logic lsu_bus_idle_any; + logic lsu_busreq_m; + logic [31:0] bus_read_data_m; + + logic flush_m_up, flush_r; + logic is_sideeffects_m; + logic [2:0] dma_mem_tag_d, dma_mem_tag_m; + logic ldst_nodma_mtor; + logic dma_dccm_wen; + logic [31:0] dma_dccm_wdata_lo, dma_dccm_wdata_hi; + logic [pt.DCCM_ECC_WIDTH-1:0] dma_dccm_wdata_ecc_lo, dma_dccm_wdata_ecc_hi; + + // Clocks + logic lsu_c1_m_clk, lsu_c1_r_clk; + logic lsu_c2_m_clk, lsu_c2_r_clk; + logic lsu_store_c1_m_clk, lsu_store_c1_r_clk; + + logic lsu_stbuf_c1_clk; + logic lsu_bus_ibuf_c1_clk, lsu_bus_obuf_c1_clk, lsu_bus_buf_c1_clk; + logic lsu_busm_clk; + logic lsu_free_c2_clk; + + logic lsu_raw_fwd_lo_m, lsu_raw_fwd_hi_m; + logic lsu_raw_fwd_lo_r, lsu_raw_fwd_hi_r; + + assign lsu_raw_fwd_lo_m = (|stbuf_fwdbyteen_lo_m[pt.DCCM_BYTE_WIDTH-1:0]); + assign lsu_raw_fwd_hi_m = (|stbuf_fwdbyteen_hi_m[pt.DCCM_BYTE_WIDTH-1:0]); + + el2_lsu_lsc_ctl #(.pt(pt)) lsu_lsc_ctl (.*); + + // block stores in decode - for either bus or stbuf reasons + assign lsu_store_stall_any = lsu_stbuf_full_any | lsu_bus_buffer_full_any | ld_single_ecc_error_r_ff; + assign lsu_load_stall_any = lsu_bus_buffer_full_any | ld_single_ecc_error_r_ff; + assign lsu_fastint_stall_any = ld_single_ecc_error_r; // Stall the fastint in decode-1 stage + + // Ready to accept dma trxns + // There can't be any inpipe forwarding from non-dma packet to dma packet since they can be flushed so we can't have st in r when dma is in m + assign dma_mem_tag_d[2:0] = dma_mem_tag[2:0]; + assign ldst_nodma_mtor = (lsu_pkt_m.valid & ~lsu_pkt_m.dma & (addr_in_dccm_m | addr_in_pic_m) & lsu_pkt_m.store); + assign dccm_ready = ~(dec_lsu_valid_raw_d | ldst_nodma_mtor | ld_single_ecc_error_r_ff); + + assign dma_dccm_wen = dma_dccm_req & dma_mem_write & addr_in_dccm_d; + assign {dma_dccm_wdata_hi[31:0], dma_dccm_wdata_lo[31:0]} = dma_mem_wdata[63:0] >> {dma_mem_addr[2:0], 3'b000}; // Shift the dma data to lower bits to make it consistent to lsu stores + + + // Generate per cycle flush signals + assign flush_m_up = dec_tlu_flush_lower_r; + assign flush_r = dec_tlu_i0_kill_writeb_r; + + // lsu halt idle. This is used for entering the halt mode. Also, DMA accesses are allowed during fence. + // Indicates non-idle if there is a instruction valid in d-r or read/write buffers are non-empty since they can come with error + // Store buffer now have only non-dma dccm stores + // stbuf_empty not needed since it has only dccm stores + assign lsu_idle_any = ~((lsu_pkt_m.valid & ~lsu_pkt_m.dma) | + (lsu_pkt_r.valid & ~lsu_pkt_r.dma)) & + lsu_bus_buffer_empty_any & lsu_bus_idle_any; + + // Instantiate the store buffer + assign store_stbuf_reqvld_r = lsu_pkt_r.valid & lsu_pkt_r.store & addr_in_dccm_r & ~flush_r & ~lsu_pkt_r.dma; + + // Disable Forwarding for now + assign lsu_cmpen_m = lsu_pkt_m.valid & (lsu_pkt_m.load | lsu_pkt_m.store) & (addr_in_dccm_m | addr_in_pic_m); + + // Bus signals + assign lsu_busreq_m = lsu_pkt_m.valid & ((lsu_pkt_m.load | lsu_pkt_m.store) & addr_external_m) & ~flush_m_up & ~lsu_exc_m & ~lsu_pkt_m.fast_int; + + // PMU signals + assign lsu_pmu_misaligned_m = lsu_pkt_m.valid & ((lsu_pkt_m.half & lsu_addr_m[0]) | (lsu_pkt_m.word & (|lsu_addr_m[1:0]))); + assign lsu_pmu_load_external_m = lsu_pkt_m.valid & lsu_pkt_m.load & addr_external_m; + assign lsu_pmu_store_external_m = lsu_pkt_m.valid & lsu_pkt_m.store & addr_external_m; + + el2_lsu_dccm_ctl #(.pt(pt)) dccm_ctl ( + .lsu_addr_d(lsu_addr_d[31:0]), + .end_addr_d(end_addr_d[pt.DCCM_BITS-1:0]), + .lsu_addr_m(lsu_addr_m[pt.DCCM_BITS-1:0]), + .lsu_addr_r(lsu_addr_r[31:0]), + + .end_addr_m(end_addr_m[pt.DCCM_BITS-1:0]), + .end_addr_r(end_addr_r[pt.DCCM_BITS-1:0]), + .* + ); + + el2_lsu_stbuf #(.pt(pt)) stbuf ( + .lsu_addr_d(lsu_addr_d[pt.LSU_SB_BITS-1:0]), + .end_addr_d(end_addr_d[pt.LSU_SB_BITS-1:0]), + + .* + + ); + + el2_lsu_ecc #(.pt(pt)) ecc ( + .lsu_addr_r(lsu_addr_r[pt.DCCM_BITS-1:0]), + .end_addr_r(end_addr_r[pt.DCCM_BITS-1:0]), + .lsu_addr_m(lsu_addr_m[pt.DCCM_BITS-1:0]), + .end_addr_m(end_addr_m[pt.DCCM_BITS-1:0]), + .* + ); + + el2_lsu_trigger #(.pt(pt)) trigger ( + .store_data_m(store_data_m[31:0]), + .* + ); + + // Clk domain + el2_lsu_clkdomain #(.pt(pt)) clkdomain (.*); + + // Bus interface + el2_lsu_bus_intf #(.pt(pt)) bus_intf ( + .* + ); + + //Flops + rvdff #(3) dma_mem_tag_mff (.*, .din(dma_mem_tag_d[2:0]), .dout(dma_mem_tag_m[2:0]), .clk(lsu_c1_m_clk)); + + rvdff #(2) lsu_raw_fwd_r_ff (.*, .din({lsu_raw_fwd_hi_m, lsu_raw_fwd_lo_m}), .dout({lsu_raw_fwd_hi_r, lsu_raw_fwd_lo_r}), .clk(lsu_c2_r_clk)); + + +`ifdef ASSERT_ON + logic [1:0] store_data_bypass_sel; + assign store_data_bypass_sel[1:0] = {lsu_p.store_data_bypass_d, lsu_p.store_data_bypass_m}; + property exception_no_lsu_flush; + @(posedge clk) disable iff(~rst_l) lsu_lsc_ctl.lsu_error_pkt_m.exc_valid |-> ##[1:2] (flush_r ); + endproperty + assert_exception_no_lsu_flush: assert property (exception_no_lsu_flush) else + $display("No flush within 2 cycles of exception"); + + // offset should be zero for fast interrupt + property offset_0_fastint; + @(posedge clk) disable iff(~rst_l) (lsu_p.valid & lsu_p.fast_int) |-> (dec_lsu_offset_d[11:0] == 12'b0); + endproperty + assert_offset_0_fastint: assert property (offset_0_fastint) else + $display("dec_tlu_offset_d not zero for fast interrupt redirect"); + + // DMA req should assert dccm rden/wren + property dmareq_dccm_wren_or_rden; + @(posedge clk) disable iff(~rst_l) dma_dccm_req |-> (dccm_rden | dccm_wren | addr_in_pic_d); + endproperty + assert_dmareq_dccm_wren_or_rden: assert property(dmareq_dccm_wren_or_rden) else + $display("dccm rden or wren not asserted during DMA request"); + + // fastint_stall should cause load/store stall next cycle + property fastint_stall_imply_loadstore_stall; + @(posedge clk) disable iff(~rst_l) (lsu_fastint_stall_any & (lsu_commit_r | lsu_pkt_r.dma)) |-> ##1 ((lsu_load_stall_any | lsu_store_stall_any) | ~ld_single_ecc_error_r_ff); + endproperty + assert_fastint_stall_imply_loadstore_stall: assert property (fastint_stall_imply_loadstore_stall) else + $display("fastint_stall should be followed by lsu_load/store_stall_any"); + + // Single ECC error implies rfnpc flush + property single_ecc_error_rfnpc_flush; + @(posedge clk) disable iff(~rst_l) (lsu_error_pkt_r.single_ecc_error & lsu_pkt_r.load) |=> ~lsu_commit_r; + endproperty + assert_single_ecc_error_rfnpc_flush: assert property (single_ecc_error_rfnpc_flush) else + $display("LSU commit next cycle after single ecc error"); + +`endif + +endmodule // el2_lsu diff --git a/design/lsu/el2_lsu_addrcheck.sv b/design/lsu/el2_lsu_addrcheck.sv new file mode 100644 index 0000000..77329fc --- /dev/null +++ b/design/lsu/el2_lsu_addrcheck.sv @@ -0,0 +1,191 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright 2020 Western Digital Corporation or it's affiliates. +// +// 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. + +//******************************************************************************** +// $Id$ +// +// +// Owner: +// Function: Checks the memory map for the address +// Comments: +// +//******************************************************************************** +module el2_lsu_addrcheck +import el2_pkg::*; +#( +`include "el2_param.vh" + )( + input logic lsu_c2_m_clk, // clock + input logic rst_l, // reset + + input logic [31:0] start_addr_d, // start address for lsu + input logic [31:0] end_addr_d, // end address for lsu + input el2_lsu_pkt_t lsu_pkt_d, // packet in d + input logic [31:0] dec_tlu_mrac_ff, // CSR read + input logic [3:0] rs1_region_d, + + input logic [31:0] rs1_d, + + output logic is_sideeffects_m, // is sideffects space + output logic addr_in_dccm_d, // address in dccm + output logic addr_in_pic_d, // address in pic + output logic addr_external_d, // address in external + + output logic access_fault_d, // access fault + output logic misaligned_fault_d, // misaligned + output logic [2:0] exc_mscause_d, // mscause for access/misaligned faults + + output logic fir_dccm_access_error_d, // Fast interrupt dccm access error + output logic fir_nondccm_access_error_d,// Fast interrupt dccm access error + + input logic scan_mode +); + + + logic non_dccm_access_ok; + logic is_sideeffects_d, is_aligned_d; + logic start_addr_in_dccm_d, end_addr_in_dccm_d; + logic start_addr_in_dccm_region_d, end_addr_in_dccm_region_d; + logic start_addr_in_pic_d, end_addr_in_pic_d; + logic start_addr_in_pic_region_d, end_addr_in_pic_region_d; + logic [4:0] csr_idx; + logic addr_in_iccm; + logic start_addr_dccm_or_pic; + logic base_reg_dccm_or_pic; + logic unmapped_access_fault_d, mpu_access_fault_d, picm_access_fault_d, regpred_access_fault_d; + logic regcross_misaligned_fault_d, sideeffect_misaligned_fault_d; + logic [2:0] access_fault_mscause_d; + logic misaligned_fault_mscause_d; + + if (pt.DCCM_ENABLE == 1) begin: Gen_dccm_enable + // Start address check + rvrangecheck #(.CCM_SADR(pt.DCCM_SADR), + .CCM_SIZE(pt.DCCM_SIZE)) start_addr_dccm_rangecheck ( + .addr(start_addr_d[31:0]), + .in_range(start_addr_in_dccm_d), + .in_region(start_addr_in_dccm_region_d) + ); + + // End address check + rvrangecheck #(.CCM_SADR(pt.DCCM_SADR), + .CCM_SIZE(pt.DCCM_SIZE)) end_addr_dccm_rangecheck ( + .addr(end_addr_d[31:0]), + .in_range(end_addr_in_dccm_d), + .in_region(end_addr_in_dccm_region_d) + ); + end else begin: Gen_dccm_disable // block: Gen_dccm_enable + assign start_addr_in_dccm_d = '0; + assign start_addr_in_dccm_region_d = '0; + assign end_addr_in_dccm_d = '0; + assign end_addr_in_dccm_region_d = '0; + end + + if (pt.ICCM_ENABLE == 1) begin : check_iccm + assign addr_in_iccm = (start_addr_d[31:28] == pt.ICCM_REGION); + end else begin + assign addr_in_iccm = 1'b0; + end + + // PIC memory check + // Start address check + rvrangecheck #(.CCM_SADR(pt.PIC_BASE_ADDR), + .CCM_SIZE(pt.PIC_SIZE)) start_addr_pic_rangecheck ( + .addr(start_addr_d[31:0]), + .in_range(start_addr_in_pic_d), + .in_region(start_addr_in_pic_region_d) + ); + + // End address check + rvrangecheck #(.CCM_SADR(pt.PIC_BASE_ADDR), + .CCM_SIZE(pt.PIC_SIZE)) end_addr_pic_rangecheck ( + .addr(end_addr_d[31:0]), + .in_range(end_addr_in_pic_d), + .in_region(end_addr_in_pic_region_d) + ); + + assign start_addr_dccm_or_pic = start_addr_in_dccm_region_d | start_addr_in_pic_region_d; + assign base_reg_dccm_or_pic = (rs1_region_d[3:0] == pt.DCCM_REGION) | (rs1_region_d[3:0] == pt.PIC_REGION); + assign addr_in_dccm_d = (start_addr_in_dccm_d & end_addr_in_dccm_d); + assign addr_in_pic_d = (start_addr_in_pic_d & end_addr_in_pic_d); + + assign addr_external_d = ~(start_addr_in_dccm_region_d | start_addr_in_pic_region_d); + assign csr_idx[4:0] = {start_addr_d[31:28], 1'b1}; + assign is_sideeffects_d = dec_tlu_mrac_ff[csr_idx] & ~(start_addr_in_dccm_region_d | start_addr_in_pic_region_d | addr_in_iccm) & lsu_pkt_d.valid & (lsu_pkt_d.store | lsu_pkt_d.load); //every region has the 2 LSB indicating ( 1: sideeffects/no_side effects, and 0: cacheable ). Ignored in internal regions + assign is_aligned_d = (lsu_pkt_d.word & (start_addr_d[1:0] == 2'b0)) | + (lsu_pkt_d.half & (start_addr_d[0] == 1'b0)) | + lsu_pkt_d.by; + + assign non_dccm_access_ok = (~(|{pt.DATA_ACCESS_ENABLE0,pt.DATA_ACCESS_ENABLE1,pt.DATA_ACCESS_ENABLE2,pt.DATA_ACCESS_ENABLE3,pt.DATA_ACCESS_ENABLE4,pt.DATA_ACCESS_ENABLE5,pt.DATA_ACCESS_ENABLE6,pt.DATA_ACCESS_ENABLE7})) | + (((pt.DATA_ACCESS_ENABLE0 & ((start_addr_d[31:0] | pt.DATA_ACCESS_MASK0)) == (pt.DATA_ACCESS_ADDR0 | pt.DATA_ACCESS_MASK0)) | + (pt.DATA_ACCESS_ENABLE1 & ((start_addr_d[31:0] | pt.DATA_ACCESS_MASK1)) == (pt.DATA_ACCESS_ADDR1 | pt.DATA_ACCESS_MASK1)) | + (pt.DATA_ACCESS_ENABLE2 & ((start_addr_d[31:0] | pt.DATA_ACCESS_MASK2)) == (pt.DATA_ACCESS_ADDR2 | pt.DATA_ACCESS_MASK2)) | + (pt.DATA_ACCESS_ENABLE3 & ((start_addr_d[31:0] | pt.DATA_ACCESS_MASK3)) == (pt.DATA_ACCESS_ADDR3 | pt.DATA_ACCESS_MASK3)) | + (pt.DATA_ACCESS_ENABLE4 & ((start_addr_d[31:0] | pt.DATA_ACCESS_MASK4)) == (pt.DATA_ACCESS_ADDR4 | pt.DATA_ACCESS_MASK4)) | + (pt.DATA_ACCESS_ENABLE5 & ((start_addr_d[31:0] | pt.DATA_ACCESS_MASK5)) == (pt.DATA_ACCESS_ADDR5 | pt.DATA_ACCESS_MASK5)) | + (pt.DATA_ACCESS_ENABLE6 & ((start_addr_d[31:0] | pt.DATA_ACCESS_MASK6)) == (pt.DATA_ACCESS_ADDR6 | pt.DATA_ACCESS_MASK6)) | + (pt.DATA_ACCESS_ENABLE7 & ((start_addr_d[31:0] | pt.DATA_ACCESS_MASK7)) == (pt.DATA_ACCESS_ADDR7 | pt.DATA_ACCESS_MASK7))) & + ((pt.DATA_ACCESS_ENABLE0 & ((end_addr_d[31:0] | pt.DATA_ACCESS_MASK0)) == (pt.DATA_ACCESS_ADDR0 | pt.DATA_ACCESS_MASK0)) | + (pt.DATA_ACCESS_ENABLE1 & ((end_addr_d[31:0] | pt.DATA_ACCESS_MASK1)) == (pt.DATA_ACCESS_ADDR1 | pt.DATA_ACCESS_MASK1)) | + (pt.DATA_ACCESS_ENABLE2 & ((end_addr_d[31:0] | pt.DATA_ACCESS_MASK2)) == (pt.DATA_ACCESS_ADDR2 | pt.DATA_ACCESS_MASK2)) | + (pt.DATA_ACCESS_ENABLE3 & ((end_addr_d[31:0] | pt.DATA_ACCESS_MASK3)) == (pt.DATA_ACCESS_ADDR3 | pt.DATA_ACCESS_MASK3)) | + (pt.DATA_ACCESS_ENABLE4 & ((end_addr_d[31:0] | pt.DATA_ACCESS_MASK4)) == (pt.DATA_ACCESS_ADDR4 | pt.DATA_ACCESS_MASK4)) | + (pt.DATA_ACCESS_ENABLE5 & ((end_addr_d[31:0] | pt.DATA_ACCESS_MASK5)) == (pt.DATA_ACCESS_ADDR5 | pt.DATA_ACCESS_MASK5)) | + (pt.DATA_ACCESS_ENABLE6 & ((end_addr_d[31:0] | pt.DATA_ACCESS_MASK6)) == (pt.DATA_ACCESS_ADDR6 | pt.DATA_ACCESS_MASK6)) | + (pt.DATA_ACCESS_ENABLE7 & ((end_addr_d[31:0] | pt.DATA_ACCESS_MASK7)) == (pt.DATA_ACCESS_ADDR7 | pt.DATA_ACCESS_MASK7)))); + + // Access fault logic + // 0. Unmapped local memory : Addr in dccm region but not in dccm offset OR Addr in picm region but not in picm offset OR DCCM -> PIC cross when DCCM/PIC in same region + // 1. Uncorrectable (double bit) ECC error + // 3. Address is not in a populated non-dccm region + // 5. Region predication access fault: Base Address in DCCM/PIC and Final address in non-DCCM/non-PIC region or vice versa + // 6. Ld/St access to picm are not word aligned or word size + assign regpred_access_fault_d = (start_addr_dccm_or_pic ^ base_reg_dccm_or_pic); // 5. Region predication access fault: Base Address in DCCM/PIC and Final address in non-DCCM/non-PIC region or vice versa + assign picm_access_fault_d = (addr_in_pic_d & ((start_addr_d[1:0] != 2'b0) | ~lsu_pkt_d.word)); // 6. Ld/St access to picm are not word aligned or word size + + if (pt.DCCM_REGION == pt.PIC_REGION) begin + assign unmapped_access_fault_d = ((start_addr_in_dccm_region_d & ~(start_addr_in_dccm_d | start_addr_in_pic_d)) | // 0. Addr in dccm/pic region but not in dccm/pic offset + (end_addr_in_dccm_region_d & ~(end_addr_in_dccm_d | end_addr_in_pic_d)) | // 0. Addr in dccm/pic region but not in dccm/pic offset + (start_addr_in_dccm_d & end_addr_in_pic_d) | // 0. DCCM -> PIC cross when DCCM/PIC in same region + (start_addr_in_pic_d & end_addr_in_dccm_d)); // 0. DCCM -> PIC cross when DCCM/PIC in same region + assign mpu_access_fault_d = (~start_addr_in_dccm_region_d & ~non_dccm_access_ok); // 3. Address is not in a populated non-dccm region + end else begin + assign unmapped_access_fault_d = ((start_addr_in_dccm_region_d & ~start_addr_in_dccm_d) | // 0. Addr in dccm region but not in dccm offset + (end_addr_in_dccm_region_d & ~end_addr_in_dccm_d) | // 0. Addr in dccm region but not in dccm offset + (start_addr_in_pic_region_d & ~start_addr_in_pic_d) | // 0. Addr in picm region but not in picm offset + (end_addr_in_pic_region_d & ~end_addr_in_pic_d)); // 0. Addr in picm region but not in picm offset + assign mpu_access_fault_d = (~start_addr_in_pic_region_d & ~start_addr_in_dccm_region_d & ~non_dccm_access_ok); // 3. Address is not in a populated non-dccm region + end + + assign access_fault_d = (unmapped_access_fault_d | mpu_access_fault_d | picm_access_fault_d | regpred_access_fault_d) & lsu_pkt_d.valid & ~lsu_pkt_d.dma; + assign access_fault_mscause_d[2:0] = unmapped_access_fault_d ? 3'h0 : mpu_access_fault_d ? 3'h3 : regpred_access_fault_d ? 3'h5 : picm_access_fault_d ? 3'h6 : 3'h7; + + // Misaligned happens due to 2 reasons + // 0. Region cross + // 1. sideeffects access which are not aligned + assign regcross_misaligned_fault_d = (start_addr_d[31:28] != end_addr_d[31:28]); + assign sideeffect_misaligned_fault_d = (is_sideeffects_d & ~is_aligned_d); + assign misaligned_fault_d = (regcross_misaligned_fault_d | (sideeffect_misaligned_fault_d & addr_external_d)) & lsu_pkt_d.valid & ~lsu_pkt_d.dma; + assign misaligned_fault_mscause_d = regcross_misaligned_fault_d ? 1'b0 : 1'b1; + + assign exc_mscause_d[2:0] = misaligned_fault_d ? {2'b0,misaligned_fault_mscause_d} : access_fault_mscause_d[2:0]; + + // Fast interrupt error logic + assign fir_dccm_access_error_d = ((start_addr_in_dccm_region_d & ~start_addr_in_dccm_d) | + (end_addr_in_dccm_region_d & ~end_addr_in_dccm_d)) & lsu_pkt_d.valid & lsu_pkt_d.fast_int; + assign fir_nondccm_access_error_d = ~(start_addr_in_dccm_region_d & end_addr_in_dccm_region_d) & lsu_pkt_d.valid & lsu_pkt_d.fast_int; + + rvdff #(.WIDTH(1)) is_sideeffects_mff (.din(is_sideeffects_d), .dout(is_sideeffects_m), .clk(lsu_c2_m_clk), .*); + +endmodule // el2_lsu_addrcheck diff --git a/design/lsu/el2_lsu_bus_buffer.sv b/design/lsu/el2_lsu_bus_buffer.sv new file mode 100644 index 0000000..33f6379 --- /dev/null +++ b/design/lsu/el2_lsu_bus_buffer.sv @@ -0,0 +1,946 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright 2020 Western Digital Corporation or it's affiliates. +// +// 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. + +//******************************************************************************** +// $Id$ +// +// +// Owner: +// Function: lsu interface with interface queue +// Comments: +// +//******************************************************************************** + +module el2_lsu_bus_buffer +import el2_pkg::*; +#( +`include "el2_param.vh" + )( + input logic clk, + input logic rst_l, + input logic scan_mode, + input logic dec_tlu_external_ldfwd_disable, // disable load to load forwarding for externals + input logic dec_tlu_wb_coalescing_disable, // disable write buffer coalescing + input logic dec_tlu_sideeffect_posted_disable, // Don't block the sideeffect load store to the bus + input logic dec_tlu_force_halt, + + // various clocks needed for the bus reads and writes + input logic lsu_c2_r_clk, + input logic lsu_bus_ibuf_c1_clk, + input logic lsu_bus_obuf_c1_clk, + input logic lsu_bus_buf_c1_clk, + input logic lsu_free_c2_clk, + input logic lsu_busm_clk, + + + input logic dec_lsu_valid_raw_d, // Raw valid for address computation + input el2_lsu_pkt_t lsu_pkt_m, // lsu packet flowing down the pipe + input el2_lsu_pkt_t lsu_pkt_r, // lsu packet flowing down the pipe + + input logic [31:0] lsu_addr_m, // lsu address flowing down the pipe + input logic [31:0] end_addr_m, // lsu address flowing down the pipe + input logic [31:0] lsu_addr_r, // lsu address flowing down the pipe + input logic [31:0] end_addr_r, // lsu address flowing down the pipe + input logic [31:0] store_data_r, // store data flowing down the pipe + + input logic no_word_merge_r, // r store doesn't need to wait in ibuf since it will not coalesce + input logic no_dword_merge_r, // r store doesn't need to wait in ibuf since it will not coalesce + input logic lsu_busreq_m, // bus request is in m + output logic lsu_busreq_r, // bus request is in r + input logic ld_full_hit_m, // load can get all its byte from a write buffer entry + input logic flush_m_up, // flush + input logic flush_r, // flush + input logic lsu_commit_r, // lsu instruction in r commits + input logic is_sideeffects_r, // lsu attribute is side_effects + input logic ldst_dual_d, // load/store is unaligned at 32 bit boundary + input logic ldst_dual_m, // load/store is unaligned at 32 bit boundary + input logic ldst_dual_r, // load/store is unaligned at 32 bit boundary + + input logic [7:0] ldst_byteen_ext_m, + + output logic lsu_bus_buffer_pend_any, // bus buffer has a pending bus entry + output logic lsu_bus_buffer_full_any, // bus buffer is full + output logic lsu_bus_buffer_empty_any, // bus buffer is empty + output logic lsu_bus_idle_any, // No pending responses from the bus + + output logic [3:0] ld_byte_hit_buf_lo, ld_byte_hit_buf_hi, // Byte enables for forwarding data + output logic [31:0] ld_fwddata_buf_lo, ld_fwddata_buf_hi, // load forwarding data + + output logic lsu_imprecise_error_load_any, // imprecise load bus error + output logic lsu_imprecise_error_store_any, // imprecise store bus error + output logic [31:0] lsu_imprecise_error_addr_any, // address of the imprecise error + + // Non-blocking loads + output logic lsu_nonblock_load_valid_m, // there is an external load -> put in the cam + output logic [pt.LSU_NUM_NBLOAD_WIDTH-1:0] lsu_nonblock_load_tag_m, // the tag of the external non block load + output logic lsu_nonblock_load_inv_r, // invalidate signal for the cam entry for non block loads + output logic [pt.LSU_NUM_NBLOAD_WIDTH-1:0] lsu_nonblock_load_inv_tag_r, // tag of the enrty which needs to be invalidated + output logic lsu_nonblock_load_data_valid, // the non block is valid - sending information back to the cam + output logic lsu_nonblock_load_data_error, // non block load has an error + output logic [pt.LSU_NUM_NBLOAD_WIDTH-1:0] lsu_nonblock_load_data_tag, // the tag of the non block load sending the data/error + output logic [31:0] lsu_nonblock_load_data, // Data of the non block load + + + // PMU events + output logic lsu_pmu_bus_trxn, + output logic lsu_pmu_bus_misaligned, + output logic lsu_pmu_bus_error, + output logic lsu_pmu_bus_busy, + + // AXI Write Channels + output logic lsu_axi_awvalid, + input logic lsu_axi_awready, + output logic [pt.LSU_BUS_TAG-1:0] lsu_axi_awid, + output logic [31:0] lsu_axi_awaddr, + output logic [3:0] lsu_axi_awregion, + output logic [7:0] lsu_axi_awlen, + output logic [2:0] lsu_axi_awsize, + output logic [1:0] lsu_axi_awburst, + output logic lsu_axi_awlock, + output logic [3:0] lsu_axi_awcache, + output logic [2:0] lsu_axi_awprot, + output logic [3:0] lsu_axi_awqos, + + output logic lsu_axi_wvalid, + input logic lsu_axi_wready, + output logic [63:0] lsu_axi_wdata, + output logic [7:0] lsu_axi_wstrb, + output logic lsu_axi_wlast, + + input logic lsu_axi_bvalid, + output logic lsu_axi_bready, + input logic [1:0] lsu_axi_bresp, + input logic [pt.LSU_BUS_TAG-1:0] lsu_axi_bid, + + // AXI Read Channels + output logic lsu_axi_arvalid, + input logic lsu_axi_arready, + output logic [pt.LSU_BUS_TAG-1:0] lsu_axi_arid, + output logic [31:0] lsu_axi_araddr, + output logic [3:0] lsu_axi_arregion, + output logic [7:0] lsu_axi_arlen, + output logic [2:0] lsu_axi_arsize, + output logic [1:0] lsu_axi_arburst, + output logic lsu_axi_arlock, + output logic [3:0] lsu_axi_arcache, + output logic [2:0] lsu_axi_arprot, + output logic [3:0] lsu_axi_arqos, + + input logic lsu_axi_rvalid, + output logic lsu_axi_rready, + input logic [pt.LSU_BUS_TAG-1:0] lsu_axi_rid, + input logic [63:0] lsu_axi_rdata, + input logic [1:0] lsu_axi_rresp, + + input logic lsu_bus_clk_en, + input logic lsu_bus_clk_en_q + +); + + + // For Ld: IDLE -> WAIT -> CMD -> RESP -> DONE_PARTIAL(?) -> DONE_WAIT(?) -> DONE -> IDLE + // For St: IDLE -> WAIT -> CMD -> RESP(?) -> IDLE + typedef enum logic [2:0] {IDLE=3'b000, WAIT=3'b001, CMD=3'b010, RESP=3'b011, DONE_PARTIAL=3'b100, DONE_WAIT=3'b101, DONE=3'b110} state_t; + + localparam DEPTH = pt.LSU_NUM_NBLOAD; + localparam DEPTH_LOG2 = pt.LSU_NUM_NBLOAD_WIDTH; + localparam TIMER = 8; // This can be only power of 2 + localparam TIMER_MAX = TIMER - 1; // Maximum value of timer + localparam TIMER_LOG2 = (TIMER < 2) ? 1 : $clog2(TIMER); + + logic [3:0] ldst_byteen_hi_m, ldst_byteen_lo_m; + logic [DEPTH-1:0] ld_addr_hitvec_lo, ld_addr_hitvec_hi; + logic [3:0][DEPTH-1:0] ld_byte_hitvec_lo, ld_byte_hitvec_hi; + logic [3:0][DEPTH-1:0] ld_byte_hitvecfn_lo, ld_byte_hitvecfn_hi; + + logic ld_addr_ibuf_hit_lo, ld_addr_ibuf_hit_hi; + logic [3:0] ld_byte_ibuf_hit_lo, ld_byte_ibuf_hit_hi; + + logic [3:0] ldst_byteen_r; + logic [3:0] ldst_byteen_hi_r, ldst_byteen_lo_r; + logic [31:0] store_data_hi_r, store_data_lo_r; + logic is_aligned_r; // Aligned load/store + logic ldst_samedw_r; + + logic lsu_nonblock_load_valid_r; + logic [31:0] lsu_nonblock_load_data_hi, lsu_nonblock_load_data_lo, lsu_nonblock_data_unalgn; + logic [1:0] lsu_nonblock_addr_offset; + logic [1:0] lsu_nonblock_sz; + logic lsu_nonblock_unsign, lsu_nonblock_dual; + logic lsu_nonblock_load_data_ready; + + logic [DEPTH-1:0] CmdPtr0Dec, CmdPtr1Dec; + logic [DEPTH-1:0] RspPtrDec; + logic [DEPTH_LOG2-1:0] CmdPtr0, CmdPtr1; + logic [DEPTH_LOG2-1:0] RspPtr; + logic [DEPTH_LOG2-1:0] WrPtr0_m, WrPtr0_r; + logic [DEPTH_LOG2-1:0] WrPtr1_m, WrPtr1_r; + logic found_wrptr0, found_wrptr1, found_cmdptr0, found_cmdptr1; + logic [3:0] buf_numvld_any, buf_numvld_wrcmd_any, buf_numvld_cmd_any, buf_numvld_pend_any; + logic any_done_wait_state; + logic bus_sideeffect_pend; + logic [7:0] bus_pend_trxn, bus_pend_trxnQ, bus_pend_trxn_ns; + logic lsu_bus_cntr_overflow; + logic bus_coalescing_disable; + logic mdbhd_en; + + logic bus_addr_match_pending; + logic bus_cmd_sent, bus_cmd_ready; + logic bus_wcmd_sent, bus_wdata_sent; + logic bus_rsp_read, bus_rsp_write; + logic [pt.LSU_BUS_TAG-1:0] bus_rsp_read_tag, bus_rsp_write_tag; + logic bus_rsp_read_error, bus_rsp_write_error; + logic [63:0] bus_rsp_rdata; + + // Bus buffer signals + state_t [DEPTH-1:0] buf_state; + logic [DEPTH-1:0][1:0] buf_sz; + logic [DEPTH-1:0][31:0] buf_addr; + logic [DEPTH-1:0][3:0] buf_byteen; + logic [DEPTH-1:0] buf_sideeffect; + logic [DEPTH-1:0] buf_write; + logic [DEPTH-1:0] buf_unsign; + logic [DEPTH-1:0] buf_dual; + logic [DEPTH-1:0] buf_samedw; + logic [DEPTH-1:0] buf_nomerge; + logic [DEPTH-1:0] buf_dualhi; + logic [DEPTH-1:0][DEPTH_LOG2-1:0] buf_dualtag; + logic [DEPTH-1:0] buf_ldfwd; + logic [DEPTH-1:0][DEPTH_LOG2-1:0] buf_ldfwdtag; + //logic [DEPTH-1:0] buf_nb; + logic [DEPTH-1:0] buf_error; + logic [DEPTH-1:0][31:0] buf_data; + logic [DEPTH-1:0][DEPTH-1:0] buf_age, buf_age_younger; + logic [DEPTH-1:0][DEPTH-1:0] buf_rspage, buf_rsp_pickage; + + state_t [DEPTH-1:0] buf_nxtstate; + logic [DEPTH-1:0] buf_rst; + logic [DEPTH-1:0] buf_state_en; + logic [DEPTH-1:0] buf_cmd_state_bus_en; + logic [DEPTH-1:0] buf_resp_state_bus_en; + logic [DEPTH-1:0] buf_state_bus_en; + logic [DEPTH-1:0] buf_dual_in; + logic [DEPTH-1:0] buf_samedw_in; + logic [DEPTH-1:0] buf_nomerge_in; + //logic [DEPTH-1:0] buf_nb_in; + logic [DEPTH-1:0] buf_sideeffect_in; + logic [DEPTH-1:0] buf_unsign_in; + logic [DEPTH-1:0][1:0] buf_sz_in; + logic [DEPTH-1:0] buf_write_in; + logic [DEPTH-1:0] buf_wr_en; + logic [DEPTH-1:0] buf_dualhi_in; + logic [DEPTH-1:0][DEPTH_LOG2-1:0] buf_dualtag_in; + logic [DEPTH-1:0] buf_ldfwd_en; + logic [DEPTH-1:0] buf_ldfwd_in; + logic [DEPTH-1:0][DEPTH_LOG2-1:0] buf_ldfwdtag_in; + logic [DEPTH-1:0][3:0] buf_byteen_in; + logic [DEPTH-1:0][31:0] buf_addr_in; + logic [DEPTH-1:0][31:0] buf_data_in; + logic [DEPTH-1:0] buf_error_en; + logic [DEPTH-1:0] buf_data_en; + logic [DEPTH-1:0][DEPTH-1:0] buf_age_in; + logic [DEPTH-1:0][DEPTH-1:0] buf_ageQ; + logic [DEPTH-1:0][DEPTH-1:0] buf_rspage_set; + logic [DEPTH-1:0][DEPTH-1:0] buf_rspage_in; + logic [DEPTH-1:0][DEPTH-1:0] buf_rspageQ; + + // Input buffer signals + logic ibuf_valid; + logic ibuf_dual; + logic ibuf_samedw; + logic ibuf_nomerge; + logic [DEPTH_LOG2-1:0] ibuf_tag; + logic [DEPTH_LOG2-1:0] ibuf_dualtag; + //logic ibuf_nb; + logic ibuf_sideeffect; + logic ibuf_unsign; + logic ibuf_write; + logic [1:0] ibuf_sz; + logic [3:0] ibuf_byteen; + logic [31:0] ibuf_addr; + logic [31:0] ibuf_data; + logic [TIMER_LOG2-1:0] ibuf_timer; + + logic ibuf_byp; + logic ibuf_wr_en; + logic ibuf_rst; + logic ibuf_force_drain; + logic ibuf_drain_vld; + logic [DEPTH-1:0] ibuf_drainvec_vld; + logic [DEPTH_LOG2-1:0] ibuf_tag_in; + logic [DEPTH_LOG2-1:0] ibuf_dualtag_in; + logic [1:0] ibuf_sz_in; + logic [31:0] ibuf_addr_in; + logic [3:0] ibuf_byteen_in; + logic [31:0] ibuf_data_in; + logic [TIMER_LOG2-1:0] ibuf_timer_in; + logic [3:0] ibuf_byteen_out; + logic [31:0] ibuf_data_out; + logic ibuf_merge_en, ibuf_merge_in; + + // Output buffer signals + logic obuf_valid; + logic obuf_write; + logic obuf_nosend; + logic obuf_rdrsp_pend; + logic obuf_sideeffect; + logic [31:0] obuf_addr; + logic [63:0] obuf_data; + logic [1:0] obuf_sz; + logic [7:0] obuf_byteen; + logic obuf_merge; + logic obuf_cmd_done, obuf_data_done; + logic [pt.LSU_BUS_TAG-1:0] obuf_tag0; + logic [pt.LSU_BUS_TAG-1:0] obuf_tag1; + logic [pt.LSU_BUS_TAG-1:0] obuf_rdrsp_tag; + + logic ibuf_buf_byp; + logic obuf_force_wr_en; + logic obuf_wr_wait; + logic obuf_wr_en, obuf_wr_enQ; + logic obuf_rst; + logic obuf_write_in; + logic obuf_nosend_in; + logic obuf_rdrsp_pend_in; + logic obuf_sideeffect_in; + logic obuf_aligned_in; + logic [31:0] obuf_addr_in; + logic [63:0] obuf_data_in; + logic [1:0] obuf_sz_in; + logic [7:0] obuf_byteen_in; + logic obuf_merge_in; + logic obuf_cmd_done_in, obuf_data_done_in; + logic [pt.LSU_BUS_TAG-1:0] obuf_tag0_in; + logic [pt.LSU_BUS_TAG-1:0] obuf_tag1_in; + logic [pt.LSU_BUS_TAG-1:0] obuf_rdrsp_tag_in; + + logic obuf_merge_en; + logic [TIMER_LOG2-1:0] obuf_wr_timer, obuf_wr_timer_in; + logic [7:0] obuf_byteen0_in, obuf_byteen1_in; + logic [63:0] obuf_data0_in, obuf_data1_in; + + logic lsu_axi_awvalid_q, lsu_axi_awready_q; + logic lsu_axi_wvalid_q, lsu_axi_wready_q; + logic lsu_axi_arvalid_q, lsu_axi_arready_q; + logic lsu_axi_bvalid_q, lsu_axi_bready_q; + logic lsu_axi_rvalid_q, lsu_axi_rready_q; + logic [pt.LSU_BUS_TAG-1:0] lsu_axi_bid_q, lsu_axi_rid_q; + logic [1:0] lsu_axi_bresp_q, lsu_axi_rresp_q; + logic [DEPTH_LOG2-1:0] lsu_imprecise_error_store_tag; + logic [63:0] lsu_axi_rdata_q; + + //------------------------------------------------------------------------------ + // Load forwarding logic start + //------------------------------------------------------------------------------ + + // Function to do 8 to 3 bit encoding + function automatic logic [2:0] f_Enc8to3; + input logic [7:0] Dec_value; + + logic [2:0] Enc_value; + Enc_value[0] = Dec_value[1] | Dec_value[3] | Dec_value[5] | Dec_value[7]; + Enc_value[1] = Dec_value[2] | Dec_value[3] | Dec_value[6] | Dec_value[7]; + Enc_value[2] = Dec_value[4] | Dec_value[5] | Dec_value[6] | Dec_value[7]; + + return Enc_value[2:0]; + endfunction // f_Enc8to3 + + // Buffer hit logic for bus load forwarding + assign ldst_byteen_hi_m[3:0] = ldst_byteen_ext_m[7:4]; + assign ldst_byteen_lo_m[3:0] = ldst_byteen_ext_m[3:0]; + for (genvar i=0; i<32'(DEPTH); i++) begin + assign ld_addr_hitvec_lo[i] = (lsu_addr_m[31:2] == buf_addr[i][31:2]) & buf_write[i] & (buf_state[i] != IDLE) & lsu_busreq_m; + assign ld_addr_hitvec_hi[i] = (end_addr_m[31:2] == buf_addr[i][31:2]) & buf_write[i] & (buf_state[i] != IDLE) & lsu_busreq_m; + end + + for (genvar j=0; j<4; j++) begin + assign ld_byte_hit_buf_lo[j] = |(ld_byte_hitvecfn_lo[j]) | ld_byte_ibuf_hit_lo[j]; + assign ld_byte_hit_buf_hi[j] = |(ld_byte_hitvecfn_hi[j]) | ld_byte_ibuf_hit_hi[j]; + for (genvar i=0; i<32'(DEPTH); i++) begin + assign ld_byte_hitvec_lo[j][i] = ld_addr_hitvec_lo[i] & buf_byteen[i][j] & ldst_byteen_lo_m[j]; + assign ld_byte_hitvec_hi[j][i] = ld_addr_hitvec_hi[i] & buf_byteen[i][j] & ldst_byteen_hi_m[j]; + + assign ld_byte_hitvecfn_lo[j][i] = ld_byte_hitvec_lo[j][i] & ~(|(ld_byte_hitvec_lo[j] & buf_age_younger[i])) & ~ld_byte_ibuf_hit_lo[j]; // Kill the byte enable if younger entry exists or byte exists in ibuf + assign ld_byte_hitvecfn_hi[j][i] = ld_byte_hitvec_hi[j][i] & ~(|(ld_byte_hitvec_hi[j] & buf_age_younger[i])) & ~ld_byte_ibuf_hit_hi[j]; // Kill the byte enable if younger entry exists or byte exists in ibuf + end + end + + // Hit in the ibuf + assign ld_addr_ibuf_hit_lo = (lsu_addr_m[31:2] == ibuf_addr[31:2]) & ibuf_write & ibuf_valid & lsu_busreq_m; + assign ld_addr_ibuf_hit_hi = (end_addr_m[31:2] == ibuf_addr[31:2]) & ibuf_write & ibuf_valid & lsu_busreq_m; + + for (genvar i=0; i<4; i++) begin + assign ld_byte_ibuf_hit_lo[i] = ld_addr_ibuf_hit_lo & ibuf_byteen[i] & ldst_byteen_lo_m[i]; + assign ld_byte_ibuf_hit_hi[i] = ld_addr_ibuf_hit_hi & ibuf_byteen[i] & ldst_byteen_hi_m[i]; + end + + always_comb begin + ld_fwddata_buf_lo[31:0] = {{8{ld_byte_ibuf_hit_lo[3]}},{8{ld_byte_ibuf_hit_lo[2]}},{8{ld_byte_ibuf_hit_lo[1]}},{8{ld_byte_ibuf_hit_lo[0]}}} & ibuf_data[31:0]; + ld_fwddata_buf_hi[31:0] = {{8{ld_byte_ibuf_hit_hi[3]}},{8{ld_byte_ibuf_hit_hi[2]}},{8{ld_byte_ibuf_hit_hi[1]}},{8{ld_byte_ibuf_hit_hi[0]}}} & ibuf_data[31:0]; + for (int i=0; i<32'(DEPTH); i++) begin + ld_fwddata_buf_lo[7:0] |= {8{ld_byte_hitvecfn_lo[0][i]}} & buf_data[i][7:0]; + ld_fwddata_buf_lo[15:8] |= {8{ld_byte_hitvecfn_lo[1][i]}} & buf_data[i][15:8]; + ld_fwddata_buf_lo[23:16] |= {8{ld_byte_hitvecfn_lo[2][i]}} & buf_data[i][23:16]; + ld_fwddata_buf_lo[31:24] |= {8{ld_byte_hitvecfn_lo[3][i]}} & buf_data[i][31:24]; + + ld_fwddata_buf_hi[7:0] |= {8{ld_byte_hitvecfn_hi[0][i]}} & buf_data[i][7:0]; + ld_fwddata_buf_hi[15:8] |= {8{ld_byte_hitvecfn_hi[1][i]}} & buf_data[i][15:8]; + ld_fwddata_buf_hi[23:16] |= {8{ld_byte_hitvecfn_hi[2][i]}} & buf_data[i][23:16]; + ld_fwddata_buf_hi[31:24] |= {8{ld_byte_hitvecfn_hi[3][i]}} & buf_data[i][31:24]; + end + end + + //------------------------------------------------------------------------------ + // Load forwarding logic end + //------------------------------------------------------------------------------ + + assign bus_coalescing_disable = dec_tlu_wb_coalescing_disable | pt.BUILD_AHB_LITE; + + // Get the hi/lo byte enable + assign ldst_byteen_r[3:0] = ({4{lsu_pkt_r.by}} & 4'b0001) | + ({4{lsu_pkt_r.half}} & 4'b0011) | + ({4{lsu_pkt_r.word}} & 4'b1111); + + assign {ldst_byteen_hi_r[3:0], ldst_byteen_lo_r[3:0]} = {4'b0,ldst_byteen_r[3:0]} << lsu_addr_r[1:0]; + assign {store_data_hi_r[31:0], store_data_lo_r[31:0]} = {32'b0,store_data_r[31:0]} << 8*lsu_addr_r[1:0]; + assign ldst_samedw_r = (lsu_addr_r[3] == end_addr_r[3]); + assign is_aligned_r = (lsu_pkt_r.word & (lsu_addr_r[1:0] == 2'b0)) | + (lsu_pkt_r.half & (lsu_addr_r[0] == 1'b0)) | + lsu_pkt_r.by; + + //------------------------------------------------------------------------------ + // Input buffer logic starts here + //------------------------------------------------------------------------------ + + assign ibuf_byp = lsu_busreq_r & (lsu_pkt_r.load | no_word_merge_r) & ~ibuf_valid; + assign ibuf_wr_en = lsu_busreq_r & lsu_commit_r & ~ibuf_byp; + assign ibuf_rst = (ibuf_drain_vld & ~ibuf_wr_en) | dec_tlu_force_halt; + assign ibuf_force_drain = lsu_busreq_m & ~lsu_busreq_r & ibuf_valid & (lsu_pkt_m.load | (ibuf_addr[31:2] != lsu_addr_m[31:2])); // Move the ibuf to buf if there is a non-colaescable ld/st in m but nothing in r + assign ibuf_drain_vld = ibuf_valid & (((ibuf_wr_en | (ibuf_timer == TIMER_LOG2'(TIMER_MAX))) & ~(ibuf_merge_en & ibuf_merge_in)) | ibuf_byp | ibuf_force_drain | ibuf_sideeffect | ~ibuf_write | bus_coalescing_disable); + assign ibuf_tag_in[DEPTH_LOG2-1:0] = (ibuf_merge_en & ibuf_merge_in) ? ibuf_tag[DEPTH_LOG2-1:0] : (ldst_dual_r ? WrPtr1_r : WrPtr0_r); + assign ibuf_dualtag_in[DEPTH_LOG2-1:0] = WrPtr0_r; + assign ibuf_sz_in[1:0] = {lsu_pkt_r.word, lsu_pkt_r.half}; + assign ibuf_addr_in[31:0] = ldst_dual_r ? end_addr_r[31:0] : lsu_addr_r[31:0]; + assign ibuf_byteen_in[3:0] = (ibuf_merge_en & ibuf_merge_in) ? (ibuf_byteen[3:0] | ldst_byteen_lo_r[3:0]) : (ldst_dual_r ? ldst_byteen_hi_r[3:0] : ldst_byteen_lo_r[3:0]); + for (genvar i=0; i<4; i++) begin + assign ibuf_data_in[(8*i)+7:(8*i)] = (ibuf_merge_en & ibuf_merge_in) ? (ldst_byteen_lo_r[i] ? store_data_lo_r[(8*i)+7:(8*i)] : ibuf_data[(8*i)+7:(8*i)]) : + (ldst_dual_r ? store_data_hi_r[(8*i)+7:(8*i)] : store_data_lo_r[(8*i)+7:(8*i)]); + end + assign ibuf_timer_in = ibuf_wr_en ? '0 : (ibuf_timer < TIMER_LOG2'(TIMER_MAX)) ? (ibuf_timer + 1'b1) : ibuf_timer; + + + assign ibuf_merge_en = lsu_busreq_r & lsu_commit_r & lsu_pkt_r.store & ibuf_valid & ibuf_write & (lsu_addr_r[31:2] == ibuf_addr[31:2]) & ~is_sideeffects_r & ~bus_coalescing_disable; + assign ibuf_merge_in = ~ldst_dual_r; // If it's a unaligned store, merge needs to happen on the way out of ibuf + + // ibuf signals going to bus buffer after merging + for (genvar i=0; i<4; i++) begin + assign ibuf_byteen_out[i] = (ibuf_merge_en & ~ibuf_merge_in) ? (ibuf_byteen[i] | ldst_byteen_lo_r[i]) : ibuf_byteen[i]; + assign ibuf_data_out[(8*i)+7:(8*i)] = (ibuf_merge_en & ~ibuf_merge_in) ? (ldst_byteen_lo_r[i] ? store_data_lo_r[(8*i)+7:(8*i)] : ibuf_data[(8*i)+7:(8*i)]) : + ibuf_data[(8*i)+7:(8*i)]; + end + + rvdffsc #(.WIDTH(1)) ibuf_valid_ff (.din(1'b1), .dout(ibuf_valid), .en(ibuf_wr_en), .clear(ibuf_rst), .clk(lsu_free_c2_clk), .*); + rvdffs #(.WIDTH(DEPTH_LOG2)) ibuf_tagff (.din(ibuf_tag_in), .dout(ibuf_tag), .en(ibuf_wr_en), .clk(lsu_bus_ibuf_c1_clk), .*); + rvdffs #(.WIDTH(DEPTH_LOG2)) ibuf_dualtagff (.din(ibuf_dualtag_in), .dout(ibuf_dualtag), .en(ibuf_wr_en), .clk(lsu_bus_ibuf_c1_clk), .*); + rvdffs #(.WIDTH(1)) ibuf_dualff (.din(ldst_dual_r), .dout(ibuf_dual), .en(ibuf_wr_en), .clk(lsu_bus_ibuf_c1_clk), .*); + rvdffs #(.WIDTH(1)) ibuf_samedwff (.din(ldst_samedw_r), .dout(ibuf_samedw), .en(ibuf_wr_en), .clk(lsu_bus_ibuf_c1_clk), .*); + rvdffs #(.WIDTH(1)) ibuf_nomergeff (.din(no_dword_merge_r), .dout(ibuf_nomerge), .en(ibuf_wr_en), .clk(lsu_bus_ibuf_c1_clk), .*); + //rvdffs #(.WIDTH(1)) ibuf_nbff (.din(lsu_nonblock_load_valid_r), .dout(ibuf_nb), .en(ibuf_wr_en), .clk(lsu_bus_ibuf_c1_clk), .*); + rvdffs #(.WIDTH(1)) ibuf_sideeffectff (.din(is_sideeffects_r), .dout(ibuf_sideeffect), .en(ibuf_wr_en), .clk(lsu_bus_ibuf_c1_clk), .*); + rvdffs #(.WIDTH(1)) ibuf_unsignff (.din(lsu_pkt_r.unsign), .dout(ibuf_unsign), .en(ibuf_wr_en), .clk(lsu_bus_ibuf_c1_clk), .*); + rvdffs #(.WIDTH(1)) ibuf_writeff (.din(lsu_pkt_r.store), .dout(ibuf_write), .en(ibuf_wr_en), .clk(lsu_bus_ibuf_c1_clk), .*); + rvdffs #(.WIDTH(2)) ibuf_szff (.din(ibuf_sz_in[1:0]), .dout(ibuf_sz), .en(ibuf_wr_en), .clk(lsu_bus_ibuf_c1_clk), .*); + rvdffe #(.WIDTH(32)) ibuf_addrff (.din(ibuf_addr_in[31:0]), .dout(ibuf_addr), .en(ibuf_wr_en), .*); + rvdffs #(.WIDTH(4)) ibuf_byteenff (.din(ibuf_byteen_in[3:0]), .dout(ibuf_byteen), .en(ibuf_wr_en), .clk(lsu_bus_ibuf_c1_clk), .*); + rvdffe #(.WIDTH(32)) ibuf_dataff (.din(ibuf_data_in[31:0]), .dout(ibuf_data), .en(ibuf_wr_en), .*); + rvdff #(.WIDTH(TIMER_LOG2)) ibuf_timerff (.din(ibuf_timer_in), .dout(ibuf_timer), .clk(lsu_free_c2_clk), .*); + + + //------------------------------------------------------------------------------ + // Input buffer logic ends here + //------------------------------------------------------------------------------ + + + //------------------------------------------------------------------------------ + // Output buffer logic starts here + //------------------------------------------------------------------------------ + + assign obuf_wr_wait = (buf_numvld_wrcmd_any[3:0] == 4'b1) & (buf_numvld_cmd_any[3:0] == 4'b1) & (obuf_wr_timer != TIMER_LOG2'(TIMER_MAX)) & + ~bus_coalescing_disable & ~buf_nomerge[CmdPtr0] & ~buf_sideeffect[CmdPtr0] & ~obuf_force_wr_en; + assign obuf_wr_timer_in = obuf_wr_en ? 3'b0: (((buf_numvld_cmd_any > 4'b0) & (obuf_wr_timer < TIMER_LOG2'(TIMER_MAX))) ? (obuf_wr_timer + 1'b1) : obuf_wr_timer); + assign obuf_force_wr_en = lsu_busreq_m & ~lsu_busreq_r & ~ibuf_valid & (buf_numvld_cmd_any[3:0] == 4'b1) & (lsu_addr_m[31:2] != buf_addr[CmdPtr0][31:2]); // Entry in m can't merge with entry going to obuf and there is no entry in between + assign ibuf_buf_byp = ibuf_byp & (buf_numvld_pend_any[3:0] == 4'b0) & (~lsu_pkt_r.store | no_dword_merge_r); + + assign obuf_wr_en = ((ibuf_buf_byp & lsu_commit_r & ~(is_sideeffects_r & bus_sideeffect_pend)) | + ((buf_state[CmdPtr0] == CMD) & found_cmdptr0 & ~buf_cmd_state_bus_en[CmdPtr0] & ~(buf_sideeffect[CmdPtr0] & bus_sideeffect_pend) & + (~(buf_dual[CmdPtr0] & buf_samedw[CmdPtr0] & ~buf_write[CmdPtr0]) | found_cmdptr1 | buf_nomerge[CmdPtr0] | obuf_force_wr_en))) & + (bus_cmd_ready | ~obuf_valid | obuf_nosend) & ~obuf_wr_wait & ~lsu_bus_cntr_overflow & ~bus_addr_match_pending & lsu_bus_clk_en; + + assign obuf_rst = ((bus_cmd_sent | (obuf_valid & obuf_nosend)) & ~obuf_wr_en & lsu_bus_clk_en) | dec_tlu_force_halt; + + assign obuf_write_in = ibuf_buf_byp ? lsu_pkt_r.store : buf_write[CmdPtr0]; + assign obuf_sideeffect_in = ibuf_buf_byp ? is_sideeffects_r : buf_sideeffect[CmdPtr0]; + assign obuf_addr_in[31:0] = ibuf_buf_byp ? lsu_addr_r[31:0] : buf_addr[CmdPtr0]; + assign obuf_sz_in[1:0] = ibuf_buf_byp ? {lsu_pkt_r.word, lsu_pkt_r.half} : buf_sz[CmdPtr0]; + assign obuf_merge_in = obuf_merge_en; + assign obuf_tag0_in[pt.LSU_BUS_TAG-1:0] = ibuf_buf_byp ? (pt.LSU_BUS_TAG)'(WrPtr0_r) : (pt.LSU_BUS_TAG)'(CmdPtr0); + assign obuf_tag1_in[pt.LSU_BUS_TAG-1:0] = ibuf_buf_byp ? (pt.LSU_BUS_TAG)'(WrPtr1_r) : (pt.LSU_BUS_TAG)'(CmdPtr1); + + assign obuf_cmd_done_in = ~(obuf_wr_en | obuf_rst) & (obuf_cmd_done | bus_wcmd_sent); + assign obuf_data_done_in = ~(obuf_wr_en | obuf_rst) & (obuf_data_done | bus_wdata_sent); + + assign obuf_aligned_in = ibuf_buf_byp ? is_aligned_r : ((obuf_sz_in[1:0] == 2'b0) | + (obuf_sz_in[0] & ~obuf_addr_in[0]) | + (obuf_sz_in[1] & ~(|obuf_addr_in[1:0]))); + + assign obuf_rdrsp_pend_in = (~(obuf_wr_en & ~obuf_nosend_in) & obuf_rdrsp_pend & ~(bus_rsp_read & (bus_rsp_read_tag == obuf_rdrsp_tag))) | + ((bus_cmd_sent & ~obuf_write) & ~dec_tlu_force_halt) ; + assign obuf_rdrsp_tag_in[pt.LSU_BUS_TAG-1:0] = (bus_cmd_sent & ~obuf_write) ? obuf_tag0[pt.LSU_BUS_TAG-1:0] : obuf_rdrsp_tag[pt.LSU_BUS_TAG-1:0]; + // No ld to ld fwd for aligned & atomic64 + assign obuf_nosend_in = (obuf_addr_in[31:3] == obuf_addr[31:3]) & obuf_aligned_in & ~obuf_sideeffect & ~obuf_write & ~obuf_write_in & ~dec_tlu_external_ldfwd_disable & + ((obuf_valid & ~obuf_nosend) | (obuf_rdrsp_pend & ~(bus_rsp_read & (bus_rsp_read_tag == obuf_rdrsp_tag)))); + + assign obuf_byteen0_in[7:0] = ibuf_buf_byp ? (lsu_addr_r[2] ? {ldst_byteen_lo_r[3:0],4'b0} : {4'b0,ldst_byteen_lo_r[3:0]}) : + (buf_addr[CmdPtr0][2] ? {buf_byteen[CmdPtr0],4'b0} : {4'b0,buf_byteen[CmdPtr0]}); + assign obuf_byteen1_in[7:0] = ibuf_buf_byp ? (end_addr_r[2] ? {ldst_byteen_hi_r[3:0],4'b0} : {4'b0,ldst_byteen_hi_r[3:0]}) : + (buf_addr[CmdPtr1][2] ? {buf_byteen[CmdPtr1],4'b0} : {4'b0,buf_byteen[CmdPtr1]}); + assign obuf_data0_in[63:0] = ibuf_buf_byp ? (lsu_addr_r[2] ? {store_data_lo_r[31:0],32'b0} : {32'b0,store_data_lo_r[31:0]}) : + (buf_addr[CmdPtr0][2] ? {buf_data[CmdPtr0],32'b0} : {32'b0,buf_data[CmdPtr0]}); + assign obuf_data1_in[63:0] = ibuf_buf_byp ? (lsu_addr_r[2] ? {store_data_hi_r[31:0],32'b0} :{32'b0,store_data_hi_r[31:0]}) : + (buf_addr[CmdPtr1][2] ? {buf_data[CmdPtr1],32'b0} : {32'b0,buf_data[CmdPtr1]}); + + for (genvar i=0 ;i<8; i++) begin + assign obuf_byteen_in[i] = obuf_byteen0_in[i] | (obuf_merge_en & obuf_byteen1_in[i]); + assign obuf_data_in[(8*i)+7:(8*i)] = (obuf_merge_en & obuf_byteen1_in[i]) ? obuf_data1_in[(8*i)+7:(8*i)] : obuf_data0_in[(8*i)+7:(8*i)]; + end + + // No store obuf merging for AXI since all stores are sent non-posted. Can't track the second id right now + assign obuf_merge_en = ((CmdPtr0 != CmdPtr1) & found_cmdptr0 & found_cmdptr1 & (buf_state[CmdPtr0] == CMD) & (buf_state[CmdPtr1] == CMD) & + ~buf_cmd_state_bus_en[CmdPtr0] & ~buf_sideeffect[CmdPtr0] & + ((buf_write[CmdPtr0] & buf_write[CmdPtr1] & (buf_addr[CmdPtr0][31:3] == buf_addr[CmdPtr1][31:3]) & ~bus_coalescing_disable & ~pt.BUILD_AXI_NATIVE) | + (~buf_write[CmdPtr0] & buf_dual[CmdPtr0] & ~buf_dualhi[CmdPtr0] & buf_samedw[CmdPtr0]))) | // CmdPtr0/CmdPtr1 are for same load which is within a DW + (ibuf_buf_byp & ldst_samedw_r & ldst_dual_r); + + + rvdff #(.WIDTH(1)) obuf_wren_ff (.din(obuf_wr_en), .dout(obuf_wr_enQ), .clk(lsu_busm_clk), .*); + rvdffsc #(.WIDTH(1)) obuf_valid_ff (.din(1'b1), .dout(obuf_valid), .en(obuf_wr_en), .clear(obuf_rst), .clk(lsu_free_c2_clk), .*); + rvdffs #(.WIDTH(1)) obuf_nosend_ff (.din(obuf_nosend_in), .dout(obuf_nosend), .en(obuf_wr_en), .clk(lsu_free_c2_clk), .*); + rvdff #(.WIDTH(1)) obuf_cmd_done_ff (.din(obuf_cmd_done_in), .dout(obuf_cmd_done), .clk(lsu_busm_clk), .*); + rvdff #(.WIDTH(1)) obuf_data_done_ff (.din(obuf_data_done_in), .dout(obuf_data_done), .clk(lsu_busm_clk), .*); + rvdff #(.WIDTH(1)) obuf_rdrsp_pend_ff(.din(obuf_rdrsp_pend_in), .dout(obuf_rdrsp_pend), .clk(lsu_busm_clk), .*); + rvdff #(.WIDTH(pt.LSU_BUS_TAG)) obuf_rdrsp_tagff (.din(obuf_rdrsp_tag_in), .dout(obuf_rdrsp_tag), .clk(lsu_busm_clk), .*); + rvdffs #(.WIDTH(pt.LSU_BUS_TAG)) obuf_tag0ff (.din(obuf_tag0_in), .dout(obuf_tag0), .en(obuf_wr_en), .clk(lsu_bus_obuf_c1_clk), .*); + rvdffs #(.WIDTH(pt.LSU_BUS_TAG)) obuf_tag1ff (.din(obuf_tag1_in), .dout(obuf_tag1), .en(obuf_wr_en), .clk(lsu_bus_obuf_c1_clk), .*); + rvdffs #(.WIDTH(1)) obuf_mergeff (.din(obuf_merge_in), .dout(obuf_merge), .en(obuf_wr_en), .clk(lsu_bus_obuf_c1_clk), .*); + rvdffs #(.WIDTH(1)) obuf_writeff (.din(obuf_write_in), .dout(obuf_write), .en(obuf_wr_en), .clk(lsu_bus_obuf_c1_clk), .*); + rvdffs #(.WIDTH(1)) obuf_sideeffectff (.din(obuf_sideeffect_in), .dout(obuf_sideeffect), .en(obuf_wr_en), .clk(lsu_bus_obuf_c1_clk), .*); + rvdffs #(.WIDTH(2)) obuf_szff (.din(obuf_sz_in[1:0]), .dout(obuf_sz), .en(obuf_wr_en), .clk(lsu_bus_obuf_c1_clk), .*); + rvdffe #(.WIDTH(32)) obuf_addrff (.din(obuf_addr_in[31:0]), .dout(obuf_addr), .en(obuf_wr_en), .*); + rvdffs #(.WIDTH(8)) obuf_byteenff (.din(obuf_byteen_in[7:0]), .dout(obuf_byteen), .en(obuf_wr_en), .clk(lsu_bus_obuf_c1_clk), .*); + rvdffe #(.WIDTH(64)) obuf_dataff (.din(obuf_data_in[63:0]), .dout(obuf_data), .en(obuf_wr_en), .*); + rvdff #(.WIDTH(TIMER_LOG2)) obuf_timerff (.din(obuf_wr_timer_in), .dout(obuf_wr_timer), .clk(lsu_busm_clk), .*); + + + //------------------------------------------------------------------------------ + // Output buffer logic ends here + //------------------------------------------------------------------------------ + + // Find the entry to allocate and entry to send + always_comb begin + WrPtr0_m[DEPTH_LOG2-1:0] = '0; + WrPtr1_m[DEPTH_LOG2-1:0] = '0; + found_wrptr0 = '0; + found_wrptr1 = '0; + + // Find first write pointer + for (int i=0; i<32'(DEPTH); i++) begin + if (~found_wrptr0) begin + WrPtr0_m[DEPTH_LOG2-1:0] = DEPTH_LOG2'(i); + found_wrptr0 = (buf_state[i] == IDLE) & ~((ibuf_valid & (32'(ibuf_tag) == i)) | + (lsu_busreq_r & ((32'(WrPtr0_r) == i) | (ldst_dual_r & (32'(WrPtr1_r) == i))))); + end + end + + // Find second write pointer + for (int i=0; i<32'(DEPTH); i++) begin + if (~found_wrptr1) begin + WrPtr1_m[DEPTH_LOG2-1:0] = DEPTH_LOG2'(i); + found_wrptr1 = (buf_state[i] == IDLE) & ~((ibuf_valid & (32'(ibuf_tag) == i)) | + (lsu_busreq_m & (32'(WrPtr0_m) == i)) | + (lsu_busreq_r & ((32'(WrPtr0_r) == i) | (ldst_dual_r & (32'(WrPtr1_r) == i))))); + end + end + end + + // Get the command ptr + for (genvar i=0; i<32'(DEPTH); i++) begin + // These should be one-hot + assign CmdPtr0Dec[i] = ~(|buf_age[i]) & (buf_state[i] == CMD) & ~buf_cmd_state_bus_en[i]; + assign CmdPtr1Dec[i] = ~(|(buf_age[i] & ~CmdPtr0Dec)) & ~CmdPtr0Dec[i] & (buf_state[i] == CMD) & ~buf_cmd_state_bus_en[i]; + assign RspPtrDec[i] = ~(|buf_rsp_pickage[i]) & (buf_state[i] == DONE_WAIT); + end + + assign found_cmdptr0 = |CmdPtr0Dec; + assign found_cmdptr1 = |CmdPtr1Dec; + + assign CmdPtr0 = f_Enc8to3(8'(CmdPtr0Dec[DEPTH-1:0])); + assign CmdPtr1 = f_Enc8to3(8'(CmdPtr1Dec[DEPTH-1:0])); + assign RspPtr = f_Enc8to3(8'(RspPtrDec[DEPTH-1:0])); + + // Age vector + for (genvar i=0; i<32'(DEPTH); i++) begin: GenAgeVec + for (genvar j=0; j<32'(DEPTH); j++) begin + assign buf_age_in[i][j] = (((buf_state[i] == IDLE) & buf_state_en[i]) & + (((buf_state[j] == WAIT) | ((buf_state[j] == CMD) & ~buf_cmd_state_bus_en[j])) | // Set age bit for older entries + (ibuf_drain_vld & lsu_busreq_r & (ibuf_byp | ldst_dual_r) & (i == WrPtr0_r) & (j == ibuf_tag)) | // Set case for dual lo + (ibuf_byp & lsu_busreq_r & ldst_dual_r & (i == WrPtr1_r) & (j == WrPtr0_r)))) | // ibuf bypass case + buf_age[i][j]; + + + assign buf_age[i][j] = buf_ageQ[i][j] & ~((buf_state[j] == CMD) & buf_cmd_state_bus_en[j]); // Reset case + + assign buf_age_younger[i][j] = (i == j) ? 1'b0: (~buf_age[i][j] & (buf_state[j] != IDLE)); // Younger entries + end + end + + // Age vector for responses + for (genvar i=0; i= (DEPTH-1)) : (buf_numvld_any[3:0] == 4'(DEPTH)); + assign lsu_bus_buffer_empty_any = ~(|buf_state[DEPTH-1:0]) & ~ibuf_valid & ~obuf_valid; + + + // Non blocking ports + assign lsu_nonblock_load_valid_m = lsu_busreq_m & lsu_pkt_m.valid & lsu_pkt_m.load & ~flush_m_up & ~ld_full_hit_m; + assign lsu_nonblock_load_tag_m[DEPTH_LOG2-1:0] = WrPtr0_m[DEPTH_LOG2-1:0]; + assign lsu_nonblock_load_inv_r = lsu_nonblock_load_valid_r & ~lsu_commit_r; + assign lsu_nonblock_load_inv_tag_r[DEPTH_LOG2-1:0] = WrPtr0_r[DEPTH_LOG2-1:0]; // r tag needs to be accurate even if there is no invalidate + + always_comb begin + lsu_nonblock_load_data_ready = '0; + lsu_nonblock_load_data_error = '0; + lsu_nonblock_load_data_tag[DEPTH_LOG2-1:0] = '0; + lsu_nonblock_load_data_lo[31:0] = '0; + lsu_nonblock_load_data_hi[31:0] = '0; + for (int i=0; i<32'(DEPTH); i++) begin + // Use buf_rst[i] instead of buf_state_en[i] for timing + lsu_nonblock_load_data_ready |= (buf_state[i] == DONE) & ~(pt.BUILD_AXI_NATIVE & buf_write[i]); + lsu_nonblock_load_data_error |= (buf_state[i] == DONE) & buf_error[i] & ~buf_write[i]; + lsu_nonblock_load_data_tag[DEPTH_LOG2-1:0] |= DEPTH_LOG2'(i) & {DEPTH_LOG2{((buf_state[i] == DONE) & ~buf_write[i] & (~buf_dual[i] | ~buf_dualhi[i]))}}; + lsu_nonblock_load_data_lo[31:0] |= buf_data[i][31:0] & {32{((buf_state[i] == DONE) & ~buf_write[i] & (~buf_dual[i] | ~buf_dualhi[i]))}}; + lsu_nonblock_load_data_hi[31:0] |= buf_data[i][31:0] & {32{((buf_state[i] == DONE) & ~buf_write[i] & (buf_dual[i] & buf_dualhi[i]))}}; + end + end + + assign lsu_nonblock_addr_offset[1:0] = buf_addr[lsu_nonblock_load_data_tag][1:0]; + assign lsu_nonblock_sz[1:0] = buf_sz[lsu_nonblock_load_data_tag][1:0]; + assign lsu_nonblock_unsign = buf_unsign[lsu_nonblock_load_data_tag]; + assign lsu_nonblock_dual = buf_dual[lsu_nonblock_load_data_tag]; + assign lsu_nonblock_data_unalgn[31:0] = 32'({lsu_nonblock_load_data_hi[31:0], lsu_nonblock_load_data_lo[31:0]} >> 8*lsu_nonblock_addr_offset[1:0]); + + assign lsu_nonblock_load_data_valid = lsu_nonblock_load_data_ready & ~lsu_nonblock_load_data_error; + assign lsu_nonblock_load_data[31:0] = ({32{ lsu_nonblock_unsign & (lsu_nonblock_sz[1:0] == 2'b00)}} & {24'b0,lsu_nonblock_data_unalgn[7:0]}) | + ({32{ lsu_nonblock_unsign & (lsu_nonblock_sz[1:0] == 2'b01)}} & {16'b0,lsu_nonblock_data_unalgn[15:0]}) | + ({32{~lsu_nonblock_unsign & (lsu_nonblock_sz[1:0] == 2'b00)}} & {{24{lsu_nonblock_data_unalgn[7]}}, lsu_nonblock_data_unalgn[7:0]}) | + ({32{~lsu_nonblock_unsign & (lsu_nonblock_sz[1:0] == 2'b01)}} & {{16{lsu_nonblock_data_unalgn[15]}},lsu_nonblock_data_unalgn[15:0]}) | + ({32{(lsu_nonblock_sz[1:0] == 2'b10)}} & lsu_nonblock_data_unalgn[31:0]); + + // Determine if there is a pending return to sideeffect load/store + always_comb begin + bus_sideeffect_pend = obuf_valid & obuf_sideeffect & dec_tlu_sideeffect_posted_disable; + for (int i=0; i<32'(DEPTH); i++) begin + bus_sideeffect_pend |= ((buf_state[i] == RESP) & buf_sideeffect[i] & dec_tlu_sideeffect_posted_disable); + end + end + + // We have no ordering rules for AXI. Need to check outstanding trxns to same address for AXI + always_comb begin + bus_addr_match_pending = '0; + for (int i=0; i<32'(DEPTH); i++) begin + bus_addr_match_pending |= (pt.BUILD_AXI_NATIVE & obuf_valid & (obuf_addr[31:3] == buf_addr[i][31:3]) & (buf_state[i] == RESP) & ~((obuf_tag0 == (pt.LSU_BUS_TAG)'(i)) | (obuf_merge & (obuf_tag1 == (pt.LSU_BUS_TAG)'(i))))); + end + end + + // Generic bus signals + assign bus_cmd_ready = obuf_write ? ((obuf_cmd_done | obuf_data_done) ? (obuf_cmd_done ? lsu_axi_wready : lsu_axi_awready) : (lsu_axi_awready & lsu_axi_wready)) : lsu_axi_arready; + assign bus_wcmd_sent = lsu_axi_awvalid & lsu_axi_awready; + assign bus_wdata_sent = lsu_axi_wvalid & lsu_axi_wready; + assign bus_cmd_sent = ((obuf_cmd_done | bus_wcmd_sent) & (obuf_data_done | bus_wdata_sent)) | (lsu_axi_arvalid & lsu_axi_arready); + + assign bus_rsp_read = lsu_axi_rvalid & lsu_axi_rready; + assign bus_rsp_write = lsu_axi_bvalid & lsu_axi_bready; + assign bus_rsp_read_tag[pt.LSU_BUS_TAG-1:0] = lsu_axi_rid[pt.LSU_BUS_TAG-1:0]; + assign bus_rsp_write_tag[pt.LSU_BUS_TAG-1:0] = lsu_axi_bid[pt.LSU_BUS_TAG-1:0]; + assign bus_rsp_write_error = bus_rsp_write & (lsu_axi_bresp[1:0] != 2'b0); + assign bus_rsp_read_error = bus_rsp_read & (lsu_axi_rresp[1:0] != 2'b0); + assign bus_rsp_rdata[63:0] = lsu_axi_rdata[63:0]; + + // AXI command signals + assign lsu_axi_awvalid = obuf_valid & obuf_write & ~obuf_cmd_done & ~bus_addr_match_pending; + assign lsu_axi_awid[pt.LSU_BUS_TAG-1:0] = (pt.LSU_BUS_TAG)'(obuf_tag0); + assign lsu_axi_awaddr[31:0] = obuf_sideeffect ? obuf_addr[31:0] : {obuf_addr[31:3],3'b0}; + assign lsu_axi_awsize[2:0] = obuf_sideeffect ? {1'b0, obuf_sz[1:0]} : 3'b011; + assign lsu_axi_awprot[2:0] = '0; + assign lsu_axi_awcache[3:0] = obuf_sideeffect ? 4'b0 : 4'b1111; + assign lsu_axi_awregion[3:0] = obuf_addr[31:28]; + assign lsu_axi_awlen[7:0] = '0; + assign lsu_axi_awburst[1:0] = 2'b01; + assign lsu_axi_awqos[3:0] = '0; + assign lsu_axi_awlock = '0; + + assign lsu_axi_wvalid = obuf_valid & obuf_write & ~obuf_data_done & ~bus_addr_match_pending; + assign lsu_axi_wstrb[7:0] = obuf_byteen[7:0] & {8{obuf_write}}; + assign lsu_axi_wdata[63:0] = obuf_data[63:0]; + assign lsu_axi_wlast = '1; + + assign lsu_axi_arvalid = obuf_valid & ~obuf_write & ~obuf_nosend & ~bus_addr_match_pending; + assign lsu_axi_arid[pt.LSU_BUS_TAG-1:0] = (pt.LSU_BUS_TAG)'(obuf_tag0); + assign lsu_axi_araddr[31:0] = obuf_sideeffect ? obuf_addr[31:0] : {obuf_addr[31:3],3'b0}; + assign lsu_axi_arsize[2:0] = obuf_sideeffect ? {1'b0, obuf_sz[1:0]} : 3'b011; + assign lsu_axi_arprot[2:0] = '0; + assign lsu_axi_arcache[3:0] = obuf_sideeffect ? 4'b0 : 4'b1111; + assign lsu_axi_arregion[3:0] = obuf_addr[31:28]; + assign lsu_axi_arlen[7:0] = '0; + assign lsu_axi_arburst[1:0] = 2'b01; + assign lsu_axi_arqos[3:0] = '0; + assign lsu_axi_arlock = '0; + + assign lsu_axi_bready = 1; + assign lsu_axi_rready = 1; + + always_comb begin + lsu_imprecise_error_store_any = '0; + lsu_imprecise_error_store_tag = '0; + for (int i=0; i<32'(DEPTH); i++) begin + lsu_imprecise_error_store_any |= lsu_bus_clk_en_q & (buf_state[i] == DONE) & buf_error[i] & buf_write[i]; + lsu_imprecise_error_store_tag |= DEPTH_LOG2'(i) & {DEPTH_LOG2{((buf_state[i] == DONE) & buf_error[i] & buf_write[i])}}; + end + end + assign lsu_imprecise_error_load_any = lsu_nonblock_load_data_error & ~lsu_imprecise_error_store_any; // This is to make sure we send only one imprecise error for load/store + assign lsu_imprecise_error_addr_any[31:0] = lsu_imprecise_error_store_any ? buf_addr[lsu_imprecise_error_store_tag] : buf_addr[lsu_nonblock_load_data_tag]; + + // Count the number of pending trxns for fence (doesn't apply to AXI) + assign bus_pend_trxnQ[7:0] = 8'b0; + assign bus_pend_trxn[7:0] = 8'b0; + assign bus_pend_trxn_ns[7:0] = 8'b0; + assign lsu_bus_cntr_overflow = 1'b0; + assign lsu_bus_idle_any = 1'b1; + + // PMU signals + assign lsu_pmu_bus_trxn = (lsu_axi_awvalid & lsu_axi_awready) | (lsu_axi_wvalid & lsu_axi_wready) | (lsu_axi_arvalid & lsu_axi_arready); + assign lsu_pmu_bus_misaligned = lsu_busreq_r & ldst_dual_r & lsu_commit_r; + assign lsu_pmu_bus_error = lsu_imprecise_error_load_any | lsu_imprecise_error_store_any; + assign lsu_pmu_bus_busy = (lsu_axi_awvalid & ~lsu_axi_awready) | (lsu_axi_wvalid & ~lsu_axi_wready) | (lsu_axi_arvalid & ~lsu_axi_arready); + + rvdff #(.WIDTH(1)) lsu_axi_awvalid_ff (.din(lsu_axi_awvalid), .dout(lsu_axi_awvalid_q), .clk(lsu_busm_clk), .*); + rvdff #(.WIDTH(1)) lsu_axi_awready_ff (.din(lsu_axi_awready), .dout(lsu_axi_awready_q), .clk(lsu_busm_clk), .*); + rvdff #(.WIDTH(1)) lsu_axi_wvalid_ff (.din(lsu_axi_wvalid), .dout(lsu_axi_wvalid_q), .clk(lsu_busm_clk), .*); + rvdff #(.WIDTH(1)) lsu_axi_wready_ff (.din(lsu_axi_wready), .dout(lsu_axi_wready_q), .clk(lsu_busm_clk), .*); + rvdff #(.WIDTH(1)) lsu_axi_arvalid_ff (.din(lsu_axi_arvalid), .dout(lsu_axi_arvalid_q), .clk(lsu_busm_clk), .*); + rvdff #(.WIDTH(1)) lsu_axi_arready_ff (.din(lsu_axi_arready), .dout(lsu_axi_arready_q), .clk(lsu_busm_clk), .*); + + rvdff #(.WIDTH(1)) lsu_axi_bvalid_ff (.din(lsu_axi_bvalid), .dout(lsu_axi_bvalid_q), .clk(lsu_busm_clk), .*); + rvdff #(.WIDTH(1)) lsu_axi_bready_ff (.din(lsu_axi_bready), .dout(lsu_axi_bready_q), .clk(lsu_busm_clk), .*); + rvdff #(.WIDTH(2)) lsu_axi_bresp_ff (.din(lsu_axi_bresp[1:0]), .dout(lsu_axi_bresp_q[1:0]), .clk(lsu_busm_clk), .*); + rvdff #(.WIDTH(pt.LSU_BUS_TAG)) lsu_axi_bid_ff (.din(lsu_axi_bid[pt.LSU_BUS_TAG-1:0]),.dout(lsu_axi_bid_q[pt.LSU_BUS_TAG-1:0]),.clk(lsu_busm_clk), .*); + rvdffe #(.WIDTH(64)) lsu_axi_rdata_ff (.din(lsu_axi_rdata[63:0]), .dout(lsu_axi_rdata_q[63:0]), .en(lsu_axi_rvalid & lsu_bus_clk_en), .*); + + rvdff #(.WIDTH(1)) lsu_axi_rvalid_ff (.din(lsu_axi_rvalid), .dout(lsu_axi_rvalid_q), .clk(lsu_busm_clk), .*); + rvdff #(.WIDTH(1)) lsu_axi_rready_ff (.din(lsu_axi_rready), .dout(lsu_axi_rready_q), .clk(lsu_busm_clk), .*); + rvdff #(.WIDTH(2)) lsu_axi_rresp_ff (.din(lsu_axi_rresp[1:0]), .dout(lsu_axi_rresp_q[1:0]), .clk(lsu_busm_clk), .*); + rvdff #(.WIDTH(pt.LSU_BUS_TAG)) lsu_axi_rid_ff (.din(lsu_axi_rid[pt.LSU_BUS_TAG-1:0]),.dout(lsu_axi_rid_q[pt.LSU_BUS_TAG-1:0]),.clk(lsu_busm_clk), .*); + + rvdff #(.WIDTH(DEPTH_LOG2)) lsu_WrPtr0_rff (.din(WrPtr0_m), .dout(WrPtr0_r), .clk(lsu_c2_r_clk), .*); + rvdff #(.WIDTH(DEPTH_LOG2)) lsu_WrPtr1_rff (.din(WrPtr1_m), .dout(WrPtr1_r), .clk(lsu_c2_r_clk), .*); + + rvdff #(.WIDTH(1)) lsu_busreq_rff (.din(lsu_busreq_m & ~flush_r & ~ld_full_hit_m), .dout(lsu_busreq_r), .clk(lsu_c2_r_clk), .*); + rvdff #(.WIDTH(1)) lsu_nonblock_load_valid_rff (.din(lsu_nonblock_load_valid_m), .dout(lsu_nonblock_load_valid_r), .clk(lsu_c2_r_clk), .*); + +`ifdef ASSERT_ON + + for (genvar i=0; i<4; i++) begin: GenByte + assert_ld_byte_hitvecfn_lo_onehot: assert #0 ($onehot0(ld_byte_hitvecfn_lo[i][DEPTH-1:0])); + assert_ld_byte_hitvecfn_hi_onehot: assert #0 ($onehot0(ld_byte_hitvecfn_hi[i][DEPTH-1:0])); + end + + assert_CmdPtr0Dec_onehot: assert #0 ($onehot0(CmdPtr0Dec[DEPTH-1:0])); + assert_CmdPtr1Dec_onehot: assert #0 ($onehot0(CmdPtr1Dec[DEPTH-1:0])); + +`endif + +endmodule // el2_lsu_bus_buffer diff --git a/design/lsu/el2_lsu_bus_intf.sv b/design/lsu/el2_lsu_bus_intf.sv new file mode 100644 index 0000000..d056dde --- /dev/null +++ b/design/lsu/el2_lsu_bus_intf.sv @@ -0,0 +1,369 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright 2020 Western Digital Corporation or it's affiliates. +// +// 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. + +//******************************************************************************** +// $Id$ +// +// +// Owner: +// Function: lsu interface with interface queue +// Comments: +// +//******************************************************************************** +module el2_lsu_bus_intf +import el2_pkg::*; +#( +`include "el2_param.vh" + )( + input logic clk, + input logic rst_l, + input logic scan_mode, + input logic dec_tlu_external_ldfwd_disable, // disable load to load forwarding for externals + input logic dec_tlu_wb_coalescing_disable, // disable write buffer coalescing + input logic dec_tlu_sideeffect_posted_disable, // disable the posted sideeffect load store to the bus + + // various clocks needed for the bus reads and writes + input logic lsu_c1_m_clk, + input logic lsu_c1_r_clk, + input logic lsu_c2_r_clk, + input logic lsu_bus_ibuf_c1_clk, + input logic lsu_bus_obuf_c1_clk, + input logic lsu_bus_buf_c1_clk, + input logic lsu_free_c2_clk, + input logic free_clk, + input logic lsu_busm_clk, + + input logic dec_lsu_valid_raw_d, // Raw valid for address computation + input logic lsu_busreq_m, // bus request is in m + + input el2_lsu_pkt_t lsu_pkt_m, // lsu packet flowing down the pipe + input el2_lsu_pkt_t lsu_pkt_r, // lsu packet flowing down the pipe + + input logic [31:0] lsu_addr_d, // lsu address flowing down the pipe + input logic [31:0] lsu_addr_m, // lsu address flowing down the pipe + input logic [31:0] lsu_addr_r, // lsu address flowing down the pipe + + input logic [31:0] end_addr_d, // lsu address flowing down the pipe + input logic [31:0] end_addr_m, // lsu address flowing down the pipe + input logic [31:0] end_addr_r, // lsu address flowing down the pipe + + input logic [31:0] store_data_r, // store data flowing down the pipe + input logic dec_tlu_force_halt, + + input logic lsu_commit_r, // lsu instruction in r commits + input logic is_sideeffects_m, // lsu attribute is side_effects + input logic flush_m_up, // flush + input logic flush_r, // flush + + output logic lsu_busreq_r, // bus request is in r + output logic lsu_bus_buffer_pend_any, // bus buffer has a pending bus entry + output logic lsu_bus_buffer_full_any, // write buffer is full + output logic lsu_bus_buffer_empty_any, // write buffer is empty + output logic lsu_bus_idle_any, // NO pending responses from the bus + output logic [31:0] bus_read_data_m, // the bus return data + + + output logic lsu_imprecise_error_load_any, // imprecise load bus error + output logic lsu_imprecise_error_store_any, // imprecise store bus error + output logic [31:0] lsu_imprecise_error_addr_any, // address of the imprecise error + + // Non-blocking loads + output logic lsu_nonblock_load_valid_m, // there is an external load -> put in the cam + output logic [pt.LSU_NUM_NBLOAD_WIDTH-1:0] lsu_nonblock_load_tag_m, // the tag of the external non block load + output logic lsu_nonblock_load_inv_r, // invalidate signal for the cam entry for non block loads + output logic [pt.LSU_NUM_NBLOAD_WIDTH-1:0] lsu_nonblock_load_inv_tag_r, // tag of the enrty which needs to be invalidated + output logic lsu_nonblock_load_data_valid,// the non block is valid - sending information back to the cam + output logic lsu_nonblock_load_data_error,// non block load has an error + output logic [pt.LSU_NUM_NBLOAD_WIDTH-1:0] lsu_nonblock_load_data_tag, // the tag of the non block load sending the data/error + output logic [31:0] lsu_nonblock_load_data, // Data of the non block load + + // PMU events + output logic lsu_pmu_bus_trxn, + output logic lsu_pmu_bus_misaligned, + output logic lsu_pmu_bus_error, + output logic lsu_pmu_bus_busy, + + // AXI Write Channels + output logic lsu_axi_awvalid, + input logic lsu_axi_awready, + output logic [pt.LSU_BUS_TAG-1:0] lsu_axi_awid, + output logic [31:0] lsu_axi_awaddr, + output logic [3:0] lsu_axi_awregion, + output logic [7:0] lsu_axi_awlen, + output logic [2:0] lsu_axi_awsize, + output logic [1:0] lsu_axi_awburst, + output logic lsu_axi_awlock, + output logic [3:0] lsu_axi_awcache, + output logic [2:0] lsu_axi_awprot, + output logic [3:0] lsu_axi_awqos, + + output logic lsu_axi_wvalid, + input logic lsu_axi_wready, + output logic [63:0] lsu_axi_wdata, + output logic [7:0] lsu_axi_wstrb, + output logic lsu_axi_wlast, + + input logic lsu_axi_bvalid, + output logic lsu_axi_bready, + input logic [1:0] lsu_axi_bresp, + input logic [pt.LSU_BUS_TAG-1:0] lsu_axi_bid, + + // AXI Read Channels + output logic lsu_axi_arvalid, + input logic lsu_axi_arready, + output logic [pt.LSU_BUS_TAG-1:0] lsu_axi_arid, + output logic [31:0] lsu_axi_araddr, + output logic [3:0] lsu_axi_arregion, + output logic [7:0] lsu_axi_arlen, + output logic [2:0] lsu_axi_arsize, + output logic [1:0] lsu_axi_arburst, + output logic lsu_axi_arlock, + output logic [3:0] lsu_axi_arcache, + output logic [2:0] lsu_axi_arprot, + output logic [3:0] lsu_axi_arqos, + + input logic lsu_axi_rvalid, + output logic lsu_axi_rready, + input logic [pt.LSU_BUS_TAG-1:0] lsu_axi_rid, + input logic [63:0] lsu_axi_rdata, + input logic [1:0] lsu_axi_rresp, + input logic lsu_axi_rlast, + + input logic lsu_bus_clk_en + +); + + + + logic lsu_bus_clk_en_q; + logic ldst_dual_d, ldst_dual_m, ldst_dual_r; + + logic [3:0] ldst_byteen_m, ldst_byteen_r; + logic [7:0] ldst_byteen_ext_m, ldst_byteen_ext_r; + logic [3:0] ldst_byteen_hi_m, ldst_byteen_hi_r; + logic [3:0] ldst_byteen_lo_m, ldst_byteen_lo_r; + logic is_sideeffects_r; + + logic [63:0] store_data_ext_r; + logic [31:0] store_data_hi_r; + logic [31:0] store_data_lo_r; + + logic addr_match_dw_lo_r_m; + logic addr_match_word_lo_r_m; + logic no_word_merge_r, no_dword_merge_r; + + logic ld_addr_rhit_lo_lo, ld_addr_rhit_hi_lo, ld_addr_rhit_lo_hi, ld_addr_rhit_hi_hi; + logic [3:0] ld_byte_rhit_lo_lo, ld_byte_rhit_hi_lo, ld_byte_rhit_lo_hi, ld_byte_rhit_hi_hi; + + logic [3:0] ld_byte_hit_lo, ld_byte_rhit_lo; + logic [3:0] ld_byte_hit_hi, ld_byte_rhit_hi; + + logic [31:0] ld_fwddata_rpipe_lo; + logic [31:0] ld_fwddata_rpipe_hi; + + logic [3:0] ld_byte_hit_buf_lo, ld_byte_hit_buf_hi; + logic [31:0] ld_fwddata_buf_lo, ld_fwddata_buf_hi; + + logic [63:0] ld_fwddata_lo, ld_fwddata_hi; + logic [63:0] ld_fwddata_m; + + logic ld_full_hit_hi_m, ld_full_hit_lo_m; + logic ld_full_hit_m; + + assign ldst_byteen_m[3:0] = ({4{lsu_pkt_m.by}} & 4'b0001) | + ({4{lsu_pkt_m.half}} & 4'b0011) | + ({4{lsu_pkt_m.word}} & 4'b1111); + assign ldst_dual_d = (lsu_addr_d[2] != end_addr_d[2]); + + // Read/Write Buffer + el2_lsu_bus_buffer #(.pt(pt)) bus_buffer ( + .* + ); + + // Logic to determine if dc5 store can be coalesced or not with younger stores. Bypass ibuf if cannot colaesced + assign addr_match_dw_lo_r_m = (lsu_addr_r[31:3] == lsu_addr_m[31:3]); + assign addr_match_word_lo_r_m = addr_match_dw_lo_r_m & ~(lsu_addr_r[2]^lsu_addr_m[2]); + + assign no_word_merge_r = lsu_busreq_r & ~ldst_dual_r & lsu_busreq_m & (lsu_pkt_m.load | ~addr_match_word_lo_r_m); + assign no_dword_merge_r = lsu_busreq_r & ~ldst_dual_r & lsu_busreq_m & (lsu_pkt_m.load | ~addr_match_dw_lo_r_m); + + // Create Hi/Lo signals + assign ldst_byteen_ext_m[7:0] = {4'b0,ldst_byteen_m[3:0]} << lsu_addr_m[1:0]; + assign ldst_byteen_ext_r[7:0] = {4'b0,ldst_byteen_r[3:0]} << lsu_addr_r[1:0]; + + assign store_data_ext_r[63:0] = {32'b0,store_data_r[31:0]} << {lsu_addr_r[1:0],3'b0}; + + assign ldst_byteen_hi_m[3:0] = ldst_byteen_ext_m[7:4]; + assign ldst_byteen_lo_m[3:0] = ldst_byteen_ext_m[3:0]; + assign ldst_byteen_hi_r[3:0] = ldst_byteen_ext_r[7:4]; + assign ldst_byteen_lo_r[3:0] = ldst_byteen_ext_r[3:0]; + + assign store_data_hi_r[31:0] = store_data_ext_r[63:32]; + assign store_data_lo_r[31:0] = store_data_ext_r[31:0]; + + assign ld_addr_rhit_lo_lo = (lsu_addr_m[31:2] == lsu_addr_r[31:2]) & lsu_pkt_r.valid & lsu_pkt_r.store & lsu_busreq_m; + assign ld_addr_rhit_lo_hi = (end_addr_m[31:2] == lsu_addr_r[31:2]) & lsu_pkt_r.valid & lsu_pkt_r.store & lsu_busreq_m; + assign ld_addr_rhit_hi_lo = (lsu_addr_m[31:2] == end_addr_r[31:2]) & lsu_pkt_r.valid & lsu_pkt_r.store & lsu_busreq_m; + assign ld_addr_rhit_hi_hi = (end_addr_m[31:2] == end_addr_r[31:2]) & lsu_pkt_r.valid & lsu_pkt_r.store & lsu_busreq_m; + + for (genvar i=0; i<4; i++) begin: GenBusBufFwd + assign ld_byte_rhit_lo_lo[i] = ld_addr_rhit_lo_lo & ldst_byteen_lo_r[i] & ldst_byteen_lo_m[i]; + assign ld_byte_rhit_lo_hi[i] = ld_addr_rhit_lo_hi & ldst_byteen_lo_r[i] & ldst_byteen_hi_m[i]; + assign ld_byte_rhit_hi_lo[i] = ld_addr_rhit_hi_lo & ldst_byteen_hi_r[i] & ldst_byteen_lo_m[i]; + assign ld_byte_rhit_hi_hi[i] = ld_addr_rhit_hi_hi & ldst_byteen_hi_r[i] & ldst_byteen_hi_m[i]; + + assign ld_byte_hit_lo[i] = ld_byte_rhit_lo_lo[i] | ld_byte_rhit_hi_lo[i] | + ld_byte_hit_buf_lo[i]; + + assign ld_byte_hit_hi[i] = ld_byte_rhit_lo_hi[i] | ld_byte_rhit_hi_hi[i] | + ld_byte_hit_buf_hi[i]; + + assign ld_byte_rhit_lo[i] = ld_byte_rhit_lo_lo[i] | ld_byte_rhit_hi_lo[i]; + assign ld_byte_rhit_hi[i] = ld_byte_rhit_lo_hi[i] | ld_byte_rhit_hi_hi[i]; + + assign ld_fwddata_rpipe_lo[(8*i)+7:(8*i)] = ({8{ld_byte_rhit_lo_lo[i]}} & store_data_lo_r[(8*i)+7:(8*i)]) | + ({8{ld_byte_rhit_hi_lo[i]}} & store_data_hi_r[(8*i)+7:(8*i)]); + + assign ld_fwddata_rpipe_hi[(8*i)+7:(8*i)] = ({8{ld_byte_rhit_lo_hi[i]}} & store_data_lo_r[(8*i)+7:(8*i)]) | + ({8{ld_byte_rhit_hi_hi[i]}} & store_data_hi_r[(8*i)+7:(8*i)]); + + // Final muxing between m/r + assign ld_fwddata_lo[(8*i)+7:(8*i)] = ld_byte_rhit_lo[i] ? ld_fwddata_rpipe_lo[(8*i)+7:(8*i)] : ld_fwddata_buf_lo[(8*i)+7:(8*i)]; + + assign ld_fwddata_hi[(8*i)+7:(8*i)] = ld_byte_rhit_hi[i] ? ld_fwddata_rpipe_hi[(8*i)+7:(8*i)] : ld_fwddata_buf_hi[(8*i)+7:(8*i)]; + + end + + always_comb begin + ld_full_hit_lo_m = 1'b1; + ld_full_hit_hi_m = 1'b1; + for (int i=0; i<4; i++) begin + ld_full_hit_lo_m &= (ld_byte_hit_lo[i] | ~ldst_byteen_lo_m[i]); + ld_full_hit_hi_m &= (ld_byte_hit_hi[i] | ~ldst_byteen_hi_m[i]); + end + end + + // This will be high if all the bytes of load hit the stores in pipe/write buffer (m/r/wrbuf) + assign ld_full_hit_m = ld_full_hit_lo_m & ld_full_hit_hi_m & lsu_busreq_m & lsu_pkt_m.load & ~is_sideeffects_m; + + assign ld_fwddata_m[63:0] = {ld_fwddata_hi[31:0], ld_fwddata_lo[31:0]} >> (8*lsu_addr_m[1:0]); + assign bus_read_data_m[31:0] = ld_fwddata_m[31:0]; + + // Fifo flops + + rvdff #(.WIDTH(1)) clken_ff (.din(lsu_bus_clk_en), .dout(lsu_bus_clk_en_q), .clk(free_clk), .*); + + rvdff #(.WIDTH(1)) ldst_dual_mff (.din(ldst_dual_d), .dout(ldst_dual_m), .clk(lsu_c1_m_clk), .*); + rvdff #(.WIDTH(1)) ldst_dual_rff (.din(ldst_dual_m), .dout(ldst_dual_r), .clk(lsu_c1_r_clk), .*); + rvdff #(.WIDTH(1)) is_sideeffects_rff (.din(is_sideeffects_m), .dout(is_sideeffects_r), .clk(lsu_c1_r_clk), .*); + + rvdff #(4) lsu_byten_rff (.*, .din(ldst_byteen_m[3:0]), .dout(ldst_byteen_r[3:0]), .clk(lsu_c1_r_clk)); + +`ifdef ASSERT_ON + + // Assertion to check AXI write address is aligned to size + property lsu_axi_awaddr_aligned; + @(posedge lsu_busm_clk) disable iff(~rst_l) lsu_axi_awvalid |-> ((lsu_axi_awsize[2:0] == 3'h0) | + ((lsu_axi_awsize[2:0] == 3'h1) & (lsu_axi_awaddr[0] == 1'b0)) | + ((lsu_axi_awsize[2:0] == 3'h2) & (lsu_axi_awaddr[1:0] == 2'b0)) | + ((lsu_axi_awsize[2:0] == 3'h3) & (lsu_axi_awaddr[2:0] == 3'b0))); + endproperty + assert_lsu_axi_awaddr_aligned: assert property (lsu_axi_awaddr_aligned) else + $display("Assertion lsu_axi_awaddr_aligned failed: lsu_axi_awvalid=1'b%b, lsu_axi_awsize=3'h%h, lsu_axi_awaddr=32'h%h",lsu_axi_awvalid, lsu_axi_awsize[2:0], lsu_axi_awaddr[31:0]); + // Assertion to check awvalid stays stable during entire bus clock + + // Assertion to check AXI read address is aligned to size + property lsu_axi_araddr_aligned; + @(posedge lsu_busm_clk) disable iff(~rst_l) lsu_axi_arvalid |-> ((lsu_axi_arsize[2:0] == 3'h0) | + ((lsu_axi_arsize[2:0] == 3'h1) & (lsu_axi_araddr[0] == 1'b0)) | + ((lsu_axi_arsize[2:0] == 3'h2) & (lsu_axi_araddr[1:0] == 2'b0)) | + ((lsu_axi_arsize[2:0] == 3'h3) & (lsu_axi_araddr[2:0] == 3'b0))); + endproperty + assert_lsu_axi_araddr_aligned: assert property (lsu_axi_araddr_aligned) else + $display("Assertion lsu_axi_araddr_aligned failed: lsu_axi_awvalid=1'b%b, lsu_axi_awsize=3'h%h, lsu_axi_araddr=32'h%h",lsu_axi_awvalid, lsu_axi_awsize[2:0], lsu_axi_araddr[31:0]); + + // Assertion to check awvalid stays stable during entire bus clock + property lsu_axi_awvalid_stable; + @(posedge clk) disable iff(~rst_l) (lsu_axi_awvalid != $past(lsu_axi_awvalid)) |-> $past(lsu_bus_clk_en); + endproperty + assert_lsu_axi_awvalid_stable: assert property (lsu_axi_awvalid_stable) else + $display("LSU AXI awvalid changed in middle of bus clock"); + + // Assertion to check awid stays stable during entire bus clock + property lsu_axi_awid_stable; + @(posedge clk) disable iff(~rst_l) (lsu_axi_awvalid & (lsu_axi_awid[pt.LSU_BUS_TAG-1:0] != $past(lsu_axi_awid[pt.LSU_BUS_TAG-1:0]))) |-> $past(lsu_bus_clk_en); + endproperty + assert_lsu_axi_awid_stable: assert property (lsu_axi_awid_stable) else + $display("LSU AXI awid changed in middle of bus clock"); + + // Assertion to check awaddr stays stable during entire bus clock + property lsu_axi_awaddr_stable; + @(posedge clk) disable iff(~rst_l) (lsu_axi_awvalid & (lsu_axi_awaddr[31:0] != $past(lsu_axi_awaddr[31:0]))) |-> $past(lsu_bus_clk_en); + endproperty + assert_lsu_axi_awaddr_stable: assert property (lsu_axi_awaddr_stable) else + $display("LSU AXI awaddr changed in middle of bus clock"); + + // Assertion to check awsize stays stable during entire bus clock + property lsu_axi_awsize_stable; + @(posedge clk) disable iff(~rst_l) (lsu_axi_awvalid & (lsu_axi_awsize[2:0] != $past(lsu_axi_awsize[2:0]))) |-> $past(lsu_bus_clk_en); + endproperty + assert_lsu_axi_awsize_stable: assert property (lsu_axi_awsize_stable) else + $display("LSU AXI awsize changed in middle of bus clock"); + + // Assertion to check wstrb stays stable during entire bus clock + property lsu_axi_wstrb_stable; + @(posedge clk) disable iff(~rst_l) (lsu_axi_wvalid & (lsu_axi_wstrb[7:0] != $past(lsu_axi_wstrb[7:0]))) |-> $past(lsu_bus_clk_en); + endproperty + assert_lsu_axi_wstrb_stable: assert property (lsu_axi_wstrb_stable) else + $display("LSU AXI wstrb changed in middle of bus clock"); + + // Assertion to check wdata stays stable during entire bus clock + property lsu_axi_wdata_stable; + @(posedge clk) disable iff(~rst_l) (lsu_axi_wvalid & (lsu_axi_wdata[63:0] != $past(lsu_axi_wdata[63:0]))) |-> $past(lsu_bus_clk_en); + endproperty + assert_lsu_axi_wdata_stable: assert property (lsu_axi_wdata_stable) else + $display("LSU AXI wdata changed in middle of bus clock"); + + // Assertion to check awvalid stays stable during entire bus clock + property lsu_axi_arvalid_stable; + @(posedge clk) disable iff(~rst_l) (lsu_axi_arvalid != $past(lsu_axi_arvalid)) |-> $past(lsu_bus_clk_en); + endproperty + assert_lsu_axi_arvalid_stable: assert property (lsu_axi_arvalid_stable) else + $display("LSU AXI awvalid changed in middle of bus clock"); + + // Assertion to check awid stays stable during entire bus clock + property lsu_axi_arid_stable; + @(posedge clk) disable iff(~rst_l) (lsu_axi_arvalid & (lsu_axi_arid[pt.LSU_BUS_TAG-1:0] != $past(lsu_axi_arid[pt.LSU_BUS_TAG-1:0]))) |-> $past(lsu_bus_clk_en); + endproperty + assert_lsu_axi_arid_stable: assert property (lsu_axi_arid_stable) else + $display("LSU AXI awid changed in middle of bus clock"); + + // Assertion to check awaddr stays stable during entire bus clock + property lsu_axi_araddr_stable; + @(posedge clk) disable iff(~rst_l) (lsu_axi_arvalid & (lsu_axi_araddr[31:0] != $past(lsu_axi_araddr[31:0]))) |-> $past(lsu_bus_clk_en); + endproperty + assert_lsu_axi_araddr_stable: assert property (lsu_axi_araddr_stable) else + $display("LSU AXI awaddr changed in middle of bus clock"); + + // Assertion to check awsize stays stable during entire bus clock + property lsu_axi_arsize_stable; + @(posedge clk) disable iff(~rst_l) (lsu_axi_awvalid & (lsu_axi_arsize[2:0] != $past(lsu_axi_arsize[2:0]))) |-> $past(lsu_bus_clk_en); + endproperty + assert_lsu_axi_arsize_stable: assert property (lsu_axi_arsize_stable) else + $display("LSU AXI awsize changed in middle of bus clock"); + +`endif + +endmodule // el2_lsu_bus_intf diff --git a/design/lsu/el2_lsu_clkdomain.sv b/design/lsu/el2_lsu_clkdomain.sv new file mode 100644 index 0000000..bc27f5c --- /dev/null +++ b/design/lsu/el2_lsu_clkdomain.sv @@ -0,0 +1,137 @@ +// Copyright 2020 Western Digital Corporation or it's affiliates. +// +// 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. + +//******************************************************************************** +// $Id$ +// +// +// Owner: +// Function: Clock Generation Block +// Comments: All the clocks are generate here +// +// //******************************************************************************** + + +module el2_lsu_clkdomain +import el2_pkg::*; +#( +`include "el2_param.vh" +)( + input logic clk, // clock + input logic free_clk, // clock + input logic rst_l, // reset + + // Inputs + input logic clk_override, // chciken bit to turn off clock gating + input logic addr_in_dccm_m, // address in dccm + input logic dma_dccm_req, // dma is active + input logic ldst_stbuf_reqvld_r, // allocating in to the store queue + + input logic stbuf_reqvld_any, // stbuf is draining + input logic stbuf_reqvld_flushed_any, // instruction going to stbuf is flushed + input logic lsu_busreq_r, // busreq in r + input logic lsu_bus_buffer_pend_any, // bus buffer has a pending bus entry + input logic lsu_bus_buffer_empty_any, // external bus buffer is empty + input logic lsu_stbuf_empty_any, // stbuf is empty + + input logic lsu_bus_clk_en, // bus clock enable + + input el2_lsu_pkt_t lsu_p, // lsu packet in decode + input el2_lsu_pkt_t lsu_pkt_d, // lsu packet in d + input el2_lsu_pkt_t lsu_pkt_m, // lsu packet in m + input el2_lsu_pkt_t lsu_pkt_r, // lsu packet in r + + // Outputs + output logic lsu_c1_m_clk, // m pipe single pulse clock + output logic lsu_c1_r_clk, // r pipe single pulse clock + + output logic lsu_c2_m_clk, // m pipe double pulse clock + output logic lsu_c2_r_clk, // r pipe double pulse clock + + output logic lsu_store_c1_m_clk, // store in m + output logic lsu_store_c1_r_clk, // store in r + + output logic lsu_stbuf_c1_clk, + output logic lsu_bus_obuf_c1_clk, // ibuf clock + output logic lsu_bus_ibuf_c1_clk, // ibuf clock + output logic lsu_bus_buf_c1_clk, // ibuf clock + output logic lsu_busm_clk, // bus clock + + output logic lsu_free_c2_clk, + + input logic scan_mode +); + + logic lsu_c1_d_clken, lsu_c1_m_clken, lsu_c1_r_clken; + logic lsu_c2_m_clken, lsu_c2_r_clken; + logic lsu_c1_d_clken_q, lsu_c1_m_clken_q, lsu_c1_r_clken_q; + logic lsu_store_c1_m_clken, lsu_store_c1_r_clken; + + + logic lsu_stbuf_c1_clken; + logic lsu_bus_ibuf_c1_clken, lsu_bus_obuf_c1_clken, lsu_bus_buf_c1_clken; + + logic lsu_free_c1_clken, lsu_free_c1_clken_q, lsu_free_c2_clken; + + //------------------------------------------------------------------------------------------- + // Clock Enable logic + //------------------------------------------------------------------------------------------- + + assign lsu_c1_d_clken = lsu_p.valid | dma_dccm_req | clk_override; + assign lsu_c1_m_clken = lsu_pkt_d.valid | lsu_c1_d_clken_q | clk_override; + assign lsu_c1_r_clken = lsu_pkt_m.valid | lsu_c1_m_clken_q | clk_override; + + assign lsu_c2_m_clken = lsu_c1_m_clken | lsu_c1_m_clken_q | clk_override; + assign lsu_c2_r_clken = lsu_c1_r_clken | lsu_c1_r_clken_q | clk_override; + + assign lsu_store_c1_m_clken = ((lsu_c1_m_clken & lsu_pkt_d.store) | clk_override) ; + assign lsu_store_c1_r_clken = ((lsu_c1_r_clken & lsu_pkt_m.store) | clk_override) ; + + assign lsu_stbuf_c1_clken = ldst_stbuf_reqvld_r | stbuf_reqvld_any | stbuf_reqvld_flushed_any | clk_override; + assign lsu_bus_ibuf_c1_clken = lsu_busreq_r | clk_override; + assign lsu_bus_obuf_c1_clken = (lsu_bus_buffer_pend_any | lsu_busreq_r | clk_override) & lsu_bus_clk_en; + assign lsu_bus_buf_c1_clken = ~lsu_bus_buffer_empty_any | lsu_busreq_r | clk_override; + + assign lsu_free_c1_clken = (lsu_p.valid | lsu_pkt_d.valid | lsu_pkt_m.valid | lsu_pkt_r.valid) | + ~lsu_bus_buffer_empty_any | ~lsu_stbuf_empty_any | clk_override; + assign lsu_free_c2_clken = lsu_free_c1_clken | lsu_free_c1_clken_q | clk_override; + + // Flops + rvdff #(1) lsu_free_c1_clkenff (.din(lsu_free_c1_clken), .dout(lsu_free_c1_clken_q), .clk(free_clk), .*); + + rvdff #(1) lsu_c1_d_clkenff (.din(lsu_c1_d_clken), .dout(lsu_c1_d_clken_q), .clk(lsu_free_c2_clk), .*); + rvdff #(1) lsu_c1_m_clkenff (.din(lsu_c1_m_clken), .dout(lsu_c1_m_clken_q), .clk(lsu_free_c2_clk), .*); + rvdff #(1) lsu_c1_r_clkenff (.din(lsu_c1_r_clken), .dout(lsu_c1_r_clken_q), .clk(lsu_free_c2_clk), .*); + + // Clock Headers + rvoclkhdr lsu_c1m_cgc ( .en(lsu_c1_m_clken), .l1clk(lsu_c1_m_clk), .* ); + rvoclkhdr lsu_c1r_cgc ( .en(lsu_c1_r_clken), .l1clk(lsu_c1_r_clk), .* ); + + rvoclkhdr lsu_c2m_cgc ( .en(lsu_c2_m_clken), .l1clk(lsu_c2_m_clk), .* ); + rvoclkhdr lsu_c2r_cgc ( .en(lsu_c2_r_clken), .l1clk(lsu_c2_r_clk), .* ); + + rvoclkhdr lsu_store_c1m_cgc (.en(lsu_store_c1_m_clken), .l1clk(lsu_store_c1_m_clk), .*); + rvoclkhdr lsu_store_c1r_cgc (.en(lsu_store_c1_r_clken), .l1clk(lsu_store_c1_r_clk), .*); + + rvoclkhdr lsu_stbuf_c1_cgc ( .en(lsu_stbuf_c1_clken), .l1clk(lsu_stbuf_c1_clk), .* ); + rvoclkhdr lsu_bus_ibuf_c1_cgc ( .en(lsu_bus_ibuf_c1_clken), .l1clk(lsu_bus_ibuf_c1_clk), .* ); + rvclkhdr lsu_bus_obuf_c1_cgc ( .en(lsu_bus_obuf_c1_clken), .l1clk(lsu_bus_obuf_c1_clk), .* ); + rvoclkhdr lsu_bus_buf_c1_cgc ( .en(lsu_bus_buf_c1_clken), .l1clk(lsu_bus_buf_c1_clk), .* ); + + rvclkhdr lsu_busm_cgc (.en(lsu_bus_clk_en), .l1clk(lsu_busm_clk), .*); + + rvoclkhdr lsu_free_cgc (.en(lsu_free_c2_clken), .l1clk(lsu_free_c2_clk), .*); + +endmodule + diff --git a/design/lsu/el2_lsu_dccm_ctl.sv b/design/lsu/el2_lsu_dccm_ctl.sv new file mode 100644 index 0000000..0857631 --- /dev/null +++ b/design/lsu/el2_lsu_dccm_ctl.sv @@ -0,0 +1,411 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright 2020 Western Digital Corporation or it's affiliates. +// +// 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. + +//******************************************************************************** +// $Id$ +// +// +// Owner: +// Function: DCCM for LSU pipe +// Comments: Single ported memory +// +// +// DC1 -> DC2 -> DC3 -> DC4 (Commit) +// +// //******************************************************************************** + +module el2_lsu_dccm_ctl +import el2_pkg::*; +#( +`include "el2_param.vh" + ) + ( + input logic lsu_c2_m_clk, // clocks + input logic lsu_c2_r_clk, // clocks + input logic lsu_c1_r_clk, + input logic lsu_store_c1_r_clk, + input logic lsu_free_c2_clk, + input logic clk, + + input logic rst_l, + + input el2_lsu_pkt_t lsu_pkt_r, // lsu packets + input el2_lsu_pkt_t lsu_pkt_m, // lsu packets + input el2_lsu_pkt_t lsu_pkt_d, + input logic addr_in_dccm_d, // address maps to dccm + input logic addr_in_pic_d, // address maps to pic + input logic addr_in_pic_m, // address maps to pic + input logic addr_in_dccm_m, addr_in_dccm_r, + input logic addr_in_pic_r, + input logic lsu_raw_fwd_lo_r, lsu_raw_fwd_hi_r, + input logic lsu_commit_r, + + input logic [31:0] lsu_addr_d, // starting byte address for loads + input logic [pt.DCCM_BITS-1:0] lsu_addr_m, // starting byte address for loads + input logic [31:0] lsu_addr_r, // starting byte address for loads + + input logic [pt.DCCM_BITS-1:0] end_addr_d, + input logic [pt.DCCM_BITS-1:0] end_addr_m, + input logic [pt.DCCM_BITS-1:0] end_addr_r, + + + input logic stbuf_reqvld_any, // write enable + input logic [pt.LSU_SB_BITS-1:0] stbuf_addr_any, // stbuf address (aligned) + + input logic [pt.DCCM_DATA_WIDTH-1:0] stbuf_data_any, // the read out from stbuf + input logic [pt.DCCM_ECC_WIDTH-1:0] stbuf_ecc_any, // the encoded data with ECC bits + input logic [pt.DCCM_DATA_WIDTH-1:0] stbuf_fwddata_hi_m, // stbuf fowarding to load + input logic [pt.DCCM_DATA_WIDTH-1:0] stbuf_fwddata_lo_m, // stbuf fowarding to load + input logic [pt.DCCM_BYTE_WIDTH-1:0] stbuf_fwdbyteen_hi_m, // stbuf fowarding to load + input logic [pt.DCCM_BYTE_WIDTH-1:0] stbuf_fwdbyteen_lo_m, // stbuf fowarding to load + + output logic [pt.DCCM_DATA_WIDTH-1:0] dccm_rdata_hi_r, // data from the dccm + output logic [pt.DCCM_DATA_WIDTH-1:0] dccm_rdata_lo_r, // data from the dccm + output logic [pt.DCCM_ECC_WIDTH-1:0] dccm_data_ecc_hi_r, // data from the dccm + ecc + output logic [pt.DCCM_ECC_WIDTH-1:0] dccm_data_ecc_lo_r, + output logic [pt.DCCM_DATA_WIDTH-1:0] lsu_ld_data_r, // right justified, ie load byte will have data at 7:0 + output logic [pt.DCCM_DATA_WIDTH-1:0] lsu_ld_data_corr_r, // right justified & ECC corrected, ie load byte will have data at 7:0 + + input logic lsu_double_ecc_error_r, // lsu has a DED + input logic single_ecc_error_hi_r, // sec detected on hi dccm bank + input logic single_ecc_error_lo_r, // sec detected on lower dccm bank + input logic [pt.DCCM_DATA_WIDTH-1:0] sec_data_hi_r, // corrected dccm data + input logic [pt.DCCM_DATA_WIDTH-1:0] sec_data_lo_r, // corrected dccm data + input logic [pt.DCCM_DATA_WIDTH-1:0] sec_data_hi_r_ff, // corrected dccm data + input logic [pt.DCCM_DATA_WIDTH-1:0] sec_data_lo_r_ff, // corrected dccm data + input logic [pt.DCCM_ECC_WIDTH-1:0] sec_data_ecc_hi_r_ff, // the encoded data with ECC bits + input logic [pt.DCCM_ECC_WIDTH-1:0] sec_data_ecc_lo_r_ff, // the encoded data with ECC bits + + output logic [pt.DCCM_DATA_WIDTH-1:0] dccm_rdata_hi_m, // data from the dccm + output logic [pt.DCCM_DATA_WIDTH-1:0] dccm_rdata_lo_m, // data from the dccm + output logic [pt.DCCM_ECC_WIDTH-1:0] dccm_data_ecc_hi_m, // data from the dccm + ecc + output logic [pt.DCCM_ECC_WIDTH-1:0] dccm_data_ecc_lo_m, + output logic [pt.DCCM_DATA_WIDTH-1:0] lsu_ld_data_m, // right justified, ie load byte will have data at 7:0 + + input logic lsu_double_ecc_error_m, // lsu has a DED + input logic [pt.DCCM_DATA_WIDTH-1:0] sec_data_hi_m, // corrected dccm data + input logic [pt.DCCM_DATA_WIDTH-1:0] sec_data_lo_m, // corrected dccm data + + input logic [31:0] store_data_m, + input logic dma_dccm_wen, + input logic [2:0] dma_mem_tag_m, + input logic [31:0] dma_dccm_wdata_lo, + input logic [31:0] dma_dccm_wdata_hi, + input logic [pt.DCCM_ECC_WIDTH-1:0] dma_dccm_wdata_ecc_hi, // ECC bits for the DMA wdata + input logic [pt.DCCM_ECC_WIDTH-1:0] dma_dccm_wdata_ecc_lo, // ECC bits for the DMA wdata + + output logic [pt.DCCM_DATA_WIDTH-1:0] store_data_hi_r, + output logic [pt.DCCM_DATA_WIDTH-1:0] store_data_lo_r, + output logic [pt.DCCM_DATA_WIDTH-1:0] store_datafn_hi_r, // data from the dccm + output logic [pt.DCCM_DATA_WIDTH-1:0] store_datafn_lo_r, // data from the dccm + output logic [31:0] store_data_r, // raw store data to be sent to bus + output logic ld_single_ecc_error_r, + output logic ld_single_ecc_error_r_ff, + + output logic [31:0] picm_mask_data_m, // pic data to stbuf + output logic lsu_stbuf_commit_any, // stbuf wins the dccm port or is to pic + output logic lsu_dccm_rden_m, // dccm read + output logic lsu_dccm_rden_r, // dccm read + + output logic dccm_dma_rvalid, // dccm serviving the dma load + output logic dccm_dma_ecc_error, // DMA load had ecc error + output logic [2:0] dccm_dma_rtag, // DMA return tag + output logic [63:0] dccm_dma_rdata, // dccm data to dma request + + // DCCM ports + output logic dccm_wren, // dccm interface -- write + output logic dccm_rden, // dccm interface -- write + output logic [pt.DCCM_BITS-1:0] dccm_wr_addr_lo, // dccm interface -- wr addr for lo bank + output logic [pt.DCCM_BITS-1:0] dccm_wr_addr_hi, // dccm interface -- wr addr for hi bank + output logic [pt.DCCM_BITS-1:0] dccm_rd_addr_lo, // dccm interface -- read address for lo bank + output logic [pt.DCCM_BITS-1:0] dccm_rd_addr_hi, // dccm interface -- read address for hi bank + output logic [pt.DCCM_FDATA_WIDTH-1:0] dccm_wr_data_lo, // dccm write data for lo bank + output logic [pt.DCCM_FDATA_WIDTH-1:0] dccm_wr_data_hi, // dccm write data for hi bank + + input logic [pt.DCCM_FDATA_WIDTH-1:0] dccm_rd_data_lo, // dccm read data back from the dccm + input logic [pt.DCCM_FDATA_WIDTH-1:0] dccm_rd_data_hi, // dccm read data back from the dccm + + // PIC ports + output logic picm_wren, // write to pic + output logic picm_rden, // read to pick + output logic picm_mken, // write to pic need a mask + output logic [31:0] picm_rdaddr, // address for pic read access + output logic [31:0] picm_wraddr, // address for pic write access + output logic [31:0] picm_wr_data, // write data + input logic [31:0] picm_rd_data, // read data + + input logic scan_mode // scan mode +); + + + localparam DCCM_WIDTH_BITS = $clog2(pt.DCCM_BYTE_WIDTH); + + logic lsu_dccm_rden_d, lsu_dccm_wren_d; + logic ld_single_ecc_error_lo_r, ld_single_ecc_error_hi_r; + logic ld_single_ecc_error_lo_r_ns, ld_single_ecc_error_hi_r_ns; + logic ld_single_ecc_error_lo_r_ff, ld_single_ecc_error_hi_r_ff; + logic lsu_double_ecc_error_r_ff; + logic [pt.DCCM_BITS-1:0] ld_sec_addr_lo_r_ff, ld_sec_addr_hi_r_ff; + logic [pt.DCCM_DATA_WIDTH-1:0] store_data_lo_r_in, store_data_hi_r_in ; + logic [63:0] picm_rd_data_m; + + logic dccm_wr_bypass_d_m_hi, dccm_wr_bypass_d_r_hi; + logic dccm_wr_bypass_d_m_lo, dccm_wr_bypass_d_r_lo; + logic kill_ecc_corr_lo_r, kill_ecc_corr_hi_r; + + // byte_en flowing down + logic [3:0] store_byteen_m ,store_byteen_r; + logic [7:0] store_byteen_ext_m, store_byteen_ext_r; + + if (pt.LOAD_TO_USE_PLUS1 == 1) begin: L2U_Plus1_1 + logic [63:0] lsu_rdata_r, lsu_rdata_corr_r; + logic [63:0] dccm_rdata_r, dccm_rdata_corr_r; + logic [63:0] stbuf_fwddata_r; + logic [7:0] stbuf_fwdbyteen_r; + logic [31:0] stbuf_fwddata_lo_r, stbuf_fwddata_hi_r; + logic [3:0] stbuf_fwdbyteen_lo_r, stbuf_fwdbyteen_hi_r; + logic [31:0] lsu_rdata_lo_r, lsu_rdata_hi_r; + logic [63:0] picm_rd_data_r; + logic [63:32] lsu_ld_data_r_nc, lsu_ld_data_corr_r_nc; + logic [2:0] dma_mem_tag_r; + + assign dccm_dma_rvalid = lsu_pkt_r.valid & lsu_pkt_r.load & lsu_pkt_r.dma; + assign dccm_dma_ecc_error = lsu_double_ecc_error_r; + assign dccm_dma_rtag[2:0] = dma_mem_tag_r[2:0]; + assign dccm_dma_rdata[63:0] = lsu_rdata_corr_r; + assign {lsu_ld_data_r_nc[63:32], lsu_ld_data_r[31:0]} = lsu_rdata_r[63:0] >> 8*lsu_addr_r[1:0]; + assign {lsu_ld_data_corr_r_nc[63:32], lsu_ld_data_corr_r[31:0]} = lsu_rdata_corr_r[63:0] >> 8*lsu_addr_r[1:0]; + + assign picm_rd_data_r[63:32] = picm_rd_data_r[31:0]; + assign dccm_rdata_r[63:0] = {dccm_rdata_hi_r[31:0],dccm_rdata_lo_r[31:0]}; + assign dccm_rdata_corr_r[63:0] = {sec_data_hi_r[31:0],sec_data_lo_r[31:0]}; + assign stbuf_fwddata_r[63:0] = {stbuf_fwddata_hi_r[31:0], stbuf_fwddata_lo_r[31:0]}; + assign stbuf_fwdbyteen_r[7:0] = {stbuf_fwdbyteen_hi_r[3:0], stbuf_fwdbyteen_lo_r[3:0]}; + + for (genvar i=0; i<8; i++) begin: GenDMAData + assign lsu_rdata_corr_r[(8*i)+7:8*i] = stbuf_fwdbyteen_r[i] ? stbuf_fwddata_r[(8*i)+7:8*i] : + (addr_in_pic_r ? picm_rd_data_r[(8*i)+7:8*i] : dccm_rdata_corr_r[(8*i)+7:8*i]); + + assign lsu_rdata_r[(8*i)+7:8*i] = stbuf_fwdbyteen_r[i] ? stbuf_fwddata_r[(8*i)+7:8*i] : + (addr_in_pic_r ? picm_rd_data_r[(8*i)+7:8*i] : dccm_rdata_r[(8*i)+7:8*i]); + end + rvdffe #(pt.DCCM_DATA_WIDTH) dccm_rdata_hi_r_ff (.*, .din(dccm_rdata_hi_m[pt.DCCM_DATA_WIDTH-1:0]), .dout(dccm_rdata_hi_r[pt.DCCM_DATA_WIDTH-1:0]), .en(lsu_dccm_rden_m)); + rvdffe #(pt.DCCM_DATA_WIDTH) dccm_rdata_lo_r_ff (.*, .din(dccm_rdata_lo_m[pt.DCCM_DATA_WIDTH-1:0]), .dout(dccm_rdata_lo_r[pt.DCCM_DATA_WIDTH-1:0]), .en(lsu_dccm_rden_m)); + rvdffe #(2*pt.DCCM_ECC_WIDTH) dccm_data_ecc_r_ff (.*, .din({dccm_data_ecc_hi_m[pt.DCCM_ECC_WIDTH-1:0], dccm_data_ecc_lo_m[pt.DCCM_ECC_WIDTH-1:0]}), + .dout({dccm_data_ecc_hi_r[pt.DCCM_ECC_WIDTH-1:0], dccm_data_ecc_lo_r[pt.DCCM_ECC_WIDTH-1:0]}), .en(lsu_dccm_rden_m)); + rvdff #(8) stbuf_fwdbyteen_ff (.*, .din({stbuf_fwdbyteen_hi_m[3:0], stbuf_fwdbyteen_lo_m[3:0]}), .dout({stbuf_fwdbyteen_hi_r[3:0], stbuf_fwdbyteen_lo_r[3:0]}), .clk(lsu_c2_r_clk)); + rvdff #(64) stbuf_fwddata_ff (.*, .din({stbuf_fwddata_hi_m[31:0], stbuf_fwddata_lo_m[31:0]}), .dout({stbuf_fwddata_hi_r[31:0], stbuf_fwddata_lo_r[31:0]}), .clk(lsu_c2_r_clk)); + rvdff #(32) picm_rddata_rff (.*, .din(picm_rd_data_m[31:0]), .dout(picm_rd_data_r[31:0]), .clk(lsu_c2_r_clk)); + rvdff #(3) dma_mem_tag_rff (.*, .din(dma_mem_tag_m[2:0]), .dout(dma_mem_tag_r[2:0]), .clk(lsu_c1_r_clk)); + + end else begin: L2U_Plus1_0 + + logic [63:0] lsu_rdata_m, lsu_rdata_corr_m; + logic [63:0] dccm_rdata_m, dccm_rdata_corr_m; + logic [63:0] stbuf_fwddata_m; + logic [7:0] stbuf_fwdbyteen_m; + logic [63:32] lsu_ld_data_m_nc, lsu_ld_data_corr_m_nc; + logic [31:0] lsu_ld_data_corr_m; + + assign dccm_dma_rvalid = lsu_pkt_m.valid & lsu_pkt_m.load & lsu_pkt_m.dma; + assign dccm_dma_ecc_error = lsu_double_ecc_error_m; + assign dccm_dma_rtag[2:0] = dma_mem_tag_m[2:0]; + assign dccm_dma_rdata[63:0] = lsu_rdata_corr_m; + assign {lsu_ld_data_m_nc[63:32], lsu_ld_data_m[31:0]} = lsu_rdata_m[63:0] >> 8*lsu_addr_m[1:0]; + assign {lsu_ld_data_corr_m_nc[63:32], lsu_ld_data_corr_m[31:0]} = lsu_rdata_corr_m[63:0] >> 8*lsu_addr_m[1:0]; + + assign dccm_rdata_m[63:0] = {dccm_rdata_hi_m[31:0],dccm_rdata_lo_m[31:0]}; + assign dccm_rdata_corr_m[63:0] = {sec_data_hi_m[31:0],sec_data_lo_m[31:0]}; + assign stbuf_fwddata_m[63:0] = {stbuf_fwddata_hi_m[31:0], stbuf_fwddata_lo_m[31:0]}; + assign stbuf_fwdbyteen_m[7:0] = {stbuf_fwdbyteen_hi_m[3:0], stbuf_fwdbyteen_lo_m[3:0]}; + + for (genvar i=0; i<8; i++) begin: GenLoop + assign lsu_rdata_corr_m[(8*i)+7:8*i] = stbuf_fwdbyteen_m[i] ? stbuf_fwddata_m[(8*i)+7:8*i] : + (addr_in_pic_m ? picm_rd_data_m[(8*i)+7:8*i] : dccm_rdata_corr_m[(8*i)+7:8*i]); + + assign lsu_rdata_m[(8*i)+7:8*i] = stbuf_fwdbyteen_m[i] ? stbuf_fwddata_m[(8*i)+7:8*i] : + (addr_in_pic_m ? picm_rd_data_m[(8*i)+7:8*i] : dccm_rdata_m[(8*i)+7:8*i]); + end + + rvdff #(32) lsu_ld_data_corr_rff(.*, .din(lsu_ld_data_corr_m[31:0]), .dout(lsu_ld_data_corr_r[31:0]), .clk(lsu_c2_r_clk)); + end + + assign kill_ecc_corr_lo_r = (((lsu_addr_d[pt.DCCM_BITS-1:2] == lsu_addr_r[pt.DCCM_BITS-1:2]) | (end_addr_d[pt.DCCM_BITS-1:2] == lsu_addr_r[pt.DCCM_BITS-1:2])) & lsu_pkt_d.valid & lsu_pkt_d.store & lsu_pkt_d.dma & addr_in_dccm_d) | + (((lsu_addr_m[pt.DCCM_BITS-1:2] == lsu_addr_r[pt.DCCM_BITS-1:2]) | (end_addr_m[pt.DCCM_BITS-1:2] == lsu_addr_r[pt.DCCM_BITS-1:2])) & lsu_pkt_m.valid & lsu_pkt_m.store & lsu_pkt_m.dma & addr_in_dccm_m); + + assign kill_ecc_corr_hi_r = (((lsu_addr_d[pt.DCCM_BITS-1:2] == end_addr_r[pt.DCCM_BITS-1:2]) | (end_addr_d[pt.DCCM_BITS-1:2] == end_addr_r[pt.DCCM_BITS-1:2])) & lsu_pkt_d.valid & lsu_pkt_d.store & lsu_pkt_d.dma & addr_in_dccm_d) | + (((lsu_addr_m[pt.DCCM_BITS-1:2] == end_addr_r[pt.DCCM_BITS-1:2]) | (end_addr_m[pt.DCCM_BITS-1:2] == end_addr_r[pt.DCCM_BITS-1:2])) & lsu_pkt_m.valid & lsu_pkt_m.store & lsu_pkt_m.dma & addr_in_dccm_m); + + assign ld_single_ecc_error_lo_r = lsu_pkt_r.load & single_ecc_error_lo_r & ~lsu_raw_fwd_lo_r; + assign ld_single_ecc_error_hi_r = lsu_pkt_r.load & single_ecc_error_hi_r & ~lsu_raw_fwd_hi_r; + assign ld_single_ecc_error_r = (ld_single_ecc_error_lo_r | ld_single_ecc_error_hi_r) & ~lsu_double_ecc_error_r; + + assign ld_single_ecc_error_lo_r_ns = ld_single_ecc_error_lo_r & (lsu_commit_r | lsu_pkt_r.dma) & ~kill_ecc_corr_lo_r; + assign ld_single_ecc_error_hi_r_ns = ld_single_ecc_error_hi_r & (lsu_commit_r | lsu_pkt_r.dma) & ~kill_ecc_corr_hi_r; + assign ld_single_ecc_error_r_ff = (ld_single_ecc_error_lo_r_ff | ld_single_ecc_error_hi_r_ff) & ~lsu_double_ecc_error_r_ff; + + assign lsu_stbuf_commit_any = stbuf_reqvld_any & + (~(lsu_dccm_rden_d | lsu_dccm_wren_d | ld_single_ecc_error_r_ff) | + (lsu_dccm_rden_d & ~((stbuf_addr_any[pt.DCCM_WIDTH_BITS+:pt.DCCM_BANK_BITS] == lsu_addr_d[pt.DCCM_WIDTH_BITS+:pt.DCCM_BANK_BITS]) | + (stbuf_addr_any[pt.DCCM_WIDTH_BITS+:pt.DCCM_BANK_BITS] == end_addr_d[pt.DCCM_WIDTH_BITS+:pt.DCCM_BANK_BITS])))); + + // No need to read for aligned word/dword stores since ECC will come by new data completely + assign lsu_dccm_rden_d = lsu_pkt_d.valid & (lsu_pkt_d.load | (lsu_pkt_d.store & (~(lsu_pkt_d.word | lsu_pkt_d.dword) | (lsu_addr_d[1:0] != 2'b0)))) & addr_in_dccm_d; + + // DMA will read/write in decode stage + assign lsu_dccm_wren_d = dma_dccm_wen; + + // DCCM inputs + assign dccm_wren = lsu_dccm_wren_d | lsu_stbuf_commit_any | ld_single_ecc_error_r_ff; + assign dccm_rden = lsu_dccm_rden_d & addr_in_dccm_d; + assign dccm_wr_addr_lo[pt.DCCM_BITS-1:0] = ld_single_ecc_error_r_ff ? (ld_single_ecc_error_lo_r_ff ? ld_sec_addr_lo_r_ff[pt.DCCM_BITS-1:0] : ld_sec_addr_hi_r_ff[pt.DCCM_BITS-1:0]) : + lsu_dccm_wren_d ? lsu_addr_d[pt.DCCM_BITS-1:0] : stbuf_addr_any[pt.DCCM_BITS-1:0]; + assign dccm_wr_addr_hi[pt.DCCM_BITS-1:0] = ld_single_ecc_error_r_ff ? (ld_single_ecc_error_hi_r_ff ? ld_sec_addr_hi_r_ff[pt.DCCM_BITS-1:0] : ld_sec_addr_lo_r_ff[pt.DCCM_BITS-1:0]) : + lsu_dccm_wren_d ? end_addr_d[pt.DCCM_BITS-1:0] : stbuf_addr_any[pt.DCCM_BITS-1:0]; + assign dccm_rd_addr_lo[pt.DCCM_BITS-1:0] = lsu_addr_d[pt.DCCM_BITS-1:0]; + assign dccm_rd_addr_hi[pt.DCCM_BITS-1:0] = end_addr_d[pt.DCCM_BITS-1:0]; + assign dccm_wr_data_lo[pt.DCCM_FDATA_WIDTH-1:0] = ld_single_ecc_error_r_ff ? (ld_single_ecc_error_lo_r_ff ? {sec_data_ecc_lo_r_ff[pt.DCCM_ECC_WIDTH-1:0],sec_data_lo_r_ff[pt.DCCM_DATA_WIDTH-1:0]} : + {sec_data_ecc_hi_r_ff[pt.DCCM_ECC_WIDTH-1:0],sec_data_hi_r_ff[pt.DCCM_DATA_WIDTH-1:0]}) : + (dma_dccm_wen ? {dma_dccm_wdata_ecc_lo[pt.DCCM_ECC_WIDTH-1:0],dma_dccm_wdata_lo[pt.DCCM_DATA_WIDTH-1:0]} : + {stbuf_ecc_any[pt.DCCM_ECC_WIDTH-1:0],stbuf_data_any[pt.DCCM_DATA_WIDTH-1:0]}); + assign dccm_wr_data_hi[pt.DCCM_FDATA_WIDTH-1:0] = ld_single_ecc_error_r_ff ? (ld_single_ecc_error_hi_r_ff ? {sec_data_ecc_hi_r_ff[pt.DCCM_ECC_WIDTH-1:0],sec_data_hi_r_ff[pt.DCCM_DATA_WIDTH-1:0]} : + {sec_data_ecc_lo_r_ff[pt.DCCM_ECC_WIDTH-1:0],sec_data_lo_r_ff[pt.DCCM_DATA_WIDTH-1:0]}) : + (dma_dccm_wen ? {dma_dccm_wdata_ecc_hi[pt.DCCM_ECC_WIDTH-1:0],dma_dccm_wdata_hi[pt.DCCM_DATA_WIDTH-1:0]} : + {stbuf_ecc_any[pt.DCCM_ECC_WIDTH-1:0],stbuf_data_any[pt.DCCM_DATA_WIDTH-1:0]}); + + // DCCM outputs + assign store_byteen_m[3:0] = {4{lsu_pkt_m.store}} & + (({4{lsu_pkt_m.by}} & 4'b0001) | + ({4{lsu_pkt_m.half}} & 4'b0011) | + ({4{lsu_pkt_m.word}} & 4'b1111)); + + assign store_byteen_r[3:0] = {4{lsu_pkt_r.store}} & + (({4{lsu_pkt_r.by}} & 4'b0001) | + ({4{lsu_pkt_r.half}} & 4'b0011) | + ({4{lsu_pkt_r.word}} & 4'b1111)); + + assign store_byteen_ext_m[7:0] = {4'b0,store_byteen_m[3:0]} << lsu_addr_m[1:0]; // The packet in m + assign store_byteen_ext_r[7:0] = {4'b0,store_byteen_r[3:0]} << lsu_addr_r[1:0]; + + + + assign dccm_wr_bypass_d_m_lo = (stbuf_addr_any[pt.DCCM_BITS-1:2] == lsu_addr_m[pt.DCCM_BITS-1:2]) & addr_in_dccm_m; + assign dccm_wr_bypass_d_m_hi = (stbuf_addr_any[pt.DCCM_BITS-1:2] == end_addr_m[pt.DCCM_BITS-1:2]) & addr_in_dccm_m; + + assign dccm_wr_bypass_d_r_lo = (stbuf_addr_any[pt.DCCM_BITS-1:2] == lsu_addr_r[pt.DCCM_BITS-1:2]) & addr_in_dccm_r; + assign dccm_wr_bypass_d_r_hi = (stbuf_addr_any[pt.DCCM_BITS-1:2] == end_addr_r[pt.DCCM_BITS-1:2]) & addr_in_dccm_r; + + + if (pt.LOAD_TO_USE_PLUS1 == 1) begin: L2U1_Plus1_1 + logic dccm_wren_Q; + logic [31:0] dccm_wr_data_Q; + logic dccm_wr_bypass_d_m_lo_Q, dccm_wr_bypass_d_m_hi_Q; + logic [31:0] store_data_pre_hi_r, store_data_pre_lo_r; + + assign {store_data_pre_hi_r[31:0], store_data_pre_lo_r[31:0]} = {32'b0,store_data_r[31:0]} << 8*lsu_addr_r[1:0]; + + for (genvar i=0; i<4; i++) begin + assign store_data_lo_r[(8*i)+7:(8*i)] = store_byteen_ext_r[i] ? store_data_pre_lo_r[(8*i)+7:(8*i)] : ((dccm_wren_Q & dccm_wr_bypass_d_m_lo_Q) ? dccm_wr_data_Q[(8*i)+7:(8*i)] : sec_data_lo_r[(8*i)+7:(8*i)]); + assign store_data_hi_r[(8*i)+7:(8*i)] = store_byteen_ext_r[i+4] ? store_data_pre_hi_r[(8*i)+7:(8*i)] : ((dccm_wren_Q & dccm_wr_bypass_d_m_hi_Q) ? dccm_wr_data_Q[(8*i)+7:(8*i)] : sec_data_hi_r[(8*i)+7:(8*i)]); + + assign store_datafn_lo_r[(8*i)+7:(8*i)] = store_byteen_ext_r[i] ? store_data_pre_lo_r[(8*i)+7:(8*i)] : ((lsu_stbuf_commit_any & dccm_wr_bypass_d_r_lo) ? stbuf_data_any[(8*i)+7:(8*i)] : + ((dccm_wren_Q & dccm_wr_bypass_d_m_lo_Q) ? dccm_wr_data_Q[(8*i)+7:(8*i)] : sec_data_lo_r[(8*i)+7:(8*i)])); + assign store_datafn_hi_r[(8*i)+7:(8*i)] = store_byteen_ext_r[i+4] ? store_data_pre_hi_r[(8*i)+7:(8*i)] : ((lsu_stbuf_commit_any & dccm_wr_bypass_d_r_hi) ? stbuf_data_any[(8*i)+7:(8*i)] : + ((dccm_wren_Q & dccm_wr_bypass_d_m_hi_Q) ? dccm_wr_data_Q[(8*i)+7:(8*i)] : sec_data_hi_r[(8*i)+7:(8*i)])); + end + + rvdff #(1) dccm_wren_ff (.*, .din(lsu_stbuf_commit_any), .dout(dccm_wren_Q), .clk(lsu_free_c2_clk)); // ECC load errors writing to dccm shouldn't fwd to stores in pipe + rvdffe #(32) dccm_wrdata_ff (.*, .din(stbuf_data_any[31:0]), .dout(dccm_wr_data_Q[31:0]), .en(lsu_stbuf_commit_any), .clk(clk)); + rvdff #(1) dccm_wrbyp_dm_loff (.*, .din(dccm_wr_bypass_d_m_lo), .dout(dccm_wr_bypass_d_m_lo_Q), .clk(lsu_free_c2_clk)); + rvdff #(1) dccm_wrbyp_dm_hiff (.*, .din(dccm_wr_bypass_d_m_hi), .dout(dccm_wr_bypass_d_m_hi_Q), .clk(lsu_free_c2_clk)); + rvdff #(32) store_data_rff (.*, .din(store_data_m[31:0]), .dout(store_data_r[31:0]), .clk(lsu_store_c1_r_clk)); + + end else begin: L2U1_Plus1_0 + + logic [31:0] store_data_hi_m, store_data_lo_m; + logic [63:0] store_data_mask; + assign {store_data_hi_m[31:0] , store_data_lo_m[31:0]} = {32'b0,store_data_m[31:0]} << 8*lsu_addr_m[1:0]; + + for (genvar i=0; i<4; i++) begin + assign store_data_hi_r_in[(8*i)+7:(8*i)] = store_byteen_ext_m[i+4] ? store_data_hi_m[(8*i)+7:(8*i)] : + ((lsu_stbuf_commit_any & dccm_wr_bypass_d_m_hi) ? stbuf_data_any[(8*i)+7:(8*i)] : sec_data_hi_m[(8*i)+7:(8*i)]); + assign store_data_lo_r_in[(8*i)+7:(8*i)] = store_byteen_ext_m[i] ? store_data_lo_m[(8*i)+7:(8*i)] : + ((lsu_stbuf_commit_any & dccm_wr_bypass_d_m_lo) ? stbuf_data_any[(8*i)+7:(8*i)] : sec_data_lo_m[(8*i)+7:(8*i)]); + + assign store_datafn_lo_r[(8*i)+7:(8*i)] = (lsu_stbuf_commit_any & dccm_wr_bypass_d_r_lo & ~store_byteen_ext_r[i]) ? stbuf_data_any[(8*i)+7:(8*i)] : store_data_lo_r[(8*i)+7:(8*i)]; + assign store_datafn_hi_r[(8*i)+7:(8*i)] = (lsu_stbuf_commit_any & dccm_wr_bypass_d_r_hi & ~store_byteen_ext_r[i+4]) ? stbuf_data_any[(8*i)+7:(8*i)] : store_data_hi_r[(8*i)+7:(8*i)]; + end // for (genvar i=0; i> 8*lsu_addr_r[1:0]) & store_data_mask[31:0]; + + rvdff #(pt.DCCM_DATA_WIDTH) store_data_hi_rff (.*, .din(store_data_hi_r_in[pt.DCCM_DATA_WIDTH-1:0]), .dout(store_data_hi_r[pt.DCCM_DATA_WIDTH-1:0]), .clk(lsu_store_c1_r_clk)); + rvdff #(pt.DCCM_DATA_WIDTH) store_data_lo_rff (.*, .din(store_data_lo_r_in[pt.DCCM_DATA_WIDTH-1:0]), .dout(store_data_lo_r[pt.DCCM_DATA_WIDTH-1:0]), .clk(lsu_store_c1_r_clk)); + + end + + assign dccm_rdata_lo_m[pt.DCCM_DATA_WIDTH-1:0] = dccm_rd_data_lo[pt.DCCM_DATA_WIDTH-1:0]; // for ld choose dccm_out + assign dccm_rdata_hi_m[pt.DCCM_DATA_WIDTH-1:0] = dccm_rd_data_hi[pt.DCCM_DATA_WIDTH-1:0]; // for ld this is used for ecc + + assign dccm_data_ecc_lo_m[pt.DCCM_ECC_WIDTH-1:0] = dccm_rd_data_lo[pt.DCCM_FDATA_WIDTH-1:pt.DCCM_DATA_WIDTH]; + assign dccm_data_ecc_hi_m[pt.DCCM_ECC_WIDTH-1:0] = dccm_rd_data_hi[pt.DCCM_FDATA_WIDTH-1:pt.DCCM_DATA_WIDTH]; + + // PIC signals. PIC ignores the lower 2 bits of address since PIC memory registers are 32-bits + assign picm_wren = lsu_pkt_r.valid & lsu_pkt_r.store & addr_in_pic_r & lsu_commit_r; + assign picm_rden = lsu_pkt_d.valid & lsu_pkt_d.load & addr_in_pic_d; + assign picm_mken = lsu_pkt_d.valid & lsu_pkt_d.store & addr_in_pic_d; // Get the mask for stores + assign picm_rdaddr[31:0] = pt.PIC_BASE_ADDR | {17'b0,lsu_addr_d[14:0]}; + + assign picm_wraddr[31:0] = pt.PIC_BASE_ADDR | {{32-pt.PIC_BITS{1'b0}},lsu_addr_r[pt.PIC_BITS-1:0]}; + + assign picm_wr_data[31:0] = store_datafn_lo_r[31:0]; + + assign picm_mask_data_m[31:0] = picm_rd_data_m[31:0]; + assign picm_rd_data_m[63:0] = {picm_rd_data[31:0],picm_rd_data[31:0]}; + + if (pt.DCCM_ENABLE == 1) begin: Gen_dccm_enable + rvdff #(1) dccm_rden_mff (.*, .din(lsu_dccm_rden_d), .dout(lsu_dccm_rden_m), .clk(lsu_c2_m_clk)); + rvdff #(1) dccm_rden_rff (.*, .din(lsu_dccm_rden_m), .dout(lsu_dccm_rden_r), .clk(lsu_c2_r_clk)); + end else begin: Gen_dccm_disable + assign lsu_dccm_rden_m = '0; + assign lsu_dccm_rden_r = '0; + end + + // ECC correction flops since dccm write happens next cycle + // We are writing to dccm in r+1 for ecc correction since fast_int needs to be blocked in decode - 1. We can probably write in r for plus0 configuration since we know ecc error in M. + // In that case these (_ff) flops are needed only in plus1 configuration + rvdff #(1) ld_double_ecc_error_rff (.*, .din(lsu_double_ecc_error_r), .dout(lsu_double_ecc_error_r_ff), .clk(lsu_free_c2_clk)); + rvdff #(1) ld_single_ecc_error_hi_rff (.*, .din(ld_single_ecc_error_hi_r_ns), .dout(ld_single_ecc_error_hi_r_ff), .clk(lsu_free_c2_clk)); + rvdff #(1) ld_single_ecc_error_lo_rff (.*, .din(ld_single_ecc_error_lo_r_ns), .dout(ld_single_ecc_error_lo_r_ff), .clk(lsu_free_c2_clk)); + rvdffe #(pt.DCCM_BITS) ld_sec_addr_hi_rff (.*, .din(end_addr_r[pt.DCCM_BITS-1:0]), .dout(ld_sec_addr_hi_r_ff[pt.DCCM_BITS-1:0]), .en(ld_single_ecc_error_r), .clk(clk)); + rvdffe #(pt.DCCM_BITS) ld_sec_addr_lo_rff (.*, .din(lsu_addr_r[pt.DCCM_BITS-1:0]), .dout(ld_sec_addr_lo_r_ff[pt.DCCM_BITS-1:0]), .en(ld_single_ecc_error_r), .clk(clk)); + +`ifdef LSU_ASSERT_ON + assert_ecc_kill_lo: assert #0 (~(ld_single_ecc_error_lo_r & kill_ecc_corr_lo_r)); + assert_ecc_kill_hi: assert #0 (~(ld_single_ecc_error_hi_r & kill_ecc_corr_hi_r)); + + // Load single ECC error correction implies commit/dma + property ld_single_ecc_error_commit; + @(posedge clk) disable iff(~rst_l) (ld_single_ecc_error_r_ff & dccm_wren) |-> ($past(lsu_commit_r | lsu_pkt_r.dma)); + endproperty + assert_ld_single_ecc_error_commit: assert property (ld_single_ecc_error_commit) else + $display("No commit or DMA but ECC correction happened"); + + +`endif + +endmodule diff --git a/design/lsu/el2_lsu_dccm_mem.sv b/design/lsu/el2_lsu_dccm_mem.sv new file mode 100644 index 0000000..3f8a963 --- /dev/null +++ b/design/lsu/el2_lsu_dccm_mem.sv @@ -0,0 +1,232 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright 2020 Western Digital Corporation or it's affiliates. +// +// 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. + +//******************************************************************************** +// $Id$ +// +// +// Owner: +// Function: DCCM for LSU pipe +// Comments: Single ported memory +// +// +// DC1 -> DC2 -> DC3 -> DC4 (Commit) +// +// //******************************************************************************** + + +module el2_lsu_dccm_mem +import el2_pkg::*; +#( +`include "el2_param.vh" + )( + input logic clk, // clock + input logic rst_l, + input logic clk_override, // clock override + + input logic dccm_wren, // write enable + input logic dccm_rden, // read enable + input logic [pt.DCCM_BITS-1:0] dccm_wr_addr_lo, // write address + input logic [pt.DCCM_BITS-1:0] dccm_wr_addr_hi, // write address + input logic [pt.DCCM_BITS-1:0] dccm_rd_addr_lo, // read address + input logic [pt.DCCM_BITS-1:0] dccm_rd_addr_hi, // read address for the upper bank in case of a misaligned access + input logic [pt.DCCM_FDATA_WIDTH-1:0] dccm_wr_data_lo, // write data + input logic [pt.DCCM_FDATA_WIDTH-1:0] dccm_wr_data_hi, // write data + + output logic [pt.DCCM_FDATA_WIDTH-1:0] dccm_rd_data_lo, // read data from the lo bank + output logic [pt.DCCM_FDATA_WIDTH-1:0] dccm_rd_data_hi, // read data from the hi bank + + input logic scan_mode +); + + + localparam DCCM_WIDTH_BITS = $clog2(pt.DCCM_BYTE_WIDTH); + localparam DCCM_INDEX_BITS = (pt.DCCM_BITS - pt.DCCM_BANK_BITS - pt.DCCM_WIDTH_BITS); + localparam DCCM_INDEX_DEPTH = ((pt.DCCM_SIZE)*1024)/((pt.DCCM_BYTE_WIDTH)*(pt.DCCM_NUM_BANKS)); // Depth of memory bank + + logic [pt.DCCM_NUM_BANKS-1:0] wren_bank; + logic [pt.DCCM_NUM_BANKS-1:0] rden_bank; + logic [pt.DCCM_NUM_BANKS-1:0] [pt.DCCM_BITS-1:(pt.DCCM_BANK_BITS+2)] addr_bank; + logic [pt.DCCM_BITS-1:(pt.DCCM_BANK_BITS+DCCM_WIDTH_BITS)] rd_addr_even, rd_addr_odd; + logic rd_unaligned, wr_unaligned; + logic [pt.DCCM_NUM_BANKS-1:0] [pt.DCCM_FDATA_WIDTH-1:0] dccm_bank_dout; + logic [pt.DCCM_FDATA_WIDTH-1:0] wrdata; + + logic [pt.DCCM_NUM_BANKS-1:0][pt.DCCM_FDATA_WIDTH-1:0] wr_data_bank; + + logic [(DCCM_WIDTH_BITS+pt.DCCM_BANK_BITS-1):DCCM_WIDTH_BITS] dccm_rd_addr_lo_q; + logic [(DCCM_WIDTH_BITS+pt.DCCM_BANK_BITS-1):DCCM_WIDTH_BITS] dccm_rd_addr_hi_q; + + logic [pt.DCCM_NUM_BANKS-1:0] dccm_clken; + + assign rd_unaligned = (dccm_rd_addr_lo[DCCM_WIDTH_BITS+:pt.DCCM_BANK_BITS] != dccm_rd_addr_hi[DCCM_WIDTH_BITS+:pt.DCCM_BANK_BITS]); + assign wr_unaligned = (dccm_wr_addr_lo[DCCM_WIDTH_BITS+:pt.DCCM_BANK_BITS] != dccm_wr_addr_hi[DCCM_WIDTH_BITS+:pt.DCCM_BANK_BITS]); + + // Align the read data + assign dccm_rd_data_lo[pt.DCCM_FDATA_WIDTH-1:0] = dccm_bank_dout[dccm_rd_addr_lo_q[pt.DCCM_WIDTH_BITS+:pt.DCCM_BANK_BITS]][pt.DCCM_FDATA_WIDTH-1:0]; + assign dccm_rd_data_hi[pt.DCCM_FDATA_WIDTH-1:0] = dccm_bank_dout[dccm_rd_addr_hi_q[DCCM_WIDTH_BITS+:pt.DCCM_BANK_BITS]][pt.DCCM_FDATA_WIDTH-1:0]; + + // Generate even/odd address + + // 8 Banks, 16KB each (2048 x 72) + for (genvar i=0; i<32'(pt.DCCM_NUM_BANKS); i++) begin: mem_bank + assign wren_bank[i] = dccm_wren & ((dccm_wr_addr_hi[2+:pt.DCCM_BANK_BITS] == i) | (dccm_wr_addr_lo[2+:pt.DCCM_BANK_BITS] == i)); + assign rden_bank[i] = dccm_rden & ((dccm_rd_addr_hi[2+:pt.DCCM_BANK_BITS] == i) | (dccm_rd_addr_lo[2+:pt.DCCM_BANK_BITS] == i)); + assign addr_bank[i][(pt.DCCM_BANK_BITS+DCCM_WIDTH_BITS)+:DCCM_INDEX_BITS] = wren_bank[i] ? (((dccm_wr_addr_hi[2+:pt.DCCM_BANK_BITS] == i) & wr_unaligned) ? + dccm_wr_addr_hi[(pt.DCCM_BANK_BITS+DCCM_WIDTH_BITS)+:DCCM_INDEX_BITS] : + dccm_wr_addr_lo[(pt.DCCM_BANK_BITS+DCCM_WIDTH_BITS)+:DCCM_INDEX_BITS]) : + (((dccm_rd_addr_hi[2+:pt.DCCM_BANK_BITS] == i) & rd_unaligned) ? + dccm_rd_addr_hi[(pt.DCCM_BANK_BITS+DCCM_WIDTH_BITS)+:DCCM_INDEX_BITS] : + dccm_rd_addr_lo[(pt.DCCM_BANK_BITS+DCCM_WIDTH_BITS)+:DCCM_INDEX_BITS]); + + assign wr_data_bank[i] = ((dccm_wr_addr_hi[2+:pt.DCCM_BANK_BITS] == i) & wr_unaligned) ? dccm_wr_data_hi[pt.DCCM_FDATA_WIDTH-1:0] : dccm_wr_data_lo[pt.DCCM_FDATA_WIDTH-1:0]; + + // clock gating section + assign dccm_clken[i] = (wren_bank[i] | rden_bank[i] | clk_override) ; + // end clock gating section + +`ifdef VERILATOR + el2_ram #(DCCM_INDEX_DEPTH,39) ram ( + // Primary ports + .ME(dccm_clken[i]), + .CLK(clk), + .WE(wren_bank[i]), + .ADR(addr_bank[i]), + .D(wr_data_bank[i][pt.DCCM_FDATA_WIDTH-1:0]), + .Q(dccm_bank_dout[i][pt.DCCM_FDATA_WIDTH-1:0]), + .* + ); + +`else + if (DCCM_INDEX_DEPTH == 32768) begin : dccm + ram_32768x39 dccm_bank ( + // Primary ports + .ME(dccm_clken[i]), + .CLK(clk), + .WE(wren_bank[i]), + .ADR(addr_bank[i]), + .D(wr_data_bank[i][pt.DCCM_FDATA_WIDTH-1:0]), + .Q(dccm_bank_dout[i][pt.DCCM_FDATA_WIDTH-1:0]), + .* + ); + end + else if (DCCM_INDEX_DEPTH == 16384) begin : dccm + ram_16384x39 dccm_bank ( + // Primary ports + .ME(dccm_clken[i]), + .CLK(clk), + .WE(wren_bank[i]), + .ADR(addr_bank[i]), + .D(wr_data_bank[i][pt.DCCM_FDATA_WIDTH-1:0]), + .Q(dccm_bank_dout[i][pt.DCCM_FDATA_WIDTH-1:0]), + .* + ); + end + else if (DCCM_INDEX_DEPTH == 8192) begin : dccm + ram_8192x39 dccm_bank ( + // Primary ports + .ME(dccm_clken[i]), + .CLK(clk), + .WE(wren_bank[i]), + .ADR(addr_bank[i]), + .D(wr_data_bank[i][pt.DCCM_FDATA_WIDTH-1:0]), + .Q(dccm_bank_dout[i][pt.DCCM_FDATA_WIDTH-1:0]), + .* + ); + end + else if (DCCM_INDEX_DEPTH == 4096) begin : dccm + ram_4096x39 dccm_bank ( + // Primary ports + .ME(dccm_clken[i]), + .CLK(clk), + .WE(wren_bank[i]), + .ADR(addr_bank[i]), + .D(wr_data_bank[i][pt.DCCM_FDATA_WIDTH-1:0]), + .Q(dccm_bank_dout[i][pt.DCCM_FDATA_WIDTH-1:0]), + .* + ); + end + else if (DCCM_INDEX_DEPTH == 3072) begin : dccm + ram_3072x39 dccm_bank ( + // Primary ports + .ME(dccm_clken[i]), + .CLK(clk), + .WE(wren_bank[i]), + .ADR(addr_bank[i]), + .D(wr_data_bank[i][pt.DCCM_FDATA_WIDTH-1:0]), + .Q(dccm_bank_dout[i][pt.DCCM_FDATA_WIDTH-1:0]), + .* + ); + end + else if (DCCM_INDEX_DEPTH == 2048) begin : dccm + ram_2048x39 dccm_bank ( + // Primary ports + .ME(dccm_clken[i]), + .CLK(clk), + .WE(wren_bank[i]), + .ADR(addr_bank[i]), + .D(wr_data_bank[i][pt.DCCM_FDATA_WIDTH-1:0]), + .Q(dccm_bank_dout[i][pt.DCCM_FDATA_WIDTH-1:0]), + .* + ); + end + else if (DCCM_INDEX_DEPTH == 1024) begin : dccm + ram_1024x39 dccm_bank ( + // Primary ports + .ME(dccm_clken[i]), + .CLK(clk), + .WE(wren_bank[i]), + .ADR(addr_bank[i]), + .D(wr_data_bank[i][pt.DCCM_FDATA_WIDTH-1:0]), + .Q(dccm_bank_dout[i][pt.DCCM_FDATA_WIDTH-1:0]), + .* + ); + end + else if (DCCM_INDEX_DEPTH == 512) begin : dccm + ram_512x39 dccm_bank ( + // Primary ports + .ME(dccm_clken[i]), + .CLK(clk), + .WE(wren_bank[i]), + .ADR(addr_bank[i]), + .D(wr_data_bank[i][pt.DCCM_FDATA_WIDTH-1:0]), + .Q(dccm_bank_dout[i][pt.DCCM_FDATA_WIDTH-1:0]), + .* + ); + end + else if (DCCM_INDEX_DEPTH == 256) begin : dccm + ram_256x39 dccm_bank ( + // Primary ports + .ME(dccm_clken[i]), + .CLK(clk), + .WE(wren_bank[i]), + .ADR(addr_bank[i]), + .D(wr_data_bank[i][pt.DCCM_FDATA_WIDTH-1:0]), + .Q(dccm_bank_dout[i][pt.DCCM_FDATA_WIDTH-1:0]), + .* + ); + end +`endif // VERILATOR + end : mem_bank + + // Flops + rvdffs #(pt.DCCM_BANK_BITS) rd_addr_lo_ff (.*, .din(dccm_rd_addr_lo[DCCM_WIDTH_BITS+:pt.DCCM_BANK_BITS]), .dout(dccm_rd_addr_lo_q[DCCM_WIDTH_BITS+:pt.DCCM_BANK_BITS]), .en(1'b1)); + rvdffs #(pt.DCCM_BANK_BITS) rd_addr_hi_ff (.*, .din(dccm_rd_addr_hi[DCCM_WIDTH_BITS+:pt.DCCM_BANK_BITS]), .dout(dccm_rd_addr_hi_q[DCCM_WIDTH_BITS+:pt.DCCM_BANK_BITS]), .en(1'b1)); + +`undef EL2_LOCAL_DCCM_RAM_TEST_PORTS + +endmodule // el2_lsu_dccm_mem + + diff --git a/design/lsu/el2_lsu_ecc.sv b/design/lsu/el2_lsu_ecc.sv new file mode 100644 index 0000000..e00d0aa --- /dev/null +++ b/design/lsu/el2_lsu_ecc.sv @@ -0,0 +1,242 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright 2020 Western Digital Corporation or it's affiliates. +// +// 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. + +//******************************************************************************** +// $Id$ +// +// +// Owner: +// Function: Top level file for load store unit +// Comments: +// +// +// DC1 -> DC2 -> DC3 -> DC4 (Commit) +// +//******************************************************************************** +module el2_lsu_ecc +import el2_pkg::*; +#( +`include "el2_param.vh" + ) +( + input logic clk, + input logic lsu_c2_r_clk, // clocks + input logic rst_l, + input logic scan_mode, // scan + + input el2_lsu_pkt_t lsu_pkt_m, // packet in m + input el2_lsu_pkt_t lsu_pkt_r, // packet in r + input logic [pt.DCCM_DATA_WIDTH-1:0] stbuf_data_any, + + input logic dec_tlu_core_ecc_disable, // disables the ecc computation and error flagging + + input logic lsu_dccm_rden_r, // dccm rden + input logic addr_in_dccm_r, // address in dccm + input logic [pt.DCCM_BITS-1:0] lsu_addr_r, // start address + input logic [pt.DCCM_BITS-1:0] end_addr_r, // end address + input logic [pt.DCCM_DATA_WIDTH-1:0] dccm_rdata_hi_r, // data from the dccm + input logic [pt.DCCM_DATA_WIDTH-1:0] dccm_rdata_lo_r, // data from the dccm + input logic [pt.DCCM_ECC_WIDTH-1:0] dccm_data_ecc_hi_r, // data from the dccm + ecc + input logic [pt.DCCM_ECC_WIDTH-1:0] dccm_data_ecc_lo_r, + output logic [pt.DCCM_DATA_WIDTH-1:0] sec_data_hi_r, + output logic [pt.DCCM_DATA_WIDTH-1:0] sec_data_lo_r, + output logic [pt.DCCM_DATA_WIDTH-1:0] sec_data_hi_r_ff, + output logic [pt.DCCM_DATA_WIDTH-1:0] sec_data_lo_r_ff, + + input logic ld_single_ecc_error_r, // ld has a single ecc error + input logic ld_single_ecc_error_r_ff, // ld has a single ecc error + input logic lsu_dccm_rden_m, // dccm rden + input logic addr_in_dccm_m, // address in dccm + input logic [pt.DCCM_BITS-1:0] lsu_addr_m, // start address + input logic [pt.DCCM_BITS-1:0] end_addr_m, // end address + input logic [pt.DCCM_DATA_WIDTH-1:0] dccm_rdata_hi_m, // raw data from mem + input logic [pt.DCCM_DATA_WIDTH-1:0] dccm_rdata_lo_m, // raw data from mem + input logic [pt.DCCM_ECC_WIDTH-1:0] dccm_data_ecc_hi_m, // ecc read out from mem + input logic [pt.DCCM_ECC_WIDTH-1:0] dccm_data_ecc_lo_m, // ecc read out from mem + output logic [pt.DCCM_DATA_WIDTH-1:0] sec_data_hi_m, + output logic [pt.DCCM_DATA_WIDTH-1:0] sec_data_lo_m, + + input logic dma_dccm_wen, + input logic [31:0] dma_dccm_wdata_lo, + input logic [31:0] dma_dccm_wdata_hi, + output logic [pt.DCCM_ECC_WIDTH-1:0] dma_dccm_wdata_ecc_hi, // ECC bits for the DMA wdata + output logic [pt.DCCM_ECC_WIDTH-1:0] dma_dccm_wdata_ecc_lo, // ECC bits for the DMA wdata + + output logic [pt.DCCM_ECC_WIDTH-1:0] stbuf_ecc_any, + output logic [pt.DCCM_ECC_WIDTH-1:0] sec_data_ecc_hi_r_ff, + output logic [pt.DCCM_ECC_WIDTH-1:0] sec_data_ecc_lo_r_ff, + + output logic single_ecc_error_hi_r, // sec detected + output logic single_ecc_error_lo_r, // sec detected on lower dccm bank + output logic lsu_single_ecc_error_r, // or of the 2 + output logic lsu_double_ecc_error_r, // double error detected + + output logic lsu_single_ecc_error_m, // or of the 2 + output logic lsu_double_ecc_error_m // double error detected + + ); + + logic is_ldst_r; + logic is_ldst_hi_any, is_ldst_lo_any; + logic [pt.DCCM_DATA_WIDTH-1:0] dccm_wdata_hi_any, dccm_wdata_lo_any; + logic [pt.DCCM_ECC_WIDTH-1:0] dccm_wdata_ecc_hi_any, dccm_wdata_ecc_lo_any; + logic [pt.DCCM_DATA_WIDTH-1:0] dccm_rdata_hi_any, dccm_rdata_lo_any; + logic [pt.DCCM_ECC_WIDTH-1:0] dccm_data_ecc_hi_any, dccm_data_ecc_lo_any; + logic [pt.DCCM_DATA_WIDTH-1:0] sec_data_hi_any, sec_data_lo_any; + logic single_ecc_error_hi_any, single_ecc_error_lo_any; + logic double_ecc_error_hi_any, double_ecc_error_lo_any; + + logic double_ecc_error_hi_m, double_ecc_error_lo_m; + logic double_ecc_error_hi_r, double_ecc_error_lo_r; + + logic [6:0] ecc_out_hi_nc, ecc_out_lo_nc; + + + if (pt.LOAD_TO_USE_PLUS1 == 1) begin: L2U_Plus1_1 + logic ldst_dual_m, ldst_dual_r; + logic is_ldst_m; + logic is_ldst_hi_m, is_ldst_lo_m; + logic is_ldst_hi_r, is_ldst_lo_r; + + assign ldst_dual_r = (lsu_addr_r[2] != end_addr_r[2]); + assign is_ldst_r = lsu_pkt_r.valid & (lsu_pkt_r.load | lsu_pkt_r.store) & addr_in_dccm_r & lsu_dccm_rden_r; + assign is_ldst_lo_r = is_ldst_r & ~dec_tlu_core_ecc_disable; + assign is_ldst_hi_r = is_ldst_r & (ldst_dual_r | lsu_pkt_r.dma) & ~dec_tlu_core_ecc_disable; // Always check the ECC Hi/Lo for DMA since we don't align for DMA + + assign is_ldst_hi_any = is_ldst_hi_r; + assign dccm_rdata_hi_any[pt.DCCM_DATA_WIDTH-1:0] = dccm_rdata_hi_r[pt.DCCM_DATA_WIDTH-1:0]; + assign dccm_data_ecc_hi_any[pt.DCCM_ECC_WIDTH-1:0] = dccm_data_ecc_hi_r[pt.DCCM_ECC_WIDTH-1:0]; + assign is_ldst_lo_any = is_ldst_lo_r; + assign dccm_rdata_lo_any[pt.DCCM_DATA_WIDTH-1:0] = dccm_rdata_lo_r[pt.DCCM_DATA_WIDTH-1:0]; + assign dccm_data_ecc_lo_any[pt.DCCM_ECC_WIDTH-1:0] = dccm_data_ecc_lo_r[pt.DCCM_ECC_WIDTH-1:0]; + + assign sec_data_hi_r[pt.DCCM_DATA_WIDTH-1:0] = sec_data_hi_any[pt.DCCM_DATA_WIDTH-1:0]; + assign single_ecc_error_hi_r = single_ecc_error_hi_any; + assign double_ecc_error_hi_r = double_ecc_error_hi_any; + assign sec_data_lo_r[pt.DCCM_DATA_WIDTH-1:0] = sec_data_lo_any[pt.DCCM_DATA_WIDTH-1:0]; + assign single_ecc_error_lo_r = single_ecc_error_lo_any; + assign double_ecc_error_lo_r = double_ecc_error_lo_any; + + assign lsu_single_ecc_error_r = single_ecc_error_hi_r | single_ecc_error_lo_r; + assign lsu_double_ecc_error_r = double_ecc_error_hi_r | double_ecc_error_lo_r; + + end else begin: L2U_Plus1_0 + + logic ldst_dual_m; + logic is_ldst_m; + logic is_ldst_hi_m, is_ldst_lo_m; + + assign ldst_dual_m = (lsu_addr_m[2] != end_addr_m[2]); + assign is_ldst_m = lsu_pkt_m.valid & (lsu_pkt_m.load | lsu_pkt_m.store) & addr_in_dccm_m & lsu_dccm_rden_m; + assign is_ldst_lo_m = is_ldst_m & ~dec_tlu_core_ecc_disable; + assign is_ldst_hi_m = is_ldst_m & (ldst_dual_m | lsu_pkt_m.dma) & ~dec_tlu_core_ecc_disable; // Always check the ECC Hi/Lo for DMA since we don't align for DMA + + assign is_ldst_hi_any = is_ldst_hi_m; + assign dccm_rdata_hi_any[pt.DCCM_DATA_WIDTH-1:0] = dccm_rdata_hi_m[pt.DCCM_DATA_WIDTH-1:0]; + assign dccm_data_ecc_hi_any[pt.DCCM_ECC_WIDTH-1:0] = dccm_data_ecc_hi_m[pt.DCCM_ECC_WIDTH-1:0]; + assign is_ldst_lo_any = is_ldst_lo_m; + assign dccm_rdata_lo_any[pt.DCCM_DATA_WIDTH-1:0] = dccm_rdata_lo_m[pt.DCCM_DATA_WIDTH-1:0]; + assign dccm_data_ecc_lo_any[pt.DCCM_ECC_WIDTH-1:0] = dccm_data_ecc_lo_m[pt.DCCM_ECC_WIDTH-1:0]; + + assign sec_data_hi_m[pt.DCCM_DATA_WIDTH-1:0] = sec_data_hi_any[pt.DCCM_DATA_WIDTH-1:0]; + assign double_ecc_error_hi_m = double_ecc_error_hi_any; + assign sec_data_lo_m[pt.DCCM_DATA_WIDTH-1:0] = sec_data_lo_any[pt.DCCM_DATA_WIDTH-1:0]; + assign double_ecc_error_lo_m = double_ecc_error_lo_any; + + assign lsu_single_ecc_error_m = single_ecc_error_hi_any | single_ecc_error_lo_any; + assign lsu_double_ecc_error_m = double_ecc_error_hi_m | double_ecc_error_lo_m; + + // Flops + rvdff #(1) lsu_single_ecc_err_r (.din(lsu_single_ecc_error_m), .dout(lsu_single_ecc_error_r), .clk(lsu_c2_r_clk), .*); + rvdff #(1) lsu_double_ecc_err_r (.din(lsu_double_ecc_error_m), .dout(lsu_double_ecc_error_r), .clk(lsu_c2_r_clk), .*); + rvdff #(.WIDTH(1)) ldst_sec_lo_rff (.din(single_ecc_error_lo_any), .dout(single_ecc_error_lo_r), .clk(lsu_c2_r_clk), .*); + rvdff #(.WIDTH(1)) ldst_sec_hi_rff (.din(single_ecc_error_hi_any), .dout(single_ecc_error_hi_r), .clk(lsu_c2_r_clk), .*); + rvdff #(.WIDTH(pt.DCCM_DATA_WIDTH)) sec_data_hi_rff (.din(sec_data_hi_m[pt.DCCM_DATA_WIDTH-1:0]), .dout(sec_data_hi_r[pt.DCCM_DATA_WIDTH-1:0]), .clk(lsu_c2_r_clk), .*); + rvdff #(.WIDTH(pt.DCCM_DATA_WIDTH)) sec_data_lo_rff (.din(sec_data_lo_m[pt.DCCM_DATA_WIDTH-1:0]), .dout(sec_data_lo_r[pt.DCCM_DATA_WIDTH-1:0]), .clk(lsu_c2_r_clk), .*); + + end + + // Logic for ECC generation during write + assign dccm_wdata_lo_any[pt.DCCM_DATA_WIDTH-1:0] = ld_single_ecc_error_r_ff ? sec_data_lo_r_ff[pt.DCCM_DATA_WIDTH-1:0] : (dma_dccm_wen ? dma_dccm_wdata_lo[pt.DCCM_DATA_WIDTH-1:0] : stbuf_data_any[pt.DCCM_DATA_WIDTH-1:0]); + assign dccm_wdata_hi_any[pt.DCCM_DATA_WIDTH-1:0] = ld_single_ecc_error_r_ff ? sec_data_hi_r_ff[pt.DCCM_DATA_WIDTH-1:0] : (dma_dccm_wen ? dma_dccm_wdata_hi[pt.DCCM_DATA_WIDTH-1:0] : stbuf_data_any[pt.DCCM_DATA_WIDTH-1:0]); + + assign sec_data_ecc_hi_r_ff[pt.DCCM_ECC_WIDTH-1:0] = dccm_wdata_ecc_hi_any[pt.DCCM_ECC_WIDTH-1:0]; + assign sec_data_ecc_lo_r_ff[pt.DCCM_ECC_WIDTH-1:0] = dccm_wdata_ecc_lo_any[pt.DCCM_ECC_WIDTH-1:0]; + assign stbuf_ecc_any[pt.DCCM_ECC_WIDTH-1:0] = dccm_wdata_ecc_lo_any[pt.DCCM_ECC_WIDTH-1:0]; + assign dma_dccm_wdata_ecc_hi[pt.DCCM_ECC_WIDTH-1:0] = dccm_wdata_ecc_hi_any[pt.DCCM_ECC_WIDTH-1:0]; + assign dma_dccm_wdata_ecc_lo[pt.DCCM_ECC_WIDTH-1:0] = dccm_wdata_ecc_lo_any[pt.DCCM_ECC_WIDTH-1:0]; + + // Instantiate ECC blocks + if (pt.DCCM_ENABLE == 1) begin: Gen_dccm_enable + + //Detect/Repair for Hi + rvecc_decode lsu_ecc_decode_hi ( + // Inputs + .en(is_ldst_hi_any), + .sed_ded (1'b0), // 1 : means only detection + .din(dccm_rdata_hi_any[pt.DCCM_DATA_WIDTH-1:0]), + .ecc_in(dccm_data_ecc_hi_any[pt.DCCM_ECC_WIDTH-1:0]), + // Outputs + .dout(sec_data_hi_any[pt.DCCM_DATA_WIDTH-1:0]), + .ecc_out (ecc_out_hi_nc[6:0]), + .single_ecc_error(single_ecc_error_hi_any), + .double_ecc_error(double_ecc_error_hi_any), + .* + ); + + //Detect/Repair for Lo + rvecc_decode lsu_ecc_decode_lo ( + // Inputs + .en(is_ldst_lo_any), + .sed_ded (1'b0), // 1 : means only detection + .din(dccm_rdata_lo_any[pt.DCCM_DATA_WIDTH-1:0] ), + .ecc_in(dccm_data_ecc_lo_any[pt.DCCM_ECC_WIDTH-1:0]), + // Outputs + .dout(sec_data_lo_any[pt.DCCM_DATA_WIDTH-1:0]), + .ecc_out (ecc_out_lo_nc[6:0]), + .single_ecc_error(single_ecc_error_lo_any), + .double_ecc_error(double_ecc_error_lo_any), + .* + ); + + rvecc_encode lsu_ecc_encode_hi ( + //Inputs + .din(dccm_wdata_hi_any[pt.DCCM_DATA_WIDTH-1:0]), + //Outputs + .ecc_out(dccm_wdata_ecc_hi_any[pt.DCCM_ECC_WIDTH-1:0]), + .* + ); + rvecc_encode lsu_ecc_encode_lo ( + //Inputs + .din(dccm_wdata_lo_any[pt.DCCM_DATA_WIDTH-1:0]), + //Outputs + .ecc_out(dccm_wdata_ecc_lo_any[pt.DCCM_ECC_WIDTH-1:0]), + .* + ); + end else begin: Gen_dccm_disable // block: Gen_dccm_enable + assign sec_data_hi_any[pt.DCCM_DATA_WIDTH-1:0] = '0; + assign sec_data_lo_any[pt.DCCM_DATA_WIDTH-1:0] = '0; + assign single_ecc_error_hi_any = '0; + assign double_ecc_error_hi_any = '0; + assign single_ecc_error_lo_any = '0; + assign double_ecc_error_lo_any = '0; + + assign stbuf_ecc_any[pt.DCCM_ECC_WIDTH-1:0] = '0; + end + + rvdffe #(.WIDTH(pt.DCCM_DATA_WIDTH)) sec_data_hi_rplus1ff (.din(sec_data_hi_r[pt.DCCM_DATA_WIDTH-1:0]), .dout(sec_data_hi_r_ff[pt.DCCM_DATA_WIDTH-1:0]), .en(ld_single_ecc_error_r), .clk(clk), .*); + rvdffe #(.WIDTH(pt.DCCM_DATA_WIDTH)) sec_data_lo_rplus1ff (.din(sec_data_lo_r[pt.DCCM_DATA_WIDTH-1:0]), .dout(sec_data_lo_r_ff[pt.DCCM_DATA_WIDTH-1:0]), .en(ld_single_ecc_error_r), .clk(clk), .*); + +endmodule // el2_lsu_ecc diff --git a/design/lsu/el2_lsu_lsc_ctl.sv b/design/lsu/el2_lsu_lsc_ctl.sv new file mode 100644 index 0000000..ed748b1 --- /dev/null +++ b/design/lsu/el2_lsu_lsc_ctl.sv @@ -0,0 +1,328 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright 2020 Western Digital Corporation or it's affiliates. +// +// 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. + +//******************************************************************************** +// $Id$ +// +// +// Owner: +// Function: LSU control +// Comments: +// +// +// DC1 -> DC2 -> DC3 -> DC4 (Commit) +// +//******************************************************************************** +module el2_lsu_lsc_ctl +import el2_pkg::*; +#( +`include "el2_param.vh" + )( + input logic rst_l, + + // clocks per pipe + input logic lsu_c1_m_clk, + input logic lsu_c1_r_clk, + input logic lsu_c2_m_clk, + input logic lsu_c2_r_clk, + input logic lsu_store_c1_m_clk, + + input logic [31:0] lsu_ld_data_r, + input logic [31:0] lsu_ld_data_corr_r, // ECC corrected data + input logic lsu_single_ecc_error_r, + input logic lsu_double_ecc_error_r, + + input logic [31:0] lsu_ld_data_m, + input logic lsu_single_ecc_error_m, + input logic lsu_double_ecc_error_m, + + input logic flush_m_up, + input logic flush_r, + + input logic [31:0] exu_lsu_rs1_d, // address + input logic [31:0] exu_lsu_rs2_d, // store data + + input el2_lsu_pkt_t lsu_p, // lsu control packet + input logic dec_lsu_valid_raw_d, // Raw valid for address computation + input logic [11:0] dec_lsu_offset_d, + + input logic [31:0] picm_mask_data_m, + input logic [31:0] bus_read_data_m, + output logic [31:0] lsu_result_m, + output logic [31:0] lsu_result_corr_r, // This is the ECC corrected data going to RF + // lsu address down the pipe + output logic [31:0] lsu_addr_d, + output logic [31:0] lsu_addr_m, + output logic [31:0] lsu_addr_r, + // lsu address down the pipe - needed to check unaligned + output logic [31:0] end_addr_d, + output logic [31:0] end_addr_m, + output logic [31:0] end_addr_r, + // store data down the pipe + output logic [31:0] store_data_m, + + input logic [31:0] dec_tlu_mrac_ff, + output logic lsu_exc_m, + output logic is_sideeffects_m, + output logic lsu_commit_r, + output logic lsu_single_ecc_error_incr, + output el2_lsu_error_pkt_t lsu_error_pkt_r, + + output logic [31:1] lsu_fir_addr, // fast interrupt address + output logic [1:0] lsu_fir_error, // Error during fast interrupt lookup + + // address in dccm/pic/external per pipe stage + output logic addr_in_dccm_d, + output logic addr_in_dccm_m, + output logic addr_in_dccm_r, + + output logic addr_in_pic_d, + output logic addr_in_pic_m, + output logic addr_in_pic_r, + + output logic addr_external_m, + + // DMA slave + input logic dma_dccm_req, + input logic [31:0] dma_mem_addr, + input logic [2:0] dma_mem_sz, + input logic dma_mem_write, + input logic [63:0] dma_mem_wdata, + + // Store buffer related signals + output el2_lsu_pkt_t lsu_pkt_d, + output el2_lsu_pkt_t lsu_pkt_m, + output el2_lsu_pkt_t lsu_pkt_r, + + input logic scan_mode + + ); + + logic [31:0] full_addr_d; + logic [31:0] full_end_addr_d; + logic [31:0] lsu_rs1_d; + logic [11:0] lsu_offset_d; + logic [31:0] rs1_d; + logic [11:0] offset_d; + logic [12:0] end_addr_offset_d; + logic [2:0] addr_offset_d; + + logic [63:0] dma_mem_wdata_shifted; + logic addr_external_d; + logic addr_external_r; + logic access_fault_d, misaligned_fault_d; + logic access_fault_m, misaligned_fault_m; + + logic fir_dccm_access_error_d, fir_nondccm_access_error_d; + logic fir_dccm_access_error_m, fir_nondccm_access_error_m; + + logic [2:0] exc_mscause_d, exc_mscause_m; + logic [31:0] rs1_d_raw; + logic [31:0] store_data_d, store_data_pre_m, store_data_m_in; + logic [31:0] bus_read_data_r; + + el2_lsu_pkt_t dma_pkt_d; + el2_lsu_pkt_t lsu_pkt_m_in, lsu_pkt_r_in; + el2_lsu_error_pkt_t lsu_error_pkt_m; + + + // Premux the rs1/offset for dma + assign lsu_rs1_d[31:0] = dec_lsu_valid_raw_d ? exu_lsu_rs1_d[31:0] : dma_mem_addr[31:0]; + assign lsu_offset_d[11:0] = dec_lsu_offset_d[11:0] & {12{dec_lsu_valid_raw_d}}; + assign rs1_d_raw[31:0] = lsu_rs1_d[31:0]; + assign offset_d[11:0] = lsu_offset_d[11:0]; + + assign rs1_d[31:0] = (lsu_pkt_d.load_ldst_bypass_d) ? lsu_result_m[31:0] : rs1_d_raw[31:0]; + + // generate the ls address + // need to refine this is memory is only 128KB + rvlsadder lsadder (.rs1(rs1_d[31:0]), + .offset(offset_d[11:0]), + .dout(full_addr_d[31:0]) + ); + + // Module to generate the memory map of the address + el2_lsu_addrcheck addrcheck ( + .start_addr_d(full_addr_d[31:0]), + .end_addr_d(full_end_addr_d[31:0]), + .rs1_region_d(rs1_d[31:28]), + .* + ); + + // Calculate start/end address for load/store + assign addr_offset_d[2:0] = ({3{lsu_pkt_d.half}} & 3'b01) | ({3{lsu_pkt_d.word}} & 3'b11) | ({3{lsu_pkt_d.dword}} & 3'b111); + assign end_addr_offset_d[12:0] = {offset_d[11],offset_d[11:0]} + {9'b0,addr_offset_d[2:0]}; + assign full_end_addr_d[31:0] = rs1_d[31:0] + {{19{end_addr_offset_d[12]}},end_addr_offset_d[12:0]}; + assign end_addr_d[31:0] = full_end_addr_d[31:0]; + assign lsu_exc_m = access_fault_m | misaligned_fault_m; + + // Goes to TLU to increment the ECC error counter + assign lsu_single_ecc_error_incr = (lsu_single_ecc_error_r & ~lsu_double_ecc_error_r) & (lsu_commit_r | lsu_pkt_r.dma) & lsu_pkt_r.valid; + + if (pt.LOAD_TO_USE_PLUS1 == 1) begin: L2U_Plus1_1 + logic access_fault_r, misaligned_fault_r; + logic [2:0] exc_mscause_r; + logic fir_dccm_access_error_r, fir_nondccm_access_error_r; + + // Generate exception packet + assign lsu_error_pkt_r.exc_valid = (access_fault_r | misaligned_fault_r | lsu_double_ecc_error_r) & lsu_pkt_r.valid & ~lsu_pkt_r.dma & ~lsu_pkt_r.fast_int; + assign lsu_error_pkt_r.single_ecc_error = lsu_single_ecc_error_r & ~lsu_error_pkt_r.exc_valid & ~lsu_pkt_r.dma; + assign lsu_error_pkt_r.inst_type = lsu_pkt_r.store; + assign lsu_error_pkt_r.exc_type = ~misaligned_fault_r; + assign lsu_error_pkt_r.mscause[2:0] = (lsu_double_ecc_error_r & ~misaligned_fault_r & ~access_fault_r) ? 3'h1 : exc_mscause_r[2:0]; + assign lsu_error_pkt_r.addr[31:0] = lsu_addr_r[31:0]; + + assign lsu_fir_error[1:0] = fir_nondccm_access_error_r ? 2'b11 : (fir_dccm_access_error_r ? 2'b10 : ((lsu_pkt_r.fast_int & lsu_double_ecc_error_r) ? 2'b01 : 2'b00)); + + rvdff #(1) access_fault_rff (.din(access_fault_m), .dout(access_fault_r), .clk(lsu_c1_r_clk), .*); + rvdff #(1) misaligned_fault_rff (.din(misaligned_fault_m), .dout(misaligned_fault_r), .clk(lsu_c1_r_clk), .*); + rvdff #(3) exc_mscause_rff (.din(exc_mscause_m[2:0]), .dout(exc_mscause_r[2:0]), .clk(lsu_c1_r_clk), .*); + rvdff #(1) fir_dccm_access_error_mff (.din(fir_dccm_access_error_m), .dout(fir_dccm_access_error_r), .clk(lsu_c1_r_clk), .*); + rvdff #(1) fir_nondccm_access_error_mff (.din(fir_nondccm_access_error_m), .dout(fir_nondccm_access_error_r), .clk(lsu_c1_r_clk), .*); + + end else begin: L2U_Plus1_0 + logic [1:0] lsu_fir_error_m; + + // Generate exception packet + assign lsu_error_pkt_m.exc_valid = (access_fault_m | misaligned_fault_m | lsu_double_ecc_error_m) & lsu_pkt_m.valid & ~lsu_pkt_m.dma & ~lsu_pkt_m.fast_int & ~flush_m_up; + assign lsu_error_pkt_m.single_ecc_error = lsu_single_ecc_error_m & ~lsu_error_pkt_m.exc_valid & ~lsu_pkt_m.dma; + assign lsu_error_pkt_m.inst_type = lsu_pkt_m.store; + assign lsu_error_pkt_m.exc_type = ~misaligned_fault_m; + assign lsu_error_pkt_m.mscause[2:0] = (lsu_double_ecc_error_m & ~misaligned_fault_m & ~access_fault_m) ? 3'h1 : exc_mscause_m[2:0]; + assign lsu_error_pkt_m.addr[31:0] = lsu_addr_m[31:0]; + + assign lsu_fir_error_m[1:0] = fir_nondccm_access_error_m ? 2'b11 : (fir_dccm_access_error_m ? 2'b10 : ((lsu_pkt_m.fast_int & lsu_double_ecc_error_m) ? 2'b01 : 2'b00)); + + rvdff #($bits(el2_lsu_error_pkt_t)) lsu_error_pkt_rff(.*, .din(lsu_error_pkt_m), .dout(lsu_error_pkt_r), .clk(lsu_c2_r_clk)); + rvdff #(2) lsu_fir_error_rff(.*, .din(lsu_fir_error_m[1:0]), .dout(lsu_fir_error[1:0]), .clk(lsu_c2_r_clk)); + end + + //Create DMA packet + always_comb begin + dma_pkt_d = '0; + dma_pkt_d.valid = dma_dccm_req; + dma_pkt_d.dma = 1'b1; + dma_pkt_d.store = dma_mem_write; + dma_pkt_d.load = ~dma_mem_write; + dma_pkt_d.by = (dma_mem_sz[2:0] == 3'b0); + dma_pkt_d.half = (dma_mem_sz[2:0] == 3'b1); + dma_pkt_d.word = (dma_mem_sz[2:0] == 3'b10); + dma_pkt_d.dword = (dma_mem_sz[2:0] == 3'b11); + end + + always_comb begin + lsu_pkt_d = dec_lsu_valid_raw_d ? lsu_p : dma_pkt_d; + lsu_pkt_m_in = lsu_pkt_d; + lsu_pkt_r_in = lsu_pkt_m; + + lsu_pkt_d.valid = (lsu_p.valid & ~(flush_m_up & ~lsu_p.fast_int)) | dma_dccm_req; + lsu_pkt_m_in.valid = lsu_pkt_d.valid & ~(flush_m_up & ~lsu_pkt_d.dma); + lsu_pkt_r_in.valid = lsu_pkt_m.valid & ~(flush_m_up & ~lsu_pkt_m.dma) ; + end + + // C2 clock for valid and C1 for other bits of packet + rvdff #(1) lsu_pkt_vldmff (.*, .din(lsu_pkt_m_in.valid), .dout(lsu_pkt_m.valid), .clk(lsu_c2_m_clk)); + rvdff #(1) lsu_pkt_vldrff (.*, .din(lsu_pkt_r_in.valid), .dout(lsu_pkt_r.valid), .clk(lsu_c2_r_clk)); + + rvdff #($bits(el2_lsu_pkt_t)-1) lsu_pkt_mff (.*, .din(lsu_pkt_m_in[$bits(el2_lsu_pkt_t)-1:1]), .dout(lsu_pkt_m[$bits(el2_lsu_pkt_t)-1:1]), .clk(lsu_c1_m_clk)); + rvdff #($bits(el2_lsu_pkt_t)-1) lsu_pkt_rff (.*, .din(lsu_pkt_r_in[$bits(el2_lsu_pkt_t)-1:1]), .dout(lsu_pkt_r[$bits(el2_lsu_pkt_t)-1:1]), .clk(lsu_c1_r_clk)); + + + + if (pt.LOAD_TO_USE_PLUS1 == 1) begin: L2U1_Plus1_1 + logic [31:0] lsu_ld_datafn_r, lsu_ld_datafn_corr_r; + + assign lsu_ld_datafn_r[31:0] = addr_external_r ? bus_read_data_r[31:0] : lsu_ld_data_r[31:0]; + assign lsu_ld_datafn_corr_r[31:0] = addr_external_r ? bus_read_data_r[31:0] : lsu_ld_data_corr_r[31:0]; + + // this is really R stage but don't want to make all the changes to support M,R buses + assign lsu_result_m[31:0] = ({32{ lsu_pkt_r.unsign & lsu_pkt_r.by }} & {24'b0,lsu_ld_datafn_r[7:0]}) | + ({32{ lsu_pkt_r.unsign & lsu_pkt_r.half}} & {16'b0,lsu_ld_datafn_r[15:0]}) | + ({32{~lsu_pkt_r.unsign & lsu_pkt_r.by }} & {{24{ lsu_ld_datafn_r[7]}}, lsu_ld_datafn_r[7:0]}) | + ({32{~lsu_pkt_r.unsign & lsu_pkt_r.half}} & {{16{ lsu_ld_datafn_r[15]}},lsu_ld_datafn_r[15:0]}) | + ({32{lsu_pkt_r.word}} & lsu_ld_datafn_r[31:0]); + + // this signal is used for gpr update + assign lsu_result_corr_r[31:0] = ({32{ lsu_pkt_r.unsign & lsu_pkt_r.by }} & {24'b0,lsu_ld_datafn_corr_r[7:0]}) | + ({32{ lsu_pkt_r.unsign & lsu_pkt_r.half}} & {16'b0,lsu_ld_datafn_corr_r[15:0]}) | + ({32{~lsu_pkt_r.unsign & lsu_pkt_r.by }} & {{24{ lsu_ld_datafn_corr_r[7]}}, lsu_ld_datafn_corr_r[7:0]}) | + ({32{~lsu_pkt_r.unsign & lsu_pkt_r.half}} & {{16{ lsu_ld_datafn_corr_r[15]}},lsu_ld_datafn_corr_r[15:0]}) | + ({32{lsu_pkt_r.word}} & lsu_ld_datafn_corr_r[31:0]); + + end else begin: L2U1_Plus1_0 // block: L2U1_Plus1_1 + logic [31:0] lsu_ld_datafn_m, lsu_ld_datafn_corr_r; + + assign lsu_ld_datafn_m[31:0] = addr_external_m ? bus_read_data_m[31:0] : lsu_ld_data_m[31:0]; + assign lsu_ld_datafn_corr_r[31:0] = addr_external_r ? bus_read_data_r[31:0] : lsu_ld_data_corr_r[31:0]; + + // this result must look at prior stores and merge them in + assign lsu_result_m[31:0] = ({32{ lsu_pkt_m.unsign & lsu_pkt_m.by }} & {24'b0,lsu_ld_datafn_m[7:0]}) | + ({32{ lsu_pkt_m.unsign & lsu_pkt_m.half}} & {16'b0,lsu_ld_datafn_m[15:0]}) | + ({32{~lsu_pkt_m.unsign & lsu_pkt_m.by }} & {{24{ lsu_ld_datafn_m[7]}}, lsu_ld_datafn_m[7:0]}) | + ({32{~lsu_pkt_m.unsign & lsu_pkt_m.half}} & {{16{ lsu_ld_datafn_m[15]}},lsu_ld_datafn_m[15:0]}) | + ({32{lsu_pkt_m.word}} & lsu_ld_datafn_m[31:0]); + + // this signal is used for gpr update + assign lsu_result_corr_r[31:0] = ({32{ lsu_pkt_r.unsign & lsu_pkt_r.by }} & {24'b0,lsu_ld_datafn_corr_r[7:0]}) | + ({32{ lsu_pkt_r.unsign & lsu_pkt_r.half}} & {16'b0,lsu_ld_datafn_corr_r[15:0]}) | + ({32{~lsu_pkt_r.unsign & lsu_pkt_r.by }} & {{24{ lsu_ld_datafn_corr_r[7]}}, lsu_ld_datafn_corr_r[7:0]}) | + ({32{~lsu_pkt_r.unsign & lsu_pkt_r.half}} & {{16{ lsu_ld_datafn_corr_r[15]}},lsu_ld_datafn_corr_r[15:0]}) | + ({32{lsu_pkt_r.word}} & lsu_ld_datafn_corr_r[31:0]); + end + + // Fast interrupt address + assign lsu_fir_addr[31:1] = lsu_ld_data_corr_r[31:1]; + + // absence load/store all 0's + assign lsu_addr_d[31:0] = full_addr_d[31:0]; + + // Interrupt as a flush source allows the WB to occur + assign lsu_commit_r = lsu_pkt_r.valid & (lsu_pkt_r.store | lsu_pkt_r.load) & ~flush_r & ~lsu_pkt_r.dma; + + assign dma_mem_wdata_shifted[63:0] = dma_mem_wdata[63:0] >> {dma_mem_addr[2:0], 3'b000}; // Shift the dma data to lower bits to make it consistent to lsu stores + assign store_data_d[31:0] = dma_dccm_req ? dma_mem_wdata_shifted[31:0] : exu_lsu_rs2_d[31:0]; // Write to PIC still happens in r stage + + assign store_data_m_in[31:0] = (lsu_pkt_d.store_data_bypass_d) ? lsu_result_m[31:0] : store_data_d[31:0]; + + assign store_data_m[31:0] = (picm_mask_data_m[31:0] | {32{~addr_in_pic_m}}) & ((lsu_pkt_m.store_data_bypass_m) ? lsu_result_m[31:0] : store_data_pre_m[31:0]); + + + rvdff #(32) sdmff (.*, .din(store_data_m_in[31:0]), .dout(store_data_pre_m[31:0]), .clk(lsu_store_c1_m_clk)); + + rvdff #(32) samff (.*, .din(lsu_addr_d[31:0]), .dout(lsu_addr_m[31:0]), .clk(lsu_c1_m_clk)); + rvdff #(32) sarff (.*, .din(lsu_addr_m[31:0]), .dout(lsu_addr_r[31:0]), .clk(lsu_c1_r_clk)); + + rvdff #(32) end_addr_mff (.*, .din(end_addr_d[31:0]), .dout(end_addr_m[31:0]), .clk(lsu_c1_m_clk)); + rvdff #(32) end_addr_rff (.*, .din(end_addr_m[31:0]), .dout(end_addr_r[31:0]), .clk(lsu_c1_r_clk)); + + rvdff #(1) addr_in_dccm_mff(.din(addr_in_dccm_d), .dout(addr_in_dccm_m), .clk(lsu_c1_m_clk), .*); + rvdff #(1) addr_in_dccm_rff(.din(addr_in_dccm_m), .dout(addr_in_dccm_r), .clk(lsu_c1_r_clk), .*); + + rvdff #(1) addr_in_pic_mff(.din(addr_in_pic_d), .dout(addr_in_pic_m), .clk(lsu_c1_m_clk), .*); + rvdff #(1) addr_in_pic_rff(.din(addr_in_pic_m), .dout(addr_in_pic_r), .clk(lsu_c1_r_clk), .*); + + rvdff #(1) addr_external_mff(.din(addr_external_d), .dout(addr_external_m), .clk(lsu_c1_m_clk), .*); + rvdff #(1) addr_external_rff(.din(addr_external_m), .dout(addr_external_r), .clk(lsu_c1_r_clk), .*); + + rvdff #(1) access_fault_mff (.din(access_fault_d), .dout(access_fault_m), .clk(lsu_c1_m_clk), .*); + rvdff #(1) misaligned_fault_mff (.din(misaligned_fault_d), .dout(misaligned_fault_m), .clk(lsu_c1_m_clk), .*); + rvdff #(3) exc_mscause_mff (.din(exc_mscause_d[2:0]), .dout(exc_mscause_m[2:0]), .clk(lsu_c1_m_clk), .*); + + rvdff #(1) fir_dccm_access_error_mff (.din(fir_dccm_access_error_d), .dout(fir_dccm_access_error_m), .clk(lsu_c1_m_clk), .*); + rvdff #(1) fir_nondccm_access_error_mff (.din(fir_nondccm_access_error_d), .dout(fir_nondccm_access_error_m), .clk(lsu_c1_m_clk), .*); + + rvdff #(32) bus_read_data_r_ff (.*, .din(bus_read_data_m[31:0]), .dout(bus_read_data_r[31:0]), .clk(lsu_c1_r_clk)); + +endmodule diff --git a/design/lsu/el2_lsu_stbuf.sv b/design/lsu/el2_lsu_stbuf.sv new file mode 100644 index 0000000..79f339c --- /dev/null +++ b/design/lsu/el2_lsu_stbuf.sv @@ -0,0 +1,350 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright 2020 Western Digital Corporation or it's affiliates. +// +// 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. + +//******************************************************************************** +// $Id$ +// +// +// Owner: +// Function: Store Buffer +// Comments: Dual writes and single drain +// +// +// DC1 -> DC2 -> DC3 -> DC4 (Commit) +// +// //******************************************************************************** + + +module el2_lsu_stbuf +import el2_pkg::*; +#( +`include "el2_param.vh" + ) +( + input logic clk, // core clock + input logic rst_l, // reset + + input logic lsu_c1_m_clk, // clock + input logic lsu_c1_r_clk, // lsu pipe clock + input logic lsu_stbuf_c1_clk, // stbuf clock + input logic lsu_free_c2_clk, // free clk + + // Store Buffer input + input logic store_stbuf_reqvld_r, // core instruction goes to stbuf + input logic lsu_commit_r, // lsu commits + input logic dec_lsu_valid_raw_d, // Speculative decode valid + input logic [pt.DCCM_DATA_WIDTH-1:0] store_data_hi_r, // merged data from the dccm for stores. This is used for fwding + input logic [pt.DCCM_DATA_WIDTH-1:0] store_data_lo_r, // merged data from the dccm for stores. This is used for fwding + input logic [pt.DCCM_DATA_WIDTH-1:0] store_datafn_hi_r, // merged data from the dccm for stores + input logic [pt.DCCM_DATA_WIDTH-1:0] store_datafn_lo_r, // merged data from the dccm for stores + + // Store Buffer output + output logic stbuf_reqvld_any, // stbuf is draining + output logic stbuf_reqvld_flushed_any, // Top entry is flushed + output logic [pt.LSU_SB_BITS-1:0] stbuf_addr_any, // address + output logic [pt.DCCM_DATA_WIDTH-1:0] stbuf_data_any, // stbuf data + + input logic lsu_stbuf_commit_any, // pop the stbuf as it commite + output logic lsu_stbuf_full_any, // stbuf is full + output logic lsu_stbuf_empty_any, // stbuf is empty + output logic ldst_stbuf_reqvld_r, // needed for clocking + + input logic [pt.LSU_SB_BITS-1:0] lsu_addr_d, // lsu address + input logic [31:0] lsu_addr_m, + input logic [31:0] lsu_addr_r, + + input logic [pt.LSU_SB_BITS-1:0] end_addr_d, // lsu end addrress - needed to check unaligned + input logic [31:0] end_addr_m, + input logic [31:0] end_addr_r, + + input logic addr_in_dccm_m, // address is in dccm + input logic addr_in_dccm_r, // address is in dccm + + // Forwarding signals + input logic lsu_cmpen_m, // needed for forwarding stbuf - load + input el2_lsu_pkt_t lsu_pkt_m, + input el2_lsu_pkt_t lsu_pkt_r, + + output logic [pt.DCCM_DATA_WIDTH-1:0] stbuf_fwddata_hi_m, // stbuf data + output logic [pt.DCCM_DATA_WIDTH-1:0] stbuf_fwddata_lo_m, + output logic [pt.DCCM_BYTE_WIDTH-1:0] stbuf_fwdbyteen_hi_m, + output logic [pt.DCCM_BYTE_WIDTH-1:0] stbuf_fwdbyteen_lo_m, + + input logic scan_mode + +); + + + localparam DEPTH = pt.LSU_STBUF_DEPTH; + localparam DATA_WIDTH = pt.DCCM_DATA_WIDTH; + localparam BYTE_WIDTH = pt.DCCM_BYTE_WIDTH; + localparam DEPTH_LOG2 = $clog2(DEPTH); + + // These are the fields in the store queue + logic [DEPTH-1:0] stbuf_vld; + logic [DEPTH-1:0] stbuf_dma_kill; + logic [DEPTH-1:0][pt.LSU_SB_BITS-1:0] stbuf_addr; + logic [DEPTH-1:0][BYTE_WIDTH-1:0] stbuf_byteen; + logic [DEPTH-1:0][DATA_WIDTH-1:0] stbuf_data; + + logic [DEPTH-1:0] sel_lo; + logic [DEPTH-1:0] stbuf_wr_en; + logic [DEPTH-1:0] stbuf_dma_kill_en; + logic [DEPTH-1:0] stbuf_reset; + logic [DEPTH-1:0][pt.LSU_SB_BITS-1:0] stbuf_addrin; + logic [DEPTH-1:0][DATA_WIDTH-1:0] stbuf_datain; + logic [DEPTH-1:0][BYTE_WIDTH-1:0] stbuf_byteenin; + + logic [7:0] store_byteen_ext_r; + logic [BYTE_WIDTH-1:0] store_byteen_hi_r; + logic [BYTE_WIDTH-1:0] store_byteen_lo_r; + + logic WrPtrEn, RdPtrEn; + logic [DEPTH_LOG2-1:0] WrPtr, RdPtr; + logic [DEPTH_LOG2-1:0] NxtWrPtr, NxtRdPtr; + logic [DEPTH_LOG2-1:0] WrPtrPlus1, WrPtrPlus2, RdPtrPlus1; + logic ldst_dual_d, ldst_dual_m, ldst_dual_r; + + logic dual_stbuf_write_r; + + logic isdccmst_m, isdccmst_r; + logic [3:0] stbuf_numvld_any, stbuf_specvld_any; + logic [1:0] stbuf_specvld_m, stbuf_specvld_r;//, stbuf_eccvld_m, stbuf_eccvld_r; + + logic cmpen_hi_m, cmpen_lo_m; + logic [pt.LSU_SB_BITS-1:$clog2(BYTE_WIDTH)] cmpaddr_hi_m, cmpaddr_lo_m; + + // variables to detect matching from the store queue + logic [DEPTH-1:0] stbuf_match_hi, stbuf_match_lo; + logic [DEPTH-1:0][BYTE_WIDTH-1:0] stbuf_fwdbyteenvec_hi, stbuf_fwdbyteenvec_lo; + logic [DATA_WIDTH-1:0] stbuf_fwddata_hi_pre_m, stbuf_fwddata_lo_pre_m; + logic [BYTE_WIDTH-1:0] stbuf_fwdbyteen_hi_pre_m, stbuf_fwdbyteen_lo_pre_m; + + // logic to detect matching from the pipe - needed for store - load forwarding + logic [BYTE_WIDTH-1:0] ld_byte_rhit_lo_lo, ld_byte_rhit_hi_lo, ld_byte_rhit_lo_hi, ld_byte_rhit_hi_hi; + logic ld_addr_rhit_lo_lo, ld_addr_rhit_hi_lo, ld_addr_rhit_lo_hi, ld_addr_rhit_hi_hi; + + logic [BYTE_WIDTH-1:0] ld_byte_hit_lo, ld_byte_rhit_lo; + logic [BYTE_WIDTH-1:0] ld_byte_hit_hi, ld_byte_rhit_hi; + + logic [BYTE_WIDTH-1:0] ldst_byteen_hi_r; + logic [BYTE_WIDTH-1:0] ldst_byteen_lo_r; + // byte_en flowing down + logic [7:0] ldst_byteen_r; + logic [7:0] ldst_byteen_ext_r; + // fwd data through the pipe + logic [31:0] ld_fwddata_rpipe_lo; + logic [31:0] ld_fwddata_rpipe_hi; + + // coalescing signals + logic [DEPTH-1:0] store_matchvec_lo_r, store_matchvec_hi_r; + logic store_coalesce_lo_r, store_coalesce_hi_r; + + //---------------------------------------- + // Logic starts here + //---------------------------------------- + // Create high/low byte enables + assign store_byteen_ext_r[7:0] = ldst_byteen_r[7:0] << lsu_addr_r[1:0]; + assign store_byteen_hi_r[BYTE_WIDTH-1:0] = store_byteen_ext_r[7:4] & {4{lsu_pkt_r.store}}; + assign store_byteen_lo_r[BYTE_WIDTH-1:0] = store_byteen_ext_r[3:0] & {4{lsu_pkt_r.store}}; + + assign RdPtrPlus1[DEPTH_LOG2-1:0] = RdPtr[DEPTH_LOG2-1:0] + 1'b1; + assign WrPtrPlus1[DEPTH_LOG2-1:0] = WrPtr[DEPTH_LOG2-1:0] + 1'b1; + assign WrPtrPlus2[DEPTH_LOG2-1:0] = WrPtr[DEPTH_LOG2-1:0] + 2'b10; + + // ecc error on both hi/lo + assign ldst_dual_d = (lsu_addr_d[2] != end_addr_d[2]); + assign dual_stbuf_write_r = ldst_dual_r & store_stbuf_reqvld_r; + assign ldst_stbuf_reqvld_r = (lsu_commit_r & store_stbuf_reqvld_r); //| + + // Store Buffer coalescing + for (genvar i=0; i<32'(DEPTH); i++) begin: FindMatchEntry + assign store_matchvec_lo_r[i] = (stbuf_addr[i][pt.LSU_SB_BITS-1:$clog2(BYTE_WIDTH)] == lsu_addr_r[pt.LSU_SB_BITS-1:$clog2(BYTE_WIDTH)]) & stbuf_vld[i] & ~stbuf_dma_kill[i] & ~stbuf_reset[i]; + assign store_matchvec_hi_r[i] = (stbuf_addr[i][pt.LSU_SB_BITS-1:$clog2(BYTE_WIDTH)] == end_addr_r[pt.LSU_SB_BITS-1:$clog2(BYTE_WIDTH)]) & stbuf_vld[i] & ~stbuf_dma_kill[i] & dual_stbuf_write_r & ~stbuf_reset[i]; + end: FindMatchEntry + + assign store_coalesce_lo_r = |store_matchvec_lo_r[DEPTH-1:0]; + assign store_coalesce_hi_r = |store_matchvec_hi_r[DEPTH-1:0]; + + + // Allocate new in this entry if : + // 1. wrptr, single allocate, lo did not coalesce + // 2. wrptr, double allocate, lo ^ hi coalesced + // 3. wrptr + 1, double alloacte, niether lo or hi coalesced + // Also update if there is a hi or a lo coalesce to this entry + // Store Buffer instantiation + for (genvar i=0; i<32'(DEPTH); i++) begin: GenStBuf + assign stbuf_wr_en[i] = ldst_stbuf_reqvld_r & ( + ( (i == WrPtr[DEPTH_LOG2-1:0]) & ~store_coalesce_lo_r) | // Allocate : new Lo + ( (i == WrPtr[DEPTH_LOG2-1:0]) & dual_stbuf_write_r & ~store_coalesce_hi_r) | // Allocate : only 1 new Write Either + ( (i == WrPtrPlus1[DEPTH_LOG2-1:0]) & dual_stbuf_write_r & ~(store_coalesce_lo_r | store_coalesce_hi_r)) | // Allocate2 : 2 new so Write Hi + store_matchvec_lo_r[i] | store_matchvec_hi_r[i]); // Coalesced Write Lo or Hi + assign stbuf_reset[i] = (lsu_stbuf_commit_any | stbuf_reqvld_flushed_any) & (i == RdPtr[DEPTH_LOG2-1:0]); + + // Mux select for start/end address + assign sel_lo[i] = ((~ldst_dual_r | store_stbuf_reqvld_r) & (i == WrPtr[DEPTH_LOG2-1:0]) & ~store_coalesce_lo_r) | // lo allocated new entry + store_matchvec_lo_r[i]; // lo coalesced in to this entry + assign stbuf_addrin[i][pt.LSU_SB_BITS-1:0] = sel_lo[i] ? lsu_addr_r[pt.LSU_SB_BITS-1:0] : end_addr_r[pt.LSU_SB_BITS-1:0]; + assign stbuf_byteenin[i][BYTE_WIDTH-1:0] = sel_lo[i] ? (stbuf_byteen[i][BYTE_WIDTH-1:0] | store_byteen_lo_r[BYTE_WIDTH-1:0]) : (stbuf_byteen[i][BYTE_WIDTH-1:0] | store_byteen_hi_r[BYTE_WIDTH-1:0]); + assign stbuf_datain[i][7:0] = sel_lo[i] ? ((~stbuf_byteen[i][0] | store_byteen_lo_r[0]) ? store_datafn_lo_r[7:0] : stbuf_data[i][7:0]) : + ((~stbuf_byteen[i][0] | store_byteen_hi_r[0]) ? store_datafn_hi_r[7:0] : stbuf_data[i][7:0]); + assign stbuf_datain[i][15:8] = sel_lo[i] ? ((~stbuf_byteen[i][1] | store_byteen_lo_r[1]) ? store_datafn_lo_r[15:8] : stbuf_data[i][15:8]) : + ((~stbuf_byteen[i][1] | store_byteen_hi_r[1]) ? store_datafn_hi_r[15:8] : stbuf_data[i][15:8]); + assign stbuf_datain[i][23:16] = sel_lo[i] ? ((~stbuf_byteen[i][2] | store_byteen_lo_r[2]) ? store_datafn_lo_r[23:16] : stbuf_data[i][23:16]) : + ((~stbuf_byteen[i][2] | store_byteen_hi_r[2]) ? store_datafn_hi_r[23:16] : stbuf_data[i][23:16]); + assign stbuf_datain[i][31:24] = sel_lo[i] ? ((~stbuf_byteen[i][3] | store_byteen_lo_r[3]) ? store_datafn_lo_r[31:24] : stbuf_data[i][31:24]) : + ((~stbuf_byteen[i][3] | store_byteen_hi_r[3]) ? store_datafn_hi_r[31:24] : stbuf_data[i][31:24]); + + rvdffsc #(.WIDTH(1)) stbuf_vldff (.din(1'b1), .dout(stbuf_vld[i]), .en(stbuf_wr_en[i]), .clear(stbuf_reset[i]), .clk(lsu_free_c2_clk), .*); + rvdffsc #(.WIDTH(1)) stbuf_killff (.din(1'b1), .dout(stbuf_dma_kill[i]), .en(stbuf_dma_kill_en[i]), .clear(stbuf_reset[i]), .clk(lsu_free_c2_clk), .*); + rvdffe #(.WIDTH(pt.LSU_SB_BITS)) stbuf_addrff (.din(stbuf_addrin[i][pt.LSU_SB_BITS-1:0]), .dout(stbuf_addr[i][pt.LSU_SB_BITS-1:0]), .en(stbuf_wr_en[i]), .*); + rvdffsc #(.WIDTH(BYTE_WIDTH)) stbuf_byteenff (.din(stbuf_byteenin[i][BYTE_WIDTH-1:0]), .dout(stbuf_byteen[i][BYTE_WIDTH-1:0]), .en(stbuf_wr_en[i]), .clear(stbuf_reset[i]), .clk(lsu_stbuf_c1_clk), .*); + rvdffe #(.WIDTH(DATA_WIDTH)) stbuf_dataff (.din(stbuf_datain[i][DATA_WIDTH-1:0]), .dout(stbuf_data[i][DATA_WIDTH-1:0]), .en(stbuf_wr_en[i]), .*); + end + + rvdff #(.WIDTH(1)) ldst_dual_mff (.din(ldst_dual_d), .dout(ldst_dual_m), .clk(lsu_c1_m_clk), .*); + rvdff #(.WIDTH(1)) ldst_dual_rff (.din(ldst_dual_m), .dout(ldst_dual_r), .clk(lsu_c1_r_clk), .*); + + // Store Buffer drain logic + assign stbuf_reqvld_flushed_any = stbuf_vld[RdPtr] & stbuf_dma_kill[RdPtr]; + assign stbuf_reqvld_any = stbuf_vld[RdPtr] & ~stbuf_dma_kill[RdPtr] & ~(|stbuf_dma_kill_en[DEPTH-1:0]); // Don't drain if some kill bit is being set this cycle + assign stbuf_addr_any[pt.LSU_SB_BITS-1:0] = stbuf_addr[RdPtr][pt.LSU_SB_BITS-1:0]; + assign stbuf_data_any[DATA_WIDTH-1:0] = stbuf_data[RdPtr][DATA_WIDTH-1:0]; + + // Update the RdPtr/WrPtr logic + // Need to revert the WrPtr for flush cases. Also revert the pipe WrPtrs + assign WrPtrEn = (ldst_stbuf_reqvld_r & ~dual_stbuf_write_r & ~(store_coalesce_hi_r | store_coalesce_lo_r)) | // writing 1 and did not coalesce + (ldst_stbuf_reqvld_r & dual_stbuf_write_r & ~(store_coalesce_hi_r & store_coalesce_lo_r)); // writing 2 and atleast 1 did not coalesce + assign NxtWrPtr[DEPTH_LOG2-1:0] = (ldst_stbuf_reqvld_r & dual_stbuf_write_r & ~(store_coalesce_hi_r | store_coalesce_lo_r)) ? WrPtrPlus2[DEPTH_LOG2-1:0] : WrPtrPlus1[DEPTH_LOG2-1:0]; + assign RdPtrEn = lsu_stbuf_commit_any | stbuf_reqvld_flushed_any; + assign NxtRdPtr[DEPTH_LOG2-1:0] = RdPtrPlus1[DEPTH_LOG2-1:0]; + + always_comb begin + stbuf_numvld_any[3:0] = '0; + for (int i=0; i<32'(DEPTH); i++) begin + stbuf_numvld_any[3:0] += {3'b0, stbuf_vld[i]}; + end + end + + // These go to store buffer to detect full + assign isdccmst_m = lsu_pkt_m.valid & lsu_pkt_m.store & addr_in_dccm_m & ~lsu_pkt_m.dma; + assign isdccmst_r = lsu_pkt_r.valid & lsu_pkt_r.store & addr_in_dccm_r & ~lsu_pkt_r.dma; + + assign stbuf_specvld_m[1:0] = {1'b0,isdccmst_m} << (isdccmst_m & ldst_dual_m); + assign stbuf_specvld_r[1:0] = {1'b0,isdccmst_r} << (isdccmst_r & ldst_dual_r); + assign stbuf_specvld_any[3:0] = stbuf_numvld_any[3:0] + {2'b0, stbuf_specvld_m[1:0]} + {2'b0, stbuf_specvld_r[1:0]}; + + assign lsu_stbuf_full_any = (~ldst_dual_d & dec_lsu_valid_raw_d) ? (stbuf_specvld_any[3:0] >= DEPTH) : (stbuf_specvld_any[3:0] >= (DEPTH-1)); + assign lsu_stbuf_empty_any = (stbuf_numvld_any[3:0] == 4'b0); + + // Load forwarding logic from the store queue + assign cmpen_hi_m = lsu_cmpen_m & ldst_dual_m; + assign cmpaddr_hi_m[pt.LSU_SB_BITS-1:$clog2(BYTE_WIDTH)] = end_addr_m[pt.LSU_SB_BITS-1:$clog2(BYTE_WIDTH)]; + + assign cmpen_lo_m = lsu_cmpen_m; + assign cmpaddr_lo_m[pt.LSU_SB_BITS-1:$clog2(BYTE_WIDTH)] = lsu_addr_m[pt.LSU_SB_BITS-1:$clog2(BYTE_WIDTH)]; + + always_comb begin: GenLdFwd + stbuf_fwdbyteen_hi_pre_m[BYTE_WIDTH-1:0] = '0; + stbuf_fwdbyteen_lo_pre_m[BYTE_WIDTH-1:0] = '0; + + for (int i=0; i<32'(DEPTH); i++) begin + stbuf_match_hi[i] = (stbuf_addr[i][pt.LSU_SB_BITS-1:$clog2(BYTE_WIDTH)] == cmpaddr_hi_m[pt.LSU_SB_BITS-1:$clog2(BYTE_WIDTH)]) & stbuf_vld[i] & ~stbuf_dma_kill[i] & addr_in_dccm_m; + stbuf_match_lo[i] = (stbuf_addr[i][pt.LSU_SB_BITS-1:$clog2(BYTE_WIDTH)] == cmpaddr_lo_m[pt.LSU_SB_BITS-1:$clog2(BYTE_WIDTH)]) & stbuf_vld[i] & ~stbuf_dma_kill[i] & addr_in_dccm_m; + + // Kill the store buffer entry if there is a dma store since it already updated the dccm + stbuf_dma_kill_en[i] = (stbuf_match_hi[i] | stbuf_match_lo[i]) & lsu_pkt_m.valid & lsu_pkt_m.dma & lsu_pkt_m.store; + + for (int j=0; j<32'(BYTE_WIDTH); j++) begin + stbuf_fwdbyteenvec_hi[i][j] = stbuf_match_hi[i] & stbuf_byteen[i][j] & stbuf_vld[i]; + stbuf_fwdbyteen_hi_pre_m[j] |= stbuf_fwdbyteenvec_hi[i][j]; + + stbuf_fwdbyteenvec_lo[i][j] = stbuf_match_lo[i] & stbuf_byteen[i][j] & stbuf_vld[i]; + stbuf_fwdbyteen_lo_pre_m[j] |= stbuf_fwdbyteenvec_lo[i][j]; + end + end + end // block: GenLdFwd + + always_comb begin: GenLdData + stbuf_fwddata_hi_pre_m[31:0] = '0; + stbuf_fwddata_lo_pre_m[31:0] = '0; + + for (int i=0; i<32'(DEPTH); i++) begin + stbuf_fwddata_hi_pre_m[31:0] |= {32{stbuf_match_hi[i]}} & stbuf_data[i][31:0]; + stbuf_fwddata_lo_pre_m[31:0] |= {32{stbuf_match_lo[i]}} & stbuf_data[i][31:0]; + + end + + end // block: GenLdData + + // Create Hi/Lo signals - needed for the pipe forwarding + assign ldst_byteen_r[7:0] = ({8{lsu_pkt_r.by}} & 8'b0000_0001) | + ({8{lsu_pkt_r.half}} & 8'b0000_0011) | + ({8{lsu_pkt_r.word}} & 8'b0000_1111) | + ({8{lsu_pkt_r.dword}} & 8'b1111_1111); + + assign ldst_byteen_ext_r[7:0] = ldst_byteen_r[7:0] << lsu_addr_r[1:0]; + + assign ldst_byteen_hi_r[3:0] = ldst_byteen_ext_r[7:4]; + assign ldst_byteen_lo_r[3:0] = ldst_byteen_ext_r[3:0]; + + assign ld_addr_rhit_lo_lo = (lsu_addr_m[31:2] == lsu_addr_r[31:2]) & lsu_pkt_r.valid & lsu_pkt_r.store & ~lsu_pkt_r.dma; + assign ld_addr_rhit_lo_hi = (end_addr_m[31:2] == lsu_addr_r[31:2]) & lsu_pkt_r.valid & lsu_pkt_r.store & ~lsu_pkt_r.dma; + assign ld_addr_rhit_hi_lo = (lsu_addr_m[31:2] == end_addr_r[31:2]) & lsu_pkt_r.valid & lsu_pkt_r.store & ~lsu_pkt_r.dma & dual_stbuf_write_r; + assign ld_addr_rhit_hi_hi = (end_addr_m[31:2] == end_addr_r[31:2]) & lsu_pkt_r.valid & lsu_pkt_r.store & ~lsu_pkt_r.dma & dual_stbuf_write_r; + + for (genvar i=0; i<32'(BYTE_WIDTH); i++) begin + assign ld_byte_rhit_lo_lo[i] = ld_addr_rhit_lo_lo & ldst_byteen_lo_r[i]; + assign ld_byte_rhit_lo_hi[i] = ld_addr_rhit_lo_hi & ldst_byteen_lo_r[i]; + assign ld_byte_rhit_hi_lo[i] = ld_addr_rhit_hi_lo & ldst_byteen_hi_r[i]; + assign ld_byte_rhit_hi_hi[i] = ld_addr_rhit_hi_hi & ldst_byteen_hi_r[i]; + + assign ld_byte_rhit_lo[i] = ld_byte_rhit_lo_lo[i] | ld_byte_rhit_hi_lo[i]; + assign ld_byte_rhit_hi[i] = ld_byte_rhit_lo_hi[i] | ld_byte_rhit_hi_hi[i]; + + assign ld_fwddata_rpipe_lo[(8*i)+7:(8*i)] = ({8{ld_byte_rhit_lo_lo[i]}} & store_data_lo_r[(8*i)+7:(8*i)]) | + ({8{ld_byte_rhit_hi_lo[i]}} & store_data_hi_r[(8*i)+7:(8*i)]); + + assign ld_fwddata_rpipe_hi[(8*i)+7:(8*i)] = ({8{ld_byte_rhit_lo_hi[i]}} & store_data_lo_r[(8*i)+7:(8*i)]) | + ({8{ld_byte_rhit_hi_hi[i]}} & store_data_hi_r[(8*i)+7:(8*i)]); + + assign ld_byte_hit_lo[i] = ld_byte_rhit_lo_lo[i] | ld_byte_rhit_hi_lo[i]; + assign ld_byte_hit_hi[i] = ld_byte_rhit_lo_hi[i] | ld_byte_rhit_hi_hi[i]; + + assign stbuf_fwdbyteen_hi_m[i] = ld_byte_hit_hi[i] | stbuf_fwdbyteen_hi_pre_m[i]; + assign stbuf_fwdbyteen_lo_m[i] = ld_byte_hit_lo[i] | stbuf_fwdbyteen_lo_pre_m[i]; + // // Pipe vs Store Queue priority + assign stbuf_fwddata_lo_m[(8*i)+7:(8*i)] = ld_byte_rhit_lo[i] ? ld_fwddata_rpipe_lo[(8*i)+7:(8*i)] : stbuf_fwddata_lo_pre_m[(8*i)+7:(8*i)]; + // // Pipe vs Store Queue priority + assign stbuf_fwddata_hi_m[(8*i)+7:(8*i)] = ld_byte_rhit_hi[i] ? ld_fwddata_rpipe_hi[(8*i)+7:(8*i)] : stbuf_fwddata_hi_pre_m[(8*i)+7:(8*i)]; + end + + // Flops + rvdffs #(.WIDTH(DEPTH_LOG2)) WrPtrff (.din(NxtWrPtr[DEPTH_LOG2-1:0]), .dout(WrPtr[DEPTH_LOG2-1:0]), .en(WrPtrEn), .clk(lsu_stbuf_c1_clk), .*); + rvdffs #(.WIDTH(DEPTH_LOG2)) RdPtrff (.din(NxtRdPtr[DEPTH_LOG2-1:0]), .dout(RdPtr[DEPTH_LOG2-1:0]), .en(RdPtrEn), .clk(lsu_stbuf_c1_clk), .*); + +`ifdef ASSERT_ON + + assert_stbuf_overflow: assert #0 (stbuf_specvld_any[2:0] <= DEPTH); + property stbuf_wren_store_dccm; + @(posedge clk) disable iff(~rst_l) (|stbuf_wr_en[DEPTH-1:0]) |-> (lsu_pkt_r.valid & lsu_pkt_r.store & addr_in_dccm_r & ~lsu_pkt_r.dma); + endproperty + assert_stbuf_wren_store_dccm: assert property (stbuf_wren_store_dccm) else + $display("Illegal store buffer write"); + +`endif + +endmodule + diff --git a/design/lsu/el2_lsu_trigger.sv b/design/lsu/el2_lsu_trigger.sv new file mode 100644 index 0000000..ab506f3 --- /dev/null +++ b/design/lsu/el2_lsu_trigger.sv @@ -0,0 +1,58 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright 2020 Western Digital Corporation or it's affiliates. +// +// 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. + +//******************************************************************************** +// $Id$ +// +// +// Owner: +// Function: LSU Trigger logic +// Comments: +// +//******************************************************************************** +module el2_lsu_trigger +import el2_pkg::*; +#( +`include "el2_param.vh" + )( + input el2_trigger_pkt_t [3:0] trigger_pkt_any, // trigger packet from dec + input el2_lsu_pkt_t lsu_pkt_m, // lsu packet + input logic [31:0] lsu_addr_m, // address + input logic [31:0] store_data_m, // store data + + output logic [3:0] lsu_trigger_match_m // match result +); + + logic [3:0][31:0] lsu_match_data; + logic [3:0] lsu_trigger_data_match; + logic [31:0] store_data_trigger_m; + + assign store_data_trigger_m[31:0] = {({16{lsu_pkt_m.word}} & store_data_m[31:16]),({8{(lsu_pkt_m.half | lsu_pkt_m.word)}} & store_data_m[15:8]), store_data_m[7:0]}; + + + for (genvar i=0; i<4; i++) begin + assign lsu_match_data[i][31:0] = ({32{~trigger_pkt_any[i].select}} & lsu_addr_m[31:0]) | + ({32{trigger_pkt_any[i].select & trigger_pkt_any[i].store}} & store_data_trigger_m[31:0]); + + + rvmaskandmatch trigger_match (.mask(trigger_pkt_any[i].tdata2[31:0]), .data(lsu_match_data[i][31:0]), .masken(trigger_pkt_any[i].match), .match(lsu_trigger_data_match[i])); + + assign lsu_trigger_match_m[i] = lsu_pkt_m.valid & ~lsu_pkt_m.dma & + ((trigger_pkt_any[i].store & lsu_pkt_m.store) | (trigger_pkt_any[i].load & lsu_pkt_m.load & ~trigger_pkt_any[i].select)) & + lsu_trigger_data_match[i]; + end + + +endmodule // el2_lsu_trigger diff --git a/docs/RISC-V SweRV EL2 PRM.pdf b/docs/RISC-V SweRV EL2 PRM.pdf new file mode 100755 index 0000000000000000000000000000000000000000..95730d964ca5390299692439f6e8fc9822d55e63 GIT binary patch literal 2051374 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 z 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
TkJ}%FLEBDc#Wl8dyo`a+)H4=ei;J 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

py3~>NBdAcRi<`mgd_-tnvZV0w?{Nl$K z)L@e2JPs7Ma|F0L61x`hxMH-Suo85^ljB6t?L(;o#Y1~S9r7HIW#forS3+%3Wg1Rt z+h&HwjEtp*XMOAs4+{dU2Hi%iMsX|DjU~32x%xxvOsY~{B2|iOGIWpfaV;+;vToop zZ6!7}_!(YOPrqO4A2gB_z`?GB;^di*fIo;QOei9;Od>MpB%z!te(i$#@HF5r4NjxG zFA&gbu-u^BF!!nFc0M(|$^*sCl+3w1>5v_-?bveWtT^MO<3k5poaj5g!9S20;nBOy z-_2W(qU?azE|@ZaI52e6_ww|p#8&4&XJD1P_KE5d_Q`zyi~u+jphsn=l#Rvbzu}so z!L8P~YC%^HMm-_`my+Aj{V>sFMpYz>$GJd z0qQ9#%k(xM(RMo#=)6uOcYW(l!!-o zdAy$EM?(NNTtqT)qA}Q zqNpc?Gdy0oF}@%vE_f<4pJ!eQyhS%d!=haiQQD9j?~0phQ} zKP%Q6$LYT!p>8VpY0FkJvC_oGXk{Fp#y4i)cp$Nki=z>f@*E+u;%o*xLqMQI&Q+^; z_-{KtQ$tB@o1lSrCwe2ak8H3GOyj+Nls4`rf}T{fUb|81Xt*dL zwf81GH*bmUvXxBkOUgIKOV+h9kv}e@*E94!rWo}myf$Z!tIxYcMNyg8I%?9h8*^xBC75_R%P(-(;inGCcI{0 zP(E9@+>WAz)G^f;aYy9ib*06Al}H)3sd`4Fal;mdR9xMjLdMW^P7uaqjqvut%NvT9ZJzXP~geXz$3;}rkCL#V+fEe9!WO_?1*w9|-8pF}9~4Gj1x zV$yA7DPi&Sd;jO|8e0sNb!%w#Z!{2TVc6P)bYEG(RmLDBaha}z$Eb8rQp*;lttSvG z!t=b51mb3lRyvUc03&0$*w|Sq-(4#~Khc_OezInoE|oxOVD1n{Um~4_2u2JoU5h1z$TRc2i%Y|GD*q)(8c{$T|#Q5*Ni zW#3f1^=Bm|kOas1pEAV0bcAZ#PB$L=*(8~5qC&%7IY9hg*s?R5s8D3aZCHsMCngyL z)V10>4<(QGmp~*=_0GcA_HCJB1m%yLeyg7H*fdWQEb4qf7IA31da8*VY)NCKNIi2i z*8=1$)y%o7=Oy+p&HBLt()61=^WV_0iytO@N%+`kQ3nO#T)=oExBQf^Ibr&&VaATy zuIKaFZHCx_o9Zy24^nR$X%#iFCl^g}@Rh2ZTSj07k~0J@Bt6ARv1;neqUgDepGAR zreSkmWtdK*Yx=bjHDPxBlb#$j{x}T7Mg`_w?At^i62Y+>T21l2DD!vZ%%pxBFe*dj z0srA94Sl~?`_&e!Osl8O`pCsLThxJY+G|+Cpd%-;tB|jD7jtu~3QNp;-g;Q$ELqXK z%z(Yb5gaz0T6#he?Z{KsFprurtlo?ev8Pw~CEG&Xzc`QlW-kBT_WhmJtSX~t3e>m% z54!VbD_aXjd7#}pr&%9p$HT)Y>TEBjV6STrd~b^>a1#GclI7!L{M#SC_ljHS8Ufh> z@9ydM&u_HRKRTEI#O&{%KXttGdYS$pmj3OE_w;j2fAF9G*1`VX@f)R9{`~>Jv47w1 z{+XHhH~;)QMVg8DZxrD7FaID7|91D^oYHK>EFA9~@!t~2N$J|#n!NLg0Sxba@!vVa z?-wz=lZ!ci``3RvDgCv{&-8vA`;B1ypC08|HF2vIc8oS;z?-)ibq8Q2QJ%B21_n znHw|?Wrr>bt-Wh@x3+CB9Hi}iv^x9LZHaXB$Av!xT?d&55(K!#LLIxJXT6NuUK}VP zDLellgsw~ZgutGdrRZa=o=&dn6eey>D67&?HAb!qZbJSsf0#T;YF`2Xa~cN(d&Lv3 zm;jdn@+5|6bwE|Df6LUiNQXJTPw)`I0P__7GR`Xi2UWn@bpeMEeo{Zn{&T6lRsa*m z-u_-q#l6oo(@)0_V%cKH$i$i=I+tzZNvmq0wch*%)|37PYcOXU%rk&P6T7ah&q3e* zTo7%i?gn~e34?0)>*AJFBQs$J4Hg2I(2c7`xepz~rbZP#h38{v**g6Ps-uh{styD_ zn-KULkbxgS5FT2*&{U|UHcc0~wC$ri`9=tjOz?!l$dNj6BIcP%P(MSDX}LxAMZ#ya zKx_fu^OvScckXJ!P2RiW<@XAwqh~hqvEcI4=P+1O83qBIgA44vR$0P`A>bz8Z%d&C zzf0C#KbEnA5hm+E+!>S@6ja`RaCTXTkOA7w%MdirLF#WvQ@Ui&t08)zo>XrCAaQ(V z?Q`uZ=Le$6?Z(KfUt}eJmbv3K*{q)8tZQ4qP?yr(6b1?Vg~9>_Y92Cc-t1Z~=6PGd z2}X9&Yh;aKos8+i*YjQ9x+o|@@otJXcfS6*B^kj2xm=SUO7zM110K#XB2SXvjiOZJZ5lOS`u#E`U7hNfb5v;u)g4IkFlxN#zs&(mj~o@ z-N{IkDE#(96L@HWX-dw3CgWFnb=H$)J}RDoT~)@E0j&@G?az@e_9nN!Ac4~&_?M+R zMvnAF+21C*VGP3^;ugi~TKj8P3e85vIFV>Yi*@r3;)Ub`_VfjV$G_mPfRT%iz{;}e z%%=i`NT{k!mJR`?8L}iHu)`e+!#xaqaq?JBiV>cfpTfgIhRY;E5923~pf^4^^)U8z zjM{vi;Aq6CSC1{>?vu1cl087lVQRz`*0(*F$ziH87h2!ZAv$F}pqjKg?&L=yvYkRK z6KQIMy7HL>3wD}F_?Z2(oDAP2NNRq>?fGar$Z@I>b{_TWMu2;jYbP!!D34ye{3$k8}X339|Q(3E6|CvL9Q9HBa&>2R! zLOO_cL5Lc8UjZZE?q&9yPz>s1Nn2TV7>F*5j>^F@t`512E)7Y8CwUwm^cuLxeoY(D zNx?m_3K65JPS}nMKvTdY| z&Wx~I{4k_7b!)34G{yB{s-4bhSK)EYe^zEIaxuN^NPE#I;jFP*YD>--`SiOhzGwP% zh%#KH3EBNG^;g-q=2WP!HARuZiv7xTH9gtB$ zO4rWpU3>mb&zYFNU%>btm17SS0ltS30U0HMmPYo*?gi-fL&jGCB|!If zKqxUcPtXGX2BmE7?d=Y~QgIrL?IK72Qff`Y^~xYyrAF|3=Q%zq46E|_EDs?svA?2s zl(&cxY*%!kK0D|aS0NLV^txy`{qO)qqN*?GUxE91Qh=}7VUF-e@QF$c+MkUFZv0Jv z9&6$>ycdXZLrnncZPWM}3)`ot9FnOohh^IAa%!oZ@k_U27uTYc8eDz`(#S?7i8(H` z?E4Gl#*T|GHQJW@NhU{4Ug5FxjU24ek;7cAZpWUprxMq>IUeKl6>XN?*8$%aPOY3) z00)Sf`zQ&^9*r*o>!|uQxfN*=wAfuJ0dJhxT~WdSKaxNl7-6JNlmL7m5`<3>!q~Pj z0e~G81l<9W|3??R%uR?busto8FWT%eY3uLVSnkOsU!?bMpO*EXo*bW+X&J~b>t??i zB1AU)phyJ5V8lp+d+S`dj4Ar@n4um ze?;#6Y3VIY!ubHOdu{3)%`Ff8qg4}76b(gZB;DSqLMKG$JNNw4uE6-mPS&pqcs{of z1;c0B`*4Q`6SJajhQ%Ol3$|!t+H35=leu^e&o7o2j~kRA1G$Lka6bHKwiqz9dZNQ9 zt&cg$H{q_Xjii}xs~I|~af>disnqH8frQ7RQ~l4z>(4$jk&A#9kArNFXpUC>WSUKN zpwKE!ZnlyqZfSvJWwad21!CKFEzoMjkgvBD6y+3o^`Fne@8;^iG>`v5{QpDxnK=LF z(*GW!^}Ch(m(u?pIQL(S)0kCDUjV}A;4ARFY}o*srtIpXrGlFmBJ1}WVq$a6;x%*v zauF{NEJ`=X-AT`AQZMYt-p?pD(rNP;Mm=js7{aABZ8jEg&1?5re+ zHfhs8drV9Mb0ggZP8#Uno%-B1JPubHZq4@!buAkHT-xOm$>aK1=4*Dd^7AO}H;hSwH>B@`Sp9b8jLDCy)Z z^3aH-xjJNlddve-P~=R|ex}RerzeU(fW4qbegg) zWttJ5{$lR_OkVx>67(Y5-g|5_?{ye9j|GL0 z5{2Xi68y94riWOR8BZ6&Cw8_yOwezL5)I?&qrmUgmmcft5kL}^zAphlQV@C93##W` zWTG=+=#9U4pMQ?c{kQLv8Nm8?Rrs4${2%MW-vW1k4~zXPUC91NB<7zsr1?(yTmg*F zy2iN1q$mO*U2^C-`X;PbuN530?02yP>0Wy!(>2zs7t@6T%i@euNLXPtBd-Ngo0Cvnr%LrFshX?ddZ>T1Mg zK2~ASQgkerRU;rvV!}O(6(G@oq@qd6OC?;v;Yt?#NR@up`D38RWcWdWBcF!y;$G;~ zQVoTn)Y9h3s$H{}g;U4Zen+pBHNN=nvAMYMuIJ)6do70We9^{(zQ_LU=UMy1@3Tt> zWsP3c{nQl|CqijncbOrP5~bW}P2G$-^uy*}KUI_q-Ee&&!UeOn6g5#;rinK|Dt$W?t~pY8$uUo<6>XdWm?Ayc}t?w(_Ke4iEaJitw$5DeP0LX|59Vx zPov;Ua7GjI4N(bkUAEK9akYM!IlPUcm-L#k_TfDL_Qpo#x@CW+!-#0k^^StqYW|RFLPx}{u7#qv)VJd%`=hb1$C0T4y-ONy{ z9`*&%0h3se*1~+LwYQtgWl(k0ROO+p=2uD=$0!I z8@`Kc8Y9kE=TSotsd4}P8d5{xz=vpQev> zmzuHSSz?^65srz#(t#t(s5c`er^YRzAaRr55+-(K&|fZdcZ4^Tf(!e#a-O$7Ci;??}!W0&bih<^KCB; z@hBPbNN=SQ$>o!@w@mtWf~)C=Swek@mz%Ul8wuXNO|+&(@kd>`)iwLOfX$~jPL3`7 z>~bOwPePO8oqAXNvGq^mpch@Bf3cDMnep*&H?lt+r~m2l{@>Whn10Wt@TUd7B!TpP ztP$Ou@`0h}oG^BeNh-V#k;7Pd8w!K#gS=+}>{)IMrxWGBx@4TUkz2S=;;b5H!0IQ$ zjEM^R9smfW4Q*2+pcy94G};L0uU5aAH#^Lo%_&EX)$MK3)NTF5?d@~ZXzkrpSJtCt zd{}r4k0-F2)iPJ|_Wy7E+~}9I_R*z>*4x!t?)9X0NXfqEJ>G#!{)^f9bMlIRJ3B1zIXwOkf*pS&?)>$Mla2Ft_RycE zW?|SeO#nqe?h%xAI{-8cC1S7hp2W?3@6C%5@|M(=M;eQMmbBhJVf3=NX^=TU7dt@L zlPDGkqzHJ{7Ab?Is;^~eZU{;aBxiW4`o#e8@djtl0@Yov(RLd&Z$mjIepKSfcG3O= z^UuCrK26Lj_+^rx`jEu_l{Bf@K_~J#S0C2C&tYblK8;qE{Ag@zGy};aW}BU+j_5DW zyp+=Ss4DLo{~%|gkdVbn8(81`Ps>X8-h^=7eYzbjYm6P233L@)>%=P=s4iQ9J}JJ&kwdwpx)3k-4Xam5W2 z!f)0-TRTWDMP3ujSW@Ky0 zDb*#|`ts#q307RIKcP!lBbHPJ zsoY%BI}Fp1r$2J0D)4qu{U?dD+faFpekUsjblRu-~f$<5#YP=2YOwbbs`d#fFZ zt+Y@oZ9gJXoxvMs)<3rg(5@(u)WHt3NMc}q0wMm_X`PRzNogPZ6 zquHX7*#TfIu+`AaW#ydmE@P1IC#xrOyRT8*rlr@ibz~;^ymQAWK1dq{uF_vj_@9B^ zf3XR%GyfL_(W<3khgTot=@kFg-9qm&go_ABf_GFXvL&auC~}@RE3zfrx)Ko2>rqeM z$^N+K{5JVIEb6q)?%NralNC$DLK-ZXi|6qG!kY5qtiE|y&#`9M^M3RC#ge1BF>~F} zEA3kuhZleAV_R~jXUZzQO3kWmD_5&~(^{uk`Z4dgF58b!n2X+CSL?Jo6PfW1dl5tElv2@}4NriTuWULIH;K?@5 zgM1eA)3K(u&{lOdMQQHo88g>DF{`i3acr?-&Y2#4GFW!bI@~~tTGh_s(Vy8)i~ZDQ zR4h-u=q($|fvjmZi#t43*N>(h`6C)wv%aBMtgfi-ih5JqoL4 zsIhJZKhGvMiFz=~gDDiBuhvc$n%{YtKw%~s{C#t2TydYE%m3IV^Uk(G~=XuzN z7-KVyOd%w=3H?Si&Sw{)Lvw3rx6|6CYZITCrC9mC1*Nf7U6^P`7V?7!b6F#M&V-<> zGDe)swGJnoW4$%`Q_c5DOw;HZ3Bx+NNO&gg7jC@G-qz+=#f*v;WhtulIFIG!_eekN@4$eGbXW0;9*V9V`JxdE&`p!}bIU_&3*xO+@WE8eR4$b~N~*=S%6-mw)iq-1&Xs_wF=p*w-cCOazit3`Ol(LR~SuHx`P z8av@OpKQR+dUgD!Z6aAw&*yLOAdep5_iE^3ZLhGlnQBi<&fSV$t>BI5Gwx~1gd>eC zuO^njy*v=PjgsW2RFQAF7P?v(y3~_7@!|>d%%2TRShwa5^H(L>YW1uW>J}D}2N%CT z!jL&nsjQMw=OQ{SMc|HyIsSYIUpIDR1-UU)cX16XoH??$(8|7yritK9PR>ngf~C4# zIxRC$j^1M+#HrBnby(jp>^UA0DOben#-zPW=r^RoiAK9^BNgGJqf3PH+J4GY)+k~# zhgow~)vxy#EDf)7{u*=+Z|`sibCup1VzE4paYR?od(v8WxX10G|28I*g)Xf5ll>kk zm3kys+}x@b98}8QEM5aFkSc!%fFM!i}4WyU zrP7nW_=qc($+mZ>zOg(95=%E_I+B5j(YH7k%&tIMy!{sHX&9GN*v4ha18+m6Bk$P{ zAy#(Viv$cezZ8&Ui~_V)HQM#k2g@kLd*lx9J|~yX=r3T!nN9l}vT#I8Y)?LBM1lle zu@)Zfq+`_~TlrTWcsA5{6VB7a(>5mu>$MeQ!0Tpcb(u5F^@}Vob0WeTiI~=abCW!3o6Ypk;Z>^o?JpGo5Cf`gc5=UOpraCxn> zyu-EfEC^@o?*XS*M<>NY( zc>|+{!gLb3ncp+~O1_Rb7^W66LggtB8X8BIitt79K*JhSx2$8xsf!g03W(MX(TWzi zrwKb-{!bi-%VD=`d9ErX5>Z zxH23-w3p%MQ~!)z-+$bbIbW0dMBp?p=cRWEp}A3^-|?{9?%EGgSVM%_1Bl z#oiRB@O_ZMAFIQ|OE`SHV+WKzK(fr>iE4`cvS1oF(LB(GC*mQjMcAvzL7o8^i)=z07Gi{xaB)&)! zZ+0S$PDDQCvcMh38)Q3zS`}S%=+e1>(CX)@w3p+uh{1-&{0aHO%Pj>-GI}xQ<1%yN z>=i!o)m#;{Ttv{9SVFAHy-(`nWKHduBjeN}Rqb1+cVswoLR9w&lxh_0k^RW>AU-A9 ztdaNML49&YBxao$%-pHtTyZ`T%|X0yu}y|u<6X$_i0nlAcXlfgeS@ z@Z!+g@Xms3vBAZ%^Vx}ZLaR@TgkOrm{%~{UDvXZiJb?V#Qu6pYt_~C~Yq<}`km@i#yhV?xAb(ir7)fs=Bb6ojP5bLXjUzVC zl>WuGu*Yq&K1JFNy3PU8+XJ5p%Fl=Vl$|sk$oi3=*{NCGVIZ-)p~NOocs|U6gjKt9bX;maSgB^P zM8}j=4<3<}$Alm~d$0-Yz*}^q<^|(xx4ZXY+!xbin)Aau8IA2T1)mSIQXhduX>$gk zN>CbDI}ezFg}DmoM56``eGPo|%$6vY!qb%JO_L^$!eX?5v=1=2C_}uPYnT!n^3rNd zvJ-WWj#JKKR3@UtEF;$h#mx;jNUFkAZ^=Xm(aC)PX+-u{eJT_IQ5FC~MDnCUWJgE! zSTQ`@jHO@SGF&y_kMtXmp_#tAv}PUvw8MX-s>lf!CC+Ee^Tn$q&42HCFgG%q1Ku~| zE03JE-ZE=R{yIwO@*msNq-&msaUH~#NL91A8c<2-Ie+O%v{j$8KAPX2`6elnBa!H2 z*|;XlAkI8W&jjK}=7Qvo1vmJySpQs&11E62Jd^3ZR3p4=kC%55(qa4I0ml6{3D0|c z`xytowG@j=>A!PN*l32bPDW&vi(}`f=eCn8^>~g0r*ID=(c_5VjMKF@8Q8yRhhoot zx^?XRb?Y9}oB~qtBhna z$T93R($p0Ris{cF5F5;HOOxs~Ad=qtb@?R%Sd>wTpJE(G`L zmk50GN3yxzv|ZUF0%-6hkowGTeg*elezvUSs#XcZT3y+{r;Y2zOZ| zD-^haS_p$FMA*??<_-3uBoI^+qC7FXDgvw%WA>ty94zrztXrzEXB?X8PzPqWNU;Gz zBJ1G7KQwAaI5arBbz*bs@4xy89!Kh0mgu>EDegj>#-@-&6t8IbuC+?#*hEL!PSrX<7@ME*%w$?H__4|t*B|ezR8C0c25SE?SKbO`lbc$d5;9=A zb{KHBAv(_>%p7c`834hs!QScEytW1Def3F1#gau|fzkJO)baQfkY2WVe^>g!^bBn34T{K;sL=qc5dJsocq>)6ra~A;cHD1d4AJ}h;nqg zA=vw7Z(7^Htd!o9jl_X$IN@|n%B_Su($_#8Md~()2M(#%LYx0$>vvUY%c7hsuB1Be z>>aY_ut!Jy5=tr3BD z%I*mAv!!o>Y49+2Kki%byj;)DI(jccv;>m~m6l}jQugazc|@o2nz7g-d+Vu_==`Ivg#tK8;L?}=v|g_AP-;e=YVHS0!MPZz-yZ0Td*gmpxA^$9;Kpg@ z934X1#dy<-!2TnTB-Xw;7>@o5~`I(|DrraDK`WZsXg z);IjM`8`{D7e<5Sj!iL5$z@jX`cyBp+cfKRYCyS^F70p+AX*ATm`SLM9Ssu%as^~(99nb_IC{5=* zp)+MGsEMZLHhsY$Q(w_TRFhPqil`IsdUdkX(C4e!&DWZ1reE5kpK}dp6bQGo?R6H; zHZA|)G?qzK+n6)t0v&#b^@9_QfN`=2+FyRJE{vUNa<~aM<+V(zZYtTuM6o5RLt;Rl z23?QNYRLPwJ!$Au0io9`67YO9E()qYKAr5VmrOzSb{!K5UIW3mH)cqSFF$W-lD}ux zEYqf}ZAyl$6YJ9lmYwaN7iNtsh$d;$FH zTCtPe{p6^^(m5KJr~>cvghgC(JziE-)vB=w_^cMDtJ?dr;}FSeXGE7``jPqK$G@{f zuqrZhopCN#dX8XT>J%i?wt0pGdyX@q?2+x2BSUP&EixxBiaA!97=HlyH2VVU3XSoT z7A@j*DC7{#l}`a8^0jtJr)x-Ah){}CR}A_z%5TTo7Axj^(V}$l8-b{~Ay)V`R*WU& z5Mv9Y=dra&aHDj^VAaP@D;x;o#+U|<^~%Jt>f>?B<%A?jc)yI4LDVI%6v|-nUg(3Y z8hzWoT{qKb6T}*sYOwBId_rG~^H!r49Y+-ATqt?UmHP|;^rg1oU?*N+!;{fmb#k+W zNN^4a!*i)%LA)K~VIM%cOVufH7PW)wr@qt5E1hd?v;^HONk z(hb?eN}-J{o(c(`W8F*HgUPCr>xbgg+V#cc%>@}P0hztx&3@y}y(VAO0=wC;?#@mS z*ibAU8H@LXek|N}P;T48AIhv)Bh^KJy3(I@P|$tQxqftQU+p4y=IRdBFb>(f(Uf#s7%v`O8tTurvLZ zhyHJ)VBui;S9$2)3oZP{zxvxK{vvJTKjyGx{xbpZuOW2~Cbs{QwsG_wQeUb29a0Bh zSGF4}fI(?FDUjbCxK*HU8AEJ{N$B(x zcqJpFB6fecUZ2RZ+5b^PQ zIld+sXx%>CKCpC|goGI&j=~RB2Sm4w@p)~Md%esUIBC1sEvDbk6w7#dydLk>M4s_! znR|}%z4c!iSvkA$^Lepjy*Rr9fnr;qmdf!B&zaW7!+Xb8PVYLrr7Of<$6o$*y%?1rtNgP$6`zA zE;7ktcf0u)yIV{?Bcfi8dJX4|N|O9M=kG-Gsh>TE)~vp`IhwqlL-6 zHp70zkW;)7>5mnSvh>NnHp|Om46dfq@GE*%M+gtAIn`YZI?!rO+hEW8fP-rb{{MeYm2xluH?Cbl5^cWF|~L^@HS2GM%Cll;-}jXs9h7z>bv3#bD0A9B2L zQYmopgiKWfz4=-{;Wx;&@*7n2x^r6Ye(vyEKG7v|a|Y!OyteDPd-5{v|5fQCE@7Ec zd3r2rn3fWVS0(;lci4+cG9mr`l|jnMc(_?1plN$xgz40CBNML8wo$ek+$)GNp&Y0- z$`K6*MZVX@R*!uzv$1u{SnR#t|B<5omYLENheK-3CMSh|+;pu!&Cs3mD;Gp%W?m~; z5*Y3T7;fF51YO=;AKg9a=U`;=Y+K@*@#j>Zw{LSgD^WxG@M%5DYqQck*;_J!oOS`@ z{60D}g6MGVqb3Bnb*S<@miaM!x@mSS<`!cO(gZl1bI2>?3mv9P9p5fm)(Axlbt?rX z@96~3LR!qQ!jbane)tWS{%XJ}!i~xjvrn6RzXMl18dE;OKFAC4cHPK+Q}NSgvLD_Q zA8SQP=_$;+rr+s(|6Abci>gAlPD*%lQ9K&p@xLl%ibL0}ZZn2k357b+nHtq;|GkKj8JYmF-+WyM|)g4-@nU18@ zHcn^AI&=bMrcBk}6ptP0Ko7eFRJd`jwr{!W=h1u|CC!b$O_*rFIt^pnj3B=G;gQ@V zO)f<+gt9a0?gwYs>O{p~h#MtO#YVlLF;DQpwyyDOd1E?88m*uW#8i|XC|JUxk?E52 z?ge~TCqyeFf|C%=M|IZf!=L+k$#5Ctha$sVSWxQ2S!9G67a=-JyJl1G2QZf(MUD2! z$aVYB!Q9o8@X3LKPSCXLi_J+hM6FNK9N5XQX-xf1+$x{+L9)ZrvL4$HQ;SvZVi$TN zGdObrcHBFW-e!<0bkDPyMRp>X%R)io_NCdW{aFU(reUB*&X^X+LY+%DR*~kiMDa2W zBd=u?)9OtoFJB1r3K_7QA8YhK=6LoPoNv7WFocU+M&(Ng=HA2Ncfg zCP6K*Ps-Vr#^YoQ-?3`(%`bjr7fg1Y!U`k^Ei^HzwI_M^boirUE-_|I3?6{YXUgINFMs+ zlV>Jl<(p!)SsFI_VkIs}m~gmy&yGCnXdaV6AOMlh*6;GO6sOj0)U1haBMn8{+9v)h zX;S$B^-ae{d^5sl8cPVfd@~u%P>RvQcubKlO{I&}qC7vYM6V#dkse=$#g#U;nbK@Mz);#4nL=TH!u~axH;3FT<>vU@Cv|ZQmq!hm>Kt!Z z(;}#8z!=&R<?|<81$0hUjDQzcj>oioqCDO)rgjS-QqMq9Zo(x5j3@^!Bc<1M4n`tku zYuFUr>sYO{K7cgewL_V?{yLX;a#{6v{>0m;92_go)lA7uFP)xE%H$sajvM=dd9)B8 zF9!`cTul+Xg^QAWE%%dJ0STDWMW0L_Ybn0Bf={EQh^9ZZld~mtK;x~dzy$<4M7jnk z&aqALrZ0rB=k=>dGif~-(_``4@_HAW{xrUh>M_RPU=OaxXvn-REfH897z4%YEQKzc zcns%1<_Nrg%s&CV{;Cg@1`!Iaq3hkT_vTriCyi6bkR!n;3y$%*2={wv%DWZu=({~P zz%L?rD~miYn{qh)vhZ5&fPH?sNon&YVPoDU_>9vs_xV%VucVV~mB$i$yohL|u0&>I zSCk*3NP5KINPS(l_dK_t)pW z-#Ksh9pnCp5%FX1vFBLp*-u35IoF(}jGQ4myOruAPUG*m@b$LR?`A19nr08Fz4N(k zk8veJfN;w-VGN6bPk*M4#WY@o^8sF9r{z1fQVi}ub%>Nf3Z@qnw_PFQgj6TgWLm#$ z6T)o&z=1i$T`DPh#FSq8)MAXI%>YhgjU3$O7cgpviqH;MFx4Cy{h*{j?%(Q=ORjXM z42%oKraTHg#K=|C^!RXO6QqiGs+?Voczi2Auu~&FD-;$jtw;v8J#7x&C8 zV_{1s*3X{lC{oTmVbER~WOOBHzILaZH z%AT8GUCSuhEjNfJwxz|c;!7sW%xtmb93BH|vs!1mgg!#fR9&{d5&u2)q6kAdFtwVQCHEVEzt4YOpx7f!G z6-MO*IB`mbcVH$$ycuu|{HW!#hFC;Z?}{HO>5SEzh zLF6VDBt#N~K^_l;l`Eejx><}~loqRGqSaiOo~Q&D=bq@7ptK|_BT1FQUWOwUO_l_% zjL2U0cC<&73h>Vxdr;jBl9QFeXX?^sIE%)@Fl4re4deATS4>Oe5-i$t_Alq#HJeX8 zsnTR5rwLJ_Dm2z8=aD`UL9msyb*n4BSEy?f;}N#_7V0QlQ(`9Mu68g1Vd_QWueZb| zSfPm}^Bmn_}0@*Mvh!|%Z$(a6- z1x(h^g<&8U6XWwtm5u&XJ8w*K0UZfz~m4IdB zNujbg3Ug5PFn=|4V~a=c-u$vuWSdroSv17o9r3%-v%;G=Xs)*HL;e2cf_MWHxpq<| zH|^r_+KXaSGWB!_q=qtuMiTMbIJQ`$KGSJtpea9Nmg`1rPey&{R@}!7T)_;Qs)j)| zOn)Jcg*{(+V49wvPuy2grf!TMRJFXgj%w`?l~cjr6`Y)a#^(nWh{=AJl@+YUWg(uM zk4zSCIX#Es1?ny=kxo*LDk+I`Y^_fz!S;uZHk?$8qJm|bMd1EQ5gU|NA3-aK$OS2? zp1hXT8#Z<>QzxCAOMfc%b15Ugz=R($O$un++xN0js?T3uVEv6gE>?+t$M%_^riqf5 zuxW1RyDDO0bSg5l$ryTAu@GlEOzmcyJpKdoG+ zBTm7zB(NhN=Y+=VO#xE#5V{(-vMrYeQJ2^tdK!_653^%g)O})(J`UucN62YzYAoNq zsXd@rbSun=X+(?=HZpKR6Sy}|5PBiiC)HoY&P=V6F440J4CW4*O&_$4uIW{g71AdX zL^1~jfzfLX&}2r<7}JAO+D1DKQKn3%1k49uW9I{>KCdRH>WW7t&|@l}Na{vjFp|bd zA*jyKoOQW3m{Frb#4_gm3?s_yFf^fbM|^#h_X^cyzj$HK{rVU-a~y_=`n3`(YH!6R zgd1<=8be?V;>qA<5WPTh1q288Z5GyX*7W@ju*0i5FG%Ecx3{izkPNQA&Nz86^@z*& zzyn;ceuG2c4oeL~xuJ8*Nd3 zy@E z#+H_r(NUFO&~c0fIt45k-)XKq@zkHIYO*yZnP0n=zao+pNM0QrG5^Ag$`1d7!L#5O z)I=f+32J9h)Gf@R4A&RUte7;ryFPB?d45cgBMO{OrC^h_w7M(imF zKI|Ig{%l%VPfdc?LyN2_7CWf!NZ({4f9l64S@eYC&h)ZX)10_NFY;$sgMT+T%1d-x zjnrgTyJBttV~?e#dKR*JYtAOcO&TQvL78fq5JIFxh`d!)Kq1>Ai;?%In@J0q`A7tEleUjrsDi!swyjTwig z&`F!#KA_CK;dBtx**TeDDXZI~pe;|j99xZJkU}CC8?YixpamgG;+K19$8!-GFVK#f zFajnn^aL`1*K5tT!;Dx~Y_2*LZ86%;Ow#c#y|;TC>CAa{sN)qy&vN^0Lo!;#mgR1P zjG5hkySp#s5&b%Uz?oOT?R;FZ6#Vvmvyu^*jJ#yr2MD~jAZ*{cSN;4}bg! zAzdAGnP*ykV3G54$8H@1#^DU5CFU=DCYh?r3Y#1>2C4imGNBk`7}A09w|1XMLvpn? zbE_YT$kE@fkeCb>YixNA&mi3|F?OKo;MMvd%QBl-uP%K_sZmhXd?jk&)Oz3!ADtLd zlg4e})cPdH2}(P!_k7*bTW^?ZCE2jSZq`^Nt&T2!=MR86u;dLCmnWqD(4cpM+^ype zgT-A(v9EiewjbdFrl;G*%5bCK8~XyoG>&`Y%CGI(0D$+)rF55^yNwJFGXx9=s{EX6}bP(oRP}&JerV`7Z zBG`&7`3$AY0^XgU{96Kr+e^-%3t-D`l2g%0dpGhLDEPPF;;<6gew}SgQ;rp)1PSkKX~>L z_XC~$u5Q(9X-|&=p|U~G`UcgFwFzSN-lr-#h{jy#L*1QZbhQ%@8cuf*BRN{!P5taD z$eeDbfJ_K>JQOabD!-x^anUXf%w?%l<=wg1F!R%Iww1;bvj@mu_!idF9yur^1$j0t zjV_5~$sy?N!{Fx1YVJR7t)zvjsaSGg$9CYKlX9+26@5_jUt}q>f`kigSs^`5quUK= zH|rZ5HF0kCdo8HOZdo0meJd9K9J07cA1}Ec-%nvuiD>aK0KFC22EJ|L8zRtsO#88f z#-f!Lmc~A4ODh5FPUehREQ0hC)*(?ci664Ow0*q=b zNHUc^G>W%b^{{dfgviiRqMbKR7*7Y8#F+pX7okxNG2|0$0|N_q5q`Cn)P9UVf3^3E z;}SiTsad|A$uN^0hV*1Co^-YbPA(=^l*uG~JE`&k%2{T*g+048a>)GGPmIjW24Hyw zaOniK_`+=GM9DC51(`F7WU?>=X`&ws@Y_7PxG^cq-PX4CInzEX_%W|^-Pt}LkF7kP zc5W>mt=yN7@W(mX)zR0B>+c_}Jom5EEg8Rk3XAO8EmV-FoY}nJOEk0#!Div#rHzA( zkv|&}zwxI9u-JX&Yx?RbP4qzLq3GCwJiGbf?4?NRDvB%RI`j4(7)D)Y=D(; z)^j;a$uy}8T0TO4RgR^#Ks})&YW}MV9eHq;h~4!WqG$GZ=gfD4R%8(`gezgE3U&@M znIDJ_X(9A{1n`qnmoBlp3gnZ&hix-n&V#&l!pqf(Ahfprz zpXmH{F6AsI0R!@5XebW)Afp4vrCt~0a_?#XrM?g~Eu(ezCEg|b*;Boa+N{nQ zEfCw&I{I9_Dig5lv!PHJLCR6{`2sZNPlR!S+2R}`)FQjizH~+5Z*(dzI_3u>8Kok| z<47UDP3TOjPtVr+CEK=;<_?R%zc$WIQ9tc0u-@6xHKt}3i)CP)3`UQiXuJp~CFUy8 zYd)EqzBmZxu}96l6{jTW;9bjQ%P2GF??FWjp`)`qL0gyDm$v2%pa z%=&X&RQg@hzWfkU=}c83!%F*yz5UQK4nkj63Rnzyjy{MWe{4|iap`eDn1}t+g)BHB zBFs%HTt2c5RWO1(49Z%Sium>Jcft8mzw2DvTBysra;l9$69w3^EEcf{1^YG(p-|1k z1Gw3%nrzPmr$0tq*k<@<6GNC#i9~? zj;mK$8Wv&=Pu}t@b#gTmU>@~zTC(9KepN4eSAAH=E`$A-U)<*~qSCiKTjf6s2dO=N zlx0B}oBp`_;j^jBGXJyKv~N@FqGV$Ov#b9~!SSVt#(1}26T9MR4mE;dGYG==uyZSU zbY7EjbLNsQ*w9uTHu8gfo?kKxqNbF8Q^u4$E*c^$lt5ucVpEB$taR7A+BYk(=2*>w z9QE*v4J;R=KnD`r#`df3JTH3H{)gR#kmh&+;;aNr%3OiI+o3>fd|PSQ^N9v5yZ6s% zD7ES^mAX#LY#W}il-M1(4J;F@eI>U%o~wQWA_0wpVaNd~FZ z$$d#H6Tu_0_ZojI59xhK28sZ@kIoPW1iH5*6bBELB^aHT01ws;3d2i!xzyV2%Uw|p zoS1U#wm3gxE3(z9C+G5?oqpd0I?t}>He&{ovk+3R(0D1welMsp5$pML!=i7|YNJ3t zQo$pW&BSh8`W8@uV!Ok@oK~858i9y2SzsQllf_-`T=a5li?34rSVhVc(Z^uPJs z|G}=EnVFdu5Vy??a6bG413)tW@sMX=|2r7}n_~RcH2xp;`k92IF<0M3hm>jJ_B z83Fm?fZ#)>KiPoH|C?$6g1`xw83AKh|93V1Y8%h^&tt0pVrc+U&1sq02$}#-Iluw`Z`a0ucZCta%ma@8S2+Ia8xNrF|8{Zw=MrUP;h+ULdHv@a1%yG;GXG6I z{?Zme(B!{@@t3%F);}ftyEV!}4_FR=$^qyO0ShDj|F>!|0Z#ol)%Z)?J1gTqDY-ygxwps$dbkIJ| z+U{ktY25OrNY3Z=^s-1-5ra=lx72N%^Ktf2@l@IU>Gp0xYo~kYqz~-C4e5{!Q4ps0 zmZ<&Vpgp(f4B!TMKbYa;I75v^?zZ56OUpZ=`+R4tj#nW}R89_dBDMY@350Rg4W5no zJMO)8yK4G$k;ZeycIo|8-)kupKeOT0M>FN(6ca%9KkM2wU-x)xtK<(7zqM+#>?uC> zx1FnCzYjvc?ciU{M@HUT%OE*SqXN%8xv7F3?!31%|Byp<(g_R(kp07LI)`Bgc|_7W zV4{sw`tG+xuvg{frA_Hm8GI}(ny6eh$=u1*IL`Y_FA;lNJ zXEd=+6_W+Y3Kg4NM&?}5N?I~h}y;siMTj4HtGq3Gx ziNDh%vud*`57YdN3$vxhQJ{;u=F!BnDOHsj#nsUfU44j8Br9s@>T`_Vu6OJ2Yuayx zs}}1Wrq&tJZj`tMjO6O82dJ1tE3(N$JJN!vnIzS#39VM!3q(2}xh%`Ts&%gq>Jq7# zg;G&o20oN4SIWRIEtNc{r|k8&UG|UMEZj#W6KTeuIR2Y{cqHB_31sZ{hSoO|h@+qJ zjB^hIPF5a5!^PE%ifpjUd@e|<3$mXvEhCOYB*~EHj*W|Q3Z)K_=)&LatWC_Y>T|>jiQN<%OgSjFB(-}{ zE!_kt6^O1f(v;B~L_`F76Gdp@h5c*{nkDwEbj* z%s{y-bHKYq7KpPhc%vl6^Eno$KFB-|G<3$SAQi@{5U>>WJ2y)--l(1UlM$+&JN`Xc zKNr*dw$=cyalo<@yZo@Y;x0U6lA&OgI0)(O}F z+jp?NmQ>se4ynQt}hX-kd#hOkCFUr!)6Mb5Wi((mWNuFq_l`?!zwB#z7sG>M-#m4GUL5 zS{e%U8S|=rNTsYmsH#2R_0Gaq-$np#}~BvEf6)1@wt~PgYcij!OPW1R=Gf))a= z1Q6Ol^P2AVmS%~!LXSFeT)b7}&Ba-@V11Ddu_oCruqM%!#-2hdiPF<-jM^Fd63#9? zP+B0J>B=B{vaWI2@?GvwKzl8>*7j|;$GimQmDMVSVmVSS7~Qh1O)V#B@H9k@+XYTX zogWC=AG%ToIZa7Tkb6JVTwclPz+AxMDyE!q_L4@Sn=-svh!SXchakDuB-aa)13TMUx+OoVX+>E)&JgELW z1SX4ABWDscVZyUFKAB>se`>z{(s~v3}1d8hC|HK)A1WG^?4%oMn|}zJQX-$& z)vKfytT#nQuNC)eM1ziMG_&pSOS@+p-t3SFqJ$W{;)oEPyUugFo`~F zdgyUW=c8RxRDW_iC1%X7N4y_43_&emD%s#Hd@5%if9wW>uqUZ|yPsyi?0^Xs6oN1o zB9=D2T-n;^jX{!z-;q6WIDa&Ijh(YQsgc^4uf>kV8G0FbLE>ETOG|Pivucj*jyxUV zfCtXMs8G##x>lFPqgS&|c-rhYy~7beDwlIqT7tnA{zd(3vXpH=P%)C^8S|SMA$kFs z6V5q7#FvEn43KLv7kDQPP&Ue=1i{{@VNZpLl8D>g;1IO|m{VAm2A4i3&_kibQ+{Yqg(y-izC^Z4*A6|S9;&j;p0$EF4hc2g;P z9O|JcvIA!3#)lcjJ6rSC{+Beb#Pr`r4gENac@4}ku$$1QBa+Q z9p=NAiu3j!7FeWwbfQ*iGgbIv2#fR}h=y7W)dTwns-JcOTUMy{3(Ie_$6&n{D-J-W zy^H!s#p_Ig1INxW8av@k1}1vU@`5o0#E+%EADBeotU zDrXrI+O(E=&*}tl=su%c)xfCtS#6p-#5n!-S0`5DK2cz!Oqh@~rSg<8Qjs93$%kBA zR>KWEwN%32eMwg%SE=?v92a8p0=b(Z3RHts?v;_6vdl$JuvZ?qo9PQ+z*NtpT^NA$ z+trm9R~0}u{KpoEvTbOMqU-dJEzn4_GU^~4RwR?`$3h*MjHK-(SwIY;j9XYEDcV^!vi~i4MWNBsP$^5A%C7Ko`t1P)s`vC{;L+JZ-jp&%106ZtyKL<5PirZ1jVSGxnxAZC71asl69h*l#7z*Z`vE;?id3H746oEK+(=5n4~2kOyQF<(ps$Qusb*U*rSDJ z*rP=A!SGw=#26^n#4Aj`L^8+>*JjAew=2WtFu6qn>+^b9$X@JSBO192hMrptPV+Te zMz2+^X~R}YE0WM>TbPMGlaz(MiIG&>tdztSAAFkc>6Z7^7b8~GQ#rnHYrdOJcRbDM zSGUFFm>|i1+1^PP_gRwUgpf8wn8FTQX+k+{JH?HC5O$QaEgbwr7Lzo>p3qH!j0*if z1|?wNcQ~!@n>73s<46U+vEHWo8b%6DHcD4n1FN!#pOm2~oWNt5SD{-LE@oR5Dt*+( z&3V*`O5R{H@0k-v(J;@c=+6jK4y&<+3mBNNhg62uVH#=l>|}|C3(NvuZHOfU)+CrH zfR|ALVoMZ`S7VeSu43JTm{YHW7-0gX9yX^EE;4}2!&PL8NrVY}jX&#*I2SO_26s5H zYq?bE!X0B&7%LBgR%DPB00m9+ zy2u!B)RTtKu#P-RNab6OOOGNoG{*B#%tQ8gE!1N4Bt8+B6dJBk?-dRtRRJrYZbkGf zVy9#Kuw$k}Z+-zLMw=YZ0zw%X7vbNX7;>ZFZa^%EEUF?W&9{6Pj{MosD8*5NQcYUX z-Iqy}n=nBsDzNp8x}Xex>(&`<4^-YpRT98*X>!jv-H{ai^AMICwS}ri1D>>CPc%Lp zd;ZnwnPp%Slyh=`C^2W*v=F;+>u#(|zje?CAnZ`gHKb86>@WcbIB|$fA%|RJ-7r=TOjyG8^bW+K z9j187GN&vfmdXc7@^=+6FbBJ`$}>0Bday2XR4LBlB6AslAh2hI#9{d!c7)s8v5wOy zI+4BH^dJcn*H95)Rzg@>wbKN533o79D3?!k1KB%>638;3UO~oisZq#s2GZF8$u>$y zRCdG`Z4fV-B9!IK(YmznIIce-Lz->`($C7TiHyETs4iPb2kRB)5m&ocyy1BJ7@k9*D*ra#9e*Y?h|GHN&&5geBzTb0+j+Ucd#ssk; zO${CR!ND_YLW)(6VrAgBc?jfK(J2r8PV;4>tR>PpyvA{M@b*N7HF#IFx(>W0@|pA` z@SJ zP*u{Klf7r9A4hmBPnVr81ckYAn9xWoeyMYrjbr}XlIK9CM@`(ay-2yMYolCqvl=j= zT=in2ce0eUgP}ZF(|P>ENmQV}L~F7GbgqAhJP^C_4=Vz@WiS5bpj-OYN^8jajRJXg zx31_KXV4@ptf=kcBKo~~{xwa{WZY9QH5V2he*VyKioCq2Hd+Dj0Rb^PCTx_Q>ah4c zPi8E`q2TffMcUEcpN($Vaew@$yi4|IwxdEfn+N$;Qk(OjV~~deCUqORPjpNN0gCq)NF+d;BW><8|M&VBPL$Vw$Vi>3fo3d7pWqN`M{~U>4h`*&JDhII0=(9FzZf zUL5d4mU*t+b}}Cc>AZ!2g_byi7ke4T30NdrvHbbS_u7ItlHq5jEn=J0egCzG9pbCeq2`kl`%=<+KLdOHHhkZfU{_(;>-4w(#Flwit8$LAlv<6WsC zx;QJaRQ+fOGSZTM5Y)cW47-hwFOD7mhCx(=fNJ(HNWqe4vc5{R)Olv`Te^5akHi<;g>t#wKD0$tu3m>#c|~Qm%>C zk2LNYv0H-#_}- z5Y@ilk=J7s<$=I!vU*n=FN?ZeR*sD_ZQvW(Qt48OXf zH~Ue|zW*|@Y_l-M=G6jWwJmNv>~9pN-loQ|d7+$2}|vYQ_-klLzdbW z|5mh~0a+~D9G=z{7mZRd08@6FH|72rX(Ql(6%8hBMs%v-nqby5k}r}>uzK)I6zdz3 zvVz@gsRE8HTln6|fK(JZ3=bx|GP-g9i6|5;T245;Y?vmFEKB%)8G;XtEL8QR^j=>X zD;iUOAFg3B$|Xgr1u|&H0>qiZnNr?A9!{PAtkmaQ$HVt*wIx#g9(?T*sCIh6mE}iH z{dS~NeBOW7-3!4JI&WZHig%dteWhmQTe^sbI-6$@;hgAu-iLT`tJq*?D+6$0JH|9) z2FPxDQudMYuHW@<%!U`bh-fDGhtDT%)<^@bvjy5q_iG9;KIomU!KfQ|e5GiAPAa*R z)D5nVSyIma0>y>6I>fmid_09S@; zu8_%j`Zj~UzKw_3Fkyu?6!XHwd!t|F#VHCPacYwGpD7{eS)UIcM3v#viQrITjHb@I zy{MI~pHZWFU90rFjkM4SSo1CvTrt7LlV_0gLB@653TT?>X?EJusi;?(p*}>H$#RO3 zud<|}eHs1lIf4lK$cKKCq@i*Ui*7G1AhSl#H#5QF)@&!vu@d=I_XkBVoP9Kobh2{u zVW4sO<>uk*j;3SW*&>&MSB1MUKlYX0wC^h}c}}uALimYhsV^1g`dPsoTxzx}n;3>q zUJRl<Ap8 z6$goJ7#YfW9Zl&L97o#ftGt!S_oP10*G$nS`5a>bO1B?_@tP4Y`+OR?lX z!v;YgKD(z)B<>=nw!B;4Kpr9 zCQa>lR`h_3td4c>Y8-u8AJ-Q(BI3+-EVJfugrR099zapLv7{+9BApXKHPXtFO5O=l z-1^vL3oozJkRhCS-QpaXIeg3>ICZPW%^F{2rj> za$PJKS$H;>w=qb?yu|fmx1YYZOvs6yDN1U3Q%*S6mFt0TUYs-&RSq61Wr#Um90Jf1 zLjGG3{|^VMXk`*xN%-N3jdLNoi)`?bH;yY5`^pR@3fMa=%^ZSMh$31qrokFf$prN( zpy(ue+}`zW*UFuUrT}Hl3ni4Mw``sqqcRtWeWTel@s1b77@k$}-)98&pCO%HoqZcn zFNJh$4)<}Zk>qo?s1NY30$dwyzkWGm2*uUCc_(?zs!m)IQuU)3oEAH z2+=c)Gz>hJ{(w*C{rV~`klqAZH&*+&w^Yir9rA-00@#4Hz!NA(K_jmGC;|=9>PI3{ z+kN3Z!HI{Viv_yAzeDjD-Re}nWoyh8q0pwd-ju7b6iu2eyav{8@omZY)OPot4xguk zK9(H2`J+UP`lr@G)qL7vo0D>dL|L@ulKkPI$mGU z+nZvM+s3x;2!^~{j(2T7Cdc;$NWY&?^HsGkqI-R^DF(N{o}KTbJ!ZDJ5FLD}n|YVQ z2Se1314Ft;wj2D0BaKx@jeR^Aatn8h-UQCnCgz$(R6dToN$y3CDa+f6nJvOy$jM^3 z4!!w(XjAzZCcLov-z5b7AtH6d;yKAI0@%_x5UC8fr{58 z+;Lk}&eDzxa4ob-ct5jaBi0+uk@zInV0B;8d2fIPNMzo6-uI0z-QF9ltuG4r7Trxu zmexN9hq@RuIZCdcJk&+(c01hyFeA6R8KvRHO07UO zHa*QM4`QT=2FANXW}Ze1K`#x6J4-%wRbQC(D-z9|f1+YyU(^=k+J<*T+^uW~2wV1F zP4qOb)iC0IkF$-LgzdMX_X#NrF=XfPCi~*!cJeFn)pY|e!x}}wR~dSCGl7a9ou~;& z_#JRt(HGGunEsL)krRz7G73)P9zm>anoN_amq42Xq45oFR2-05G-3pNlblAvYY(52 zpEf6uCV&FMZvZaTPj1$xq4}QmO?lh1G00`% zX8Yr`v&M?{A@&i9(YN#%#9LiaLaW9(&wr06b@f66Qx&nH#4|8W{6}CdF!6J4@ZhJX zsd3$PEgz+ui%Wdnl}nX9 z&|b7?F*9F_d~Vr}C)2J!6@`_jm~kXs=_h!^ccO@YttnvoAI75plQ?E&rT;J1m=%yB z$niIdg8vAm_%jsE2w=Whng6Av;IC8BO#eI;{V&+-|749>7&&Me|BE#KlLOE4H!%J% z!2f49o8?ci;s3>rvFJ` z!OHwcZNkLC_Kyg9fVAO{>VpBmrT<%@2kT#(!t^hj@>hWc(;xExZ<@mVpD36BninPl z=Kny!#0(IZSi{I5{_RbIjLKgcT>=viplSO^%H0UibbeFp;rEjz%<;Lk!~`*$c9 z{x{Ma#=oj7{uJ!*iowLnNDFA&f5Bj9r3DCj{{MjSS9Jx`|Ddk;uWA5#!p2GfNEoFB z+*VH{{e=YK0{HwZx>7UgV|6t@tZnsX2ZLKNvv%Pg&S)H2YyTOM+x0}O* zyW8E8gz0V`txQk8?zW#fHMYr5nl+7r`sDm6N&wp-a~eBGY%NvLmUm~`d& z@-^1e5sQQ4=zJePTYaAQCXZ9-WVRae>3DU!JbRTg%JoFX$HT|-lPaykr(McNb@`eG z7Yk0STl-|Qp6{1a=(=#c-mXs^9~Ez&ujq6;6ag;D}HN=cr1S936uapE`6`w>W3-KYkYPsnvSUM#`kX`%Z78kg2jY7?zFBv2;{IyS{Iy zkrc#crV#PKRF4omOEQ-27#~TC-W#iz5Wbbxj-m!#vQX+yV=&$0mO0)$ioQD*eGsoL zJE#R~x@u<9)?voJg1fdbX96vOxc7o5r*F+8{B8pS%E=t^*`eis1O?V%XLYhQ4bGWb zEZKuRva{to9Yw3L5171YXldw!Ln zBDyQ%W^DFo5p+h6#4P=X&*JT4op88rho(894=DV-1_`+T&!zacQPT%J%3Y|kgMxy{ z8LV~=F|wN*pfnI9-G{>hgZbi!y>kfHujR1ED)_#iI&m}oTp6&4#?AvzHe9tlgV3}0 zq-XFQQu)Rd`^A2l>M};HGB+m%OKH#BJ>PPb8#YN8!G;5_!r(`ZN7pyxKqWtF9a*}N zu~o#*xv)s{Lb>-$n8%5Y+u!j*k0{JRHbfC4$s3tk&`2#$t(@w`PgHq zd%oKbVbOT^h8@p&#>^2y7~#p>yljQvf>P8wuw9VTIFzN>A{6FRIinqi3Dw3oP#Ckkt}R_U*#&DyT@JutP<(_wr=b@*<* zk9L?IYM1C#ro5e1oB?E3>4oXbbs0{Qs}mPQoeS^it45l5pXk?6AQ>AxpNKpCl`{yp zGqudi!*8u&t@_GDis1tFasxG!_YDn;HfLeHbMAJrm@kb*EJt5fw}uvP_xW&wBIuX^ zisIt!$i6BFCRa1)MHCU#3E@&M#wr>O{j^ME;O;4{+)S7fbd^j3H#<1=V>#c-m3d&= z_tH|#%XwqTS_5LLr=wl{ymUW$m%fPziXUvsA4(ir&<<=Qed>+4fq%qGs{XuTy#Dr$ zJier6@wLcM2r%@DZaL}8tV-ovs60!LDpILtlPcT{t#boOK!F=G$>_?PxdX%*3Bp*= zrEbQ6^$xAV&X}6 z{N=H&9r^wjI_L*33#gzvE=?AJZ*JX`ey0bUC+2x1rDKZhd_NsZ99<_Z^zCMYhruT} z1~=3@oZm5SS5NB#7gU_=pz&=(A^ha9o2K>ex3X@U7Q3r)GNtRSR71cD~szE4!ze8)GXrzyDuR}`( zIpNP6E9p28;TnaOv+?|~@9&Xpl2@7yN_DsacG;iD(bKLWb;r4WlnV17MV8h0!a~?s z$o8tdYGMNgCNe#2!yp^Z2)B^|p_d9u6p}}*8kR{&2D92r9p~x5w$SR!6x}uw{1a{1 z?(bja@u6;jQK#I5ZM5N`OD+}Cy=cB2O00jXwx9z)6Eay~MJqn&0ZGLi*_GoV!#qo4 z(aI;{AOroDMjC2SCVf?n?A@MM9Y*?au89VH^ZG0g;j8*k3o9?5d~H+N{(hIO-_Yjf zv;optS{$Hb$!oKfE`#d1TxO|!vPG5W;ih<|lRDGgZGLb1>alrhYB^tG0l&$_Vex^7 zPYC6+i|`Sz-o~IFVTENK&RT#vfNZwOs`N!r;0e2`F&4D)dIAr!5A||-6sIAb*VdPf z9C$fTgcR~p&8e)HCfSj;inX0Z3xl645~wyj*<@SCPu<+f);!8)>r9zl0bgV3dX#)P ze%Z*6KYyYUqjm0UDg3$MLv*ryE!Cm^D@y4aTXGdLXlor5rWM#N8pGF%Y&dDxw7vTZ_bbnyyQ#1Xld&(n6 zUVlNO1u^PTu%7Rt%Q)Y-MRT_`pq{GYft!qluEEXb^7GkgpcE*i*y7s7R)?%MX}mOZ zyIU5kt??kAMUdCK?g`}#0V>zqY|i?!XAsYpN}-Jb_rs*|tQyBVAU7@U*odLR$widv zx|}VEY-1V0f!<3HE_aom;wn!TV&FEMIZ`fkL)`**e=dFmt~#iwsyokB)-cnWA(I6* z0V0Oqtp4t0@P(i+m)T22mpuSHJrZ zwW|+v*3aA$C+LYSqm{1TyE>Dblhb`G79l+@roe11t^lk5v7@kE=GB^LsKEHH0aJM+ zO*qK9!Wwb-l9w$x!xT<1zy)|{=hO11sKz6D{w8D{rn;VzST2om0w`lN9sO>$5VV1w zbEkuQy2~{OSY2C3mU(`J)S?@Kwb=KDs%W7gi-++_Ozol@?u`ch1`*tSH%Fi^k57xR zCv!T48l%}bJ+^FU7%`%Gp5YukYS*3xVo67^6+Bz9n zJEpL&jP6cbp=s=!7!I62Hw%6gS|*LbuX9NFx^SeN)ni}=RkZ~J zKADPNxz_qy^I_`^G@@{(;FLO4F-kuo!3FI3<%~^%$LSO%+1r~n=3XD#PNLEjavj&8ZlQ0HO{jX0hOkA5Z!2k@QJ$46R#o&SCioaE z8;Z7&ap1as(yvJ2Y8}e}hmn6sp#@b#dL&L8HqxmLYRG6+hc$DC1imDcB zX$o?(eQc~u6LZ)V@{lj9H~p%OEnVr0AuIpMKB5xIg#9zzYNQqDoHUU{c^HXAtl<5_&iJ3V?g=1!iI5-?*I$Z3;SR%u? z6<y*;ivi2!htPx!$>O`n9-#PHSop?$Ri@1RKsE{P zg}Krvbe4)o?p6Nc=3H{_ec}WIO6dtE89wuRu4B7UQhu(di2m&%Hh<0TMx9k!Js?;y zyjX5n<(ItH$ExG?U2(E|2XL@K0$HQ=s_Lb{h}fVa0oXKH%VLXP#;!P+-T038HHPe! zEe>59PYjxgOKCWYjJsbdXL`Kmj$j$0wuyYPCK=k`mQgUj^d(*(SJ|i&J~#FN zhBYvo(0AA!X7{a)O8kPR6<{@OKW*!pCNq+Ob9Lc|RO@dI81vG|75e*yYV!i68D8~g z1k!`WhY=O=;PInr`rFUhWacTC;5RC!N6rC3Ha;KeBSjUr7-lzR8 z)S`jn*;8(nW#HU|1dReOM+ZG_5E-gpeX*M@X zk-DlFvvZ~_7#v}n33cu^eCj6y3s97%wjo>p1^FD;6BsN#bW2WhVm8T|U=h@YV;@@w z!|`A>gl1|q!bx9lg&EMqB^L^Il@2m9F$-rz0xLBxp0HA8sBd$+s^!{%c9idDfW$H3 z_l7PNvSAX`hU>e;Qpn|s<_sf0(*q-)DlCf(t(pLTT)l0vONC`&^|k^Yz6b0CByRP- z0v##^G`hJ;i&uH*h)T-J{;1z$mKCk#-H-i!=@4CP`kVp(t2xW-WIF{Kjz)Ubti^un zKyA?%UXwK1@2-QE=&&-llMH<9LU$v_Kj96AqV1+K>MM|eBNF(}8N8~aeU`~{&skC+ z!jTr;pu$}QIep^c>!${U&I9IydwFhLaVW`2D0gHE(eI$$1HFkvoNF*z*?-4B=A%$j z=vLji(SZyZ`3tRvL?wie3X4gS@f)29{ocT&XQ`scX<;ke>+ggGanf1C#^E4Bv!?(1^3<)rz(AEAiZ7KG0lR^PUV8~`ciX3lJSQF!&*FX?o)}({yg`r}Y4_`r*eANXHU&Y)WNP~yQ zHiAl}v?P0S^Kb^riFsy4up1s>!lIUiHMqQCz6RwtELEKiV-=FDqoI<)rhz1>vzJu) zK-*%YB==?l6S01Ud6H`zx#?T2!+6C2o`B+7^%iKTXg8!F_c68^PTO|ft3Gl-W*M3D zT7va`;G4LfU_TkLwW_1p9>bU+i~WmQ;e`w@SJg$i&`362$vGUl#WxnpR%}!q;E7)` ziV%DM4{7fhWLdYR3#V;W+O}=8(q?5=+O{(*txDUrZQHhOXC>}_&v(A=`$qTa(-HU2 z-aqDwJ;xq%MXXrkQCuI->qSE!4m>N;qLFkXUx$i{#UI&$lX)9I%_^>7EMzI_c|`g1 zwpoQ1+$EYX9kH@;=Q|Q4zh?(vxKss>}=;4hsjvHKI z8e|aNSk4__8cJ#H*vF+;+u_t2Fq82SpEkmR13kN}=|62^m`2JN($V_Z!?uK#Y|JF% z)*A4AkSOno6nhS_fc9aJ;BN+)dL9;68R)B+6VJ)YS1ubI(O)gj23jPWaZk=FkXa zop8=Sa0*0MA`5Zp$hfsZ>=i;_wAg=UQs9iFL(Q$3PK%s)WMT?sctOrQm=C?IgtDuG z+GNL3)z+P&lB^R;M3+dtfK)S)NbrJXk`)iO%cV0Pgs$|~%xfeJOvS?{vK3!|6_v+w ziy25_@n5@X7Ux*8u3?(3;WLw+HO0-EoXwi&%aJBqF|J(zN#R&$5xwIyu32I~LNwM! zM6$7cnvPC68pE=i`dNxkskK%8!zm37Q?c0I`m@PdAv!aS+E@U%pQ>3lu%%yV++q z5xW<$hrhFX_??d7G8#f>H_C@(jf>sKBv&@$gZ6AxVu_wIFdX$zl>%mxE(_x5RL(qP z(rFK2Ju#FDcC;od?3j>yceGIgZ&PJZIpfC;W|F3o8%4J~{WCws6!nk~)V{$ZX9MzkA1Qd#K^GhU<#u`*an`GN~=S9D~G6jXBXXi zptgiMC#pG6svcK_&)|}v5mYl7NJ{ky67{F(<`)jlXG%iGk5Pj7S!D{SM^)d3=8jya zn)z7e8b$J0Y_-M>cJ(dF)TB`hG*vZ-I~>x_8yL34nn)~(Ar@{?WcMJW1n+?)v<%7FI=}Ledpa0 zNuCWOnp2wz`$IvMB|@S=nZZGYmcoL9QOlSS4pAixFQ5CXtRy<`c=Qu8kom6)SYFeZ$XqIvDXeAR(o#D(? zZ%MWmPjA^y`=xbR&!rFlg}Mw)vW%DnerXl3b=(Ds!_>?piiqQp&>mof1KEAjTQf`w z+HJP+#UO5S#Sq^9ZV+BbG>44TcoE zouUQApZMO=_j|QLJ&Q2%L?j2MJwkL;6ea1j&8vF|JvYQgCeoI={-83}$vMe`lBvml z)aVpoE448$rv3z4dCh2SX~@|SoVfS-RZ`lZE>{=@i(xzZ%S^@r;TZ{`n~a3BK`bE; zu$cWI@lnuuMls0qq)-@dDA}D{CUrXk;$QVi_qrCA&z?Qi;8C!8Wu&bs>op%^}m@#zjJR<%5cI(Ag zb0AC|PRY=wX3|XSMUFdZKW0s0y2Kl8-!p$=dv4^tqTf>xGWperv%vz;Ep39bXDt>U zokcN0i@x~6Z`%Ns6`nm0>EVe8rnuCuKbufh(MtTL#=Sqdae@gr;v_{2-(C!GmtY!) zm_LEl3n_kcybOE;VxU z7pE#IXk>u>3n!r(=`dlK{g)8u&|`+QABL_6HN<{Q76PQ&aC<6T1>?6Vv*sG|5ytOh zae7)^Mx+%#N9d^7!gr9A^GkfMu@EXlIXtPl8pRL9_J*9>!Z2(A7Zl zu%rUfG52#b=+(D=e=EY|LIA;orKTts=8z{MP3t(~rTla&{h1?=FlW6vALbxDidHEZ zY5(;SU@zHdAcu`+E!kMYRQGHUqRyH^&3NUD$=#GP3LPL>*fvrp4IexPk*8L1h5BKs zOX_rHfIcX+bd)R4)n;>4^^wvp_dWG>UKYQP+R)|{GF~#m6!VACN|t@7;@p-Q8jjdY zv}8~+o!d7=hCT_q&{UI!?(gNetHoItg**l4JIAltglEIzoJe#wy8U%SM)w}2E;z`V zDKquHjIttA?c{7Yo<5hAqQwU%_4|fN7uLVoRg849I8Aj(;mwp(vX{e{lvOKKRRjRf z0((6-S-5LG;$d>wa*MbA%8n9?1dY5;PzSy)5&R9TMSsVwzRntq>D$U-&+;L6!?5a=8Y%Wet6S}*}}ZIh*eyQ!PHQaW}Y>jz|EY0&=zxBa}tf# z?do}y$os}EhmxHIUJ9Z>o-i~8VojPQ17;wq8t71nkaQRKDe+?{yeumTBK*I4^r>U+ z5m4YuEPsRMrP&r!J+=I?9M{ufjIFP(gisWAVQNBzg-MhD!)r5hvW#zTJ|pfK`%2eN zp7pc_J@OM_0v~3M>?xkjD#Wnb5dnO*dSc0+kbkbjU&otk68amsjJA%2fcnnmOnD&v z<>K6|-w(UgCA?oQ)CU|wNU=o3;UM{lm!sH*>ON0;nj{>@B5w4!6;Oyc&cJy;)gx62 zcgXT|Hm1hfWO_4N0wU2%BJ~^i>d5c6k~pzKVTEuHDBqEe4*I)8MH%&+C7be2 z6`<213;*~!Em2Eg_KPsVEb>F24-qOw{PmWvUU9b3=_bwDmV0j?AME-|;k91NKTnx; zcmeoDp!m!T=D+8mu>Kng$UiY<4uE9=BP-!w#{2+G8DP2puL0%1a}EA`0?6NKD6Id6 z0K&=)!1dV(|5*bo0PF_<^8c?ju>76<0kFULA0d7w#((4^umisSN=sk{5DvHq*_i-# z3jZ=K;qQD0763EhzfxgX{?7ei{WshXfMEeW2jCbu0r?0Vgv=ZOUJd~0=K|pE|4Z)2 zzo_Ex+z$Y|(-4_3=Ui_W=@fU&VKS&q<1HRA5_K%bN zPkjH7Z`}sB`S&%%JK~3n2|}J)eY*GhBzEZV6PI4aH_dfPKnOD9Z}D$}OO*Nczwf2~ zB#)O7uO<_(vhbp4OndWYQ^dO^Ae=tZ z{2yIt4z-$D=n*jjll_zum|{fpOHns}Xf4&M0cn0CeIdqi14Nmzs??5%(am4rtmC^9 zcl$Q&yfoi9ZhkcDHAPg9*N6KM8oT;xhI`zCWyi<7B%i~xuF#1IAtB!EJ7~@qAM`7+ zMl^ox;k@_6JlmTjH9MzC6m7X-9ayKc_q8Kzb%oUgO zs(h&tUU}GOMh7y8d`Bh8;Axg?GhzLrLY)5T@U+(7Gjw5hA4*Vk+ltZ@wpR=49B00y ze|+GrT0(ru%jp9ATYQ6jtskX;dHwZjdXo;kae?)d2zN5)UtD#--Mo7J7%rI}4NQJz zS1lAD;7siHdKHY43+#Ysr#H1Uu*Zo4Q2rxL#W=LQJgW{$gW0LXT{!v7!r&0_*`Jn~ zNl~z3d2cic4ect9Wh6wX&RVL|JlQ(X7RO#bxtsQQu!^}zT!)e|cGfueFJU4aj&G#L z0)4IbKOR5je&e~P9N^zeKxxSC6ZwcUx!B96;|^@_mPOV!S$tE|s}RE_C8pUqaNSR# zlIM&bixCm;%k}t%Z`d2Inhv36g%ZXgtWtx>=jhR`MJLw!;&(J*(Y|g?|0C?;mb2Y& z{{p`<9qjYfrCAyK#ibaiyO-#>W?Qg*^VO7>-6fp@s1tmKuBw)XH!~rz;M2ho^2?{s zNGY37zo#M~P{!L^N<9AUb`ke`vQvS0uJG(ggN?V!3q4VO1$ZSj41X!>VaL<1w)Y#9 zhc?8)o5+t!;13>T=*EiqzV^^=T9O}Bi(rlfNyz9D(odF;RLUqSbW=Zzv8i$w*_lhz zs3&R243)_m7R%_&(3X7{@!q+?rS>l)lye8ob&IV{*8SB|+8H0xk1|R5!OA6YEjudx z_&AH^+IeU~ud6Y&kBn6JIQ^Ula5y|gxBS{gNf>@=vEe5L5pl`D$f+x$)%ZEJ>l9VS zpMDh88I2NY@ZBlwJEI;yZhnT@?}7cSktv(!RFraV(c*3_x$)3IhB)k?glC{`G{j!7 zF;|-X&Xj+~w2#z*4`M!H1Jap`3XT}Cxw()3Jf4)UN&!dsO-^fx!d_BM46z-p^x=jA zYNS=!5@x*Y%Dz|u#MPmg70(et@GR~IyE2_wz;A5^Zw<$@<^Gbz7tA_6sd%)OnWh%D z-FdS?IUi2M;i@5Rpm3xoYId}CX!NtUbYcDuQRuuVTIix^N@9&0ry0Q+L=AkyZSYu# zw-;haVf3y+ZOjkl^QC{r>dlf9=hTuL8*)3M17htZEl`l*p_wszwiz88yU2RA=@JuY z5MId4oCPRW75_@e7CJzIN4S(E@OoS}Knwju$Z=*W7gtX4j}#qnomHeEj9|TBb)0PW zv{G~!E|8$G%l1C)FGA5$!q6fyObCj39OwxXC}uSxV+0GJN<8Cf(Zw8R4QubqA6&z;atoD@eaT{rH_PqkD2rQ$?G-?_3(CN8*5xwOd!nJReOj z!)DH)I2*LjP;vBjEyB4{g)?8IHM8)OkM8P&tQH>Z93{Lfu7z!=}NLoCW+gcTxnjK?+A)B+Lk~{Cum=i zyJsIhFPpAmQYF2g_@@$<0SPm2ePA8&+JP=1+wTY%$8D(Bqg&$osFG}g(8qSR_(JSg zgLH%!!=p#)sFAfYD>Ezb)X?b73!rkF8*E8$FK};eT@&Yn(|UpLZlY1l+|i0@k(uV` z4GzMqRjtOj7UvN*zm0kEDG(vD1M+1f`q4*n!L8(I7DKk%3adYsDyz9Pn;$Bt+ZwGq zm*|9ED%S-Omv%vse9qZt0w3j1xLPXLqk;7H6EP$7oxLvSXAlLQ>bCa@LkQE5h>%zo z3E||5{=Zv`U619V%gl%o_M-R~PIYe6k9{`V-Yj0V>y(&pzY%D@ZJEO+#hOPjismF~ z*8rAbli(YQJsfu(IlF54A$|nEN%o!S%8g7=VdltY*-w(Ja9VZM0i9+O;B1+v$k zDkG{TUd>r_)0bzF=cX-a8MR#1)u5ygHL^>!H2+*H>DJfO1;dFiicYDfjjSsZpuP8s zE3w51VUmVMv&gjML0jw8^%r7e7FVvuXATTik^&_vdYueRA*MzZ16NwzyEdljaQ%6Y z>mN&ZgUu9$tQ9to?GHNfK3KE`AL%>k(QVHhh-6@^R%oO{F}Y=I8@}dm+^t=1&X@8U z7w&B;d1sJ`Zz0nVv5Db)nX+$j-+)qUI_)?)u7ZX;{;c`b=HX1fXsg&^;YmC8CIJakck*8;226CO+2y+bGOq;aDy! z34wGTA5vI+$xE_2eq$fW4Eu?bG5F`$p&c)|0~c=YDfaqo*`o1^_?XOflx!P%kYe7b)c_MM#%WN0r>YSC$i|G1O*2F=A&qYXK*HL~c?9!^f@_Wx z9_D;TghoM-o^|*PxylM-8NC|Hd@J#fm|^se0lj8{dJp-t2udUzX6Uh?#OLep7=-os zFf1kef+KHJZ8x`=Lv{;1Xs|oO`I_I6ejSQH8McZEXT=iX!~cHFBV?p*$s--Od({a!K$0W8#OSqckU3jokdE87=1$^(-#mT^f6Gk zw`ot5uHbl8EVA-`ScD>)lLa^&fGjx*EECcx&uExztM0Ts7+XhMx`elaN<_4$@4MC0 zexv#Lf>hc`#BS?*@E*BU_n`hIzw}MUe8DR>cdJa`(q$Zm`NO*0_H4M{r(W6OiR=BA zMcjw*Q2%3%{_(H{@KE(q$!6y$Lsjw4&QTQMqp57w^XhEtP>Je#5@!;i%8VB+bJlHQ z8oAO5mMeHGL=(ptw^v$kmy6I9{1Li|&Q)fd88cEma@$StrvfIUUytGkbuw^19 z@skO9NO2vST@wF#S{zv!QOB31jBh%Yuvf1uS(T753Wwp9BZ=CAIMw>`%JCSjbp}-4 zm80=?55K9T;iaSEKELS);!|rYN|oz!CO5RX>2|935HacrgvFosyRjmk9i^76gQjf!rx)OM59(6FF5AA|$*evuAA2c74M89J%ExRG}F`I5ecs%_frV8lH5@ z}o=u3Q6 zDb~sBE|x5gp3((s^Jurmr0M>}R~S3TE|Io&n!t@CoQN4CoOVNVy(%D&IFLgjd8dEcW z8eKjdvm>mmyXkkT4!sCh+=no4(*a7S&F8aW{|Pe@VwF-NN<-N#w( z(MdTYR83xO1cuOA27IEY51k1TK&S}`qDiPaF%TzNt=?#^$C+Z1^wSa@c+B#S$CkSo zF|1<~BK|m}+9PvzTz}iS=_Jtk`@sA_FAitgtRtp{To{owB)RR@1h1$x1UoLW@k9eK zqMptpPv8t(eKSS8y+S1a3K-WWl>W6l?`|uOPbSLt&R+g|-qJp!m`S}A>+IEpJ>GdH zZ>TZ!Fd@Qdn7RDJ`LSJGn;jv?DdVFPyR7}ixjru+lLXb|DkDozA98{XSS{;ghkv?D zhi~~g*^`CtGd{Uw?c>f3g*VY$${C3KJ!rCOOeXQ%cuo{pwhH3?_OcyW*@1dq+og|r zrV7dR0Vg?<@+~r3%DGpEH+W-IX?8e<;|%AJhC`(_(SG8y?St~wPROeHInhp9l&j!D z_)%g6m`A)>*Y?Ac1a3z-Yik5+ZPt?t$l~gk*s)o(u@%gzI2)&t5!MuV$JCP*O%vr< z1CnN>h-jRz^4B2Ddf#Xw&O zmg3H*3H)bcT!|5)T_poyx&m69)W?R4{i8rn+*)ViJEu+w-tB&=TuJh+xrB1Mw1T4B zSD;%DPI5Ir!etWz7OxJOZ zmxSk7uLZ&(2lfksJ7$M==b<|vSf>NE@D$9#E%%e~97;QS+FrYo_V>r=o?Z~eXAMEClw5+otd?aX}Iz=%OXTDn}7Ee|&J*8M44XKD2l9Zoy3%{p#E_ zs>1PgF}IP-OQh$m#qi1;8(aM1Tv;Q#zm4Pty3FDd8tr0ZD2-LL_wFVQ0nm?swkY%N z_1Yl9a64OCJg?VbC%T_3oL;>zoX@`f$*RB#|Il3_(tVCTWbvVw(E1H7sz1ou|MHub zm`=*AtMmmmiL@WpU8?SrPlj1~K!P%pxtvo8ud5g7dp-$2H>UCu=2Gu?Lm@m!YL0?s zA6uE~>Nz+d?Ae#S_uIT|hyxr5D$CjCARa{6L!vJ32vAfs-06&prjs33aFEqE_8L*$ zb$Z9GfeE>%8ntSmQm;x#3&S6sgc?sCoMuFAy)Z)C#@7$Fp}Od-WkWd{$ieV(TNZos z+4?ez7Ky8{Q@>MYpG@VILkr%PVn4@{i+n_6DyPlDLQn>w`WF_jYx|NCVkJ;T&kOR{ zd$hSf@(ZsH%~g5Cmw3J@bZsModdM=^9lES1r7LbzK-ahtuQr9kX7{ z73m63DIaruKUTLJXYVqja*$VF`2G851?v>Fo%b__71_PNCB!6FtQwZmvMYR$Uk+5_ zDcw)Qpr#1q`zdlV+J0J~ak~VyI!1(05hgJ{St}VfZ(cA37ASm2ZNkf+EBMW@Px%U7 zQ1$`sLNSc0K6?CtcvrF9hA+NY51b8wlbo{6HxWj&=i{bi5b2PD7d)N3D{~t-{qC+(U~vT%wb9{c3h$+0A&? zPhu~$OV+`vyzd*U!D;6krn8Ut)zndZQz*Cx&fJ_9M^D{{72f~!q|$3XmrRT@o^2`4 zqxxJp)N>YAsnlC_Y`3}qr#w~_q4C(qw*==+;ccTsF8+dGNWA~tWqTRA#eC=06a_Ef zOwxF>Cf_*}+44F8A-<*DireT(&A<1s*%h!6 zHOLeiR`RC+vLYSxe&y8CV7A30IkA+?teaaFAKtq2C+8eBF$Ec>bHtaihg zm`iXK#S#s(eeK!hu2!iXJ=+P5rc6>_^W5a$$oN^8Fuj{ey>M-jgVge|abB}w7DL9EqS*JS3V%cPC z)^L^`Wpiw3UIri2WfZz4@dXx$r4*O`1#t)m`R+mAlSOCX5veJ4Z?xcqI`DzZkt0Cp z$&tcrXfqMYDEUCk?V(y~@s$;|NCa~78X)I-(Hvc61W=1`@YR&KjUEXC-1z$BNnGM7 zRFpjsn9HcVQ5a63F;zij2ZSOcKSU{?psn4y5|^o=&~Gs;EG&UAdJj(uXJ#s{154Fz<}e_ zlK92y4h#xE5e&tPoofNUGrWQbq?*{(J1C2HNuie_hQfo{^H)y5HJ1DXz+mV2$h*8n zg78aZ09EjpaYGfePaTfQ3vlSnlc%y+8)P08CJ0jlbl*%+Til7^g3kv_bpJxJ=}iQJ7SZ``&)vFYUPlX|W3G7` zG(<4~>gV#3)M2njd#6;YRsuQ)$82t>=EVQgAS-;z%U~;f%CV@LhTD;rVlr4DIS4(I zD~Uel=p=lq-b@-j^OX~!&BhhRuS_Ma z=QMcvu4aSX$`0ff+{xf9(t*}|&2FQVhoFy3>S@7XfOT1TQ}06J@?B=HnF`X_8cnPd z@$^J6WM&#`0-^ffIejL^EfnYBLM4Eet5I&GiH&y?V~HHU!4h@q;Oz zu-SQp{+%EXlGF+yc-sfHAtuF!qK8JKXDJ(|Uu(bUhL}TK$)gvQkMJJpvXK$_L4* z_243d4(JAoYFk^um=z&C5U6$$oYmwVGifrNRn#!xF%her0tE3+M36kr1Y?lJD?#}} zklGMf36`bmT{TO?r*UNlxM%8z#GG?Trni(K(|)`rR|Bpo09>=K8M5G?6&!OW=!n7Z zi+2KuyI*r5n{MZ8LVBoRlMl{$h00S4$YNtI1Dlj^>8WovMm^M-Da?6AiY^7$<=&Wg z91?EK!Hc}(K{?9FHJrhfTL9Hp56n8K?AH}qnL$NTx+{xprvZ`czk(@BmTjep9u~a{ zCt1+jhp*vw!D3IL?%hNO45D1YaZ0vznINHCX%Gs3&FjX|sHKFKGVw`V!NAWkKu&^G z=h}?u<`Q`v<_!0)R>kO@9`eV!{6X*Z%3zAE9SP*qwAIXIk+9-2!#K@68GTC&r{DJP zH9PM*84koN5Vt8&CDhgqT)pLk3CdD0;YJCfwFf)>lTAIOuq}D zc-c;5W=(h8-<_kGx8#sQGnW=?uLs?)>Ux}GMpd@IKqtQt=Klra{BOk6|HL@i0jhsM zYWqJiPIiE%nC<@!Y5lvFn)TmkshJrW=>hf#tXu%xo0E{4`7ekS5b6N1uV?vx!Z`mf zr3OSJ{3piw-$<$d*$ZZ7KyCor|KAH{mVYU3|6jqZf0t3S{qJPdY>bTm(8T{I%(|$n z?TFKw=;NCBCDI+-Y21h{xE-6BMji9hl)SNul0^QFaSD`75rqb&R3V}BKK_m&&~XMR zZIiR(wZW7_bvMN@p1_a)Sv$K+xAM4o{@nR))3w-k`TX?p)V*#1glafbQ%IPESpM&#v* zZ<`{$KYbh(w8&%&CkrW>phM!QuEOcQ;yz}&vYkHMx@#iB4 zCr`hK93MSuV(TmRps1T!F^XI7M}5{oR&6xzWG_lMZ@$fXZ#(NZvTObfvf`k&w;uov zHGz55qfe`jqd9GhcOYISUG@&IFAGI$S}{d1y3F%U9U$Xv+q{>YsBl8X3u`V^=!u64 zCQ#xcUGC(YCYHoYJC~d}X+u+Etm}|n^=<9};lja938JwVR(Wxv5MC+`tFw zyXC3{Obf*g%}a1$;xjKu7p+i_MDy*oBzQ@eLGQAj9Nos$&1RH)az_t7##QB})g1=3 z)mc|W0ha3@h@oE z1x?kcb^>!SXD5Mft*e$p5G4poY6))0Vz%P9T`rDd@89#VGdu)SKHTzmpow7sa}ySN zp$YIY8Y7iwbxmAX1VvmU)Zd&ETN{|sw-wYV$A-`WFESp))Cos430vYcK0r*ox|s3y z9;SLGG4(13;_p~LrkYu)#$^}w3H%edQNw$B<+gBbp+telvEe@{bGWpKqDV-3LVz1N zOu?4i)s!ea3YJ3mF$=X&I8CX{Zu(H>BX2blQF5yHN{%7yU5u{|Wng~cZ^(mQF9jsD z*Fi|wS6pKP1YPN}N|uJm76HS;RoKQAt)DOgcTi7lQ!ps|TWjj#IU3#DDbi7|`At5& zTK<+eV3Iu`0})vnQNb?gn5NB+mNAXLH0zq0ygW4neqmY+F_cnfdOtxa7-Z3TZR|{~ znXQ47txYeR*>8vtFH*xeKiJVS&x4@Pc+AmcU_ZWL7rJ@W-+v>xu^~JCD01Ktfy6`Q< zzfRIF&!uUWW_hu14;?q78)9y=}SIS1}eMy#tlyE za5GYi&kcynDVEJC?tC)gHE+3l_U7-Mjap&C-sp*65rGjr&OsZA>zU=(leXZRygz-= z`aSjr>fIw6u9E>0I%_Bz4VxE`y8-4sJ^)4{;R)a_Ycb$?;hX3s3ks&q6o zQ2kW!>A#i?S@to+D4cK_fvv{$@Y4@#z@7)sfKB}LkaQ_dmQj#Nnxa}V;h6%J!No5cavph%RC*ssB7$LKj63_-s&KwlDB6G?4FS;Wd@CrB9TR0e zg|&^Aq_T0MUn9wRN|RX~ys-v@{wT7~s1L1)2JWC8{IXAr@bY!?-%>}YaM{C*eKUbt zBc*A6_G_Q>FjnRzAeG^}mm7x-+2Ml0PyXq#=v5LK10SCzkL$tn_=%F-ik^InZqL;_ z)Rix!z`vs>kZ(5o-7uD%x{NBFroX->GU^9y!%byO_>b7>F8;mw131Ts>^Tm%!@_59 zlc_K-hi_$9!QVjNyEnG>D2~R?l*dR{Vfrl(ur5(3$zlYloUN^zXAh;&eraY5Fl~`2 zRw!uh<7GBo3>|nS#cD^0u-u}gER%{emL4rZF|EU4?MEZR`W&-@EeNJnDW;LvXIVn8 z%`@vns(0AkZH$mGo}qvZ={Yg)1c!%xOQYV4iUw$haBXZt12tSUG>rQXd=hfRp?T@? zV<$0Ud9J5r=_oj}plY!gXOr2}H03|Tvc@wjrm$ug90qCMhfa?CS4%3fb` zD+n2y2}UkU0Cd@ zoX^ASsr#pxB@P2_a41ZP$HuiAr04=8vZAV>mx~v1_?{iABJRQPDQNgFWi(NS=;(}y z3K0m%h)(tanPR~U3>zOpejIB(=GlOfoE*QEp3};h2fJ1*n9WH0>u?qB_yCYrQU7U` zU__8sHKXg|g;*X^!Cy9`kR_Pc;#Z#b6?z!U9iJfEdTw;?KL@2Nw7&ly7)-3HxT_$i zI-5V(6QRBzWze}wWiD$bH@8f_S&;3kS4n+?sAGZXr{m7YOm>v7_YZ1EsiT7uwCHr< zpIGyC`vz9XkY1Cp6=NuVXNTttrJIdIPET)fu;-27tTE?cmWwaO6&$peek(;0-Y>^v zANwU?!O`V^yKq(FI#{~NDOv7z0Ze_HN;%klA@G`@5ES-VrQ6N;)FT!&@4az{EigL|F!HGZXR~ zY-%naXBML+2@wMyAiYek6?~v*NH|@NaaOI%!YE>TgjyZiy zrsog_QK*nVn5m?d$K3K<`1TNW4tH9~qV_Pu)#6KpMvLl_;a(Oo+(u&N6L8jPQGs3$ zUMOSDNqUQn?(BIZOgEVNAlgCt*1)X}E|>N5G`XVe3&5V|%M_ql)}Ho<@YodEYqS=_ zdtA?vv-67rPf8G*Bi$T1Z)9mgb-*66Kc}3k+xrkMZoYM25dwKv3KbW)ACfptvrp%? zhY8r;*i%K9`Lp+ZNP3NohG3K`X3$Rfp4;|}0&4jl9fd_3(*K#w;6{an+K*fC*8`f}4h3^h--t@u4T~x?BU^hLm`u z$l#@!Th=y%$bCjwagc+(ONQjqw2pe?#6WHiD}qzXXV2tVuNv`7DGvA7)z{qI$ocmQ z@w3nbiHw%Wg?R|*;F;Q}uG+>!6~pOxe3XUUMrRc+H^uS_ti5%I8xq)nQU^Pbh*sPT zK`!m0vPxk2siX*J7&;zAOtug6+N{bPpf?v7`ne05i_+e_g4-~d-lj)NI$SLbvB?R_ z`;`j5-M!`H;jw>KqzFKKMtvmVXl z*y0!)$s`kQV#E-AvaG-mR~?m&Yc5^xZ)regkh_4koYB|8jHH3nlFUR8*CJAHk&%M> zL?-Niv%j#P!y&6&aLxvq@ZhL^~Qe`$o z?POFG%J5B;$gXQiP{x$G9yKreQl9{*N#qu)XFvTpM38$P9@@#@`|XkzMg+f{w9-H+ zAm9}a94;3q&EIU?%KjZJyf^P>6?5T=3jtY#$oT@)k?Il9xCUtVed^Om;I%ojTmy)8 zi*lyggaQHPiWebo8y2D@ESYjPsuaC45k&zTI>^12g%>LWV8#eWrWraP?cd76e(vu2LMwQp`rlp#gU3Ph-h2f zkkwlFs&TKbFmTBcxoPs=`U2bOG=EGRi+^DrWg(^5fWozKoIaE|I7)417grOQC z)1yA>lzU5tR<+%Nbg5t4hRnDLls`@&YgsJcpRu3x+K$>MalROC93@>=;HEo_#C!MV zeON4LV@)c@2;EXGe8NF+)}HrMbIlB>zbQBRVM**q{Gvo?HVX{|voNF2d#yArDBL7Tsmz@uJ!*D@~Q5W<_~Z%+!I zL6>yiUa*Q>TiBVubhU&;qeZ0C&X;XPp?G-LXF1HeEFq)aIr%Q@aTCP2dBKbDox#US zM%$})IB|Pau6vo(Wg=OAUX1g!8qcHf4yMoUKx*8ue-)mLoA+lCSON^{i39>NZh(s9 zxII#p7Gq(vUx_Z9qnVEzkUpAOfRGgqUj{#-Ok1*Nq&v? zh7U;W_9cbiOuujMEQ*>+?QRpEC)m|(J`#x_wm3PGpeYi)_T=w-O^cvO8JPTAqB3w4 zNP)o9cuP!$PF^3%UB-%Bw2AD4wsyrj0ahZhQ(;BH)JuBZm7zHKp_0vUXYvwfyHx2Yh7dc{b!5rPWjjNAgf3$hGBl&(nX9|n(pUg7uJ6G;=5$7g<+Hx%m%Dn z#*Gv6TnT{yq$NIVj|zn$g#O)cSWUj-7<~)q^}Y! z#L>oO`3;rZ^b8|h?x&?wR%i$IIzwImpmf7jTMq?4 zhem~^))oHc)a{5{M>t=BfSIEVr}KcU!5H2@8DJl~&Go?ZJh5Us%N^rR!ZhVGU!`47 zPLN=KV%&LLiKRrStf!;~K7c-4+(U`L0X`(86JdBxVE>3H317tFKe|Lh(d<{D?zk`a z(2g2d%TkkPh->I>)T56h72O2hy~WTuCw~hOvOuN0i3pVQZPkbehuIDKnn!FN38;ph zC^S_2{ig!-=8?Q2WXLRVdHTs%vyvcfQ0dO64Wr{XLnmn{R+)(W8*wm(z}v=x`~RC5SRrHSybwKfYfQ4@UgT{ z;(F7_lUIiYtYobSVM+DW5499A(w)}d`aA8hgzZ6DdmhsMtapUJ!j(Kidc0;Vlx}z#TH=jS0)-4PdZIK4E)Vz7%!@C`Jir}W@qvK zkVQs3eLln~8~;K)$B1Q$q^IEWXBYG;il}|`ExGHcNWtH##D>B^4e41?ld-;BzNx5G zJ($)0kjk-2^fMv4&7b<1cighG)`tz9Mq1Z@rY&D#F~;}KX2RfZtVH1LB~f5L908l* zPqcys&cT|Yx;3;Y8EL+VvP97gM0~+}1ximNCCbqtvGg}QhHWxA^B6DUj`}J4Snlvn z5=4qV8C-$bs9NW@tAN(O?J44;ovX_b%#1mTSlhhI>VxZ>C~^k6rO*EoDom-nl`=r! zegR`To?PN=)pS?2`-Ro^-6q>0|A8IbGX)_D=0bbMT$ei1|7)Dbsl@b`Kgu!G5DD_M zIhOBJjCa~lxcNvXHLFS(G9B0r-&LLTK zSr{K;IZMEu`M#o^wN(_AtfC27BS;ma*wzfDE5G;-xup$KdsGMA#%J93Y+h5H_62K9 zh&GyorwbAO4@jvuZhg-q*x@36D5iUzu|xJFlwkMwpHI*ZjEgaiLhb&~es^b6G8i~b zyTmY<1L8m|gB*S>;H^C3XGKB-^xI#S!$?s6h~j`7!X~LFBpHd2$m28N?EC%WnqzHw zaKv(`7}cK{kHFsF<%Z*}k$7F8`C;TR^mj{`Mg*xHQSfqsBf1A4jo$5Zp^~}c=Dd#6z2gqq#=r#gO7&wX#RIyz+&J?fw67Gg`} zu$|K*sK37~xW zzbt0i0alm)O%;Dv_W&$P|HnBiAf@&nHlnQbfC(xS6Wd?Ts!Z%m^o;+yihp>5{$ITS zXlDLvFaECXVf#1gp1*bkY!3*~1ysQdu$%qMzVqKy@z((PKdNBo0{qYaTE*YhJpgmy z|Ln!T*3|&)OaF0_|2gpO)Lgg0;Xv~KmgBpl?HUof=iF)q5B%Gzn0}AFHtK+AG>}-P z&QI%nINeFo(aLwtq zOb&r~)n=BqQ-jl&ImDgXZEkS3gGYEk!V51fyv;D67S%+cTR- z7Y83Xz2$9uu3e`5w#sdeH4JDARtW{V!ru>no*>h07#w46@gAyE#4Are8A9RJva4@Tin^qLtm)ZqLs(JBh4|LH zYK|)qE31rwa%k~HwFn(`fT;8{0g_ajGcBZ!vn`&v_{et#FC%y3eMO`I%L*2cxVWLK zr(U5uEr<>BT+;fgHU|?v^|HM%NbKOkLH5nxiH&-!t_9Jw;y#bk$e5OOJ4Zig&a z^HFN^N} zGWsJo4N}VGTFe}6!N~5ySZa?murj}1enz>Dr6D_5DLl*H>3y1vZG*fu#Wpw@PdFm3b}8+%`?S-lLDU@;I1lUL=|!- z`|O=mPVpCfq1;a$zU(E`P^Yr0!u}@8QW#2IfIR7WjCr7@C66+PoS+6F1BK)?J!l}TW*;lyOM3C0uw7#=6NBG0vu;LNSKP+O+2dJ73Yo8n#hSdx zx}8cs`5i$Kxp}@Cm(>b8nkqOACs?Kda1GJ~IvC+>hwMvr%-H`FWtBD`1yMy+^L{nDVTPJwi4J_$HELfy#=o}PUuuq zOje~A0bhzaS*mw31wILRYQZ(cjrbM0)UXDEue@`CSpoWSOc3e_MY-atuQ|o?j97j8 z;Er4qQ6IQI@i*o5{=GlgPmF!m_F``JB~pvS(F`c67AC3}=Bjz0X=1A^pijc_<3XqF zt#;;10@TnO?6*I7p4Wp2i1B5u9l3GsHt+UQceIrV#n5!r1Ik_6R*85O+H3db?}OVL z@ahMKi(+f3%%+|#d30)O3Y-0T#Kryf_X`TwW~-$|X~=vB!dNUPgq zlw#ql04}%I%tz_&Oyn6WRR~u$0xc$1+Re|YgEwq}aXPdVrqxR?Ylv=upcbTc5a?Nt zk7-|-itN`y_v2(Ac(xrq^q5P?jR6w4ot$d}+osJb2T5vy=g*X7BKhX5{M75JSgzIN zWUZlo+9krRDV&~{#qW5RB=9y4LIt+0+cIZx-wFy^06>zh$VOw9}%C z8;_0kT;135qr4irPGleGoo(bZdWp81{|{^L9AsJ3G!EXL=Co&~?P=TQv~8QWZQHhO zPTRI^_p~)_n|q)4`M%hVU+f#Pf9#DoaZhArRb}B+R%Io!!{-mOT%OlPG)41u7Musd z5uRc;c_=5jt!!5BDy*ox5APUJsWIanaI{a|rax!ydC}zxqEoT9m!Jhk1W=JA z@vp1(iAy_Reo<$k5wn>_s+`I=QiYT}6$ERwntHDIY8vey1Bh!&mcTH#3O!c~(O`U& zjRB10&rZs$mvz=!YBraXB6xEV&8p$n;Z#k3&Ut8MT_Ht45bFJxUC95_j8n7elIjQ?>9&kOp|2?*G@YJza+30Oczy&&J@ER6qn?*=h( zX?;g~vwzZP85ltU)Bl45dS_zg_^14T*!+KI-XN#j|3_r=b6g7>oaXCxzlB zx0fpcr97N|BT8Kz|I(O>%IeymlgZJYUZfnQYDA<4ThxYfqtK+twx%T5E|sdaOk6zf zraki>&4?8zsN4uB*Zr7GER#zkyDLw2@dW4<;arewG~cu)(~is zXU?+XKB0N%eSsHB)&s_l$U2F4r87?!)Lb(xCS~HQ7DFTz)0f?=?G#yCTHokq`r+#A zz>~Z0RG##Usv*!xWnHDbcNDxF+^$|su(5OcY=mDvN_pn|RIWHS3IbA(0Jg>zz=~cN z+CD)^#ZIufnXVW%TI^B_@J|@^KY)>|KunsiOkMoJ;4n_!*p?+ksGP2Qb&HMA6ApZp z2Cs`sJ;mI{Wn$ZQ!*~_AbH6B`X2{}U0Ll0t5P$a(#CC2=YMOMv*rjRoMwD~|oaprd zPx-+l%d?9Ds-tWW~!WcTQ!n)fd>77yp>AM(*rr=ZviLTKl12leFpc@UiTa9kn zmRA%8H#k`XZ%Oj}#AZswjREZG`61FE?H!XQCy5QvuL+PXr^zh$Ci^giFUhc?GQFSeU>1+ z>Ak8GJq$sfBmmP(v3GCz#P{)6sUa>xbT4q_9OrIpPJs?V0YB+?LC`Pcuge0&2(yQ1 z<4{R03wm5N7Z6719JrP~Ju1ysRmKWihhn zU+huKGC51tYb+SV?l{Z=@E2N@0#zeC?oTKq4D^4&<;t{v-D40#&qjT@heW`UmmI_o zTWP9vt%Fm8$V#>(#KrC@#PS5!ga{cMc3vq8I$Nqhq(@}OB`K=Vb5~I_xTE#)Y35}# zcIrz0ruHlrw8$4$*$t_KR_>Drzk4FOaDnm1YFQL75Nt`s;>WMh9V%q#rD`3+01Hps zXL~D%hAdGF3Mm9BNt-yvklUAWsdxt$sb7Wuc!bZtxOooW%h}VBXIPkVjtAkM5M)^|HJ%YrT;SJ_ARoC!-n$VGk06rz$%ugtjJ> z+ANGI|1dBq=CLqkG#iPt;U%O;k9HH`NA`c2p$trS5{4?{H_V}&O30_ z0g)vgx+bNFjX^~I&T|fd){sop-^aa6D-M+`_y=~ArEz5!f=XvE09y`Ih}(>Mr9#6T zdQrvCn1iPt*3sa&m+{YA3#U*0%1~J(SYxw7ZeIG=I#<6xTapX>GG<(!wV~mv5HszZ zYn_0p{#jwbmosH=Isp0zx($E`_8J1mi?^ahK>Z2&H?mNs20?G@;-wP*rFq$b%lZLo zQ;RwF?cZN9%;H<^rq~l=m4f#7@vKGS@W`G1(oAffh(LkgLHR6cH_(jeIk(Xc5E^(p zk2JOK3=CY`a!kXj3j}+AzH`cB?Hk|eVcPW~B*()AHze~UXv$Eh0SHZ|pIk^%dMe;@ z|G4=A1zzeoW&MxgRpgp230GiqRjWf)t7<&wGz`{Hu(-4u5YUW>1YNVT=M*fN10fT& zkdB-HEyOGriiV!t4;~swSV9(ro+*Vp9O@&o%TFFl%zvCZrt(s?L6S=JYZkfi6QK!V?{z(}arw!iD)-~*W&D_;gX~mS z#~W;`1^pdg`N!`P*^Z2XE?|urLl`l?f&0wYN0uG_l1Wx0qej_72Q#MebDoG2&P^$hkY{gYIwpy|j4QcuS zPZDqdJHHoh6_A$4>^I!rMp&FPij8-0?xWKYcO^oXjGKj0xTy5LKE!ksiF z!rvviAnM{hvC`2dh)GpjgZ$9Os59fm6=8qzBW}0D$iLy%DLR}}6VK8K!JPx-O(hd% zHui*Ze=XG-jnAV)%vcZNs4Z@zc=D$Y!UX*Nj^}ywO8KPGBG=lj-wB z!nAcDnAm58p-O$lL8e}d?zt^R&N=O-8w^fmKOCm7b!lFc*A&~}BC1_}VnB~~ox>!y zE5vEe=t?5lcxno2dpwA=;I!q34Z*|^zOtQH0C1gYw6s9I8{X1f0T9FTcE3?Ge2>PHRo4ZvxXcXNuWQ=(5)3?qWpJKSCd)F74rktY>$> zkhPw|VBflQ`$7e)5?P0pc)7c9Np4HpNOqR7vhN1Jcv84~=Z|_uIt>}my4Ft3X*^7yXAwsk zUmtbUVRiMKp8uZ47k#|p6B|u;MCSEKa??XasrwVjcB`5B3cNyX&O~(=tmMc@jp=+ z;$AiVm!|wE?Djl2iUNuvM5=+zN4z~Fr7Mg5$qpKMXu_l7gLWk_@2`!Ck-I6C5M=0E z#RVMG3DU5(YyRuWsStk!4f*^LtqA#L`Qo7@bNxtOBeR$9xQk4J>drI?3mmjQ{wjIY z5y(sKQ+-7qu3OX(Eu)cdDdrZ+nQO%>a+H;9_(L3U4T_$|01)Mr+)qTI)Ggkx0p7Ng zPw}!=-&PrEQg0*u9=w$yLB8rwoPZ@f9mh|W`NZh$^FIzkqx*(|&1R;Fkm5X-6|D*F z&|ij2W|ZI5u{S~e<{XK_ITfhlwz6T39CZ7_QRlqVsPJO2>Kg#*CLQ@1#C+Bvqo z<76`Cc4Q|qT$E3QF_MlmN`DDNib$ctOPs6()H~ul^k)s9iRz;U8Q|h6rMB^t6em=t zj6xUg%faCUtIqOm2{MX-SEq;XP9lP#=mtQ~@IPBE7oEpp`5IFjG!x#Z{xt~ML7)wu z(>_&eS=Ogk-ew)cdx0jV@;Cy9kj}XmQg6S1%sS10l`QZaBjhZoOzPXH!RXy6@h|JQ za2~>*o3RZ9>dd16E`65}f(L3Xg)4|kz~#OzKr0tjs}S7cKb z64B<;6>TxYJQN!E>t~F^>%B<$ck(TN<%y_5gjfKn>vg?%i_V@0iBY$S(kT3fl&`~v zeo}(LHxB!Q7V_|=fS^Ed8k2DoGyO}=L7pm~uYf+bOZ?Ydja+}b>;PQtW=`l^4YCEZ zQ$Re48=htaI*Y&6G^S5oXxummn zyU&WOa-tvE*5oDtyf%W7IVVk5r%Z$d!-|w=9RHeQB0PJOgzV?p4UH8N^-af>pfi6K z_CuV1>tPQ%cY_tAg90ymb%qaay%3{_vLJ6R$nYGjC6htCtlq|wxUP)WW#Z7w znxf-8z8BO~^ux4v9>x?Jt4k$e=x-lszoKjFpZJnKQ~>8oqoZ}+b)^+lQT(y*LUk%7 zOO#UpG}bT><(|F`GvBprp|kXEudT!8l(E`H(Y!4qCb}naJtMt;BqQQ9M;FJYI{Cp` zB9DTu1!5|GQn22f1ILW{kHMOC!K^v-(Q=4QRhhVwwj{(;i zV}Q{xL2_37#Zc_y@1So|$FzW@aSfB720R?$scz{4{TiJ&u6b6YZ&E}?KjVj{^YcI} zgyoG?9X!KOZU&n&0qjj|Y3$B%(lA_Ba-gp<#E>*nLI#-eFdS~!haJskL}RLIIFaXA zH=DvbY2ijKax+2Ng>tYa2A1@QOX7}TvJhhg?pN!~lVh#UhdNzU*MzMbx#-y>bD5P`Mt}dDSCSl++_ermuKgMPve zMF&ok6w?l4@KJ%#P9o*iC;FHmYYN-3=nm5IlFS=&3-S)1|ns#f-h zAE6rlmyI@q?>=Cg3U^!oMTqr}_~n12;r+h~vHl}vqEj_9ax^7ire~)U1DctbI)Xwm zGSUg!SlZYt+Ugqu>4bpJW`;loQ2{yuGe-wGpuM1tm9336(AtrJole}^5om8~V+j&N z5g6-RIsoYurS%;wK%%aH#ZmuV+{4bs`hUha%L-G$(nbq{G{++kuf-5rFpcy%d-Unx z?eA0$^5+MV>*d^6>ZotXOL1C0V4faA`TZh5hJpC<@82%+tbqns4ab^L`Q%YGTW25b zmKHw&a%fbobexh8CtD@!yz?6Fpw)bJ)?))F?QGQ^vd*9DKUF>54{N90!=8&FmrG4_ z%jR5nb9dk~vUQ}OPak6U#2`SbRH0M~Gs+xW_&e&2m?sY1k*of23=U!F20cl~Z;Mc- zzRLGCNq46=Vw1V99OUQr&!jxMuqUpT7u>N+sZZ%tZ_=3ta_a*W^ zXh?@n@jHZgwDGf*Ky?Pv3k5&#+6O*{o7ZEDpnDsxgk{RU%|IQ_5s^E?P`pExceO_$ z)r3j`vf}77oc1vn5yY|JU(DpZqye}I;APr&+~27}1}Tk041r^YB}Tw-7IT3%{*#~a zgg1;jbsth7pXggOcy05;mJd`JJiyzM%{RBGL7SZ-mv)h^uuaj4lxnZ($lT@h_xxpG zcu0fV;=mOv+6Ixla^;Ua><)BJRws&597&v_W{}g*GN0Gje1Uc3P{RSJf<<#K)@g&q z{733e2k8fN6N7RnFlbAjKnN8!Y?qVc)hAU;Wn{Jv8eVb$SH=I$>Q!njd4SZ zz#y8%v&n{5R=dKx+R+m6g$>0q@ntb*Ns~0AqPV1u@@j?2DQ5FwnP#~ri&1W9c??pq zq`4Mer*7nNIFpmsUABZ$%Zde$eUVrDY@5O8OH*BEy%h_PNF94KU8#YqMukSd{P2ZS z0=hi7rOUNM+j`P54J(Dl*6vgeH%0vWpv6Iwc_)7(B9S#H)3mYTtYh6ScZ2n!(bZm- zGE@4)YBcy4yKMarWrr!#aBY?L4)VQcXa;SqG<XKeIs5^IGllbX`=WB|HZ;a_IVMn{ zG9O)C#uCjc&E|BcDpBR;$}gp@C40>iLw+n~$jk%k1EQw~YNtgUhP?V)gKH$(gOA0h zbW*DG>Q+tWt8c5OSg#Eff3wA9a@6ar3A|*@kQbz|zRcFR+H`7V=RX?Go1mNy-qVg^ zHm(30;EGQ>)SJyk=DjU0DDIgrzC9iHpvFrBf86^1G1tH(SoRvR96A?#v($BPDRx1=e~# z-%Zbzt5>gRR9hC@b3Xq;z{#8|Oafi~A{QFWHE{Ld%6@MkAU&OWj99|K`eHXi4^=_5 zr<0A=RpB{#lw-Q#elXuT{qR0Ji9NEQJMF1OX!Tp z^5eJUDlS`%)9X+4E|F$JUD-R?yMTLtPq6WmEb%=G#7WMgNY=xyU+RKXWNZYcp*chD zA4m2dBSo){$cK<*F-u-aH<0IFxa889&0M;!-k>;`WjIO{1owcyWt4vjc7;8uEEtnn zex%L~lX#g91#rZy%Hn%OnABrJJb&35f=PdX^v=LaH-m-mAa{6cp@C%XxiLr~dFI*H{%5_$?AWR6tfE*7MM!ff##BlRLv=I+kt* zr6QL`cQLzYFkAsjoYf;y=;#bn!esfI)=)KiuUM}Xf{$m4IIKGEDE|ixme?v{%X`11 z?4VagCx9YrRG=+jZuLNfBZLl`+>_QHQUfBRqA-|_Mog)vM_sRkrKNS${6SCBq~mnq zy6<5v6KeMhNFQ{Mol!K;P%q5+XCsWt;+5?C4LZEA z`g)`c;U?i;{{h(-eVq}kSwR~enc939s3|N(&VoRJWHul9aQ#E(e5nQa%`?k_ih$NG z_ZsqL#*e)<3=9P^TLz^fCM$^b43S?8PR#R`c_nVVKRd-VM`L&}i}a9GsP+nAplFjD zMSPoBfMP^b`>SA0C0|)AERVQTWfY&{BI~1p7-zlY7~y)`66DxmCzG!GmM10PZnnQ> zmNZSon6S}}NxK(!+~{>E;&qIgTP`P^FyLXKs*p}6jrPybUBGSxs=!IChS}!pOEBgEa_3AEc!K?ZzZ?OFus`7anW(z6qA2RqWZVyk)i*8TB#vO!TP3b1)w2oynNncnG?oo!(eCMw+z(tK1g>e7h&r1Y*3Hm}k zG6Ec*)u{EG1M8o&I6pk3unQ&=P_wnlK`y0N>Fk?o^Z}WPbE(&n>I*r~;U^vphB3x zIxqw{Ow7`dNRy|ek%v(EugF5rrFbSLaE*|FnG&WO-n7EgqzJ1IcfQzTlB`4zD|^v~ zZW!0=uBT|d3)6o6<)BWLB25vs`!|(cm0f$tM{Uk_cn_|s@Ptw8+VVBNp|eF5_jsW+1B+Q753|LSr><9FS?dIGWhlxJ+!gz!P#`BR0>I=&b8Uxazm@3UA4>7f%n97W(CW+g?=P`l3u)$%rIN z`g_ZR&+i54iz!LsRVRFDObfqHz-^Zjv84tD7jo(n-BQSbA_LrA{=e&AZpoDH!CG*Z zC_fo*FN4rYfJLEkKZw3zCxj-|zm$B8Lj%qbTH|S$J}H6Gadi)+EJwq$=Et$A6RMH( z*SLH?jGn{&F#su{cyFJEhYXR4t$%5NOJT}{O|Bvq-+d#7#4x7~;nBV4T&6gCD~b|S z2Iz^QdRXMJX$&dGr0(TtH9098>EW6ZtW{dL`;YQv2|?_6Fov_kN{<@qX9 z^N5F-2!>Z{ak$R7qV`O=D%~7IP}B&Q&h!JZ zn75Qh44Shxh67YKUJ_&01Kksaee~A;IEH;V+1lRisMi?NDKJf7(~^{^A6s97&gra~k8 zEC&ZLLnqZeJ1}ZMZRG8Vo;y1j=~newQir_DDwEIu{oAJShfYjGTyHiP0&pf&d3ad@ zu1L-$>^$mJOMob)4&Uen=uuVcl!sD98(X`W4KXAsICBMy>4>(LM*|0Vf{$&x0!v+C zZu=1C_jI%>plI?x;EAdMzL$g!AB;E_q+`*k+U6po%iqe)Y7;(#0DviErr_Qmz~OOP zHseI{2rxhwoJq(8o75)RqUe9^Cf75pX_H~fbo8RT);Xa2r3`NJP$Mz1dHu`qxY zq64F|N^S#+ZU0YinpF)qAG73M`AyI~{dTN926In$Yj-CpI2?rGmQCkG_PSlq&n`vF}~2ZY&bv zn9I-|A7HC?7RZNL@~+P4{ksa92@1fDHWWXqc7|7G)Fh2rsDK%O2@b#kV?rBOW@MD- zv(Y-4z-XozjoewM0&J6u?cI=IZatfI?|m30OD)BoFd5Pt0(|!fqQ>o$&tCW5+oVSy z-AJ`3BEbOB5osg|*WRsvZ#&JqaU`YOuWf%my3zL_0oVySH+8wMh7KNOsFU~5R>h)8 zb}DpeF4Zsb-Lg_khUWXocO`DvZ|~{00?>Ojq7$V{z&&D13??5-0%2c0NZoZFv~hvXUe#= z4cj>$lwklsx;JrTVv7B_QdYuzkLVb8!U%+p3|m(bBvOP^88LdA(Dy% z`dDGxa~rPmE8a(oEGTZqQ7tt0hxai6xtMb9EA3u8qIaavCPm(u`;T(_&;aJxx`i!V zPw(2C^>lQT{dL zS-sy1cLyR}+NjyPh{zlM7BrVh>&D+Obmi~%YS@kqvO&GW?VR@aFOS_u^?;o>;Mc7l zuI7k0u;X0lvz;tV5Hwno`OcRHe>Sook-P$;!2npopBFYZA2>+HIY+6RjSmUjm~;;7 zjZgq)IEQ5oJpDB5ZVRt@=k>Mzfjm%kLpAQ>Db*XthASED-V19VVs>5^*x4x%08^Z| zj>2VYJAB6wT)Op_4q~RcoFy5Z%oj3f03fe=x_aS2f^MZIQRz4}GjQ=6V`dYmieU32 zgFna>sCD?}>O>w_>0tuQ#3lVQqWWwI%hK(g^2IJoWGcac&bCny&pGw0G zCZ&JG$>Tsx_Cp)ama?;ag|O@t7*c%y4@{tvU1W84l9uz~+OMO=2;e)fKNam|pX`$m zd;OD@I^n9SNZA(F0ZKp$tG@xPD_7_655x z3d0Y}(R^!e@@YzeF#tfc?@S4;JeSMy4sezdFL64uKiVN58`U<*<0YuZ2m| z)66`tQG8A#DldD#H7R`%1Z4~v*4q2D4)WQEUzJ>T9bpG-n|55of9|g0wOkeUeQM(- zco~wr7r71`{V%1`rbP(-^Sb)#dSczes{sXJ+#u?*x}!JGe_KrZ><* z9np*GpK2NCjn5b+$PU+5vh(YV6i5X3z5{GA5cP+c2jb0=CO{D$K$%zg-piz0O_+-1 zEwl`h;Q_WV>;?OZhW$aRG=%4ak!E6hb5rqY*WO~706m`-un&(`-S(=(m2Az@>6iw*mZX*GnD2hAyyh2}su!}3{wj|%|k48^5dhu6D0Nc=}A{;&v z!Ek(|xLJ+tv6xKya36LX0|C61122Kku?*&|i*o$7p{7 z0lw9SOk<*BMzKg@RIMAE@PG zTfBmSB|3XjDzS(g1?y-uDs|DP!W;B-ZG+%L^Z>x8G0^5R#`?Wsi{ohFR7S#BM&DIj zc9>p{9JB!$DpNrl7m-1}eE&V@QY1A@|8i{`H(9JxM0DGUmCtv`y*r*&TIWg&^1Lo|aTZEn`3EIgWJ~)8A zb#-^J6yVzu^4~PMPZNWt&hgJ?PO}5(^gQz781X1Q2IVjTsv+MP@KE7A4AB@wg(~D5 z-(~wH(kyk;pVe9z0ad{Y1Ef^n88A_A)0u&_78n$gpi$Jqv>;^V(EXOMeLn6);UNtD z!xzpZAr$wqW@Qsx0kpHW^CK+QFOsqVF49AR$RF>ERx{QA^cOlS=Dt*Prgy7?C#nNz zp?P6CCvnt{|EOhLYt)ZSi(@>~`(pd;&gpyvvAs>-ek$nQCopm(SSMceUA@`$h(^a2 z6Wo_6L>3fY>*+@|?r{y(beMK=sM%3NcgkJ9cN|*z=5AUCd9e`~yQGS{>=}}7Ee5Tt z3uEZyz{f#&sz~{HLub#yIEJBp9`T-Y1H3s@&vUNw`=6AHyPtRyPvJrMjktfYgd+R3 zhOS0@K-*}oxOX7sC%rKs6a3x2E5GG$L8y3je~BxWDG39`v~ zT2Q~{-A+@cryDE9hvCk6YRkVdL?urcj#&9nq=1f+2eH(kz9_DnEBl~2kh7Pv{9QR3 zkx~7maD}gR$nb@SI3xPqWkcVa3T7*G!fM%&xD#Hn2YHi8gfid^N0Y)~ zOx%xEPlmw+K%64QCT%S=aS#t(xzM+l8XMRk@M8eq#;|PC2L;f>#w8p`ZQOUpjKl;$ zL$IFZ&iaEAdwPO#$@C@w><~5jqS2E>6BS0gDo_AjL*P=Uhf#lV%;*ss>zV8IW@^;& zWsVJyT8DTtFdghlHqw9ey}tw`&E+9#(*J6?a-Gj;%x!o`_WoO!c#lis{Qd?BeKOY= zU@7F>`Rela3t57gqI4$%RX)X}U#~wJ-@aFB>H~tCAp_Ah$*itUxc+nI3qUWb4CSF+ zlY5|FI5n!1{q*VE7N2F~y_eJO<2_68TUPTEo}nlr@YZRyHr7ARCiXW7ENo1h$-LZ0c@eL+zkr*@hfJ46>c2StXkM-xMBmD|#VZERM z@EoHab(;eXL-64x4uZ5T>cU#wZApXLV1W7zu06#B$}QK6HOF;3>b09GobSTKeQRFY z5>|RdN;+FWuHU$UvTDs=Yr7nHbbi*G{E68R%)C?|<5|iWW5@Mh3z69AqbsgVl^J;@ zUuhvUq4%icc`&Hd#9)mho@v(qaO|nsm?m#pI*wzf-~RP{hQ2l4&U7nxk5d?xC8NUo zN(33f)IdZ>ITl=O7(CfvjV38upE>jE7(Nr##yLOfZ*SdkfznM8BAQd49y<2TXR&d* z)v}9!sz*9wUK|=H&+8W!@V~wk{%K(<+0Y4Q;f@5;{Rn@eBdBlY1Q#bBnBT?zPP)3I zMFD1P&4F)tDcAUp`HQlyEOmR3G>W4k{@UUVOQg&la?W79tY73f!KHgpdSAwu8yUTA z&aQY3b2}VKrMDJT0gr(K ze;sAISZ-phL^O4z7|%9C0g_2XW!fY|GEx@Z zaSos*Hjvdn!(?MSI0k^p&WWT+S)hzwHBslr<*uTUnVa_HH&%~%sXt?F#dRXp*V>Sh z3s7uZz%mc(@mTP|kK( z;*t7MU}Mrlpc`5sOtVG&dFhHvn_HA<4|VLD!UpYtR|-scFshqskJE(Kd;gI+{ zn|Q(DHX*X#HG$Wh*sWo;9}_w+qCK;cXE$~{eD||l8tmM@cyR0iQg4nnzWHTFwM*$# z**Mza#dL3uXSwUUIG$Il3CyzqGmXYW6KhE(4Xas~GY82jPM{k<{_y${HD08+W-@8z z0`th)bB())>it|EU3NOXVYzuHu>-t8>)=V#IO+)Y2zvhLY+3pj?$ATArBW|HS~kvl zyM>%E@piVPhQSCkmnE+38uO^V%4DW=r=Lqz>G!)640L5pM8N2(EygTS&9)HFpHoyC z7Nk*BW>u>wGfTfxB}t-~quRljO6)G4&Hq~JFUpKT&EJc*MJ>6MI^UQ4RHsW*XHk5N zE^&I*I0UsJ)1%=e0h=@2SV|+aw%E?a*K>_Ic|D6|zyca{uZSWM{+y(H}v`ZNNfnp#qbyvX=4r@An)V|R^oX` zeB(t+Q+kz}w5p9%4*Oke|Aq*yTade*K)FthPH1_giuU}SXRMUn(;d{a>0+UD4YM*! z5{t71-5~`yD^g`5!fumzGDhouGXh1ITl#8d)j%tPMFesipBpf6L#A*Y;Hkc)R@~c z;Z7BP7ogPElu~`wZpB**`sMlkPer=YqR^6-8QPP$ZlbigMPdk|&1$_orFnWDww31b z`iF*tf?{hi+=ggcnPx?IBcCC#!QH%}7^(2N@U8GuAu}iFnHYIdVVFeO-I}q_@h9?Y zOu90Wx@-m=F?veT)S3GwySqz4(SiPfRe>ne;drOw2(vx9nG^Bw*8JwjDiJ3rySW2GMU5#` zKuVniiYe%Tiyqn63MGYcgTdr$8fSHCb^J&b^$m^jA9)%uLWYLYtC3bryN4sme)DxK zZ0dQiPf@Z0qO`PPOF^_LT8%b82MuTU7Lpue(lBoPnPUrsjbfQi;Fz9ygzuH%eemN* z8RQQvNKP41O^ExNY%uCt?Y*9#m8&X=P)FAc8geyY2Gm6@CR-O7=jZyY&^cpJ1Ll>B z_ri}#FBapZmWb>B?2tlQ$iIDz3#Z?atc53)KD0?SMoKwR7PYmizZUS!JP{%ig8k3G}>C!Lu8t_8!)%JCn2>;Kzg z`8;dYJzoP^DE-EgoyC0UeyM18% z2}U|8vg9`9OV2(|@33z^PI);z;F2U7H7Xa)l_YqAtO1S>e5)zuEKgHH=#*`&?P5xy za0Y(X%$Uhm4xS+dF!|))j38qZK2e1E#kxiuteOUy`BhJja>*}!7Qqu>OOdhDB3ZY- z2_es%mJ3SbV?#I?kgPO;uN;3$NijX=^Uf{scbALh1ELYb%hGZ>KEseiSgXni0xDkC5}<%&aS3tS{}=jI>g69BN=iwUSNm?%c)X&W`_?3 zq&|9rNW_o*P1}wbG4uTx)-HvH`5#3)3?czl1NHDxy*~>X^5Rp;1LDj)ylY}c5CT2T zOc-)F6RvB>1Z}aZaWgF)&kc8_{ze>}(2DS${B+LmaS^vgVL*^MfLuhT7!d#dqu<^H z`A2+wI~GTy;C@B2J{nHxyz!C7eUgD7Y>`GmT2tueO}=ORpS9|OmfRK<&Z9!*yeU|76pj%oi`PUD2Z4^LzS2Dmja5B;zdVxN zL=IK6b_%}0z2c{T;<#d+?ViKa# zBvEj%5agjM(xGbXM0JNxv8uo2H2rjDE#)ozSLsc@qX>e^IZMfDhVIP-OR(MrEGMoS z2<{nnNhpkJ(}d%MiRwpUIE{U-y{-{fJRmfIibmGONIFfnsds0H(j?;*ys|l;z-*#K zjbE*RuFIQ=d6Mi;$zSYQ@TgtlsO_flbvBaV{aJK5mCC%}L#yTtM8b;usDKJNX&Jn9 zonICE?}F`cX0t2qvU@>Mia!V9sAC(oHY0z-wcTb5*f2^H)EZQr^*x zsCs^xqFSXVjm=Qi8OPQ6d}utwsDpj6S-+$gUYi^-o{%_!K-*J|7|SMRs@e?Ns8E1s z7T&+J7kh146LfFq%cA#mI*P898&wz-^P^=e6cSyy}hSK3!)*?=3$MEDor8HeAJL#B0p(7wE46LYrV`!kH^|Y+9!WbFyYIQYwtWx#OPk*nPzxww2s9+vz;&o19$X0auZ% z3r@n+JR*J=Zm>;1>KuisGOimcJ_;Xnc)ymz>}>;bK-c&db#A;9MQr+6ZnpEX@}vro zFfP-Tlqwat1;@tz#PUsDRqG1J$QN$xM=)=Nx^_OmmN>mMkWg+b;A{!ij-U$jYj6yv zHE+cuFt+|shQ~Dceb5#gFo8eVLprpF+|DW#nfI3WHtNs)i)J~*apJPMPN8-4qMtNa zqY8oIvv%O^Mxt1%@fFRy6_UWXSaMP~jAD5u8+E(&fOO!`fh94sw_UqdRU-;hkK#v^ zZ$fv8(^14=Vp*i+g#7qq=oX>s!3lbooJtw1kXMrcO*7FZ^_h1@n<)j+u%}hq0QSD- zcN>54$GTf!+O85?UrMhv9Ea{$3N^4uqugZ2?dCAnN}av?RdTV|66*KCVNcUp>3S=w zBISJ6H|GzY&@D7Hr3p7bKZlQ=!KrSzYh!D%zqoWe`*VY*DIQ>`1=sgXq?i>WeHciI zk6)rwWO8^6<9ksQJ4wu2(QU&Src;gR2T?5i$WmVImWTtirDon)%vTTcc?q&hO zLbtwTZK3mJ>%jIq>*LAL7h#1o>cTfkYMPyO%HbONHR?i$U0+_lj62!+H|oO3gm+7g zv+8J|`MWYLKahRc3)c zf;VX)MGrWii+9#Bx0)2C8w4QIL({odP{VHv7rW@V;_6mV!<6V;3Ge6EXmhqlVAvxB zRCl2S4oE_FqD1|md&B5N2{fczp&Q(3(KW}pFcjV~!tcM8)MtNC7`*k?XYUH>O?iv} zcjZ{u+-;|U>t|itx-GF$6rc;*reWq>*twVR#BIeG$oRGO2`kk~tA1333>r;W*DXkr zRJc0@h~4{!ZXZu1j;lRksh=xVnbr=EGjN{0b@Z8U`H-|@L4F;$hgaCi`v^vAZ;-y+ zL1#y7@z+r`kUJZf-La~AS0b%|!tU5No6De%0C+f3pQhQ-1hJ7l+AHyz=Y+R545zo( zS2=pux``~8dw;qp)W8DtM;FNXlReEBhrfG2Ua$CxAqh60G+ys|ZTELZpD+e9pZC9w zJ*~{XJ>T^f92>gdew24IU*;4y{295D;m~c0tMqiOaVqWGPC#)8T35fp$A^&3<_>o; z;<&jkEokRrbPAu$!Jc_37W28`Cpri=+68}cAkvZLbL0Nx^K5YH8nB57dpi#4il25L zl&zS8Q;TnWMDp80sN3(?nU%!ze2lB!um3?${~SATP#z;TBr7@UG~Abr6<{6@fqK;j$~O7kamB_nfjGf9$ZH zbSd$M#?e{L+u)9#N;yBM{oM8IIOd6tZ{G_YBOKe{ek;NCNBT_)*9|XyQn2Z^X7Yt- zhjtry(}SQ^yy{Ckt4v)xfAPv+eBzH$;#*s?_8&D7y(q6;cSs4AXM0W)+63)tpOF;F zGK?Z=focqodhO}vH4$0gQjFpoq5m)1z5*(;CCe6fcbCFFad&rjcXxLRcXue2iey(82%N@ z)@%B>-xX=&n&CW5hN^5SF@Q(2KM?PP-PqY7_9g;HJA&HQ)kf#wlwtM7d4#N3rq0*< zvyt798|%yjLmDk$kE^t0@s%BnYa^b4GEGJ%mOqedMo2X|8vo5~>*A)l_?-HqFJfuSSr=tYU1JLi-p27~*@!X|8Vx>8XK(>9{~z zIw|jODLc7+>6H7+NOZm97vJ*Iv*N9qFE_74uvUkw#Y*<3gJ2_@=@zCEBd)ISoXLKY zyTQ}FOAV=o8ddkYp>kP;y|t#&G7>>t48I{*)VZb{@~rbg3_AI2ufyU=?I8p+YyyT0c8vzL~7`E~NT{T4ZSZzQGKpPV~)Y_Dn)w zHJuveY55d-&kgXG=-6I@!mhk4HDy^;d@R<-%r=n8GOgB68cb>NDpBNm?N{=Br&16k z&h&uZ{Ul(Oks3W_K7E-OU5A& z=oMs^SQ)vJz0-S#$M}t;4OQL7CVnP_saX@X?HN+|BsZY$2-4&bAFua_(qs2AC3ULj-mGueP4V2rBiH=t=fAB#e)E9cVww$6$OQW)_~Ml=U4?-I~z%%K;@O@v=J^k`Uyz;0wzjhwmbe8lTB zuhtS+wX5_7WwP%g8IhJiXbp2g&C1A2;V5PC;?7 zG_9884NM8{g+ZccpC}EL&=hy3^e%@te-^J3l28ZIWX1CrbPJ$R64o-smiej}m+V`7 zE1(871k(k>Yr8#`L^7sa227P@%F!?g`Y33%M`8kA#+*I7@YS-`C$NI}#`@c(u5+2o z;=s=Auy{C5OaI96Vn%}JU6+*+Q)fX}RKroaopT5ec=4^`7GNy_P`2Y*0_1rD~x#tO7uYm^bS!}DtQAkLw(l556^1kSFeo) zDdi;9O}Q-`Ix$^}c|xMVzGjRWM;$xMsU;GxkWHfVFw<|(ETAMz$usitSB?lg9E%|K zVd?=xs_1&oOrA*hEMsF%-*+M^c`CBvWVlALs5Gz4qfxgys`P9Q+vJc7&6Wx%+t6y& zkqH{Ikg{?m7SKAyL8L5zmY`iEN;bz3GzYX|0RWT_$V5WXEz3Ct*dyjewbwfe^6DebT zbk8F(xooDC)|=~>Q(*R5!HYoVS=o^*A}&Rkhb4QuUp`60a z%a83%tl$2-AqK%V1?w%YXa*b#5|Yp-5ZP_cRL*$_UCmPmtfUK~ZeUKdMZ@M;N_WU* z4(K?-V5HnVt8eQx%hp~O$CqKx7eOupJVb=Z59t$$;fK8)pP+qO=Za3y26n|I9GJLW z8d5^V=Wgpb>ud(sXh6g(MU;nEkdJZ&sG%;ukm5P}A9FUDW(;@~-OYpp;9K-a#1w{> zlBG1=tXy$=X7;%PDTk!uD49@1V|QBeEca0Z0XinZn*o3pV9$jbJQ<6*yV|G$rivHgwK z=&u7~%pV8R`1s&q{u~&Ka4V2P3hnKHLYYliz4xEe)@F|h+?Fa-Egjb-Cr5p(>P)rE z%q3*~eSK@Cdw?F-p=Ght_r7Lw`(`>;i~&LHaSQq$X>Emjl1ONn*J$tAC&_~a@2H+aQwEIgTjSGM1zV;2qg$>$qUX(o z*Vd2cgNJ%A#EnEXIwbjc5AZw^urHuSPhEXwKwa)c`&RdvdC{ZM%A{L|}@P8>ezgsvF$b9k|46vt0vvw6YsV4}QeW0Ir@@#x$5;A=MaOBDGt zh&&)0RqMDv(3+L>9qGQB3`SdqYLpDn){;|$?@{*A{EVIPL%+4SWYSSG``KpsnNuC* zJkD%oy(qT-8odu56t&_@Cb%0`N)jGJZR=dkP0CMj&Fbag9t`V!g`q@b*$V#v@}D-~ zER2Ay<)$^HJ!#HyF&~gLC;HH@WVpEX`eg%RmclB_fySuJWmTOt@ zk@ht$Y-V`kQ|}Ihi__Q9WIqeol+Ub6qO&Ny(2k$@)hiL$*Ih+8r*6x`Y2fBan!ym0 zG|`lB$~NIkF*fqx)e;7=LXmoxaE6+<)5s)UBePHp4Fjya;{(27yRC8A+|HZHA1TW% zC-rN#g;!-6x~Cf^WiK!Of~cC(#v$1h3GZom=(=nZnjfXSE1xpdI@ZNilgq36o)vm~ z_aS?6V;O72J7=hjSknji{7IqO{!GV$16J!LurtkO1>LSRNnL?{`z=xx3pk{MHWAE= z1GMEqR1d0B7t|_N0})d-Jc@hWcn<}WO999VH+60lX+7>+EO=#2f9)+T{iJBgIbUnH zlsYJ;$p{@rubO$nTV8_0Vih+YaQL43sDkN>nV7Yg; zHMDLy+JS7x^?HIml?vnr&qY6tkb7BUM~jeXANoDh-ivC~wR$QW_3wkjtYu^9AoT7v z^w$hQ{^<7_{oqlUUxD!uV=#)Ok3e6T)UW88jWHveHG6>dxqeIPuahzg zY1$6Kr+JZ4T>GH)gr80`+|#w{#7F!DqPS^}x~IjCIY)XI0gOOmo>FjP6H1 z2Bhf9@3oLivA)!mKM!GT(9(J=sZq=_j8g5Y4L{A!$eQ*P-dkJ+m&>(YI&C408afU= z-M{f*-U_X%W&kzE;xAVxVl1GI1J6Fe@K(*gzBkWFpK5`6+78JOn*A7|2pY3~E08#cVnx{VuH$BXcXc z6{l##$hCnQt&1b@2fGAG4wzLu{n#w@oQT&PH^eg!hm$mbF?Q|mre7cXL zbxYjZA9753)Wwf7$W-TYQ^!9k+;=fEGi8Igwe8~dSARrhVK+g3jrDP&>BOh&8cWkh z(Q7g9%sZ9{S-@q_UluBE9L$&=O~IjQp+L^_2B|iMb*|SMS&q?7uehfCHu0(lJTcV7s-No13(VG)#ZbFk%-kN?3 z^Wz3?UFxD)SZkINf#H+(n@M=nYtzm{`1!ze!VcGv0|h>dmz zUuIh0sH5q$bEj$OX_!?Wh&`zzYj&a|r|5S+O5Y>5YpRmvpH=-6%NY*YRB~RZUv8^= z=w{v>+$jl?SO;chF23x4=!Tpk%oN}da^Hf6ebF475*sjg&zRq-WOk8|E23elyvjM+ zr7YJsogtp4UakIdMV=}x^W2?>kkIDFP4L3bNzf?seb@!v4_0|@-Sq)pCSQ#Do0!(; zTpJktiBjNuCawGG-ied-x;L~5^?dLvHFJcw=c+fA1BuG(2F~feHum{1?I)M#q;jR{ z!@Q+lCo?cUr%hLNtd8CR!c&yW6Kkekp4^n{ZeDJbgWH{*Pt7Z>W`{0c8leUj4swf|4zT8eOR1VDw6%PgFKz)qScw;Wxs7HLfOL>S}`P<`?Et9kS75u3r zK6Pi#V{KH1^JWT7C(o$**MIQBy_YEVHcvqxbE-*&s7XaJyT+ZhKTG=fh*$Ws)u~Cr zf}F+49P}O%c(!q{Ry4{K=C_b4qZZxsgAGHgYL*-ct7dfITjWY2G9#Y0L(H+T;#E9Z z^xre5VC-WHR^+#|Ny9p06e02{=?J?@=1q(i8RsA4InGnf-vjob3UV6#l;X9@T-r$Q zEA|K0dWO< zO518B44}u!Vn1fy&by~fVILB%N;H(f{m2yHrq!eh59`8u^jWoO6F}T6x)_XyD_TpL z`I8P(#10_%+29V>+3nQvOCmoM+M0>`$KY<94QBsWbOM}x}aHOg-JpPB^b6BX6rQMiUO$oo|rR zsB=pTc(VSSr44>!Fns&XME-M03FS4bkgjpn^yVffoZLPFQr|nKJer^ z5KRmTwE|W)^o`5Y$w1E<(jhW+Ory;q#zkLN(;fz_@g#-<7T&KF^lSzg4e6wHC+EH| zqI($bQT=s@K_TAJ<~{Lx4fPD6*e79-Hk}USS)9$EhAZR0zrR+YQfdp(a5Nqu4ff2% zy8d`s3^?nbZxf$hfj^>C5h31SZ_&y#QeuU7eW1+UnxKk!W>;$2(!7|~vsX_SV8A*8 zoSPQpgS9E+)}BzT!1uWw1XIj@U#vB$Tv(xk%?=o2`|+xcv)H+%{H`YAhLyDsK;@PX zxaXPNEN^-u%IF$vM_hl2%EF%OvhjE2djF_=00t&_=D3vMGY5NgqNb zx_B`jzt1MuJciu;B4p)D9^MNdcWG4!AK6Bq@9_&lUAs}KNfOBQDTB|$^Rfqf^eS>k zoHD`lXO-04Jlfh4UIX-CPgKiklFQ`%X7F|#ap-U?p9fUv72j?LcYg|c9}47+^D`*% zQeI96gPu|Z_j^HfH0rTR3<+@2?~J{oQ2-n3$|1C7@eX$9Rnxn}O*{Gc4D6~a=Rgug zN$ez8Ex1w2&l5S>{sk=NT10^|dyF3BnQfL5sqPIA>s$Le3=dm*h?jy=(vebP*v!K} z!AhpvM&MQjHide|wqS%W1DQzl!}Wi*MW<6CmU5xi@kn$_#1qeR_trsN#VHsx1Qbk9 zX^1|e!AAEb(265$G$QrMG}~aYZ~+Oef`;)MI{ZZV;FUt>8KR-pZ%8z2z%HkmuOqFE zyq=rC5ycLE0PmaJ0R^8FQ#s-hV!&eO>N1)L$APi@TqEg}jkwuG(Txb5YJL?^SfJAd z(tOQp3KHWjBvD<6Jh&3|Ll0g^GM2w&Sur*z6ZEP6os#dvFETy#*95~J`G4aj{&36w z$DG3d1-t|!2h+d0h1pA~mDEU~+S%sW4sxCE+BwuBh2(BB1wC5k3!)e2t@aC0Any|s z{LkiyCGcXw5&YE1C0_tI)Z?V)Dv+QW1u-VU;ozE0(gFZ z`|ll~11+O79Je+O8=@YEj3e;djb)h_dHYRo4c4C-B76=|cw(?pQTwnfSM=g<3tcT{ z^ilOeJq~%H&WB8zFh36l_nu40+kotPusDnt2{ZAJkCdE%FJR1r>Tk@`!t0)pa>b;_ z%HMRGdjBx<3148PjgiY2&INBQ17EVM~ zzs0f^;qf^qbl@lt{`n#lz1@uqC#-Tkq!r3GKzf}TN)JLk58kkN{Y?#oj-BH>+`Pm2 z`H=i5Q7cSLFXQoPFiFWoX*a6{s7|AOlT~PzPDH4KEP)oc62dW&*;$IkV(^KLJO#0u zhE7zdgKkP&HRRak^i$E*8zx@KYSb2ZVWeJ`4XO@7TR64I?Y0T-(i7J!cLmZ^RWnZk zsE+!;9bxPaa!TL;rcATF9XA3*&mJpRP$jB)1E_TiO}^NL1OCc+S6`$QG%Hu#FWF<; z7onz=_%pScuyU!YABoz~Ak||FwjzF@ z*h_gaRe=?PWR#n1a8^kiBY7xU^V2kj0Vgp2$SSh;fTH?tE`nJrPFxk}qlP@8lnP`e zf>|GAmF=RhOg6sQC5uGl7wmNpvV>#_u|M3vQl+wA|j(d(%BBW|T zoi_%nT18_@A{!clBWpwbExsV`@-?9Ql??fg62OjQ_b zqLxi90yeu=FNOl!v`Lqm>;`1S7s{q{)9yy{?`SIwqilD8#@S`_Z%Zye^A-&>&gE0A z9DdYv`tK@P7qV`cUBOp?9EcXu4Xcz-v{%X_XuuuIJpT%FN^zUuK;M1@29<$OMX^h< zd*RUuQ5I+vJy1Pq=-q*)CYY~eJYNte_^9jZ=KtMLRpN;Cbbi>9pDe zpASNuG~SswzsEg_zI@FZ{8Uk0V^1{t!8E z^+64=emia}E@OL93lzd+-$T z67u8Ch*QA_a$nWx*^&K8+4BX*zkHfx%y(7Dx8Gle8|Q|XqYU?<*A|vZtKXO4P3P1~ z3E7~mLF&ct10aOr_W5P{%1F(1W)XWKmv4t&GBa_PWK+xAiymt==- zOeNc(Mv8F}x;}<#DHN?iNQ6O^vTjF$G6N63)|!uRa?@q*>63T2f){&8{$Q8*Yh{Fe2tHMF_luBQX#0No`v$3h2iJ_g#@2t)r1oD4ljaRW(wX^)l zZu%h)!_M*t)BW#=?nl-?ER4Tp`{P#o<1>HI%j**T`Tai&;QYIq{DX;KSW@J7vA^rf z#PEOH@sX@zFD@w}Yv}NAb!8AyCt?Hu01O{*DtkJ+nA%F(nc07o{afSagYf?2Yks%I z$U>QCo4BYf>iDfrP~ z(~ksYR|f|hQ`?V@Bl>5-p+8FcC$sCH>+(m{i43aK}HkQVM zcIGywL;wcC-y`8d#0g;i`>41O(J?W8G}zGL@8oXmOdJe?Zsva{ePdz#z_WV%?H{I( z2LDlz`rl~aSUx&RP4@rMqaPuD(+^3Yk1qVX5W$~E_&?QI_%lV_hq}-|_8^%5C$=E|sLy{ONWchS z`9p>1Pg@Y#n$B4QNWuLC*(1d9CSWbbG)<%j@9%B5v_0jd8o(>6u~AD;1TT3)YEyGF z4WmpMm)reOm<)Ptd?uWzgLVE;n^0yhEZ^6ywnX6w$>_tXqc7s6DDy&`Lhgc3Xw2|7 z^=9zZ3D&%zfhol)E4i%sF4QoqA#^3#Ck3l|`&cu~OZ2jt3wvdBk&5loDH%w&5*Bw? zcw=6W){BcVTMUmW8UPGqHm3X5A2i^j4_&_OH!&Gs3kzWC!AVPfg{6{)=O??RNS>X1 zDKU;CBf03^EnRcJ#x5N@w%B~5?X2(?Oxr3`C8v&Kd%0(NF6Cr8fvxA_5A#)|Eg>edT)O6*= zGF9nD>|=Izi<5kw5HFzIhnVj!iosR-sz{%f2=G3^A&3ibz@{ zN0?O<$`Hc93o4A|3Tg$xG&eQ5&2ef3bch{VZr_2XfsDVxg@IHpIo7N!4Qg_qOz5%{ zxtQwp&AaEmwSbyiC@Zlk6+?l_d|jL&Z1G898yVx1xv&5 z%EYbLSnygBdrx{geNkW6w#;J~+v~hBB{Y9(HNw+y-P32jGQuNgF2TrBiZhk)vqkfg z?XAlnOv4&#tl=~yRMDk*d*O_$4cz84);&SFTlHvghpuVTuYC2>(EQcaY9fPZQ2=Mj zPwx(>J2~u+F%-2nz2xGjI;`_hX4Etrt&Hy~lbQy-Dn>|}@3WJqh7q^IxsW`7dM9ld z8^VxP!@1#hlc__-;uWe7;;kXC<8P0qHX~tfSX?ZSOo}|Cq>Zv2)qrO~UC2U>(M}61 zD?8oQm^2r-5;YxTp*7j3U^ZdS{81g}Vg-~V*073cR+UXxRNdIZ9%U;rD8}T;`-R0M zVYJNRQ_mL6AxnPagB_%L@YnpHpXrK;^N8_kO6SN6$X)R(h9cYWAl9a0+-5FptIB@6 zVpQ~4Chk9&+K_*xVG|qbg?L81C5+#MM!0}_AD`h5dT0wbNX;lc*Rr1B>SSY6+*Sv4 zDcly^qfkmcBpD7;>(6LDD}hKtdgrrGwLJu46DqBoF*vT7zAmy?wuQ$Su0Il>>$Q1Y zJz1Sl2wuN{{KeAx-(ueUPo}m11t*#n@UP69=_g(V0Hjb^2@Z_UP6{;O#Rlkma1rSU7T1;r?_sX_^qG<}hIYGy_@RWbjDaCuC6Qa~1EJAPMHPwjDC7s|=GKEXDv_lnmfQIba?s=C;`A0yY&S_PB4=bpszyVWL-M4%> zKAu+nU@non%$cJL5?M&LWXXL?78G$-w_IZK3kEyTP3ngg?!lxEGzzm^>t@2M)gkI1wxRZ-BTNnx1A4GZl!%e|9TJQ76zH1q5mJLqK5e zai{gZC&EspQLQGfwxZeJJ;Wf-E|q}jB(2c0^w)JtxFz@c0;<;A4|jJ14_%ro^C5ay zc%0A-U$kK&Q3byaXREI4E#C15O&v%AD}^?2!RPKpS;9#VI4KL@_Ir7#Uo2Eh(L+d+ z{@iC8I*xVZ;L5&F(#WW8FO5<>l^)O#X)Unh=4h1lTx{c7mQN8Bo5tt&+A#M74&vcI zO?2R+O(9n&l1VA&z3*j3Q|pd0w_Lz2X2hYkZm|^XX30TISk>!6$a4IwfDDtou1yig zmG^_;dXsP)^dt#L>Mwr3|E*IqjQ^K8_V?}oKQ!R)@x4-V1#c^hD=HjrKH0v|sT z87fy4UFuILO^qC&kcw;Js!96GZFW&7U-tdyPhZhHlNQ`xUW%tAw$Op(JxC~X9jy%P za!6;Qgv!5iQc^)7@-XpmI4e&MnDhPu7OC)DpRR}a71ux_WtJQevqmc^il`%you5KO zo!CO?p#j;FDFUlFnsqs}9Fn$+YG6hY;Q0Y+3OA|cOcdaSdt1dc?|^3C?H*nhq2BRP^T7epY`Qilyz>9A4KZ zAY+#?C<JPDH<~_kC(Aua3A;&wWgoJ@OP!aS{EHOM?Ak45E>FDb;dobhV=?BfgA0Ft6 zNKn*mh5@?Km=VayI5s3L>4;udPQCGclDI!C0}!GOaHskMO5ZfPK%HU@WfXm3yXeK_ zphq%6a&}+0*q;+fNdl;&A0YxT#LzDdR>QaMwbvSNNi07}jf!-@Zvv5+GseS-4P~ve zm^)7+?`+=;^rTZTD#_6WvOi)j84|!&}JT}`FRVGjijbxXz)PUgtGwG7)P=_M8} zA5XuHX+h_bNjFI+e?Ij3Iq5``&ap!m1l-%jy$2obV+>1T>o!ILCphDXy2R`=3gF+e z#Y|I1IOIu0v?0gdz5*P0RY4=z&#RJ5)D9vEi#T9=VEJX|U&0My%_|!=nQ5%~1iVrU zGlVfPgXJoDWbITY+jL8%2Q?B6~C17GX zSwvbST{^T3lk?bNPiuv9bqEK(3j#HGix0vzFxR(#Dg$j!DY(|A#t;3*_v#AH`-Nu| zI=)zP^k|0FpD7xk1r8JCxQz4hn=wm)Q(N z6mQpae2N_Jjlul!R`mWHaX#K?E4<_E+x8m-#-=B|q3DmWxhsU?Xzaek9RYUJGRaLp zuavym262k_SWgxI>6Mj0<=%mN8c0i`1iRS1o8|0)zIMdk zPj!v~mIzZu`Udc#At-mv;M4D?;A>Y%>J7w*16N?OE_!hw{vBq!gb^p8xmqzg1#x3f zd_c^g!qG_b;LHdQgvYlLq!iS66ss~uWq@F^LFHirm`Ri>rb4LIi4hm+C%r(c)-#Cc z#hDy%@p)3cQ8WfGDx}gvz#*c|CTMh6(5Z%^*4BLm4*f0AdaG;y!qf-JRZN9N(>Zqo zMq+5rOG@p^tZLIQO?gc8VIz>?@^WvL@4#cGREc7qd)z4y@w^h`xUOGIv*h!nE&@H# zOxdQOj^rn)mYlx{Pro+Lvo(75g%ZWOnVpN75ek$dP?Ui}z&~%;Htum94me1rn;;Kf6Df(MQ51y3xZ=a0qkUeIqMcNrIK5JGPu zYFBBBl~Uj3+ebYARw`*GK688}m?pD!S%+D7axn>+4bM`%oJk&6TvD3st_<{Rl9Vbs znNA$`SXbiJ_8I2kc}Ps4(72|1OpINAf}mon-o_WU1jS&#G*}xV7j2@U-szjR)EPeG zxd)9LyV4@FJJJ9-)9mH4l~=2;*B3)AfHFT{s*DZUsBStoRi8aku?2tSIhf9>8+J$x z7eiEHrsl!oXlBuP-b(74x7ne2^4BiL^}M$p0TLznZcBo?6Lz+@lJyM{+I@tP3eX>x z6&;ht;50JV7H z_U!+9RKHvQOX;1CHuj98`T%+R`SS&;5YL1w=?u@{uNQ#SbheUKvZ$bCPO&2vlKizy zU;wIlW7UeEfeyn!XmxocPYlR*W;c~W@^r-+Hs;Rj8>sZ_%j#ePXf1uc#&$=sq*6MN z#b$u!{CTH=ud-RfJ3hPwsmusC%Q4w*=G(-N>hT?W3yeN6QgX9c4;^OvU0+#-8QK;2 zM4_ZuPTX~o5t41408NAlOXdI^y&$$93GSvi*@*CgQk6OWVwnyC#&j`l&VZl#>FhE* zRMR(`CKf~GJX%edQ>nQmvMh`$KCF_ z6>dqVpY`uy)-U!hkNVe@)3MWfkx)V#%Sz=$BD)CgVX%Epw8E>{&EONjlnNA6kct+5 zlp$gK}1ONEP6&5Yl~7|^C%Qq=I9$DZ!*!O?V079EMHw4aCq)ku4e`@H10 z-mAVyD)lAW^#utlSk<|gl9+*p*B5H^uKcPN?UWIaT^kG9TQ(2&jGw+If-a^(T}!`m z#yBF)om{)y8=BJE3!2Qhs;B{kI>r_e-=npem&|o7i*lvJLE&h+L^>#yFSV@};ilju zGQU{7J{lOaYLFsL=9nkl4Hzlb@S#f&(WKX{wOBW-ZN;Ltwn@^&lfto}%;*!vOGQ=l zn4aAJX@*e&M|KjX$kdRCAs>or{S*oet9V^|&fk`0Fr44-t5kgzwSvBtUde&B32TN4V0_AGpkdv)`YHik@EX3pOAv z1L~?Uxh%NTXT3+z6MBN)>CYLqgvSuuinwZ0Q#RTvu7+{Ag-vNJ`&=V9tO)&vy$eo( zs}>lh5GRY=HYPzlaPatMsd&6RmXjkT&CQAJ78x7!#0gZhBZ>)oSXn$}<-H@w>3gBG z;e5&TiM^a%YJ}wEqV<~VMKxkdT7(ef1}Jm;@~(BqL8NmIuA8l*?K#JEwb$1!oh`8}pXunsU@18V`F31tSBX@epPX52D>zOz15in+ zTA9_5Wl@AdD>#m16h)sGK?)_Kp!d;^O1|=1F4bLqX)uRaD}JNT^iDRVs^r>>@ltIb z5(7JGwbM$>Pk^$paW%r9lUOMXEs+RJYRUoCYIaPIX?4}N)kl*UcYhO*%!0EuIx*5d zv&ojc*V*-#o@P0MlDV!whZqRaAVJGU^wpkXLEu@4KTzbvmqaR_{=C?zTcfrxuPWHU zaU1g)Bm2y&53z?slDT=BB~~a`0+%AtT4hNIf8p1yldgEPXu@gv_aSI*29{xen^(|E zL&3=Z_vHMC%I`mI0Q{@q@IM8@IsYvX&h|eL2xtGh-tS*J+>ET8oc}U2f3Z~F;Xo5b z)z%}qSlXc#03{B7eCM}6Pue~z3C{{%9+!lGn>Nan? zNsvlA2{l4*DJK%E?q*H56Y-{9XmxtkvAf&b4~f6%>(IG~nv(+y_L|WyB9P*9(U`t% zK2};wz6jxx37f>$BbgeWLqPn>#xMu}5Eg$C{tYp|VZFQ6q(zY6u|>fzIQXf#!n4D! zj5Hyu%%Gva9iDY(S^d2|_=SPPBg_iblcfwpP>F5&%Td-2$M8)7SWA9la6kF-Ar7%U zpxCU=OQ<(QsW#!f>U#R9wE(w5c}ljW$y^MV_-yg*9DADhNX8R;SZJ84GEGU2nmxR? zak?<22-lTl7tCflzfDB`pr0y}>851(qPXFg$>s@Oh1t!s(YHdo;OtORe6JRhmWcWU z7|4r-R1^n-4yIv>quVA8zB+f3UAR-B;cY=2E?o}2%ja}!km|`^Q@z5RRcF|M_y#~_ z8aEh*(Fu~X?OOIJ6eW6}BHO^iPOFAIiW48e&fXYdEu$@Jx`P*T>qU^QY~SrZ23Y(j zq`+uCi7-26iSPow76AjTqS6y3pJ_z>`mou(`ul$HOG>&Oeb!oke`9-XvMA~URtfql zt(rV774##ZsW!QtbBUb843Ez^>xWPFxLq@(_)oH*Y=W<4;?j+lgZfWQxEp#!J5HHn z{xdn0r>jr0Ae4XEbPJN3}SX+{|GOZM1)~MHM zMlsR`I!bKMoA%Ml^FKu8cA%Q0dm%nE$~_XtknAewI|jQz$B-0BTi_Av3hh80q2P#1 zq)l=NwFD0!Pm{64#?${NSvqkJ8nF*38KfTgH-mM?CEr2MsTpP+Kd72{4ua#OEXFxC zGo0m?=J>uN_Z4Q-Tc71~uOw z$olU9H2?`}wA{AA$aq*lX&%G*j?=j)be~nTp7^{RQlOW{h-_b*dq8}g;W<74Q!7Rl z>3%u-*;C^5)Pa`SI5z&Kj=lI;JNU`UyzP?qDwbf7JM^KzGW72iY`BX^(N#0el zXRvKCoa#pO^rhuCqh~)XB!5b#dok4z-ddoOraaqqu`-&sG%L_cUAsCy=DM&QP0k2z2`^4@3)$(}kXh<6 zcuEYMl%+p7hQ^*2-JP+2JS(%JI^&5$5a=asK;-LZxW6=P6EA`?Zg8`#pM@L8&LMia zM#btmj=&E}S8$JtN?{XH47u=BU|B*bnXdAJyddv_eL!UOTtN2 zf?}_qV!c1xb!Jj<@7N)cux#O9%f+RJx4C%1KG*m2=E(hY4Vp$~C7>1VEE%+J)KcVw zb~y^cNeDJbOc~-Y(4MftzRm6^#M>+Ud0Wu8;F+$b$R}2bm3AWtjuEWG>TCi}D+~-h zr6644KvYddHg$*H>tTK^H|yMvBzY{V1s1I=R80`k0F)|vxPZ4HT+Lejnr~r!bB^R` zhgg0Bnau zyC_MzcXR*&J&>Y_5(gjZDao~Ezj=#>n`y*iiYOiv7f@c}2^V&H7a;XUTwCzW#b^>T zMjweNL-0sQ+&es9h%l}LIGo9xjvHR%#l^ow!$suc1eSHR);0w)uRU#nRW;j@aM!~RN3->f@VB>p%eu|!3X z@&q32H&9^FC}nOSNkpXVY&9v{F~zESzS8(40%Fm_!)C*@U?o^l3u`=A zd1*`uY1>T?{;jEdPJ_l@TeY(gatJL7no3`R65Vk*9O184P)e5!ua1CU(~?uoKKXt} z`&`WCa6C?0dkaxJ3;tjG3!#v9fL$04BAWw|{<>=Ca&)}D66}4U=HT>W!@FU4Ac#Gg z&7r;~r;AEVPblL9rR{cp;n>K+EuO-Qp;)Pw+ z%vBVQ&>+~pnPo)kdk|EDQxq;=iF`lF6QJR_4>lR%6oxkB`K*BEKhp<)5Q~`kCg4Dj z`#ot8BI+cQhIP#C`#_C6;?)k4l1YB6rBsV$qU+7aX`_LnPCBQ(4|2eMO!M*xS;_CA zDw5iZr9^TKZHIK8sUm5;V(Jf=Us}Vr!jeLo`So6iqP--sJj~s{v#CV*F44;qi^b0! z`F#6!nqy>_I-rrj(emy4;~**pTqud^301|XD4yr@jSz<8J8tliUudcAezI3@h;fx= zdNbWfKrhUl!0yj*-hc7P|HcXZm#tn#PNx4!_y_wRfTRBq{=xk3o_KBNWdKr$v1G>x zrVY^mgtMg(D$(mZe~mer4D(lE;Y2FshRh3M#OS2x@oZk2njft@e}jKOv}JP-GV=e1 ze<&>4vOfDPAJ(A63d;}thJS3r>_IPJ>gA=s6P}Wsm0VkDld-9D3So<4&pb3bU9wn+ zdFA7h+a-H(-T(S24`Zfqm;kvw8l|)+PD+iE`0@iYA+Fn5=jg*820!AUrsmB#84{9D zgJ!0!E%ll{zWPLe0>~ATv&)kdRmx~_tBd^U)&^u1?6h4kS)r=Nzk6fL=Z`~2J24vI zG2H#)J#RB(1xgoE2onp&;8Y~NcZxz1cud+?=emoXRjfZp$`xxBYW zAS7juo18^Nr-}qilYjpM$%H)F<*SF41ahcx@{Lm9FGRD$Nij@mC`-r<0UbeLCt>&x zWk8FAITBJQ4iI^j(di|2V{S;b@iRd;7Atp6V=@(`vJ%?c@59AtPgQ_U`ASx+PjE3{ zp0EC4%^>2?-5~?cq*g4?vkC30{di1-D)cVS;qqkxl-j2}>!vJ!4UHausw%Q3%mIQy`)a}WjNM3dD*P}5iZ6xEd(xo0% zn};JYZEtA}cQAO^3c^RU!~OgSBGQ8*t!|&#n#~EgL~PhVad1n?8UYdT!TvyfsGm?^Ge$W5#ccLxxZ)o`#Q(^E`A=rE{{;hvmGNJh zCeu%x>i>@V=>CoR$o~`SPsa!Qh9^v z4_-7?)wxk6Rnwe-npk?>Z$L(4cN+~YWK}b)rZ{vZ{GdQZoF|Po(7g2s#UHQ_Y2iT3 zr$8fc%e6Xt{*QRgha9j!WI(~z88t$re_*5LZrK3^6x1>g6-W6SMUkYha`3@*)?3Gx zL?@yG`FS(2Leoy*%eQHM!K~RVqYu=;i0zo_W85G;qWSg^p=`VFNCrQZ@iU7MFxyKs z_dB)Y?$ibxQ%=c5*Jh2+!h4tVYeI+ABTjC+|CL!xCsH8S2lRYwf(=&2G5b9ceb1*I zsOSUuakz_k>GG}8(+bG;=BHZl)w`_1X?Q8Ll;k(vnB0vCh{LF&O>!VIR~()ZOkB9+ z=(&KoRre$>3l{(p#tC}oa58eT{c}WUO;Kl5x9Y0!{{X4xL<_eF~THTM8zrJOOD$mUkz2hB} zv^2MPA27UYwzqm8Y|XT~pZk(jG#0}{2#i$F-EjtYj$kgXKdTH?K8IRGq!Epwr$(C zZM?ZJ`CeYWZypObuJXWTSC^^!5T+o{xzcGiI;dp&5G1$*8f0ac$AB`>T%zQK~ z2;9xG4oC=lIFT+Ma4e1Jtu!x~f5NPeF)&BvxF9?=S)pMIV>Nn4VL`vn+*LLMS0Kpj z3##Q9#8^Ah70Ew69f&P;jXFKuzCS;|pS(ssO+7tbDKI5_comApRPRu6`y`2PcXITc zN^5#leYaLE=KQ#B<0cbi94`iMnHgbme@cYQu17q6)E4e!z1Ifyh%;lS<(Vdo+s*{} zepWX)JuP9s%~8Ge1b;m%@&vb>=PVUi(iG2sc|O%xrcx|2DQG$cSSH-WNZkIbLGr4_ z{;4Y9m(v~JJ8?<(2;o`a>x$)5`J?h@doQNAVF?&lFJ)CVWO+$|LiPQx7~y%Yf9X|8 zDI{uR5l7}K=7kcrJ4ndU^4+2w0dmsf%DC0b=SahIDK+Kr0=?JzH#4IG_{T#5CN5nJ z~w3 zUVSs?gaW&8mCFbQqH~4GcWqR^m!LI_J@!66wqi%9ZxNv?92RQblE92;s6f8|ERR3tvaeT{E=J}PF#J% zQj`@jcpta(5#U=(zr`0P)7W(4ug`^3ZMYCZ3i~SRD+~Abk zGhQFrhg!<6*6o^nMx4|tWd;e)+HW7f~n*;-)@)}p%ChTj)9&W^WerqDJjYyQZqy_Bd9;*5Imw*yXRI6Gn) z)5fVj{(;baH$*i$HVmx`;@@CP&oun-&JGI+$vK3-aw{(}bAXeY-1XzdMd=kB;tr?a$S8hMr@dIswFUJ{d<4xvR zP=&lw^<_h>&@faCePfp8VCa{c$H3gvht{x-Tq9s?Ll|SgNZU!5h^zKT05m;7tRE)%fT6w!G+mu{zo!W>A1$K9;>2J5#BT@!~r&)GJgN zf(oPbyYACA@Ud!Y`cFUA7nAfbd3>hRhjpEw_ps6koU7>2Dxu?qSo>?5br`j;i-(q( z95>8U*@ff2A2Q4!u;58hh zqtp7RunW9W52hd}P8Yl^UFNN|nv<(s z)jpECMXq+ftObPWCOI~9@L_MfxXL1uIF=g{VPN~nB1bAC08e|IRB1D6Pf(}iBZw4~ z;BVVs{|u~xHTJIP)4$bY<5e*uk2%%fWkAQQ`{=`tZYJB18XbJ)Y;Fka&Ne51?XMng z^y8g)WoxHKiZ`{rXb*wYv1;6DJ{scbQ7x4NCV2u%{1~06%_@WSi}DepWZ~?|?7)Ok zD|A@DDszN3!ATfmO7-OB%-X``;oBX;EqhIIuY&%9gqHV`0IW=n3I>Fcea$h-?HxD( zL6s-La3fF^;A)KH?`PtHpf0B|jfxYayBRTJM*(2(T$i3cejCAIc}6~_U)cx%&qp$` z67Qx`JQ!h%X=i~=-8KofU>TLi(kjhwE>+P9YNH(Pw$2nA4FS)ni(7UY0O4t#h z$a^0P5|EFrUKbnv2$7;3v3mT~we|%%sk_vlXKs|Ff!I~8->#nWH;hSAm9;ux<=6W& zq#l3^f)<->16UVzAZ9l_+wif_w4L3-pf&P*TEXQ|#OGZWEuBWByrib7Y%5;j)9El` zS~FEf;%T*a?!`=&W@GCebxn@yRGjgY)@Zevl2lpcDcaHJ&ob5?%R*QU_hfA4%-qg{ zh8XKlqArWPEML%*Csd?YG;M)ZN~vX0C%Z<1r!0b4`;>|{_k@8ckc_)x5W(7Pn!IYq z)6j%l1JyziwekI(g4~Z}_sBK^M37rB7)WL_;GT()(}OHOrN($`R0U(RuCLUu72mpb3X-cF*5&o zA(5|2OAp!P&~Mc4FfCeMlJwxxQs=N8xrmog98D_*<&eq5L!66crZUBPTycJ-epL&} z;=-VwI#hM#7h+L}%C?YL(~2y+z~sh7o&Mf|Lz-Ibpr3BW(!F&yh9getf>kp3=|{iN z-iA-UVUqmNk2j(Z#M-P6bc|zbsku`h_4ckRJHFNH26uE_)b<&q2K6}sP;S>%_X3kk z7z_=@rq-;!jwuuwuxpB)k-T_RbI^eU*|yR9-`K)udrnl31wq60(ddW1hzwe{$?O4RE8bB zk_asvk3QH&7W2d-2cm+FV9mU3AD~J5=bS)HJPHVH<=ly0-9V^D{*0)hb7&Ki{B$3T z4L81s!LEn6Fe3ozy+di!hlJd3TQZPuaX~har!IJnvM1+aHg2dVQ*OmPxrhK-n-{GWPcKY3Vvh7I&?=*}7+5Z+H_mKShlqWf-zEn4C&0clH zmC&RhkZu6U9eS8pwjosgy}tV6yW8w&XUpkF@M~-3g%0e=(bY%Qho{|Vu1pvD%aAWs z?qb=CIW@-V_kJN=;OB?FZMsvz+rO0rbnDB|EEnYoOvK&OrdEetPK}q+WQN`Lkl8M{ z?{BbJEWqHt&&u5R+NXCSBAXwctv^X1|1xIae2Yc1*ry{Z?V`1DU@9^Wv(pjx#wwHs z;?z`;6*Eaq<)+LHMyYNR|L$7Fds>JFlGH?^O_Z%>ud(n~n#UIUa}(wgx!dRH;$i)v?fUXZ8S=yFgH%WFLb`0 z4kQ)7aKYx+42xnmp9;*cpfKOMB#mE&A$M7&FLZ`R>4mJSBJc~!EljeUNKoB3%WOo$ z0Gw|Jggp#0v)Zl8RdY{G<~E<=|6Ol_DlIzzozyTPDTxacGQY;-U3shi*kxFDe6mSA zTwIc>4PbN$OVRRGeGqX=TC5AL&9BmEFFC=f!K%ewWc8~kF6*XlxECo&MgXfG!rJ1z zf4{BFgKBJYpQFqBMk@#%TQ@IWd@7ZcG(7Qm*6c4D%@13)9murxk<_;-5hp&EbAK2$ z;Q$CNVNZ)x!t|BEAvBBqa5Fij&QMu)HpQh7wB!@2-rGk@+!q~vOBQ9v1!*Dymb8G(abXi3Yq z2o3^TfF>^Chm3%8t99^~U9ZeDzph}b2d~e#29cWI2(<{g!|!DXJ9&Uc&L>Y^B?sm* zZ{OdzABzikrd`ir@s%duMoEz{Brge%T7{Z5W(8}Wolk89zG|zvR=MMZ#;uwjZ8k)1 zkRDA=c6IAfl^$XAm`GR6O_+*7^fsfz06#UF4a52UVbkcvH`<` zLgZjoK;}Te;I5|Kksw$vqwSAE0Sb2W$ym(~*X8SMq&g;7-%vCiuHR2860)Igxlqk|FT*7Sw_XE46<2BJnn)V9cv{o)xa*iAPhQ^su^6X=CPb{} zuy#Nt{cA{bpuK}neq(_B&?q&!@BV$IYejjM-?o}~ssEX|0jF*Z1AEZ(G*pb_v}=$M zBHIUz=D{)Q(dP(H)b9vi5`2JHNm?pbMVjo%E(7zjo7F#Qt1{FUf~emHUI1F5-))*o zv6ihrl_?J@0BX~)IWR&#%_Hr`Skjlt|H+=3q(2>C?{RD1s~(mEaR5W$p9#Z%@Db0B zvJ9K0*}xdL1@{Wp(iB*YNA-qS175Rin7&SiB9TS+6|JJ_P18X2gY2tseAd(>Mu628_o4n|z(2};|W zd94j$r86W9>?=FbRbi7ZYkg<|x7LnjBADkkVO6y=)x=q>(&_jlje5S)Ebnu*?RlI< z+oA2{X_#1_=v0uQ`6ZLNXA}5R+pggAK-m8`@TAX;@T)8EY zusKIt1Mdm32ZM85Edo!NXc0LyHHI6acEFbO*bRA2>N5C^IrioH2ksduBHMRO66S@Y zJ4qdg?vhw^?+b@3%y>=EmRJ;jy*o}F+WFX*_HY*>{vra{7oKN>Ntxuc=ADZ z%~)F*mF#zri| z%q3tsU@@7;zx$O0{IN-XHEB=(Bs!%!l>*R-GPHQ`EG3WInz_?%3gry((&*@cjIuE# z65gzsK}a4pa77s9aH104kcfgOZ3Tc+>zR^QK{2r!L{OlowzO9U|A9k3af9B-8yICY@gYP)Zp=#nfGBOo z*D&UHhBn{A(N24U6B!bQIe^@O@X42RZw=D4KVp){8WY?%i3^TG7wa>wFinH5>_J#} zJc2lVvi|HQZpcK@S>8t@H?i!=+<^GeeY{MAbpSfV(F|^U(Du}R5TS+``BQ^+*qR+Z zAtd+V?EaxX;BlQMTS^DCaPNw>Z~f+i9&_&-j>=HYG@3WcW16G&2+I^5r!nQ^K*{Be zE<16dyB_Y^5l2i`GnbM~D@;eGso z*3_pGRc&6d&5g%zPA7!Jt+0~YfT>0ur(N>XvrpB?9-`dmHGG%h3VH>81Bmu-07<$h zCMWq#$%#%}%3RV|!R^50snrgC7UcR{*G(Mm=k8fDqz?l%z95cTw)eOHSt)E4JT<<`U>rV+%&`2N@|`dZ=3xb|Zg%e#qpcX8jUM@Hj!q3As<~EZC>}EF6-|w@5ic76$F$wkd3_>uubp^@Y`^`^@en^@~ln{na~7b%rL( z91>OArX1k@6tJJr?~U2Pks+Mms0Q!hWa4>Y(W~xf1~3IeI4}Z4-AMU6mZtPQZ%36f zxQv?Sw`{F8Q=gcb=G_|to{-m>vy07}#5*1uir99bzQSe_ow+7DqO2`u8p5lR&bT*+ zfT%w_E=@TZ+oVv~DpRP|a8 zaB$Z+a)^1q&OA12Ne}~_tR9x9S@oq??Cw|3Z`gPlHnZED0HWvkEMyiGMg%(&dtw~n zct z`+$1{IrJWf4Ecnk63-2bT{WLOgarhmo)IiPh>jwAA;Vc!3tFx&sVPmT?g0Bi+Vm8K zm_)i{kX$}1agKRuEF@yPkLnI*Om_T%eT{)t8I?KnRM?LxOHD{e)}dz%oSz zpZh43AgFdZ1VrZ%?axMX3HQc;WsJ;#yNe#^APF{=$5hRrtsc+xjn#64KE|w+n+RZ7 zr)flk{2ZpEjtIJIvNy0=K8tQX{DXwu(4}qATjC>Psa$!4eS9tWs!mL+&&gLZp<8Sy zyBk!fIM-51b`LHHAvNONBE4|nO5hQt#eQgL35BdM(r-+oQ${5r#P3H$l#Qs0`AZ#MyFC( zs0pXE!xzwjw!#2>gf5WuN7NWa`@N>}yX$1V z!rDuy1Fff4#fc07Qlfu*0!G4c*FoCY))q;8D?7$3!)WG_UtLdq~HEG?RhY6Lb4(h$;0qX?6 zSL8m-@3EUP)(;7R%-5Ez3Z=BAzBG+xginmkXr%&PnIQQAhe^!V3ZuG&bV+uJYeeYfx7f%ki< ziKN=up*6;FvT3TNYeRIJ=F{31LEl!#%_21ey_59UKLFYFp??9T$34z&yt*&9{B#N$ zVb4a#PSeVH^m(#c{kNqdLR>HlaHd8G$1V`kvO=~QxIu#~>G!$5Qi z379jW@@_VD`3k&9BLVBAG`cqQ2>C4_+Xn#mFnccdAcg5X+0$N);Z@TJAP05(mWp18vK%)@UT_J1)0a5*`BBZ9;Ip5HnIoxO@?BKg! zoS8|oqVW{5|H6+8ha;|TAb5Lk)gKfo50=O{m$@82SU-daJmwdCaAK^4VK4Ln(1qGC zmllJb<$2@Rr6+~72V;9KPgma!gL;gw?eq;y7W?>q{u$~|J_!wG+iE^Jro%rbLU%hS$@3Fh;U)X*tmE-|9_qU{2$hn9&Snv;XC8e5#Wq`_(wo z5QZm0Nk!`d)_p2d{h1PEtps~JVP9w~)R-b+XT<(H;BGvaQ*HZ15c@;Oq?U}^|JlB< z8FV>oh^z6w5@Gv5o~F$Ilj6L^+v+pN@(r{})SwD^Vf%ew{As3Lsc`-@7N?s{4J7Qe zB@qaaXBjWz8)^e{u1hOC9pNnA0LI}K(a`GKp&hDC3%Igl_Qp{=Sf&;O*!tb~Z?1+< zOVCy|{!i~oZ6J<%XtGY!Y&qsu%~1ivAGzT)a9MXLt$@V8y*ktm8%4|A4V+O?=5@7I zb_ze)+>>^&of%Iz(vE|dc`65-aF$&(8C$0o>m~v0fm|*~GB$;p| zFq&qm6mw*KDk4zwe`20HH+F~@<{nS}oaD3hyz5cSp}*s7SV|;3x=&`HtKK3-%Tc-% z!jE_L2RN);BR>U|By-^|6cppi{lh**JaQj7)NTUiob2mWhAhpI_I;jUHVlrzbnaM) zlw~k<31$$&K{8+*c-8XEgIQR9`8_FCDUR)ypd`rIVOxsvGC0uw5M|r+W|(wq_3L>) z`ra7Nahkxq@-MOCDm8_*C8;cx)U20g1&EebuD25u{*-azeXM6C|MT`{5Q))GDe7qE z3G+SbzmF*Y{Ss&N#*1yKaP^c zS;qh65|aERVSII(H1)JC;X#s*eBqg~yCcyi>AIhDA_Mz<5!TBUd6&fV{5gro<#U9# zSX~85#KTlCoR#-P`swU2u2Sa}5Vvm9{ zaDzKW%V*~S^|HD-#d}OfxCSS?l|qj`U#^pMH#j@=YF0M78w6rCE>rmDgawvd>H@8~xvh$SBT*Y*DzC64rx7vUH&J^&KM z>WDpF%9nL11!25B-&9>V;u?GG%(1ff31pqSG-ct~nWS$<}Pk5>~ z0vfc{DmHPcDeCI6B=+3K-gVY2HZr)DZpw3}omz9M3#SwOzT?E!odlsPpk$(~6k9#mhi9=Dty-*b*{e%dDy(u*Z;|UKQ2BD; zv+0`cX2Imf=gzfgO4N8S*;!q>OD~l?-0hSbn>Zx~qqp@8=8Kk#CTP@}zZvEl(g9d7 z=+NZmmEBg1)IG+W=jcK18j2{cVl=HBaQ0zUy;%VxMNbMYu#u1Zj5?{oOfyu?id6M$ zTUWFMG3jd*=S5!O?gW|y*x=5YY5(P(?epU(cY?=H|iqA)Y+SYK}GAYo9dlZq=2B%q%de2fH98~xqKd+s{@WOFXs4sl4xO8Md#h_4rL50fp7-+H4 zdpPT_S(cf4-mOyn>?@9>b9(Ad`&DlseMN9h52htG0oH$C&AV?FUpu9No?%LJ= zvr)dekVKs_5p&_bP)=0lm(4eFlrbk6G`6sNIr^K7m&MYB5b{yuxX%U8n|NCiD4&*6!N-Ux-8h5zG4@ zF7JOQ4l%Q_{4edHuD=>F*lbANY`ee2Au3QVo~eQwD}-K5t`P%R_GUJBaeqB-Hbx>D zBboYbpT-{tjiCZ98MLMI;(GqZW#$asy3uxt^T#0*PuG9mbyMB1`;S8|p5FGJ&S_sx z@7`ap6K5ZCF={2Y)3(>DCmS74=Z{+pAvB+78x;=|6~DFxCc0hR6W%`Gm7~zFx)W}y zMoI6LTG`gs*?b>&4OUN|Yic(+d|Y4Y#@5f@?{7@S>nNBL7TM_9CQU}}NnJkjGTrWK zrfh#yT-RW|Ehk%Sf8R5|d+u;GozSg+`SJR`Ogg{$IGHI1Y9XYH;HBTkOid8RPysmz zx!lT;B1Ko5K(2H97+@CW;5QOHw#K-P$TyqrmS&_S1r4enov)1^qfE){b$g=Q#SDqL zoHFU+ra))AHFoT_LWiG7ko3VfW%JRh_qapsHnqK@TT#31HyI1Gsq>GCFs|w`u1TrX z$m{@@yYV`0t^)6?$V4R4 zq)*N66d&LsNbmfHb}KO|EsLQNHqO&22!u#;85cmiECwX^~||3>_7Voe4*2Jz@aU)J0yQMfgRgyLn7^x384e*gv1WoK%tCmOI#IoEmy zF;rix@u*#c*48_D{;RF27N%U8-+`~HOc)}b2nz`q;ZhFwVs}o6K8QlRQ01({N)Rgj zM3&gx@oG+>PDrnMqT;-HXIE4jaPTG}HR4Q(pXclEQ8?1tEMx9He>(6sSyDDj@m2brD0zn_qhlW)+3-Xf7p~vwCnCCAh!v@+ z#}agR59Ra?J|fIKyVjB`Kc{WR)CDN?(D8mFaiMm|nwr%UU@+`!n2;AWmfIn`$-TB*(Rd)3ZjXPA*)#(7BwgG3uWJe>z?~mN_YZa&0DY#JH zG}t-5>BVQfqm(b+GL(#rWq&T)1oAMt>DmMp&KT_oJuy%+pk#hq!@YcM<_BB>TF}nc zq4TxxyVau|7uv4c2o`h7@HS`j64&xhw;}1CK1G2Slj_F()T|)}`u^HR37qKxPHF)> z_)jsg-fMWE>8WVxY}?X8%Q8dlUy2uc1c;sXZzPePddj{CVp8_YB#It;L^G?+$D%4zu?ifYB zklUnpRdR5JDY0gSo4RN;JPnsG4YqYRDWAsv$mArIZRKYkjgx#h zf=AsX+=Ag;B&Bk@4b84KK~1yK(mlon&C`=1%wi;O9ghhMPJ;Yc$y9Pd(Wz7;k?9~n z(@xMI7H+A#cH2B*&5~T8dw2XCehUH+pH*#+gpb3SY#)NO9ANw zh^bkaAdM{eGikV9eiU~>#?}7zWz2H4*kAf55gM zr5DWKM+T_ZA%ez=)E+cu^#Z|^*Ngv=E#ML) zS3x@)j8>_v$F@m7a~~2!IuEuI`5xw0n0AYp^Q%f zZx2WF46G4nhNWg@xJA1%z&@a5Jo|`HIJ}J%FH;U7W`7KQ>nTx^-usd82vgF-E$EBx|ok<^Qoa#kGOb~d{OVjhng$3IR!VNk$ z?5%4$u!9A%sVHJz9*#${Y#1qC97irSQf1|~WiLc1m)0oFzZ>LUr^i2JC2mX$&IdZH zP88FmfJI2TvmpC5n_$h}BTrPlBkI3$KhcLxE^)833YxaW^!GI31k^B&P{Hk4yhk)b zW`fG-7`ehlWB(-lFmfBVw3~$Zl`8Jg>jg;H!)N_!LhlvcAsJUBb%2^CNM6m&3>*p^ z*>Z@<-tI8&3Ke5R4&9gRmJ~oZGUYe{Xu=Q$^}`>kp`tOX)MkL=udqisk*0D$cS$q0jjj8cZci_yF+_%&gNcU} zky0}bA+Z*6ksL2K>4Z#$R4E`5=67yV+T@D;d$Hf04yC+Ty7CK`+hR z5E>>Rl>N~s@_1zCBryBIVnd=8#8bmj%3`%j%KvYG3A(H}&c;Qks4u%LBGKtq zP_S1R!NC?7lU?=^+orAEK6=w-g&<_=+$oU75K{n<4cI`LVra?s-2r1trkLX7TSr6_vTWcrSPW5WhAI(=y+DCNgm=;>bRG>ryjyR zZ!22u(LV~R$M;|KmW#-0Uns%gK>fU})y<<(livWQ<0_$KW-)!0xmqCOZ7zMkdVl(Tq~ad)Al(OpAb`! zPF8-JfwO6DxFA28W#d{FsESA~TvLZ51R~J3gn_G4yo#D#_=6tX+;H{*dZjL9reICf z&cI{0=G(>wokz&L3-xK&cAm9nZ&@(L%m^_tawL`2$u#a;%3lYA)`?BUR*`=xe{XO~ zavxZfLREAch;dmsb(tW`qxr8AbTf_R>Z2KK^)K8GRQH!l=UMT)9e0boofH4m^2Gt? zb=7+rl@D`|urnt{5bWHja4-Id)HD2rH{u+27CbUE`1j~w0z#nI@ir|VF8D5EfjM+` zBx%B2w~(&}#*0-bMSXCFmRwg2+7E-JF)f0vG3}(@n+Y&PKQ zj;Y)_<#{mA=Lh8q^2c!le;X;4xDrqSTdWK#?^r*o1HDwlQe>mQBe1&ht16QYx1yad7=5swQ5K zPzu!~**n!$6sIu5m)48R@nlFLFDbd1*bSpxI)pv3$m#{e9U-pu?mNK(n2t{qXzV8& zWR^=l%8c>X1Y?5_`(%Jv%vIofeK$Y#2 zCWW?nFO{f&K34@URkMry$-h;$eEch8EmbHR&Pc~&(L)~Ies>Lm1%G^GP8m7Xuh%Gx z=cnu`evWFP9uYB8qH8;I)6(O;nQfahT6q|V=n%FdimM;UtC*!0DR}-TGCNuW6mHEA z6V9;RZG0!3%P^HP)AUI^*uz7#Hjt5U0|<%GCn_?qFPeY|Wd3L=q$ET4&vJ^ISZsWK z;Nk}2@F~&W7$?vfyQ0CHW{cfgx{t7+12>_4k1Pe5yl|x(1~ZM6Mgd(LB+*x=I1~w? zyxH0hu#Qj4=t5FbBDDBhq{@fdZ4%RwJw4Rf`sQRjQtZV`8U`^BGve)NztZ-?w`)C{tXH3EZVQ$y;snJT{ek0VURH^ORInmEC$Y{utTkX z@bVttR85;;%^y2$UQbaKi~0l~Tgyj+x!Nlc_d;Vf@BBX~vQSlk{lp>Mv03vIZa&+5 z*=&7kb;cdQpKo`1-kPF8$Ax_2HWS&q6}PG^1;I@#IXS$7fKQQi*C*12l(u7|1jl8O zBRC$E`F$8qc0S(k!r{$9zZm#(?`h`wD++gaVmdKurt8`qDgAt6TDesWLgg69@GkDG zlMpvxUpRQ5bbm6{72V>>)?L|I3f!?HS70Vj8R`^ zBUQ%_;(`@xtZ$)Kg5JswT21v$-ATjjTpc;AxMlWHrChI%jKC5nBDHrO03vsywur zsw1XwXIK^SfM<=;Ady^c%Q2ts+bgGHN_Kl_$I6U-~sq6G!gGpC&fkI+LYv9wFk2!%~EA~F7CQVywe zS*+(OIa+IztOkA{dyi$%ZHI(+L2WmvhBMXzb*Z{v^O34jA{3pP_|Eom`}E@J7_fo1 z0{WlC9|ig>U-%9MJvjx8AL2=9;|*m!Z)P34&3VMk(WdTbSXQO+p<^3R$Wm;B;amu9 zFxv%jK@vmvJ?w&pC*=56mKSQ`Op0Lic*Isu%MCDvi=|fK5A=&6T~bNyVh41ziI506 z^q0fDItDlIK0&H6db~98ERZF}S6pJC@{OBtiTUgF8}JU;a#tNFc)Ek0&8^Z5xe0Lv zE2J(HN?}0r>Ql^zf1Y)BX0Y0byUll`S;EszT`)@RFNMQ^5uH!<8VRQ?XO*{-ZthQ~ zv?|U$t@%7Eu2j5fG?+rsDat4;zxqF^nb%}C%hfur`tX}hDWeH3l`{GWokB{?mbbjh zz#mT#rSMy5Usk5@-_%&0+_@U?iEYQ$)!?zWLf;-ulCz=_+xV)1<;QA&FemsdgTG zJ`_@dMV}@40}+3gb7-THkP7y@nWJZ!;n(8lMvk*?L*Uh4d&f8)MTb1WCy^{Q;T&Vy z1VOd#T#qDr;Ay);t-Y$CPs}@(UCxy3u4L;54ZS2Dwty~vL)^cNLrGCkik5;bDgkCx*$#aDjO`+$KjlDJd%d6ZRe$IRv=2}ub@D} zg=@n1KEyz=0x+-hWdp19!>1yOcY!8o3~WW{dqSHabWh{kje3&HMn&)T?05!?CIcz! zT*5?|BXJ2KUkq7W^^@K)G5_VOV`8qZ7{yHI;b}V;iX=}_a0!UW%wup2qsB0b@}x16 zs`U^~prs()IJFWMKWoah^9X}nyH2ZtgUo^J^@uX+uvNs>F;YCR>k>t5%|4wQU}D-a zB%b^Ps96zjKD@_R8FwZ1zz#e9OwTE0&wQEn@OLu&hEIt9@c%CzuK(Yx;JGQDE#I#7C@iwzUbRLDq0_3hT%;)rO~*;!Ik;qgv{{&u((I$#kJ*m{ zRfBA9xv-*SIj(*ekiLW4_dO&komV``OUcCF5K7i*wzl^UX!fk=2cn z$3LzdmzIdP?Xv@SaNU3DGIXXDUtfo}ujFrER~gh(yMIjG<4Ky_tlhFJO>B2QFM8tN zHrPURce>X;Mv=0;x;#FD!z}9qNo2B3+|!szq%ICGx>^rQ7D(H?5n`mO@02QdzaF2b zUglNLLx@KLt^w0m-s|#aHL0(4V|9o zW`oz^@EeJw-P8BJXe{GhB}_&niNK7L=V@@NE}N%`>3O|!RcgS|jg46_WGfd~zSgEk zznyw>mmNV@U!Kz$E=S_+I^HvRJF)~|s~W0~QXStqFxVWH98RP*6_ma0A?n;7;7(0C zY!`Ceox{%IpKx1ipuqFuEbI!zshFc>jL$Uq#8fCq2EvQzlu$DkAO>7XFr_z9g|k}g z=wE@rHci=tm5vWuGZ6NRY)tr}J#LsJV)lC+TX+bOH!wF_Yt1NXCwjd)BwmUPF74%C zpuO0KJ=xctmJ*{`<**eL3?VH)gs6`#UAZYrHah{+{ROJ|VWS;mH_9#%al>fS3pnH& zlLVw=v}G*TEmpzk?-{f>_7`#-8}DE+4DTUIk&U(;l3Us5qxED9vThA%8Jh#519s^N zbcH6N(39Jxa2pW3_rwCzRq5RgSa`J^1VYiJ--RYBKK3wqJyZ0O#M6g!{8Er*<=_X& zIQK+sG7+X$jpT~ZLx~eqR<=d~!M}2JZv`(In?BAoT}hnLf`V73;x}TDpV`!ghd>9>8S%}GBzrTv8-ZcJ4u>M70wEa2hdQQn zvm`6Lwz!l2+5%sdtO_^56;dBEQ%-EJnjaSXtigXu+y$5mLozlV%Jtg#LRj~#r!Sr_ zYSSm_w)VvheSzP{)rkgMDbU+*y2-}Y*(y+1z|G2TX{_d|jO50pdFFBGgaCs$@ z3ggDWKP22eUE~#z@XsaWhm!{dN=lcuug(Dou}CTemcVoRh9S@);*auot-iy94LKC0 z@`Q`S*s1|$#8=VQNMjYTiWELffK~|>@v9`t*$+A_crFyhA~o8M+-(1YKD0alD^whEOIN|BZ46QQ z)oGG6|B5V%qDwCVgX?QGadJphzj)ZhNZ>)mT;pCz51OZ344-Z+k`#%m6!iY{D`w_w zX-?f6u4ax%Hk`Q(03%S){L@b_JB*wh(;fL>^+*Hh32V@irS8fH<-OC0tgExt-%{~m zPxBX4>4_`uJq&REb~4oKyiJ}fpFWY0S;4AsU~GLAe2F=OajIezffhB5^?Fz#X#RrP zG=rc-EF^PyOqGSkOjzhNr-mBa)ytYJ_3tf>yB!c8Wp4qlCccXx9^)%*oWWRKiW4_A zLw7ZH!$$P>Mi_LKzIG&448kqiMQ%f?knoZF0)Bkp%7vQ?E&br$MXNk?8~aR*y?ft3 zf{XN3{OyR5e<(i@UlIh{YE!(1`?l`nd?{6*RNg5&D<271)e}okD!b{TTb_-46nj|z zJHl>`h3-AmvJ#YnQphIt)=<8BG3E z=fwUgYqNK)I`pOdz-TS<{aNF+96HILsvpqg?M{*s_E$@XyFe2(>ORm%=3^pEB_ZJ@ z4hBE4ZP-3CDpLxEfz(QmWB&y2tutbKQ3nE7%p~V-DUggE{{d!{tG@zo4Go98fN=;Q zyl5ige9SuK7#t-Ea0}^J+`@=Kz3n2c*BIZ7&u}*Un=kr2Fr)}U;FuJ-c{%8=?vKDG0wWf_F%8G4H0+6dSzPK#MP?$J9i4PpNbR z|E#fONCTXmcdGCiy;wv3U3+~8N1KL`hMYG|#AM%uN))0UHDq-tU!qO~&=o-{q^N+)~8ZK+6|MY}#>x8bMkO5|QVOpqrY>=jnBv z<9TE*;d)bj)dFjbbwYOE-EmGl;e(qppFu;!OnFD7F_hV6+R;5S;Ib(+bF0_xi2cqzuB^vP0 z1=oZTb-QH4Sf6ELPK+u;PtkbAw8Fp^g^R$w3l0Pdc3P!%0U&k_BRzGJEnMG;Y%=NA z6D*?p(wcY>>-6y0Ny1=mrHr-^Ifj~(6Xnn@)|*7pbzcp1)${=>tF{4V%lNF4Cg)Od zqBW$mX2(`yy$CEX4AJS*%f3h^^O^{ga&l2-kQg&d^SrW@_yLQZ*Bw|?V$kyvr^S}P zZ!LWc)cHqUeH!G#u|wS_OU%@oCSVp#jZ%_}1DH>$UhyI7m~@5!T27o!JGNmGn8wuR zW!2MVtD<(sCK~o-@MvA`??sSA`yKKRW#h_f+Nt8HCtiz)DGLr!L0^~@lg#kdc05;e z5G_(Y7~3<+!l7|$DJee0A(K6*g>tO>F#SM$6go$3{hi|$P2)Hz#uY7w3)|!^$O|hb ztMNN{@)oQY%3_#-u37J~BxP`WWD;DAp3Ds2P4>|GS!w?Gk)mbRf$$1a?TPB9=kSZZ zre}-!Xd3Wtw#(*=ixW}XD1~}F2;PZhP>t`a-5L_$tCYOKoOn};2NpG)G5D^^=65q= zRgjlQ9~KiS9CmEX1H!IgW4Rp-+`U8cGY$d|NMEqN>Z)k#gfG=S&S{Un3>6v#mvmiWLeD27Pmzfvt%(dGcz;eC%-qd^Jez_ zb|zwH{`q2~qoca3Dywf+X6LOudG0;aEZLJ}>R(*hKvEhO%;)Cf6cw{KRn|I=0J=ye zHNhNKbX+UH7kF0s#M;)e>xO%rrXk+D8hAa?{y+5K;bB2 ztv3;dzGPGZS?T7Q`^Jr)Oz#q?hLvouL3Fgq#b3U-c{$ZqcwBMsSZFE|8+2s_G&%O| z9%Fc1=wv3dZdmWZBiJE>iD09M9pRb|Q%l@c?|em8Jxm%-Ov|5 zF~p6@(Z#LnUis3j)4>SelcQ$~?rys^dG^7!Oc5EYM?~Ej? z%&v-8T08C-Qq5wT?@*&~3se&0TcE>3EMSBM<^;-HrB@Z^GfXCmb7-BGBKXX`h$R4f z{9df<%=v6=()kIyWOIyX%ZZJ<>i2xkO#o$pnX!-l?WO0qRVp^e`;FBEQwb6?=l zW#M0#B9#5%VX(P0t8BzPwILolAl-$O7*`aJFrX=f`K|cMpzGy!!eeP)9^sdId{TLi z#k=`=&e;7?P+r(nm43(&3v%sfwJ`GfBkM647FXgVT>9XOfyZk=a6u9u42Y^Sw(~@# z9DEBXHqDP&x>k6i5eaD+IMUTIrez^2y^EJ}r7-lyqExN6JD%D&o@xV+Op2d1KVc;A z7^m&UR`Mr*{mu5|9$$6;nBshKXg9O0Y)z1~MxZ}%n%%Ct>OwVix;!&76UOuq?^EH` z4_aPjMrC z<)V2HF-W&n>5sCLg>DR?eMBlS>kwfrTo5~%)zX8nz;Fj?xJnN41$qVc__|OG3LLDb z1fqVBRnb%Wpc)Fs`8zReH#71vON!wUH38*@c0xkq^KXl)1L(?)0>nHPwrORF72X)& zYO2C!;BFanRlWhAgvWapuWj+I()Q-x=&hlnlPn*QjN#9JQ2POqb02k~n?#I2O02M@ z-;+{55p$UYKu2mi8k1g9?B=1u63LS26Bi^Fk5QI?5F`!I8Hx${7Cw%@$13xK5#J!5 z5_}uNMPl(gW?@7QO|ZpKza5Di8{P9&xQ3GuQ2jSJ8(Cxo>Xjb1Fzp?ae2?`BvqA{0 zbIgi?xQ-!KJ`BnbRp#a^VoNI8&$NURtxe17fB{ zOHl{(Dk&qNmw}{$DU0I=(-Oota!R#18`qP72!o~`qQzsl>RUJBeqVR{+fS3{UpBrK zt08D6oMMI!)`g9UKbn>~cQ1V!S30=VAV!z%mnF14Ubo_oB@=MfPpL^H=wU?EL5A*EC#lqXHG8EYN7+OPoesU`P&OaIC#faOb+>|wL! zHW@d|Cya+GNRcNK?f9L0@60uotHPYafSpbxz4jOxLDB<0x*tCr(x3QF=MXb`N! zKYsdC-z#+)FeZyZh`2PmlG7{V_9OZl=odxJppq~kb=&&??D>!&=%l2bge|U3$pcN( z$B{46mxEGdU9et#v7=?#gi21o>;6I`xX*}hF~y3oy$+5&RFNgLmDK9egwM?hio3uV zygv^q6mlP*XN23<@zloGgy+VGb{3PT=rnFG99=o^k}Pme({do$ip#Ud`O)7j5{eoOmEdXtLv@|ic;J9T?ExUK^QFb$)Ze1Y~@2t2Nf*zWk2m)lH`%O4xo+tT;F5dt8;mjT7RqB)>9BPQDV~?KeT`AN{3?5XPXr z-Tfh(J;~w*9_b|-HuPM8hWivq^bLc+8xf_ z<|Et>l2VOpq8jSI`f^5)58zD=+s;@LKbAmSGct|-5d8vCPTfI|X}% zP%|8{F;Xr(e!<;>`$R14sXM<4Qv7O4mdgSNqU0aWD3goST==aIVa~Jge65+w(QaBf zNYwU8vAIH`Va;g4rg~~_ip`eEzK`;&ccY=*a(a?}NUB_rP%hqAdPZaQnR<121l7?4 zQKNJ|N#xrLNO>Zy5?$D3#qTF5dI3vL1$FMb-VpB&db-H+xpyLmqjq^Cn zhmWg#zm7FDUrM+>c>^rN29{b74EwL6ujFBc7y#VlMX_*aPoQpqw1(#9vr%& za@V+DYL)C0;!7d4k-C$)*zmorU8sjWKTgsQmZ7E8r z9hvv3)(H&N^w%@mRvC#iJ1_c0Y=@)H^hRhGa8 zUmc>-=!i>9Gf0T<9dreZB*~O3lw>e;Fs>D>VHp(znYIodW=1aQ?HbJ^E?Xk%wA2V- zgb8V2YO)-_K|2(muQaJ_^hj$4T6UlijxM;#n_4L!65GI}u!1Y6igW2P<;n8yG@qgi&lN7l|LKtGnk(L`@Cb69w zRLy-e)#9W#C-`B)?bl1QgYRy#-PSWDxW%w?AO}oVjWOVyEfNLEmLDYH9M0(5oedYc z^)r9mt)wIWf!k}|1;;fZfY%Tecq+z|SS?{XFi_T!#7cF_ZPIAiWEB&Kw%xU)G8Gh3 zzfl<&=hYyDOEq_~o?Q1t2OmU6NC?N_^B74l`Xlv4$$!U$zP^5V~TouXY*0Nt=hCM`{gq$eR*P|C2;=3jb=Xg2d623Pmbxb z0y(*A3LU!6tMkV3w?g>{<8MJ;$`3^FYUgpq(1FR+40-J#f-+Mw`EbuGqe1X zHSYM^3z}_>!?%nMgPe?`gPKbeL;2sjx!(mPn&oxR1o^F}MrpSd5$e7vqoO)Pdg^WE zHLfyaP|{Q!69obfGMCpIfU?~n(~*=buybxlsUW_#n7dlkMI3Ai^)Y*O!>@p_{ z<$lP1$~&th`^XpC z4nHH?DCHs#GxvGd5R*brObgo1Toz;o#rgY2UC$5A2xzWex_@yqyX5g{?RQs;lfs>V z=x)<7;Mby~8KlVd8-$_Ip4neu{Qs!j`L7DoGUhgx z?_$n|PMX9(4mJQYF)NT0zzie?aD`S^C{QVUC85rBUlC4q8>&ivtKJ#l& zERXja$7auXoNs-vtK1K*S+{p=P-T-M<7|wZ<|&e75nfQe4BN*?DaLsRZgEk3uT?k( zv%*H^NlIOQ<<#`iNO=+A#^x}_BAYQ$#_n+!V7<-0;3FJfF;hKWJfHIL8q}t@EUp=U zY#%~UH{TDXVB}FYP!L@tA5rsEU{@>ErgZe}G{~!N8x0RCSliNVKrozbMMS8Ic9JTV zk3qK-$HhTCtgqPP^GOs*n3+)#{q&9Mp$hFrrXEAX#GVN0xF%ykI+?7I2|E+uZVVbU zs1KKre^4{~^mzh_qZI1O6qxIxZ!IBP4v!-%G`3Y5zKoptu< zp(V7SQtz?l6Tt|P|Bp2?axB*^Nl^DBy%!54-y8dAuB60hyi)_7R#?YA^8iyQ7Pc!( zP8PWV_J*pYEP&jpK*XKdL}th}VRHLkZnY`)E#_Djamo(aH!hEp4Z{8n#&@I^ zzYgI@ezpbU_F14E8ENaRAF8l5yDM2mc4WB!{7_0KmOMh=1TdpFfM-;($P-@58cAkg z+-B~VM}i|#L=}M2UXwm(hx{{J5;x_WSyios2q&cA_S0AD699kYBnv7wZ5+?qiCY8u z^gEY0U!~8PE?Ws4aWEEhqnHNt7%I%3=iT2yy`LGMhursF%)u8M!sO7kQcxPhdO^IA zOC!$m!kX?xof=%~!O}P%QVIjb*Sis9Ed6aV*ehmk?%vc99*kI7($FZ5IdgCDHIft^ z=gTDxhy3wK9;%6$M)QaD{t$u$rrnLpR%S7!I-}xl6XPZZ{u<1ryp}p6GC9%ZE`n>4 zBo$gJdPQl`)x2L27NtY}vgfe0De2q~`^z4mzFfk2E)yd)3S#A-7Wy3(Smkq*@wbP> zyv$THRTKEB=FIzImci-|Wf4zPXHIeQPS|U!eO*$-^0H{YGxOEd z8tZVHA}E@!Ia0nNofK#~ZaT^8HPmV$adDWgs^anAvbLW^qf^^v*wfQNbZV*G`o#_3 zz*bhAWA|jD<{^BAsrqVOn)#7>8{d5T z$=?vYBMZIlfZT}S{%57jUGVG_xO?4@y^H(Gz5)iXPhU`M247Nwc}QKQma)0$PZG#) zEE=_DtkMfRrm|zSd9;A0Z;5K|?n{%niMdUvE6k(_iP>$84A!A2l+TIJ-Q4}S_6tq< zlRf)rJGt;WcmtP4kp7!vno9_MUONp{b@1A>DtlQ7z{;kQop5C`T2&9tA>t-Y$Nq)- zK?XB;3hHAx(xZr)gCg02-4HKNP2yCSMcqkl52o;)+~x{<5M7~AQFFL;@m^~cXuBJS zX#CY`xS`2agsy{Y)Nv*)zn@MaduM4cR6Usz6ot@JXdF-rITsj7`*_)M$c)^2lpd>0 zHA{HBtfQv#0rMWhSDX**b({jS?2DE6!O=JFBdRZvuu~|c1c|PtDr%^byYdHDRVdV+ zS3Bwx$AKy=l#>zp3+qNEB-D*_0dxbX*nl;w24O$01|qQK7}1aZ#rZS=0^)|iGzQSN z6Vkx<@-0{pIyTI)o3>t~5_JyYbTzQwz3!q3Uxe-|e^@w%QmT)UJ_vVU+V!HML-ms= zjAxg8KcoDQ3gVd5g%CGA9LS3(^3`jh(Va^ZI)hPi2Aq4Jk|54_B1BxByRAt2h0n(c zKh5l+)YvIvv_K?~ED$=sNlax|z`6ig?U5mz!%TtK5@0Vfa>bK{0(*;P=|9~F`Z;tb z{OJwoO`~syY2XMcm*a*S4O-2g36+l{Yi%ZKLopUXC?RlQrj?A4Excf;)Zd598o|Gp zPh1})q4lf5L5qR$&T0Wa2o{6&C)REeM(+8TE20ka%#D7tcNqV2DvHcDGpeIIgi6xo z-?}L9z3SjIQguzQXLZitwU8(N6+yEx_o%c|Vi)l!xQZnkI$4;AlMalM*%4RX@hKEz z?{ZvbO(%aZgp&PdyR@`|%hU);y$BQb?^u%BMe#+)y(T&CH1^4eXLBMsrAwA}`!XJxfdRC#$T3 zAJK=@e4@y&9AU_z^zzL6X$CG)B=~v!ySRBth~(H=40!Ifa9=(<5rFeGR~Lv0(|#h& z2ycvxzH9N}C9gD+m&>``4crdfIT`Bv);)O<+G^K`A3nNR*sQFE%~T~An;O}?tdTp) zH6bc`xk%>8`1KwP)z-WVpKG>o=Lc%luVk#-6%EY1=jU=*)mj6`X0^`Ah|8^*6O84b z$&uIl`)B8SjKL~EN4<@kcHc&^%K7Cg>e}92)WTH@ zECcwJ^}XwAXiuG^8E-?w5N&)As1ST=yS$8Ub#qW84gJIV-tZe_6~@X#bpC@wKQfXl zT^tH##5WO~-jIThoncT8)O__&F2G$OQMhB`W4gb6qU;I2Ii=dNE@eg9vc>^CBY!z& zwN6N4s?l_NAqhrRRh0w>vR?~`MHX2ddhMDqxIAvMp0j|2KO^BX4U~>y>2Xs-Bad|) zv>qIf-U_8>;Hu`olBYy-Nac-7!#pG!@){6F5_c6J(2UjY9e8}i#D7wwlT%D$RV+c9 zA#u|&i7Y4lJ1lWWLcQ}FnQrn{-@zENJA=wefhWH>(zrX-_E zV9k91@m`&m;bF%1Os|kC7$D@P#k#k0esG5VaZ@r*5_iM@gBBmaSC`JTjRB-HZ2h4mp+$pZG|w{?h5NiL-{2sfxRs1(BsslPKj*KuS zh)P;AY^w>geKLvzl?RR#x5J5o>_gUv$-e;!=rnvns2fN$h_)t!<6vFRTO=Vq?J<<1 zc2#plJxp@?5ap2brwpRyn^eY`m^Z9s*d{nCcn->rRHi?AK6@(bW9Wc!CE+L0$PR9R z^%s4LTTXb6%WKq714VERU$sX&VLkVYCMJ;J>IcmSi7viCYVY{a)$P5xR>1(TX5g zI?|jxCZKV!=h*!A&JCwJ4nn?T+p&5@_|nWFGqnQm$O?%!fEa8r!6MR6pn`8yRO4KN zVpsZIUZdR~@jElah zoDbYj>=4sSlmkNLYZaY|{O=E>@DDNQkrltfORVou-V%31wD8T7^!dx)ighoHy)|d{ zqPE!{5%sCUXo_3sfpbR+npe}^uDKCU;Y zb`W0gTDlFUY}XXCoENcl;=s#JHPt~(8BH>kCh*pNF`1lZm>pB3O}*sV2TNqRC60~y z`Guwnny`1pFaRg1QCG1}_G5!nUX>p54_4WGze+Z>51oRylzqrjjpUnGX~bPc6loie zk$Mf6RX2oE3wpG~VHO3UleYPzg$FI6wzK^Raw8v*W^?cVPS@Itr=0U81`;00C7^$9=HC9<3rjKt?0pCXKnNbi!5dOGfx>CFQ804+@JE==pGDAJXyxU z6&RdT0T$5$d^$C~mg6T&4W1VdxO2Uece`6ef4aAbr96ET0}M@>8^+O`@_H2tj~mO<99NSn{q%3CXKJf$ z3JhBl4xd^0r6R63ztTF-25l}1F2kyk`gW*yL6~H|nJt7w*(Ykl= z?cboGe}Yi4aRS~kH#R1A023QA5XcH(Vkc%}en;zoe+f{%16uzI*S+Ip%)oaH?0*NS z{-&eyZvfSQs$wN(>tOv3AUfJQI~W=}zJr8fwl+?GHcZ5SFt+!sEbl1dpAYZIp{Sda zxT2H3lkxj;aYYW|KUm8(tw-CANnJs7QQ zEu*ePk$;+Qt9&BVSZbuXs){LG3%BzreML*PmcC78P`~gtx23TZA@x}~qa|}pr>k;p zx4JptL>zAIyO87x%!)1L$!5yROZtjtr6K&~Lmc;Pqcjf`gO}#|o-{CCklp%|7ilfv zT!+IX;D8ITSG`q}bQfulJsufvb)YpBW<6vy5!SnK62$^VfOWO7hcy-`8r448`BA1l z&g3Zt4X~&DOWR#qjc0s}Iy)z?JBQcqs_D$Qd-J=mLw8f8lzw`HzeepHBzf&T@>=C#;BXW9q*$ppy|QrvJ@wXgiK9IY+cyWi4b=%e@9KO_F4B|Vq9 zz(jOA{u~*pPZ23&C6!VTg}__{>rX%IkvH0z(*470P^5#xUC*0NPo@PqThdgUlJqmY=)REdhvhf?oz*KDLb1D;aS+EUXJ6g z*P;7qpj2yF@O4*)T2x_DS^0SJ3RJ zf*8ydyEB>;vRsjPN~x>Jtn)i7guh=XXW+7t!uonGW&_%bNS_=+Z;4I+Eo-_i1Gnnc z%d#xuQDF~N4*}6Y$(oyt?W&XGAT|@@7Lvv6W77G{Lr2GHvD0}&Hs%7w^#`+UFs!^V zDRJN6I_h`G=nHM}PI)Rauj?Wu64X(=^hm+<_Zs5s*r9x*FW+-@ck0=&8}a}LbD7*k zD}qbHG<_b{FzOjmw9v706qE&<59B~5R~Fjxyv$3W*wgbG<)rc+?T8%d6+qy?HkIiT zMCa0J9~4Kq78nmvqTo}Ya(RFp)6!B|=80s-k|JC7T$#&!*}-Zq+H#5cWgN1~+)-EG z<(D7TpwFOrDD9Yu?!k!4-uAh^H?)C%x%P0(#Dkp!6GZ{e-?$E2NXNJ%m%eCkXd~kF zIx92$?vo!2w@U4n19ql);%c-%whY{=(56eE`)Cnirmo`{Ix7JQ={~dqJ;+u^x5XDVz|04rykP#H##? z|7!Vl3X9^m*vj=3RD@utKJ=VFw;B2?;X(c^CS!@)=di@dNkmCdlqmnLz{n^6+bwSi z*ven??tzALN&r#+in-BRYx^j~mggOdN)0agjdxx^7N7hY?B|cQ6xqTTP0Fseb_hJD zgMpB6H3N)$Kp;WEe7dB@RTYDu;=meR*XCFd&RKYVZ1*S-}4g4}sv-rpo zp?7`qz#B{DiTEot9x}PYrP3~0e`r5g7AO}Xk&?RNt4Ogz2G1vyi4*XVz}i97-+Ln1 zTawi8A4#o$kze_BQ{_xLsMy-^E3klxY0svE=S>Q$ z*b{TXNi!#$?BGjA@l>U^LS<`drYxrJPnVgE2$vZGF9)r-b(kmg^eoz$#@6grjJvA6 zyN?b|(~>h^S+P45CpuXj9*m_NuU9_N>>uPLQq_>^>eOXNYUw?{ zel)w|JUn3T56R;P9i_=)nlp6BL=}k<;64d)Q;fv+z0JnEM;{I%iwB!mx zFfjNFC;!JQ{cB>G|6Ep$mF-_eBAM9P8H8=EY#kKs^bL*Qm*ZT_4UNBw3o!_pzvr_u zb`Z9;wzIYQvjE4zAZg=d>|keW_3n3xP4ulCjTsbW^&KtWJ?bAltak_f*V^ceEdL?g z=VWHYW>FqRK%cSK4>%8uLHYKXN=o=@>dv<%iWE~>*n9?Yb^^znTbE2a_~PUSzt29y z@=KfVrjxH+0iZifT(UfiEI|KFF&D`aqQIO zrSK!a%ZG_0zIJ7kY^2woqfH%a$hy)ZY(`Fd27QR4oPFzoiQtQ&{+LgyVffZTepC7{ zpEnk5o^IS;wz|9BIZ$O+ym~$Z``FECt&dkZ5&yLIQ~iANrVBgG zp%I6L?M%7s6ieB}KB2V6*&0@Gbk9aG7j4xlOW(qY4@=3`jVCK z(!%vGMz?>|+xx#B-TntuBU#vh|NephWK>@;4E*bON+EUp1WFLD=E~dP zG?>tH3x7+Dr-~geqIN!t5Nd4J=o+1Qfhurda`$s`{z?ZUktk`~Z}T(99A{piw9zdf zEun{cRdd1bzByT(=o1Gfi!yu9jYal6F_~Wxnj9=Mh${$QJOhvcVK>yKj31y$ zd1hJvqD%f`Cb$2zOLG1<``bT3w*M!8%fa|JdWfTwgR#CfBAi>s$+Uv)q8f^y!XJ0L z&Os(iO%YmbQ*Ax@_IAZpb}4VYP{WWOF>8ALTc2z#?;=ws0$9#Eb>L{2zNgq`cYa@# zA`@=Fmi1bQE!(9(RF#rw|A^&6`XfVm=%Kji(7JY2S(ZC#v*Jj*u`t|$kKV*IB5gbFnaF_GKsv~CS2b(?*9--=Yw(wq18LX0`4!&Cf~E3GS4Ow9>Mg6wZ}IIcqeZ#LP@^Yr#b&YkKwfF3V(-va!n< zeRUOly9x0&=gxOeHD)u6H{yzJU6Az`fAN0|W&gkZi~kQe9VQOe|KN01q~$vGzyc@g zYB0>`%5#CAAVS0p(HXxkybX5G7n5c_XJ$70IVPWr#=bOjM8&sr$F6zAnV9AzoBqBf z9tgW|Qh{2ra#*!R+H~U3EoIktZEm5t+8!DkJPJPHJ9ha}QoMHm;P&vW61<}C>I&Rv zeKopqaN~#8{@vDw|9Zb9toEwbcKP7Nmo>I`_20NbK6YJV*e`4we_SxTz-}d~EQ6Ni zC!ybEC%9%1lYJwRx-{T{UpY%jvToa|=8tn-AmZeO9Q*lv`g5M>2}~P;|Lb40@P9&N z{5v%I2NPs`=MDmy{y?Kltn2_5rvD-|`d;*(L8E^|2mcKk{YNI_U(cbK+1XhBeS81b z`Zw<0n#y4}i#=(`N`xsYrFnJrfstXocL+DZLXx#Cnq+K|(^dSfE?~4H5aq*Q6oR#B zaSB-o1U|mk9voqtT5WaufU+i!ug`O?HKnTS)Y0bF#e>1a)5Sym&h`DvwhLQUO?A)n zy_NSu=dUbK{L#VTcD~!gVa>gRn|vb1^G_K1;@sJ`uM-BWygc_O!3I8V=a-UJ% zO7=dEZURo}#l(U6#-i?@IjN5}pQ~*yw^HeB&YWF)=yh0c5Bs_TqVte#$K?9ju=d_~ zc-($HJ>6||lzqpb6~#am^GF(2puoMs#BIYg^^JUwVCfULy55*up}Hg#?Q|=egv?S^ zcJzod*7;ujnI?|}`3R<5TJED+%PZD-MCX?apIU69&sw5%yFKH&myifi+)FnJEhNaXyZ~m?x$gB=+=@LqhwK=li zWw=2VSj$-sN)M5>r0jX0&x`Rj>dt-?*eJF5xN6`d7nUT4*J*nZ&Z^mBhO;I2e%lE* zacWWn=WjEYD>K<5wb463@>vA;dE?$)K#7}te?$>vMKIBo>}37z?`{g=trNx)xW>X> zBxYuu-9mt7a6zEZ%#s`h8llXu{12doxG<;i=~&Zr@>WfHvXAfq+NygGWIL%?Atwu(lg z4cAG3f4tF$W&B zXlVo+Xg#?;Zrzo}*zP@)38H?8F}s2hscWwhpgK^HA6`I?_-tUrPsQ`M(Bdoy=5Ywx^X|Prpyd3zfPrZ&$srd#S;d&oVVWZ z%kL#-JFl%isG+t5xHQ>w4Ued>_Z=A+%X(SgBYijr(CG=C`Ce8Gi^CO;HiB2pwtcv8 z9JA{Ry4xb{6hG^&!F~CPJ^P(*hClPCX{YNid(bZiC9O!&=<@v)>aN?FMFvazgN#dX z>-eWi1g~Gpdr$_Jb|eJU{PREQzWCAte*?%mh?^Zd6lA}xqa}T}gb?XQ&tmx%5(Gwo zi6$twq!+?OSGS?$T|(!#wD(AH3X;&z5z)u`Y5oU)B5o)wC z>b}kqP1_1bAL`gAh?Ozl> zhw4F%;{K>fH_$(#4Y|JM5(siV%Z3l?ziUQ5rh)n3|0-@#K}pB8lWRmL$WUUY02mS@ zEBwCHe)+o%u~%uHBUzoWSyNvBdwVEOm~NP*Z%L*`dMk7)MyRo4+*~jp%Ir}__#ic{ zsKu+gXz&!s>Z@fV<-$f2&aXRqZY^5q1+VgB9$K$yMy7^I_2oxXauCjE#cn2AbCuYy1^Y(YDk>Lo1%*7|*{hIglwM){db+&Atk-iXAzM_iCrpU3L25xF0@rP#Jcl~tm9pT^c?h$ zEz55%^*V4<8H`@nU(vR1W6va0S2qX)-b&CW_bq3gPSyzokNpaA0PD6N&W_$18+U7o zG7n=Xt`clAAm5y}5KIZ}L@7)pC6t)1@;QVJb-V>ICqto#%qU~hu}5)I_Ldx=wUGlj z-`N?`qr}IgnV%}~JH-inzu7|~>fxtbBcw)B)Xe24BcZ^dR7ww4GD6^j+o2gl)U`J8 zhW&aVPUllwk>#tc{M^P36taZ*CR%g4B-z|LCJ95vBDmk7)|fLxz670GPI6LzGxG~c zM_KTY1bcU>5t!bEn;42HIlxHbyhU%_^046H9a}&s+8!Y9u_ihFg_u!BTd$#ZqKp~pvyz#k|p;#vN^PQflEY&s!z6)G|5)q$uJQ5!}uKV`oiyCC4#^+JP5+o6JTuwiD zkK7``js|~SCW*4kh7TX>+zP<*9$P7(87m~SxjMyMPCL}JaM^`!{gS2_Uw+8LRVZg0 zb&3V?<4v1Ir&*$+tG65%RMn zr4Xc0{FNA&@)+IZ+jee`tEoC)0Eg15p{Q)jR3NR(5RJ&3`V+^BHLhYu`9&jHgiZZ3^?s)oh_aepjbQpx5>U9GoD-fG4|a%Mwefg0nTU@Lm4u z#MI`z$}hrZ4-8Lqx+qT1>PKU>CpGUlHij&5p zG@5m~$4vBc<8^ei%!4X#e5$m5ITOY!+=rXUixk71dc!xw{of65AML-Jbbg}voL22i z9J+5L7FYOI&#v#rF2QTl>uL&+&2~*#0nxr^6ujkzjQ=rEI@c}!y)rUZXg*?%cw9Th4syDpo64jM~-AxJARO3}1mPvPsnV z)g5}wJdx0=Z_b6e==Y##Dm)BNZ-Qy#<6Nt?l*MjzF~dS6MZ#}(*fi;%;qt`Mwh^~u z!iq(4wL3 zmS#L}3K7r6wc4u=R+gIZxefJ?K=QAy6;KV4tzI}FH9XShnxjb$D51|I(-zFK!`IN(xfIpO}t7vU}n=1X9Q8VDSaNXIZTG7 z3hZagZ17cQqnUV%9|kq_=L(|H57fM?30f2gDk@#le=Mnhwz3`SkVw=y^~9n*JX_~6 z!VwndC$W^-PegvBBQUt>R8u_bF@QA&kY;~qSS6~)@JG9~fAgGx%TO|#w3>o*Lm)}^ z|2(a(&)Tyr(miN?SB-KS#PTl|+ywihMgZ6a-- z+Ro&g2ENfZ`La+J$jNK_H$jP>#&$e=Q&Xb_bpM(TaE?QVy$^aP5ln{B+K<914HCKp zc^rTTpAM z9r>dNOIHgmshe}WN_oSAVM#j{S=x(YBON?XoLZXht0Z_2iC8fz1D`Jo?Bs_;6IOwz4#Ku!U>+i5cwO#FFyb03HU~yShi75DUh|IGTspX7-Fj-@ z&)6skU3_6iLPxEp8Oa%5`ZZL}Xj^|9e4^siF3@GSYy+$g28ZZ@-9b$-BJ)Vi?);3 z)0P*pVV2BzlxP3$dD}l5m;+E8y;{@9NBQzV>?V}bmFuVP26MB;{rPL|Yrxqsfz-^N zPHsxtm{xK>7yYIimP#~D_869>w5?4cF|~c*Nta5R>^T2{&^DFolc+KVvuh6*RoI|v zPv^O{+BE&?MAnzy_#Kwx{SRSDg=2Aqva zw|KmuS=L0=&xX=I^>m28i`-d(Z?h-LLHZ3{;`^8`c#|)@d>BJg{=g2!7=LyfWiq*R;`R(mgr&$b@K2uLhGAp_dy8F&3haxH%4<=T48;0= z?@w=uTQ#@pKF{~o%HG6WJxz|2yoVpOG2{1&prZXBv%f2RV$TQ=_IIC9?^MW{4i~8X z{@qT~7$Y6rTaLzTcO;EJBvkswYXD)qoGp;Z8VmHA_T5>NAo&O+HN6O;{jGKx|h z2wOiOsx8w!9MVr)NK?P~Yr}a-)h(9m=tjzQ5wxAo8{>=tmr-rvpREF4Ra;^0_*a zJ_vFCBTe$3qP_nO1jYYAIRpaO+5QAJ16VlUho^s}95S)};Y)3~UvD4z8(`O<7d~^ba(ygZ>&v!$8hx9U2nmNC`J9Hci2^xn;G|Ypci@03ji`= z|8CWXAB-}HZG7GK1JSnJC9ADrk@qba?=WTJY15RBAN#ph82<>x3tyH%r=_Eq=WS2d zM>j~9ui|EB=5+1Jm#{2z&DXJ^&g89YgX{Z?9gOi?BF`$m)k<4$NY&ew9YN%+H>G#| zv8StR13)E<|6DxS+vVQg?c!$U6h7qkM3J=$4;Ly0D`v=s&PJv9;PTS$^vhF#VS2Q!>2**v*T!A7q$e3&1dkh<*&)3GvnV}!ZHRneuGptq`DqM~q1)!# z{3^ZvL!TLYBC9P+LfON1OR&ZWa)gdFpbAv?3(P)D`ZKlsi9r~my^M1umG=B2eS0+d z9refnHwx89fAl9n42#;5m^|Zg6<9X>cFIo_HF~b1HGkERTxQ%)8)%<4VG3k@;e*8T zC(hraZJT|2`taOE_8A?7Y_y4x_<$lU))4t;WjEUW@bMzC;+=@mH(jb;EwO!xaIsWP zPO}f2yK37^8WLJZW}Tq!P*hbZEzwe$&=QFZYI{(3fwScE+TfPLvs(YvS{-BEi%0vI zZ5JS4NY_GjI(>^9p6~W$#^(Ry?VW-|i<)iCvTfV;F5B8=+qP}nwr$(CZQHd=UAJ#X z$2lkNAJI?!GGji>hZV76<;t0v-xyfMs)Lz_oq}S)AlG{jgspo{BFw!&wWxWaz;oh` z?6jg8m5O@F^TV(JuQ46mrA?7#z@kL3ej%`~`mzwkp)%-IRRbkriV4XCws%McuzSLl z0#V|u%7CzsTdEH>zqm&HC42AZ+010D&eIq^4q_jMt@(edjz&Z&V z+`)Yo^AcZh(&I-O+MA-_)bok*(|2wrt8gAzP%O8u<49UEI|Wr#TkB!aMKJwsH_>uqYJdz0p~?#w&OrjnipMraPiqk>CltECn)LgSc4Z>5d?1CwOa%Fmncog#!NHhmYrZRrmMdP->@kpZJzL&1(f>Xsfx;Whz+;fZ$SO^d}S2Z1z)D z{mZnpN71;jJnVLe;mD zvlOC&N)1Rt6q0WrYDL+jQ&|z+3bSZhL~lDD<;4WhG@!i8eX+dRo-kR=)2L^O7JCXs zFxf?x#N4$@BAwH1qkVTkb>+X#Ok}m4c>4NKJyY{|_U2y-iB$8O0N;asz!+tMT1;X2)y*Es=iNzPXKE!MB5Poos{%M$ZtP+7PW+pqC3VBJ1#iM#yai(S9wYVf zxsuU;)9aZ->g}|26A-`&hh!n_iO#15J%U9&R&?ysYE?&Qg}l3)+PYR(0%(nx8!p|To^M1$nfhv8U=t_J1Q*r%u1 z;l-=1gG7#9LEh{+0*lbT`D(`vymp)c^B`oIucyTTh5+;io2Wr(dt&vJ0b zELrr_nZaj3Jlr~v31TKOi)tax+^0+CC>hA9i3xkaxYyNI<2nWB*h#6Gbbdn%cjGE| zU`6%H)x^hhI(NH@nX+ysj={`%;pDNXoBZV+u^++?L&pXnVVAMfA_S6-on{hr7fiK^ zJf@Fa7Lty=tdvXDtsp-DVI-@+&3PP}9XlE+={l-3nu4uNRBJO|cZ$c=J9nR3xuiL$ zBXMk_+ad&4iE^hE>eNXg=%2sGtujM1w%ZCOLDqaeahj?_Ds)oNAb7*RclC*z7ip-3 za^$Tvc>-YyC=ODnSw7>82OHJP5cAjBMDWkA5_uV#h1i&M%sX!$J{U4i!8_Ye~;=NFRZy;@*^JBz*z90hb^eG zM<+BNy7uZ3*wcU4u+=Pu)B0(3tk~?sX2juWx9%%Io-xBy3SPw8#}&$mRmGVUuU6od zd?W@W(>NT{E)UnKKl>VWlzU#>K7a09!xnd)MOTN+`%>6XDf4I}`T6R=7)p0V>byNJ z@dn7YSY1Y~pU#-=pG&qHTZ=B?uq{WrDf0=fz*SQy=~>P?w#$;dLv{4mUzVjpw0ERu zAN;jPb;h{Q{+YHZ!gKyD9)f^{O@8&iY!b7rI7e!)s|1gTkXtij6t>wh7 zD4OiP@r9pt@cxIq>A!*<|M}j;#?J6R5|m?}bsHRxgj=vr`1h6y0qSh-hrJrYzLZU7 z9yNN8jgcuKPram~1;9zFcBPA)9lniTEzvu1ve+sGvdIwxY%}#@BIYqYVTK#8dyB^I zcC8%S$W(gWt__>i)78qzgH?3=m0xGU`~BFD<;dJr)jzJ2*VF%QhCfCde|-(l2ryuYicsNen~Xefyg`?dt2WiCIO{=6yLzkaS?!q4V*yGcRGd$oCeM~yKm z3q+)(pdO1%O01*c_lyzx`s|{q!avv#qxxJtmGbfVzFf}J^L6uSe>T3|t)9;MB+Y(o zKAI{5LaVGKLu2flGmNI|u@EzS>va8i3%t!+*iXgyynnESZ3T*B(2L;gO;%jU{%yF5 zv`YzaP&yL8-Ip0R2O5d}fn+bdD|~Zr)WKO5Q@zt~)Cw!4k31Cp;-9klwiehZ1b@@| z4DfB&>JOR@U|>Cf^U0#ucrJHqCD@){@VSTJyF0Yb$(El_VPSspV#*Ut!j)L)kF|Z6 z1FXDgkhDHdUAB$$X>f!$F}v7{v7-A+M|2g*|7f}l#5e) z7nt`aE^TXzCZ-)pYW2=gvv2lC{mu&Mx1BkhDo~6u<&zL3JZ_ZuwJ4# z2u(7{7Cp%9Jw~C!&5^jbBjJa5qg9GMMDwkgUHgy$;q~=yQ)3s!j_eL4t4`&CH`cG# z65(#%`V(9MP)E0J&(Tw6J3V{96#Bi~Er@3;J=UUen3|-nI6bncd4j~?xT6w8#8@Fr zZJSg8U|u$PA26$hO8o$$VSJ^fsuLqjkT+Js-1Yks(UJ*}*m|8MbQ?Z7fU_f47u8kk z1ZapPuMEc?fn0dzk{o_#>RPeu4f7`3wUn=$vVvTPj79$&0chxmKE6ct7<3Rs|A0oaXuEehk81cm|vfzyjnSZ5^HW`3jJ}Q`h2qJFr*(BKD zdm1X{@(K|Z@N@F~pG_xwiP(Zk{OY{5zI7xQhP!|6uI=*nQ<+uD>mO(ZTz}xl z@$T&MI9Oc_{ZL=4SPxdX8Z&R8hrf5YF?@})Yu`536FYS@Eh?Z+SCe8NS>-|aX1LM9 za@hllB_Ek=+Yks0!_~5d%b1_@mU>}~KpVa`_f%Ti(yE{6*+JJg0#K?G1LO|}TP9j1pu zB+;hSIiB4`Ynm`7Lo8=!J?b+RCM7KL*V^Q|o)8~pLe`>6uafPLW_JIJ%^l0O#nMzI z1UAad+j(ufAnj4dB9VzQ7w&~i5rvv)B90?Wm)&HMK;UpKSP@PVL&>mBq8fOvV#JJ# zg@Q7V+Z{SKej9l>(_X^7E+R~&04vis-TbFqjFiE=iYU&rb-k)UwrKyDh(BLg3?;-6 zdH?y-t=QYqY*k$5u4Ps5hVHKORnxf;dKD!>F`AO3c|=P^PBGcp;+Qdg^&?kz@~`rG z|4U?a771zE8A*XUbdyw(JE=36#8}oL72Qu!?w#|gT(h2P$BITri!~(`m;423)Chl@ zVx|tmEhrmd4y&GQe+j(WgXs3m#`8t)6ii!Qoe~S^D{&dX)!88twYb6{Xd1xzyl@tc zxEMbH_1@ka3XuThA+eC4*|T{8~xR&2aZy-`f4$=!?CKCDdn17c#4*+CVVYt0x zuSkt{=*;u^9c86FSB5<&d;b|WD{#1OazQ`7vIq^(D|UcUNeDoCydA>%+~qkpcn_=? zq2v-lG?H(WgE<_Ya49U4ry{wZC$>VYx)UEj3H+#;_)T0H`^9@avqHnh9dWhWIxD0k zy8qS&qx!s5CW2NIo#x?*pu)R@@AtWZ^NZUvB`G&qKe0nXm|v&Pjt!r+imoXj^i_OI z2rz_SaK!`;1z2zpu!uTC%%qRID z4X;eznMldQ7mvM;XCAd-6}Zva?#GKM-ph%ZPCRzFmi%#UU@2)?>kWt$m-VS2Y0hGT zd#PL`w+Gxi`pSrA@}M!__sc{>upgI;-H2=)WH{goWR3n_>4+P!p0bLL8}JpapG{bN zxj*Eiu%DHHX|wFT%Z9qSVSv)_o{kEGW)-;#@V#uz$FG9b4s9OY7~d~PX~cHT$XVb2 zg7#cXFSrDk3N61ppH=u8ejH_3SOSY`bWx)`wJUk#rIdF;$3HS9 z|8(vt18?{+(Qjbxo!G^zHg&}C_xp=(U%DG*eIJpMCDP(-LYF_;3`ZJKc%Wgtv(~rG z0N{}9tlzvunlUzz5rey|Xth(A@`z0TW*v>fbP zU31oc3E37S4`Cd7$$^kKc`eotm^er&%sRr63W{os4xIL^ls;6Dg(7H=sSP8@5V1(A zOlMZT_=K_^t`DHqc7L1ux7dzA>Andnr`Bpr6mil;{D`gVRSzVDj5f_R{?Y6biU_Ek zF}p44q9t&i(PMfNcfqETc#fB}I`chM0pc3rcQL+F_?KVzXR3uEbwV<}F|(nr;ebUT z1`|HizZhF+RY2T-5sa=Ih0$8LRM)W46putdvL<*NN@j}{cnOneeyG2t z7LZW{b;75&fJJEELA#LuGj-Lt=TuhFnPVpL_9<&SdM#^WZ?v#65`Gixd_sC8h1woq z955qd_{|xzcvRq>JaJ!dDta&>wt$2HfMHU&4~5mjmw;Ni%|u3Lr9G)jkeg@0ZZZek zoZ|5QZv(WAq84!ig8mYt0^T0DzC*+X*6-L@HC#k*72>&QjkQuNC7;Y^k4MtS zh>_wCRsEKkmHK*usu~ii>15T0EK3XcrB(fxz_Q>zq&ZA{#v;w*-&+}C*p`KLqyxUqEsra33ybxV+B?K zRRzBY_4@?`s7Rr9Hi(>JdyuiE?|KL(aDO%2Am_pp41e!J!#iA}F8J};=zOvV=sL+Z zxYclZubbf|Wu-OYLuV4T>c60`*1~H>XiaRNm4Y)S710ZaO2|IEW_CGjIMW!ugYJco zP3DDi2bl0gBB(RIp?M|z+%+J5V|6n>UjA@FkH;JXmT5UkWO2bO4jrN;3G$Sc(kx8=QD+WM5nDj z@-b9KXEQ`VtPx>uGI=bg~6s@aav4JRu5iYxB0M>LF8`JVo?q3#8_AXUc46yf@ zto_gg!cvHlNhE$_l;NT35N9{kOi015D;nytYvqi&tw$babq}^+SF=(nQbtSpA z;h$mAW7K*>Zsrt_PkZ?TkY#*e$)7p34}*ySTWiOt=$MLyi@qIFQ7#C8krwkzL3Yir zcb3LAg9RHs5}+Rg9T2J}J_+^FJ@Im5CMb-9b>YA*DXwn= z@yZo&r92}gZ_XCX<{}iH)~+fr`FSqrTU~yeP2T#W8q?e9LaJa3XTpwXueL0nD{ z)?OvG-kZp@mTEDrxGr5#E?tXp`y8;Cc9u=gtxQIOW}ys5f)pJts}&*LzSkxgFdzYM z2k353J<8X&s2M-E0ZjvEtcH5)o?y0yh_r0;G&ET&$gvUdn`*Y1*pBT~EjNql^2_}; z-kHs)3YL@emX5Z#!Wzq{Zm_tYKPDQO&l_z9YHD`9-|8@EN#+Vb`{Q^IS8Ro<{|ghD&X#(A| zf{krbh0UmdH|48dRC%@wp0J^%!dD2QZkrXj=1f2qVjY2P+RQ@+ctsHj4ES2V( zq()WC-=&NYTr!s_yz2L3kVxDdrAIEvoQikYervqj5vbxK-$pAoxGF6E89`-v){8ZUZ71PV^F z&of+h#3C6Zm>j%H;2%R4?Ty;SrEe%}G;2K1#M7y!uG>uUe~{}o=|y2~UM5*`dl<-R z{1^t}(8PBn#mPq!1RSFf(hy9}ky8W!JM-*-M#mOA_TtKL`B(CP4^c}`v{FiZ$k>aR zMil>foX>rnB(=^j*~6N{lT7pp=z+vM)USh|?-;efz3b=qD*KpzJvH6hn3)#3?oC99 zUjm1(N_#fYQ9SUphzJ=3LFOu;GKRxX-8=ONS(jRKLT1%8!uJH4K5Jl`9Qrne% ztE(OKQQeJyJ%jEwUVtH$!05LK;=fLgiDd6`Ao6g6BAZ|l1wV?|A>1hG(HX(8tW8Kl zOy3c-?E~vw@PKo+Ct`OE9@>fmHWd&4R~0U923_N_uSQFE?7@3LZB~wo>v4nsQwM6GFL2l0fT4k zsyCX*T-Q`3+_LPRrnIswtsF%LL3-eDO;r(Gw1!EU>zsb8A)-c64?XLuAto+yD%1Uc z$ZpFzBKhr==r;{&893K(EY{S~$*KjM$CO~Xt`+2$>-Hr*_zX{=gCzs`hX^E};ce=w zs0fHrSPKEvbo`~d4bF5`4on8IE6-)fT76m&E}fe<87JEJwr}OtLMa>FQzJH@qh;`p{-02 zG#}04_R)N(mOLmWzZQoPy60gk-Oi8dFrAn}&4~_K=WrPN&SeKf!M?U$19HbAlFXjG z%sU&1$gz0SP%#B3Cqg)>nfx9cs=nGK122(=J!H|JRwQ7XKL3#Dw7znv!ZyGjN4K`) z6#-@xwHuK>vIHomf9)d{UF4GC0v6Ih8LN$FS+U@miY0oRJ7D5Ibx_8i$Yo(k6WbA; zR*bq0C?0IdnBuTd)^?xV=?i^|-+%E#wIAiT7}w9i1Q8D~8?Ae&=h=q-fVl>&#_cYY z$sxcK%~)(Cd)~QHOb5K;O~souSxS8u5k+t;&;+HdN)#5ULmYFV$$uV@d|EN+TrK^@ z>0B2ER=(_1k(*+4?1Pue(Gp-Z#1*&)LEK}6S!JAr&ZL-!$iFh$&12oCd9lVY`u3%M zfz3N+{mc3RCI@GlGf^%BW8mUzI-DnAWMA*>u|j>T`k#L#=ur{(U}ztS<*-+8aC zICRc_m}>8pixu579^{)jTQ$#+5m6c9);U{=zz^T*@hAM#x=J*V*-C|7r7%AhFCPxukiZUlCP_MEU?k|LUKG^ zzwtDu0LWuTVPCm3O)}P<$R@%M_DjAdnj!m{FFhxWIq zoM3%1lhgE9R8zbL?zLS}2r@$aH2}Y@52R-jNQYji8%|qT%Hm-p{u6|x&gWIxc|hC$ zyT$c-96F#a2YeSRm~q*1cQIIS=b4s7%gmm=jDKH3Yf0(9A2<;Yd738}!CoSapi zBit!(8~ zY81z9Jocx+t7rS4@06Z8(dG;d_-_6(rmgk7y7LPCT!*TRp#32F5nQKLcg7HoV zNB_lJ(u_hHr2SqSHD}U>=q4QW1C5%?h1*XTbH{S|dq*nfS(z);F;LgH^@V`cfxulG zn~+;M?%T;ahX`cB{&2J#%~ka;qwR=cbb>Zsb&%dxv6F{SW58m?1L!s^$MU7;N^z&iD(csm;~eo?C*jya`|bbt*v!bukSe639P`qVqC zfBZd-hKWDDj#jdr>+|*Pk^G`x87MoKTz8f))2ddfP&iC?mSEL7S*K4vGOkGvI|q6G zx{J5q%x(zL)sQLG^TCrYamO@cn1Ij^V3cZsj7#{3AFS@G4&KQ z7t189;Lp<>x~TQ<4Lxe!9&2>1vG5Y1hahDWyBI**=eA09QKmj1JTzliSh-v^XiEz1 zxMt0K+x^wv`bpP4&TYDPKIYrOmX&X})vRYH1U~5{pC{V|{(jBKt2-f>OXUymyh~m+ zO?;2fCG_(`*K;esjSlO@xYsm}?OH<_x4`EGrNJSrQ2{Vt*K{TyDBRHN}W97|umuZ{l#*dK8Yx(y;4>K*DtH8!Q0lI=*vFE9h9}Wn~L4iKHnCd*5-YL(RGte`{(cU9@OSlVI#vzpe)uZ zD={4U+sSeYC!ENahiKOhj>cMdHFYKLl-clFzMt@ZXx7)7(C2JT%fp(hWzb&diF(zr z+MPb_Kr;XbKL@dk19$2Y>5e;S_I zmjI)x_Gf3mV}>ru<8TBs5^KOt|JW(Bo}0XloqG44QUB4!Ile6Ylw6_gaPeP^$>tXQ z*t z^cXEN=zT0+{eiBXLfZWg?XCYRtn#1L(|%_Y|Cg@+|3(DaIGE}Fv&jI<|AG$xx7We1 zcpBU91knFsHu1lE9dP_t{e%D9V`F0G_#ZvCZcS_3O?ISjJc1wp-5E}jCh?2tP7!~$ za~sb!90%)`k9=(uhbj_LWNPK3mlyKuUhWyWA|p-dg{?MF3$>Q2&@4>e$EmpV9dSWM~|0PYgQgwdi2Q#?WM`{&gH7$SRK{lE{hyKQ~KE0 zwbZZfw9&i2(BlRv>8n~&D@q@pzMqM-udg~e*S9jhh|-OXkzYLeH{t1e?ML;}YB>-& z^^Mq$leM=FF7BpyqjdKbXEi>*jsOhqA1B-LPvl%5tKU1+k6k}kw>+q7)Hx$UdPA3b zaN!IMo(wyUuDe9>(iLZNGCMuKSOyLL6iNfn?0b#ubTK)JQ&J>UK}`BACCCyZ$e4X@ z&)93y1JGR77iSFFS_2}Aq8<*&xF#>4w40yANbg5*HS3z6M+E`+Eb($LF{E8tV(r}q z8%hHjcD9caSLiFq)$Oc7BqxNe-mf&% zGFQvvh?!su%aa|}mzj1W|B7ogE22PeHZ$hsy`f(|C)FC%g+s%Oi>ckrF}uETNsVAA zNmUOA<3hm3c_@(r(bN85o|ALqioFf0DPo1Jq)cpzhsEs17q8zBcsZMY7p`w2ZP~%v zuFFTa0&edPbaqUl>>;~Bedo1!{S~@1hXUc_jLv0*V({+woAu7n=t$pR-qNZ^ozg$2 zyEa;fhN)ZlLKCVaDo|s-VMmY`4iGOEK>!MPDaYvvP8`(&)#4wi=J*@Q2w{>_3bUE* zn^u+uA$`O>>B5C?9_Hc1i+^>|mItH&W|kxd7P6SZ^fk9OZH&*x6WrzK@N|+kyqhj< zl=q1U6kzTc_QQ4#wRTQk;4riVCV>z&){T`Sf^bBVP@lXcK64#FVGp5b4k{2nCI#UQ z53x``P1_RVx5d=@WTj&gvTe7M`XZHqXv`7Y7%CPdQDm(r+}zwPL7yg$)n#KztoCoy zdI#hgj-%qojN8=3J<>Z%PkVUZGmC`p&ZUnFt%hB*opFt&`$@DSJO0jR2!wK(ub_7I zgl?H0T$HtSA49#7iLY@WFK})J{bYgrcH%@1KX{571mw-&vWMv=`?4-Bnq4-*r8Twt-+QGm>sd`%Wpzh)fH*%^=4$GLAW1PsuBR9*KJFBL);KrMi;%wz# zSL^kfn=&elMx?+#C7EU|$LhiT^My;VY8~8EKsva4X6$9Vb|>{=vh@X%C9k-d%$@Ww zLniBM>?W9OXg)n}iCxnR-dl}q{&f4sEt&vpxb+Cf?JIu4jPGth`NnwU9+vL~x5 z0X8sx5Bs`qphsDyG|E$z043}V@a$y?>D%hsm}84wwOgRzFgfXYe3lLQ?KSqoeuXtX zcs+R;2u>R+5C^U4tmo=aZ&>a8{JiU-Di=BjI3sUtt6y@H?s2Ni)kB@<5+8yhcb}tG zw&7K3fCp;w3kuBq{~-)XJj=4XiqjP_Ds)J`l|c;K-*(haJ$k z-EyD(jj>CkBNMy|_7zStGIky?0>x_sqkqs2ta(Fjz>I2^`V9Xv&fCUjmQVdwH+l8C zwB(=QVKNCKH+%t7J1?W6A`!^K^6IvNW{u*jn#N6Uw@cO+Ez&swY@@@R4;j5_BMKWm zTdDlNf@fw6?TiFbJH$|gkMu&uf9J1G!QF4R2sgmNyj1;S!_!1qZ2DDA?Rq+bU%SRj zDF(@8%*FoaHZ*`~O77q3HlZq^e&a6wtQ80HQJ(04;9mneT3jB2sW=R&b2nL2Pdd!2 zQmHL$$#~JFNQ(YY_j#om%Ly@+3hI7KyXA>nNPn6rS}G&*Q{k+C7^Ib(sog(x^ipd$ zi?0wC+q?{9J3n`RQpqQ$Oh2{^%3A#OStWV@#QVB%E5wtF^w{8hF2()T_g}N zBsYZ{UI}g?JI9_2n$=om%fXTxpS5zVPgosRRVGyV$|TH6U=G?BjO+gM?RS7(EjDaj8*F4G(xJ#GarO`Mm7&G%;hYt);?K~92^WL z;&<2c3=QE2b&_nr*LI*kRpGFlEI&fN`;ZtpB7ig~0P)mUPq95S0`q+yWuj`jSn0vH zzr$05<7U<=bDqAkyXk5_TGA{t+R@fTS7C}z0IumI$y77sc~sg5@o=l_59>qNI;vkHkwqY0jKQGh@Z5!V z>gb-27F`1D*KnG_Y2(0qI8U}5-o%TAm&N6@Lbw4YO3QC5Qaa+}1R=YmN?lqRO_+<@{1d2gd2`MTK20Wddapya3*~^MNWWzB2LCK+qujrcqHissf+@gQ8&#viD)Z@%+ z)~UDGltzzdQmAua8Q3wFpDLF2b2>=l= zpJwjoOB$YkcL@oRd?e3n5}9o>uK(~ACoGEohfMLmDgyoIB#n`g`F}{^b*oLz2y%dw zWJ2n{l7M$-R<8RlC=F~rAC|e5>HYJ1V_PcpLp=3;{yO5(HpXm<@0+x{ZXNvVNvd)PeiAS8a~LcewC*xb+8fQw!pkrk z_M*3wA?9C{{g`goG%#)n@u@0z2E6uhU;!aP>yj-~-LE;~ml9ho<&xa%2nEexQkgU5u+?LyQ<*r!Ur==HB*mAGspxa%{8BONgjxiL_!d>_71v= z3bzL86&ZP@8WiY3SEKnlH&I`o)f^f}Ujj=FkG>KhtDom$=8&VTup47LnZOz1@uHE& zwd<%SQpiq3UNc*V={X6RPh$#r{hbkfiZO}kZUV@F=1~=hrh!~0_5jv}QHQ^nL zIqurH)T;b~z|Ie2Ifn^D#h-2Wo3h>nX}qP_Njc+pE+9+ukYS8drGv^lM`|aRF60_S zpdAI87ESHgY8?X*j2mbOVod{PUO-2E31lIz)&T3aU~!E8$%X>1sMKf&S7>p@w7|eg zZK6Qv&C(r!=;M%g|E!wlGQSSq*o{eAH!f@(Lj)y6*Q+01vO*-ydYH`Nq;EPyDD?V;W;0+#d2}YA&5nwhzP4i z!urG&bVOqEb6 zmM_p#`ZdwrOe-V}->t$jGU?7Xl8iT+B@9L9<$H+w95%kQc`=SBcz6p6xT;jNi^Nnm zF->_OBq_vMp8#?vyTuEnAR&bwOYiao87Py;U2PU-#=jitgPIdP2m#ar4P8X;Pd^CW z{^N^qYjdslnZgAWgH&MERui?jZexGEl}WH|jSs7P8gqwK9d*#0$Pg~;2LoNDX}w7C zVYKGGjRW;Zlym|p`519Ss%LtkD_5mjMQKyR)@J&$JMffBJ1@+rx@qb`Bmd4W^t9a> zHfxo$r85gfLoEw~&RAUOEs@euI4eKXnmQ5c^4N6l2bd+b+x$Poum37{^dE1!e;AnQ z*#2J%?+?@ey1V`#E&Ui-{thX1Y9Mgso~-4Jp2On zJ95HhX^DztyS?n=jLTNbmizDbW#i4s(-Hja-@iR?iRVnBxxFRRTp~Z0Gq3HB8ADLp zkFHJRHb0TIzT(@IiGDGF1{txH}oIOhc3D|vs!D;p6IT=CnuBLvYnP#lbx|2 z%(cc>o_L)@Yad_f+uOIZ2?^i0-(yR=x4t(yzK$LbVh1;!ViQG#i_#R;o?;}I3iw+D zs)(n!;fAh11aJ>G2DXPcpnr6)Ssig)PPcl+9wRd8=RWymh?lTG>y9f{;Z*E5u zMqWA^C7wBLDI+z;9`tSNpr&6H)!)R?!$AlCm1&Dbt>Jj0Qtf9z#49a3(*^H<5r#n_ z3z(egr3O`rNi{usj}^-3gKg9xGU>F^=nG*&#Jm#(Fh8T%Wf-Ibj@V7`6R7uzX#x!x zEt2_=b`eT#-K9%VWSon;9x9lg3o!G^6rnG>$+6VVdHM4dfm7bt%;U%$=W{8{00c5a zZe&P3>Ws9=t=A>}!ajm&bDliNC0v6ePVckyK3nIxFPiGpQ)WuH{r-*Jkd-Ef>sClp zWc7d~TG~kD&NE-0EVXU#K+}J=s_jnS;4qWUm3xuaz> zqU9l01^wEQ^4nk=>@Zk@*Dpws=v;ykDpDzW%!C=P*uvztz_Ni_1#FeP_>HGzy!f4A zQ(TFBvQd2vFIQwE#U9||Qy>o-y|%|QP=SQ4q^crl3^toM2T1cdj7VjzgdwKDNpaSf z6#L3+;V`52ll=9Dg<44oq}i+wR0SWSObgyOuyaM0fpuraUys>>`bOf<<7-T%+zGsomi^yI?7$u2u@CCLA>Xs62=Dso!ms)`YA@}=5#gYPh+*1~ zd1kbWC7*1Tf=>)545I|8&$^BAx}L=Tu_JwjPAyTqWzl`hYGw<(e)H%lI-6=t2T*aB zbmx=z6W(z~=zAAm<-vOc=}xzUWo)?Z#*d6wtlfYqG=uixsVq1Am&JZ$?jt2cLA>B8 z?@+LABQ1#mL>M}QkOF}Lcjrl_m{pMtUBAfI_Ru8Omi}DY+()}dGYCm=P7G)-5#7u- z*jKMRn~LMMk(c}&i{xjQ86t&BP3Jk@!8RetvpzON zHxvg(VF}>6&mea$w&fKdG;0EFH=yk#WUWgdT4z!i-Q}oKRz35a%P8MWs_IqWf!jY zkRpI8<5D6$F-R!fx(H~ff|w>`xPVl4R35%EI&)(r#KiN=W(6NTN_NVnUn5g~+NHzj zyDgT6tx5?S26GY!MLb@>KEB@}zCS-Mt}SlQ<@HZe7!qKg2t}$N{ViZ1)Ji+`T!`Iu z{3KL5k(b6O%8#ots5Q|;|Br&Ye|-}nnbUZtwMnW5L~(&0C2~VMS%3UJFhpUIw`ARy z8)yZvk<(xf0MKB$p`Z|Y8U7F^pcRIqgI*StXtqsp>{KaC5YERvR2bWOBc$!A`Xiei zBBA6*lvU^O7G5NorQU#(VDtO66H**f2CKUcnrCDej zwWoEzJncS9Qa<5%$b{({w3ISwW zqMv*?%tD$@*%>wm^$lk5nTfVN1O$nuFrl8wcvLho+8bfar&-4nh>hUN4bOvK1P;KH zAcW}X2_P`54$BP5V;$yU7M$ClK5M`^t3ZP5TL2x>Uh48q8!6rHb{_{u>5VAUM z2*P9c`!P)75uY_2^-Y>wcYnnapY=bZf$$&+Avh7DfKNRW2ZU5_F#az8 zLh>S0P(XOrEd0x%T~QJ(*ei^B5^Z2(mN zMQ}DwX0isc@Y8f*!9EtXCILubE(f>u?MmO(2jD@MNQE!Q9>(}X`Wz#G9*F&<<0QP^ zVs4Mm$2SKtN`8BY=0BoGhx4)#3mGi2Fcysslck4ur|~=sY#tlvoq9BBXh8E3LC1NRq(wg26b#_;l zYQtG>^!y1XD{9sH?lf2IDR6GM>azA$Cim@J)nPw=774&9^5iRUPdRRJ0Rt2!NU`2i z3rl-D<_-1`lX2Lm4i5C%uWXqwUbe)smcNxa_YiB#;k+-!#S^Y6KzA`G(&(jT-e8TU zdjNXH>{Q!J7)c?LkZG}6UFdoab|OUlrI6@yV>*_UpY#X<5{gMBn-fs*uVGKIHrfbn>t_aVr7G+ zCswH=xmG~#M04L#!Q6WHTsx+BaPus(6H^sLipe-CN$+AA{>ID|M7mMFugI+XVG*z3 zMDVfxx75CPxOnh}RCjI=5HSk9_Nd5VfX|+!RZX@S!U~?&HF?(_(s=}yWZY{bK^idi z1sc9(oJ|zidX})bI@njqL(TEUF`Dc7*pCnHiNk`)JV3d16TG?nSOXC>c4myU zbqk;Q&+$w;Hl>4T$}zDkJ+0hw5`_e1o2 zi1+K{_^_?(V{#kyVN%ImtWj1`kz8%@ zkr68&@4xfeqnEd{=i&SLaZOQ@_BSW5p(PGV{h}k5V@yhBQD_JILfQA1E|N%3XO4zB zv1FcqzsC>HuD0Jv-h;J1uiwt1J9gkl#Xf+f1Rk59tL|y0Fdz%p0`7@9elqH;SpJR} zIK3SDgsH>Fheu5?>`k&%lkMhRMH&-@FcGmA7^({}yn0ZWg zT}~NqCG0`To7O~F!;Boqs{czpM!{CiQ_`_6h^DxH^W{vtB5^G971;sFUbXhJq}=uZ z@6uZPj~X7d&90tU;y<{f_soPNi}WaFpU{@lAvTLko zUYxJc9b=!IRHg<)1B=QQX@sWNGKH*E>Um!9t8#cpdY{cJgm1iPrS!L9)vw$9o38)e zqxuKkyzhwGlunIcL_IbGEQBsr}(N}t>H)# zp?oPzj1`Q65Z)Cb=(lh)xeuJhR7~UmJ=fM;6OrvQWT&<(qN`fL6C&n3&s1~qz11@GW^AVT$*m+Ldmh+nET1p}^;fDe2eNp>B8-pWR zT&0duY#Kj*yAphO-AOm3v3 zO1~zGdU1CE191+Z29}_%2F~b!F@+j$TMYZZoOl6AoCy$tR}!PZ2q_k*uz^Qv1RTQf zgfI*&%@SeC5G&LB=P8+vaLog?<82P0LJudNF(6vv8Y6b~Y^5|2j~HW@$_eL3GY-uU zn5=R)3kgqLcW|ozveUe5cDkL75MC&DIN-Xl+&xf4Tp#bT{32accd2~D>7MOZr zS8XX|x6`Dkct89NkGufZn#v0sV1d-G+S;mFY(EWv8@*9Cr(&}-EQRe*QCt2DaFq@3 zH+``&kgVQUT#24Ak_2U4TpC?GjrtRS>|iocc+cb#if0f7MP7juMu1kq=bTvA;M|x4BUN^On9&tueBLX-wTWAjj)E&O%9k8G@9O=?D z^O-Qbd5`DF6v?uD3z(}(O-i7VA`I~|D687GzKBw7eslRzT=6a{<)Lo@rK^aDN`}E} zFQDg0>RMG@6RJQy9a_yYn*hgC-2X2Osl z;=m023Wb@I#O;8NOI#4_mKRSl#X;j?uq`W9Ns`_0?q|4YeTrF?T4xLd>X1!%X zJZh>Z4Pkm>^a(f|9;enj7#=F_A4HF-NZZT3NvTb{Qf>yD!Qn@8+BzgaUW3Gj_W#A(J4Z?OW!u7O+qP}nwr$(CZQC|0 zZQHKQN;@l6$@;Q>efzuJue;xU@1HkfM4X6y_TFc$bw-T6Bj#Fj4z9^wTc?1lD>I96 zVs8iJ%a(XWuC$t^j1)9TJx0wHW31JY*ra?v0f|&DaK}YI5Kd(EwnCp^tdOu=fxqO2 znM}lF0STWiFidc7-vkjttByTlH~$HX(dSk{A3?|1DN^_J`0?~c?Q~K;WVJLhp9Ae? zS8rYspwopGT54#YO;)ZwgS)!75@`!&QLDefx*3@O zNsfmJL0MtKSV&#xG=u8GpWrBGiYKfVQjrk5fb;{%Q6Y85j3^9>{Vsa1RvEZCK+HYA z<;@lvLwi}A`*yJ^zSFV8t!S~p2IKpNsa{tnBC!z7D)I~3DY)iMrLE$amkfEp9V3j% zD)c~MvmVCqSnTF8;ow5;Oxm0aOv#O-wyBoQuvFP&)uZ7VB?z@2P5+zd>h*zmBo5y( z7dX7}x7);D6`IgR_Di2BmFeS)*so5>7Of6j(y~1nu9)?)r1HX#!#A5~9oM|r7QQ=e zED{9ARE9Vf{bxeY5PGN2<$139x@4)SzoB+>HSNS% zvKqhE3KE4x?BXEc+ z%pLbeY_QMD+OKYwMh0QI@>uAlVE?>HlQwNXYy62g)kAM%2c|FfD;B%x8onl{7T0{o z&TFRa9#PJXcBs<+V9;uC$>Nc!Sn0ZB zwlMnr@`C({QB%@Szx~!?S<s`eGh zt@oY~IvKDLI1=9pjO7ZVZ0?L=N@Wi;)}Sg1ZN{BiXWDPAd^JY>oEn_a<_zRL*;uf# z$9Kq6124j}(hNI0$MA_}msjtGAXx673_wWP{LAo>{B!Sy=B9I8{vH~QTQ5Tp@-@B4uxT2L4eQ2`l|oTSst1Ww}WKw>A`^qmH=q){+BD6%2jqG=~Xryi8ERUgGmaV`^R+nj;YB`OOgXtMmAI^`_#TO&lZIlG-S2_F>yvilyr2e*b@Qx z?Qf2oh_p~uKol?eEIcw#HQ%M(M;%h+XMHg60Bg!>Z%kkj{# zp&b|}0e+mbK=?FittaE|p&2}|{rNL;n4cLeu4yK@fT5=mVQtN9C6znCZ})7qR%vy? z=h?*{nK6F(UO!k`_WDd2u89G)ELfV~d9Zd1)tgdGk$LJvH{?|$R==!L5o8soVb00op=2Jq-@(IxQ zNU?>2)#{haOAD+Au5TU&2}KJF_*m0wOS9i+e9T(*{U-p#vSn~2UPLBeOM*2%ol5GC zo7KthH==K9C%H-sbH+ysIywx1Nrm;I-Lzlc zsg0^_>kK8%Wx#e_aCsJ7oBpom@?_5U4X6E38G2;Aut;Uq?5b&ij7p2F?gs^y^F9+# z>V?NDQ7kh9sMI_G)byNqpd^yg=w5ov>O&6{hr%H-S3-=n?;F8XEDyR?(}hrOA|6CsKm_3m}xbT@efyfUbx{w z(;Nt-Cxw+8)5|vZN}%$kb>GTI@U4BLMz}i?Iy4ZYaHm&jhXDaGL}e@%Nkr{q7*QOj zYKdf*pWXrMRhwkWhi1qQBSA`5Q4Vo^{G&pU{Lb9`n(2QFiW=JPMd1W}7;YaqYWz~3Ta^=ISd;0yuH zBXBma_A}#~7e{^(0!-02>fUG|QD}w`y*(>Z0Mp~i1tCVg5D4=(xZ!wD4dPX`0cH4Z zQ{7KFG>cVg(Oi3gclZ`9!!nU_+6l5kM~G^k?5AWc7L(&u4Yf-RdQ~i62|sqHPqZKC z+9fP`0Ug!Ef@3~M#jeafo}L^vTSSj};Ux?i2V$$+6hQ@ z;H**wCF5=Oks1s;0CW(xLFeA!1vo1NP*rCKK>VW9#mE+!w6?E^UTq*NkRTZ%nC83- zw#a?Nu?00akvX&g-gPI{0{hPOMQi`v4RCGHecnT)3vj)E;UEy%S|5)Nph_^>8l(+% zC$s22ls)U1RKf%WP0~G)=+=^KuUBHYU%k~8e!4juMG+y7T z$O3K(ULaS)0d@IsvtnD)9dHCOoQuNW(+QoFWb zE3^*ZQ$U5XOLZ40wnOnf(QM}@P&;7zaqqExLgi4zqh7Uqc$!&bzB>+PcDG{@|_J*z`;M#jOuZ_Li#I zbTfS6(UbYJv0Q~H^~DvOGxhod49%2&t(Mugz((SUO;ksK?Y#^?Y;>XH9tj-`ZsZXd zoHudRV%uTCgQ?DO_ve>`HM|7$h;%cZYo6?<_>5m`fr|KE6e5p@Da1_lQDuanB2&Mv05l6GeH zU&j2&&G?eT`%O@VFfp*w3mZB}m|B`!e8J)D zjP!zT=IWLvE*4+i7``%CJpT59k(rhAuM4aHttZP@;57bg6ca1MS0;|Bt=iX+zxoIX z+5Zu{|1&wkpMiho{j(4F3hCEgz?A8)82;HN{4X*5$DE=6ylG%#;ruIL|IJQ&rE6=C z&6)J4Fr~0B*Ck?eCf#p;w_o7EgpE_j&DqWDc*uk?!FB_UERCm$XX8cknLb{$NwO-N zRNAQ(9QqRAM@4B`6iw3OtIFfT#fq07YmbKcp0E3ZS5Kba_B35{emo!j&8OqTOZ-=v zTlv|e52Nl}dUSDf_&sa)qaRyOPHkL#GrPTf)1F>0#ZRD5vpCj_W zGimjDJ?>wQqKj`d%bMoY>Gc_W$ut0VYxr9 zrPKT2<@#}OWBw+7d*A!wqFd^F?xWYokzk8P_R=^ixNfnP8mg&OpIPRTLZIBCFPM3K{MC4VdTnE7@0zb}ZS+1s1*f zOe5BAEP3*iF-P}fEMw(M#%fk>hFhKa*PzvONRKg~Kiz0+&m>=*CUe#+Jl^;C&UYzh z=DPD7Was)W*bXJnp?TliYuXt;1kp_Nbrm`DzW6CcxfXnodZ(~yi(v!LpFv^nLM)yi zFx^Y$6_w$h@_D zk3Z4YH1_Dzt*K%`r`EC;CVs;GdI>*1wBpN?piZ;sDnOQykmC8GSlV($zd*iZo z!(i#D%glNvLgY)!D)5qmC|Du|Rtkvis*tH$yqwM{kOnZ*ruM!`GI9Lj29oxQ&JRzL zigNP2yDBUfel3WLGe7_8tfPpCgr%?qClaF^rS!FMU%T43saU?ioiESFBOBG53OTNW zKW4z}98M9dOKdQ5F7yQ&NE&A}i_X%P2vNiCy_VE>++4W9qJ~094Q7gTTAXdntQoz13F;pNq{j z@)g52({#d|%5Ey~W3II)@M=aP@~M^SQ!b}GHKzIt{=o9qacM>t`3oxg`OteF-rSub zF+TuHhYNRh)bP-XpG`h~aL}5^P8MIUCs0SXV~(Is-yik`lpDlr7nU(LQk1YFco%XN zLl*>67lXcC6p2D*9*Gb#He?|02n)gcX^xg0AbTGeG9S@NS(B{ z;juRtc-RKduFH4I=n7E@weJ(ZGDW+)lSw80Ma}Ea?Q6UC%WynWI$hQZhxi8H3Q}` z^e8hZe+{3m+qk_YuJA>4O!p|`ZC6&S6B0Ck@iml8D8qLlF8%X4$BeRst%KwnWh72b z(|7HNZIMP9-bZ@lB4J%8WUTcog=Z2B@+5=U>C|CT4DvJsN~c348d(q+z-Hmtn4lle z)qAhf{sJ>+&if$lB7=gn2F>;M-@pC?co1N5(^KIzUtiywoqhBeQY0y&oXmlYDQgt0 z4)L)TwTqxev_;xg(H^~Dk3Hifapt>Ixwi1ZKg&DYq8ZJtSTPOPeY(slzhU#9X$#K9fal zkdC~KJclIFVbPCg3yq63P43I#14>yF{1+ESw+V>kfnICTrRmI4R};zloBemwCl9LZ z?F`Wg*bZ~djrrDQbRQ`~W_|#1+kJVXj#wJUsh?VgHI_&Cja$T%Ku#SHipYGHG%H(; z&L2!&Vu^Fjl%VNpD?h?{P!dg+?8%U@Y5%88# zI4^{<$amq(pTKWM=e#=kxzRf78u*?c&S&nS&Xkcd5UJ`=*e}adV7?C8fQAY*`EpI) ze{MXZGjx_lk8{m%JEvFmH10w~_S5Twxn94&WL?*s+`&4K_6f2Hm8J_M#>6qDJBffL<0({EX?MGZ#e zkc7E$o20YX*Go#IwNB=kPV#Z!qQ51@e#V9Cp|y3veWS2vXno$GL~6uo10B>dCWT}~ zg0RGrQ3(POrq|?{m%&GJ3Z@pcD3BN3r*f49?3l}-Rw7_VH6-WDSvTy>-%QETTw zjlU*Mm$xLEJs}_>g>oQARO*2lDhnva6x@q3xSE{G9Nv6c)<)w51 z^=-&fQ(*4lqz*+4HKGcxzB`~jO6~#L#}GObV%M#0^Bm+5Jdae*y`WDZpOO?hY`*kxtU-P>M~~1fD)X&bVRVLVwZKqK6RbFGZ%ls^FLd%HDX&~VB_5Di~ zwMi(gp$TQ8wuB=W8qRPv z^w#5QM8pJ9clTB6LWgF=VqKq1vurY)T`hQ}_C3(F&wT@2;KnwnraG5WuY0Y2S$9f8 zTQbd{e)hlw=`Q=snh`l`>n8Lc0o-p<5gil->6@cV%Q;#Sf1ar~&3B79r8nRj#Mj&Ze-fF#pLhdeW?Gw^^T z)qf&E#{@#`Winq}NbgHV;$XQVn-22Du;FGqXT+ot#L|W$67$dqd^lIiP; zNCPTSy}_~!4~WAFPfmlF;{{4Nd|h^x#);)@WX+Y<0w(oFeFAu&0X)Lc|Bg! ztK9BSiDumCR;ujXs=z7D@zgmjXn~^>utI*CR}_rEvz{xDpwwxlAVf~UrPd6SC&G~R z$;H=^!zhZy^IA42fq&Xh3Ta6Wx4Bvl`B8A2yR!;@~o2zwk_6*~AU{#@kqZuE$mwhZUh#;wnv^6uQ80lt zx|){x!zk1qE{dDIqEL?yy!rSf`*s~xCB7L520Xs*`we?lMMDtV*|<%G5Hswa5Q*tv zM}P_i`rY~Y)H>L&EjD!x4ZGg6`;2)1$Je=^kA<=u+V%q+4!vg?&rE8GO{}}Qze(1; z!WQ)_7A2YLvvJ)W<$G^^rFm7@d1jmoM~W(>DN-&Ie%Dc)haE#I8>q8l;5H3SM(G%^ z@WqnH#PbQ&JcZk!Hg#vqy^C=~N`WzfpJF9|5%urm|IfS5yM3aY%-Hgf6k{ z&ehjS%a{Df(lIO0SWpM0+xzLfXqvoKJ*tomvll{r%-BG-l24z$^goj-xlgKYL+%79+ z$Y0-G78}Hr&ljV~$o0Zh1~se_aEg-#UZeuBE`byofV?z9imJ8JF#;?Ph1Faj@)|}C zt7tke3b9}?K_uR)jA)01wz~YY6!paKcV_`;W@Tt}fjH`2uP9dr5gq5lG?pGB`56NB z0ZS}%_MM*gTq$j2{8FX%Gx!VuwpmSGZpXa-rSHJOx{)+k#oInQ_m}&PODufe&#Ydv zj_s}izUVb}l3kOkz=c&iWqbNZzKNadRM1OPX1`SB776u^SYrEVBk?3AJ0R(ZOe$n_ z>)H_R67RjE;c9AqqEhAhUPO(+g%1y=PVMo>WMcU+Vj!!}Y!tq}2@sis2X3EJK7uO? zoyQ4Rcy8{Fws0$_Pn%f}1kB9PW;Ne)k2lcKo z4`DMy$^!q9+xa zySleU^A~SZSh>WG0AM0h{)xO*oXv^G5&=>OKgsl9OEdIclNB{15E}bYGCmN-!vrrd z8ew4+@uV2OkbM0~jFG{!-EtbrHX0(!slHTr-WJ(<2WvV26*@T6UIX{(1vR%tCwx5f zB{O+@b=9ANqHh{G(-y)2`GDaD+4zE>j{H@#__UCr7jG+~e{AbP$K%(+AiJQ$Dal^T z@xXlrFrZdwe0>k#!U($`)5drFCc1>vNq_ehK&jfMJst792s*h>u3$9saPy##Fs!Gz#XPyC|W29J$hO?WP}*0T*je zdqOzOU^mX*JAQf)AK&=Y94@e*Q_b$Fo4D$J*r(mmzJB8X3sU+PFF(C=3)!tYD8ARl zX#1JaDGJ}-G^BWUYJLAL&cD6QWa{=u-YmBG*iO|Mkmt*C7ul)hAh2SM%PbE|kUfosT(u3Wkz70E0tCSeH4 zroj>*sAL2p^?NktkCktQwkAYW5f?^9mPD`sXK3r1I6J#LdJ3w=>9-O)ftfn2^SLmD zMk5=p(ZIcXF&H&X^u(ug9NtvnjFvRe{a%kq0*VhrR=ol$G_wPD;uPhyjm=$WL>5K9 zfny(t7;DIwfwg39UrAX}yk^*Zs6>+;PyG!G0>Q$2fHuk=3*V5a(4i*r=1Kh?7!TiwaN9c-YC^ckrbDYv zbt_l~0Cg%@3fnhBUoCvf){FrQVSC2?*)wZ0)!?enHoKOmLVF+iu-S|A?R@SBFm?LK zUD!K-K){&R&(>NSvEf8~Ng&fmRgM*Dg`NEQT8CP;vTr3?KM|A#e(PR{aZB6_T8(@4 zDwGxwiaIf^W-Iurm$MG24z2)t@BRXqwVm&ceFVmG=Kk?YJ?Z<9MRqpZsz+;WA_xZq z;qo%<8M_$qk@%h8QyxMmtI8CwJx^W}uNg#GJ73H-hgj1aKL%pT!fOV0s&UjMeLdK? zYK-B;=$rKn#f7Z>YqN;2z0~dCB2Hr|ti5c+yXzLksyIEn7gSk3^_DIAg%alEyZs1& zFS?vW_ew^NmrC>vbkSDPNa1JsH9v0g$^mO9nmELwwPVOUcWw3W&b(T*rF!G?Vd0K> zjQr-6^Zi-<#}$rJxO5nz{c(jy2yAu|DONqz1p9KW@Ix?PtMqj@=QP=K&BFS=FpxCw z*UloRn8)Kvhe?(3s=>o2L?U)uI@%KdacWW!;1lofnwy7ALMGC+AZe{I4e_`Fri>h1 zzm8O9GD{Tm&oXO$!GV~w5U?`BBEjktQBp%=C!RW1!%m`;O_u)5 zsQpywr+y$wg29e@^qZ~O?!Ye3&qy;_=rxG)bEk&`_m2#lJ2wEO6Osy~(S*w58}U=%qU6S8N8LPSQ9h@o9FV&S44>J)~N8 zDZa5$$X^_8fR^<$F~=;lU*VNmtt)G;`6|?@A>BS(Vx8DRp;zY@UKx$Gnon89be6~` zAjK{)3Ok_z`4t!?u^2JfS3x69n1Kq1LAo?A&Rb+ij+0p8c)-1~P{kx0{Fbo0%;#LF z{2}$7ndpLE5mVY~PFdW@ zkR3Q(MpEq%N}In*e2^({=@;X9)mgRR^$;;+WR{e$CJq}&llZL)83*HGU1BK^#{n8I zg68GP=P>qC=~X)$p*4U4n%AhMFMN|qHV}a{JZ;w*S-y5xO1kHUw7`hOCD$MyJ7Dfk zQ5J8}Mri@N!dARduk9)puy6WxuNg80;SpKf*5J1(2$A_vwKpEmZ2X&83Ia$eLw~vg zrfJ&Xex{aMU^M|J*l`80r$XLSp&$J);Odcg$19E-*O1`~b zpjL$qe*aD+QnZwls7ZT_Ni?3bYilnab}V1v;%pp1eAX!XSZonzmTnFS-VwQWH_!zK z-+hsGZcElD6zn&7qSjWFmI|36DbS^(+Y0qoMB5&p!HL6yJb5-baUUe@YdyeU3s zlFbbZxk6!%16n!Dy^?hXzVTwU_*5PLoEw`Tm9~!UI4u>b_N>@*Y4oF#C|-3N4Cdv_ zwU8Z4t|l?~bUD~f-a>E0s}VH)ohzh^B4QS`*dVZ&vrt*kk>B`pWD2+c0ZshJy6V3J zZ!(s4)?XNxv5WQ>sK!Lc#7@A({B__YU}R#WWB-#a!a>Kz@&y9@`|@tqKXd*!joBZ- z@?R5Q{z+n$o#7u#L;j5!ObncKU-K}su>KKxWnyNg`%0%_WM%u`kg0L}h3nD(SCKgj z`_~oz)r!9gP5v9l{2wxam{>XKSiexP|FVLeg^q#k|H=x+KYsqJ73}|nJ~I9R)BX+_ z{<~Okd|AQ%cPp3~zO3N*pRD*B-uYj#VEan=`8QVl6R{jS<3Ga8{~5pIVB}!_=VF~6 zT}|gN{Larkig)*Ki{D2? z$l|yFQRwTq3rrJ2`@l#7MD!$bdo`=k*&8e0e%*~Nv0pr1p4<89zPr78zC6S)&F$qM zm*bnaM~`iIHTv*;Jp6Qp<^N#G*PT;0Hy?S~iayY<*Z;%nM=2CtRq?1_Y0;R~=l6J# zA3e5KKg-|e=lYt5QuWK{{uOn>v?>TC=}WmO^suBRdJg{ExIX{H!IP%C`u0KlsNdVg zg?gVXo&To`Y^xuAoHf=Jlru>92 z$kh{$<+&z8O7){{jYzO4M_CPeqaaV!*YH+iwg9T1TyD79me#HCc-}AKkhM`inR@hk zN!V@NrBA=m;YNeepD&I+LY}|xDm%1dBc>vL8Wu-Jzm}+=*K}nd_N1RT#OZQN${lTB)%NuOi5gtD>f)owd(zEpl8k|9 z>KmV(e}&od!sol0+L$aIL0MptPl+%`sgoVQ=jpLq{=ozBB{x2upP#l0w;frm*_Pr* z`J#~cyhxl=?0P&3ph_`e70Pm6Fm?b%PyYoysT>YG>V zz^ZxJORJIOJwU@|jlC9a{Deosr7+#4rn1UavrQHWS}_5KB_Ahjk_yL;!abS?@@*pM zkM;#!bu)ThYhOjI!5qFJWE7wnj$0=WdZgd z7VkT>iIERXl9O8-6;brbZbyUj6&p?+#e6fxz`vP_TndPZV5=%Qnw%?(N>M5k%zLgT zM#cJy)ia%=b!n$=n0l0ZnCA~@7Ik!TZsQmqS+sE+5m!mo_c||M$rL2l#lE)+(&n_~ zIaE`()838Ko)GR#H5jjrlTuW;4AdSGMB29Ev!y8piZnT6kEJbhc0R3IVGc-A@y>NB z6t6464im@SMA{7C%PZ2M`y7C9s;ngwjQMV&?n*Zz;GtW^AK*W1;M5#XG3spsRZUHP zrh|=*Bll82YFz{qPvMv4X$jtbe$ea}Vpffc=Ko|ygRsz;Qwa-Y?TZjl#ME)j2CtRe z-5G{7I{YnhCP8?Gxk_VV-H}p06@ZjA?ry{pV}%K0$A8|NC3r!;yQq1_XHOM1;*3ay zG;7n8!Dgu+hpLW=mW3gaNQ(}P7!t~KE5 ze^rn6;`AZ?zAl=8w8O%W2$tJ(SIUVnd~&s=(xDSSb+v`@ry@=X`L`0xXjI7d%+oHZ zgMBr+e#mT#`X4llrvg4p2)IE-r zs}64Fty-w%g)YdllYKi?Gk^e zik{o=aS(&_LchI*TIMAjyFcRv={;D9F=)f`xBnhp;EDRsRoLQKlYr!Hi)fLj=vjKw z0y1@dmKSMHjkC&K{r2h;zxNBT%Fs2oR<6&eI3Nm-IoUyfaCd zwYNJN+}3tn{RI8UC!LEpuucZe$Pc}JpMx>#QAI_;EHDvOF$3=A)`oDsyqFR&b+ zRO{ff4#Ba)*y0@w#JaMg;>{=7%R#RnZ>z4HEFN&N7X({Gk}71J<^u-)GX9kR<3A zz&ewAx7@5#EjNVGD=(Y$e)D~t?R)CFSH)DXW)vWd? z)vYFR{r3eIb+XR(;q zJXq}Ir3saMW>B#OIxzt)MPX-r5k$O!lNu5URGB64n-UOT8gdmJl~S}yMn39^Gip-O zbxI%%KlgBF4Y|RO3jvMoeQ|?+CaqsB1i5sPFYB=$5gNtx(lz}_2!@c>Eaaho`}1=oCu=gN2J>oW-MmVas~IWU>;N8vIPp4le`sV`4`06sY2UxnMEQ|mh2${ z#leaUex_l)1g2+RX?xWb=&ANtTZrOk_KiqxpusASIgm}A#eDE$W!tk?Oal)^ey&-sjrFTEg~dyocQ`)Eq*! zmSZpbjot?S);#c)frGHqUQ*lxa6E8snIF3$yVNIx1qJ*gM6e%Zu5-BuGKYxZA?I$( zJ-WHB+~N{=!Yu_3r|w-VNOp-`Vp#LTXp$Ne5&*yRr4wR3>kzC*q(_nsGC6>8faRVl z`WT3#7r!*g+xE*LZa8%uzG;Zf&z8B>wS8h;PHt{A+~4|) zOmao$Nkb^QN@_qIn(fzW`xgKdb;9CE$+S@Be1jbdQ+zW5C+2bpSzF^fhjj;9GQ=m$wxraxY0+pAPnGPd7adMaWKV?^ zjJS}BsYSRzm!QLWoJ@C&V!fS;)d!$|^TfYw(#rTDZ#O>eHK^&}yp)IW^LiwXmaV?A zpa@|NZ=LfdhMF;7ZY=}tE$kd^TYM{vXrJvd6t-FMMuZ8RYFJ$bg zIPKRS(Y)3j&$EFtOF8E|-Adwka8+4}v!F1FkECJS$+?bD;xNj|yx9!~@u;}zEj4x0 znK*r?GB+TZ^ejs(U9hirdE2W8I^=XTCdWaf+;m+Rd4->=6R3NPc8qg;RT2|P+m6Lb zZPxRyLX@Gi&C3*%LTow_wvRrp-5Z|&$h}Vv)JLMJA@#~gd>7G z;!we(2qzNQ`vcLY1_F}=Ch8_3fi$V$xCej$|8M|0tVU1gE^?5^pCNH&nEpVt78yHZ zm?Leme5{m1Vym7PvjnC(a~w-xs)cJp8KK%Q}#O%_UZ_`ffdx-;I=3&Z<-fIwUg)Vs9ZCPunPb#Y8FgHWUz6 zLC=SQKC^54{mRMUQt(fxr!wBqScB+|sn~L8~p>jKjhfT+L<$PcC5|4?C&{S>M~{YC^=FF z<920fw^=9b^g4mTh2fI+mS;%7pEZgIJ8R(y+;H>TqGIOVnqLT;xpS;r#oLKR_jA$! z^^5^794Dr%L)jWR#usRTbt;)8XKWzdB{Opbc%=iF?kSC9I+I1L9-?hv9`$9icjK~| zTUZyuc&12N&KD77)>ln$RASjD*JWobfHJ#_RwR_2MglJa(IgXMKT~vXI zaVPSTz^5+dBZJ>#BpKf%b>FLA5~Q(C5bAMk1;+~7x@XO%)GZF=_RlzBJopc_3R@k+ zh9P6h5!DOv5+sl773Mh4L5QM?GH}6Pm?p}5OB56QN;%1%g~hI=AVYyoAeZgBHObIH z!<#)JJJg)dC+s<=ct4tP)sUR+-4fwEJ8(~L=?ze24DhK)JFr&swgg%HFU+%G|Yco0H z($xnHP_FtlPZk)oa;-sgN(90n12&myu0g~u5vDwSS2M~pVVXhW?hi?a5;PrZGn-3z zlC_ynV9kX1=)xNqMIaOGLQKh6;|guPO_rLqrP$s55^xBswaky*EN(faeuC1@_rqdB z&RfrY$neF=APQutkN{?~S4#ku9KDVXHrv@g1$V;LQ@mXE)y+DW3vjT5S!jyV5fbH$*r==~N_JsxeIx#BeJr z#x}pI>(oP5qc20Jh&Q00{nm zmQEotR?%v&mXA;eR;*SekDuN^)(gm;#Z8YB&g0!WMSiS=y)zq|teJV?u}ZeT`_mED zJ*GD8nXR+<$j_`0lel+^K0asGWO1Ot#%%E>Ljzc6&|~hnZ$CbSAN}#O^H*4P(jZw9 zfsl=A+gefHg}v$q0A+NlpQJjdCp4o!r%sf5)3ZNbgm4N*bzvxf3^xHw8I`NNftHaz68m{@ko)eKbafF0M~K2 zYZ+Z>h9PYi))Hu~Av_cW2931S_K=gx!z#N=N)&WDDe|D@4jz`EY|~)JCI8OW@A&F* zNa4F1pnWoFFG+VDCVB}9&LUW;gfqG=LMnr5M@oKLzSUW1VUm#3L?Qu7)|uAHdKWqG z-AUYR7m7ok7#^2&x>!>j0)2v@q5Dnp=W?wWn7%`hJ24?wUy!cgZ$v3d`Od4T@1K@Y z86VCXVG5BUSe0NMe9oi=!G@7op_cmKd@#_MWhPRZWh^uxpC7TTovFrBXQ{;_nTD8( zjuGhV3dz`3d+dmAdpauHgbJ#n-`gk;!=`0wsG8Qg7BDCcC9a?e`U_%64=gan^Y4Vp z)NQQ`)UivH2N-55&{r*@q{kI{alF|L)f*2=1uo(=9j=hvt;TPZ{k^@VMz?XXR0t8m zfKG>*ZpP)oYEtu)SgeF3?JswhD`kjJVX-zL8x2TebT|Rxp-qAS4K3slkWG7#A8CP^ z3~(zcB>hmKT#M<;fdpe@+MjWF0kYMyh#Paq4?C&_@0}#0B)XwWs}j|f1(TQri%Qm8 zxWf(;)Q!=VI<5xf#<<0kt}eBrNfvX&`b|k>My8Kw;tE+mOJ83XE#QuHG#%X9`%cT5={!bX^7!Q?;w zC?via;l5%J=*_Os>Et=0>zL!pdozr0EH>JDrh@r~Ou-1!g9TZ*kss#Z2U$KAHo%7f zLhl11$Q7>LbbyFAbTP`ZcNkKfVN5{}8(hITNqEc0M2iII4E`W~!@>iW>KbDe0|XoH_6pD&QNO!KCF*sTr9ygaP!Fog>P_d zw|_eT-Gj}cV^<$D(^f7vWadAxY{WKwLgGvC1Yn^`*auM{%>O`0Km&&qeLpb)&6q$L zvg3ns2B1J&77)w^Ftf?*jA#e3i02qgjTW2eiJQ5N$!^QQF|~e(OQJtLIS3I_hLbt! zwK%yh0Jj+Z+GX<1J^1J_n~E==$gKH85F>J~T-K0J$0X6LH1cx(TSk&^b#U3Se!{eU ztifA3C3_RqD0l1oko=Vh%RHb^ zChA_5DhXvLtw1HxSVV5KV zOs|~tgwC&=N)5g-sn1dvlQF3cx_GofzGp2(gI)UEq+xMASaZIaoyDw|T&N1;s;3*+ z-tNn-;@B*+V<0J~u~~1xgP`LqAlswm=KV2CHZe>@FrfIp?#tEaY%DMw93UV&Ufha9 zcF|zdb?1ss2@2qtzMjiLxNIvXBbM}>H`|N39VolG7yln?=NM#Lm#yhEPTIC@+s>1= zZQHhO+qR99nI~=A)=70%)$M!h>!|A65x0M>{bNV0H^!cGtvU91#yhaIvQ+$-3no+W z71Yd!vOATDP#sv9!=Ej(-wG|v!!6((`2Uzl5FS8K@2AlbTDz@-YxYtateDTg=#VqU zG)(eb5;<(*e!KdKM1Vk*r1xneyiPsz@J*mWtgqLZXbU6xg?{$r^ zuNS+KTSfPDRa##$apVI5S&XhOM^I+FaMm%L4Z0estv4H}w}|S{mx>ZbYH^MdL0VHN zoDIUVxXYkT!Hg!|kV{lW(cVs&4Z;D67DifA_cK~Z={_sZN2g+{)h{dG6*u<#^)hUbh-tKR^AeSekA@5 zD-K6JPzd)%UC_nn_wo<%Ue;zQtSqRC8hOB_8AVKD4Z8L2?KG~pV>583QSR=0v5BeR#z<=Nnhz5%ZPe}~5RipDx1|FfBnhvq zCwZW>Od+3^nqYlq*oesB)+UIlvJ9w!Y@1 z#YG$kZ4i0Y;wXNTL~;!D*nvOSQ_8&|isLa6Nm5EG$XY}MH*oD|VnR>1q&UJ7WeY`E zT!cR~`)=gSv@Ee8xF|J4mPG~8by?S-?^g%S$uZT*;#zVtA07j;C|)S1mLqmee;NI> z4)Dyp(OEDhV?pI08tO9lX+6Zh@Ae64UM+avP+dR%p>*6L(eguZ?f9nM zW80Rq$JZw3`ZtX>apg`vN@hk#!f2o>Cz^Fz(7gEm1hH55gKP1~G$v-E)XoAOgAVYQ z*OjtqhJ&Fn`}=z!U+<+c!7}WEYgNGPR*};&Fz3~uy>*j)1%1a{4bHq-vqckf-_vy} zAkX-bVN2dn(%8@JZg&ua8oNN4k%mhfPcq|O4sFj^nd7Z^EZ?)T`S`8|+Cj}s&Z(%( z5Uc6S#A)@9r<3`>$wNbScUpZlyEwc6uo$weMaJ9AM-LZgwq9BvE*{;Q<;hUrET7L$ zX1)*hPHpb#rO3nm)6&#h%a_v+1*o>l{D&@e<>)yDK=5O4<;7#7t*c(yWq=AEQbB@Y zC2)KdOHkKEjgGB)(6x86T7t8Q;z*OM%+e63&0 zKW@!`fU)a2i3(|J%{=ZsTzh3}1a@+SR(1=<60DrKpD0v&mV(4(+b2Ox=xgA|TBdzleS`m2K(X?1o z+A_eyv?ta9y9}drQMO==NVfw)K%LySz9qoC?~#wVn12V|QxomJJaL>oRnC}y*TW!??99)jMbz7W&1MCy8hg(VJVt zSZLW;@W1^&X}_To4hC8#hVQ9&Y_#kw|0A}9?XNA^4FBAH{x5h6CT0d&cIN+3!St<# ziS_@B3WmQ@9sk@@{x4K8(ElSAEG)F&GyNF9FHHZC^#2$NM&^IzFT?g%f0=J~=KqS8 zFnx<)|Gw`(L@+VY(=z?X&+|W1@pnYzKQSAIe{K!`zl4IB`R~>=9N(e%-;Xt%unD%04mtH|!JBH*@v3#qbXqOf28K^n089JvRR{ z8GnVJ82=f5`uEro8!PMIx7UB!25f3;I%0Lk`?w~54R%$hF^UDY6P+t3)2!FGCR7o< z5yOeO=MgI?;7BawlXIDV&3;ab6wU&e*zLmbHaC|?#EKjI<_A8(>geV0Y1G)JHAy|c zcs$?#8+UYP;*LWVc_kFn4!AUgR-X1UecYkBz&^|sc4OanUF;>S+fA-)FdkDuXe@~16(M1#S^++(%sj3lFifLf3 zGIY*dHuf8N;{%?Nd?9=5(vU5gnq~1)n<9Nb@nN*S#T#E;?3Gb-eE`XAWO|)4fQ73f ztr|duyO}vG8vMDcOIpR3af+9-i}!j(JQXD!Nr*+fDso(5v#G^pctj}LMEej#sO_i@>W{J9#%EhvGH4Tg<3TC;~V_5Zwx z`QcsnbWp++)G;PB*>X=UQh4#9E8Dp5*WuBrRh#;(AN{D`u2njxR_8SxC7T-CH?s{w zrrMfl9&K<6_Ni`qbNwZKW`x*4eLuk$r4ZJCKs9b5Ku3RVB-lHR#TV=gVUr>#=!krH z4rwUaBSn$j-HF1d{f)r1)SA{oyWW_(bRgEE_8}g6V*+k7-g@9gOh2hboV&U^F6@vNj&gQi|6F-Z5|r~izGupb5up@J z#y?0VLfvQoS?)7;6W#RF!_8Fx=NxC7|)VO01k>;~ox zzn&+x6$|O~t^)?~_5G-n?ppD*S3^#c8!J^j^PX4uK=cjlL|42z(O)4x*B8OWZ-G`- zL4;;_RHQ^x%Ky_^0adbz3J+Kb^#OmF3mx$e?zMZ#r~QKDjgprN6aXjB5qO4n>R1)y zbO^j?1E*S5q0w)&u_yQ{Wo>o5N#i3GH?4@S8{gLQ)SN;ybiD-Dtf~0bO@NacN%2Jf zk#^WsfsF4=9lsLw;eyf=o6|B?d|D+XfvvCHibqepfQDa8X=QGJ0LK<^pGZz>QBm<&B!`$*&!Z!n|;wQirFiG&J+fNG)@vc4fxTrByom zF-DJg3dKO*`S=gSDT>3OzNm0pDT(HY)37zup92Bo*^kz*s$phUqkJ7cUK=%nhLNm6 zOqf8yzc$H5ga~4^q47@gpZ;7;JRF?!!ND262+2}$KU&H|mPdcDSS+=_WTF9BctVU- zGi8Zqui^;X>`UsG&Q=n;Rzx_TgkW&=X`=B;hyqToK}N_S_7fuRE{F4c~o6_V8)vQ`6hMM!e|~08%t%#HlS*h& zsqAzS!5FVC-|GJ8nU12Paat9@$c`6v?EAv(WKIz^w_8CM8d9=WpK36=))1sAkg{s$ zStwFL?Rk=r(J|#wDlDIBc1=fs}mpKt)kj=dCF5K16XN^sR{hCP(G^PQ@X6sK- z90|a<8|)&$S^l!lCb$l6CSL4PUHte$x*Y_WggbY32}3-Qjgs(nESA_Iw=ETUuhQ-$ zn9=K=_Yeu45F539Uj;W#l~>BxZ!&`6Z)-deWEV$EK4h6yYU`97c&6D=x-|SV<5yt^ z^&RI>*RqKGGTHo(&$nG8jmR(7O9}8Vire!7M851CY0a0I@{&zR-)P-IBx;O5N=iabb8F3rA#c zo%Utt5l%%x=3mPHzY7AoJ5kF>N%fbfJu}P!A`-sX82JJO{RS;TitEB!Ugg-1B76Sx}(;n5KWhDea z)`FnZC*AEAY!4^R44HX}#`k$3QHwxbk~R8(x&c|J(7!ISTjE z*vx%Cf&SdVgKG_t6~Ue^b89M>9#|TT0B`y3f?9k2A`T&`Y9{k4FSufTf>5`y3zkN) ztJpN2Tt&AvyICA%GIMG)L|q`;8shD>kizrz9;|7(cuC5!x_x8NsSm!*i5X74pv0^W zigO(BGu+`a~bE(BAh4rp`FoMr3t{P-bnipz$@aC*Q?(9FBlW<5?iR zV{u{(yvbbK&spA2!Ou4$z+#i%?KgbRm4d&GH*bv7n z^B_S;O^SSG8>QC6qnwiiJt}*LAQ~o{d1RKCdn}KF;w4ARjZ;I)j^Vt5o4EB71R4yR zs)52Ya~49HxWx|ttfjJO1A``*Te2+(Q)5x!#x=e4A2a0^3noahXx`$IO*PIKo~-cf z@*~E|12zM|t=?^(z8zKM1hNNnFj@AKZh{78+#(nY?It=Gt8!O>-^R=QRCEObatlJq+!cnx!lEyC08%E1ok>VjlTZ zKoiWV_SRGwhE7!8Vyeb2CShh#?x)$w`o}@pFXWFoHWEfdltxTf{bL>EM(7sv8J!b3 z*UfPRg&5STHuG>~y4VfY?33rE~l{vg{diK8EeChC19eVHH{qFY3dSLZu$7YyGK4dH<0YZRM9JL z$)-S0DaU*Uqt7Txwcme`UA^=?{+u~LKyw(Sog#^8FL{}g?Av#m1qRh`Mt-o&7A&$2 zy`cQjUeG}Z924#dY##>XN6)nVtFN~`hfg7K%U1d@HTb+!3>OAkvHdD0hZBnPxO4u* z$hlBTNJjy0f6Mno3 zy1VfQ?R_CE3u`#nLcC3qP&ADJZ1WY-nVex|n-I>mL}-E0KR%4gn%U@wuF;bpQAKLY zQL;viN*hD@rMNI_$k(;(!F&=fQ^{Z6QUD8XpTmqE%e&J+$e&*!JM(xR>OHeP~!T8vAv z$XAuTnQ797|vk*RYJ?29at@Y>1lm7 zr*L9HTitD&&%@lty+RueHyKW!MSHA@RHqZH{2=R*zzA)1xbXd;oR@me=}mowpgT z(yZ1_3(C~(NhNQfsNK2;usSG}2z2hJh79QN99fwu{Ad>!{v%*GKc0GCdF!g}LlL88 z9Qb?;Va%osdEmeVED|T`jntb`Sy6_Dwh1`Re8zpZ@=P-?*MVb}faK*cA}b2&QcGvD zz*EDfvV^8kxaYNxBv&3;X68;OHFc+`=bXGRo0hTJr-e!f#awYfpK?Jp{Ol!Yea$_E zN;y66_pr?~>i5`+_?nY$E8iVqeD$g2uRon3aDEUl=L}8;DHr~PFP`sTt81cO=5iu^+fLsM36_HBhgeE_s@p|8hdr&QYBgf!s`opO6 zkw)hFOhgsc#av6Oepy{V7A7PFz%{-=;@A zJPOzYBxWf6GD?$%CQhI4K1x$CflG>)GOo<3n0~02V#=wxjR}=yPDR+VhpbU(D@;&n zKVCv4Fb8?q52^-tc4$>%3_pJ8ERO_;mIbs#@g4DNZnb$%_%%yXKBpT(l3t>*hep$L zl!U|!WHgJCQb`l?E{(S-X{gY5?L|m&IcqdUesFK^Qp!)Eu&C0k!+AWm8mXjwgJLBS zI*~)Ua@mu-5-R&eyXL0^bXvEvHYc=LmYL3>v0t#%zNLGgZ%3v*k<42EkO#P0e(%gSb%3LHM&~0qprVtAfpCt3g!_|1i0QMEVQGdgm zGb^g+vFc(+kOslZ6slf3Rf$pUH}7%IRWn?InjQ*^pR#696p0I0AM`>mBV`D#GaBtdZT}Sc!8#BLQV!_>3*#l>2QRcE=&}}MFOdev0{FU@HO)$VO5jqiOI(df z&zfF97KZ|g);CIv=Gmky*DYoGfSQCbh?%UJKxQHrI?TG_LtW(QIuP}qSwc8_M!%ak zXS1|NCvc&`HHo#q)A&9DPmwJ-(noE&uZEJ#uUdn1Xww!e@w*47K|VjgtxM8|{?cuy z$8MTy@cSTDHWpHD=$;x&eoyR&EIb=uhDk9hikT-(pcawS#fg?Ho!6M*SKgbN{#3ib$DkoN zxnv3vYezZ6YLlc4I~Bt-ep31d8Stn6t{hK1iW$*DNe~2B*8IpIUR$&SRKU}Ele9^4 zJF|lR&jwywZ%6bEQJ7osBv50AQhSl$6sqbValV4&>zcR8{fmAri7SnkD-){7@)r}O zL5Mri2yb*v9`0pMl!s2&xTRuq&l3pC1*mC=8M4*vC!{6DoxDP;t@9o-nAMnAvs##+ zl6!B76*L5;uGAbdpM=`bF>Q&=5q324bkcY95P1+e?^DmYh&_5@p@LoFkvPWtE%r%i zB-yZJRQ@?``Cs5T7N$}C2k?nhdVSX^oW=tl0)tGO6EQ@!;Rf-_g9NBr%7=O<7$wsJ zqVmItudvpcY&}Sc6KwtwWV&AzXYEC#esaGTkf0dVISQ3&<)y+%r7?D*5AVzpA0-vV zE&Z5smNyvsmQ_OHs3YDI(HBR*z@SVO8T`K0SZv^fZHbf^@rHKu+uK<0SuHw&WeFX9ifd6r;+*u3g2x(VF>^u@l*<3dU| z?9jqsE}<%i4*r4?C^dck6ncf(An{lILh0!sVDqAs;we&x96o6{T-Ac~Cf&S@_VkD zpn3&9SdPa`4nm9=Y$gR(RyxTBIS9VS!cvlV8zIOJuHr`^J-;&=w4lfa|5bY=qV1`A zk_Ci787?z?P`yYwj#UQvCOMG49}fe_fOi-Hz^;I$|6=kGIdJ8%dX$^uj0LmMi-5;m zAKXYvp|hRRUQ!`DB_Qf01aI360P@ogfn`yJg2VuPMNX&SY)H=IX~P=`gasku^~qqT>(EPB2ZhYCq6gXQ^5)(RcoC77kjN>r8Z zu0=tW!A#z&0{cz`NkS`@vJkfDx+QO+pH3!q$=c^OYh{8@Fg&x8=j|+45A{Hs265&5 z+x6c$!&T+L;zbksF4&maM`s8mb|I*6CcJHdwVj{|F$gPq3ty!U;h9wvpXJe7T)k=84~Ur!ur z3?l(DSK=gaNszBZ)j?JU0;C;KP#*RBkyfLVYzZ}C@DsJXQ7nnJQcZu{GyeYjDSuJ4=)%U=vOKZ3uWR{1$%2cI%KRuVhp z0Kg*-SfLJ&hpG+aQDGG=!AMe#<8BU3%2iAxgjB%HF&J}$C<~lw)+OVG9K6UF08KeU z@l?E3=FtrNMzg!rb6=k~PEr@3q)y5>4pnd*E)9VZK<4)IPF16M|03%H5TdP z7c62-6kL($h^<0a(WskwxBj!r_m5Ex{GmpuE8! z`&`sbm7%%9&juZVanc4w2jg#XH{ceZ1Ciep-;O{X*;yTEYT6}HoByPutcW<;V=;^A(9W9Z7Dk+Z2PSq zFIi`+_G$p0`yv99AV!R1FJzCE8;5N%yT1p{zXnH_KrgaJB*VbIKmvUV)u_KZBn@X3 zB{|NTI+oW+wpcFHdOv->>>W_%w`PDcHbz;$s__L2shgCEru7!`bh4HrnZ}9i5h%kJ zfXT7mbzmW-`>iq>Ay{H73&adb`dLYX%yszNt`t>(XYe_uAC)&rTN(m%JeZzjCoIo_ zSEtoV8?4Nl^9dl(bis_z0pp5?9~XXv#H;3*CA+BymW-PS48d1nLanpa%Sod>(H2K6 zR@95Pcs@#RAg7#5iahTWDOZ8xub1zzaQQ%exWS_^AG8{WZO55nZ}^>TaN#ImZ2{wUi&Tisx@Z4)+Xt-TrtZp0Bxz>qu6fIXh|Y_un1CR z;m8Z0^ivt=K&k` ztI~>4R~jFN(ucURqsB&fvb2bfl$<2V07&JJi%O?uvACI3DyZ3^xU~Z&Ir^gkP^y;T zKdz!{Xh>}zqdL+zWwo3|iLcRHw00uHfojPh&IuLhUl^a>m<6xY(04mL0{&6k#bRNk z+(Ddsp+qyh;bgq;L3#v#J{&OphDOlq0mV7bam8Vm{BV8d={}|W_!F9VlTfe;1)jX& zXcK{0>luzo$bmR382H1@q4!_+*)Qy9&p!}%C6cN@iKeoZ8W2UVuD3;{j!<)iA$+Hs zd@&31(q$OPvJ3*rTNq#Pe_Wo+fN`yKAvi+BILq+Vl>JVE_0v}5SbQw@QW{zVmA%Qp zw!i<=kDx-cRRTJrJ4ZwPYorG6Br&KKZUs@uteOJ{97N$T&78Hcj%wJ%sgw`My@wIp z&14aKUc=3FMV(xmeXw))-00wmDbJ=gsFA+)nKqnZqYG1<7v$>CLfr@@|@}Q ztuz?77n@3_^16M~;>+dS6H?#c<)ec<^#xD@DtU<#q>i#h~ z+R}o==jw2VEUJ41m-3|=!T0%v?c=GX|5z<}yVv@*(I@4P@r&nXw%z%;MznC;4)c~y zv??5;XF_lH@OITvFd_HLDl}t!8Vw-V-0lM$00JE#LD^lLq;d{S8fJ8QaUejvM99A#Iz<8+8wTzN&yBxZ#;8>86T-WSwTAv5>ChD{j%*|6eYPzB8N47A^j z1QQzrJ~ImgEe9(;(|0YM;osYs{1qwqH$`-gzd#<0{|vnR`|33#JM-UBg#W5uUus(0 zuCpWl&Gg=Xds;)w=vKtmQ^cRy+|{$~>M>#CNywFtJvMK0`s<%Z%e$lZC@&t~i8<)cg{1f>pvD_Y_pQB>7 zH8HUz*W~5ni<`Fy$&48JMMmZ$AQYf7P!5meB0g=@;~$L|F&mYglG`74UJvdLx1V>^ zugO{;k1r?H7uR^BVut>fIY;VfYP;rXiQ?!Y0Q;s6ubP6xMmbqGZkm&Sc(oYiHn zI9)ukjj(PhrRlbmX!o`fyb?s!;L{OF9wyBBdO6IIgP49FkvVY{1KkH?aOdHZ? z!jtAopuPIvsmaovtK!$3Lhu_FOk285DT2q=;Y^LrB)(nlWg5L6OsiZcjghDf{a>>% zvT0QFX10q-mm?2^_0&B4q=a_Q)N0(Ne1R`qm(DqwrS(CBG0Mi8ZxvN~;A;LM90ADHxO0;))iO zdBB*NhJMhf+E+pv;|?b05I11$?XF-?4-vYxGul~jf@LJ=-2>BjpK)?JUAWUsALPJP@aVUsDaZPDD-s<;#e8WpAgp zc``+-WjYQn?gDyJ#V8%kTaQs1s*!!{A3u1SCkF{%LFwElB)5e_u>*(4DTCizQELpz zQFMJzsmtUYw?wN+TB*9q2w@?n+N4i#qv9(UhRNU2m5HHGAr}g%cLWk50O1JZt%S@0 zFQ%DFU3U;BA7!xolvFr#2k+0(l*cN__@?puSq>04o7_*YDmN>c@2hl9tRA4Oh9u4) zay;Jh2J0qr*P5{oqvmY$X{Yl}dw1+1QyX1-iS12hpyKB?*xq<;tz6N!#yX|v#L9&l zQlj(V!af8U9Y|k|DKRRQXh-EYyi2)WIElmeFFkmcb#znAvsYc@5F2@eY!qj~qO|3B z3> z(k57|Dw39jM#?xxRzQ~v@uN3t^X}V!c(aMWt480Y7EeyYq5~8vXQYCwiz9ah(wb3n zKSBQJSSoK05s`PP8YGd&eL!BLC~)P!RE_SxRGl&xY&KrQevV4DzK_Ba&<1`W7#VNW za@O~5)pd7B`WDQ+u%N*)rH9rUZKQk+v|_fNU)Z_xR5=RpTzL$XZ5nfU)*=JTpFEJv z=67X;yx2!?(augBIEMc@DW$XAytr;dNGVkSVKQ!wF(Fx8%FhPB*B<{}EkX=77;k}l zoI@Gl4^rTSw}uK2fO$6Z0xK?>5g%!wN&K!+K!ABLrnERtZl3Pv=!glZF9Ekk#xY>j zRQ{Se8$tI0RBH0B?bt@1#e@z=-vlwX6TB4H6V%@uXTpaY97=RZ=>_riAYH7m36yJ!E63x55Z7zE2CK&j1(c43K0Zt6J8-$5>%Gvp)3 zonjM$TjF$rHxmT8un;KVvTxGtDxp%(a7K=$9kbgDw$H>aW$;-c5z;-3RXo;g*CC5v zamJ+bh`lDFi`v9DN};G=MGA$~Wc`q1NJKLAXVBW8n4!3z?7+^k@Nj_Rid&_(*=d0? zbfDNIOmjrg6tn*cm1aZ90^<>P^oSd2y>tx=vCUBhk zp|7(!%e<=}hrt|X!>C(A`p;n>e(LA3DBv&$xbMH&HR$YH@d&3>Y(PTFTkd={Dt!5u zNhn8WomCyry6ymbc@kQ;FOD0Qk5u1isu}krbGx$5I{8PV{}e&uRq*FeKVx~`)WVca zMWO}>@zJef8D~`l*am7HLSu#wGt25IV(hUI1~pG@BYA^FP^#du*Cwmr%>w?4$ZfT$ zTgs(=e)&~`6P?O~j(55?chSFMJ2xhoS;cB1+`9S_&|x_#5Zk1CCDL3GH=dbXqXLf6 z1*VA1fezn3xFaMp2)zXftpmmfB*gSW1ML806i}`>d|Dc2mwaIAc}O^QvNn_&iUEZr z+YN7pRfCr0?{OY1kFQ2|Q4#&=;lCKS1v8tv5zF}q6tUu=FEn!Volkb?@IxxnSxMqA zH+!So^pFHS0!cPM4ur&&4DIGfcl#-{=&Zys3~_8EmZM#4IJo}F&}scK_c+i}(U0kY zLeA0>nOAu1=QpSSrW5U|2$GD1JUb6NSqAAW3WT(Vyjp_>0vur=!9Eo<^Wo5{2f+%f z0_{GoFVwS-Ny)SES{aO>mdq@@7|NnWi=Sb<57^uW-nBc@AJC6eft3O)D33Cz^JBIh zeRfR?`?vV%U7_8%-qa54(+5``OeTvEhqUiVGW4V9FaR-z`V4IjC2X&}D*S>Z)?=!hsDCX&Kx5Zxo)zjWf|K_m&&rJ8fKWMYCvHTw+DZBrM ziMD>b)BOz-#c`O#hM`Y`a?!47z~HK^W*@cWm{t*S&m&1V5+zJ0Fdlu2ebU8czQP7T z9%s&uAW7Jh-kvLrTLR?OXeu@ z(5O?5hOP#e*Lt_`D@)dw z9dEZk2YWE%ZcqA850D7k6pRTh%yi_Fn4))_Z+3J&cl*kTQ*3)Kt6DvlkDYkAysy?b zpLZ7A?>uiex<7NfP@mtfOMl9e{F>~d^cqOWA!QOQkiX8qW$66FNo+-r6Eo5O7F#NB z#1m0u#1V_+rGtF=0y@zJL8Yh!hA};dpmH2VYS#4$xfC@Jd!gNm8B@`Zz2%fhfVTlB z*8GP+wdHLzjyVvfYi4Wmr-@=)9#(>aw;?2-O-QsyYBx@T3w^z>n;+iYCC>COa$ARp zE)Q?kysTpyiM#%DJiC`X>WVILnZu8V$vVsf@prj7PO@+e7znGMIy+U`>Mic~I7_l) za_d>DVHJW}DTsvaW@yMp{asdI!6;Qos!ZrWRCfz4I6P9f#TSq3_Ac>qsuA5sx-l|U+ByH1Rk=9rGHEP z!h(5F*BPdGr&LM&5p?upqE$$cxkoB#+D9#nZ)%vY{bC)`Y7nRE*9g@si{Bedmxj3v zpeK-PJX#g<);@rjGGL!r=`CKu-@(vrHI`;(ro?NT;m!-dqdI2WMWe>lgnrT^jd2Y{ z;xLqbT14z%Blu+HOkzN3Ps$K*rwl?mBu&4NY8jno2E_C>U5ejVN3DQ{;zQzz%a88I zLZEVD$M=~DF&L=%3h)toVXbyqh81{O&P;1$oo?VB$Cod6p;hb(>2m(|?RJm`v~u!L zg&lkoXHCvwa|o>Z3De=3ScOE~m7EgCkGg`uaAHaTSc&v5WV@PO?Mn3IeVShWkbNm5 zY)E-DyqGOOIJ2VS5>%HeS;=9yp#2PtXDV*x{SdV!KOPSUvYW`Ax8-RLQijK)`J}8n zP&1pAYZRCIYEAQa8eLr_2{4>F6R*@ znqUib60Zcjx?EDW+?tWmtdd^QKCWnaYyy^lDWFkVC z3zKM`)@eCtuvO2;=O(~EGVkOQ7_eu5{I`oja(Eh~ zF3hyCMi)8&g-U;Z9HT%mV!d-IoWvexk%SZ21KB#LkcD@(gcT1tSbEPU!&q^AF$0sX z_<*ITqw5l{LsJEtDn9wC^7`&7rR>uai*}F5pDhdXoyY76lJXqH%OYr*eN^f z(vMG@K@1yZ`FNCLY)uMj*7v30kQX=`B^rV=Hs)A$9)Mh?&6X#HjzeffT2@jaZK=DA zyMW%6iYIMGr7G0+GBhP{iom=b0vH?t2+{d5*yBLT_yXAY$w{0Xb1bfPry>yE+}459 zb`$e{qi#~tm^lNQV@3%e%p$loS&}cL*TGLBATx z{Wd$=7;@FF>Q+w;81({m_JBONcA2@e5-iu%@&4>XU`fom=yBF$53c^QkhpaBN!elI zpos&#NrT~-P~u$J2fEB|S7cd&(zayhh>8N3uP5!3e;ywzFue26)2fe%3xMS><7G%Dxr zdOeU5f!wMhTvSG2xOe5F1cAjTqc2o)aJR{3I90ADanf>VWnMQwg{XeIWGljgQUIYIJ6LI z+OCj3VS_TYyMb3+LIqL6fP7P$#TxsMZte_QK1pD+!YZm7>a!~_D!E~PJhD+6y(9dVM;agxMH>i}>{U2@8A;FYyLL2+pXDl!vz$5Lg#eFwqJuQ9xiGnG`h6Z59Vo#PBxKHsAJu~ zDWsTrYa}dyVg-yMLE@XK6WIBLMNjqa1+yURwdg)_Z5Wti68Fw+0}7Q_h83GJ>7%%T z#M%MDphuQ*!H-_Uo>2C`up?g8AFz9a zEkGg)q~VaqyzaosbxSoY64)K(Y?v18Wl`zO3GQ)GI39q_fv;E@s7|D&aaRaRPl@l; z_YPA->3fFc8IR5wn&3|kK!W76svYn;tq*@d7D^eQfmVPr-5Ddtu}XQKsD zVdaE^+H%i7McT*L&rehfy5o0&F1}h}3{F~@1&eT;p>vk!Tv0$HyF0fN)-)%5C&0xQOR3OAydEUjr#?_c{O|ZutADv5E-2$Tcqx>cDfSN)<)eWV@81W%1q!kt(-M36! z+@fshL=hJ8k2tw9KaX_)>C(^yBN+uIB~fNN=AC!A@wt}?QtA&c?kmSgWI-fs`Fr40 zN~J%eOFG3#KJtKN*}A7}meOE~`x<ES2H7>KO~s2V;S3he1;FI!O` znKi-M{4|8}HzNf@;nRn3TMpt^J!DqZ29V{^LxW$4{)q_klg|OUv~BMPJAX-Ps*s$iFcrmHFl3fMSFjF2TmUP=C`^}vNK^Lv+RV|JXEDRETVjFC z_r%en#mI)m`e7vN0w_WGQA9X0(Y^pAu1j7*vc_53_?9uM6yk<>(J?D9_=XoKcF1zh zxV~5Wi*``qpr7gs6okFhBWl65WJpJ%{hYO;*}`cTP9$R;NLlT&aj(S|x6pYkvss8+HtNGf%cqKnW)kF;=kuv$E;ChcTQX4)=XbzXYT8WGlR z{URnfhXz|HgJuoS%@FB-lui)pJbmR2m<2%4Mv;bPVTsxwr})i+#6Qo!PM41t-u^6= z?}htJM#%%C9SjZ~8p9+OzId64p8TKorMX=uAwJ|MR{M z239UH=Qj(<;e3*FawB|O^iRhE-OkZc3HYIBbHpGWSaX=FC0LuzQ_;58%!_KH?Pe<) z6Yj(}0*a=L;Rk7mUMPnNwNyr9vY&tyNH0cp zmvF%lb=Bq;T>J~_5; z7vBgNKml4)sw#7xaNr+KZLgH$3^VGWHF~kzX7k%{G-2WpTN6g`cdN56x)3~=Sr-_nD)2UK2gstHfZ|qnUCX3`d=M^XDy`*Q-AerBEv z^1-E=2p3hC=tdO(xqN{fe7%rCe-zXNfFVAfHZK!;=6}EyY~An;LE_yd3xy zMJx_*>#n(pjgr$VABZ0>a!0lPGqty`fvRY=5P0Ic^)txgOnONNMp!3>rk#WnxgbUq z@s1?V$=rB=F6_ZTgr0jr^`J4{c~YKO6=BL{W&F*vXh=>Nxgd{QH8AwnVhdmh5rE&5vq=f}Rv?Fc*|c z3RXmSjA7x9Tz$^ts+P&5eVO#CpC)vEmHC%yy|Fcl3GG~YcR3Q_+4_dL%c@I7NyE8IMj-{CM@k%YIn@|;I5(j zL6!5SH~-H#YvTHf(z`7vpK=F^d0Ax{#uW#inc!+0ZsU-{I${-UkH+3ssyU{Ve|y%( z@}gbWK)7g2)KBv_yDwCK5Eq$lsla1zKZzqgAgER0< zJka-vY+j7X*#0uNj4zEkiNw8x~VH=gp+W%opH`Fi%R0YoJrRsV+=I(M$q}9v*4#z(p4girqLt%pk%8&v?l&j zUd2tJ;z%35)>h|2)#53`WJCvnOTG=uSYy>scA8n?w%=Nh%sOUcml`xbEft2*zxn7O zcki?Rfsde*JVgF>hq00WPk4_PP8LnhS~!Zy@5;lGZ3SKJHpI5~p|&stKZrV6VT#AN z5}A&~yroxooXlxHuHham>&_175?>j`Rb|RoQP3Nq#++@NK>V;uQJv`5s#s1j>2Y+s zV`3jq=7+biTIwW;_Bs9Jz`wQcWS_~^)G$Ys8^OgS5`{K*_O5gQ!SGcKuN*q%mcZS? zT(|;stI(!4XBo)TEsfQ6!2UaX+=R7pFZ!0OTuqF$Y24MM%vU#4T`fbk)3`wbPii}) zZH+_vz(A{^p)6nP*n>1?$=zpLhFHF@W{r2Ue2@jOrpF7ljmcG<%fGZ^WVN~ye=Xss zbQPsHi4Q(EW`x~kEgU-YVs}e}TRQ*FAZm6e|R zp|5rGX1$|ym`C93tDBPY{CzXkHbaIUNm4|Zb&d+NP0vg^EAIHID zquttJZtSM8rPR2v1;eQt9b2GUTU?_B;{7^}VUy0eNK5qog3U7X$o$&`X?4vL)6*~Z z$0wIs=KxV6lcV>hZassDS>#v1brv6r)D<`rf`lR1LDAC}GXwmgNoE<-YrNY;WvMLz zj@fC!xXd?by@!D#^cHlvBH!rG70xJt*Tt0liIArI~*pt=qE1cNgszs;o2S!%3I;eGM#@ z;%5D_r&H|(PGbtxkMNrf!+W1LAsWAhKvH@{VfY#7Ln}yDOH&O=_-V19)l~+eZ0$n+ z4GMg5>WA=jyZwiC?Ej@J2snG@zOxy zUz_i|v{rd(!2($Sy%7e_zjp;;1Mdp*pBK~Fc|iZKo(rA2I?k(H*nT%L&rsjhkHuJC z1>qdK@h2@g9%Y}zC3$=cZ$YhN7|mEo92+??d+E6_2x>_r+mYEcGa983CfwM_I$eW! z+iBZ8erM7~`NQA;(ycvP*4~_ZXMASY>jJoGo;*Gz5Kc9h1l$uC1+=L z@|)Gu-AlxekAK7x<(Xoef;#2Cl9Kx5_-teUbmZ`CV|{nCcLt9+cr`36XNd`k#`L7YkFZj+^{hPgMGs71O)XU5}=egmpPu2Y2qM&||*2Hd@ z5bcxvnt(@LpmdV|`;*T-xv>$)_|V|N_I{cYra)9Bnkveh2f?qIN!t_`Mgan54;U$S%dR<~wkG}6<&+SFD9YR<) zf_XbzxuCIA62n;->3s(A*26Q+%uIJ7nR@SoK2l3^gP{`0!#_g;C931Irw!d(^KSFq z2&%;JAdO^kGY+7;0*69>dx3?;BhH!pPeqmPYK)XtFUDfAkp^;-5Zw^9_Gu z3pPOuKBq;Rz>R_!!@_&9kf`*fs4zQ6I+6mr@^)E5bFsKvMJ&qleKJ|i&WMyUvY6%z zL+^!~?5SV+D$s+pjM)SJAU`y5r9v)1d-dWh;GfPy_-H})pvrH*rGc^NGU!n;FIIOm z^KdP!9)X%LG-bXr8P&n8iS)%0w@!sKns2#?5TkU8h^mWBgvj@$4LhAKbJiA1CBbW2 zXs`*BM4Q*opSHUD`TWtVR6^5e%Y<*1xar8 z>`UB4Fk4YjY7{!RcsizhY;_Ajr!D#wVndWcrZiC4c#-MfjN)2RW}8i!)vAHCP!@6W_(IHyXGE9?D>!M4=4WBre7?9$ilqdOGlZ##W9xE%YP3?#hJC}cn z*!2g^t^0!55jTcZKxlZDQrD4?y?r+9o2oKt1ueTP7aKz2^Vhe6&GOy9S!?3fwDpa4 zG11@h8ff8)r{(W4%};Q)9G_)So#%N-X%S_*#W(Y%Pvk_7`lSCk4jNHmdxTq*D_XEC0w=7Q6LdgzzoDl+2wI8I($OQYwExc zuNS9M8)qkY+Lyj&mVR7n(fGwH$R^nF`|-r%a)D>-a!-uDq|*|D99?jsf!63amL#$9 z4E_Zib8Mh85*bu>|@53P1g0?3Yj67;l1I|mHC*;>c! zgdA&i{2uM>aCWFM4{8l0Uf`NnhM>yEjL-*T)-tJLF$Q;Ak8&RjfpfOT#Y-`iSOy4(NR8M1Hx5*ysO#C_) zbA1(#jK}mXhFbb29E`L1K+3Dj_A|v_;w@a%3nR_I(qe3cX`@T5l6Yk zCYRUhsr$NlT%@^Cz} zjI5q2N0c@UJGT(|I0QU8d8~G3%+&aJjI}JvtC7Se!V6?Z;j zrrsztv@b?NQ0#D2Hit0=tC20p;YIM7a3A+DeMaPqfhrT-QvuEsa!yDfc0Jh+DCt-b zZ1s9WcpI5C`)<*$%IUzHK*Jd2wtE7<|6b@p`M~oCb83hOO}(=wI1(9d!~Ff1A;a_r z^V&y}$C21>(}wkS&kxPtDXhJAHa&%)y_FmHoQOgq&(pISCFsXgc5L)&>rD1NPY z>u2nbi-o$InjRT>EpJ$B9V+TZwl=_#7pbAouEw} zl!~(L+h;y+xfm&O(~ikx+c;>qe+z1yns&2%UE#gDvf!)30poMN6lKiTx_x0sxmT>B zzzQuJ%{?GQvLNLM9~OI&&3j$6-C=Vq-BKAF`Rz^0KEAeuDdo%)1${!S$T(@UpvySa zdTk9EUt6%(tT+y`3-)vJ6qj$V5M+nFyW?`uE5R>BCSk@uJFLP8NJKLt-WkdJq??vK zNKs`9i1~;tnzLx9wIE^PcSdr+!v)TFj6^7#Zj2Ek0GpC(d~eoqK_fjg=GIHAh%T&T zjkD?IEg{x7eMB4cq&M84gqoh6A`c1y1|y5c5YBLYgph79NK6(O0Ak{4x+!<#J=6&o z4!%0b8m0+vVbYHTuP(gP5B8=; zCpz^mu+GXLOQ12R=&PieWofV7PgzGq#3Yhi?8fL`{Y-(YRsDlrfxtyB76Dvj4M(S4 ztlRgF0QznAYY%&@bx@`6PG9xCCGXD%)k3@83dyEsfmb@l*_&+@bK3q?UhN%7oKvT0 zH3am1fz5)~Zp&|uk1EI){l?3uUAtaGI2*H5N~K?S4!Y!u`uN3da@V6-d8R93XgJbI z$%_{X!-P1}sfZJKvo8CR$ph%4NoY!L!L7x zmZvQSSCXMeX-TA)@I+O%zV7LL$Rrxneb5%vCBLA<%kT43nr#z>`Bc#xMw*}-F*01@ zzN5vxqs37LwF%SCThYO~^M-4ln6S7qAHkKZ-+8Gx_g(0l+>jXW4gpWXDNUJc4pI@Tjs5Jg`)(dkX4hQgproJTH-3F+A@; zvZ-(Ut~NX@TZl^Wpt4JkKxN=wIQ`UCpT*T_%iVszjX<@ZV-~=fL*uaP(7=gjz_@HVK}~8-l7!Yb+#ALmvRZ@a9L5w)U1g-|Yubnw!|BCit1edcDkZ(W?Q zng8_;jj?j>A`#)~C;Bahwhoy{64|+Xiqj1=<>kG^(@*AfBkCkr)O~MjCy!gHr`(Q^ zK)d`BA71MR(|Wld?9*c0tgYYjjbyO%AfhGlxWAii3y_ME&Z;m-AB-rj!_)mnCr$B@ zw0zfk&1)lMaQ{Sq*J_P%hvS}6@GE&$@Z)~(WF{K!=&c{ z<_{mOytF@(t`0SMt}czR3cuZ>>3e6oQZg;wg);5EZEvpK;~$VWhoiG0NlRmxkk9xl zpOGHs13V|}LjUBx?#HCIf2s*3sJ>PZ(O}U!)@8K|ST33qD*A6+B%$Wy#-k~?OX{%E674Dst1wowPJymc zu1DPG3cg+oE~t^GeAsvthilR$!sy?hMxSn;Is#F&_8RW1c~%gllX-YJYAmaep&EUKe^Lk>0L;x5qoRrD`i|FEhUb5 zpp4farGy6)$Y`e^)97Ab{Ty^R=k(QQZTU_-FVdBp?w37>tW`H2!Ngw4m@(&-AY0_# zH%aX%nvZ^JOlrQgY3Yr=-zMB*)e5A&Nnwsbo(Ol(Q1W{@ga2U>;D70d$pw1plFGpW zG@xW7VP)lf*^n3bzlDj5`#&uLumYR({`V>X7tmUj^M70g`1f|0K<}{@0-X<1k*@aDwdw%mG}Y^Z#9p`1f|0Z2wz3Oc1aJ0$jrLuVJtO z4Jd(zrTz0VWQ5*)kH9XAJ+$|u}4A04^ZY1?;3pla+vCx=HTjm;{5h2fi7CmxCtbMo{3 z-%8Rd59YYkw4)p4$ke-+w+A=5Bj>jVmwUGs4pR}N-1Xb!u)fND5qliFi58<45_UOx z zVN2;>?Jdy^NB$I`e4Nm$G#&S+kiE&Nm8(9^UdDW#4F9Hj7=t-UtR4F?@(FTFHZCEiIP)G-VFN1pV+o3X|w& zW2>q0hmtRNDyi0zVKe=RlPEL_y?%gAWx$cr=hgP=kr6+;?-r9VmYga(zz&8&mH-xG zUNPsnb9_rvbtQj5S=i~B9#Zm5VNt(mH??$X3V82)TW|Jds0AthHYEmO75S%M=#MB~ z<&BID2Df*cw}L3W^r6r{%7(ftahA?PAr*YmwYf5u7X%tc5D#l?GUT<+dwG{y@T~Q$ z@gt3de{pOmeZ(NkKPQ3aJ;^8R3NBQkgOovw)!|h0#DNaHgRWWMX`-%|G?1NT@YeU` zL31q;Y_@ZsFnR?Kak%p_bu%Us&u?p~DpJtIA<}Vw_FyaKvn$K*66~z7mPoc#gn3p} ziYBVB5C!^Bke?|WaN3PsMgv5gG6>juFQ!W@ITwOH)(8365yiWS8QRBKOXFId!>;I9 z|AB5YZ6ad5MUCoh@23w}B$=El$Y!3#+GieF-o1PmzZPaf`#v7&UAZO+{*4C2&O5*L zSB7P-xprvSh+@4thXe1vzNU11ounDvKPwRJ?CEF#GI%XfD!@|ff}T1AMN$$ElOyu1 zv(L^I`f2g~3e6c|9MmVzqBuSR9kG=qhlKGZl>5Oqg@>G_dl|03mU(4 zeFw#4Obtz2;g(6&*%1HGAUQP)TIap`)oGme6<*Ucu*va#+LW(*CqDDzLXthw3E9`0 z&*)Bw^oTjx$J)uWC}k+(sj|wpA|tQEfWB*@7dIbl;fGIZkeA&@R5~4DC>K>L(C)tu zv;ChTU!VWPn{9L<$bYP`R!@Z}`Y@rU>!A$|O6cCxB!V{t7i>fxN^0A(?OIvK1_ z2Ya-?-FthtyN6;d8zb^>7L*iq!%%=7w94A=hWlLWn%MVr5BZGSCs|XTMj!&swp5n%Mi;mzv5^>Rvfr%9da1=z8o$aV#s&ee6;=eLS{JQ#uoK!cH3vrX?CdlV8?6WHaFuuV3C z@5ku0h1$OqQm@@>M-z|ggtX3Qk7a;I=NOJ-t?tGj$FeOmP-5RU|MB@H=w{+*#f4O7 z*WKot!MX&Twvu zfAD_O{G5;-4x~Xfc4$`*E?)&XeBHTu)I!(?3Qr4W6@mrHKJmxv%igp(mUxR-U*cJh z2u~ShA@QI*rSDsh4u5=T!?ZRFJn{HLpWQe)##I)ZnIA45*%>oQ5(N_nb7UMquM0}i zLvv14m4nkEFyBH!oID#_sXzNrt0W%mx$wD7Nt&H;f5mTKpw{LQh&Gkc+uu+!(9Jnx9^ z>acGm*tcLDHaR~WV07Oif7tqPIuU6@I_<_xJ}-bLMxWOhfb!8#cjz3`xyLRci6f=Z zP`|IlsK2X6fqjSe``4qUAfb~Lgi~wxTvjx3q)B+c9)H{JF_oJJfwns)pH{W}I@^tGN_hIws2S0I(X21FJKTmLh`Px6T7*$UPQ)W#CBP&y5m%ld!kg#{M zWmYzIws&xnJhnf4?jz z5DEya0EBXahjId;fc|lC0il4v3P30@&jc#~p5Fzzm=Jzh?RWI;KE#dTu~q4j>fRUIDBCgaWg;z(ZMqP(c5L0^hgt{I%`HfBn+&umYigz#Ks6UppZD?Epgm+63Ug z3qTKip1=Cw|6Kq=|7tDpcL4}x0}o{bLIM5rD!|7mp1(dy{r8UmpCowx`ZV!(0SE;r ziU*+SMgL>~H1U8F#RJgvqJJC!O+4U4@c=Zv2+RS5f)m99(DWiO2M`KQ6c0eti~ex{ zH1U8F#RJgvA}|LK3QiOcK+}uMDYML zz33kYKobu*Q9J-mF9LG_q2NUE05rYmZwCmV=|x}#HlP4DQV>AXi@+RQKmlx|Ab_S9 z{o?>=0)Z0+0%&>>m;(p}Ckh16^dc|^5DHEd2%zaj|2P1eK;T4y0GeI|<^V#$i2?yM zz33kYKoba@C=fu?i@+Q}C^%6dfTkCLIe<`bqCfymFZ#y;&;$Y}3Ix#fA}|LK3QiOV zpy@^bH~^YJ;6#A{nqCCv07Aiu0s%C=2+RS5f)fP-XnN5<4uB>QI8h*grWb)ZfKYIv zKmbiI`o{s#1Og`t1km&%Fb5C{P80~B=|x};AQYS^5J1z5{&4^_fxw9Z0W`e`%mIXg z69ocjdeJ`)fF=+)Q6PY(7lAo|P;jC^08K9fa{!^>M6t2}IQ@0=w+DCxEHAy>fR{L4 zN?_v!9&x>tz`}t?JTE1%F|)D&VEuIimIa^%l>RLqfD0)7TRealQ2Muc05G8RZ}9+P ztStZHOi++n+{5L)ii@F(DKLq9ufhSGzx1M)mwvAT{3-dbd)y>1>yFBRU&7wb1+Yr6 zlKjgh0UXf3OcGoqZ2vj{g1|p!5fOV29pDMz#aP)vOaQg4tiUoHHy5z*CTHm4Wcl(e z6ARa0C;~R%?#tdtf35lb=Or{&E?~Q(mu5cytf8&>$|X^>I_`E(?g{PG%9v#%_&|j> zaw>iMHZrR$V8*Lh*I2uCX58#$#zT>|)s6Gr`8DK6^iNt^SX%2@pi9gIh`v|uJZnV1 z;)MLJ?098|EfE&df?2BxZA+iIchmbehwZz)Zcd*aZhuv{yGfUp+M*V>81rBf9Cm|t z3uD8F74$p*4D0*c@45e=GDm$rf85k)e7J}g4Cz08QtftNa6S9sdsV%}TPd(}9N)VT zcs|n}Tvo&j+jX_-|85(hM}Jw!`ZW1*b6>xcZ>gUdRb%+}cD`MxU{>{+z4r5M*3ZY| zqx;@xQGv~*Lm$XK)UlvtAstlXck3l1+CQmO|J_23h?z+R>&Fbzn3HQw7DbL6|=@zgi zaW}S~rWtT%WT%LId${{&1}JfR-KvUdpGDe+NR1s<9I{M9i;H`QxolHn znijV}mvDP;qBYz&OVzaC6_`gTv+yHVeua6XEE9Aq8o7&$iKx9jIfFkK)a$}!C6N%p zkY<+dRe_?WcR$f+ZNTtn!r}4vC&IB%2C8=N_jtB;5?o8KeS)o-)@}zIn|S?c9h@Vm;3F6J1hIclBI9Awx6S=W`WPsT7NnsOB;9>|B_zir5dd=#^Yvk+3DE zqws9Qv=~AHs)SCY&x$j6wNJl&`-FzCq<@hYL2H1_q^|ND=^Y@%%Ed4;RL@1 z*uV+zo)||%cC4veYAB`0vq|E_keP8D!?sUsk z@T%Xk)7t-OgUUwkD~y|_&hyh3R3_=&A2mk|CY>S3yZUYUF-HW_&z1Cfh_+M?7l!$d zbJ*HEZS#~zkkh&_6rK-4n>Cxlwxep94t;eF!#^!1ra$M@s}P1+nBGOXSgNUs7~v50 zCG?{tE>8p#kaS7~>xFAh?K+YwJ`R-J{f2$gX|>Tl(~lS@SX*4}qLz_#Jo46Qybl#XFJ(u6Mw=y%c0eZ#%0#Hg>m6zhqW0jgX$Dhuyw?>4sKnIpdfRt=}S2l zY+$Y&B(Z{x7L#(fLVOZFU`abuVaa%+vh#s8pZw1t>*;5S6sk&e7k>Zr!;eHHi3fW^X=m){dXx9<8;JY1j>26PKM z|4n=2;^ppq@NKLu%r{?SnOFh=6Ps8&I*6=UJQ?BYjOMp$7wV+LV+4q$n=fXQBOmfD}=>&7G!Ae8IC-Q4kP@Q6)SfebLX|M zY-fE{4NXX@Va=vkaDEL4CWX=SMVTMSGwisM<1)zj$BE?BrquRO%q$eeQ+Qk!jTQ~| z@ef-%+e>@u8|Ig7q4GE_Agpg-9^wl_F5hG=GqycPHLC}@M>h{em;3XbFr6=2$6kMT zY(1~1i{Kx>)egy4>-@opQpvYs*7-et^N5z)oGzMG5-I-hj9&>^MJMfrLJeRB^6H`OHtUSw(K@bZc? zZT5=e{Bn{R8`T(X=N{HAv#Qp{pZ8J;w62VvGltNm19Wc4+CCKr(%z*ljE;pyuN1_S zzC!V@n1z)fNNYBtd|fg`Wfa_D#1dTbE|RbbH>^ga$rm8 z$J%pK+y_tHZ}+)xcS9vV9Gyh%AkPZ`Z(%#x@2Eq+#`*6pC=w5$Q)RzgExRqxGv7E? zmH+xc_w1&aZ%Z92;GwscGDUn*TL1bB(BA9Q2l8^ufN-V5s3Qgoj!CXL(cYE(SFbbL zt!u4woRQULzw2QxYIPhQH@=$2=Ll&01Nk(pL~##4b*#qAx3RiYZrN7a)C~2D%)E2K z;$}Vd+wa5$zrCjK>q+flV<#o`Ygey97Vk|3ekf?63a`O1Ssdk;Lz1pZ=`>H-lpg*} zWbdx}*6iC>-TJ${ihBxY3WwDpQABYWAGhVh zyV-FC-t5`AKa!6SHJ|p%gjG&C_c>iN>EGyB9IjX{%-L3F^opnm{p6q-A}X&gv!1L> zUsYa?ST4ooH0EA5#^tzLD7Gfe(-N{cj7A}U=gKu(TGkv@o!-t{98G|Q=#iz1$myY- zi4tEQSFx~($9J4x)^5Vhapi)u=<_!p2gF!htoRk(ODg6=SjZ$&F9TRf(Cls6|;G?>o& zbACH^dogHH5$j}KTqzr-VoH+$qDmM_vz>XvpD;8(cVptit_te1TXgOR$8vk>Rq-6J zs+nKyRfp&}{TWQ2b3dY++i>I4R4=(Z6x`wPbbs!*;u+I*m3~@(FZ3noKwID|&b+gZ zPPlo+zJ~T`S6?ll*jTb@GseZf+X|F#0baf`kC zm}97kyL3;{8(H#Ho3CufUX@{OZoHO9sHMz0b6KvFt(*<$Nd>&Q_#Xv^SDMjIh&Ao` z(YmTNp;t6GmW5;OZTDFIlS{)tBMF8xgvk>XV}y8j1yS%d1puFKiKk?ySx&0^5; zQI1UgLPfPIIvpwrRRn!XB`_%UpqjHYrDW7{l^cb#3A}~vEHp{jdu*Te$6ai zMjoPRU(>#@1KndD(63FnxAi+#;0zZcTyI;krokn@M*vM(x!!ERn&_t`Ps2lxJE1*u|5f zd$~AmrXNksNheMo4=EDu?}uMUk1u4Zc{(p9+-~eV-6Kx#%IT#xGU?l(hP%HRoFH=X z^!RizEIf1d6?YE7ULjopPkb+pwJCiUBD$n02;=<_cC<$bmDimgJ{^Wg5q+cv+n1sk z+*M6TQIVp{h@q{@HNU;MW4*=!;0!u?$eoSvDQ;ncY%(^LZx?d0Xij+h_|NKc$4u-< z%8>_3NU>&^^A^&RtT4qe&My@ zUF$1KJsg&JxaUaOJy*E+Ll^I$3;sqZ`XLg_se86YgiqGVm9N@RSdpW{Mh!MRSLX`p zr*z6w{`J%m-O;qfukks-N+Ej171t2Yfjb2gHtvlzwcCPHXtObnt{JIgQGralBY4Em zU*Bs86!{4D2!Brwj*fX>pT841$vmVZyF6{BahD8SN8h+8Du9gIIf^|dEVBzAF6W0f9 zj{8{6$zRELWKKWqp?+_E`2AxxG~VxrsB@|9vz$>Q9lTaz!a7;Lz};mud^`Kzvj-|L z4QUN_uxj-CHe6nReYbc0?7xaPoeO)C)BQNyKi(8e;Nm6aVLsrdW6CQjx;@pZR`tPN zDr>>|+709zL_CnTyxJ(yTnbktTIHVsk))0Vr@$kXV=CTem_eT9=;+$d_x9;jzM$`V z2x2*V#fuB&$+zQ*%AGjDyB3DWCF}73TW3ULsc(GL!?k7!q+vt3gK_mEFogLn!y^8= zNFPgb`8Fa3Z(Ai@Jp88Ec;j_csVw7&Soy(&@}qybmFk+4f9uM_wsl<%BY6uYgipVe zDA|LJm_dN>{UQVFA`X8V#{$>7N15t*+DWHe&j78Bf9|@OgA4R!b0J<(VUu6S~|4z zp^pXJ5ilM^M?gI&|c@jwKwb zuH_R40*9oC(i&PeQqLCDy24XkHCS7RAItQqEJ+F3Zag(d!OH`jh?(mCKDuSuQlS!eI5v* z%z9I79N9p>#D<+r2P@gzcC>ML+abv_3tXnk1`zO>92wznlU0G2I1Saq`o4| zn=k7&j zkWx0`e$I%;p|nX1AuWe+-EU+hdc<8Mf36@50aRtEI}f&lD^(h2dZJE!yy+pp>%V(AmCt zWZPK33R4cBe&B2D8%d}7_#G~AFj)~2Q5;)~GM{X90fCQh=ZL13M6OVFVq9KS-Wt+~ z(vo_4I%yijV_7v)Od1Ry;VkoErywK;#}#U~fSn$xny4|TAW_NwJ<}(jd5(qcP~dZO z3O=hsFEo!=VuY*m;2e*KZI6_ETSWJw0{Jy-;HrP(ox@VuF#p~2G9hM8X+H<5+wEz3uI&P zC|c^s6KnR|&0A#fh#@t6x z--JxxP@!E4WWQoiTZL^A*}L+0@WN&yO0K#OdIi>Un_rc*Bm_XOpdR3R@?t9CACiw& ziY0tQpT5dPT=J8=BN#*JVA+T)iBy-&8dvf*5oR(J5l_djl51_;@XO4|P^53kq=G}{ zr4o@Ft!QM>`kGNmU&^SZhWm}2ZJBtR0x`RlxNAUAiZHR5G{?{9($WzAiJCt^0Cf#= z&)i!_T~^5gj%gf=H`l~KA?A}H3u}gnrRSdyq;BDqW&BeN=y6XGrGTffNt-h^(_b@7(xWz*{97BT{3^6#7L>Ee4C$QAj>lv38nOull zKIv>(Qu5g}@NM+|ji?zZ0>?-y0#X>PoWT#1s?Ro&xGV2WDyJzh6N%4qx+aQp)<5$S z!^6BX{FeIReu;hsJMD_Z2@fX(_KLkOL@P*VrOD5LmxqAE8WE#igLfiG{Z0z5=N)XN zX><|F+|H3Co{?5fgiE=%e08OgS%gmt9GU-MSOrp#bQzOOpfaY8amXn_zA{ow*=rd% zx*OUW?g5Dqwa+33A{cbCy0&oQugowpovhfCOh;Qea(X}i;c!X}p00NeQbeIjh1)bC za7wqRV#?V$62@4e%Y>%ZgOYZ0s$%`MmR||4hlN@2Ca5thkhwK5l+Qyq7_oN@I$I{3 z(o?`K5vn?WKEeU7^v%|hQj^cdrtC_BE<>P@IpGn8Re&Xp(D0#zd;_kQb-}2l&avhD zp2jNjpR&RWX){kL2OZO}z2{x^;gQK$Bthz>?49TOpKC&mvC7moS-R@p+kpts5)6gEh2Eh)-#FhNMb2kVxTz!`w-C+ZO^kOv-@44 z(JKWZK(#m5B!9NZvk}b+3LSoe!W zvL@hXFCi(*2BqZcGS>%cjt*ZHV%*yR-N(;ry+oHdcXE|9Xr@X|O7dYNFjJO1VphwJ zA1yM*@^ghEOA)vlhHjP7gvCqIEf`~E@>nMMp?9Ho1vDvBkt|hoxsO=5E@7%NiM~jR z2vmOPBme1Zeu{I@Yo`(nthWQZAB)GM1C#6$^wCY3HkIPAL2_nq_oVg zWC}i(*1I?<{I{txm40H>!otjcd3$5l_*;f}Z#Yx!hGV55LG7eCSdKN@Lln$|ZhTDm z?`Sdkn53=RqLjxxfhx3;{$vZyG=tPf)S`4)b|yOM`mG_%w%+A>M&#JZsPU+|$`%^a zAC)bH9xPi%G`X4R+*C7d0};^}NYv{Q(FiL=w2y_*q@N^oF)hw)CDzjCCQMd)8Wd)T z!{YnC&BV5_;;~Y4k~7hDysd1>3MH6m!R_awXENW+#KI{`fTd^Z*2uu(X4|XLa@3Lz z#!AC#1@6=VFB}L<&NRlvP0lovn1P-~pKVUgR6Ci1EzNTOMv4kaVhzq8hY#0ra}9gU zU_cxPe|A1XhS!=)7gO1WYfau|GK>J|lFct;1H1P93!a12aWS5Ql5&!5D#l6UWWac~ z;#@$qNb`>ZgA0Rh+Y#(PjMAiBz>Nz2akIm2y`^RM?wJ+sE-eD}l$7lKs8rTZ3i_eo z9Qx!PX+z~BIaw`92MpZkB`1Vy)beAaj7o4U!QY;)VrS_r)#9Y*Lw;Z=LzA&N; zg1Wk-m=5P0k!IqR9D^9G>Ea43r|g9Wb+HyTCGx{roAA!4SUNJRot1=5wK2xHx}|&; zZ4_m;GG=SMt#LjFynLngoTZ4)z65Tf7vus*KBA~#BxMTam;{59Fe7hP*_%Sc;}8r` zh+P*2Xh(?@abL9l_eY!0&FJ4hn&R~M(Ef0CBAA|lC7Ga5AIQ^WIA%5Fgn$(55|x^z zrtiSbj>=FYpSq-AvXY@bWmS%3yRrd-tG4RRfgoOZ8V#@# z8a+K5L^>L-P!OtdKT;AI zD6;IAH(GIGi_>f>@QAJGRchFwVIC2F_u4}pDFq9iMvClyXm~aHv~pvhr~>`jiK+Ok z^*Fud?gSwW@+45n7$wdzrtf0rdU)j}e>SgGPHg0A<(z`VYQgbCnVg77#JTmg zw)U;3#}Lyq#7@)MgvlTOksj5N}V^l0#1p6jr^$IcVy{y1s^GAp5|80)O; z{#lZE+4S+9LeX*!2&UJj$reSbOO8&iqsP`HA*82Y35V^sW~nK?t*dQavc>9^9PGH$ z@2Hgd+~9P%U>B_O_$JP{ARCQa=Y;j?JhWifp9YeNx_I=7Y&N3RX^A(sj1F z*;Vq4UF(r=5cJ1*H~;yoINByIJ(VKj442nOJ|DEIhhv#`O_C)eZsw{g^ott`XLY** zSrPa8oIhICYBk1p6^l8JdwyMogG~f63|VCntU}Ur@Uv*%oew6VmwTFhvD6=V*sG(H zv0V(7Ym#z7X({h;EACR}`G1(3kK$wrMnFrBmIoz^n9JYSSJynqV%{xiHaH5P3}onb zSiB#EGyP`1BSlxYG>{!-D5<4{Fj=%>P+-_}prr00IlaWZ?>PSiSv76>t?Di1u!NrX zqI|ckPPS!k0*ZL|$JP{dL3F;0GovTu6BGI*empqA0(RC05qT%QFj%AEfSjagZL+9Q z22WPaL$YD{?C@Hv7}rq17f(na)`_( zwZ~HU3hGt)x`=CgeU*EvS+q9DDvjGK5uxnAZ44c-3~a(#it-@+RBzcQd{cAm#fV9# z9%VRa6Za)Gi}N>eis-bzX=mcge!5LR6JafYO};Iu2Q^==?64`wfuERK*3;wF?uSm%;)#izQ?2w3N-G7 z!&NBri%H{PG-Ey};_dQ!U!2qmp=R_lljr;EtZmu%d(NP`8)cDgFQ{uNm>51XVg?m^ z6TnDx`%Jy;s~=;>4k-tT?L}g)OgVH&8)_jhp1l@QD_4}Fk2p#sB#_)71{#gr4Xi*; z)C4GZEm$7?g}nQ6mz#3JmwMJp#~Ka>0rR2McvRW5vG_|*J@z%SfPIcunBCMlK^j2%JDL#5|LhWLbi zd+H9shUiK^HV91!`UK~|9*xM8tY#eK-9y1Qq|bAR467~<5#$OM^zdO@f{0DJD0uMB ze>1Ttm^0F=%RiB_8%O3{C^G?aLkZx&QhU$HNPkc1E&U=BE zKGm437?rP+NvtDVF#}s2=~jehXgZIkp$*EO#xGh4Ac4p@2yqi3oKvL&BkXY=F>gRf>rl`oz^uAM~~<2v?3G zfSN$p48Rm4myAunA3*yB05Ms$*-9;-Yh8;lIW)=g!t)i$(-!WC+UhnZiimKY`parR zaa!LLXN6{j{S8MrAKaHl49rT@W;ih>sXM&3oVt6aV_a&IqXo}%$zx%5UOX1 zmack^DZD|(ub{c$b4|w4MY#6pKO}80x+pJ6zJ5Esl--ap;2I7?`abQnBgdCqS%rB4 zNZzN;5SAX_qrSFh#v;Gs&{GwxSH8^F=;?9!i1RsvNlB1)yMnX!HNGtbST)Y6PXPQQ z#DIcGS>bII#QQN<7u5Xvz8SM*ZA5yT6e|MnXrn}_Zv*})FR)wu`{^irlhm#PJObL= z?U-CW&TWnM>nD_eX>*DhDQ~}9k{>aadvendQE9lx5)mPQGo5Q!;OXs*Jk1!LZ>SA^ z*G=rx;k#H4$JU*TNcy3Ur#@K6#&NUcxW}T_^YfpAL91{l&kluG*xB)zgQW&r3 zve@hvPRkVrJWSrF>pRf5o>VV~a}VqR&O(CYQ(B!G*Kx#Mxsy$GbhvZ1wN_=PUY=4E zmqA(DNto;|UZL%SS!rsrts`659NBv(9mhpD>Ubq%#+ZzQ8yn$yM?TUnXGbHSr^pT5 zV$Aqqayj-?qs_aaVUwjksvDVx+cZY zU^ZC$I{tzGT%s-<8JXoRMsz1a5uFyvjWEss;5xqL5~``;xBy;YyR1X(7%glOIVoau z!Hn5H-+dF|c*JJA?i@e{Cm?g&2(RmCDcZDB315EkLzr4)%0i_`rRjNgn4B^vk4LbM zufAtjiF#`@{i@CISYw%Yg0|XDm!m-^dBhw8Gq!xL?V&mm(bJ(fr=b69YHfYkj4-wO zn#owOip9bMHmq?Utm$mc2p$fd46LyZbF*!-61Be6n!EWac}6yOU0iH(F?KX)N_Pc9 z`ObC~@zmr1xB-d~!-}U7sa)kYa6wiUCLp!`pc>`_F3O;d-ZkBTiV%yq_p#wI)(;i? zxRo#4EDVMx&_z=h^>%Z)b~7Y|rnMTY)DZPtk^z%tDvcks%cHWAA8XOuPnhyr1i$QI zLr^eS8#e5JA<9U(Jm^j{@qk}yQm8DNsmDLz499DXPum;a1Ex-`^D0D|Aa}|AKA?$k z?xd)lO^F}Y!U5mT(Q5OBVD)hZg8U+I%DG#Bx5)CZR~u12J74UjP>pC;Rq$$@8?=eWB?NgPgJ5K@+9i~bx0X~+VRIRxNw(c zYi0opH6s*eL@m?s_(qn7U(u9Q^)Vrn)OWQ}X!O0mwE7Px3jWBaQyu3;&(6aM56EkV zX$Zl<+8>yt0cUd*bWXtoArF_W6k{FZ4LT1DHBYaFo%*II0gtCvMRJGq-NB#`nupWI z&<5S)UmO2_qqxR+a+Gjtis!7!i?qy#SmmJTF3*5BICo3i8 z0!_j0u5Fvn6>o^Q$*W8nak0F~G;MZ{?Bi@7h85*VQg%GTc7~YkinG(IR4u-qv>33Q zT@h1bb?qIztfznUHF>ch^HoV#`}U5voU45tK2M^G+|)?&&{4A0gF7XZQzV1KvTaJ@ z6EEIMyC?EhY&R7F_x;caI}jC1bLgEA`#L@YtM6{x=lsOzApI-j`cavU4dKeEe7})i zynuva(0MtOyv1uvw^i8m@Gz)BTI)1zTbFKTC(zlH_$ z)?fBREH!Dk?gh9Tya`zDJeI#ZJv*i7Ml{{4b+hpcrzMW9M}^bmBuk`PZVwb=`Z_qD zvXWcCQ+NmFBKXcC7G17L`?fiick7`;sdw8et0idX-HGTPtn00@#}!@YhZ)=MW$Gt1 zzHb+VVJtpVP6=*pF+O@s%r0IS#Kg*6&W73wU>wm4k%LM495RvJz&B06)l*E#JeOaq zc@2|!5yM?iSvAfbv78+DW8A;fvZ!YdQ^y>|4xKP5g6d#~gDRrL(I%iNx@g0aUy?=$ zYOilgKWbN0AYea|>6+a1Y=SJ}g6Og@FyL=^C0@MTA>f1H5tfQAN8iZRuA^{L+s3?S z$^i()*uENSBL#*~XP3L+6bbk=FNyv3k8+{KO%I2Jl-j8j5Rw5tn zy}We_^Ijj_tOdX6=%aEhO{IhVo&$fx3}}W_xNh?aZQ-V?P)l-VUj@tRjA|K!w!NeA z2>B7YuTXMFY3IU^xw}!sRc76nMVPrEw0bW32k-Bw*t)wLP+?A4)*{#> z%d(jJ0G!AMnT+|R6N$t%hW(jjxg@&F+im6;iJt0vc`?|ms|R(2~G%Ti8_?KwF2qjG?%;_!wjp^+ZxWd2B$q)s_tVlwO4 z%}}e!>E=`^&CW0RZaFOq*U{1qdy$^aV)t7BTKTA!lh3*8h!h{IW6y>ORWniqIuRv#Biw_hs1nz!h0WC6H5LCK@MBz;wgqEsiW- zLHk%9gfeRuUNl4JK_TXP*)7ph5}S4>N9^kv1{vIF_I=cx9pN_qX>THAI(E`d)ufS_ zFE2m2;PXW2%G!8{E|<)xi=rVo;0s+FMQ+h8uZO}Hh3novv%=t&x8A>@j9ADpaWDu( z`H~6@P8fd>$&6O<%JCC`KQTP2;PK(dSdPHQ&$B%Ps$P@}IVYSJ4YvVSSDuyRqw)LU zyt_MqE1Dr5559b*{`20Q#Nb2vRvPxj<1!Y*yV4Ku-!BmS2rDl8=*zU#|J>K^%M{-Y zZeJlZz9S}%d}R|_Y?GGqS!J0g)7kyKw*P^+0A$c)&^?Q4UH()Q=Vv9RxT-}ai6(UX z2hpz#8VV_^)lSx=SdW+2hS+qF*|=%Zl{KG|#7j7k1kX3{4evor8eWn{Iy{=g6u~sl zFc(;3U5F{)NCD=N_#v+W%s#i=Y@7aVXjz#hMZ=5^O0fa#4(HmE)TLGj8SgxHWt}q= zGww5#0n^HUubPAUk%E3B@dc<=F3zcQ!atJnS###iw`}&=#cpM4f=tzz&~{eK%Dri5@0;$DEnoJ+AXc%z9!)w!oQV zw21JNGF|?cAMJ4Z1JvK+xxW+1(VJ>E?5MAJiLH5&YgMAJdC9e|d1d#YkTCAD@p$NX zXM1xnH6Gu(*gc=xJ!k4gg*Uy>wY|u?w7t;j=wQWT$jb_rbfp|VyC9Hl6fR?Rp@!f? zVy-@R@_2?+5#K_%1fWhx6YrWW_$yazbe=Z?w)igxHGUxBe5!uv`z&|<8t4sCG=F15 zSy$LYp4~FKG;Bj#L$(ke9Iv*Sg0My6w!W|AGG$0xVZyV|HyEse{*Hbb2qsd}C&dyo zus1;YqCA7duj1CSfDW6kqn7Zi_XiFg(%dcXCKok{VrQ2b#r{@U-I53@N(fUVw5}fx z$mUU_hpaGP%X6jj7O%9oocbiW`Usp+W$Sk%41kQqrW_ZI5r$AF_$)&tT`t)~{X6Vy zr6qaR=8|<8`NAdBBy9O(m6cR2X|BDV_(`4m%7qS}RW+1UN2$x3sn4hq$OdTLRp|Pd z-w`EOnAx)1MZB|~P9{z!GjivoCSO;elga9C)s53jvy3bIu@5!_+g#_S=gmFh>4^Ib zqs``%g1v$wKal+Hj3lWcpN|p}&i51A%q-Ja_m0(;61ApfQ=TlVAdax_Ut5<=ZSKVl z5YpA0u|`MK;mC=IE?v>Fh8Z@{wNbXsRMDhjE|j-1m!{s25r}rAa{AUCF!?HjG~c&L zmgmw-4tZ8Oeyj#6-gt+{?>qb6DFzy_I0{7L0gITa#@|;WWabW$qp73vwovBAdow7w zWovIuBZGDrfb6G_0V(^j#i0m}rG+!YHsyx|=DcZw6-ojo&2$7kEN})ZH6t4H@0_&r zuo5Cv2wOmO5gXy2yHR>;laOpT7ZVZNKUlm~)67Ne7O`DtPQZ?oI^r44EGoM>yU>Y2 zfbqZrjE{J_88%E*+*$N{8>T_mEmuq(3yMBE;zAyxJ)De~^+_J)2#evc2iM`SiKXnY zoTVF186y;stGQ_#kw&$)ri9p$hCwE+&0@Z0usny|sN>9!EI*^ZwE(oF0pOtr)vL1L zs#z<$>tu4=FXGVvs7fJ6v=i}GIv?B0ub+Ojw`O~ugVLvVqVf)qx8QcPXKkbS8+DMd z4g}NCH+dbJM-gxn$T3*kR2mjohEphA3815TyDKPuSYu%?VI86S z4AqI6Fc?-~5G0U#W7daEqUscaL}bM*Y~)6SfEdZk26l(hiO%fYIf|dT2{Wi|YqRU% z|JW{IA0(JiYnkgiS`(TMUCyD6s_v`~b4It(H!P@TjYf3IH6d1lc04}K!UQui&JY={ zqSlr?AGoV>)N^&Egzf)m8npY-zcqcdaHHcjPjXy#ApO})hgOtF)pmY<(xf|cBMW8a zP=E{itUPz*5UOt2JI{c$i5oxPVjXANegP*2@S)r5Z69>6rrLh6?F`4oJrCALSs`oc zy!9(L1&^RwGtE(4=USF?96&+BhVhypCtA~R_6Z6ju@M;^DT@|a`RF`wjNb&glC*mI zY@~Ah6+;(sjW^I`k1Qmi?d0tR`=P6E8Rnd=M0GcrxLq@4tMc8sKKdHudaCUfw}a~D zs(bSR7j@g?yB==6BL=>jBmw+`C8fYSfz9@^Ko>6>Q}i`WQH%&}5tFBxD0DJBNkcu1R=4;ha;fjxEQlq zgnAmT_##1NnOOfQIdS2KML2W|gmx z&FQYad29Rb_0xgI9m8j>%Lr#q?(-^XnG+bN++4;+)F3FLd z!KpXO_F{wGb&i3_3$a#m_hIEMl4s=xx9%8?hfaMq7PNnLy};#&pDdeUXi;_KgPBcKf^4%1#+GvI0;Ta9(TKYw#p9WMiDTb>Cr39ivJ zJw8!2^X`An9(e zQAF%ZwsB4tnY*iPAto>;Y-)ra(eyrfP{z#lhvrtM;Z?3N{$9H%D2hGyLP>eCc(}-G zJZ0>d;m11^?afTf6KeM&7pL8m;M4~~qB$|d!o^en0XKg*yz9;sDoLBo=x#n-_&tNx zgEChidB04mPPEB{Ud9Xs3(g1iGl%bo*lRpU1*y65m`5_MXUU;8-W)yar=!9AQcRL$ zL1H0|?ECse8ZX(_SKJlwy3jnJL%dUQG}(!ZFANVW2z41NXmBWHdw6&D7O8@+FX#KK zf=h@dqf6%=-tvSgr%zud(8x>Urj-;9i1$$11LUsUlQ-W1kO=_&AnWJy%?HuQt|KS+ zC7sGqy6W9r-MTY2mG$1nHJOnY3tgs=wFu(J4lM`Scr;}S_)X+)Wb^#AFYgctXMK)z z2Rz#K_{;<((DvCC*Pi^`>N|vWXu-PO{7zdj43;O%R=}4R6KIVZN6^5&-czf!FMYBx z>Pg1L=L(k!7tLJ|i>-VyyOirQE=kjSKGta(1?FVnLm>N1Zve*`F3qtv)#Uvyb^iTn zq;x)3s<}qA?u-xZPQkJ#fuM0UTBFT?hdv_0c^eXl zYP!6=dL?3tySX7?eN}rT>VySx6@XT2_(6!G8h3f|0{3r3m<4vxhnvksQE~&&8DY2?@ho0)pZo3IAoFeh-CrBlZ z$Omi@qH*7y$Q@+d=eFUILvzHeP=;7=L^{fFl$-@1C8CM#K(6+pDJ2kJ#&0UmkDIrT z+&+)m@0(p8$5fEpQ-XM=pa>d6qepE0LO92Hd0^skpju1yl3rgi>N>P$CLFS(H zrqvYT7k18go`!Eu7Sm5qu~J?xwCG@!8QZ8%l$+iKpc|Y8kpw>I|&M5HGTHsvefdRZ`H;+h!a?Ud$Wt>xYWf86lLW*vxR*`X&Kd>D*O1wa zWEJ~tI`A82Hh>)@Yr8m0kf}ln*x9)_ThDs z<*$We9gl40{*G>R(}SJZB4#K&agXd^2Cuwn3)f4UWio+geXmyX6zVPZW8T zcE(E`tZrqQR^oAD;iF4)UQv1xPJ!R^uBi8*eI-VCQFF_2b_|n2O*M%(ui8ZMkgi#R zQe5lJj4ptAkZ3EUgL*!f)HSCn$1Wn=K!k7~f1WnH`dZ%p$r8J`c95S6{VMKbR;6~n zcqOqZP0p!+l3oEga)MrIstU=;m<}K#g(#YBi^+cudcY}MC|7*MxU&r0`#$b&!8bIu z|6?~td=JM?0%e9oe1dobaB3#H?FLFyNC#1-1X4 zVD?!GK}GFkFDMmS)G<158H|1*m?gTdyRq)YDjE|Bp%e(D;<=BB`1`@VWElv8*%pK2 zOM?{$(@#o48II1j7J^!bB9dTod@8fz9KgHgU*=-nI_Q2Bd~yF4Bw07ZO(CpE@F|SZ zcS0YiCkh%Vj=DfpP^^Ec{d)ew83k`fw{jk3;S^sGMapAEPS*Bi>_BXFT2D_*tT;e&yeg z7yO`Y!}Pv{+M730Hfiufj1bTwlL+lalv*gO(c`EpNd>}J8gLZ9&*n-(u|sl&)Fn82 zeWQ(T2!%4c=595pgW(0m3i4Hfd%|un`P&z5sX5Jx`D&GFhPlgFQ6*-pu7L$`V)B<3 zrW2S25?B88wVl?|**mi(&dF3a%BPmdND?f_6o5iQXRX{MM7+Wf4>@jwl~j_O8Dzio zsYdg`b+5IP#&w=dH^9V&_-jBm!YUC)qd#sxQfn=Wh^O5ERbqW(@OI{nG~(mfQ1rOZ zxdN5b9X9>(khYV*a#;8M)A(hV6Z4+sR4gjGLs*254%uez1Ts7)WL5BWRz{NdP5XdF zESDy?f5l8#MgSEl4Rnm~iDSXPr(v9RYP;84vs$IF5o`PvSJJY22hRJJ~V9=vx z3Nw~t3k;)N=3HcKlzZSVbpfICM&m0ZEcOYDVM|f5eg1@tUXk^_mAU@W;8QczvwhGa zYF&s>n7X1^Jz6K!IHr17tQKS$MsvQnwlSH*5=;`>jVya5TySrDM)4hL8ZXaZTCtm+91D$J^vwcj97)0C^OYT8xOSNz;>usDF>8Cb9~zJb5t>pr-|~3HymC z)i0U{|B%-FA4REt6*Qt(H8XPjM8L$(PA_h3X8OtTO-+@9Uf9Oc#$L%*-_V#|#Ms%) z&{$DSh+fFd(LvtWUf9OU*2db{+L3^RUc%bZ*xuI0@=XPSz(n8D!I)l2M&H5WO_=Hz zMFK_o-_avrVEk1I^#7G3IGrDnC051!pwOz-kw7SbG7WeBn#*bYeik`7|BgWM+mE^r z4Mm!-mnMcLZ_n$#Rbv<6qTOPG=Tnm4Janr^ac;rBZw3-OpcN3q-@-uON`|ecIB{wXKO~P6hHY zdi#<(ZWLW=jm89Dy%2Ddd>XZC?a`c;T{^0={5U|Km4$a+kyLv}0T>$_VStb51$gsv zckXYUIpKVK6DV4-=F8Pu>x}A+-9+6rcp)Ax9y)$Kk+B~*#tlonJop?q zS@;bj4he?_4o>Z+ot+&T6Gib3i4XRDL-v>LL&ebeWEYPeAa~GKUw^W%evv);xAzqb z$3KDs7N)--CipMiBQwjlpn?9wFF}Kdv7wETF}<|0wdq?B!ou`x3=vwlb5!sE=kP-IYwb3g(_tGLyj@*E^M?e2mpA|z7Z zE?NDS2p1^ukrS_YDEavVnt2L*O0ac@Ax(GGx6Jz7;r4DJ>o7J?^oz0u$a*8h-E-0( zEI5_`i!%PHN?Q(Gy5$HCyq@NV^MRovAGXDQKxko`h`dMWQvdal&~1%ITKI{d{d3Q~ zKa4(q-_QOA^k!oDZSXm}4DZhX3pD9;#|Vt{ZBwi5=~YZ)mg0!)!X(0rXeXjx28QtU zz6a%wTgpev$Fkl5;n%5Om&?>egrl9U@8@R z#dP*_=C<%!&?F{XBq;mGM*K_AapfsT{ktgyjzqWBmU0`WEX&EyD0(Kl836tG@C1BY z5Q8cA^Ee*s4Ps+RUU_XZZW-&$^ENVb;&HBjI4ltXq)I#YAHkT#dN z?e*9WH-JJBI|e5-F#1Mnl_Y&)uLtDr@Er^c%rSow;wt1jq0fC;xMc_W7$l*nlrjp^ zOJ9H$H3mcS?OzZsRw0JOQ>B-w8k{nsV|*ftYlW`RIi4ULf)XN7lphsVD=H&oZ6 zKhzHu$|z3cl{p4ypW%9BvE=8H$ccq}Hdm$z*YgpcN9_Wr9|!u>4g&^;=WV95uOvmy z^vU7)wHlM%AA{Ojzn^mIo=CGM+WipM5hu@nx`88D@ZYQuI>@n3Hf}^0Nu(is7fX4EH4v40Xy4uz!}*PnwAQ($wNF^UA*i zQ5b&fmkZ0tetMXJn?5rg-o&BGAH*qyxp!YGN57=WW_rSVp2P9f%3=^MAml~ZEnpUa zj-$!26U=-}z2Q+M2lOE`&9fPQmq`w2FeNmVg49Ov%U&^iZa z^znU&j%udY8V``gF^veW)2xEnzYLwzy64^P;AO?rvDRYAH4tUPaxWJdgYg7>roIIO zgRDR1Lyj9T0(`+cs1wc@iKVBdfzymBJRMaeyDm3NJRc`xJI~+sJq?Qg1Sx(IIsCVg z;ul`wzbJ;k1S$SYJn`qz1jldMxt^{{$@K`J25mZXmA9{>mZ?>V1XA3;zGmsRP6cd{ zGBQS;520WL1ctkL1byU<*2fHb`{Bf02LQVq2Kacs4Dk1ZeaEz**+?RoUA&dKa9-N~ zpj)e8xlJP-MnMal93W9qYn7`;o3RM0fgVN>b;VVjY~~TKQvp;|$8OgSRVzs-jlF4v zd;epBDk;BXyfsIQSGh6TS8909tD{W`>Xrz1-j83^uU=n+BK7LFdXb0K1+t59A{Vg^ z>AG&d-LwHjx0QglwzT8SWz6?Ak#o-@0tcWG|J1d?=DWM9H| z=$~TVB?W7L0n`urSSI~ouu)$+)I?`7rzw<(_3k=r%%SV71@O-}sZ$>8@n5GxLh!(u z9v?fW`@=?3Nzd;#U)7Yz4tzA=0!~N& zxGH|^KCDg8AbY2Kda9|?SV(2kfH8Oma_&7fV!;CfMc@ncM*|dw>k`6( zJs9oVm+bIQhTA3I`;EeY(8WT7ZirYGNoA5v zyk%yj7AGpWVgUEeOtQ0#b%D1Pc-c$4&lmTLbT&7xw_`w=Vc%Eug9EPEk2XP-NtGw) z1co%oIHC7*ijMXj-DU6Iva2C#By#VJh@*JmzYDSF@;ej5cYn!vRXMbQw-QILcK8~D zfR%3Z6ns2h=^v0tO@_`r|J>fv{QZY2{n7axM#ndprJq>u4|^i~GyVMg*83Z_9V7E^ zj_b^5DTKGHX29YqpKD#>7j)1MwD$6NjF_*lHu1vP#|rywx@6q75?7r-h)4zkJYyuU z3}0p~?-G+x5r<{Ae~ffPT_dT?K0l>Yu-y@E>~Zkuj+D=hq7*Ja*2H}P7ivE3ce8Dc z=rPVYuH{zmW30=QH~xrzNnj)decSHtMRd!53|H_GQt&5>`KP#iMkdz3@}T`yT=@5> zd=|Ff9<(c(Hd_pcLHgN-=@}Uy*e!@c2qVx3udg0&a;hIchBUY+Jz!neBC$l zH@OUkYgU8vekm7MVKeQX7wOXNOl_H(N1qeOstLq}?kqVyNDn?g+>-||=c;{_KR0pB zdVBTb@phjfqsR47-u~M6b)@2?r~bHvzpmAg=Kxb);}J#Tdpf!MC>7q+fu{3^i+=Qv z`^n2C_@!e?k<&!NaauHuqU{NRhK*t@c3{bAw-J<|t&$qFxf9T_mP|zHIoHA|9eCk7 z^!M$iV%nHgu*hL55ZiAVS9L|-c~d};rR<~8Y@ z!(GbW0Pr~%Iy+9d?OUTM8`RSl^J};S7TNxZq>7dJ2Q<1ujfLmLl8Ta6;Pm6xumusX z)~_XE#V=O*X+g>}G3M_TWrR!2#985r3kl~~{{6`_`Eo&~VS?0tV#@7Uh&g~|RggD6 zf{ ziLX8$M-F+C{9EcViBVibH7tgav0)`W~2O5o1?tM_3-FOD7Ej>8pp%J^&|| zhG3Xm#qL{2ZhYCiF93LVhd$by(c@J+7cZA4FP;@I>?qsIEKLqiH#O)bynZwnZv^-B z2@?m7Q=7AB7dcbtt?6g+4Kq(H?oV2FBOa4BfYd$G?1?*iIa-SY7_F-1f#j$p&)e)5 z#%$G7o~{D!&Jmnfmh6I#U|y{%2f=lW7|)I9!T+T2|5Lv3|4-?L`iQCBKTnx^{}T}VQ`GGrf!N=0 zaImrd<}!FXBPENi03@RD$^`-z!~ldn?S0~tcnFmjV+$F}bj>N%RH9Mt`&zSi;u1IJ z%wD}<#g4DQHgj{D)pt5~re)mT{_^6;fro%$O?h!`TkqvF>E7azHNc_W#<*9syegLP zxb3QBOoIgfc!;yR{5%q8)Zr?X#GjY3hmT={N3QU~mM!ui^q=hg|EJXo}YKH$h?QO8Ve|<5Q1>Ig^$}{;Gv_>GV6Y(i;DPYa{}hWQh1-87KotR} z3;F(aip1;bHP{(rD9L^XSwLqQ{UJPt#H=}}0 zX+bM%_8BtC4@uQ405}Ts*lP8`*-<7Me`7qNc-41Ph?(J=N~Dd;+-5`7c;snO-4Je(eQk&)ugfSF5Co(>H2g&9iKNvjuH}-;YJB3On{Kx zHV}?XIa4S|z^PM|xj{g)JJ$2U^e`TgJ*Ga>{J;u&1RvE`>^itrQoFebLk1xfYV*%V zDTJbj#|sbIjzN9u-U6Ap?~k)?&>!OW-&bW&pwO_A5`mzC$wO54@m2jK(ln8jGU$LH zT?W@@MRZaQZyb@ofUuYwfBe9gGEx+!XK+d2uCPL{IQoD+dXp_3j3}`xCrtiekk@tx zF5D{1XCqCms;G}w;JT29MB+{Qi z_@83Yf8W>s1^{Pb`ESKo3J#wMV1e|IL2@a+*He78uz7uzlRYi3$5r!OK26(45EtrM z;C|5qA~@O12r0q`ilZWy-d9(k5E76cGT&>7!I3w5SE=;?rf{(IRn>U3O^f3&ua?y6 z5gW1s{$&Qc`tTgb*fXGByDg(UiuF?;)|V2^{eem;Y>R_5xrdOp68;uDj=fC;kDVD%5+iHbA}XzO6w?ui z7^>0>o~J!2MG|A%HD6t^lLsoO31(ZYoocmP;>?NTM?^Xc`)|6Eoi2~rFEOA7>1!q#ZQ~PS+d{=!#TEKJUBB2= zW)p_($!U&nepRuC$242vti5`7Kxo5uvuYHq#NFOF zfPlVqZL%s=?@*$#4e5BB)H#e{vV0Ql%(LCuGJsFRz+ezz7rD{!it^y>eo7(t@X9%? z#MkilvXINOYZ!i&5Ka3hCZ0O!&)G3<#kez;x8G`)_5G%}2D!aF9DpxUsjdo3AMKtm za1Ga^4kE#?%?D~Zd6G4YhBcSDFx?3ARp#91PLI9KZ==VaO2Ef{|E`f{peyYv7p_%K$*URfE9z3A0H1wn})UAauT4bRywKFd; z9i7e>!3ch|O74r@ulA2GGyFGlHKJ*q`mV0I-2A{s{Eitvam+uLBKUpB{5w#E@wcwI zFb3Z(@Rrhluo$~0S1e&kMAQg?nqgXbO+=cjseQB@_W+&PI)OJlh_)jnF%!DL!!Xwa z8IHI$9&kV-iKjGH=bFW(cVyDFp(s^xJE`YN7F5A2FCVJe?`67NZ-EAsw{!JW?A!Ao zws(}SW-^$LTx;4`Pv!^*!{c%}9{ktK^}741bwG3Foj}mc(X19!X>{q-Bd7j!1V;L^ zUzOKK*!Hv9t6UcPy#Tb@*h4&KI!~0o{6LNR+D_NvkofGP>qDi1Nzen5fxw@bCf&eNw^X-LzY@rV6Lg=FK*uPzdMoIM;E89OuUX@2xN5z4k@MpT$X(c} z_iR#IO=L%y8zbI;Q$I9lu0Ew2rYab_rsMKLC}v=hP#g!8<~X;SEU@>&Y{Yu)HZ10{ zyAkW&&*UBCgFGnQ4-nBj*so;qYlVDJZN1?IwI&jAU zwGru_T;0&g;Zk)qivAy__WyTfKv$>gg>&b|?TvT${_Aen>s6`0)E$iXdQCIlkvIG5 z3nqdue~{OyPNi!`tFc3yg$Z&zyZZj{jn`?zG{^=*BdzLPg9BOR#0qP?!c6Ksi(JY0 z`21pzaX8+E*uGKqwmn`!^Yr<86HgYn>U2nyl~FiFDG62=_Kc+IuH)WEv8$I(*ZW7; zd!6G$CZ-LHx5Yk(A@6*>H&wWpGR54p7+-j%?VXApeWQ|m_1HIX5JBK#O+F9|+5)+?)Luh3~H;d zg@>hw>tuZo)B*Wod$+-PKt)+hwY*keZbK7OV7cWzFc_i$&>syI;N~vJ7|$-x&%U7; z=_PhO=EI$Ep{7BAIaT#{rB9xzPTWLt!7kB#rFAL~Oq@1D3HUN+GpSY6ha61F62^MM zc8gtF&h?U%v=ycLjGTwsiK1gaSMYX=;TDW3h0hFY z7&i)}H3t$@)Pn9uJ^nPF#%B`^lXRz`9i5sq!>xw}mK zJa!1tvl+(1_jPvEMA{C#6Sv3Kte@MLAX!WDa&F6B)uqomAOB4{cUy>${M!fdk#y}j zMi7ArdP;lI-s$&!!~M%VKv4Gje)NVJDPd`dp*poZndc4S9glh5CpK-wVWf(ZAEx+ZM77q6SWl`OXS1?1EGv6-erz`1YTo^8ezpTGl^e z@>y7ao5Nq$lmtV7^6CJmZ*6<7-7;ioN*vE0UR8BZiWLQtM! zN6PRqWdkYV-jv)Y;4UG`Nk_~nxz1}Eezb|Nm^+ib3!i+QllwujDGS4R${>{%Kipcg z%w@FB8b*4<@X9W0bZDE_G9=w;sy(4Mr_IN(5DxN}`IC)>Y;RlBU6jGf#(U*@H`5?L zqH0k>gI41{fdwYO z0K!aT(?-#!m)%M3)CPNOK|k!+Fe#cB&SnI0SWHm*%;DliJD^!zdl!32*MYjQ2Z5wG zS~fL_Fz`5dX177V3Wh&HL}+(ZdrY!(=-TND{Q8X_m+#~~=a%W7me#AM7m$6mL&ZlgAFaJ2R=#O*c=SEkh) zW?1un>3$CLh*T6hOCStJATfqWhXoOdFg4@{g8pL}i*|YvbJ0ES?aR@3(K4l6b;`@A zjGw%alCAg&zBe-2J!n?WUIG-A_JO)Py%D-A^=y)!j0Nd72lE2sg`@R|n$7fSnD*@5*F}ONVJo zC`CGMqk^!Yg!H0%*85>59@73IdnVHVi@mpis&ZY|hG|e*x=RI-?gr^j>F(~5?(S}o zMjGh`=@yWjlypl-Nz8w`&e`90j%%Tt^KH-BXZ-sej5!!DOyargd9UlfuV<}q!81xU zIM+n)8>9639&Rq?7WHSAsaN~-8Hu)@@fMQG3z?=&2Yx2+!lpG!%u@R{Mg%~|RO0uV zKDvIxY5+L8)@j}ysgW2wlcke!5FIR#K2>54ja0%eV|Y<_nmU-J7nPvUfp?mcMlafW z*+MGL{>CS3HWM?W-bCR*t0h}|#E=%j0+r5u0Pv(XB z0iq^&k1WZuEuYpz_}9h!{Wl%vHjUI|G8ZM+rk~mEF;qCZq~Y~&v$KS5WwC||F-u?9 zxvze3_adCi{#JK0yOdZzidyAWsKlzcTvgVn5z}`zGjXs+Fcs*FLzzC9g-7~c zre)s=`EM9s+&OEab@qefvsT&rB!N9kk)AZy_r}pk^&#P~)!Xv1t(y$=pzJUhlPY)? z`Z``+C^q+bGZiz;uw0Nzerfg2Ng_Vusv~`~N`>9+em&BoIoT89Q#zxIp2|VWlG68o zd%1zRdgpYik?U66LnGFPSJ}9=w19YxppLWefK)eRkd2pmw(t>O;zd6sCw7xGol&0J z;T_{0E3fkhp18kWcNV$_b;19G2klvY1+alQ`X2*$2JoGu_m*P}kHUVU@c8qsb`3Du zUvT5&W;2MRFZ+X|&pOYX8pPKBPVQA~nK?qY&`(@)r5~r1D^GH1Lh_as?3ktUXmbtm zZjH3ejRCq^n!z#2f<`>^=vjtDN{sh2Oj{T659|6S4-cab=8$M+&7srQOqYm6UTqP4 z-3(RVO{u64Iykt!`&!cuWWirqZLO&UerrIlnTvXPctiM=CF{)9YhjTa|1fI|y*vLp zrsMRI!RceeYU0IP=RY`lTI7oF9Q{j;%E?J{5ec5=G_T>UBqzep6B)~fNbPB3^2=+W z-`n{13%n@Lk@~;J>;EM!@ZTgYP`Xjg#@&hzg|%<`==1WreXG_dRI&?iRqPo@XJ#*Gc;h%Co6; zd0|0n??8nyH?e)IdYI|3-lZB3cBzGP^m?sf!>B=L84a5~yxOu_ou(eyn2DL1bK5o3 zXa#HN<=9uUI2l|}kIldH^jOY#Q|R|3vIpU@|13N`01Py9?`{D_0kusm^)_-2NVymK zcES!efnylN)4N*NLfj3dhAoS+0CWxLExz;gYl~K6dd{30#ijMmV?k>>4lQ;PK3$Us z=eMu+jz3>Bjct{%j!o*ax(m8+jaU~COZcyOwg@)5xU0rWDq9bn7{{M}UE7s9RgG_# zGL~!m-%3*dZyAgKeM$!Yv~rsvrg!Lu?p!0M?rpB8fSVVCUB_J2$wpi00&xc=JlVe_A+nz2N)Gi^cA%@w`Y6PCVgvWY$>C6kBlW1>xPgp$&Pyac0 z`cOEX<(F{!pGWRP{^-WlcS9pW1phF;2IQ?_bb9-dES`g;cwNq)%8q+v)JRiN2y_8e z#g9e9dh+8ZnnGc*hDgV8%7kh@4Svc~!-c_avYlWfM&$AnO6}{~Z}O)1CW$KQBr1zI ziiazAfttX=#+1m=saYADukVGKj)}G>)l3-B?s{zlLnqa2TSC~bGG;ywHynLX@F+w5 z%kBAGxvRcMz9CJfZSvznK?{@lvSoY$;A%hG$}AO^zTxVgeE#moPRx3qh7tNJM))xq zI`F$M-sCP%5NVVq40kgvOrlb5bYwx z4q%o|U}@yK=;*dE5l+?T*Q->29l9)VuACuc$2z>BiAt4-{In(M^n*dbl{H-!Q7j9| z+-ZE;%hQp!Ef*;RMGLpWyXXS}DdJsxdF(@7?ngGKIIPNZQmJETfJ7H9cVkas4x;bN zEhI$V3c1OGdJn+#hpqo^lb3;1SkS~zyqy{FFtDV zH?9(;)4w)E10?I^W47z``s{HyX*QiNQE9&Eh1Gsd(tGD*nMmj`8szE!qJ$%_eEJIc zdH{#`QU2HxXAD6z`Dg)Dv{T^?h^1FhczSvYbHk%IW*(hoyuvV)WH#96$ z6f<(uW#E}>5t!!iZAVE2>!dgS2~ zf}iT+(S ze4s)Vk$km+DM_9h;GEtQY4+%i@P;l^;g(Uu?D3#G9?j<6yV;D&eA~^^L6NsXEpv*_ z)daK$H%pmbbjzEpobI&9el&PDKINGwL?D5-r{>5`<1BJhgQGgEx)xl*Q^PptzT&LCH31KxNwNqSl>Ssy z%7LQNQbYEpuqgE;KKT=AH!5NF(|#P5py7Q7IrxmGmsKV83~O)Z&L5k`c*YdrGz;SBbty8~uhUB}U^4w2>!{#w z>3bWABkZR?Yaqpoq}UORpGdlXc95Q%fD+3q`Y3w^oq)g#A7pazSjF=XPz ztJHgZ_dy)QFMRiRC&#M7cU-cdB%ReZfeE&bt7vp-nczYYAZ?XMs_ocK*MFnZS?$}3 z%F3v0Tb_J6F@ol>mFBMf$h_Sxqj!^P#Tg4QL0~3FpmEHyR|Dl40RE}=CF-wfdKA7D zrMC_jZQJeUUtp#2Vsq?16rT(Qb~9$|d;<;7CU_ae8Hud#*nEv|6*bSGfq6yt_U6q| zw4{GR_;pO9G^Hg<=*!B@rV>SQQ`<#^Ffj+OXc?-Fdo1`c#^R@h@Pm`juLuhUh9A25 zr(%YXJ`ke_4bjPpSIH99%IPzY2iyXYzw$@WAWY}SrX}{_A0jBAd$IY8@`}6C@Ph9M z@H13N>rolMilwR@uN$Y~v%oi1Krw!`4<9>7JWF%!>fv2nsW=@+X?xPYz8I{kh}56M zdwq*xcRS#Zl-5t8FVg*3xRTG^t);eWcAv(nR-q16e#0#E^}(Vb;#%AUGsWl>M%AEV zwmks+IC?L#x1zD;3c*JVJ0x}pPmS~&qKuyL2L*+Uu|LcNEgQI{gQoV_3fDqS z>=R7~^c}E%EG^Qf z$1uumeb0oN$WSHQ84YnY3yf%whC+ul$wi0)O_ihpQqD+IMm0Yv5*_{*ov9O0=d5o7 zvQA+#P+@8RdL3CGgzx`?GJUAGv;GR+{|Rw#UVqqu)KTyOdo{%G+iiQM%$8(}PSJ}H zERUrdv?nZ9o-a27VZejBKHv1g(YJ__%sE1Avd)@1EfmMUj`>s-j$n@%PWdDoVjtRx zL|~yHj%%>wjS{Gt)V>_1K-`WCBFxKaL;X#eq|u;Z)BZ`_7=YTod@L#B1>OoEfhb+` zO5R_sP^d`-qol7GpqvJ2Uj~3gyHvTFl_^-aeZ*=oQn0JFd+@H!OTXMwrlW7Lug=fX z>#{Q=evG7jZcX8Ik<%U_T;>M`lm5A6EWF z!n)YhD$aqxB$Wjze&OMs39)$#Tl*dJD1Fm}@FV_(DX5D9* zzkOY|0ja1;=GYhC^zag9%=za+2gIS61Blkk%ci@AIx zIF3lvt%nR4Qg8D;=6DdO_baUY!CB!~upa%t)V2S`cKtW8UH`wAF#q4DuFd+eX6awF zEc}LQ@-KDmf3b@HU={QK4s~tT2ch^sr(hnuC-^0ZPyeIvP9nUF9|*(;0AOqMJ7&8~ zZ-DKS_TskBpIbflea_wZ=vlzQP-9`fI0optH8;(7Y%+^v4U)^Lp{P2I_qTh*v^v0UIDMO@W968gqA5j#||=QdrGK$ zi!?@%T%{0@^u3KU*+*#p`#KyPW+vW*3 zoh~KImNAWRY8MW=6ZRdmF_@6u2Z%EsJA**d^|6Nvl z<@wG_N8-@jQYX+Ht_ZG!^Qr}O+kw-j{uiI;jd}cBYsfHQ5Tz>=&ptmc4_B=D3b9#d zm&*2{`zk7#^GliFQ_D^3tIv<+=9`Yq3c}%?ANxp722JyvD@U5yi@vk33HNh2IO16& zPnTRo+`0Uy-N@HE*M4qYRbo)}3Jq!9$peo5jJ9~4TmuXXPygmJR9(U3V?2DcCsE+# zl?N5`*FbxoUe*JW0@=ON_KmGaQ;8Bw8+*4SV|aY?Gd$PVZk}S|8(Wt6D{efQTU$5= ziCBKs@AmC@%Cl5Q`#!vBR_20TXkq?_17wxPu7o$a$8--u?0@k9_u%C4E5x4ZPYmC} zzxDsyp4aU)oj%&^=maAZxxLdKt7jCBfRt+L4&xc&{S0H}NlmLEYs5%JMO6w^$z{Qn| zvL42XC53ZT5;>zZoffMWOC_AE4Z+e>;kmT6LgJ11F01|YmM)^0Me{K1P_|U2ze)e@ za`^6*k_5(y%GKr5TN>JYBEx}}HS(m}{Dn5+y>de@X+Q=ICTXzMfZK=uzSBr#uJ*k7 zR#E`Am;EMAPMGj}u3Jhk{~L#sB#TC55@Z(*X7>VAQxT4H3EnZN%=S^I$3 zlEyZYq1T2o$!1= z8pS%+%c$dAdWSIA6F58?r1}i{#Yne47Guy*rTlT#jA_r^4a}n$O^g1*j5(M7Q&F7q z?j;q$aN2mxSN-;4q|M>kkAtrJC-5(`ayR!_@lRjS37Uj*;RX)R`V#@bPMMe#o$o-x z+CwR4Fs1sAgZKF5gV6Y2_~q}&DSw^_0BQNjq6^A-3Y_kcl7@QAp+EAKx%gtsFd@uDz zz}ac53A*$}wT`Q_0jH!iw2lj=+qX+x`p=iTP^v3)gGb3?@#cZhsqbFyua&NMRP7YI zUwstwT88|1*e`jHP5uY*b=F_v>pwPfOv#&D`_UnU6Tk+=Lz$TNa5RaiJ4OM4kj^0m zhwzmZ>i*J&)dT>n@T;gGgc$mpTSMt~MHKpK49q@x!y1VEPvr^Gj!J&;@60%e+2S=C zW>KH5?g~$$IQ5NqLYU3J(v4v_(jc#^JHf5*m+6z>T=Y)UotRbMLd`G@8nDfUSteM$ zoX=Rg-jX41u)av19JWd-!IoR^KF;TCJ(D5gvsp$`G8d@MTz}MfLI=Lr9c1s?0@0aW zIjPt0OEA}=md0ZtvJTmq-2oKZI(`3!+J{`8wUPi1DIdGxWcr!Eso;?$d)B3hHt$7Q z$n;$(uX`Ib5_1Cf3gJESR{b8>r1D&Uz?^i*#(e!^!19TWs8j| zCr)&-kNvz}>eE2LF*{6B3DaD#wZLAF&U~c7kc8=@3qM)3xZbYu5)bZUH_TjHSnj`G zNwx>#?*GuS7`9*H?th}V(*S=o&JBQMES2wo)|^gi;!}ZqxQP72<8Z1dPaWQuo>uZ? z_`e~--3YcY>t&wCeiE&4+9-QCoIvk4uxqc#TuyI)YLZD+_e_Q2Vk?Ng;%>&jt0pL3 zpS9PjxMHvk-7T}}dAHhnyZ;*Iir=g&p+0Y+?)esQ6Kf>?8xB%cWxVcL)JZR=5y__O z#<~k%OiA4S_S4Mw_1yTF5$~#3Ue+bCFi^8X@778j&OXb=8kJiw0!RT&h$$>A;Da&sRIzsB*9`=g`HH&Swy{;;;T#PXF;1YA_Yhqq=i^8##laoKO*>d z-(05$q)O^b6`1bEGCP`9whj}T=UfJdtfti^nO>Dk4kgX4ZAE3Y8*oLLdUr7HvUDey zUd=D2tuzn}DQDhQYqL%*q0gVi5!beiyHsXr-J$P3<>VL;Qd4m4@2z6USh?P!xoU0m z@ckm*WGCqVhKvVng8n`k%Rfx}clXKtPt3{u_?$KyhS>FePNwoopdlC&3lB~nM)5?u72CnieFFghbJ#YGw!JUJt-uIJ+{p|%vYi-U7z$GvaD>Dy^ za6l^Gl)l}+GCO?iZfX(Nsm`&f*4g?|keAnGjWYk7+E!)=e)sY|9ZRULd!|%2B2|wwwiY#&pcU9l_V# zqsEjz5@votmrD~xaMyKW$K)mB1h$XG@+<3&>IKgsW3P)l+gm7DC*bA8c;cAdHNZWS zXbIrror_1Z4}I&xqy9?W0~sEFR_o&oBxp3I;$QNW|2lp1zv<*rkbEVy~09qB->;{<%=j$_4Zg7F+39^P+X;w8nJcy!P1s0>mqOF zC@t+4UOhS+_hCH|vKn&GB-_~JNZQu119rKbQ{Sn(oS_zJdQ`KF+@@)Zi$o%=T!D*w zyUQAvM+8I236FG+JK4X^oBZE;`sQ-ZFxlD-^Pqc5VOqW5CHlr^m!{$2q@AnJ&hZC} zlUHXE^)siFi|1s6X4TESJnz|-zOWEUDea9^UU%xTT9gZ1B?OdU+%#ulgZc~aiK+iV zc%1Fm@c55C?umPmp!tLVU2K{rCG}c2Hz4dHV=&7cQGsTa6Pk25z3g6+eIR&#DCoMY zu1Pd^Wz$eIC(Rc_?FkZyf$BwJteWbjTut(>TAJnC?>}N9EEFp*oU83<(9!77#Ov)B zgrJ*!7D>`q*j3p%-(oSq$z~))^O;bsw%JQM)4}=T z;{z2<9(T@QAtTmIMQpLqxy#3O{-UXNwo0K$x^pI_m(g}qR&Z)^0of{NumbGxcW ziZdcG!`_4&dj}hP)RDC>W!mbUO9%h*={qMdn8PFT8nS(Up&qUHfgDa9y$uzy$JmRG zk4p~QW%-G_?c$b=L-uKsyZsC|qS2!(8#)->CB#^h8rJQP7U0o*!uN555uO?7qLT_} zEn-B#txY^(J>i0gGZPqMLA_84Vi1;}K+YGkF5l|Yv9ca1Bo0BQ&&JBX)eB?y^1Hev zM~_%7yEetdPMAO2JQd!*LLXyP*Rd0O%$HN>kjaj2v^oA>*dlPd`lu+0J%v_uNb&Xe zi)jxQ@Df$v9w+-}hsb|ySpWAim=!}+=_j=;gnX6^9>63jBaZPJo%Qm`0WGgcULZt= z`P~X#AXSh(spk!3Z@!X0&VmYcGzp;?#v5Ju9@GGiqazia)|4QAnz`BcD3390zdQ>4@^D7F!Nox_H?%w1Q0(GI$bs zo~l#CGPo|Ux{F~@Gwv^SzcIspN9sqb)#vw|%c%7*pEI#b`_yX-9`FsG;2xtr2ps=K zOYlR%akgKAmJ&WG*)*{PX2pM2goRKyeC;=jE~;DU+c4RQ*F_(V-AR-wltH`8swPQAAX3uWDIS!~Jfp&YvV8}uD(<6K&) zVxdO--7|g0{rQ(JFfEk|fBPAVmsJ>f*BDH<3Y>J{mxiNYLj1^`hP(ve8J zVwK{TV|AA6W+Smwbg8!O;wh=c#XWT}FNcdi{t>)-->zn(P+McILLm-ygHuJ%i4Ah| z4zi5UGS`yz;-+R-cWh_O1?;q0F-&8_^s(3+n3inulG);V@xwcc%iW`kyQ9|H!|!@? z80u$E*4b5$T7cCQT<19acScK1Qmv0j{N0D)CswcD+~cqhLd}2Su)hN}Xa3P;=QSgJ zzsstcNR&*kfP`rS#B$~InIImI-YK&%g6CN2w6J|?_B|IHUBnU+{Hjd#J_-0TPQ~__ zup>;BQ`fklMsD^bwa@zi-Qz}AJh%7uH@)h2@8 znsVQJPxr80xum`XRvDi(I&W=Xyk8wC_s5xYE%5PYh1y@2TMuDt#*l;*;Y%oy76YG7 z`1PEpV|^GL1N89Kt23}_1!XjRaNVD$R<&^5aX5cgI>&U7vXuvF+SXv%fk_xCRSDU% zRFTZN2FIAExo2LI?SBwtXZt0{&hUfw=v3^#olj<}YUVRYc0$MZhu9pDul-4nA2^p8 z+)9bK_{6HVWU><``eWv0`wbTUwxVt~~}LS+^^r*9d>cP6MdH1@n)V z_|ou^@;2DfcKk4EtEC+Rj=xhbaUYvJG?wcf%*oIsBA*6xGSk+KJ$n{+VA1>akA{o+ z_+Nh6$T62CP3~x`8E9RFmVvY|E`r(wZm36}O?24;loGwx#C~(1teA)0)9YJSRq@ zX;*VICjW*KmtC`F@~mj+(s=Pg&37NBzo2ZIn!D%=c)5pK;yQECUUJ>31@jVtPh5O= z--JyYc6-q!yTPM`*O)1DC*10(usXy`^(nxevsxRJA zWF+4D)?$@!x~joQgA})QL+AQJu%LQ}pEgsnnPm}%U8&Bz_06a;!3avzxkKYlXx7kV zQMR%lA>)BL^M3IZo}J}vnpN3hpr8yHE*nWRNrh;e`eglcV@?h;Y96PB_* zQv{w&FltHi)F`L#)tV$i*A7B;2<_FW>m)AK1VpXlD(Bc*Hdg7mh+=O3>jbH1ZurQf zPdT-4yJ^hO8gKHqiW^C%KLKcW4?_O44jo9A&P#sm^(5)}l^614F%Ov&$2y}jE%`ac zzz~6+VHE<@qf10OSxT5DO)@ExzWR_vM;N!9c%;xL& z+?H{s)`Ak6RI_!)*;U9pgcI14mxs$Y1N3gDH6D8f2d&;k^JwpiJpdB>yAqxF+tIUg zkyGVxUtq^q3>qbi58mLNs=v){f##x*N)MOD9e~v?50>v~?3l5fnW*bo?YhAVn9GnK z&yQ{{t!h4~`YH{E0f5Sm}+$)Z7Ft?A5evnqF0MQETsM=9Y~w99aWLvhd9J?F7}>*P9>h z1xweb&yo}l8OYbW487a8URr7PlpS4mURZH6Grj}uk>PpieDv=r;p`8BP=Db}zahx! zS^q?|fj|CU!$0D#)#T7OT`xQ0eVQPA+wQliz2bxW*;thj4|aIq88X6nBw8OvGWPQW z_hLkBRhPl+aA%Q54&jIzg7cC{Eym3v`|0_RUKsDQn((Xm%4qIn( z%)H%k(sADv7zGwj@I3+iAc&3S|KwGMf54&1?7xE8SeSmC5mE|^Ort~T?qy-2-?a6Q z*02+EZPl6t0y{=iMM@~y;^U-?2Onn#)2(I9ouyK!=|?c%ZRw!uI{;z5od-I)aH7b1 zcS0My7_eq@6Cq3&uR6d;iu7<^Qpa~@!0#xeLU#{&cRvDuwThM&gA7EZc(l!}L76uu zD5f7*I^j~b7$?bC&V>1R+=(xLsuw)xv}}|zfrBOvmj4I~i{CV*sT;DYoDP%Soexg& zRjMRb#A4?AbG@{r8nY_@!i`BO38PhJg+s6%?*bFzP;nfogjo7RDGB>hy);Jev;#3L zb+~MKX$Z(yo;js9kWWsw>Q}#V^Lkb{Gg5`d#rLhYvA3a^@E({MK)``#EfYhXuU;9j zyOVSvcmlLS!Qn{y!ONKINr3C?1jf@^uT(O}o0sz8K+KW58(5Z??B}Ct|A*MdsY_3DvsGXKPKOWnFlI z^HsPq*zd;ZE8?E~nP#hO0C|t+>pIaAZj;5&FK=qjVw}<$d<@`%%Me#4b)gE*Du zYM{x**KQl!q&QJ>5|7s!>)lcLgl-Hr0zS6y&a0Gu|Hr6o;k{j?Vj{!`!Hs;+Ji!T= zvt_w$=2*cN`&Eu~#BDgv__lBHwUc2!fE)0DJ!8OmOkW1^?xeW`Ieleq3l{4wsX)W_ zGkD9czV}v8?_E0j_(`+m`&iPBPJN=@c=RF7XfthXLC&avTxeQ_44oGo zOof8-o)~%%g81_o`VDD|k@3g06$`KfZJLF+8&M8*@?a|8vW1GOV-x{_=7^RXMuZ&F zM2k^->8g(m#*D^pyueoI9ny#;;e6>yDg9$6!2MP0df;%$L~=TLNL|A!`N6x7gz)XE zmtplryV%n4$hvb?E}Qs$l7UUMC-HcTC_7vOQP&3L%ZJdjDtRtd>Q@L-(0o)?yi;2O z`?3uroP%R$>`@jIB*uywyOYu?2CgAaPNfwi>bvIcu5Yd6S!N0(7o^2ozqU3`3++=N zI5{*hDW<$>eMP9^q10oh6FpJfh))^-j@MamLs9?XaJuR$w${Y-Ok0<_{)wTFi*Yi^ zh-$$c$G#UM@dyU>2~2R~XAX6E<>O56lrFyj#xU1R1Fm3OznQ z)#HVG9xP{=Z}9E~0kaaRYfwKrA_km36Yeb{V&Jk18271U7OjCRcE~+0@gRKi=ck!J zcw6)w?N)Xyf;)FEslc**f8h%))&RQ zK&@i=;)R*P>^$*=Tv3^^mnx)sxn(9>wW#@0y4v2Cg2PIZqOndB4p!BML?H+EvhP;) zq)a~4MFmAkdA(~!rGn?9$>pJ+py9*3mLRlpanHM`Xu{L57#NH{P9i8}!Xwg+m(Du4 z!XuAzzIio~Sw?$HCHD-y>3-6*k6>ICYp-91f1LK2kHQ_l`qEU$u2qowSJ^ z`^-X3g0t3HTyTFfVIkpCgtFDeR3UxnemH#BTBMZ5ob)kmZC*n@ z1iX99_aL(Fdk+VqSjwfXcY)d#S`xc!24n) zEp4|YJkAU5eHJn744d&i!Op6l7Cyy>r?Ee6tziR9NBk8OcRa~6pN zPDb8Uz-G3!mfozo+&FCBFR8p;IX-A&&uTDwN$j$pUveGc<&>R|_hO|f)tSb`F(CUm zhMtU5&txyN7zS-FxwNd=5MsRX8#H1n{uYiVn&mikeo)=$Dw%ZCzBOeb{ zT(a)L%a0;p++)Chc5v;7vr_V-T9H1`A^4m3$>GZT@h8@pPKBT(WGkY40h&?e@gh(y zY|0dJYAfE7fw3)#3O4BT4OYrQ;jyVMyOb#VpE(BaOsfao3=m zjqYIx+fQXS9#|UK=zayTF);rLMqUJUsUifRZ52wxNm0B+FGFB5^?n0{U2o8Pg7w0t zI!smRHS?W&eOb3$lpQG{Ss9fUF87KE#hP;xJxmz0#G8GpID z1I2+Yq$o7PlY4CUFj0k{+U~d1g&&k`@}ow+*9HG(Ua1$g;670DrN~xykegHrj;B#=OsU z_N>NcIIj4G^_pz8wmynPb(C@hz0kmwLTNskziOjrm?AS*SE07OCY2~yjJ*9G2(JfV z74KQh2VqCdbWDFc#(%h!d zty!9*xpO#_FV%OJGJJFp(^k9Gx8_pZKhty8voR56%*c5CRk8f#*@f#^;ejZyj3rz_ zvqj6LDe~gfD{EH(^yOK_qM5COQ#%;>~=Sgj3ZENhLUx_EPA2exOl?{e`GXTbIsoPy0c z5E7@2LK;lEcw2BFM@wyizu)2FWBJz?|A`mDbL#5b;BE7nv5`?$^MT|N<%;>1HLtU0 zz^K&kNC&g?gf@9%wl))L;Q zkTC&jVK{JKL~+$*w^W|~+-_!VWYj#%ePX_~7th0U1#9lXR@1~>8nvBNGMbihU{)`F z;gp55%Tttj4MrYKHJMIhYejyH2?~etWkFRH9?7*0$g- zZ~rEK)2xlgz*xPE00tI(0y~}jcI%#$@*o89S1IK;WN6T@{Lg2C9n6Z^brFL>%fWx- z!j8FKX4ZNW9p_kzzWC*_rYsQ+mYDo4t}cFYP%;#%!0GT(WHoj{He%GFY15%9+%-$V zwGZ;5n)nh_w1g@lEYDZ<#!-QaT||2t^NZa!TFvlR31RQFFZ3_C>Oa#RDHZ~JwNKnG z44k}s4@I4f-*d(-rtFUzI6rS@oXZ$El>FDN|F{y9Uk)uzUbi0QUbmgU5K^Sc|D5>k zW9zyhu41d{;!ufOePV0{#BBTE#8RO~T<^#}iVMN2{)eDXSsvg!3g6H(_jvrPv4VJ> zwQ$dldFpH{-0fTQO?aIlO86s=-Q&Fv!eSZe|5gtf8U6v~@K;zYBkPY?Y@)jJ_q|0| ztiKIBctB3h+uB;KZ$O|H`Nwmik2PcaDXbqvoY;+xaMFg#xV~iREum472@CR&uXbl_ zzzZ*s?LJyFh;kpp(g-A#G|XG<>FP!%U5#~#b6@Z&VG|82D$4Dd*VL7Rb$#){zoD{q zSsQ;6#YYkWsj$Rv3BP(IE%)m#3N7BkVAA7*WyIxCsHk|Yr;6sO3QJli=eq@AbDnu; zT88;V{`zs9U!Hf2YpOZ3r90Q_A$#yBJ3|tUP%7x2SghB3b}1r{0qn;cV_+{2eFyvt zRvFy`$BuA#5Luf$8x}rqbv6{N_-(*cE+kD`$V^KdC&raGgx6{)s43%DYjlWFrmRGM~Oib6M>Tz#NZ;*MNg8_uv+{iI0VCp8Y3J&pWLPmx$o*d zoD?jFk7gU#Z!e!dcM2!_4y7v!3#?h$CX!}h${MRhW~}e5`SVS_Mq*B*=PtZnMojoU zUh^RI@#kLi8!{d}+mC)TIRMi6Lh#l#(w)V61>J3eqKsk~bm7H-{8kc;+wQdaPK?$P zTGwei?1dgBgJ|CRB5I6-Irv;&H;jxpIp0Au$L&_5{oLKKAUuuGB!uCKDuvw4F*ofS7pIf6l`u%I06?gVL^;Z+a#`;s@EJD#r;o%L!eHzy-Ds6jZPsP8WgARS@{Qnd_Q0L2X9}0 z1@bX6|JW*#sQw+~3$TZN0s$U+h6z=oC~^R5LF68nHs(lp;!e%E6*A{;!NTa482#dd z?*zHfHdrFv2kbRp`cA>hhHlisOCp0o>Sj0hS~c5YDYXxVOT|u7`yMB&yLmZ5mnGU73_47! zI8y-Z=d?aJ(6AI*Tm@c-J{3A8>dJ-UrmslLVNYDlpVulm=&Njcc}bzA2>)&vrG+|G zVJ;x1_3)_m{K&#r=I9Ymr`t-J?NLQ%t#a4VMAzbYlt%jF*sP{2yTa?j)kP{&h3$Eg zY8zODB@|U>f9+(Kv{{^}TIVKM8+Xi0$MhMS@){?b2)>m0cY2W@Y%bEIfWB^in-qjB zl#Vd%0(Q~z@E7PIpBaw1cftS=D;JMRDq+H7mT8VGoW*Ig+^yO4eR&*r+k44*XJZNP z@skIki9h#~-x8re%Gdr8p&q0W)|g zS9J^#A${+S)L4cXA_!Cq#05VjsWlS(B4Sp}lXvmDN;26chfWhysrfTwM5rXA zT;t`l?4cQc zNx0=5HEKP>UkODB_wHl*p;mR*3*MGy3PAh78LG`1e%%1#Ta(AFRxsMAT`FNN>Z0JL>K6rX}$%&bp3!K^n_&X`M_&`{@uJ%TWiHz z@HR!4#V)$u@K1qh*X}aHa{k0^qy%(o@>60{4Wfz66NtM0F;x?f-am4dBtr?nZ%kP? zse3sv9?k?lT?#SItE%swMh>oj^o5G0JSlQEMY-?G&^ql|H!ZN#6YS}2c+@>1`XGSw z=YH~ALiESShKcV*^m~Yg=-`de zlKo{M!_Ig>g6$bqfyPG_`E3540M4GvR(c{L#}^_-r4e)i!{RB5KKyN>)B+fN7clu; zm?4Tn8Kde7&IN~EpYp?$l7`qu7BRN+)a3n9lUIaAN@^l1HyL{hv&XHhje1 z_qgQ!+<^6D_`Qhd-16X}NV1io*GOtBC8p$aEjB`k@_jCICn4v~cV4a_O*anqS@=GW$h@`dE`N*)B;mB`z!^6V3eWG3}>uyYYjO%S6S?$4? z@-do-ZKyOZc|;o9kb-xK8<|rXH?x0$fCxzGXjySKL6&m0jJF$A3{B57lO@$?GD}A^ zg-mO6`znCKiqjIH*u&wM5(uw?0EKlix}NrBSC1!LU${ZE=p)@m_vs6dXLkiNUV=c% zHZaI%vA}y==0P~@&t2wsge&`B?Rn|2h2=O@B?yQqXW5>>Q9{*vuUzw{2*ZD7Jq$1B z0szXtO}%eJ)RolI@lOqXf%O3f%6Qg6(9(GGs$)0-A#G?uGmsv=?71&jIhmfDT!G_K zc2pIvY+U~Qjs!INfSw6Mf?1aGOnH-J(xS#E;LTpT^4l4q2_w?2fd9@;XN7yyY;gY)3IguF87LLTC7L>x$i_d2)BexuP)|)MWMfNGB z-(!OZ!M8uR!9#by^uGdc8CiZ{gbx0F_dD?12Zg^O7?V19K1>k+1YWrMj@IP%cegnP z4!h`I=&KryilIpMZB=@oxt8uMFwFO0lSyktql8O%WfN*{6L@gOzy*ls)iDh4$GN>2 z(D1Mj6$TIC)Rszq)h%q8kXZ(LfE`xnWiC>_(%40>_F<%BLk*y05|U?jI*Vof;?jH} zUtM3KTy2t&aV!h&Q0-oC$;I#Eviniqp-}I1r%<8oPIQkta4W{?Xm6w;0FrQyvW%5N zSh?}`R!kHNnw(J8` zIn41B%3W#%l|k%YRV$dGh#;zZWOy8sI)^D8gzK9`7kJKB-GZhe$KRf|N^x|j^P%g# z(VP~g@#-;*@Myxuu%p|g8K=#I)6bSHDr=8!nXQBWn4NL6igp*=tQp;`a~UeJ&VzTE zFhkq0U~~8OSYo`LV>$9D=C4m6Vf({oe|HP-&;8|h#4OtnH1NUqT`(Prx30K4ChEHt z2tB4?VQ3*IcOW^Meo01mTuA0k&FBe5gW`YR{C81}V{b$b^#vCO- zY$;|?=TM^uly~+W>tJS`@F!+Dx1C{&%${6)e;R!<&xQ7qE&f1pdTK|0RPkc0ebf-% zRr%SNyS9lIE1xYoykaH$;?p^y#Qfuh55YunYZas>1a!8NaCibNfytJ^3j3VdxPp%o zk!~|&fbr`v=$wjk_XO*Mpe3gND~&psfy)=Dthg2(2+ku9fl)J`qK+ zeE0SS_~ne_g;{6#Cl^K1(q3 z6_jjz8@_CRRE*0UoJ=m9$}no?ET-@%qna(-U9^K-wiZkc<7Kslls%o)R)Ij%{GMw> zddh2x&Rq9T5rJ#aZ%+^2S&VJmbxCdMT_l#dDY9tf*8$^pKn0jKm?bAMhg*5Ec9(b2 zp{xo1$@H13!IT`bYE$RB-lnm?%P$<_`qbRwEm5b>~U(Y4L0K`n1bb(NOl`{IFZkEJ(Usd7@phU zUhQGdvmXV>KOe1m8u!<`mk$d7U1na9fYy2962b~H`JOE_{ey6*pS##^h;IhQ9|mv^ zKK*-qH&;!OK0(!Z^2y{GDhAWrFF*q&G^xFKKUV#l$aR^El+^42Y5PAhx z9yA}hV@HO#=e}TE>29IHGH$R#@pXleWSEOaun5%`FoUhI*#HwHr^k-C?I}={y%$`h z)WdPsiOaK>G`d{@K&P$_D<&oGg)X4gP^5a4%|z zO}-ELu-O!e!xhwvR|%i=T)Qv@EoMmeqS?aj(1>r_^NT4k{a1}QSmhabdeHLR{>sbzQ)mUr8U*H8P@wPA(KXG)AP!e-G&fB z9-A*FIv}GL?UE{xT|B}kNz_{bW@+osl%M+xcy^&anh?OXfv_7-4?QqWAAPfr$+`A2 z`+#@>_Kk;Nf^~Zi6wk^~E7H+d)D{<{C9Tg!{!vG$JRgXd${}3|igQ+GdTS@UH03CU z(H-tAZc){&>?0>%EaOl1q|s=(FdPIpck#o;;k1jEOqZQwgU9$^m$0NRG*u<3AF`S@A|EbxQ`YR(V%=)hxI0~8FENV` z+s+6;h|Li^2`f2AjN7=wC)b>zP{G?(YuIVHhFrDW^kqqr9Z4RcA3~SZWB~8&!``ZC zJ>Bv{_Pi8c<^oF$ReE=i4IYGFF|hs(zXE;s|J)%#|1128f&IrwRh+W|9m7^aL!>$Z z1TM(gHDNmL8(HJ2`H4dMy?w@^N1IfyEqL5z{MkMAF+)l0EROd;4(nX*Jhqvb-PFlO z{}9Tn=oTAFD$J?#Ffnv|^>RM7^8b&$w}6VP+5QC~SP1SA+#$gNjRg-79D)ZA5Hz^E zySsaEcXt8=ZQL7ohlb!VH+M%LW-0-rRdrI=Jw4qG1gimeMs_mn!Kj8%G}>Ecd; zyIIU}c4&vv_IkF@)|GablJuW4W9H~k@<>bs2GGcH+qJ!XfzHblraBx^2L|h)K1-L` zP;cCmN>HM-MV;#GDP290$6N;64UtQFss~2X#O|_WlHOPEeaFFv%=`6gSS4eO`=6}z zZ+W2p{Yw8GZyVbW>hVyN7_tuuDn!mKsVU?ALs?foO;UnG;>X>$FIrfn+S=Q(bQ>XY zRz;7?xz?D6$=`GD3!o|ba%G9nmTLDuu zAuPth408d?S#oSW)c@$*4~1|X@!P+iXy*To?k476x|@E4W*@};qe`T1Z~Tm93c?Dy zg(xj1YV~8>h7f93Ldufpr5`BA(*DejIX5mrWDjC>vO-V6IEyTWjwt)aeROia^}F=j^FBRZ#d5)gTjE)E`bWG*i>?&Ij<7LnIlQ|@+1*^2 z!MC8|LBjs*rG0(Rj+`k__@Z=|a^RHYmIzyv9c0sOY`_jD#Gn0Pe(+|nwm_jBI{LW{ zGz}FLifAL6abvMbWOlhfJhaXs_FaG#73O{L2%DxPUj36CC=6TY)<$awS@k z0s17ZNg#qju@__9gUS+ybJV}CF2eEGGW~ZpReykgAB?M^c#%N(X+w5&G0UkBCmF$g z8me;Ket4){2!XGyHEZ5$SSM6=q3IukfOyB2B8jD)HS_`NiKgvi4j#O=BWS2f>ChV!0Jvg4I+qT3c z+w^yNV@tg(i2e|IMeyDR_)Ipfhc_LHA`VALM6BNWG67;tX(G;)PSDro>$`3tzgMfa zw{XO655ih45ZK6yi$8fsf6KS@>T&zf|5NaBvi=7oAM>x=OKj{MKj38d=LgK@l^}#= zBQt4cb45%I)xOEm0R83IUy>lZ`7*pC-H9L!!Ed)~Ydd{{j%`IwXL~+R?e+}7M3E#V^>N;rN z&vk5iuGu1L-TVf8+Ijlz@bs=11Ogx4V|*W%2X;B%S{gVQx3lLl9S(2fLVAz}ba8}% z?W`-b%!uslfj7Oto4m5`V^fCX@7A^k?1_OWb$eAC@qwEbl7NeJ&DPg0m#~l5+xxg( zd8m>u+*1iLhPsc?hdv8IJ$4@xUs8{zNC3V+0x$6UKoaWF?#>QtT8bZn134`%frK5veHxU~P_)C~BC>-*28zs#EdiP^ZP8C}rYZ<9hP^UoVA z`yMbjMsakI0m$5`WvQe~0>Hv`X-d;K2YK;bcjH^ikJllFw|cwpE`~tyZjA*4lcPf8 zfSidd7hL~=rlEti`kThP%f|$Ch<3ctro8iWw^y2zrRL(CafV4_Q+BWD*yQ;@h{Sf^ zpOZ4XabV>8A1CS z5Ctr(fFI!_Q)<%kkdHAmr+F{ov>-|yREjqM4{qq)TajG9tR8a=TZ0m`l(N*S%I}tL zd)o&9qAmoP-{^M1QP)RPHZ?dB?OHa%IA3BZeJ*FPD+Kx`Bb$={hNl*YlYKI&-bLw-41*V((wON z((sPxGTFa-DGjM_H6f%$irtI+*P8t>~Fvr&Znsf`R;gU_3XUoBi`lC z=I!w%Aq2b#TvOGF?y|^Q&DMMq1YqA}I1cV!ZN+zm<~6%>G|n54_@F`Cm_NVE$E7A_vQl^>b!Ga%9Sw9L^W4Hh4S ztsz)xhlIc&sS3Li1e$Agw;GwM_qe(tuX+-eEaD`VKX;!78)J{_a7q>7In*WOMs~aV zRHY~lOgh!fmX>}4m$$%%(VN(fH>*g38CMhIiX6FX8ysgAiAoReaceC)7GKURa1S>n zM*@v*T z_e;*N{s#wNJ>4@dMV^Rt@nqr)7h&xcvm8++ry->&qz z%q6xQ5pecnfP1^6$S&!28KcO6InTFTBZhF#5BNV58dgJv{^|VhG$BI|W(Eq@P7Wz^ zEkynj=W$)^^RvWmt(%X@OF6I2Q>>AD?MlD385_8@RPj94U|(q_@)@u#Tu$hkJkUNb zI|w-%2dt_bnbp<#AKZ=av|iZULg4JJ>^nMNY+YZw(ZyHjyrm14VM%)4R%*|_cSm?! z2O4Ugl>&3WxFQ%X$TfO3^hnHfB+H;zL6h8v`soZN4_^%&Ul_g$?e$nu|1$6Ps^|Or z&^CSxgJS5e`V&s@TbZN3;sk$#tBRHB$K25|HRZg#d4l z(%Vw1e3F~qL-5tD?^k^-Uu04%^9!daIv4__-QC;OxrH;ET%h#k<*oT9BXASh6>T_1 z7u{@)+cY|i19%rpfl^cK?!D7HtDhyu_iPr-d6OmcPF9B$TiNh><0aU`PjdRiqT)}o z`|OiqsB*-N zEMv+*$&yOR;A7h_TXd>{bvvE6$ZgZEdfuZAb!+fUx8}JU;ppvpJ-&UfrTcRf`}T=W z{eEqG+#X9F#Q2wB@J{04a5?Bmdh70PeC5`$jiY^N-rZ?2jVQN@IX!ca(M+CaO=0$I z{bXnFH21l#i#Ll7Bk?J55OO28(kN*mIt(j%5pc=?>=PX`_$B z2M9yg?N+BmQKnBXtykgoc7g719UbovPU-9QdM|(*8wcYy+Db)xSH*tXRb2ar#CcHF z&6lo;JncxyFC9|vXP5Y-di8L7_pS!+lRNu&+1Y#uh5a&_iqs9MeKXOzYO<&cTj0%4!A#I1HY9j{VO)` zcSx`ww}(9#ll?BiAY|Y3XO_G-`kVy%r#uug z1HpURH$)qo_Zu-Eo1MmK`_0a2`vLb2c58q@D{ah;C>ntn5^+?@0CXYvENEG;Kc_#R zjZWbh$L8x7Yc^$#<4+MOGV|bu{xU1bTOO7XvS;!*7zUW4bMzFD#ZV z9A=KD2CQQ?jIEnM6`;l9B@s?VJU{JjW864|Wr=&p3XaB~B%L$=X43h8*fRT7+BpZ{ z$8s^#^HvxlnEbLvfW{CP3}m+B2fn1ZkD_lRNp3>NUe^%i0(N^f@(gO2|DlYo6i>Hb zDD9;yR3$0x8O;s0vlkgXSGg78SUYfHF|YL>y5~Ug=UQIqG)vqB87H|b00BeEca=?i z2gGS8;qL9B^I9SPpgVuZ2I4FATHr-|-N~9mO_MV>w<|ZVyJi|6@yaH>a^AExZ<8Kf z!a&{-pSj7n{@kIxy^R0(qtqK9AvRl>h90I5IbdNh-!f0PpPwb{@incs=BaeKtWH_> zbG{xYMUjs!5H{@PYy6d5&=Ep)Y6aOG@%~S`g-!YJm;KMz=_~rNXy0T957u zT;0JV7WXIFY;N8^5pcg*o#5ZIgug?;G5zSS8JCii*TxhcJw})GLVZW$=F<$k3LlFR zpq-&V82PG7USG49*8Swt-GHD4D^Y2Spg3+konqj8x`?m|w4s0gT<_Y-_Tt##G%bzj z$ee9p%_T0`oNx10dh@Gq7x6_^Yc{oYjJhcLrB{X}~dqbr=c!R+X)NN*+UE~cHjFGn& zJ+`nlsZ5xfMgbCVgEWi7q=uE|_l^h_)ZG%Xd#T2aTV_pWi-GaI>{l9ks+B3ZJLc%i zOLtFDJ~Wp9YYJxht+EflQqg|5U?Iz|3O{hL{E$$7Ff%VbuL>djXsMO**H`mjJrI|q z^2>xjAGK>$#FHRLL;1EgvG}oq=`oMI%H3(88~w7|yepBn%lLh0J200CJ9q^gut_~V zKWWEjhO%}Do1pq$iqpidi-W;`#ijq&>Qu6KoXNy)uM70;(8&I_lE-ZpQXauxX0Pk6 zeiqm}vJpIQ^9et1B-bBBX6c*E5^}o;!u;B_rF)Zl$=1t-ZkHa*g-2C79Yw|*1E!PFwc2`zOkWDP0rY#G6&_ zz%4zvX;X%68;Cx*`?x=**?)VpRORcI#qidNt-Bjx>GaD1=LIqkvY(>Dv_m3v3$ z8;(P>Tp@-n>(_3%^-A+yn-=O&#BA)n@?6Q?RtYFc!D`YlCAmJi0lCzkD0^26Dw^E( z_wK&Q>^y9e{%GYX?k{oO3cLO?()wKCAeJ3Cf5HKNt7z=6IKbZ`!+r$Bjj71}Wu)O^ zcgSUBqt`L5-O1qPe|Y124<5e=8=0)aJEpb1uNP&eQ%a%pZ&UG`{N~ncX7AplnNlpH%x>Vw49W#08nDRFFWMgHMy#IRT{7xg*C~5Iqvb*eJ?oPWyNTr6l5FScf zYhxEjkktlBKkFZR>^H2_Qo^2x&jdv-wrc>5w^!d@6F&a?Xz)H7#wv?<4z6q4TV{7? zdY0A?^#*P33#RelS&`Ut{VKgG6-MCaltRR=@(-^N!HRi1$K**%V5PN7w3^rH!hX#xQWXahRs!OO0JXSB)Y^g;PGyRCyBW z0f;7*N@16U@V$&?Er=d@uIsj~K0?3`U(h}#gddLdY(gUjVC?b&s1Zq?(`R4NJHrTS zLco`HWXz;MkweneZgo3ob}b8tTf&?^ZX=;*9}0@SL2wAUWTghCGr0(i`8$wBzgyCb z;0(21OqF<vtB{N;n28_iTlpWjBkKkyn}%DfoPCW z2G`+@9tKKKI{~+O7bbg~1=3ZwzL?_r37uQ0XC!=#Rv1szDqRU!kSC=zO{D9XLRc~Z zUEJ!~_3?`*h;3)oy%Y&PLMlK;X1Bl*XNrRWUQxR_`ub5Ocri0iTDdyD7hJb+SYHxh z!473Rxc1x;@pj17i6?bKi-pe3>D)0?Z)@$;x+t5K)BtFivIBK{I~*9!B? zPpI&>fW`lw3jYQk%FOy>rTmG$T5l3WhIqMKBX~20-*&=Jf|&T-dCm}e6L!D74qF>ac70giJ~SUaDr;MP zS~Z4LanC#9Ol&xWwrT58YxV@de4usNuNHe&#yzD=a5>x|&0|hLTFAiQvut|mZtAeW zuNYcm+kr7)?&$J1FISqKMjM|Oh?~=A*Q0=q&)X)t+@Qo6D*vsyN6s47DAr<^jo-jL zS?hM`5{gG0iRULP_*;SZf4_pitq1=q><(c5Cq80o?oEQ}yJ96<9;9JARJ;GUf~g4A zv%JMsXr}QNR=Qu}uh&z8-{%xQw!_%4b3}1mObMPOaRgWaNk3M+9OAF!OzkAKAJt4= z_4l6Ve5=}fHlEO9xmH~vF3$`1Ibbcq&T=0P@fjEHCPUQOI!7i%;>|88lMa&K)PmfEMi)?6v|Cu0g~!gdI-c@^Q_7O+g9ofagFx>WUYc%T$6 ztyqvNiW(U(c|KwbB_Reg4cWSVt%q}~1|Ap+JB-qaTB3uZ%hfFE+viCwxlO6Fi1(J^ zL-h&Cun*p=hLcJ1vb9+|$mvg6Z{$tjLwqQ$oAJr|5OD!A?Cv_jm&b)MIJ%x+u>Fbz*Oqdqrz`~3Po+(||aS}H^Uu3yS-4E1TU3+F+jilXpi zljsvQ5rn0%ds+qgLN}ylDze6B@1h`~SA|SM!0W|lJ0x?y)c#0n3LNy(9>-b)0rW5? zet);L-Ye*M+&+f8lNF&1dw3CD&Ei%gxg^T!CI`*0`EoJUxEjK4}?z1vQi|PU1A_3fp4N9!o8f6zm zq6wWy#+kzG!6H2wPymg&^p6L1G`4MA+vKk&bzDDS1F>kc(E`=kp5}8{ zehK6vTSjphiHYEnN|78CbPCOTu9SjnJKmCrG!Rj@HhAh5E3#QG8&}?t5mDZcIwKXq zJoxCX?3?4_#=tW6W7py=+U{uoh+Ui3ySS3*2KnJ_ZNi=G<-oWFHFpspAHtpb_CPZqX|mIG<kxTwCb+9pK8MFJ%ErhNc>4D|&owC5!mVhP1q9&5+Bnev{gb)ki_R zQ^if51E~HKb~kY;h5TCLornvYB+0~M*g?@8y1>m>^9t??`t2PO>rdA3w<1XYp7sB> zit(%X5rE~NRE#~V?_2uxMfp(3@e6&rxks6+!q1mB2*N4lv!Yt_fV|^y7W-P6{n*&E zKkoBC!<|5>VU3atvg&7z9Hx;o^@nE1q-{4G@UG4>jEthKDb(NzA>FguOQ4<>{CX^g zx3=+;^v<&anc<{O*Kav`Sjq?Ri3HSPxChfyPDqU=`NPwEl<_#In}gfh8YTm&cCONeG`(q;9vkk3mY**+h4SAm=a%6M8oMVS+G~vX zgnnDX`h?pD&p{{D+b24&!DpNuRyve1QW@;CkC)(px2l)A;*fbjppABlN9hN3fZSPy z9irafO<9DSgc9=Rxx_Qu1@w{u!_&rxCxeV~RKc{$E!buJIl)Y4UGUtDT??`W$;uRa z)7I<^kk%rTWk-OTv79Zi+h(nC+l>c!-`&iJ6JDQ4EIG%mDz84!w23&bUL@P4y99(g znzo4Pbg;?#g7&c)v0p>3c%Vi6gyMcHK=JP>?r-55Ke~4(G~&I!D;oxv=p)SWbnR2u z5AMt-DfA$$&SZvfXN!G~Z()I=vM#4_5GG>*^_dV)*8pu0`4LeVPy5!yCHy>MqNZUm zl)Xq+RO1;Do|MI81T?ed>L&~ou(j|7RJ&V{=;`_oC?}rD5H+3%E>Yc~!13oIryjVD z@j0M1?noOPg@(9iP&0Zc_Ndxl@hZ}78n~RDk2c)fSvwOM84mZtO(qN@D>nsS!Vqso zi)qvu7yvX54Eh8iGu2rSq>ICL%!%SUi3V~o)4v4_Qb!n(J+!`Heps=HOr3t>BasLc zOi$6f6|M4;s_U2<*o=Ni=F)XXaQN4&2lzebJm>!fqhezEUw3W*e&w8JW@r6z`BLGn z=R{F`M_;|>M}GpU)Q}^Ng}oOO~|X{Y#zy&bQ%Pw@y2gm8Ge{p40($kH(q(^i$i zD2dJcX?%Q!E_x5#SJ$Ycnt!)DbTPCex<3_j*o}&m|9DNLXBVLgBeB_-Ch1Yp1Ia+ue_6?klcmUIE*q zXUPeV2bx8}G72Za-CHUr08h~4bHa79M8-e=b?N_&t|io#%`2zu@Z1N}^fLQ$1BS1H zt#Xcq`?f7N$b%alm1i$qn~pG$o%-($TAKvL`#1Nzxz}GpIH|}@j8B#}Uot{2TDFJJXJ-(_5!JwR0sM#J#@MiF?@0=OQ$@uWpPjw`2fOxaq-)LJ^MiyU{iWyii$e2Ik2+lT^NMh#4` zvLq`g7P=2y1Wk}n2r?&x`h(Xwwjam&=sr9$dw_CtyL??xwg5Lr5ER0OK*%^Wzeimag}44utkyS<_>1zRM_qiq@Y* z+eRGPAl|TH9P&f9avmITWuI`qT0{egTU$_niXMHS4V!xFd2O*!a|T1A-E#sq0P6HQp; z4H&0C^Cn$XzseU?i;6}vR@pY1Tql2a2};r%YZsNJrgoX(aq1>=5?FrOHFN%L$SLp$ z3k|JO5ST;6bJI}D)BPU8ZrxS#G2Mi41Tf5T9zyIYcIRx z?kT7Ha+!v4?{1+BZt@%0i0UGI<`zX#VZyf8XZseUXwTH=2JF2u&(aNhgU^NvbEMdZ zSTT6GR_~DwN>`i~b{fYF7Ac@MRciYC^;i%DWvMe^c{tU-y5Oh`q<%2OV`B8FznZHb zcLTBLb?`Jj1)KrmjYjZL{X#q9xab84@3X5_rQ+3g`qC8z&TcI*&v|pUSE7%q>%R0$ ziy8E%nikGvV55$hZ7CWf4lA3fipRN_4Haw)BkvSX%+=U9j&4b#T0ue6gOc-WBFAgSNa{U7)KH24jtl42*ysmB<*1UFVcs zq{u@VSx;`pt>71}@${I_(A`&MWP8g=dV*&i};~T0ezYzCoAWS3p1Jd_LS}` zespJzjy%N;E-cpb^{Yo+0=|j6pFXG^dLjcmF-GMhpeQBWGNlxkf;l27@aG9h;eT&aGO7zt)E_U9-`j%-vtqeYKIC*pw?ii*7VJKFuNZ-b=F~W}HWRMGP&L zi!-lkMg7Lq(m68VNaoY-yj3Fmh3Mdva)t~Wr)}Pbuzw)tIr79N7d7U#Es_KjBwxjv ziSw-HRFTrG+mysy@kMq()Y1CP8#1M#H)TO{2uM_|Ds#kJJH&qRkXP!{30Bi_Dcs1; zD=5M(v8snjD>hQvFNbsxEHdfpYgHN>V3315gq_pOaIfjEdTTVxh5<=FHar9|8=5T7 zmj-I3=4;g{BX3-#k*1|^WhX2P3RuXOD6OcbBUNPc;=Q$ba@2^O)#6Q`qf0|dR~VW{ zm!~}jx$Ti*Q>*_wBYCU0QU-_iW7c+5I{gs%Yb{wNi>rzk_PLUn%BVqCwO(h51 zCu?`#*7`+P#HL<>(^*`Q$Mk5!)Ir4WrZCEvsghV0j`%>zk_9Ye>MDu`kXUwk09VU6I2* zpstnOG23>H?nY6_Rj$1yAX;;w?@r8+$U4yblZvR>j# zPn9&CL;Kr4FIU9iY?F@8rbej87(}ATu65T^(@yVmjzavTHL*pJehvq#sB}A1?=~ z3F@oddtS4&wKU-d44cv@!0fpX5*2H{K`WVS)>@LAfZx$>Fmxp!N5>+O3+K%^2(MYP zCSPoll@EWKH)&H-l_XDAYUeGSoqtgP7tg+%y$C3p7PWhCtr)LGT*RhDJjy_1Vk{l# zZ~`-#E9BxtP9sd1bIpa-NMLOwM;Ecb{_f~jKf@Tzj&|-q$ZC+wnkTfNJ`kuGwc|!R z`k6Pvi$?k#Btu;WMC{heC%z)iEzvS`G_l%bp1gdN&-_F(#5oN%F|%hcjoXeRYSKgV z2O!e{!g=4$w3U)4{G$mWXO?$6hc?~L&OK_?xU zf6^~;pHDOFE3n@E{9@b80r>&o$0W%wRinL+FTm*{;`;vTeo&Ab<`N|I_%n;x4I2j$)9O#+I)5p_|I>S3F#kdY{~JuGR{-`OLpv!d%Ddc{emfDlQd^Eb zUKXewkU}Rn4{iGrsvNtXwGAH>aX`S+&fp6&-ot$=T5Z7hx-s9|avf;^dONDGl1x?z z>l4&0Z55Lu>O>B0#4ncHs0}%}Li_9B4W9CptxNqh&Io}h8Ev1AGHi1T%~ z3pa>G`=SY

rAX~b+RXIEw1>5hom_9m@nBUMYM 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

UX}7L|~?g$N5q&j@9t; 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

J@UwEX%&il!J8cDd3ft(rMpgq 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

+WpZ951?W?F0?W#+gH>a&Gp4+>}?(bW$^-e!_)H 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 z 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

s;;t!Q}-jp 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�JPG&^!m^UAnL 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 +typedef clock_t CORE_TICKS; + +/* Definitions : COMPILER_VERSION, COMPILER_FLAGS, MEM_LOCATION + Initialize these strings per platform +*/ +#ifndef COMPILER_VERSION + #ifdef __GNUC__ + #define COMPILER_VERSION "GCC"__VERSION__ + #else + #define COMPILER_VERSION "Please put compiler version here (e.g. gcc 4.1)" + #endif +#endif +#ifndef COMPILER_FLAGS + #define COMPILER_FLAGS "-O2" +#endif + +#ifndef MEM_LOCATION +// #define MEM_LOCATION "STACK" + #define MEM_LOCATION "STATIC" +#endif + +/* Data Types : + To avoid compiler issues, define the data types that need ot be used for 8b, 16b and 32b in . + + *Imprtant* : + ee_ptr_int needs to be the data type used to hold pointers, otherwise coremark may fail!!! +*/ +typedef signed short ee_s16; +typedef unsigned short ee_u16; +typedef signed int ee_s32; +typedef double ee_f32; +typedef unsigned char ee_u8; +typedef unsigned int ee_u32; +typedef ee_u32 ee_ptr_int; +typedef size_t ee_size_t; +/* align_mem : + This macro is used to align an offset to point to a 32b value. It is used in the Matrix algorithm to initialize the input memory blocks. +*/ +#define align_mem(x) (void *)(4 + (((ee_ptr_int)(x) - 1) & ~3)) + +/* Configuration : SEED_METHOD + Defines method to get seed values that cannot be computed at compile time. + + Valid values : + SEED_ARG - from command line. + SEED_FUNC - from a system function. + SEED_VOLATILE - from volatile variables. +*/ +#ifndef SEED_METHOD +#define SEED_METHOD SEED_VOLATILE +#endif + +/* Configuration : MEM_METHOD + Defines method to get a block of memry. + + Valid values : + MEM_MALLOC - for platforms that implement malloc and have malloc.h. + MEM_STATIC - to use a static memory array. + MEM_STACK - to allocate the data block on the stack (NYI). +*/ +#ifndef MEM_METHOD +//#define MEM_METHOD MEM_STACK +#define MEM_METHOD MEM_STATIC +#endif + +/* Configuration : MULTITHREAD + Define for parallel execution + + Valid values : + 1 - only one context (default). + N>1 - will execute N copies in parallel. + + Note : + If this flag is defined to more then 1, an implementation for launching parallel contexts must be defined. + + Two sample implementations are provided. Use or to enable them. + + It is valid to have a different implementation of and in , + to fit a particular architecture. +*/ +#ifndef MULTITHREAD +#define MULTITHREAD 1 +#define USE_PTHREAD 0 +#define USE_FORK 0 +#define USE_SOCKET 0 +#endif + +/* Configuration : MAIN_HAS_NOARGC + Needed if platform does not support getting arguments to main. + + Valid values : + 0 - argc/argv to main is supported + 1 - argc/argv to main is not supported + + Note : + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef MAIN_HAS_NOARGC +#define MAIN_HAS_NOARGC 1 +#endif + +/* Configuration : MAIN_HAS_NORETURN + Needed if platform does not support returning a value from main. + + Valid values : + 0 - main returns an int, and return value will be 0. + 1 - platform does not support returning a value from main +*/ +#ifndef MAIN_HAS_NORETURN +#define MAIN_HAS_NORETURN 1 +#endif + +/* Variable : default_num_contexts + Not used for this simple port, must cintain the value 1. +*/ +extern ee_u32 default_num_contexts; + +typedef struct CORE_PORTABLE_S { + ee_u8 portable_id; +} core_portable; + +/* target specific init/fini */ +void portable_init(core_portable *p, int *argc, char *argv[]); +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 /* CORE_PORTME_H */ + + +#if HAS_STDIO +#include +#endif +#if HAS_PRINTF +#ifndef ee_printf +#define ee_printf printf +#endif +#endif + +/* 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); + + + + + +/* +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; inext->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; inext; + i=1; + while (finder->next!=NULL) { + if (iinfo->idx=i++; + else { + 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 */ + } + 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 +} +/* +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. +*/ +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) { + ee_printf("list_head structure too big for comparable data!\n"); + 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 + 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 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 : %u\n",(ee_u32)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 ; i1) + 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"); + +#if (MEM_METHOD==MEM_MALLOC) + for (i=0 ; i>(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 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 (jA=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; iclipval) { + 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; i0) { + for(i=0;i>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='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; +} +/* +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 +*/ +//#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; +} +/* + File : core_portme.c +*/ +/* + Author : Shay Gal-On, EEMBC + Legal : TODO! +*/ +#include +#include +//#include "coremark.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 seed4_volatile=1; + volatile ee_s32 seed5_volatile=0; +/* Porting : Timing functions + How to capture time and convert to seconds must be ported to whatever is supported by the platform. + e.g. Read value from on board RTC, read value from cpu clock cycles performance counter etc. + Sample implementation for standard time.h and windows.h definitions included. +*/ +/* Define : TIMER_RES_DIVIDER + Divider to trade off timer resolution and total time that can be measured. + + Use lower values to increase resolution, but make sure that overflow does not occur. + If there are issues with the return value overflowing, increase this value. + */ +//#define NSECS_PER_SEC CLOCKS_PER_SEC +#define NSECS_PER_SEC 1000000000 +#define CORETIMETYPE clock_t +//#define GETMYTIME(_t) (*_t=clock()) +#define GETMYTIME(_t) (*_t=0) +#define MYTIMEDIFF(fin,ini) ((fin)-(ini)) +#define TIMER_RES_DIVIDER 1 +#define SAMPLE_TIME_IMPLEMENTATION 1 +#define EE_TICKS_PER_SEC (NSECS_PER_SEC / TIMER_RES_DIVIDER) + +/** Define Host specific (POSIX), or target specific global time variables. */ +static CORETIMETYPE start_time_val, stop_time_val; + +/* Function : start_time + This function will be called right before starting the timed portion of the benchmark. + + Implementation may be capturing a system timer (as implemented in the example code) + or zeroing some system parameters - e.g. setting the cpu clocks cycles to 0. +*/ +void start_time(void) { +uint32_t mcyclel; + asm volatile ("csrr %0,mcycle" : "=r" (mcyclel) ); + start_time_val = mcyclel; +} +/* Function : stop_time + This function will be called right after ending the timed portion of the benchmark. + + Implementation may be capturing a system timer (as implemented in the example code) + or other system parameters - e.g. reading the current value of cpu cycles counter. +*/ +void stop_time(void) { +uint32_t mcyclel; + asm volatile ("csrr %0,mcycle" : "=r" (mcyclel) ); + stop_time_val = mcyclel; +} +/* Function : get_time + Return an abstract "ticks" number that signifies time on the system. + + Actual value returned may be cpu cycles, milliseconds or any other value, + as long as it can be converted to seconds by . + This methodology is taken to accomodate any hardware or simulated platform. + The sample implementation returns millisecs by default, + and the resolution is controlled by +*/ +CORE_TICKS get_time(void) { + CORE_TICKS elapsed=(CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val)); + return elapsed; +} +/* Function : time_in_secs + Convert the value returned by get_time to seconds. + + The type is used to accomodate systems with no support for floating point. + Default implementation implemented by the EE_TICKS_PER_SEC macro above. +*/ +secs_ret time_in_secs(CORE_TICKS ticks) { + secs_ret retval=((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC; + return retval; +} + +ee_u32 default_num_contexts=1; + +/* Function : portable_init + Target specific initialization code + Test for some common mistakes. +*/ +void portable_init(core_portable *p, int *argc, char *argv[]) +{ + if (sizeof(ee_ptr_int) != sizeof(ee_u8 *)) { + ee_printf("ERROR! Please define ee_ptr_int to a type that holds a pointer!\n"); + } + if (sizeof(ee_u32) != 4) { + ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n"); + } + p->portable_id=1; +} +/* Function : portable_fini + Target specific final code +*/ +void portable_fini(core_portable *p) +{ + p->portable_id=0; +} + + +#include + +// Special address. Writing (store byte instruction) to this address +// causes the simulator to write to the console. +volatile char __whisper_console_io = 0; + + +static int +whisperPutc(char c) +{ +// __whisper_console_io = c; +// __whisper_console_io = c; + *(volatile char*)(STDOUT) = c; + return c; +} + + +static int +whisperPuts(const char* s) +{ + while (*s) + whisperPutc(*s++); + return 1; +} + + +static int +whisperPrintDecimal(int value) +{ + char buffer[20]; + int charCount = 0; + + unsigned neg = value < 0; + if (neg) + { + value = -value; + whisperPutc('-'); + } + + do + { + char c = '0' + (value % 10); + value = value / 10; + buffer[charCount++] = c; + } + while (value); + + char* p = buffer + charCount - 1; + for (unsigned i = 0; i < charCount; ++i) + whisperPutc(*p--); + + if (neg) + charCount++; + + return charCount; +} + + +static int +whisperPrintInt(int value, int base) +{ + if (base == 10) + return whisperPrintDecimal(value); + + char buffer[20]; + int charCount = 0; + + unsigned uu = value; + + if (base == 8) + { + do + { + char c = '0' + (uu & 7); + buffer[charCount++] = c; + uu >>= 3; + } + while (uu); + } + else if (base == 16) + { + do + { + int digit = uu & 0xf; + char c = digit < 10 ? '0' + digit : 'a' + digit; + buffer[charCount++] = c; + uu >>= 4; + } + while (uu); + } + else + return -1; + + char* p = buffer + charCount - 1; + for (unsigned i = 0; i < charCount; ++i) + whisperPutc(*p--); + + return charCount; +} + + +int +whisperPrintfImpl(const char* format, va_list ap) +{ + int count = 0; // Printed character count + + for (const char* fp = format; *fp; fp++) + { + if (*fp != '%') + { + whisperPutc(*fp); + ++count; + continue; + } + + ++fp; // Skip % + + if (*fp == 0) + break; + + if (*fp == '%') + { + whisperPutc('%'); + continue; + } + + if (*fp == '-') + { + fp++; // Pad right not yet implemented. + } + + while (*fp == '0') + { + fp++; // Pad zero not yet implented. + } + + if (*fp == '*') + { + int width = va_arg(ap, int); + fp++; // Width not yet implemented. + } + else + { + while (*fp >= '0' && *fp <= '9') + ++fp; // Width not yet implemented. + } + + switch (*fp) + { + case 'd': + count += whisperPrintDecimal(va_arg(ap, int)); + break; + + case 'u': + count += whisperPrintDecimal((unsigned) va_arg(ap, unsigned)); + break; + + case 'x': + case 'X': + count += whisperPrintInt(va_arg(ap, int), 16); + break; + + case 'o': + count += whisperPrintInt(va_arg(ap, int), 8); + break; + + case 'c': + whisperPutc(va_arg(ap, int)); + ++count; + break; + + case 's': + count += whisperPuts(va_arg(ap, char*)); + break; + } + } + + return count; +} + + +int +whisperPrintf(const char* format, ...) +{ + va_list ap; + + va_start(ap, format); + int code = whisperPrintfImpl(format, ap); + va_end(ap); + + return code; +} + + +int +printf(const char* format, ...) +{ + va_list ap; + + va_start(ap, format); + int code = whisperPrintfImpl(format, ap); + va_end(ap); + + return code; +} + + +void* memset(void* s, int c, size_t n) +{ + asm("mv t0, a0"); + asm("add a2, a2, a0"); // end = s + n + asm(".memset_loop: bge a0, a2, .memset_end"); + asm("sb a1, 0(a0)"); + asm("addi a0, a0, 1"); + asm("j .memset_loop"); + asm(".memset_end:"); + asm("mv a0, t0"); + asm("jr ra"); +} diff --git a/testbench/asm/cmark_dccm.c b/testbench/asm/cmark_dccm.c new file mode 120000 index 0000000..712dfb9 --- /dev/null +++ b/testbench/asm/cmark_dccm.c @@ -0,0 +1 @@ +cmark.c \ No newline at end of file diff --git a/testbench/asm/cmark_dccm.ld b/testbench/asm/cmark_dccm.ld new file mode 120000 index 0000000..ae51d23 --- /dev/null +++ b/testbench/asm/cmark_dccm.ld @@ -0,0 +1 @@ +hello_world_dccm.ld \ No newline at end of file diff --git a/testbench/asm/hello_world.s b/testbench/asm/hello_world.s new file mode 100644 index 0000000..5f2c90a --- /dev/null +++ b/testbench/asm/hello_world.s @@ -0,0 +1,67 @@ + + +.global _start +_start: + csrrw x2, 0xb02, x3 + + + lui x5, 974848 + ori x5, x5, 0 + csrrw x2, 0x305, x5 + + + lui x6, 382293 + ori x6, x6, 1365 + csrrw x1, 0x7c0, x6 + + + + + lui x5, 0 + ori x5, x5, 0 + csrrw x2, 0x7f8, x5 + + + + + lui x5, 0 + ori x5, x5, 0 + csrrw x2, 0x7f9, x5 + + + addi x0, x0, 0 + lui x11, 853376 + ori x9, x0, 'H' + sw x9, 0 (x11) + ori x9, x0, 'E' + sw x9, 0 (x11) + ori x9, x0, 'L' + sw x9, 0 (x11) + sw x9, 0 (x11) + ori x9, x0, 'O' + sw x9, 0 (x11) + ori x9, x0, ' ' + sw x9, 0 (x11) + addi x9, x0, 'W' + sw x9, 0 (x11) + ori x9, x0, 'O' + sw x9, 0 (x11) + ori x9, x0, 'R' + sw x9, 0 (x11) + ori x9, x0, 'L' + sw x9, 0 (x11) + ori x9, x0, 'D' + sw x9, 0 (x11) + ori x9, x0, '!' + sw x9, 0 (x11) + ori x9, x0, 255 + sw x9, 0 (x11) + addi x1,x0,0 + +finish: + addi x1,x1,1 + jal x0, finish; + addi x0,x0,0 + addi x0,x0,0 + addi x0,x0,0 + addi x0,x0,0 diff --git a/testbench/asm/hello_world2.s b/testbench/asm/hello_world2.s new file mode 100644 index 0000000..0097c63 --- /dev/null +++ b/testbench/asm/hello_world2.s @@ -0,0 +1,71 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright 2019 Western Digital Corporation or its affiliates. +// +// 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. +// + +// Assembly code for Hello World +// Not using only ALU ops for creating the string + + +#include "defines.h" + +#define STDOUT 0xd0580000 + + +// Code to execute +.section .text +.global _start +_start: + + // Clear minstret + csrw minstret, zero + csrw minstreth, zero + + // Set up MTVEC - not expecting to use it though + li x1, RV_ICCM_SADR + csrw mtvec, x1 + + + // Enable Caches in MRAC + li x1, 0x5f555555 + csrw 0x7c0, x1 + + // Load string from hw_data + // and write to stdout address + + li x3, STDOUT + la x4, hw_data + +loop: + lb x5, 0(x4) + sb x5, 0(x3) + addi x4, x4, 1 + bnez x5, loop + +// Write 0xff to STDOUT for TB to termiate test. +_finish: + li x3, STDOUT + addi x5, x0, 0xff + sb x5, 0(x3) + beq x0, x0, _finish +.rept 100 + nop +.endr + +.data +hw_data: +.ascii "----------------------------------\n" +.ascii "Hello World from SweRV EL2 @WDC !!\n" +.ascii "----------------------------------\n" +.byte 0 diff --git a/testbench/asm/hello_world_dccm.ld b/testbench/asm/hello_world_dccm.ld new file mode 100644 index 0000000..eea3cbe --- /dev/null +++ b/testbench/asm/hello_world_dccm.ld @@ -0,0 +1,12 @@ + +OUTPUT_ARCH( "riscv" ) +ENTRY(_start) + +SECTIONS { + .text : { *(.text*) } + _end = .; + . = 0xfff8; + .data.ctl : { LONG(0xf0040000); LONG(STACK) } + . = 0xf0040000; + .data : AT(0x10000) { *(.*data) *(.rodata*) STACK = ALIGN(16) + 0x8000;} +} diff --git a/testbench/asm/hello_world_dccm.s b/testbench/asm/hello_world_dccm.s new file mode 120000 index 0000000..2c91c93 --- /dev/null +++ b/testbench/asm/hello_world_dccm.s @@ -0,0 +1 @@ +hello_world2.s \ No newline at end of file diff --git a/testbench/flist b/testbench/flist new file mode 100644 index 0000000..fb1cd8f --- /dev/null +++ b/testbench/flist @@ -0,0 +1,52 @@ ++libext+.v+.sv +//-incdir $RV_ROOT/design/lib +//-incdir $RV_ROOT/design/include +//-incdir $RV_ROOT/design/dmi +//-incdir $SYNOPSYS_SYN_ROOT/dw/sim_ver +//-y $SYNOPSYS_SYN_ROOT/dw/sim_ver +$RV_ROOT/design/el2_swerv_wrapper.sv +$RV_ROOT/design/el2_mem.sv +$RV_ROOT/design/el2_pic_ctrl.sv +$RV_ROOT/design/el2_swerv.sv +$RV_ROOT/design/el2_dma_ctrl.sv +$RV_ROOT/design/ifu/el2_ifu_aln_ctl.sv +$RV_ROOT/design/ifu/el2_ifu_compress_ctl.sv +$RV_ROOT/design/ifu/el2_ifu_ifc_ctl.sv +$RV_ROOT/design/ifu/el2_ifu_bp_ctl.sv +$RV_ROOT/design/ifu/el2_ifu_ic_mem.sv +$RV_ROOT/design/ifu/el2_ifu_mem_ctl.sv +$RV_ROOT/design/ifu/el2_ifu_iccm_mem.sv +$RV_ROOT/design/ifu/el2_ifu.sv +$RV_ROOT/design/dec/el2_dec_decode_ctl.sv +$RV_ROOT/design/dec/el2_dec_gpr_ctl.sv +$RV_ROOT/design/dec/el2_dec_ib_ctl.sv +$RV_ROOT/design/dec/el2_dec_tlu_ctl.sv +$RV_ROOT/design/dec/el2_dec_trigger.sv +$RV_ROOT/design/dec/el2_dec.sv +$RV_ROOT/design/exu/el2_exu_alu_ctl.sv +//$RV_ROOT/design/exu/el2_exu_br_ctl.sv +$RV_ROOT/design/exu/el2_exu_mul_ctl.sv +$RV_ROOT/design/exu/el2_exu_div_ctl.sv +$RV_ROOT/design/exu/el2_exu.sv +$RV_ROOT/design/lsu/el2_lsu.sv +$RV_ROOT/design/lsu/el2_lsu_clkdomain.sv +$RV_ROOT/design/lsu/el2_lsu_addrcheck.sv +$RV_ROOT/design/lsu/el2_lsu_lsc_ctl.sv +$RV_ROOT/design/lsu/el2_lsu_stbuf.sv +$RV_ROOT/design/lsu/el2_lsu_bus_buffer.sv +$RV_ROOT/design/lsu/el2_lsu_bus_intf.sv +$RV_ROOT/design/lsu/el2_lsu_ecc.sv +$RV_ROOT/design/lsu/el2_lsu_dccm_mem.sv +$RV_ROOT/design/lsu/el2_lsu_dccm_ctl.sv +$RV_ROOT/design/lsu/el2_lsu_trigger.sv +$RV_ROOT/design/dbg/el2_dbg.sv +$RV_ROOT/design/dmi/dmi_wrapper.v +$RV_ROOT/design/dmi/dmi_jtag_to_core_sync.v +$RV_ROOT/design/dmi/rvjtag_tap.v +$RV_ROOT/design/lib/el2_lib.sv +-v $RV_ROOT/design/lib/beh_lib.sv +-v $RV_ROOT/design/lib/mem_lib.sv +-y $RV_ROOT/design/lib +//$RV_ROOT/design/lib/ahb_to_svci.sv +//$RV_ROOT/design/lib/ahb_to_axi4.sv +//$RV_ROOT/design/lib/axi4_to_ahb.sv diff --git a/testbench/hex/data.hex b/testbench/hex/data.hex new file mode 100755 index 0000000..b71d0ef --- /dev/null +++ b/testbench/hex/data.hex @@ -0,0 +1,8 @@ +@00001000 +2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D +2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D +2D 2D 0A 48 65 6C 6C 6F 20 57 6F 72 6C 64 20 66 +72 6F 6D 20 53 77 65 52 56 20 45 4C 32 20 40 57 +44 43 20 21 21 0A 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D +2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D +2D 2D 2D 2D 2D 2D 2D 2D 0A 00 diff --git a/testbench/hex/program.hex b/testbench/hex/program.hex new file mode 100644 index 0000000..0e2bf73 --- /dev/null +++ b/testbench/hex/program.hex @@ -0,0 +1,18 @@ +@00000000 +73 10 20 B0 73 10 20 B8 B7 00 00 EE 73 90 50 30 +B7 50 55 5F 93 80 50 55 73 90 00 7C B7 01 58 D0 +17 12 00 00 13 02 02 FE 83 02 02 00 23 80 51 00 +05 02 E3 9B 02 FE B7 01 58 D0 93 02 F0 0F 23 80 +51 00 E3 0A 00 FE 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 diff --git a/testbench/input.tcl b/testbench/input.tcl new file mode 100644 index 0000000..3de45c5 --- /dev/null +++ b/testbench/input.tcl @@ -0,0 +1,4 @@ +database -open waves -into waves.shm -default +probe -create tb_top -depth all -database waves +run +exit diff --git a/testbench/link.ld b/testbench/link.ld new file mode 100644 index 0000000..de779f8 --- /dev/null +++ b/testbench/link.ld @@ -0,0 +1,12 @@ + +OUTPUT_ARCH( "riscv" ) +ENTRY(_start) + +SECTIONS +{ + . = 0; + .text : { *(.text*) } + _end = .; + . = 0x10000; + .data : ALIGN(0x800) { *(.*data) *(.rodata*) STACK = ALIGN(16) + 0x8000; } +} diff --git a/testbench/tb_top.sv b/testbench/tb_top.sv new file mode 100644 index 0000000..d62c800 --- /dev/null +++ b/testbench/tb_top.sv @@ -0,0 +1,882 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright 2019 Western Digital Corporation or its affiliates. +// +// 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. +// +`ifndef VERILATOR +module tb_top; +`else +module tb_top ( input bit core_clk ); +`endif + +`ifndef VERILATOR + bit core_clk; +`endif + logic rst_l; + logic nmi_int; + + logic [31:0] reset_vector; + logic [31:0] nmi_vector; + logic [31:1] jtag_id; + + logic [31:0] ic_haddr ; + logic [2:0] ic_hburst ; + logic ic_hmastlock ; + logic [3:0] ic_hprot ; + logic [2:0] ic_hsize ; + logic [1:0] ic_htrans ; + logic ic_hwrite ; + logic [63:0] ic_hrdata ; + logic ic_hready ; + logic ic_hresp ; + + logic [31:0] lsu_haddr ; + logic [2:0] lsu_hburst ; + logic lsu_hmastlock ; + logic [3:0] lsu_hprot ; + logic [2:0] lsu_hsize ; + logic [1:0] lsu_htrans ; + logic lsu_hwrite ; + logic [63:0] lsu_hrdata ; + logic [63:0] lsu_hwdata ; + logic lsu_hready ; + logic lsu_hresp ; + + logic [31:0] sb_haddr ; + logic [2:0] sb_hburst ; + logic sb_hmastlock ; + logic [3:0] sb_hprot ; + logic [2:0] sb_hsize ; + logic [1:0] sb_htrans ; + logic sb_hwrite ; + + logic [63:0] sb_hrdata ; + logic [63:0] sb_hwdata ; + logic sb_hready ; + logic sb_hresp ; + + logic [31:0] trace_rv_i_insn_ip; + logic [31:0] trace_rv_i_address_ip; + logic [1:0] trace_rv_i_valid_ip; + logic [1:0] trace_rv_i_exception_ip; + logic [4:0] trace_rv_i_ecause_ip; + logic [2:0] trace_rv_i_interrupt_ip; + logic [31:0] trace_rv_i_tval_ip; + + logic o_debug_mode_status; + + + logic jtag_tdo; + logic o_cpu_halt_ack; + logic o_cpu_halt_status; + logic o_cpu_run_ack; + + logic mailbox_write; + logic [63:0] dma_hrdata ; + logic [63:0] dma_hwdata ; + logic dma_hready ; + logic dma_hresp ; + + logic mpc_debug_halt_req; + logic mpc_debug_run_req; + logic mpc_reset_run_req; + logic mpc_debug_halt_ack; + logic mpc_debug_run_ack; + logic debug_brkpt_status; + + bit [31:0] cycleCnt ; + logic mailbox_data_val; + + wire dma_hready_out; + int commit_count; + + logic wb_valid[1:0]; + logic [4:0] wb_dest[1:0]; + logic [31:0] wb_data[1:0]; + +`ifdef RV_BUILD_AXI4 + //-------------------------- LSU AXI signals-------------------------- + // AXI Write Channels + wire lsu_axi_awvalid; + wire lsu_axi_awready; + wire [`RV_LSU_BUS_TAG-1:0] lsu_axi_awid; + wire [31:0] lsu_axi_awaddr; + wire [3:0] lsu_axi_awregion; + wire [7:0] lsu_axi_awlen; + wire [2:0] lsu_axi_awsize; + wire [1:0] lsu_axi_awburst; + wire lsu_axi_awlock; + wire [3:0] lsu_axi_awcache; + wire [2:0] lsu_axi_awprot; + wire [3:0] lsu_axi_awqos; + + wire lsu_axi_wvalid; + wire lsu_axi_wready; + wire [63:0] lsu_axi_wdata; + wire [7:0] lsu_axi_wstrb; + wire lsu_axi_wlast; + + wire lsu_axi_bvalid; + wire lsu_axi_bready; + wire [1:0] lsu_axi_bresp; + wire [`RV_LSU_BUS_TAG-1:0] lsu_axi_bid; + + // AXI Read Channels + wire lsu_axi_arvalid; + wire lsu_axi_arready; + wire [`RV_LSU_BUS_TAG-1:0] lsu_axi_arid; + wire [31:0] lsu_axi_araddr; + wire [3:0] lsu_axi_arregion; + wire [7:0] lsu_axi_arlen; + wire [2:0] lsu_axi_arsize; + wire [1:0] lsu_axi_arburst; + wire lsu_axi_arlock; + wire [3:0] lsu_axi_arcache; + wire [2:0] lsu_axi_arprot; + wire [3:0] lsu_axi_arqos; + + wire lsu_axi_rvalid; + wire lsu_axi_rready; + wire [`RV_LSU_BUS_TAG-1:0] lsu_axi_rid; + wire [63:0] lsu_axi_rdata; + wire [1:0] lsu_axi_rresp; + wire lsu_axi_rlast; + + //-------------------------- IFU AXI signals-------------------------- + // AXI Write Channels + wire ifu_axi_awvalid; + wire ifu_axi_awready; + wire [`RV_IFU_BUS_TAG-1:0] ifu_axi_awid; + wire [31:0] ifu_axi_awaddr; + wire [3:0] ifu_axi_awregion; + wire [7:0] ifu_axi_awlen; + wire [2:0] ifu_axi_awsize; + wire [1:0] ifu_axi_awburst; + wire ifu_axi_awlock; + wire [3:0] ifu_axi_awcache; + wire [2:0] ifu_axi_awprot; + wire [3:0] ifu_axi_awqos; + + wire ifu_axi_wvalid; + wire ifu_axi_wready; + wire [63:0] ifu_axi_wdata; + wire [7:0] ifu_axi_wstrb; + wire ifu_axi_wlast; + + wire ifu_axi_bvalid; + wire ifu_axi_bready; + wire [1:0] ifu_axi_bresp; + wire [`RV_IFU_BUS_TAG-1:0] ifu_axi_bid; + + // AXI Read Channels + wire ifu_axi_arvalid; + wire ifu_axi_arready; + wire [`RV_IFU_BUS_TAG-1:0] ifu_axi_arid; + wire [31:0] ifu_axi_araddr; + wire [3:0] ifu_axi_arregion; + wire [7:0] ifu_axi_arlen; + wire [2:0] ifu_axi_arsize; + wire [1:0] ifu_axi_arburst; + wire ifu_axi_arlock; + wire [3:0] ifu_axi_arcache; + wire [2:0] ifu_axi_arprot; + wire [3:0] ifu_axi_arqos; + + wire ifu_axi_rvalid; + wire ifu_axi_rready; + wire [`RV_IFU_BUS_TAG-1:0] ifu_axi_rid; + wire [63:0] ifu_axi_rdata; + wire [1:0] ifu_axi_rresp; + wire ifu_axi_rlast; + + //-------------------------- SB AXI signals-------------------------- + // AXI Write Channels + wire sb_axi_awvalid; + wire sb_axi_awready; + wire [`RV_SB_BUS_TAG-1:0] sb_axi_awid; + wire [31:0] sb_axi_awaddr; + wire [3:0] sb_axi_awregion; + wire [7:0] sb_axi_awlen; + wire [2:0] sb_axi_awsize; + wire [1:0] sb_axi_awburst; + wire sb_axi_awlock; + wire [3:0] sb_axi_awcache; + wire [2:0] sb_axi_awprot; + wire [3:0] sb_axi_awqos; + + wire sb_axi_wvalid; + wire sb_axi_wready; + wire [63:0] sb_axi_wdata; + wire [7:0] sb_axi_wstrb; + wire sb_axi_wlast; + + wire sb_axi_bvalid; + wire sb_axi_bready; + wire [1:0] sb_axi_bresp; + wire [`RV_SB_BUS_TAG-1:0] sb_axi_bid; + + // AXI Read Channels + wire sb_axi_arvalid; + wire sb_axi_arready; + wire [`RV_SB_BUS_TAG-1:0] sb_axi_arid; + wire [31:0] sb_axi_araddr; + wire [3:0] sb_axi_arregion; + wire [7:0] sb_axi_arlen; + wire [2:0] sb_axi_arsize; + wire [1:0] sb_axi_arburst; + wire sb_axi_arlock; + wire [3:0] sb_axi_arcache; + wire [2:0] sb_axi_arprot; + wire [3:0] sb_axi_arqos; + + wire sb_axi_rvalid; + wire sb_axi_rready; + wire [`RV_SB_BUS_TAG-1:0] sb_axi_rid; + wire [63:0] sb_axi_rdata; + wire [1:0] sb_axi_rresp; + wire sb_axi_rlast; + + //-------------------------- DMA AXI signals-------------------------- + // AXI Write Channels + wire dma_axi_awvalid; + wire dma_axi_awready; + wire [`RV_DMA_BUS_TAG-1:0] dma_axi_awid; + wire [31:0] dma_axi_awaddr; + wire [2:0] dma_axi_awsize; + wire [2:0] dma_axi_awprot; + wire [7:0] dma_axi_awlen; + wire [1:0] dma_axi_awburst; + + + wire dma_axi_wvalid; + wire dma_axi_wready; + wire [63:0] dma_axi_wdata; + wire [7:0] dma_axi_wstrb; + wire dma_axi_wlast; + + wire dma_axi_bvalid; + wire dma_axi_bready; + wire [1:0] dma_axi_bresp; + wire [`RV_DMA_BUS_TAG-1:0] dma_axi_bid; + + // AXI Read Channels + wire dma_axi_arvalid; + wire dma_axi_arready; + wire [`RV_DMA_BUS_TAG-1:0] dma_axi_arid; + wire [31:0] dma_axi_araddr; + wire [2:0] dma_axi_arsize; + wire [2:0] dma_axi_arprot; + wire [7:0] dma_axi_arlen; + wire [1:0] dma_axi_arburst; + + wire dma_axi_rvalid; + wire dma_axi_rready; + wire [`RV_DMA_BUS_TAG-1:0] dma_axi_rid; + wire [63:0] dma_axi_rdata; + wire [1:0] dma_axi_rresp; + wire dma_axi_rlast; + +`endif + wire[63:0] WriteData; + + + assign mailbox_write = lmem.mailbox_write; + assign WriteData = lmem.WriteData; + assign mailbox_data_val = WriteData[7:0] > 8'h5 && WriteData[7:0] < 8'h7f; + + parameter MAX_CYCLES = 2_000_000; + + integer fd, tp, el; + + always @(negedge core_clk) begin + cycleCnt <= cycleCnt+1; + // Test timeout monitor + if(cycleCnt == MAX_CYCLES) begin + $display ("Hit max cycle count (%0d) .. stopping",cycleCnt); + $finish; + end + // console Monitor + if( mailbox_data_val & mailbox_write) begin + $fwrite(fd,"%c", WriteData[7:0]); + $write("%c", WriteData[7:0]); + end + // End Of test monitor + if(mailbox_write && WriteData[7:0] == 8'hff) begin + $display("TEST_PASSED"); + $display("\nFinished : minstret = %0d, mcycle = %0d", rvtop.swerv.dec.tlu.minstretl[31:0],rvtop.swerv.dec.tlu.mcyclel[31:0]); + $display("See \"exec.log\" for execution trace with register updates..\n"); + $finish; + end + else if(mailbox_write && WriteData[7:0] == 8'h1) begin + $display("TEST_FAILED"); + $finish; + end + end + + + // trace monitor + always @(posedge core_clk) begin + wb_valid[0] <= rvtop.swerv.dec.dec_i0_wen_r; + wb_dest[0] <= rvtop.swerv.dec.dec_i0_waddr_r; + wb_data[0] <= rvtop.swerv.dec.dec_i0_wdata_r; + if (rvtop.trace_rv_i_valid_ip !== 0) begin + $fwrite(tp,"%b,%h,%h,%0h,%0h,3,%b,%h,%h,%b\n", rvtop.trace_rv_i_valid_ip, 0, trace_rv_i_address_ip, + 0, trace_rv_i_insn_ip,trace_rv_i_exception_ip,trace_rv_i_ecause_ip, + trace_rv_i_tval_ip,trace_rv_i_interrupt_ip); + // Basic trace - no exception register updates + // #1 0 ee000000 b0201073 c 0b02 00000000 + for (int i=0; i<1; i++) + if (rvtop.trace_rv_i_valid_ip[i]==1) begin + commit_count++; + $fwrite (el, "%10d : %6s 0 %h %h %s\n", cycleCnt, $sformatf("#%0d",commit_count), + trace_rv_i_address_ip[31+i*32 -:32], trace_rv_i_insn_ip[31+i*32-:32], + wb_dest[i] !=0 ? $sformatf("r%0d=%h", wb_dest[i], wb_data[i]) : ""); + end + end + end + + + initial begin + // tie offs + jtag_id[31:28] = 4'b1; + jtag_id[27:12] = '0; + jtag_id[11:1] = 11'h45; + reset_vector = 32'h0; + nmi_vector = 32'hee000000; + nmi_int = 0; + + $readmemh("data.hex", lmem.mem); + $readmemh("program.hex", imem.mem); + tp = $fopen("trace_port.csv","w"); + el = $fopen("exec.log","w"); + $fwrite (el, "//Cycle : #inst 0 pc opcode reg regnum value\n"); + fd = $fopen("console.log","w"); + commit_count = 0; + preload_dccm(); + +`ifndef VERILATOR + if($test$plusargs("dumpon")) $dumpvars; + forever core_clk = #5 ~core_clk; +`endif + end + + + assign rst_l = cycleCnt > 5; + + //=========================================================================- + // RTL instance + //=========================================================================- +el2_swerv_wrapper rvtop ( + .rst_l ( rst_l ), + .clk ( core_clk ), + .rst_vec ( reset_vector[31:1]), + .nmi_int ( nmi_int ), + .nmi_vec ( nmi_vector[31:1]), + .jtag_id ( jtag_id[31:1]), + +`ifdef RV_BUILD_AHB_LITE + .haddr ( ic_haddr ), + .hburst ( ic_hburst ), + .hmastlock ( ic_hmastlock ), + .hprot ( ic_hprot ), + .hsize ( ic_hsize ), + .htrans ( ic_htrans ), + .hwrite ( ic_hwrite ), + + .hrdata ( ic_hrdata[63:0]), + .hready ( ic_hready ), + .hresp ( ic_hresp ), + + //--------------------------------------------------------------- + // Debug AHB Master + //--------------------------------------------------------------- + .sb_haddr ( sb_haddr ), + .sb_hburst ( sb_hburst ), + .sb_hmastlock ( sb_hmastlock ), + .sb_hprot ( sb_hprot ), + .sb_hsize ( sb_hsize ), + .sb_htrans ( sb_htrans ), + .sb_hwrite ( sb_hwrite ), + .sb_hwdata ( sb_hwdata ), + + .sb_hrdata ( sb_hrdata ), + .sb_hready ( sb_hready ), + .sb_hresp ( sb_hresp ), + + //--------------------------------------------------------------- + // LSU AHB Master + //--------------------------------------------------------------- + .lsu_haddr ( lsu_haddr ), + .lsu_hburst ( lsu_hburst ), + .lsu_hmastlock ( lsu_hmastlock ), + .lsu_hprot ( lsu_hprot ), + .lsu_hsize ( lsu_hsize ), + .lsu_htrans ( lsu_htrans ), + .lsu_hwrite ( lsu_hwrite ), + .lsu_hwdata ( lsu_hwdata ), + + .lsu_hrdata ( lsu_hrdata[63:0]), + .lsu_hready ( lsu_hready ), + .lsu_hresp ( lsu_hresp ), + + //--------------------------------------------------------------- + // DMA Slave + //--------------------------------------------------------------- + .dma_haddr ( '0 ), + .dma_hburst ( '0 ), + .dma_hmastlock ( '0 ), + .dma_hprot ( '0 ), + .dma_hsize ( '0 ), + .dma_htrans ( '0 ), + .dma_hwrite ( '0 ), + .dma_hwdata ( '0 ), + + .dma_hrdata ( dma_hrdata ), + .dma_hresp ( dma_hresp ), + .dma_hsel ( 1'b1 ), + .dma_hreadyin ( dma_hready_out ), + .dma_hreadyout ( dma_hready_out ), +`endif +`ifdef RV_BUILD_AXI4 + //-------------------------- LSU AXI signals-------------------------- + // AXI Write Channels + .lsu_axi_awvalid (lsu_axi_awvalid), + .lsu_axi_awready (lsu_axi_awready), + .lsu_axi_awid (lsu_axi_awid), + .lsu_axi_awaddr (lsu_axi_awaddr), + .lsu_axi_awregion (lsu_axi_awregion), + .lsu_axi_awlen (lsu_axi_awlen), + .lsu_axi_awsize (lsu_axi_awsize), + .lsu_axi_awburst (lsu_axi_awburst), + .lsu_axi_awlock (lsu_axi_awlock), + .lsu_axi_awcache (lsu_axi_awcache), + .lsu_axi_awprot (lsu_axi_awprot), + .lsu_axi_awqos (lsu_axi_awqos), + + .lsu_axi_wvalid (lsu_axi_wvalid), + .lsu_axi_wready (lsu_axi_wready), + .lsu_axi_wdata (lsu_axi_wdata), + .lsu_axi_wstrb (lsu_axi_wstrb), + .lsu_axi_wlast (lsu_axi_wlast), + + .lsu_axi_bvalid (lsu_axi_bvalid), + .lsu_axi_bready (lsu_axi_bready), + .lsu_axi_bresp (lsu_axi_bresp), + .lsu_axi_bid (lsu_axi_bid), + + + .lsu_axi_arvalid (lsu_axi_arvalid), + .lsu_axi_arready (lsu_axi_arready), + .lsu_axi_arid (lsu_axi_arid), + .lsu_axi_araddr (lsu_axi_araddr), + .lsu_axi_arregion (lsu_axi_arregion), + .lsu_axi_arlen (lsu_axi_arlen), + .lsu_axi_arsize (lsu_axi_arsize), + .lsu_axi_arburst (lsu_axi_arburst), + .lsu_axi_arlock (lsu_axi_arlock), + .lsu_axi_arcache (lsu_axi_arcache), + .lsu_axi_arprot (lsu_axi_arprot), + .lsu_axi_arqos (lsu_axi_arqos), + + .lsu_axi_rvalid (lsu_axi_rvalid), + .lsu_axi_rready (lsu_axi_rready), + .lsu_axi_rid (lsu_axi_rid), + .lsu_axi_rdata (lsu_axi_rdata), + .lsu_axi_rresp (lsu_axi_rresp), + .lsu_axi_rlast (lsu_axi_rlast), + + //-------------------------- IFU AXI signals-------------------------- + // AXI Write Channels + .ifu_axi_awvalid (ifu_axi_awvalid), + .ifu_axi_awready (ifu_axi_awready), + .ifu_axi_awid (ifu_axi_awid), + .ifu_axi_awaddr (ifu_axi_awaddr), + .ifu_axi_awregion (ifu_axi_awregion), + .ifu_axi_awlen (ifu_axi_awlen), + .ifu_axi_awsize (ifu_axi_awsize), + .ifu_axi_awburst (ifu_axi_awburst), + .ifu_axi_awlock (ifu_axi_awlock), + .ifu_axi_awcache (ifu_axi_awcache), + .ifu_axi_awprot (ifu_axi_awprot), + .ifu_axi_awqos (ifu_axi_awqos), + + .ifu_axi_wvalid (ifu_axi_wvalid), + .ifu_axi_wready (ifu_axi_wready), + .ifu_axi_wdata (ifu_axi_wdata), + .ifu_axi_wstrb (ifu_axi_wstrb), + .ifu_axi_wlast (ifu_axi_wlast), + + .ifu_axi_bvalid (ifu_axi_bvalid), + .ifu_axi_bready (ifu_axi_bready), + .ifu_axi_bresp (ifu_axi_bresp), + .ifu_axi_bid (ifu_axi_bid), + + .ifu_axi_arvalid (ifu_axi_arvalid), + .ifu_axi_arready (ifu_axi_arready), + .ifu_axi_arid (ifu_axi_arid), + .ifu_axi_araddr (ifu_axi_araddr), + .ifu_axi_arregion (ifu_axi_arregion), + .ifu_axi_arlen (ifu_axi_arlen), + .ifu_axi_arsize (ifu_axi_arsize), + .ifu_axi_arburst (ifu_axi_arburst), + .ifu_axi_arlock (ifu_axi_arlock), + .ifu_axi_arcache (ifu_axi_arcache), + .ifu_axi_arprot (ifu_axi_arprot), + .ifu_axi_arqos (ifu_axi_arqos), + + .ifu_axi_rvalid (ifu_axi_rvalid), + .ifu_axi_rready (ifu_axi_rready), + .ifu_axi_rid (ifu_axi_rid), + .ifu_axi_rdata (ifu_axi_rdata), + .ifu_axi_rresp (ifu_axi_rresp), + .ifu_axi_rlast (ifu_axi_rlast), + + //-------------------------- SB AXI signals-------------------------- + // AXI Write Channels + .sb_axi_awvalid (sb_axi_awvalid), + .sb_axi_awready (sb_axi_awready), + .sb_axi_awid (sb_axi_awid), + .sb_axi_awaddr (sb_axi_awaddr), + .sb_axi_awregion (sb_axi_awregion), + .sb_axi_awlen (sb_axi_awlen), + .sb_axi_awsize (sb_axi_awsize), + .sb_axi_awburst (sb_axi_awburst), + .sb_axi_awlock (sb_axi_awlock), + .sb_axi_awcache (sb_axi_awcache), + .sb_axi_awprot (sb_axi_awprot), + .sb_axi_awqos (sb_axi_awqos), + + .sb_axi_wvalid (sb_axi_wvalid), + .sb_axi_wready (sb_axi_wready), + .sb_axi_wdata (sb_axi_wdata), + .sb_axi_wstrb (sb_axi_wstrb), + .sb_axi_wlast (sb_axi_wlast), + + .sb_axi_bvalid (sb_axi_bvalid), + .sb_axi_bready (sb_axi_bready), + .sb_axi_bresp (sb_axi_bresp), + .sb_axi_bid (sb_axi_bid), + + + .sb_axi_arvalid (sb_axi_arvalid), + .sb_axi_arready (sb_axi_arready), + .sb_axi_arid (sb_axi_arid), + .sb_axi_araddr (sb_axi_araddr), + .sb_axi_arregion (sb_axi_arregion), + .sb_axi_arlen (sb_axi_arlen), + .sb_axi_arsize (sb_axi_arsize), + .sb_axi_arburst (sb_axi_arburst), + .sb_axi_arlock (sb_axi_arlock), + .sb_axi_arcache (sb_axi_arcache), + .sb_axi_arprot (sb_axi_arprot), + .sb_axi_arqos (sb_axi_arqos), + + .sb_axi_rvalid (sb_axi_rvalid), + .sb_axi_rready (sb_axi_rready), + .sb_axi_rid (sb_axi_rid), + .sb_axi_rdata (sb_axi_rdata), + .sb_axi_rresp (sb_axi_rresp), + .sb_axi_rlast (sb_axi_rlast), + + //-------------------------- DMA AXI signals-------------------------- + // AXI Write Channels + .dma_axi_awvalid (1'b0), + .dma_axi_awready (dma_axi_awready), + .dma_axi_awid (dma_axi_awid), + .dma_axi_awaddr (dma_axi_awaddr), + .dma_axi_awsize (dma_axi_awsize), + .dma_axi_awprot (dma_axi_awprot), + .dma_axi_awlen (dma_axi_awlen), + .dma_axi_awburst (dma_axi_awburst), + + + .dma_axi_wvalid (1'b0), + .dma_axi_wready (dma_axi_wready), + .dma_axi_wdata (dma_axi_wdata), + .dma_axi_wstrb (dma_axi_wstrb), + .dma_axi_wlast (dma_axi_wlast), + + .dma_axi_bvalid (dma_axi_bvalid), + .dma_axi_bready (1'b0), + .dma_axi_bresp (dma_axi_bresp), + .dma_axi_bid (dma_axi_bid), + + + .dma_axi_arvalid (1'b0), + .dma_axi_arready (dma_axi_arready), + .dma_axi_arid (dma_axi_arid), + .dma_axi_araddr (dma_axi_araddr), + .dma_axi_arsize (dma_axi_arsize), + .dma_axi_arprot (dma_axi_arprot), + .dma_axi_arlen (dma_axi_arlen), + .dma_axi_arburst (dma_axi_arburst), + + .dma_axi_rvalid (dma_axi_rvalid), + .dma_axi_rready (1'b0), + .dma_axi_rid (dma_axi_rid), + .dma_axi_rdata (dma_axi_rdata), + .dma_axi_rresp (dma_axi_rresp), + .dma_axi_rlast (dma_axi_rlast), +`endif + .timer_int ( 1'b0 ), + .extintsrc_req ( '0 ), + + .lsu_bus_clk_en ( 1'b1 ),// Clock ratio b/w cpu core clk & AHB master interface + .ifu_bus_clk_en ( 1'b1 ),// Clock ratio b/w cpu core clk & AHB master interface + .dbg_bus_clk_en ( 1'b1 ),// Clock ratio b/w cpu core clk & AHB Debug master interface + .dma_bus_clk_en ( 1'b1 ),// Clock ratio b/w cpu core clk & AHB slave interface + + .trace_rv_i_insn_ip (trace_rv_i_insn_ip), + .trace_rv_i_address_ip (trace_rv_i_address_ip), + .trace_rv_i_valid_ip (trace_rv_i_valid_ip), + .trace_rv_i_exception_ip(trace_rv_i_exception_ip), + .trace_rv_i_ecause_ip (trace_rv_i_ecause_ip), + .trace_rv_i_interrupt_ip(trace_rv_i_interrupt_ip), + .trace_rv_i_tval_ip (trace_rv_i_tval_ip), + + .jtag_tck ( 1'b0 ), + .jtag_tms ( 1'b0 ), + .jtag_tdi ( 1'b0 ), + .jtag_trst_n ( 1'b0 ), + .jtag_tdo ( jtag_tdo ), + + .mpc_debug_halt_ack ( mpc_debug_halt_ack), + .mpc_debug_halt_req ( 1'b0), + .mpc_debug_run_ack ( mpc_debug_run_ack), + .mpc_debug_run_req ( 1'b1), + .mpc_reset_run_req ( 1'b1), // Start running after reset + .debug_brkpt_status (debug_brkpt_status), + + .i_cpu_halt_req ( 1'b0 ), // Async halt req to CPU + .o_cpu_halt_ack ( o_cpu_halt_ack ), // core response to halt + .o_cpu_halt_status ( o_cpu_halt_status ), // 1'b1 indicates core is halted + .i_cpu_run_req ( 1'b0 ), // Async restart req to CPU + .o_debug_mode_status (o_debug_mode_status), + .o_cpu_run_ack ( o_cpu_run_ack ), // Core response to run req + + .dec_tlu_perfcnt0 (), + .dec_tlu_perfcnt1 (), + .dec_tlu_perfcnt2 (), + .dec_tlu_perfcnt3 (), + + .soft_int ('0), + .core_id ('0), + .scan_mode ( 1'b0 ), // To enable scan mode + .mbist_mode ( 1'b0 ) // to enable mbist + +); + + + //=========================================================================- + // AHB I$ instance + //=========================================================================- +`ifdef RV_BUILD_AHB_LITE + +ahb_sif imem ( + // Inputs + .HWDATA(64'h0), + .HCLK(core_clk), + .HSEL(1'b1), + .HPROT(ic_hprot), + .HWRITE(ic_hwrite), + .HTRANS(ic_htrans), + .HSIZE(ic_hsize), + .HREADY(ic_hready), + .HRESETn(rst_l), + .HADDR(ic_haddr), + .HBURST(ic_hburst), + + // Outputs + .HREADYOUT(ic_hready), + .HRESP(ic_hresp), + .HRDATA(ic_hrdata[63:0]) +); + + +ahb_sif lmem ( + // Inputs + .HWDATA(lsu_hwdata), + .HCLK(core_clk), + .HSEL(1'b1), + .HPROT(lsu_hprot), + .HWRITE(lsu_hwrite), + .HTRANS(lsu_htrans), + .HSIZE(lsu_hsize), + .HREADY(lsu_hready), + .HRESETn(rst_l), + .HADDR(lsu_haddr), + .HBURST(lsu_hburst), + + // Outputs + .HREADYOUT(lsu_hready), + .HRESP(lsu_hresp), + .HRDATA(lsu_hrdata[63:0]) +); + +`endif +`ifdef RV_BUILD_AXI4 +axi_slv #(.TAGW(`RV_IFU_BUS_TAG)) imem( + .aclk(core_clk), + .rst_l(rst_l), + .arvalid(ifu_axi_arvalid), + .arready(ifu_axi_arready), + .araddr(ifu_axi_araddr), + .arid(ifu_axi_arid), + .arlen(ifu_axi_arlen), + .arburst(ifu_axi_arburst), + .arsize(ifu_axi_arsize), + + .rvalid(ifu_axi_rvalid), + .rready(ifu_axi_rready), + .rdata(ifu_axi_rdata), + .rresp(ifu_axi_rresp), + .rid(ifu_axi_rid), + .rlast(ifu_axi_rlast), + + .awvalid(1'b0), + .awready(), + .awaddr('0), + .awid('0), + .awlen('0), + .awburst('0), + .awsize('0), + + .wdata('0), + .wstrb('0), + .wvalid(1'b0), + .wready(), + + .bvalid(), + .bready(1'b0), + .bresp(), + .bid() +); + +defparam lmem.TAGW =`RV_LSU_BUS_TAG; + +//axi_slv #(.TAGW(`RV_LSU_BUS_TAG)) lmem( +axi_slv lmem( + .aclk(core_clk), + .rst_l(rst_l), + .arvalid(lsu_axi_arvalid), + .arready(lsu_axi_arready), + .araddr(lsu_axi_araddr), + .arid(lsu_axi_arid), + .arlen(lsu_axi_arlen), + .arburst(lsu_axi_arburst), + .arsize(lsu_axi_arsize), + + .rvalid(lsu_axi_rvalid), + .rready(lsu_axi_rready), + .rdata(lsu_axi_rdata), + .rresp(lsu_axi_rresp), + .rid(lsu_axi_rid), + .rlast(lsu_axi_rlast), + + .awvalid(lsu_axi_awvalid), + .awready(lsu_axi_awready), + .awaddr(lsu_axi_awaddr), + .awid(lsu_axi_awid), + .awlen(lsu_axi_awlen), + .awburst(lsu_axi_awburst), + .awsize(lsu_axi_awsize), + + .wdata(lsu_axi_wdata), + .wstrb(lsu_axi_wstrb), + .wvalid(lsu_axi_wvalid), + .wready(lsu_axi_wready), + + .bvalid(lsu_axi_bvalid), + .bready(lsu_axi_bready), + .bresp(lsu_axi_bresp), + .bid(lsu_axi_bid) +); +`endif + + +task preload_dccm; +bit[31:0] data; +bit[31:0] addr, eaddr; +int adr; + +addr = 'hfff8; +eaddr = {lmem.mem[addr+3],lmem.mem[addr+2],lmem.mem[addr+1],lmem.mem[addr]}; +if (eaddr != `RV_DCCM_SADR) return; +addr = 'hfffc; +eaddr = {lmem.mem[addr+3],lmem.mem[addr+2],lmem.mem[addr+1],lmem.mem[addr]}; +$display("DCCM pre-load from %h to %h", `RV_DCCM_SADR, eaddr); + +for(addr=`RV_DCCM_SADR; addr <= eaddr; addr+=4) begin + adr = addr & 'hffff; + data = {lmem.mem[adr+3],lmem.mem[adr+2],lmem.mem[adr+1],lmem.mem[adr]}; + slam_dccm_ram(addr, data == 0 ? 0 : {riscv_ecc32(data),data}); +end + +endtask + +`ifdef VERILATOR +`define DRAM(bank) rvtop.mem.Gen_dccm_enable.dccm.mem_bank[bank].ram.ram_core +`else +`define DRAM(bank) rvtop.mem.Gen_dccm_enable.dccm.mem_bank[bank].dccm.dccm_bank.ram_core +`endif + +task slam_dccm_ram(input [31:0] addr, input[38:0] data); +int bank, indx; +bank = get_dccm_bank(addr, indx); +//`ifndef VERILATOR +case(bank) +0: `DRAM(0)[indx] = data; +1: `DRAM(1)[indx] = data; +`ifdef RV_DCCM_NUM_BANKS_4 +2: `DRAM(2)[indx] = data; +3: `DRAM(3)[indx] = data; +`endif +`ifdef RV_DCCM_NUM_BANKS_8 +2: `DRAM(2)[indx] = data; +3: `DRAM(3)[indx] = data; +4: `DRAM(4)[indx] = data; +5: `DRAM(5)[indx] = data; +6: `DRAM(6)[indx] = data; +7: `DRAM(7)[indx] = data; +`endif +endcase +//`endif +endtask + + +function[6:0] riscv_ecc32(input[31:0] data); +reg[6:0] synd; +synd[0] = ^(data & 32'h56aa_ad5b); +synd[1] = ^(data & 32'h9b33_366d); +synd[2] = ^(data & 32'he3c3_c78e); +synd[3] = ^(data & 32'h03fc_07f0); +synd[4] = ^(data & 32'h03ff_f800); +synd[5] = ^(data & 32'hfc00_0000); +synd[6] = ^{data, synd[5:0]}; +return synd; +endfunction + +function int get_dccm_bank(input int addr, output int bank_idx); +`ifdef RV_DCCM_NUM_BANKS_2 + bank_idx = int'(addr[`RV_DCCM_BITS-1:3]); + return int'( addr[2]); +`elsif RV_DCCM_NUM_BANKS_4 + bank_idx = int'(addr[`RV_DCCM_BITS-1:4]); + return int'(addr[3:2]); +`elsif RV_DCCM_NUM_BANKS_8 + bank_idx = int'(addr[`RV_DCCM_BITS-1:5]); + return int'( addr[4:2]); +`endif +endfunction + +endmodule diff --git a/testbench/test_tb_top.cpp b/testbench/test_tb_top.cpp new file mode 100644 index 0000000..c88bb2b --- /dev/null +++ b/testbench/test_tb_top.cpp @@ -0,0 +1,71 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright 2019 Western Digital Corporation or its affiliates. +// +// 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. +// +#include +#include +#include +#include +#include "Vtb_top.h" +#include "verilated.h" +#include "verilated_vcd_c.h" + + +vluint64_t main_time = 0; + +double sc_time_stamp () { + return main_time; +} + + +int main(int argc, char** argv) { + std::cout << "\nVerilatorTB: Start of sim\n" << std::endl; + + // Check for +dumpon and remove it from argv + bool dumpWaves = false; + int newArgc = 0; + for (int i = 0; i < argc; ++i) + if (strcmp(argv[i], "+dumpon") == 0) + dumpWaves = true; + else + argv[newArgc++] = argv[i]; + argc = newArgc; + + Verilated::commandArgs(argc, argv); + + Vtb_top* tb = new Vtb_top; + + // init trace dump + Verilated::traceEverOn(true); + VerilatedVcdC* tfp = new VerilatedVcdC; + tb->trace (tfp, 24); + if (dumpWaves) + tfp->open ("sim.vcd"); + + // Simulate + while(!Verilated::gotFinish()){ + if (dumpWaves) + tfp->dump (main_time); + main_time += 5; + tb->core_clk = !tb->core_clk; + tb->eval(); + } + + if (dumpWaves) + tfp->close(); + + std::cout << "\nVerilatorTB: End of sim" << std::endl; + exit(EXIT_SUCCESS); + +} diff --git a/tools/JSON.pm b/tools/JSON.pm new file mode 100644 index 0000000..6fb7a90 --- /dev/null +++ b/tools/JSON.pm @@ -0,0 +1,2267 @@ +package JSON; + + +use strict; +use Carp (); +use base qw(Exporter); +@JSON::EXPORT = qw(from_json to_json jsonToObj objToJson encode_json decode_json); + +BEGIN { + $JSON::VERSION = '2.53'; + $JSON::DEBUG = 0 unless (defined $JSON::DEBUG); + $JSON::DEBUG = $ENV{ PERL_JSON_DEBUG } if exists $ENV{ PERL_JSON_DEBUG }; +} + +my $Module_XS = 'JSON::XS'; +my $Module_PP = 'JSON::PP'; +my $Module_bp = 'JSON::backportPP'; # included in JSON distribution +my $PP_Version = '2.27200'; +my $XS_Version = '2.27'; + + +# XS and PP common methods + +my @PublicMethods = qw/ + ascii latin1 utf8 pretty indent space_before space_after relaxed canonical allow_nonref + allow_blessed convert_blessed filter_json_object filter_json_single_key_object + shrink max_depth max_size encode decode decode_prefix allow_unknown +/; + +my @Properties = qw/ + ascii latin1 utf8 indent space_before space_after relaxed canonical allow_nonref + allow_blessed convert_blessed shrink max_depth max_size allow_unknown +/; + +my @XSOnlyMethods = qw//; # Currently nothing + +my @PPOnlyMethods = qw/ + indent_length sort_by + allow_singlequote allow_bignum loose allow_barekey escape_slash as_nonblessed +/; # JSON::PP specific + + +# used in _load_xs and _load_pp ($INSTALL_ONLY is not used currently) +my $_INSTALL_DONT_DIE = 1; # When _load_xs fails to load XS, don't die. +my $_INSTALL_ONLY = 2; # Don't call _set_methods() +my $_ALLOW_UNSUPPORTED = 0; +my $_UNIV_CONV_BLESSED = 0; +my $_USSING_bpPP = 0; + + +# Check the environment variable to decide worker module. + +unless ($JSON::Backend) { + $JSON::DEBUG and Carp::carp("Check used worker module..."); + + my $backend = exists $ENV{PERL_JSON_BACKEND} ? $ENV{PERL_JSON_BACKEND} : 1; + + if ($backend eq '1' or $backend =~ /JSON::XS\s*,\s*JSON::PP/) { + _load_xs($_INSTALL_DONT_DIE) or _load_pp(); + } + elsif ($backend eq '0' or $backend eq 'JSON::PP') { + _load_pp(); + } + elsif ($backend eq '2' or $backend eq 'JSON::XS') { + _load_xs(); + } + elsif ($backend eq 'JSON::backportPP') { + $_USSING_bpPP = 1; + _load_pp(); + } + else { + Carp::croak "The value of environmental variable 'PERL_JSON_BACKEND' is invalid."; + } +} + + +sub import { + my $pkg = shift; + my @what_to_export; + my $no_export; + + for my $tag (@_) { + if ($tag eq '-support_by_pp') { + if (!$_ALLOW_UNSUPPORTED++) { + JSON::Backend::XS + ->support_by_pp(@PPOnlyMethods) if ($JSON::Backend eq $Module_XS); + } + next; + } + elsif ($tag eq '-no_export') { + $no_export++, next; + } + elsif ( $tag eq '-convert_blessed_universally' ) { + eval q| + require B; + *UNIVERSAL::TO_JSON = sub { + my $b_obj = B::svref_2object( $_[0] ); + return $b_obj->isa('B::HV') ? { %{ $_[0] } } + : $b_obj->isa('B::AV') ? [ @{ $_[0] } ] + : undef + ; + } + | if ( !$_UNIV_CONV_BLESSED++ ); + next; + } + push @what_to_export, $tag; + } + + return if ($no_export); + + __PACKAGE__->export_to_level(1, $pkg, @what_to_export); +} + + +# OBSOLETED + +sub jsonToObj { + my $alternative = 'from_json'; + if (defined $_[0] and UNIVERSAL::isa($_[0], 'JSON')) { + shift @_; $alternative = 'decode'; + } + Carp::carp "'jsonToObj' will be obsoleted. Please use '$alternative' instead."; + return JSON::from_json(@_); +}; + +sub objToJson { + my $alternative = 'to_json'; + if (defined $_[0] and UNIVERSAL::isa($_[0], 'JSON')) { + shift @_; $alternative = 'encode'; + } + Carp::carp "'objToJson' will be obsoleted. Please use '$alternative' instead."; + JSON::to_json(@_); +}; + + +# INTERFACES + +sub to_json ($@) { + if ( + ref($_[0]) eq 'JSON' + or (@_ > 2 and $_[0] eq 'JSON') + ) { + Carp::croak "to_json should not be called as a method."; + } + my $json = new JSON; + + if (@_ == 2 and ref $_[1] eq 'HASH') { + my $opt = $_[1]; + for my $method (keys %$opt) { + $json->$method( $opt->{$method} ); + } + } + + $json->encode($_[0]); +} + + +sub from_json ($@) { + if ( ref($_[0]) eq 'JSON' or $_[0] eq 'JSON' ) { + Carp::croak "from_json should not be called as a method."; + } + my $json = new JSON; + + if (@_ == 2 and ref $_[1] eq 'HASH') { + my $opt = $_[1]; + for my $method (keys %$opt) { + $json->$method( $opt->{$method} ); + } + } + + return $json->decode( $_[0] ); +} + + +sub true { $JSON::true } + +sub false { $JSON::false } + +sub null { undef; } + + +sub require_xs_version { $XS_Version; } + +sub backend { + my $proto = shift; + $JSON::Backend; +} + +#*module = *backend; + + +sub is_xs { + return $_[0]->module eq $Module_XS; +} + + +sub is_pp { + return not $_[0]->xs; +} + + +sub pureperl_only_methods { @PPOnlyMethods; } + + +sub property { + my ($self, $name, $value) = @_; + + if (@_ == 1) { + my %props; + for $name (@Properties) { + my $method = 'get_' . $name; + if ($name eq 'max_size') { + my $value = $self->$method(); + $props{$name} = $value == 1 ? 0 : $value; + next; + } + $props{$name} = $self->$method(); + } + return \%props; + } + elsif (@_ > 3) { + Carp::croak('property() can take only the option within 2 arguments.'); + } + elsif (@_ == 2) { + if ( my $method = $self->can('get_' . $name) ) { + if ($name eq 'max_size') { + my $value = $self->$method(); + return $value == 1 ? 0 : $value; + } + $self->$method(); + } + } + else { + $self->$name($value); + } + +} + + + +# INTERNAL + +sub _load_xs { + my $opt = shift; + + $JSON::DEBUG and Carp::carp "Load $Module_XS."; + + # if called after install module, overload is disable.... why? + JSON::Boolean::_overrride_overload($Module_XS); + JSON::Boolean::_overrride_overload($Module_PP); + + eval qq| + use $Module_XS $XS_Version (); + |; + + if ($@) { + if (defined $opt and $opt & $_INSTALL_DONT_DIE) { + $JSON::DEBUG and Carp::carp "Can't load $Module_XS...($@)"; + return 0; + } + Carp::croak $@; + } + + unless (defined $opt and $opt & $_INSTALL_ONLY) { + _set_module( $JSON::Backend = $Module_XS ); + my $data = join("", ); # this code is from Jcode 2.xx. + close(DATA); + eval $data; + JSON::Backend::XS->init; + } + + return 1; +}; + + +sub _load_pp { + my $opt = shift; + my $backend = $_USSING_bpPP ? $Module_bp : $Module_PP; + + $JSON::DEBUG and Carp::carp "Load $backend."; + + # if called after install module, overload is disable.... why? + JSON::Boolean::_overrride_overload($Module_XS); + JSON::Boolean::_overrride_overload($backend); + + if ( $_USSING_bpPP ) { + eval qq| require $backend |; + } + else { + eval qq| use $backend $PP_Version () |; + } + + if ($@) { + if ( $backend eq $Module_PP ) { + $JSON::DEBUG and Carp::carp "Can't load $Module_PP ($@), so try to load $Module_bp"; + $_USSING_bpPP++; + $backend = $Module_bp; + JSON::Boolean::_overrride_overload($backend); + local $^W; # if PP installed but invalid version, backportPP redifines methods. + eval qq| require $Module_bp |; + } + Carp::croak $@ if $@; + } + + unless (defined $opt and $opt & $_INSTALL_ONLY) { + _set_module( $JSON::Backend = $Module_PP ); # even if backportPP, set $Backend with 'JSON::PP' + JSON::Backend::PP->init; + } +}; + + +sub _set_module { + return if defined $JSON::true; + + my $module = shift; + + local $^W; + no strict qw(refs); + + $JSON::true = ${"$module\::true"}; + $JSON::false = ${"$module\::false"}; + + push @JSON::ISA, $module; + push @{"$module\::Boolean::ISA"}, qw(JSON::Boolean); + + *{"JSON::is_bool"} = \&{"$module\::is_bool"}; + + for my $method ($module eq $Module_XS ? @PPOnlyMethods : @XSOnlyMethods) { + *{"JSON::$method"} = sub { + Carp::carp("$method is not supported in $module."); + $_[0]; + }; + } + + return 1; +} + + + +# +# JSON Boolean +# + +package JSON::Boolean; + +my %Installed; + +sub _overrride_overload { + return if ($Installed{ $_[0] }++); + + my $boolean = $_[0] . '::Boolean'; + + eval sprintf(q| + package %s; + use overload ( + '""' => sub { ${$_[0]} == 1 ? 'true' : 'false' }, + 'eq' => sub { + my ($obj, $op) = ref ($_[0]) ? ($_[0], $_[1]) : ($_[1], $_[0]); + if ($op eq 'true' or $op eq 'false') { + return "$obj" eq 'true' ? 'true' eq $op : 'false' eq $op; + } + else { + return $obj ? 1 == $op : 0 == $op; + } + }, + ); + |, $boolean); + + if ($@) { Carp::croak $@; } + + return 1; +} + + +# +# Helper classes for Backend Module (PP) +# + +package JSON::Backend::PP; + +sub init { + local $^W; + no strict qw(refs); # this routine may be called after JSON::Backend::XS init was called. + *{"JSON::decode_json"} = \&{"JSON::PP::decode_json"}; + *{"JSON::encode_json"} = \&{"JSON::PP::encode_json"}; + *{"JSON::PP::is_xs"} = sub { 0 }; + *{"JSON::PP::is_pp"} = sub { 1 }; + return 1; +} + +# +# To save memory, the below lines are read only when XS backend is used. +# + +package JSON; + +1; +__DATA__ + + +# +# Helper classes for Backend Module (XS) +# + +package JSON::Backend::XS; + +use constant INDENT_LENGTH_FLAG => 15 << 12; + +use constant UNSUPPORTED_ENCODE_FLAG => { + ESCAPE_SLASH => 0x00000010, + ALLOW_BIGNUM => 0x00000020, + AS_NONBLESSED => 0x00000040, + EXPANDED => 0x10000000, # for developer's +}; + +use constant UNSUPPORTED_DECODE_FLAG => { + LOOSE => 0x00000001, + ALLOW_BIGNUM => 0x00000002, + ALLOW_BAREKEY => 0x00000004, + ALLOW_SINGLEQUOTE => 0x00000008, + EXPANDED => 0x20000000, # for developer's +}; + + +sub init { + local $^W; + no strict qw(refs); + *{"JSON::decode_json"} = \&{"JSON::XS::decode_json"}; + *{"JSON::encode_json"} = \&{"JSON::XS::encode_json"}; + *{"JSON::XS::is_xs"} = sub { 1 }; + *{"JSON::XS::is_pp"} = sub { 0 }; + return 1; +} + + +sub support_by_pp { + my ($class, @methods) = @_; + + local $^W; + no strict qw(refs); + + my $JSON_XS_encode_orignal = \&JSON::XS::encode; + my $JSON_XS_decode_orignal = \&JSON::XS::decode; + my $JSON_XS_incr_parse_orignal = \&JSON::XS::incr_parse; + + *JSON::XS::decode = \&JSON::Backend::XS::Supportable::_decode; + *JSON::XS::encode = \&JSON::Backend::XS::Supportable::_encode; + *JSON::XS::incr_parse = \&JSON::Backend::XS::Supportable::_incr_parse; + + *{JSON::XS::_original_decode} = $JSON_XS_decode_orignal; + *{JSON::XS::_original_encode} = $JSON_XS_encode_orignal; + *{JSON::XS::_original_incr_parse} = $JSON_XS_incr_parse_orignal; + + push @JSON::Backend::XS::Supportable::ISA, 'JSON'; + + my $pkg = 'JSON::Backend::XS::Supportable'; + + *{JSON::new} = sub { + my $proto = new JSON::XS; $$proto = 0; + bless $proto, $pkg; + }; + + + for my $method (@methods) { + my $flag = uc($method); + my $type |= (UNSUPPORTED_ENCODE_FLAG->{$flag} || 0); + $type |= (UNSUPPORTED_DECODE_FLAG->{$flag} || 0); + + next unless($type); + + $pkg->_make_unsupported_method($method => $type); + } + + push @{"JSON::XS::Boolean::ISA"}, qw(JSON::PP::Boolean); + push @{"JSON::PP::Boolean::ISA"}, qw(JSON::Boolean); + + $JSON::DEBUG and Carp::carp("set -support_by_pp mode."); + + return 1; +} + + + + +# +# Helper classes for XS +# + +package JSON::Backend::XS::Supportable; + +$Carp::Internal{'JSON::Backend::XS::Supportable'} = 1; + +sub _make_unsupported_method { + my ($pkg, $method, $type) = @_; + + local $^W; + no strict qw(refs); + + *{"$pkg\::$method"} = sub { + local $^W; + if (defined $_[1] ? $_[1] : 1) { + ${$_[0]} |= $type; + } + else { + ${$_[0]} &= ~$type; + } + $_[0]; + }; + + *{"$pkg\::get_$method"} = sub { + ${$_[0]} & $type ? 1 : ''; + }; + +} + + +sub _set_for_pp { + JSON::_load_pp( $_INSTALL_ONLY ); + + my $type = shift; + my $pp = new JSON::PP; + my $prop = $_[0]->property; + + for my $name (keys %$prop) { + $pp->$name( $prop->{$name} ? $prop->{$name} : 0 ); + } + + my $unsupported = $type eq 'encode' ? JSON::Backend::XS::UNSUPPORTED_ENCODE_FLAG + : JSON::Backend::XS::UNSUPPORTED_DECODE_FLAG; + my $flags = ${$_[0]} || 0; + + for my $name (keys %$unsupported) { + next if ($name eq 'EXPANDED'); # for developer's + my $enable = ($flags & $unsupported->{$name}) ? 1 : 0; + my $method = lc $name; + $pp->$method($enable); + } + + $pp->indent_length( $_[0]->get_indent_length ); + + return $pp; +} + +sub _encode { # using with PP encod + if (${$_[0]}) { + _set_for_pp('encode' => @_)->encode($_[1]); + } + else { + $_[0]->_original_encode( $_[1] ); + } +} + + +sub _decode { # if unsupported-flag is set, use PP + if (${$_[0]}) { + _set_for_pp('decode' => @_)->decode($_[1]); + } + else { + $_[0]->_original_decode( $_[1] ); + } +} + + +sub decode_prefix { # if unsupported-flag is set, use PP + _set_for_pp('decode' => @_)->decode_prefix($_[1]); +} + + +sub _incr_parse { + if (${$_[0]}) { + _set_for_pp('decode' => @_)->incr_parse($_[1]); + } + else { + $_[0]->_original_incr_parse( $_[1] ); + } +} + + +sub get_indent_length { + ${$_[0]} << 4 >> 16; +} + + +sub indent_length { + my $length = $_[1]; + + if (!defined $length or $length > 15 or $length < 0) { + Carp::carp "The acceptable range of indent_length() is 0 to 15."; + } + else { + local $^W; + $length <<= 12; + ${$_[0]} &= ~ JSON::Backend::XS::INDENT_LENGTH_FLAG; + ${$_[0]} |= $length; + *JSON::XS::encode = \&JSON::Backend::XS::Supportable::_encode; + } + + $_[0]; +} + + +1; +__END__ + +=head1 NAME + +JSON - JSON (JavaScript Object Notation) encoder/decoder + +=head1 SYNOPSIS + + use JSON; # imports encode_json, decode_json, to_json and from_json. + + # simple and fast interfaces (expect/generate UTF-8) + + $utf8_encoded_json_text = encode_json $perl_hash_or_arrayref; + $perl_hash_or_arrayref = decode_json $utf8_encoded_json_text; + + # OO-interface + + $json = JSON->new->allow_nonref; + + $json_text = $json->encode( $perl_scalar ); + $perl_scalar = $json->decode( $json_text ); + + $pretty_printed = $json->pretty->encode( $perl_scalar ); # pretty-printing + + # If you want to use PP only support features, call with '-support_by_pp' + # When XS unsupported feature is enable, using PP (de|en)code instead of XS ones. + + use JSON -support_by_pp; + + # option-acceptable interfaces (expect/generate UNICODE by default) + + $json_text = to_json( $perl_scalar, { ascii => 1, pretty => 1 } ); + $perl_scalar = from_json( $json_text, { utf8 => 1 } ); + + # Between (en|de)code_json and (to|from)_json, if you want to write + # a code which communicates to an outer world (encoded in UTF-8), + # recommend to use (en|de)code_json. + +=head1 VERSION + + 2.53 + +This version is compatible with JSON::XS B<2.27> and later. + + +=head1 NOTE + +JSON::PP was inculded in C distribution. +It comes to be a perl core module in Perl 5.14. +And L will be split away it. + +C distribution will inculde yet another JSON::PP modules. +They are JSNO::backportPP and so on. JSON.pm should work as it did at all. + +=head1 DESCRIPTION + + ************************** CAUTION ******************************** + * This is 'JSON module version 2' and there are many differences * + * to version 1.xx * + * Please check your applications useing old version. * + * See to 'INCOMPATIBLE CHANGES TO OLD VERSION' * + ******************************************************************* + +JSON (JavaScript Object Notation) is a simple data format. +See to L and C(L). + +This module converts Perl data structures to JSON and vice versa using either +L or L. + +JSON::XS is the fastest and most proper JSON module on CPAN which must be +compiled and installed in your environment. +JSON::PP is a pure-Perl module which is bundled in this distribution and +has a strong compatibility to JSON::XS. + +This module try to use JSON::XS by default and fail to it, use JSON::PP instead. +So its features completely depend on JSON::XS or JSON::PP. + +See to L. + +To distinguish the module name 'JSON' and the format type JSON, +the former is quoted by CEE (its results vary with your using media), +and the latter is left just as it is. + +Module name : C + +Format type : JSON + +=head2 FEATURES + +=over + +=item * correct unicode handling + +This module (i.e. backend modules) knows how to handle Unicode, documents +how and when it does so, and even documents what "correct" means. + +Even though there are limitations, this feature is available since Perl version 5.6. + +JSON::XS requires Perl 5.8.2 (but works correctly in 5.8.8 or later), so in older versions +C sholud call JSON::PP as the backend which can be used since Perl 5.005. + +With Perl 5.8.x JSON::PP works, but from 5.8.0 to 5.8.2, because of a Perl side problem, +JSON::PP works slower in the versions. And in 5.005, the Unicode handling is not available. +See to L for more information. + +See also to L +and L. + + +=item * round-trip integrity + +When you serialise a perl data structure using only data types supported +by JSON and Perl, the deserialised data structure is identical on the Perl +level. (e.g. the string "2.0" doesn't suddenly become "2" just because +it looks like a number). There I minor exceptions to this, read the +L section below to learn about those. + + +=item * strict checking of JSON correctness + +There is no guessing, no generating of illegal JSON texts by default, +and only JSON is accepted as input by default (the latter is a security +feature). + +See to L and L. + +=item * fast + +This module returns a JSON::XS object itself if available. +Compared to other JSON modules and other serialisers such as Storable, +JSON::XS usually compares favourably in terms of speed, too. + +If not available, C returns a JSON::PP object instead of JSON::XS and +it is very slow as pure-Perl. + +=item * simple to use + +This module has both a simple functional interface as well as an +object oriented interface interface. + +=item * reasonably versatile output formats + +You can choose between the most compact guaranteed-single-line format possible +(nice for simple line-based protocols), a pure-ASCII format (for when your transport +is not 8-bit clean, still supports the whole Unicode range), or a pretty-printed +format (for when you want to read that stuff). Or you can combine those features +in whatever way you like. + +=back + +=head1 FUNCTIONAL INTERFACE + +Some documents are copied and modified from L. +C and C are additional functions. + +=head2 encode_json + + $json_text = encode_json $perl_scalar + +Converts the given Perl data structure to a UTF-8 encoded, binary string. + +This function call is functionally identical to: + + $json_text = JSON->new->utf8->encode($perl_scalar) + +=head2 decode_json + + $perl_scalar = decode_json $json_text + +The opposite of C: expects an UTF-8 (binary) string and tries +to parse that as an UTF-8 encoded JSON text, returning the resulting +reference. + +This function call is functionally identical to: + + $perl_scalar = JSON->new->utf8->decode($json_text) + + +=head2 to_json + + $json_text = to_json($perl_scalar) + +Converts the given Perl data structure to a json string. + +This function call is functionally identical to: + + $json_text = JSON->new->encode($perl_scalar) + +Takes a hash reference as the second. + + $json_text = to_json($perl_scalar, $flag_hashref) + +So, + + $json_text = to_json($perl_scalar, {utf8 => 1, pretty => 1}) + +equivalent to: + + $json_text = JSON->new->utf8(1)->pretty(1)->encode($perl_scalar) + +If you want to write a modern perl code which communicates to outer world, +you should use C (supposed that JSON data are encoded in UTF-8). + +=head2 from_json + + $perl_scalar = from_json($json_text) + +The opposite of C: expects a json string and tries +to parse it, returning the resulting reference. + +This function call is functionally identical to: + + $perl_scalar = JSON->decode($json_text) + +Takes a hash reference as the second. + + $perl_scalar = from_json($json_text, $flag_hashref) + +So, + + $perl_scalar = from_json($json_text, {utf8 => 1}) + +equivalent to: + + $perl_scalar = JSON->new->utf8(1)->decode($json_text) + +If you want to write a modern perl code which communicates to outer world, +you should use C (supposed that JSON data are encoded in UTF-8). + +=head2 JSON::is_bool + + $is_boolean = JSON::is_bool($scalar) + +Returns true if the passed scalar represents either JSON::true or +JSON::false, two constants that act like C<1> and C<0> respectively +and are also used to represent JSON C and C in Perl strings. + +=head2 JSON::true + +Returns JSON true value which is blessed object. +It C JSON::Boolean object. + +=head2 JSON::false + +Returns JSON false value which is blessed object. +It C JSON::Boolean object. + +=head2 JSON::null + +Returns C. + +See L, below, for more information on how JSON values are mapped to +Perl. + +=head1 HOW DO I DECODE A DATA FROM OUTER AND ENCODE TO OUTER + +This section supposes that your perl vresion is 5.8 or later. + +If you know a JSON text from an outer world - a network, a file content, and so on, +is encoded in UTF-8, you should use C or C module object +with C enable. And the decoded result will contain UNICODE characters. + + # from network + my $json = JSON->new->utf8; + my $json_text = CGI->new->param( 'json_data' ); + my $perl_scalar = $json->decode( $json_text ); + + # from file content + local $/; + open( my $fh, '<', 'json.data' ); + $json_text = <$fh>; + $perl_scalar = decode_json( $json_text ); + +If an outer data is not encoded in UTF-8, firstly you should C it. + + use Encode; + local $/; + open( my $fh, '<', 'json.data' ); + my $encoding = 'cp932'; + my $unicode_json_text = decode( $encoding, <$fh> ); # UNICODE + + # or you can write the below code. + # + # open( my $fh, "<:encoding($encoding)", 'json.data' ); + # $unicode_json_text = <$fh>; + +In this case, C<$unicode_json_text> is of course UNICODE string. +So you B use C nor C module object with C enable. +Instead of them, you use C module object with C disable or C. + + $perl_scalar = $json->utf8(0)->decode( $unicode_json_text ); + # or + $perl_scalar = from_json( $unicode_json_text ); + +Or C and C: + + $perl_scalar = decode_json( encode( 'utf8', $unicode_json_text ) ); + # this way is not efficient. + +And now, you want to convert your C<$perl_scalar> into JSON data and +send it to an outer world - a network or a file content, and so on. + +Your data usually contains UNICODE strings and you want the converted data to be encoded +in UTF-8, you should use C or C module object with C enable. + + print encode_json( $perl_scalar ); # to a network? file? or display? + # or + print $json->utf8->encode( $perl_scalar ); + +If C<$perl_scalar> does not contain UNICODE but C<$encoding>-encoded strings +for some reason, then its characters are regarded as B for perl +(because it does not concern with your $encoding). +You B use C nor C module object with C enable. +Instead of them, you use C module object with C disable or C. +Note that the resulted text is a UNICODE string but no problem to print it. + + # $perl_scalar contains $encoding encoded string values + $unicode_json_text = $json->utf8(0)->encode( $perl_scalar ); + # or + $unicode_json_text = to_json( $perl_scalar ); + # $unicode_json_text consists of characters less than 0x100 + print $unicode_json_text; + +Or C all string values and C: + + $perl_scalar->{ foo } = decode( $encoding, $perl_scalar->{ foo } ); + # ... do it to each string values, then encode_json + $json_text = encode_json( $perl_scalar ); + +This method is a proper way but probably not efficient. + +See to L, L. + + +=head1 COMMON OBJECT-ORIENTED INTERFACE + +=head2 new + + $json = new JSON + +Returns a new C object inherited from either JSON::XS or JSON::PP +that can be used to de/encode JSON strings. + +All boolean flags described below are by default I. + +The mutators for flags all return the JSON object again and thus calls can +be chained: + + my $json = JSON->new->utf8->space_after->encode({a => [1,2]}) + => {"a": [1, 2]} + +=head2 ascii + + $json = $json->ascii([$enable]) + + $enabled = $json->get_ascii + +If $enable is true (or missing), then the encode method will not generate characters outside +the code range 0..127. Any Unicode characters outside that range will be escaped using either +a single \uXXXX or a double \uHHHH\uLLLLL escape sequence, as per RFC4627. + +If $enable is false, then the encode method will not escape Unicode characters unless +required by the JSON syntax or other flags. This results in a faster and more compact format. + +This feature depends on the used Perl version and environment. + +See to L if the backend is PP. + + JSON->new->ascii(1)->encode([chr 0x10401]) + => ["\ud801\udc01"] + +=head2 latin1 + + $json = $json->latin1([$enable]) + + $enabled = $json->get_latin1 + +If $enable is true (or missing), then the encode method will encode the resulting JSON +text as latin1 (or iso-8859-1), escaping any characters outside the code range 0..255. + +If $enable is false, then the encode method will not escape Unicode characters +unless required by the JSON syntax or other flags. + + JSON->new->latin1->encode (["\x{89}\x{abc}"] + => ["\x{89}\\u0abc"] # (perl syntax, U+abc escaped, U+89 not) + +=head2 utf8 + + $json = $json->utf8([$enable]) + + $enabled = $json->get_utf8 + +If $enable is true (or missing), then the encode method will encode the JSON result +into UTF-8, as required by many protocols, while the decode method expects to be handled +an UTF-8-encoded string. Please note that UTF-8-encoded strings do not contain any +characters outside the range 0..255, they are thus useful for bytewise/binary I/O. + +In future versions, enabling this option might enable autodetection of the UTF-16 and UTF-32 +encoding families, as described in RFC4627. + +If $enable is false, then the encode method will return the JSON string as a (non-encoded) +Unicode string, while decode expects thus a Unicode string. Any decoding or encoding +(e.g. to UTF-8 or UTF-16) needs to be done yourself, e.g. using the Encode module. + + +Example, output UTF-16BE-encoded JSON: + + use Encode; + $jsontext = encode "UTF-16BE", JSON::XS->new->encode ($object); + +Example, decode UTF-32LE-encoded JSON: + + use Encode; + $object = JSON::XS->new->decode (decode "UTF-32LE", $jsontext); + +See to L if the backend is PP. + + +=head2 pretty + + $json = $json->pretty([$enable]) + +This enables (or disables) all of the C, C and +C (and in the future possibly more) flags in one call to +generate the most readable (or most compact) form possible. + +Equivalent to: + + $json->indent->space_before->space_after + +The indent space length is three and JSON::XS cannot change the indent +space length. + +=head2 indent + + $json = $json->indent([$enable]) + + $enabled = $json->get_indent + +If C<$enable> is true (or missing), then the C method will use a multiline +format as output, putting every array member or object/hash key-value pair +into its own line, identing them properly. + +If C<$enable> is false, no newlines or indenting will be produced, and the +resulting JSON text is guarenteed not to contain any C. + +This setting has no effect when decoding JSON texts. + +The indent space length is three. +With JSON::PP, you can also access C to change indent space length. + + +=head2 space_before + + $json = $json->space_before([$enable]) + + $enabled = $json->get_space_before + +If C<$enable> is true (or missing), then the C method will add an extra +optional space before the C<:> separating keys from values in JSON objects. + +If C<$enable> is false, then the C method will not add any extra +space at those places. + +This setting has no effect when decoding JSON texts. + +Example, space_before enabled, space_after and indent disabled: + + {"key" :"value"} + + +=head2 space_after + + $json = $json->space_after([$enable]) + + $enabled = $json->get_space_after + +If C<$enable> is true (or missing), then the C method will add an extra +optional space after the C<:> separating keys from values in JSON objects +and extra whitespace after the C<,> separating key-value pairs and array +members. + +If C<$enable> is false, then the C method will not add any extra +space at those places. + +This setting has no effect when decoding JSON texts. + +Example, space_before and indent disabled, space_after enabled: + + {"key": "value"} + + +=head2 relaxed + + $json = $json->relaxed([$enable]) + + $enabled = $json->get_relaxed + +If C<$enable> is true (or missing), then C will accept some +extensions to normal JSON syntax (see below). C will not be +affected in anyway. I. I suggest only to use this option to +parse application-specific files written by humans (configuration files, +resource files etc.) + +If C<$enable> is false (the default), then C will only accept +valid JSON texts. + +Currently accepted extensions are: + +=over 4 + +=item * list items can have an end-comma + +JSON I array elements and key-value pairs with commas. This +can be annoying if you write JSON texts manually and want to be able to +quickly append elements, so this extension accepts comma at the end of +such items not just between them: + + [ + 1, + 2, <- this comma not normally allowed + ] + { + "k1": "v1", + "k2": "v2", <- this comma not normally allowed + } + +=item * shell-style '#'-comments + +Whenever JSON allows whitespace, shell-style comments are additionally +allowed. They are terminated by the first carriage-return or line-feed +character, after which more white-space and comments are allowed. + + [ + 1, # this comment not allowed in JSON + # neither this one... + ] + +=back + + +=head2 canonical + + $json = $json->canonical([$enable]) + + $enabled = $json->get_canonical + +If C<$enable> is true (or missing), then the C method will output JSON objects +by sorting their keys. This is adding a comparatively high overhead. + +If C<$enable> is false, then the C method will output key-value +pairs in the order Perl stores them (which will likely change between runs +of the same script). + +This option is useful if you want the same data structure to be encoded as +the same JSON text (given the same overall settings). If it is disabled, +the same hash might be encoded differently even if contains the same data, +as key-value pairs have no inherent ordering in Perl. + +This setting has no effect when decoding JSON texts. + +=head2 allow_nonref + + $json = $json->allow_nonref([$enable]) + + $enabled = $json->get_allow_nonref + +If C<$enable> is true (or missing), then the C method can convert a +non-reference into its corresponding string, number or null JSON value, +which is an extension to RFC4627. Likewise, C will accept those JSON +values instead of croaking. + +If C<$enable> is false, then the C method will croak if it isn't +passed an arrayref or hashref, as JSON texts must either be an object +or array. Likewise, C will croak if given something that is not a +JSON object or array. + + JSON->new->allow_nonref->encode ("Hello, World!") + => "Hello, World!" + +=head2 allow_unknown + + $json = $json->allow_unknown ([$enable]) + + $enabled = $json->get_allow_unknown + +If $enable is true (or missing), then "encode" will *not* throw an +exception when it encounters values it cannot represent in JSON (for +example, filehandles) but instead will encode a JSON "null" value. +Note that blessed objects are not included here and are handled +separately by c. + +If $enable is false (the default), then "encode" will throw an +exception when it encounters anything it cannot encode as JSON. + +This option does not affect "decode" in any way, and it is +recommended to leave it off unless you know your communications +partner. + +=head2 allow_blessed + + $json = $json->allow_blessed([$enable]) + + $enabled = $json->get_allow_blessed + +If C<$enable> is true (or missing), then the C method will not +barf when it encounters a blessed reference. Instead, the value of the +B option will decide whether C (C +disabled or no C method found) or a representation of the +object (C enabled and C method found) is being +encoded. Has no effect on C. + +If C<$enable> is false (the default), then C will throw an +exception when it encounters a blessed object. + + +=head2 convert_blessed + + $json = $json->convert_blessed([$enable]) + + $enabled = $json->get_convert_blessed + +If C<$enable> is true (or missing), then C, upon encountering a +blessed object, will check for the availability of the C method +on the object's class. If found, it will be called in scalar context +and the resulting scalar will be encoded instead of the object. If no +C method is found, the value of C will decide what +to do. + +The C method may safely call die if it wants. If C +returns other blessed objects, those will be handled in the same +way. C must take care of not causing an endless recursion cycle +(== crash) in this case. The name of C was chosen because other +methods called by the Perl core (== not by the user of the object) are +usually in upper case letters and to avoid collisions with the C +function or method. + +This setting does not yet influence C in any way. + +If C<$enable> is false, then the C setting will decide what +to do when a blessed object is found. + +=over + +=item convert_blessed_universally mode + +If use C with C<-convert_blessed_universally>, the C +subroutine is defined as the below code: + + *UNIVERSAL::TO_JSON = sub { + my $b_obj = B::svref_2object( $_[0] ); + return $b_obj->isa('B::HV') ? { %{ $_[0] } } + : $b_obj->isa('B::AV') ? [ @{ $_[0] } ] + : undef + ; + } + +This will cause that C method converts simple blessed objects into +JSON objects as non-blessed object. + + JSON -convert_blessed_universally; + $json->allow_blessed->convert_blessed->encode( $blessed_object ) + +This feature is experimental and may be removed in the future. + +=back + +=head2 filter_json_object + + $json = $json->filter_json_object([$coderef]) + +When C<$coderef> is specified, it will be called from C each +time it decodes a JSON object. The only argument passed to the coderef +is a reference to the newly-created hash. If the code references returns +a single scalar (which need not be a reference), this value +(i.e. a copy of that scalar to avoid aliasing) is inserted into the +deserialised data structure. If it returns an empty list +(NOTE: I C, which is a valid scalar), the original deserialised +hash will be inserted. This setting can slow down decoding considerably. + +When C<$coderef> is omitted or undefined, any existing callback will +be removed and C will not change the deserialised hash in any +way. + +Example, convert all JSON objects into the integer 5: + + my $js = JSON->new->filter_json_object (sub { 5 }); + # returns [5] + $js->decode ('[{}]'); # the given subroutine takes a hash reference. + # throw an exception because allow_nonref is not enabled + # so a lone 5 is not allowed. + $js->decode ('{"a":1, "b":2}'); + + +=head2 filter_json_single_key_object + + $json = $json->filter_json_single_key_object($key [=> $coderef]) + +Works remotely similar to C, but is only called for +JSON objects having a single key named C<$key>. + +This C<$coderef> is called before the one specified via +C, if any. It gets passed the single value in the JSON +object. If it returns a single value, it will be inserted into the data +structure. If it returns nothing (not even C but the empty list), +the callback from C will be called next, as if no +single-key callback were specified. + +If C<$coderef> is omitted or undefined, the corresponding callback will be +disabled. There can only ever be one callback for a given key. + +As this callback gets called less often then the C +one, decoding speed will not usually suffer as much. Therefore, single-key +objects make excellent targets to serialise Perl objects into, especially +as single-key JSON objects are as close to the type-tagged value concept +as JSON gets (it's basically an ID/VALUE tuple). Of course, JSON does not +support this in any way, so you need to make sure your data never looks +like a serialised Perl hash. + +Typical names for the single object key are C<__class_whatever__>, or +C<$__dollars_are_rarely_used__$> or C<}ugly_brace_placement>, or even +things like C<__class_md5sum(classname)__>, to reduce the risk of clashing +with real hashes. + +Example, decode JSON objects of the form C<< { "__widget__" => } >> +into the corresponding C<< $WIDGET{} >> object: + + # return whatever is in $WIDGET{5}: + JSON + ->new + ->filter_json_single_key_object (__widget__ => sub { + $WIDGET{ $_[0] } + }) + ->decode ('{"__widget__": 5') + + # this can be used with a TO_JSON method in some "widget" class + # for serialisation to json: + sub WidgetBase::TO_JSON { + my ($self) = @_; + + unless ($self->{id}) { + $self->{id} = ..get..some..id..; + $WIDGET{$self->{id}} = $self; + } + + { __widget__ => $self->{id} } + } + + +=head2 shrink + + $json = $json->shrink([$enable]) + + $enabled = $json->get_shrink + +With JSON::XS, this flag resizes strings generated by either +C or C to their minimum size possible. This can save +memory when your JSON texts are either very very long or you have many +short strings. It will also try to downgrade any strings to octet-form +if possible: perl stores strings internally either in an encoding called +UTF-X or in octet-form. The latter cannot store everything but uses less +space in general (and some buggy Perl or C code might even rely on that +internal representation being used). + +With JSON::PP, it is noop about resizing strings but tries +C to the returned string by C. See to L. + +See to L and L. + +=head2 max_depth + + $json = $json->max_depth([$maximum_nesting_depth]) + + $max_depth = $json->get_max_depth + +Sets the maximum nesting level (default C<512>) accepted while encoding +or decoding. If a higher nesting level is detected in JSON text or a Perl +data structure, then the encoder and decoder will stop and croak at that +point. + +Nesting level is defined by number of hash- or arrayrefs that the encoder +needs to traverse to reach a given point or the number of C<{> or C<[> +characters without their matching closing parenthesis crossed to reach a +given character in a string. + +If no argument is given, the highest possible setting will be used, which +is rarely useful. + +Note that nesting is implemented by recursion in C. The default value has +been chosen to be as large as typical operating systems allow without +crashing. (JSON::XS) + +With JSON::PP as the backend, when a large value (100 or more) was set and +it de/encodes a deep nested object/text, it may raise a warning +'Deep recursion on subroutin' at the perl runtime phase. + +See L for more info on why this is useful. + +=head2 max_size + + $json = $json->max_size([$maximum_string_size]) + + $max_size = $json->get_max_size + +Set the maximum length a JSON text may have (in bytes) where decoding is +being attempted. The default is C<0>, meaning no limit. When C +is called on a string that is longer then this many bytes, it will not +attempt to decode the string but throw an exception. This setting has no +effect on C (yet). + +If no argument is given, the limit check will be deactivated (same as when +C<0> is specified). + +See L, below, for more info on why this is useful. + +=head2 encode + + $json_text = $json->encode($perl_scalar) + +Converts the given Perl data structure (a simple scalar or a reference +to a hash or array) to its JSON representation. Simple scalars will be +converted into JSON string or number sequences, while references to arrays +become JSON arrays and references to hashes become JSON objects. Undefined +Perl values (e.g. C) become JSON C values. +References to the integers C<0> and C<1> are converted into C and C. + +=head2 decode + + $perl_scalar = $json->decode($json_text) + +The opposite of C: expects a JSON text and tries to parse it, +returning the resulting simple scalar or reference. Croaks on error. + +JSON numbers and strings become simple Perl scalars. JSON arrays become +Perl arrayrefs and JSON objects become Perl hashrefs. C becomes +C<1> (C), C becomes C<0> (C) and +C becomes C. + +=head2 decode_prefix + + ($perl_scalar, $characters) = $json->decode_prefix($json_text) + +This works like the C method, but instead of raising an exception +when there is trailing garbage after the first JSON object, it will +silently stop parsing there and return the number of characters consumed +so far. + + JSON->new->decode_prefix ("[1] the tail") + => ([], 3) + +See to L + +=head2 property + + $boolean = $json->property($property_name) + +Returns a boolean value about above some properties. + +The available properties are C, C, C, +C,C, C, C, C, +C, C, C, C, +C, C and C. + + $boolean = $json->property('utf8'); + => 0 + $json->utf8; + $boolean = $json->property('utf8'); + => 1 + +Sets the property with a given boolean value. + + $json = $json->property($property_name => $boolean); + +With no argumnt, it returns all the above properties as a hash reference. + + $flag_hashref = $json->property(); + +=head1 INCREMENTAL PARSING + +Most of this section are copied and modified from L. + +In some cases, there is the need for incremental parsing of JSON texts. +This module does allow you to parse a JSON stream incrementally. +It does so by accumulating text until it has a full JSON object, which +it then can decode. This process is similar to using C +to see if a full JSON object is available, but is much more efficient +(and can be implemented with a minimum of method calls). + +The backend module will only attempt to parse the JSON text once it is sure it +has enough text to get a decisive result, using a very simple but +truly incremental parser. This means that it sometimes won't stop as +early as the full parser, for example, it doesn't detect parenthese +mismatches. The only thing it guarantees is that it starts decoding as +soon as a syntactically valid JSON text has been seen. This means you need +to set resource limits (e.g. C) to ensure the parser will stop +parsing in the presence if syntax errors. + +The following methods implement this incremental parser. + +=head2 incr_parse + + $json->incr_parse( [$string] ) # void context + + $obj_or_undef = $json->incr_parse( [$string] ) # scalar context + + @obj_or_empty = $json->incr_parse( [$string] ) # list context + +This is the central parsing function. It can both append new text and +extract objects from the stream accumulated so far (both of these +functions are optional). + +If C<$string> is given, then this string is appended to the already +existing JSON fragment stored in the C<$json> object. + +After that, if the function is called in void context, it will simply +return without doing anything further. This can be used to add more text +in as many chunks as you want. + +If the method is called in scalar context, then it will try to extract +exactly I JSON object. If that is successful, it will return this +object, otherwise it will return C. If there is a parse error, +this method will croak just as C would do (one can then use +C to skip the errornous part). This is the most common way of +using the method. + +And finally, in list context, it will try to extract as many objects +from the stream as it can find and return them, or the empty list +otherwise. For this to work, there must be no separators between the JSON +objects or arrays, instead they must be concatenated back-to-back. If +an error occurs, an exception will be raised as in the scalar context +case. Note that in this case, any previously-parsed JSON texts will be +lost. + +Example: Parse some JSON arrays/objects in a given string and return them. + + my @objs = JSON->new->incr_parse ("[5][7][1,2]"); + +=head2 incr_text + + $lvalue_string = $json->incr_text + +This method returns the currently stored JSON fragment as an lvalue, that +is, you can manipulate it. This I works when a preceding call to +C in I successfully returned an object. Under +all other circumstances you must not call this function (I mean it. +although in simple tests it might actually work, it I fail under +real world conditions). As a special exception, you can also call this +method before having parsed anything. + +This function is useful in two cases: a) finding the trailing text after a +JSON object or b) parsing multiple JSON objects separated by non-JSON text +(such as commas). + + $json->incr_text =~ s/\s*,\s*//; + +In Perl 5.005, C attribute is not available. +You must write codes like the below: + + $string = $json->incr_text; + $string =~ s/\s*,\s*//; + $json->incr_text( $string ); + +=head2 incr_skip + + $json->incr_skip + +This will reset the state of the incremental parser and will remove the +parsed text from the input buffer. This is useful after C +died, in which case the input buffer and incremental parser state is left +unchanged, to skip the text parsed so far and to reset the parse state. + +=head2 incr_reset + + $json->incr_reset + +This completely resets the incremental parser, that is, after this call, +it will be as if the parser had never parsed anything. + +This is useful if you want ot repeatedly parse JSON objects and want to +ignore any trailing data, which means you have to reset the parser after +each successful decode. + +See to L for examples. + + +=head1 JSON::PP SUPPORT METHODS + +The below methods are JSON::PP own methods, so when C works +with JSON::PP (i.e. the created object is a JSON::PP object), available. +See to L in detail. + +If you use C with additonal C<-support_by_pp>, some methods +are available even with JSON::XS. See to L. + + BEING { $ENV{PERL_JSON_BACKEND} = 'JSON::XS' } + + use JSON -support_by_pp; + + my $json = new JSON; + $json->allow_nonref->escape_slash->encode("/"); + + # functional interfaces too. + print to_json(["/"], {escape_slash => 1}); + print from_json('["foo"]', {utf8 => 1}); + +If you do not want to all functions but C<-support_by_pp>, +use C<-no_export>. + + use JSON -support_by_pp, -no_export; + # functional interfaces are not exported. + +=head2 allow_singlequote + + $json = $json->allow_singlequote([$enable]) + +If C<$enable> is true (or missing), then C will accept +any JSON strings quoted by single quotations that are invalid JSON +format. + + $json->allow_singlequote->decode({"foo":'bar'}); + $json->allow_singlequote->decode({'foo':"bar"}); + $json->allow_singlequote->decode({'foo':'bar'}); + +As same as the C option, this option may be used to parse +application-specific files written by humans. + +=head2 allow_barekey + + $json = $json->allow_barekey([$enable]) + +If C<$enable> is true (or missing), then C will accept +bare keys of JSON object that are invalid JSON format. + +As same as the C option, this option may be used to parse +application-specific files written by humans. + + $json->allow_barekey->decode('{foo:"bar"}'); + +=head2 allow_bignum + + $json = $json->allow_bignum([$enable]) + +If C<$enable> is true (or missing), then C will convert +the big integer Perl cannot handle as integer into a L +object and convert a floating number (any) into a L. + +On the contary, C converts C objects and C +objects into JSON numbers with C enable. + + $json->allow_nonref->allow_blessed->allow_bignum; + $bigfloat = $json->decode('2.000000000000000000000000001'); + print $json->encode($bigfloat); + # => 2.000000000000000000000000001 + +See to L aboout the conversion of JSON number. + +=head2 loose + + $json = $json->loose([$enable]) + +The unescaped [\x00-\x1f\x22\x2f\x5c] strings are invalid in JSON strings +and the module doesn't allow to C to these (except for \x2f). +If C<$enable> is true (or missing), then C will accept these +unescaped strings. + + $json->loose->decode(qq|["abc + def"]|); + +See to L. + +=head2 escape_slash + + $json = $json->escape_slash([$enable]) + +According to JSON Grammar, I (U+002F) is escaped. But by default +JSON backend modules encode strings without escaping slash. + +If C<$enable> is true (or missing), then C will escape slashes. + +=head2 indent_length + + $json = $json->indent_length($length) + +With JSON::XS, The indent space length is 3 and cannot be changed. +With JSON::PP, it sets the indent space length with the given $length. +The default is 3. The acceptable range is 0 to 15. + +=head2 sort_by + + $json = $json->sort_by($function_name) + $json = $json->sort_by($subroutine_ref) + +If $function_name or $subroutine_ref are set, its sort routine are used. + + $js = $pc->sort_by(sub { $JSON::PP::a cmp $JSON::PP::b })->encode($obj); + # is($js, q|{"a":1,"b":2,"c":3,"d":4,"e":5,"f":6,"g":7,"h":8,"i":9}|); + + $js = $pc->sort_by('own_sort')->encode($obj); + # is($js, q|{"a":1,"b":2,"c":3,"d":4,"e":5,"f":6,"g":7,"h":8,"i":9}|); + + sub JSON::PP::own_sort { $JSON::PP::a cmp $JSON::PP::b } + +As the sorting routine runs in the JSON::PP scope, the given +subroutine name and the special variables C<$a>, C<$b> will begin +with 'JSON::PP::'. + +If $integer is set, then the effect is same as C on. + +See to L. + +=head1 MAPPING + +This section is copied from JSON::XS and modified to C. +JSON::XS and JSON::PP mapping mechanisms are almost equivalent. + +See to L. + +=head2 JSON -> PERL + +=over 4 + +=item object + +A JSON object becomes a reference to a hash in Perl. No ordering of object +keys is preserved (JSON does not preserver object key ordering itself). + +=item array + +A JSON array becomes a reference to an array in Perl. + +=item string + +A JSON string becomes a string scalar in Perl - Unicode codepoints in JSON +are represented by the same codepoints in the Perl string, so no manual +decoding is necessary. + +=item number + +A JSON number becomes either an integer, numeric (floating point) or +string scalar in perl, depending on its range and any fractional parts. On +the Perl level, there is no difference between those as Perl handles all +the conversion details, but an integer may take slightly less memory and +might represent more values exactly than floating point numbers. + +If the number consists of digits only, C will try to represent +it as an integer value. If that fails, it will try to represent it as +a numeric (floating point) value if that is possible without loss of +precision. Otherwise it will preserve the number as a string value (in +which case you lose roundtripping ability, as the JSON number will be +re-encoded toa JSON string). + +Numbers containing a fractional or exponential part will always be +represented as numeric (floating point) values, possibly at a loss of +precision (in which case you might lose perfect roundtripping ability, but +the JSON number will still be re-encoded as a JSON number). + +Note that precision is not accuracy - binary floating point values cannot +represent most decimal fractions exactly, and when converting from and to +floating point, C only guarantees precision up to but not including +the leats significant bit. + +If the backend is JSON::PP and C is enable, the big integers +and the numeric can be optionally converted into L and +L objects. + +=item true, false + +These JSON atoms become C and C, +respectively. They are overloaded to act almost exactly like the numbers +C<1> and C<0>. You can check wether a scalar is a JSON boolean by using +the C function. + +If C and C are used as strings or compared as strings, +they represent as C and C respectively. + + print JSON::true . "\n"; + => true + print JSON::true + 1; + => 1 + + ok(JSON::true eq 'true'); + ok(JSON::true eq '1'); + ok(JSON::true == 1); + +C will install these missing overloading features to the backend modules. + + +=item null + +A JSON null atom becomes C in Perl. + +C returns C. + +=back + + +=head2 PERL -> JSON + +The mapping from Perl to JSON is slightly more difficult, as Perl is a +truly typeless language, so we can only guess which JSON type is meant by +a Perl value. + +=over 4 + +=item hash references + +Perl hash references become JSON objects. As there is no inherent ordering +in hash keys (or JSON objects), they will usually be encoded in a +pseudo-random order that can change between runs of the same program but +stays generally the same within a single run of a program. C +optionally sort the hash keys (determined by the I flag), so +the same datastructure will serialise to the same JSON text (given same +settings and version of JSON::XS), but this incurs a runtime overhead +and is only rarely useful, e.g. when you want to compare some JSON text +against another for equality. + +In future, the ordered object feature will be added to JSON::PP using C mechanism. + + +=item array references + +Perl array references become JSON arrays. + +=item other references + +Other unblessed references are generally not allowed and will cause an +exception to be thrown, except for references to the integers C<0> and +C<1>, which get turned into C and C atoms in JSON. You can +also use C and C to improve readability. + + to_json [\0,JSON::true] # yields [false,true] + +=item JSON::true, JSON::false, JSON::null + +These special values become JSON true and JSON false values, +respectively. You can also use C<\1> and C<\0> directly if you want. + +JSON::null returns C. + +=item blessed objects + +Blessed objects are not directly representable in JSON. See the +C and C methods on various options on +how to deal with this: basically, you can choose between throwing an +exception, encoding the reference as if it weren't blessed, or provide +your own serialiser method. + +With C mode, C converts blessed +hash references or blessed array references (contains other blessed references) +into JSON members and arrays. + + use JSON -convert_blessed_universally; + JSON->new->allow_blessed->convert_blessed->encode( $blessed_object ); + +See to L. + +=item simple scalars + +Simple Perl scalars (any scalar that is not a reference) are the most +difficult objects to encode: JSON::XS and JSON::PP will encode undefined scalars as +JSON C values, scalars that have last been used in a string context +before encoding as JSON strings, and anything else as number value: + + # dump as number + encode_json [2] # yields [2] + encode_json [-3.0e17] # yields [-3e+17] + my $value = 5; encode_json [$value] # yields [5] + + # used as string, so dump as string + print $value; + encode_json [$value] # yields ["5"] + + # undef becomes null + encode_json [undef] # yields [null] + +You can force the type to be a string by stringifying it: + + my $x = 3.1; # some variable containing a number + "$x"; # stringified + $x .= ""; # another, more awkward way to stringify + print $x; # perl does it for you, too, quite often + +You can force the type to be a number by numifying it: + + my $x = "3"; # some variable containing a string + $x += 0; # numify it, ensuring it will be dumped as a number + $x *= 1; # same thing, the choise is yours. + +You can not currently force the type in other, less obscure, ways. + +Note that numerical precision has the same meaning as under Perl (so +binary to decimal conversion follows the same rules as in Perl, which +can differ to other languages). Also, your perl interpreter might expose +extensions to the floating point numbers of your platform, such as +infinities or NaN's - these cannot be represented in JSON, and it is an +error to pass those in. + +=item Big Number + +If the backend is JSON::PP and C is enable, +C converts C objects and C +objects into JSON numbers. + + +=back + +=head1 JSON and ECMAscript + +See to L. + +=head1 JSON and YAML + +JSON is not a subset of YAML. +See to L. + + +=head1 BACKEND MODULE DECISION + +When you use C, C tries to C JSON::XS. If this call failed, it will +C JSON::PP. The required JSON::XS version is I<2.2> or later. + +The C constructor method returns an object inherited from the backend module, +and JSON::XS object is a blessed scaler reference while JSON::PP is a blessed hash +reference. + +So, your program should not depend on the backend module, especially +returned objects should not be modified. + + my $json = JSON->new; # XS or PP? + $json->{stash} = 'this is xs object'; # this code may raise an error! + +To check the backend module, there are some methods - C, C and C. + + JSON->backend; # 'JSON::XS' or 'JSON::PP' + + JSON->backend->is_pp: # 0 or 1 + + JSON->backend->is_xs: # 1 or 0 + + $json->is_xs; # 1 or 0 + + $json->is_pp; # 0 or 1 + + +If you set an enviornment variable C, The calling action will be changed. + +=over + +=item PERL_JSON_BACKEND = 0 or PERL_JSON_BACKEND = 'JSON::PP' + +Always use JSON::PP + +=item PERL_JSON_BACKEND == 1 or PERL_JSON_BACKEND = 'JSON::XS,JSON::PP' + +(The default) Use compiled JSON::XS if it is properly compiled & installed, +otherwise use JSON::PP. + +=item PERL_JSON_BACKEND == 2 or PERL_JSON_BACKEND = 'JSON::XS' + +Always use compiled JSON::XS, die if it isn't properly compiled & installed. + +=item PERL_JSON_BACKEND = 'JSON::backportPP' + +Always use JSON::backportPP. +JSON::backportPP is JSON::PP back port module. +C includs JSON::backportPP instead of JSON::PP. + +=back + +These ideas come from L mechanism. + +example: + + BEGIN { $ENV{PERL_JSON_BACKEND} = 'JSON::PP' } + use JSON; # always uses JSON::PP + +In future, it may be able to specify another module. + +=head1 USE PP FEATURES EVEN THOUGH XS BACKEND + +Many methods are available with either JSON::XS or JSON::PP and +when the backend module is JSON::XS, if any JSON::PP specific (i.e. JSON::XS unspported) +method is called, it will C and be noop. + +But If you C C passing the optional string C<-support_by_pp>, +it makes a part of those unupported methods available. +This feature is achieved by using JSON::PP in C. + + BEGIN { $ENV{PERL_JSON_BACKEND} = 2 } # with JSON::XS + use JSON -support_by_pp; + my $json = new JSON; + $json->allow_nonref->escape_slash->encode("/"); + +At this time, the returned object is a C +object (re-blessed XS object), and by checking JSON::XS unsupported flags +in de/encoding, can support some unsupported methods - C, C, +C, C, C and C. + +When any unsupported methods are not enable, C will be +used as is. The switch is achieved by changing the symbolic tables. + +C<-support_by_pp> is effective only when the backend module is JSON::XS +and it makes the de/encoding speed down a bit. + +See to L. + +=head1 INCOMPATIBLE CHANGES TO OLD VERSION + +There are big incompatibility between new version (2.00) and old (1.xx). +If you use old C 1.xx in your code, please check it. + +See to L + +=over + +=item jsonToObj and objToJson are obsoleted. + +Non Perl-style name C and C are obsoleted +(but not yet deleted from the source). +If you use these functions in your code, please replace them +with C and C. + + +=item Global variables are no longer available. + +C class variables - C<$JSON::AUTOCONVERT>, C<$JSON::BareKey>, etc... +- are not available any longer. +Instead, various features can be used through object methods. + + +=item Package JSON::Converter and JSON::Parser are deleted. + +Now C bundles with JSON::PP which can handle JSON more properly than them. + +=item Package JSON::NotString is deleted. + +There was C class which represents JSON value C, C, C +and numbers. It was deleted and replaced by C. + +C represents C and C. + +C does not represent C. + +C returns C. + +C makes L and L is-a relation +to L. + +=item function JSON::Number is obsoleted. + +C is now needless because JSON::XS and JSON::PP have +round-trip integrity. + +=item JSONRPC modules are deleted. + +Perl implementation of JSON-RPC protocol - C, C +and C are deleted in this distribution. +Instead of them, there is L which supports JSON-RPC protocol version 1.1. + +=back + +=head2 Transition ways from 1.xx to 2.xx. + +You should set C mode firstly, because +it is always successful for the below codes even with JSON::XS. + + use JSON -support_by_pp; + +=over + +=item Exported jsonToObj (simple) + + from_json($json_text); + +=item Exported objToJson (simple) + + to_json($perl_scalar); + +=item Exported jsonToObj (advanced) + + $flags = {allow_barekey => 1, allow_singlequote => 1}; + from_json($json_text, $flags); + +equivalent to: + + $JSON::BareKey = 1; + $JSON::QuotApos = 1; + jsonToObj($json_text); + +=item Exported objToJson (advanced) + + $flags = {allow_blessed => 1, allow_barekey => 1}; + to_json($perl_scalar, $flags); + +equivalent to: + + $JSON::BareKey = 1; + objToJson($perl_scalar); + +=item jsonToObj as object method + + $json->decode($json_text); + +=item objToJson as object method + + $json->encode($perl_scalar); + +=item new method with parameters + +The C method in 2.x takes any parameters no longer. +You can set parameters instead; + + $json = JSON->new->pretty; + +=item $JSON::Pretty, $JSON::Indent, $JSON::Delimiter + +If C is enable, that means C<$JSON::Pretty> flag set. And +C<$JSON::Delimiter> was substituted by C and C. +In conclusion: + + $json->indent->space_before->space_after; + +Equivalent to: + + $json->pretty; + +To change indent length, use C. + +(Only with JSON::PP, if C<-support_by_pp> is not used.) + + $json->pretty->indent_length(2)->encode($perl_scalar); + +=item $JSON::BareKey + +(Only with JSON::PP, if C<-support_by_pp> is not used.) + + $json->allow_barekey->decode($json_text) + +=item $JSON::ConvBlessed + +use C<-convert_blessed_universally>. See to L. + +=item $JSON::QuotApos + +(Only with JSON::PP, if C<-support_by_pp> is not used.) + + $json->allow_singlequote->decode($json_text) + +=item $JSON::SingleQuote + +Disable. C does not make such a invalid JSON string any longer. + +=item $JSON::KeySort + + $json->canonical->encode($perl_scalar) + +This is the ascii sort. + +If you want to use with your own sort routine, check the C method. + +(Only with JSON::PP, even if C<-support_by_pp> is used currently.) + + $json->sort_by($sort_routine_ref)->encode($perl_scalar) + + $json->sort_by(sub { $JSON::PP::a <=> $JSON::PP::b })->encode($perl_scalar) + +Can't access C<$a> and C<$b> but C<$JSON::PP::a> and C<$JSON::PP::b>. + +=item $JSON::SkipInvalid + + $json->allow_unknown + +=item $JSON::AUTOCONVERT + +Needless. C backend modules have the round-trip integrity. + +=item $JSON::UTF8 + +Needless because C (JSON::XS/JSON::PP) sets +the UTF8 flag on properly. + + # With UTF8-flagged strings + + $json->allow_nonref; + $str = chr(1000); # UTF8-flagged + + $json_text = $json->utf8(0)->encode($str); + utf8::is_utf8($json_text); + # true + $json_text = $json->utf8(1)->encode($str); + utf8::is_utf8($json_text); + # false + + $str = '"' . chr(1000) . '"'; # UTF8-flagged + + $perl_scalar = $json->utf8(0)->decode($str); + utf8::is_utf8($perl_scalar); + # true + $perl_scalar = $json->utf8(1)->decode($str); + # died because of 'Wide character in subroutine' + +See to L. + +=item $JSON::UnMapping + +Disable. See to L. + +=item $JSON::SelfConvert + +This option was deleted. +Instead of it, if a givien blessed object has the C method, +C will be executed with C. + + $json->convert_blessed->encode($bleesed_hashref_or_arrayref) + # if need, call allow_blessed + +Note that it was C in old version, but now not C but C. + +=back + +=head1 TODO + +=over + +=item example programs + +=back + +=head1 THREADS + +No test with JSON::PP. If with JSON::XS, See to L. + + +=head1 BUGS + +Please report bugs relevant to C to Emakamaka[at]cpan.orgE. + + +=head1 SEE ALSO + +Most of the document is copied and modified from JSON::XS doc. + +L, L + +C(L) + +=head1 AUTHOR + +Makamaka Hannyaharamitu, Emakamaka[at]cpan.orgE + +JSON::XS was written by Marc Lehmann + +The relese of this new version owes to the courtesy of Marc Lehmann. + + +=head1 COPYRIGHT AND LICENSE + +Copyright 2005-2011 by Makamaka Hannyaharamitu + +This library is free software; you can redistribute it and/or modify +it under the same terms as Perl itself. + +=cut + diff --git a/tools/Makefile b/tools/Makefile new file mode 100755 index 0000000..c968134 --- /dev/null +++ b/tools/Makefile @@ -0,0 +1,152 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright 2019 Western Digital Corporation or its affiliates. +# +# 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. +# + +# Check for RV_ROOT +ifeq (,$(wildcard ${RV_ROOT}/configs/swerv.config)) +$(error env var RV_ROOT does not point to a valid dir! Exiting!) +endif + +# Allow snapshot override +target = default +snapshot = $(target) + +# Allow tool override +SWERV_CONFIG = ${RV_ROOT}/configs/swerv.config +IRUN = xrun +VCS = vcs +VERILATOR = verilator +GCC_PREFIX = riscv64-unknown-elf +BUILD_DIR = snapshots/${snapshot} +TBDIR = ${RV_ROOT}/testbench + +# Define test name +TEST = hello_world2 + +# Define test name +TEST_DIR = ${RV_ROOT}/testbench/asm + +ifdef debug + DEBUG_PLUS = +dumpon + IRUN_DEBUG = -access +rc + IRUN_DEBUG_RUN = -input ${RV_ROOT}/testbench/input.tcl +endif + +# provide specific link file +ifeq (,$(wildcard $(TEST_DIR)/$(TEST).ld)) + LINK = $(TBDIR)/link.ld +else + LINK = $(TEST_DIR)/$(TEST).ld +endif + +VPATH = $(TEST_DIR) $(BUILD_DIR) $(TBDIR) +TBFILES = $(TBDIR)/tb_top.sv $(TBDIR)/ahb_sif.sv + +defines = $(BUILD_DIR)/common_defines.vh +defines += ${RV_ROOT}/design/include/el2_def.sv +defines += $(BUILD_DIR)/el2_pdef.vh +includes = -I${BUILD_DIR} + +# CFLAGS for verilator generated Makefiles. Without -std=c++11 it +# complains for `auto` variables +CFLAGS += "-std=c++11" + +# Optimization for better performance; alternative is nothing for +# slower runtime (faster compiles) -O2 for faster runtime (slower +# compiles), or -O for balance. +VERILATOR_MAKE_FLAGS = OPT_FAST="-O2" + +# Targets +all: clean verilator + +clean: + rm -rf *.log *.s *.hex *.dis *.tbl irun* vcs* simv* snapshots swerv* \ + verilator* *.exe obj* *.o ucli.key vc_hdrs.h csrc *.csv + +# If define files do not exist, then run swerv.config. +${BUILD_DIR}/defines.h : + BUILD_PATH=${BUILD_DIR} ${RV_ROOT}/configs/swerv.config -target=$(target) + +verilator-build: ${TBFILES} ${BUILD_DIR}/defines.h test_tb_top.cpp + echo '`undef ASSERT_ON' >> ${BUILD_DIR}/common_defines.vh + $(VERILATOR) '-UASSERT_ON' --cc -CFLAGS ${CFLAGS} $(defines) \ + $(includes) -I${RV_ROOT}/testbench -f ${RV_ROOT}/testbench/flist \ + -Wno-WIDTH -Wno-UNOPTFLAT ${TBFILES} --top-module tb_top \ + -exe test_tb_top.cpp --trace --autoflush + cp ${RV_ROOT}/testbench/test_tb_top.cpp obj_dir/ + $(MAKE) -C obj_dir/ -f Vtb_top.mk $(VERILATOR_MAKE_FLAGS) + touch verilator-build + +vcs-build: ${TBFILES} ${BUILD_DIR}/defines.h + $(VCS) -full64 -assert svaext -sverilog +define+RV_OPENSOURCE \ + +error+500 +incdir+${RV_ROOT}/design/lib \ + +incdir+${RV_ROOT}/design/include ${BUILD_DIR}/common_defines.vh \ + +incdir+$(BUILD_DIR) +libext+.v $(defines) \ + -f ${RV_ROOT}/testbench/flist ${TBFILES} -l vcs.log + touch vcs-build + +irun-build: ${TBFILES} ${BUILD_DIR}/defines.h + $(IRUN) -64bit -elaborate $(IRUN_DEBUG) -q -sv -sysv -nowarn CUVIHR \ + -xmlibdirpath . -xmlibdirname swerv.build \ + -incdir ${RV_ROOT}/design/lib -incdir ${RV_ROOT}/design/include \ + -vlog_ext +.vh+.h $(defines) -incdir $(BUILD_DIR) \ + -f ${RV_ROOT}/testbench/flist -top tb_top ${TBFILES} \ + -I${RV_ROOT}/testbench -elaborate -snapshot ${snapshot} + touch irun-build + +verilator: program.hex verilator-build + ./obj_dir/Vtb_top ${DEBUG_PLUS} + +irun: program.hex irun-build + $(IRUN) -64bit -abvglobalfailurelimit 1 +lic_queue -licqueue \ + -status -xmlibdirpath . -xmlibdirname swerv.build \ + -snapshot ${snapshot} -r $(snapshot) $(IRUN_DEBUG_RUN) + +vcs: program.hex vcs-build + ./simv $(DEBUG_PLUS) +vcs+lic+wait -l vcs.log + +program.hex: $(TEST).o $(LINK) + @echo Building $(TEST) +ifeq ($(shell which $(GCC_PREFIX)-as),) + @echo " !!! No $(GCC_PREFIX)-as in path, using canned hex files !!" + cp ${RV_ROOT}/testbench/hex/*.hex . +else +ifeq (,$(wildcard $(TEST_DIR)/$(TEST).makefile)) + $(GCC_PREFIX)-ld -m elf32lriscv --discard-none -T$(LINK) -o $(TEST).exe $(TEST).o + $(GCC_PREFIX)-objcopy -O verilog --only-section ".data*" --change-section-lma .data=0 $(TEST).exe data.hex + $(GCC_PREFIX)-objcopy -O verilog --only-section ".text" $(TEST).exe program.hex + $(GCC_PREFIX)-objdump -S $(TEST).exe > $(TEST).dis + $(GCC_PREFIX)-nm -f posix -C $(TEST).exe > $(TEST).tbl + @echo Completed building $(TEST) +else + $(MAKE) -f $(TEST_DIR)/$(TEST).makefile +endif +endif + +%.o : %.s ${BUILD_DIR}/defines.h + $(GCC_PREFIX)-cpp -I${BUILD_DIR} $< > $(TEST).cpp.s + $(GCC_PREFIX)-as -march=rv32gc $(TEST).cpp.s -o $(TEST).o + +TEST_CFLAGS = -g -O3 -funroll-all-loops +ABI = -mabi=ilp32 -march=rv32imc + +%.o : %.c ${BUILD_DIR}/defines.h + $(GCC_PREFIX)-gcc -I${BUILD_DIR} ${TEST_CFLAGS} ${ABI} -nostdlib -c $< -o $@ + +help: + @echo Make sure the environment variable RV_ROOT is set. + @echo Possible targets: verilator vcs irun help clean all verilator-build irun-build vcs-build program.hex + +.PHONY: help clean verilator vcs irun diff --git a/tools/addassign b/tools/addassign new file mode 100755 index 0000000..c1b9998 --- /dev/null +++ b/tools/addassign @@ -0,0 +1,46 @@ +#!/usr/bin/perl + +use Getopt::Long; + +$helpusage = "placeholder"; + +GetOptions ('in=s' => \$in, + 'prefix=s' => \$prefix) || die("$helpusage"); + + + +@in=`cat $in`; + + +foreach $line (@in) { + + if ($line=~/\#/) { next; } + + if ($line=~/([^=]+)=/) { + $sig=$1; + $sig=~s/\s+//g; + printf("logic $sig;\n"); + } +} + +foreach $line (@in) { + + if ($line=~/\#/) { next; } + + if ($line=~/([^=]+)=\s*;/) { + printf("assign ${prefix}$1 = 1'b0;\n"); + next; + } + + if ($line=~/([^=]+)=\s*\(\s*\);/) { + printf("assign ${prefix}$1 = 1'b0;\n"); + next; + } + + if ($line =~ /=/) { printf("assign ${prefix}$line"); } + else { printf("$line"); } +} + + +exit; + diff --git a/tools/coredecode b/tools/coredecode new file mode 100755 index 0000000..f2ce7ef --- /dev/null +++ b/tools/coredecode @@ -0,0 +1,198 @@ +#!/usr/bin/perl + +use Getopt::Long; + +$helpusage = "placeholder"; + +GetOptions ('legal' => \$legal, + 'in=s' => \$in, + 'out=s' => \$out, + 'view=s' => \$view ) || die("$helpusage"); + + +if (!defined($in)) { die("must define -in=input"); } +if (!defined($out)) { $out="${in}.out"; } + +if ($in eq "decode") { $view="rv32i"; } +elsif ($in eq "cdecode") { $view="rv32c"; } +elsif ($in eq "csrdecode") { $view="csr"; } + +if (defined($in)) { printf("in=$in\n"); } +if (defined($out)) { printf("out=$out\n"); } +if (defined($view)) { printf("view=$view\n"); } + +@in=`cat $in`; + +$gather=0; + +$TIMEOUT=50; + +foreach $line (@in) { + + #printf("$pstate: $line"); + + if ($line=~/^\s*\#/) { #printf("skip $line"); + next; } + + if ($gather==1) { + if ($line=~/(\S+)/) { + if ($line=~/}/) { $gather=0; $position=0; next; } + $label=$1; + $label=~s/,//g; + if ($pstate==2) { + if (defined($INPUT{$CVIEW}{$label})) { die("input $label already defined"); } + $INPUT{$CVIEW}{$label}=$position++; + $INPUTLEN{$CVIEW}++; + $INPUTSTR{$CVIEW}.=" $label"; + } + elsif ($pstate==3) { + if (defined($OUTPUT{$CVIEW}{$label})) { die("output $label already defined"); } + $OUTPUT{$CVIEW}{$label}=$position++; + $OUTPUTLEN{$CVIEW}++; + $OUTPUTSTR{$CVIEW}.=" $label"; + } + else { die("unknown pstate $pstate in gather"); } + } + } + + if ($line=~/^.definition/) { + $pstate=1; next; + } + if ($pstate==1) { # definition + if ($line!~/^.output/) { + if ($line=~/(\S+)\s*=\s*(\S+)/) { + $key=$1; $value=$2; + $value=~s/\./-/g; + $value=~s/\[//g; + $value=~s/\]//g; + $DEFINITION{$key}=$value; + } + } + else { $pstate=2; next; } + } + + if ($line=~/^.input/) { + $pstate=2; next; + } + + if ($pstate==2) { # input + if ($line=~/(\S+)\s*=\s*\{/) { + $CVIEW=$1; $gather=1; next; + } + } + + if ($line=~/^.output/) { + $pstate=3; next; + } + + if ($pstate==3) { # output + if ($line=~/(\S+)\s*=\s*\{/) { + $CVIEW=$1; $gather=1; next; + } + } + + if ($line=~/^.decode/) { + $pstate=4; next; + } + + if ($pstate==4) { # decode + if ($line=~/([^\[]+)\[([^\]]+)\]\s*=\s*\{([^\}]+)\}/) { + $dview=$1; $inst=$2; $body=$3; + $dview=~s/\s+//g; + $inst=~s/\s+//g; + #printf("$dview $inst $body\n"); + if ($inst=~/([^\{]+)\{([^-]+)-([^\}]+)\}/) { + $base=$1; $lo=$2; $hi=$3; + $hi++; + for ($i=0; $i<$TIMEOUT && $lo ne $hi; $i++) { + #printf("decode $dview $base$lo\n"); + + $expand=$base.$lo; + if (!defined($DEFINITION{$expand})) { die("could not find instruction definition for inst $expand"); } + + $DECODE{$dview}{$expand}=$body; + $lo++; + } + if ($i == $TIMEOUT) { die("timeout in decode expansion"); } + + } + else { + if (!defined($DEFINITION{$inst})) { die("could not find instruction definition for inst $inst"); } + $DECODE{$dview}{$inst}=$body; + } + } + } + +} + + +#printf("view $view len %d\n",$OUTPUTLEN{$view}); + +#printf("$OUTPUTSTR{$view}\n"); + + +# need to switch this somehow based on 16/32 +printf(".i %d\n",$INPUTLEN{$view}); + +if (defined($legal)) { + printf(".o 1\n"); +} +else { + printf(".o %d\n",$OUTPUTLEN{$view}); +} + +printf(".ilb %s\n",$INPUTSTR{$view}); + +if (defined($legal)) { + printf(".ob legal\n"); +} +else { + printf(".ob %s\n",$OUTPUTSTR{$view}); +} + +if (defined($legal)) { + printf(".type fd\n"); +} +else { + printf(".type fr\n"); +} + +$DEFAULT_TEMPLATE='0'x$OUTPUTLEN{$view}; + +foreach $inst (sort keys %{ $DECODE{$view} }) { + + $body=$DECODE{$view}{$inst}; + @sigs=split(' ',$body); + + $template=$DEFAULT_TEMPLATE; + foreach $sig (@sigs) { + if (!defined($OUTPUT{$view}{$sig})) { die("could not find output definition for sig $sig in view $view"); } + $position=$OUTPUT{$view}{$sig}; + substr($template,$position,1,1); + } + +# if (!defined($DEFINITION{$inst})) { die("could not find instruction defintion for inst $inst"); } + + printf("# $inst\n"); + if (defined($legal)) { + printf("$DEFINITION{$inst} 1\n"); + } + else { + printf("$DEFINITION{$inst} $template\n"); + } + +} + + +exit; + +foreach $inst (sort keys %DEFINITION) { + $value=$DEFINITION{$inst}; + printf("%-10s = $value\n",$inst); +} + + +foreach $sig (sort keys %{ $OUTPUT{$view} }) { + $position=$OUTPUT{$view}{$sig}; + printf("$sig $position\n"); +} diff --git a/tools/picmap b/tools/picmap new file mode 100755 index 0000000..06df0d5 --- /dev/null +++ b/tools/picmap @@ -0,0 +1,59 @@ +#!/usr/bin/perl + +use Getopt::Long; + +use integer; + +$helpusage = "placeholder"; + +GetOptions ('total_int=s' => \$total_int)|| die("$helpusage"); + +$LEN=15; + +#printf("logic [2:0] mask;\n"); + +printf("// mask[3:0] = { 4'b1000 - 30b mask,4'b0100 - 31b mask, 4'b0010 - 28b mask, 4'b0001 - 32b mask }\n"); +printf("always_comb begin\n"); +printf(" case \(address[14:0]\)\n"); +printf(" 15'b011000000000000 : mask[3:0] = 4'b0100;\n"); +for ($i=1; $i<=$total_int; $i++) { + $j=hex("4000"); + printf(" 15'b%s : mask[3:0] = 4'b1000;\n",d2b($j+$i*4)); +} +for ($i=1; $i<=$total_int; $i++) { + $j=hex("2000"); + printf(" 15'b%s : mask[3:0] = 4'b0100;\n",d2b($j+$i*4)); +} +for ($i=1; $i<=$total_int; $i++) { + $j=hex("0"); + printf(" 15'b%s : mask[3:0] = 4'b0010;\n",d2b($j+$i*4)); +} + printf(" %-17s : mask[3:0] = 4'b0001;\n","default"); +printf(" endcase\n"); +printf("end\n"); + + +sub b2d { + my ($v) = @_; + + $v = oct("0b" . $v); + + return($v); +} + +sub d2b { + my ($v) = @_; + + my $repeat; + + $v = sprintf "%b",$v; + if (length($v)<$LEN) { + $repeat=$LEN-length($v); + $v="0"x$repeat.$v; + } + elsif (length($v)>$LEN) { + $v=substr($v,length($v)-$LEN,$LEN); + } + + return($v); +} diff --git a/tools/smalldiv b/tools/smalldiv new file mode 100755 index 0000000..48495be --- /dev/null +++ b/tools/smalldiv @@ -0,0 +1,121 @@ +#!/usr/bin/perl + +use Getopt::Long; + +use integer; + +$helpusage = "placeholder"; + +GetOptions ('len=s' => \$len, + 'num=s' => \$num, + 'den=s' => \$den, + 'skip' => \$skip) || die("$helpusage"); + +if (!defined($len)) { $len=8; } +$LEN=$len; + +$n=d2b($num); # numerator - quotient +$m=d2b($den); # denominator - divisor + + +printf(".i 8\n"); +printf(".o 4\n"); +printf(".ilb q_ff[3] q_ff[2] q_ff[1] q_ff[0] m_ff[3] m_ff[2] m_ff[1] m_ff[0]\n"); +printf(".ob smallnum[3] smallnum[2] smallnum[1] smallnum[0]\n"); +printf(".type fr\n"); +for ($q=0; $q<16; $q++) { + for ($m=0; $m<16; $m++) { + if ($m==0) { next; } + $result=int($q/$m); + printf("%s %s %s\n",d2bl($q,4),d2bl($m,4),d2bl($result,4)); + } +} + +exit; + +#$LEN=length($n); + +$a="0"x$LEN; +$q=$n; + +#printf("n=%s, m=%s\n",$n,$m); +#printf("a=%s, q=%s\n",$a,$q); + +for ($i=1; $i<=$LEN; $i++) { + + #printf("iteration $n:\n"); + + printf("$i: a=%s q=%s\n",$a,$q); + + + $signa = substr($a,0,1); + + + $a = substr($a.$q,1,$LEN); # new a with q shifted in + + if ($signa==0) { $a=b2d($a)-b2d($m); } + else { $a=b2d($a)+b2d($m); } + + $a=d2b($a); + + + $signa = substr($a,0,1); + if ($signa==0) { $q=substr($q,1,$LEN-1)."1"; } + else { $q=substr($q,1,$LEN-1)."0"; } + +} + + +#printf("a=$a\n"); +$signa = substr($a,0,1); +if ($signa==1 && !defined($skip)) { + printf("correction:\n"); + $a=b2d($a)+b2d($m); + $a=d2b($a); +} +#printf("a=$a\n"); +printf("%d / %d = %d R %d ",b2d($n),b2d($m),b2d($q),b2d($a)); +if ($a eq $n) { printf("-> remainder equal numerator\n"); } +else { printf("\n"); } + +sub b2d { + my ($v) = @_; + + $v = oct("0b" . $v); + + return($v); +} + +sub d2b { + my ($v) = @_; + + my $repeat; + + $v = sprintf "%b",$v; + if (length($v)<$LEN) { + $repeat=$LEN-length($v); + $v="0"x$repeat.$v; + } + elsif (length($v)>$LEN) { + $v=substr($v,length($v)-$LEN,$LEN); + } + + return($v); +} + +sub d2bl { + my ($v,$LEN) = @_; + + my $repeat; + + $v = sprintf "%b",$v; + if (length($v)<$LEN) { + $repeat=$LEN-length($v); + $v="0"x$repeat.$v; + } + elsif (length($v)>$LEN) { + $v=substr($v,length($v)-$LEN,$LEN); + } + + return($v); +} diff --git a/tools/unrollforverilator b/tools/unrollforverilator new file mode 100755 index 0000000..1b686fc --- /dev/null +++ b/tools/unrollforverilator @@ -0,0 +1,169 @@ +#!/usr/bin/perl +#use strict; +#use warnings; + +my $RV_ROOT = $ENV{RV_ROOT}; + +my $TOTAL_INT=$ARGV[0]; +print "// argv=".$ARGV[0]."\n"; +my $NUM_LEVELS; +if($TOTAL_INT==2){$NUM_LEVELS=1;} +elsif ($TOTAL_INT==4){$NUM_LEVELS=2;} +elsif ($TOTAL_INT==8){$NUM_LEVELS=3;} +elsif ($TOTAL_INT==16){$NUM_LEVELS=4;} +elsif ($TOTAL_INT==32){$NUM_LEVELS=5;} +elsif ($TOTAL_INT==64){$NUM_LEVELS=6;} +elsif ($TOTAL_INT==128){$NUM_LEVELS=7;} +elsif ($TOTAL_INT==256){$NUM_LEVELS=8;} +elsif ($TOTAL_INT==512){$NUM_LEVELS=9;} +elsif ($TOTAL_INT==1024){$NUM_LEVELS=10;} +else {$NUM_LEVELS=int(log($TOTAL_INT)/log(2))+1;} +print ("// TOTAL_INT=".$TOTAL_INT." NUM_LEVELS=".$NUM_LEVELS."\n"); +$next_level = 1; +print ("`ifdef RV_PIC_2CYCLE\n"); +if($TOTAL_INT > 2){ +print ("// LEVEL0\n"); +print ("logic [TOTAL_INT+2:0] [INTPRIORITY_BITS-1:0] level_intpend_w_prior_en_".$next_level.";\n"); +print ("logic [TOTAL_INT+2:0] [ID_BITS-1:0] level_intpend_id_".$next_level.";\n"); +print (" for (m=0; m<=(TOTAL_INT)/(2**(".$next_level.")) ; m++) begin : COMPARE0\n"); +print (" if ( m == (TOTAL_INT)/(2**(".$next_level."))) begin \n"); +print (" assign level_intpend_w_prior_en_".$next_level."[m+1] = '0 ;\n"); +print (" assign level_intpend_id_".$next_level."[m+1] = '0 ;\n"); +print (" end\n"); +print (" el2_cmp_and_mux #(\n"); +print (" .ID_BITS(ID_BITS),\n"); +print (" .INTPRIORITY_BITS(INTPRIORITY_BITS)) cmp_l".$next_level." (\n"); +print (" .a_id(level_intpend_id[0][2*m]),\n"); +print (" .a_priority(level_intpend_w_prior_en[0][2*m]),\n"); +print (" .b_id(level_intpend_id[0][2*m+1]),\n"); +print (" .b_priority(level_intpend_w_prior_en[0][2*m+1]),\n"); +print (" .out_id(level_intpend_id_".$next_level."[m]),\n"); +print (" .out_priority(level_intpend_w_prior_en_".$next_level."[m])) ;\n"); +print (" \n"); +print (" end\n\n"); +for (my $l=1; $l

Firz9b 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�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ⅇha~Dyu%`Z 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�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