aboutsummaryrefslogtreecommitdiff
path: root/MicSim/test/test_ram.py
blob: 2a9b9329c4d10a3275a526b70d2645ecbc320a08 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86

from components.ram import Ram
import unittest
from random import randint


class RamTest(unittest.TestCase):
	
	def setUp(self):
		"""
			Init test
		"""
		self.caretaker=dict({"MDR":0,"MAR":0,"MBR":0,"PC":0})

	def test_write(self):
		"""
			Test write method
		"""
		# Test write action
		for i in range(0,32): # Test for n number
			toWrite=randint(0,2**i) # Pick a random number to write
			self.caretaker["MDR"]=toWrite
			self.caretaker["MAR"]=randint(0,10000-1)

			ram=Ram(self.caretaker,10000)
			ram.write() # Write a random number at address 0
			
			data=ram.getData() # Dump ram
			##### Test if everything is written using big endian model #####
			self.assertEqual((toWrite>>24)&0xFF,data[self.caretaker["MAR"]])
			self.assertEqual((toWrite>>16)&0xFF,data[self.caretaker["MAR"]+1])
			self.assertEqual((toWrite>>8)&0xFF,data[self.caretaker["MAR"]+2])
			self.assertEqual(toWrite&0xFF,data[self.caretaker["MAR"]+3])
		# Test error is raise when writing out of memory
		self.caretaker["MDR"]=randint(0,2**i)
		self.caretaker["MAR"]=1000 # Write out of memory (positive address)
		ram=Ram(self.caretaker,1000)
		with self.assertRaises(Exception):
			ram.write()
		self.caretaker["MDR"]=randint(0,2**i)
		self.caretaker["MAR"]=-1000 # Write out of memory (negative address)
		ram=Ram(self.caretaker,1000)
		with self.assertRaises(Exception):
			ram.write()
		
	def test_read(self):
		"""
			Test read method
		"""
		ram=Ram(self.caretaker,10000)
		data=dict()
		toWrite=randint(0,256-1)
		for i in range(0,10000): # Write in memory
			data[i]=toWrite # Write the random byte
		ram.setData(data)
		for i in range(0,int(10000/4)): # Read and check if its what we wrote
			self.caretaker["MAR"]=i*4
			data=ram.read() # Read start at 0 addr
			self.assertEqual(toWrite,(data>>24)&0xFF)
			self.assertEqual(toWrite,(data>>16)&0xFF)
			self.assertEqual(toWrite,(data>>8)&0xFF)
			self.assertEqual(toWrite,data&0xFF)
		# Try to read outside of the memory
		with self.assertRaises(Exception):
			self.caretaker["MAR"]=10000
			ram.read()
		with self.assertRaises(Exception):
			self.caretaker["MAR"]=-10000
			ram.read()
			
	def test_fetch(self):
		"""
			Test fetch method
		"""
		ram=Ram(self.caretaker,10000)
		for i in range(1,10000):
			self.caretaker["MDR"]=i
			self.caretaker["MAR"]=i
			ram.write()	

		
		
		

if __name__ == "__main__":
	unittest.main()