Skip to content

Commit 8d8769c

Browse files
committed
stream_buffer area optimization
1 parent b0c48e7 commit 8d8769c

File tree

1 file changed

+33
-55
lines changed

1 file changed

+33
-55
lines changed

hw/rtl/libs/VX_stream_buffer.sv

+33-55
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15-
// A stream elastic buffer operates at full-bandwidth where fire_in and fire_out can happen simultaneously
15+
// A stream elastic buffer_r operates at full-bandwidth where fire_in and fire_out can happen simultaneously
1616
// It has the following benefits:
1717
// + full-bandwidth throughput
1818
// + ready_in and ready_out are decoupled
@@ -45,88 +45,66 @@ module VX_stream_buffer #(
4545
assign valid_out = valid_in;
4646
assign data_out = data_in;
4747

48-
end else if (OUT_REG != 0) begin : g_out_reg
48+
end else begin : g_buffer
4949

50-
reg [DATAW-1:0] data_out_r;
51-
reg [DATAW-1:0] buffer;
52-
reg valid_out_r;
53-
reg no_buffer;
50+
reg [DATAW-1:0] data_out_r, buffer_r;
51+
reg valid_out_r, valid_in_r;
5452

5553
wire fire_in = valid_in && ready_in;
5654
wire flow_out = ready_out || ~valid_out;
5755

5856
always @(posedge clk) begin
5957
if (reset) begin
60-
valid_out_r <= 0;
61-
no_buffer <= 1;
62-
end else begin
63-
if (flow_out) begin
64-
no_buffer <= 1;
65-
end else if (valid_in) begin
66-
no_buffer <= 0;
67-
end
68-
if (flow_out) begin
69-
valid_out_r <= valid_in || ~no_buffer;
70-
end
58+
valid_in_r <= 1'b1;
59+
end else if (valid_in || flow_out) begin
60+
valid_in_r <= flow_out;
7161
end
7262
end
7363

7464
always @(posedge clk) begin
75-
if (fire_in) begin
76-
buffer <= data_in;
77-
end
78-
if (flow_out) begin
79-
data_out_r <= no_buffer ? data_in : buffer;
65+
if (reset) begin
66+
valid_out_r <= 1'b0;
67+
end else if (flow_out) begin
68+
valid_out_r <= valid_in || ~valid_in_r;
8069
end
8170
end
8271

83-
assign ready_in = no_buffer;
84-
assign valid_out = valid_out_r;
85-
assign data_out = data_out_r;
72+
if (OUT_REG != 0) begin : g_out_reg
8673

87-
end else begin : g_no_out_reg
74+
always @(posedge clk) begin
75+
if (fire_in) begin
76+
buffer_r <= data_in;
77+
end
78+
end
8879

89-
reg [DATAW-1:0] data_out_r, buffer;
90-
reg valid_in_r, valid_out_r;
80+
always @(posedge clk) begin
81+
if (flow_out) begin
82+
data_out_r <= valid_in_r ? data_in : buffer_r;
83+
end
84+
end
9185

92-
wire fire_in = valid_in && ready_in;
93-
wire fire_out = valid_out && ready_out;
86+
assign data_out = data_out_r;
9487

95-
always @(posedge clk) begin
96-
if (reset) begin
97-
valid_in_r <= 1'b1;
98-
end else begin
99-
if (fire_in ^ fire_out) begin
100-
valid_in_r <= valid_out_r ^ fire_in;
88+
end else begin : g_no_out_reg
89+
90+
always @(posedge clk) begin
91+
if (fire_in) begin
92+
data_out_r <= data_in;
10193
end
10294
end
103-
end
10495

105-
always @(posedge clk) begin
106-
if (reset) begin
107-
valid_out_r <= 1'b0;
108-
end else begin
109-
if (fire_in ^ fire_out) begin
110-
valid_out_r <= valid_in_r ^ fire_out;
96+
always @(posedge clk) begin
97+
if (fire_in) begin
98+
buffer_r <= data_out_r;
11199
end
112100
end
113-
end
114101

115-
always @(posedge clk) begin
116-
if (fire_in) begin
117-
data_out_r <= data_in;
118-
end
119-
end
102+
assign data_out = valid_in_r ? data_out_r : buffer_r;
120103

121-
always @(posedge clk) begin
122-
if (fire_in) begin
123-
buffer <= data_out_r;
124-
end
125104
end
126105

127-
assign ready_in = valid_in_r;
128106
assign valid_out = valid_out_r;
129-
assign data_out = valid_in_r ? data_out_r : buffer;
107+
assign ready_in = valid_in_r;
130108

131109
end
132110

0 commit comments

Comments
 (0)