OpenCores
URL https://opencores.org/ocsvn/hight/hight/trunk

Subversion Repositories hight

[/] [hight/] [trunk/] [rtl/] [SKG.v] - Rev 2

Compare with Previous | Blame | View Log

//////////////////////////////////////////////////////////////////////
////                                                              ////
////  Subkey generator of key scheduler for HIGHT Crypto Core     ////
////                                                              ////
////  This file is part of the HIGHT Crypto Core project          ////
////  http://github.com/OpenSoCPlus/hight_crypto_core             ////
////  http://www.opencores.org/project,hight                      ////
////                                                              ////
////  Description                                                 ////
////  __description__                                             ////
////                                                              ////
////  Author(s):                                                  ////
////      - JoonSoo Ha, json.ha@gmail.com                         ////
////      - Younjoo Kim, younjookim.kr@gmail.com                  ////
////                                                              ////
//////////////////////////////////////////////////////////////////////
////                                                              ////
//// Copyright (C) 2015 Authors, OpenSoCPlus and OPENCORES.ORG    ////
////                                                              ////
//// This source file may be used and distributed without         ////
//// restriction provided that this copyright statement is not    ////
//// removed from the file and that any derivative work contains  ////
//// the original copyright notice and the associated disclaimer. ////
////                                                              ////
//// This source file is free software; you can redistribute it   ////
//// and/or modify it under the terms of the GNU Lesser General   ////
//// Public License as published by the Free Software Foundation; ////
//// either version 2.1 of the License, or (at your option) any   ////
//// later version.                                               ////
////                                                              ////
//// This source is distributed in the hope that it will be       ////
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
//// PURPOSE.  See the GNU Lesser General Public License for more ////
//// details.                                                     ////
////                                                              ////
//// You should have received a copy of the GNU Lesser General    ////
//// Public License along with this source; if not, download it   ////
//// from http://www.opencores.org/lgpl.shtml                     ////
////                                                              ////
//////////////////////////////////////////////////////////////////////
 
module SKG(
	i_op       ,
	i_rnd_idx  ,
	i_mk       , 
 
	o_sk3x     ,  
	o_sk2x     ,  
	o_sk1x     ,  
	o_sk0x         
);
 
 
//=====================================
//
//          PARAMETERS 
//
//=====================================
 
 
//=====================================
//
//          I/O PORTS 
//
//=====================================
input        i_op       ;
input[4:0]   i_rnd_idx  ;
input[127:0] i_mk       ; 
 
output[7:0]  o_sk3x     ;  
output[7:0]  o_sk2x     ;  
output[7:0]  o_sk1x     ;  
output[7:0]  o_sk0x     ;    
 
 
//=====================================
//
//          REGISTERS
//
//=====================================
 
 
//=====================================
//
//          WIRES
//
//=====================================
// w_mk15 ~ w_mk0
wire[7:0]   w_mk15 = i_mk[127:120]; 
wire[7:0]   w_mk14 = i_mk[119:112];
wire[7:0]   w_mk13 = i_mk[111:104];
wire[7:0]   w_mk12 = i_mk[103: 96];
wire[7:0]   w_mk11 = i_mk[ 95: 88];
wire[7:0]   w_mk10 = i_mk[ 87: 80];
wire[7:0]   w_mk9  = i_mk[ 79: 72];
wire[7:0]   w_mk8  = i_mk[ 71: 64];
wire[7:0]   w_mk7  = i_mk[ 63: 56];
wire[7:0]   w_mk6  = i_mk[ 55: 48];
wire[7:0]   w_mk5  = i_mk[ 47: 40];
wire[7:0]   w_mk4  = i_mk[ 39: 32];
wire[7:0]   w_mk3  = i_mk[ 31: 24];
wire[7:0]   w_mk2  = i_mk[ 23: 16];
wire[7:0]   w_mk1  = i_mk[ 15:  8];
wire[7:0]   w_mk0  = i_mk[  7:  0];
 
// w_base
wire[4:0]   w_base;
 
// w_d3x ~ w_d0x
reg[6:0]    w_d3x;
reg[6:0]    w_d2x;
reg[6:0]    w_d1x;
reg[6:0]    w_d0x;
 
