Part 7 · Memory & Buses · Senior Prep

Minimal AXI-Lite slave skeleton

AXI-Lite: Minimal AXI-Lite slave skeleton.

Minimal AXI-Lite slave skeleton

verilog
module axilite_regs #(
  parameter int AW = 8,
  parameter int DW = 32
) (
  input  logic             clk,
  input  logic             rst_n,
  input  logic             s_awvalid,
  output logic             s_awready,
  input  logic [AW-1:0]    s_awaddr,
  input  logic             s_wvalid,
  output logic             s_wready,
  input  logic [DW-1:0]    s_wdata,
  input  logic [DW/8-1:0]  s_wstrb,
  output logic             s_bvalid,
  input  logic             s_bready,
  output logic [1:0]       s_bresp,
  input  logic             s_arvalid,
  output logic             s_arready,
  input  logic [AW-1:0]    s_araddr,
  output logic             s_rvalid,
  input  logic             s_rready,
  output logic [DW-1:0]    s_rdata,
  output logic [1:0]       s_rresp
);
  logic [DW-1:0] reg0, reg1;
  logic aw_seen, w_seen;
  logic [AW-1:0] awaddr_q;
  logic [DW-1:0] wdata_q;
  logic [DW/8-1:0] wstrb_q;

  assign s_awready = !aw_seen && !s_bvalid;
  assign s_wready  = !w_seen  && !s_bvalid;
  assign s_arready = !s_rvalid;
  assign s_bresp   = 2'b00; // OKAY
  assign s_rresp   = 2'b00; // OKAY

  always_ff @(posedge clk or negedge rst_n) begin
    if (!rst_n) begin
      aw_seen <= 1'b0;
      w_seen  <= 1'b0;
      awaddr_q <= '0;
      wdata_q  <= '0;
      wstrb_q  <= '0;
      s_bvalid <= 1'b0;
      s_rvalid <= 1'b0;
      s_rdata  <= '0;
      reg0 <= '0;
      reg1 <= '0;
    end else begin
      if (s_awvalid && s_awready) begin
        aw_seen  <= 1'b1;
        awaddr_q <= s_awaddr;
      end

      if (s_wvalid && s_wready) begin
        w_seen  <= 1'b1;
        wdata_q <= s_wdata;
        wstrb_q <= s_wstrb;
      end

      if (aw_seen && w_seen && !s_bvalid) begin
        case (awaddr_q[3:2])
          2'b00: reg0 <= apply_wstrb(reg0, wdata_q, wstrb_q);
          2'b01: reg1 <= apply_wstrb(reg1, wdata_q, wstrb_q);
          default: reg0 <= reg0;
        endcase
        s_bvalid <= 1'b1;
        aw_seen  <= 1'b0;
        w_seen   <= 1'b0;
      end

      if (s_bvalid && s_bready)
        s_bvalid <= 1'b0;

      if (s_arvalid && s_arready) begin
        unique case (s_araddr[3:2])
          2'b00: s_rdata <= reg0;
          2'b01: s_rdata <= reg1;
          default: s_rdata <= 32'hDEAD_BEEF;
        endcase
        s_rvalid <= 1'b1;
      end

      if (s_rvalid && s_rready)
        s_rvalid <= 1'b0;
    end
  end

  function automatic logic [DW-1:0] apply_wstrb(
    input logic [DW-1:0] old_v,
    input logic [DW-1:0] new_v,
    input logic [DW/8-1:0] strb
  );
    logic [DW-1:0] tmp;
    int i;
    begin
      tmp = old_v;
      for (i = 0; i < DW/8; i++) begin
        if (strb[i])
          tmp[i*8 +: 8] = new_v[i*8 +: 8];
      end
      return tmp;
    end
  endfunction
endmodule

Deep dive

This lesson deepens Minimal AXI-Lite slave skeleton within memory-buses. Senior reviewers expect you to connect mechanism to memory inference, valid/ready, and AXI family protocols — not just define terms.

Start from the spec invariant: what must always be true each cycle? Write it as a Boolean relation, timing budget, or protocol rule before coding. That invariant becomes your reference model, assertion, or waveform check.

At tape-out quality, every block needs a sign-off story: protocol assertions, backpressure tested. Treat this lesson as building one paragraph of that story for your project documentation.

Architecture and signal flow

diagram
MINIMAL AXI-LITE SLAVE SKELETON

  inputs ──► [memory-buses] ──► mechanism ──► outputs
                │                │
           axi-lite     verify in sim + lint

Worked example (Verilog/SystemVerilog)

Synthesizable pattern for this topic — simulate locally and compare against your reference.

verilog
// AW/W/B and AR/R channels

Step-by-step design procedure

  1. Write the spec invariant (truth table, timing, or protocol rule).

  2. Sketch block diagram — inputs, outputs, clock/reset domains.

  3. Code the minimal correct version (no optimizations yet).

  4. Run self-checking TB with corners: min, max, reset, idle.

  5. Lint and review: width, latch, clock, CDC if applicable.

  6. Iterate for timing/area only after functionally proven.

Timing and resource trade-offs

diagram
METRIC          TYPICAL LEVER
Logic levels      algebra / pipelining
Register count    retiming / sharing
Wire fanout       duplication / pipeline
Power             clock gating / operand isolation
Debug visibility  status flags / SVA / waveform probes

Debug checklist

  • Compare DUT vs reference on every stimulus vector

  • Capture first cycle of mismatch — not last

  • Log seed and plusargs for random regressions

  • Check reset release and clock alignment in TB

  • If waveform is ambiguous, add temporary assertions

Interview angle

Skid buffer vs FIFO on valid/ready?

