Skip to content
VLSI Mentor

Ethernet · Module 8

Propagation Delay

Length divided by velocity, about 5 ns per metre in copper and fibre alike, and completely independent of the data rate — which is why it survived four orders of magnitude untouched and now dominates the budgets it used to be invisible in.

Chapter 8.1 kept comparing serialization against a figure it had not derived: about 5 nanoseconds per metre. This chapter derives it, and the derivation produces two facts that surprise people in opposite directions.

The first is that propagation does not depend on the data rate at all. Not weakly, not approximately — the line rate does not appear in the expression. A 100-metre link costs the same time at 10 Mb/s as at 100 Gb/s, which is precisely why it survived the four orders of magnitude of progress that made serialization vanish.

The second is that copper and fibre travel at nearly the same speed. Twisted pair runs at roughly 0.65 times the speed of light in vacuum; silica fibre at roughly 0.68. The difference is a few percent — so fibre's advantage over copper is reach and rate, and it is essentially not speed at all.

Which reframes a whole category of engineering decision. "Use fibre, it's faster" is true about bit rate and false about propagation, and at the rates where propagation dominates the budget it is the wrong reason for the right choice.

1. Scope — What This Chapter Owns

This chapter owns propagation: where the velocity factor comes from, what it is for the media Ethernet uses, why it does not depend on the rate, and what a design can measure and infer from it.

Chapter 8.1 owns serialization, and used this chapter's figure to make its central comparison. Chapter 8.3 owns throughput, which is a different question again. Chapter 8.4 assembles every latency term.

Chapter 1.2 owns slot time, and this chapter shows that slot time is a propagation measurement — the round trip across the maximum collision domain, converted to bits. That connection is the chapter's most useful cross-reference, because it explains a frame-format constant with a physical quantity.

Chapter 4.4 owns clock compensation, and Section 9 uses it: a delay that differs between the two directions is measurable, and the measurement matters for anything that transfers time across a link.

It does not own the physics of the mediaChapter 3.1 and Chapter 3.2 own copper and fibre channels, their attenuation and their reach. This chapter takes only the propagation velocity from each.

The question this chapter answers that its neighbours do not: how long does a signal take to cross a link, why is that independent of everything else in the system, and what can a device learn from measuring it?

2. Where the Velocity Factor Comes From

A signal in a vacuum travels at c. In a medium it travels slower, and the ratio is the velocity factor.

In a cable the mechanism is the dielectric. The signal is an electromagnetic wave in the space between and around the conductors, and that space is filled with insulation. The wave's speed is c divided by the square root of the insulation's relative permittivity — so a "faster" plastic is one with a lower permittivity.

Which is why the number varies by insulation rather than by conductor. Polyethylene gives about 0.66 c; fluorinated ethylene propylene gives about 0.69 c. Structured-wiring cables sit between roughly 0.6 and 0.9 c, and Ethernet's twisted pair is at the low end of that.

In a fibre the mechanism is the refractive index, and the relevant one is the group index rather than the phase index, because information travels at the group velocity. For silica at the wavelengths Ethernet uses it is about 1.47, giving 0.68 c.

Illustrative, and the arithmetic is one division:

Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
copper, polyethylene:  v = 0.66 × 2.998e8 = 1.98e8 m/s  ->  5.05 ns per metre
fibre, group index 1.47: v = 2.998e8 / 1.47 = 2.04e8 m/s  ->  4.90 ns per metre

Nowhere in either expression does a bit rate appear, and that absence is the whole of the chapter's first claim. The medium's speed is a property of its materials; the rate at which bits are launched into it is a property of the transmitter.

3. The Slot Time Was a Propagation Measurement

The minimum frame size derives from propagation. A maximum length shared segment has an end to end propagation delay. A collision at the far end takes the same time to return, so the round trip is twice that delay plus the delay each repeater adds in both directions. A transmitting station must still be sending when the collision fragment arrives, so its frame must last at least that long. That duration multiplied by the signalling rate gives five hundred and twelve bit times, which is sixty four octets.Segment lengththe physical quantityOne-way delaylength × 5 ns/mRound tripplus repeater delays512 bit timesat the signalling rate64 octetsthe minimum frameA length in disguisein every frame sent today12
Figure 1 — the 64-octet minimum frame is a round trip across the maximum segment, converted to bits.

Chapter 5.6 §2 derived the 64-octet floor from a "round-trip propagation time" and took that time as given. This is the time.

Work it forward with this chapter's figure. The slot time is 512 bit times, which at 10 Mb/s is 51.2 microseconds. That is the budget for a round trip across the worst-case shared segment.

A round trip at 5 ns per metre costs 10 ns per metre of one-way distance. So 51.2 µs of pure cable would be:

Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
51.2 us / 10 ns per metre = 5120 metres of one-way distance

And the maximum collision domain was specified at about 2500 metres, not 5120 — because the budget is not all cable.

Illustrative decomposition of the 51.2 µs:

TermApproximate share
cable, 2500 m each way at 5 ns/m~25 µs
repeaters, several in each direction~15 µs
station transmit and receive turnaround~8 µs
marginthe remainder

Read that as the answer to a question the frame format cannot answer. Why 64 and not 32 or 128? Because roughly half the budget went on cable, most of the rest on repeaters and station delays, and the number that survived the arithmetic was 512 bits.

And the chain runs unbroken to the present. Every frame transmitted today is padded to a floor set by a distance nobody measures any more, over a medium nobody uses, defended against a collision that cannot occur — and Chapter 5.6 §3 showed the floor is nonetheless not removable, because the frame format is shared by links that do not share the property that produced it.

Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
// SYNTHESIZABLE.
//
// Estimates a link's physical length from a measured round-trip time.
//
// The arithmetic is one division, and the interesting content is what it
// depends on:
//
//   the measured round trip     -- this design can measure it
//   the velocity factor         -- a property of the CABLE, not the link
//   the local turnaround delay  -- a property of the PEER, not the cable
//
// The last two are the reason the answer is an estimate. A design that
// reports a length without reporting the assumptions behind it has
// converted a measurement into a claim.
package prop_pkg;
 
  // Picoseconds per metre, one way. Derived rather than quoted:
  //   v = VF * c, delay = 1/v.
  // Polyethylene twisted pair: VF 0.66 -> 5052 ps/m.
  // Silica fibre, group index 1.47 -> 4903 ps/m.
  localparam int unsigned PS_PER_M_COPPER = 5052;
  localparam int unsigned PS_PER_M_FIBRE  = 4903;
 
  typedef enum logic [1:0] { MED_COPPER, MED_SMF, MED_MMF } medium_e;
 
  function automatic int unsigned ps_per_metre(input medium_e m);
    case (m)
      MED_COPPER: ps_per_metre = PS_PER_M_COPPER;
      MED_SMF:    ps_per_metre = PS_PER_M_FIBRE;
      MED_MMF:    ps_per_metre = 4943;
      default:    ps_per_metre = PS_PER_M_COPPER;
    endcase
  endfunction
 