// w_mk3x ~ w_mk0x
reg[7:0]    w_mk3x;
reg[7:0]    w_mk2x;
reg[7:0]    w_mk1x;
reg[7:0]    w_mk0x;
 
// w_sk3x_tmp ~ w_sk0x_tmp
wire[7:0]   w_sk3x_tmp;
wire[7:0]   w_sk2x_tmp;
wire[7:0]   w_sk1x_tmp;
wire[7:0]   w_sk0x_tmp;
 
 
//=====================================
//
//          MAIN
//
//=====================================
// w_base
assign      w_base = (~i_op) ? i_rnd_idx         :
                               5'd31 - i_rnd_idx ;
 
// w_d3x
always @(w_base)
	case(w_base)
	5'd00 : w_d3x <= 7'h1b; // idx : 3
	5'd01 : w_d3x <= 7'h41; // idx : 7
	5'd02 : w_d3x <= 7'h4c; // idx : 11
	5'd03 : w_d3x <= 7'h2c; // idx : 15
	5'd04 : w_d3x <= 7'h4a; // idx : 19
	5'd05 : w_d3x <= 7'h1c; // idx : 23
	5'd06 : w_d3x <= 7'h79; // idx : 27
	5'd07 : w_d3x <= 7'h37; // idx : 31
	5'd08 : w_d3x <= 7'h0b; // idx : 35
	5'd09 : w_d3x <= 7'h50; // idx : 39
	5'd10 : w_d3x <= 7'h55; // idx : 43
	5'd11 : w_d3x <= 7'h7d; // idx : 47
	5'd12 : w_d3x <= 7'h17; // idx : 51
	5'd13 : w_d3x <= 7'h29; // idx : 55
	5'd14 : w_d3x <= 7'h62; // idx : 59
	5'd15 : w_d3x <= 7'h76; // idx : 63
	5'd16 : w_d3x <= 7'h47; // idx : 67
	5'd17 : w_d3x <= 7'h7c; // idx : 71
	5'd18 : w_d3x <= 7'h1f; // idx : 75
	5'd19 : w_d3x <= 7'h61; // idx : 79
	5'd20 : w_d3x <= 7'h6e; // idx : 83
	5'd21 : w_d3x <= 7'h1e; // idx : 87
	5'd22 : w_d3x <= 7'h69; // idx : 91
	5'd23 : w_d3x <= 7'h26; // idx : 95
	5'd24 : w_d3x <= 7'h12; // idx : 99
	5'd25 : w_d3x <= 7'h01; // idx : 103
	5'd26 : w_d3x <= 7'h08; // idx : 107
	5'd27 : w_d3x <= 7'h48; // idx : 111
	5'd28 : w_d3x <= 7'h0c; // idx : 115
	5'd29 : w_d3x <= 7'h68; // idx : 119
	5'd30 : w_d3x <= 7'h2e; // idx : 123
	5'd31 : w_d3x <= 7'h5a; // idx : 127
	endcase	
 
// w_d2x
always @(w_base)
	case(w_base)
	5'd00 : w_d2x <= 7'h36; // idx : 2 
	5'd01 : w_d2x <= 7'h03; // idx : 6
	5'd02 : w_d2x <= 7'h18; // idx : 10
	5'd03 : w_d2x <= 7'h59; // idx : 14
	5'd04 : w_d2x <= 7'h15; // idx : 18
	5'd05 : w_d2x <= 7'h39; // idx : 22
	5'd06 : w_d2x <= 7'h73; // idx : 26
	5'd07 : w_d2x <= 7'h6f; // idx : 30
	5'd08 : w_d2x <= 7'h16; // idx : 34
	5'd09 : w_d2x <= 7'h21; // idx : 38
	5'd10 : w_d2x <= 7'h2a; // idx : 42
	5'd11 : w_d2x <= 7'h7a; // idx : 46
	5'd12 : w_d2x <= 7'h2f; // idx : 50
	5'd13 : w_d2x <= 7'h52; // idx : 54
	5'd14 : w_d2x <= 7'h45; // idx : 58
	5'd15 : w_d2x <= 7'h6c; // idx : 62
	5'd16 : w_d2x <= 7'h0e; // idx : 66
	5'd17 : w_d2x <= 7'h78; // idx : 70
	5'd18 : w_d2x <= 7'h3f; // idx : 74
	5'd19 : w_d2x <= 7'h43; // idx : 78
	5'd20 : w_d2x <= 7'h5c; // idx : 82
	5'd21 : w_d2x <= 7'h3d; // idx : 86
	5'd22 : w_d2x <= 7'h53; // idx : 90
	5'd23 : w_d2x <= 7'h4d; // idx : 94
	5'd24 : w_d2x <= 7'h24; // idx : 98
	5'd25 : w_d2x <= 7'h02; // idx : 102
	5'd26 : w_d2x <= 7'h10; // idx : 106
	5'd27 : w_d2x <= 7'h11; // idx : 110
	5'd28 : w_d2x <= 7'h19; // idx : 114
	5'd29 : w_d2x <= 7'h51; // idx : 118
	5'd30 : w_d2x <= 7'h5d; // idx : 122
	5'd31 : w_d2x <= 7'h35; // idx : 126
	endcase	
 
