📄 datapadunit.v
字号:
begin if (hashover) nextstate = digestready; else nextstate = waitmd2; end digestready: begin resultready = 1; nextstate = idle; end lengtherror: begin error = 1; if (en && !wr && (addr == 2) && lenerror) nextstate = idle; else nextstate = lengtherror; end endcase end//receive the key and process the keyalways @(posedge clk) begin if (reset) begin keyreg <= 0; keyreadyreg <= 0; end else if (currentstate == rxkey) begin case (keycnt) 0: keyreg[159:128] <= datatmp; 1: keyreg[127:96] <= datatmp; 2: keyreg[95:64] <= datatmp; 3: keyreg[63:32] <= datatmp; 4: keyreg[31:0] <= datatmp; endcase end else if (currentstate == hmackeyready) keyreadyreg <= 1; else begin keyreg <= keyreg; keyreadyreg <= keyreadyreg; end end//receive the datalength and comput the whole length automaticallyalways @(posedge clk) begin if (reset) begin datalength <= 0; end else if ((currentstate == rxlength) && !padflg) begin datalength[63:9] <= datalength[63:9] + 1; end else if ((currentstate == rxlength) && padflg && !modsel) begin datalength[8:0] <= datalength[8:0] + datatmp[8:0]; end else if ((currentstate == rxlength) && padflg && modsel) begin datalength[8:0] <= datalength[8:0] + datatmp[8:0]; datalength[63:9] <= datalength[63:9] + 1; end else if (digestreadyreg && padflg) datalength <= 0; else begin datalength <= datalength; end end //receive data and pad dataalways @(posedge clk) begin if (reset) begin paddata <= 0; procsel <= 0; end else begin case (currentstate) idle,rxkey: begin paddata <= paddata; procsel <= 0; end sendikey: begin paddata[511:352] <= keyreg ^ {20{ipad}}; paddata[351:0] <= {44{ipad}}; procsel <=1; end waitiv1: paddata <= paddata; sendokey: begin paddata[511:352] <= keyreg ^ {20{opad}}; paddata[351:0] <= {44{opad}}; procsel <=2; end waitiv2: begin procsel <= 2; end hmackeyready,rxlength: paddata <= paddata; rxdata: case (datacnt) 0: paddata[511:480] <= datatmp; 1: paddata[479:448] <= datatmp; 2: paddata[447:416] <= datatmp; 3: paddata[415:384] <= datatmp; 4: paddata[383:352] <= datatmp; 5: paddata[351:320] <= datatmp; 6: paddata[319:288] <= datatmp; 7: paddata[287:256] <= datatmp; 8: paddata[255:224] <= datatmp; 9: paddata[223:192] <= datatmp; 10: paddata[191:160] <= datatmp; 11: paddata[159:128] <= datatmp; 12: paddata[127:096] <= datatmp; 13: paddata[095:064] <= datatmp; 14: paddata[063:032] <= datatmp; 15: paddata[031:000] <= datatmp; endcase datapad: begin case (datalength[8:5]) 0: begin case (datalength[4:3]) 0: paddata[511:480] <= 32'h80000000; 1: paddata[511:480] <= paddata[511:480] + 32'h00800000; 2: paddata[511:480] <= paddata[511:480] + 32'h00008000; 3: paddata[511:480] <= paddata[511:480] + 32'h00000080; endcase paddata[479:0] <= 0; end 1: begin case (datalength[4:3]) 0: paddata[479:448] <= 32'h80000000; 1: paddata[479:448] <= paddata[479:448] + 32'h00800000; 2: paddata[479:448] <= paddata[479:448] + 32'h00008000; 3: paddata[479:448] <= paddata[479:448] + 32'h00000080; endcase paddata[447:0] <= 0; end 2: begin case (datalength[4:3]) 0: paddata[447:416] <= 32'h80000000; 1: paddata[447:416] <= paddata[447:416] + 32'h00800000; 2: paddata[447:416] <= paddata[447:416] + 32'h00008000; 3: paddata[447:416] <= paddata[447:416] + 32'h00000080; endcase paddata[415:0] <= 0; end 3: begin case (datalength[4:3]) 0: paddata[415:384] <= 32'h80000000; 1: paddata[415:384] <= paddata[415:384] + 32'h00800000; 2: paddata[415:384] <= paddata[415:384] + 32'h00008000; 3: paddata[415:384] <= paddata[415:384] + 32'h00000080; endcase paddata[383:0] <= 0; end 4: begin case (datalength[4:3]) 0: paddata[383:352] <= 32'h80000000; 1: paddata[383:352] <= paddata[383:352] + 32'h00800000; 2: paddata[383:352] <= paddata[383:352] + 32'h00008000; 3: paddata[383:352] <= paddata[383:352] + 32'h00000080; endcase paddata[351:0] <= 0; end 5: begin case (datalength[4:3]) 0: paddata[351:320] <= 32'h80000000; 1: paddata[351:320] <= paddata[351:320] + 32'h00800000; 2: paddata[351:320] <= paddata[351:320] + 32'h00008000; 3: paddata[351:320] <= paddata[351:320] + 32'h00000080; endcase paddata[319:0] <= 0; end 6: begin case (datalength[4:3]) 0: paddata[319:288] <= 32'h80000000; 1: paddata[319:288] <= paddata[319:288] + 32'h00800000; 2: paddata[319:288] <= paddata[319:288] + 32'h00008000; 3: paddata[319:288] <= paddata[319:288] + 32'h00000080; endcase paddata[287:0] <= 0; end 7: begin case (datalength[4:3]) 0: paddata[287:256] <= 32'h80000000; 1: paddata[287:256] <= paddata[287:256] + 32'h00800000; 2: paddata[287:256] <= paddata[287:256] + 32'h00008000; 3: paddata[287:256] <= paddata[287:256] + 32'h00000080; endcase paddata[255:0] <= 0; end 8: begin case (datalength[4:3]) 0: paddata[255:224] <= 32'h80000000; 1: paddata[255:224] <= paddata[255:224] + 32'h00800000; 2: paddata[255:224] <= paddata[255:224] + 32'h00008000; 3: paddata[255:224] <= paddata[255:224] + 32'h00000080; endcase paddata[223:0] <= 0; end 9: begin case (datalength[4:3]) 0: paddata[223:192] <= 32'h80000000; 1: paddata[223:192] <= paddata[223:192] + 32'h00800000; 2: paddata[223:192] <= paddata[223:192] + 32'h00008000; 3: paddata[223:192] <= paddata[223:192] + 32'h00000080; endcase paddata[191:0] <= 0; end 10: begin case (datalength[4:3]) 0: paddata[191:160] <= 32'h80000000; 1: paddata[191:160] <= paddata[191:160] + 32'h00800000; 2: paddata[191:160] <= paddata[191:160] + 32'h00008000; 3: paddata[191:160] <= paddata[191:160] + 32'h00000080; endcase paddata[159:0] <= 0; end 11: begin case (datalength[4:3]) 0: paddata[159:128] <= 32'h80000000; 1: paddata[159:128] <= paddata[159:128] + 32'h00800000; 2: paddata[159:128] <= paddata[159:128] + 32'h00008000; 3: paddata[159:128] <= paddata[159:128] + 32'h00000080; endcase paddata[127:0] <= 0; end 12: begin case (datalength[4:3]) 0: paddata[127:096] <= 32'h80000000; 1: paddata[127:096] <= paddata[127:096] + 32'h00800000; 2: paddata[127:096] <= paddata[127:096] + 32'h00008000; 3: paddata[127:096] <= paddata[127:096] + 32'h00000080; endcase paddata[95:0] <= 0; end 13: begin case (datalength[4:3]) 0: paddata[095:064] <= 32'h80000000; 1: paddata[095:064] <= paddata[095:064] + 32'h00800000; 2: paddata[095:064] <= paddata[095:064] + 32'h00008000; 3: paddata[095:064] <= paddata[095:064] + 32'h00000080; endcase paddata[63:0] <= 0; end 14: begin case (datalength[4:3]) 0: paddata[063:032] <= 32'h80000000; 1: paddata[063:032] <= paddata[063:032] + 32'h00800000; 2: paddata[063:032] <= paddata[063:032] + 32'h00008000; 3: paddata[063:032] <= paddata[063:032] + 32'h00000080; endcase paddata[031:000] <= 0; end 15: begin case (datalength[4:3]) 0: paddata[031:000] <= 32'h80000000; 1: paddata[031:000] <= paddata[031:000] + 32'h00800000; 2: paddata[031:000] <= paddata[031:000] + 32'h00008000; 3: paddata[031:000] <= paddata[031:000] + 32'h00000080; endcase end endcase end lengthpad: begin paddata[63:0] <= datalength; end senddata: begin paddata <= paddata; end expad: begin if (datalength[8:3]==0) begin paddata[511] <= 1; paddata[510:64] <= 0; paddata[63:0] <= datalength; end else begin paddata[511:64] <= 0; paddata[63:0] <= datalength; end end sendmd1: begin paddata[511:352] <= md1in; paddata[351] <=1; paddata[350:64] <=0; paddata[63:0] <=32'h000002a0; procsel <= 3; end //receive the digest from hashunit, and send it to the wtprounit //waitmd2://this state may be reduced //digestready://set the digestready flag in status reg //lengtherror://set the lengtherror flag in status reg //hmackeyready://set the hmackeyready flag in status reg waitmd2: begin procsel <= 3; paddata <= paddata; end digestready,lengtherror,hmackeyready: paddata <= paddata; endcase end endendmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -