Skip to content

Commit 5295f34

Browse files
committed
test cases
1 parent ffd795c commit 5295f34

13 files changed

+540
-30
lines changed

G24_Deliverable2/cache.vhd

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,11 +138,13 @@ begin
138138
end if;
139139
elsif word = 4 then
140140
--Write into cache
141-
c(index)(153) <= '1'; --Set valid flag to 1
142-
c(index) (154) <= '0'; --Set dirty flag to 0 since its modification ends
141+
c(index)(154) <= '1'; --Set valid flag to 1
142+
c(index) (153) <= '0'; --Set dirty flag to 0 since its modification ends
143143
s_readdata <= c(index)(127 downto 0)((offset * 32) - 1 downto 32 * (offset - 1)); --return data from given address of cache
144144
c(index)(152 downto 128) <= s_addr(31 downto 7); --Set tag of cache to given tag
145145
word := 0; --reset counter
146+
m_read <= '0'; -- reset m_read and m_write signals
147+
m_write <= '0';
146148
s_waitrequest <= '0';
147149
state <= idle; --operation ends switch to idle
148150
else
@@ -160,6 +162,7 @@ begin
160162
c(index)(152 downto 128) <= s_addr(31 downto 7); --Set tag of cache to given tag
161163

162164
s_waitrequest <= '0'; --set waitrequest to low since the process is done
165+
m_write <= '0';
163166
state <= idle; --return reading
164167
elsif word < 4 and m_waitrequest ='1' then --If the word count has not reached and main memory is ready to receving request
165168
address := c(index)(135 downto 128) & s_addr (6 downto 0); --Build adress for main memory and prepare necessary variables for writing the data

G24_Deliverable2/cache_tb.tcl

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,28 @@
11
proc AddWaves {} {
22
;#Add waves we're interested in to the Wave window
33
add wave -position end sim:/cache_tb/clk
4-
add wave -position end sim:/cache_tb/s_reset
4+
add wave -position end sim:/cache_tb/reset
5+
add wave -position end sim:/cache_tb/s_addr
6+
add wave -position end sim:/cache_tb/s_read
7+
add wave -position end sim:/cache_tb/s_readdata
8+
add wave -position end sim:/cache_tb/s_write
9+
add wave -position end sim:/cache_tb/s_writedata
10+
add wave -position end sim:/cache_tb/s_waitrequest
11+
add wave -position end sim:/cache_tb/m_addr
12+
add wave -position end sim:/cache_tb/m_read
13+
add wave -position end sim:/cache_tb/m_readdata
14+
add wave -position end sim:/cache_tb/m_write
15+
add wave -position end sim:/cache_tb/m_writedata
16+
add wave -position end sim:/cache_tb/m_waitrequest
517
}
618

719
vlib work
820

921
;# Compile components if any
1022
vcom cache.vhd
1123
vcom cache_tb.vhd
24+
vcom memory.vhd
25+
vcom memory_tb.vhd
1226

1327
;# Start simulation
1428
vsim cache_tb
@@ -20,4 +34,4 @@ force -deposit clk 0 0 ns, 1 0.5 ns -repeat 1 ns
2034
AddWaves
2135

2236
;# Run for 50 ns
23-
run 150ns
37+
run 250ns

G24_Deliverable2/cache_tb.vhd

Lines changed: 154 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ architecture behavior of cache_tb is
99

