From 16d93410a5a7cff625162279f120f6ece0ae02ab Mon Sep 17 00:00:00 2001
From: Erik Kooistra <kooistra@astron.nl>
Date: Wed, 21 Jan 2015 07:23:18 +0000
Subject: [PATCH] Added DDR4 simulation model for 4GByte and 8Byte. See
 README.txt for description.

---
 .../ip_arria10/ddr4_mem_model_141/README.txt  |  114 ++
 .../ddr4_mem_model_141/compile_ip.tcl         |   61 +
 .../ddr4_mem_model_141/diff_mem_model.sh      |   65 +
 .../ddr4_mem_model_141/generate_mem_model.sh  |   59 +
 .../ip_arria10/ddr4_mem_model_141/hdllib.cfg  |   14 +
 ..._sim_altera_emif_mem_model_141_z3tvrmq.vhd |  328 ++++
 ..._sim_altera_emif_mem_model_141_oes36qy.vhd |  328 ++++
 .../ddr4_core/altera_emif_ddr4_crc_tree.sv    |   72 +
 .../altera_emif_ddr4_model_rcd_chip.sv        |  129 ++
 .../sim/ddr4_core/altera_emif_ddrx_model.sv   |  265 +++
 .../altera_emif_ddrx_model_bidir_delay.sv     |   53 +
 .../altera_emif_ddrx_model_per_device.sv      |  362 ++++
 .../altera_emif_ddrx_model_per_ping_pong.sv   |  186 ++
 .../ddr4_core/altera_emif_ddrx_model_rank.sv  | 1597 +++++++++++++++++
 .../mentor/altera_emif_ddr4_crc_tree.sv       |  125 ++
 .../mentor/altera_emif_ddr4_model_rcd_chip.sv |  137 ++
 .../mentor/altera_emif_ddrx_model.sv          |  384 ++++
 .../altera_emif_ddrx_model_bidir_delay.sv     |   76 +
 .../altera_emif_ddrx_model_per_device.sv      |  397 ++++
 .../altera_emif_ddrx_model_per_ping_pong.sv   |  291 +++
 .../mentor/altera_emif_ddrx_model_rank.sv     | 1423 +++++++++++++++
 21 files changed, 6466 insertions(+)
 create mode 100644 libraries/technology/ip_arria10/ddr4_mem_model_141/README.txt
 create mode 100644 libraries/technology/ip_arria10/ddr4_mem_model_141/compile_ip.tcl
 create mode 100755 libraries/technology/ip_arria10/ddr4_mem_model_141/diff_mem_model.sh
 create mode 100755 libraries/technology/ip_arria10/ddr4_mem_model_141/generate_mem_model.sh
 create mode 100644 libraries/technology/ip_arria10/ddr4_mem_model_141/hdllib.cfg
 create mode 100644 libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_4g_1600/ed_sim_altera_emif_mem_model_141_z3tvrmq.vhd
 create mode 100644 libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_8g_2400/ed_sim_altera_emif_mem_model_141_oes36qy.vhd
 create mode 100644 libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_core/altera_emif_ddr4_crc_tree.sv
 create mode 100644 libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_core/altera_emif_ddr4_model_rcd_chip.sv
 create mode 100644 libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_core/altera_emif_ddrx_model.sv
 create mode 100644 libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_core/altera_emif_ddrx_model_bidir_delay.sv
 create mode 100644 libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_core/altera_emif_ddrx_model_per_device.sv
 create mode 100644 libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_core/altera_emif_ddrx_model_per_ping_pong.sv
 create mode 100644 libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_core/altera_emif_ddrx_model_rank.sv
 create mode 100644 libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_core/mentor/altera_emif_ddr4_crc_tree.sv
 create mode 100644 libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_core/mentor/altera_emif_ddr4_model_rcd_chip.sv
 create mode 100644 libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_core/mentor/altera_emif_ddrx_model.sv
 create mode 100644 libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_core/mentor/altera_emif_ddrx_model_bidir_delay.sv
 create mode 100644 libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_core/mentor/altera_emif_ddrx_model_per_device.sv
 create mode 100644 libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_core/mentor/altera_emif_ddrx_model_per_ping_pong.sv
 create mode 100644 libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_core/mentor/altera_emif_ddrx_model_rank.sv

