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

Subversion Repositories gost28147

[/] [gost28147/] [trunk/] [sim/] [src/] [gost28147-89_tb.sv] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 doka
// $Id:  $ from Russia with love
2
 
3
/////////////////////////////////////////////////////////////////////
4
//   This file is part of the GOST 28147-89 CryptoCore project     //
5
//                                                                 //
6
//   Copyright (c) 2014 Dmitry Murzinov (kakstattakim@gmail.com)   //
7
/////////////////////////////////////////////////////////////////////
8
 
9
`timescale 1ns / 100ps
10
 
11
module tb ();
12
 
13
// clock generator settings:
14
parameter cycles_reset =  2;  // rst active  (clk)
15
parameter clk_period   = 10;  // clk period ns
16
parameter clk_delay    =  0;  // clk initial delay
17
 
18
reg clk;    // clock
19
reg rst;    // sync reset
20
reg mode;   // 0 - encrypt, 1 - decrypt
21
reg select; // if GOST_R_3411_BOTH defined: 0 - Using the GOST R 34.11-94 TestParameter S-boxes; 1 - Using the CryptoPro S-boxes
22
reg load;   // load plain text and start cipher cycles
23
wire done;  // cipher text ready for output read
24
reg kload;  // load cipher key
25
 
26
reg [255:0] key;   // cipher key   input
27
reg  [63:0] pdata; // plain  text  input
28
wire [63:0] cdata; // cipher text output
29
 
30
reg  [63:0] pdata_d; //  plain text  input
31
wire [63:0] cdata_d; // cipher text output
32
 
33
reg  [63:0] reference_data; // reference data for verify
34
 
35
wire EQUAL = cdata == reference_data;
36
wire [8*4-1:0] STATUS = EQUAL ? "OK" : "FAIL";
37
 
38
// instance connect
39
gost_28147_89
40
  u_cipher  (.clk(clk), .rst(rst), .mode(mode), .select(select), .load(load), .done(done), .kload(kload), .key(key), .pdata(pdata), .cdata(cdata));
41
 
42
 
43
 reg [24:0] clk_counter; // just clock counter for debug
44
 
45
// Clock generation
46
 always begin
47
 # (clk_delay);
48
   forever # (clk_period/2) clk = ~clk;
49
 end
50
 
51
// Initial statement
52
initial begin
53
 #0 clk  = 1'b0;
54
    load = 0;
55
    kload = 0;
56
    mode  = 0;
57
    select = 0;
58
    key = 256'h0;
59
    pdata = 64'h0;
60
    clk_counter = 0;
61
 
62
  // Reset
63
  #0           rst   = 1'bX;
64
  #0           rst   = 1'b0;
65
  # ( 2*clk_period *cycles_reset) rst   = 1'b1;
66
  # ( 2*clk_period *cycles_reset) rst   = 1'b0;
67
 
68
  // key load
69
  @ ( posedge clk ) #1 kload = 1;
70
      key = swapkey(256'hBE5EC200_6CFF9DCF_52354959_F1FF0CBF_E95061B5_A648C103_87069C25_997C0672);
71
  @ ( posedge clk ) #1 kload = 0;
72
 
73
 
74
  //  Crypt mode
75
  @ ( posedge clk ) #1 load = 1;  mode = 0;
76
    pdata          = swapdata(64'h0DF82802_B741A292);
77
    reference_data = swapdata(64'h07F9027D_F7F7DF89);
78
  @ ( posedge clk ) #1 load = 0;
79
 
80
 
81
  //  Decrypt mode
82
  @ ( posedge done );
83
  @ ( posedge clk ) #1 load = 1; mode = 1;
84
    pdata          = swapdata(64'h07F9027D_F7F7DF89);
85
    reference_data = swapdata(64'h0DF82802_B741A292);
86
  @ ( posedge clk ) #1 load = 0;
87
 
88
  //$finish;
89
  @ ( posedge done );
90
  @ ( posedge clk )
91
  #1 $stop;
92
end
93
 
94
always begin
95
 @( posedge clk );
96
    clk_counter <=  clk_counter + 1;
97
end // always
98
 
99
always  @( posedge done )
100
  if (mode == 0)
101
     #1 $display("KEY: %H \nCRYPT   IN: %H \t REFOUT: %H \t OUT: %H   ....%s\n", key, pdata, reference_data, cdata, STATUS);
102
  else if (mode == 1)
103
     #1 $display("KEY: %H \nDECRYPT IN: %H \t REFOUT: %H \t OUT: %H   ....%s\n", key, pdata, reference_data, cdata, STATUS);
104
 
105
 
106
// ======= swap4(x) =======
107
function [31:0] swap4( input [31:0] x );
108
begin
109
  swap4 = {x[7:0],x[15:8],x[23:16],x[31:24]};
110
end
111
endfunction
112
 
113
// ======= swapdate(data) =======
114
function [63:0] swapdata( input [63:0] data );
115
begin
116
  swapdata = {swap4(data[31:0]),swap4(data[63:32])};
117
end
118
endfunction
119
 
120
// ======= swapkey(key) =======
121
function [255:0] swapkey( input [255:0] key );
122
logic [31:0] K [0:7];
123
begin
124
    K[0] = swap4(key[255:224]);
125
    K[1] = swap4(key[223:192]);
126
    K[2] = swap4(key[191:160]);
127
    K[3] = swap4(key[159:128]);
128
    K[4] = swap4(key[127:96]);
129
    K[5] = swap4(key[95:64]);
130
    K[6] = swap4(key[63:32]);
131
    K[7] = swap4(key[31:0]);
132
 swapkey = {K[0],K[1],K[2],K[3],K[4],K[5],K[6],K[7]};
133
end
134
endfunction
135
 
136
endmodule
137
// eof

powered by: WebSVN 2.1.0

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