High performance memory testing :design principles, fault modeling, and self-test