Vector Load Merge Unit VLMergeBuffer
Functional Description
A freelist-based queue that receives requests from the VLSplit module, allocates an entry for each uop launched by the backend, saves relevant information about the uop, collects data returned from the Load pipeline, and writes back to the backend and Load Queue after receiving all memory access requests split from the uop.
Feature 1: Maintaining Split Memory Access Requests for Uops
In the second stage of the VLSplit module's pipeline, a request for an entry is sent to VLMergeBuffer. In the same cycle, VLMergeBuffer returns an entry index to VLSplit, and the corresponding entry's allocated status is set to true. Upon enqueuing, the counter in the corresponding entry is written with the number of split memory access requests for the current uop. One entry is allocated for each uop, and each entry maintains the number of flows that need to be collected. When all are collected, it is marked as uopfinish and written back at the granularity of the uop. One entry marked as uopfinish is selected to be written back to the backend; when multiple entries can be written back, the one with the smaller index is written back first. At the same time, the corresponding flags are cleared.
Feature 2: Data Merging
Merge data at the granularity of the uop based on the Load pipeline output information. Data is merged based on whether there is an exception, element position, mask, etc.
Feature 3: Exception Handling
Based on the pipeline output information, correctly set ExceptionVec, vstart, and other relevant data when an exception occurs.
Feature 4: Threshold Backpressure
To avoid deadlock, when the number of free entries in VLMergeBuffer is less than or equal to 6, a threshold reaction signal is generated to VLSplit. This backpressures the VLSplit Pipe. See Performing backpressure based on VLMergeBuffer's Threshold signal.
Overall Block Diagram
No block diagram for a single module.
Main Ports
Name | Direction | Description |
---|---|---|
frompipeline | In | Receives read data return from the Load pipeline |
fromSplit.req | In | Receives entry requests from the VLSplit module |
fromSplit.resp | Out | Feedback to the VLSplit module, whether successfully allocated, allocated entry |
uopWriteback | Out | Writes back completed uops to the backend |
toLsq | Out | Updates the status of the entry in the Load queue when the uop completes and writes back |
redirect | In | Redirect port |
feedback | Out | Feedback to the backend Issue Queue; currently, the backend does not process anything |
toSplit | Out | Feedback to the VLSplit module that VLMergeBuffer is about to reach the threshold |
Interface Timing
The interface timing is relatively simple, only providing textual descriptions.
Name | Description |
---|---|
frompipeline | Has Valid, Ready. Data is valid when Valid && ready is true |
fromSplit.req | Has Valid, Ready. Data is valid when Valid && ready is true |
fromSplit.resp | Has Valid. Data is valid when Valid is true |
uopWriteback | Has Valid, Ready. Data is valid when Valid && ready is true |
toLsq | Has Valid. Data is valid when Valid is true |
redirect | Has Valid. Data is valid when Valid is true |
feedback | Has Valid. Data is valid when Valid is true |
fromMisalignBuffer | Does not have Valid. Data is always considered valid. Responds immediately upon corresponding signal generation |