diff --git a/phosphor-regulators/src/pmbus_error.hpp b/phosphor-regulators/src/pmbus_error.hpp
new file mode 100644
index 0000000..b589526
--- /dev/null
+++ b/phosphor-regulators/src/pmbus_error.hpp
@@ -0,0 +1,68 @@
+/**
+ * Copyright © 2020 IBM Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#pragma once
+
+#include <exception>
+#include <string>
+
+namespace phosphor::power::regulators
+{
+
+/**
+ * @class PMBusError
+ *
+ * An error that occurred while sending PMBus commands or converting data
+ * between PMBus formats.
+ */
+class PMBusError : public std::exception
+{
+  public:
+    // Specify which compiler-generated methods we want
+    PMBusError() = delete;
+    PMBusError(const PMBusError&) = default;
+    PMBusError(PMBusError&&) = default;
+    PMBusError& operator=(const PMBusError&) = default;
+    PMBusError& operator=(PMBusError&&) = default;
+    virtual ~PMBusError() = default;
+
+    /**
+     * Constructor.
+     *
+     * @param error error message
+     */
+    explicit PMBusError(const std::string& error) :
+        error{"PMBusError: " + error}
+    {
+    }
+
+    /**
+     * Returns the description of this error.
+     *
+     * @return error description
+     */
+    const char* what() const noexcept override
+    {
+        return error.c_str();
+    }
+
+  private:
+    /**
+     * Error message.
+     */
+    const std::string error{};
+};
+
+} // namespace phosphor::power::regulators
diff --git a/phosphor-regulators/src/write_verification_error.hpp b/phosphor-regulators/src/write_verification_error.hpp
new file mode 100644
index 0000000..ec9d7a6
--- /dev/null
+++ b/phosphor-regulators/src/write_verification_error.hpp
@@ -0,0 +1,71 @@
+/**
+ * Copyright © 2020 IBM Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#pragma once
+
+#include <exception>
+#include <string>
+
+namespace phosphor::power::regulators
+{
+
+/**
+ * @class WriteVerificationError
+ *
+ * An error that occurred when performing a read after a write to ensure the
+ * write was successful.
+ *
+ * This exception is thrown when the value read is different than the value
+ * written.  This is also known as a readback error.
+ */
+class WriteVerificationError : public std::exception
+{
+  public:
+    // Specify which compiler-generated methods we want
+    WriteVerificationError() = delete;
+    WriteVerificationError(const WriteVerificationError&) = default;
+    WriteVerificationError(WriteVerificationError&&) = default;
+    WriteVerificationError& operator=(const WriteVerificationError&) = default;
+    WriteVerificationError& operator=(WriteVerificationError&&) = default;
+    virtual ~WriteVerificationError() = default;
+
+    /**
+     * Constructor.
+     *
+     * @param error error message
+     */
+    explicit WriteVerificationError(const std::string& error) :
+        error{"WriteVerificationError: " + error}
+    {
+    }
+
+    /**
+     * Returns the description of this error.
+     *
+     * @return error description
+     */
+    const char* what() const noexcept override
+    {
+        return error.c_str();
+    }
+
+  private:
+    /**
+     * Error message.
+     */
+    const std::string error{};
+};
+
+} // namespace phosphor::power::regulators
diff --git a/phosphor-regulators/test/meson.build b/phosphor-regulators/test/meson.build
index 78661c5..140094b 100644
--- a/phosphor-regulators/test/meson.build
+++ b/phosphor-regulators/test/meson.build
@@ -6,9 +6,11 @@
 phosphor_regulators_tests_source_files = [
     'device_tests.cpp',
     'id_map_tests.cpp',
+    'pmbus_error_tests.cpp',
     'pmbus_utils_tests.cpp',
     'rail_tests.cpp',
     'rule_tests.cpp',
+    'write_verification_error_tests.cpp',
 
     'actions/action_environment_tests.cpp',
     'actions/action_error_tests.cpp',
diff --git a/phosphor-regulators/test/pmbus_error_tests.cpp b/phosphor-regulators/test/pmbus_error_tests.cpp
new file mode 100644
index 0000000..670df71
--- /dev/null
+++ b/phosphor-regulators/test/pmbus_error_tests.cpp
@@ -0,0 +1,34 @@
+/**
+ * Copyright © 2020 IBM Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "pmbus_error.hpp"
+
+#include <gtest/gtest.h>
+
+using namespace phosphor::power::regulators;
+
+TEST(PMBusErrorTests, Constructor)
+{
+    PMBusError error("VOUT_MODE contains unsupported data format");
+    EXPECT_STREQ(error.what(),
+                 "PMBusError: VOUT_MODE contains unsupported data format");
+}
+
+TEST(PMBusErrorTests, What)
+{
+    PMBusError error("Unable to convert value to linear data format");
+    EXPECT_STREQ(error.what(),
+                 "PMBusError: Unable to convert value to linear data format");
+}
diff --git a/phosphor-regulators/test/write_verification_error_tests.cpp b/phosphor-regulators/test/write_verification_error_tests.cpp
new file mode 100644
index 0000000..dc794e8
--- /dev/null
+++ b/phosphor-regulators/test/write_verification_error_tests.cpp
@@ -0,0 +1,38 @@
+/**
+ * Copyright © 2020 IBM Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "write_verification_error.hpp"
+
+#include <gtest/gtest.h>
+
+using namespace phosphor::power::regulators;
+
+TEST(WriteVerificationErrorTests, Constructor)
+{
+    WriteVerificationError error("device: vdd1, register: 0x21, "
+                                 "value_written: 0xAD, value_read: 0x00");
+    EXPECT_STREQ(error.what(),
+                 "WriteVerificationError: device: vdd1, register: 0x21, "
+                 "value_written: 0xAD, value_read: 0x00");
+}
+
+TEST(WriteVerificationErrorTests, What)
+{
+    WriteVerificationError error("device: vdd2, register: 0x21, "
+                                 "value_written: 0x32, value_read: 0x33");
+    EXPECT_STREQ(error.what(),
+                 "WriteVerificationError: device: vdd2, register: 0x21, "
+                 "value_written: 0x32, value_read: 0x33");
+}
