From e4f477395c3e70c7d69eb6ecfb76e0889b9b2571 Mon Sep 17 00:00:00 2001 From: Reinier van der Walle <walle@astron.nl> Date: Tue, 22 Nov 2022 11:04:04 +0100 Subject: [PATCH] added unb2c_test_ddr_16G revision --- .../revisions/unb2c_test_ddr_16G/hdllib.cfg | 118 ++++++++++++++++ .../quartus/unb2c_test_ddr_16G_pins.tcl | 23 ++++ .../tb_unb2c_test_ddr_16G.vhd | 38 +++++ .../unb2c_test_ddr_16G/unb2c_test_ddr_16G.vhd | 130 ++++++++++++++++++ .../unb2c_test/src/vhdl/unb2c_test.vhd | 2 +- .../unb2c_test/src/vhdl/unb2c_test_pkg.vhd | 2 + .../technology/ddr/tech_ddr_arria10_e2sg.vhd | 42 ++++-- libraries/technology/ddr/tech_ddr_pkg.vhd | 81 +++++++---- .../compile_ip.tcl | 8 ++ 9 files changed, 405 insertions(+), 39 deletions(-) create mode 100644 boards/uniboard2c/designs/unb2c_test/revisions/unb2c_test_ddr_16G/hdllib.cfg create mode 100644 boards/uniboard2c/designs/unb2c_test/revisions/unb2c_test_ddr_16G/quartus/unb2c_test_ddr_16G_pins.tcl create mode 100644 boards/uniboard2c/designs/unb2c_test/revisions/unb2c_test_ddr_16G/tb_unb2c_test_ddr_16G.vhd create mode 100644 boards/uniboard2c/designs/unb2c_test/revisions/unb2c_test_ddr_16G/unb2c_test_ddr_16G.vhd diff --git a/boards/uniboard2c/designs/unb2c_test/revisions/unb2c_test_ddr_16G/hdllib.cfg b/boards/uniboard2c/designs/unb2c_test/revisions/unb2c_test_ddr_16G/hdllib.cfg new file mode 100644 index 0000000000..8bfa13f652 --- /dev/null +++ b/boards/uniboard2c/designs/unb2c_test/revisions/unb2c_test_ddr_16G/hdllib.cfg @@ -0,0 +1,118 @@ +hdl_lib_name = unb2c_test_ddr_16G +hdl_library_clause_name = unb2c_test_ddr_16G_lib +hdl_lib_uses_synth = common mm technology unb2c_board unb2c_test +hdl_lib_uses_sim = +hdl_lib_technology = ip_arria10_e2sg +hdl_lib_include_ip = + # Comment all IP that is not used in this design + # DDR memory + ip_arria10_e2sg_ddr4_8g_1600 + +synth_files = + unb2c_test_ddr_16G.vhd + +test_bench_files = + tb_unb2c_test_ddr_16G.vhd + +regression_test_vhdl = + tb_unb2c_test_ddr_16G.vhd + + +[modelsim_project_file] +modelsim_copy_files = + ../../src/hex hex + + +[quartus_project_file] +synth_top_level_entity = + +quartus_copy_files = + quartus . + ../../quartus . + ../../src/hex hex + +quartus_qsf_files = + $RADIOHDL_WORK/boards/uniboard2c/libraries/unb2c_board/quartus/unb2c_board.qsf + +quartus_sdc_pre_files = + quartus/unb2c_test_ddr_16G.sdc + $RADIOHDL_WORK/boards/uniboard2c/libraries/unb2c_board/quartus/unb2c_board_pre.sdc + +quartus_sdc_files = + $RADIOHDL_WORK/boards/uniboard2c/libraries/unb2c_board/quartus/unb2c_board.sdc + +quartus_tcl_files = + quartus/unb2c_test_ddr_16G_pins.tcl + +quartus_vhdl_files = + +quartus_qip_files = + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/qsys_unb2c_test/qsys_unb2c_test.qip + +quartus_ip_files = + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_avs2_eth_coe_0.ip + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_avs2_eth_coe_1.ip + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_clk_0.ip + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_jesd204b.ip + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_jtag_uart_0.ip + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_nios2_gen2_0.ip + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_onchip_memory2_0.ip + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_pio_jesd_ctrl.ip + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_pio_pps.ip + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_pio_system_info.ip + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_pio_wdi.ip + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_ram_diag_bg_10gbe.ip + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_ram_diag_data_buffer_10gbe.ip + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_ram_diag_data_buffer_bsn.ip + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_ram_diag_data_buffer_ddr_MB_II.ip + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_ram_diag_data_buffer_ddr_MB_I.ip + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_ram_scrap.ip + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_reg_bsn_monitor_10GbE.ip + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_reg_bsn_monitor_input.ip + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_reg_bsn_scheduler.ip + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_reg_bsn_source.ip + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_reg_diag_bg_10gbe.ip + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_reg_diag_data_buffer_10gbe.ip + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_reg_diag_data_buffer_bsn.ip + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_reg_diag_data_buffer_ddr_MB_II.ip + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_reg_diag_data_buffer_ddr_MB_I.ip + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_reg_diag_rx_seq_10gbe.ip + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_reg_diag_rx_seq_ddr_MB_II.ip + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_reg_diag_rx_seq_ddr_MB_I.ip + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_reg_diag_tx_seq_10gbe.ip + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_reg_diag_tx_seq_ddr_MB_II.ip + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_reg_diag_tx_seq_ddr_MB_I.ip + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_reg_dpmm_ctrl.ip + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_reg_dpmm_data.ip + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_reg_epcs.ip + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_reg_eth10g_back0.ip + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_reg_eth10g_back1.ip + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_reg_eth10g_qsfp_ring.ip + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_reg_fpga_temp_sens.ip + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_reg_fpga_voltage_sens.ip + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_reg_heater.ip + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_reg_io_ddr_MB_II.ip + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_reg_io_ddr_MB_I.ip + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_reg_mmdp_ctrl.ip + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_reg_mmdp_data.ip + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_reg_remu.ip + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_reg_tr_10GbE_back0.ip + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_reg_tr_10GbE_back1.ip + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_reg_tr_10GbE_qsfp_ring.ip + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_reg_wdi.ip + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_rom_system_info.ip + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_timer_0.ip + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_reg_eth1g_I_bg_ctrl.ip + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_reg_eth1g_I_hdr_dat.ip + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_reg_eth1g_I_bsn_monitor_v2_tx.ip + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_reg_eth1g_I_strobe_total_count_tx.ip + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_reg_eth1g_I_bsn_monitor_v2_rx.ip + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_reg_eth1g_I_strobe_total_count_rx.ip + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_reg_eth1g_II_bg_ctrl.ip + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_reg_eth1g_II_hdr_dat.ip + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_reg_eth1g_II_bsn_monitor_v2_tx.ip + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_reg_eth1g_II_bsn_monitor_v2_rx.ip + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_reg_eth1g_II_strobe_total_count_tx.ip + $RADIOHDL_BUILD_DIR/unb2c/quartus/unb2c_test_ddr_16G/ip/qsys_unb2c_test/qsys_unb2c_test_reg_eth1g_II_strobe_total_count_rx.ip + +nios2_app_userflags = -DCOMPILE_FOR_GEN2_UNB2 diff --git a/boards/uniboard2c/designs/unb2c_test/revisions/unb2c_test_ddr_16G/quartus/unb2c_test_ddr_16G_pins.tcl b/boards/uniboard2c/designs/unb2c_test/revisions/unb2c_test_ddr_16G/quartus/unb2c_test_ddr_16G_pins.tcl new file mode 100644 index 0000000000..e659f0faff --- /dev/null +++ b/boards/uniboard2c/designs/unb2c_test/revisions/unb2c_test_ddr_16G/quartus/unb2c_test_ddr_16G_pins.tcl @@ -0,0 +1,23 @@ +############################################################################### +# +# Copyright (C) 2014 +# ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.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/>. +# +############################################################################### + +source $::env(RADIOHDL_WORK)/boards/uniboard2c/libraries/unb2c_board/quartus/pinning/unb2c_minimal_pins.tcl +source $::env(RADIOHDL_WORK)/boards/uniboard2c/libraries/unb2c_board/quartus/pinning/unb2c_ddr_pins.tcl diff --git a/boards/uniboard2c/designs/unb2c_test/revisions/unb2c_test_ddr_16G/tb_unb2c_test_ddr_16G.vhd b/boards/uniboard2c/designs/unb2c_test/revisions/unb2c_test_ddr_16G/tb_unb2c_test_ddr_16G.vhd new file mode 100644 index 0000000000..e10c278e6e --- /dev/null +++ b/boards/uniboard2c/designs/unb2c_test/revisions/unb2c_test_ddr_16G/tb_unb2c_test_ddr_16G.vhd @@ -0,0 +1,38 @@ +------------------------------------------------------------------------------- +-- +-- 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/>. +-- +------------------------------------------------------------------------------- + +LIBRARY IEEE, unb2c_test_lib; +USE IEEE.std_logic_1164.ALL; + + +ENTITY tb_unb2c_test_ddr_16G IS +END tb_unb2c_test_ddr_16G; + + +ARCHITECTURE tb OF tb_unb2c_test_ddr_16G IS +BEGIN + u_tb_unb2c_test : ENTITY unb2c_test_lib.tb_unb2c_test + GENERIC MAP ( + g_design_name => "unb2c_test_ddr_16G" + ); +END tb; + diff --git a/boards/uniboard2c/designs/unb2c_test/revisions/unb2c_test_ddr_16G/unb2c_test_ddr_16G.vhd b/boards/uniboard2c/designs/unb2c_test/revisions/unb2c_test_ddr_16G/unb2c_test_ddr_16G.vhd new file mode 100644 index 0000000000..3080e83b78 --- /dev/null +++ b/boards/uniboard2c/designs/unb2c_test/revisions/unb2c_test_ddr_16G/unb2c_test_ddr_16G.vhd @@ -0,0 +1,130 @@ +------------------------------------------------------------------------------- +-- +-- 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/>. +-- +------------------------------------------------------------------------------- + +LIBRARY IEEE, common_lib, unb2c_board_lib, unb2c_test_lib, technology_lib, tech_ddr_lib; +USE IEEE.STD_LOGIC_1164.ALL; +USE IEEE.NUMERIC_STD.ALL; +USE common_lib.common_pkg.ALL; +USE unb2c_board_lib.unb2c_board_pkg.ALL; +USE technology_lib.technology_pkg.ALL; +USE tech_ddr_lib.tech_ddr_pkg.ALL; + + +ENTITY unb2c_test_ddr_16G IS + GENERIC ( + g_design_name : STRING := "unb2c_test_ddr_16G"; + g_design_note : STRING := "DDR: MB I and II"; + g_sim : BOOLEAN := FALSE; --Overridden by TB + g_sim_unb_nr : NATURAL := 0; + g_sim_node_nr : NATURAL := 0; + g_stamp_date : NATURAL := 0; -- Date (YYYYMMDD) -- set by QSF + g_stamp_time : NATURAL := 0; -- Time (HHMMSS) -- set by QSF + g_revision_id : STRING := "" -- revision ID -- set by QSF + ); + PORT ( + -- GENERAL + CLK : IN STD_LOGIC; -- System Clock + PPS : IN STD_LOGIC; -- System Sync + WDI : OUT STD_LOGIC; -- Watchdog Clear + INTA : INOUT STD_LOGIC; -- FPGA interconnect line + INTB : INOUT STD_LOGIC; -- FPGA interconnect line + + -- Others + VERSION : IN STD_LOGIC_VECTOR(c_unb2c_board_aux.version_w-1 DOWNTO 0); + ID : IN STD_LOGIC_VECTOR(c_unb2c_board_aux.id_w-1 DOWNTO 0); + TESTIO : INOUT STD_LOGIC_VECTOR(c_unb2c_board_aux.testio_w-1 DOWNTO 0); + + + -- 1GbE Control Interface + ETH_CLK : IN STD_LOGIC_VECTOR(c_unb2c_board_nof_eth-1 DOWNTO 0); + ETH_SGIN : IN STD_LOGIC_VECTOR(c_unb2c_board_nof_eth-1 DOWNTO 0); + ETH_SGOUT : OUT STD_LOGIC_VECTOR(c_unb2c_board_nof_eth-1 DOWNTO 0); + + -- DDR reference clocks + MB_I_REF_CLK : IN STD_LOGIC; -- Reference clock for MB_I + MB_II_REF_CLK : IN STD_LOGIC; -- Reference clock for MB_II + + -- SO-DIMM Memory Bank I + MB_I_IN : IN t_tech_ddr4_phy_in; + MB_I_IO : INOUT t_tech_ddr4_phy_io; + MB_I_OU : OUT t_tech_ddr4_phy_ou; + + -- SO-DIMM Memory Bank II + MB_II_IN : IN t_tech_ddr4_phy_in; + MB_II_IO : INOUT t_tech_ddr4_phy_io; + MB_II_OU : OUT t_tech_ddr4_phy_ou; + + QSFP_LED : OUT STD_LOGIC_VECTOR(c_unb2c_board_tr_qsfp_nof_leds-1 DOWNTO 0) + ); +END unb2c_test_ddr_16G; + + +ARCHITECTURE str OF unb2c_test_ddr_16G IS + +BEGIN + u_revision : ENTITY unb2c_test_lib.unb2c_test + GENERIC MAP ( + g_design_name => g_design_name, + g_design_note => g_design_note, + g_sim => g_sim, + g_sim_unb_nr => g_sim_unb_nr, + g_sim_node_nr => g_sim_node_nr, + g_stamp_date => g_stamp_date, + g_stamp_time => g_stamp_time, + g_revision_id => g_revision_id + ) + PORT MAP ( + -- GENERAL + CLK => CLK, + PPS => PPS, + WDI => WDI, + INTA => INTA, + INTB => INTB, + + -- Others + VERSION => VERSION, + ID => ID, + TESTIO => TESTIO, + + + -- 1GbE Control Interface + ETH_clk => ETH_clk, + ETH_SGIN => ETH_SGIN, + ETH_SGOUT => ETH_SGOUT, + + -- DDR reference clocks + MB_I_REF_CLK => MB_I_REF_CLK, + MB_II_REF_CLK => MB_II_REF_CLK, + + -- SO-DIMM Memory Bank I + MB_I_IN => MB_I_IN, + MB_I_IO => MB_I_IO, + MB_I_OU => MB_I_OU, + + -- SO-DIMM Memory Bank II + MB_II_IN => MB_II_IN, + MB_II_IO => MB_II_IO, + MB_II_OU => MB_II_OU, + + QSFP_LED => QSFP_LED + ); +END str; diff --git a/boards/uniboard2c/designs/unb2c_test/src/vhdl/unb2c_test.vhd b/boards/uniboard2c/designs/unb2c_test/src/vhdl/unb2c_test.vhd index 8f3ed66cbf..82df8854f7 100644 --- a/boards/uniboard2c/designs/unb2c_test/src/vhdl/unb2c_test.vhd +++ b/boards/uniboard2c/designs/unb2c_test/src/vhdl/unb2c_test.vhd @@ -180,7 +180,7 @@ ARCHITECTURE str OF unb2c_test IS -- ddr CONSTANT c_ddr_ctlr_data_w : NATURAL := func_tech_ddr_ctlr_data_w(c_ddr_MB_I); -- = 576, assume both MB_I and MB_II use the same ctlr_data_w - CONSTANT c_ddr_dp_data_w : NATURAL := 144; -- DDR4 with dq_w = 72, rsl = 8 so ctrl data width = 576 and therefore the mixed width FIFO ratio is 576 /144 = 4 + CONSTANT c_ddr_dp_data_w : NATURAL := c_ddr_ctlr_data_w / 4; -- DDR4 with dq_w = 72, rsl = 8 so ctrl data width = 576 and therefore the mixed width FIFO ratio is 576 /144 = 4 CONSTANT c_ddr_dp_seq_dat_w : NATURAL := 16; -- >= 1, test sequence data width. Choose c_ddr_dp_seq_dat_w <= c_ddr_dp_data_w. The seq data gets replicated to fill c_ddr_dp_data_w. CONSTANT c_ddr_dp_wr_fifo_depth : NATURAL := 256 * (c_ddr_ctlr_data_w/c_ddr_dp_data_w); -- defined at DP side of the FIFO, choose 256 * (ctrl_data_w/g_dp_data_w) to make full use of M9K which have at least 256 words CONSTANT c_ddr_dp_rd_fifo_depth : NATURAL := 256 * (c_ddr_ctlr_data_w/c_ddr_dp_data_w); -- defined at DP side of the FIFO, choose 256 * (ctrl_data_w/g_dp_data_w) or factors of 2 more to fit max number of read bursts diff --git a/boards/uniboard2c/designs/unb2c_test/src/vhdl/unb2c_test_pkg.vhd b/boards/uniboard2c/designs/unb2c_test/src/vhdl/unb2c_test_pkg.vhd index 59c3a9e1ca..e4509f19e3 100644 --- a/boards/uniboard2c/designs/unb2c_test/src/vhdl/unb2c_test_pkg.vhd +++ b/boards/uniboard2c/designs/unb2c_test/src/vhdl/unb2c_test_pkg.vhd @@ -81,6 +81,7 @@ PACKAGE unb2c_test_pkg IS CONSTANT c_test_10GbE : t_unb2c_test_config := (FALSE, TRUE, TRUE, TRUE, TRUE,FALSE,FALSE,FALSE,FALSE,FALSE,c_tech_ddr4_8g_1600m, c_tech_ddr4_8g_1600m); CONSTANT c_test_10GbE_qb : t_unb2c_test_config := (FALSE, TRUE, TRUE, TRUE,FALSE, TRUE,FALSE,FALSE,FALSE,FALSE,c_tech_ddr4_8g_1600m, c_tech_ddr4_8g_1600m); CONSTANT c_test_ddr : t_unb2c_test_config := (FALSE, TRUE, TRUE,FALSE,FALSE,FALSE,FALSE, TRUE, TRUE,FALSE,c_tech_ddr4_8g_1600m, c_tech_ddr4_8g_1600m); + CONSTANT c_test_ddr_16G : t_unb2c_test_config := (FALSE, TRUE, TRUE,FALSE,FALSE,FALSE,FALSE, TRUE, TRUE,FALSE,c_tech_ddr4_16g_1600m_72_64, c_tech_ddr4_16g_1600m_72_64); CONSTANT c_test_heater : t_unb2c_test_config := (FALSE, TRUE, TRUE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE, TRUE,c_tech_ddr4_8g_1600m, c_tech_ddr4_8g_1600m); CONSTANT c_test_jesd204b : t_unb2c_test_config := (FALSE, TRUE, TRUE,FALSE,FALSE,FALSE, TRUE,FALSE,FALSE,FALSE,c_tech_ddr4_8g_1600m, c_tech_ddr4_8g_1600m); @@ -97,6 +98,7 @@ PACKAGE BODY unb2c_test_pkg IS BEGIN IF g_design_name = "unb2c_test_10GbE" THEN RETURN c_test_10GbE; ELSIF g_design_name = "unb2c_test_ddr" THEN RETURN c_test_ddr; + ELSIF g_design_name = "unb2c_test_ddr_16G" THEN RETURN c_test_ddr_16G; ELSIF g_design_name = "unb2c_test_heater" THEN RETURN c_test_heater; ELSIF g_design_name = "unb2c_test_jesd204b" THEN RETURN c_test_jesd204b; ELSE RETURN c_test_minimal; diff --git a/libraries/technology/ddr/tech_ddr_arria10_e2sg.vhd b/libraries/technology/ddr/tech_ddr_arria10_e2sg.vhd index d936bdc4b7..5b6f289157 100644 --- a/libraries/technology/ddr/tech_ddr_arria10_e2sg.vhd +++ b/libraries/technology/ddr/tech_ddr_arria10_e2sg.vhd @@ -76,6 +76,7 @@ ARCHITECTURE str OF tech_ddr_arria10_e2sg IS CONSTANT c_gigabytes : NATURAL := func_tech_ddr_module_size(g_tech_ddr); CONSTANT c_ctlr_address_w : NATURAL := func_tech_ddr_ctlr_address_w(g_tech_ddr); + CONSTANT c_ctlr_ip_data_w : NATURAL := func_tech_ddr_ctlr_ip_data_w(g_tech_ddr); CONSTANT c_ctlr_data_w : NATURAL := func_tech_ddr_ctlr_data_w( g_tech_ddr); SIGNAL i_ctlr_gen_clk : STD_LOGIC; @@ -85,6 +86,10 @@ ARCHITECTURE str OF tech_ddr_arria10_e2sg IS SIGNAL local_cal_success : STD_LOGIC; SIGNAL local_cal_fail : STD_LOGIC; + SIGNAL amm_readdata : STD_LOGIC_VECTOR(c_ctlr_ip_data_w-1 DOWNTO 0) := (OTHERS => '0'); + SIGNAL amm_writedata : STD_LOGIC_VECTOR(c_ctlr_ip_data_w-1 DOWNTO 0) := (OTHERS => '0'); + + BEGIN ctlr_gen_clk <= i_ctlr_gen_clk; @@ -101,8 +106,8 @@ BEGIN amm_read_0 => ctlr_mosi.rd, -- .read amm_write_0 => ctlr_mosi.wr, -- .write amm_address_0 => ctlr_mosi.address(c_ctlr_address_w-1 DOWNTO 0), -- .address - amm_readdata_0 => ctlr_miso.rddata(c_ctlr_data_w-1 DOWNTO 0), -- .readdata - amm_writedata_0 => ctlr_mosi.wrdata(c_ctlr_data_w-1 DOWNTO 0), -- .writedata + amm_readdata_0 => ctlr_miso.rddata(c_ctlr_ip_data_w-1 DOWNTO 0), -- .readdata + amm_writedata_0 => ctlr_mosi.wrdata(c_ctlr_ip_data_w-1 DOWNTO 0), -- .writedata amm_burstcount_0 => ctlr_mosi.burstsize(g_tech_ddr.maxburstsize_w-1 DOWNTO 0), -- .burstcount amm_byteenable_0 => (OTHERS=>'1'), -- .byteenable amm_readdatavalid_0 => ctlr_miso.rdval, -- .readdatavalid @@ -155,8 +160,8 @@ BEGIN amm_read_0 => ctlr_mosi.rd, -- .read amm_write_0 => ctlr_mosi.wr, -- .write amm_address_0 => ctlr_mosi.address(c_ctlr_address_w-1 DOWNTO 0), -- .address - amm_readdata_0 => ctlr_miso.rddata(c_ctlr_data_w-1 DOWNTO 0), -- .readdata - amm_writedata_0 => ctlr_mosi.wrdata(c_ctlr_data_w-1 DOWNTO 0), -- .writedata + amm_readdata_0 => ctlr_miso.rddata(c_ctlr_ip_data_w-1 DOWNTO 0), -- .readdata + amm_writedata_0 => ctlr_mosi.wrdata(c_ctlr_ip_data_w-1 DOWNTO 0), -- .writedata amm_burstcount_0 => ctlr_mosi.burstsize(g_tech_ddr.maxburstsize_w-1 DOWNTO 0), -- .burstcount amm_byteenable_0 => (OTHERS=>'1'), -- .byteenable amm_readdatavalid_0 => ctlr_miso.rdval, -- .readdatavalid @@ -209,8 +214,8 @@ BEGIN amm_read_0 => ctlr_mosi.rd, -- .read amm_write_0 => ctlr_mosi.wr, -- .write amm_address_0 => ctlr_mosi.address(c_ctlr_address_w-1 DOWNTO 0), -- .address - amm_readdata_0 => ctlr_miso.rddata(c_ctlr_data_w-1 DOWNTO 0), -- .readdata - amm_writedata_0 => ctlr_mosi.wrdata(c_ctlr_data_w-1 DOWNTO 0), -- .writedata + amm_readdata_0 => ctlr_miso.rddata(c_ctlr_ip_data_w-1 DOWNTO 0), -- .readdata + amm_writedata_0 => ctlr_mosi.wrdata(c_ctlr_ip_data_w-1 DOWNTO 0), -- .writedata amm_burstcount_0 => ctlr_mosi.burstsize(g_tech_ddr.maxburstsize_w-1 DOWNTO 0), -- .burstcount amm_byteenable_0 => (OTHERS=>'1'), -- .byteenable amm_readdatavalid_0 => ctlr_miso.rdval, -- .readdatavalid @@ -263,8 +268,8 @@ BEGIN amm_read_0 => ctlr_mosi.rd, -- .read amm_write_0 => ctlr_mosi.wr, -- .write amm_address_0 => ctlr_mosi.address(c_ctlr_address_w-1 DOWNTO 0), -- .address - amm_readdata_0 => ctlr_miso.rddata(c_ctlr_data_w-1 DOWNTO 0), -- .readdata - amm_writedata_0 => ctlr_mosi.wrdata(c_ctlr_data_w-1 DOWNTO 0), -- .writedata + amm_readdata_0 => amm_readdata, -- .readdata + amm_writedata_0 => amm_writedata, -- .writedata amm_burstcount_0 => ctlr_mosi.burstsize(g_tech_ddr.maxburstsize_w-1 DOWNTO 0), -- .burstcount amm_byteenable_0 => (OTHERS=>'1'), -- .byteenable amm_readdatavalid_0 => ctlr_miso.rdval, -- .readdatavalid @@ -301,10 +306,25 @@ BEGIN --local_init_done => ctlr_miso.done, -- status.local_init_done -- local_init_done = ctlr_init_done originally and mapped to ctlr_miso.done for the DDR3 IP. For the DDR4 IP the local_cal_success and -- NOT local_cal_fail seem to serve as local_init_done + + gen_rewire_data : IF g_tech_ddr.mem_dq_w < g_tech_ddr.dq_w GENERATE -- Used when 64 bit modules are used in unb2c slot II as it only supports 72 bit IP (not 64 bit IP). + ctlr_miso.rddata(c_ctlr_data_w-1 DOWNTO 0) <= func_tech_ddr_rewire_72b_to_64b(g_tech_ddr, amm_readdata); + amm_writedata <= func_tech_ddr_rewire_64b_to_72b(g_tech_ddr, ctlr_mosi.wrdata(c_ctlr_data_w-1 DOWNTO 0)); - ctlr_miso.done <= local_cal_success AND NOT local_cal_fail WHEN rising_edge(i_ctlr_gen_clk); - ctlr_miso.cal_ok <= local_cal_success; - ctlr_miso.cal_fail <= local_cal_fail; + ctlr_miso.done <= '1'; + ctlr_miso.cal_ok <= '1'; + ctlr_miso.cal_fail <= '0'; + END GENERATE; + + + gen_no_rewire_data : IF g_tech_ddr.mem_dq_w = g_tech_ddr.dq_w GENERATE + ctlr_miso.rddata(c_ctlr_ip_data_w-1 DOWNTO 0) <= amm_readdata; + amm_writedata <= ctlr_mosi.wrdata(c_ctlr_ip_data_w-1 DOWNTO 0); + + ctlr_miso.done <= local_cal_success AND NOT local_cal_fail WHEN rising_edge(i_ctlr_gen_clk); + ctlr_miso.cal_ok <= local_cal_success; + ctlr_miso.cal_fail <= local_cal_fail; + END GENERATE; END GENERATE; diff --git a/libraries/technology/ddr/tech_ddr_pkg.vhd b/libraries/technology/ddr/tech_ddr_pkg.vhd index 7901807560..894e988782 100644 --- a/libraries/technology/ddr/tech_ddr_pkg.vhd +++ b/libraries/technology/ddr/tech_ddr_pkg.vhd @@ -57,6 +57,7 @@ PACKAGE tech_ddr_pkg IS command_queue_depth : NATURAL; -- = 8 maxburstsize : NATURAL; -- = 64 maxburstsize_w : NATURAL; -- = 7 = ceil_log2(maxburstsize+1) + mem_dq_w : NATURAL; -- = 64 dq connected to the memory module, can be = dq_w or 64 whenn dq_w = 72 END RECORD; FUNCTION func_tech_sel_ddr(g_technology : NATURAL; g_ddr3, g_ddr4 : t_c_tech_ddr) RETURN t_c_tech_ddr; -- Select DDR3 or DDR4 dependent on the technology @@ -65,43 +66,46 @@ PACKAGE tech_ddr_pkg IS FUNCTION func_tech_ddr_dq_address_w( c_ddr : t_c_tech_ddr) RETURN NATURAL; -- return DDR address width for the DQ data at the PHY mts rate FUNCTION func_tech_ddr_ctlr_address_w(c_ddr : t_c_tech_ddr) RETURN NATURAL; -- return DDR address width for the controller data at the by rsl=4 reduced rate FUNCTION func_tech_ddr_ctlr_data_w( c_ddr : t_c_tech_ddr) RETURN NATURAL; -- return DDR data width for the controller data at the by rsl=4 reduced rate + FUNCTION func_tech_ddr_ctlr_ip_data_w(c_ddr : t_c_tech_ddr) RETURN NATURAL; -- return DDR data width for the controller data at the by rsl=4 reduced rate FUNCTION func_tech_ddr_module_size( c_ddr : t_c_tech_ddr) RETURN NATURAL; -- return DDR module size in GByte FUNCTION func_tech_ddr_sim_size(c_ddr : t_c_tech_ddr; sim_ctrl_addr_w : NATURAL) RETURN t_c_tech_ddr; -- derive sim_ddr from c_ddr (or alternatively use predefined c_tech_ddr*_sim) + FUNCTION func_tech_ddr_rewire_64b_to_72b(c_ddr : t_c_tech_ddr; vec_64b : STD_LOGIC_VECTOR) RETURN STD_LOGIC_VECTOR; + FUNCTION func_tech_ddr_rewire_72b_to_64b(c_ddr : t_c_tech_ddr; vec_72b : STD_LOGIC_VECTOR) RETURN STD_LOGIC_VECTOR; -- a a cs cs - -- name mts master rank a row col ba dq dqs dm dbi bg ck cke w w_w odt term rsl rsl_w cqd burst burst_w - CONSTANT c_tech_ddr3_max : t_c_tech_ddr := ("none", 800, TRUE, "DUAL ", 16, 16, 11, 3, 64, 8, 8, 0, 0, 2, 2, 2, 1, 2, 14, 4, 2, 4, 64, 7); -- maximum ranges for record field definitions + -- name mts master rank a row col ba dq dqs dm dbi bg ck cke w w_w odt term rsl rsl_w cqd burst burst_w mem_dq_w + CONSTANT c_tech_ddr3_max : t_c_tech_ddr := ("none", 800, TRUE, "DUAL ", 16, 16, 11, 3, 64, 8, 8, 0, 0, 2, 2, 2, 1, 2, 14, 4, 2, 4, 64, 7, 64); -- maximum ranges for record field definitions -- use predefined c_tech_ddr3_sim or derive it using func_tech_ddr_sim_size() - CONSTANT c_tech_ddr3_sim_8k : t_c_tech_ddr := ("DDR3", 800, TRUE, "DUAL ", 10, 1, 10, 3, 64, 8, 8, 0, 0, 2, 2, 2, 1, 2, 14, 4, 2, 4, 64, 7); -- use a_row to set nof ctrl addr = 2**(cs_w + ba + a_row + a_col - rsl_w) - CONSTANT c_tech_ddr3_sim_16k : t_c_tech_ddr := ("DDR3", 800, TRUE, "DUAL ", 10, 2, 10, 3, 64, 8, 8, 0, 0, 2, 2, 2, 1, 2, 14, 4, 2, 4, 64, 7); -- use a_row to set nof ctrl addr = 2**(cs_w + ba + a_row + a_col - rsl_w) - CONSTANT c_tech_ddr3_sim_128k : t_c_tech_ddr := ("DDR3", 800, TRUE, "DUAL ", 10, 5, 10, 3, 64, 8, 8, 0, 0, 2, 2, 2, 1, 2, 14, 4, 2, 4, 64, 7); -- use a_row to set nof ctrl addr = 2**(cs_w + ba + a_row + a_col - rsl_w) - CONSTANT c_tech_ddr3_sim_1m : t_c_tech_ddr := ("DDR3", 800, TRUE, "DUAL ", 10, 8, 10, 3, 64, 8, 8, 0, 0, 2, 2, 2, 1, 2, 14, 4, 2, 4, 64, 7); -- use a_row to set nof ctrl addr = 2**(cs_w + ba + a_row + a_col - rsl_w) + CONSTANT c_tech_ddr3_sim_8k : t_c_tech_ddr := ("DDR3", 800, TRUE, "DUAL ", 10, 1, 10, 3, 64, 8, 8, 0, 0, 2, 2, 2, 1, 2, 14, 4, 2, 4, 64, 7, 64); -- use a_row to set nof ctrl addr = 2**(cs_w + ba + a_row + a_col - rsl_w) + CONSTANT c_tech_ddr3_sim_16k : t_c_tech_ddr := ("DDR3", 800, TRUE, "DUAL ", 10, 2, 10, 3, 64, 8, 8, 0, 0, 2, 2, 2, 1, 2, 14, 4, 2, 4, 64, 7, 64); -- use a_row to set nof ctrl addr = 2**(cs_w + ba + a_row + a_col - rsl_w) + CONSTANT c_tech_ddr3_sim_128k : t_c_tech_ddr := ("DDR3", 800, TRUE, "DUAL ", 10, 5, 10, 3, 64, 8, 8, 0, 0, 2, 2, 2, 1, 2, 14, 4, 2, 4, 64, 7, 64); -- use a_row to set nof ctrl addr = 2**(cs_w + ba + a_row + a_col - rsl_w) + CONSTANT c_tech_ddr3_sim_1m : t_c_tech_ddr := ("DDR3", 800, TRUE, "DUAL ", 10, 8, 10, 3, 64, 8, 8, 0, 0, 2, 2, 2, 1, 2, 14, 4, 2, 4, 64, 7, 64); -- use a_row to set nof ctrl addr = 2**(cs_w + ba + a_row + a_col - rsl_w) - CONSTANT c_tech_ddr3_16g_dual_rank_800m : t_c_tech_ddr := ("DDR3", 800, TRUE, "DUAL ", 16, 16, 11, 3, 64, 8, 8, 0, 0, 2, 2, 2, 1, 2, 14, 4, 2, 4, 64, 7); - CONSTANT c_tech_ddr3_4g_800m_master : t_c_tech_ddr := ("DDR3", 800, TRUE, "DUAL ", 15, 15, 10, 3, 64, 8, 8, 0, 0, 2, 2, 2, 1, 2, 14, 4, 2, 4, 64, 7); - CONSTANT c_tech_ddr3_4g_800m_slave : t_c_tech_ddr := ("DDR3", 800, FALSE, "DUAL ", 15, 15, 10, 3, 64, 8, 8, 0, 0, 2, 2, 2, 1, 2, 14, 4, 2, 4, 64, 7); - CONSTANT c_tech_ddr3_4g_single_rank_800m_master : t_c_tech_ddr := ("DDR3", 800, TRUE, "SINGLE", 16, 16, 10, 3, 64, 8, 8, 0, 0, 2, 1, 1, 0, 1, 14, 4, 2, 4, 64, 7); - CONSTANT c_tech_ddr3_4g_single_rank_800m_slave : t_c_tech_ddr := ("DDR3", 800, FALSE, "SINGLE", 16, 16, 10, 3, 64, 8, 8, 0, 0, 2, 1, 1, 0, 1, 14, 4, 2, 4, 64, 7); + CONSTANT c_tech_ddr3_16g_dual_rank_800m : t_c_tech_ddr := ("DDR3", 800, TRUE, "DUAL ", 16, 16, 11, 3, 64, 8, 8, 0, 0, 2, 2, 2, 1, 2, 14, 4, 2, 4, 64, 7, 64); + CONSTANT c_tech_ddr3_4g_800m_master : t_c_tech_ddr := ("DDR3", 800, TRUE, "DUAL ", 15, 15, 10, 3, 64, 8, 8, 0, 0, 2, 2, 2, 1, 2, 14, 4, 2, 4, 64, 7, 64); + CONSTANT c_tech_ddr3_4g_800m_slave : t_c_tech_ddr := ("DDR3", 800, FALSE, "DUAL ", 15, 15, 10, 3, 64, 8, 8, 0, 0, 2, 2, 2, 1, 2, 14, 4, 2, 4, 64, 7, 64); + CONSTANT c_tech_ddr3_4g_single_rank_800m_master : t_c_tech_ddr := ("DDR3", 800, TRUE, "SINGLE", 16, 16, 10, 3, 64, 8, 8, 0, 0, 2, 1, 1, 0, 1, 14, 4, 2, 4, 64, 7, 64); + CONSTANT c_tech_ddr3_4g_single_rank_800m_slave : t_c_tech_ddr := ("DDR3", 800, FALSE, "SINGLE", 16, 16, 10, 3, 64, 8, 8, 0, 0, 2, 1, 1, 0, 1, 14, 4, 2, 4, 64, 7, 64); ---CONSTANT c_tech_ddr4_max : t_c_tech_ddr := ("none", 1600, TRUE, "DUAL ", 17, 15, 10, 2, 72, 9, 0, 9, 2, 1, 1, 1, 0, 1, 0, 8, 3, 8, 64, 7); -- maximum ranges for record field definitions - CONSTANT c_tech_ddr4_max : t_c_tech_ddr := ("none", 1600, TRUE, "DUAL ", 17, 15, 10, 2, 72, 9, 0, 9, 2, 2, 2, 2, 1, 2, 0, 8, 3, 8, 64, 7); -- maximum ranges for record field definitions +--CONSTANT c_tech_ddr4_max : t_c_tech_ddr := ("none", 1600, TRUE, "DUAL ", 17, 15, 10, 2, 72, 9, 0, 9, 2, 1, 1, 1, 0, 1, 0, 8, 3, 8, 64, 7, 72); -- maximum ranges for record field definitions + CONSTANT c_tech_ddr4_max : t_c_tech_ddr := ("none", 1600, TRUE, "DUAL ", 17, 15, 10, 2, 72, 9, 0, 9, 2, 2, 2, 2, 1, 2, 0, 8, 3, 8, 64, 7, 72); -- maximum ranges for record field definitions -- use predefined c_tech_ddr4_sim or derive it using func_tech_ddr_sim_size() - CONSTANT c_tech_ddr4_sim_4k : t_c_tech_ddr := ("DDR4", 1600, TRUE, "DUAL ", 10, 1, 10, 2, 72, 9, 0, 9, 2, 1, 1, 1, 0, 1, 0, 8, 3, 8, 64, 7); -- use a_row to set nof ctrl addr = 2**(cs_w + ba + a_row + a_col + bg_w - rsl_w) - CONSTANT c_tech_ddr4_sim_8k : t_c_tech_ddr := ("DDR4", 1600, TRUE, "DUAL ", 10, 2, 10, 2, 72, 9, 0, 9, 2, 1, 1, 1, 0, 1, 0, 8, 3, 8, 64, 7); -- use a_row to set nof ctrl addr = 2**(cs_w + ba + a_row + a_col + bg_w - rsl_w) - CONSTANT c_tech_ddr4_sim_16k : t_c_tech_ddr := ("DDR4", 1600, TRUE, "DUAL ", 10, 3, 10, 2, 72, 9, 0, 9, 2, 1, 1, 1, 0, 1, 0, 8, 3, 8, 64, 7); -- use a_row to set nof ctrl addr = 2**(cs_w + ba + a_row + a_col + bg_w - rsl_w) - CONSTANT c_tech_ddr4_sim_128k : t_c_tech_ddr := ("DDR4", 1600, TRUE, "DUAL ", 10, 6, 10, 2, 72, 9, 0, 9, 2, 1, 1, 1, 0, 1, 0, 8, 3, 8, 64, 7); -- use a_row to set nof ctrl addr = 2**(cs_w + ba + a_row + a_col + bg_w - rsl_w) - CONSTANT c_tech_ddr4_sim_1m : t_c_tech_ddr := ("DDR4", 1600, TRUE, "DUAL ", 10, 9, 10, 2, 72, 9, 0, 9, 2, 1, 1, 1, 0, 1, 0, 8, 3, 8, 64, 7); -- use a_row to set nof ctrl addr = 2**(cs_w + ba + a_row + a_col + bg_w - rsl_w) + CONSTANT c_tech_ddr4_sim_4k : t_c_tech_ddr := ("DDR4", 1600, TRUE, "DUAL ", 10, 1, 10, 2, 72, 9, 0, 9, 2, 1, 1, 1, 0, 1, 0, 8, 3, 8, 64, 7, 72); -- use a_row to set nof ctrl addr = 2**(cs_w + ba + a_row + a_col + bg_w - rsl_w) + CONSTANT c_tech_ddr4_sim_8k : t_c_tech_ddr := ("DDR4", 1600, TRUE, "DUAL ", 10, 2, 10, 2, 72, 9, 0, 9, 2, 1, 1, 1, 0, 1, 0, 8, 3, 8, 64, 7, 72); -- use a_row to set nof ctrl addr = 2**(cs_w + ba + a_row + a_col + bg_w - rsl_w) + CONSTANT c_tech_ddr4_sim_16k : t_c_tech_ddr := ("DDR4", 1600, TRUE, "DUAL ", 10, 3, 10, 2, 72, 9, 0, 9, 2, 1, 1, 1, 0, 1, 0, 8, 3, 8, 64, 7, 72); -- use a_row to set nof ctrl addr = 2**(cs_w + ba + a_row + a_col + bg_w - rsl_w) + CONSTANT c_tech_ddr4_sim_128k : t_c_tech_ddr := ("DDR4", 1600, TRUE, "DUAL ", 10, 6, 10, 2, 72, 9, 0, 9, 2, 1, 1, 1, 0, 1, 0, 8, 3, 8, 64, 7, 72); -- use a_row to set nof ctrl addr = 2**(cs_w + ba + a_row + a_col + bg_w - rsl_w) + CONSTANT c_tech_ddr4_sim_1m : t_c_tech_ddr := ("DDR4", 1600, TRUE, "DUAL ", 10, 9, 10, 2, 72, 9, 0, 9, 2, 1, 1, 1, 0, 1, 0, 8, 3, 8, 64, 7, 72); -- use a_row to set nof ctrl addr = 2**(cs_w + ba + a_row + a_col + bg_w - rsl_w) - CONSTANT c_tech_ddr4_4g_1600m : t_c_tech_ddr := ("DDR4", 1600, TRUE, "DUAL ", 17, 15, 10, 2, 72, 9, 0, 9, 2, 1, 1, 1, 0, 1, 0, 8, 3, 8, 64, 7); - CONSTANT c_tech_ddr4_8g_1600m : t_c_tech_ddr := ("DDR4", 1600, TRUE, "DUAL ", 17, 15, 10, 2, 72, 9, 0, 9, 2, 2, 2, 2, 1, 2, 0, 8, 3, 8, 64, 7); - CONSTANT c_tech_ddr4_16g_1600m_72 : t_c_tech_ddr := ("DDR4", 1600, TRUE, "DUAL ", 17, 16, 10, 2, 72, 9, 0, 9, 2, 1, 1, 1, 1, 1, 0, 8, 3, 8, 64, 7); - CONSTANT c_tech_ddr4_16g_1600m_64 : t_c_tech_ddr := ("DDR4", 1600, TRUE, "DUAL ", 17, 16, 10, 2, 64, 8, 0, 8, 2, 1, 1, 1, 1, 1, 0, 8, 3, 8, 64, 7); - CONSTANT c_tech_ddr4_8g_1600m_64 : t_c_tech_ddr := ("DDR4", 1600, TRUE, "DUAL ", 17, 15, 10, 2, 64, 8, 0, 8, 2, 2, 2, 2, 1, 2, 0, 8, 3, 8, 64, 7); - CONSTANT c_tech_ddr4_4g_2000m : t_c_tech_ddr := ("DDR4", 2000, TRUE, "DUAL ", 17, 15, 10, 2, 72, 9, 0, 9, 2, 1, 1, 1, 0, 1, 0, 8, 3, 8, 64, 7); - CONSTANT c_tech_ddr4_8g_2400m : t_c_tech_ddr := ("DDR4", 2400, TRUE, "DUAL ", 17, 15, 10, 2, 72, 9, 0, 9, 2, 2, 2, 2, 1, 2, 0, 8, 3, 8, 64, 7); + CONSTANT c_tech_ddr4_4g_1600m : t_c_tech_ddr := ("DDR4", 1600, TRUE, "DUAL ", 17, 15, 10, 2, 72, 9, 0, 9, 2, 1, 1, 1, 0, 1, 0, 8, 3, 8, 64, 7, 72); + CONSTANT c_tech_ddr4_8g_1600m : t_c_tech_ddr := ("DDR4", 1600, TRUE, "DUAL ", 17, 15, 10, 2, 72, 9, 0, 9, 2, 2, 2, 2, 1, 2, 0, 8, 3, 8, 64, 7, 72); + CONSTANT c_tech_ddr4_8g_1600m_64 : t_c_tech_ddr := ("DDR4", 1600, TRUE, "DUAL ", 17, 15, 10, 2, 64, 8, 0, 8, 2, 2, 2, 2, 1, 2, 0, 8, 3, 8, 64, 7, 64); + CONSTANT c_tech_ddr4_16g_1600m_72_64 : t_c_tech_ddr := ("DDR4", 1600, TRUE, "DUAL ", 17, 16, 10, 2, 72, 9, 0, 9, 2, 1, 1, 1, 1, 1, 0, 8, 3, 8, 64, 7, 64); -- 72b connection from IP, 64b to memory module (used for unb2c slot II with 64 bit modules) + CONSTANT c_tech_ddr4_16g_1600m_64 : t_c_tech_ddr := ("DDR4", 1600, TRUE, "DUAL ", 17, 16, 10, 2, 64, 8, 0, 8, 2, 1, 1, 1, 1, 1, 0, 8, 3, 8, 64, 7, 64); + CONSTANT c_tech_ddr4_4g_2000m : t_c_tech_ddr := ("DDR4", 2000, TRUE, "DUAL ", 17, 15, 10, 2, 72, 9, 0, 9, 2, 1, 1, 1, 0, 1, 0, 8, 3, 8, 64, 7, 72); + CONSTANT c_tech_ddr4_8g_2400m : t_c_tech_ddr := ("DDR4", 2400, TRUE, "DUAL ", 17, 15, 10, 2, 72, 9, 0, 9, 2, 2, 2, 2, 1, 2, 0, 8, 3, 8, 64, 7, 72); -- PHY in, inout and out signal records TYPE t_tech_ddr3_phy_in IS RECORD -- DDR3 Description @@ -227,9 +231,14 @@ PACKAGE BODY tech_ddr_pkg IS FUNCTION func_tech_ddr_ctlr_data_w(c_ddr : t_c_tech_ddr) RETURN NATURAL IS BEGIN - RETURN c_ddr.dq_w*c_ddr.rsl; -- CTLR data + RETURN c_ddr.mem_dq_w*c_ddr.rsl; -- CTLR data END; - + + FUNCTION func_tech_ddr_ctlr_ip_data_w(c_ddr : t_c_tech_ddr) RETURN NATURAL IS + BEGIN + RETURN c_ddr.dq_w*c_ddr.rsl; -- CTLR data + END; + FUNCTION func_tech_ddr_sim_size(c_ddr : t_c_tech_ddr; sim_ctrl_addr_w : NATURAL) RETURN t_c_tech_ddr IS VARIABLE v_ddr : t_c_tech_ddr := c_ddr; VARIABLE v_ctrl_addr_w : NATURAL; @@ -257,5 +266,23 @@ PACKAGE BODY tech_ddr_pkg IS END IF; END; + FUNCTION func_tech_ddr_rewire_64b_to_72b(c_ddr : t_c_tech_ddr; vec_64b : STD_LOGIC_VECTOR) RETURN STD_LOGIC_VECTOR IS + VARIABLE vec_72b : STD_LOGIC_VECTOR(func_tech_ddr_ctlr_ip_data_w(c_ddr) - 1 DOWNTO 0) := (OTHERS => '0'); + BEGIN + FOR w in 0 TO c_ddr.rsl - 1 LOOP + vec_72b( w * c_ddr.dq_w + c_ddr.mem_dq_w - 1 DOWNTO w * c_ddr.dq_w) := vec_64b((w+1) * c_ddr.mem_dq_w - 1 DOWNTO w * c_ddr.mem_dq_w); + END LOOP; + RETURN vec_72b; + END; + + FUNCTION func_tech_ddr_rewire_72b_to_64b(c_ddr : t_c_tech_ddr; vec_72b : STD_LOGIC_VECTOR) RETURN STD_LOGIC_VECTOR IS + VARIABLE vec_64b : STD_LOGIC_VECTOR(func_tech_ddr_ctlr_data_w(c_ddr) - 1 DOWNTO 0) := (OTHERS => '0'); + BEGIN + FOR w in 0 TO c_ddr.rsl - 1 LOOP + vec_64b((w+1) * c_ddr.mem_dq_w - 1 DOWNTO w * c_ddr.mem_dq_w) := vec_72b( w * c_ddr.dq_w + c_ddr.mem_dq_w - 1 DOWNTO w * c_ddr.dq_w); + END LOOP; + RETURN vec_64b; + END; + END tech_ddr_pkg; diff --git a/libraries/technology/ip_arria10_e2sg/altera_libraries/altera_emif_cal_slave_nf_191/compile_ip.tcl b/libraries/technology/ip_arria10_e2sg/altera_libraries/altera_emif_cal_slave_nf_191/compile_ip.tcl index e700baca19..56bd8a7c21 100644 --- a/libraries/technology/ip_arria10_e2sg/altera_libraries/altera_emif_cal_slave_nf_191/compile_ip.tcl +++ b/libraries/technology/ip_arria10_e2sg/altera_libraries/altera_emif_cal_slave_nf_191/compile_ip.tcl @@ -34,5 +34,13 @@ vmap altera_emif_cal_slave_nf_191 ./work/ set IP_DIR "$env(RADIOHDL_BUILD_DIR)/$env(BUILDSET)/qsys-generate/ip_arria10_e2sg_ddr4_8g_1600/sim" vcom "$IP_DIR/../altera_emif_cal_slave_nf_191/sim/ip_arria10_e2sg_ddr4_8g_1600_altera_emif_cal_slave_nf_191_rmzieji.vhd" -work altera_emif_cal_slave_nf_191 +#ddr4_16g_1600_64b +set IP_DIR "$env(RADIOHDL_BUILD_DIR)/$env(BUILDSET)/qsys-generate/ip_arria10_e2sg_ddr4_16g_1600_64b/sim" + vcom "$IP_DIR/../altera_emif_cal_slave_nf_191/sim/ip_arria10_e2sg_ddr4_16g_1600_64b_altera_emif_cal_slave_nf_191_rmzieji.vhd" -work altera_emif_cal_slave_nf_191 + +# ddr4_16g_1600_72b +set IP_DIR "$env(RADIOHDL_BUILD_DIR)/$env(BUILDSET)/qsys-generate/ip_arria10_e2sg_ddr4_16g_1600_72b/sim" + vcom "$IP_DIR/../altera_emif_cal_slave_nf_191/sim/ip_arria10_e2sg_ddr4_16g_1600_72b_altera_emif_cal_slave_nf_191_rmzieji.vhd" -work altera_emif_cal_slave_nf_191 + -- GitLab