// w_d1x
always @(w_base)
	case(w_base)
	5'd00 : w_d1x <= 7'h6d; // idx : 1
	5'd01 : w_d1x <= 7'h06; // idx : 5
	5'd02 : w_d1x <= 7'h30; // idx : 9
	5'd03 : w_d1x <= 7'h33; // idx : 13
	5'd04 : w_d1x <= 7'h2b; // idx : 17
	5'd05 : w_d1x <= 7'h72; // idx : 21
	5'd06 : w_d1x <= 7'h67; // idx : 25
	5'd07 : w_d1x <= 7'h5e; // idx : 29
	5'd08 : w_d1x <= 7'h2d; // idx : 33
	5'd09 : w_d1x <= 7'h42; // idx : 37
	5'd10 : w_d1x <= 7'h54; // idx : 41
	5'd11 : w_d1x <= 7'h75; // idx : 45
	5'd12 : w_d1x <= 7'h5f; // idx : 49
	5'd13 : w_d1x <= 7'h25; // idx : 53
	5'd14 : w_d1x <= 7'h0a; // idx : 57
	5'd15 : w_d1x <= 7'h58; // idx : 61
	5'd16 : w_d1x <= 7'h1d; // idx : 65
	5'd17 : w_d1x <= 7'h71; // idx : 69
	5'd18 : w_d1x <= 7'h7f; // idx : 73
	5'd19 : w_d1x <= 7'h07; // idx : 77
	5'd20 : w_d1x <= 7'h38; // idx : 81
	5'd21 : w_d1x <= 7'h7b; // idx : 85
	5'd22 : w_d1x <= 7'h27; // idx : 89
	5'd23 : w_d1x <= 7'h1a; // idx : 93
	5'd24 : w_d1x <= 7'h49; // idx : 97
	5'd25 : w_d1x <= 7'h04; // idx : 101
	5'd26 : w_d1x <= 7'h20; // idx : 105
	5'd27 : w_d1x <= 7'h22; // idx : 109
	5'd28 : w_d1x <= 7'h32; // idx : 113
	5'd29 : w_d1x <= 7'h23; // idx : 117
	5'd30 : w_d1x <= 7'h3a; // idx : 121
	5'd31 : w_d1x <= 7'h6b; // idx : 125
	endcase	
 
