跳转至

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