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
IDLE
once 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)SlideAddrGenA
MaskM
are aborted immediately. Metadata is reset, and the FSM transitions back to IDLE
.