Skip to content
DenseChip
Learn
PracticeCode labInterview

DenseChip

Navigate

Menu

LearnPracticeCode labInterview

Tools

All toolsSV editorCode repoResume
DenseChip

Practice, courses, and chip-design tools in one focused workspace.

LearnPracticeCode labInterviewToolsLearning paths

© 2026 DenseChip

AboutContactPrivacyTerms
Skip to lesson

Course contents

  • RTL Foundations57
  • Combinational Design58
  • Sequential Design61
  • FSM & Control66
  • Timing & Clocking64
  • Reset & CDC58
  • Memory & Buses94
    • SRAM and ROM
    • Register Files
    • Valid/Ready Handshake
      • Rules That Keep Flow Control Safe
      • One-deep skid buffer
      • Skid Buffer and Pipeline Stages
      • AXI-Style Channels and Backpressure
      • AXI-style interpretation
      • Key takeaways
      • Three Pipeline Stage Styles, Measured
      • Common pitfalls
      • Worked Examples and Waveforms
      • Corner Cases and Stress Tests
      • Integration and Sign-off Notes
    • AXI-Lite
    • AXI-Stream
    • Bus Integration
    • Synchronous FIFO
    • Register-Map and CSR RTL
    • Memory Reliability
    • Peripheral RTL Integration
    • Full AXI4: RTL Roadmap
  • Advanced RTL60
  • Senior & Interview175
  • Glossary and Notation
Loading lesson

‹Valid/Ready Handshake
  1. Topics
  2. RTL Design
  3. Memory & Buses
  4. Valid/Ready Handshake
  5. AXI-Style Channels and Backpressure

Part 7 · Memory & Buses · Intermediate

AXI-Style Channels and Backpressure

The five AXI channels as independent valid/ready streams, plus a two-stage elastic pipeline.

