setup_type("$fa", {A, B, C}, {X, Y}, true);
 
                setup_type("$assert", {A, EN}, pool<RTLIL::IdString>(), true);
+               setup_type("$equiv", {A, B}, {Y}, true);
        }
 
        void setup_internals_mem()
 
                                return;
                        }
 
+                       if (cell->type == "$equiv") {
+                               port("\\A", 1);
+                               port("\\B", 1);
+                               port("\\Y", 1);
+                               check_expected();
+                               return;
+                       }
+
                        if (cell->type == "$_BUF_")  { check_gate("AY"); return; }
                        if (cell->type == "$_NOT_")  { check_gate("AY"); return; }
                        if (cell->type == "$_AND_")  { check_gate("ABY"); return; }
 
 using the {\tt abc} pass.
 
 \begin{fixme}
-Add information about {\tt \$assert} cells.
+Add information about {\tt \$assert} and {\tt \$equiv} cells.
 \end{fixme}
 
 \begin{fixme}
 
 
 input A, EN;
 
+`ifndef SIMLIB_NOCHECKS
 always @* begin
        if (A !== 1'b1 && EN === 1'b1) begin
                $display("Assertation failed!");
-               $finish;
+               $stop;
+       end
+end
+`endif
+
+endmodule
+
+// --------------------------------------------------------
+
+module \$equiv (A, B, Y);
+
+input A, B;
+output Y;
+
+assign Y = (A !== 1'bx && A !== B) ? 1'bx : A;
+
+`ifndef SIMLIB_NOCHECKS
+always @* begin
+       if (A !== 1'bx && A !== B) begin
+               $display("Equivalence failed!");
+               $stop;
        end
 end
+`endif
 
 endmodule