|
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