def log_err(Text,Tb=True): global Errors,printed_already,Flog if (not Flog): try: Flog=open(PYMONLOG,'w') except: print 'cannot open %s file. all goes to screen'%PYMONLOG Flog = sys.stdout Errors +=1 Flog.write('@%d: %d ERROR: %s\n'%(get_cycles(),Errors,Text)) try: veri.force('tb.errors',str(Errors)) except: pass if (Errors>MAXERRORS): log_info('max errors reached (%d). bailing out. (MAXERRORS==%d)'%(Errors,MAXERRORS)) veri.finish() sys.exit() # in icarus, sometimes finish doesnt catch if (Text in printed_already): return printed_already[Text]=1 print '@%d: %d: ERROR: %s'%(get_cycles(),Errors,Text)
def finish(Text='.'): print '@%d: wrongs=%d vs corrects=%d errors=%d warnings=%d: FINISHING on %s' % ( get_cycles(), Wrongs, Corrects, Errors, Warnings, Text) Flog.write( '@%d: wrongs=%d vs corrects=%d errors=%d warnings=%d: FINISHING on %s' % (get_cycles(), Wrongs, Corrects, Errors, Warnings, Text)) veri.finish()
def run(self): if self.waiting > 0: self.waiting -= 1 return if self.queue == []: return line = self.queue.pop(0) wrds = string.split(line) if len(wrds) > 0: if wrds[0] == 'finish': veri.finish() return if wrds[0] == 'wait': self.waiting = int(wrds[1]) return if wrds[0] == 'apb': Addr = eval(wrds[1]) Data = eval(wrds[2]) apb.wrqueue.append((Addr, Data)) return if wrds[0] == 'force': veri.force(wrds[1], wrds[2]) return logs.log_error('what is "%s"' % (line))
def runQueue(): global waiting # if len(Queue)>0: # logs.log_info('waiting=%d cmd0=%s len=%d '%(waiting,Queue[0],len(Queue))) # else: # logs.log_info('waiting=%d cmd0=0 len=%d '%(waiting,len(Queue))) if (waiting > 0): waiting -= 1 return while Queue != []: Cmd = Queue.pop(0) if Cmd[0] == 'wait': waiting = int(Cmd[1]) - 1 return if Cmd[0] == 'finish': logs.log_info('finishing on queue command') sys.exit() veri.finish() return if Cmd[0] == 'force': veri.force('tb.' + Cmd[1], str(Cmd[2])) # logs.log_info('forcing %s %s'%(Cmd[1],Cmd[2])) else: logs.log_error('bad queue directive "%s"' % str(Cmd))
def force_sigs(): global Patterns global pattern if (not started): starting() pattern.fill_buffers("302") done = pattern.emit_pattern() if (done == 0): pattern.Logf.close() pattern.Recordf.write('pattern_end %s ;\n' % PatternName[0]) pattern.Recordf.close() if (len(Patterns) > 0): pattern = swav_class(Patterns[0], len(Patterns)) pattern.fill_buffers("310") done = pattern.emit_pattern() Patterns = Patterns[1:] else: print 'goods=%d bads=%d' % (pattern.goods, pattern.bads) if (pattern.bads > 0): end_reason('failed on bads') elif (pattern.goods > 0): end_reason('Success') else: end_reason('Nothing happenned') veri.finish()
def finish(Txt): if finishReason: finishReason(Txt,Errors,Wrongs,Corrects) else: log_info('finishing %s with errors=%d wrongs=%d corrects=%d'%(Txt,Errors,Wrongs,Corrects)) veri.finish() sys.exit()
def peekOneFault(self): EndTime = time.time() Elapsed = int(EndTime-StartTime) Ok = False if self.Lines==[]: logs.log_info('exosted %s stucks file'%Fname) veri.finish() while not Ok: Pop = random.randint(0,len(self.Lines)) self.Line = self.Lines.pop(Pop) wrds = self.Line.split() if wrds[0]=='register': self.Fpath = wrds[1] self.Wid = int(wrds[2]) self.Pos = int(wrds[3]) veri.force(self.Fpath,hex(1<<self.Pos)) self.faulted += 1 logs.log_info('@%d seconds FAULTING DISC %d %s'%(Elapsed,self.faulted,self.Line)) self.Kind = 'register' Ok = True elif wrds[0]=='glvfault': self.Fpath = wrds[1] self.Kind = 'glvfault' veri.force(self.Fpath,'1') self.faulted += 1 logs.log_info('@%d seconds FAULTING DISC %d %s'%(Elapsed,self.faulted,self.Line)) Ok = True
def negedge(): global cycles, idle, Ain, state, Max cycles += 1 veri.force('tb.cycles', str(cycles)) if (cycles > 1000): veri.listing('tb', '1000', 'cucu.list') veri.finish() rst_n = veri.peek('tb.rst_n') if (rst_n != '1'): ain = veri.peek('tb.ain') Len = len(ain) Max = 1 << Len return veri.force('tb.en', '1') if state == 'idle': Ain = random.randint(0, Max) veri.force('tb.ain', logs.make_str(Ain)) veri.force('tb.vldin', '1') state = 'work0' elif state == 'work0': veri.force('tb.vldin', '0') state = 'wait0' elif state == 'wait0': vldout = logs.peek('tb.vldout') if vldout == 1: Out = logs.peek('tb.out') Exp = int(math.sqrt(Ain)) if Out == Exp: logs.log_correct('in=%d out=%d' % (Ain, Out)) else: logs.log_wrong('ain=%d max=%d expected=%d act=%d' % (Ain, Max, int(math.sqrt(Ain)), Out)) state = 'idle'
def negedge(): global cycles cycles += 1 if cycles > 1000: logs.log_info('finish') veri.finish() sys.exit()
def log_err(Text, Which=0, Tb=True, Pstack=False): global Errors, printed_already if (not Flogs[Which]): Flogs[Which] = open(PYMONLOG + str(Which), 'w') Errors += 1 Flogs[Which].write('@%d: %s %d ERROR: %s\n' % (get_cycles(), WHERE, Errors, Text)) if Pstack: traceback.print_stack(file=Flogs[Which]) if Tb: veri.force('%s.errors' % TB, str(Errors)) if (Errors > MAXERRORS): log_info( 'max errors reached (%d). bailing out. (MAXERRORS==%d)' % (Errors, MAXERRORS), Which) if finishReason: finishReason('too many errors', Errors + 1, Wrongs, Corrects) veri.finish() sys.exit() # in icarus, sometimes finish doesnt catch if (Text in printed_already): return printed_already[Text] = 1 print('@%d: %s %d: ERROR: %s' % (get_cycles(), WHERE, Errors, Text))
def run(self): if (self.state=='idle'): self.state='work0' self.force('startpulse',1) self.X = int(RAD*cosinus(self.Angle)) & 0xffffffff self.Y = int(RAD*sinus(self.Angle)) & 0xffffffff self.X = 0x4000 self.Y = 0x2000 self.force('Angle',self.Angle) if self.vector_mode: self.force('yin',self.Y) self.force('xin',self.X) self.force('anglein',0) self.force('vector_mode',1) else: self.force('yin',0) self.force('xin',39798) self.force('anglein',int(ONE*25)) self.force('vector_mode',0) elif (self.state=='work0'): self.state='work0_1' self.force('startpulse',0) self.monitor() elif (self.state=='work0_1'): self.state='work0_2' self.monitor() elif (self.state=='work0_2'): self.state='work1' self.monitor() elif (self.state=='work1'): donepulse = self.peek('donepulse') self.monitor() self.monitorOrig() self.mergers() if donepulse: o_real_part = self.peek('xout') o_imag_part = self.peek('yout') o_angle = self.peeksigned('angleout') if (o_angle<0): o_angle = -o_angle try: Ratio = (o_angle/self.Angle) except: Ratio = 'nonw' One = 0x10000000/45.0 angabs = abs(o_angle) Deg = angabs/One logs.log_info('REVISED expng=%d sync=%s real=%x imag=%x angle=%d (0x%x) (deg=%d) exp=%d x=%x y=%x ratio=%s'%(self.Angle,donepulse,o_real_part,o_imag_part,o_angle,o_angle,Deg,self.Angle,self.X,self.Y,Ratio)) self.Angle += 1 self.state='wait' elif (self.state=='wait'): veri.finish() sys.exit() self.state='idle' self.Revised = [] self.Golden = []
def negedge(): for Mon in Monitors: Mon.run() if veri.stime() > 5: veri.force("rst_n", '1') if veri.stime() > 1000000: veri.finish() sys.exit()
def use_command_wrds(self, wrds): if wrds == []: return if (wrds[0] in ['quit', 'exit']): veri.finish() elif wrds[0] in ['slow', 'sleep']: if len(wrds) == 1: veri.force('tb.run_slowly', '1') elif wrds[1] in ['True', '1']: veri.force('tb.run_slowly', '1') elif wrds[1] in ['False', '0']: veri.force('tb.run_slowly', '0') else: print 'command "slow" or "sleep" accept one parameter: True or False or 1 or 0"' elif wrds[0] == 'os': Cmd = string.join(wrds[1:], ' ') os.system(Cmd) elif wrds[0] == 'time': print 'time', veri.stime() elif wrds[0] == 'eval': Cmd = string.join(wrds[1:], ' ') print eval(Cmd) elif wrds[0] == 'exec': Cmd = string.join(wrds[1:], ' ') exec(Cmd) elif wrds[0] in ['file', 'source']: try: Fin = open(wrds[1]) except: print 'failed to open %s' % wrds[1] return lines = Fin.readlines() Fin.close() for line in lines: wrds0 = string.split(line) print '>>', wrds0 use_command_wrds(self, wrds0) elif (wrds[0] == 'clear'): apb.wrqueue = [] elif (wrds[0] == 'history'): for ind, X in enumerate(CommandsHistory): print ind, X elif (wrds[0] == 'reset'): veri.force('tb.rst_n', '0') apb.waiting = 20 elif (wrds[0] == 'listing'): veri.listing('tb', '100', 'deep.list') elif (wrds[0] == 'force'): veri.force(wrds[1], wrds[2]) elif (wrds[0] == 'peek'): Val = veri.peek(wrds[1]) logs.log_info('peeking %s 0x%x %s' % (wrds[1], logs.intx(Val), Val)) elif (wrds[0] == 'apb'): Addr = eval(wrds[1]) Data = eval(wrds[2]) apb.wrqueue.append((Addr, Data)) else: print 'y ', HELP
def __init__(self, Swavname, Indx): if not os.path.exists(Swavname): print 'swav file cannot be opened', Swavname veri.finish() sys.exit() self.File = open(Swavname, 'read') self.Logf = open('swav.logfile' + str(Indx), 'write') self.Recordf = open('record.swav' + str(Indx), 'write') self.state = 'idle' self.emitting = 0 self.swavsig = {} self.swavpos = {} self.ithlen = 0 self.buffer = [] self.linenum = 0 self.goods = 0 self.bads = 0 self.cycle = 1 self.pattern = [] self.activeline = 0 state = 'idle' pos = 0 while (self.state != 'work'): line = self.File.readline() if (len(line) == 0) or (self.state == 'quit'): print '>>>>> %s' % (self.swavsig) return self.linenum = self.linenum + 1 line = string.replace(line, ';', ' ; ') line = string.replace(line, '{', ' { ') self.Recordf.write(line) wrds = string.split(line) if (len(wrds) > 0): if (state == 'idle'): if (wrds[0] == 'SignalGroups'): state = 'SignalGroups' elif (wrds[0] == 'Pattern'): state = 'pattern' PatternName[0] = wrds[1] elif (state == 'SignalGroups'): if '}' == wrds[0]: state = 'idle' elif wrds[1] == '=': Vector = line x = Vector.index("'") Vector = Vector[x + 1:] x = Vector.index("'") Vector = Vector[:x] Vector = string.replace(Vector, '+', ' ') Sigs = string.split(Vector) pos = 0 for Sig in Sigs: self.add_swav_sig(Sig, pos) pos = pos + 1 elif (state == 'pattern'): self.fill_buffers("74") self.state = 'work'
def negedge(): global cycles cycles += 1 veri.force('tb.cycles', str(cycles)) if (cycles > 1000): veri.finish() rst_n = veri.peek('tb.rst_n') if (rst_n != '1'): return
def run(self): if self.waiting>0: self.waiting -= 1 return if self.waitNotBusy: if self.agents[self.waitNotBusy].busy(): return self.waitNotBusy = False if self.Sequence==[]: return Line = self.Sequence.pop(0) if '#' in Line: Line = Line[:Line.index('#')] if '//' in Line: Line = Line[:Line.index('//')] wrds = string.split(Line) if len(wrds)==0: return if wrds[0] == 'wait': self.waiting = eval(wrds[1]) return if wrds[0] == 'exec': Cmd = string.join(wrds[1:],' ') print '>>>>',Cmd exec(Cmd) return if wrds[0] == 'define': Var = wrds[1] Val = self.eval(wrds[2]) self.Translates[Var]=Val return if wrds[0] == 'finish': logs.log_info('finishing on sequence') veri.finish() sys.exit() if (wrds[0] == 'marker'): veri.force('tb.marker',wrds[1]) return elif (wrds[0] == 'force'): self.force(wrds[1],self.eval(wrds[2])) return elif wrds[0] in self.agents: if wrds[1]=='notbusy': self.waitNotBusy = wrds[0] return Wrds = map(str,map(self.eval,wrds[1:])) self.agents[wrds[0]].action(string.join(Wrds,' ')) return elif (wrds[0] == 'print'): Res = '' for Wrd in wrds[1:]: if self.peek(Wrd): Res += ' %s=%s'%(Wrd,self.peek(Wrd)) else: Res += ' '+Wrd logs.log_info('PRINT %s'%Res) return else: logs.log_error('what!! sequence failed on %s'%Line)
def run(self): if self.waiting > 0: self.waiting -= 1 return if self.state == 'write': if self.valid('avl_waitrequest'): return self.state = 'idle' self.force('avl_write', 0) self.force('avl_read', 0) self.force('avl_writedata', 0) self.force('avl_address', 0) self.force('avl_byteenable', 0) return elif self.state == 'read': if self.valid('avl_waitrequest'): return self.force('avl_write', 0) self.force('avl_read', 0) self.force('avl_writedata', 0) self.force('avl_address', 0) self.force('avl_byteenable', 0) if self.valid('avl_readdatavalid'): self.state = 'idle' rdata = self.peek('avl_readdata') logs.log_info('reading %08x' % rdata) return if self.Queue == []: return Cmd = self.Queue.pop(0) wrds = Cmd.split() if wrds[0] == 'write': Addr = eval(wrds[1]) Wdata = eval(wrds[2]) self.force('avl_write', 1) self.force('avl_read', 0) self.force('avl_writedata', Wdata) self.force('avl_address', Addr) self.force('avl_byteenable', 0xffffffff) self.state = 'write' self.waiting = 1 elif wrds[0] == 'read': Addr = eval(wrds[1]) self.force('avl_write', 0) self.force('avl_read', 1) self.force('avl_writedata', 0) self.force('avl_address', Addr) self.force('avl_byteenable', 0) self.state = 'read' self.waiting = 1 elif wrds[0] == 'wait': self.waiting = eval(wrds[1]) return elif wrds[0] == 'finish': veri.finish()
def log_wrong(Text): global Wrongs,Flog Wrongs += 1 veri.force('tb.wrongs',str(Wrongs)) if (not Flog): Flog=open(PYMONLOG,'w') print '@%d: %d vs %d (err=%d): WRONG: %s'%(get_cycles(),Wrongs,Corrects,Errors,Text) Flog.write('@%d: %d vs %d (err=%d): WRONG: %s\n'%(get_cycles(),Wrongs,Corrects,Errors,Text)) if Wrongs >= MAXWRONGS: log_info('max wrongs reached (%d). bailing out. (MAXWRONGS==%d)'%(Wrongs,MAXWRONGS)) veri.finish() sys.exit() # in icarus, sometimes finish doesnt catch
def get_cycles(): global noCycles if noCycles: return veri.stime() else: Now = peek('%s.cycles' % TB) if Now < 0: noCycles = True if (finishCycles > 0) and (finishCycles <= Now): veri.finish() sys.exit() return Now
def keepSimulationAlive(): if ALIVES==[]: return When = 0 Blame = '' for Obj in ALIVES: This,Who = Obj.run() if This>When: Blame=Who When = max(When,This) # log_info('max when %d cycles %d by %s'%(When,get_cycles(),Blame)) if When==0: return if When<(get_cycles()-20): log_info('keepSimulationAlive decided to end this simulation (%s)'%Blame) veri.finish()
def finishing(Txt='"not given"', ContinueFor=20): global finishCycles if finishCycles > 0: return log_info('finishing %s with errors=%d wrongs=%d corrects=%d' % (Txt, Errors, Wrongs, Corrects)) closeLogs() if finishReason: finishReason(Txt, Errors, Wrongs, Corrects) else: if veri: veri.finish() closeLogs() sys.exit() finishCycles = get_cycles() + ContinueFor
def run(self): if self.state == 'idle': if self.queue != []: self.Tms, self.Tdi, self.Catch = self.queue.pop(0) if self.Tms == 'force': veri.force(self.Tdi, str(self.Catch)) return if self.Tms == 'label': self.Catch.write('%s\n' % self.Tdi) return if self.Tms == 'finish': logs.log_info('finishing from jtag sequence') # self.Catch.write(self.Tdi) veri.finish() return self.force(self.jtck, 0) self.force(self.jtms, self.Tms) self.force(self.jtdi, self.Tdi) self.state = 'step0' else: self.force(self.jtck, 0) self.force(self.jtms, 0) self.force(self.jtdi, 0) return elif self.state == 'step0': self.force(self.jtck, 1) self.state = 'step1' elif self.state == 'step1': self.force(self.jtck, 0) if self.Catch == 1: self.responce = veri.peek( '%s.%s' % (self.Path, self.jtdo)) + self.responce elif self.Catch == 'x': self.responce = 'X' + self.responce elif self.responce != '': (Cmd, Val, Len) = self.commands.pop(0) RR = logs.intx(self.responce) try: logs.log_info('jtag RES 0x%x %s %x %s %x %s lastir=(%x)' % (RR, self.responce, logs.intx(self.responce), Cmd, Val, Len[0], Len[1])) except: logs.log_info('jtag RES 0x%x %s %s %s (x) %s lastir=(%s)' % (RR, self.responce, Cmd, Val, Len, Len)) if self.callback: self.callback(logs.intx(self.responce), Cmd, Val, Len) self.responce = '' else: self.responce = '' self.state = 'idle'
def negedge(): global cycles cycles += 1 veri.force('tb.cycles',str(cycles)) if (cycles>2000): veri.finish() rst_n = veri.peek('tb.rst_n') if (rst_n!='1'): return if (cycles==30): veri.listing('tb','100','deep.list') if (cycles>30): for Mon in Monitors: Mon.run()
def log_wrong(Text,Which=0): global Wrongs Wrongs += 1 veri.force('%s.wrongs'%TB,str(Wrongs)) if (not Flogs[Which]): Flogs[Which]=open(PYMONLOG+str(Which),'w') print('@%d: %d vs %d (err=%d): WRONG: %s'%(get_cycles(),Wrongs,Corrects,Errors,Text)) Flogs[Which].write('@%d: %d vs %d (err=%d): WRONG: %s\n'%(get_cycles(),Wrongs,Corrects,Errors,Text)) if Wrongs >= MAXWRONGS: log_info('max wrongs reached (%d). bailing out. (MAXWRONGS==%d)'%(Wrongs,MAXWRONGS),Which) if finishReason: finishReason('too many wrongs',Errors,Wrongs+1,Corrects) veri.finish() sys.exit() # in icarus, sometimes finish doesnt catch
def finish_now(Text='.'): global Flog if (not Flog): Flog = open(PYMONLOG, 'w') Now = veri.stime() if (Wrongs == 0) and (Errors == 0) and (Warnings == 0): Text = '@%d: @%d: corrects=%d FINISHING on all good %s' % ( get_cycles(), Now, Corrects, Text) else: Text = '@%d: @%d: wrongs=%d vs corrects=%d errors=%d warnings=%d: FINISHING on %s' % ( get_cycles(), Now, Wrongs, Corrects, Errors, Warnings, Text) print(Text) Flog.write(Text + '\n') veri.finish()
def negedge(): global cycles cycles += 1 veri.force('tb.cycles',str(cycles)) if (cycles>GIVEUP_TIMEOUT): logs.log_info('finishing on default guard of %d'%GIVEUP_TIMEOUT) veri.finish() rst_n = veri.peek('tb.rst_n') if (rst_n!='1'): return if (cycles==30): veri.listing('tb','100','deep.list') if (cycles>30): for Mon in Monitors: Mon.run()
def negedge(): global cycles, idle, Ain, state, Max, Pause cycles += 1 veri.force('tb.cycles', str(cycles)) if (cycles > 1000000): veri.listing('tb', '1000', 'cucu.list') veri.finish() return veri.force('tb.en', '1') rst_n = veri.peek('tb.rst_n') if (rst_n != '1') and (cycles < 100): ain = veri.peek('tb.ain') Len = len(ain) Max = 1 << Len veri.force('tb.makeStuckList', '1') return if (cycles > 30): for Mon in Monitors: Mon.run() if state == 'reset': Pause -= 1 if Pause == 0: state = 'idle' veri.force('tb.rst_n', '1') elif state == 'idle': Ain = random.randint(0, Max) veri.force('tb.ain', logs.make_str(Ain)) veri.force('tb.vldin', '1') state = 'work0' elif state == 'work0': veri.force('tb.vldin', '0') state = 'wait0' elif state == 'wait0': vldout = logs.peek('tb.vldout') if vldout == 1: state = 'idle' return Out = logs.peek('tb.out') Exp = int(math.sqrt(Ain)) if Out == Exp: logs.log_correct('in=%d out=%d' % (Ain, Out)) else: logs.log_wrong('ain=%d max=%d expected=%d act=%d' % (Ain, Max, int(math.sqrt(Ain)), Out)) state = 'idle'
def check_pattern(self): Exit = '' Failed = False for Ind in range(0, self.ithlen): Char = self.pattern[Ind] Sig = self.swavpos[Ind] Exit = Exit + Char if (Char == '?'): Now = veri.peek('tb.' + Sig) Exit = Exit[0:-1] + look(NN) elif (Char in ['H', 'L']) and (Sig != 'sda'): Now = veri.peek('tb.' + Sig) if ((not (Now == '0')) and (Char == 'L')): self.bads = self.bads + 1 Failed = True self.print_fail('fail0', Sig, Char, Now) Exit = Exit[0:-1] + look(Now) elif ((not (Now == '1')) and (Char == 'H')): self.bads = self.bads + 1 Failed = True self.print_fail('fail1', Sig, Char, Now) Exit = Exit[0:-1] + look(Now) elif (Now in ['X', 'Z', 'x', 'z']) and (Char in ['L', 'H']): self.bads = self.bads + 1 Failed = True self.print_fail('failx', Sig, Char, Now) Exit = Exit[0:-1] + look(Now) else: self.goods = self.goods + 1 if (self.bads > TOOMANYBADS): print 'too many fails' self.Logf.close() self.Recordf.write('pattern_end %s ;\n' % (PatternName[0])) self.Recordf.close() veri.finish() else: veri.force('tb.bads', str(self.bads)) veri.force('tb.goods', str(self.goods)) if ((self.activeline % 100) == 0): logs.log_info( 'goods=%d bads=%d pattern_width=%d activeline=%d ' % (self.goods, self.bads, self.ithlen, self.activeline)) if (Failed): self.Recordf.write('V { bist = %s ; } /* %5d fail exp=%s */\n' % (Exit, self.activeline, self.pattern)) else: self.Recordf.write('V { bist = %s ; } /* %5d */\n' % (Exit, self.activeline))
def run(self): if self.Sig=='timeout': if self.Wait<=get_cycles(): Txt = 'keepSimulationAlive decided to end this simulation, on timeout' log_info(Txt) if finishReason: finishReason(Txt,Errors,Wrongs,Corrects) veri.finish() return 0,'timeout' Now = veri.peek(self.Sig) if Now != self.Val: self.Val = Now self.finishTime = get_cycles() + self.Wait # log_info('advance time %s to %d'%(self.Sig,self.finishTime)) return self.finishTime,self.Sig
def runThis(self, Cmd): wrds = Cmd.split() if wrds == []: pass elif (wrds[0] == 'wait'): self.waiting = int(wrds[1]) elif (wrds[0] == 'finish'): logs.log_info('veri finish from axi Master') veri.finish() sys.exit() elif (wrds[0] == 'force'): for wrd in wrds[1:]: ww = wrd.split('=') Var = ww[0] Val = eval(ww[1]) self.force(Var, Val)