diagram
MODEL ANSWER SKELETON
1. MECHANISM — one-sentence technical truth
2. MOTIVATION — why this structure vs alternatives
3. WHEN TO USE / SKIP — scope and assumptions
4. PITFALL — common junior mistake
5. EXAMPLE — Verilog or waveform scenario

Practice exercise

Extend the worked example for "Minimal AXI-Lite slave skeleton": add one corner case, write a self-checking test, and document one intentional pitfall you avoided. Timebox: 30–45 minutes.

Key takeaways

  • Connect Minimal AXI-Lite slave skeleton to memory inference, valid/ready, and AXI family protocols.

  • Spec → diagram → code → TB → lint is the default loop.

  • Document assumptions at block boundaries (width, signedness, latency).

  • Interview answers need mechanism + trade-off + example.

Common pitfalls

  • Skipping reference model — passes wrong together with DUT.

  • Optimizing before correct — ECO cost goes up 10×.

  • Ignoring tool warnings — lint/CDC/STA warnings are technical debt.

  • Undocumented clock/reset domain — integration surprises.


Extended design scenario

Scenario for Minimal AXI-Lite slave skeleton : Register file read-after-write hazard — bypass or document latency.

Scenario resolution outline

  1. Reproduce with minimal TB — one stimulus, one check.

  2. Isolate failing cone (logic, FSM state, or bus beat).

  3. Fix root cause — not symptom — in RTL or TB alignment.

  4. Add regression test that fails without the fix.

  5. Document invariant in comment or SVA for permanence.

Additional simulation pattern

verilog
// AXI beat checker
assert (valid && ready) |-> stable_data;

Synthesis and sign-off notes

  • Elaborate clean — no OOM from unconstrained generate

  • Constraints cover all clocks and I/O delays

  • Cross-check RTL parameters vs integration top

  • Attach sim log + seed to code review

Lab exercise (45–60 min)

Implement or extend the worked example for "Minimal AXI-Lite slave skeleton". Add two new test vectors that target different branches. Write a one-paragraph sign-off note covering function, corners, and what you would still verify in SoC context.

Further reading in this course

diagram
Next topics in Part: follow nav_order in sidebar.
Cross-part: timing ↔ sequential, CDC ↔ senior interview,
combinational ↔ foundations number systems.

Extended design scenario

Scenario for Minimal AXI-Lite slave skeleton : Register file read-after-write hazard — bypass or document latency.

Scenario resolution outline

  1. Reproduce with minimal TB — one stimulus, one check.

  2. Isolate failing cone (logic, FSM state, or bus beat).

  3. Fix root cause — not symptom — in RTL or TB alignment.

  4. Add regression test that fails without the fix.

  5. Document invariant in comment or SVA for permanence.

Additional simulation pattern

verilog
// AXI beat checker
assert (valid && ready) |-> stable_data;

Synthesis and sign-off notes

  • Elaborate clean — no OOM from unconstrained generate

  • Constraints cover all clocks and I/O delays

  • Cross-check RTL parameters vs integration top

  • Attach sim log + seed to code review

Lab exercise (45–60 min)

Implement or extend the worked example for "Minimal AXI-Lite slave skeleton". Add two new test vectors that target different branches. Write a one-paragraph sign-off note covering function, corners, and what you would still verify in SoC context.

Further reading in this course

diagram
Next topics in Part: follow nav_order in sidebar.
Cross-part: timing ↔ sequential, CDC ↔ senior interview,
combinational ↔ foundations number systems.

Extended theory

Memory and bus interfaces are integration surfaces: software, DV, and PD all touch the same valid/ready or AXI signals—document beat-level behavior explicitly.

For "Minimal AXI-Lite slave skeleton", the invariant you defend in review is: behavior matches spec under all legal input sequences, reset flows, and backpressure patterns—not just the happy path shown in introductory diagrams.

Write the invariant as a comment above the module or as an SVA property when possible. Future you (and formal tools) will treat it as the contract.

Waveform reading guide

diagram
WAVEFORM NARRATIVE — Minimal AXI-Lite slave skeleton

cycle 0: reset asserted, outputs safe/idle
cycle 1-2: reset held, clocks running
cycle 3: reset released, first legal inputs
cycle 4+: check output latency (N cycles)
mark FIRST mismatch cycle — not last

Second worked example

Alternate pattern emphasizing debug, coverage, or integration:

verilog
// AXI beat monitor
always @(posedge clk)
  if (valid && ready) beat_cnt++;

Comparison: naive vs production

diagram
NAIVE APPROACH              PRODUCTION APPROACH
quick hack, one sim vector    self-checking TB + corners
ignore lint warnings          zero new waivers
implicit widths               explicit casts/parameters
undocumented latency          latency in module header comment

Additional interview questions

  • Explain Minimal AXI-Lite slave skeleton to a verification engineer — what would they assert?

  • What breaks first at high frequency or low voltage?

  • What is your rollback plan if synthesis QoR is unacceptable?

  • How would you debug this block with only a 32-bit GPIO trace?

Follow-up interview model answer

diagram
Q: What is the #1 mistake with Minimal AXI-Lite slave skeleton?
A:
  MECHANISM: [core rule in one line]
  MOTIVATION: why teams care in tape-out
  PITFALL: what juniors do wrong
  EXAMPLE: one Verilog line or one waveform event

Hands-on lab part 2

  1. Fork the worked example; add one assertion or SVA cover.

  2. Inject a bug deliberately; confirm TB or assertion catches it.

  3. Write 5-bullet PR description for your change.

  4. Peer review: can a teammate enable the block without asking you?

Sign-off evidence checklist

  • Directed sim log attached (PASS, seed noted)

  • Lint report clean for touched files

  • If sequential: reset + clocking section in README

  • If bus-facing: protocol cheat sheet in module doc

  • If timing-critical: note expected critical path endpoint