On this page

    Why this matters

    AXI has five independent valid/ready channels, and a master that waits for AWREADY before offering WVALID can deadlock a slave that waits for WVALID before accepting AW. Registered ready decides whether the clock closes across the fabric.

    After this lesson you can: map the five AXI channels onto valid/ready, say who drives each signal, and explain how registered ready and FIFOs keep timing closed.

    Five independent streams

    Each AXI channel has its own valid/ready transfer event. A stall on one does not itself transfer or cancel a beat on another, but shared capacity and transaction dependencies can legitimately couple progress. Channel independence does not guarantee that every other channel continues.

    Channel

    Payload

    Valid driver

    Ready driver

    AW (write address)

    Address and protection

    Master

    Slave

    W (write data)

    Data and strobes

    Master

    Slave

    B (write response)

    Response

    Slave

    Master

    AR (read address)

    Address and protection

    Master

    Slave

    R (read data)

    Data and response

    Slave

    Master

    The five AXI channels between one master and one slave: AW, W and AR carry valid to the slave, B and R carry it back, and each channel's ready (dashed) runs the other way

    Each pair of arrows is one complete handshake. The solid arrow shows where valid and the payload go; the dashed one is that channel's ready, running the other way.

    • Down: the master drives valid on AW, W and AR, and the slave answers with ready.

    • Up: the slave drives valid on B and R, and the master answers with ready.

    • Separate handshakes: a stall on one pair does not by itself stall another. Shared buffers and transaction rules, such as B only after AW and W, couple them.

    AXI4-Lite carries one beat per transaction, with no bursts and no IDs. Bursts, IDs and ordering belong to full AXI4 and are out of scope here.

    The elastic-pipeline view

    Treat each channel as a small elastic pipeline. Beats enter whenever the next stage has room, and wait otherwise.

    • Registered ready keeps timing closed. A combinational ready would chain through the interconnect and limit the clock. A registered ready breaks the path, and the skid or FIFO behind it absorbs the extra cycle.

    • FIFOs decouple bursty ends. A FIFO between a fast producer and a slow consumer absorbs bursts up to its depth. Size the depth against the round-trip latency of the ready path.

    • Stages compose. Two skid stages in series still move one beat per cycle and still never lose one, as the testbench below shows.

    Common mistakes

    Common pitfall

    A sender must not wait for READY before asserting its channel's VALID, and must hold the offer until acceptance. An AXI write master must not wait for AWREADY before offering WVALID; that can deadlock a receiver waiting for WVALID before accepting AW. Receiver READY may throttle for capacity: a one-response-slot slave can lower ARREADY while an R response is outstanding, and a slave can wait for address capacity before accepting W. Associate separately accepted AW and W for the same write, and generate B only after the required write handshakes. Audit the complete dependency graph for deadlock; independent handshakes are not independent transactions.

    Interview

    Likely question: “How do the five AXI channels relate to valid/ready?”

    • Independent. Each channel has its own valid, ready and transfer rule.

    • Directed. AW, W and AR flow from master to slave; B and R flow back.

    • Elastic. Registered stages and FIFOs carry the beats between them.

    Check yourself The write address channel stalls. Must the read channel stall too?

    No protocol rule requires it. AR and R can progress when their resources and transaction rules permit; shared capacity may legitimately throttle them. Independence alone promises no unconditional progress.

    Testbench

    Two skid stages in series form a small elastic pipeline. The testbench drives random backpressure and checks that 128 beats arrive in order.

    skid_buffer.sv
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    module skid_buffer #(
      parameter int DW = 8
    ) (
      input  logic          clk,
      input  logic          rst_n,
      input  logic          s_valid_i,
      output logic          s_ready_o,
      input  logic [DW-1:0] s_data_i,
      output logic          m_valid_o,
      input  logic          m_ready_i,
      output logic [DW-1:0] m_data_o
    );
      logic [DW-1:0] out_data, skid_data;
      logic out_valid, skid_valid, ready_q;
      logic next_out_valid, next_skid_valid;
      logic [DW-1:0] next_out_data, next_skid_data;
      wire push, pop;
    
      assign m_valid_o = out_valid;
      assign m_data_o  = out_data;
      assign s_ready_o = ready_q;               // registered: no combinational m_ready_i to s_ready_o path
      assign push = s_valid_i && ready_q;
      assign pop  = out_valid && m_ready_i;
    
      always_comb begin
        next_out_valid  = out_valid;
        next_skid_valid = skid_valid;
        next_out_data   = out_data;
        next_skid_data  = skid_data;
        if (pop) begin
          if (skid_valid) begin
            next_out_data = skid_data;
            if (push) next_skid_data = s_data_i;  // unreachable with registered ready, kept for safety
            else      next_skid_valid = 1'b0;
          end else if (push) begin
            next_out_data  = s_data_i;
            next_out_valid = 1'b1;
          end else begin
            next_out_valid = 1'b0;
          end
        end else if (push) begin
          if (!out_valid) begin
            next_out_data  = s_data_i;
            next_out_valid = 1'b1;
          end else begin
            next_skid_data  = s_data_i;
            next_skid_valid = 1'b1;
          end
        end
      end
    
      always_ff @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
          out_valid  <= 1'b0;
          skid_valid <= 1'b0;
          ready_q    <= 1'b1;
          out_data   <= '0;
          skid_data  <= '0;
        end else begin
          out_valid  <= next_out_valid;
          skid_valid <= next_skid_valid;
          out_data   <= next_out_data;
          skid_data  <= next_skid_data;
          ready_q    <= !(next_out_valid && next_skid_valid);
        end
      end
    endmodule
    
    // Two skid stages in series: a minimal elastic pipeline.
    module vr_pipe2 #(
      parameter int DW = 8
    ) (
      input  logic          clk,
      input  logic          rst_n,
      input  logic          s_valid_i,
      output logic          s_ready_o,
      input  logic [DW-1:0] s_data_i,
      output logic          m_valid_o,
      input  logic          m_ready_i,
      output logic [DW-1:0] m_data_o
    );
      logic mid_valid, mid_ready;
      logic [DW-1:0] mid_data;
      skid_buffer #(.DW(DW)) st0 (
        .clk(clk), .rst_n(rst_n),
        .s_valid_i(s_valid_i), .s_ready_o(s_ready_o), .s_data_i(s_data_i),
        .m_valid_o(mid_valid), .m_ready_i(mid_ready), .m_data_o(mid_data)
      );
      skid_buffer #(.DW(DW)) st1 (
        .clk(clk), .rst_n(rst_n),
        .s_valid_i(mid_valid), .s_ready_o(mid_ready), .s_data_i(mid_data),
        .m_valid_o(m_valid_o), .m_ready_i(m_ready_i), .m_data_o(m_data_o)
      );
    endmodule
    

    Remember

    • Each channel has its own valid, ready and transfer event, but shared capacity and transaction dependencies can still throttle another channel.

    • A registered ready breaks the long combinational ready chain through the interconnect.

    • Size a FIFO against the round-trip latency of the ready path.

    Keep going

    • Practice: AXI slave interface with write data buffering

    • Interview: run a mock interview on this topic

    Related topics

    • AXI-Lite

    Previous

    387 / 694

    Next: AXI-style interpretation

    Up next

    Up nextAXI-style interpretation

    Sign in to save progress

    Practice this lessonReport an error

    See also

    • Rules That Keep Flow Control Safe
    • One-deep skid buffer
    • Key takeaways