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 media — Chapter 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:
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 metreNowhere 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
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:
51.2 us / 10 ns per metre = 5120 metres of one-way distanceAnd 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:
| Term | Approximate 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 |
| margin | the 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.
4. RTL 1 — Measuring the Link's Length
// 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
endmoduleClassification: 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. 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
// 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
endmoduleClassification: 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
// 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
endmoduleClassification: 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
// 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
endmoduleClassification: 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
// 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
endmoduleClassification: 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:
| Link | Round trip | At 1 Gb/s | At 100 Gb/s |
|---|---|---|---|
| 100 m twisted pair | 1.01 µs | 126 kB | 12.6 MB |
| 10 km fibre | 98 µs | 12.2 MB | 1.22 GB |
| 80 km fibre | 784 µs | 98 MB | 9.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
// ---------------------------------------------------------------------
// 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))
);12. Verification — Twenty-Four Scenarios and a Link That Is Not Symmetric
| # | Scenario | Stimulus | What must be observed |
|---|---|---|---|
| 1 | 100 m copper | round trip 1 010 400 ps, no turnaround | length_m ≈ 100; one_way_ps ≈ 505 200 |
| 2 | 10 km fibre | round trip 98 060 000 ps, MED_SMF | length_m ≈ 10 000 |
| 3 | Medium changes the answer | same round trip, copper then SMF | lengths differ by about 3% |
| 4 | Assumption reported | any estimate | assumed_ps_per_m matches the medium (P2) |
| 5 | Peer turnaround subtracted | turnaround 200 ns, same cable | length unchanged from scenario 1 |
| 6 | Turnaround exceeds the round trip | turnaround 2 µs, round trip 1 µs | implausible; no estimate (P3, P4) |
| 7 | Zero-length link | round trip equals the turnaround | implausible |
| 8 | Delay constants sane | elaboration | within the physical band (P5, P6) |
| 9 | Symmetric link | forward = reverse = 505 ns | asymmetry_ps = 0; error = 0 |
| 10 | Asymmetric link, 100 ns | forward 555 ns, reverse 455 ns | asymmetry_ps = 100 000; error = 50 000 (P8) |
| 11 | Asymmetry the other way | forward 455 ns, reverse 555 ns | asymmetry negative; error negative |
| 12 | Round trip identical, asymmetry different | scenarios 9 and 10 | round_trip_ps identical — the point of Figure 2 |
| 13 | Asymmetry threshold | 30 ns asymmetry, threshold 20 ns | asymmetry_exceeded |
| 14 | Worst asymmetry sticky | asymmetry, then a clear | worst_asymmetry_ps survives (P10) |
| 15 | Baseline formation | 64 measurements | baseline_valid at the 64th, not before (P11) |
| 16 | No change before baseline | a large deviation at sample 3 | nothing reported (P12) |
| 17 | Thermal drift | 400 ps deviation | drift_thermal only |
| 18 | Re-patch | 60 ns deviation | change_repatch; c_changes increments |
| 19 | Route change | 800 ns deviation, sustained | change_route after persistence |
| 20 | Measurement fault | 800 ns deviation, not sustained | measurement_suspect, not a route change |
| 21 | Change classes exclusive | any deviation | at most one class (P13) |
| 22 | Binding limit: reach | short latency budget, long reach | binding_limit = reach |
| 23 | Binding limit with no violation | link well inside all three | binding_limit reported; no over_* set |
| 24 | Systematic vs random | 1000 samples, fixed asymmetry | random_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
Related tutorials
- Related topic
One Frame, End to End
A frame's journey down the stack and back up the other side, stage by stage. The transmit path decides and the receive path must discover — at four layers, not one — and that asymmetry is why the receive half of every Ethernet design is the larger, later and buggier one.
- Related topic
Forward Error Correction
FEC converts a gradual degradation into a cliff and hides the gradient behind it. The pre-correction error rate is the link's health metric and gives months of warning; the corrected output reads zero until the moment it collapses, and can be silently wrong when a decoder miscorrects.
- Related topic
Serialization Delay
A frame's size divided by the line rate — trivial arithmetic whose significance changes by four orders of magnitude, inverting latency budgets so that at 100 Gb/s one metre of cable outweighs an entire minimum-size frame.
- Related topic
Latency Decomposition
Five terms with five owners: four are constants computable before a frame is sent, and queueing is the one that depends on load rather than speed — the only term that diverges, and the reason a mean and a tail are different questions.
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.
