2 use ieee.std_logic_1164.all;
3 use ieee.std_logic_arith.all;
4 use ieee.std_logic_unsigned.all;
6 entity tb_mcc_master is
9 --------------------------------------------------------------------------------
11 architecture testbench of tb_mcc_master is
13 constant period : time := 1 us;
14 constant offset : time := 0 us;
16 constant LUT_DAT_W : integer := 10;
17 constant LUT_ADR_W : integer := 9;
18 constant LUT_INIT_FILE : string := "../sin.lut";
19 constant IRF_ADR_W : integer := 5;
21 constant WAVE_SIZE : integer := 2**LUT_ADR_W;
24 signal ACK_O : std_logic;
25 signal CLK_I : std_logic;
26 signal RST_I : std_logic;
27 signal STB_I : std_logic;
29 signal IRF_ACK_I : std_logic;
30 signal IRF_ADR_O : std_logic_vector (IRF_ADR_W-1 downto 0);
31 signal IRF_CYC_O : std_logic;
32 signal IRF_DAT_I : std_logic_vector (15 downto 0);
33 signal IRF_DAT_O : std_logic_vector (15 downto 0);
34 signal IRF_STB_O : std_logic;
35 signal IRF_WE_O : std_logic;
37 signal LUT_ADR_O : std_logic_vector (LUT_ADR_W-1 downto 0);
38 signal LUT_DAT_I : std_logic_vector (LUT_DAT_W-1 downto 0);
39 signal LUT_STB_O : std_logic;
41 signal MCC_ACK : std_logic_vector (3 downto 0);
42 signal MCC_STB : std_logic_vector (3 downto 0);
43 signal MCC_MUX_CODE : std_logic_vector (1 downto 0);
44 signal MCC_MUX_EN : std_logic;
47 signal MASTER_IRF_ADR_O : std_logic_vector (IRF_ADR_W-1 downto 0);
48 signal MASTER_IRF_DAT_O : std_logic_vector (15 downto 0);
49 signal MASTER_IRF_STB_O : std_logic;
50 signal MASTER_IRF_WE_O : std_logic;
52 signal VECTOR_IRF_ADR_O : std_logic_vector (IRF_ADR_W-1 downto 0);
53 signal VECTOR_IRF_DAT_O : std_logic_vector (15 downto 0);
54 signal VECTOR_IRF_STB_O : std_logic;
55 signal VECTOR_IRF_WE_O : std_logic;
58 subtype word_t is std_logic_vector (15 downto 0);
60 signal dbg_mem0 : word_t := "0000000000000010"; -- read only by UUT
61 signal dbg_mem1 : word_t := (others => '0'); -- read only by vector_gen
62 signal dbg_mem2 : word_t := (others => '0');
63 signal dbg_mem3 : word_t := (others => '0');
64 signal dbg_mem4 : word_t := (others => '0');
65 signal dbg_ack : std_logic := '0';
67 --------------------------------------------------------------------------------
71 IRF_ADR_O <= MASTER_IRF_ADR_O when MCC_MUX_EN = '0' else
72 VECTOR_IRF_ADR_O when MCC_MUX_CODE = 1 else
75 IRF_DAT_O <= MASTER_IRF_DAT_O when MCC_MUX_EN = '0' else
76 VECTOR_IRF_DAT_O when MCC_MUX_CODE = 1 else
79 IRF_STB_O <= MASTER_IRF_STB_O when MCC_MUX_EN = '0' else
80 VECTOR_IRF_STB_O when MCC_MUX_CODE = 1 else
83 IRF_WE_O <= MASTER_IRF_WE_O when MCC_MUX_EN = '0' else
84 VECTOR_IRF_WE_O when MCC_MUX_CODE = 1 else
88 uut : entity work.mcc_master
92 IRF_ADR_W => IRF_ADR_W)
100 MCC_MUX_CODE => MCC_MUX_CODE,
101 MCC_MUX_EN => MCC_MUX_EN,
102 IRF_ACK_I => IRF_ACK_I,
103 IRF_ADR_O => MASTER_IRF_ADR_O,
104 IRF_DAT_I => IRF_DAT_I,
105 IRF_DAT_O => MASTER_IRF_DAT_O,
106 IRF_STB_O => MASTER_IRF_STB_O,
107 IRF_WE_O => MASTER_IRF_WE_O);
109 vector_gen_1 : entity work.vector_gen
114 ACK_O => MCC_ACK (1),
117 STB_I => MCC_STB (1),
118 IRF_ACK_I => IRF_ACK_I,
119 IRF_ADR_O => VECTOR_IRF_ADR_O,
121 IRF_DAT_I => IRF_DAT_I,
122 IRF_DAT_O => VECTOR_IRF_DAT_O,
123 IRF_STB_O => VECTOR_IRF_STB_O,
124 IRF_WE_O => VECTOR_IRF_WE_O,
125 LUT_ADR_O => LUT_ADR_O,
126 LUT_DAT_I => LUT_DAT_I,
127 LUT_STB_O => LUT_STB_O);
129 wave_table_1 : entity work.wave_table
133 INIT_FILE => LUT_INIT_FILE)
138 DAT_I => (others => '0'),
144 SYSCON_CLK : process is
156 SYSCON_RST : process is
160 wait for 0.75*period;
168 DBG_MEM : process (IRF_STB_O, CLK_I) is
170 IRF_ACK_I <= IRF_STB_O and (IRF_WE_O or dbg_ack);
172 if rising_edge(CLK_I) then
173 dbg_ack <= IRF_STB_O;
176 if rising_edge(CLK_I) and IRF_STB_O = '1' then
177 if IRF_WE_O = '0' then
178 case conv_integer(IRF_ADR_O) is
179 when 0 => IRF_DAT_I <= dbg_mem0;
180 when 1 => IRF_DAT_I <= dbg_mem1;
181 when 2 => IRF_DAT_I <= dbg_mem2;
182 when 3 => IRF_DAT_I <= dbg_mem3;
183 when 4 => IRF_DAT_I <= dbg_mem4;
184 when others => IRF_DAT_I <= (others => '0');
187 case conv_integer(IRF_ADR_O) is
188 when 1 => dbg_mem1 <= IRF_DAT_O;
189 when 2 => dbg_mem2 <= IRF_DAT_O;
190 when 3 => dbg_mem3 <= IRF_DAT_O;
191 when 4 => dbg_mem4 <= IRF_DAT_O;
198 --------------------------------------------------------------------------------
200 UUT_FEED : process is
208 --dbg_mem0 <= (others => '0');
209 --dbg_mem0(LUT_ADR_O'RANGE) <= conv_std_logic_vector(i, LUT_ADR_W);
212 wait until rising_edge(CLK_I) and ACK_O = '1';