Part 9 · Register Model (RAL) · Intermediate
Frontdoor Bus Path
End-to-end frontdoor operation from RAL API call through adapter, sequencer, driver, bus handshake, monitor, and predictor.
What frontdoor actually proves
A frontdoor register access is not just a value write. It validates a chain: model map lookup, adapter packing, sequence arbitration, driver timing, DUT decode, and response-to-mirror reconciliation.
[RAL][BUS] frontdoor validation surface
RAL API call
-> map offset and byte-lane handling
-> reg2bus conversion
-> bus sequence arbitration and ordering
-> driver protocol timing
-> DUT address decode and side effects
-> monitor capture
-> predictor mirror update
If any stage is wrong, frontdoor checks reveal it.Frontdoor is the path for protocol, latency, and decode confidence.
Coverage from bus monitors and assertions is meaningful only on frontdoor traffic.
Most signoff feature tests should execute critical accesses frontdoor.
Full sequencer to driver flow
This sequence diagram captures the operational path for a typical ral.ctrl.write(...) call using UVM_FRONTDOOR.
[RAL][BUS] full frontdoor bus path
[TEST] ral.ctrl.write(status, 32'h0000_0001, UVM_FRONTDOOR, .parent(this))
|
v
[RAL] uvm_reg::write
|
+--> resolve register in uvm_reg_map
+--> form uvm_reg_bus_op (kind=WRITE, addr, data, be)
|
v
[RAL] uvm_reg_adapter::reg2bus
|
+--> create protocol item (apb_item/axi_item/...)
|
v
[BUS] map sequencer start_item/finish_item
|
+--> arbitration among active sequences
|
v
[BUS] driver gets item and drives interface
|
+--> address phase
+--> data phase
+--> response phase
|
v
[DUT] register decode and state update
|
v
[BUS] monitor samples transfer
|
v
[RAL] predictor bus2reg + predict()
|
v
[RAL] mirrored value updated, status returnedtask body();
uvm_status_e status;
uvm_reg_data_t read_data;
// 1) Write by name through map/adapter/bus
ral.ctrl.write(
.status(status),
.value(32'h0000_0001),
.path(UVM_FRONTDOOR),
.parent(this)
);
if (status != UVM_IS_OK)
`uvm_error("FD", "frontdoor write failed")
// 2) Read back through same bus path
ral.ctrl.read(
.status(status),
.value(read_data),
.path(UVM_FRONTDOOR),
.parent(this)
);
if (status != UVM_IS_OK)
`uvm_error("FD", "frontdoor read failed")
endtaskAdapter and map wiring checklist
Frontdoor reliability depends on clean map and adapter setup. A partial connection can look fine for writes and still fail on read response or prediction.
function void connect_phase(uvm_phase phase);
super.connect_phase(phase);
// RAL frontdoor route
reg_model.default_map.set_sequencer(apb.sqr, apb_adapter);
// Prefer explicit prediction in non-trivial benches
reg_model.default_map.set_auto_predict(0);
predictor.map = reg_model.default_map;
predictor.adapter = apb_adapter;
apb.mon.ap.connect(predictor.bus_in);
endfunction[BUS] frontdoor sanity checks
map.set_sequencer called? YES/NO
adapter reg2bus and bus2reg consistent? YES/NO
read response correctly routed? YES/NO
predictor connected to monitor AP? YES/NO
auto_predict policy intentional? YES/NO
bus monitor sees same addr/data as expected? YES/NOMismatch between reg2bus and bus2reg causes subtle mirror drift.
Missing predictor often appears only when mirror checks are enabled.
Read flows require careful response handling, not just request drive.
Timeline walkthrough
A cycle-level view helps debug where a frontdoor access stalls or diverges.
[BUS] cycle sketch for one frontdoor write
t0 sequence issues ral write
t1 reg2bus creates bus item
t2 sequencer grants item to driver
t3 driver asserts request/address
t4 DUT ready accepted
t5 write data committed in DUT reg file
t6 monitor samples completed transfer
t7 predictor updates mirrored value
t8 write returns UVM_IS_OKvirtual function void bus2reg(uvm_sequence_item bus_item, ref uvm_reg_bus_op rw);
apb_item item;
if (!$cast(item, bus_item)) begin
rw.status = UVM_NOT_OK;
`uvm_error("ADAPTER", "bus2reg cast failed")
return;
end
rw.kind = item.write ? UVM_WRITE : UVM_READ;
rw.addr = item.addr;
rw.data = item.data;
rw.status = item.slverr ? UVM_NOT_OK : UVM_IS_OK;
endfunctionKey takeaways
Frontdoor validates the entire verification and DUT integration stack.
Correct map, adapter, sequencer, and predictor wiring is mandatory.
Cycle-level tracing pinpoints frontdoor failures faster than log-only debugging.
Common pitfalls
Treating adapter code as boilerplate and skipping review of be/addr semantics.
Leaving auto_predict on while also using explicit predictor without intent.
Ignoring monitor evidence when frontdoor status says UVM_IS_OK but mirror is wrong.