From 68ed860e93136bc57f5b92296426deb6ad37fbf8 Mon Sep 17 00:00:00 2001 From: Erik Kooistra <kooistra@astron.nl> Date: Thu, 18 Dec 2014 13:49:07 +0000 Subject: [PATCH] Added functions func_tech_ddr_dq_address_w() and func_tech_ddr_data_address_w(). Added field name and cs_w_w to t_c_tech_ddr record type. --- libraries/technology/ddr/tech_ddr_pkg.vhd | 41 +++++++++++++++-------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/libraries/technology/ddr/tech_ddr_pkg.vhd b/libraries/technology/ddr/tech_ddr_pkg.vhd index 0a90a1b289..3e46c6687e 100644 --- a/libraries/technology/ddr/tech_ddr_pkg.vhd +++ b/libraries/technology/ddr/tech_ddr_pkg.vhd @@ -29,6 +29,7 @@ PACKAGE tech_ddr_pkg IS -- Gather all parameters in one record TYPE t_c_tech_ddr IS RECORD -- PHY variant within a technology + name : STRING(1 TO 4); -- = "DDR3" or "DDR4" mts : NATURAL; -- = 800 access rate in mega transfers per second master : BOOLEAN; -- = TRUE TRUE = uniphy master, FALSE = uniphy slave regarding OCT and terminationcontrol for DDR3 -- PHY external FPGA IO @@ -39,7 +40,8 @@ PACKAGE tech_ddr_pkg IS dq_w : NATURAL; -- = 64 dqs_w : NATURAL; -- = 8 = dq_w / nof_dq_per_dqs dm_w : NATURAL; -- = 8 - cs_w : NATURAL; -- = 2 + cs_w : NATURAL; -- = 2 = number of chip select lines + cs_w_w : NATURAL; -- = 1 = true_log2(cs_w), use when the number of chip select lines is converted to a logical address clk_w : NATURAL; -- = 2 -- PHY internal FPGA IO terminationcontrol_w : NATURAL; -- = 14 internal bus in FPGA @@ -52,11 +54,14 @@ PACKAGE tech_ddr_pkg IS maxburstsize_w : NATURAL; -- = 7 = ceil_log2(maxburstsize+1) END RECORD; - CONSTANT c_tech_ddr_max : t_c_tech_ddr := ( 800, TRUE, 16, 16, 10, 3, 64, 8, 8, 2, 2, 14, 4, 2, 32, 256, 64, 7); -- maximum ranges for record field definitions - CONSTANT c_tech_ddr_4g_800m : t_c_tech_ddr := ( 800, TRUE, 15, 15, 10, 3, 64, 8, 8, 2, 2, 14, 4, 2, 32, 256, 64, 7); - CONSTANT c_tech_ddr_4g_800m_slave : t_c_tech_ddr := ( 800, FALSE, 15, 15, 10, 3, 64, 8, 8, 2, 2, 14, 4, 2, 32, 256, 64, 7); + CONSTANT c_tech_ddr_max : t_c_tech_ddr := ("none", 800, TRUE, 16, 16, 10, 3, 64, 8, 8, 2, 1, 2, 14, 4, 2, 32, 256, 64, 7); -- maximum ranges for record field definitions + CONSTANT c_tech_ddr_4g_800m : t_c_tech_ddr := ("none", 800, TRUE, 15, 15, 10, 3, 64, 8, 8, 2, 1, 2, 14, 4, 2, 32, 256, 64, 7); + CONSTANT c_tech_ddr3_4g_800m_master : t_c_tech_ddr := ("DDR3", 800, FALSE, 15, 15, 10, 3, 64, 8, 8, 2, 1, 2, 14, 4, 2, 32, 256, 64, 7); + CONSTANT c_tech_ddr3_4g_800m_slave : t_c_tech_ddr := ("DDR3", 800, FALSE, 15, 15, 10, 3, 64, 8, 8, 2, 1, 2, 14, 4, 2, 32, 256, 64, 7); - FUNCTION func_tech_ddr_module_size(c_ddr : t_c_tech_ddr) RETURN NATURAL; -- return DDR module size in GByte + 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_data_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_module_size( c_ddr : t_c_tech_ddr) RETURN NATURAL; -- return DDR module size in GByte -- PHY in, inout and out signal records TYPE t_tech_ddr_phy_in IS RECORD @@ -102,17 +107,14 @@ PACKAGE tech_ddr_pkg IS -- PHY address signal record TYPE t_tech_ddr_addr IS RECORD - chip : STD_LOGIC_VECTOR(ceil_log2(c_tech_ddr_max.cs_w) -1 DOWNTO 0); -- Use ceil_log2() because the controller interprets the chip address as logical address (NOT individual chip select lines) - bank : STD_LOGIC_VECTOR( c_tech_ddr_max.ba_w -1 DOWNTO 0); - row : STD_LOGIC_VECTOR( c_tech_ddr_max.a_row_w-1 DOWNTO 0); - column : STD_LOGIC_VECTOR( c_tech_ddr_max.a_col_w-1 DOWNTO 0); + chip : STD_LOGIC_VECTOR(c_tech_ddr_max.cs_w_w)-1 DOWNTO 0); + bank : STD_LOGIC_VECTOR(c_tech_ddr_max.ba_w -1 DOWNTO 0); + row : STD_LOGIC_VECTOR(c_tech_ddr_max.a_row_w-1 DOWNTO 0); + column : STD_LOGIC_VECTOR(c_tech_ddr_max.a_col_w-1 DOWNTO 0); END RECORD; TYPE t_tech_ddr_addr_arr IS ARRAY(NATURAL RANGE <>) OF t_tech_ddr_addr; - CONSTANT c_tech_ddr_ctrl_nof_latent_reads : NATURAL := 100; -- Due to having a command cue, even after de-asserting read requests, the PHY keeps processing the cued read requests. - -- This makes sure 100 words are still available in the read FIFO after it de-asserted its siso.ready signal towards the ddr3 read side. - CONSTANT c_tech_ddr_addr_lo : t_tech_ddr_addr := ((OTHERS=>'0'), (OTHERS=>'0'), (OTHERS=>'0'), (OTHERS=>'0')); CONSTANT c_tech_ddr_addr_hi_4gb_800m : t_tech_ddr_addr := ((OTHERS=>'1'), (OTHERS=>'1'), (OTHERS=>'1'), TO_UVEC(2**c_tech_ddr_4g_800m.a_col_w - c_tech_ddr_4g_800m.rsl, c_tech_ddr_4g_800m.a_col_w)); CONSTANT c_tech_ddr_addr_hi_sim : t_tech_ddr_addr := ((OTHERS=>'0'), (OTHERS=>'0'), TO_UVEC(3, c_tech_ddr_4g_800m.a_row_w), TO_UVEC(2**c_tech_ddr_4g_800m.a_col_w - c_tech_ddr_4g_800m.rsl, c_tech_ddr_4g_800m.a_col_w)); @@ -137,9 +139,19 @@ END tech_ddr_pkg; PACKAGE BODY tech_ddr_pkg IS + FUNCTION func_tech_ddr_dq_address_w(c_ddr : t_c_tech_ddr) RETURN NATURAL IS + BEGIN + RETURN c_ddr.cs_w_w + c_ddr.ba_w + c_ddr.a_w + c_ddr.a_col_w; + END; + + FUNCTION func_tech_ddr_data_address_w(c_ddr : t_c_tech_ddr) RETURN NATURAL IS + CONSTANT c_dq_address_w : NATURAL := func_tech_ddr_dq_address_w(c_ddr); + BEGIN + RETURN c_dq_address_w-c_ddr.rsl_w; + END; + FUNCTION func_tech_ddr_module_size(c_ddr : t_c_tech_ddr) RETURN NATURAL IS - CONSTANT c_chip_addr_w : NATURAL := ceil_log2(c_ddr.cs_w); -- Chip sel lines converted to logical address - CONSTANT c_dq_address_w : NATURAL := c_chip_addr_w + c_ddr.ba_w + c_ddr.a_w + c_ddr.a_col_w; + CONSTANT c_dq_address_w : NATURAL := func_tech_ddr_dq_address_w(c_ddr); CONSTANT c_dq_nof_bytes_w : NATURAL := 8; -- both dw_q = 64 and 72 are regarded as having 8 bytes (either with 8 or 9 bits per byte) CONSTANT c_module_nof_bytes_w : NATURAL := c_dq_address_w + c_dq_nof_bytes_w; CONSTANT c_1GB_w : NATURAL := 30; @@ -147,5 +159,6 @@ PACKAGE BODY tech_ddr_pkg IS RETURN 2**(c_module_nof_bytes_w-c_1GB_w); END; + END tech_ddr_pkg; -- GitLab