// w_d0x
always @(w_base)
	case(w_base)
	5'd00 : w_d0x <= 7'h5a; // idx : 0
	5'd01 : w_d0x <= 7'h0d; // idx : 4 
	5'd02 : w_d0x <= 7'h60; // idx : 8
	5'd03 : w_d0x <= 7'h66; // idx : 12 
	5'd04 : w_d0x <= 7'h56; // idx : 16
	5'd05 : w_d0x <= 7'h65; // idx : 20
	5'd06 : w_d0x <= 7'h4e; // idx : 24
	5'd07 : w_d0x <= 7'h3c; // idx : 28
	5'd08 : w_d0x <= 7'h5b; // idx : 32
	5'd09 : w_d0x <= 7'h05; // idx : 36
	5'd10 : w_d0x <= 7'h28; // idx : 40
	5'd11 : w_d0x <= 7'h6a; // idx : 44
	5'd12 : w_d0x <= 7'h3e; // idx : 48
	5'd13 : w_d0x <= 7'h4b; // idx : 52
	5'd14 : w_d0x <= 7'h14; // idx : 56
	5'd15 : w_d0x <= 7'h31; // idx : 60
	5'd16 : w_d0x <= 7'h3b; // idx : 64
	5'd17 : w_d0x <= 7'h63; // idx : 68
	5'd18 : w_d0x <= 7'h7e; // idx : 72
	5'd19 : w_d0x <= 7'h0f; // idx : 76
	5'd20 : w_d0x <= 7'h70; // idx : 80
	5'd21 : w_d0x <= 7'h77; // idx : 84
	5'd22 : w_d0x <= 7'h4f; // idx : 88
	5'd23 : w_d0x <= 7'h34; // idx : 92
	5'd24 : w_d0x <= 7'h13; // idx : 96
	5'd25 : w_d0x <= 7'h09; // idx : 100
	5'd26 : w_d0x <= 7'h40; // idx : 104
	5'd27 : w_d0x <= 7'h44; // idx : 108
	5'd28 : w_d0x <= 7'h64; // idx : 112
	5'd29 : w_d0x <= 7'h46; // idx : 116
	5'd30 : w_d0x <= 7'h74; // idx : 120
	5'd31 : w_d0x <= 7'h57; // idx : 124
	endcase	
 
// w_mk3x
always @(*)
	case(w_base)
	5'd00 : w_mk3x <= w_mk3 ; // idx : 3
	5'd01 : w_mk3x <= w_mk7 ; // idx : 7    
	5'd02 : w_mk3x <= w_mk11; // idx : 11
	5'd03 : w_mk3x <= w_mk15; // idx : 15
	5'd04 : w_mk3x <= w_mk2 ; // idx : 19
	5'd05 : w_mk3x <= w_mk6 ; // idx : 23
	5'd06 : w_mk3x <= w_mk10; // idx : 27
	5'd07 : w_mk3x <= w_mk14; // idx : 31
	5'd08 : w_mk3x <= w_mk1 ; // idx : 35
	5'd09 : w_mk3x <= w_mk5 ; // idx : 39
	5'd10 : w_mk3x <= w_mk9 ; // idx : 43
	5'd11 : w_mk3x <= w_mk13; // idx : 47
	5'd12 : w_mk3x <= w_mk0 ; // idx : 51
	5'd13 : w_mk3x <= w_mk4 ; // idx : 55
	5'd14 : w_mk3x <= w_mk8 ; // idx : 59
	5'd15 : w_mk3x <= w_mk12; // idx : 63
	5'd16 : w_mk3x <= w_mk7 ; // idx : 67
	5'd17 : w_mk3x <= w_mk3 ; // idx : 71
	5'd18 : w_mk3x <= w_mk15; // idx : 75
	5'd19 : w_mk3x <= w_mk11; // idx : 79
	5'd20 : w_mk3x <= w_mk6 ; // idx : 83
	5'd21 : w_mk3x <= w_mk2 ; // idx : 87
	5'd22 : w_mk3x <= w_mk14; // idx : 91
	5'd23 : w_mk3x <= w_mk10; // idx : 95
	5'd24 : w_mk3x <= w_mk5 ; // idx : 99
	5'd25 : w_mk3x <= w_mk1 ; // idx : 103
	5'd26 : w_mk3x <= w_mk13; // idx : 107
	5'd27 : w_mk3x <= w_mk9 ; // idx : 111
	5'd28 : w_mk3x <= w_mk4 ; // idx : 115
	5'd29 : w_mk3x <= w_mk0 ; // idx : 119
	5'd30 : w_mk3x <= w_mk12; // idx : 123
	5'd31 : w_mk3x <= w_mk8 ; // idx : 127
	endcase	
 