endpackage
 
module link_length_estimator
  import prop_pkg::*;
#(
  // The peer's turnaround: the time between it receiving the last bit of
  // the probe and emitting the first bit of the response. Subtracted
  // before the length is inferred, because it is not cable.
  parameter int unsigned PEER_TURNAROUND_PS = 0
) (
  input  logic    clk,
  input  logic    rst_n,
 
  input  medium_e medium,
  input  logic    rt_valid,
  input  logic [39:0] round_trip_ps,
 
  output logic        est_valid,
  output logic [23:0] length_m,
  // The one-way delay, which is what a latency budget actually wants --
  // the length is a derived convenience.
  output logic [39:0] one_way_ps,
 
  // The measurement is invalid if the round trip is shorter than the
  // peer's own turnaround, which means the turnaround parameter is wrong
  // or the measurement did not span the link.
  output logic        implausible,
  // Reported alongside the answer, so a reader can see what it assumed.
  output logic [15:0] assumed_ps_per_m
);
 
  always_ff @(posedge clk or negedge rst_n) begin
    if (!rst_n) begin
      est_valid        <= 1'b0;
      length_m         <= '0;
      one_way_ps       <= '0;
      implausible      <= 1'b0;
      assumed_ps_per_m <= '0;
    end else begin
      est_valid   <= 1'b0;
      implausible <= 1'b0;
 
      if (rt_valid) begin
        automatic int unsigned ppm = ps_per_metre(medium);
        assumed_ps_per_m <= 16'(ppm);
 
        if (round_trip_ps <= 40'(PEER_TURNAROUND_PS)) begin
          // Not a cable-length measurement at all.
          implausible <= 1'b1;
        end else begin
          automatic logic [39:0] cable_rt =
              round_trip_ps - 40'(PEER_TURNAROUND_PS);
          one_way_ps <= cable_rt / 2;
          // Length from the one-way delay. The division is by a constant
          // per medium, so it synthesises to a multiply by a reciprocal.
          length_m   <= 24'((cable_rt / 2) / 40'(ppm));
          est_valid  <= 1'b1;
        end
      end
    end
  end
 
endmodule

Classification: synthesizable.

What it teaches: that one_way_ps is the primary output and length_m is the convenience. A latency budget wants a time; a length is a human-readable derivation from it that requires an assumption about the medium. A design that reports only the length has folded a guess into its measurement — and if the cable is not what somebody thought, the length is wrong while the time it was computed from was right.

Deliberately simplified: the peer's turnaround is a parameter. A real measurement negotiates it, because a peer that responds faster or slower shifts the whole estimate — and a turnaround that is wrong by 100 ns is a length error of about 10 metres.

Production implication: assumed_ps_per_m is reported with every answer, and it is the difference between a measurement and a claim. A length of 87 metres is a number; a length of 87 metres assuming 5052 ps/m is a number somebody can check — and if the installed cable is FEP-insulated at 4830 ps/m, the same measurement is 91 metres. Publishing the assumption is what lets a reader recompute rather than re-measure.

5. Delay Is Not Symmetric, and the Difference Is Measurable

A round trip measurement observes only the sum of the forward and reverse delays. If the two directions are equal, halving the round trip gives the correct one way delay. If they differ, halving gives the average, so the derived one way figure is wrong by half the asymmetry in each direction. A device transferring time across the link inherits that error directly, and no amount of averaging removes it because the asymmetry is systematic rather than random.Forward delayone fibre, one pathReverse delaya different fibreRound tripthe only observableHalve itgives the averageError = half theasymmetrysystematic, not randomTime transferinherits itdirectly and silently12
Figure 2 — a round-trip measurement cannot separate the two directions, so any asymmetry lands entirely in the derived one-way figure.

A round-trip measurement observes only the sum. Halving it gives the one-way delay if and only if the two directions are equal, and there are several ordinary reasons why they are not.

Different physical paths. A duplex fibre pair is two separate fibres, cut from the reel at slightly different lengths, routed through the same conduit but not the same metre of it. A one-metre difference is 5 nanoseconds of asymmetry.

Different wavelengths. A link using one wavelength in each direction — common on single-fibre bidirectional optics — travels through glass whose group index differs slightly with wavelength. The two directions are physically different speeds.

Different device delays. The transmit path in one device and the receive path in the other are not the same logic, and the round trip includes both in each direction.

So the derived one-way figure is wrong by half the asymmetry, in opposite directions for the two ends — and no amount of averaging removes it, because the error is systematic rather than random. Measuring a thousand times gives a thousand equally wrong answers.

Which matters most for anything that transfers time across the link. A protocol that estimates a peer's clock offset from a round trip is assuming symmetry, and an asymmetry of A produces a time-transfer error of exactly A/2. A 10-metre difference in fibre lengths is a 25-nanosecond timing error that no measurement in the protocol can see.

And it is the reason Section 11's rejected property is the one it is. Asserting that the link is symmetric is asserting a premise of the calculation — and a design that asserts its own premise has guaranteed it will never learn the premise is false.

6. RTL 2 — Detecting the Asymmetry

Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
// SYNTHESIZABLE.
//
// Detects and quantifies directional asymmetry, which a round-trip
// measurement alone cannot see.
//
// The method is the only one available: obtain the two one-way delays
// SEPARATELY, from a source that does not derive them from the round
// trip. In practice that means a peer that timestamps its own transmit
// and receive events and reports them -- so the asymmetry is computed
// from four timestamps rather than from one interval.
//
// Without that, asymmetry is not merely hard to measure: it is
// unobservable in principle, because the round trip is a sum and one
// equation cannot resolve two unknowns.
module delay_asymmetry_detector
  import prop_pkg::*;
