1078 lines
38 KiB
VHDL
Executable File
1078 lines
38 KiB
VHDL
Executable File
--*****************************************************************************
|
|
-- (c) Copyright 2009 Xilinx, Inc. All rights reserved.
|
|
--
|
|
-- This file contains confidential and proprietary information
|
|
-- of Xilinx, Inc. and is protected under U.S. and
|
|
-- international copyright and other intellectual property
|
|
-- laws.
|
|
--
|
|
-- DISCLAIMER
|
|
-- This disclaimer is not a license and does not grant any
|
|
-- rights to the materials distributed herewith. Except as
|
|
-- otherwise provided in a valid license issued to you by
|
|
-- Xilinx, and to the maximum extent permitted by applicable
|
|
-- law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND
|
|
-- WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES
|
|
-- AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING
|
|
-- BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-
|
|
-- INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and
|
|
-- (2) Xilinx shall not be liable (whether in contract or tort,
|
|
-- including negligence, or under any other theory of
|
|
-- liability) for any loss or damage of any kind or nature
|
|
-- related to, arising under or in connection with these
|
|
-- materials, including for any direct, or any indirect,
|
|
-- special, incidental, or consequential loss or damage
|
|
-- (including loss of data, profits, goodwill, or any type of
|
|
-- loss or damage suffered as a result of any action brought
|
|
-- by a third party) even if such damage or loss was
|
|
-- reasonably foreseeable or Xilinx had been advised of the
|
|
-- possibility of the same.
|
|
--
|
|
-- CRITICAL APPLICATIONS
|
|
-- Xilinx products are not designed or intended to be fail-
|
|
-- safe, or for use in any application requiring fail-safe
|
|
-- performance, such as life-support or safety devices or
|
|
-- systems, Class III medical devices, nuclear facilities,
|
|
-- applications related to the deployment of airbags, or any
|
|
-- other applications that could lead to death, personal
|
|
-- injury, or severe property or environmental damage
|
|
-- (individually and collectively, "Critical
|
|
-- Applications"). Customer assumes the sole risk and
|
|
-- liability of any use of Xilinx products in Critical
|
|
-- Applications, subject only to applicable laws and
|
|
-- regulations governing limitations on product liability.
|
|
--
|
|
-- THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS
|
|
-- PART OF THIS FILE AT ALL TIMES.
|
|
--
|
|
--*****************************************************************************
|
|
-- ____ ____
|
|
-- / /\/ /
|
|
-- /___/ \ / Vendor: Xilinx
|
|
-- \ \ \/ Version: %version
|
|
-- \ \ Application: MIG
|
|
-- / / Filename: cmd_gen.vhd
|
|
-- /___/ /\ Date Last Modified: $Date: 2011/05/27 15:50:27 $
|
|
-- \ \ / \ Date Created: Jul 03 2009
|
|
-- \___\/\___\
|
|
--
|
|
-- Device: Spartan6
|
|
-- Design Name: DDR/DDR2/DDR3/LPDDR
|
|
-- Purpose: This module genreates different type of commands, address,
|
|
-- burst_length to mcb_flow_control module.
|
|
-- Reference:
|
|
-- Revision History:
|
|
|
|
--*****************************************************************************
|
|
|
|
LIBRARY ieee;
|
|
USE ieee.std_logic_1164.all;
|
|
USE ieee.std_logic_unsigned.all;
|
|
USE ieee.numeric_std.all;
|
|
|
|
|
|
ENTITY cmd_gen IS
|
|
GENERIC (
|
|
FAMILY : STRING := "SPARTAN6";
|
|
MEM_BURST_LEN : INTEGER := 8;
|
|
TCQ : TIME := 100 ps;
|
|
PORT_MODE : STRING := "BI_MODE";
|
|
NUM_DQ_PINS : INTEGER := 8;
|
|
DATA_PATTERN : STRING := "DGEN_ALL";
|
|
CMD_PATTERN : STRING := "CGEN_ALL";
|
|
ADDR_WIDTH : INTEGER := 30;
|
|
DWIDTH : INTEGER := 32;
|
|
PIPE_STAGES : INTEGER := 0;
|
|
MEM_COL_WIDTH : INTEGER := 10;
|
|
PRBS_EADDR_MASK_POS : std_logic_vector(31 downto 0) := X"FFFFD000";
|
|
PRBS_SADDR_MASK_POS : std_logic_vector(31 downto 0) := X"00002000";
|
|
PRBS_EADDR : std_logic_vector(31 downto 0) := X"00002000";
|
|
PRBS_SADDR : std_logic_vector(31 downto 0) := X"00002000"
|
|
);
|
|
PORT (
|
|
clk_i : IN STD_LOGIC;
|
|
rst_i : IN STD_LOGIC_VECTOR(9 DOWNTO 0);
|
|
run_traffic_i : IN STD_LOGIC;
|
|
rd_buff_avail_i : IN STD_LOGIC_VECTOR(6 DOWNTO 0);
|
|
force_wrcmd_gen_i : IN STD_LOGIC;
|
|
start_addr_i : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
|
|
end_addr_i : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
|
|
cmd_seed_i : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
|
|
data_seed_i : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
|
|
load_seed_i : IN STD_LOGIC;
|
|
addr_mode_i : IN STD_LOGIC_VECTOR(2 DOWNTO 0);
|
|
data_mode_i : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
|
|
instr_mode_i : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
|
|
bl_mode_i : IN STD_LOGIC_VECTOR(1 DOWNTO 0);
|
|
mode_load_i : IN STD_LOGIC;
|
|
fixed_bl_i : IN STD_LOGIC_VECTOR(5 DOWNTO 0);
|
|
fixed_instr_i : IN STD_LOGIC_VECTOR(2 DOWNTO 0);
|
|
fixed_addr_i : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
|
|
bram_addr_i : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
|
|
bram_instr_i : IN STD_LOGIC_VECTOR(2 DOWNTO 0);
|
|
bram_bl_i : IN STD_LOGIC_VECTOR(5 DOWNTO 0);
|
|
bram_valid_i : IN STD_LOGIC;
|
|
bram_rdy_o : OUT STD_LOGIC;
|
|
reading_rd_data_i : IN STD_LOGIC;
|
|
rdy_i : IN STD_LOGIC;
|
|
addr_o : OUT STD_LOGIC_VECTOR(31 DOWNTO 0);
|
|
instr_o : OUT STD_LOGIC_VECTOR(2 DOWNTO 0);
|
|
bl_o : OUT STD_LOGIC_VECTOR(5 DOWNTO 0);
|
|
-- m_addr_o : OUT STD_LOGIC_VECTOR(31 DOWNTO 0);
|
|
cmd_o_vld : OUT STD_LOGIC
|
|
);
|
|
END cmd_gen;
|
|
|
|
ARCHITECTURE trans OF cmd_gen IS
|
|
constant PRBS_ADDR_WIDTH : INTEGER := 32;
|
|
constant INSTR_PRBS_WIDTH : INTEGER := 16;
|
|
constant BL_PRBS_WIDTH : INTEGER := 16;
|
|
|
|
constant BRAM_DATAL_MODE : std_logic_vector(3 downto 0) := "0000";
|
|
constant FIXED_DATA_MODE : std_logic_vector(3 downto 0) := "0001";
|
|
constant ADDR_DATA_MODE : std_logic_vector(3 downto 0) := "0010";
|
|
constant HAMMER_DATA_MODE : std_logic_vector(3 downto 0) := "0011";
|
|
constant NEIGHBOR_DATA_MODE : std_logic_vector(3 downto 0) := "0100";
|
|
constant WALKING1_DATA_MODE : std_logic_vector(3 downto 0) := "0101";
|
|
constant WALKING0_DATA_MODE : std_logic_vector(3 downto 0) := "0110";
|
|
constant PRBS_DATA_MODE : std_logic_vector(3 downto 0) := "0111";
|
|
COMPONENT pipeline_inserter IS
|
|
GENERIC (
|
|
DATA_WIDTH : INTEGER := 32;
|
|
PIPE_STAGES : INTEGER := 1
|
|
);
|
|
PORT (
|
|
data_i : IN STD_LOGIC_VECTOR(DATA_WIDTH-1 DOWNTO 0);
|
|
clk_i : IN STD_LOGIC;
|
|
en_i : IN STD_LOGIC;
|
|
|
|
data_o : OUT STD_LOGIC_VECTOR(DATA_WIDTH-1 DOWNTO 0)
|
|
);
|
|
END COMPONENT;
|
|
|
|
COMPONENT cmd_prbs_gen IS
|
|
GENERIC (
|
|
TCQ : time := 100 ps;
|
|
FAMILY : STRING := "SPARTAN6";
|
|
ADDR_WIDTH : INTEGER := 29;
|
|
DWIDTH : INTEGER := 32;
|
|
PRBS_CMD : STRING := "ADDRESS";
|
|
PRBS_WIDTH : INTEGER := 64;
|
|
SEED_WIDTH : INTEGER := 32;
|
|
PRBS_EADDR_MASK_POS : std_logic_vector(31 downto 0) := X"FFFFD000";
|
|
PRBS_SADDR_MASK_POS : std_logic_vector(31 downto 0) := X"00002000";
|
|
PRBS_EADDR : std_logic_vector(31 downto 0) := X"00002000";
|
|
PRBS_SADDR : std_logic_vector(31 downto 0) := X"00002000"
|
|
);
|
|
PORT (
|
|
|
|
clk_i : IN STD_LOGIC;
|
|
prbs_seed_init : IN STD_LOGIC;
|
|
clk_en : IN STD_LOGIC;
|
|
prbs_seed_i : IN STD_LOGIC_VECTOR(SEED_WIDTH - 1 DOWNTO 0);
|
|
|
|
prbs_o : OUT STD_LOGIC_VECTOR(SEED_WIDTH - 1 DOWNTO 0)
|
|
);
|
|
END COMPONENT;
|
|
|
|
function BOOLEAN_TO_STD_LOGIC(A : in BOOLEAN) return std_logic is
|
|
begin
|
|
if A = true then
|
|
return '1';
|
|
else
|
|
return '0';
|
|
end if;
|
|
end function BOOLEAN_TO_STD_LOGIC;
|
|
|
|
SIGNAL INC_COUNTS : STD_LOGIC_VECTOR(10 DOWNTO 0);
|
|
SIGNAL addr_mode_reg : STD_LOGIC_VECTOR(2 DOWNTO 0);
|
|
SIGNAL bl_mode_reg : STD_LOGIC_VECTOR(1 DOWNTO 0);
|
|
SIGNAL addr_counts : STD_LOGIC_VECTOR(31 DOWNTO 0);
|
|
SIGNAL prbs_bl : STD_LOGIC_VECTOR(14 DOWNTO 0);
|
|
SIGNAL instr_out : STD_LOGIC_VECTOR(2 DOWNTO 0);
|
|
SIGNAL prbs_instr_a : STD_LOGIC_VECTOR(14 DOWNTO 0);
|
|
SIGNAL prbs_instr_b : STD_LOGIC_VECTOR(14 DOWNTO 0);
|
|
SIGNAL prbs_brlen : STD_LOGIC_VECTOR(5 DOWNTO 0);
|
|
SIGNAL prbs_addr : STD_LOGIC_VECTOR(31 DOWNTO 0);
|
|
SIGNAL seq_addr : STD_LOGIC_VECTOR(31 DOWNTO 0);
|
|
SIGNAL fixed_addr : STD_LOGIC_VECTOR(31 DOWNTO 0);
|
|
SIGNAL addr_out : STD_LOGIC_VECTOR(31 DOWNTO 0);
|
|
SIGNAL bl_out : STD_LOGIC_VECTOR(5 DOWNTO 0);
|
|
SIGNAL bl_out_reg : STD_LOGIC_VECTOR(5 DOWNTO 0);
|
|
SIGNAL mode_load_d1 : STD_LOGIC;
|
|
SIGNAL mode_load_d2 : STD_LOGIC;
|
|
SIGNAL mode_load_pulse : STD_LOGIC;
|
|
SIGNAL pipe_data_o : STD_LOGIC_VECTOR(41 DOWNTO 0);
|
|
SIGNAL cmd_clk_en : STD_LOGIC;
|
|
SIGNAL pipe_out_vld : STD_LOGIC;
|
|
SIGNAL end_addr_range : STD_LOGIC_VECTOR(15 DOWNTO 0);
|
|
SIGNAL force_bl1 : STD_LOGIC;
|
|
SIGNAL A0_G_E0 : STD_LOGIC;
|
|
SIGNAL A1_G_E1 : STD_LOGIC;
|
|
SIGNAL A2_G_E2 : STD_LOGIC;
|
|
SIGNAL A3_G_E3 : STD_LOGIC;
|
|
SIGNAL AC3_G_E3 : STD_LOGIC;
|
|
SIGNAL AC2_G_E2 : STD_LOGIC;
|
|
SIGNAL AC1_G_E1 : STD_LOGIC;
|
|
SIGNAL bl_out_clk_en : STD_LOGIC;
|
|
SIGNAL pipe_data_in : STD_LOGIC_VECTOR(41 DOWNTO 0);
|
|
SIGNAL instr_vld : STD_LOGIC;
|
|
SIGNAL bl_out_vld : STD_LOGIC;
|
|
SIGNAL cmd_vld : STD_LOGIC;
|
|
SIGNAL run_traffic_r : STD_LOGIC;
|
|
SIGNAL run_traffic_pulse : STD_LOGIC;
|
|
|
|
SIGNAL pipe_data_in_vld : STD_LOGIC;
|
|
SIGNAL gen_addr_larger : STD_LOGIC;
|
|
SIGNAL buf_avail_r : STD_LOGIC_VECTOR(6 DOWNTO 0);
|
|
SIGNAL rd_data_received_counts : STD_LOGIC_VECTOR(6 DOWNTO 0);
|
|
SIGNAL rd_data_counts_asked : STD_LOGIC_VECTOR(6 DOWNTO 0);
|
|
SIGNAL rd_data_received_counts_total : STD_LOGIC_VECTOR(15 DOWNTO 0);
|
|
SIGNAL instr_vld_dly1 : STD_LOGIC;
|
|
SIGNAL first_load_pulse : STD_LOGIC;
|
|
SIGNAL mem_init_done : STD_LOGIC;
|
|
SIGNAL i : INTEGER;
|
|
SIGNAL force_wrcmd_gen : STD_LOGIC;
|
|
SIGNAL force_smallvalue : STD_LOGIC;
|
|
|
|
SIGNAL end_addr_r : STD_LOGIC_VECTOR(31 DOWNTO 0);
|
|
|
|
SIGNAL force_rd_counts : STD_LOGIC_VECTOR(9 DOWNTO 0);
|
|
SIGNAL force_rd : STD_LOGIC;
|
|
SIGNAL addr_counts_next_r : STD_LOGIC_VECTOR(31 DOWNTO 0);
|
|
SIGNAL refresh_cmd_en : STD_LOGIC;
|
|
SIGNAL refresh_timer : STD_LOGIC_VECTOR(9 DOWNTO 0);
|
|
SIGNAL refresh_prbs : STD_LOGIC;
|
|
SIGNAL cmd_clk_en_r : STD_LOGIC;
|
|
|
|
signal instr_mode_reg : std_logic_vector(3 downto 0);
|
|
|
|
|
|
-- X-HDL generated signals
|
|
|
|
SIGNAL xhdl4 : STD_LOGIC_VECTOR(2 DOWNTO 0);
|
|
SIGNAL xhdl12 : STD_LOGIC_VECTOR(1 DOWNTO 0);
|
|
SIGNAL xhdl14 : STD_LOGIC_VECTOR(5 DOWNTO 0);
|
|
|
|
-- Declare intermediate signals for referenced outputs
|
|
SIGNAL bl_o_xhdl0 : STD_LOGIC_VECTOR(5 DOWNTO 0);
|
|
SIGNAL mode_load_pulse_r1 : STD_LOGIC;
|
|
|
|
BEGIN
|
|
-- Drive referenced outputs
|
|
bl_o <= bl_o_xhdl0;
|
|
addr_o <= pipe_data_o(31 DOWNTO 0);
|
|
instr_o <= pipe_data_o(34 DOWNTO 32);
|
|
bl_o_xhdl0 <= pipe_data_o(40 DOWNTO 35);
|
|
cmd_o_vld <= pipe_data_o(41) AND run_traffic_r;
|
|
pipe_out_vld <= pipe_data_o(41) AND run_traffic_r;
|
|
pipe_data_o <= pipe_data_in;
|
|
|
|
|
|
cv1 : IF (CMD_PATTERN = "CGEN_BRAM") GENERATE
|
|
PROCESS (clk_i)
|
|
BEGIN
|
|
IF (clk_i'EVENT AND clk_i = '1') THEN
|
|
cmd_vld <= cmd_clk_en;
|
|
END IF;
|
|
END PROCESS;
|
|
END GENERATE;
|
|
|
|
cv3 : IF (CMD_PATTERN = "CGEN_PRBS" OR CMD_PATTERN = "CGEN_ALL" OR CMD_PATTERN = "CGEN_SEQUENTIAL" OR CMD_PATTERN = "CGEN_FIXED") GENERATE
|
|
PROCESS (clk_i)
|
|
BEGIN
|
|
IF (clk_i'EVENT AND clk_i = '1') THEN
|
|
cmd_vld <= cmd_clk_en OR (mode_load_pulse AND first_load_pulse);
|
|
END IF;
|
|
END PROCESS;
|
|
END GENERATE;
|
|
|
|
PROCESS (clk_i)
|
|
BEGIN
|
|
IF (clk_i'EVENT AND clk_i = '1') THEN
|
|
run_traffic_r <= run_traffic_i ;
|
|
IF ( run_traffic_i= '1' AND run_traffic_r = '0' ) THEN
|
|
run_traffic_pulse <= '1' ;
|
|
ELSE
|
|
run_traffic_pulse <= '0' ;
|
|
END IF;
|
|
END IF;
|
|
END PROCESS;
|
|
|
|
|
|
PROCESS (clk_i)
|
|
BEGIN
|
|
IF (clk_i'EVENT AND clk_i = '1') THEN
|
|
instr_vld <= cmd_clk_en OR (mode_load_pulse AND first_load_pulse) ;
|
|
bl_out_clk_en <= cmd_clk_en OR (mode_load_pulse AND first_load_pulse) ;
|
|
bl_out_vld <= bl_out_clk_en ;
|
|
pipe_data_in_vld <= instr_vld ;
|
|
END IF;
|
|
END PROCESS;
|
|
|
|
PROCESS (clk_i)
|
|
BEGIN
|
|
IF (clk_i'EVENT AND clk_i = '1') THEN
|
|
IF (rst_i(0) = '1') THEN
|
|
first_load_pulse <= '1' ;
|
|
ELSIF (mode_load_pulse = '1') THEN
|
|
first_load_pulse <= '0' ;
|
|
ELSE
|
|
first_load_pulse <= first_load_pulse ;
|
|
END IF;
|
|
END IF;
|
|
END PROCESS;
|
|
|
|
|
|
cmd_clk_en <= (rdy_i AND pipe_out_vld AND run_traffic_i) OR (mode_load_pulse AND BOOLEAN_TO_STD_LOGIC(CMD_PATTERN = "CGEN_BRAM"));
|
|
|
|
pipe_in_s6 : IF (FAMILY = "SPARTAN6") GENERATE
|
|
PROCESS (clk_i)
|
|
BEGIN
|
|
IF (clk_i'EVENT AND clk_i = '1') THEN
|
|
IF ((rst_i(0)) = '1') THEN
|
|
pipe_data_in(31 DOWNTO 0) <= start_addr_i ;
|
|
ELSIF (instr_vld = '1') THEN
|
|
IF (gen_addr_larger = '1' AND (addr_mode_reg = "100" OR addr_mode_reg = "010")) THEN
|
|
|
|
IF (DWIDTH = 32) THEN
|
|
pipe_data_in(31 DOWNTO 0) <= (end_addr_i(31 DOWNTO 8) & "00000000") ;
|
|
ELSIF (DWIDTH = 64) THEN
|
|
pipe_data_in(31 DOWNTO 0) <= (end_addr_i(31 DOWNTO 9) & "000000000") ;
|
|
ELSE
|
|
pipe_data_in(31 DOWNTO 0) <= (end_addr_i(31 DOWNTO 10) & "0000000000") ;
|
|
END IF;
|
|
|
|
ELSE
|
|
IF (DWIDTH = 32) THEN
|
|
pipe_data_in(31 DOWNTO 0) <= (addr_out(31 DOWNTO 2) & "00") ;
|
|
ELSIF (DWIDTH = 64) THEN
|
|
pipe_data_in(31 DOWNTO 0) <= (addr_out(31 DOWNTO 3) & "000") ;
|
|
ELSIF (DWIDTH = 128) THEN
|
|
pipe_data_in(31 DOWNTO 0) <= (addr_out(31 DOWNTO 4) & "0000") ;
|
|
END IF;
|
|
END IF;
|
|
END IF;
|
|
END IF;
|
|
END PROCESS;
|
|
|
|
END GENERATE;
|
|
pipe_in_v6 : IF (FAMILY = "VIRTEX6") GENERATE
|
|
PROCESS (clk_i)
|
|
BEGIN
|
|
IF (clk_i'EVENT AND clk_i = '1') THEN
|
|
IF ((rst_i(1)) = '1') THEN
|
|
pipe_data_in(31 DOWNTO 0) <= start_addr_i ;
|
|
ELSIF (instr_vld = '1') THEN
|
|
IF (gen_addr_larger = '1' AND (addr_mode_reg = "100" OR addr_mode_reg = "010")) THEN
|
|
pipe_data_in(31 DOWNTO 0) <= (end_addr_i(31 DOWNTO 8) & "00000000") ;
|
|
|
|
ELSIF ((NUM_DQ_PINS >= 128) AND (NUM_DQ_PINS <= 144)) THEN
|
|
IF (MEM_BURST_LEN = 8) THEN
|
|
pipe_data_in(31 DOWNTO 0) <= (addr_out(31 DOWNTO 7) & "0000000") ;
|
|
ELSE
|
|
pipe_data_in(31 DOWNTO 0) <= (addr_out(31 DOWNTO 6) & "000000") ;
|
|
END IF;
|
|
|
|
ELSIF ((NUM_DQ_PINS >= 64) AND (NUM_DQ_PINS < 128)) THEN
|
|
|
|
IF (MEM_BURST_LEN = 8) THEN
|
|
pipe_data_in(31 DOWNTO 0) <= (addr_out(31 DOWNTO 6) & "000000") ;
|
|
ELSE
|
|
pipe_data_in(31 DOWNTO 0) <= (addr_out(31 DOWNTO 5) & "00000") ;
|
|
END IF;
|
|
|
|
ELSIF ((NUM_DQ_PINS = 32) OR (NUM_DQ_PINS = 40) OR (NUM_DQ_PINS = 48) OR (NUM_DQ_PINS = 56)) THEN
|
|
IF (MEM_BURST_LEN = 8) THEN
|
|
pipe_data_in(31 DOWNTO 0) <= (addr_out(31 DOWNTO 5) & "00000") ;
|
|
ELSE
|
|
pipe_data_in(31 DOWNTO 0) <= (addr_out(31 DOWNTO 4) & "0000") ;
|
|
END IF;
|
|
|
|
ELSIF ((NUM_DQ_PINS = 16) OR (NUM_DQ_PINS = 24)) THEN
|
|
pipe_data_in(31 DOWNTO 0) <= (addr_out(31 DOWNTO 3) & "000");
|
|
IF (MEM_BURST_LEN = 8) THEN
|
|
pipe_data_in(31 DOWNTO 0) <= (addr_out(31 DOWNTO 4) & "0000") ;
|
|
ELSE
|
|
pipe_data_in(31 DOWNTO 0) <= (addr_out(31 DOWNTO 3) & "000") ;
|
|
END IF;
|
|
ELSIF (NUM_DQ_PINS = 8) THEN
|
|
IF (MEM_BURST_LEN = 8) THEN
|
|
pipe_data_in(31 DOWNTO 0) <= (addr_out(31 DOWNTO 3) & "000") ;
|
|
ELSE
|
|
pipe_data_in(31 DOWNTO 0) <= (addr_out(31 DOWNTO 2) & "00") ;
|
|
END IF;
|
|
|
|
|
|
END IF;
|
|
END IF;
|
|
END IF;
|
|
END PROCESS;
|
|
|
|
END GENERATE;
|
|
-- pipe_m_addr_o : IF (FAMILY = "VIRTEX6") GENERATE
|
|
-- PROCESS (clk_i)
|
|
-- BEGIN
|
|
-- IF (clk_i'EVENT AND clk_i = '1') THEN
|
|
-- IF ((rst_i(1)) = '1') THEN
|
|
-- m_addr_o(31 DOWNTO 0) <= start_addr_i ;
|
|
-- ELSIF (instr_vld = '1') THEN
|
|
-- IF (gen_addr_larger = '1' AND (addr_mode_reg = "100" OR addr_mode_reg = "010")) THEN
|
|
-- m_addr_o(31 DOWNTO 0) <= (end_addr_i(31 DOWNTO 8) & "00000000") ;
|
|
--
|
|
-- ELSIF ((NUM_DQ_PINS >= 128) AND (NUM_DQ_PINS < 256)) THEN
|
|
-- m_addr_o <= (addr_out(31 DOWNTO 6) & "000000") ;
|
|
--
|
|
-- ELSIF ((NUM_DQ_PINS >= 64) AND (NUM_DQ_PINS < 128)) THEN
|
|
-- m_addr_o <= (addr_out(31 DOWNTO 5) & "00000") ;
|
|
-- ELSIF ((NUM_DQ_PINS = 32) OR (NUM_DQ_PINS = 40) OR (NUM_DQ_PINS = 48) OR (NUM_DQ_PINS = 56)) THEN
|
|
-- m_addr_o(31 DOWNTO 0) <= (addr_out(31 DOWNTO 4) & "0000") ;
|
|
-- ELSIF ((NUM_DQ_PINS = 16) OR (NUM_DQ_PINS = 17)) THEN
|
|
-- m_addr_o(31 DOWNTO 0) <= (addr_out(31 DOWNTO 3) & "000") ;
|
|
-- ELSIF ((NUM_DQ_PINS = 8) OR (NUM_DQ_PINS = 9)) THEN
|
|
-- m_addr_o(31 DOWNTO 0) <= (addr_out(31 DOWNTO 2) & "00") ;
|
|
-- END IF;
|
|
-- END IF;
|
|
-- END IF;
|
|
-- END PROCESS;
|
|
--
|
|
-- END GENERATE;
|
|
PROCESS (clk_i)
|
|
BEGIN
|
|
IF (clk_i'EVENT AND clk_i = '1') THEN
|
|
IF (rst_i(0) = '1') THEN
|
|
force_wrcmd_gen <= '0' ;
|
|
ELSIF (buf_avail_r = "0111111") THEN
|
|
force_wrcmd_gen <= '0' ;
|
|
ELSIF (instr_vld_dly1 = '1' AND pipe_data_in(32) = '1' AND pipe_data_in(41 DOWNTO 35) > "0010000") THEN
|
|
force_wrcmd_gen <= '1' ;
|
|
END IF;
|
|
END IF;
|
|
END PROCESS;
|
|
|
|
|
|
PROCESS (clk_i)
|
|
BEGIN
|
|
IF (clk_i'EVENT AND clk_i = '1') THEN
|
|
instr_mode_reg <= instr_mode_i ;
|
|
|
|
END IF;
|
|
END PROCESS;
|
|
-- **********************************************
|
|
|
|
PROCESS (clk_i) BEGIN
|
|
IF (clk_i'EVENT AND clk_i = '1') THEN
|
|
IF ((rst_i(2)) = '1') THEN
|
|
pipe_data_in(40 DOWNTO 32) <= "000000000";
|
|
force_smallvalue <= '0';
|
|
ELSIF (instr_vld = '1') THEN
|
|
|
|
IF (instr_mode_reg = 0) THEN
|
|
pipe_data_in(34 DOWNTO 32) <= instr_out ;
|
|
|
|
ELSIF (instr_out(2) = '1') THEN
|
|
|
|
pipe_data_in(34 DOWNTO 32) <= "100" ;
|
|
|
|
|
|
ELSIF (FAMILY = "SPARTAN6" AND PORT_MODE = "RD_MODE") THEN
|
|
|
|
pipe_data_in(34 DOWNTO 32) <= instr_out(2 downto 1) & '1' ;
|
|
|
|
ELSIF ((force_wrcmd_gen = '1' OR buf_avail_r <= "0001111") AND FAMILY = "SPARTAN6" AND PORT_MODE /= "RD_MODE") THEN
|
|
pipe_data_in(34 DOWNTO 32) <= instr_out(2) & "00";
|
|
ELSE
|
|
pipe_data_in(34 DOWNTO 32) <= instr_out;
|
|
|
|
END IF;
|
|
----********* condition the generated bl value except if TG is programmed for BRAM interface'
|
|
---- if the generated address is close to end address range, the bl_out will be altered to 1.
|
|
--
|
|
IF (bl_mode_i = 0) THEN
|
|
pipe_data_in(40 DOWNTO 35) <= bl_out ;
|
|
ELSIF ( FAMILY = "VIRTEX6") THEN
|
|
pipe_data_in(40 DOWNTO 35) <= bl_out ;
|
|
ELSIF (force_bl1 = '1' AND (bl_mode_reg = "10") AND FAMILY = "SPARTAN6") THEN
|
|
|
|
pipe_data_in(40 DOWNTO 35) <= "000001" ;
|
|
|
|
|
|
-- **********************************************
|
|
|
|
ELSIF (buf_avail_r(5 DOWNTO 0) >= "111100" AND buf_avail_r(6) = '0' AND pipe_data_in(32) = '1' AND FAMILY = "SPARTAN6") THEN
|
|
IF (bl_mode_reg = "10") THEN
|
|
force_smallvalue <= NOT(force_smallvalue) ;
|
|
END IF;
|
|
IF (buf_avail_r(6) = '1' AND bl_mode_reg = "10") THEN
|
|
pipe_data_in(40 DOWNTO 35) <= ("00" & bl_out(3 DOWNTO 1) & '1') ;
|
|
ELSE
|
|
pipe_data_in(40 DOWNTO 35) <= bl_out ;
|
|
END IF;
|
|
ELSIF (buf_avail_r < "1000000" AND rd_buff_avail_i >= "0000000" AND instr_out(0) = '1' AND (bl_mode_reg = "10")) THEN
|
|
IF (FAMILY = "SPARTAN6") THEN
|
|
pipe_data_in(40 DOWNTO 35) <= ("00" & bl_out(3 DOWNTO 0)) + '1' ;
|
|
ELSE
|
|
pipe_data_in(40 DOWNTO 35) <= bl_out ;
|
|
END IF;
|
|
END IF; --IF (bl_mode_i = 0) THEN
|
|
END IF; --IF ((rst_i(2)) = '1') THEN
|
|
END IF;
|
|
END PROCESS;
|
|
|
|
PROCESS (clk_i)
|
|
BEGIN
|
|
IF (clk_i'EVENT AND clk_i = '1') THEN
|
|
IF ((rst_i(2)) = '1') THEN
|
|
pipe_data_in(41) <= '0' ;
|
|
ELSIF (cmd_vld = '1') THEN
|
|
pipe_data_in(41) <= instr_vld ;
|
|
ELSIF ((rdy_i AND pipe_out_vld) = '1') THEN
|
|
pipe_data_in(41) <= '0' ;
|
|
END IF;
|
|
END IF;
|
|
END PROCESS;
|
|
|
|
PROCESS (clk_i)
|
|
BEGIN
|
|
IF (clk_i'EVENT AND clk_i = '1') THEN
|
|
instr_vld_dly1 <= instr_vld;
|
|
END IF;
|
|
END PROCESS;
|
|
|
|
|
|
|
|
PROCESS (clk_i)
|
|
BEGIN
|
|
IF (clk_i'EVENT AND clk_i = '1') THEN
|
|
IF (rst_i(0) = '1') THEN
|
|
rd_data_counts_asked <= (others => '0') ;
|
|
ELSIF (instr_vld_dly1 = '1' AND pipe_data_in(32) = '1') THEN
|
|
IF (pipe_data_in(40 DOWNTO 35) = "000000") THEN
|
|
rd_data_counts_asked <= rd_data_counts_asked + 64 ;
|
|
|
|
ELSE
|
|
rd_data_counts_asked <= rd_data_counts_asked + ('0' & (pipe_data_in(40 DOWNTO 35)));
|
|
|
|
END IF;
|
|
END IF;
|
|
END IF;
|
|
END PROCESS;
|
|
|
|
|
|
PROCESS (clk_i)
|
|
BEGIN
|
|
IF (clk_i'EVENT AND clk_i = '1') THEN
|
|
IF (rst_i(0) = '1') THEN
|
|
rd_data_received_counts <= (others => '0');
|
|
rd_data_received_counts_total <= (others => '0');
|
|
ELSIF (reading_rd_data_i = '1') THEN
|
|
rd_data_received_counts <= rd_data_received_counts + '1';
|
|
rd_data_received_counts_total <= rd_data_received_counts_total + "0000000000000001";
|
|
END IF;
|
|
END IF;
|
|
END PROCESS;
|
|
|
|
PROCESS (clk_i)
|
|
BEGIN
|
|
IF (clk_i'EVENT AND clk_i = '1') THEN
|
|
buf_avail_r <= (rd_data_received_counts + 64) - rd_data_counts_asked;
|
|
END IF;
|
|
END PROCESS;
|
|
|
|
PROCESS (clk_i)
|
|
BEGIN
|
|
IF (clk_i'EVENT AND clk_i = '1') THEN
|
|
IF ((rst_i(3)) = '1') THEN
|
|
IF (CMD_PATTERN = "CGEN_BRAM") THEN
|
|
addr_mode_reg <= "000";
|
|
ELSE
|
|
addr_mode_reg <= "011";
|
|
END IF;
|
|
ELSIF (mode_load_pulse = '1') THEN
|
|
addr_mode_reg <= addr_mode_i;
|
|
END IF;
|
|
END IF;
|
|
END PROCESS;
|
|
|
|
PROCESS (clk_i)
|
|
BEGIN
|
|
IF (clk_i'EVENT AND clk_i = '1') THEN
|
|
IF (mode_load_pulse = '1') THEN
|
|
bl_mode_reg <= bl_mode_i;
|
|
END IF;
|
|
mode_load_d1 <= mode_load_i;
|
|
mode_load_d2 <= mode_load_d1;
|
|
END IF;
|
|
END PROCESS;
|
|
|
|
PROCESS (clk_i)
|
|
BEGIN
|
|
IF (clk_i'EVENT AND clk_i = '1') THEN
|
|
mode_load_pulse <= mode_load_d1 AND NOT(mode_load_d2);
|
|
END IF;
|
|
END PROCESS;
|
|
|
|
xhdl4 <= addr_mode_reg;
|
|
PROCESS (clk_i)
|
|
BEGIN
|
|
IF (clk_i'EVENT AND clk_i = '1') THEN
|
|
IF ((rst_i(3)) = '1') THEN
|
|
addr_out <= start_addr_i;
|
|
ELSE
|
|
CASE xhdl4 IS
|
|
WHEN "000" =>
|
|
addr_out <= bram_addr_i;
|
|
WHEN "001" =>
|
|
addr_out <= fixed_addr;
|
|
WHEN "010" =>
|
|
addr_out <= prbs_addr;
|
|
WHEN "011" =>
|
|
addr_out <= ("00" & seq_addr(29 DOWNTO 0));
|
|
WHEN "100" =>
|
|
-- addr_out <= (prbs_addr(31 DOWNTO 6) & "000000");
|
|
addr_out <= ("000" & seq_addr(6 DOWNTO 2) & seq_addr(23 DOWNTO 0));--(prbs_addr(31 DOWNTO 6) & "000000");
|
|
WHEN "101" =>
|
|
addr_out <= (prbs_addr(31 DOWNTO 20) & seq_addr(19 DOWNTO 0));
|
|
-- addr_out <= (prbs_addr(31 DOWNTO MEM_COL_WIDTH) & seq_addr(MEM_COL_WIDTH - 1 DOWNTO 0));
|
|
WHEN OTHERS =>
|
|
addr_out <= (others => '0');--"00000000000000000000000000000000";
|
|
END CASE;
|
|
END IF;
|
|
END IF;
|
|
END PROCESS;
|
|
|
|
xhdl5 : IF (CMD_PATTERN = "CGEN_PRBS" OR CMD_PATTERN = "CGEN_ALL") GENERATE
|
|
|
|
|
|
addr_prbs_gen : cmd_prbs_gen
|
|
GENERIC MAP (
|
|
family => FAMILY,
|
|
addr_width => 32,
|
|
dwidth => DWIDTH,
|
|
prbs_width => 32,
|
|
seed_width => 32,
|
|
prbs_eaddr_mask_pos => PRBS_EADDR_MASK_POS,
|
|
prbs_saddr_mask_pos => PRBS_SADDR_MASK_POS,
|
|
prbs_eaddr => PRBS_EADDR,
|
|
prbs_saddr => PRBS_SADDR
|
|
)
|
|
PORT MAP (
|
|
clk_i => clk_i,
|
|
clk_en => cmd_clk_en,
|
|
prbs_seed_init => mode_load_pulse,
|
|
prbs_seed_i => cmd_seed_i(31 DOWNTO 0),
|
|
prbs_o => prbs_addr
|
|
);
|
|
END GENERATE;
|
|
PROCESS (clk_i)
|
|
BEGIN
|
|
IF (clk_i'EVENT AND clk_i = '1') THEN
|
|
IF (addr_out(31 DOWNTO 8) >= end_addr_i(31 DOWNTO 8)) THEN
|
|
gen_addr_larger <= '1';
|
|
ELSE
|
|
gen_addr_larger <= '0';
|
|
END IF;
|
|
END IF;
|
|
END PROCESS;
|
|
|
|
xhdl6 : IF (FAMILY = "SPARTAN6") GENERATE
|
|
PROCESS (clk_i)
|
|
BEGIN
|
|
IF (clk_i'EVENT AND clk_i = '1') THEN
|
|
IF (mem_init_done = '1') THEN
|
|
INC_COUNTS <= std_logic_vector(to_unsigned((DWIDTH/8 * to_integer(unsigned(bl_out_reg))),11));
|
|
ELSE
|
|
IF (fixed_bl_i = "000000") THEN
|
|
INC_COUNTS <= std_logic_vector(to_unsigned((DWIDTH/8)*(64), 11));
|
|
ELSE
|
|
INC_COUNTS <= std_logic_vector(to_unsigned((DWIDTH/8 * to_integer(unsigned(fixed_bl_i))),11));
|
|
END IF;
|
|
END IF;
|
|
END IF;
|
|
END PROCESS;
|
|
|
|
END GENERATE;
|
|
xhdl7 : IF (FAMILY = "VIRTEX6") GENERATE
|
|
PROCESS (clk_i)
|
|
BEGIN
|
|
IF (clk_i'EVENT AND clk_i = '1') THEN
|
|
IF (NUM_DQ_PINS >= 128 AND NUM_DQ_PINS <= 144) THEN
|
|
INC_COUNTS <= std_logic_vector(to_unsigned(64 * (MEM_BURST_LEN/4), 11));
|
|
|
|
ELSIF (NUM_DQ_PINS >= 64 AND NUM_DQ_PINS < 128) THEN
|
|
INC_COUNTS <= std_logic_vector(to_unsigned(32 * (MEM_BURST_LEN/4), 11));
|
|
ELSIF (NUM_DQ_PINS >= 32 AND NUM_DQ_PINS < 64) THEN
|
|
INC_COUNTS <= std_logic_vector(to_unsigned(16 * (MEM_BURST_LEN/4), 11));
|
|
ELSIF (NUM_DQ_PINS = 16 OR NUM_DQ_PINS = 24) THEN
|
|
INC_COUNTS <= std_logic_vector(to_unsigned(8 * (MEM_BURST_LEN/4), 11));
|
|
ELSIF (NUM_DQ_PINS = 8 OR NUM_DQ_PINS = 9) THEN
|
|
INC_COUNTS <= std_logic_vector(to_unsigned(4 * (MEM_BURST_LEN/4), 11));
|
|
END IF;
|
|
END IF;
|
|
END PROCESS;
|
|
|
|
END GENERATE;
|
|
PROCESS (clk_i)
|
|
BEGIN
|
|
IF (clk_i'EVENT AND clk_i = '1') THEN
|
|
end_addr_r <= end_addr_i - std_logic_vector(to_unsigned(DWIDTH/8*to_integer(unsigned(fixed_bl_i)),32)) + "00000000000000000000000000000001";
|
|
END IF;
|
|
END PROCESS;
|
|
|
|
PROCESS (clk_i)
|
|
BEGIN
|
|
IF (clk_i'EVENT AND clk_i = '1') THEN
|
|
IF (addr_out(31 DOWNTO 24) >= end_addr_r(31 DOWNTO 24)) THEN
|
|
AC3_G_E3 <= '1';
|
|
ELSE
|
|
AC3_G_E3 <= '0';
|
|
END IF;
|
|
IF (addr_out(23 DOWNTO 16) >= end_addr_r(23 DOWNTO 16)) THEN
|
|
AC2_G_E2 <= '1';
|
|
ELSE
|
|
AC2_G_E2 <= '0';
|
|
END IF;
|
|
IF (addr_out(15 DOWNTO 8) >= end_addr_r(15 DOWNTO 8)) THEN
|
|
AC1_G_E1 <= '1';
|
|
ELSE
|
|
AC1_G_E1 <= '0';
|
|
END IF;
|
|
END IF;
|
|
END PROCESS;
|
|
|
|
-- xhdl8 : IF (CMD_PATTERN = "CGEN_SEQUENTIAL" OR CMD_PATTERN = "CGEN_ALL") GENERATE
|
|
seq_addr <= addr_counts;
|
|
PROCESS (clk_i)
|
|
BEGIN
|
|
IF (clk_i'EVENT AND clk_i = '1') THEN
|
|
mode_load_pulse_r1 <= mode_load_pulse;
|
|
END IF;
|
|
END PROCESS;
|
|
|
|
PROCESS (clk_i)
|
|
BEGIN
|
|
IF (clk_i'EVENT AND clk_i = '1') THEN
|
|
end_addr_range <= end_addr_i(15 DOWNTO 0) - std_logic_vector(to_unsigned((DWIDTH/8 * to_integer(unsigned(bl_out_reg))),16)) + "0000000000000001";
|
|
END IF;
|
|
END PROCESS;
|
|
|
|
PROCESS (clk_i)
|
|
BEGIN
|
|
IF (clk_i'EVENT AND clk_i = '1') THEN
|
|
addr_counts_next_r <= addr_counts + (INC_COUNTS);
|
|
|
|
END IF;
|
|
END PROCESS;
|
|
|
|
PROCESS (clk_i)
|
|
BEGIN
|
|
IF (clk_i'EVENT AND clk_i = '1') THEN
|
|
cmd_clk_en_r <= cmd_clk_en;
|
|
END IF;
|
|
END PROCESS;
|
|
|
|
|
|
PROCESS (clk_i)
|
|
BEGIN
|
|
IF (clk_i'EVENT AND clk_i = '1') THEN
|
|
IF ((rst_i(4)) = '1') THEN
|
|
addr_counts <= start_addr_i;
|
|
mem_init_done <= '0';
|
|
ELSIF ((cmd_clk_en_r OR mode_load_pulse_r1) = '1') THEN
|
|
-- IF ((DWIDTH = 32 AND AC3_G_E3 = '1' AND AC2_G_E2 = '1' AND AC1_G_E1 = '1' AND (addr_counts(7 DOWNTO 0) >= end_addr_r(7 DOWNTO 0))) OR (DWIDTH = 64 AND AC3_G_E3 = '1' AND AC2_G_E2 = '1' AND AC1_G_E1 = '1' AND (addr_counts(7 DOWNTO 0) >= end_addr_r(7 DOWNTO 0))) OR ((DWIDTH = 128 AND AC3_G_E3 = '1' AND AC2_G_E2 = '1' AND AC1_G_E1 = '1' AND FAMILY = "SPARTAN6") OR (DWIDTH = 128 AND AC3_G_E3 = '1' AND AC2_G_E2 = '1' AND AC1_G_E1 = '1' AND (addr_counts(7 DOWNTO 0) >= end_addr_r(7 DOWNTO 0)) AND FAMILY = "VIRTEX6") OR (DWIDTH >= 256 AND AC3_G_E3 = '1' AND AC2_G_E2 = '1' AND AC1_G_E1 = '1' AND (addr_counts(7 DOWNTO 0) >= end_addr_r(7 DOWNTO 0)) AND FAMILY = "VIRTEX6"))) THEN
|
|
IF (addr_counts_next_r >= end_addr_i) THEN
|
|
addr_counts <= start_addr_i;
|
|
mem_init_done <= '1';
|
|
ELSIF (addr_counts < end_addr_r) THEN
|
|
addr_counts <= addr_counts + INC_COUNTS;
|
|
END IF;
|
|
END IF;
|
|
END IF;
|
|
END PROCESS;
|
|
|
|
--END GENERATE;
|
|
|
|
xhdl9 : IF (CMD_PATTERN = "CGEN_FIXED" OR CMD_PATTERN = "CGEN_ALL") GENERATE
|
|
fixed_addr <= (fixed_addr_i(31 DOWNTO 2) & "00") WHEN (DWIDTH = 32) ELSE
|
|
(fixed_addr_i(31 DOWNTO 3) & "000") WHEN (DWIDTH = 64) ELSE
|
|
(fixed_addr_i(31 DOWNTO 4) & "0000") WHEN (DWIDTH = 128) ELSE
|
|
(fixed_addr_i(31 DOWNTO 5) & "00000") WHEN (DWIDTH = 256) ELSE
|
|
(fixed_addr_i(31 DOWNTO 6) & "000000");
|
|
END GENERATE;
|
|
xhdl10 : IF (CMD_PATTERN = "CGEN_BRAM" OR CMD_PATTERN = "CGEN_ALL") GENERATE
|
|
bram_rdy_o <= (run_traffic_i AND cmd_clk_en AND bram_valid_i) OR (mode_load_pulse);
|
|
END GENERATE;
|
|
PROCESS (clk_i)
|
|
BEGIN
|
|
IF (clk_i'EVENT AND clk_i = '1') THEN
|
|
IF ((rst_i(4)) = '1') THEN
|
|
force_rd_counts <= (others => '0');--"0000000000";
|
|
ELSIF (instr_vld = '1') THEN
|
|
force_rd_counts <= force_rd_counts + "0000000001";
|
|
END IF;
|
|
END IF;
|
|
END PROCESS;
|
|
|
|
|
|
PROCESS (clk_i)
|
|
BEGIN
|
|
IF (clk_i'EVENT AND clk_i = '1') THEN
|
|
IF ((rst_i(4)) = '1') THEN
|
|
force_rd <= '0';
|
|
ELSIF ((force_rd_counts(3)) = '1') THEN
|
|
force_rd <= '1';
|
|
ELSE
|
|
force_rd <= '0';
|
|
END IF;
|
|
END IF;
|
|
END PROCESS;
|
|
|
|
|
|
|
|
-- adding refresh timer to limit the amount of issuing refresh command.
|
|
PROCESS (clk_i)
|
|
BEGIN
|
|
IF (clk_i'EVENT AND clk_i = '1') THEN
|
|
IF ((rst_i(4)) = '1') THEN
|
|
refresh_timer <= (others => '0');
|
|
ELSE
|
|
refresh_timer <= refresh_timer + 1;
|
|
END IF;
|
|
END IF;
|
|
END PROCESS;
|
|
|
|
PROCESS (clk_i)
|
|
BEGIN
|
|
IF (clk_i'EVENT AND clk_i = '1') THEN
|
|
IF ((rst_i(4)) = '1') THEN
|
|
refresh_cmd_en <= '0';
|
|
ELSIF (refresh_timer = "1111111111") THEN
|
|
refresh_cmd_en <= '1';
|
|
ELSIF ((cmd_clk_en and refresh_cmd_en) = '1') THEN
|
|
refresh_cmd_en <= '0';
|
|
END IF;
|
|
END IF;
|
|
END PROCESS;
|
|
|
|
PROCESS (clk_i)
|
|
BEGIN
|
|
IF (clk_i'EVENT AND clk_i = '1') THEN
|
|
IF (FAMILY = "SPARTAN6") THEN
|
|
refresh_prbs <= prbs_instr_b(3) and refresh_cmd_en;
|
|
ELSE
|
|
refresh_prbs <= '0';
|
|
END IF;
|
|
END IF;
|
|
END PROCESS;
|
|
|
|
--synthesis translate_off
|
|
PROCESS (instr_mode_i)
|
|
BEGIN
|
|
IF ((instr_mode_i > "0010") and (FAMILY = "VIRTEX6")) THEN
|
|
report "Error ! Not valid instruction mode";
|
|
END IF;
|
|
END PROCESS;
|
|
--synthesis translate_on
|
|
|
|
PROCESS (clk_i)
|
|
BEGIN
|
|
IF (clk_i'EVENT AND clk_i = '1') THEN
|
|
CASE instr_mode_i IS
|
|
WHEN "0000" =>
|
|
instr_out <= bram_instr_i;
|
|
WHEN "0001" =>
|
|
instr_out <= fixed_instr_i;
|
|
WHEN "0010" =>
|
|
instr_out <= ("00" & (prbs_instr_a(0) OR force_rd));
|
|
WHEN "0011" =>
|
|
instr_out <= ("00" & prbs_instr_a(0));
|
|
WHEN "0100" =>
|
|
instr_out <= ('0' & prbs_instr_b(0) & prbs_instr_a(0));
|
|
|
|
WHEN "0101" =>
|
|
instr_out <= (refresh_prbs & prbs_instr_b(0) & prbs_instr_a(0));
|
|
WHEN OTHERS =>
|
|
instr_out <= ("00" & prbs_instr_a(0));
|
|
END CASE;
|
|
END IF;
|
|
END PROCESS;
|
|
|
|
|
|
xhdl11 : IF (CMD_PATTERN = "CGEN_PRBS" OR CMD_PATTERN = "CGEN_ALL") GENERATE
|
|
|
|
|
|
|
|
|
|
instr_prbs_gen_a : cmd_prbs_gen
|
|
GENERIC MAP (
|
|
prbs_cmd => "INSTR",
|
|
family => FAMILY,
|
|
addr_width => 32,
|
|
seed_width => 15,
|
|
prbs_width => 20
|
|
)
|
|
PORT MAP (
|
|
clk_i => clk_i,
|
|
clk_en => cmd_clk_en,
|
|
prbs_seed_init => load_seed_i,
|
|
prbs_seed_i => cmd_seed_i(14 DOWNTO 0),
|
|
prbs_o => prbs_instr_a
|
|
);
|
|
|
|
|
|
|
|
instr_prbs_gen_b : cmd_prbs_gen
|
|
GENERIC MAP (
|
|
prbs_cmd => "INSTR",
|
|
family => FAMILY,
|
|
seed_width => 15,
|
|
prbs_width => 20
|
|
)
|
|
PORT MAP (
|
|
clk_i => clk_i,
|
|
clk_en => cmd_clk_en,
|
|
prbs_seed_init => load_seed_i,
|
|
prbs_seed_i => cmd_seed_i(16 DOWNTO 2),
|
|
prbs_o => prbs_instr_b
|
|
);
|
|
|
|
END GENERATE;
|
|
|
|
PROCESS (clk_i)
|
|
BEGIN
|
|
IF (clk_i'EVENT AND clk_i = '1') THEN
|
|
IF (addr_out(31 DOWNTO 24) >= end_addr_i(31 DOWNTO 24)) THEN
|
|
A3_G_E3 <= '1' ;
|
|
ELSE
|
|
|
|
A3_G_E3 <= '0' ;
|
|
END IF;
|
|
IF (addr_out(23 DOWNTO 16) >= end_addr_i(23 DOWNTO 16)) THEN
|
|
A2_G_E2 <= '1' ;
|
|
ELSE
|
|
|
|
A2_G_E2 <= '0' ;
|
|
END IF;
|
|
IF (addr_out(15 DOWNTO 8) >= end_addr_i(15 DOWNTO 8)) THEN
|
|
A1_G_E1 <= '1' ;
|
|
ELSE
|
|
|
|
A1_G_E1 <= '0' ;
|
|
END IF;
|
|
IF (addr_out(7 DOWNTO 0) > (end_addr_i(7 DOWNTO 0) - std_logic_vector(to_unsigned((DWIDTH/8)*to_integer(unsigned(bl_out) ),32)) + '1') ) THEN -- OK
|
|
|
|
|
|
|
|
|
|
|
|
A0_G_E0 <= '1' ;
|
|
ELSE
|
|
|
|
A0_G_E0 <= '0' ;
|
|
END IF;
|
|
END IF;
|
|
END PROCESS;
|
|
|
|
--testout <= std_logic_vector(to_unsigned((DWIDTH/8)*to_integer(unsigned(bl_out) ),testout'length)) + '1';
|
|
|
|
PROCESS (addr_out,buf_avail_r, bl_out, end_addr_i, rst_i)
|
|
BEGIN
|
|
IF ((rst_i(5)) = '1') THEN
|
|
force_bl1 <= '0';
|
|
|
|
|
|
ELSIF (addr_out + std_logic_vector(to_unsigned((DWIDTH/8)*to_integer(unsigned(bl_out) ),32)) >= end_addr_i) OR
|
|
(buf_avail_r <= 50 and PORT_MODE = "RD_MODE") THEN
|
|
force_bl1 <= '1' ;
|
|
ELSE
|
|
force_bl1 <= '0' ;
|
|
END IF;
|
|
END PROCESS;
|
|
|
|
|
|
PROCESS (clk_i)
|
|
BEGIN
|
|
IF (clk_i'EVENT AND clk_i = '1') THEN
|
|
IF ((rst_i(6)) = '1') THEN
|
|
bl_out_reg <= fixed_bl_i;
|
|
ELSIF (bl_out_vld = '1') THEN
|
|
|
|
bl_out_reg <= bl_out;
|
|
END IF;
|
|
END IF;
|
|
END PROCESS;
|
|
|
|
xhdl12 <= bl_mode_reg;
|
|
PROCESS (clk_i)
|
|
BEGIN
|
|
IF (clk_i'EVENT AND clk_i = '1') THEN
|
|
IF (mode_load_pulse = '1') THEN
|
|
bl_out <= fixed_bl_i;
|
|
ELSIF (cmd_clk_en = '1') THEN
|
|
CASE xhdl12 IS
|
|
WHEN "00" =>
|
|
bl_out <= bram_bl_i;
|
|
WHEN "01" =>
|
|
bl_out <= fixed_bl_i;
|
|
WHEN "10" =>
|
|
bl_out <= prbs_brlen;
|
|
WHEN OTHERS =>
|
|
bl_out <= "000001";
|
|
END CASE;
|
|
END IF;
|
|
END IF;
|
|
END PROCESS;
|
|
|
|
--synthesis translate_off
|
|
PROCESS (bl_out)
|
|
BEGIN
|
|
IF (bl_out > "000010" AND FAMILY = "VIRTEX6") THEN
|
|
report "Error ! Not valid burst length"; --severity ERROR;
|
|
END IF;
|
|
END PROCESS;
|
|
--synthesis translate_on
|
|
|
|
xhdl13 : IF (CMD_PATTERN = "CGEN_PRBS" OR CMD_PATTERN = "CGEN_ALL") GENERATE
|
|
|
|
|
|
|
|
|
|
bl_prbs_gen : cmd_prbs_gen
|
|
GENERIC MAP (
|
|
TCQ => TCQ,
|
|
family => FAMILY,
|
|
prbs_cmd => "BLEN",
|
|
addr_width => 32,
|
|
seed_width => 15,
|
|
prbs_width => 20
|
|
)
|
|
PORT MAP (
|
|
clk_i => clk_i,
|
|
clk_en => cmd_clk_en,
|
|
|
|
prbs_seed_init => load_seed_i,
|
|
prbs_seed_i => cmd_seed_i(16 DOWNTO 2),
|
|
prbs_o => prbs_bl
|
|
);
|
|
|
|
END GENERATE;
|
|
-- xhdl14 <= "000001" WHEN (prbs_bl(5 DOWNTO 0) = "000000") ELSE prbs_bl(5 DOWNTO 0);
|
|
PROCESS (prbs_bl) BEGIN
|
|
IF (FAMILY = "SPARTAN6") THEN
|
|
if (prbs_bl(5 DOWNTO 0) = "000000") then
|
|
-- prbs_brlen <= xhdl14;
|
|
prbs_brlen <= "000001";
|
|
else
|
|
prbs_brlen <= prbs_bl(5 DOWNTO 0);
|
|
end if;
|
|
ELSE
|
|
prbs_brlen <= "000010";
|
|
END IF;
|
|
END PROCESS;
|
|
|
|
|
|
|
|
END trans;
|
|
|
|
|