Outputs just reflect the current inputs
A combinational circuit is like a pure function in code: it has no memory. If you change the inputs and hold them steady, electricity ripples through the logic gates, and eventually, the output settles to the new answer. The difference is that in a Python function, the answer appears instantly when the function returns. In hardware, that electrical ripple takes physical time—we call this propagation delay.
Long logic paths will tank your clock speed
Think about a modular multiplication. You've got a full multiply, a quotient approximation, some correction logic, and a final selection. If you wire all of that up back-to-back without any storage in between, electricity has to travel through a massive chain of gates. If that chain is too long, it won't finish settling before the next clock tick. To fix this, designers slice up long combinational paths by inserting registers, effectively breaking the math across multiple clock cycles (pipelining).
Worked example
Two equations, one continuous circuit
Suppose we wire up product = left × right and reduced = product mod q as combinational logic. If we flip a switch to change left, the intermediate wires might flicker and change state multiple times before the final reduced value settles down. You can't just look at the output whenever you want—you have to wait for the clock edge to tell you the value is finally stable and valid.
What happens if you accidentally create an unregistered combinational loop?
If A depends on B, and B depends on A, and there are no registers between them... you've built an oscillator. The circuit might glitch out, get stuck, or wildly toggle back and forth. If you actually need feedback, you break the loop with a register, so the "next" state depends cleanly on the "current" state.
Check your understanding
What does combinational logic remember from the past?
Section summary
- Combinational logic exists all at once; it's not a sequential script.
- Electricity takes physical time to ripple through gates (propagation delay).
- If a path takes too long, we chop it up with pipeline registers.
Repository layer · second pass
What does combinational logic compute “now”?
Combinational outputs are functions of current inputs. Gates continuously settle after propagation delay; they do not wait for source-code lines or remember prior values. Long arithmetic chains can violate the clock-period target even when logically correct.
Describe combinational blocks with complete assignments for every path. Missing assignments infer storage, changing the temporal contract. In design reviews, pair the Boolean/arithmetic function with an estimated critical path.
Reasoning chain
- 1
Write output as a pure function.
- 2
Cover every condition.
- 3
Derive width and signedness.
- 4
Estimate logic depth.
- 5
Register boundaries when timing requires.
- 6
Test truth tables or arithmetic reference cases.
Worked trace
A mux has no memory
- y = select ? b : a.
- Changing select changes which input drives y.
- No clock is required.
- If neither branch assigns y in RTL, accidental state may be inferred.
Result. Complete combinational assignment preserves the pure-function model.
Executable lens · Python
Make the hidden state visible
def mux(select, a, b):
return b if select else a
assert mux(0,5,9)==5
assert mux(1,5,9)==9Retype this example, predict each intermediate value, and then change one input that touches a boundary.
Misconception clinic
Tempting mistakes
- Reading HDL top to bottom as sequential execution.
- Leaving an output unchanged in a combinational branch.
Retrieval and transfer
Close the book first
- Draw gates for a one-bit full adder.
- Identify the critical path in multiply-add-reduce.
- Explain why combinational loops are dangerous.