2 USE ieee.std_logic_1164.ALL;
3 USE ieee.numeric_std.all;
9 USE work.lx_rocon_pkg.all;
16 ARCHITECTURE behavior OF lx_tumbl_tb IS
19 signal clk_cpu : std_logic := '0';
20 signal clk_50m : std_logic := '0';
21 -- Clock period definitions
22 --constant clk_period_cpu : time := 13.8 ns;
23 constant clk_period_50m : time := 20 ns;
24 constant cycle_cnt_limit : natural := 2**20 - 1;
25 signal cycle_cnt : integer range 0 to cycle_cnt_limit;
27 signal tumbl_reset_s : std_logic := '1';
29 -- Internal memory signals
30 signal imem_en_s : std_logic := '0';
31 signal dmem_en_s : std_logic := '0';
33 signal imem_we_s : std_logic_vector(3 downto 0) := "0000";
34 signal dmem_we_s : std_logic_vector(3 downto 0) := "0000";
36 signal imem_data_o_s : std_logic_vector(31 downto 0);
37 signal dmem_data_o_s : std_logic_vector(31 downto 0);
39 signal imem_data_i_s : std_logic_vector(31 downto 0);
40 signal dmem_data_i_s : std_logic_vector(31 downto 0);
42 signal imem_address_s : std_logic_vector(8 downto 0);
43 signal dmem_address_s : std_logic_vector(9 downto 0);
45 signal xmemb_sel_s : std_logic;
46 signal xmemb_i_s : DMEMB2CORE_Type;
47 signal xmemb_o_s : CORE2DMEMB_Type;
49 signal imem_ready_s : std_logic := '0';
50 signal imem_fill_addr_s : natural range 0 to 2**8-1 := 0;
52 -- Simulate special events and interactions
53 signal delay_access_s : std_logic := '0';
54 signal delay_access_r : std_logic := '0';
55 signal delay_access_r2 : std_logic := '0';
58 -- Instantiate the Unit Under Test (UUT)
67 COMPATIBILITY_MODE_g => false
72 rst_i => tumbl_reset_s,
82 -- Internal memory (instruction)
83 imem_clk_i => clk_cpu,
84 imem_en_i => imem_en_s,
85 imem_we_i => imem_we_s,
86 imem_addr_i => imem_address_s,
87 imem_data_i => imem_data_i_s,
88 imem_data_o => imem_data_o_s,
90 -- Internal memory (data)
91 dmem_clk_i => clk_cpu,
92 dmem_en_i => dmem_en_s,
93 dmem_we_i => dmem_we_s,
94 dmem_addr_i => dmem_address_s,
95 dmem_data_i => dmem_data_i_s,
96 dmem_data_o => dmem_data_o_s,
98 -- External memory bus
99 xmemb_sel_o => xmemb_sel_s,
100 xmemb_i => xmemb_i_s,
105 xmemb_i_s.int <= '0'; -- No interrupt
107 setup_process :process
109 wait until clk_cpu'event and clk_cpu = '1';
110 if cycle_cnt < cycle_cnt_limit and imem_ready_s = '1' then
111 cycle_cnt <= cycle_cnt + 1;
114 if cycle_cnt < 8 then
115 tumbl_reset_s <= '1';
117 tumbl_reset_s <= '0';
121 setup_imem_process : process
122 file imem_file : text open READ_MODE is "imem.bits";
123 variable my_line : LINE;
124 variable bits_line : LINE;
125 variable mem_location : bit_vector(31 downto 0);
127 wait until clk_50m'event and clk_50m = '1';
129 if endfile(imem_file) then
130 if imem_ready_s = '0' then
131 write(my_line, string'("reading imem complete"));
132 writeline(output, my_line);
138 imem_address_s <= std_logic_vector(to_unsigned(imem_fill_addr_s, 9));
139 readline(imem_file, bits_line);
140 read(bits_line, mem_location);
141 imem_data_i_s <= to_stdLogicVector(mem_location);
144 imem_fill_addr_s <= imem_fill_addr_s + 1;
149 events_process: process(cycle_cnt, xmemb_sel_s, delay_access_r, delay_access_r2)
151 -- Simulate externall access to xmem bus shared with Tumbl
152 if cycle_cnt >= 33 and cycle_cnt <= 33 then
153 -- if xmemb_sel_s = '1' and (delay_access_r = '0' or delay_access_r2 = '0') then
154 delay_access_s <= '1';
156 delay_access_s <= '0';
160 -- Enable xmem clken only when bus available for Tumbl
161 xmemb_i_s.bus_taken <= delay_access_s;
162 xmemb_i_s.bus_wait <= '0';
164 xmemb_process :process
165 variable xmemb_addr_v : std_logic_vector(14 downto 0);
166 variable my_line : LINE;
168 wait until clk_cpu'event and clk_cpu = '1';
170 xmemb_i_s.data <= (others => 'X');
172 xmemb_addr_v := xmemb_o_s.addr;
174 if xmemb_o_s.rd = '1' then
175 if delay_access_s = '1' then
176 xmemb_i_s.data(31 downto 16) <= x"F0F0";
178 xmemb_i_s.data(31 downto 16) <= x"ACCE";
179 xmemb_i_s.data(15 downto 2) <= xmemb_addr_v(13 downto 0);
180 xmemb_i_s.data(1 downto 0) <= "00";
183 write(my_line, string'("@"));
184 write(my_line, cycle_cnt);
185 write(my_line, string'(" tumbl read @("));
186 write(my_line, to_bitvector(xmemb_o_s.addr));
187 write(my_line, string'(")"));
188 writeline(output, my_line);
191 if xmemb_o_s.bls /= "0000" then
192 write(my_line, string'("@"));
193 write(my_line, cycle_cnt);
194 write(my_line, string'(" tumbl write "));
195 write(my_line, to_bitvector(xmemb_i_s.data));
196 write(my_line, string'(" -> @("));
197 write(my_line, to_bitvector(xmemb_o_s.addr));
198 write(my_line, string'(")"));
199 writeline(output, my_line);
202 delay_access_r <= delay_access_s;
203 delay_access_r2 <= delay_access_r;
207 clk_50m_process :process
210 wait for clk_period_50m/2;
212 wait for clk_period_50m/2;
218 -- External ModelSim script