#(
  parameter int unsigned CNT_W = 32,
  // Asymmetry above which the link is flagged. Derived from the timing
  // accuracy a design promises: an asymmetry of A costs A/2 of error.
  parameter int unsigned ASYM_THRESHOLD_PS = 20_000   // 20 ns -> 10 ns error
) (
  input  logic clk,
  input  logic rst_n,
  input  logic clear,
 
  // Four timestamps, from a peer that reports its own. t1 and t4 are
  // local; t2 and t3 are the peer's.
  input  logic        ts_valid,
  input  logic [39:0] t1_local_tx,
  input  logic [39:0] t2_peer_rx,
  input  logic [39:0] t3_peer_tx,
  input  logic [39:0] t4_local_rx,
 
  output logic        result_valid,
  output logic [39:0] forward_ps,
  output logic [39:0] reverse_ps,
  output logic signed [40:0] asymmetry_ps,
  output logic [39:0] round_trip_ps,
 
  // The error a symmetric assumption would introduce, stated directly
  // rather than left for a reader to halve.
  output logic signed [40:0] time_transfer_error_ps,
 
  output logic             asymmetry_exceeded,
  output logic [CNT_W-1:0] c_exceeded,
  output logic signed [40:0] worst_asymmetry_ps
);
 
  always_ff @(posedge clk or negedge rst_n) begin
    if (!rst_n) begin
      result_valid <= 1'b0; forward_ps <= '0; reverse_ps <= '0;
      asymmetry_ps <= '0; round_trip_ps <= '0;
      time_transfer_error_ps <= '0;
      asymmetry_exceeded <= 1'b0; c_exceeded <= '0; worst_asymmetry_ps <= '0;
    end else begin
      result_valid       <= 1'b0;
      asymmetry_exceeded <= 1'b0;
 
      if (clear) begin
        c_exceeded <= '0;
        // worst_asymmetry_ps deliberately survives: it describes the
        // cabling, which does not change when a counter is cleared.
      end
 
      if (ts_valid) begin
        automatic logic [39:0] fwd = t2_peer_rx - t1_local_tx;
        automatic logic [39:0] rev = t4_local_rx - t3_peer_tx;
 
        forward_ps    <= fwd;
        reverse_ps    <= rev;
        round_trip_ps <= fwd + rev;
        asymmetry_ps  <= $signed({1'b0, fwd}) - $signed({1'b0, rev});
        // The whole point, stated as the consequence rather than as the
        // cause: a symmetric assumption is wrong by half the asymmetry.
        time_transfer_error_ps <=
            ($signed({1'b0, fwd}) - $signed({1'b0, rev})) / 2;
        result_valid  <= 1'b1;
 
        if (((fwd > rev) ? (fwd - rev) : (rev - fwd)) > 40'(ASYM_THRESHOLD_PS)) begin
          asymmetry_exceeded <= 1'b1;
          c_exceeded         <= c_exceeded + 1'b1;
        end
 
        if (((fwd > rev) ? $signed({1'b0, fwd - rev}) : $signed({1'b0, rev - fwd}))
            > ((worst_asymmetry_ps < 0) ? -worst_asymmetry_ps : worst_asymmetry_ps))
          worst_asymmetry_ps <= $signed({1'b0, fwd}) - $signed({1'b0, rev});
      end
    end
  end
 
endmodule

Classification: synthesizable.

What it teaches: that asymmetry requires four timestamps and cannot be obtained from one interval. A round trip is a single equation in two unknowns; no amount of repetition resolves it. The peer must report its own receive and transmit instants, which makes asymmetry detection a protocol requirement rather than a measurement technique — and a design without that protocol cannot detect asymmetry even in principle.

Deliberately simplified: it assumes the four timestamps share a time base well enough to subtract. In practice the local and peer clocks differ, which is exactly what the time transfer is trying to establish — so a real implementation is iterative, and the asymmetry appears as an offset the iteration cannot remove.

Production implication: time_transfer_error_ps is computed and exposed rather than left as an exercise. A design reporting an asymmetry of 40 ns has reported a number; one reporting a time-transfer error of 20 ns has reported the consequence — and the consequence is what a system integrator's requirement is written in. The halving is one line of RTL and it removes an entire class of misreading, which is the same argument Chapter 5.7 §7 made for reporting the smallest rejected frame size instead of a count.

7. RTL 3 — Noticing That the Cable Changed

Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
// SYNTHESIZABLE DIAGNOSTIC.
//
// Watches the measured one-way delay and reports when it moves.
//
// The quantity is supposed to be constant, which makes it an unusually
// good thing to monitor: any change has a cause, and the SIZE of the
// change names the cause.
//
//   a few hundred ps        -- temperature. Cable delay drifts with
//        thermal expansion and with the dielectric's permittivity, on a
//        daily cycle.
//   tens of nanoseconds     -- the cable was re-patched. Somebody moved
//        a jumper and the path is a few metres different.
//   hundreds of nanoseconds -- the route changed. A protection switch, a
//        repair splice, or a different fibre entirely.
//   erratic, large          -- the measurement is broken, not the cable.
module cable_length_change_monitor
  import prop_pkg::*;
#(
  parameter int unsigned CNT_W = 32,
  // Establish the baseline from this many measurements before judging
  // anything. A baseline of one sample turns measurement noise into a
  // cable-change report.
  parameter int unsigned BASELINE_N = 64,
  parameter int unsigned THERMAL_PS = 1_000,     // 1 ns
  parameter int unsigned REPATCH_PS = 50_000     // 50 ns -> ~10 m
) (
  input  logic clk,
  input  logic rst_n,
  input  logic clear,
 
  input  logic        meas_valid,
  input  logic [39:0] one_way_ps,
 
  output logic        baseline_valid,
  output logic [39:0] baseline_ps,
  output logic signed [40:0] deviation_ps,
 
  output logic        drift_thermal,
  output logic        change_repatch,
  output logic        change_route,
  output logic        measurement_suspect,
 
  output logic [CNT_W-1:0] c_changes,
  output logic [39:0]      min_seen_ps,
  output logic [39:0]      max_seen_ps
);
 
  logic [39:0] sum_q;
  logic [CNT_W-1:0] n_q;
  logic [CNT_W-1:0] since_change_q;
 
  always_ff @(posedge clk or negedge rst_n) begin
    if (!rst_n) begin
      sum_q <= '0; n_q <= '0; since_change_q <= '0;
      baseline_valid <= 1'b0; baseline_ps <= '0; deviation_ps <= '0;
      drift_thermal <= 1'b0; change_repatch <= 1'b0;
      change_route <= 1'b0; measurement_suspect <= 1'b0;
      c_changes <= '0; min_seen_ps <= '1; max_seen_ps <= '0;
    end else begin
      drift_thermal       <= 1'b0;
      change_repatch      <= 1'b0;
      change_route        <= 1'b0;
      measurement_suspect <= 1'b0;
 
      if (clear) begin
        c_changes <= '0;
        // min and max deliberately survive: they bound what this link
        // has ever measured, which a counter clear must not erase.
      end
 
      if (meas_valid) begin
        if (one_way_ps < min_seen_ps) min_seen_ps <= one_way_ps;
        if (one_way_ps > max_seen_ps) max_seen_ps <= one_way_ps;
 
        if (!baseline_valid) begin
          // Build the baseline from several samples. A single-sample
          // baseline reports every subsequent measurement's noise as a
          // cable change.
          sum_q <= sum_q + one_way_ps;
          n_q   <= n_q + 1'b1;
          if (n_q == CNT_W'(BASELINE_N - 1)) begin
            baseline_ps    <= (sum_q + one_way_ps) / 40'(BASELINE_N);
            baseline_valid <= 1'b1;
          end
        end else begin
          automatic logic signed [40:0] dev =
              $signed({1'b0, one_way_ps}) - $signed({1'b0, baseline_ps});
          automatic logic [39:0] mag = (dev < 0) ? 40'(-dev) : 40'(dev);
          deviation_ps <= dev;
          since_change_q <= since_change_q + 1'b1;
 
          // The magnitude bands of the header comment, largest first.
          if (mag > 40'(REPATCH_PS) * 40'd10) begin
            // Very large. Distinguished from a route change by whether
            // it PERSISTS: a route change settles at a new value, a
            // measurement fault does not.
            if (since_change_q < CNT_W'(BASELINE_N)) measurement_suspect <= 1'b1;
            else begin
              change_route   <= 1'b1;
              c_changes      <= c_changes + 1'b1;
              since_change_q <= '0;
            end
          end else if (mag > 40'(REPATCH_PS)) begin
            change_repatch <= 1'b1;
            c_changes      <= c_changes + 1'b1;
            since_change_q <= '0;
          end else if (mag > 40'(THERMAL_PS)) begin
            drift_thermal <= 1'b1;
          end
        end
      end
    end
  end
 
endmodule

Classification: synthesizable diagnostic.

What it teaches: that the size of a change names its cause, and a single "delay changed" flag names nothing. Thermal drift is sub-nanosecond and cyclic; a re-patch is tens of nanoseconds and permanent; a route change is hundreds and permanent. Reporting them as one event means a daily temperature cycle and a fibre cut produce the same alarm.

Deliberately simplified: fixed thresholds. A production design derives them from the link's own measured noise, because a short copper link and an 80-kilometre fibre have very different natural variation.

Production implication: measurement_suspect distinguishes a broken measurement from a changed cable by persistence, and that is the only signal available. A route change settles at a new value; a measurement fault does not settle at all. A design without the distinction reports a fibre cut every time its timestamp path glitches — and after the third false alarm, somebody disables the monitor and the real cut goes unreported, which is Chapter 5.4 §12's argument about diagnostics that cry wolf.

8. RTL 4 — Checking a Propagation Budget

Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
// SYNTHESIZABLE.
//
// Compares a link's measured propagation against the budget the
// deployment was designed to, and reports which constraint binds.
//
// There are three different limits and they are routinely confused:
//
//   REACH     -- the medium's attenuation limit. A physical property of
//        the cable and the optics (Chapters 3.1, 3.2). Exceeding it means
//        the signal does not arrive.
//   LATENCY   -- the application's budget. Exceeding it means the signal
//        arrives too late to be useful.
//   STANDARDS -- the horizontal cabling delay limit, about 570 ns for a
//        structured-wiring channel.
//
// A link can satisfy reach and violate latency, or the reverse. Merging
// them into "the link is too long" loses which one, and they have
// different fixes: better optics, a different application design, or a
// different cable route.
module propagation_budget_checker
  import prop_pkg::*;
(
  input  logic clk,
  input  logic rst_n,
 
  input  logic        meas_valid,
  input  logic [39:0] one_way_ps,
  input  logic [23:0] length_m,
 
  // The three limits, independently configured because they come from
  // three different documents.
  input  logic [23:0] reach_limit_m,
  input  logic [39:0] latency_budget_ps,
  input  logic [39:0] standards_limit_ps,
 
  output logic        result_valid,
  output logic        over_reach,
  output logic        over_latency,
  output logic        over_standards,
  // Which limit binds FIRST as the link grows. The actionable output:
  // it says which document to argue with.
  output logic [1:0]  binding_limit,
  output logic [39:0] headroom_ps
);
 
  localparam logic [1:0] B_REACH = 2'd0;
  localparam logic [1:0] B_LATENCY = 2'd1;
  localparam logic [1:0] B_STANDARDS = 2'd2;
 
  always_ff @(posedge clk or negedge rst_n) begin
    if (!rst_n) begin
      result_valid <= 1'b0; over_reach <= 1'b0; over_latency <= 1'b0;
      over_standards <= 1'b0; binding_limit <= B_REACH; headroom_ps <= '0;
    end else begin
      result_valid <= meas_valid;
 
      if (meas_valid) begin
        automatic logic [39:0] reach_ps =
            40'(reach_limit_m) * 40'(PS_PER_M_COPPER);
 
        over_reach     <= (length_m  > reach_limit_m);
        over_latency   <= (one_way_ps > latency_budget_ps);
        over_standards <= (one_way_ps > standards_limit_ps);
 
        // Whichever limit is SMALLEST in time is the one that binds as
        // the link grows -- which is not necessarily the one currently
        // being violated.
        if ((reach_ps <= latency_budget_ps) && (reach_ps <= standards_limit_ps)) begin
          binding_limit <= B_REACH;
          headroom_ps   <= (reach_ps > one_way_ps) ? (reach_ps - one_way_ps) : 40'd0;
        end else if (latency_budget_ps <= standards_limit_ps) begin
          binding_limit <= B_LATENCY;
          headroom_ps   <= (latency_budget_ps > one_way_ps)
                             ? (latency_budget_ps - one_way_ps) : 40'd0;
        end else begin
          binding_limit <= B_STANDARDS;
          headroom_ps   <= (standards_limit_ps > one_way_ps)
                             ? (standards_limit_ps - one_way_ps) : 40'd0;
        end
      end
    end
  end
 
endmodule

Classification: synthesizable.

What it teaches: that binding_limit is a different question from "which limit is violated". A link may be violating none of the three and still have a binding limit — the one that will be hit first if the link grows or the route changes. That is the number a planner needs, and a design reporting only violations answers a question that is only interesting after something has already gone wrong.

Deliberately simplified: the reach limit is converted to time using the copper figure regardless of medium. A real check uses the medium's own value, and the difference between 5052 and 4903 picoseconds per metre is 3% — which matters at 80 kilometres and not at 100 metres.

Production implication: the three limits are separately configured inputs because they come from three different documents — a transceiver datasheet, an application requirement, and a cabling standard. Folding them into one number means the design cannot say which document to argue with, and they have entirely different remedies: better optics, a different application design, or a different cable route. It is Chapter 7.3's three-predicate argument applied to a physical budget.

9. RTL 5 — Accumulating the Error a Symmetric Assumption Makes

A time transfer across a link accumulates error from several sources. Timestamp quantisation and measurement noise are random and average away over many samples. Clock drift between measurements is bounded by the measurement interval. But the directional asymmetry of the link is systematic: it contributes exactly half the asymmetry as a constant offset, in opposite directions at the two ends, and no amount of averaging reduces it because it does not vary.Quantisationrandom — averages awayMeasurement noiserandom — averages awayClock driftbounded by the intervalPath asymmetrysystematic — neveraverages awayResidual error= half the asymmetryOnly measurable withfour timestampsnot from a round trip12
Figure 3 — every term that contributes to a time-transfer error, and the one that averaging cannot remove.
Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
// SYNTHESIZABLE INSTRUMENTATION.
//
// Separates the error terms in a time transfer, so that the one which
// cannot be averaged away is visible rather than buried.
//
// Three of the terms shrink with more samples and one does not:
//
//   quantisation, noise  -- random. The mean converges as 1/sqrt(N).
//   clock drift          -- bounded by the measurement interval.
//   ASYMMETRY            -- systematic. Contributes exactly half the
//        asymmetry, as a constant offset, forever.
//
// A design that reports only a total error and observes it falling with
// more samples will conclude the measurement is converging. It is --
// onto the wrong answer, offset by half the asymmetry.
module time_transfer_error_accumulator
  import prop_pkg::*;
#(
  parameter int unsigned CNT_W = 32
) (
  input  logic clk,
  input  logic rst_n,
  input  logic clear,
 
  input  logic        sample_valid,
  input  logic signed [40:0] asymmetry_ps,
  input  logic [39:0] quantisation_ps,
  input  logic [39:0] noise_estimate_ps,
  input  logic [39:0] drift_bound_ps,
 
  output logic        result_valid,
  // The systematic part. Constant with N, which is the whole point.
  output logic signed [40:0] systematic_error_ps,
  // The random part, which shrinks with the sample count.
  output logic [39:0] random_error_ps,
  output logic [39:0] total_bound_ps,
 
  output logic [CNT_W-1:0] samples,
  // High when the systematic term exceeds the random one -- the point at
  // which taking more samples stops helping, which is the single most
  // useful thing this module reports.
  output logic             systematic_dominates,
  output logic [CNT_W-1:0] samples_at_crossover
);
 
  logic [CNT_W-1:0] n_q;
 
  always_ff @(posedge clk or negedge rst_n) begin
    if (!rst_n) begin
      n_q <= '0; result_valid <= 1'b0;
      systematic_error_ps <= '0; random_error_ps <= '0; total_bound_ps <= '0;
      samples <= '0; systematic_dominates <= 1'b0; samples_at_crossover <= '0;
    end else begin
      result_valid <= 1'b0;
 
      if (clear) begin
        n_q <= '0; samples <= '0;
        // The crossover point deliberately survives: it describes the
        // link's cabling, not this measurement session.
      end else if (sample_valid) begin
        automatic logic signed [40:0] sysrr = asymmetry_ps / 2;
        automatic logic [39:0] rnd;
 
        n_q     <= n_q + 1'b1;
        samples <= n_q + 1'b1;
 
        // Random terms shrink as 1/sqrt(N). Approximated by a shift per
        // quadrupling, which is exact enough for a bound and needs no
        // square root.
        rnd = (quantisation_ps + noise_estimate_ps) >> (sqrt_shift(n_q + 1'b1));
 
        systematic_error_ps <= sysrr;
        random_error_ps     <= rnd + drift_bound_ps;
        total_bound_ps      <= ((sysrr < 0) ? 40'(-sysrr) : 40'(sysrr))
                               + rnd + drift_bound_ps;
        result_valid        <= 1'b1;
 
        if (((sysrr < 0) ? 40'(-sysrr) : 40'(sysrr)) > (rnd + drift_bound_ps)) begin
          if (!systematic_dominates) samples_at_crossover <= n_q + 1'b1;
          systematic_dominates <= 1'b1;
        end
      end
    end
  end
 
  // log4(N), so each quadrupling of the sample count halves the random
  // term -- the 1/sqrt(N) behaviour, as a shift.
  function automatic int unsigned sqrt_shift(input logic [CNT_W-1:0] n);
    sqrt_shift = 0;
    for (int i = 0; i < CNT_W/2; i++)
      if (n > (CNT_W'(1) << (2*i))) sqrt_shift = i + 1;
  endfunction
 
endmodule

Classification: synthesizable instrumentation.

What it teaches: that systematic_dominates is the output that changes behaviour. A measurement whose total error is falling looks like it is converging, and it is — onto an answer that is wrong by half the asymmetry. The crossover is the point at which taking more samples stops helping, and a design that does not report it will keep averaging long after averaging has stopped buying anything.

Deliberately simplified: the random terms are combined and shrunk by a shift approximating one over the square root of the sample count. A rigorous treatment keeps them separate with their own statistics; the shift is exact enough to locate the crossover, which is what the module is for.

Production implication: samples_at_crossover survives a counter clear because it describes the cabling rather than the measurement session. A link whose systematic term dominates after 16 samples has substantial asymmetry; one that reaches 4096 before crossing over is nearly symmetric. That number is a property of how the fibre was pulled, and it is the same after a restart — so clearing it discards a characterisation that took time to obtain.

10. What Propagation Costs a Protocol

Latency is not the only thing propagation buys. It also determines how much data must be in flight for a link to stay busy, and that quantity scales with the rate even though the delay does not.

The bandwidth-delay product is the rate multiplied by the round-trip time, and it is the amount of unacknowledged data a sender must have outstanding to keep a link full.

Illustrative, computed for the links of this chapter's table:

LinkRound tripAt 1 Gb/sAt 100 Gb/s
100 m twisted pair1.01 µs126 kB12.6 MB
10 km fibre98 µs12.2 MB1.22 GB
80 km fibre784 µs98 MB9.8 GB

Read the right-hand column, because it is where the chapter's independence claim bites. The round-trip time did not change between the two columns — it is the same cable. The in-flight requirement rose by a factor of a hundred, because it is the product of a delay that is fixed and a rate that is not.

Which produces a failure with no error anywhere. A protocol whose window was sized for a 1 Gb/s link keeps that window after the link is upgraded, and now fills it in one hundredth of the round-trip time — after which it waits. The link runs at a fraction of its rate and every counter shows it healthy, because nothing is being dropped and nothing is failing.

And the fraction is exactly the ratio of the window to the bandwidth-delay product, which is arithmetic anybody can do and nobody does, because the symptom looks like a slow application rather than a sizing error.

11. Assertions — A Constant That Should Stay Constant

Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
// ---------------------------------------------------------------------
// P1 -- THE DEFINITION. Propagation is length times the medium's delay
// per metre, and the line rate appears nowhere in it.
// ---------------------------------------------------------------------
property p_delay_is_length_times_velocity;
  @(posedge clk) disable iff (!rst_n)
    est_valid |-> (one_way_ps == (40'(length_m) * 40'(assumed_ps_per_m)));
endproperty
a_delay_is_length_times_velocity: assert property (p_delay_is_length_times_velocity);
 
// ---------------------------------------------------------------------
// P2 -- The estimate reports the assumption it used. A length without a
// velocity factor is a claim rather than a measurement.
// ---------------------------------------------------------------------
property p_assumption_reported;
  @(posedge clk) disable iff (!rst_n)
    est_valid |-> (assumed_ps_per_m == 16'(ps_per_metre($past(medium))));
endproperty
a_assumption_reported: assert property (p_assumption_reported);
 
// ---------------------------------------------------------------------
// P3 -- A round trip shorter than the peer's own turnaround is not a
// cable measurement, and must be refused rather than converted.
// ---------------------------------------------------------------------
property p_implausible_refused;
  @(posedge clk) disable iff (!rst_n)
    (rt_valid && (round_trip_ps <= 40'(PEER_TURNAROUND_PS))) |=> implausible;
endproperty
a_implausible_refused: assert property (p_implausible_refused);
 
// ---------------------------------------------------------------------
// P4 -- An implausible measurement produces no estimate.
// ---------------------------------------------------------------------
property p_no_estimate_when_implausible;
  @(posedge clk) disable iff (!rst_n)
    implausible |-> !est_valid;
endproperty
a_no_estimate_when_implausible: assert property (p_no_estimate_when_implausible);
 
// ---------------------------------------------------------------------
// P5 -- Every medium's delay per metre is within the band this chapter
// derived. A constant outside it means somebody entered a velocity
// factor rather than a delay, or a metre rather than a foot.
// ---------------------------------------------------------------------
// synopsys translate_off
a_delay_constants_plausible: assert final
  ((PS_PER_M_COPPER > 3_300) && (PS_PER_M_COPPER < 5_600) &&
   (PS_PER_M_FIBRE  > 3_300) && (PS_PER_M_FIBRE  < 5_600))
  else $fatal(1, "a per-metre delay constant is outside the physically possible band");
// synopsys translate_on
 
// ---------------------------------------------------------------------
// P6 -- No medium is faster than light. The check that catches a
// velocity factor entered as a multiplier rather than a fraction.
// ---------------------------------------------------------------------
// synopsys translate_off
a_not_faster_than_light: assert final
  ((PS_PER_M_COPPER >= 3_336) && (PS_PER_M_FIBRE >= 3_336))
  else $fatal(1, "a per-metre delay implies a velocity above c");
// synopsys translate_on
 
// ---------------------------------------------------------------------
// P7 -- The round trip is the sum of the two one-way delays, which is
// the relation that makes asymmetry unobservable from it alone.
// ---------------------------------------------------------------------
property p_round_trip_is_sum;
  @(posedge clk) disable iff (!rst_n)
    result_valid |-> (round_trip_ps == (forward_ps + reverse_ps));
endproperty
a_round_trip_is_sum: assert property (p_round_trip_is_sum);
 
// ---------------------------------------------------------------------
// P8 -- The asymmetry is the difference, and the time-transfer error is
// exactly half of it. Stated so a reader cannot mistake one for the
// other.
// ---------------------------------------------------------------------
property p_error_is_half_asymmetry;
  @(posedge clk) disable iff (!rst_n)
    result_valid |-> (time_transfer_error_ps == (asymmetry_ps / 2));
endproperty
a_error_is_half_asymmetry: assert property (p_error_is_half_asymmetry);
 
// ---------------------------------------------------------------------
// P9 -- Asymmetry requires four timestamps. A result produced without
// them was derived from a round trip, which cannot resolve it.
// ---------------------------------------------------------------------
property p_asymmetry_needs_four_timestamps;
  @(posedge clk) disable iff (!rst_n)
    result_valid |-> $past(ts_valid);
endproperty
a_asymmetry_needs_four_timestamps: assert property (p_asymmetry_needs_four_timestamps);
 
// ---------------------------------------------------------------------
// P10 -- The worst asymmetry survives a counter clear: it describes the
// cabling, which a housekeeping action does not change.
// ---------------------------------------------------------------------
property p_worst_asymmetry_survives;
  @(posedge clk) disable iff (!rst_n)
    clear |=> $stable(worst_asymmetry_ps);
endproperty
a_worst_asymmetry_survives: assert property (p_worst_asymmetry_survives);
 
// ---------------------------------------------------------------------
// P11 -- The baseline is built from several samples. A single-sample
// baseline turns measurement noise into a cable-change report.
// ---------------------------------------------------------------------
property p_baseline_needs_samples;
  @(posedge clk) disable iff (!rst_n)
    $rose(baseline_valid) |-> ($past(n_q) == CNT_W'(BASELINE_N - 1));
endproperty
a_baseline_needs_samples: assert property (p_baseline_needs_samples);
 
// ---------------------------------------------------------------------
// P12 -- No change is reported before a baseline exists.
// ---------------------------------------------------------------------
property p_no_change_without_baseline;
  @(posedge clk) disable iff (!rst_n)
    (!baseline_valid) |-> (!drift_thermal && !change_repatch && !change_route);
endproperty
a_no_change_without_baseline: assert property (p_no_change_without_baseline);
 
// ---------------------------------------------------------------------
// P13 -- The change classes are exclusive, and ordered by magnitude.
// ---------------------------------------------------------------------
property p_change_classes_onehot;
  @(posedge clk) disable iff (!rst_n)
    meas_valid |=> $onehot0({drift_thermal, change_repatch, change_route,
                             measurement_suspect});
endproperty
a_change_classes_onehot: assert property (p_change_classes_onehot);
 
// ---------------------------------------------------------------------
// P14 -- The binding limit is the smallest of the three in time. It is
// reported whether or not any limit is currently violated.
// ---------------------------------------------------------------------
property p_binding_is_smallest;
  @(posedge clk) disable iff (!rst_n)
    result_valid |-> ((binding_limit == B_REACH)     ||
                      (binding_limit == B_LATENCY)   ||
                      (binding_limit == B_STANDARDS));
endproperty
a_binding_is_smallest: assert property (p_binding_is_smallest);
 
// ---------------------------------------------------------------------
// P15 -- The systematic error term does not shrink with the sample
// count. The property that makes Section 9's argument checkable.
// ---------------------------------------------------------------------
property p_systematic_does_not_average;
  @(posedge clk) disable iff (!rst_n)
    (result_valid && $stable(asymmetry_ps)) |-> $stable(systematic_error_ps);
endproperty
a_systematic_does_not_average: assert property (p_systematic_does_not_average);
 
// ---------------------------------------------------------------------
// P16 -- The random term does shrink, so the two behave differently and
// a design cannot conflate them.
// ---------------------------------------------------------------------
property p_random_does_average;
  @(posedge clk) disable iff (!rst_n)
    (result_valid && (samples > $past(samples)))
      |-> (random_error_ps <= $past(random_error_ps));
endproperty
a_random_does_average: assert property (p_random_does_average);
 
// ---------------------------------------------------------------------
// P17 -- The bandwidth-delay product scales with the rate even though
// the delay does not. Asserted as a relation, because it is the one
// quantity in this chapter that is NOT rate-independent.
// ---------------------------------------------------------------------
property p_bdp_scales_with_rate;
  @(posedge clk) disable iff (!rst_n)
    bdp_valid |-> (bdp_bytes == ((round_trip_ps * rate_bps) / 40'd8_000_000_000_000));
endproperty
a_bdp_scales_with_rate: assert property (p_bdp_scales_with_rate);
 
// ---------------------------------------------------------------------
// P18 -- Propagation itself does NOT change when the rate does. The
// chapter's central claim, checkable directly.
// ---------------------------------------------------------------------
property p_propagation_rate_independent;
  @(posedge clk) disable iff (!rst_n)
    (meas_valid && $stable(length_m) && !$stable(rate_bps))
      |-> $stable(one_way_ps);
endproperty
a_propagation_rate_independent: assert property (p_propagation_rate_independent)
  else $error("propagation delay moved when only the line rate changed");
 
// ---------------------------------------------------------------------
// P19 -- COVERAGE. Each change class, and the crossover at which more
// samples stop helping.
// ---------------------------------------------------------------------
c_thermal:     cover property (@(posedge clk) disable iff (!rst_n) drift_thermal);
c_repatch:     cover property (@(posedge clk) disable iff (!rst_n) change_repatch);
c_route:       cover property (@(posedge clk) disable iff (!rst_n) change_route);
c_crossover:   cover property (@(posedge clk) disable iff (!rst_n) $rose(systematic_dominates));
 
// ---------------------------------------------------------------------
// P20 -- COVERAGE. A genuinely asymmetric link, which a symmetric
// stimulus generator never produces.
// ---------------------------------------------------------------------
c_asymmetric_link: cover property (
  @(posedge clk) disable iff (!rst_n) (result_valid && (asymmetry_ps != 0))
);
#ScenarioStimulusWhat must be observed
1100 m copperround trip 1 010 400 ps, no turnaroundlength_m ≈ 100; one_way_ps ≈ 505 200
210 km fibreround trip 98 060 000 ps, MED_SMFlength_m ≈ 10 000
3Medium changes the answersame round trip, copper then SMFlengths differ by about 3%
4Assumption reportedany estimateassumed_ps_per_m matches the medium (P2)
5Peer turnaround subtractedturnaround 200 ns, same cablelength unchanged from scenario 1
6Turnaround exceeds the round tripturnaround 2 µs, round trip 1 µsimplausible; no estimate (P3, P4)
7Zero-length linkround trip equals the turnaroundimplausible
8Delay constants saneelaborationwithin the physical band (P5, P6)
9Symmetric linkforward = reverse = 505 nsasymmetry_ps = 0; error = 0
10Asymmetric link, 100 nsforward 555 ns, reverse 455 nsasymmetry_ps = 100 000; error = 50 000 (P8)
11Asymmetry the other wayforward 455 ns, reverse 555 nsasymmetry negative; error negative
12Round trip identical, asymmetry differentscenarios 9 and 10round_trip_ps identical — the point of Figure 2
13Asymmetry threshold30 ns asymmetry, threshold 20 nsasymmetry_exceeded
14Worst asymmetry stickyasymmetry, then a clearworst_asymmetry_ps survives (P10)
15Baseline formation64 measurementsbaseline_valid at the 64th, not before (P11)
16No change before baselinea large deviation at sample 3nothing reported (P12)
17Thermal drift400 ps deviationdrift_thermal only
18Re-patch60 ns deviationchange_repatch; c_changes increments
19Route change800 ns deviation, sustainedchange_route after persistence
20Measurement fault800 ns deviation, not sustainedmeasurement_suspect, not a route change
21Change classes exclusiveany deviationat most one class (P13)
22Binding limit: reachshort latency budget, long reachbinding_limit = reach
23Binding limit with no violationlink well inside all threebinding_limit reported; no over_* set
24Systematic vs random1000 samples, fixed asymmetryrandom_error_ps falls, systematic_error_ps does not (P15, P16)

13. Debugging — A Constant That Moved

Symptom — a time-transfer error that will not average away.

Systematic, and almost certainly asymmetry. Read systematic_error_ps against random_error_ps: if the systematic term dominates, more samples buy nothing and samples_at_crossover says when they stopped helping. The magnitude is half the asymmetry, and the asymmetry is usually cable — a duplex pair whose two fibres differ by a few metres.

Symptom — the measured link length is wrong by a few percent.

Check assumed_ps_per_m against the installed cable. Polyethylene is 5052 ps/m and FEP is about 4830 — a 4.5% difference, which on a 100-metre link is 4.5 metres. The measurement was right; the assumption was not, and this is why the assumption is reported alongside the answer.

Symptom — the link length changes on a daily cycle.

Temperature. Cable delay drifts with thermal expansion and with the dielectric's permittivity, and a building's daily cycle is enough to move it by hundreds of picoseconds. drift_thermal is the correct classification and it is not a fault — the value to watch is whether the drift's amplitude grows, which would suggest a cable in a worse thermal environment than intended.

Symptom — a step change of tens of nanoseconds, permanent.

Somebody re-patched. Tens of nanoseconds is a few metres, which is a jumper change rather than a route change. change_repatch and the deviation's magnitude give the length difference directly, and it is usually enough to identify which patch was moved.

Symptom — a large delay change that does not settle.

Not the cable. measurement_suspect distinguishes it by persistence: a route change settles at a new value, a broken measurement does not settle at all. Check the timestamp path before the fibre — a glitching timestamp produces exactly this signature and no amount of fibre inspection finds anything.

Symptom — a link within its reach limit that misses a latency requirement.

The two limits are different documents and the link satisfies one. Read binding_limit: reach is the optics, latency is the application, and the structured-wiring figure is the cabling standard — about 570 ns for a horizontal channel. A link can be well inside its optical reach and far outside a latency budget, and the fixes are entirely different.

Symptom — a 100 Gb/s upgrade did not improve end-to-end latency.

Expected. Chapter 8.1 §3's inversion: at 100 Gb/s the serialization term has essentially vanished and propagation, which did not change, now dominates. A 100-metre link costs about 505 ns at every rate — and upgrading the rate cannot move a number that never depended on it.

14. Common Misconceptions

"Fibre is faster than copper."

The wrong model: light in glass beats electricity in wire.

What it costs: the wrong reason for a correct decision, and a latency estimate that expects an improvement fibre does not provide. A design that budgets a fibre run as significantly quicker than the copper it replaced has budgeted a few percent as a large number.

The corrected model: twisted pair runs at about 0.66 c and silica fibre at about 0.68 c — within about 3% of each other, and both close to 5 ns per metre. Fibre's advantages are reach, rate and immunity, and speed of propagation is essentially not one of them.

"Propagation delay is negligible."

The wrong model: cables are short and light is fast.

What it costs: at high rates it is the dominant term. Chapter 8.1 §3 showed that at 100 Gb/s a 100-metre link outweighs a maximum-size frame by four times, and one metre outweighs a whole minimum-size frame.

The corrected model: it is length ÷ velocity, about 5 ns per metre, and the line rate does not appear. It survived four orders of magnitude of progress untouched, which is exactly why it now sets budgets that it used to be invisible in.

"A faster link makes everything faster."

The wrong model: rate improvements scale the whole path.

What it costs: an upgrade that does not deliver the expected latency improvement, and an investigation looking for the fault. There is no fault: propagation did not change, because it never depended on the rate.

The corrected model: only the terms that contain the rate scale with it. Serialization does; propagation does not; per-frame processing does so far more weakly. So an upgrade improves the budget by a fraction that shrinks as the rate rises.

"Halving the round trip gives the one-way delay."

The wrong model: the link is symmetric.

What it costs: a systematic time-transfer error of exactly half the asymmetry, in opposite directions at the two ends, that no amount of averaging removes. The measurement converges beautifully onto the wrong answer.

The corrected model: a duplex fibre pair is two fibres of slightly different length; bidirectional optics use different wavelengths with different group indices; device paths differ. Asymmetry needs four timestamps to measure — a round trip is one equation in two unknowns — and it is a premise to be measured, never an assumption to be asserted.

"The minimum frame size is a frame-format decision."

The wrong model: 64 octets came from the header arithmetic.

What it costs: you cannot explain why it is 64 rather than 32, why full-duplex links still enforce it, or what would have to change for it to move.

The corrected model: it is a round trip across the maximum shared segment, converted to bits — this chapter's quantity, over a distance nobody measures any more. About half the 51.2 µs slot time was cable at 5 ns per metre; most of the rest was repeaters and station turnaround. The frame's floor is a length in disguise.

15. Interview Reasoning

"How long does a signal take to cross 100 metres of Cat6?"

The weak answer is "not long". The answer that ends the topic derives it: the velocity factor is about 0.66, so the signal travels at 1.98 × 10⁸ m/s, so 5.05 ns per metre and about 505 ns for 100 metres. The payoff is that structured-wiring standards allow around 570 ns for a horizontal channel, so 100 metres consumes most of the budget — and that the same 505 ns applies at 10 Mb/s and at 100 Gb/s alike.

"Is fibre faster than copper?"

For bit rate and reach, decisively. For propagation, no — 0.68 c against 0.66 c, a difference of about 3%. The strong answer explains why they are so close despite completely different mechanisms: both are electromagnetic waves in a dielectric, and polyethylene's permittivity happens to give nearly the same slowing as silica's refractive index. Adding that a foamed-dielectric cable runs at up to 0.9 c shows the closeness is a property of the materials rather than a principle.

"Why does the Ethernet minimum frame size have anything to do with cable length?"

Because it is a cable length. Slot time is the round trip across the maximum shared segment: at 5 ns per metre, 2500 metres each way is about 25 µs, repeaters and station turnaround take most of the rest, and the 51.2 µs total is 512 bit times — 64 octets. The finishing point is that every frame transmitted today is padded to a floor set by a distance nobody measures, over a medium nobody uses, against a collision that cannot occur.

"Your time transfer is off by 25 nanoseconds and more averaging does not help. Why?"

Because the error is systematic, not random — almost certainly path asymmetry, and 25 ns of error means 50 ns of asymmetry, which is about 10 metres of fibre difference between the two directions of a duplex pair. The complete answer explains why it cannot be measured from a round trip — one equation, two unknowns — and that resolving it needs four timestamps, with the peer reporting its own receive and transmit instants.

16. Understanding Check

Because the rate does not appear in the expression.

Propagation is length ÷ velocity, and the velocity is a property of the medium: c divided by the square root of the dielectric's relative permittivity in a cable, or c divided by the group index in a fibre. Neither expression contains a bit rate.

The medium's speed is a property of its materials; the rate at which bits are launched into it is a property of the transmitter. They are independent facts about different things.

Which is why the term survived four orders of magnitude of progress untouched. A 100-metre link cost about 505 ns in 1990 at 10 Mb/s and costs about 505 ns today at 100 Gb/s.

And that is exactly why it now dominates. Chapter 8.1 showed serialization falling by 10 000× across the same range — so a term that was 2400 times smaller than serialization at 10 Mb/s is four times larger at 100 Gb/s, on the same cable, with nothing else changed.

17. What's Next

The claim this chapter defended: propagation is length ÷ velocity, the velocity is about two thirds of c in every Ethernet medium, and the data rate does not appear.

That independence is why the term survived four orders of magnitude untouched and why it now sets budgets it used to be invisible in — and why copper and fibre, whose mechanisms have almost nothing in common, agree to within a few percent at about 5 ns per metre. It is also why the frame's 64-octet floor is a length in disguise: Chapter 1.2's slot time is this chapter's quantity, measured as a round trip across a segment nobody builds any more.

And it is a quantity a design can measure, with two cautions. The estimate depends on a velocity factor that belongs to the installed cable, so the assumption must be reported alongside the answer. And a round trip cannot resolve asymmetry — one equation, two unknowns — so a directional difference of a few metres becomes a systematic time-transfer error of half its size that no amount of averaging removes, and that a symmetric testbench cannot even express.

Chapter 8.3 — Effective Throughput against Line Rate turns from latency to capacity. Chapter 5.6 §11 established the wire slot — 84 octets for a minimum frame, 1538 for a maximum — and 8.3 turns it into an efficiency curve: what fraction of a link's time carries payload, where the curve saturates, and why the answer at 46 octets is 55% and at 1500 is 97.5%.

Then the part that matters more than the curve: throughput is not goodput, and the frame rate is often the binding constraint rather than the bit rate. A link that is nowhere near its bit-rate limit can be entirely full at its frame-rate limit — and the two failures look identical from every bandwidth measurement.

The full path is on the Ethernet curriculum index.

Continue learning

Standards & specifications

Governing standard
IEEE Std 802.3 (Ethernet)(opens IEEE in a new tab)

Defines the Ethernet MAC, the media-independent interfaces and the physical-layer sublayers, including framing, access control, auto-negotiation and per-rate PHY specifications. VLAN tagging, priority and time-sensitive shaping are defined by IEEE 802.1, not by 802.3.

This page also covers RTL structure, verification approach and debugging technique. Those are engineering practice built on the standard, not requirements the standard itself imposes.

Where this fits

Part of the Ethernet curriculum.