Prev Problem
Next Problem

23. Open-Drain I2C SDA line

module i2c_line(
  input  wire drive_low,
  output tri1 sda           // tri1 = weak pull-up when undriven
);
  // Open-drain behavior: either pull low or release (Z)
  assign sda = drive_low ? 1'b0 : 1'bz;
endmodule

⚠️ Notice: tri1 is not supported by current version of synthesizer.

💡 Remember

  • tri1 behaves like a wire with a weak 1 source when undriven.
  • Open-drain outputs never drive ‘1’—they drive 0 or Z.
  • A continuous assignment is a driver for a net.