// w_mk2x
always @(*)
	case(w_base)
	5'd00 : w_mk2x <= w_mk2 ; // idx : 2 
	5'd01 : w_mk2x <= w_mk6 ; // idx : 6    
	5'd02 : w_mk2x <= w_mk10; // idx : 10
	5'd03 : w_mk2x <= w_mk14; // idx : 14
	5'd04 : w_mk2x <= w_mk1 ; // idx : 18
	5'd05 : w_mk2x <= w_mk5 ; // idx : 22
	5'd06 : w_mk2x <= w_mk9 ; // idx : 26
	5'd07 : w_mk2x <= w_mk13; // idx : 30
	5'd08 : w_mk2x <= w_mk0 ; // idx : 34
	5'd09 : w_mk2x <= w_mk4 ; // idx : 38
	5'd10 : w_mk2x <= w_mk8 ; // idx : 42
	5'd11 : w_mk2x <= w_mk12; // idx : 46
	5'd12 : w_mk2x <= w_mk7 ; // idx : 50
	5'd13 : w_mk2x <= w_mk3 ; // idx : 54
	5'd14 : w_mk2x <= w_mk15; // idx : 58
	5'd15 : w_mk2x <= w_mk11; // idx : 62
	5'd16 : w_mk2x <= w_mk6 ; // idx : 66
	5'd17 : w_mk2x <= w_mk2 ; // idx : 70
	5'd18 : w_mk2x <= w_mk14; // idx : 74
	5'd19 : w_mk2x <= w_mk10; // idx : 78
	5'd20 : w_mk2x <= w_mk5 ; // idx : 82
	5'd21 : w_mk2x <= w_mk1 ; // idx : 86
	5'd22 : w_mk2x <= w_mk13; // idx : 90
	5'd23 : w_mk2x <= w_mk9 ; // idx : 94
	5'd24 : w_mk2x <= w_mk4 ; // idx : 98
	5'd25 : w_mk2x <= w_mk0 ; // idx : 102
	5'd26 : w_mk2x <= w_mk12; // idx : 106
	5'd27 : w_mk2x <= w_mk8 ; // idx : 110
	5'd28 : w_mk2x <= w_mk3 ; // idx : 114
	5'd29 : w_mk2x <= w_mk7 ; // idx : 118
	5'd30 : w_mk2x <= w_mk11; // idx : 122
	5'd31 : w_mk2x <= w_mk15; // idx : 126
	endcase	
 
// w_mk1x
always @(*)
	case(w_base)
	5'd00 : w_mk1x <= w_mk1 ; // idx : 1
	5'd01 : w_mk1x <= w_mk5 ; // idx : 5    
	5'd02 : w_mk1x <= w_mk9 ; // idx : 9
	5'd03 : w_mk1x <= w_mk13; // idx : 13
	5'd04 : w_mk1x <= w_mk0 ; // idx : 17
	5'd05 : w_mk1x <= w_mk4 ; // idx : 21
	5'd06 : w_mk1x <= w_mk8 ; // idx : 25
	5'd07 : w_mk1x <= w_mk12; // idx : 29
	5'd08 : w_mk1x <= w_mk7 ; // idx : 33
	5'd09 : w_mk1x <= w_mk3 ; // idx : 37
	5'd10 : w_mk1x <= w_mk15; // idx : 41
	5'd11 : w_mk1x <= w_mk11; // idx : 45
	5'd12 : w_mk1x <= w_mk6 ; // idx : 49
	5'd13 : w_mk1x <= w_mk2 ; // idx : 53
	5'd14 : w_mk1x <= w_mk14; // idx : 57
	5'd15 : w_mk1x <= w_mk10; // idx : 61
	5'd16 : w_mk1x <= w_mk5 ; // idx : 65
	5'd17 : w_mk1x <= w_mk1 ; // idx : 69
	5'd18 : w_mk1x <= w_mk13; // idx : 73
	5'd19 : w_mk1x <= w_mk9 ; // idx : 77
	5'd20 : w_mk1x <= w_mk4 ; // idx : 81
	5'd21 : w_mk1x <= w_mk0 ; // idx : 85
	5'd22 : w_mk1x <= w_mk12; // idx : 89
	5'd23 : w_mk1x <= w_mk8 ; // idx : 93
	5'd24 : w_mk1x <= w_mk3 ; // idx : 97
	5'd25 : w_mk1x <= w_mk7 ; // idx : 101
	5'd26 : w_mk1x <= w_mk11; // idx : 105
	5'd27 : w_mk1x <= w_mk15; // idx : 109
	5'd28 : w_mk1x <= w_mk2 ; // idx : 113
	5'd29 : w_mk1x <= w_mk6 ; // idx : 117
	5'd30 : w_mk1x <= w_mk10; // idx : 121
	5'd31 : w_mk1x <= w_mk14; // idx : 125
	endcase	
 
