]> rtime.felk.cvut.cz Git - fpga/lx-cpu1/lx-rocon.git/blob - hw/tb/lx_rocon_top_tb.vhd
ROCON GHDL simulation testbed setup for concurrent access bug hunt.
[fpga/lx-cpu1/lx-rocon.git] / hw / tb / lx_rocon_top_tb.vhd
1 LIBRARY ieee;
2 USE ieee.std_logic_1164.ALL;
3 USE ieee.numeric_std.all;
4
5 LIBRARY std;
6 USE std.textio.all;
7
8 ENTITY lx_rocon_top_tb IS
9 END lx_rocon_top_tb;
10
11 ARCHITECTURE behavior OF lx_rocon_top_tb IS
12
13     -- Component Declaration for the Unit Under Test (UUT)
14
15     COMPONENT lx_rocon_top
16     PORT(
17          --clk_cpu : IN  std_logic;
18                                  clk_50m : IN  std_logic;
19          cs0_xc : IN  std_logic;
20          rd : IN  std_logic;
21          bls : IN  std_logic_vector(3 downto 0);
22          address : IN  std_logic_vector(15 downto 0);
23          data : INOUT  std_logic_vector(31 downto 0);
24                                  irc0_a : IN  std_logic;
25          irc0_b : IN  std_logic;
26          irc0_index : IN  std_logic;
27          irc0_mark : IN  std_logic;
28          irc1_a : IN  std_logic;
29          irc1_b : IN  std_logic;
30          irc1_index : IN  std_logic;
31          irc1_mark : IN  std_logic;
32          irc2_a : IN  std_logic;
33          irc2_b : IN  std_logic;
34          irc2_index : IN  std_logic;
35          irc2_mark : IN  std_logic;
36          irc3_a : IN  std_logic;
37          irc3_b : IN  std_logic;
38          irc3_index : IN  std_logic;
39          irc3_mark : IN  std_logic;
40          irc4_a : IN  std_logic;
41          irc4_b : IN  std_logic;
42          irc4_index : IN  std_logic;
43          irc4_mark : IN  std_logic;
44                                  irc5_a : IN  std_logic;
45          irc5_b : IN  std_logic;
46          irc5_index : IN  std_logic;
47          irc5_mark : IN  std_logic;
48                                  irc6_a : IN  std_logic;
49          irc6_b : IN  std_logic;
50          irc6_index : IN  std_logic;
51          irc6_mark : IN  std_logic;
52                                  irc7_a : IN  std_logic;
53          irc7_b : IN  std_logic;
54          irc7_index : IN  std_logic;
55          irc7_mark : IN  std_logic;
56          init : IN  std_logic;
57          s1_clk_in : IN  std_logic;
58          s1_miso : IN  std_logic;
59                                  s1_sync_in : IN  std_logic;
60          s1_clk_out : OUT  std_logic;
61                                  s1_mosi : OUT  std_logic;
62          s1_sync_out : OUT  std_logic
63         );
64     END COMPONENT;
65
66
67    --Inputs
68    --signal clk_cpu : std_logic := '0';
69          signal clk_50m : std_logic := '0';
70    signal cs0_xc : std_logic := '1';
71    signal rd : std_logic := '1';
72    signal bls : std_logic_vector(3 downto 0) := (others => '1');
73    signal address : std_logic_vector(15 downto 0) := (others => '0');
74          signal irc0_a : std_logic := '0';
75    signal irc0_b : std_logic := '0';
76    signal irc0_index : std_logic := '0';
77    signal irc0_mark : std_logic := '0';
78    signal irc1_a : std_logic := '0';
79    signal irc1_b : std_logic := '0';
80    signal irc1_index : std_logic := '0';
81    signal irc1_mark : std_logic := '0';
82    signal irc2_a : std_logic := '0';
83    signal irc2_b : std_logic := '0';
84    signal irc2_index : std_logic := '0';
85    signal irc2_mark : std_logic := '0';
86    signal irc3_a : std_logic := '0';
87    signal irc3_b : std_logic := '0';
88    signal irc3_index : std_logic := '0';
89    signal irc3_mark : std_logic := '0';
90    signal irc4_a : std_logic := '0';
91    signal irc4_b : std_logic := '0';
92    signal irc4_index : std_logic := '0';
93    signal irc4_mark : std_logic := '0';
94          signal irc5_a : std_logic := '0';
95    signal irc5_b : std_logic := '0';
96    signal irc5_index : std_logic := '0';
97    signal irc5_mark : std_logic := '0';
98          signal irc6_a : std_logic := '0';
99    signal irc6_b : std_logic := '0';
100    signal irc6_index : std_logic := '0';
101    signal irc6_mark : std_logic := '0';
102          signal irc7_a : std_logic := '0';
103    signal irc7_b : std_logic := '0';
104    signal irc7_index : std_logic := '0';
105    signal irc7_mark : std_logic := '0';
106    signal init : std_logic := '1';
107          signal s1_clk_in : std_logic := '1';
108          signal s1_miso : std_logic := '1';
109          signal s1_sync_in : std_logic := '1';
110
111          --Outputs
112          signal s1_clk_out : std_logic := '1';
113          signal s1_mosi : std_logic := '1';
114          signal s1_sync_out : std_logic := '1';
115
116          --BiDirs
117    signal data : std_logic_vector(31 downto 0);
118
119    -- Clock period definitions
120          --constant clk_period_cpu : time := 13.8 ns;
121    constant clk_period_50m : time := 20 ns;
122
123 BEGIN
124
125         -- Instantiate the Unit Under Test (UUT)
126    uut: lx_rocon_top PORT MAP (
127           --clk_cpu => clk_cpu,
128                                         clk_50m => clk_50m,
129           cs0_xc => cs0_xc,
130           rd => rd,
131           bls => bls,
132           address => address,
133           data => data,
134                                         irc0_a => irc0_a,
135           irc0_b => irc0_b,
136           irc0_index => irc0_index,
137           irc0_mark => irc0_mark,
138           irc1_a => irc1_a,
139           irc1_b => irc1_b,
140           irc1_index => irc1_index,
141           irc1_mark => irc1_mark,
142           irc2_a => irc2_a,
143           irc2_b => irc2_b,
144           irc2_index => irc2_index,
145           irc2_mark => irc2_mark,
146           irc3_a => irc3_a,
147           irc3_b => irc3_b,
148           irc3_index => irc3_index,
149           irc3_mark => irc3_mark,
150           irc4_a => irc4_a,
151           irc4_b => irc4_b,
152           irc4_index => irc4_index,
153           irc4_mark => irc4_mark,
154                                         irc5_a => irc5_a,
155           irc5_b => irc5_b,
156           irc5_index => irc5_index,
157           irc5_mark => irc5_mark,
158                                         irc6_a => irc6_a,
159           irc6_b => irc6_b,
160           irc6_index => irc6_index,
161           irc6_mark => irc6_mark,
162                                         irc7_a => irc7_a,
163           irc7_b => irc7_b,
164           irc7_index => irc7_index,
165           irc7_mark => irc7_mark,
166           init => init,
167                                         s1_clk_in => s1_clk_in,
168                                         s1_miso => s1_miso,
169                                         s1_sync_in => s1_sync_in,
170                                         s1_clk_out => s1_clk_out,
171                                         s1_mosi => s1_mosi,
172                                         s1_sync_out => s1_sync_out
173         );
174
175    -- Clock process definitions
176 --   clk_cpu_process :process
177 --   begin
178 --              clk_cpu <= '1';
179 --              wait for clk_period_cpu/2;
180 --              clk_cpu <= '0';
181 --              wait for clk_period_cpu/2;
182 --   end process;
183
184          clk_50m_process :process
185    begin
186                 clk_50m <= '1';
187                 wait for clk_period_50m/2;
188                 clk_50m <= '0';
189                 wait for clk_period_50m/2;
190    end process;
191
192
193    -- Stimulus process
194    stim_proc: process
195    begin
196       -- External ModelSim script
197
198       wait;
199    end process;
200
201         setup_imem_process : process
202                 file imem_file : text open READ_MODE is "imem.bits";
203                 variable my_line : LINE;
204                 variable bits_line : LINE;
205                 variable mem_location : bit_vector(31 downto 0);
206                 variable imem_fill_addr : natural range 0 to 2**8-1 := 0;
207         begin
208
209                 -- Assert ROCON system reset for 3 clock cycles
210                 wait until clk_50m'event and clk_50m = '1';
211                 init <= '0';
212                 wait until clk_50m'event and clk_50m = '1';
213                 wait until clk_50m'event and clk_50m = '1';
214                 wait until clk_50m'event and clk_50m = '1';
215                 init <= '1';
216
217                 -- Fill Tumbl instruction memory
218                 fill_loop: while not endfile(imem_file) loop
219                         wait until clk_50m'event and clk_50m = '1';
220                         cs0_xc <= '1';
221                         rd <= '1';
222                         bls <= "1111";
223                         wait until clk_50m'event and clk_50m = '1';
224                         address <= std_logic_vector(to_unsigned(imem_fill_addr, 16));
225                         readline(imem_file, bits_line);
226                         read(bits_line, mem_location);
227                         data <= to_stdLogicVector(mem_location);
228                         bls <= "0000";
229                         cs0_xc <= '0';
230                         imem_fill_addr := imem_fill_addr + 1;
231                         wait until clk_50m'event and clk_50m = '1';
232                         wait until clk_50m'event and clk_50m = '1';
233                         cs0_xc <= '1';
234                         rd <= '1';
235                         bls <= "1111";
236                 end loop fill_loop;
237
238                 -- Negate Tumbl reset state in Tumbl control register
239                 wait until clk_50m'event and clk_50m = '1';
240                 wait until clk_50m'event and clk_50m = '1';
241                 address <= x"0C00";
242                 data <= x"00000000";
243                 bls <= "0000";
244                 cs0_xc <= '0';
245                 wait until clk_50m'event and clk_50m = '1';
246                 wait until clk_50m'event and clk_50m = '1';
247                 cs0_xc <= '1';
248                 rd <= '1';
249                 bls <= "1111";
250
251                 -- Simulate external master accesses to Tumbl shared xmem bus
252                 xmem_loop: loop
253                         wait until clk_50m'event and clk_50m = '1';
254                         wait until clk_50m'event and clk_50m = '1';
255                         address <= x"8808";
256                         rd <= '0';
257                         cs0_xc <= '0';
258                         wait until clk_50m'event and clk_50m = '1';
259                         wait until clk_50m'event and clk_50m = '1';
260                         wait until clk_50m'event and clk_50m = '1';
261                         cs0_xc <= '1';
262                         rd <= '1';
263                         bls <= "1111";
264                 end loop xmem_loop;
265
266                 wait;
267
268         end process;
269
270 END;