iPDLLevel 1 -version STD_1149_1_2013 iProcGroup SRAM_Demo iProc walkbits {dataBits textString numBits} { set dataBits [string range $dataBits 2 end] if {[string match "0" $dataBits]} { # All bits Failed iNote -status "All $textString Bits Failed.\n" iNote -status " Check OE, WE, and CS to SRAM\n" } else { set errorCount 0 set bitNum 0 iNote -status "Failing $textString Bit(s): \n" for {set idx [expr $numBits-1]} {$idx >= 0} {incr idx -1} { if {[string index $dataBits $idx] == 1} { if {$errorCount == 0} { iNote -status "\t" } iNote -status "$textString\[$bitNum\] " incr errorCount if {$errorCount == 4} { set errorCount 0 iNote -status "\n" } } incr bitNum } if {$errorCount > 0} { iNote -status "\n" } } } iProc runBIST -export { mode } { iNote -status "\nInitiating Memory BIST, mode $mode\n" # Initiate MEMBIST iWrite MuxSel TestMode iWrite Mode $mode iWrite Enable Yes iApply # Get Results iWrite Enable No iRead Status ; # not needed since it is known this is on same TDR iWrite MuxSel FuncMode iApply set status [iGet -mnem Status] iWrite ClearResults Yes ;# pulses iRead Result_Data ;# Reads capture before writes are updated iApply set ResultAddr [iGet -bin Result_Addr] set ResultData [iGet -bin Result_Data] if {$status == "Pass"} { return "PASS" } elseif {$status == "Fail"} { iNote -status "BIST Test Failed, Mode $mode\n" if {$ResultAddr != "0x000"} { iCall walkbits $ResultAddr "Address" 12 } if {$ResultData != "0x0000"} { iCall walkbits $ResultData "Data" 16 } return "FAIL" } elseif {($status == "Invalid1") || ($status == "Invalid2")} { iNote -status "BIST Test Failed with Invalid Result, status: $status\n" return "INVALID" } elseif {$status == "Busy"} { iNote -status "BIST Test Did Not Finish, Mode $mode\n" return "BUSY" } else { iNote -status "BIST Test Result is Unknown, status: $status\n" return "UNKNOWN" } }