1010
component cache is
1111
generic(
12-
ram_size : INTEGER := 32768;
12+
ram_size : INTEGER := 32768
1313
);
1414
port(
1515
clock : in std_logic;
@@ -117,6 +117,159 @@ begin
117117

118118
-- put your tests here
119119

120+
-- 1. Invalid, dirty, read, hit (Invalid^hit==>impossible)
121+
-- 2. Invalid, dirty, read, miss (Invalid^dirty==>impossible)
122+
-- 3. Invalid, dirty, write, hit (Invalid^hit==>impossible)
123+
-- 4. Invalid, dirty, write, miss(Invalid^dirty==>impossible)
124+
-- 5. Invalid, clean, read, hit (Invalid^hit==>impossible)
125+
-- 6. Invalid, clean, read, miss
126+
-- s_addr <= "00000000000000000000000000000001";
127+
-- s_read <= '1';
128+
-- s_write <= '0';
129+
-- wait until rising_edge(s_waitrequest);
130+
-- s_read <= '0';
131+
-- s_write <= '0';
132+
-- wait for clk_period;
133+
134+
-- 7. Invalid, clean, write, hit (Invalid^hit==>impossible)
135+
-- 8. Invalid, clean, write, miss
136+
-- s_addr <= "00000000000000000000000000001000";
137+
-- s_read <= '0';
138+
-- s_write <= '1';
139+
-- s_writedata <= x"000000BC";
140+
-- wait until rising_edge(s_waitrequest);
141+
-- s_read <= '0';
142+
-- s_write <= '0';
143+
-- wait for clk_period;
144+
145+
-- 9. Valid, clean, read, hit
146+
-- s_addr <= "00000000000000000000111111111111";
147+
-- s_write <= '1';
148+
-- s_writedata <= x"000F000A";
149+
-- wait until rising_edge(s_waitrequest);
150+
-- s_read <= '1';
151+
-- s_write <= '0';
152+
-- wait until rising_edge(s_waitrequest);
153+
-- s_read <= '0';
154+
-- s_write <= '0';
155+
-- wait for clk_period;
156+
157+
-- 10. Valid, clean, read, miss
158+
-- s_addr <= "00000000000000000000000000001010";
159+
-- s_read <= '0';
160+
-- s_writedata <= x"000D000C";
161+
-- s_write <= '1';
162+
-- wait until rising_edge(s_waitrequest);
163+
-- s_addr <= "00000000000000000000000010001010";
164+
-- s_read <= '1';
165+
-- s_write <= '0';
166+
-- wait until rising_edge(s_waitrequest);
167+
-- s_read <= '0';
168+
-- s_write <= '0';
169+
-- wait for clk_period;
170+
171+
172+
-- 11. Valid, clean, write, hit
173+
-- s_addr <= "00000000000000000000000000001011";
174+
-- s_read <= '0';
175+
-- s_writedata <= x"000F000C";
176+
-- s_write <= '1';
177+
-- wait until rising_edge(s_waitrequest);
178+
-- s_write <= '1';
179+
-- s_read <= '0';
180+
-- s_writedata <= x"0000000B";
181+
-- wait until rising_edge(s_waitrequest);
182+
-- s_write <= '0';
183+
-- s_read <= '0';
184+
-- wait for clk_period;
185+
186+
-- 12. Valid, clean, write, miss
187+
-- s_addr <= "00000000000000000000000000001101";
188+
-- s_read <= '0';
189+
-- s_writedata <= x"000F000C";
190+
-- s_write <= '1';
191+
-- wait until rising_edge(s_waitrequest);
192+
-- s_addr <= "00000000000000000000100000001101";
193+
-- s_write <= '1';
194+
-- s_read <= '0';
195+
-- s_writedata <= x"0000000B";
196+
-- wait until rising_edge(s_waitrequest);
197+
-- s_write <= '0';
198+
-- s_read <= '0';
199+
-- wait for clk_period;
200+
201+
-- 13. Valid, dirty, read, hit
202+
-- s_addr <= "00000000000000000000000000001100";
203+
-- s_read <= '0';
204+
-- s_writedata <= x"000F00BC";
205+
-- s_write <= '1';
206+
-- wait until rising_edge(s_waitrequest);
207+
-- s_read <= '0';
208+
-- s_writedata <= x"000F00BA";
209+
-- s_write <= '1';
210+
-- wait until rising_edge(s_waitrequest); -- write hit, dirty
211+
-- s_read <= '1';
212+
-- s_write <= '0';
213+
-- wait until rising_edge(s_waitrequest);
214+
-- s_write <= '0';
215+
-- s_read <= '0';
216+
-- wait for clk_period;
217+
218+
-- 14. Valid, dirty, read, miss
219+
-- s_addr <= "00000000000000000000000000001110";
220+
-- s_read <= '0';
221+
-- s_writedata <= x"000F00BF";
222+
-- s_write <= '1';
223+
-- wait until rising_edge(s_waitrequest);
224+
-- s_read <= '0';
225+
-- s_writedata <= x"000F00BF";
226+
-- s_write <= '1';
227+
-- wait until rising_edge(s_waitrequest);
228+
-- s_addr <= "00000000000000000000000010001110";
229+
-- s_read <= '1';
230+
-- s_write <= '0';
231+
-- wait until rising_edge(s_waitrequest);
232+
-- s_write <= '0';
233+
-- s_read <= '0';
234+
-- wait for clk_period;
235+
236+
-- 15. Valid, dirty, write, hit
237+
-- s_addr <= "00000000000000000000000000001111";
238+
-- s_read <= '0';
239+
-- s_writedata <= x"000000BD";
240+
-- s_write <= '1';
241+
-- wait until rising_edge(s_waitrequest);
242+
-- s_read <= '0';
243+
-- s_writedata <= x"000F00BA";
244+
-- s_write <= '1';
245+
-- wait until rising_edge(s_waitrequest); -- write hit, dirty
246+
-- s_read <= '0';
247+
-- s_writedata <= x"000000BA"; -- write hit on the dirty
248+
-- s_write <= '1';
249+
-- wait until rising_edge(s_waitrequest);
250+
-- s_write <= '0';
251+
-- s_read <= '0';
252+
-- wait for clk_period;
253+
254+
-- 16. Valid, dirty, write, miss
255+
s_addr <= "00000000000000000000000000001111";
256+
s_read <= '0';
257+
s_writedata <= x"000000BD";
258+
s_write <= '1';
259+
wait until rising_edge(s_waitrequest);
260+
s_read <= '0';
261+
s_writedata <= x"000F00BA";
262+
s_write <= '1';
263+
wait until rising_edge(s_waitrequest);
264+
s_addr <= "00000000000000000000011000001111";
265+
s_read <= '0';
266+
s_writedata <= x"000FF0BA";
267+
s_write <= '1';
268+
wait until rising_edge(s_waitrequest);
269+
s_write <= '0';
270+
s_read <= '0';
271+
wait for clk_period;
272+
120273
end process;
121274

122275
end;

G24_Deliverable2/cache_tb.vhd.bak

Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
library ieee;
2+
use ieee.std_logic_1164.all;
3+
use ieee.numeric_std.all;
4+
5+
entity cache_tb is
6+
end cache_tb;
7+
8+
architecture behavior of cache_tb is
9+
10+
component cache is
11+
generic(
12+
ram_size : INTEGER := 32768;
13+
);
14+
port(
15+
clock : in std_logic;
16+
reset : in std_logic;
17+
18+
-- Avalon interface --
19+
s_addr : in std_logic_vector (31 downto 0);
20+
s_read : in std_logic;
21+
s_readdata : out std_logic_vector (31 downto 0);
22+
s_write : in std_logic;
23+
s_writedata : in std_logic_vector (31 downto 0);
24+
s_waitrequest : out std_logic;
25+
26+
m_addr : out integer range 0 to ram_size-1;
27+
m_read : out std_logic;
28+
m_readdata : in std_logic_vector (7 downto 0);
29+
m_write : out std_logic;
30+
m_writedata : out std_logic_vector (7 downto 0);
31+
m_waitrequest : in std_logic
32+
);
33+
end component;
34+
35+
component memory is
36+
GENERIC(
37+
ram_size : INTEGER := 32768;
38+
mem_delay : time := 10 ns;
39+
clock_period : time := 1 ns
40+
);
41+
PORT (
42+
clock: IN STD_LOGIC;
43+
writedata: IN STD_LOGIC_VECTOR (7 DOWNTO 0);
44+
address: IN INTEGER RANGE 0 TO ram_size-1;
45+
memwrite: IN STD_LOGIC;
46+
memread: IN STD_LOGIC;
47+
readdata: OUT STD_LOGIC_VECTOR (7 DOWNTO 0);
48+
waitrequest: OUT STD_LOGIC
49+
);
50+
end component;
51+
52+
-- test signals
53+
signal reset : std_logic := '0';
54+
signal clk : std_logic := '0';
55+
constant clk_period : time := 1 ns;
56+
57+
signal s_addr : std_logic_vector (31 downto 0);
58+
signal s_read : std_logic;
59+
signal s_readdata : std_logic_vector (31 downto 0);
60+
signal s_write : std_logic;
61+
signal s_writedata : std_logic_vector (31 downto 0);
62+
signal s_waitrequest : std_logic;
63+
64+
signal m_addr : integer range 0 to 2147483647;
65+
signal m_read : std_logic;
66+
signal m_readdata : std_logic_vector (7 downto 0);
67+
signal m_write : std_logic;
68+
signal m_writedata : std_logic_vector (7 downto 0);
69+
signal m_waitrequest : std_logic;
70+
71+
begin
72+
73+
-- Connect the components which we instantiated above to their
74+
-- respective signals.
75+
dut: cache
76+
port map(
77+
clock => clk,
78+
reset => reset,
79+
80+
s_addr => s_addr,
81+
s_read => s_read,
82+
s_readdata => s_readdata,
83+
s_write => s_write,
84+
s_writedata => s_writedata,
85+
s_waitrequest => s_waitrequest,
86+
87+
m_addr => m_addr,
88+
m_read => m_read,
89+
m_readdata => m_readdata,
90+
m_write => m_write,
91+
m_writedata => m_writedata,
92+
m_waitrequest => m_waitrequest
93+
);
94+
95+
MEM : memory
96+
port map (
97+
clock => clk,
98+
writedata => m_writedata,
99+
address => m_addr,
100+
memwrite => m_write,
101+
memread => m_read,
102+
readdata => m_readdata,
103+
waitrequest => m_waitrequest
104+
);
105+
106+
107+
clk_process : process
108+
begin
109+
clk <= '0';
110+
wait for clk_period/2;
111+
clk <= '1';
112+
wait for clk_period/2;
113+
end process;
114+
115+
test_process : process
116+
begin
117+
118+
-- put your tests here
119+
120+
end process;
121+
122+
end;

0 commit comments

Comments
 (0)