|
12 | 12 | // See the License for the specific language governing permissions and
|
13 | 13 | // limitations under the License.
|
14 | 14 |
|
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 |
16 | 16 | // It has the following benefits:
|
17 | 17 | // + full-bandwidth throughput
|
18 | 18 | // + ready_in and ready_out are decoupled
|
@@ -45,88 +45,66 @@ module VX_stream_buffer #(
|
45 | 45 | assign valid_out = valid_in;
|
46 | 46 | assign data_out = data_in;
|
47 | 47 |
|
48 |
| - end else if (OUT_REG != 0) begin : g_out_reg |
| 48 | + end else begin : g_buffer |
49 | 49 |
|
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; |
54 | 52 |
|
55 | 53 | wire fire_in = valid_in && ready_in;
|
56 | 54 | wire flow_out = ready_out || ~valid_out;
|
57 | 55 |
|
58 | 56 | always @(posedge clk) begin
|
59 | 57 | 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; |
71 | 61 | end
|
72 | 62 | end
|
73 | 63 |
|
74 | 64 | 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; |
80 | 69 | end
|
81 | 70 | end
|
82 | 71 |
|
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 |
86 | 73 |
|
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 |
88 | 79 |
|
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 |
91 | 85 |
|
92 |
| - wire fire_in = valid_in && ready_in; |
93 |
| - wire fire_out = valid_out && ready_out; |
| 86 | + assign data_out = data_out_r; |
94 | 87 |
|
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; |
101 | 93 | end
|
102 | 94 | end
|
103 |
| - end |
104 | 95 |
|
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; |
111 | 99 | end
|
112 | 100 | end
|
113 |
| - end |
114 | 101 |
|
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; |
120 | 103 |
|
121 |
| - always @(posedge clk) begin |
122 |
| - if (fire_in) begin |
123 |
| - buffer <= data_out_r; |
124 |
| - end |
125 | 104 | end
|
126 | 105 |
|
127 |
| - assign ready_in = valid_in_r; |
128 | 106 | assign valid_out = valid_out_r;
|
129 |
| - assign data_out = valid_in_r ? data_out_r : buffer; |
| 107 | + assign ready_in = valid_in_r; |
130 | 108 |
|
131 | 109 | end
|
132 | 110 |
|
|
0 commit comments