// w_mk0x
always @(*)
	case(w_base)
	5'd00 : w_mk0x <= w_mk0 ; // idx : 0
	5'd01 : w_mk0x <= w_mk4 ; // idx : 4    
	5'd02 : w_mk0x <= w_mk8 ; // idx : 8
	5'd03 : w_mk0x <= w_mk12; // idx : 12 
	5'd04 : w_mk0x <= w_mk7 ; // idx : 16
	5'd05 : w_mk0x <= w_mk3 ; // idx : 20
	5'd06 : w_mk0x <= w_mk15; // idx : 24
	5'd07 : w_mk0x <= w_mk11; // idx : 28
	5'd08 : w_mk0x <= w_mk6 ; // idx : 32
	5'd09 : w_mk0x <= w_mk2 ; // idx : 36
	5'd10 : w_mk0x <= w_mk14; // idx : 40
	5'd11 : w_mk0x <= w_mk10; // idx : 44
	5'd12 : w_mk0x <= w_mk5 ; // idx : 48
	5'd13 : w_mk0x <= w_mk1 ; // idx : 52
	5'd14 : w_mk0x <= w_mk13; // idx : 56
	5'd15 : w_mk0x <= w_mk9 ; // idx : 60
	5'd16 : w_mk0x <= w_mk4 ; // idx : 64
	5'd17 : w_mk0x <= w_mk0 ; // idx : 68
	5'd18 : w_mk0x <= w_mk12; // idx : 72
	5'd19 : w_mk0x <= w_mk8 ; // idx : 76
	5'd20 : w_mk0x <= w_mk3 ; // idx : 80
	5'd21 : w_mk0x <= w_mk7 ; // idx : 84
	5'd22 : w_mk0x <= w_mk11; // idx : 88
	5'd23 : w_mk0x <= w_mk15; // idx : 92
	5'd24 : w_mk0x <= w_mk2 ; // idx : 96
	5'd25 : w_mk0x <= w_mk6 ; // idx : 100
	5'd26 : w_mk0x <= w_mk10; // idx : 104
	5'd27 : w_mk0x <= w_mk14; // idx : 108
	5'd28 : w_mk0x <= w_mk1 ; // idx : 112
	5'd29 : w_mk0x <= w_mk5 ; // idx : 116
	5'd30 : w_mk0x <= w_mk9 ; // idx : 120
	5'd31 : w_mk0x <= w_mk13; // idx : 124
	endcase	
 
// w_sk3x_tmp
assign      w_sk3x_tmp = {1'b0,w_d3x} + w_mk3x;   
 
// w_sk2x_tmp
assign      w_sk2x_tmp = {1'b0,w_d2x} + w_mk2x;   
 
// w_sk1x_tmp
assign      w_sk1x_tmp = {1'b0,w_d1x} + w_mk1x;   
 
// w_sk0x_tmp
assign      w_sk0x_tmp = {1'b0,w_d0x} + w_mk0x;   
 
// o_sk3x
assign      o_sk3x     = (~i_op) ? w_sk3x_tmp : // i_op == 0
                                   w_sk0x_tmp ; // i_op == 1
 
// o_sk2x
assign      o_sk2x     = (~i_op) ? w_sk2x_tmp : // i_op == 0  
                                   w_sk1x_tmp ; // i_op == 1
 
// o_sk1x
assign      o_sk1x     = (~i_op) ? w_sk1x_tmp : // i_op == 0  
                                   w_sk2x_tmp ; // i_op == 1
 
// o_sk0x
assign      o_sk0x     = (~i_op) ? w_sk0x_tmp : // i_op == 0  
                                   w_sk3x_tmp ; // i_op == 1
 
endmodule
 
 
 
 
 
 
 
 
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.