Chargement…
Chargement…
Le cœur SHA-256 calcule le hash d'un unique bloc de 512 bits présenté en parallèle sur 16 mots de 32 bits (i_msg0 à i_msg15). Le calcul démarre sur un pulse i_gen_hash='1'. Après ~68 cycles d'horloge, o_ready passe à '1' et o_hash (256 bits) contient le résultat.
L'architecture suit la spécification FIPS 180-4 :
a..h (32 bits chacun)c_K stocke les 64 constantes de la spécification| Signal | Direction | Largeur | Description |
|---|---|---|---|
i_clk | Entrée | 1 bit | Horloge |
i_rst | Entrée | 1 bit | Reset asynchrone actif haut (initialise H0..H7 aux IV FIPS) |
i_gen_hash | Entrée | 1 bit | Déclenche le calcul (pulse >= 1 cycle) |
i_msg0..i_msg15 | Entrée | 16 * 32 bits | Bloc de 512 bits (msg_15 = premiers octets, msg_0 = longueur en bits) |
o_ready | Sortie | 1 bit | '1' lorsque o_hash est valide |
o_hash | Sortie | 256 bits | Hash SHA-256 (H0 en MSB, H7 en LSB) |
Etats : ST_IDLE, ST_INIT, ST_RUN, ST_M1..ST_M15, ST_WS.
i_gen_hash. Au depart, pulse gen_hash_p (envoye dans le pipeline de delais) et reset du compteur cnt.msg_comp (w_rst_cmp='1'), demarrage du compteur.w_m = i_msg15, i_msg14, ..., i_msg0 vers l'entrée i_w de msg_comp. A ST_M15, on active w_rst_sch='1' pour figer le schedule.w_m prend la valeur w_j produite par le schedule. On sort de cet etat quand r_delay(66)='1'.Compteur : r_cnt s'incremente tant que w_start='1', ce qui selectionne la constante c_K(cnt) (lue en synchrone -> K_i decale d'un cycle, pipeline coherent avec msg_comp).
Un pipeline de 67 bascules (r_delay(0..66)) propage le pulse gen_hash_p. Sa profondeur est calibree sur la latence combinee du schedule et de la compression.
r_delay(65)='1' : signal final d'addition. Le processus P_FINAL additionne alors a..h aux variables v_h0..v_h7, qui contiennent les IV FIPS initialises par i_rst : - H0 = 6a09e667, H1 = bb67ae85, H2 = 3c6ef372, H3 = a54ff53a
- H4 = 510e527f, H5 = 9b05688c, H6 = 1f83d9ab, H7 = 5be0cd19
r_delay(66) sert a la fois a signaler la fin (o_ready) et a ramener la FSM a ST_IDLE.Le testbench applique la chaine ASCII "test" (4 octets) avec son padding FIPS 180-4 :
msg_15 = 0x74657374 (les 4 octets de "test")msg_14 = 0x80000000 (bit de padding et zeros)msg_13..msg_1 = 0msg_0 = 0x00000020 (longueur = 32 bits)Le TB verifie o_ready puis les 8 mots du hash attendu :
9f86d081 884c7d65 9a2feaa0 c55ad015 a3bf4f1b 2b0b822c d15d6c15 b0f00a08.