Prev Problem
Next Problem

44. Bus Error Checker

module error_checker_xz (
    input  [7:0] bus,
    output       all_known,
    output       has_unknown,
    output [7:0] bus_if_known
);
    // Propagate unknowns: (bus ^ bus) -> 0 on known bits, X on X/Z bits.
    // Reduction XOR of that is X iff any bit was X/Z.
    wire any_xz = (^(bus ^ bus)) === 1'bx;

    assign has_unknown  = any_xz;
    assign all_known    = ~any_xz;
    assign bus_if_known = {8{all_known}} & bus;  // pass when known, else 00
endmodule

💡 Remember

  • (bus ^ bus) trick: gives 0 on known bits but X on unknown (x/z) bits.
  • ^(...) (reduction XOR) → yields X if any bit is unknown.
  • Using === 1'bx detects presence of x/z reliably in simulation.
  • bus_if_known uses {8{all_known}} & buspasses bus only when fully known, else zeroes.