diff --git a/sim/onewire_slave_model.v b/sim/onewire_slave_model.v
new file mode 100644
index 0000000000000000000000000000000000000000..5ebc64509ea4d3b625ec25dfb228663c1b0515f0
--- /dev/null
+++ b/sim/onewire_slave_model.v
@@ -0,0 +1,115 @@
+//////////////////////////////////////////////////////////////////////////////
+//                                                                          //
+//  1-wire (owr) slave model                                                //
+//                                                                          //
+//  Copyright (C) 2010  Iztok Jeras                                         //
+//                                                                          //
+//////////////////////////////////////////////////////////////////////////////
+//                                                                          //
+//  This HDL is free hardware: you can redistribute it and/or modify        //
+//  it under the terms of the GNU Lesser General Public License             //
+//  as published by the Free Software Foundation, either                    //
+//  version 3 of the License, or (at your option) any later version.        //
+//                                                                          //
+//  This RTL is distributed in the hope that it will be useful,             //
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of          //
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           //
+//  GNU General Public License for more details.                            //
+//                                                                          //
+//  You should have received a copy of the GNU General Public License       //
+//  along with this program.  If not, see <http://www.gnu.org/licenses/>.   //
+//                                                                          //
+//////////////////////////////////////////////////////////////////////////////
+ 
+`timescale 1us / 1ns
+
+module onewire_slave_model #(
+  // time slot (min=15.0, typ=30.0, max=60.0)
+  parameter TS = 30.0
+)(
+  // configuration
+  input  wire ena,    // response enable
+  input  wire ovd,    // overdrive mode select
+  input  wire dat_r,  // read data
+  output wire dat_w,  // write data
+  // 1-wire
+  inout wire owr
+);
+
+// IO
+reg pul;
+reg dat;
+
+// events
+event sample_dat;
+event sample_rst;
+
+//////////////////////////////////////////////////////////////////////////////
+// IO
+//////////////////////////////////////////////////////////////////////////////
+
+// onewire open collector signal
+assign owr = pul & ena ? 1'b0 : 1'bz;
+
+// read data output
+assign dat_w = ena ? dat : 1'bz;
+
+//////////////////////////////////////////////////////////////////////////////
+// events inside a cycle
+//////////////////////////////////////////////////////////////////////////////
+
+// power up state
+initial pul  <= 1'b0;
+
+always @ (negedge owr)  if (ena)  transfer (ovd, dat_r, dat);
+
+task automatic transfer (
+  input  ovd,
+  input  dat_r,
+  output dat_w
+); begin
+  // provide read data response
+  pul = ~dat_r;
+  // wait 1 time slot
+  if (ovd)  #(1*TS/8);
+  else      #(1*TS);
+  // write data is sampled here
+  -> sample_dat;
+  dat_w = owr;
+  // release the wire
+  pul = 1'b0;
+  // fork into data or reset cycle
+  fork
+    // transfer data
+    begin : transfer_dat
+      // if cycle ends before reset is detected
+      if (~owr) @ (posedge owr);
+      // disable reset path
+      disable transfer_rst;
+    end
+    // transfer reset
+    begin : transfer_rst
+      // wait 7 time slots
+      if (ovd)  #(7*TS/8);
+      else      #(7*TS);
+      // reset is sampled here
+      -> sample_rst;
+      // if reset is detected disable data path
+      if (~owr) disable transfer_dat;
+      // wait for reset low to end
+      @ (posedge owr)
+      // wait 1 time slot
+      if (ovd)  #(1*TS/8);
+      else      #(1*TS);
+      // provide presence pulse
+      pul = 1'b1;
+      // wait 4 time slot
+      if (ovd)  #(4*TS/8);
+      else      #(4*TS);
+      // release the wire
+      pul = 1'b0;
+    end
+  join
+end endtask
+
+endmodule