📄 hyb18t1g160af_120.vhd
字号:
-- EMRS(2) : future use -- EMRS(3) : future use SHARED VARIABLE RL :INTEGER RANGE 0 TO 10 := 0;-- number of CKIn SHARED VARIABLE WL :INTEGER RANGE 0 TO 9 := 0;-- number of CKIn SHARED VARIABLE DataOut_temp : std_logic_vector(HiDataBit downto 0) := (others => 'Z'); -- Functionality result (zero delay) variables SIGNAL DataOut_zd : std_logic_vector(HiDataBit downto 0) := (others => 'Z'); SIGNAL UDQSOut_zd : std_logic := 'Z'; SIGNAL UDQSNegOut_zd : std_logic := 'Z'; SIGNAL LDQSOut_zd : std_logic := 'Z'; SIGNAL LDQSNegOut_zd : std_logic := 'Z'; SIGNAL command_update : std_logic := '0'; SIGNAL mrs_finished : bool_array_type; SIGNAL aref_finished : bool_array_type; SIGNAL write_finished : bool_array_type; SIGNAL read_finished : bool_array_type; SIGNAL wap_finished : bool_array_type; SIGNAL rap_finished : bool_array_type; SIGNAL prech_finished : bool_array_type; SIGNAL read_dqs_enabled_0 : std_logic_vector(MaxBank-1 downto 0) := "00000000"; SIGNAL read_data_enabled_0 : std_logic_vector(MaxBank-1 downto 0) := "00000000"; SIGNAL read_dqs_enabled_1 : std_logic_vector(MaxBank-1 downto 0) := "00000000"; SIGNAL read_data_enabled_1 : std_logic_vector(MaxBank-1 downto 0) := "00000000"; SIGNAL read_dqs_enabled_2 : std_logic_vector(MaxBank-1 downto 0) := "00000000"; SIGNAL read_data_enabled_2 : std_logic_vector(MaxBank-1 downto 0) := "00000000"; SIGNAL read_dqs_enabled_3 : std_logic_vector(MaxBank-1 downto 0) := "00000000"; SIGNAL read_data_enabled_3 : std_logic_vector(MaxBank-1 downto 0) := "00000000"; SIGNAL read_dqs_enabled_4 : std_logic_vector(MaxBank-1 downto 0) := "00000000"; SIGNAL read_data_enabled_4 : std_logic_vector(MaxBank-1 downto 0) := "00000000"; SIGNAL read_dqs_enabled_5 : std_logic_vector(MaxBank-1 downto 0) := "00000000"; SIGNAL read_data_enabled_5 : std_logic_vector(MaxBank-1 downto 0) := "00000000"; SIGNAL read_dqs_enabled_6 : std_logic_vector(MaxBank-1 downto 0) := "00000000"; SIGNAL read_data_enabled_6 : std_logic_vector(MaxBank-1 downto 0) := "00000000"; SIGNAL read_dqs_enabled_7 : std_logic_vector(MaxBank-1 downto 0) := "00000000"; SIGNAL read_data_enabled_7 : std_logic_vector(MaxBank-1 downto 0) := "00000000"; SIGNAL write_data_enabled_0 : std_logic_vector(MaxBank-1 downto 0) := "00000000"; SIGNAL write_data_enabled_1 : std_logic_vector(MaxBank-1 downto 0) := "00000000"; SIGNAL write_data_enabled_2 : std_logic_vector(MaxBank-1 downto 0) := "00000000"; SIGNAL write_data_enabled_3 : std_logic_vector(MaxBank-1 downto 0) := "00000000"; SIGNAL write_data_enabled_4 : std_logic_vector(MaxBank-1 downto 0) := "00000000"; SIGNAL write_data_enabled_5 : std_logic_vector(MaxBank-1 downto 0) := "00000000"; SIGNAL write_data_enabled_6 : std_logic_vector(MaxBank-1 downto 0) := "00000000"; SIGNAL write_data_enabled_7 : std_logic_vector(MaxBank-1 downto 0) := "00000000"; SIGNAL w_burst_n_interrupted_0: std_logic_vector(MaxBank-1 downto 0) := "11111111"; SIGNAL w_burst_n_interrupted_1: std_logic_vector(MaxBank-1 downto 0) := "11111111"; SIGNAL w_burst_n_interrupted_2: std_logic_vector(MaxBank-1 downto 0) := "11111111"; SIGNAL w_burst_n_interrupted_3: std_logic_vector(MaxBank-1 downto 0) := "11111111"; SIGNAL w_burst_n_interrupted_4: std_logic_vector(MaxBank-1 downto 0) := "11111111"; SIGNAL w_burst_n_interrupted_5: std_logic_vector(MaxBank-1 downto 0) := "11111111"; SIGNAL r_burst_n_interrupted_0: std_logic_vector(MaxBank-1 downto 0) := "11111111"; SIGNAL r_burst_n_interrupted_1: std_logic_vector(MaxBank-1 downto 0) := "11111111"; SIGNAL r_burst_n_interrupted_2: std_logic_vector(MaxBank-1 downto 0) := "11111111"; SIGNAL r_burst_n_interrupted_3: std_logic_vector(MaxBank-1 downto 0) := "11111111"; SIGNAL r_burst_n_interrupted_4: std_logic_vector(MaxBank-1 downto 0) := "11111111"; SIGNAL r_burst_n_interrupted_5: std_logic_vector(MaxBank-1 downto 0) := "11111111"; SIGNAL w_burst_n_interrupted_g : std_logic := '1'; SIGNAL r_burst_n_interrupted_g : std_logic := '1'; SIGNAL read_dqs_enabled_g : std_logic := '0'; SIGNAL read_data_enabled_g : std_logic := '0'; SIGNAL write_data_enabled_g : std_logic := '0'; SHARED VARIABLE read_finished_interrupted : std_logic := '0'; -- --------------------------------------------------------------------- -- DYNAMIC MEMORY ALLOCATION VARIABLES & PROCEDURES -- --------------------------------------------------------------------- -- --------------------------------------------------------------------- -- Data types required to implement link list structure -- --------------------------------------------------------------------- TYPE mem_data_t; TYPE mem_data_pointer_t IS ACCESS mem_data_t; TYPE mem_data_t IS RECORD key_address : INTEGER; val_data : INTEGER; successor : mem_data_pointer_t; END RECORD; -- --------------------------------------------------------------------- -- Array of linked lists. -- Support memory region partitioning for faster access. -- --------------------------------------------------------------------- TYPE mem_data_pointer_array_t IS ARRAY(NATURAL RANGE <>) OF mem_data_pointer_t; -- --------------------------------------------------------------------- -- Create linked listed -- --------------------------------------------------------------------- PROCEDURE create_list( key_address : IN INTEGER; val_data : IN INTEGER; root : INOUT mem_data_pointer_t) IS BEGIN root := NEW mem_data_t; root.successor := NULL; root.key_address := key_address; root.val_data := val_data; END PROCEDURE create_list; -- -------------------------------------------------------------------- -- Iterate through linked listed comapring key values -- Stop when key value greater or equal -- -------------------------------------------------------------------- PROCEDURE position_list( key_address : IN INTEGER; root : INOUT mem_data_pointer_t; found : INOUT mem_data_pointer_t; prev : INOUT mem_data_pointer_t) IS BEGIN found := root; prev := NULL; WHILE ((found /= NULL) AND (found.key_address < key_address)) LOOP prev := found; found := found.successor; END LOOP; END PROCEDURE position_list; -- ------------------------------------------------------------------- -- Add new element to a linked list -- ------------------------------------------------------------------- PROCEDURE insert_list( key_address : IN INTEGER; val_data : IN INTEGER; root : INOUT mem_data_pointer_t) IS VARIABLE new_element : mem_data_pointer_t; VARIABLE found : mem_data_pointer_t; VARIABLE prev : mem_data_pointer_t; BEGIN position_list(key_address, root, found, prev); -- Insert at list tail IF (found = NULL) THEN prev.successor := NEW mem_data_t; prev.successor.key_address := key_address; prev.successor.val_data := val_data; prev.successor.successor := NULL; ELSE -- Element exists, update memory data value IF (found.key_address = key_address) THEN found.val_data := val_data; ELSE -- No element found, allocate and link new_element := NEW mem_data_t; new_element.key_address := key_address; new_element.val_data := val_data; new_element.successor := found; -- Possible root position IF (prev /= NULL) THEN prev.successor := new_element; ELSE root := new_element; END IF; END IF; END IF; END PROCEDURE insert_list; -- -------------------------------------------------------------------- -- Memory READ operation performed above dynamically allocated space -- -------------------------------------------------------------------- PROCEDURE read_mem( linked_list : INOUT mem_data_pointer_t; data : INOUT INTEGER; address : IN INTEGER) IS VARIABLE found : mem_data_pointer_t; VARIABLE prev : mem_data_pointer_t; VARIABLE m_data : INTEGER RANGE -2 TO MaxData; BEGIN IF (linked_list = NULL) THEN -- Not allocated, not written, initial value m_data := -2; ELSE position_list(address, linked_list, found, prev); IF (found /= NULL) THEN IF found.key_address = address THEN -- Allocated, val_data stored m_data := found.val_data; ELSE -- Not allocated, not written, initial value m_data := -2; END IF; ELSE -- Not allocated, not written, initial value m_data := -2; END IF; END IF; data := m_data; END PROCEDURE read_mem; -- ------------------------------------------------------------------ -- Memory WRITE operation performed above dynamically allocated space -- ------------------------------------------------------------------ PROCEDURE write_mem( linked_list : INOUT mem_data_pointer_t; address : IN INTEGER; data : IN INTEGER) IS BEGIN -- Handle possible root value update IF (linked_list /= NULL) THEN insert_list(address, data, linked_list); ELSE create_list(address, data, linked_list); END IF; END PROCEDURE write_mem; ------------------------------------------------------------------- -- Handle dynamic memory allocation ------------------------------------------------------------------- -- Partition dynamically allocated space for performance CONSTANT list_num : INTEGER := MaxBank-1; -- 8 list, 1 for each bank
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -