operand_requester Module Documentation
Overview
The operand_requester module orchestrates operand fetches from the Vector Register File (VRF) and delivers them to operand queues. It supports:
VRF access arbitration across multiple operand queues and functional units
Hazard tracking to prevent data hazards between instructions
Per-bank grant handling for load/store, ALU, mask, slide units, etc.
VRF write-backs from functional units
Exception flushing for store-related hazards
Interface Description
Inputs
clk_i,rst_ni: Clock and active-low reset.global_hazard_table_i: Tracks instruction dependencies across vector instructions.operand_request_i,operand_request_valid_i: Requests from operand queues.lsu_ex_flush_i: Flush signal for store exceptions.operand_queue_ready_i: Queue ready status for issued operands.Functional unit write-back inputs (
*_result_*_i): ALU, MFPU, Mask, Slide, Load.
Outputs
operand_request_ready_o: Ready to accept new requests.lsu_ex_flush_o: Acknowledge exception flush.vrf_*_o: Outputs for accessing the VRF (read/write).operand_queue_*_o: Commands and valid signals for operand queues.Functional unit grant outputs (
*_result_*_gnt_o,*_result_final_gnt_o)
Internal Mechanisms
Stream Registers
For results written back from VLDU, Slide, and Mask units, stream registers are used to buffer incoming data and synchronize write-backs. These wrap ID, address, data, and byte-enable.
Each stream register:
Buffers a result from a VFU
Issues a valid signal
Acknowledges with a grant signal
Final grants are issued when data is truly committed to VRF to avoid releasing hazards prematurely.
Hazard Management
Each operand requester tracks hazards using
requester_metadata_t.Hazards are checked against a global hazard table.
Stalls are inserted if a dependency is not resolved.
Hazards specifically handled:
Write-after-read (WAR) and write-after-write (WAW)
Widening operations (doubling vector width) use toggling counters to synchronize requests.
Operand Fetch State Machine
Each operand requester has a 2-state FSM:
IDLE: Wait for a new request.REQUESTING: Issue operand accesses to the VRF.
On receiving a valid request:
VRF address is computed
Metadata is initialized
Commands are sent to the operand queue
Transition to
REQUESTING
In REQUESTING:
Stall if hazard unresolved
Issue bank-aligned requests
Update address and element counters
Transition to
IDLEonce all elements are read
Arbitration
Each VRF bank instantiates:
High-Priority Arbiter:
ALU
MFPU
Mask Unit
Low-Priority Arbiter:
Slide Address Generator
Load Unit
Store-Related Operand Queues
Top-Level Arbiter:
Selects between high and low priority
Drives VRF signals:
vrf_req_o,vrf_addr_o,vrf_wen_o, etc.
Exception Flushing
On store-related exceptions (lsu_ex_flush_i), operand requests associated with:
StA(Store Address)SlideAddrGenAMaskM
are aborted immediately. Metadata is reset, and the FSM transitions back to IDLE.