mirror of
https://github.com/vortexgpgpu/vortex.git
synced 2025-04-23 21:39:10 -04:00
stream_buffer area optimization
Some checks failed
CI / setup (push) Has been cancelled
CI / build (32) (push) Has been cancelled
CI / build (64) (push) Has been cancelled
CI / tests (cache, 32) (push) Has been cancelled
CI / tests (cache, 64) (push) Has been cancelled
CI / tests (config1, 32) (push) Has been cancelled
CI / tests (config1, 64) (push) Has been cancelled
CI / tests (config2, 32) (push) Has been cancelled
CI / tests (config2, 64) (push) Has been cancelled
CI / tests (debug, 32) (push) Has been cancelled
CI / tests (debug, 64) (push) Has been cancelled
CI / tests (opencl, 32) (push) Has been cancelled
CI / tests (opencl, 64) (push) Has been cancelled
CI / tests (regression, 32) (push) Has been cancelled
CI / tests (regression, 64) (push) Has been cancelled
CI / tests (scope, 32) (push) Has been cancelled
CI / tests (scope, 64) (push) Has been cancelled
CI / tests (stress, 32) (push) Has been cancelled
CI / tests (stress, 64) (push) Has been cancelled
CI / tests (synthesis, 32) (push) Has been cancelled
CI / tests (synthesis, 64) (push) Has been cancelled
CI / tests (vm, 32) (push) Has been cancelled
CI / tests (vm, 64) (push) Has been cancelled
CI / complete (push) Has been cancelled
Some checks failed
CI / setup (push) Has been cancelled
CI / build (32) (push) Has been cancelled
CI / build (64) (push) Has been cancelled
CI / tests (cache, 32) (push) Has been cancelled
CI / tests (cache, 64) (push) Has been cancelled
CI / tests (config1, 32) (push) Has been cancelled
CI / tests (config1, 64) (push) Has been cancelled
CI / tests (config2, 32) (push) Has been cancelled
CI / tests (config2, 64) (push) Has been cancelled
CI / tests (debug, 32) (push) Has been cancelled
CI / tests (debug, 64) (push) Has been cancelled
CI / tests (opencl, 32) (push) Has been cancelled
CI / tests (opencl, 64) (push) Has been cancelled
CI / tests (regression, 32) (push) Has been cancelled
CI / tests (regression, 64) (push) Has been cancelled
CI / tests (scope, 32) (push) Has been cancelled
CI / tests (scope, 64) (push) Has been cancelled
CI / tests (stress, 32) (push) Has been cancelled
CI / tests (stress, 64) (push) Has been cancelled
CI / tests (synthesis, 32) (push) Has been cancelled
CI / tests (synthesis, 64) (push) Has been cancelled
CI / tests (vm, 32) (push) Has been cancelled
CI / tests (vm, 64) (push) Has been cancelled
CI / complete (push) Has been cancelled
This commit is contained in:
parent
b0c48e7a46
commit
8d8769c710
1 changed files with 39 additions and 61 deletions
|
@ -12,7 +12,7 @@
|
|||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
// A stream elastic buffer operates at full-bandwidth where fire_in and fire_out can happen simultaneously
|
||||
// A stream elastic buffer_r operates at full-bandwidth where fire_in and fire_out can happen simultaneously
|
||||
// It has the following benefits:
|
||||
// + full-bandwidth throughput
|
||||
// + ready_in and ready_out are decoupled
|
||||
|
@ -45,88 +45,66 @@ module VX_stream_buffer #(
|
|||
assign valid_out = valid_in;
|
||||
assign data_out = data_in;
|
||||
|
||||
end else if (OUT_REG != 0) begin : g_out_reg
|
||||
end else begin : g_buffer
|
||||
|
||||
reg [DATAW-1:0] data_out_r;
|
||||
reg [DATAW-1:0] buffer;
|
||||
reg valid_out_r;
|
||||
reg no_buffer;
|
||||
reg [DATAW-1:0] data_out_r, buffer_r;
|
||||
reg valid_out_r, valid_in_r;
|
||||
|
||||
wire fire_in = valid_in && ready_in;
|
||||
wire flow_out = ready_out || ~valid_out;
|
||||
|
||||
always @(posedge clk) begin
|
||||
if (reset) begin
|
||||
valid_out_r <= 0;
|
||||
no_buffer <= 1;
|
||||
end else begin
|
||||
if (flow_out) begin
|
||||
no_buffer <= 1;
|
||||
end else if (valid_in) begin
|
||||
no_buffer <= 0;
|
||||
end
|
||||
if (flow_out) begin
|
||||
valid_out_r <= valid_in || ~no_buffer;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
always @(posedge clk) begin
|
||||
if (fire_in) begin
|
||||
buffer <= data_in;
|
||||
end
|
||||
if (flow_out) begin
|
||||
data_out_r <= no_buffer ? data_in : buffer;
|
||||
end
|
||||
end
|
||||
|
||||
assign ready_in = no_buffer;
|
||||
assign valid_out = valid_out_r;
|
||||
assign data_out = data_out_r;
|
||||
|
||||
end else begin : g_no_out_reg
|
||||
|
||||
reg [DATAW-1:0] data_out_r, buffer;
|
||||
reg valid_in_r, valid_out_r;
|
||||
|
||||
wire fire_in = valid_in && ready_in;
|
||||
wire fire_out = valid_out && ready_out;
|
||||
|
||||
always @(posedge clk) begin
|
||||
if (reset) begin
|
||||
valid_in_r <= 1'b1;
|
||||
end else begin
|
||||
if (fire_in ^ fire_out) begin
|
||||
valid_in_r <= valid_out_r ^ fire_in;
|
||||
end
|
||||
valid_in_r <= 1'b1;
|
||||
end else if (valid_in || flow_out) begin
|
||||
valid_in_r <= flow_out;
|
||||
end
|
||||
end
|
||||
|
||||
always @(posedge clk) begin
|
||||
if (reset) begin
|
||||
valid_out_r <= 1'b0;
|
||||
end else begin
|
||||
if (fire_in ^ fire_out) begin
|
||||
valid_out_r <= valid_in_r ^ fire_out;
|
||||
end else if (flow_out) begin
|
||||
valid_out_r <= valid_in || ~valid_in_r;
|
||||
end
|
||||
end
|
||||
|
||||
if (OUT_REG != 0) begin : g_out_reg
|
||||
|
||||
always @(posedge clk) begin
|
||||
if (fire_in) begin
|
||||
buffer_r <= data_in;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
always @(posedge clk) begin
|
||||
if (fire_in) begin
|
||||
data_out_r <= data_in;
|
||||
always @(posedge clk) begin
|
||||
if (flow_out) begin
|
||||
data_out_r <= valid_in_r ? data_in : buffer_r;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
always @(posedge clk) begin
|
||||
if (fire_in) begin
|
||||
buffer <= data_out_r;
|
||||
assign data_out = data_out_r;
|
||||
|
||||
end else begin : g_no_out_reg
|
||||
|
||||
always @(posedge clk) begin
|
||||
if (fire_in) begin
|
||||
data_out_r <= data_in;
|
||||
end
|
||||
end
|
||||
|
||||
always @(posedge clk) begin
|
||||
if (fire_in) begin
|
||||
buffer_r <= data_out_r;
|
||||
end
|
||||
end
|
||||
|
||||
assign data_out = valid_in_r ? data_out_r : buffer_r;
|
||||
|
||||
end
|
||||
|
||||
assign ready_in = valid_in_r;
|
||||
assign valid_out = valid_out_r;
|
||||
assign data_out = valid_in_r ? data_out_r : buffer;
|
||||
assign ready_in = valid_in_r;
|
||||
|
||||
end
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue