Formal Methods for Hardware Verification