@@ -54,47 +54,61 @@ module sha256_final_padding(
54
54
55
55
output wire init_out,
56
56
output wire next_out,
57
+ output wire ready_out,
57
58
output wire [511 : 0 ] block_out
58
59
);
59
60
60
61
61
62
// ----------------------------------------------------------------
62
63
// Internal constant and parameter definitions.
63
64
// ----------------------------------------------------------------
64
- localparam CTRL_IDLE = 1'h0 ;
65
- localparam CTRL_FINAL = 1'h1 ;
65
+ localparam CTRL_IDLE = 3'h0 ;
66
+ localparam CTRL_FINAL = 3'h1 ;
67
+ localparam CTRL_NEXT1 = 3'h2 ;
68
+ localparam CTRL_READY1 = 3'h3 ;
69
+ localparam CTRL_NEXT2 = 3'h4 ;
70
+ localparam CTRL_READY2 = 3'h5 ;
71
+
72
+ localparam NO_INC = 2'h0 ;
73
+ localparam BLOCK_INC = 2'h1 ;
74
+ localparam FINAL_INC = 2'h2 ;
66
75
67
76
68
77
// ----------------------------------------------------------------
69
78
// Registers including update variables and write enable.
70
79
// ----------------------------------------------------------------
71
- reg [8 : 0 ] final_len_reg;
72
- reg [8 : 0 ] final_len_we;
80
+ reg [511 : 0 ] block_out_reg;
81
+ reg [511 : 0 ] block_out_new;
82
+ reg block_out_we;
83
+
84
+ reg [8 : 0 ] final_len_reg;
85
+ reg final_len_we;
73
86
74
87
reg [63 : 0 ] bit_ctr_reg;
75
88
reg [63 : 0 ] bit_ctr_new;
76
89
reg bit_ctr_rst;
77
- reg bit_ctr_block_inc ;
90
+ reg [ 1 : 0 ] bit_ctr_inc ;
78
91
reg bit_ctr_we;
79
92
80
- reg sha256_final_padding_ctrl_reg;
81
- reg sha256_final_padding_ctrl_new;
82
- reg sha256_final_padding_ctrl_we;
93
+ reg [ 2 : 0 ] sha256_final_padding_ctrl_reg;
94
+ reg [ 2 : 0 ] sha256_final_padding_ctrl_new;
95
+ reg [ 2 : 0 ] sha256_final_padding_ctrl_we;
83
96
84
97
85
98
// ----------------------------------------------------------------
86
99
// Wires.
87
100
// ----------------------------------------------------------------
88
- reg [1 : 0 ] block_out_mux_ctrl;
89
101
reg [511 : 0 ] tmp_block_out;
90
102
reg tmp_next_out;
103
+ reg tmp_ready_out;
91
104
92
105
93
106
// ----------------------------------------------------------------
94
107
// Concurrent connectivity for ports etc.
95
108
// ----------------------------------------------------------------
96
109
assign init_out = init_in;
97
110
assign next_out = tmp_next_out;
111
+ assign ready_out = tmp_ready_out;
98
112
assign block_out = tmp_block_out;
99
113
100
114
@@ -106,14 +120,19 @@ module sha256_final_padding(
106
120
integer i;
107
121
108
122
if (! reset_n) begin
123
+ block_out_reg <= 512'h0 ;
109
124
final_len_reg <= 9'h0 ;
110
125
bit_ctr_reg <= 64'h0 ;
111
126
sha256_final_padding_ctrl_reg <= CTRL_IDLE;
112
127
end
113
128
114
129
else begin
130
+ if (block_out_we) begin
131
+ block_out_reg <= block_out_new;
132
+ end
133
+
115
134
if (final_len_we) begin
116
- final_len_reg < = final_len;
135
+ final_len_reg = final_len;
117
136
end
118
137
119
138
if (bit_ctr_we) begin
@@ -140,10 +159,15 @@ module sha256_final_padding(
140
159
bit_ctr_we = 1'h1 ;
141
160
end
142
161
143
- if (bit_ctr_block_inc ) begin
162
+ if (bit_ctr_inc == BLOCK_INC ) begin
144
163
bit_ctr_new = bit_ctr_reg + 9'h100 ;
145
164
bit_ctr_we = 1'h1 ;
146
165
end
166
+
167
+ if (bit_ctr_inc == FINAL_INC) begin
168
+ bit_ctr_new = bit_ctr_reg + final_len;
169
+ bit_ctr_we = 1'h1 ;
170
+ end
147
171
end
148
172
149
173
@@ -153,14 +177,14 @@ module sha256_final_padding(
153
177
// ----------------------------------------------------------------
154
178
always @*
155
179
begin : sha256_final_padding_ctrl
156
- reg [63 : 0 ] msg_len;
157
-
158
- bit_ctr_rst = 1'h0 ;
159
- bit_ctr_block_inc = 1'h0 ;
180
+ block_out_new = 512'h0 ;
181
+ block_out_we = 1'h0 ;
160
182
final_len_we = 1'h0 ;
161
- tmp_block_out = 512'h0 ;
162
- tmp_next_out = 1'h0 ;
163
- msg_len = 64'h0 ;
183
+ bit_ctr_rst = 1'h0 ;
184
+ bit_ctr_inc = NO_INC;
185
+ tmp_block_out = block_in;
186
+ tmp_next_out = next_in;
187
+ tmp_ready_out = core_ready;
164
188
sha256_final_padding_ctrl_new = CTRL_IDLE;
165
189
sha256_final_padding_ctrl_we = 1'h0 ;
166
190
@@ -171,59 +195,96 @@ module sha256_final_padding(
171
195
end
172
196
173
197
if (next_in) begin
174
- bit_ctr_block_inc = 1'h1 ;
175
- tmp_block_out = block_in;
176
- tmp_next_out = 1'h1 ;
198
+ bit_ctr_inc = BLOCK_INC;
177
199
end
178
200
179
201
if (final_in) begin
180
- msg_len = bit_ctr_reg + final_len;
181
-
182
- if (final_len < 448 ) begin
183
- // We fit in the final block.
184
- tmp_next_out = 1'h1 ;
185
- tmp_block_out = block_in;
186
- tmp_block_out[(511 - final_len)] = 1'h1 ;
187
- tmp_block_out[63 : 0 ] = msg_len;
188
- end
202
+ tmp_next_out = 1'h0 ;
203
+ tmp_ready_out = 1'h0 ;
204
+ final_len_we = 1'h1 ;
205
+ block_out_new = block_in;
206
+ block_out_we = 1'h1 ;
207
+ bit_ctr_inc = FINAL_INC;
208
+ sha256_final_padding_ctrl_new = CTRL_FINAL;
209
+ sha256_final_padding_ctrl_we = 1'h1 ;
210
+ end
211
+ end
189
212
190
- else if (final_len < 512 ) begin
191
- // We fit the one, but not the counter.
192
- // We will need another block.
193
- final_len_we = 1'h1 ;
194
- tmp_next_out = 1'h1 ;
195
- tmp_block_out = block_in;
196
- tmp_block_out[(511 - final_len)] = 1'h1 ;
197
- sha256_final_padding_ctrl_new = CTRL_FINAL;
198
- sha256_final_padding_ctrl_we = 1'h1 ;
199
- end
213
+ CTRL_FINAL: begin
214
+ tmp_next_out = 1'h0 ;
215
+ tmp_ready_out = 1'h0 ;
200
216
201
- else begin
202
- // The whole block is filled.
203
- // We will need another block.
204
- final_len_we = 1'h1 ;
205
- tmp_next_out = 1'h1 ;
206
- tmp_block_out = block_in;
207
- sha256_final_padding_ctrl_new = CTRL_FINAL;
208
- sha256_final_padding_ctrl_we = 1'h1 ;
209
- end
217
+ if (final_len_reg < 448 ) begin
218
+ block_out_new = block_in;
219
+ block_out_new[(511 - final_len_reg)] = 1'h1 ;
220
+ block_out_new[63 : 0 ] = bit_ctr_reg;
221
+ block_out_we = 1'h1 ;
222
+
223
+ sha256_final_padding_ctrl_new = CTRL_NEXT2;
224
+ sha256_final_padding_ctrl_we = 1'h1 ;
210
225
end
211
- end
212
226
227
+ else if ((final_len >= 448 ) && (final_len < 511 )) begin
228
+ block_out_new = block_in;
229
+ block_out_new[(511 - final_len_reg)] = 1'h1 ;
230
+ block_out_we = 1'h1 ;
213
231
214
- CTRL_FINAL: begin
215
- msg_len = bit_ctr_reg + final_len_reg;
216
- sha256_final_padding_ctrl_new = CTRL_IDLE;
232
+ sha256_final_padding_ctrl_new = CTRL_NEXT1;
233
+ sha256_final_padding_ctrl_we = 1'h1 ;
234
+ end
235
+
236
+ else begin
237
+ block_out_new = block_in;
238
+ block_out_we = 1'h1 ;
239
+
240
+ sha256_final_padding_ctrl_new = CTRL_NEXT1;
241
+ sha256_final_padding_ctrl_we = 1'h1 ;
242
+ end
243
+ end
244
+
245
+ CTRL_NEXT1: begin
246
+ tmp_next_out = 1'h1 ;
247
+ tmp_ready_out = 1'h0 ;
248
+ tmp_block_out = block_out_reg;
249
+ sha256_final_padding_ctrl_new = CTRL_READY1;
217
250
sha256_final_padding_ctrl_we = 1'h1 ;
251
+ end
252
+
253
+
254
+ CTRL_READY1: begin
255
+ tmp_next_out = 1'h0 ;
256
+ tmp_ready_out = 1'h0 ;
218
257
219
258
if (core_ready) begin
259
+ block_out_new[63 : 0 ] = bit_ctr_reg;;
260
+ block_out_we = 1'h1 ;
261
+
220
262
if (final_len_reg < 512 ) begin
221
- tmp_block_out[63 : 0 ] = msg_len;
222
- end
223
- else begin
224
- tmp_block_out[511 ] = 1'h1 ;
225
- tmp_block_out[63 : 0 ] = msg_len;
263
+ block_out_new[511 ] = 1'h1 ;
226
264
end
265
+
266
+ sha256_final_padding_ctrl_new = CTRL_NEXT2;
267
+ sha256_final_padding_ctrl_we = 1'h1 ;
268
+ end
269
+ end
270
+
271
+
272
+ CTRL_NEXT2: begin
273
+ tmp_next_out = 1'h1 ;
274
+ tmp_ready_out = 1'h0 ;
275
+ tmp_block_out = block_out_reg;
276
+ sha256_final_padding_ctrl_new = CTRL_READY2;
277
+ sha256_final_padding_ctrl_we = 1'h1 ;
278
+ end
279
+
280
+
281
+ CTRL_READY2: begin
282
+ tmp_next_out = 1'h0 ;
283
+ tmp_ready_out = 1'h0 ;
284
+
285
+ if (core_ready) begin
286
+ sha256_final_padding_ctrl_new = CTRL_IDLE;
287
+ sha256_final_padding_ctrl_we = 1'h1 ;
227
288
end
228
289
end
229
290
0 commit comments