Why does a neighbouring trace respond to an edge?
In one line
When the voltage of a neighboring wire changes, current flows even through the small capacitance between the two wires. That is why a pulse appears even though you did not feed a signal directly into the victim line. This time you read a real ngspice transient analysis of a lumped resistor and capacitor model. It is not an experiment that finds the distributed-element NEXT/FEXT of a transmission line or certifies the conformance of a real board.
Why this was needed
A sensor input that is quiet when the clock is stopped can also shake once a clock edge begins. What matters is not only the height of the voltage but how fast it changes. The coupling current is proportional to the rate of voltage change between the two nodes. So even with the same repetition frequency, changing the edge changes the induced pulse. Conversely, reducing noise by attaching a small resistor may add load to the signal source in a real circuit. Do not extend the improvement of one noise number into an improvement of the whole design.
How it works
The aggressor line is driven by an ideal voltage source, and the victim line is connected to ground through Rv and Cv=2pF. Between the two lines there is Cc. The output impedance of the ideal voltage source is 0, so this assumes that the victim line does not change the aggressor line's waveform. The real driver's output resistance, package, and inductance are omitted. Applying the capacitor current equation at the victim line's node gives the following equation.
(Cv+Cc)·dv/dt + v/Rv = Cc·dva/dt
It is important that Cc is also included on the left. The time constant is Rv·(Cv+Cc), and the instantaneous voltage division ratio is Cc/(Cv+Cc). If Rv is in Ω and C is in pF, the time constant in ns is the product multiplied by 0.001. With Rv=200Ω and Cc=1pF it is 0.6ns. If you put in only 2pF, it becomes 0.4ns and the model goes wrong. You get the same error if you set the current unconditionally to Cc·dva/dt and leave out the change on the victim line.
The aggressor line rises linearly from 0V to 1V over tr starting at 2ns, and falls to 0V over the same tr starting at 12ns. During the rise, a constant slope pushes the victim line up. When the rise ends, the new injection stops and it decays exponentially. The fall creates a current in the opposite direction and causes a negative pulse. If the response to a single edge is g(t), the total response is g(t−2)−g(t−12). g(u) is 0 for u≤0, k·tau/tr·(1−exp(−u/tau)) for 0
With Cc=1pF and Rv=200Ω, the theoretical peak at tr=0.2ns is about 0.28347V, and at tr=2ns it is 0.09643V. During a slow edge there is time for charge to escape through the resistor. But you must not use this as a universal law of all noise. This result is a comparison within this model of a fixed 1V amplitude, linear edges, and linear R and C.
Why a peak alone is not enough
Two pulses of the same height can stay in the receiver's sensitive time interval for different lengths. This time you calculate the total time with |v|>0.15V in a 0 to 60ns observation. If you count the samples and then multiply by 0.01ns, you discard the partial interval that crossed the threshold. You must linearly interpolate the voltage between samples to find the times it passes +0.15V and −0.15V. For example, if it changes from −0.3V to +0.3V over 3ns, the middle half is inside the threshold. If you wrap both ends in an absolute value first, it all looks like +0.3V and the dwell time becomes double.
You find the observed time constant from two positive samples after the rise ends. tau=(t2−t1)/ln(v1/v2). Here you use the edge end +0.5ns and +1.5ns. Because it uses a time difference, it is independent of the time origin, and because it uses a ratio, it is independent of the overall amplitude scaling. Do not force intervals where the value is 0 or increasing, or negative intervals, into the same formula. This formula depends on the assumption of a single exponential decay. For real hardware with several time constants and measurement noise, regression and a residual review are more needed, and this two-point back-calculation does not replace such verification.
What it looks like in the field
With Rv=1000Ω and Cc=2pF, tau=4ns. When the next falling edge starts, the tail of the preceding rise remains, so the absolute values of the positive and negative peaks are not equal. If you forget the preceding pulse and draw only the fall, or erase the sign with abs, you miss this phenomenon. You must change a small Rv, a small Cc, and a slow edge one condition at a time to compare them, so that you can explain what made the improvement.
The learning judgment is the case where the overall absolute peak is ≤0.2V and the dwell above the threshold is ≤1ns. It is not the specification of a real logic input or bus. You record separately consistent, which checks whether the model and the original waveform match, and meets_spec, which covers these two numeric conditions. If you change the waveform to 0, the numbers look good but it does not match the model, so passed must be false. An ngspice file is also not a real measurement, so measured is false.
What you will do in the next lab
Starting from constant calculations, you build the signed waveform, the positive and negative extrema, the dwell above the threshold, the observed time constant, the comparison with the real waveform, and a per-condition report. Engine execution and table parsing are provided, and you preserve the input settings, the circuit, the raw waveform, and the engine log together. Do not erase failed conditions from the report.
Conceptual basis: Analog Devices' capacitive coupling experiment. The circuit of that real experiment differs from this numerical circuit. For the execution syntax, refer to the ngspice manual.