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 print_fail(self, What, Sig, Char, Now): Str = '%s %s exp=%s act=%s vec=%d line=%d cycle=%d time=%s\n' % ( What, Sig, str(Char), str(Now), self.emitting, self.activeline, self.cycle, str(veri.stime())) logs.log_wrong(Str) self.bads += 1 veri.force('tb.bads', str(self.bads))
def get_cycles(): global noCycles, Cycles if Cycles > 0: return Cycles if noCycles: if veri: return veri.stime() return 0 else: Now = peek('%scycles' % TB) if (Now < 0) and ((not veri) or (veri.stime() > 10)): noCycles = True log_info('NO CYCLES') if (finishCycles > 0) and (finishCycles <= Now): if veri: veri.finish() sys.exit() return Now
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 default(self, Txt): if Txt == 'EOF': sys.exit() wrds = string.split(Txt) if len(wrds) > 0: Queue.append(Txt) executeCommands() Intr.prompt = '@%d ?:' % veri.stime() CommandsHistory.append(Txt) return False
def status(Text="status"): if veri: Now = '@' + str(veri.stime()) + ':' else: Now = '' if (Wrongs == 0) and (Errors == 0) and (Warnings == 0): Text = '@%d: %s corrects=%d on all good %s' % (get_cycles(), Now, Corrects, Text) else: Text = '@%d: %s: wrongs=%d vs corrects=%d errors=%d warnings=%d: on %s' % ( get_cycles(), Now, Wrongs, Corrects, Errors, Warnings, Text) log_info(Text)
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 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(): Time = veri.stime() awvalid = peeklocal('awvalid') awready = peeklocal('awready') if (awvalid == 1) and (awready == 1): veri.force('aaa', str(Time & 0x1f)) veri.force('bbb', str(~Time & 0x1f)) awaddr = peeklocal('awaddr') awsize = peeklocal('awsize') awlen = peeklocal('awlen') Totals['aw'] += (awlen + 1) * (1 << awsize) logs.log_info('#%d aw addr=%x size=%s len=%s totaw=%d ' % (Time, awaddr, awsize, awlen, Totals['aw'])) if (peeklocal('wvalid') == 1) and (peeklocal('wready') == 1): wstrb = peeklocal('wstrb') wdata = peeklocal('wdata') wlast = peeklocal('wlast') wlast = peeklocal('wlast') bytes = logs.countOnes(wstrb) Totals['dw'] += bytes logs.log_info('#%d wd data=%x wstrb=%x last=%d totdw=%d' % (Time, wdata, wstrb, wlast, Totals['dw'])) arvalid = peeklocal('arvalid') arready = peeklocal('arready') if (arvalid == 1) and (arready == 1): araddr = peeklocal('araddr') arsize = peeklocal('arsize') arlen = peeklocal('arlen') arid = peeklocal('arid') Keep['arid'] = arsize Totals['ar'] += (arlen + 1) * (1 << awsize) logs.log_info('#%d ar addr=%x size=%s len=%s totar=%d' % (Time, araddr, arsize, arlen, Totals['ar'])) if (peeklocal('rvalid') == 1) and (peeklocal('rready') == 1): rdata = peeklocal('rdata') rlast = peeklocal('rlast') rid = peeklocal('rid') Totals['rd'] += (1 << Keep[rid]) logs.log_info('#%d rd data=%x rlast=%x totrd=%d' % (Time, rdata, rlast, Totals['rd'])) monitorCommands(Time)
def emptyline(self): Queue.append('.') executeCommands() Intr.prompt = '@%d ?:' % veri.stime() CommandsHistory.append('.') return False
def stime(): if veri: return veri.stime() return 0
def run(self): if self.lastRunTime>0: self.clockRunDuration = veri.stime() - self.lastRunTime self.lastRunTime = veri.stime() if self.waiting: self.waiting -= 1 if (self.waiting>0) and ((self.waiting % 100)==0): logs.log_info('waiting ilia %d'%self.waiting) return if self.waitUntilOr!=[]: for (Sig,Val) in self.waitUntilOr: Act = self.peek(Sig) if Act == logs.intxx(Val): self.waitUntilOr=[] logs.log_info('waitUntilOr done') return self.waitNum += 1 if (self.waitNum % 1000)==0: logs.log_info('waitUntilOr %d %s'%(self.waitNum,self.waitUntilOr)) return if self.waitUntilAnd!=[]: for (Sig,Val) in self.waitUntilAnd: Act = self.peek(Sig) if Act != logs.intxx(Val): self.waitNum += 1 if (self.waitNum % 1000)==0: logs.log_info('waitUntilAnd %d %s'%(self.waitNum,self.waitUntilAnd)) return self.waitUntilAnd=[] logs.log_info('waitUntilAnd done') return if self.waitVar: Exp = logs.getVar(self.waitVar) if (Exp == self.waitVal)or(str(Exp)==str(self.waitVal)): self.waitVar=False self.waitNum = 0 logs.log_info('waitVar %s ended exp=%s '%(self.waitVar,Exp)) else: self.waitNum += 1 if (self.waitNum % 1000)==0: logs.log_info('waitVar %s failed %d times over %s '%(self.waitVar,self.waitNum,self.waitVal)) if (self.waitNum>self.waitLimit)and(self.waitLimit>0): logs.log_error('waitVar %s reached limit (%d)'%(self.waitVar,self.waitLimit)) self.waitVar=False self.waitNum = 0 return if self.waitSig: Act = self.peek(self.waitSig) if self.waitVal[0] in '0123456789': Expr = '%s == %s'%(Act,self.waitVal) else: Expr = '%s %s'%(Act,self.waitVal) Cond = eval(Expr,self.Vars) if Cond: self.waitSig=False self.waitNum = 0 logs.log_info('waitUntil %s ended act=%s exp=%s '%(self.waitSig,Act,self.waitVal)) else: self.waitNum += 1 if (self.waitNum % 1000)==0: logs.log_info('waitUntil %s failed %d times act=%s exp=%s %s'%(self.waitSig,self.waitNum,Act,self.waitVal,Act==self.waitVal)) if (self.waitNum>self.waitLimit)and(self.waitLimit>0): logs.log_error('waitUntil %s reached limit (%d)'%(self.waitSig,self.waitLimit)) self.waitSig=False self.waitNum = 0 return if self.Queue==[]: logs.finishing() Cmd = self.Queue.pop(0) wrds = string.split(Cmd) if wrds==[]: return if wrds[0][0] in ['/','#']: return logs.log_info('cmd %s'%Cmd) if wrds[0]=='waitNanoSec': Dly = eval(wrds[1],self.Vars) Many = int(Dly*1000/self.clockRunDuration) self.waiting = Many logs.log_info('waitNanoSec dly=%d many=%d dura=%d'%(Dly,Many,self.clockRunDuration)) return if wrds[0]=='waitMicroSec': Dly = eval(wrds[1],self.Vars) Many = int(Dly*1000000/self.clockRunDuration) self.waiting = Many logs.log_info('waitMicroSec dly=%d many=%d dura=%d'%(Dly,Many,self.clockRunDuration)) return if wrds[0]=='wait': self.waiting = int(wrds[1]) return if wrds[0]=='comment': Txt = string.join(wrds[1:],' ') forceComment(Txt) return if wrds[0]=='finish': logs.finishing() return if wrds[0]=='include': Fname = wrds[1] if not os.path.exists(Fname): logs.log_info('include file "%s" was not found'%Fname) return lines = open(Fname).readlines() self.Queue = lines + db.Queue return if wrds[0]=='compareNet': Act = self.peek(wrds[1]) self.Vars['table']=db.Table Exp = eval(wrds[2],self.Vars) if Act==Exp: logs.log_correct('compareNet %s got 0x%x'%(wrds[1],Exp)) else: logs.log_wrong('compareNet %s exp=0x%x act=0x%x'%(wrds[1],Exp,Act)) return if wrds[0]=='force': where= wrds[1] if (len(where)>3)and(where[:3]=='tb.'): veri.force(wrds[1],str(eval(wrds[2],self.Vars))) else: veri.force('tb.%s'%wrds[1],str(eval(wrds[2],self.Vars))) return if wrds[0]=='hard_force': where= wrds[1] if (len(where)>3)and(where[:3]=='tb.'): veri.hard_force(wrds[1],str(eval(wrds[2],self.Vars))) else: veri.hard_force('tb.%s'%wrds[1],str(eval(wrds[2],self.Vars))) return if wrds[0]=='waitVar': self.waitVar = wrds[1] self.waitVal = wrds[2] self.waitNum = 0 if len(wrds)>3: self.waitLimit = int(wrds[3]) else: self.waitLimit=0 return if wrds[0]=='waitUntil': self.waitSig = wrds[1] self.waitVal = wrds[2] self.waitNum = 0 if len(wrds)>3: self.waitLimit = int(wrds[3]) else: self.waitLimit=0 return if wrds[0]=='waitUntilOr': self.waitUntilOr=[] self.waitNum = 0 ind=1 while ind<len(wrds): self.waitUntilOr.append((wrds[ind],wrds[ind+1])) ind += 2 return if wrds[0]=='waitUntilAnd': self.waitUntilAnd=[] self.waitNum = 0 ind=1 while ind<len(wrds): self.waitUntilAnd.append((wrds[ind],wrds[ind+1])) ind += 2 return logs.log_error('bad command "%s"'%Cmd) return
def do_assert(self, Txt): Queue.append('assert %s' % Txt) executeCommands() Intr.prompt = '@%d ?:' % veri.stime() CommandsHistory.append('assert %s' % Txt)
def do_status(self, Txt): Queue.append('status') executeCommands() Intr.prompt = '@%d ?:' % veri.stime() CommandsHistory.append('status %s' % Txt)
def do_include(self, Txt): Queue.append('include %s' % Txt) executeCommands() Intr.prompt = '@%d ?:' % veri.stime() CommandsHistory.append('include %s' % Txt)
def do_dma_ram(self, Txt): Queue.append('dma_ram %s' % Txt) executeCommands() Intr.prompt = '@%d ?:' % veri.stime() CommandsHistory.append('dma_ram %s' % Txt)
def do_ram_force(self, Txt): Queue.append('ram_force %s' % Txt) executeCommands() Intr.prompt = '@%d ?:' % veri.stime() CommandsHistory.append('ram_force %s' % Txt)