diff options
| author | Benedict <benedict@0xb8000.de> | 2018-04-26 11:16:56 +0200 |
|---|---|---|
| committer | Benedict <benedict@0xb8000.de> | 2018-04-26 12:36:19 +0200 |
| commit | 44b6d1019c6c4c6b08039be9c4043d5c0b2bcf89 (patch) | |
| tree | f8e568a5957596a4d539c48bb21f5906124e1373 | |
| parent | c53152068bd043d503b69d3f64a09ac592008e07 (diff) | |
eeprom: pi: added programm which checks the written EEPROM for correctness
| -rw-r--r-- | check_inst_eeprom.py | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/check_inst_eeprom.py b/check_inst_eeprom.py new file mode 100644 index 0000000..c70a320 --- /dev/null +++ b/check_inst_eeprom.py @@ -0,0 +1,104 @@ +## check afterwards if everything is written out correctly + +import eeprom_pi as ep + +import inst + +## for cmd line args access +import sys + +## checks the actual content of the EEPROM against the should have one +def check_micro_inst(address, instruction): + data = ep.read_data_at(address) + ctl_word_half = 0x00 + if eeprom_n == 1: + ctl_word_half = instruction & 0xff + elif eeprom_n == 2: + ctl_word_half = (instruction >> 8) & 0xff + + print("data type: %s, content: %s" % (type(data), hex(data))) + print("ctl_word_half type: %s, contet: %s" % (type(ctl_word_half), + hex(ctl_word_half))) + + if(data != ctl_word_half): + print("error at address %s: %s, should be: %s" % (hex(address), + hex(data), hex(ctl_word_half))) + + + +## look for cmd line parameter to known which EEPROM we write to currently +if(len(sys.argv) != 2): + print("usage: %s <number eeprom>" % sys.argv[0]) + print("please specify the eeprom you want to check.") + exit() + +eeprom_n = int(sys.argv[1]) + +if not (eeprom_n == 1 or eeprom_n == 2): + print("error: only two eeproms supported right now") + exit() + +print("checking eeprom %s" % eeprom_n) + +## setup board in read mode +ep.init_board(False) + +raw_input("plug EEPROM in and continue with any key...") + + +## for every instruction +nr_inst = 1 +for instruction_data in inst.INST: + print("checking instruction %s" % nr_inst) + base_address = instruction_data[0] + mops = instruction_data[1] + n = 0 + + # write fetch instruction micro ops for every instruction + for fi_mop in inst.INST_MICRO_OP_FETCH_INSTRUCTION: + check_micro_inst(base_address+n, fi_mop) + n += 1 + + for mop in mops: + check_micro_inst(base_address+n, mop) + n += 1 + + ## insert 0x00 for not used micro instuctions, so all control signals 0 + ## and the pc is not doing some unwanted stuff + while n < inst.MAX_MICRO_OPS: + check_micro_inst(base_address+n, 0x0000) + n += 1 + + print("------------") + + + nr_inst += 1 + + +## write a fetch instruction at address 0x0, so that after a reset we are +## fetching the first instruction +print("\n") +print("writing inst fetch instruction at address 0x0, so we begin executing" + "after reset:") +n = 0 +base_address = 0x0 +for fi_mop in inst.INST_MICRO_OP_FETCH_INSTRUCTION: + check_micro_inst(base_address+n, fi_mop) + n += 1 + +## write NULLs +while n < inst.MAX_MICRO_OPS: + check_micro_inst(base_address+n, 0x0000) + n += 1 + +## write HLT instruction aka, everything 0x00, no new instruction fetch cycle +n = 0 +base_address = inst.INST_HLT +while n < inst.MAX_MICRO_OPS*2: + check_micro_inst(base_address+n, 0x0000) + n += 1 + + +trash = raw_input("please unplug the power to the EEPORM now and press any key to continue") + +ep.cleanup() |