diff --git a/libraries/technology/ip_arria10/ddr4_mem_model_141/README.txt b/libraries/technology/ip_arria10/ddr4_mem_model_141/README.txt
new file mode 100644
index 0000000000..59bbb65023
--- /dev/null
+++ b/libraries/technology/ip_arria10/ddr4_mem_model_141/README.txt
@@ -0,0 +1,114 @@
+README.txt for $RADIOHDL/libraries/technology/ip_arria10/ddr4_mem_model
+
+1) DDR4 memory simulation model
+2) Automated scripts and one time manual actions
+3) Usage
+3) Remarks
+
+
+1) DDR4 memory simulation model
+
+The DDR memory model is obtained from the example design that can be generated with Qsys when a DDR IP component is defined.
+The first DDR4 component that was created is available via:
+
+  $env(RADIOHDL)/libraries/technology/ip_arria10/ddr4_4g_1600/ip_arria10_ddr4_4g_1600.qsys
+
+Unfortunately the example design needs to be created via the GUI by pressing the 'Example Design...' button, because the qsys-generate command
+that is used in ddr4_4g_1600/generate_ip.sh to create the component does not have an option to also create the example design. After that the
+ddr4_mem_model/generate_mem_model.sh needs to be ran to roll out the directories and files of the example design. 
+The manual intervenion via the GUI is stands in the way of an automated flow. Therefore the files in the example design that describe the DDR
+memory model have been copied to a fixed location in SVN. In this way it is no longer necessary to create the example design.
+
+In the example design for ddr4_4g_1600 the generic core files of the DDR model are located at:
+
+  $env(RADIOHDL)/libraries/technology/ip_arria10/ddr4_4g_1600/emif_0_example_design/sim/altera_emif_mem_model_core_ddr4_141
+
+The size specific entity of the DDR model is created in:
+
+  $env(RADIOHDL)/libraries/technology/ip_arria10/ddr4_4g_1600/emif_0_example_design/sim/altera_emif_mem_model_141/ed_sim_altera_emif_mem_model_141_z3tvrmq.vhd
+
+The generic core files of the DDR memory model are the same for every DDR size. These files only depend on the Quartus tool version as indicated by 141
+(Quartus 14.1) in their name. Therefore the generic core files have been copied to:
+
+  $env(RADIOHDL)/libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_core
+
+The size specific DDR component file is copied to:
+
+  $env(RADIOHDL)/libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_4g_1600/ed_sim_altera_emif_mem_model_141_z3tvrmq.vhd
+  
+and other size DDR component files can be store there as well.
+
+The ddr4_mem_model_141/sim is kept in SVN. Hence for each new size of DDR memory the example design needs to be created only once. The size specific
+entity of that example design is then copied and kept at ddr4_mem_model_141/sim in SVN. The generic core files of the DDR model are already in SVN,
+but it is good to manually check with Linux 'diff' as in diff_mem_model.sh that they are indeed the same as for a newly generated example design.
+
+  ddr4_mem_model_141/sim/ddr4_core         # DDR core model files
+  ddr4_mem_model_141/sim/ddr4_4g_1600      # specific DDR4 size model file
+  ddr4_mem_model_141/sim/ddr4_8g_2400      # specific DDR4 size model file
+  
+
+2) Automated scripts and one time manual actions
+
+Relative to $RADIOHDL/libraries/technology/ip_arria10/:
+
+- ddr4_4g_1600/ip_arria10_ddr4_4g_1600.qsys : Qsys definition file for size and speed specific DDR4 controller
+- ddr4_4g_1600/generate_ip.sh               : Use qsys-generate to create the size and speed specific DDR4 controller
+
+- GUI --> open ip_arria10_ddr4_4g_1600.qsys --> press the 'Example Design...' button --> run ddr4_mem_model/generate_mem_model.sh:
+  . ddr4_4g_1600/emif_0_example_design/sim/altera_emif_mem_model_core_ddr4_141/*
+  . ddr4_4g_1600/emif_0_example_design/sim/altera_emif_mem_model_141/ed_sim_altera_emif_mem_model_141_z3tvrmq.vhd
+  
+- Copied these DDR memory model files to ddr4_mem_model_141/sim and commited them to SVN
+
+- ddr4_mem_model/compile_ip.tcl             : Modelsim compile HDL script
+
+The ddr4_mem_model/compile_ip.tcl script compiles the HDL files of the DDR4 memory model in the ddr4_mem_model Modelsim project. Therefore
+the ddr4_mem_model/compile_ip.tcl is listed at the modelsim_compile_ip_files key in the ddr4_mem_model/hdllib.cfg
+
+The DDR model ed_sim_altera_emif_mem_model_core_ddr4_141.vhd file assumes that the generic core files are from a VHDL library called
+ed_sim_altera_emif_mem_model_core_ddr4_141. Therefore this name is used as hdl_library_clause_name in the ddr4_mem_model/hdllib.cfg.
+
+Using a dedicated ddr4_mem_model_<version> directory for the DDR memory model is necessary because then it can have a hdllib.cfg and a
+hdl_library_clause_name. Furthermore it is necessary to have a directrory per version, because each version will have another VHDL library
+name and per hdllib.cfg there can only be one hdl_library_clause_name. 
+
+
+3) Usage
+
+a) Existing DDR4 memory models
+   Since the DDR4 memory models are in SVN they do not need tobe generated.
+   
+b) New DDR4 memory models
+
+   The following procedure shows how the models in SVN can be recreated or how a new device specific DDR4 model can be created.
+   With the DDR4 memory models for the core files and the specific devices ddr4_4g_1600 and ddr4_8g_2400 the following yield no diff.
+
+     > cd ddr4_4g_1600/
+     > ./generate_ip.sh 
+     > run_quartus unb2 &  # manually open ip_arria10_ddr4_4g_1600.qsys and press the 'Example Design...' button 
+     >
+     > cd ../ddr4_8g_2400/
+     > ./generate_ip.sh 
+     > run_quartus unb2 &  # manually open ip_arria10_ddr4_84g_2400.qsys and press the 'Example Design...' button 
+     > 
+     > cd ../ddr4_mem_model_141/
+     > ./generate_mem_model.sh ../ddr4_4g_1600/emif_0_example_design
+     > ./generate_mem_model.sh ../ddr4_8g_2400/ddr4_inst_example_design
+
+
+
+4) Remarks
+
+a) If the example design for a specific size DDR could have been created automatically, then probably it would have been preferred to not keep the
+   DDR4 memory model files in SVN.
+   
+b) If a new version of Quartus is used then it may be necessary to recreate all the example design model files in a new directory
+   ddr4_mem_model_<version>. However the DDR memory model is plain HDL so strictly speaking it does not depend FPGA device or
+   Quartus version, therefore it should be possible to keep on using the ddr4_mem_model_141. Still a newer version of Quartus
+   may provide a better and faster model.
+
+c) The Quartus 14.1 DDR4 IP and memory model simulate much slower than the DDR3 IP and memory model of Quartus 11.1 that are used for UniBoard1.
+   In simulation it is the memory storage and the access rate that are important, DDR3 and DDR4 are quite similar from that point of view.
+   A work around to speed up simulation in applications could therefore be to use the io_ddr with DDR3 IP to model DDR4. For the DDR4 controller
+   test bench it is of course still necessary to use the DDR4 IP and DDR4 memory model, because that test bench verifies the DDR4 functionality
+   in simulation and shows that it will also work on hardware.
diff --git a/libraries/technology/ip_arria10/ddr4_mem_model_141/compile_ip.tcl b/libraries/technology/ip_arria10/ddr4_mem_model_141/compile_ip.tcl
new file mode 100644
index 0000000000..ff31689fcc
--- /dev/null
+++ b/libraries/technology/ip_arria10/ddr4_mem_model_141/compile_ip.tcl
@@ -0,0 +1,61 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (C) 2015
+# ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/>
+# JIVE (Joint Institute for VLBI in Europe) <http://www.jive.nl/>
+# P.O.Box 2, 7990 AA Dwingeloo, The Netherlands
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+#------------------------------------------------------------------------------
+
+# This file is based on Qsys-generated file $RADIOHDL/libraries/technology/ip_arria10/ddr4_4g_1600/emif_0_example_design/sim/mentor/msim_setup.tcl.
+# 
+set IP_DIR "$env(RADIOHDL)/libraries/technology/ip_arria10/ddr4_mem_model_141"
+
+# Assume library work already exists
+vmap ed_sim_altera_emif_mem_model_core_ddr4_141 ./work/
+
+# Compile the design files in correct order and map them all to library work
+
+#------------------------------------------------------------------------------
+# generic DDR memory model core files
+#------------------------------------------------------------------------------
+# . Readable files
+vlog -sv "$IP_DIR/sim/ddr4_core/altera_emif_ddrx_model.sv"               -work work
+vlog -sv "$IP_DIR/sim/ddr4_core/altera_emif_ddrx_model_per_ping_pong.sv" -work work
+vlog -sv "$IP_DIR/sim/ddr4_core/altera_emif_ddrx_model_per_device.sv"    -work work
+vlog -sv "$IP_DIR/sim/ddr4_core/altera_emif_ddr4_crc_tree.sv"            -work work
+vlog -sv "$IP_DIR/sim/ddr4_core/altera_emif_ddrx_model_rank.sv"          -work work
+vlog -sv "$IP_DIR/sim/ddr4_core/altera_emif_ddr4_model_rcd_chip.sv"      -work work
+vlog -sv "$IP_DIR/sim/ddr4_core/altera_emif_ddrx_model_bidir_delay.sv"   -work work
+# . Binary files
+#vlog -sv "$IP_DIR/sim/ddr4_core/mentor/altera_emif_ddrx_model.sv"               -work work
+#vlog -sv "$IP_DIR/sim/ddr4_core/mentor/altera_emif_ddrx_model_per_ping_pong.sv" -work work
+#vlog -sv "$IP_DIR/sim/ddr4_core/mentor/altera_emif_ddrx_model_per_device.sv"    -work work
+#vlog -sv "$IP_DIR/sim/ddr4_core/mentor/altera_emif_ddr4_crc_tree.sv"            -work work
+#vlog -sv "$IP_DIR/sim/ddr4_core/mentor/altera_emif_ddrx_model_rank.sv"          -work work
+#vlog -sv "$IP_DIR/sim/ddr4_core/mentor/altera_emif_ddr4_model_rcd_chip.sv"      -work work
+#vlog -sv "$IP_DIR/sim/ddr4_core/mentor/altera_emif_ddrx_model_bidir_delay.sv"   -work work 
+
+
+#------------------------------------------------------------------------------
+# Size specific DDR component files
+#------------------------------------------------------------------------------
+
+# . ddr4_4g_1600
+vcom     "$IP_DIR/sim/ddr4_4g_1600/ed_sim_altera_emif_mem_model_141_z3tvrmq.vhd"             -work work
+
+# . ddr4_8g_2400
+vcom     "$IP_DIR/sim/ddr4_8g_2400/ed_sim_altera_emif_mem_model_141_oes36qy.vhd"             -work work
\ No newline at end of file
diff --git a/libraries/technology/ip_arria10/ddr4_mem_model_141/diff_mem_model.sh b/libraries/technology/ip_arria10/ddr4_mem_model_141/diff_mem_model.sh
new file mode 100755
index 0000000000..32f282b561
--- /dev/null
+++ b/libraries/technology/ip_arria10/ddr4_mem_model_141/diff_mem_model.sh
@@ -0,0 +1,65 @@
+#!/bin/bash
+# -------------------------------------------------------------------------- #
+#
+# Copyright (C) 2015
+# ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/>
+# JIVE (Joint Institute for VLBI in Europe) <http://www.jive.nl/>           
+# P.O.Box 2, 7990 AA Dwingeloo, The Netherlands                             
+#                                                                           
+# This program is free software: you can redistribute it and/or modify      
+# it under the terms of the GNU General Public License as published by      
+# the Free Software Foundation, either version 3 of the License, or         
+# (at your option) any later version.                                       
+#                                                                           
+# This program is distributed in the hope that it will be useful,           
+# but WITHOUT ANY WARRANTY; without even the implied warranty of            
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the             
+# GNU General Public License for more details.                              
+#                                                                           
+# You should have received a copy of the GNU General Public License         
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.     
+#
+# -------------------------------------------------------------------------- #
+#
+# Purpose: Compare DDR4 memory model core files with Qsys example design core files
+# Description:
+#   The DDR4 memory model core files do not depend on the size and speed of the specific DDR4 example design.
+#   Therefore there shouldbe no diffs.
+# Usage:
+#
+#   ./diff_mem_model.sh <path to specific DDR4 example design>
+#
+#   eg:
+#
+#   ./diff_mem_model.sh $RADIOHDL/libraries/technology/ip_arria10/ddr4_4g_1600/emif_0_example_design
+#
+
+EXAMPLE_DESIGN_DIR=${1}
+
+CORE_DIR="${EXAMPLE_DESIGN_DIR}/sim/altera_emif_mem_model_core_ddr4_141/sim"
+
+SIM_DIR="${RADIOHDL}/libraries/technology/ip_arria10/ddr4_mem_model_141/sim"
+
+# DDR4 memory model core files
+diff ${SIM_DIR}/ddr4_core/altera_emif_ddr4_crc_tree.sv                    ${CORE_DIR}/altera_emif_ddr4_crc_tree.sv           
+diff ${SIM_DIR}/ddr4_core/altera_emif_ddr4_model_rcd_chip.sv              ${CORE_DIR}/altera_emif_ddr4_model_rcd_chip.sv     
+diff ${SIM_DIR}/ddr4_core/altera_emif_ddrx_model_bidir_delay.sv           ${CORE_DIR}/altera_emif_ddrx_model_bidir_delay.sv  
+diff ${SIM_DIR}/ddr4_core/altera_emif_ddrx_model_per_device.sv            ${CORE_DIR}/altera_emif_ddrx_model_per_device.sv   
+diff ${SIM_DIR}/ddr4_core/altera_emif_ddrx_model_per_ping_pong.sv         ${CORE_DIR}/altera_emif_ddrx_model_per_ping_pong.sv
+diff ${SIM_DIR}/ddr4_core/altera_emif_ddrx_model_rank.sv                  ${CORE_DIR}/altera_emif_ddrx_model_rank.sv         
+diff ${SIM_DIR}/ddr4_core/altera_emif_ddrx_model.sv                       ${CORE_DIR}/altera_emif_ddrx_model.sv              
+
+diff ${SIM_DIR}/ddr4_core/mentor/altera_emif_ddr4_crc_tree.sv             ${CORE_DIR}/mentor/altera_emif_ddr4_crc_tree.sv           
+diff ${SIM_DIR}/ddr4_core/mentor/altera_emif_ddr4_model_rcd_chip.sv       ${CORE_DIR}/mentor/altera_emif_ddr4_model_rcd_chip.sv     
+diff ${SIM_DIR}/ddr4_core/mentor/altera_emif_ddrx_model_bidir_delay.sv    ${CORE_DIR}/mentor/altera_emif_ddrx_model_bidir_delay.sv  
+diff ${SIM_DIR}/ddr4_core/mentor/altera_emif_ddrx_model_per_device.sv     ${CORE_DIR}/mentor/altera_emif_ddrx_model_per_device.sv   
+diff ${SIM_DIR}/ddr4_core/mentor/altera_emif_ddrx_model_per_ping_pong.sv  ${CORE_DIR}/mentor/altera_emif_ddrx_model_per_ping_pong.sv
+diff ${SIM_DIR}/ddr4_core/mentor/altera_emif_ddrx_model_rank.sv           ${CORE_DIR}/mentor/altera_emif_ddrx_model_rank.sv         
+diff ${SIM_DIR}/ddr4_core/mentor/altera_emif_ddrx_model.sv                ${CORE_DIR}/mentor/altera_emif_ddrx_model.sv              
+
+# DDR4 memory model device specific files
+DEVICE_DIR="${EXAMPLE_DESIGN_DIR}/sim/altera_emif_mem_model_141/sim"
+
+# Uncomment the line below to check that a recreated device specific DDR4 model is the same asthat in SVN
+#diff ${SIM_DIR}/ddr4_4g_1600/ed_sim_altera_emif_mem_model_141_z3tvrmq.vhd ${DEVICE_DIR}/ed_sim_altera_emif_mem_model_141_z3tvrmq.vhd
+#diff ${SIM_DIR}/ddr4_8g_2400/ed_sim_altera_emif_mem_model_141_oes36qy.vhd ${DEVICE_DIR}/ed_sim_altera_emif_mem_model_141_oes36qy.vhd
diff --git a/libraries/technology/ip_arria10/ddr4_mem_model_141/generate_mem_model.sh b/libraries/technology/ip_arria10/ddr4_mem_model_141/generate_mem_model.sh
new file mode 100755
index 0000000000..d001ff86d3
--- /dev/null
+++ b/libraries/technology/ip_arria10/ddr4_mem_model_141/generate_mem_model.sh
@@ -0,0 +1,59 @@
+#!/bin/bash
+# -------------------------------------------------------------------------- #
+#
+# Copyright (C) 2015
+# ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/>
+# JIVE (Joint Institute for VLBI in Europe) <http://www.jive.nl/>           
+# P.O.Box 2, 7990 AA Dwingeloo, The Netherlands                             
+#                                                                           
+# This program is free software: you can redistribute it and/or modify      
+# it under the terms of the GNU General Public License as published by      
+# the Free Software Foundation, either version 3 of the License, or         
+# (at your option) any later version.                                       
+#                                                                           
+# This program is distributed in the hope that it will be useful,           
+# but WITHOUT ANY WARRANTY; without even the implied warranty of            
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the             
+# GNU General Public License for more details.                              
+#                                                                           
+# You should have received a copy of the GNU General Public License         
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.     
+#
+# -------------------------------------------------------------------------- #
+#
+# Purpose: Generate DDR4 memory model with Qsys
+# Description:
+#   Generate the IP in a separate generated/ subdirectory.
+#
+# Usage:
+#
+#   Unfortunately the example design with the memory model cannot be created from the qsys-generate command line, because
+#   there is no option to invoke this.
+#   Therefore first open ip_arria10_ddr4_4g_1600.qsys in the Quartus QUI and then click the 'Example Design...' button.
+#   This will then created the emif_0_example_design/ directory that contains the TCL scripts to create the example design.
+#
+#   ./generate_mem_model.sh <path to example design directory>
+#
+#   eg. for ddr4_4g_1600:
+#
+#   ./generate_mem_model.sh ../ddr4_4g_1600/emif_0_example_design
+#
+#   eg. for ddr4_8g_2400:
+#
+#   ./generate_mem_model.sh ../ddr4_8g_2400/ddr4_inst_example_design
+
+# Tool settings for selected target "unb2" with arria10
+. ${RADIOHDL}/tools/quartus/set_quartus unb2
+
+#qsys-generate --help
+
+EXAMPLE_DESIGN_DIR=${1}
+MODEL_DIR=${RADIOHDL}/libraries/technology/ip_arria10/ddr4_mem_model_141
+
+cd ${EXAMPLE_DESIGN_DIR}
+quartus_sh -t make_sim_design.tcl VHDL
+
+cd ${MODEL_DIR}
+echo "pwd = ${PWD}"
+echo "Run diff_mem_model.sh"
+. diff_mem_model.sh ${EXAMPLE_DESIGN_DIR}
diff --git a/libraries/technology/ip_arria10/ddr4_mem_model_141/hdllib.cfg b/libraries/technology/ip_arria10/ddr4_mem_model_141/hdllib.cfg
new file mode 100644
index 0000000000..a952090c1b
--- /dev/null
+++ b/libraries/technology/ip_arria10/ddr4_mem_model_141/hdllib.cfg
@@ -0,0 +1,14 @@
+hdl_lib_name = ip_arria10_ddr4_mem_model_141
+hdl_library_clause_name = ed_sim_altera_emif_mem_model_core_ddr4_141
+hdl_lib_uses = 
+hdl_lib_technology = ip_arria10
+
+build_dir_sim = $HDL_BUILD_DIR
+build_dir_synth = $HDL_BUILD_DIR
+
+modelsim_compile_ip_files =
+    $RADIOHDL/libraries/technology/ip_arria10/ddr4_mem_model_141/compile_ip.tcl
+
+synth_files =
+    
+test_bench_files = 
diff --git a/libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_4g_1600/ed_sim_altera_emif_mem_model_141_z3tvrmq.vhd b/libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_4g_1600/ed_sim_altera_emif_mem_model_141_z3tvrmq.vhd
new file mode 100644
index 0000000000..5d895d529f
--- /dev/null
+++ b/libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_4g_1600/ed_sim_altera_emif_mem_model_141_z3tvrmq.vhd
@@ -0,0 +1,328 @@
+-- ed_sim_altera_emif_mem_model_141_z3tvrmq.vhd
+
+-- This file was auto-generated from altera_emif_mem_model_hw.tcl.  If you edit it your changes
+-- will probably be lost.
+-- 
+-- Generated using ACDS version 14.1 186 at 2015.01.12.14:47:37
+
+library IEEE;
+library ed_sim_altera_emif_mem_model_core_ddr4_141;
+use IEEE.std_logic_1164.all;
+use IEEE.numeric_std.all;
+
+entity ed_sim_altera_emif_mem_model_141_z3tvrmq is
+	port (
+		mem_ck      : in    std_logic_vector(0 downto 0)  := (others => '0'); -- mem_conduit_end.mem_ck
+		mem_ck_n    : in    std_logic_vector(0 downto 0)  := (others => '0'); --                .mem_ck_n
+		mem_a       : in    std_logic_vector(16 downto 0) := (others => '0'); --                .mem_a
+		mem_act_n   : in    std_logic_vector(0 downto 0)  := (others => '0'); --                .mem_act_n
+		mem_ba      : in    std_logic_vector(1 downto 0)  := (others => '0'); --                .mem_ba
+		mem_bg      : in    std_logic_vector(1 downto 0)  := (others => '0'); --                .mem_bg
+		mem_cke     : in    std_logic_vector(0 downto 0)  := (others => '0'); --                .mem_cke
+		mem_cs_n    : in    std_logic_vector(0 downto 0)  := (others => '0'); --                .mem_cs_n
+		mem_odt     : in    std_logic_vector(0 downto 0)  := (others => '0'); --                .mem_odt
+		mem_reset_n : in    std_logic_vector(0 downto 0)  := (others => '0'); --                .mem_reset_n
+		mem_par     : in    std_logic_vector(0 downto 0)  := (others => '0'); --                .mem_par
+		mem_alert_n : out   std_logic_vector(0 downto 0);                     --                .mem_alert_n
+		mem_dqs     : inout std_logic_vector(8 downto 0)  := (others => '0'); --                .mem_dqs
+		mem_dqs_n   : inout std_logic_vector(8 downto 0)  := (others => '0'); --                .mem_dqs_n
+		mem_dq      : inout std_logic_vector(71 downto 0) := (others => '0'); --                .mem_dq
+		mem_dbi_n   : inout std_logic_vector(8 downto 0)  := (others => '0')  --                .mem_dbi_n
+	);
+end entity ed_sim_altera_emif_mem_model_141_z3tvrmq;
+
+architecture rtl of ed_sim_altera_emif_mem_model_141_z3tvrmq is
+	component altera_emif_ddrx_model is
+		generic (
+			PROTOCOL_ENUM            : string  := "PROTOCOL_DDR3";
+			PHY_PING_PONG_EN         : boolean := false;
+			MEM_FORMAT_ENUM          : string  := "";
+			PORT_MEM_CK_WIDTH        : integer := 1;
+			PORT_MEM_CK_N_WIDTH      : integer := 1;
+			PORT_MEM_DK_WIDTH        : integer := 1;
+			PORT_MEM_DK_N_WIDTH      : integer := 1;
+			PORT_MEM_DKA_WIDTH       : integer := 1;
+			PORT_MEM_DKA_N_WIDTH     : integer := 1;
+			PORT_MEM_DKB_WIDTH       : integer := 1;
+			PORT_MEM_DKB_N_WIDTH     : integer := 1;
+			PORT_MEM_K_WIDTH         : integer := 1;
+			PORT_MEM_K_N_WIDTH       : integer := 1;
+			PORT_MEM_A_WIDTH         : integer := 1;
+			PORT_MEM_BA_WIDTH        : integer := 1;
+			PORT_MEM_BG_WIDTH        : integer := 1;
+			PORT_MEM_C_WIDTH         : integer := 1;
+			PORT_MEM_CKE_WIDTH       : integer := 1;
+			PORT_MEM_CS_N_WIDTH      : integer := 1;
+			PORT_MEM_RM_WIDTH        : integer := 1;
+			PORT_MEM_ODT_WIDTH       : integer := 1;
+			PORT_MEM_RAS_N_WIDTH     : integer := 1;
+			PORT_MEM_CAS_N_WIDTH     : integer := 1;
+			PORT_MEM_WE_N_WIDTH      : integer := 1;
+			PORT_MEM_RESET_N_WIDTH   : integer := 1;
+			PORT_MEM_ACT_N_WIDTH     : integer := 1;
+			PORT_MEM_PAR_WIDTH       : integer := 1;
+			PORT_MEM_CA_WIDTH        : integer := 1;
+			PORT_MEM_REF_N_WIDTH     : integer := 1;
+			PORT_MEM_WPS_N_WIDTH     : integer := 1;
+			PORT_MEM_RPS_N_WIDTH     : integer := 1;
+			PORT_MEM_DOFF_N_WIDTH    : integer := 1;
+			PORT_MEM_LDA_N_WIDTH     : integer := 1;
+			PORT_MEM_LDB_N_WIDTH     : integer := 1;
+			PORT_MEM_RWA_N_WIDTH     : integer := 1;
+			PORT_MEM_RWB_N_WIDTH     : integer := 1;
+			PORT_MEM_LBK0_N_WIDTH    : integer := 1;
+			PORT_MEM_LBK1_N_WIDTH    : integer := 1;
+			PORT_MEM_CFG_N_WIDTH     : integer := 1;
+			PORT_MEM_AP_WIDTH        : integer := 1;
+			PORT_MEM_AINV_WIDTH      : integer := 1;
+			PORT_MEM_DM_WIDTH        : integer := 1;
+			PORT_MEM_BWS_N_WIDTH     : integer := 1;
+			PORT_MEM_D_WIDTH         : integer := 1;
+			PORT_MEM_DQ_WIDTH        : integer := 1;
+			PORT_MEM_DBI_N_WIDTH     : integer := 1;
+			PORT_MEM_DQA_WIDTH       : integer := 1;
+			PORT_MEM_DQB_WIDTH       : integer := 1;
+			PORT_MEM_DINVA_WIDTH     : integer := 1;
+			PORT_MEM_DINVB_WIDTH     : integer := 1;
+			PORT_MEM_Q_WIDTH         : integer := 1;
+			PORT_MEM_DQS_WIDTH       : integer := 1;
+			PORT_MEM_DQS_N_WIDTH     : integer := 1;
+			PORT_MEM_QK_WIDTH        : integer := 1;
+			PORT_MEM_QK_N_WIDTH      : integer := 1;
+			PORT_MEM_QKA_WIDTH       : integer := 1;
+			PORT_MEM_QKA_N_WIDTH     : integer := 1;
+			PORT_MEM_QKB_WIDTH       : integer := 1;
+			PORT_MEM_QKB_N_WIDTH     : integer := 1;
+			PORT_MEM_CQ_WIDTH        : integer := 1;
+			PORT_MEM_CQ_N_WIDTH      : integer := 1;
+			PORT_MEM_ALERT_N_WIDTH   : integer := 1;
+			PORT_MEM_PE_N_WIDTH      : integer := 1;
+			MEM_DISCRETE_CS_WIDTH    : integer := 1;
+			MEM_ROW_ADDR_WIDTH       : integer := 15;
+			MEM_COL_ADDR_WIDTH       : integer := 10;
+			MEM_TRTP                 : integer := 8;
+			MEM_TRCD                 : integer := 8;
+			MEM_RANKS_PER_DIMM       : integer := 1;
+			MEM_NUM_OF_DIMMS         : integer := 0;
+			MEM_DM_EN                : boolean := false;
+			MEM_MIRROR_ADDRESSING_EN : boolean := false;
+			MEM_INIT_MRS0            : integer := 0;
+			MEM_INIT_MRS1            : integer := 0;
+			MEM_INIT_MRS2            : integer := 0;
+			MEM_INIT_MRS3            : integer := 0;
+			MEM_CFG_GEN_SBE          : boolean := false;
+			MEM_CFG_GEN_DBE          : boolean := false
+		);
+		port (
+			mem_ck      : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_ck
+			mem_ck_n    : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_ck_n
+			mem_a       : in    std_logic_vector(16 downto 0) := (others => 'X'); -- mem_a
+			mem_act_n   : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_act_n
+			mem_ba      : in    std_logic_vector(1 downto 0)  := (others => 'X'); -- mem_ba
+			mem_bg      : in    std_logic_vector(1 downto 0)  := (others => 'X'); -- mem_bg
+			mem_cke     : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_cke
+			mem_cs_n    : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_cs_n
+			mem_odt     : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_odt
+			mem_reset_n : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_reset_n
+			mem_par     : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_par
+			mem_alert_n : out   std_logic_vector(0 downto 0);                     -- mem_alert_n
+			mem_dqs     : inout std_logic_vector(8 downto 0)  := (others => 'X'); -- mem_dqs
+			mem_dqs_n   : inout std_logic_vector(8 downto 0)  := (others => 'X'); -- mem_dqs_n
+			mem_dq      : inout std_logic_vector(71 downto 0) := (others => 'X'); -- mem_dq
+			mem_dbi_n   : inout std_logic_vector(8 downto 0)  := (others => 'X'); -- mem_dbi_n
+			mem_c       : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_c
+			mem_rm      : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_rm
+			mem_dk      : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_dk
+			mem_dk_n    : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_dk_n
+			mem_dka     : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_dka
+			mem_dka_n   : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_dka_n
+			mem_dkb     : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_dkb
+			mem_dkb_n   : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_dkb_n
+			mem_k       : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_k
+			mem_k_n     : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_k_n
+			mem_ras_n   : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_ras_n
+			mem_cas_n   : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_cas_n
+			mem_we_n    : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_we_n
+			mem_ca      : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_ca
+			mem_ref_n   : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_ref_n
+			mem_wps_n   : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_wps_n
+			mem_rps_n   : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_rps_n
+			mem_doff_n  : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_doff_n
+			mem_lda_n   : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_lda_n
+			mem_ldb_n   : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_ldb_n
+			mem_rwa_n   : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_rwa_n
+			mem_rwb_n   : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_rwb_n
+			mem_lbk0_n  : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_lbk0_n
+			mem_lbk1_n  : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_lbk1_n
+			mem_cfg_n   : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_cfg_n
+			mem_ap      : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_ap
+			mem_ainv    : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_ainv
+			mem_dm      : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_dm
+			mem_bws_n   : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_bws_n
+			mem_d       : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_d
+			mem_dqa     : inout std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_dqa
+			mem_dqb     : inout std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_dqb
+			mem_dinva   : inout std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_dinva
+			mem_dinvb   : inout std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_dinvb
+			mem_q       : out   std_logic_vector(0 downto 0);                     -- mem_q
+			mem_qk      : out   std_logic_vector(0 downto 0);                     -- mem_qk
+			mem_qk_n    : out   std_logic_vector(0 downto 0);                     -- mem_qk_n
+			mem_qka     : out   std_logic_vector(0 downto 0);                     -- mem_qka
+			mem_qka_n   : out   std_logic_vector(0 downto 0);                     -- mem_qka_n
+			mem_qkb     : out   std_logic_vector(0 downto 0);                     -- mem_qkb
+			mem_qkb_n   : out   std_logic_vector(0 downto 0);                     -- mem_qkb_n
+			mem_cq      : out   std_logic_vector(0 downto 0);                     -- mem_cq
+			mem_cq_n    : out   std_logic_vector(0 downto 0);                     -- mem_cq_n
+			mem_pe_n    : out   std_logic_vector(0 downto 0)                      -- mem_pe_n
+		);
+	end component altera_emif_ddrx_model;
+
+	for core : altera_emif_ddrx_model
+		use entity ed_sim_altera_emif_mem_model_core_ddr4_141.altera_emif_ddrx_model;
+begin
+
+	core : component altera_emif_ddrx_model
+		generic map (
+			PROTOCOL_ENUM            => "PROTOCOL_DDR4",
+			PHY_PING_PONG_EN         => false,
+			MEM_FORMAT_ENUM          => "MEM_FORMAT_SODIMM",
+			PORT_MEM_CK_WIDTH        => 1,
+			PORT_MEM_CK_N_WIDTH      => 1,
+			PORT_MEM_DK_WIDTH        => 1,
+			PORT_MEM_DK_N_WIDTH      => 1,
+			PORT_MEM_DKA_WIDTH       => 1,
+			PORT_MEM_DKA_N_WIDTH     => 1,
+			PORT_MEM_DKB_WIDTH       => 1,
+			PORT_MEM_DKB_N_WIDTH     => 1,
+			PORT_MEM_K_WIDTH         => 1,
+			PORT_MEM_K_N_WIDTH       => 1,
+			PORT_MEM_A_WIDTH         => 17,
+			PORT_MEM_BA_WIDTH        => 2,
+			PORT_MEM_BG_WIDTH        => 2,
+			PORT_MEM_C_WIDTH         => 1,
+			PORT_MEM_CKE_WIDTH       => 1,
+			PORT_MEM_CS_N_WIDTH      => 1,
+			PORT_MEM_RM_WIDTH        => 1,
+			PORT_MEM_ODT_WIDTH       => 1,
+			PORT_MEM_RAS_N_WIDTH     => 1,
+			PORT_MEM_CAS_N_WIDTH     => 1,
+			PORT_MEM_WE_N_WIDTH      => 1,
+			PORT_MEM_RESET_N_WIDTH   => 1,
+			PORT_MEM_ACT_N_WIDTH     => 1,
+			PORT_MEM_PAR_WIDTH       => 1,
+			PORT_MEM_CA_WIDTH        => 1,
+			PORT_MEM_REF_N_WIDTH     => 1,
+			PORT_MEM_WPS_N_WIDTH     => 1,
+			PORT_MEM_RPS_N_WIDTH     => 1,
+			PORT_MEM_DOFF_N_WIDTH    => 1,
+			PORT_MEM_LDA_N_WIDTH     => 1,
+			PORT_MEM_LDB_N_WIDTH     => 1,
+			PORT_MEM_RWA_N_WIDTH     => 1,
+			PORT_MEM_RWB_N_WIDTH     => 1,
+			PORT_MEM_LBK0_N_WIDTH    => 1,
+			PORT_MEM_LBK1_N_WIDTH    => 1,
+			PORT_MEM_CFG_N_WIDTH     => 1,
+			PORT_MEM_AP_WIDTH        => 1,
+			PORT_MEM_AINV_WIDTH      => 1,
+			PORT_MEM_DM_WIDTH        => 1,
+			PORT_MEM_BWS_N_WIDTH     => 1,
+			PORT_MEM_D_WIDTH         => 1,
+			PORT_MEM_DQ_WIDTH        => 72,
+			PORT_MEM_DBI_N_WIDTH     => 9,
+			PORT_MEM_DQA_WIDTH       => 1,
+			PORT_MEM_DQB_WIDTH       => 1,
+			PORT_MEM_DINVA_WIDTH     => 1,
+			PORT_MEM_DINVB_WIDTH     => 1,
+			PORT_MEM_Q_WIDTH         => 1,
+			PORT_MEM_DQS_WIDTH       => 9,
+			PORT_MEM_DQS_N_WIDTH     => 9,
+			PORT_MEM_QK_WIDTH        => 1,
+			PORT_MEM_QK_N_WIDTH      => 1,
+			PORT_MEM_QKA_WIDTH       => 1,
+			PORT_MEM_QKA_N_WIDTH     => 1,
+			PORT_MEM_QKB_WIDTH       => 1,
+			PORT_MEM_QKB_N_WIDTH     => 1,
+			PORT_MEM_CQ_WIDTH        => 1,
+			PORT_MEM_CQ_N_WIDTH      => 1,
+			PORT_MEM_ALERT_N_WIDTH   => 1,
+			PORT_MEM_PE_N_WIDTH      => 1,
+			MEM_DISCRETE_CS_WIDTH    => 1,
+			MEM_ROW_ADDR_WIDTH       => 15,
+			MEM_COL_ADDR_WIDTH       => 10,
+			MEM_TRTP                 => 6,
+			MEM_TRCD                 => 12,
+			MEM_RANKS_PER_DIMM       => 1,
+			MEM_NUM_OF_DIMMS         => 1,
+			MEM_DM_EN                => true,
+			MEM_MIRROR_ADDRESSING_EN => false,
+			MEM_INIT_MRS0            => 0,
+			MEM_INIT_MRS1            => 0,
+			MEM_INIT_MRS2            => 0,
+			MEM_INIT_MRS3            => 0,
+			MEM_CFG_GEN_SBE          => false,
+			MEM_CFG_GEN_DBE          => false
+		)
+		port map (
+			mem_ck      => mem_ck,      -- mem_conduit_end.mem_ck
+			mem_ck_n    => mem_ck_n,    --                .mem_ck_n
+			mem_a       => mem_a,       --                .mem_a
+			mem_act_n   => mem_act_n,   --                .mem_act_n
+			mem_ba      => mem_ba,      --                .mem_ba
+			mem_bg      => mem_bg,      --                .mem_bg
+			mem_cke     => mem_cke,     --                .mem_cke
+			mem_cs_n    => mem_cs_n,    --                .mem_cs_n
+			mem_odt     => mem_odt,     --                .mem_odt
+			mem_reset_n => mem_reset_n, --                .mem_reset_n
+			mem_par     => mem_par,     --                .mem_par
+			mem_alert_n => mem_alert_n, --                .mem_alert_n
+			mem_dqs     => mem_dqs,     --                .mem_dqs
+			mem_dqs_n   => mem_dqs_n,   --                .mem_dqs_n
+			mem_dq      => mem_dq,      --                .mem_dq
+			mem_dbi_n   => mem_dbi_n,   --                .mem_dbi_n
+			mem_c       => "0",         --     (terminated)
+			mem_rm      => "0",         --     (terminated)
+			mem_dk      => "0",         --     (terminated)
+			mem_dk_n    => "0",         --     (terminated)
+			mem_dka     => "0",         --     (terminated)
+			mem_dka_n   => "0",         --     (terminated)
+			mem_dkb     => "0",         --     (terminated)
+			mem_dkb_n   => "0",         --     (terminated)
+			mem_k       => "0",         --     (terminated)
+			mem_k_n     => "0",         --     (terminated)
+			mem_ras_n   => "0",         --     (terminated)
+			mem_cas_n   => "0",         --     (terminated)
+			mem_we_n    => "0",         --     (terminated)
+			mem_ca      => "0",         --     (terminated)
+			mem_ref_n   => "0",         --     (terminated)
+			mem_wps_n   => "0",         --     (terminated)
+			mem_rps_n   => "0",         --     (terminated)
+			mem_doff_n  => "0",         --     (terminated)
+			mem_lda_n   => "0",         --     (terminated)
+			mem_ldb_n   => "0",         --     (terminated)
+			mem_rwa_n   => "0",         --     (terminated)
+			mem_rwb_n   => "0",         --     (terminated)
+			mem_lbk0_n  => "0",         --     (terminated)
+			mem_lbk1_n  => "0",         --     (terminated)
+			mem_cfg_n   => "0",         --     (terminated)
+			mem_ap      => "0",         --     (terminated)
+			mem_ainv    => "0",         --     (terminated)
+			mem_dm      => "0",         --     (terminated)
+			mem_bws_n   => "0",         --     (terminated)
+			mem_d       => "0",         --     (terminated)
+			mem_dqa     => open,        --     (terminated)
+			mem_dqb     => open,        --     (terminated)
+			mem_dinva   => open,        --     (terminated)
+			mem_dinvb   => open,        --     (terminated)
+			mem_q       => open,        --     (terminated)
+			mem_qk      => open,        --     (terminated)
+			mem_qk_n    => open,        --     (terminated)
+			mem_qka     => open,        --     (terminated)
+			mem_qka_n   => open,        --     (terminated)
+			mem_qkb     => open,        --     (terminated)
+			mem_qkb_n   => open,        --     (terminated)
+			mem_cq      => open,        --     (terminated)
+			mem_cq_n    => open,        --     (terminated)
+			mem_pe_n    => open         --     (terminated)
+		);
+
+end architecture rtl; -- of ed_sim_altera_emif_mem_model_141_z3tvrmq
diff --git a/libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_8g_2400/ed_sim_altera_emif_mem_model_141_oes36qy.vhd b/libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_8g_2400/ed_sim_altera_emif_mem_model_141_oes36qy.vhd
new file mode 100644
index 0000000000..ec70888a21
--- /dev/null
+++ b/libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_8g_2400/ed_sim_altera_emif_mem_model_141_oes36qy.vhd
@@ -0,0 +1,328 @@
+-- ed_sim_altera_emif_mem_model_141_oes36qy.vhd
+
+-- This file was auto-generated from altera_emif_mem_model_hw.tcl.  If you edit it your changes
+-- will probably be lost.
+-- 
+-- Generated using ACDS version 14.1 186 at 2015.01.14.11:33:05
+
+library IEEE;
+library ed_sim_altera_emif_mem_model_core_ddr4_141;
+use IEEE.std_logic_1164.all;
+use IEEE.numeric_std.all;
+
+entity ed_sim_altera_emif_mem_model_141_oes36qy is
+	port (
+		mem_ck      : in    std_logic_vector(1 downto 0)  := (others => '0'); -- mem_conduit_end.mem_ck
+		mem_ck_n    : in    std_logic_vector(1 downto 0)  := (others => '0'); --                .mem_ck_n
+		mem_a       : in    std_logic_vector(16 downto 0) := (others => '0'); --                .mem_a
+		mem_act_n   : in    std_logic_vector(0 downto 0)  := (others => '0'); --                .mem_act_n
+		mem_ba      : in    std_logic_vector(1 downto 0)  := (others => '0'); --                .mem_ba
+		mem_bg      : in    std_logic_vector(1 downto 0)  := (others => '0'); --                .mem_bg
+		mem_cke     : in    std_logic_vector(1 downto 0)  := (others => '0'); --                .mem_cke
+		mem_cs_n    : in    std_logic_vector(1 downto 0)  := (others => '0'); --                .mem_cs_n
+		mem_odt     : in    std_logic_vector(1 downto 0)  := (others => '0'); --                .mem_odt
+		mem_reset_n : in    std_logic_vector(0 downto 0)  := (others => '0'); --                .mem_reset_n
+		mem_par     : in    std_logic_vector(0 downto 0)  := (others => '0'); --                .mem_par
+		mem_alert_n : out   std_logic_vector(0 downto 0);                     --                .mem_alert_n
+		mem_dqs     : inout std_logic_vector(8 downto 0)  := (others => '0'); --                .mem_dqs
+		mem_dqs_n   : inout std_logic_vector(8 downto 0)  := (others => '0'); --                .mem_dqs_n
+		mem_dq      : inout std_logic_vector(71 downto 0) := (others => '0'); --                .mem_dq
+		mem_dbi_n   : inout std_logic_vector(8 downto 0)  := (others => '0')  --                .mem_dbi_n
+	);
+end entity ed_sim_altera_emif_mem_model_141_oes36qy;
+
+architecture rtl of ed_sim_altera_emif_mem_model_141_oes36qy is
+	component altera_emif_ddrx_model is
+		generic (
+			PROTOCOL_ENUM            : string  := "PROTOCOL_DDR3";
+			PHY_PING_PONG_EN         : boolean := false;
+			MEM_FORMAT_ENUM          : string  := "";
+			PORT_MEM_CK_WIDTH        : integer := 1;
+			PORT_MEM_CK_N_WIDTH      : integer := 1;
+			PORT_MEM_DK_WIDTH        : integer := 1;
+			PORT_MEM_DK_N_WIDTH      : integer := 1;
+			PORT_MEM_DKA_WIDTH       : integer := 1;
+			PORT_MEM_DKA_N_WIDTH     : integer := 1;
+			PORT_MEM_DKB_WIDTH       : integer := 1;
+			PORT_MEM_DKB_N_WIDTH     : integer := 1;
+			PORT_MEM_K_WIDTH         : integer := 1;
+			PORT_MEM_K_N_WIDTH       : integer := 1;
+			PORT_MEM_A_WIDTH         : integer := 1;
+			PORT_MEM_BA_WIDTH        : integer := 1;
+			PORT_MEM_BG_WIDTH        : integer := 1;
+			PORT_MEM_C_WIDTH         : integer := 1;
+			PORT_MEM_CKE_WIDTH       : integer := 1;
+			PORT_MEM_CS_N_WIDTH      : integer := 1;
+			PORT_MEM_RM_WIDTH        : integer := 1;
+			PORT_MEM_ODT_WIDTH       : integer := 1;
+			PORT_MEM_RAS_N_WIDTH     : integer := 1;
+			PORT_MEM_CAS_N_WIDTH     : integer := 1;
+			PORT_MEM_WE_N_WIDTH      : integer := 1;
+			PORT_MEM_RESET_N_WIDTH   : integer := 1;
+			PORT_MEM_ACT_N_WIDTH     : integer := 1;
+			PORT_MEM_PAR_WIDTH       : integer := 1;
+			PORT_MEM_CA_WIDTH        : integer := 1;
+			PORT_MEM_REF_N_WIDTH     : integer := 1;
+			PORT_MEM_WPS_N_WIDTH     : integer := 1;
+			PORT_MEM_RPS_N_WIDTH     : integer := 1;
+			PORT_MEM_DOFF_N_WIDTH    : integer := 1;
+			PORT_MEM_LDA_N_WIDTH     : integer := 1;
+			PORT_MEM_LDB_N_WIDTH     : integer := 1;
+			PORT_MEM_RWA_N_WIDTH     : integer := 1;
+			PORT_MEM_RWB_N_WIDTH     : integer := 1;
+			PORT_MEM_LBK0_N_WIDTH    : integer := 1;
+			PORT_MEM_LBK1_N_WIDTH    : integer := 1;
+			PORT_MEM_CFG_N_WIDTH     : integer := 1;
+			PORT_MEM_AP_WIDTH        : integer := 1;
+			PORT_MEM_AINV_WIDTH      : integer := 1;
+			PORT_MEM_DM_WIDTH        : integer := 1;
+			PORT_MEM_BWS_N_WIDTH     : integer := 1;
+			PORT_MEM_D_WIDTH         : integer := 1;
+			PORT_MEM_DQ_WIDTH        : integer := 1;
+			PORT_MEM_DBI_N_WIDTH     : integer := 1;
+			PORT_MEM_DQA_WIDTH       : integer := 1;
+			PORT_MEM_DQB_WIDTH       : integer := 1;
+			PORT_MEM_DINVA_WIDTH     : integer := 1;
+			PORT_MEM_DINVB_WIDTH     : integer := 1;
+			PORT_MEM_Q_WIDTH         : integer := 1;
+			PORT_MEM_DQS_WIDTH       : integer := 1;
+			PORT_MEM_DQS_N_WIDTH     : integer := 1;
+			PORT_MEM_QK_WIDTH        : integer := 1;
+			PORT_MEM_QK_N_WIDTH      : integer := 1;
+			PORT_MEM_QKA_WIDTH       : integer := 1;
+			PORT_MEM_QKA_N_WIDTH     : integer := 1;
+			PORT_MEM_QKB_WIDTH       : integer := 1;
+			PORT_MEM_QKB_N_WIDTH     : integer := 1;
+			PORT_MEM_CQ_WIDTH        : integer := 1;
+			PORT_MEM_CQ_N_WIDTH      : integer := 1;
+			PORT_MEM_ALERT_N_WIDTH   : integer := 1;
+			PORT_MEM_PE_N_WIDTH      : integer := 1;
+			MEM_DISCRETE_CS_WIDTH    : integer := 1;
+			MEM_ROW_ADDR_WIDTH       : integer := 15;
+			MEM_COL_ADDR_WIDTH       : integer := 10;
+			MEM_TRTP                 : integer := 8;
+			MEM_TRCD                 : integer := 8;
+			MEM_RANKS_PER_DIMM       : integer := 1;
+			MEM_NUM_OF_DIMMS         : integer := 0;
+			MEM_DM_EN                : boolean := false;
+			MEM_MIRROR_ADDRESSING_EN : boolean := false;
+			MEM_INIT_MRS0            : integer := 0;
+			MEM_INIT_MRS1            : integer := 0;
+			MEM_INIT_MRS2            : integer := 0;
+			MEM_INIT_MRS3            : integer := 0;
+			MEM_CFG_GEN_SBE          : boolean := false;
+			MEM_CFG_GEN_DBE          : boolean := false
+		);
+		port (
+			mem_ck      : in    std_logic_vector(1 downto 0)  := (others => 'X'); -- mem_ck
+			mem_ck_n    : in    std_logic_vector(1 downto 0)  := (others => 'X'); -- mem_ck_n
+			mem_a       : in    std_logic_vector(16 downto 0) := (others => 'X'); -- mem_a
+			mem_act_n   : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_act_n
+			mem_ba      : in    std_logic_vector(1 downto 0)  := (others => 'X'); -- mem_ba
+			mem_bg      : in    std_logic_vector(1 downto 0)  := (others => 'X'); -- mem_bg
+			mem_cke     : in    std_logic_vector(1 downto 0)  := (others => 'X'); -- mem_cke
+			mem_cs_n    : in    std_logic_vector(1 downto 0)  := (others => 'X'); -- mem_cs_n
+			mem_odt     : in    std_logic_vector(1 downto 0)  := (others => 'X'); -- mem_odt
+			mem_reset_n : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_reset_n
+			mem_par     : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_par
+			mem_alert_n : out   std_logic_vector(0 downto 0);                     -- mem_alert_n
+			mem_dqs     : inout std_logic_vector(8 downto 0)  := (others => 'X'); -- mem_dqs
+			mem_dqs_n   : inout std_logic_vector(8 downto 0)  := (others => 'X'); -- mem_dqs_n
+			mem_dq      : inout std_logic_vector(71 downto 0) := (others => 'X'); -- mem_dq
+			mem_dbi_n   : inout std_logic_vector(8 downto 0)  := (others => 'X'); -- mem_dbi_n
+			mem_c       : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_c
+			mem_rm      : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_rm
+			mem_dk      : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_dk
+			mem_dk_n    : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_dk_n
+			mem_dka     : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_dka
+			mem_dka_n   : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_dka_n
+			mem_dkb     : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_dkb
+			mem_dkb_n   : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_dkb_n
+			mem_k       : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_k
+			mem_k_n     : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_k_n
+			mem_ras_n   : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_ras_n
+			mem_cas_n   : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_cas_n
+			mem_we_n    : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_we_n
+			mem_ca      : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_ca
+			mem_ref_n   : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_ref_n
+			mem_wps_n   : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_wps_n
+			mem_rps_n   : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_rps_n
+			mem_doff_n  : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_doff_n
+			mem_lda_n   : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_lda_n
+			mem_ldb_n   : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_ldb_n
+			mem_rwa_n   : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_rwa_n
+			mem_rwb_n   : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_rwb_n
+			mem_lbk0_n  : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_lbk0_n
+			mem_lbk1_n  : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_lbk1_n
+			mem_cfg_n   : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_cfg_n
+			mem_ap      : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_ap
+			mem_ainv    : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_ainv
+			mem_dm      : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_dm
+			mem_bws_n   : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_bws_n
+			mem_d       : in    std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_d
+			mem_dqa     : inout std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_dqa
+			mem_dqb     : inout std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_dqb
+			mem_dinva   : inout std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_dinva
+			mem_dinvb   : inout std_logic_vector(0 downto 0)  := (others => 'X'); -- mem_dinvb
+			mem_q       : out   std_logic_vector(0 downto 0);                     -- mem_q
+			mem_qk      : out   std_logic_vector(0 downto 0);                     -- mem_qk
+			mem_qk_n    : out   std_logic_vector(0 downto 0);                     -- mem_qk_n
+			mem_qka     : out   std_logic_vector(0 downto 0);                     -- mem_qka
+			mem_qka_n   : out   std_logic_vector(0 downto 0);                     -- mem_qka_n
+			mem_qkb     : out   std_logic_vector(0 downto 0);                     -- mem_qkb
+			mem_qkb_n   : out   std_logic_vector(0 downto 0);                     -- mem_qkb_n
+			mem_cq      : out   std_logic_vector(0 downto 0);                     -- mem_cq
+			mem_cq_n    : out   std_logic_vector(0 downto 0);                     -- mem_cq_n
+			mem_pe_n    : out   std_logic_vector(0 downto 0)                      -- mem_pe_n
+		);
+	end component altera_emif_ddrx_model;
+
+	for core : altera_emif_ddrx_model
+		use entity ed_sim_altera_emif_mem_model_core_ddr4_141.altera_emif_ddrx_model;
+begin
+
+	core : component altera_emif_ddrx_model
+		generic map (
+			PROTOCOL_ENUM            => "PROTOCOL_DDR4",
+			PHY_PING_PONG_EN         => false,
+			MEM_FORMAT_ENUM          => "MEM_FORMAT_SODIMM",
+			PORT_MEM_CK_WIDTH        => 2,
+			PORT_MEM_CK_N_WIDTH      => 2,
+			PORT_MEM_DK_WIDTH        => 1,
+			PORT_MEM_DK_N_WIDTH      => 1,
+			PORT_MEM_DKA_WIDTH       => 1,
+			PORT_MEM_DKA_N_WIDTH     => 1,
+			PORT_MEM_DKB_WIDTH       => 1,
+			PORT_MEM_DKB_N_WIDTH     => 1,
+			PORT_MEM_K_WIDTH         => 1,
+			PORT_MEM_K_N_WIDTH       => 1,
+			PORT_MEM_A_WIDTH         => 17,
+			PORT_MEM_BA_WIDTH        => 2,
+			PORT_MEM_BG_WIDTH        => 2,
+			PORT_MEM_C_WIDTH         => 1,
+			PORT_MEM_CKE_WIDTH       => 2,
+			PORT_MEM_CS_N_WIDTH      => 2,
+			PORT_MEM_RM_WIDTH        => 1,
+			PORT_MEM_ODT_WIDTH       => 2,
+			PORT_MEM_RAS_N_WIDTH     => 1,
+			PORT_MEM_CAS_N_WIDTH     => 1,
+			PORT_MEM_WE_N_WIDTH      => 1,
+			PORT_MEM_RESET_N_WIDTH   => 1,
+			PORT_MEM_ACT_N_WIDTH     => 1,
+			PORT_MEM_PAR_WIDTH       => 1,
+			PORT_MEM_CA_WIDTH        => 1,
+			PORT_MEM_REF_N_WIDTH     => 1,
+			PORT_MEM_WPS_N_WIDTH     => 1,
+			PORT_MEM_RPS_N_WIDTH     => 1,
+			PORT_MEM_DOFF_N_WIDTH    => 1,
+			PORT_MEM_LDA_N_WIDTH     => 1,
+			PORT_MEM_LDB_N_WIDTH     => 1,
+			PORT_MEM_RWA_N_WIDTH     => 1,
+			PORT_MEM_RWB_N_WIDTH     => 1,
+			PORT_MEM_LBK0_N_WIDTH    => 1,
+			PORT_MEM_LBK1_N_WIDTH    => 1,
+			PORT_MEM_CFG_N_WIDTH     => 1,
+			PORT_MEM_AP_WIDTH        => 1,
+			PORT_MEM_AINV_WIDTH      => 1,
+			PORT_MEM_DM_WIDTH        => 1,
+			PORT_MEM_BWS_N_WIDTH     => 1,
+			PORT_MEM_D_WIDTH         => 1,
+			PORT_MEM_DQ_WIDTH        => 72,
+			PORT_MEM_DBI_N_WIDTH     => 9,
+			PORT_MEM_DQA_WIDTH       => 1,
+			PORT_MEM_DQB_WIDTH       => 1,
+			PORT_MEM_DINVA_WIDTH     => 1,
+			PORT_MEM_DINVB_WIDTH     => 1,
+			PORT_MEM_Q_WIDTH         => 1,
+			PORT_MEM_DQS_WIDTH       => 9,
+			PORT_MEM_DQS_N_WIDTH     => 9,
+			PORT_MEM_QK_WIDTH        => 1,
+			PORT_MEM_QK_N_WIDTH      => 1,
+			PORT_MEM_QKA_WIDTH       => 1,
+			PORT_MEM_QKA_N_WIDTH     => 1,
+			PORT_MEM_QKB_WIDTH       => 1,
+			PORT_MEM_QKB_N_WIDTH     => 1,
+			PORT_MEM_CQ_WIDTH        => 1,
+			PORT_MEM_CQ_N_WIDTH      => 1,
+			PORT_MEM_ALERT_N_WIDTH   => 1,
+			PORT_MEM_PE_N_WIDTH      => 1,
+			MEM_DISCRETE_CS_WIDTH    => 1,
+			MEM_ROW_ADDR_WIDTH       => 15,
+			MEM_COL_ADDR_WIDTH       => 10,
+			MEM_TRTP                 => 9,
+			MEM_TRCD                 => 17,
+			MEM_RANKS_PER_DIMM       => 2,
+			MEM_NUM_OF_DIMMS         => 1,
+			MEM_DM_EN                => true,
+			MEM_MIRROR_ADDRESSING_EN => false,
+			MEM_INIT_MRS0            => 0,
+			MEM_INIT_MRS1            => 0,
+			MEM_INIT_MRS2            => 0,
+			MEM_INIT_MRS3            => 0,
+			MEM_CFG_GEN_SBE          => false,
+			MEM_CFG_GEN_DBE          => false
+		)
+		port map (
+			mem_ck      => mem_ck,      -- mem_conduit_end.mem_ck
+			mem_ck_n    => mem_ck_n,    --                .mem_ck_n
+			mem_a       => mem_a,       --                .mem_a
+			mem_act_n   => mem_act_n,   --                .mem_act_n
+			mem_ba      => mem_ba,      --                .mem_ba
+			mem_bg      => mem_bg,      --                .mem_bg
+			mem_cke     => mem_cke,     --                .mem_cke
+			mem_cs_n    => mem_cs_n,    --                .mem_cs_n
+			mem_odt     => mem_odt,     --                .mem_odt
+			mem_reset_n => mem_reset_n, --                .mem_reset_n
+			mem_par     => mem_par,     --                .mem_par
+			mem_alert_n => mem_alert_n, --                .mem_alert_n
+			mem_dqs     => mem_dqs,     --                .mem_dqs
+			mem_dqs_n   => mem_dqs_n,   --                .mem_dqs_n
+			mem_dq      => mem_dq,      --                .mem_dq
+			mem_dbi_n   => mem_dbi_n,   --                .mem_dbi_n
+			mem_c       => "0",         --     (terminated)
+			mem_rm      => "0",         --     (terminated)
+			mem_dk      => "0",         --     (terminated)
+			mem_dk_n    => "0",         --     (terminated)
+			mem_dka     => "0",         --     (terminated)
+			mem_dka_n   => "0",         --     (terminated)
+			mem_dkb     => "0",         --     (terminated)
+			mem_dkb_n   => "0",         --     (terminated)
+			mem_k       => "0",         --     (terminated)
+			mem_k_n     => "0",         --     (terminated)
+			mem_ras_n   => "0",         --     (terminated)
+			mem_cas_n   => "0",         --     (terminated)
+			mem_we_n    => "0",         --     (terminated)
+			mem_ca      => "0",         --     (terminated)
+			mem_ref_n   => "0",         --     (terminated)
+			mem_wps_n   => "0",         --     (terminated)
+			mem_rps_n   => "0",         --     (terminated)
+			mem_doff_n  => "0",         --     (terminated)
+			mem_lda_n   => "0",         --     (terminated)
+			mem_ldb_n   => "0",         --     (terminated)
+			mem_rwa_n   => "0",         --     (terminated)
+			mem_rwb_n   => "0",         --     (terminated)
+			mem_lbk0_n  => "0",         --     (terminated)
+			mem_lbk1_n  => "0",         --     (terminated)
+			mem_cfg_n   => "0",         --     (terminated)
+			mem_ap      => "0",         --     (terminated)
+			mem_ainv    => "0",         --     (terminated)
+			mem_dm      => "0",         --     (terminated)
+			mem_bws_n   => "0",         --     (terminated)
+			mem_d       => "0",         --     (terminated)
+			mem_dqa     => open,        --     (terminated)
+			mem_dqb     => open,        --     (terminated)
+			mem_dinva   => open,        --     (terminated)
+			mem_dinvb   => open,        --     (terminated)
+			mem_q       => open,        --     (terminated)
+			mem_qk      => open,        --     (terminated)
+			mem_qk_n    => open,        --     (terminated)
+			mem_qka     => open,        --     (terminated)
+			mem_qka_n   => open,        --     (terminated)
+			mem_qkb     => open,        --     (terminated)
+			mem_qkb_n   => open,        --     (terminated)
+			mem_cq      => open,        --     (terminated)
+			mem_cq_n    => open,        --     (terminated)
+			mem_pe_n    => open         --     (terminated)
+		);
+
+end architecture rtl; -- of ed_sim_altera_emif_mem_model_141_oes36qy
diff --git a/libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_core/altera_emif_ddr4_crc_tree.sv b/libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_core/altera_emif_ddr4_crc_tree.sv
new file mode 100644
index 0000000000..bfbaed8bd6
--- /dev/null
+++ b/libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_core/altera_emif_ddr4_crc_tree.sv
@@ -0,0 +1,72 @@
+// (C) 2001-2014 Altera Corporation. All rights reserved.
+// Your use of Altera Corporation's design tools, logic functions and other 
+// software and tools, and its AMPP partner logic functions, and any output 
+// files any of the foregoing (including device programming or simulation 
+// files), and any associated documentation or information are expressly subject 
+// to the terms and conditions of the Altera Program License Subscription 
+// Agreement, Altera MegaCore Function License Agreement, or other applicable 
+// license agreement, including, without limitation, that your use is for the 
+// sole purpose of programming logic devices manufactured by Altera and sold by 
+// Altera or its authorized distributors.  Please refer to the applicable 
+// agreement for further details.
+
+
+
+module altera_emif_ddr4_crc_tree (
+        d,
+        newcrc 
+
+);
+timeunit 1ps;
+timeprecision 1ps;
+
+input [71:0] d;
+output [7:0] newcrc;
+
+assign newcrc[0] = d[69] ^ d[68] ^ d[67] ^ d[66] ^ d[64] ^ d[63] ^ d[60] ^
+                   d[56] ^ d[54] ^ d[53] ^ d[52] ^ d[50] ^ d[49] ^ d[48] ^
+                   d[45] ^ d[43] ^ d[40] ^ d[39] ^ d[35] ^ d[34] ^ d[31] ^
+                   d[30] ^ d[28] ^ d[23] ^ d[21] ^ d[19] ^ d[18] ^ d[16] ^
+                   d[14] ^ d[12] ^ d[8] ^ d[7] ^ d[6] ^ d[0] ;
+assign newcrc[1] = d[70] ^ d[66] ^ d[65] ^ d[63] ^ d[61] ^ d[60] ^ d[57] ^
+                   d[56] ^ d[55] ^ d[52] ^ d[51] ^ d[48] ^ d[46] ^ d[45] ^
+                   d[44] ^ d[43] ^ d[41] ^ d[39] ^ d[36] ^ d[34] ^ d[32] ^
+                   d[30] ^ d[29] ^ d[28] ^ d[24] ^ d[23] ^ d[22] ^ d[21] ^
+                   d[20] ^ d[18] ^ d[17] ^ d[16] ^ d[15] ^ d[14] ^ d[13] ^
+                   d[12] ^ d[9] ^ d[6] ^ d[1] ^ d[0];
+assign newcrc[2] = d[71] ^ d[69] ^ d[68] ^ d[63] ^ d[62] ^ d[61] ^ d[60] ^
+                   d[58] ^ d[57] ^ d[54] ^ d[50] ^ d[48] ^ d[47] ^ d[46] ^
+                   d[44] ^ d[43] ^ d[42] ^ d[39] ^ d[37] ^ d[34] ^ d[33] ^
+                   d[29] ^ d[28] ^ d[25] ^ d[24] ^ d[22] ^ d[17] ^ d[15] ^
+                   d[13] ^ d[12] ^ d[10] ^ d[8] ^ d[6] ^ d[2] ^ d[1] ^ d[0];
+assign newcrc[3] = d[70] ^ d[69] ^ d[64] ^ d[63] ^ d[62] ^ d[61] ^ d[59] ^
+                   d[58] ^ d[55] ^ d[51] ^ d[49] ^ d[48] ^ d[47] ^ d[45] ^
+                   d[44] ^ d[43] ^ d[40] ^ d[38] ^ d[35] ^ d[34] ^ d[30] ^
+                   d[29] ^ d[26] ^ d[25] ^ d[23] ^ d[18] ^ d[16] ^ d[14] ^
+                   d[13] ^ d[11] ^ d[9] ^ d[7] ^ d[3] ^ d[2] ^ d[1];
+assign newcrc[4] = d[71] ^ d[70] ^ d[65] ^ d[64] ^ d[63] ^ d[62] ^ d[60] ^
+                   d[59] ^ d[56] ^ d[52] ^ d[50] ^ d[49] ^ d[48] ^ d[46] ^
+                   d[45] ^ d[44] ^ d[41] ^ d[39] ^ d[36] ^ d[35] ^ d[31] ^
+                   d[30] ^ d[27] ^ d[26] ^ d[24] ^ d[19] ^ d[17] ^ d[15] ^
+                   d[14] ^ d[12] ^ d[10] ^ d[8] ^ d[4] ^ d[3] ^ d[2];
+assign newcrc[5] = d[71] ^ d[66] ^ d[65] ^ d[64] ^ d[63] ^ d[61] ^ d[60] ^
+                   d[57] ^ d[53] ^ d[51] ^ d[50] ^ d[49] ^ d[47] ^ d[46] ^
+                   d[45] ^ d[42] ^ d[40] ^ d[37] ^ d[36] ^ d[32] ^ d[31] ^
+                   d[28] ^ d[27] ^ d[25] ^ d[20] ^ d[18] ^ d[16] ^ d[15] ^
+                   d[13] ^ d[11] ^ d[9] ^ d[5] ^ d[4] ^ d[3];
+assign newcrc[6] = d[67] ^ d[66] ^ d[65] ^ d[64] ^ d[62] ^ d[61] ^ d[58] ^
+                   d[54] ^ d[52] ^ d[51] ^ d[50] ^ d[48] ^ d[47] ^ d[46] ^
+                   d[43] ^ d[41] ^ d[38] ^ d[37] ^ d[33] ^ d[32] ^ d[29] ^
+                   d[28] ^ d[26] ^ d[21] ^ d[19] ^ d[17] ^ d[16] ^ d[14] ^
+                   d[12] ^ d[10] ^ d[6] ^ d[5] ^ d[4];
+assign newcrc[7] = d[68] ^ d[67] ^ d[66] ^ d[65] ^ d[63] ^ d[62] ^ d[59] ^
+                   d[55] ^ d[53] ^ d[52] ^ d[51] ^ d[49] ^ d[48] ^ d[47] ^
+                   d[44] ^ d[42] ^ d[39] ^ d[38] ^ d[34] ^ d[33] ^ d[30] ^
+                   d[29] ^ d[27] ^ d[22] ^ d[20] ^ d[18] ^ d[17] ^ d[15] ^
+                   d[13] ^ d[11] ^ d[7] ^ d[6] ^ d[5];
+
+
+
+endmodule 
+
+
diff --git a/libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_core/altera_emif_ddr4_model_rcd_chip.sv b/libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_core/altera_emif_ddr4_model_rcd_chip.sv
new file mode 100644
index 0000000000..94d78bcf91
--- /dev/null
+++ b/libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_core/altera_emif_ddr4_model_rcd_chip.sv
@@ -0,0 +1,129 @@
+// (C) 2001-2014 Altera Corporation. All rights reserved.
+// Your use of Altera Corporation's design tools, logic functions and other 
+// software and tools, and its AMPP partner logic functions, and any output 
+// files any of the foregoing (including device programming or simulation 
+// files), and any associated documentation or information are expressly subject 
+// to the terms and conditions of the Altera Program License Subscription 
+// Agreement, Altera MegaCore Function License Agreement, or other applicable 
+// license agreement, including, without limitation, that your use is for the 
+// sole purpose of programming logic devices manufactured by Altera and sold by 
+// Altera or its authorized distributors.  Please refer to the applicable 
+// agreement for further details.
+
+
+///////////////////////////////////////////////////////////////////////////////
+// Basic simulation model of DDR4 Registering Clock Driver used by RDIMM and LRDIMM
+//
+///////////////////////////////////////////////////////////////////////////////
+module altera_emif_ddr4_model_rcd_chip # (
+   parameter ADDRESS_MIRRORING  = 1
+) (
+   input             [1:0]   DCKE,
+   input             [1:0]   DODT,
+   input             [3:0]   DCS_n,
+   input             [2:0]   DC,
+
+   input            [17:0]   DA,
+   input             [1:0]   DBA,
+   input             [1:0]   DBG,
+   input                     DACT_n,
+
+   input                     CK_t,
+   input                     CK_c,
+
+   input                     DRST_n,
+
+   input                     DPAR,
+
+   input                     ERROR_IN_n,
+
+   output                    BODT,
+   output                    BCKE,
+   output            [3:0]   BCOM,
+   output                    BCK_t,
+   output                    BCK_c,
+   output                    BVrefCA,
+
+   output   logic    [1:0]   QACKE,
+   output   logic    [1:0]   QBCKE,
+   output   logic    [1:0]   QAODT,
+   output   logic    [1:0]   QBODT,
+   output   logic    [3:0]   QACS_n,
+   output   logic    [3:0]   QBCS_n,
+   output   logic    [1:0]   QAC,
+   output   logic    [1:0]   QBC,
+
+   output   logic   [17:0]   QAA,
+   output   logic   [17:0]   QBA,
+   output   logic    [1:0]   QABA,
+   output   logic    [1:0]   QABG,
+   output   logic    [1:0]   QBBA,
+   output   logic    [1:0]   QBBG,
+   output   logic            QAACT_n,
+   output   logic            QBACT_n,
+
+   output            [3:0]   Y_c,
+   output            [3:0]   Y_t,
+
+   output   logic            QRST_n,
+
+   output   logic            QAPAR,
+   output   logic            QBPAR,
+
+   output   logic            ALERT_n,
+
+   inout                     SDA,
+   input             [2:0]   SA,
+   input                     SCL,
+   input                     BFUNC,
+   input                     VDDSPD,
+
+   input                     VDD,
+   input                     VSS,
+   input                     AVDD,
+   input                     PVDD,
+   input                     PVSS
+);
+
+   timeunit 1ps;
+   timeprecision 1ps;
+
+   assign Y_t = {4{CK_t}};
+   assign Y_c = {4{CK_c}};
+   
+   assign QRST_n = DRST_n;
+   
+   reg               [1:0]   DCKE_1; 
+   reg               [1:0]   DCKE_2; 
+   
+   assign QACKE = DCKE_1 || DCKE_2;
+   assign QBCKE = DCKE_1 || DCKE_2;
+
+   assign ALERT_n = ERROR_IN_n;
+
+   always @ (*)
+   begin
+      QAA     <= repeat(2) @(negedge CK_t) DA;
+      QBA     <= repeat(2) @(negedge CK_t) ((ADDRESS_MIRRORING) ? ({~DA[17], DA[16:14], ~DA[11], DA[12], ~DA[13], DA[10], ~DA[9], ~DA[7], ~DA[8], ~DA[5], ~DA[6], ~DA[3], ~DA[4], DA[2:0]}) : ({~DA[17], DA[16:14], ~DA[13], DA[12], ~DA[11], DA[10], ~DA[9:3], DA[2:0]}));
+      QABA    <= repeat(2) @(negedge CK_t) DBA;
+      QBBA    <= repeat(2) @(negedge CK_t) ((ADDRESS_MIRRORING) ? ({~DBA[0], ~DBA[1]}) : (~DBA));
+      QABG    <= repeat(2) @(negedge CK_t) DBG;
+      QBBG    <= repeat(2) @(negedge CK_t) ((ADDRESS_MIRRORING) ? ({~DBG[0], ~DBG[1]}) : (~DBG));
+      QAACT_n <= repeat(2) @(negedge CK_t) DACT_n;
+      QBACT_n <= repeat(2) @(negedge CK_t) DACT_n;
+      QACS_n  <= repeat(2) @(negedge CK_t) DCS_n;
+      QBCS_n  <= repeat(2) @(negedge CK_t) DCS_n;
+      QAC     <= repeat(2) @(negedge CK_t) DC;
+      QBC     <= repeat(2) @(negedge CK_t) DC;
+      QAODT   <= repeat(2) @(negedge CK_t) DODT;
+      QBODT   <= repeat(2) @(negedge CK_t) DODT;
+     
+      DCKE_2  <= repeat(2) @(negedge CK_t) DCKE;
+      DCKE_1  <= repeat(1) @(negedge CK_t) DCKE;
+
+      QAPAR   <= repeat(1) @(negedge CK_t) DPAR;
+      QBPAR   <= repeat(1) @(negedge CK_t) ~DPAR; 
+   end
+
+endmodule
+
diff --git a/libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_core/altera_emif_ddrx_model.sv b/libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_core/altera_emif_ddrx_model.sv
new file mode 100644
index 0000000000..b9087aba31
--- /dev/null
+++ b/libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_core/altera_emif_ddrx_model.sv
@@ -0,0 +1,265 @@
+// (C) 2001-2014 Altera Corporation. All rights reserved.
+// Your use of Altera Corporation's design tools, logic functions and other 
+// software and tools, and its AMPP partner logic functions, and any output 
+// files any of the foregoing (including device programming or simulation 
+// files), and any associated documentation or information are expressly subject 
+// to the terms and conditions of the Altera Program License Subscription 
+// Agreement, Altera MegaCore Function License Agreement, or other applicable 
+// license agreement, including, without limitation, that your use is for the 
+// sole purpose of programming logic devices manufactured by Altera and sold by 
+// Altera or its authorized distributors.  Please refer to the applicable 
+// agreement for further details.
+
+
+///////////////////////////////////////////////////////////////////////////////
+// Top-level wrapper of memory model
+//
+///////////////////////////////////////////////////////////////////////////////
+module altera_emif_ddrx_model # (
+   parameter PROTOCOL_ENUM                           = "",                                
+   parameter MEM_FORMAT_ENUM                         = "",
+   parameter PHY_PING_PONG_EN                        = 0,
+   parameter MEM_RANKS_PER_DIMM                      = 0,
+   parameter MEM_NUM_OF_DIMMS                        = 0,
+   parameter MEM_DM_EN                               = 0,
+   parameter MEM_AC_PAR_EN                           = 0,
+
+   parameter MEM_DISCRETE_CS_WIDTH                   = 1,
+   parameter MEM_ROW_ADDR_WIDTH                      = 1,
+   parameter MEM_COL_ADDR_WIDTH                      = 1,
+                                                     
+   parameter MEM_TRTP                                = 0,
+   parameter MEM_TRCD                                = 0,
+   parameter MEM_MIRROR_ADDRESSING_EN                = 0,
+   parameter MEM_INIT_MRS0                           = 0,
+   parameter MEM_INIT_MRS1                           = 0,
+   parameter MEM_INIT_MRS2                           = 0,
+   parameter MEM_INIT_MRS3                           = 0,
+   parameter MEM_CFG_GEN_SBE                         = 0,
+   parameter MEM_CFG_GEN_DBE                         = 0,
+   
+   // Definition of port widths for "mem" interface
+   parameter PORT_MEM_CK_WIDTH                       = 1,
+   parameter PORT_MEM_CK_N_WIDTH                     = 1,
+   parameter PORT_MEM_DK_WIDTH                       = 1,
+   parameter PORT_MEM_DK_N_WIDTH                     = 1,
+   parameter PORT_MEM_DKA_WIDTH                      = 1,
+   parameter PORT_MEM_DKA_N_WIDTH                    = 1,
+   parameter PORT_MEM_DKB_WIDTH                      = 1,
+   parameter PORT_MEM_DKB_N_WIDTH                    = 1,
+   parameter PORT_MEM_K_WIDTH                        = 1,
+   parameter PORT_MEM_K_N_WIDTH                      = 1,
+   parameter PORT_MEM_A_WIDTH                        = 1,
+   parameter PORT_MEM_BA_WIDTH                       = 1,
+   parameter PORT_MEM_BG_WIDTH                       = 1,
+   parameter PORT_MEM_C_WIDTH                        = 1,
+   parameter PORT_MEM_CKE_WIDTH                      = 1,
+   parameter PORT_MEM_CS_N_WIDTH                     = 1,
+   parameter PORT_MEM_RM_WIDTH                       = 1,
+   parameter PORT_MEM_ODT_WIDTH                      = 1,
+   parameter PORT_MEM_RAS_N_WIDTH                    = 1,
+   parameter PORT_MEM_CAS_N_WIDTH                    = 1,
+   parameter PORT_MEM_WE_N_WIDTH                     = 1,
+   parameter PORT_MEM_RESET_N_WIDTH                  = 1,
+   parameter PORT_MEM_ACT_N_WIDTH                    = 1,
+   parameter PORT_MEM_PAR_WIDTH                      = 1,
+   parameter PORT_MEM_CA_WIDTH                       = 1,
+   parameter PORT_MEM_REF_N_WIDTH                    = 1,
+   parameter PORT_MEM_WPS_N_WIDTH                    = 1,
+   parameter PORT_MEM_RPS_N_WIDTH                    = 1,
+   parameter PORT_MEM_DOFF_N_WIDTH                   = 1,
+   parameter PORT_MEM_LDA_N_WIDTH                    = 1,
+   parameter PORT_MEM_LDB_N_WIDTH                    = 1,
+   parameter PORT_MEM_RWA_N_WIDTH                    = 1,
+   parameter PORT_MEM_RWB_N_WIDTH                    = 1,
+   parameter PORT_MEM_LBK0_N_WIDTH                   = 1,
+   parameter PORT_MEM_LBK1_N_WIDTH                   = 1,
+   parameter PORT_MEM_CFG_N_WIDTH                    = 1,
+   parameter PORT_MEM_AP_WIDTH                       = 1,
+   parameter PORT_MEM_PE_N_WIDTH                     = 1,
+   parameter PORT_MEM_AINV_WIDTH                     = 1,
+   parameter PORT_MEM_DM_WIDTH                       = 1,
+   parameter PORT_MEM_BWS_N_WIDTH                    = 1,
+   parameter PORT_MEM_D_WIDTH                        = 1,
+   parameter PORT_MEM_DQ_WIDTH                       = 1,
+   parameter PORT_MEM_DBI_N_WIDTH                    = 1,
+   parameter PORT_MEM_DQA_WIDTH                      = 1,
+   parameter PORT_MEM_DQB_WIDTH                      = 1,
+   parameter PORT_MEM_DINVA_WIDTH                    = 1,
+   parameter PORT_MEM_DINVB_WIDTH                    = 1,
+   parameter PORT_MEM_Q_WIDTH                        = 1,
+   parameter PORT_MEM_ALERT_N_WIDTH                  = 1,
+   parameter PORT_MEM_DQS_WIDTH                      = 1,
+   parameter PORT_MEM_DQS_N_WIDTH                    = 1,
+   parameter PORT_MEM_QK_WIDTH                       = 1,
+   parameter PORT_MEM_QK_N_WIDTH                     = 1,
+   parameter PORT_MEM_QKA_WIDTH                      = 1,
+   parameter PORT_MEM_QKA_N_WIDTH                    = 1,
+   parameter PORT_MEM_QKB_WIDTH                      = 1,
+   parameter PORT_MEM_QKB_N_WIDTH                    = 1,
+   parameter PORT_MEM_CQ_WIDTH                       = 1,
+   parameter PORT_MEM_CQ_N_WIDTH                     = 1
+) (
+   // Ports for "mem" interface
+   input  logic [PORT_MEM_CK_WIDTH-1:0]                       mem_ck,
+   input  logic [PORT_MEM_CK_N_WIDTH-1:0]                     mem_ck_n,   
+   input  logic [PORT_MEM_DK_WIDTH-1:0]                       mem_dk,   
+   input  logic [PORT_MEM_DK_N_WIDTH-1:0]                     mem_dk_n,   
+   input  logic [PORT_MEM_DKA_WIDTH-1:0]                      mem_dka,   
+   input  logic [PORT_MEM_DKA_N_WIDTH-1:0]                    mem_dka_n,   
+   input  logic [PORT_MEM_DKB_WIDTH-1:0]                      mem_dkb,   
+   input  logic [PORT_MEM_DKB_N_WIDTH-1:0]                    mem_dkb_n,   
+   input  logic [PORT_MEM_K_WIDTH-1:0]                        mem_k,   
+   input  logic [PORT_MEM_K_N_WIDTH-1:0]                      mem_k_n,   
+   input  logic [PORT_MEM_A_WIDTH-1:0]                        mem_a,   
+   input  logic [PORT_MEM_BA_WIDTH-1:0]                       mem_ba,   
+   input  logic [PORT_MEM_BG_WIDTH-1:0]                       mem_bg,   
+   input  logic [PORT_MEM_C_WIDTH-1:0]                        mem_c,   
+   input  logic [PORT_MEM_CKE_WIDTH-1:0]                      mem_cke,   
+   input  logic [PORT_MEM_CS_N_WIDTH-1:0]                     mem_cs_n,   
+   input  logic [PORT_MEM_RM_WIDTH-1:0]                       mem_rm,
+   input  logic [PORT_MEM_ODT_WIDTH-1:0]                      mem_odt,   
+   input  logic [PORT_MEM_RAS_N_WIDTH-1:0]                    mem_ras_n,   
+   input  logic [PORT_MEM_CAS_N_WIDTH-1:0]                    mem_cas_n,   
+   input  logic [PORT_MEM_WE_N_WIDTH-1:0]                     mem_we_n,   
+   input  logic [PORT_MEM_RESET_N_WIDTH-1:0]                  mem_reset_n,
+   input  logic [PORT_MEM_ACT_N_WIDTH-1:0]                    mem_act_n,   
+   input  logic [PORT_MEM_PAR_WIDTH-1:0]                      mem_par,   
+   input  logic [PORT_MEM_CA_WIDTH-1:0]                       mem_ca,   
+   input  logic [PORT_MEM_REF_N_WIDTH-1:0]                    mem_ref_n,   
+   input  logic [PORT_MEM_WPS_N_WIDTH-1:0]                    mem_wps_n,   
+   input  logic [PORT_MEM_RPS_N_WIDTH-1:0]                    mem_rps_n,   
+   input  logic [PORT_MEM_DOFF_N_WIDTH-1:0]                   mem_doff_n,   
+   input  logic [PORT_MEM_LDA_N_WIDTH-1:0]                    mem_lda_n,   
+   input  logic [PORT_MEM_LDB_N_WIDTH-1:0]                    mem_ldb_n,   
+   input  logic [PORT_MEM_RWA_N_WIDTH-1:0]                    mem_rwa_n,   
+   input  logic [PORT_MEM_RWB_N_WIDTH-1:0]                    mem_rwb_n,   
+   input  logic [PORT_MEM_LBK0_N_WIDTH-1:0]                   mem_lbk0_n,   
+   input  logic [PORT_MEM_LBK1_N_WIDTH-1:0]                   mem_lbk1_n,   
+   input  logic [PORT_MEM_CFG_N_WIDTH-1:0]                    mem_cfg_n,   
+   input  logic [PORT_MEM_AP_WIDTH-1:0]                       mem_ap,   
+   output logic [PORT_MEM_PE_N_WIDTH-1:0]                     mem_pe_n,   
+   input  logic [PORT_MEM_AINV_WIDTH-1:0]                     mem_ainv,   
+   input  logic [PORT_MEM_DM_WIDTH-1:0]                       mem_dm,   
+   input  logic [PORT_MEM_BWS_N_WIDTH-1:0]                    mem_bws_n,   
+   input  logic [PORT_MEM_D_WIDTH-1:0]                        mem_d,   
+   inout  tri   [PORT_MEM_DQ_WIDTH-1:0]                       mem_dq,   
+   inout  tri   [PORT_MEM_DBI_N_WIDTH-1:0]                    mem_dbi_n,   
+   inout  tri   [PORT_MEM_DQA_WIDTH-1:0]                      mem_dqa,   
+   inout  tri   [PORT_MEM_DQB_WIDTH-1:0]                      mem_dqb,   
+   inout  tri   [PORT_MEM_DINVA_WIDTH-1:0]                    mem_dinva,   
+   inout  tri   [PORT_MEM_DINVB_WIDTH-1:0]                    mem_dinvb,   
+   output logic [PORT_MEM_Q_WIDTH-1:0]                        mem_q,   
+   output logic [PORT_MEM_ALERT_N_WIDTH-1:0]                  mem_alert_n,
+   inout  tri   [PORT_MEM_DQS_WIDTH-1:0]                      mem_dqs,   
+   inout  tri   [PORT_MEM_DQS_N_WIDTH-1:0]                    mem_dqs_n,   
+   output logic [PORT_MEM_QK_WIDTH-1:0]                       mem_qk,   
+   output logic [PORT_MEM_QK_N_WIDTH-1:0]                     mem_qk_n,   
+   output logic [PORT_MEM_QKA_WIDTH-1:0]                      mem_qka,   
+   output logic [PORT_MEM_QKA_N_WIDTH-1:0]                    mem_qka_n,   
+   output logic [PORT_MEM_QKB_WIDTH-1:0]                      mem_qkb,   
+   output logic [PORT_MEM_QKB_N_WIDTH-1:0]                    mem_qkb_n,   
+   output logic [PORT_MEM_CQ_WIDTH-1:0]                       mem_cq,   
+   output logic [PORT_MEM_CQ_N_WIDTH-1:0]                     mem_cq_n
+);
+   timeunit 1ps;
+   timeprecision 1ps;
+  
+   // The first level of the memory model (i.e. this module) acts as a bus
+   // "splitter" for ping-pong PHY configuration. In ping-pong mode, the
+   // memory bus consists of signals for two logically-independent
+   // interfaces. The two interfaces however share the same physical 
+   // address/command bus through time-multiplexing. Certain signals, including
+   // CS#/ODT/CKE/CK/CK# and the data signals, are not shared by the two
+   // interfaces. This module is responsible for instantiating two underlying
+   // memory models corresponding to the two logically-independent memory
+   // interfaces, feeding shared signals to both models, and splitting the
+   // non-shared signals before feeding them to each model.
+   //
+   // In non-ping-pong configuration, only one underlying model is
+   // instantiated and this module is a pass-through.
+   //(JCHOI)
+   localparam NUM_OF_IFS = (PHY_PING_PONG_EN ? 2 : 1);
+   
+   // Calculate width of non-shared signals after splitting
+   localparam PORT_MEM_CKE_WIDTH_PER_IF   = PORT_MEM_CKE_WIDTH / NUM_OF_IFS;
+   localparam PORT_MEM_CS_N_WIDTH_PER_IF  = PORT_MEM_CS_N_WIDTH / NUM_OF_IFS;
+   localparam PORT_MEM_ODT_WIDTH_PER_IF   = PORT_MEM_ODT_WIDTH / NUM_OF_IFS;
+   localparam PORT_MEM_CK_WIDTH_PER_IF    = PORT_MEM_CK_WIDTH;
+   localparam PORT_MEM_CK_N_WIDTH_PER_IF  = PORT_MEM_CK_N_WIDTH;
+   localparam PORT_MEM_DQ_WIDTH_PER_IF    = PORT_MEM_DQ_WIDTH / NUM_OF_IFS;
+   localparam PORT_MEM_DQS_WIDTH_PER_IF   = PORT_MEM_DQS_WIDTH / NUM_OF_IFS;
+   localparam PORT_MEM_DQS_N_WIDTH_PER_IF = PORT_MEM_DQS_N_WIDTH / NUM_OF_IFS;
+
+   // DBI#/DM are optional pins. If they're unused, we still generate a fake signal of width 1 to avoid
+   // index range issue when declaring/selecting signals. Note that mem_dm is a DDR3-only issue and
+   // mem_dbi_n is a DDR4-only signal.
+   localparam PORT_MEM_DM_WIDTH_PER_IF    = (PORT_MEM_DM_WIDTH    == 1 && NUM_OF_IFS == 2) ? 1 : (PORT_MEM_DM_WIDTH    / NUM_OF_IFS);
+   localparam PORT_MEM_DBI_N_WIDTH_PER_IF = (PORT_MEM_DBI_N_WIDTH == 1 && NUM_OF_IFS == 2) ? 1 : (PORT_MEM_DBI_N_WIDTH / NUM_OF_IFS);
+
+   // Multiple alert# pins are meant to be daisy-chained on the board
+   // to obtain a single logically-AND'ed version of alert# before
+   // passing upward.
+   logic [NUM_OF_IFS-1:0] alert_n; 
+   assign mem_alert_n = &alert_n;
+
+   generate
+      genvar inst_i;
+
+      for (inst_i = 0; inst_i < NUM_OF_IFS; ++inst_i)
+      begin : pp_gen
+         altera_emif_ddrx_model_per_ping_pong # (
+         .PROTOCOL_ENUM                               (PROTOCOL_ENUM),
+            .MEM_FORMAT_ENUM          (MEM_FORMAT_ENUM),
+            .MEM_DISCRETE_CS_WIDTH    (MEM_DISCRETE_CS_WIDTH),
+            .MEM_RANKS_PER_DIMM       (MEM_RANKS_PER_DIMM),
+            .MEM_NUM_OF_DIMMS         (MEM_NUM_OF_DIMMS),
+            .MEM_AC_PAR_EN            (MEM_AC_PAR_EN),
+            .MEM_DM_EN                (MEM_DM_EN),
+            .PORT_MEM_CKE_WIDTH       (PORT_MEM_CKE_WIDTH_PER_IF),
+            .PORT_MEM_CK_WIDTH        (PORT_MEM_CK_WIDTH_PER_IF),
+            .PORT_MEM_CK_N_WIDTH      (PORT_MEM_CK_N_WIDTH_PER_IF),
+            .PORT_MEM_BA_WIDTH        (PORT_MEM_BA_WIDTH),
+            .PORT_MEM_BG_WIDTH        (PORT_MEM_BG_WIDTH),
+            .PORT_MEM_C_WIDTH         (PORT_MEM_C_WIDTH),
+            .PORT_MEM_A_WIDTH         (PORT_MEM_A_WIDTH),
+            .PORT_MEM_CS_N_WIDTH      (PORT_MEM_CS_N_WIDTH_PER_IF),
+            .PORT_MEM_RAS_N_WIDTH     (PORT_MEM_RAS_N_WIDTH),
+            .PORT_MEM_CAS_N_WIDTH     (PORT_MEM_CAS_N_WIDTH),
+            .PORT_MEM_WE_N_WIDTH      (PORT_MEM_WE_N_WIDTH),
+            .PORT_MEM_ACT_N_WIDTH     (PORT_MEM_ACT_N_WIDTH),
+            .PORT_MEM_DQS_WIDTH       (PORT_MEM_DQS_WIDTH_PER_IF),
+            .PORT_MEM_DQS_N_WIDTH     (PORT_MEM_DQS_N_WIDTH_PER_IF),
+            .PORT_MEM_DQ_WIDTH        (PORT_MEM_DQ_WIDTH_PER_IF),
+            .PORT_MEM_DM_WIDTH        (PORT_MEM_DM_WIDTH_PER_IF),
+            .PORT_MEM_DBI_N_WIDTH     (PORT_MEM_DBI_N_WIDTH_PER_IF),
+            .PORT_MEM_RESET_N_WIDTH   (PORT_MEM_RESET_N_WIDTH),
+            .PORT_MEM_PAR_WIDTH       (PORT_MEM_PAR_WIDTH),
+            .PORT_MEM_ALERT_N_WIDTH   (1),
+            .PORT_MEM_ODT_WIDTH       (PORT_MEM_ODT_WIDTH / NUM_OF_IFS),     
+            .MEM_ROW_ADDR_WIDTH       (MEM_ROW_ADDR_WIDTH),
+            .MEM_COL_ADDR_WIDTH       (MEM_COL_ADDR_WIDTH),
+            .MEM_TRTP                 (MEM_TRTP),
+            .MEM_TRCD                 (MEM_TRCD),
+            .MEM_INIT_MRS0            (MEM_INIT_MRS0),
+            .MEM_INIT_MRS1            (MEM_INIT_MRS1),
+            .MEM_INIT_MRS2            (MEM_INIT_MRS2),
+            .MEM_INIT_MRS3            (MEM_INIT_MRS3),
+            .MEM_MIRROR_ADDRESSING_EN (MEM_MIRROR_ADDRESSING_EN),
+            .MEM_CFG_GEN_SBE          (MEM_CFG_GEN_SBE),
+            .MEM_CFG_GEN_DBE          (MEM_CFG_GEN_DBE)
+         ) inst (
+            .mem_cs_n                 (mem_cs_n [ (PORT_MEM_CS_N_WIDTH_PER_IF * inst_i)  +: PORT_MEM_CS_N_WIDTH_PER_IF]),
+            .mem_cke                  (mem_cke  [ (PORT_MEM_CKE_WIDTH_PER_IF * inst_i)   +: PORT_MEM_CKE_WIDTH_PER_IF]),
+            .mem_odt                  (mem_odt  [ (PORT_MEM_ODT_WIDTH_PER_IF * inst_i)   +: PORT_MEM_ODT_WIDTH_PER_IF]),
+            .mem_dq                   (mem_dq   [ (PORT_MEM_DQ_WIDTH_PER_IF * inst_i)    +: PORT_MEM_DQ_WIDTH_PER_IF]),
+            .mem_dqs                  (mem_dqs  [ (PORT_MEM_DQS_WIDTH_PER_IF * inst_i)   +: PORT_MEM_DQS_WIDTH_PER_IF]),
+            .mem_dqs_n                (mem_dqs_n[ (PORT_MEM_DQS_N_WIDTH_PER_IF * inst_i) +: PORT_MEM_DQS_N_WIDTH_PER_IF]),
+            .mem_dm                   (mem_dm   [ (PORT_MEM_DM_WIDTH_PER_IF    * ((PORT_MEM_DM_WIDTH    == 1 && NUM_OF_IFS == 2) ? 0 : inst_i)) +: PORT_MEM_DM_WIDTH_PER_IF]),
+            .mem_dbi_n                (mem_dbi_n[ (PORT_MEM_DBI_N_WIDTH_PER_IF * ((PORT_MEM_DBI_N_WIDTH == 1 && NUM_OF_IFS == 2) ? 0 : inst_i)) +: PORT_MEM_DBI_N_WIDTH_PER_IF]),
+            .mem_alert_n              (alert_n  [inst_i]),
+            .*
+      );
+   end
+   endgenerate
+endmodule
diff --git a/libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_core/altera_emif_ddrx_model_bidir_delay.sv b/libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_core/altera_emif_ddrx_model_bidir_delay.sv
new file mode 100644
index 0000000000..a7315be92c
--- /dev/null
+++ b/libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_core/altera_emif_ddrx_model_bidir_delay.sv
@@ -0,0 +1,53 @@
+// (C) 2001-2014 Altera Corporation. All rights reserved.
+// Your use of Altera Corporation's design tools, logic functions and other 
+// software and tools, and its AMPP partner logic functions, and any output 
+// files any of the foregoing (including device programming or simulation 
+// files), and any associated documentation or information are expressly subject 
+// to the terms and conditions of the Altera Program License Subscription 
+// Agreement, Altera MegaCore Function License Agreement, or other applicable 
+// license agreement, including, without limitation, that your use is for the 
+// sole purpose of programming logic devices manufactured by Altera and sold by 
+// Altera or its authorized distributors.  Please refer to the applicable 
+// agreement for further details.
+
+
+module altera_emif_ddrx_model_bidir_delay
+   #(
+    
+    parameter DELAY   =        2.0
+	
+   ) (
+   
+    inout                      porta,
+    inout                      portb
+	
+   );
+   timeunit 1ps; timeprecision 1ps;
+   reg                         porta_dly;
+   reg                         portb_dly;
+
+   initial begin
+      porta_dly         =        1'bz;
+      portb_dly         =        1'bz;
+   end
+
+   always @(porta) begin
+  
+      if (portb_dly === 1'bz || porta === 1'bz) begin
+         porta_dly      <=       #DELAY porta;
+      end
+	
+   end
+
+   always @(portb) begin
+  
+      if (porta_dly === 1'bz || portb === 1'bz) begin
+         portb_dly <= #DELAY portb;
+      end
+	
+   end
+
+   assign porta       =         portb_dly;
+   assign portb       =         porta_dly;
+
+endmodule
\ No newline at end of file
diff --git a/libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_core/altera_emif_ddrx_model_per_device.sv b/libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_core/altera_emif_ddrx_model_per_device.sv
new file mode 100644
index 0000000000..16c2d86eb4
--- /dev/null
+++ b/libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_core/altera_emif_ddrx_model_per_device.sv
@@ -0,0 +1,362 @@
+// (C) 2001-2014 Altera Corporation. All rights reserved.
+// Your use of Altera Corporation's design tools, logic functions and other 
+// software and tools, and its AMPP partner logic functions, and any output 
+// files any of the foregoing (including device programming or simulation 
+// files), and any associated documentation or information are expressly subject 
+// to the terms and conditions of the Altera Program License Subscription 
+// Agreement, Altera MegaCore Function License Agreement, or other applicable 
+// license agreement, including, without limitation, that your use is for the 
+// sole purpose of programming logic devices manufactured by Altera and sold by 
+// Altera or its authorized distributors.  Please refer to the applicable 
+// agreement for further details.
+
+
+///////////////////////////////////////////////////////////////////////////////
+// memory model per device in a given depth expansion
+//
+///////////////////////////////////////////////////////////////////////////////
+module altera_emif_ddrx_model_per_device
+    # (
+
+   parameter PROTOCOL_ENUM                                                = "",
+   parameter MEM_FORMAT_ENUM                                              = "",
+   parameter MEM_RANKS_PER_DIMM                                           = 0,
+   parameter MEM_NUM_OF_DIMMS                                             = 0,
+   parameter MEM_AC_PAR_EN                                                = 0,
+   parameter MEM_DM_EN                                                    = 0,
+
+   parameter PORT_MEM_CKE_WIDTH                                           = 1,
+   parameter PORT_MEM_BA_WIDTH                                            = 1,
+   parameter PORT_MEM_BG_WIDTH                                            = 1,
+   parameter PORT_MEM_C_WIDTH                                             = 1,
+   parameter PORT_MEM_A_WIDTH                                             = 1,
+   parameter PORT_MEM_CS_N_WIDTH                                          = 1,
+   parameter PORT_MEM_RAS_N_WIDTH                                         = 1,
+   parameter PORT_MEM_CAS_N_WIDTH                                         = 1,
+   parameter PORT_MEM_WE_N_WIDTH                                          = 1,
+   parameter PORT_MEM_ACT_N_WIDTH                                         = 1,
+   parameter PORT_MEM_DQS_WIDTH                                           = 1,
+   parameter PORT_MEM_DQS_N_WIDTH                                         = 1,
+   parameter PORT_MEM_DQ_WIDTH                                            = 1,               
+   parameter PORT_MEM_DM_WIDTH                                            = 1,
+   parameter PORT_MEM_DBI_N_WIDTH                                         = 1,
+   parameter PORT_MEM_RESET_N_WIDTH                                       = 1,
+   parameter PORT_MEM_PAR_WIDTH                                           = 1,
+   parameter PORT_MEM_ALERT_N_WIDTH                                       = 1,
+
+   parameter MEM_ROW_ADDR_WIDTH                                           = 1,
+   parameter MEM_COL_ADDR_WIDTH                                           = 1,
+   parameter MEM_TRTP                                                     = 0,
+   parameter MEM_TRCD                                                     = 0,
+   parameter MEM_INIT_MRS0                                                = 0,
+   parameter MEM_INIT_MRS1                                                = 0,
+   parameter MEM_INIT_MRS2                                                = 0,
+   parameter MEM_INIT_MRS3                                                = 0,
+   parameter MEM_MIRROR_ADDRESSING_EN                                     = 0,
+   parameter MEM_DEPTH_IDX                                                = -1,
+   parameter MEM_CFG_GEN_SBE                                              = 0,
+   parameter MEM_CFG_GEN_DBE                                              = 0
+  )  (
+
+   input  logic                        [PORT_MEM_A_WIDTH-1:0]            mem_a,
+   input  logic                        [PORT_MEM_BA_WIDTH-1:0]           mem_ba,
+   input  logic                        [PORT_MEM_BG_WIDTH-1:0]           mem_bg,
+   input  logic                        [PORT_MEM_C_WIDTH-1:0]            mem_c,
+   input  logic                                                          mem_ck,
+   input  logic                                                          mem_ck_n,
+   input  logic                        [PORT_MEM_CKE_WIDTH - 1:0]        mem_cke,
+   input  logic                        [PORT_MEM_CS_N_WIDTH - 1:0]       mem_cs_n,
+   input  logic                        [PORT_MEM_RAS_N_WIDTH - 1:0]      mem_ras_n,
+   input  logic                        [PORT_MEM_CAS_N_WIDTH - 1:0]      mem_cas_n,
+   input  logic                        [PORT_MEM_WE_N_WIDTH - 1:0]       mem_we_n,
+   input  logic                        [PORT_MEM_ACT_N_WIDTH - 1:0]      mem_act_n,
+   input  logic                        [PORT_MEM_RESET_N_WIDTH - 1:0]    mem_reset_n,
+   input  logic                        [PORT_MEM_DM_WIDTH - 1:0]         mem_dm,
+   inout  tri                          [PORT_MEM_DBI_N_WIDTH - 1:0]      mem_dbi_n,
+   inout  tri                          [PORT_MEM_DQ_WIDTH - 1:0]         mem_dq,
+   inout  tri                          [PORT_MEM_DQS_WIDTH - 1:0]        mem_dqs,
+   inout  tri                          [PORT_MEM_DQS_N_WIDTH - 1:0]      mem_dqs_n,
+   output logic                        [PORT_MEM_ALERT_N_WIDTH-1:0]      mem_alert_n,
+   input  logic                        [PORT_MEM_PAR_WIDTH-1:0]          mem_par,
+   input  logic                                                          mem_odt
+
+  );
+   timeunit 1ps;
+   timeprecision 1ps;
+
+   localparam MEM_CS_PER_RANK                                            = 1;
+   localparam MEM_NUMBER_OF_RANKS                                        = ((MEM_RANKS_PER_DIMM == 0) ? (PORT_MEM_CS_N_WIDTH/MEM_CS_PER_RANK) : MEM_RANKS_PER_DIMM);
+
+   localparam MEM_PHYS_RANKS                                             =  MEM_NUMBER_OF_RANKS;
+   localparam PORT_MEM_DQ_A_WIDTH                                        = (MEM_PHYS_RANKS == 8) ? 72 : 40;
+   localparam PORT_MEM_DQ_B_WIDTH                                        = (MEM_PHYS_RANKS == 8) ? 72 : (PORT_MEM_DQ_WIDTH - PORT_MEM_DQ_A_WIDTH);
+   localparam PORT_MEM_DQS_A_WIDTH                                       = (MEM_PHYS_RANKS == 8) ? PORT_MEM_DQS_WIDTH : ((PORT_MEM_DQS_WIDTH * PORT_MEM_DQ_A_WIDTH) / PORT_MEM_DQ_WIDTH);
+   localparam PORT_MEM_DQS_B_WIDTH                                       = (MEM_PHYS_RANKS == 8) ? PORT_MEM_DQS_WIDTH : (PORT_MEM_DQS_WIDTH - PORT_MEM_DQS_A_WIDTH);
+
+   localparam MEM_DQ_A_U                                                 = PORT_MEM_DQ_A_WIDTH-1;
+   localparam MEM_DQ_A_L                                                 = 0;
+   localparam MEM_DQ_B_U                                                 = 71;
+   localparam MEM_DQ_B_L                                                 = (MEM_PHYS_RANKS == 8) ? 0 : PORT_MEM_DQ_A_WIDTH;
+   localparam MEM_DQS_A_U                                                = PORT_MEM_DQS_A_WIDTH-1;
+   localparam MEM_DQS_A_L                                                = 0;
+   localparam MEM_DQS_B_U                                                = (PORT_MEM_DQS_WIDTH-1);
+   localparam MEM_DQS_B_L                                                = (MEM_PHYS_RANKS == 8) ? 0 : PORT_MEM_DQS_A_WIDTH;
+
+
+   reg                                 [PORT_MEM_A_WIDTH-1:0]            a;
+   reg                                 [PORT_MEM_BA_WIDTH-1:0]           ba;
+   reg                                 [PORT_MEM_BG_WIDTH-1:0]           bg;
+   reg                                 [PORT_MEM_C_WIDTH-1:0]            c;
+   reg                                                                   ck;
+   reg                                                                   ck_n;
+   reg                                                                   cke;
+   reg                                 [MEM_NUMBER_OF_RANKS-1:0]         cs_n;
+   reg                                 [PORT_MEM_CS_N_WIDTH-1:0]         cs_rdimm_n;
+   reg                                                                   ras_n;
+   reg                                                                   cas_n;
+   reg                                                                   we_n;
+   reg                                                                   act_n;
+   reg                                 [PORT_MEM_RESET_N_WIDTH-1:0]      reset_n;
+   reg                                                                   odt;
+   reg                                 [MEM_NUMBER_OF_RANKS-1:0]         alert_n;
+   reg                                 [PORT_MEM_PAR_WIDTH-1:0]          par;
+   reg                                                                   single_bit_alert_n;
+
+   reg                                 [PORT_MEM_DM_WIDTH-1:0]           dm;
+
+   generate
+
+      if (MEM_FORMAT_ENUM == "MEM_FORMAT_RDIMM") begin
+         
+         always @(*) begin
+            ras_n <= a[16];
+            cas_n <= a[15];
+            we_n  <= a[14];
+         end
+       
+      end
+      else begin
+
+         always @(*) begin
+
+            a <= mem_a;
+            ba <= mem_ba;
+            bg <= mem_bg;
+            c <= mem_c;
+            ck <= mem_ck;
+            ck_n <= mem_ck_n;
+            cke <= mem_cke;
+            cs_n <= mem_cs_n;
+            ras_n <= mem_ras_n;
+            cas_n <= mem_cas_n;
+            we_n <= mem_we_n;
+            act_n <= mem_act_n;
+            reset_n <= mem_reset_n;
+            odt <= mem_odt;
+            par <= mem_par;
+            mem_alert_n <= single_bit_alert_n;
+
+            if (MEM_DM_EN != 0) begin
+               if ((PROTOCOL_ENUM != "PROTOCOL_DDR4") && (PORT_MEM_DM_WIDTH != PORT_MEM_DQS_WIDTH) || 
+                   (PROTOCOL_ENUM == "PROTOCOL_DDR4") && (PORT_MEM_DBI_N_WIDTH != PORT_MEM_DQS_WIDTH)) begin
+                  $display("Memory model DM width must equal DQS width.");
+                  $finish;
+               end
+            end
+            else
+            begin
+               dm <= #10 {PORT_MEM_DM_WIDTH{1'b0}};
+            end
+
+         end
+
+      end
+
+   endgenerate
+
+   generate
+      reg my_parity;
+      reg [4:0] err_out_shiftreg = 5'b11111;
+      if (MEM_AC_PAR_EN) begin
+         always @(posedge mem_ck) begin
+            if (mem_cke) begin
+               my_parity <= ^{mem_a, mem_ba, mem_ras_n, mem_cas_n, mem_we_n};
+               err_out_shiftreg[4:1] <= err_out_shiftreg[3:0];
+               if (cs_n != {PORT_MEM_CS_N_WIDTH{1'b1}}) begin
+                  err_out_shiftreg[1:0] <= {2{my_parity == mem_par}};
+               end else begin
+                  err_out_shiftreg[0] <= 1'b1;
+               end
+            end
+         end
+      end
+      assign single_bit_alert_n = (PROTOCOL_ENUM == "PROTOCOL_DDR4" ? &alert_n : err_out_shiftreg[4]);
+   endgenerate
+
+
+   generate
+      if ((PROTOCOL_ENUM == "PROTOCOL_DDR4") && (MEM_FORMAT_ENUM == "MEM_FORMAT_RDIMM")) begin : gen_ddr4_rcd_chip
+
+         altera_emif_ddr4_model_rcd_chip ddr4_rcd_chip (
+            .DCKE       (mem_cke),
+            .DODT       (mem_odt),
+            .DCS_n      (mem_cs_n),
+            .DC         (mem_c),
+            
+            .DA         (mem_a),
+            .DBA        (mem_ba),
+            .DBG        (mem_bg),
+            .DACT_n     (mem_act_n),
+            
+            .CK_t       (mem_ck),
+            .CK_c       (mem_ck_n),
+            
+            .DRST_n     (mem_reset_n),
+            
+            .DPAR       (mem_par),
+            
+            .ERROR_IN_n (single_bit_alert_n),
+            
+            .BODT       (),
+            .BCKE       (),
+            .BCOM       (),
+            .BCK_t      (),
+            .BCK_c      (),
+            .BVrefCA    (),
+            
+            .QACKE      (cke),
+            .QBCKE      (),
+            .QAODT      (odt),
+            .QBODT      (),
+            .QACS_n     (cs_n),
+            .QBCS_n     (),
+            .QAC        (c),
+            .QBC        (),
+            
+            .QAA        (a),
+            .QBA        (),
+            .QABA       (ba),
+            .QABG       (bg),
+            .QBBA       (),
+            .QBBG       (),
+            .QAACT_n    (act_n),
+            .QBACT_n    (),
+            
+            .Y_t        (ck),
+            .Y_c        (ck_n),
+            
+            .QRST_n     (reset_n),
+            
+            .QAPAR      (par),
+            .QBPAR      (),
+            
+            .ALERT_n    (mem_alert_n),
+            
+            .SDA        (),
+            .SA         (),
+            .SCL        (),
+            .BFUNC      (),
+            .VDDSPD     (),
+            
+            .VDD        (1'b1),
+            .VSS        (1'b0),
+            .AVDD       (1'b1),
+            .PVDD       (1'b1),
+            .PVSS       (1'b0)
+         );
+      end
+
+      if ((PROTOCOL_ENUM == "PROTOCOL_DDR4") && (MEM_FORMAT_ENUM == "MEM_FORMAT_LRDIMM")) begin : gen_ddr4_db_chips
+         initial
+         begin
+            $display("Simulation of DDR4 LRDIMM is not supported in this version of Quartus.");
+            $finish;
+         end
+      end
+
+      if ((PROTOCOL_ENUM == "PROTOCOL_DDR3") && (MEM_FORMAT_ENUM == "MEM_FORMAT_RDIMM")) begin : gen_ddr3_rdimm_chip
+         initial
+         begin
+            $display("Simulation of DDR3 RDIMM is not supported in this version of Quartus.");
+            $finish;
+         end
+      end
+
+      if ((PROTOCOL_ENUM == "PROTOCOL_DDR3") && (MEM_FORMAT_ENUM == "MEM_FORMAT_LRDIMM")) begin : gen_ddr3_lrdimm_chip
+         initial
+         begin
+            $display("Simulation of DDR3 LRDIMM is not supported in this version of Quartus.");
+            $finish;
+         end
+      end
+
+   endgenerate
+
+
+   generate
+
+      if (MEM_FORMAT_ENUM == "MEM_FORMAT_LRDIMM") begin : gen_lrdimm_mem
+         // Simulation of LRDIMMs is not supported in this version of Quartus.
+      end
+      else begin : gen_mem_rank
+         genvar rank;
+         for (rank = 0; rank < MEM_NUMBER_OF_RANKS; rank = rank + 1)  begin : rank_gen
+            altera_emif_ddrx_model_rank #(
+
+               .PROTOCOL_ENUM                                 (PROTOCOL_ENUM),
+               .PORT_MEM_BA_WIDTH                             (PORT_MEM_BA_WIDTH),
+               .PORT_MEM_BG_WIDTH                             (PORT_MEM_BG_WIDTH),
+               .PORT_MEM_C_WIDTH                              (PORT_MEM_C_WIDTH),
+               .PORT_MEM_A_WIDTH                              (PORT_MEM_A_WIDTH),
+               .MEM_ROW_ADDR_WIDTH                            (MEM_ROW_ADDR_WIDTH),
+               .MEM_COL_ADDR_WIDTH                            (MEM_COL_ADDR_WIDTH),
+               .PORT_MEM_DQS_WIDTH                            (PORT_MEM_DQS_WIDTH),
+               .PORT_MEM_DQ_WIDTH                             (PORT_MEM_DQ_WIDTH),
+               .PORT_MEM_DM_WIDTH                             (PORT_MEM_DM_WIDTH),
+               .PORT_MEM_DBI_N_WIDTH                          (PORT_MEM_DBI_N_WIDTH),
+
+               .MEM_DM_EN                                     (MEM_DM_EN),
+               .MEM_TRTP                                      (MEM_TRTP),
+               .MEM_TRCD                                      (MEM_TRCD),
+               .MEM_INIT_MRS0                                 (MEM_INIT_MRS0),
+               .MEM_INIT_MRS1                                 (MEM_INIT_MRS1),
+               .MEM_INIT_MRS2                                 (MEM_INIT_MRS2),
+               .MEM_INIT_MRS3                                 (MEM_INIT_MRS3),
+               .MEM_MIRROR_ADDRESSING                         (MEM_MIRROR_ADDRESSING_EN & (rank & 1'b1)),
+               .MEM_DEPTH_IDX                                 (MEM_DEPTH_IDX),
+               .MEM_RANK_IDX                                  (rank),
+               .MEM_CFG_GEN_SBE                               (MEM_CFG_GEN_SBE),
+               .MEM_CFG_GEN_DBE                               (MEM_CFG_GEN_DBE)
+
+            ) rank_inst (
+
+               .mem_a         (a),
+               .mem_ba        (ba),
+               .mem_bg        (bg),
+               .mem_c         (c),
+               .mem_ck        (ck),
+               .mem_ck_n      (ck_n),
+               .mem_cke       (cke),
+               .mem_ras_n     (ras_n),
+               .mem_cas_n     (cas_n),
+               .mem_we_n      (we_n),
+               .mem_act_n     (act_n),
+               .mem_reset_n   (reset_n),
+               .mem_dm        (mem_dm),
+               .mem_dbi_n     (mem_dbi_n),
+               .mem_dq        (mem_dq),
+               .mem_dqs       (mem_dqs),
+               .mem_dqs_n     (mem_dqs_n),
+               .mem_odt       (odt),
+               .mem_cs_n      (cs_n[rank]),
+               .mem_alert_n   (alert_n[rank]),
+               .mem_par       (par)
+
+            );
+         end
+
+      end
+
+  endgenerate
+
+endmodule
diff --git a/libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_core/altera_emif_ddrx_model_per_ping_pong.sv b/libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_core/altera_emif_ddrx_model_per_ping_pong.sv
new file mode 100644
index 0000000000..eb5eb289d6
--- /dev/null
+++ b/libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_core/altera_emif_ddrx_model_per_ping_pong.sv
@@ -0,0 +1,186 @@
+// (C) 2001-2014 Altera Corporation. All rights reserved.
+// Your use of Altera Corporation's design tools, logic functions and other 
+// software and tools, and its AMPP partner logic functions, and any output 
+// files any of the foregoing (including device programming or simulation 
+// files), and any associated documentation or information are expressly subject 
+// to the terms and conditions of the Altera Program License Subscription 
+// Agreement, Altera MegaCore Function License Agreement, or other applicable 
+// license agreement, including, without limitation, that your use is for the 
+// sole purpose of programming logic devices manufactured by Altera and sold by 
+// Altera or its authorized distributors.  Please refer to the applicable 
+// agreement for further details.
+
+
+///////////////////////////////////////////////////////////////////////////////
+// Memory model representing either the "ping" or the "pong" side of
+// the memory device for ping-pong topology. For non-ping-pong topology
+// this is simply the top-level wrapper of the memory model.
+//
+///////////////////////////////////////////////////////////////////////////////
+module altera_emif_ddrx_model_per_ping_pong # 
+(
+   parameter PROTOCOL_ENUM                                                = "",
+   parameter MEM_FORMAT_ENUM                                              = "",
+   parameter MEM_DISCRETE_CS_WIDTH                                        = 1,  
+   parameter MEM_RANKS_PER_DIMM                                           = 0,
+   parameter MEM_NUM_OF_DIMMS                                             = 0,
+   parameter MEM_AC_PAR_EN                                                = 0,
+   parameter MEM_DM_EN                                                    = 0,
+
+   parameter PORT_MEM_CKE_WIDTH                                           = 1,
+   parameter PORT_MEM_CK_WIDTH                                            = 1,
+   parameter PORT_MEM_CK_N_WIDTH                                          = 1,
+   parameter PORT_MEM_BA_WIDTH                                            = 1,
+   parameter PORT_MEM_BG_WIDTH                                            = 1,
+   parameter PORT_MEM_C_WIDTH                                             = 1,
+   parameter PORT_MEM_A_WIDTH                                             = 1,
+   parameter PORT_MEM_CS_N_WIDTH                                          = 1,
+   parameter PORT_MEM_RAS_N_WIDTH                                         = 1,
+   parameter PORT_MEM_CAS_N_WIDTH                                         = 1,
+   parameter PORT_MEM_WE_N_WIDTH                                          = 1,
+   parameter PORT_MEM_ACT_N_WIDTH                                         = 1,
+   parameter PORT_MEM_DQS_WIDTH                                           = 1,
+   parameter PORT_MEM_DQS_N_WIDTH                                         = 1,
+   parameter PORT_MEM_DQ_WIDTH                                            = 1,
+   parameter PORT_MEM_DM_WIDTH                                            = 1,
+   parameter PORT_MEM_DBI_N_WIDTH                                         = 1,
+   parameter PORT_MEM_RESET_N_WIDTH                                       = 1,
+   parameter PORT_MEM_PAR_WIDTH                                           = 1,
+   parameter PORT_MEM_ALERT_N_WIDTH                                       = 1,
+   parameter PORT_MEM_ODT_WIDTH                                           = 1,
+
+   parameter MEM_ROW_ADDR_WIDTH                                           = 1,
+   parameter MEM_COL_ADDR_WIDTH                                           = 1,
+   parameter MEM_TRTP                                                     = 0,
+   parameter MEM_TRCD                                                     = 0,
+   parameter MEM_INIT_MRS0                                                = 0,
+   parameter MEM_INIT_MRS1                                                = 0,
+   parameter MEM_INIT_MRS2                                                = 0,
+   parameter MEM_INIT_MRS3                                                = 0,
+   parameter MEM_MIRROR_ADDRESSING_EN                                     = 0,
+   parameter MEM_CFG_GEN_SBE                                              = 0,
+   parameter MEM_CFG_GEN_DBE                                              = 0
+) (
+   input  logic                        [PORT_MEM_A_WIDTH-1:0]            mem_a,
+   input  logic                        [PORT_MEM_BA_WIDTH-1:0]           mem_ba,
+   input  logic                        [PORT_MEM_BG_WIDTH-1:0]           mem_bg,
+   input  logic                        [PORT_MEM_C_WIDTH-1:0]            mem_c,
+   input  logic                        [PORT_MEM_CK_WIDTH-1:0]           mem_ck,
+   input  logic                        [PORT_MEM_CK_N_WIDTH-1:0]         mem_ck_n,
+   input  logic                        [PORT_MEM_CKE_WIDTH - 1:0]        mem_cke,
+   input  logic                        [PORT_MEM_CS_N_WIDTH - 1:0]       mem_cs_n,
+   input  logic                        [PORT_MEM_RAS_N_WIDTH - 1:0]      mem_ras_n,
+   input  logic                        [PORT_MEM_CAS_N_WIDTH - 1:0]      mem_cas_n,
+   input  logic                        [PORT_MEM_WE_N_WIDTH - 1:0]       mem_we_n,
+   input  logic                        [PORT_MEM_ACT_N_WIDTH - 1:0]      mem_act_n,
+   input  logic                        [PORT_MEM_RESET_N_WIDTH - 1:0]    mem_reset_n,
+   input  logic                        [PORT_MEM_DM_WIDTH - 1:0]         mem_dm,
+   inout  tri                          [PORT_MEM_DBI_N_WIDTH - 1:0]      mem_dbi_n,
+   inout  tri                          [PORT_MEM_DQ_WIDTH - 1:0]         mem_dq,
+   inout  tri                          [PORT_MEM_DQS_WIDTH - 1:0]        mem_dqs,
+   inout  tri                          [PORT_MEM_DQS_N_WIDTH - 1:0]      mem_dqs_n,
+   output logic                        [PORT_MEM_ALERT_N_WIDTH-1:0]      mem_alert_n,
+   input  logic                        [PORT_MEM_PAR_WIDTH-1:0]          mem_par,
+   input  logic                        [PORT_MEM_ODT_WIDTH-1:0]          mem_odt
+);
+   timeunit 1ps;
+   timeprecision 1ps;
+   
+   localparam MEM_MODEL_DEVICE_DEPTH = (MEM_FORMAT_ENUM == "MEM_FORMAT_RDIMM" || MEM_FORMAT_ENUM == "MEM_FORMAT_LRDIMM" || MEM_FORMAT_ENUM == "MEM_FORMAT_UDIMM" ) ? MEM_NUM_OF_DIMMS : MEM_DISCRETE_CS_WIDTH ;
+
+   wire logic [MEM_MODEL_DEVICE_DEPTH - 1:0] alert_n; 
+   assign mem_alert_n = &alert_n;
+
+   /* DDR4 Shared Address/Command Bus: {RAS_n, CAS_n, WE_n} = A[16:14]
+   Interpret as RAS/CAS/WE when ACT_n = 1
+   Interpret as A[16:14] when ACT_n = 0 
+   If DDR4, there should be no RAS/CAS/WE coming in. We copy A[16:14] to those signals here. */
+   logic [PORT_MEM_RAS_N_WIDTH-1:0] int_mem_ras_n;
+   logic [PORT_MEM_CAS_N_WIDTH-1:0] int_mem_cas_n;
+   logic [PORT_MEM_WE_N_WIDTH-1:0] int_mem_we_n;
+   initial begin
+      assert(!(PROTOCOL_ENUM == "PROTOCOL_DDR4" && PORT_MEM_A_WIDTH < 17)) else $error("mem_a width must be at least 17 for DDR4");
+   end
+   
+   generate
+      if (PROTOCOL_ENUM == "PROTOCOL_DDR4") begin
+         always_comb begin
+            int_mem_ras_n <= {PORT_MEM_RAS_N_WIDTH{mem_a[16]}};
+            int_mem_cas_n <= {PORT_MEM_CAS_N_WIDTH{mem_a[15]}};
+            int_mem_we_n <= {PORT_MEM_WE_N_WIDTH{mem_a[14]}};
+         end
+      end else begin
+         always_comb begin
+            int_mem_ras_n <= mem_ras_n;
+            int_mem_cas_n <= mem_cas_n;
+            int_mem_we_n <= mem_we_n;
+         end
+      end
+   endgenerate
+
+   generate
+      genvar depth;
+      for (depth = 0; depth < MEM_MODEL_DEVICE_DEPTH; ++depth) begin : depth_gen
+         
+         altera_emif_ddrx_model_per_device #(
+            .PROTOCOL_ENUM                               (PROTOCOL_ENUM),
+            .PORT_MEM_CKE_WIDTH                          (PORT_MEM_CKE_WIDTH),
+            .PORT_MEM_BA_WIDTH                           (PORT_MEM_BA_WIDTH),
+            .PORT_MEM_BG_WIDTH                           (PORT_MEM_BG_WIDTH),
+            .PORT_MEM_C_WIDTH                            (PORT_MEM_C_WIDTH),
+            .PORT_MEM_A_WIDTH                            (PORT_MEM_A_WIDTH),
+            .PORT_MEM_CS_N_WIDTH                         (PORT_MEM_CS_N_WIDTH / MEM_MODEL_DEVICE_DEPTH),
+            .PORT_MEM_DQS_WIDTH                          (PORT_MEM_DQS_WIDTH),
+            .PORT_MEM_DQS_N_WIDTH                        (PORT_MEM_DQS_N_WIDTH),
+            .PORT_MEM_DQ_WIDTH                           (PORT_MEM_DQ_WIDTH),
+            .PORT_MEM_RAS_N_WIDTH                        (PORT_MEM_RAS_N_WIDTH),
+            .PORT_MEM_CAS_N_WIDTH                        (PORT_MEM_CAS_N_WIDTH),
+            .PORT_MEM_WE_N_WIDTH                         (PORT_MEM_WE_N_WIDTH),
+            .PORT_MEM_ACT_N_WIDTH                        (PORT_MEM_ACT_N_WIDTH),
+            .PORT_MEM_DM_WIDTH                           (PORT_MEM_DM_WIDTH),
+            .PORT_MEM_DBI_N_WIDTH                        (PORT_MEM_DBI_N_WIDTH),
+            .PORT_MEM_RESET_N_WIDTH                      (PORT_MEM_RESET_N_WIDTH),
+            .PORT_MEM_PAR_WIDTH                          (PORT_MEM_PAR_WIDTH),
+            .PORT_MEM_ALERT_N_WIDTH                      (1),
+            .MEM_ROW_ADDR_WIDTH                          (MEM_ROW_ADDR_WIDTH),
+            .MEM_COL_ADDR_WIDTH                          (MEM_COL_ADDR_WIDTH),
+            .MEM_TRTP                                    (MEM_TRTP),
+            .MEM_TRCD                                    (MEM_TRCD),
+            .MEM_INIT_MRS0                               (MEM_INIT_MRS0),
+            .MEM_INIT_MRS1                               (MEM_INIT_MRS1),
+            .MEM_INIT_MRS2                               (MEM_INIT_MRS2),
+            .MEM_INIT_MRS3                               (MEM_INIT_MRS3),
+            .MEM_DEPTH_IDX                               (depth),
+            .MEM_FORMAT_ENUM                             (MEM_FORMAT_ENUM),
+            .MEM_RANKS_PER_DIMM                          (MEM_RANKS_PER_DIMM),
+            .MEM_DM_EN                                   (MEM_DM_EN),
+            .MEM_MIRROR_ADDRESSING_EN                    (MEM_MIRROR_ADDRESSING_EN),
+            .MEM_AC_PAR_EN                               (MEM_AC_PAR_EN),
+            .MEM_CFG_GEN_SBE                             (MEM_CFG_GEN_SBE),
+            .MEM_CFG_GEN_DBE                             (MEM_CFG_GEN_DBE)
+         ) mem_inst (
+            .mem_a                                    (mem_a),
+            .mem_ba                                   (mem_ba),
+            .mem_bg                                   (mem_bg),
+            .mem_c                                    (mem_c),
+            .mem_ck                                   (mem_ck[0]), 
+            .mem_ck_n                                 (mem_ck_n[0]),   
+            .mem_cke                                  (mem_cke),
+            .mem_cs_n                                 (mem_cs_n[PORT_MEM_CS_N_WIDTH/MEM_MODEL_DEVICE_DEPTH*(depth+1)-1:PORT_MEM_CS_N_WIDTH/MEM_MODEL_DEVICE_DEPTH*depth]),
+            .mem_ras_n                                (int_mem_ras_n),
+            .mem_cas_n                                (int_mem_cas_n),
+            .mem_we_n                                 (int_mem_we_n),
+            .mem_act_n                                (mem_act_n),
+            .mem_reset_n                              (mem_reset_n),
+            .mem_dm                                   (mem_dm),
+            .mem_dbi_n                                (mem_dbi_n),
+            .mem_dq                                   (mem_dq),
+            .mem_dqs                                  (mem_dqs),
+            .mem_dqs_n                                (mem_dqs_n),
+            .mem_par                                  (mem_par),
+            .mem_alert_n                              (alert_n[depth]),
+            .mem_odt                                  (mem_odt[0])
+         );
+      end
+   endgenerate 
+endmodule
diff --git a/libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_core/altera_emif_ddrx_model_rank.sv b/libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_core/altera_emif_ddrx_model_rank.sv
new file mode 100644
index 0000000000..47cbc56fa3
--- /dev/null
+++ b/libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_core/altera_emif_ddrx_model_rank.sv
@@ -0,0 +1,1597 @@
+// (C) 2001-2014 Altera Corporation. All rights reserved.
+// Your use of Altera Corporation's design tools, logic functions and other 
+// software and tools, and its AMPP partner logic functions, and any output 
+// files any of the foregoing (including device programming or simulation 
+// files), and any associated documentation or information are expressly subject 
+// to the terms and conditions of the Altera Program License Subscription 
+// Agreement, Altera MegaCore Function License Agreement, or other applicable 
+// license agreement, including, without limitation, that your use is for the 
+// sole purpose of programming logic devices manufactured by Altera and sold by 
+// Altera or its authorized distributors.  Please refer to the applicable 
+// agreement for further details.
+
+
+module altera_emif_ddrx_model_rank
+    # (
+   parameter PROTOCOL_ENUM                                           = "",
+   parameter PORT_MEM_BA_WIDTH                                       = 1,
+   parameter PORT_MEM_BG_WIDTH                                       = 1,
+   parameter PORT_MEM_C_WIDTH                                        = 1,
+   parameter PORT_MEM_A_WIDTH                                        = 1,
+   parameter MEM_ROW_ADDR_WIDTH                                      = 1,
+   parameter MEM_COL_ADDR_WIDTH                                      = 1,
+   parameter PORT_MEM_DM_WIDTH                                       = 1,
+   parameter PORT_MEM_DBI_N_WIDTH                                    = 1,
+   parameter PORT_MEM_DQS_WIDTH                                      = 1,
+   parameter PORT_MEM_DQ_WIDTH                                       = 1,
+   parameter MEM_DM_EN                                               = 0,
+   parameter MEM_PAR_ALERT_PW                                        = 48, 
+   parameter MEM_CRC_ALERT                                           = 13, 
+   parameter MEM_CRC_ALERT_PW                                        = 6, 
+   parameter MEM_TRTP                                                = 0,
+   parameter MEM_TRCD                                                = 0,
+   parameter MEM_DQS_TO_CLK_CAPTURE_DELAY                            = 100,
+   parameter MEM_CLK_TO_DQS_CAPTURE_DELAY                            = 100000,
+   parameter MEM_MIRROR_ADDRESSING                                   = 0,
+   parameter MEM_DEPTH_IDX                                           = -1,
+   parameter MEM_WIDTH_IDX                                           = 0,
+   parameter MEM_RANK_IDX                                            = -1,
+   parameter MEM_VERBOSE                                             = 1,
+   parameter MEM_GUARANTEED_WRITE_INIT                               = 0,
+   parameter REFRESH_BURST_VALIDATION                                = 0,
+   parameter MEM_INIT_MRS0                                           = 0,
+   parameter MEM_INIT_MRS1                                           = 0,
+   parameter MEM_INIT_MRS2                                           = 0,
+   parameter MEM_INIT_MRS3                                           = 0,
+   parameter MEM_CFG_GEN_SBE                                         = 0,
+   parameter MEM_CFG_GEN_DBE                                         = 0
+   ) (
+
+   input  logic                      [PORT_MEM_A_WIDTH-1:0]          mem_a,
+   input  logic                      [PORT_MEM_BA_WIDTH-1:0]         mem_ba,
+   input  logic                      [PORT_MEM_BG_WIDTH-1:0]         mem_bg,
+   input  logic                      [PORT_MEM_C_WIDTH-1:0]          mem_c,
+   input  logic                                                      mem_ck,
+   input  logic                                                      mem_ck_n,
+   input  logic                                                      mem_cke,
+   input  logic                                                      mem_ras_n,
+   input  logic                                                      mem_cas_n,
+   input  logic                                                      mem_we_n,
+   input  logic                                                      mem_act_n,
+   input  logic                                                      mem_reset_n,
+   input  logic                     [PORT_MEM_DM_WIDTH-1:0]          mem_dm,
+   inout  tri                       [PORT_MEM_DBI_N_WIDTH-1:0]       mem_dbi_n,
+   inout  tri                       [PORT_MEM_DQ_WIDTH-1:0]          mem_dq,
+   inout  tri                       [PORT_MEM_DQS_WIDTH-1:0]         mem_dqs,
+   inout  tri                       [PORT_MEM_DQS_WIDTH-1:0]         mem_dqs_n,
+   input  logic                                                      mem_odt,
+   input  logic                                                      mem_cs_n,
+   output logic                                                      mem_alert_n,
+   input  logic                                                      mem_par
+   );
+   timeunit 1ps;
+   timeprecision 1ps;
+
+
+   localparam NUM_BANKS_PER_GROUP                                    = 2**PORT_MEM_BA_WIDTH;
+   localparam NUM_BANK_GROUPS                                        = 2**PORT_MEM_BG_WIDTH;
+   localparam NUM_BANKS                                              = NUM_BANKS_PER_GROUP * NUM_BANK_GROUPS;
+   localparam MEM_DQS_GROUP_SIZE                                     = PORT_MEM_DQ_WIDTH / PORT_MEM_DQS_WIDTH;
+   localparam ALERT_N_PIPELINE_SIZE                                  = 2 * (MEM_PAR_ALERT_PW+16) + 1;
+   localparam DISABLE_NOP_DISPLAY                                    = 1;
+   localparam CHECK_VIOLATIONS                                       = 1;
+   localparam REFRESH_INTERVAL_PS                                    = 36000000;
+   localparam FULL_BURST_REFRESH_COUNT                               = 8192;
+   localparam STD_REFRESH_INTERVAL_PS                                = 7800000;
+   localparam MAX_LATENCY                                            = 64;
+   localparam MAX_BURST                                              = 8;
+   localparam OPCODE_WIDTH                                           = 5;
+   localparam CRC_DQ_RATIO                                           = 8;
+   localparam CRC_DBI_BITS                                           = 1;
+   localparam CRC_TREE_BITS                                          = 72;
+   localparam CRC_NUM_TREES                                          = PORT_MEM_DQ_WIDTH / CRC_DQ_RATIO;
+   localparam CRC_BURST_LENGTH                                       = 10; 
+   
+   wire                             [PORT_MEM_A_WIDTH - 1:0]         mem_a_wire;
+   wire                             [PORT_MEM_BA_WIDTH - 1:0]        mem_ba_wire;
+   wire                             [PORT_MEM_BG_WIDTH - 1:0]        mem_bg_wire;
+
+   wire                             [PORT_MEM_DQS_WIDTH - 1:0]       mem_dqs_shifted;
+   wire                             [PORT_MEM_DQS_WIDTH - 1:0]       mem_dqs_n_shifted;
+
+   wire                             [PORT_MEM_DQS_WIDTH - 1:0]       mem_dqs_n_shifted_2;
+   reg                              [PORT_MEM_DQS_WIDTH - 1:0]       mem_dqs_n_shifted_2_prev = 'z;
+
+
+   typedef enum logic[OPCODE_WIDTH-1:0] {
+      OPCODE_PRECHARGE = 'b01010,
+      OPCODE_ACTIVATE = 'b01011,
+      OPCODE_DDR4_ACTIVATE = 'b00xxx, 
+      OPCODE_WRITE = 'b01100,
+      OPCODE_READ = 'b01101,
+      OPCODE_MRS = 'b01000,
+      OPCODE_REFRESH = 'b01001,
+      OPCODE_DES = 'b1xxxx,
+      OPCODE_ZQC = 'b01110,
+      OPCODE_NOP = 'b01111
+
+   } OPCODE_TYPE;
+
+   typedef enum {
+
+      DDR_BURST_TYPE_BL16,
+      DDR_BURST_TYPE_BL8,
+      DDR_BURST_TYPE_OTF,
+      DDR_BURST_TYPE_BL4
+
+   } DDR_BURST_TYPE;
+
+   typedef enum {
+
+      DDR_AL_TYPE_ZERO,
+      DDR_AL_TYPE_CL_MINUS_1,
+      DDR_AL_TYPE_CL_MINUS_2
+
+   } DDR_AL_TYPE;
+
+   DDR_BURST_TYPE                          burst_type;
+   int                                     cas_latency;
+   int                                     cas_write_latency;
+   DDR_AL_TYPE                             al_type;
+   int                                     parity_latency;
+   bit                                     crc_en;
+   bit                                     wlevel_en;
+   bit [1:0]                               lpasr;
+   bit                                     geardown_mode;
+   bit [2:0]                               fine_granularity_refresh_mode;
+   bit                                     max_power_saving_en;
+   bit                                     temp_controlled_refresh_range;
+   bit                                     temp_controlled_refresh_en;
+
+   int tRTP_cycles                         = MEM_TRTP;
+   int tRCD_cycles                         = MEM_TRCD;
+
+   int                                     clock_cycle;
+
+   reg                                     clock_stable;
+
+   time                                    last_refresh_time;
+   bit                                     refresh_burst_active;
+   int                                     refresh_executed_count;
+   int                                     refresh_debt;
+   time                                    refresh_required_time;
+
+   typedef struct {
+
+      bit   [MEM_ROW_ADDR_WIDTH - 1:0]  opened_row;
+      time                              last_ref_time;
+      int                               last_ref_cycle;
+      int                               last_activate_cycle;
+      int                               last_precharge_cycle;
+      int                               last_write_cmd_cycle;
+      int                               last_write_access_cycle;
+      int                               last_read_cmd_cycle;
+      int                               last_read_access_cycle;
+
+   } bank_struct;
+
+   typedef struct {
+      bank_struct bank[NUM_BANKS_PER_GROUP-1:0];
+   } bg_struct;
+
+   bit [PORT_MEM_DQ_WIDTH - 1:0]           mem_data[*];
+
+   bg_struct                             bg [NUM_BANK_GROUPS - 1:0];
+
+   bit [CRC_TREE_BITS-1:0]               write_burst_data  [0:CRC_NUM_TREES-1];                 
+   bit [CRC_DQ_RATIO-1:0]                crc_received [0:CRC_NUM_TREES-1];                          
+   bit [PORT_MEM_DQ_WIDTH-1:0]           crc_received_prev;                     
+   bit [PORT_MEM_DQ_WIDTH-1:0]           crc_received_curr;
+   bit [CRC_DQ_RATIO-1:0]                mem_crc           [0:CRC_NUM_TREES-1]; 
+   
+   typedef enum {
+
+      DDR_CMD_TYPE_PRECHARGE,
+      DDR_CMD_TYPE_ACTIVATE,
+      DDR_CMD_TYPE_WRITE,
+      DDR_CMD_TYPE_READ,
+      DDR_CMD_TYPE_REFRESH,
+      DDR_CMD_TYPE_NOP,
+      DDR_CMD_TYPE_MRS,
+      DDR_CMD_TYPE_DES,
+      DDR_CMD_TYPE_ZQC,
+      DDR_CMD_TYPE_ERROR
+
+   } DDR_CMD_TYPE;
+
+   typedef struct {
+      DDR_CMD_TYPE                      cmd_type;
+      int                               word_count;
+      int                               burst_length;
+      bit   [PORT_MEM_BA_WIDTH - 1:0]   bank;
+      bit   [PORT_MEM_BG_WIDTH - 1:0]   bank_group;
+      bit   [PORT_MEM_A_WIDTH - 1:0]    address;
+      bit   [OPCODE_WIDTH-1:0]          opcode;
+   } command_struct;
+
+
+
+   DDR_CMD_TYPE                               write_command_queue[$];
+   int                                        write_word_count_queue[$];
+   int                                        write_burst_length_queue[$];
+   bit         [PORT_MEM_A_WIDTH - 1:0]       write_address_queue[$];
+   bit         [PORT_MEM_BA_WIDTH - 1:0]      write_bank_queue[$];
+   bit         [PORT_MEM_BG_WIDTH - 1:0]      write_bank_group_queue[$];
+
+   DDR_CMD_TYPE read_command_queue[$];
+   int                                        read_word_count_queue[$];
+   int                                        read_burst_length_queue[$];
+   bit        [PORT_MEM_A_WIDTH - 1:0]        read_address_queue[$];
+   bit        [PORT_MEM_BA_WIDTH - 1:0]       read_bank_queue[$];
+   bit        [PORT_MEM_BG_WIDTH - 1:0]       read_bank_group_queue[$];
+
+   DDR_CMD_TYPE precharge_command_queue[$];
+   bit        [PORT_MEM_BA_WIDTH - 1:0]       precharge_bank_queue[$];
+   bit        [PORT_MEM_BG_WIDTH - 1:0]       precharge_bank_group_queue[$];
+
+   DDR_CMD_TYPE activate_command_queue[$];
+   bit        [PORT_MEM_BA_WIDTH-1:0]         activate_bank_queue[$];
+   bit        [PORT_MEM_BG_WIDTH-1:0]         activate_bank_group_queue[$];
+   bit        [PORT_MEM_A_WIDTH-1:0]          activate_row_queue[$];
+
+   command_struct parity_latency_queue[$];
+   bit        [2 * MAX_LATENCY + 1:0]         parity_latency_pipeline;
+   bit        [ALERT_N_PIPELINE_SIZE:0]       parity_alert_n_pipeline;
+   bit        [ALERT_N_PIPELINE_SIZE:0]       crc_alert_n_pipeline;
+   
+   command_struct                             active_command;
+   command_struct                             new_command;
+   command_struct                             precharge_command;
+   command_struct                             activate_command;
+
+   bit        [2 * MAX_LATENCY + 1:0]         read_command_pipeline;
+   bit        [2 * MAX_LATENCY + 1:0]         write_command_pipeline;
+   bit        [2 * MAX_LATENCY + 1:0]         precharge_command_pipeline;
+   bit        [2 * MAX_LATENCY + 1:0]         activate_command_pipeline;
+
+   reg        [PORT_MEM_DQ_WIDTH - 1:0]       mem_dq_from_mem;
+   reg        [PORT_MEM_DQ_WIDTH - 1:0]       mem_dq_int;
+   reg        [PORT_MEM_DQ_WIDTH - 1:0]       mem_dq_captured;
+   reg        [PORT_MEM_DQ_WIDTH - 1:0]       mem_ck_sampled_by_dqs;
+   reg        [PORT_MEM_DQS_WIDTH - 1:0]      mem_dm_captured;
+   bit                                        mem_dq_en;
+   bit                                        mem_dqs_en;
+   bit                                        mem_dqs_preamble;
+   wire       [PORT_MEM_DQ_WIDTH - 1:0]       full_mask;
+   logic      [PORT_MEM_DQ_WIDTH - 1:0]       full_dbi_n;
+   wire       [PORT_MEM_DQ_WIDTH - 1:0]       full_dbi_n_in;
+   reg       [PORT_MEM_DQS_WIDTH - 1:0]      dbi_n;
+
+   time                                       mem_dqs_time[PORT_MEM_DQS_WIDTH];
+   time                                       mem_ck_time;
+
+   bit                                        wdbi_en;
+   bit                                        rdbi_en;
+   bit                                        dm_n_en;
+
+
+   function automatic string bank_str (input [PORT_MEM_BG_WIDTH-1:0] bank_group, input [PORT_MEM_BA_WIDTH-1:0] bank);
+      string result;
+      if (PROTOCOL_ENUM == "PROTOCOL_DDR4") begin
+         $sformat(result, "BANK_GROUP [ %0h ] - BANK [ %0h ]", bank_group, bank);
+      end else begin
+         $sformat(result, "BANK [ %0h ]", bank);
+      end
+      return result;
+   endfunction
+
+   task init_guaranteed_write (input integer option);
+
+      static int burst_length = 8;
+      static int other_bank = 3;
+      bit [32-1:0] five_s;
+      bit [32-1:0] a_s;
+
+      int i;
+      command_struct cmd;
+
+      $display("Pre-initializing memory for guaranteed write");
+
+      if (option == -1) begin
+         $display("option=%0d: distorting guaranteed write data", option);
+         five_s = 32'h55554;
+         a_s     = 32'hAAAAB;
+      end else begin
+         five_s = 32'h55555;
+         a_s     = 32'hAAAAA;
+      end
+
+      cmd.word_count = 0;
+      cmd.burst_length = burst_length;
+      cmd.address = 0;
+      cmd.bank = 0;
+      cmd.bank_group = 0; 
+      cmd.opcode = OPCODE_WRITE;
+
+      cmd.address = burst_length;
+      cmd.bank = 0;
+      for (i = 0; i < burst_length; i++) begin
+         cmd.word_count = i;
+         write_memory(cmd, five_s, '0, '0);
+      end
+
+      cmd.address = 0;
+      cmd.bank = other_bank;
+      for (i = 0; i < burst_length; i++) begin
+         cmd.word_count = i;
+         write_memory(cmd, five_s, '0, '0);
+      end
+
+      cmd.address = burst_length;
+      cmd.bank = other_bank;
+      for (i = 0; i < burst_length; i++) begin
+         cmd.word_count = i;
+         write_memory(cmd, a_s, '0, '0);
+      end
+
+      cmd.address = 0;
+      cmd.bank = 0;
+      for (i = 0; i < burst_length; i++) begin
+         cmd.word_count = i;
+         write_memory(cmd, a_s, '0, '0);
+      end
+
+   endtask
+
+   function automatic int min;
+      input int a;
+      input int b;
+      int result = (a < b) ? a : b;
+      return result;
+   endfunction
+
+   task automatic initialize_db;
+      while (write_command_queue.size() > 0)
+         write_command_queue.delete(0);
+      while (write_word_count_queue.size() > 0)
+         write_word_count_queue.delete(0);
+      while (write_burst_length_queue.size() > 0)
+         write_burst_length_queue.delete(0);
+      while (write_address_queue.size() > 0)
+         write_address_queue.delete(0);
+      while (write_bank_queue.size() > 0)
+         write_bank_queue.delete(0);
+
+      while (read_command_queue.size() > 0)
+         read_command_queue.delete(0);
+      while (read_word_count_queue.size() > 0)
+         read_word_count_queue.delete(0);
+      while (read_burst_length_queue.size() > 0)
+         read_burst_length_queue.delete(0);
+      while (read_address_queue.size() > 0)
+         read_address_queue.delete(0);
+      while (read_bank_queue.size() > 0)
+         read_bank_queue.delete(0);
+
+      while (precharge_command_queue.size() > 0)
+         precharge_command_queue.delete(0);
+      while (precharge_bank_queue.size() > 0)
+         precharge_bank_queue.delete(0);
+
+      while (activate_command_queue.size() > 0)
+         activate_command_queue.delete(0);
+      while (activate_bank_queue.size() > 0)
+         activate_bank_queue.delete(0);
+      while (activate_row_queue.size() > 0)
+         activate_row_queue.delete(0);
+
+      mem_data.delete();
+   endtask
+
+   task automatic set_cas_latency (input bit [3:0] code);
+      if(PROTOCOL_ENUM == "PROTOCOL_DDR4") begin
+         case(code)
+            4'b0000 : cas_latency = 9;
+            4'b0001 : cas_latency = 10;
+            4'b0010 : cas_latency = 11;
+            4'b0011 : cas_latency = 12;
+            4'b0100 : cas_latency = 13;
+            4'b0101 : cas_latency = 14;
+            4'b0110 : cas_latency = 15;
+            4'b0111 : cas_latency = 16;
+            4'b1101 : cas_latency = 17;
+            4'b1000 : cas_latency = 18;
+            4'b1110 : cas_latency = 19;
+            4'b1001 : cas_latency = 20;
+            4'b1111 : cas_latency = 21;
+            4'b1010 : cas_latency = 22;
+            4'b1011 : cas_latency = 24;
+            default: begin
+               $display("Error: Use of reserved DDR4 CAS latency code : %b", code);
+               $stop(1);
+            end
+         endcase
+      end else begin
+         case(code)
+            4'b0001 : cas_latency = 5;
+            4'b0010 : cas_latency = 6;
+            4'b0011 : cas_latency = 7;
+            4'b0100 : cas_latency = 8;
+            4'b0101 : cas_latency = 9;
+            4'b0110 : cas_latency = 10;
+            4'b0111 : cas_latency = 11;
+            4'b1000 : cas_latency = 12;
+            4'b1001 : cas_latency = 13;
+            4'b1010 : cas_latency = 14;
+            default: begin
+         end
+         endcase
+      end
+
+      if (MEM_VERBOSE) begin
+         $display("   CAS LATENCY set to : %0d", cas_latency);
+      end
+
+   endtask
+
+   task automatic set_additive_latency (input bit [1:0] code);
+      case(code)
+         3'b00 : begin
+            if (MEM_VERBOSE)
+               $display("   Setting Additive CAS LATENCY to 0");
+            al_type = DDR_AL_TYPE_ZERO;
+         end
+         3'b01 : begin
+            if (MEM_VERBOSE)
+               $display("   Setting Additive CAS LATENCY to CL - 1");
+            al_type = DDR_AL_TYPE_CL_MINUS_1;
+         end
+         3'b10 : begin
+            if (MEM_VERBOSE)
+               $display("   Setting Additive CAS LATENCY to CL - 2");
+            al_type = DDR_AL_TYPE_CL_MINUS_2;
+         end
+         3'b11 : begin
+            $display("Error: Use of reserved Additive CAS latency code : %b", code);
+            $stop(1);
+         end
+      endcase
+   endtask
+
+   task automatic set_write_leveling_mode (input bit code);
+      wlevel_en = code;
+      if (MEM_VERBOSE)
+         $display("   Setting write_leveling mode to %d", wlevel_en);
+   endtask
+
+   function automatic int get_additive_latency;
+      int additive_latency = 0;
+      case(al_type)
+         DDR_AL_TYPE_ZERO : begin
+         end
+         DDR_AL_TYPE_CL_MINUS_1 : begin
+            additive_latency = cas_latency - 1;
+         end
+         DDR_AL_TYPE_CL_MINUS_2 : begin
+            additive_latency = cas_latency - 2;
+         end
+         default : begin
+            $display("Error: Unknown additive latency type: %0d", al_type);
+         end
+      endcase
+      return additive_latency;
+    endfunction
+
+   task automatic set_parity_latency (input bit [2:0] code);
+      
+      int i;
+      
+      case(code)
+         3'b000 : begin
+            if (MEM_VERBOSE)
+               $display("   Setting A/C parity to DISABLED");
+            parity_latency = 0;
+         end
+         3'b001 : begin
+            if (MEM_VERBOSE)
+               $display("   Setting A/C parity to 4CK");
+            parity_latency = 4;
+         end
+         3'b010 : begin
+            if (MEM_VERBOSE)
+               $display("   Setting A/C parity to 5CK");
+            parity_latency = 5;
+         end
+         3'b011 : begin
+            if (MEM_VERBOSE)
+               $display("   Setting A/C parity to 6CK");
+            parity_latency = 6;
+         end
+         3'b100 : begin
+            if (MEM_VERBOSE)
+               $display("   Setting A/C parity to 8CK");
+            parity_latency = 8;
+         end
+         default : begin
+            $display("Error: Use of reserved A/C parity latency code : %b", code);
+            $stop(1);
+         end
+      endcase
+      
+      while (parity_latency_queue.size() > 0)
+         parity_latency_queue.delete(0);
+
+      for (i = 0; i < 2 * MAX_LATENCY; i++) begin
+         parity_latency_pipeline[i] = 0;
+      end
+      
+   endtask
+   
+   function automatic int get_read_latency;
+      int read_latency = cas_latency + get_additive_latency();
+      return read_latency;
+   endfunction
+
+   function automatic int get_write_latency;
+      int write_latency = cas_write_latency + get_additive_latency();
+      return write_latency;
+   endfunction
+
+   function automatic int get_precharge_latency;
+      return tRTP_cycles + get_additive_latency();
+   endfunction
+
+   task automatic set_cas_write_latency (input bit [2:0] code);
+      if(PROTOCOL_ENUM == "PROTOCOL_DDR4") begin
+         case(code)
+            3'b000 : cas_write_latency = 9;
+            3'b001 : cas_write_latency = 10;
+            3'b010 : cas_write_latency = 11;
+            3'b011 : cas_write_latency = 12;
+            3'b100 : cas_write_latency = 14;
+            3'b101 : cas_write_latency = 16;
+            3'b110 : cas_write_latency = 18;
+            default : begin
+               $display("Error: Use of reserved DDR4 CAS WRITE latency code : %b", code);
+               $stop(1);
+            end
+         endcase
+      end else begin
+         case(code)
+            3'b000 : cas_write_latency = 5;
+            3'b001 : cas_write_latency = 6;
+            3'b010 : cas_write_latency = 7;
+            3'b011 : cas_write_latency = 8;
+            3'b100 : cas_write_latency = 9;
+            3'b101 : cas_write_latency = 10;
+            default : begin
+               $display("Error: Use of reserved CAS WRITE latency code : %b", code);
+               $stop(1);
+            end
+         endcase
+      end
+      if (MEM_VERBOSE)
+         $display("   CAS WRITE LATENCY set to : %0d", cas_write_latency);
+   endtask
+
+   task automatic reset_dll (input bit code);
+      if(code == 1'b1) begin
+         if (MEM_VERBOSE)
+            $display("   Resetting DLL");
+      end
+   endtask
+
+   task automatic set_burst_type (input bit [1:0] burst_mode);
+      case (burst_mode)
+         2'b00 : begin
+            if (MEM_VERBOSE)
+               $display("   Setting burst length Fixed BL8");
+            burst_type = DDR_BURST_TYPE_BL8;
+         end
+         2'b01 : begin
+            if (MEM_VERBOSE)
+               $display("   Setting burst length on-the-fly");
+            burst_type = DDR_BURST_TYPE_OTF;
+         end
+         2'b10 : begin
+            if (MEM_VERBOSE)
+               $display("   Setting burst length Fixed BL4");
+            burst_type = DDR_BURST_TYPE_BL4;
+         end
+         default : begin
+            $display("ERROR: Invalid burst type mode %0d specified!", burst_mode);
+            $finish(1);
+         end
+      endcase
+   endtask
+
+   task automatic set_crc (input bit crc);
+      crc_en = crc;
+      $display("   Setting CRC %s", crc_en ? "enabled" : "disabled");
+   endtask
+   task automatic set_lpasr (input bit [1:0] code);
+      if (code ^ lpasr) begin
+         case (code)
+            2'b00 : begin
+               if (MEM_VERBOSE)
+                  $display("   Setting low power array self refresh mode: Manual, Normal temperature range");
+            end
+            2'b01 : begin
+               if (MEM_VERBOSE)
+                  $display("   Setting low power array self refresh mode: Manual, Reduced temperature range");
+            end
+            2'b10 : begin
+               if (MEM_VERBOSE)
+                  $display("   Setting low power array self refresh mode: Manual, Extended temperature range");
+            end
+            2'b11 : begin
+               if (MEM_VERBOSE)
+                  $display("   Setting low power array self refresh mode: Auto self-refresh");
+            end
+            default : begin
+               $display("ERROR: Invalid low power array self refresh mode %0d specified!", code);
+               $finish(1);
+            end
+         endcase
+         lpasr = code;
+         $display("    Low power array self refresh mode behavior is not implemented in this memory model.");
+      end
+   endtask
+
+   task automatic set_geardown_mode (input bit code);
+      if (code ^ geardown_mode) begin
+         $display("    Setting geardown mode: %d", code);
+         if (code)
+            $display("    Geardown mode behavior is not implemented in this memory model.");
+         geardown_mode = code;
+      end
+   endtask
+   task automatic set_fine_granularity_refresh_mode (input bit [2:0] code);
+      if (code ^ fine_granularity_refresh_mode) begin
+         case (code)
+            3'b000 : begin
+               if (MEM_VERBOSE)
+                  $display("   Setting fine granularity refresh mode: Fixed 1x");
+            end
+            3'b001 : begin
+               if (MEM_VERBOSE)
+                  $display("   Setting fine granularity refresh mode: Fixed 2x");
+            end
+            3'b010 : begin
+               if (MEM_VERBOSE)
+                  $display("   Setting fine granularity refresh mode: Fixed 4x");
+            end
+            3'b101 : begin
+               if (MEM_VERBOSE)
+                  $display("   Setting fine granularity refresh mode: On-the-fly 2x");
+            end
+            3'b110 : begin
+               if (MEM_VERBOSE)
+                  $display("   Setting fine granularity refresh mode: On-the-fly 4x");
+            end
+            default : begin
+               $display("ERROR: Invalid fine granularity refresh mode %0d specified!", code);
+               $finish(1);
+            end
+         endcase
+         fine_granularity_refresh_mode = code;
+         $display("    Fine granularity refresh mode behavior is not implemented in this memory model.");
+      end
+   endtask
+
+   task automatic set_max_power_saving (input bit code);
+      if (code ^ max_power_saving_en) begin
+         $display("    Setting maximum power saving mode: %d", code);
+         if (code)
+            $display("    Maximum power saving mode behavior is not implemented in this memory model.");
+         max_power_saving_en = code;
+      end
+   endtask
+   task automatic set_temp_controlled_refresh_range(input bit code);
+      if (code ^ temp_controlled_refresh_range) begin
+         $display("    Setting temperature controlled refresh range: %d", code);
+         temp_controlled_refresh_range = code;
+      end
+   endtask
+   task automatic set_temp_controlled_refresh_enable(input bit code);
+      if (code ^ temp_controlled_refresh_en) begin
+         $display("    Setting temperature controlled refresh enable: %d", code);
+         if (code)
+            $display("    Temperature controlled refresh behavior is not implemented in this memory model.");
+         temp_controlled_refresh_en = code;
+      end
+   endtask
+
+   task automatic cmd_nop;
+      if (MEM_VERBOSE && !DISABLE_NOP_DISPLAY)
+         $display("[%0t] [DWR=%0d%0d%0d]:  NOP Command", $time, MEM_DEPTH_IDX, MEM_WIDTH_IDX, MEM_RANK_IDX);
+   endtask
+
+   task automatic cmd_des;
+      if (MEM_VERBOSE && !DISABLE_NOP_DISPLAY)
+         $display("[%0t] [DWR=%0d%0d%0d]:  DES Command", $time, MEM_DEPTH_IDX, MEM_WIDTH_IDX, MEM_RANK_IDX);
+   endtask
+
+   task automatic cmd_zqc;
+      if (MEM_VERBOSE)
+         $display("[%0t] [DWR=%0d%0d%0d]:  ZQC Command", $time, MEM_DEPTH_IDX, MEM_WIDTH_IDX, MEM_RANK_IDX);
+   endtask
+
+
+   task automatic cmd_unknown;
+      if (MEM_VERBOSE)
+         $display("[%0t] [DWR=%0d%0d%0d]:  WARNING: Unknown Command (OPCODE %b). Command ignored.", $time, MEM_DEPTH_IDX, MEM_WIDTH_IDX, MEM_RANK_IDX, new_command.opcode);
+   endtask
+
+   task automatic cmd_set_activate;
+      int activate_latency = min(get_read_latency(), get_write_latency()) + 1;
+
+      if (MEM_VERBOSE)
+         $display("[%0t] [DWR=%0d%0d%0d]:  ACTIVATE (queue) - %s - ROW [ %0h ]", $time, MEM_DEPTH_IDX, MEM_WIDTH_IDX, MEM_RANK_IDX, bank_str(new_command.bank_group, new_command.bank), new_command.address);
+      activate_command_queue.push_back(DDR_CMD_TYPE_ACTIVATE);
+      activate_bank_queue.push_back(new_command.bank);
+      activate_bank_group_queue.push_back(new_command.bank_group);
+      activate_row_queue.push_back(new_command.address);
+      activate_command_pipeline[ 2 * activate_latency ] = 1;
+      bg[new_command.bank_group].bank[new_command.bank].last_activate_cycle = clock_cycle;
+   endtask
+
+   task automatic cmd_activate(bit [PORT_MEM_BG_WIDTH-1:0] bank_group, bit [PORT_MEM_BA_WIDTH-1:0] bank, bit [PORT_MEM_A_WIDTH-1:0] address);
+      if (MEM_VERBOSE)
+         $display("[%0t] [DWR=%0d%0d%0d]:  ACTIVATE (execute) - %s - ROW [ %0h ]", $time, MEM_DEPTH_IDX, MEM_WIDTH_IDX, MEM_RANK_IDX, bank_str(bank_group, bank), address);
+      bg[bank_group].bank[bank].opened_row = address;
+   endtask
+
+   task automatic cmd_precharge(bit [PORT_MEM_BG_WIDTH-1:0] bank_group, bit [PORT_MEM_BA_WIDTH-1:0] bank, bit all_banks);
+      if (MEM_VERBOSE)
+         if(all_banks)
+            $display("[%0t] [DWR=%0d%0d%0d]:  PRECHARGE - ALL BANKS", $time, MEM_DEPTH_IDX, MEM_WIDTH_IDX, MEM_RANK_IDX);
+         else
+            $display("[%0t] [DWR=%0d%0d%0d]:  PRECHARGE - %s", $time, MEM_DEPTH_IDX, MEM_WIDTH_IDX, MEM_RANK_IDX, bank_str(bank_group, bank));
+      bg[bank_group].bank[bank].last_precharge_cycle = clock_cycle;
+   endtask
+
+   task automatic cmd_mrs;
+      int mrs_idx;
+      if (PROTOCOL_ENUM == "PROTOCOL_DDR4")
+         $display("MRS commands not fully supported for DDR4 at this time");
+
+      if (PROTOCOL_ENUM == "PROTOCOL_DDR4")
+         mrs_idx = {new_command.bank_group[0], new_command.bank[1:0]};
+      else
+         mrs_idx = new_command.bank;
+
+      if (MEM_VERBOSE)
+         $display("[%0t] [DWR=%0d%0d%0d]:  MRS Command - MRS [ %0d ] -> %0h", $time, MEM_DEPTH_IDX, MEM_WIDTH_IDX, MEM_RANK_IDX, mrs_idx, new_command.address);
+
+      case(mrs_idx)
+         3'b000 : begin
+            if (MEM_VERBOSE)
+               $display("   MRS - 0");
+            set_burst_type(new_command.address[1:0]);
+            if (PROTOCOL_ENUM == "PROTOCOL_DDR4") begin
+               set_cas_latency({new_command.address[6:4], new_command.address[2:2] });
+            end else begin
+               set_cas_latency({new_command.address[2:2], new_command.address[6:4]});
+            end
+            reset_dll(new_command.address[8]);
+         end
+
+         3'b001 : begin
+            if (MEM_VERBOSE)
+               $display("   MRS - 1");
+            set_additive_latency(new_command.address[4:3]);
+            set_write_leveling_mode(new_command.address[7]);
+         end
+
+         3'b010 : begin
+            if (MEM_VERBOSE)
+               $display("   MRS - 2");
+            set_cas_write_latency(new_command.address[5:3]);
+            if (PROTOCOL_ENUM == "PROTOCOL_DDR4") begin
+               set_lpasr(new_command.address[7:6]);
+               set_crc(new_command.address[12]);
+         end
+         end
+
+         3'b011 : begin
+            if (MEM_VERBOSE)
+               $display("   MRS - 3");
+            if (PROTOCOL_ENUM == "PROTOCOL_DDR4") begin
+               set_geardown_mode(new_command.address[3]);
+               set_fine_granularity_refresh_mode(new_command.address[8:6]);
+            end
+         end
+
+         3'b100 : begin
+            if (MEM_VERBOSE)
+               $display("   MRS - 4");
+            if (PROTOCOL_ENUM == "PROTOCOL_DDR4") begin
+               set_max_power_saving(new_command.address[1]);
+               set_temp_controlled_refresh_range(new_command.address[2]);
+               set_temp_controlled_refresh_enable(new_command.address[3]);
+            end
+         end
+
+         3'b101 : begin
+            if (MEM_VERBOSE)
+               $display("   MRS - 5");
+               if (PROTOCOL_ENUM == "PROTOCOL_DDR4") begin
+                  set_parity_latency(new_command.address[2:0]);
+                  dm_n_en = new_command.address[10];
+                  wdbi_en = new_command.address[11];
+                  rdbi_en = new_command.address[12];
+               end
+            end
+
+         3'b110 : begin
+            if (MEM_VERBOSE)
+               $display("   MRS - 6: not supported");
+         end
+
+         3'b111 : begin
+            if (PROTOCOL_ENUM == "PROTOCOL_DDR4") begin
+               if (MEM_VERBOSE) begin
+                  $display("   Detected RCD/DB Control Word");
+               end
+            end else begin
+               $display("Error: MRS Invalid Bank Address: %0d", mrs_idx);
+               $stop(1);
+            end
+         end
+      endcase
+   endtask
+
+   task automatic cmd_refresh;
+      if (MEM_VERBOSE)
+         $display("[%0t] [DWR=%0d%0d%0d]:  REFRESH Command", $time, MEM_DEPTH_IDX, MEM_WIDTH_IDX, MEM_RANK_IDX);
+
+      for (int g = 0; g < NUM_BANK_GROUPS; g++) begin
+         for (int b = 0; b < NUM_BANKS_PER_GROUP; b++) begin
+            refresh_bank(g, b);
+         end
+      end
+   endtask
+
+   task automatic cmd_read;
+      int read_latency = get_read_latency();
+      int precharge_latency = get_precharge_latency();
+
+      if (MEM_VERBOSE) begin
+         if(mem_a_wire[10])
+            $display("[%0t] [DWR=%0d%0d%0d]:  READ with AP (BL%0d) - %s - COL [ %0h ]", $time, MEM_DEPTH_IDX, MEM_WIDTH_IDX, MEM_RANK_IDX, new_command.burst_length, bank_str(new_command.bank_group, new_command.bank), new_command.address);
+         else
+            $display("[%0t] [DWR=%0d%0d%0d]:  READ (BL%0d) - %s - COL [ %0h ]", $time, MEM_DEPTH_IDX, MEM_WIDTH_IDX, MEM_RANK_IDX, new_command.burst_length, bank_str(new_command.bank_group, new_command.bank), new_command.address);
+      end
+
+      new_command.word_count = 0;
+      read_command_queue.push_back(new_command.cmd_type);
+      read_word_count_queue.push_back(new_command.word_count);
+      read_burst_length_queue.push_back(new_command.burst_length);
+      read_address_queue.push_back(new_command.address);
+      read_bank_queue.push_back(new_command.bank);
+      read_bank_group_queue.push_back(new_command.bank_group);
+      read_command_pipeline[ 2 * read_latency ] = 1;
+      bg[new_command.bank_group].bank[new_command.bank].last_read_cmd_cycle = clock_cycle;
+      refresh_bank(new_command.bank_group, new_command.bank);
+
+      if(mem_a_wire[10]) begin
+         precharge_command_queue.push_back(DDR_CMD_TYPE_PRECHARGE);
+         precharge_bank_group_queue.push_back(new_command.bank_group);
+         precharge_bank_queue.push_back(new_command.bank);
+         precharge_command_pipeline[ 2 * precharge_latency ] = 1;
+      end
+   endtask
+
+   task automatic cmd_write;
+      int write_latency = get_write_latency();
+
+      if (MEM_VERBOSE) begin
+         if(mem_a_wire[10])
+            $display("[%0t] [DWR=%0d%0d%0d]:  WRITE with AP (BL%0d) - BANK [ %0d ] - COL [ %0h ]", $time, MEM_DEPTH_IDX, MEM_WIDTH_IDX, MEM_RANK_IDX, new_command.burst_length, new_command.bank, new_command.address);
+         else
+            $display("[%0t] [DWR=%0d%0d%0d]:  WRITE (BL%0d) - BANK [ %0d ] - COL [ %0h ]", $time, MEM_DEPTH_IDX, MEM_WIDTH_IDX, MEM_RANK_IDX, new_command.burst_length, new_command.bank, new_command.address);
+      end
+
+      new_command.word_count = 0;
+      write_command_queue.push_back(new_command.cmd_type);
+      write_word_count_queue.push_back(new_command.word_count);
+      write_burst_length_queue.push_back(new_command.burst_length);
+      write_address_queue.push_back(new_command.address);
+      write_bank_queue.push_back(new_command.bank);
+      write_bank_group_queue.push_back(new_command.bank_group);
+      write_command_pipeline[2 * write_latency] = 1'b1;
+      bg[new_command.bank_group].bank[new_command.bank].last_write_cmd_cycle = clock_cycle;
+   endtask
+
+   task automatic refresh_bank(input int bank_group_num, input int bank_num);
+      if (MEM_VERBOSE)
+         $display("[%0t] [DWR=%0d%0d%0d]:  Refreshing %s", $time, MEM_DEPTH_IDX, MEM_WIDTH_IDX, MEM_RANK_IDX, bank_str(bank_group_num, bank_num));
+      bg[bank_group_num].bank[bank_num].last_ref_time = $time;
+      bg[bank_group_num].bank[bank_num].last_ref_cycle = clock_cycle;
+   endtask
+
+   task automatic init_banks;
+      int b,g;
+      for (g = 0; g < NUM_BANK_GROUPS; g++) begin
+         for (b = 0; b < NUM_BANKS_PER_GROUP; b++) begin
+            if (MEM_VERBOSE)
+               $display("[%0t] [DWR=%0d%0d%0d]:  Initializing %s", $time, MEM_DEPTH_IDX, MEM_WIDTH_IDX, MEM_RANK_IDX, bank_str(g,b));
+            bg[g].bank[b].opened_row = '0;
+            bg[g].bank[b].last_ref_time = 0;
+            bg[g].bank[b].last_ref_cycle = 0;
+            bg[g].bank[b].last_activate_cycle = 0;
+            bg[g].bank[b].last_precharge_cycle = 0;
+            bg[g].bank[b].last_read_cmd_cycle = 0;
+            bg[g].bank[b].last_read_access_cycle = 0;
+            bg[g].bank[b].last_write_cmd_cycle = 0;
+            bg[g].bank[b].last_write_access_cycle = 0;
+         end
+      end
+   endtask
+
+   task automatic check_violations;
+
+      /* **** *
+       * tRCD *
+       * **** */
+
+      if(new_command.cmd_type == DDR_CMD_TYPE_READ) begin
+         if(bg[new_command.bank_group].bank[new_command.bank].last_activate_cycle > bg[new_command.bank_group].bank[new_command.bank].last_read_cmd_cycle + get_additive_latency() - tRCD_cycles) begin
+            $display("[%0t] [DWR=%0d%0d%0d]:  ERROR: tRCD violation (READ) on %s @ cycle %0d", $time, MEM_DEPTH_IDX, MEM_WIDTH_IDX, MEM_RANK_IDX, bank_str(new_command.bank_group, new_command.bank), clock_cycle);
+            $display("    tRCD = %0d", tRCD_cycles);
+            $display("    Last ACTIVATE @ %0d", bg[new_command.bank_group].bank[new_command.bank].last_activate_cycle);
+            $display("    Last READ CMD @ %0d", bg[new_command.bank_group].bank[new_command.bank].last_read_cmd_cycle);
+            $finish(1);
+         end
+      end
+      if(new_command.cmd_type == DDR_CMD_TYPE_WRITE) begin
+         if(bg[new_command.bank_group].bank[new_command.bank].last_activate_cycle > bg[new_command.bank_group].bank[new_command.bank].last_write_cmd_cycle + get_additive_latency() - tRCD_cycles) begin
+            $display("[%0t] [DWR=%0d%0d%0d]:  ERROR: tRCD violation (WRITE) on %s @ cycle %0d", $time, MEM_DEPTH_IDX, MEM_WIDTH_IDX, MEM_RANK_IDX, bank_str(new_command.bank_group, new_command.bank), clock_cycle);
+            $display("    tRCD = %0d", tRCD_cycles);
+            $display("    Last ACTIVATE @ %0d", bg[new_command.bank_group].bank[new_command.bank].last_activate_cycle);
+            $display("    Last WRITE CMD @ %0d", bg[new_command.bank_group].bank[new_command.bank].last_write_cmd_cycle);
+            $finish(1);
+         end
+      end
+   endtask
+
+   task write_memory(
+      input command_struct write_command,
+      input [PORT_MEM_DQ_WIDTH - 1:0] write_data,
+      input [PORT_MEM_DQ_WIDTH - 1:0] data_mask,
+      input [PORT_MEM_DQ_WIDTH - 1:0] dbi_n);
+
+      bit [PORT_MEM_BA_WIDTH - 1:0] bank_address;
+      bit [PORT_MEM_BG_WIDTH - 1:0] bank_group;
+      bit [MEM_ROW_ADDR_WIDTH - 1:0] row_address;
+      bit [MEM_COL_ADDR_WIDTH - 1:0] col_address;
+      bit [PORT_MEM_BG_WIDTH + PORT_MEM_BA_WIDTH + MEM_ROW_ADDR_WIDTH + MEM_COL_ADDR_WIDTH - 1 : 0] address;
+      bit [PORT_MEM_DQ_WIDTH - 1:0] masked_data;
+
+      integer i;
+
+      bank_group = write_command.bank_group;
+      bank_address = write_command.bank;
+      row_address = bg[bank_group].bank[bank_address].opened_row;
+      col_address = write_command.address;
+      if (PROTOCOL_ENUM == "PROTOCOL_DDR4") begin
+         address = {bank_group, bank_address, row_address, col_address} + write_command.word_count;
+      end else begin
+         address = {bank_address, row_address, col_address} + write_command.word_count;
+      end
+
+      if (write_command.word_count == 0) begin
+         for (int i = 0; i < CRC_NUM_TREES; i = i + 1) begin
+            write_burst_data[i] = {CRC_TREE_BITS{1'b1}};
+         end
+      end
+
+      for(i = 0; i < PORT_MEM_DQ_WIDTH; i = i + 1) begin
+         if (data_mask[i] !== 0 && data_mask[i] !== 1)
+            masked_data[i] = 'x;
+         else if (wdbi_en) begin
+            masked_data[i] = dbi_n[i] ? write_data[i] : ~write_data[i];
+         end else if (PROTOCOL_ENUM == "PROTOCOL_DDR4" ? ~data_mask[i] : data_mask[i]) 
+         begin
+            if (mem_data.exists(address))
+               masked_data[i] = mem_data[address][i];
+            else
+               masked_data[i] = 'x;
+         end
+         else
+            masked_data[i] = write_data[i];
+
+         write_burst_data[i/CRC_DQ_RATIO][((i%CRC_DQ_RATIO) * CRC_DQ_RATIO) + write_command.word_count] = write_data[i];
+      end
+
+      if(wdbi_en || dm_n_en) begin
+         for(i = 0; i < PORT_MEM_DBI_N_WIDTH; i = i + 1) begin
+            write_burst_data[i][64 + write_command.word_count] = dbi_n[i*MEM_DQS_GROUP_SIZE];
+         end
+      end
+
+      if (MEM_VERBOSE)
+         $display("[%0t] [DWR=%0d%0d%0d]:  Writing data %h (%h/%h) @ %0h (GBRC=%0h/%0h/%0h/%0h ) burst %0d",
+            $time, MEM_DEPTH_IDX, MEM_WIDTH_IDX, MEM_RANK_IDX, masked_data, write_data, PROTOCOL_ENUM == "PROTOCOL_DDR4" ? data_mask : ~data_mask, address, bank_group, bank_address, row_address, col_address, write_command.word_count);
+
+      mem_data[address] = masked_data;
+      bg[bank_group].bank[bank_address].last_write_access_cycle = clock_cycle;
+   endtask
+
+   task check_crc (
+      input command_struct write_command,
+      input [PORT_MEM_DQ_WIDTH - 1:0] dq_write,
+      input [PORT_MEM_DBI_N_WIDTH - 1:0] dbi_write);
+
+      crc_received_prev = crc_received_curr;
+      crc_received_curr = dq_write;
+
+      for (int i = 0; i < CRC_NUM_TREES; i = i + 1) begin
+         if (write_command.word_count == CRC_BURST_LENGTH - 1) begin 
+            if (mem_crc[i] != crc_received[i]) begin
+               $display("Error: CRC tree %d expected %x but received %x", i, mem_crc[i], crc_received[i]);
+               for (i = 2*MEM_CRC_ALERT; i < 2*MEM_CRC_ALERT + 2*(MEM_CRC_ALERT + MEM_CRC_ALERT_PW); i = i + 1) begin
+                  crc_alert_n_pipeline[i] = 1'b0;
+               end
+               $finish(1);
+            end else begin
+            end
+         end
+      end
+      
+   endtask
+
+   generate
+      genvar i; 
+      if(PROTOCOL_ENUM == "PROTOCOL_DDR4") begin
+         for (i = 0; i < CRC_NUM_TREES; i = i + 1) begin
+            altera_emif_ddr4_crc_tree crc_tree(
+               .d(write_burst_data[i]),
+               .newcrc(mem_crc[i])
+            );
+            assign crc_received[i] = crc_received_prev[(i+1)*CRC_DQ_RATIO-1 : i*CRC_DQ_RATIO];
+         end
+      end
+   endgenerate
+
+   task read_memory(
+      input command_struct write_command,
+      output [PORT_MEM_DQ_WIDTH - 1:0] read_data,
+      output [PORT_MEM_DQS_WIDTH - 1:0] dbi_n);
+
+      bit [PORT_MEM_BA_WIDTH - 1:0] bank_address;
+      bit [PORT_MEM_BG_WIDTH - 1:0] bank_group;
+      bit [MEM_ROW_ADDR_WIDTH - 1:0] row_address;
+      bit [MEM_COL_ADDR_WIDTH - 1:0] col_address;
+      bit [PORT_MEM_BG_WIDTH + PORT_MEM_BA_WIDTH + MEM_ROW_ADDR_WIDTH + MEM_COL_ADDR_WIDTH - 1 : 0] address;
+      reg  [1:0] int_error_inject;
+      integer bit_index;
+
+      bank_group = write_command.bank_group;
+      bank_address = write_command.bank;
+      row_address = bg[bank_group].bank[bank_address].opened_row;
+      col_address = write_command.address;
+      if (PROTOCOL_ENUM == "PROTOCOL_DDR4") begin
+         address = {bank_group, bank_address, row_address, col_address} + write_command.word_count;
+      end else begin
+         address = {bank_address, row_address, col_address} + write_command.word_count;
+      end
+
+      if (mem_data.exists(address)) begin
+         integer i, j;
+         if (rdbi_en) begin
+            for (i = 0; i < PORT_MEM_DQS_WIDTH; i = i + 1) begin
+               integer sum;
+               sum = 0;
+               for (j = 0; j < (MEM_DQS_GROUP_SIZE); j = j + 1) begin
+                  sum = sum + mem_data[address][i*(MEM_DQS_GROUP_SIZE) + j];
+               end
+               dbi_n[i] = sum >= 4;
+            end
+            read_data = mem_data[address];
+         end else begin
+            dbi_n = 'z;
+            read_data = mem_data[address];
+         end
+         for (i = 0; i < PORT_MEM_DQ_WIDTH; i = i + 1) begin: dbi_n_in_mapping
+             full_dbi_n [i] = dbi_n[i / MEM_DQS_GROUP_SIZE];
+         end
+
+         if (MEM_CFG_GEN_SBE == 1) begin 		 
+            int_error_inject = 2'b01;
+         end
+         else if (MEM_CFG_GEN_DBE == 1) begin 		 
+            int_error_inject = 2'b11;
+         end
+         else begin
+            int_error_inject = 2'b00;
+         end   		 
+         bit_index = {$random} % PORT_MEM_DQ_WIDTH;		 
+         read_data[bit_index] = read_data[bit_index] ^ int_error_inject[0];
+         if (bit_index < PORT_MEM_DQ_WIDTH-1) begin
+            read_data[bit_index+1] = read_data[bit_index+1] ^ int_error_inject[1];
+         end
+
+         if (MEM_VERBOSE)
+            $display("[%0t] [DWR=%0d%0d%0d]:  Reading data %h @ %0h (GBRC=%0h/%0h/%0h/%0h ) burst %0d",
+               $time, MEM_DEPTH_IDX, MEM_WIDTH_IDX, MEM_RANK_IDX, read_data, address, bank_group, bank_address, row_address, col_address, write_command.word_count);
+      end
+      else begin
+         if (MEM_VERBOSE)
+            $display("[%0t] [DWR=%0d%0d%0d]:  WARNING: Attempting to read from uninitialized location @ %0h (GBRC=%0h/%0h/%0h/%0h) burst %0d",
+                $time, MEM_DEPTH_IDX, MEM_WIDTH_IDX, MEM_RANK_IDX, address, bank_group, bank_address, row_address, col_address, write_command.word_count);
+         read_data = '0;
+      end
+
+      bg[bank_group].bank[bank_address].last_read_access_cycle = clock_cycle;
+   endtask
+
+   if(MEM_MIRROR_ADDRESSING) begin
+      if (PROTOCOL_ENUM == "PROTOCOL_DDR4") begin
+         if (PORT_MEM_A_WIDTH > 14) begin
+            assign mem_a_wire = {mem_a[PORT_MEM_A_WIDTH - 1:14], mem_a[11], mem_a[12], mem_a[13], mem_a[10:9], mem_a[7], mem_a[8], mem_a[5], mem_a[6], mem_a[3], mem_a[4], mem_a[2:0]};
+         end else begin
+            assign mem_a_wire = {mem_a[11], mem_a[12], mem_a[13], mem_a[10:9], mem_a[7], mem_a[8], mem_a[5], mem_a[6], mem_a[3], mem_a[4], mem_a[2:0]};
+         end
+         
+         if(PORT_MEM_BA_WIDTH > 2) begin
+            assign mem_ba_wire = {mem_ba[PORT_MEM_BA_WIDTH - 1:2], mem_ba[0], mem_ba[1]};
+         end else begin
+            assign mem_ba_wire = {mem_ba[0], mem_ba[1]};
+         end
+         
+         if(PORT_MEM_BG_WIDTH > 2) begin
+            assign mem_bg_wire = {mem_bg[PORT_MEM_BG_WIDTH - 1:2], mem_bg[0], mem_bg[1]};
+         end else begin
+            assign mem_bg_wire = {mem_bg[0], mem_bg[1]};
+         end
+      
+      end else begin
+         assign mem_a_wire = {mem_a[PORT_MEM_A_WIDTH - 1:9], mem_a[7], mem_a[8], mem_a[5], mem_a[6], mem_a[3], mem_a[4], mem_a[2:0]};
+
+         if(PORT_MEM_BA_WIDTH > 2) begin
+            assign mem_ba_wire = {mem_ba[PORT_MEM_BA_WIDTH - 1:2], mem_ba[0], mem_ba[1]};
+         end else begin
+            assign mem_ba_wire = {mem_ba[0], mem_ba[1]};
+         end
+         
+         assign mem_bg_wire = mem_bg;
+      end
+   end
+   else begin
+      assign mem_a_wire = mem_a;
+      assign mem_ba_wire = mem_ba;
+      assign mem_bg_wire = mem_bg;
+   end
+
+   logic mem_ck_diff;
+   always @(posedge mem_ck) begin
+      if (mem_cke == 1'b1) begin
+         #8 mem_ck_diff <= mem_ck;
+      end
+   end
+
+   always @(posedge mem_ck_n) begin
+      if (mem_cke == 1'b1) begin
+         #8 mem_ck_diff <= ~mem_ck_n;
+      end
+   end
+   
+   initial begin
+      int i;
+
+      $display("Altera Generic DDRx Memory Model");
+      if (MEM_VERBOSE) begin
+         $display("[%0t] [DWR=%0d%0d%0d]:  Max refresh interval of %0d ps", $time, MEM_DEPTH_IDX, MEM_WIDTH_IDX, MEM_RANK_IDX, REFRESH_INTERVAL_PS);
+      end
+
+      if (PORT_MEM_C_WIDTH > 0) begin
+         $display("WARNING: Chip ID not supported in memory model");
+      end
+
+      clock_cycle = 0;
+      clock_stable = 1'b0;
+      initialize_db;
+      set_burst_type(2'b0);
+      init_banks();
+
+      mem_data.delete();
+
+      if (MEM_VERBOSE) begin
+         $display("   MRS - 0");
+      end
+
+      set_burst_type(MEM_INIT_MRS0[1:0]);
+      if (PROTOCOL_ENUM == "PROTOCOL_DDR4") begin
+         set_cas_latency({MEM_INIT_MRS0[6:4], MEM_INIT_MRS0[2]});
+      end else begin
+         set_cas_latency({MEM_INIT_MRS0[2], MEM_INIT_MRS0[6:4]});
+      end
+
+      if (MEM_VERBOSE) begin
+         $display("   MRS - 1");
+      end
+
+      set_additive_latency(MEM_INIT_MRS1[4:3]);
+
+      if (MEM_VERBOSE) begin
+         $display("   MRS - 2");
+      end
+
+      set_cas_write_latency(MEM_INIT_MRS2[5:3]);
+      set_crc(MEM_INIT_MRS2[12]);
+
+      if (MEM_VERBOSE) begin
+         $display("   MRS - 3: not supported");
+      end
+
+      parity_latency = 0;
+      wdbi_en = 0;
+      rdbi_en = 0;
+      max_power_saving_en = 0;
+      temp_controlled_refresh_range = 0;
+      temp_controlled_refresh_en = 0;
+
+      if (MEM_GUARANTEED_WRITE_INIT != 0) begin
+         init_guaranteed_write(MEM_GUARANTEED_WRITE_INIT);
+      end
+
+      active_command.cmd_type <= DDR_CMD_TYPE_NOP;
+
+      for (i = 0; i < 2 * MAX_LATENCY; i++) begin
+         read_command_pipeline[i] = 0;
+         write_command_pipeline[i] = 0;
+         parity_latency_pipeline[i] = 0;
+      end
+
+      for (i = 0; i <= ALERT_N_PIPELINE_SIZE; i++) begin
+         parity_alert_n_pipeline[i] = 1'b1;
+         crc_alert_n_pipeline[i] = 1'b1;
+      end
+
+      last_refresh_time = 0;
+      refresh_burst_active = 0;
+      refresh_executed_count = 0;
+      refresh_required_time = 0;
+      refresh_debt = 0;
+      mem_ck_sampled_by_dqs = '0;
+   end
+
+   always @ (posedge mem_ck) begin
+      clock_cycle <= clock_cycle + 1;
+      if (clock_cycle == 4) clock_stable <= 1'b1;
+   end
+
+   wire [MEM_COL_ADDR_WIDTH-1:0] col_addr;
+   generate
+      if(MEM_COL_ADDR_WIDTH <= 10) begin : col_addr_gen1
+         assign col_addr = mem_a_wire[9:0];
+      end
+      else if(MEM_COL_ADDR_WIDTH == 11) begin : col_addr_gen2
+         assign col_addr = {mem_a_wire[11],mem_a_wire[9:0]};
+      end
+      else begin : col_addr_gen3
+         assign col_addr = {mem_a_wire[MEM_COL_ADDR_WIDTH+1:13],mem_a_wire[11],mem_a_wire[9:0]};
+      end
+   endgenerate
+
+   always @ (posedge mem_ck_diff or negedge mem_ck_diff) begin
+      int i;
+
+      mem_ck_time = $time;
+      read_command_pipeline = read_command_pipeline >> 1;
+      write_command_pipeline = write_command_pipeline >> 1;
+      activate_command_pipeline = activate_command_pipeline >> 1;
+      parity_latency_pipeline = parity_latency_pipeline >> 1;
+      crc_alert_n_pipeline = crc_alert_n_pipeline >> 1;
+      parity_alert_n_pipeline = parity_alert_n_pipeline >> 1;
+
+      crc_alert_n_pipeline[ALERT_N_PIPELINE_SIZE] = 1'b1;
+      parity_alert_n_pipeline[ALERT_N_PIPELINE_SIZE] = 1'b1;
+
+      if(mem_ck_diff && clock_stable) begin
+         new_command.bank = mem_ba_wire;
+         new_command.bank_group = mem_bg_wire;
+         new_command.word_count = 0;
+         if (PROTOCOL_ENUM == "PROTOCOL_DDR4") begin
+            new_command.opcode = {mem_cs_n, mem_act_n, mem_ras_n, mem_cas_n, mem_we_n};
+         end else begin
+            new_command.opcode = {mem_cs_n, 1'b1, mem_ras_n, mem_cas_n, mem_we_n};
+         end
+
+         case (burst_type)
+            DDR_BURST_TYPE_BL8 : new_command.burst_length = 8;
+            DDR_BURST_TYPE_BL4 : new_command.burst_length = 4;
+            DDR_BURST_TYPE_OTF : new_command.burst_length = (mem_a_wire[12]) ? 8 : 4;
+         endcase
+
+         casex (new_command.opcode)
+            OPCODE_PRECHARGE : new_command.cmd_type = DDR_CMD_TYPE_PRECHARGE;
+            OPCODE_ACTIVATE : new_command.cmd_type = DDR_CMD_TYPE_ACTIVATE;
+            OPCODE_DDR4_ACTIVATE : new_command.cmd_type = DDR_CMD_TYPE_ACTIVATE;
+            OPCODE_WRITE : new_command.cmd_type = DDR_CMD_TYPE_WRITE;
+            OPCODE_READ : new_command.cmd_type = DDR_CMD_TYPE_READ;
+            OPCODE_MRS : new_command.cmd_type = DDR_CMD_TYPE_MRS;
+            OPCODE_REFRESH : new_command.cmd_type = DDR_CMD_TYPE_REFRESH;
+            OPCODE_NOP : new_command.cmd_type = DDR_CMD_TYPE_NOP;
+            OPCODE_DES : new_command.cmd_type = DDR_CMD_TYPE_DES;
+            OPCODE_ZQC : new_command.cmd_type = DDR_CMD_TYPE_ZQC;
+            default : new_command.cmd_type = DDR_CMD_TYPE_ERROR;
+         endcase
+
+         new_command.address = mem_a_wire;
+         if(new_command.cmd_type == DDR_CMD_TYPE_READ || new_command.cmd_type == DDR_CMD_TYPE_WRITE) begin
+            new_command.address = {'0,col_addr};
+         end
+
+         if (REFRESH_BURST_VALIDATION) begin
+            if (new_command.cmd_type == DDR_CMD_TYPE_REFRESH) begin
+               if (!refresh_burst_active) begin
+                  refresh_burst_active = 1;
+                  refresh_executed_count = 1;
+                  refresh_required_time = mem_ck_time - last_refresh_time;
+                  $display("[%0t] [DWR=%0d%0d%0d]:  Time since last refresh %0t ps", $time, MEM_DEPTH_IDX, MEM_WIDTH_IDX, MEM_RANK_IDX, refresh_required_time);
+                  last_refresh_time = mem_ck_time;
+               end else begin
+                  refresh_executed_count = refresh_executed_count + 1;
+               end
+            end else if (new_command.cmd_type == DDR_CMD_TYPE_NOP || new_command.cmd_type == DDR_CMD_TYPE_DES) begin
+            end else begin
+               if (refresh_burst_active) begin
+                  refresh_burst_active = 0;
+                  if (refresh_executed_count >= FULL_BURST_REFRESH_COUNT)
+                     refresh_debt = -(STD_REFRESH_INTERVAL_PS * 9);
+                  else
+                     refresh_debt = refresh_debt + (refresh_required_time - (STD_REFRESH_INTERVAL_PS * refresh_executed_count));
+
+                  if (refresh_debt > STD_REFRESH_INTERVAL_PS * 9) begin
+                     $display("[%0t] [DWR=%0d%0d%0d]:  Internal Error: REFRESH interval has exceeded allowable buffer! %0d refreshes executed. Debt: %0t ps",
+                      $time, MEM_DEPTH_IDX, MEM_WIDTH_IDX, MEM_RANK_IDX, refresh_executed_count, refresh_debt);
+                     $finish(1);
+                  end else begin
+                     $display("[%0t] [DWR=%0d%0d%0d]:  REFRESH burst complete! %0d refreshes executed. Buffer: %0d ps",
+                     $time, MEM_DEPTH_IDX, MEM_WIDTH_IDX, MEM_RANK_IDX, refresh_executed_count, refresh_debt);
+                  end
+               end
+            end
+         end
+
+         if (parity_latency > 0) begin
+
+            reg my_parity;
+            my_parity = ^{mem_a, mem_ba, mem_bg, mem_act_n};
+            if (mem_cs_n == 1'b0) begin
+               if (my_parity != mem_par) begin
+                  for (i = 0; i < 2*parity_latency + 2*(parity_latency + MEM_PAR_ALERT_PW); i = i + 1) begin
+                     if (i >= 2*parity_latency) begin
+                        parity_alert_n_pipeline[i] = 1'b0;
+                     end
+                  end
+               end else begin
+                  parity_latency_queue.push_back(new_command);
+                  parity_latency_pipeline[2*parity_latency] = 1'b1;
+               end
+            end
+               
+            if (parity_latency_pipeline[0]) begin
+               if (parity_latency_queue.size() == 0) begin
+                 $display("[%0t] [DWR=%0d%0d%0d]:  Internal Error: Parity latency command queue empty but commands expected!", $time, MEM_DEPTH_IDX, MEM_WIDTH_IDX, MEM_RANK_IDX);
+                 $stop(1);
+              end else begin
+                 new_command = parity_latency_queue.pop_front();
+              end
+            end else begin
+              new_command.cmd_type = DDR_CMD_TYPE_DES;
+            end
+            
+            if (parity_alert_n_pipeline[0] == 1'b0) begin
+               new_command.cmd_type = DDR_CMD_TYPE_ERROR; 
+            end
+         end
+
+         case (new_command.cmd_type)
+            DDR_CMD_TYPE_NOP : cmd_nop();
+            DDR_CMD_TYPE_DES : cmd_des();
+            DDR_CMD_TYPE_ZQC : cmd_zqc();
+            DDR_CMD_TYPE_ERROR : cmd_unknown();
+            DDR_CMD_TYPE_ACTIVATE : cmd_set_activate();
+            DDR_CMD_TYPE_PRECHARGE : cmd_precharge(new_command.bank_group, new_command.bank, mem_a_wire[10]);
+            DDR_CMD_TYPE_WRITE : cmd_write();
+            DDR_CMD_TYPE_READ : cmd_read();
+            DDR_CMD_TYPE_MRS : cmd_mrs();
+            DDR_CMD_TYPE_REFRESH : cmd_refresh();
+         endcase
+
+         if(CHECK_VIOLATIONS)
+            check_violations();
+
+      end
+
+
+      if (read_command_pipeline[0]) begin
+         if (read_command_queue.size() == 0) begin
+           $display("[%0t] [DWR=%0d%0d%0d]:  Internal Error: READ command queue empty but READ commands expected!", $time, MEM_DEPTH_IDX, MEM_WIDTH_IDX, MEM_RANK_IDX);
+           $stop(1);
+         end
+      end
+
+      if (write_command_pipeline[0]) begin
+         if (write_command_queue.size() == 0) begin
+            $display("[%0t] [DWR=%0d%0d%0d]:  Internal Error: WRITE command queue empty but WRITE commands expected!", $time, MEM_DEPTH_IDX, MEM_WIDTH_IDX, MEM_RANK_IDX);
+            $stop(1);
+         end
+      end
+
+      if (active_command.cmd_type != DDR_CMD_TYPE_NOP) begin
+         if (active_command.cmd_type == DDR_CMD_TYPE_WRITE && crc_en) begin
+            if (active_command.word_count == CRC_BURST_LENGTH) begin
+               active_command.cmd_type = DDR_CMD_TYPE_NOP;
+            end
+         end else if (active_command.word_count == active_command.burst_length) begin
+            active_command.cmd_type = DDR_CMD_TYPE_NOP;
+         end
+      end
+
+
+      if (active_command.cmd_type == DDR_CMD_TYPE_NOP) begin
+
+         if (read_command_pipeline[0]) begin
+            active_command.cmd_type = read_command_queue.pop_front();
+            active_command.word_count = read_word_count_queue.pop_front();
+            active_command.burst_length = read_burst_length_queue.pop_front();
+            active_command.address = read_address_queue.pop_front();
+            active_command.bank = read_bank_queue.pop_front();
+            active_command.bank_group = read_bank_group_queue.pop_front();
+
+            if (active_command.cmd_type != DDR_CMD_TYPE_READ) begin
+               $display("[%0t] [DWR=%0d%0d%0d]:  Internal Error: Expected READ command not in queue!", $time, MEM_DEPTH_IDX, MEM_WIDTH_IDX, MEM_RANK_IDX);
+               $stop(1);
+            end
+
+         end
+         else if (write_command_pipeline[0]) begin
+            active_command.cmd_type = write_command_queue.pop_front();
+            active_command.word_count = write_word_count_queue.pop_front();
+            active_command.burst_length = write_burst_length_queue.pop_front();
+            active_command.address = write_address_queue.pop_front();
+            active_command.bank = write_bank_queue.pop_front();
+            active_command.bank_group = write_bank_group_queue.pop_front();
+
+            if (active_command.cmd_type != DDR_CMD_TYPE_WRITE) begin
+               $display("[%0t] [DWR=%0d%0d%0d]:  Internal Error: Expected WRITE command not in queue!", $time, MEM_DEPTH_IDX, MEM_WIDTH_IDX, MEM_RANK_IDX);
+               $stop(1);
+            end
+         end
+         else begin
+            if (read_command_pipeline[0] || write_command_pipeline[0]) begin
+               $display("[%0t] [DWR=%0d%0d%0d]:  Internal Error: Active command but read/write pipeline also active!", $time, MEM_DEPTH_IDX, MEM_WIDTH_IDX, MEM_RANK_IDX);
+               $stop(1);
+            end
+         end
+      end
+
+      if (precharge_command_pipeline[0]) begin
+         precharge_command.cmd_type = precharge_command_queue.pop_front();
+         precharge_command.bank = precharge_bank_queue.pop_front();
+         precharge_command.bank_group = precharge_bank_group_queue.pop_front();
+         cmd_precharge(precharge_command.bank_group, precharge_command.bank, 1'b0);
+      end
+
+      if (activate_command_pipeline[0]) begin
+         activate_command.cmd_type = activate_command_queue.pop_front();
+         activate_command.bank = activate_bank_queue.pop_front();
+         activate_command.bank_group = activate_bank_group_queue.pop_front();
+         activate_command.address = activate_row_queue.pop_front();
+         cmd_activate(activate_command.bank_group, activate_command.bank, activate_command.address);
+      end
+
+      mem_dq_en = 1'b0;
+      mem_dqs_en = 1'b0;
+      mem_dqs_preamble = 1'b0;
+      if (active_command.cmd_type == DDR_CMD_TYPE_WRITE) begin
+         integer mem_ck_dqs_diff;
+         integer dqs;
+         logic [PORT_MEM_DQ_WIDTH - 1:0]   mem_dq_write;
+         #(MEM_DQS_TO_CLK_CAPTURE_DELAY);
+         mem_dq_write = '0;
+         for (dqs = 0; dqs < PORT_MEM_DQS_WIDTH; dqs = dqs + 1) begin
+
+            if (mem_ck_time > mem_dqs_time[dqs]) begin
+               mem_ck_dqs_diff = -(mem_ck_time - mem_dqs_time[dqs]);
+            end
+            else begin
+               mem_ck_dqs_diff = mem_dqs_time[dqs] - mem_ck_time;
+            end
+
+            if (mem_ck_dqs_diff >= -(MEM_CLK_TO_DQS_CAPTURE_DELAY)) begin
+               mem_dq_write = mem_dq_write | (mem_dq_captured & ({MEM_DQS_GROUP_SIZE{1'b1}} << (dqs*MEM_DQS_GROUP_SIZE)));
+            end
+            else begin
+               $display("[%0t] %s Write: mem_ck=%0t mem_dqs=%0t delta=%0d min=%0d",
+               $time, mem_ck_dqs_diff >= -(MEM_CLK_TO_DQS_CAPTURE_DELAY) ? "GOOD" : "BAD",
+               mem_ck_time, mem_dqs_time[dqs], mem_ck_dqs_diff, -(MEM_CLK_TO_DQS_CAPTURE_DELAY));
+               mem_dq_write = mem_dq_write | ({MEM_DQS_GROUP_SIZE{1'bx}} << (dqs*MEM_DQS_GROUP_SIZE));
+            end
+
+         end
+
+         if (active_command.word_count == CRC_BURST_LENGTH - 1 ||
+             active_command.word_count == CRC_BURST_LENGTH - 2) begin
+            check_crc(active_command, mem_dq_write, mem_dbi_n);
+         end else begin
+            write_memory(active_command, mem_dq_write, full_mask, full_dbi_n_in);
+         end
+         active_command.word_count = active_command.word_count+1;
+
+      end
+      else if (active_command.cmd_type == DDR_CMD_TYPE_READ) begin
+         if (rdbi_en) begin
+            read_memory(active_command, mem_dq_from_mem, dbi_n);
+            mem_dq_int = mem_dq_from_mem ^ ~full_dbi_n;
+         end else
+            read_memory(active_command, mem_dq_int, dbi_n);
+         mem_dq_en = 1'b1;
+         mem_dqs_en = 1'b1;
+         active_command.word_count = active_command.word_count+1;
+      end
+
+      if (!mem_dqs_en & (read_command_pipeline[2] | read_command_pipeline[1])) begin
+         mem_dqs_en = 1'b1;
+         mem_dqs_preamble = 1'b1;
+      end
+
+   end
+
+   generate
+     genvar dm_count;
+     for (dm_count = 0; dm_count < PORT_MEM_DQS_WIDTH; dm_count = dm_count + 1) begin: dm_mapping
+         assign full_mask [(dm_count + 1) * MEM_DQS_GROUP_SIZE - 1 : dm_count * MEM_DQS_GROUP_SIZE] = {MEM_DQS_GROUP_SIZE{mem_dm_captured[dm_count]}};
+     end
+     genvar dbi_n_count_in;
+     for (dbi_n_count_in = 0; dbi_n_count_in < PORT_MEM_DQS_WIDTH; dbi_n_count_in = dbi_n_count_in + 1) begin: dbi_n_mapping
+         assign full_dbi_n_in [(dbi_n_count_in + 1) * MEM_DQS_GROUP_SIZE - 1 : dbi_n_count_in * MEM_DQS_GROUP_SIZE] = {MEM_DQS_GROUP_SIZE{mem_dbi_n[dbi_n_count_in]}};
+     end
+   endgenerate
+
+   assign #1 mem_dqs_shifted = mem_dqs;
+   assign #1 mem_dqs_n_shifted = mem_dqs_n;
+   assign #2 mem_dqs_n_shifted_2 = mem_dqs_n;
+
+   generate
+
+    genvar dqs;
+    for (dqs = 0; dqs < PORT_MEM_DQS_WIDTH; dqs = dqs + 1) begin
+      always @(posedge mem_dqs_shifted[dqs] or posedge mem_dqs_n_shifted[dqs]) begin
+         if (mem_dqs_shifted[dqs] === 1'b1 || mem_dqs_n_shifted[dqs] === 1'b1) begin
+            mem_dqs_time[dqs] <= $time;
+            mem_dq_captured[((dqs+1)*MEM_DQS_GROUP_SIZE)-1:dqs*MEM_DQS_GROUP_SIZE] <= mem_dq[((dqs+1)*MEM_DQS_GROUP_SIZE)-1:dqs*MEM_DQS_GROUP_SIZE];
+            mem_dm_captured[dqs] <= (PROTOCOL_ENUM == "PROTOCOL_DDR4") ? ((wdbi_en || dm_n_en) ? mem_dbi_n[dqs] : 1'b1) : ((PORT_MEM_DM_WIDTH == PORT_MEM_DQS_WIDTH) ? mem_dm[dqs] : 1'b0);
+            if (mem_dqs_n_shifted_2[dqs] === 'z || mem_dqs_n_shifted_2_prev[dqs] === 'z) begin
+              mem_dq_captured[((dqs+1)*MEM_DQS_GROUP_SIZE)-1:dqs*MEM_DQS_GROUP_SIZE] <= 'z;
+              mem_dm_captured[dqs] <= 'z;
+            end
+            mem_dqs_n_shifted_2_prev[dqs] <= mem_dqs_n_shifted_2[dqs];
+         end else begin
+            mem_dq_captured[((dqs+1)*MEM_DQS_GROUP_SIZE)-1:dqs*MEM_DQS_GROUP_SIZE] <= 'x;
+            mem_dm_captured[dqs] <= 'x;
+         end
+      end
+      always @(posedge mem_dqs_shifted[dqs]) begin
+          mem_ck_sampled_by_dqs[((dqs+1)*MEM_DQS_GROUP_SIZE)-1:dqs*MEM_DQS_GROUP_SIZE] <= {MEM_DQS_GROUP_SIZE{mem_ck_diff}};
+      end
+    end
+
+   endgenerate
+
+   assign mem_dq    = wlevel_en ? mem_ck_sampled_by_dqs : (mem_dq_en ? mem_dq_int : 'z);
+   assign mem_dbi_n = rdbi_en ? (mem_dq_en ? dbi_n : 'z) : 'z;
+   assign mem_dqs   = (mem_dqs_en) ?  (mem_dqs_preamble) ? '0 : {PORT_MEM_DQS_WIDTH{mem_ck_diff}} : 'z;
+
+   assign mem_dqs_n = (mem_dqs_en) ?  (mem_dqs_preamble) ? '1 : {PORT_MEM_DQS_WIDTH{~mem_ck_diff}} : 'z;
+   
+   assign mem_alert_n = (parity_alert_n_pipeline[0] & crc_alert_n_pipeline[0]);
+
+// synthesis translate_on
+
+endmodule
diff --git a/libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_core/mentor/altera_emif_ddr4_crc_tree.sv b/libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_core/mentor/altera_emif_ddr4_crc_tree.sv
new file mode 100644
index 0000000000..dd964b09b3
--- /dev/null
+++ b/libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_core/mentor/altera_emif_ddr4_crc_tree.sv
@@ -0,0 +1,125 @@
+// Copyright (C) 1991-2014 Altera Corporation. All rights reserved.
+// This simulation model contains highly confidential and
+// proprietary information of Altera and is being provided
+// in accordance with and subject to the protections of the
+// applicable Altera Program License Subscription Agreement
+// which governs its use and disclosure. Your use of Altera
+// Corporation's design tools, logic functions and other
+// software and tools, and its AMPP partner logic functions,
+// and any output files any of the foregoing (including device
+// programming or simulation files), and any associated
+// documentation or information are expressly subject to the
+// terms and conditions of the Altera Program License Subscription
+// Agreement, the Altera Quartus II License Agreement, the Altera
+// MegaCore Function License Agreement, or other applicable 
+// license agreement, including, without limitation, that your
+// use is for the sole purpose of simulating designs for use 
+// exclusively in logic devices manufactured by Altera and sold
+// by Altera or its authorized distributors. Please refer to the
+// applicable agreement for further details. Altera products and
+// services are protected under numerous U.S. and foreign patents,
+// maskwork rights, copyrights and other intellectual property laws.
+// Altera assumes no responsibility or liability arising out of the
+// application or use of this simulation model.
+// ACDS 14.1
+// ALTERA_TIMESTAMP:Thu Dec  4 07:39:38 PST 2014
+// encrypted_file_type : mentor_tagged
+`pragma protect begin_protected
+`pragma protect version = 1
+`pragma protect encrypt_agent = "Model Technology", encrypt_agent_info = "DEV-6.6"
+`pragma protect author = "Altera"
+`pragma protect data_method = "aes128-cbc"
+`pragma protect key_keyowner = "MTI" , key_keyname = "MGC-DVT-MTI" , key_method = "rsa"
+`pragma protect key_block encoding = (enctype = "base64", line_length = 64, bytes = 128)
+O8E9LZyZkEc8SP1rl9oeRQSt9WQCCjiKTHWvJJU2NzFe1PBc5ZW01B1brJCB0Ilj
+MQjCV3w0fgmOttBVdiulv7uMOVSF6RMnQT6EHuNw0xKoPS9RZcJgEiMuk4doBHZM
+Pcwqrj/GO9LV2x/bBywb3hWIXcbcsJ7o/7XK2lMFV6c=
+`pragma protect data_block encoding = (enctype = "base64", line_length = 64, bytes = 4160)
+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
+`pragma protect end_protected
diff --git a/libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_core/mentor/altera_emif_ddr4_model_rcd_chip.sv b/libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_core/mentor/altera_emif_ddr4_model_rcd_chip.sv
new file mode 100644
index 0000000000..7069f204a4
--- /dev/null
+++ b/libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_core/mentor/altera_emif_ddr4_model_rcd_chip.sv
@@ -0,0 +1,137 @@
+// Copyright (C) 1991-2014 Altera Corporation. All rights reserved.
+// This simulation model contains highly confidential and
+// proprietary information of Altera and is being provided
+// in accordance with and subject to the protections of the
+// applicable Altera Program License Subscription Agreement
+// which governs its use and disclosure. Your use of Altera
+// Corporation's design tools, logic functions and other
+// software and tools, and its AMPP partner logic functions,
+// and any output files any of the foregoing (including device
+// programming or simulation files), and any associated
+// documentation or information are expressly subject to the
+// terms and conditions of the Altera Program License Subscription
+// Agreement, the Altera Quartus II License Agreement, the Altera
+// MegaCore Function License Agreement, or other applicable 
+// license agreement, including, without limitation, that your
+// use is for the sole purpose of simulating designs for use 
+// exclusively in logic devices manufactured by Altera and sold
+// by Altera or its authorized distributors. Please refer to the
+// applicable agreement for further details. Altera products and
+// services are protected under numerous U.S. and foreign patents,
+// maskwork rights, copyrights and other intellectual property laws.
+// Altera assumes no responsibility or liability arising out of the
+// application or use of this simulation model.
+// ACDS 14.1
+// ALTERA_TIMESTAMP:Thu Dec  4 07:39:38 PST 2014
+// encrypted_file_type : mentor_tagged
+`pragma protect begin_protected
+`pragma protect version = 1
+`pragma protect encrypt_agent = "Model Technology", encrypt_agent_info = "DEV-6.6"
+`pragma protect author = "Altera"
+`pragma protect data_method = "aes128-cbc"
+`pragma protect key_keyowner = "MTI" , key_keyname = "MGC-DVT-MTI" , key_method = "rsa"
+`pragma protect key_block encoding = (enctype = "base64", line_length = 64, bytes = 128)
+dklMCsgXf2xX+ZTkxffPzOgEyp2VwtvWmq7W9FQJjpwC7S+b5pCwpc6sJi+ioElp
+5yG+ZGGw8qhyJEKk9bQEJcye514v3MldGyq7i1aQC5K1tNvFOcvzCqeih+0WaSRn
+PoM5Y6rNGlhcAVgiqGUtdOQ2UC2Ax2BorDBn6T4MnzE=
+`pragma protect data_block encoding = (enctype = "base64", line_length = 64, bytes = 4752)
+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
+`pragma protect end_protected
diff --git a/libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_core/mentor/altera_emif_ddrx_model.sv b/libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_core/mentor/altera_emif_ddrx_model.sv
new file mode 100644
index 0000000000..3a46869ce1
--- /dev/null
+++ b/libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_core/mentor/altera_emif_ddrx_model.sv
@@ -0,0 +1,384 @@
+// Copyright (C) 1991-2014 Altera Corporation. All rights reserved.
+// This simulation model contains highly confidential and
+// proprietary information of Altera and is being provided
+// in accordance with and subject to the protections of the
+// applicable Altera Program License Subscription Agreement
+// which governs its use and disclosure. Your use of Altera
+// Corporation's design tools, logic functions and other
+// software and tools, and its AMPP partner logic functions,
+// and any output files any of the foregoing (including device
+// programming or simulation files), and any associated
+// documentation or information are expressly subject to the
+// terms and conditions of the Altera Program License Subscription
+// Agreement, the Altera Quartus II License Agreement, the Altera
+// MegaCore Function License Agreement, or other applicable 
+// license agreement, including, without limitation, that your
+// use is for the sole purpose of simulating designs for use 
+// exclusively in logic devices manufactured by Altera and sold
+// by Altera or its authorized distributors. Please refer to the
+// applicable agreement for further details. Altera products and
+// services are protected under numerous U.S. and foreign patents,
+// maskwork rights, copyrights and other intellectual property laws.
+// Altera assumes no responsibility or liability arising out of the
+// application or use of this simulation model.
+// ACDS 14.1
+// ALTERA_TIMESTAMP:Thu Dec  4 07:39:38 PST 2014
+// encrypted_file_type : mentor_tagged
+`pragma protect begin_protected
+`pragma protect version = 1
+`pragma protect encrypt_agent = "Model Technology", encrypt_agent_info = "DEV-6.6"
+`pragma protect author = "Altera"
+`pragma protect data_method = "aes128-cbc"
+`pragma protect key_keyowner = "MTI" , key_keyname = "MGC-DVT-MTI" , key_method = "rsa"
+`pragma protect key_block encoding = (enctype = "base64", line_length = 64, bytes = 128)
+TBf2vIRDNR14rq3gCIcYguxD9UGpf6Cm7GEB84JewV1I2isaTiPKOh2xOVqSFCR6
+rLLgDLEXa2eoUDcp/IEMD47Miw17nlFXfbwMBec4aXKN+3N2jHKAn2c7jjuC2v+8
+Ou/F+W/n3VaHSDgWnqgWi10+XC0L/GbfdeSq9jmQ9MU=
+`pragma protect data_block encoding = (enctype = "base64", line_length = 64, bytes = 16592)
+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
+`pragma protect end_protected
diff --git a/libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_core/mentor/altera_emif_ddrx_model_bidir_delay.sv b/libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_core/mentor/altera_emif_ddrx_model_bidir_delay.sv
new file mode 100644
index 0000000000..17fae364fc
--- /dev/null
+++ b/libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_core/mentor/altera_emif_ddrx_model_bidir_delay.sv
@@ -0,0 +1,76 @@
+// Copyright (C) 1991-2014 Altera Corporation. All rights reserved.
+// This simulation model contains highly confidential and
+// proprietary information of Altera and is being provided
+// in accordance with and subject to the protections of the
+// applicable Altera Program License Subscription Agreement
+// which governs its use and disclosure. Your use of Altera
+// Corporation's design tools, logic functions and other
+// software and tools, and its AMPP partner logic functions,
+// and any output files any of the foregoing (including device
+// programming or simulation files), and any associated
+// documentation or information are expressly subject to the
+// terms and conditions of the Altera Program License Subscription
+// Agreement, the Altera Quartus II License Agreement, the Altera
+// MegaCore Function License Agreement, or other applicable 
+// license agreement, including, without limitation, that your
+// use is for the sole purpose of simulating designs for use 
+// exclusively in logic devices manufactured by Altera and sold
+// by Altera or its authorized distributors. Please refer to the
+// applicable agreement for further details. Altera products and
+// services are protected under numerous U.S. and foreign patents,
+// maskwork rights, copyrights and other intellectual property laws.
+// Altera assumes no responsibility or liability arising out of the
+// application or use of this simulation model.
+// ACDS 14.1
+// ALTERA_TIMESTAMP:Thu Dec  4 07:39:37 PST 2014
+// encrypted_file_type : mentor_tagged
+`pragma protect begin_protected
+`pragma protect version = 1
+`pragma protect encrypt_agent = "Model Technology", encrypt_agent_info = "DEV-6.6"
+`pragma protect author = "Altera"
+`pragma protect data_method = "aes128-cbc"
+`pragma protect key_keyowner = "MTI" , key_keyname = "MGC-DVT-MTI" , key_method = "rsa"
+`pragma protect key_block encoding = (enctype = "base64", line_length = 64, bytes = 128)
+R8me71UCEoraht5Yl1N2sx9BPWWocuG+BUD/nUNYtPljvqCrLxHE+Do5SRs+Hf66
+dQsES5xKsUdOxOYpzminwyxANzEmkN9gnhkghnFdJqZ8PPMn4NPBXcri7HDr7wng
+sYo+cni7oneVT4Re01egTZBiQMKLvvor/9Tws7LZJao=
+`pragma protect data_block encoding = (enctype = "base64", line_length = 64, bytes = 1824)
+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
+`pragma protect end_protected
diff --git a/libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_core/mentor/altera_emif_ddrx_model_per_device.sv b/libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_core/mentor/altera_emif_ddrx_model_per_device.sv
new file mode 100644
index 0000000000..426597e5b6
--- /dev/null
+++ b/libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_core/mentor/altera_emif_ddrx_model_per_device.sv
@@ -0,0 +1,397 @@
+// Copyright (C) 1991-2014 Altera Corporation. All rights reserved.
+// This simulation model contains highly confidential and
+// proprietary information of Altera and is being provided
+// in accordance with and subject to the protections of the
+// applicable Altera Program License Subscription Agreement
+// which governs its use and disclosure. Your use of Altera
+// Corporation's design tools, logic functions and other
+// software and tools, and its AMPP partner logic functions,
+// and any output files any of the foregoing (including device
+// programming or simulation files), and any associated
+// documentation or information are expressly subject to the
+// terms and conditions of the Altera Program License Subscription
+// Agreement, the Altera Quartus II License Agreement, the Altera
+// MegaCore Function License Agreement, or other applicable 
+// license agreement, including, without limitation, that your
+// use is for the sole purpose of simulating designs for use 
+// exclusively in logic devices manufactured by Altera and sold
+// by Altera or its authorized distributors. Please refer to the
+// applicable agreement for further details. Altera products and
+// services are protected under numerous U.S. and foreign patents,
+// maskwork rights, copyrights and other intellectual property laws.
+// Altera assumes no responsibility or liability arising out of the
+// application or use of this simulation model.
+// ACDS 14.1
+// ALTERA_TIMESTAMP:Thu Dec  4 07:39:38 PST 2014
+// encrypted_file_type : mentor_tagged
+`pragma protect begin_protected
+`pragma protect version = 1
+`pragma protect encrypt_agent = "Model Technology", encrypt_agent_info = "DEV-6.6"
+`pragma protect author = "Altera"
+`pragma protect data_method = "aes128-cbc"
+`pragma protect key_keyowner = "MTI" , key_keyname = "MGC-DVT-MTI" , key_method = "rsa"
+`pragma protect key_block encoding = (enctype = "base64", line_length = 64, bytes = 128)
+Dxij4Xpf7RomJwrgFkJrEq4tiyDF+GF2RSRpK/p1GxGnyteu16OHIcnuEzBtLvbH
+uOwlRREXNB6qXZPwQTiIB12hRo0f5KyQ1fhf5FCI2iTUQKX88WNFtxDATTByS/q3
+xaWx8rFZKMPFNS81dvdwrHTlExM/+xBfen0gTn6BwHY=
+`pragma protect data_block encoding = (enctype = "base64", line_length = 64, bytes = 17200)
+y9Nzln+Dww0BreEtL09mp4wz/gmUIzVfj9TlLNjGFkdLTxnKYiiORLNc6TBgp4ti
+jRb4OUA98UCR6t1SxILXJify43v/7LeyYKuq09TlTFkNkbc7wfKVamKvUGYLuQWl
+RYnh9tv1vBL51zZA2kQzzKVTEfiX7SUKHqaii0Yi/c10yQfL35y3jKdPZ9Kz2FwZ
+u4VdeUpZX8+Px6UMJQRUZxewcvkaLgBCdnM15XgeeBJjxSlYwqTFM1/vrnoHP8UT
+XlHULWeutQJ0pzxFUPjPEICOD6RMLfBUm6z3WzwOv6YlD+0Q5U/j+cyprdZYdVXQ
++XXxmo/pye7BzH/8M0/C37XpSSgYKtI1weOvWuRRo8407o1LdFxye4qCymaSL9ud
+GHhA33nbawKlDH+GklL5DvHtdPbAfpv1r5bPYJ/ylaXlxwX+hStcPXy20L5jKiAc
+7Y6PCrE7sU+CLeA9LNepf5rZZrT59mclfRCorZBzNQII4aJQj6proNktPtO1Uv+9
+h73DzooKvWrQdhkmXDInW2K8h9pPetgYiYQmNbwdhlL1nbxH6rIn1C/aaeM1MhPg
+ptklY/xS7OHBj9N8bhS9uLjJ2PM44PbvwyuRf0NBeuwkMFsmB9XSSOyWkUi1+llu
+CSMBKz2ItpB3GL1rlSJH6ympWWug13bgv/CGQw6rpIKVzSgBUePrpMbTYRwUqeGw
+/yg9HYh5s1aA60cXtnCODhSJ+LDhrv2SGhF1PnDEo726S4nq0FubEMjfYY2tdr9F
+yzz3sc6D26c4A8xoSIwLvXAPo5zRMDZkerPkZ2OhMJLRewYtA1Swv9LYn6BcTaq4
+sJXp4r1OlzKUjJz2T1tyG1tR32qZTJfb2o/pu3amdvmgje+jKwg1yc0k0Q4LV2MH
+PfllhThWnmUsNAhmazBkx0dcBDCvdEogwS/+Ksu0aOR4rn1BWaYQBgk81ccalJVY
+HagGk6ybHkawCYdwIXBhhWcAtWpq5X+BQpEVW+29C3ar5ThAIaxYO0fzVs75GOUo
+q/t49Q2/ah8rLJFN9SZkzisGruOPOZJLr/vJCO0+MG8GfxOZ+4qKg5xoHkIcbw14
+70ISfJ17hO7ecZtVIv+rJyjiiyPhN86ZGD7qI0KEU1pRPAWdSxnbrmaOgcBtfcFx
+ev/ujhDqHzrqmjWtxV76xnhju9/6DS3OdPSGI+rkSSEwceX0CUHboWg0dwXheRDv
+NA7p2snAEU1VjFJNyvxzfOD2ktX9N9qGK5QgT+4XWID/sq00GIGc/ROxLDXUD4dE
+LM1eIffy7l8B7pa7QIpx/yIdAIZOc6DuBkqZ32kYBl+rZen+v0O1a5GDcBT9I7WY
+FaWB9cxjbcezmBASaUvYGm7QvSA3nX7KUn+d2+Sn6pk7BAzVyk9QqrMbMKjLBDgg
+YGuKjFlLokIFpgU7JkEZ4UbrFoUayJm4qEPy/r9VMuYjpSCIJQ3l8JphEzkZRT9m
+nAJt69qhKL8j8A3FkZtW0/SfrZSw9EFkacn0zKavImz/aYYCsuhx8sXHCNqnJrXP
+RXuxDtatnLuAYHnSlvTQuCzVobXyGMIRt7W0l6O5VdmffSBoscJ4ureI/KNkkNNw
+lScY0xbe+Twsdvbc0FSNvOPyl9prfwWp1JQFxgIKraC0MQTsVCZRuWJU3XkDfbId
+mmgW0ev/YPEcDrRCoeB9DZ8wBdw/qZ79LPxSlTObh2MhGoJcTmExiEdNgtU2ClK5
+v5tl4oHz4/GMDy8xSDJ30JO75smS5cmxap0xbrd0JxjLTL7n87DnpQP974ZGxOWL
+HHo6GMJ5xkEexUwVmVMLmNMEN6lhNKCRktvsRzFjJ5UtvBzDQZ91bPxE2WlGLvwF
+KRMTSkjkHWMT3sRcd76NweNZzuoL2lW+ugXsBGWiUDQu1g+pHVa6RWEVBBoyZJud
+TGU+ezXQIv0reVYNCtg1p2+ABljh0oYJOyLSOsNKO3AlykQ73VbNJfC+tw4QAvuf
+cm5JMdT6Qre5Mb/sEv08mDcvErFvALPFsMD1mds06i38UE9208qFcBwNctHUMqyN
+PEqUdxe3S9WSFdjwQwzVyTpdExSwOC1pHYyxzZa+5zyMVbZe76M6SplcKfcOg8np
+AL2vadwFJ8OYU/26RkSeU6i5nAsqgK9aGu8eaAf4vlqcvDKkhzLhGOHRNIID26vF
+LrsVeXd9RypCYtdhWs012S8dx6oRniaYyV1j+V1yI5yO0T2TDRMngz257xpBQSUb
+eTlvfn/3tEyUY/57x0PJDv2J0jK5oVUmdTIVHoLe8WKwV1cX1kSgBD/rU+L0j2pj
+zTdLQohl2cwfNg0E0bqsyydfNWJFW8gXIhayxXiwokq7Wa+0WEpmojVenZrlIqVh
+cWBBLee21lhmm8fMfg5QXbD9grfCBZhc7Jc4XYZwDXIIGdPNTiZseOXn4IyLV9NF
+l+yB/NxSVLNfnngOnTGkWf6axq1gcBUsC5uVJSQEjWonf6OZcrRsQDZEV2uLAZtP
+i82GYp3KyANd9iy+JkyHQFRrpk6cqxXEnpzmes4aVu2Xtgz2RNC4IBUq3c/b1szK
+G0MSvIzqYB2dOuE+IncfJxWtVSzBQ9P3vnhmorNKEWhYWtYVhhDnPljeFVFSs14Q
+yEr1bpCCODfHhDg8WGk7WHvl1ygRYnq3saO1AUcaSaEQ9Qni6Iho5cTxJtaThP8Q
+e642nI4t0rbqMIbIDWXgtYgb0Olmk75a8ZDIMKPzqU6V6tAkvaVfDXbLvdxzWKZ0
+6i/0r6JhFT8RhrJhtb2FILVTKgtQO28NtZbOEC9scWInoNmTJAUBDw4FqxJ/DB2q
+yfrzTJ8mjcaJ5vZVMELxVPfRKwDmAsvi2zyyVTdpINSq2orAUTLAlLR/OgcvBxNX
+LeqTbi14XO1K0j8hxrCSTQsbzSnV5HeYFR+kGdt2IRdcdEi9WhLy6uY2NPu/S/wU
+zlzwYro90XMKGmrxoau8Mpdq6LpA4HyWNhxmUm/jiu1o3Foov6aC1uC4AD1gQtly
+xlkJPM60HnTXHhS7do4z3746wXqoXofo76lPB5D/CXI5sqgtph0Z2505hvxtdiCd
+fC6U9bT/6NcpbBi7YpsVZBMnu725NHpG4Wv7QiyOF0ztLEDpm0eLvNa347cIp9au
+LOuy4eNMRuo4gchsGOsd5N5Ji78MbbLEblokv01W1IVG/b/wHWq/GLecgE1Jl/Eb
+ERMWacMyQuprvAGSvThJv5XRSG8De4oNXi6milGOmJG+8HHSmYmC9d53+aLWhhSk
+a7Qm5Aac4Nmndw/sQExdlPbEAXFuVZ9fcR8vkCGDVUW/Pheeg6RqimynQ3pTz/Sc
+8jl6qux3gu5J+oYiZGtBr0wMJkkB2XIXl4f5yFaVC1KlAC7rK+hqIXd51kaav4cg
+0aulJZNytHChpeCme6etZruWOdzARUoEneUzGKXtVxbSxmulE0pUVu+hn8CGPlYK
+Qsm0wzVy5dbR78gS+1PRqg9OF8BuVBqRGAZChVHlHAPQtb0B4PPPCdLzu6NP5JRv
+PRhOOMJf+V+oc/lOdB7Xqub9GpOfwvW2CVv4DFYt0mXWcWbrh70YT8Mi7uZLUykD
+PisNwj0X28YdEDIjoUE3Va0shzYtW1DqiamRFytn+FyrTAJglueqiASWOL664ROc
+IIT/jmok+vCN4FJPmYLrsjGiK/42y/u8VOK4Rgg0t1S4j9Sn+CTQ3P0ohOOK3+Ke
+0A8yZiK6SWBtT/3clQSydp3c7nw3V+vFEUD1JiZsHli5jAJRY1CNvF3sFcp/ly5r
+IR0ScSuIokkn0Arm384NRgNZNwIZk5A2pgcGJ0C6gEqnMu0lMlMyFMYL3PGw/4Vh
+HKRqD18m0z7SEU0hh2p/uH4z1lUcLeKNN8uz74PEteblomSGUAj0K36EIF7lkfkk
+MfO4dHb+zTNpTPaGz9OOW6w0J1fDSwV3K5dSjSw5XRtHK0TOaD3+YZNpwPCY7k+4
+BzxW12bx7Y/pvJcLjmkGVxzFjVrlBlG7gkAETkqx3gS3yiEtfVQfRFRWrllxx7+B
+uk17PGkGWpc/UpwqjXQveF1bYglgGSAg4O4dKODImhgTRyjhiryob7nSL4IGlmh+
+KAohvei4Jjy7u1UYMU5EJ0YGphVKr+9u6zAUXeilbBVfdZX/QzbVZweITwyHF77b
+e60VRieoBFfN7pgk8ZAlBo/9SBbol62nXp9+YKmEy3bbtS4njV/3kgeWiqxR0zs2
+3jO5QPXXeDV15RkvYDMp33avD0WBakKtnVTOVs4elHZDi11kez+TUQjPgO8/3Vdf
+qA8T6LSWibAbl0IYY7nmbB+jjkJ64aM6o/3uxdPOqBYde7+YZvA74rJutN5vd4zZ
+3FYy9jzrRfG4/SiDBC134oypyIR7tTuQgYxOrjXBEz3UaZMTwv4LMLstW4Kxq0G5
+sOQoowNuaxpt1OataCC2uy3cSJs5zPt+Gdk+ABtg5hRcTd2zE6iBU2NkeZWJnGO0
+Dfo34Ar57WrtH17oVMl2vZSFJ/BILFXdUXiSW4hrVZuBP0j3fZRdo3X/By00+umS
+SnYcCwiFrQI4baO6WfAfSUhYq1TcGQwQBhugO8Vtim3/nofJx9C8LeWc/ifmAiVq
+uEHSD1+2Lhlf47V0aN68etA+7WKrgLU+FrvCJvs/GN54sUNRL9Rl9l3/lnFdvzzl
++NgfyG9VWBzs3Np9kxar3Z6PUkA4hm71QHAJL9aC8EJYbZxA25b2OcoUV8BIeoFD
+GqWvg4YusjHezD+UUaSnOP3/dfrTnZpD9BBjBuhg/aGM3ph4n1HJ+3AYOo4aew7+
+1gSqmBqmC7UUQ09gijuhlT7mubuRqdBPMKRveLFALVUs+5lS37VtRYyRSYheP2y8
+P2RSI6m+M0op7di4WzCA4cJ4TnECgB+rd6sYybRRKs3cRIFW89FlDkC1wQsT1Pab
+AOs7PUN4IczvHClwiINGjuWF1qMFRUnsa3MhruWLqctO58FB+Ju8XlEwjmENLzTj
+3HEg5IkizmUCJNao0vZRrpmg2XYO6lks/uPIwhhD97vsO1RQ/OtYbukPypm+FCsQ
+J9gEb7pD2zKv1WJz/HN07D71RSKjoaZrxtUr8iwCAlvwmnyID6H3gpMFBMejHXrT
+qp5LxuPf264JBj/xi/hH3hCJZE8QQuCV+Ez8MjV0ZM7YTdK7/Z0Snh3msT6j+Log
+sv9eH08c8uuBdgej9IyQPgUJyNxB10KkTHeVdrfjfgrnDZ3lMuv4f9igfKjouQoN
+7D77UxrfpreubZpUf5ILVeCBVKMBmMOTR7sHEoqflOFaoSXgqGCztFK+pjKtHd8t
+H/mVnJsKCPDbGjlTCG8Q4PCvIOyeiyFiAxldhp3WX1ZPCmdg4dFPYzkMZCZBfcqC
+mxV4zpuhBf9/rSXzoDD/ObYDDhga9sKsGgF5CbBYf7UpMrIquy1Hz1nKwfBhJvlp
+omHegb1HkqoRy8KvPXPaoavGeBsPBRmXmzDA9q0ynA/ifp82UQHw8vw7zWiBSXFd
+6s/ES2frOVltIhS7xi4VvQZEn/luoLY4KXZJS6T7O5UreIVCggkr1sv17oCOiZ6Y
+LtD6dY31P3isdJ46uPS3+hCHSwLxy6WbT1V+ypQnYDPpozWu+ffGpMbG5TID0qCx
+0W2l1E4zLUwSWAbBK6W7yEvdeFjcYygukDm3QhoDtL+ICHHxnLsRhzBRYEvX397J
+rf8cgthDYbuVV6SrzfF2GiOMqSNAp+RtmeIn99FDGstg+1/eMwvdp4toR6y5zP7O
+fuKKhIe+2NITGkC2p/Zh+sLsyXSYmkr39+4UOD+hFix5oxuq1Oo0zYpMK6O/Hw6G
+EhmbVbyw8JiIX2f4CG6oNPEZOdMqGQvEEJ0pJtEuAJU/ZhqQqUGefNgjfTX5GBkW
+2A+QAw39KCb3vbuvqLoirams6XE0RXvDe3AAdY95vUbdWqUPGIdIVsh4mlNxkH4O
+GOLUUuyo9pUiV6sO4i+bt7sigfdstejkoz5UJtPwFkAa+918AQBLzPELu8J+CG6+
+sOwCnHXVZuIpFkMwu4U6lCsEKeumNS4WeO8KO2M3Vc6VvclISK7rY5WZcQWoYEe5
+QdDXq4nrsbeDKBHG2gNDToR8NpOSTyH+QVNguC6nIxVKBMlaFsbefDuzLymXTRJH
+T4hdsPK/dg7Bny0oa5GsV/NaPu0I9u7LxueP/CC9O2ofhRPP/kMNzmqGtLbgAIG1
+VMIKRvNPQZjoZosLK52sjC03Lt1fpk5QX5kBGKEpnMMSc+sqkucLAmSrRlncf4zR
+xD5mmihuPO7wvLknTpOrkegcBJaJJc8sZpXag+0ezTe3L/l0nQw6vRzjmu73E4mO
+Q9E9Y2iYTvYgm94O/+aVWPOrszETE4wDv/ftyYwKMdGi3RqDQuay/9eS9fDbCf++
+SJU9X0PTxh8jpiYtNcnlGB8ZYGgADtM051Gdpu17Ye6a6OlmapAIhZku7jGdKOjl
+2dL2YeaaPLwkfKs9TRfhKSyu6zqtaVanMN7Dj/lz79fX1GlYVdagQEHTtFfA5OEr
+O4w77QNkS6u06qXu/QjjwnYtNXPHO25nOpE/l9QC4kqxiWwn/rc90t627MPISWEq
+3OPs5zLaQdMU/88qYH0oPcd89weA9765VNysmC/NP236B1j0wZw7wJH2vq5DxgOg
+XUiK8kuPczun7wQCHCzw2XXYeJTzsn3GXRWuBY29Sd9ORS3GkOs6p6AgkJrNxSwX
+h7hSHDuTTHCaIvzSXbiZnzTY+t0jY0H93L1TQerJTyYlJE/Nohqj/zBEhKY/0EYC
+BNNZl+UOVWt1NkiHiRZXaNfhDF9cbAEkkrFXTgIAeImgY5WJrjxL3JTGYxFZF7Ro
+SVVXwio27jaS/KTs82btVyrKSgzdJZ1DpAXaIEgm39DMszHVjLOudVUmW5FdQOQx
+hbbyveUMFerxhhuXrxPJYxcyNLt6a4oyZF/LCyMtgTlGbKRks3pQgUWYdbKhVFpv
+YezxChfO2A0kqqf6K+btqHvOvdKJXdlMHUy9MVzPkX2dRG54b+Uz2kSAwlZ+6Gsz
+w0ww9BVD/UdOiD7Wn05ddUJ9+3BSyBm2HlUQQJBk9bPLCHPhvHqun3VlZZX7TvQI
+WOkH9OUyW11p/ZCrQsep+/AFM3rOtlcvFGpQI/N/me0oKZdHf3b2UiMVxhVniLXA
+AJ2iz1mfdUJAsqSZfiZCZZA4suy87NFV1x6GBeQhY9rCAKAKg50OKIiJzbWeRdeK
+zB/9PbsM5FdpEMgQP8mUpwDvnEc7B4R/rwuJCX1/rjcm3uo83q4LcqbHUw8+kJfZ
+VmaLRnLutn6+hkmHuGNdep8Al2hROJSdCSBDyYn4LlBCC2UCADFHR8vX4mzgcdBd
++LQaHybfwJz18Xex6MrWJ6O+YAeCCFADduwD7M5gwYuYX9qv+0hX5rOpnSNnGm9C
+Yia7OxGS8FhR/9Z68OaJo88zQbRqEHEXUSobXrYKvGVLuwgG54hdpC97NMdbJEzT
+/KKRW2TzQiYvKol57TktGDo7vcOdJUS8DsMC2cB0vqDRSU3x8X2vIWcP2G/zMavI
+SSPOotkWAcCB8tdAqUVmyamGoSK2BIY5z8J6tUwpVTpU2wUiCT3lKADNXGjHM95R
+ITOpO9zJJMqI7BAUnQ5fkpQdTAQnq1CJrDNX0eMGMHNh1Rf775IUz5lpgoSuZbMk
+yzmYMi1QLhQ5YY4CdcZTPZ6NRHm1hIB72r1SWXFvMT1iFstER4EoA8lapwqEEOx7
+nmXh2hmGlaZMZvhyIDzKoyWocUDddCABb/AHjgbg5YpTbQW4TiTJpNB7GE51FkDd
+Yl/TKIF9Y6MgG3YIgsqdme2Z7mxOqnxBuloTHdfLMDMF45kGwH4z7aTGjt6lqrFw
+jlSw5iBvEttcDt6gfizEMTw6MIYLkxjOXQChxKnF1D9tFdmwdrcVrb48Hrf9kdDZ
+wGoNzstzHm7/kxYoo9eOHTJa7iHH6Uky3/syQeLpCgSNjlAfAW8+qTfY6xTYtyLb
+yUiT/t2SBVGKy822rYOabWlPwUQZhPQ79+tiWpbj8NGWkmtO5by/muUMAlk0hvsL
+eHJ3QUVIm8HpCr87stYwIqspNlYcFySh8iZurd6eGo7mWF50B7h073xrAkgpwJJl
+NXdnImvXjsuJvBv/DYzERoACmxKnWsLjDGurNdQFPH2ZA2K7J+lj9l1PFb8kWA5k
+c/+lLvRKp0Nbaf6WoAB4oRR0/V7Ip+viwICa+xvSrxS1k88qGMhGf0daxlmfT74W
+FeFDM+l01LbD+cawGaYaOSOK3FAfQM0KpgoT7LwLmLd1z0IonMGIg60OODDTJsWD
+a9UENtvCfW55V4tQIZpZIyM/rGeC+lCysJK6JwglYCdbJXQyM/LhUmlYh9p8vpUJ
+M3ybWOf/CUdM3/2PjGr4sfSU5djeuSL41gWiEN3qgFo4U2IcYKumikBQqWsuuZ85
+Wb7iU3FExqVQ5TRA7CmJIRu9QURjabexwAFWres2b/7EOeVx9122VKSkzoTmt0j3
+dGCfkBhxu+wXiKG8M7q8+xmy7T8dIav3MI1RqqMjZmBhUsWDg1MagKYIS7RXKW7X
+vj2qgY26az1tPSyRUVEpZZFyAD5Zu7rlQ7u+QooZAYvhNYdUULlFFoejzRqGrSzi
+8t8YobkVrbGsbUa/w+CDTj71g5rxnzKH6bT+F5eR5eaWAqTbAQNAlwLg1sSfcW0T
+89yqYxoAuGGBY+Xr0K10dSP/oxx2Ii/1Lq/a4wQtwIkvRiYllp4K6xFscIx0JMxZ
+IaBh/QQ6Y/6+kTgDkkqujC8Z58pBv8f83zkSqx6xTvZzwXhopiGmgm71Ha/nLGIM
+ainGW/Z4V6Q89zUri1m3MfTb1onOcb2yPYvokDRz/ZD3XRvZ6POdyNxw6XZzfV6d
+GqBncpJL+EsJEjW/e72+p4sPTFFbdfo4mKeT3y13KedfPZZFJe+a51X3pAsgqaHS
+QAVXUHjBHinn+tXwtn/4/LleunfkygyLs5kcMcu5mLPTVqV/ywedmSlC0R2x8qgp
+L+2nma6IxMe4db0Gprvkp4BeMpVCtzHK9jG9SP3K9regfToBZmDVju0BSQKrrhoz
+WtM+IXT+rTdwW2PALD2Xp2L5gfYyOKilQlVC+2HQu9yDdipXNqG22bOvPVFb7HN1
+wOsOtSWhp80qFMpHYUykOWlQbQeKkBThmTT0VRsQjSwKRzKbf8EAr9pZipmZXraX
+ZmtV2DY2s5+BkWerODepZrwXUP/f2XJ/+Bljl62HyaJ9W0KtMoIiQFIb0CRQnVx7
+e/TtSS4miQMFspGaFBXQFGRw2X4idApb5nvgyv/lCHOfCIfstaRihGTYbOqYlBIg
+mqZRbNLyVrviNz+qXZ4XTckSAg/XR7Dc2rf0vuph+n9hmuRkmKemwiJWx1ckLn+6
+l+g0ZAehQnKen00Yp8VfNr44dqBh9Rn3j7OwZqb6r5cc8tCibfLdyT8jJhAB/QwW
+axsgPMA6zm73W8PV5mTxA4fpI3zaepThuJq16qi/Gs89oiiHr00TphmHUqSpy/aj
+IBUsmSk6L9mnCtBPP+qnhoFbB2fKgLHET7sADiZy3xnAzIxxduVOEI0Jqq+AaVy/
+0X7V27waFKK/csTjmk1KQ2tmiS30VJmnPWo4rk/CE1k9KxD5tESqyPRYGbLeN13v
+/WwSdGW7CJUQO9cAod/qgoftQ4ZzviNwLiohRRgk/JX7DdVWL77TYVoFvqj20q8v
+6KmkwFZz+L0Jr7zAcsVj1JJ2Z3sIOMsxUI/IbbU579lfrxWhWHF0h0Feue3rH2iw
+t/HbYlXSb/qUJGya4+PwsgFj851Q7g4bv1iyrxEiZuNMr9wJB3Ic1keZbYRUdNl/
+WlS0Zo5iS6NYdw76pkfNjrNalyyY3AGNEmXZ31u/jv9ghqQKsvEGdKOQmil0L0jL
+EmigS6VYaMUV+juSJxyfkrBjFHmiUwMnu9CuqDZleK8tKG4iq9K5newqpn+qeiPQ
+tk4Wka/m5pc+RaJfUEadHXmJRZmQixtvG5kmhKn63y+HPvqpPMRn6mODWKmiisg5
+rzs8c25zLlcMinbajj09DuzSttWQX7CBBnDDva8PwMMpmZKqCBAoc/YUetgDFseL
+bXYooS1KXagr12wpJztGxU5GgWPAw759fPrIX7rOjKPE4tukEiRc2oo7noFEsxa2
+CasO/vq1VG2s+uNpHLlNvBCRSqQKk5hDZZPnTUkYOePBifSB7IMNm3P5XfhMaLZF
+Q7sjrTIx53jtijcQbd67quLIauLDWpnMVxQswrWFd41Cqa7ajyWVMasXu4g+4ava
+JWRxR9vXYr8ccIEWPNBep7NRoPvGEloOE4WxWIu8xGR0HzWffqfn6YjOnUQx00Rq
+F0FRj3OVR+LYsAaxJ6zsoFjZ4kKwvp4nQPv3ZUpYd4pSzGJqSX3xRPA6y+u/fWe7
+meToMRNBo05q/xqX1j72qYfuA/XTiObU3j7PFS/aEWB2W4tPbO1lcy17x2kSVFqo
+TyQrXC3kYwTq5/zBrWXDzUmAK27JWR7z4xdAz5gx5iOKKsnHAUMPL2zI9jHO6NBz
+OqnYDBQSphipas3DVAyHHs7VSWBCdR8bbXIV3SMjimQ0nff1QxG3kR8RXWjV97yW
++Cy4gFT/BQHzwgRme48sMq+DdK6+7iXLQNbyZmVbkbBYl651STcdl3D1z2xBWbxd
+rBnrEpDH6oO1zpOAMAt2TtqUBH9tgxKZPH4nX3dY5EDRIcz8GR/Vw0ZEIDxLk76Y
+4Kely1m5HkSA0zC8xjsPpo3pShxzqcBqP/qxVg9sPSIK1fG4YLeFwOUmmbBwCKGY
+qVmhYdXIP3Py8c2yzwoMZ4sVlEUeMmIjPIsYoMGznZxAOUadT06o1BnEUXvLQUuA
+4PFsxGcqSiU0BPGw52zYfbTeXnQxMT1QaMsfkxL9D1riZMSFe7IK2GwSnTGxgPMK
+Trp7eZ/xqCZKsguBA89Ukxi42eqvA0sgIWPXS265dNsrsvoLI6BKbYHvDKPN6ber
+P5MGFgCHQeG4cMm3DCM0PW9m6M9FRAdWz6nyL5AYADqcTJVUEc5Yg0rzCmopqIVM
+Dg4JjwgNhpE7bF/RkqvzhijFSXp9a8EOQ4Q2py4cOOBhg/tPZy2w6TUhlGBPCgdT
+MEILG3XgImjf6RpKyA03ey52+Ax4/hZlXMkTyyMOEp0Vije0Bz0DxCQ6FYcjAsCg
+GlyTRK5aYasEnPLQ1JtyNHwSMh3D9zlFTfofD2rbb1CTh5TQNfoicI8SxRbA6Add
+DN8M8uo4bbwhjqgVmY24vVSBY6ZONA4ghW6s9fDmyvQSMv1qkdSG4pSqeT4YezFS
+qqgMpP7hrpV8zNwx4jrk7QhgD7vqEqRJEMk0GY9hZHWkHjcx+0efzebNHRi+u7fj
+AGAaQttnLDsxvbPDiOmZDxX5hr06gVMeG6xYPw1VwEBeIVOUI5cWzpyLyTJBjy/7
+UwTKeOjXPEZx9R1GliEyYqqp9ptX1XE7Oj1o3GSzIfmETNsqC+8idA4lXyTEdEKH
+m1qLlYg7GnceKXWSnXUJBe1TLLEMy25rxUODS763G+gAyJrnt/susS0LUVGcmEdf
+OOeza+ZPwJlGm6LRxwJCeTQT4ELlwUuw2x+tC6OwTDWuO4Y+f2tEDTVCemThcyQl
+W4saE/XW92tn0Zfkymphu2SdXwW5gXqVzp8oJGoyqPKPHUlz8CHY9JZx6TKmqhld
+j+tKNWgouDIt0BEuWYju3vVzj1cga60SgKlX5aUTq23ryvWOl2sJAyYJ7QFdaWTj
+eHcmbchjxbo9ESivO0PNufTfpl7p7uJ+3Jklyu75f5IEldaawtTClZqZOyHgYFBX
+bvNC7qlpEhV6YRBf0QhDFIhG+x02uB3MqLz9BpWGI8wKBZYftj5g0mi1Byi1Pmmh
+TLoy/wSa8DXcHJujBpnMJrpCXwwwXu9CnFiB1HIhkM3c05gwj3TFcIIReeg9IsRd
+6BlplNVZqILcQQan9zmfh/aLb9MRlGycvAZcsLhZBXFJ8r0Qs30HmDbz0gaCJD11
+5wodILtt9b+KlSDYkCdsb7M4J/LAGQagj54bePUH0wRVggJ37OwD7aco8H0dMxsC
+hAioEm2HPhCUPskz979/IMPmt8Rf7ONLUDAaob5n3uGBtQMCTchY4Na7WXAk9Crl
+g/PPdYqhRG52gdpJGa87hY9lyB4JvwGbdRPO5IQ1WusfpISVZMULWA3BnmM3tQm4
+QUfXjrXyYwqJbFWVN1wpj5JYxO6cPrFkJLpoKvx1orW7C6PAm8VSr3+c762LyqvO
+wk9byCNiMLF+iW0CuNagdEa7rFLYztD6/YTNxjB0HnXFE05Jyk/W0zwiP41R5UeS
+gjrlVeRM86h9KGB/8zhfolYlJIBlCyyT4aT7VD8OgUnLIiQqnVJoDVa1NgPWsuOD
+GhHapaE7hJB5f1ecFgjDf+ndKY2cEd07Ph11AJzSOJwhlxMsX6jQ4FUeix4JVkB6
+FGRsdo/ogyCmm+tu9oasxEVG2FfSsK3fg/qsHs20u7qq2bXSBTskm92jnwMRgtbJ
+YiPZHIp4DkdujVz8lSXQXVb4LvmXbHn/go66HRBlSIo4IQMrdHmyE6n0tK2+2uO/
++1dAw8YHTQrdVheO8kTSIvQwbP8vMeWcV/xFjofKD5R9BGPRQGn1dx4l9604XnSn
+xQ+Gv6Jd+UEj9XJ1risIuiK04loF6vvMa8pFv3lXxzYXP6n28xkwUjRygTDRNv8X
+qzl7+GjpL9V0tWIr3VQM2RU/0PdTLt0P/uH1IX0gYWQPtcTXhCllOTRfBgPCV1ri
+jRO3aj4ZItRa1XWvlRZcscus1txE0xA82utV5rKB8JVX3rd5gMo4f5T2bsybGi/C
+zM3emKGY09wCqypdWLVUX4y1CjRZOf1zJJCDYZiQiE8ExKKwTno2rE4/4Ocy82q2
+szlLcfZ07584urV1QTf83Ug5bmzA1inX7DzkHpC+oGDyTKqI7p2j1cd9etL6my4u
+/hPuE4wN7cgJRikYxvmyb2Bsf0MccthJao/pPYFDYzJ05S+iAFWqxhDdQwhG2Pko
+qdl4Li8mCU3OHL9HrGclKyEjNb4vmf/wuyxvcZxbw8yvN3adVBnp5KCQexozEmo1
+De7KwhV5XILKB4Y8sGkSjmj+R3x0P+70TX9xVc1DTCSX38t2oLs6fWkmiX91Pt2F
+rBYZ4hMRGmU9FKZgh7Xlt+n0ii8t9Yb8wSwD4rYO5pQzSjksq5CoKDrv7O74DbUg
+DxEDh9QWiqNgc2nY5aWcZe8JJeuKy7p9iZ4lwYNaxL2dRAUa8ymrVCNFt5IAIUVV
+ZK1s4bprtKqXYTmtxPGSH8NYOOa+itWUPBxhnjEZoJUo0AlS6XLB5a8PKdLN+yaH
+3fNYsFL+YOFJYkED9Soq2HGn4tWCwvzPjQr2ic5Z8PbSJKwYnu3SDtM6tVnI/O70
+KBk6mfL/RCcqaoYK9yShtXqSfL0lb2Y2wijVMyhJbHe1GQL8vP8+Uii+pUaxLhgh
+Z76B+YuMC/GTJS24lrFOpa4pFNP0hqfnt1uCOwMqQV2RcphRJyqUX0sPD7H6X6UI
+GlJiaSXTy1rFJL3RgMht4xOPuI2eiLPy/Qcomhdrk6ey/ifsrmBCJc9R/R+gfNRC
+4oEqGA3Ui+5VGBeTaehG7yMrNz6aLwEWa1TfLWV3GWDAhByA5fMgUuA0xPfHZXHV
+EWwTy+/6wwGK+Mxmbc+wEZ24D3MGOjA6W5P4dQR5JfHgEtnQ+7AZ4R6yzZb3MtVe
+HMFfKCG2e+6YXVtlo4BXRLyxFJgb18wIww36gSpZn+uF3olWC7Cy3ZK2oG9N+LTp
+k5z8HJ1qGtBANTRRvWt1q5JoJWr7KrEH3TS5ccHdQSPeopmmByynyVSHABBGSUcg
+skfxMQYmaJkjw0HYTP+mv+hMpzh/CJFb1wf+v4kxVidj+9A9i8Uqo/QPadyjzdpv
+y45RDk0mueXTWVYUYjtB0SVAEOQfTq63HADsMFFygPhzOAxVNCW0/ofIYaEr4uC3
+Ma5Szx6JxbsQs1jF+ia/xkDOrBOydhKuK3+N9dRKKAcJrUFnLY2PshcI/g3W4Yhy
+dTkFZqHkcsVATK5P3GhYF/HnYffNCZJsNH+u5B6qNw76jYkYBmV2LsgMHV49Qh18
+VG/FwJMIogCIZxfHpyY9dmgqBsvHZjtdNoWMmNo/YrAaEaLS80TItq2NTLkQndo5
+kQlW70x/a7YVrPgMZkzY+lNYnkwJT+wEaejPhEpqU9Cj4bUEyYZIibx06/6q/5gN
+Yj+IbhwO26pQC13x/RQfsoNlzhc13tAHWgAgRZwIgRqH9mQ4dKkJApo6QZjOHUNB
++YJVoNWWITMSjOPNg7AZJ+Cb1gec/BV9rksqjvDa9XMlLdYxdYrPiKaExyTrnmun
+LsF16qZ0j5PS+EOhEJ5DYarIA3OtR20f1/bYeQDT1EWuseQB9iI4I/tRilyZHOU0
+cycO4fr3abB/KroQEg4C9nCJgw+4hxjQHOLk3o4uyuNUIvqhASMJe0JRyIomTeBm
+DkResx0sEN0UYg5Vh2ENZjQhyOZNwOhqGJwYdQutiRxbL8Ci2Pr0craA4h43KW48
+AQXq8GJMyXa4iGfAJj24enj2lo6pzzxUV+e5FtnxpC4TBT/SECGa9I+TUpiWceQ2
+e0aZJHAX9ath9Q9LMbu5nISILiHf9djNxkBe2ISyd/V6ifKoPlHHtJWPM1sOl4ys
+4v63HKhmnELeDjEpXo1FokZ9hV02xe4FaoCOSq3qQ5qbJ9nY8EYIy4sslNbOf6Cp
+2g2ddt+nqAKlUl2MnuUN9o3ncSMqJ74qVDuzZdqJ8pQ9G5CjAbaj+gyENvyibdB+
+NEhlvdISITOJ3XYIVEIrp49D7Hh8DU5fXY4CCNgZM6eVTo6wAaKTz8RqefOr/Uum
+EfZ7LkLgnzp4Wo9U1GEejRz5VEmy2T0xZeQaRDzwAcFvenXHwCN9YS+PW87WjkRh
+s1LUz6i1T09ZQAjn2i36mBuLSrw9C5mhY43loTcUQvkB9XLlZCi3bgh741IJH0rj
+ssnZBqeFQUox8Uc1qpi+h8DrNAWV/OoLL6JlynbVYnrvVpS6Hj4eKrNYLB/of2OM
+Lg+z57Ag5OFWGPHld86MLjS9N4UWNrgburZFLulf3Rx47FfIxfTRfnoBp2iYF/CL
+Mq0vzKJa09BSDfn9WG5U2ggRQtj0J1K+wy3/CDBADcY+Wc/CDK2xZrelJ48v4iBD
+oijxkR1/ssAkZ62137IuZtJKxnO25D6LUxHb8f158t5ldR76WX9nYbrn6eEefNx7
+a3jnBkf0CqiYFvE3WAmHV0mvK5aAf94CRoHGNlFJtQr2fwiXNbCatzNWF0R5lEpk
+jgJfazNTgks87xidB4Iytjl2qLpEt87Z4GP5+No3/K17Pb82CnXo4JEzMrTYa+Ym
++JkoxnkKXNZxgPB4vInvKHwAbAfgPXYizRAHuXHTfufkHtHpK3W2nYw1Cdnp0SOT
+f6CkqG/eheK6t7cs2jDGraXVfjcalIZncaNn7XxqGaT/tGneyfKaJGZZfBLK6yCP
++ntFl0hZM9uMFsRhnk8fDDGEY4UmW++lSdbbXSeUKHwoJdkuddTaDZa1CKV7SCji
+Ts1GGJEdnhqlzcGQI+cC4SgIxJFPJSq/ko2v+1DmLpxaQKx+bDk8LD5TDH4wuSOb
+QF1b4VXeYnBt/LH1RQsmn7mKbDfuzek9nAY9KhP9nTjwTwGFk9CshUfpAGeaVNQK
+nJcgZv7mJCBJ+zV+tjf15Hmg2ccLO3XTCMRgD/AQqJGubEqYBRfPz4lIWI4iWCqt
+EDMj0XgdSeq7zCcE1iphg32bKhMsc8LzXVPaFNGkqmv9zVYIYLpzwKOsa2W4fhA4
+38UIduWnK56GDzKtGEKqWXMGS5eBz0kihAx3FS62ooLryq/ur9phmyJY2c6vigh7
+P8UjN11b9GReOc3ekO9/n5nr/y1OVt/lMCqxCFzxy5nsUfxcYHHMv35nMCyZzR+I
+wdT2h7raGuNzeAkGVUVTybKzDbRpvukVVdFS6yFRMquw8cFyxGnVitt8t8TsYscM
+rWIfYwZ4A4U60s4sAbG/DiWMhmCea2G7e0XWewzMuGYTIodft1awah10F+VH9F3Q
+ieUKTjRl612ZgLKuezbtK0i3J7TCpkS8vTJE89E/R/oRaHXRxbeHoNWYQo7wDI8z
+sh8Bo+cjZ4k3GizdWvbihep78VEx/FjS7mFDRF8MfcIy5PhkJKD7nA31aGlrpwcZ
+OVprZb4BTZCxhkXvmyGcO3y1cwPoq6OnRaNjdzz/NQmZekWOsusy1A6qOr2KF9/h
+N12wgv9y0B7AB6WS6hcpiR5TM/Zb1Se/+WI+gfC9r3ugSkweJexbjEIDAKIb5yhi
+TCfu0LyvBw6lndHG8HnLsfb9wPNkpwGBTOllpOjZMFpDOqcADQX9CBsXR9Q8zZAS
+cg9d6IvrQ4IH3kjMf/IEIYcGm0O12Kg3iY6me/qMbPncpQ5HJtRX3BZEPBIapf9B
+7rAlSZ6ZiZa2k6CFnwnJ2sswFHUTkILqbFJrFtgVHltoQgwqPur6M96N1v2M6ECr
+J4N3cYuNK4LxfiXdE8uGTyArHVVouzwwrxif+wbTvoT6nIp3w/o8QCiTlAA6LSm8
+KqeKelGlqJjXt8avVrS+vBXrsYd9mFOjvPx/B/TGSTGrd0Pv/R4P0u9ahh6GGBce
+YKWm373MPc2KffJoisKl31OGxcUMDVqXzGha9qeC4XE3RzEIPuhkuwcSV+8QgRMJ
+1R0WiR8C3yRmfgOstk/fs8YhTBQbvqPl8p78CeihrLSLWVqeazcLJNycWuxarxdy
+Qy22UJQSRHO1QHc7muLxs/pCMAeQ28c0RATQ6WSh54Pi3xqiJwLm/YV7yGuyoKto
+LlLBkfq4d2wvKBWzCGIZr42oTqXAQIr/NZfBhp5TjaHk85NhHr/NGhxCzTxRnMCL
+j2B+L73uvweQ6u4QQGdmrwfBrTbpMvuRUslBVVMPoU61EJV1Kwd4gyJuee8XBSjo
+VgvKQEJox6u3PCkJlS7QaQnHYk6gSUMr6Gkdw/bJ6PNTiAvwmh6zDMB4ZXDub1X1
++qLMhC7YEiVWP+jygnL/tDrRIBeZB6BeZG/qRZUG4JZvBNlNbr1WQGmiXTRW+fcF
+lAx5orxiDeRxI7CU7WZAIHPSScdv6UmOqmFCknrQMGO6vX69uUl2SqwOU2rEdbxn
+BaDRlTfuNTnvJOMcDK6/h1L2LFI1+y0+nE43SGAkzlRyXPgswXfMkY+jHDCJCLGK
+2QrFx+CQ9A3VeJzLEqjoQz0MIZv69RYAyitdrNOBU7TjCjgb8zaVNlEjAbbOnDx0
+XVjCYAzU4x2R9T4kZTUpFNctxVN/CmFOOg/QYrdcbhA0XLSKGC/9x4c6yDLh+GMt
+aLMals5QUW+oSgSsf8YQ1FdDPX1jSNzWP3ZCyOUUKSBXWuLMtIjPLBmeBkTA5DkW
+zB5yaLejYe3RBdJ3T7p7Y7rGcqrrJ+K/5ChUoM1Cc6jKpwXEyYyRXvVnihNqv6oV
+0af1+4UsW9FeNrl+Dvu2i8kpFIR8ne5FcCiPBuu0diD0+qSLI0aWMzTlT2rRcKei
+uRl7WEQlE2ADSEpDjnP9UuTaH18KuUq3PKXrqbcLaebzJ52xyY12lSXiCYtIS0yP
+mnkGJgZcYUQxNeNgeecvTejwYXAa4OUoeRT4QM+35CLesw/CUW4Ewgy+HnwOEhIh
+qyNTd/evTUiIvYDCMxGPoWlR57Xyx+ZY2QvTpDacJkfMpGG3MuzX+vItQRbRd0f9
+yz30s/8Uogm3/X7e4jJDfvwpkW28+O/OE/KYkpmwNk735Hg6xv7oYF3+Llixf2vR
+2N1Gv8AxjHjmzqRHqBiEefurNtqEJWBp+GSL5ASNA66XjLe0IVH+1Epo3VjRUwkw
+dsD28SRKTcOyL63SirHQNMfHh1tkd2qyZCBWpEnykwjG08GWHU4rtCp5dSaHNQpP
+q+eK7Ga+MQ5Bm0fd51PUNo25N+i4ik2Z4D+mLsVmocSvXYA5dqMJ3msQXwyTS4JQ
+cWP83A0isejtzH9xoXKIKbxYhOmsLkYvlWNVacKOBSKRlmzr3aFkWCRABnYtAEUq
+jqFIcSQq78jo4dVb0KPTeZy/4c3k3F8fztsdfxdGJZPmGqlEylOC8ORIzhZd4N9F
+BF4uwMQ3RseH0UkvhuiMZbU0p5FpH7+5RTWqyzfjvn9+MJie7S2vTq+SbMBU+klp
+FUamDPatXZT/eH1tHMiSbmev7lQ4aBFfeHkQpeCUZ0PlSUPvJ76uKoGLcAGagOqC
+vsDANM2IoOFDFIfpIAbOaFy0sOwStsMorETgQMKEcDlTdFL9WX4mxjLTO43N4K87
+7hCCWwxxb7/qht7ZjiKQg0hNtmMqFoCIx5MLl+h+Kom0uJMlFaDq3Ln8zFd+xhjQ
+MDEdUV2BksZT/mIXRYrTNO5LI8ZpXaOOl/hHEigV1furijYSPZligcVCvL7z2OHy
+ZtBW7c008Fat38J0Q8OwWD2SdRnZivNbsrxrzEUW0nlUkYYml8OhZ6hEdBFA+1Uh
+NS6UsZufOsfRgLS6+8kujlHWwvBniCyvBPzCUWx0ORRRGqDIFC6rWJAhrSkGEbX5
+R8aSgebeB4x+ON1lYwAif+E08ziupLQBH3Y2KaDh36rnQlHmSmD1XFmvmdTAwm5Y
+HCtnUZgmARxKLuvKqdhTwtOHOVK5VV4lhwsF/Jhr5jjbKnX/YlfeDNNa79AS6P4k
+RikvYTGz7zAkyvcC6eqU3aYO+ahnf6KSROrz5an0Tmxz18bIOnuUlmMZV5/zUvKK
+si/mWwjrtp7b0nQkmtX0xRL15EGQ0NWkEgHAPdbQ6Dj4jjU493qAMrx/HP7JuM8P
+ky1C7W+qVB6w/2Qsh9mfzLzoiYgAyjDuTKLxecbopS1h2TiEWCh/wjcUtORlu7B4
+8l96RkW0MYMgdX7NPXr90WCcdszl5KP369v1XNsY3p+LysQ9/Fbt2e2nTe2eVBPs
+DtSCzyndHTAnvS2Pv39ppEBE023ANwhMof8Gt7vosEIVjLb7nBX4Woy8J3JaPms0
+YUvwrGC09MlOhLwm4AJj/YGYcdgkVcvuqNZ8e6IzU/l0s7vNpJiHxklWRWXQ8jr0
+h58ffWb5mYDFnSd1FbG7nhwdPJd5JBG+tbJEi+ejYe52zYFhmW7LKIh8oT7A6b2y
+ylaF0UD1bBt5qn/+qT8r98txiLqHL1o/sAwMmng1NxL+4F76ie4WJRObc4TrO84G
+vhlLt65XZ7IKeVvTf++vQ3K0ygOy3oiQB0haoFjz6Dj0QloOsM3Fq7jK11BSjYBi
+VcAnmzHgC4SHsJv2YrAbEDW+ULpidGBEW1+f48kp6ITgy1DtimEQuVlynDSOmb+j
+aldOoRHgK96dUC9F/lMQw05VvG5PzuQV7NiMz4j8qjBFnH61/aHCGxI2Kdk/Qv4n
+4egsQ2us9hzjz2pn5xdwVknndfq9owGVqCqsrrlY/ft4go5cmjiCIhn94475hx7b
+wHwrbltM0AZLKHGGPWjHaIezVMh6gKUHdKEJmZBIjPNseRtxzF/BDi/v6BaYxH4H
+ATN3R2k/UXG9q1fzuCHcP79IZnQ9IE2whro4fPh8TQ3S8tIBiUJ4hi1pL1Yw6i4T
+fbF90xlD6y70JSqA2oDpvMeW9kq07D/CChCTw59y9pE64N0DTdb7xm46ckoojTTD
+gOVBXYWdE11fkzTFbIZNAhvJ0FaZP3cxIKfBStZFSIHmgSFfq65Ix5UjCqcwO5mG
+QgcykBz+ZByU8G/0qB2M6LBu5nMk8ph3EIaB8KYrOLX9eHhYJPGEDSxR0FyuIl+F
+Gn3DAGdd+I6HOTlVXHt9Gs2tc6qwcjWRNdjcZG1I5DmIyLgvI9IX63v3PP2ZPZBL
+IZ8YymvjjsWb10ES0q4HPpydOsAJNiS2qGzjFErIWxR7/BcAp30YC+J1l1leRLme
+DbF2744jmFRlYhBCDQ+0iq/2zv3jTy6ysC3RkJK22SVeen5Q3ow4jksd28MPkfwB
+jx7hb9pQTgrpONsEh4htXXX2AaxhJd50q4aVIWSHOMvPXRTNnukDwdsjarh8Xovr
+WnzCTMnWybdjlCbq9bN6xjQx/bUnthuuUMykxJlLShAWwhpE+BoWQeJUHs6iRZUF
+AQivcijfZIEuPFF3UP3x8bLN6empnH1pX+ANIw79RcmC48if2V/1UqAh3lwNsonh
+tm+peuXPeFWTB3UItPERfgI+6Q46n6sbChpLUriF6q+pN2P9qVwdvB0Jb0BCRxxq
+Ejjq2nmD80EBTi6P2C4YfKntreDtDyYNrx8BvyoNP2OILcBVimr1xOYTPj1f2USJ
+JgtGV+eZ8Jauk+eT5Yg3tKDikUcVV9ieeErPhXeuNLONct5pGGCrr8IidKB2EncE
+TWyp9tdBf36/dQKTiYMDqX/ina6pggy+5+Sr83GvscaCvFzZo/M3pyIzI2N/xGSp
+eJXaZOp7NUZ2dmMEY3YgNKlH4CU+kVb6Rd3oeUq7cBomUYb+a/hdA3SArRPOKQ39
+9EsojRCPghqAphggwBECAuvRcakLBKfHd6gKeNMsJxRWNRzIzyZc9fKhCDgSOtBC
+GfnJBRP7rDcjohLnFcNI8VStOiA6V4RwSL5XtWdxzb+crmNNv6Z1kATq0LeOQjQT
+Ace/LY2MWLY32iA8GuoEIzmNgwNMqKSO+MXLwMugO4CmmhErIkGRO2wbUWQcbvzE
+MtC42JoZWtwH7+PJXFMooGd0QqAVusvynQ4A7emA3m2cAFWUDlfahchQZ2TA7Q80
+miVOSmXsEprlpVzDpJ4zp7XNy0xA7atCmeBwOueJV9vBAUmtazj7BXWIS3AQFb+z
+YKCwMQju/HnBPNSy4lwXupbGSekRgInLz/Jx+MuctyQd/OuAsQ8HizrPX7yRX9+D
+wkdRjC7/li2AbddRIE089ELaUCedClo/H2PX+gzuoNwnTnRDYbPjyV5ygXGPS8vM
+c1RmzK0Ndu2lG7sy8pTt1rqXaeFem0Pqf39rrZyO8TLpgiFOakwG6bAC7hoAUNig
+DqjYfhtBJDop4/ycBlquWVA/yFzS0alCaMP3ZraOyLE4U5W0BjzUqh+SKYN/WXpv
+HF7YbPgQi4q+rXOQLJv8LMFVPeG9Og5uswk8nkHAudKVlfNakkqAiZkesLiXBkTD
+L3swX8CqIDYOzHVBi+3V7MzmNfh/RJCmvdRDQWDgokwSabtf9QRIaO2TqoGr6f7x
+oOytoHPjZ6OIYKy1GHxZN2wjc1T/Z6eHso7xHIQXPp7nd3qy3C72MuNujg+ZR0bo
+AhsD3G3XW21iUBdOHMRN7xNImoeepC3YbKrDL4TJd3fliNbK2/vZ4NpVmwusMcJS
+4FfKFAtzgQUPmsUDV9yQXwyRWlVw4MjguEm82d+sStM7rVv4+N+BWR2Y1CGXqWxU
+QNizXe5uFDPNc9fczV+t3G1f10XeBR423dXNjWvSOIZ+I2MMxsJXH9SHTAlzdfyY
+TsiLvcFWu9O/Alhlhtry1qNzESoAbLL99A7LOwZG/L8XhBBEs006onTED8OXpIPh
+GsN8LZHU+MBuXXFoMCElzmuRz3dgfDVLpuD8iz6DnJB04UUEx0KPc9LmaLfTQUNs
+fS84RJEpQArVmtv3VlXu24f6FHexY9G4Z7THxMsfOaXvDL+jkuJyul5ZFyk2LrFh
+MNhnXsCztoOPvriNaCyEGBGdlFN1fvf2GWFKhUnmxqG6xv0flrqYs+xV6WOevlC1
+J8+VXfqqkzJCgldOY+prm8mBcjNNPDkaMoKuYQZ7TQZRCfPN8a01dAwBPmS53tbR
+r6Yr+bIc33VHJF4wW3c7fQ9j6V3Ln2I4aLSOy33rC2KJDCidekJlxbJxFdOJBmjO
+cR78b6Ba8h1x4Puv+Ha2ttJ8Rvta3GcndqZ7hrQgH2dehaz3LK2NCfw8Q3Enhidz
+kf2Ug/nNTyb8Ec6JK1Hq2muDYHCOGUqpiNjVJoW+d/A56fzjGjtybzu8QcxFw6p0
+kTzfKXfkXMPjF3IQsr/uURNKx1/NqgrVD9i5RMtBHR04BuysteRlM2ENQEuomwVD
+fUN47SI9zNBpLluRN3EQmfUQ+KbEFhuCxq5/tvNbDPmO1o61sJC2gDSswoOAos6c
+PkReorOC6Mm2vG7FXoW5iKC3m+PxV0LRLJVDvHYft19Se5uTYxCQgC46/EfuSUZ4
+IMynzHxIRAYyz0D0jBEkc4Ts6mHiggFVvPA+yhgUn0Qo6CdEe/nMNH77kjFpSjTE
+eEw3oW8OHYq9Gh7jMEi5hJ6K2xjQcCbe8DEmdgbs+Uk4UOR4pfalFHpFo1QXBJ2U
+271BIa74bFYOJfW4tS/DFt80hrYyeSw7FkF+QZ6hVZPNshh/8HYJX0gz4gZHqMRg
+fSbCMqrK4hBD0dWF4L+AVymkN6YYr4JIOJELyF2Bb668tZfmMXeejuxK/NZqQIoK
+pq0EkQ5sBz4VCTVE/jUdP110eoO6kkeYDreBAJwVxNfeY1xMT1vo104UyJOM68zy
+0FnJK58tj7PGhYAOvIZaLUMQcId9bvwkiEdlhfGFZ3LuQlX16iwpqaVzZjGY+/Uc
+Z18fIzeoG3ETzD6KUy/xcBJI10oJHuF5r9NExp6tooebLX/SP94nD4DUjspCDS34
+Oy/M0FQu/XzTZ1/AYPa8z/Z6927sebZYKChc89i/cJbnD0edB6xe05ZbV6VkikJN
++WxJXBYOuiJyba+85bKGri0SDcSadSw3ijXqzS1hxR/EL4uGzNqgHh/1KB8NnXQz
+ijODF2wgEl4oMQF3HgCv7MW1xP94+MauLh7aKhJaIpUm8hhvXbAAUdbfXat8LEM8
+5FYnMs1TMm/JjooUeFXfCbVX4z5yaMp1KbbMEnzpNayMo/mBF/+JREBZSrgacNol
+mmbDJJkthfJHkg/ck02e8A==
+`pragma protect end_protected
diff --git a/libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_core/mentor/altera_emif_ddrx_model_per_ping_pong.sv b/libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_core/mentor/altera_emif_ddrx_model_per_ping_pong.sv
new file mode 100644
index 0000000000..e99b010e59
--- /dev/null
+++ b/libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_core/mentor/altera_emif_ddrx_model_per_ping_pong.sv
@@ -0,0 +1,291 @@
+// Copyright (C) 1991-2014 Altera Corporation. All rights reserved.
+// This simulation model contains highly confidential and
+// proprietary information of Altera and is being provided
+// in accordance with and subject to the protections of the
+// applicable Altera Program License Subscription Agreement
+// which governs its use and disclosure. Your use of Altera
+// Corporation's design tools, logic functions and other
+// software and tools, and its AMPP partner logic functions,
+// and any output files any of the foregoing (including device
+// programming or simulation files), and any associated
+// documentation or information are expressly subject to the
+// terms and conditions of the Altera Program License Subscription
+// Agreement, the Altera Quartus II License Agreement, the Altera
+// MegaCore Function License Agreement, or other applicable 
+// license agreement, including, without limitation, that your
+// use is for the sole purpose of simulating designs for use 
+// exclusively in logic devices manufactured by Altera and sold
+// by Altera or its authorized distributors. Please refer to the
+// applicable agreement for further details. Altera products and
+// services are protected under numerous U.S. and foreign patents,
+// maskwork rights, copyrights and other intellectual property laws.
+// Altera assumes no responsibility or liability arising out of the
+// application or use of this simulation model.
+// ACDS 14.1
+// ALTERA_TIMESTAMP:Thu Dec  4 07:39:38 PST 2014
+// encrypted_file_type : mentor_tagged
+`pragma protect begin_protected
+`pragma protect version = 1
+`pragma protect encrypt_agent = "Model Technology", encrypt_agent_info = "DEV-6.6"
+`pragma protect author = "Altera"
+`pragma protect data_method = "aes128-cbc"
+`pragma protect key_keyowner = "MTI" , key_keyname = "MGC-DVT-MTI" , key_method = "rsa"
+`pragma protect key_block encoding = (enctype = "base64", line_length = 64, bytes = 128)
+q3/pUdp1d+/UmYZ1iV1PVJjCRYIPfoOjEywqgWrqC8MU8BxCM1OCax6t1+3bz6X1
+4rJIACZCv4IMG6F4DzMHpYymMWq3zEPb5kdSlTbO3lyoO9FfyABYPd+PnQr/FVUD
+fP3ojHD71NTgus9nA4NpjraWs8U8KMMgw3SxwHkfSq0=
+`pragma protect data_block encoding = (enctype = "base64", line_length = 64, bytes = 12128)
+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
+`pragma protect end_protected
diff --git a/libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_core/mentor/altera_emif_ddrx_model_rank.sv b/libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_core/mentor/altera_emif_ddrx_model_rank.sv
new file mode 100644
index 0000000000..2fc44b9b68
--- /dev/null
+++ b/libraries/technology/ip_arria10/ddr4_mem_model_141/sim/ddr4_core/mentor/altera_emif_ddrx_model_rank.sv
@@ -0,0 +1,1423 @@
+// Copyright (C) 1991-2014 Altera Corporation. All rights reserved.
+// This simulation model contains highly confidential and
+// proprietary information of Altera and is being provided
+// in accordance with and subject to the protections of the
+// applicable Altera Program License Subscription Agreement
+// which governs its use and disclosure. Your use of Altera
+// Corporation's design tools, logic functions and other
+// software and tools, and its AMPP partner logic functions,
+// and any output files any of the foregoing (including device
+// programming or simulation files), and any associated
+// documentation or information are expressly subject to the
+// terms and conditions of the Altera Program License Subscription
+// Agreement, the Altera Quartus II License Agreement, the Altera
+// MegaCore Function License Agreement, or other applicable 
+// license agreement, including, without limitation, that your
+// use is for the sole purpose of simulating designs for use 
+// exclusively in logic devices manufactured by Altera and sold
+// by Altera or its authorized distributors. Please refer to the
+// applicable agreement for further details. Altera products and
+// services are protected under numerous U.S. and foreign patents,
+// maskwork rights, copyrights and other intellectual property laws.
+// Altera assumes no responsibility or liability arising out of the
+// application or use of this simulation model.
+// ACDS 14.1
+// ALTERA_TIMESTAMP:Thu Dec  4 07:39:38 PST 2014
+// encrypted_file_type : mentor_tagged
+`pragma protect begin_protected
+`pragma protect version = 1
+`pragma protect encrypt_agent = "Model Technology", encrypt_agent_info = "DEV-6.6"
+`pragma protect author = "Altera"
+`pragma protect data_method = "aes128-cbc"
+`pragma protect key_keyowner = "MTI" , key_keyname = "MGC-DVT-MTI" , key_method = "rsa"
+`pragma protect key_block encoding = (enctype = "base64", line_length = 64, bytes = 128)
+DeMrN1hDh8bbGr3wk+HPO79gHcDYx3L+odQTIsjdWiGOWrcG55OZMGL8UY0Yi/QR
+mPFkok1/6+T8TM70lTeYK0p/p7Mctjdnyqd/gBFfjbyVNi3OxC5Fn+EQk8Umm7aj
+u1KfGQG+ddiNB6Y0cvXxHts3VZ0WHfGhTAJsOgAJAT4=
+`pragma protect data_block encoding = (enctype = "base64", line_length = 64, bytes = 66480)
+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
+`pragma protect end_protected
-- 
GitLab