Overcoming Device Level Challenges to Enable Compute In-Memory with Emerging Non-Volatile Memory