Exemplo n.º 1
0
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)
Exemplo n.º 2
0
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()
Exemplo n.º 3
0
    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))
Exemplo n.º 4
0
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))
Exemplo n.º 5
0
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()
Exemplo n.º 6
0
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()
Exemplo n.º 7
0
    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
Exemplo n.º 8
0
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'
Exemplo n.º 9
0
def negedge():
    global cycles
    cycles += 1
    if cycles > 1000:
        logs.log_info('finish')
        veri.finish()
        sys.exit()
Exemplo n.º 10
0
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))
Exemplo n.º 11
0
    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  = []
Exemplo n.º 12
0
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()
Exemplo n.º 13
0
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
Exemplo n.º 14
0
 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'
Exemplo n.º 15
0
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
Exemplo n.º 16
0
 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)
Exemplo n.º 17
0
    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()
Exemplo n.º 18
0
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
Exemplo n.º 19
0
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
Exemplo n.º 20
0
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()
Exemplo n.º 21
0
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
Exemplo n.º 22
0
    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'
Exemplo n.º 23
0
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()
Exemplo n.º 24
0
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
Exemplo n.º 25
0
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()
Exemplo n.º 26
0
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()
Exemplo n.º 27
0
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'
Exemplo n.º 28
0
 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))
Exemplo n.º 29
0
    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
Exemplo n.º 30
0
 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)