In this lesson, you will learn how to identify the "bottleneck" in your circuit and use pipelining to boost your system's clock speed.
Identifying the Critical Path
In any synchronous digital system, your clock frequency is limited by the critical path. This is the longest delay path between any two registers. Imagine a data path where a signal must travel through an Adder, then a Multiplier, then a Multiplexer before reaching the next Flip-Flop. The clock period must be long enough for the signal to finish all these operations. If the total delay is 10ns, your maximum clock frequency is capped at 100MHz (). If you try to run it faster, the signal won’t reach the destination register before the next clock edge, causing a timing violation.
Improving Throughput with Pipelining
To improve throughput, we use pipelining. This technique involves inserting registers into the middle of a long combinational path, effectively breaking one large task into several smaller "stages."
Consider our previous example:
- Original Design:
Register A -> [Adder + Multiplier + Mux] -> Register B(10ns delay). - Pipelined Design:
Register A -> [Adder] -> Register C -> [Multiplier + Mux] -> Register B.
By adding Register C, we have split the work. Now, the longest delay is the longest stage, which might only be 6ns. We can now increase our clock frequency to roughly 166MHz!
// Pipelined Stage Concept
always @(posedge clk) begin
stage1_result <= data_a + data_b; // Stage 1
stage2_result <= stage1_result * mult; // Stage 2
end
While the total time for a single piece of data to travel from start to finish (the latency) remains similar, the throughput—how many operations we complete per second—increases dramatically. Every clock cycle, the first stage starts a new calculation while the second stage finishes a previous one, much like an assembly line in a factory. By strategically placing registers to balance these stages, we maximize our clock frequency and overall system performance.
Key Takeaway: Pipelining increases system throughput by inserting registers to break long combinational paths into smaller, faster stages, effectively shortening the critical path.