OpenCores
URL https://opencores.org/ocsvn/aes-128-ecb-encoder/aes-128-ecb-encoder/trunk

Subversion Repositories aes-128-ecb-encoder

[/] [aes-128-ecb-encoder/] [trunk/] [tb/] [tb_fpga.sv] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 vv_gulyaev
/**
2
 * Testbench for simulation of AES-128-ECB encoder in fpga system using Xilinx IP UARTLITE
3
 *
4
 *  Copyright 2020 by Vyacheslav Gulyaev 
5
 *
6
 *  Licensed under GNU General Public License 3.0 or later.
7
 *  Some rights reserved. See COPYING, AUTHORS.
8
 *
9
 * @license GPL-3.0+ 
10
 */
11
 
12
module tb_fpga ();
13
 
14
    `ifndef __UART_DEFINES__
15
        `define CMD_SET_KEY    8'hF0
16
        `define CMD_ENC_DATA   8'hE1
17
        `define CMD_GET_STAT   8'hD2
18
 
19
 
20
        `define RxFIFO_ADDR    4'h0
21
        `define TxFIFO_ADDR    4'h4
22
        `define STAT_REG_ADDR  4'h8
23
        `define CTRL_REG_ADDR  4'hC
24
 
25
        `define STAT_REG_RxFifoValidDataBit        0
26
        `define STAT_REG_RxFifoFullBit             1
27
        `define STAT_REG_TxFifoEmptyBit            2
28
        `define STAT_REG_TxFifoFullBit             3
29
        `define STAT_REG_IntrEnabledBit            4
30
        `define STAT_REG_OverrunErrorBit           5
31
        `define STAT_REG_FrameErrorBit             6
32
        `define STAT_REG_ParityErrorBit            7
33
 
34
        `define CTRL_REG_RstTxFifoBit              0
35
        `define CTRL_REG_RstRxFifoBit              1
36
        `define CTRL_REG_EnableIntrBit             4
37
 
38
        `define AXI_RESP_OKAY                      2'b00
39
        `define AXI_RESP_EXOKAY                    2'b01
40
        `define AXI_RESP_SLVERR                    2'b10
41
        `define AXI_RESP_DECERR                    2'b11
42
    `endif
43
 
44
    logic clk = 1'b0;
45
    logic uart_clk = 1'b0;
46
    logic rst = 1'b1;
47
    logic interrupt;
48
 
49
    logic uart_tx;
50
    logic uart_rx;
51
 
52
    logic [7:0] rddata;
53
    logic [127:0] ciph_data;
54
    logic [7:0] status;
55
 
56
    axi_interface axi_if();
57
 
58
    initial begin
59
        rst = 1'b1;
60
        init_axi_if();
61
        #(1us) rst = 1'b0;
62
        repeat (1000) @(posedge uart_clk);
63
        axi_wr(`CTRL_REG_ADDR, (1'b1 << `CTRL_REG_EnableIntrBit) |
64
                               (1'b1 << `CTRL_REG_RstRxFifoBit)  |
65
                               (1'b1 << `CTRL_REG_RstTxFifoBit)
66
              );
67
 
68
        set_key(128'h00112233445566778899aabbccddeeff);
69
        set_plain_text(128'h000102030405060708090a0b0c0d0e0f);
70
        get_received_data(ciph_data);
71
        get_status(status);
72
        #(50us);
73
        $stop;
74
    end
75
 
76
    always #(2500ps) clk = ~clk;
77
 
78
    always #(5000ps) uart_clk = ~uart_clk;
79
 
80
 
81
    `ifdef SDF_PATH
82
        initial begin
83
            $sdf_annotate
84
                (
85
 
86
                    /*       "sdf_file" */ `SDF_PATH,
87
                    /*[module_instance] */ dut,
88
                    /*  ["config_file"] */ ,
89
                    /*     ["log_file"] */ "anno.log",
90
                    /*     ["mtm_spec"] */ ,// MINIMUM/MAXIMUM
91
                    /*["scale_factors"] */ ,
92
                    /*   ["scale_type"] */
93
                );
94
        end
95
    `endif
96
 
97
    aes128_ecb_fpga_wrap dut(
98
                                .CLK_IN_P    ( clk  ),
99
                                .CLK_IN_N    ( ~clk ),
100
                                .rst_i       ( rst  ),
101
 
102
                                .uart_tx     ( uart_rx ),
103
                                .uart_rx     ( uart_tx )
104
                            );
105
 
106
    axi_uartlite_module_sim uartlite (
107
            .s_axi_aclk       ( uart_clk        ),  // input wire s_axi_aclk
108
            .s_axi_aresetn    ( ~rst            ),  // input wire s_axi_aresetn
109
            .interrupt        ( interrupt       ),  // output wire interrupt
110
 
111
            .s_axi_awaddr     ( axi_if.master.awaddr  ),  // input wire [3 : 0] s_axi_awaddr
112
            .s_axi_awvalid    ( axi_if.master.awvalid ),  // input wire s_axi_awvalid
113
            .s_axi_awready    ( axi_if.master.awready ),  // output wire s_axi_awready
114
 
115
            .s_axi_wdata      ( axi_if.master.wdata   ),  // input wire [31 : 0] s_axi_wdata
116
            .s_axi_wstrb      ( axi_if.master.wstrb   ),  // input wire [3 : 0] s_axi_wstrb
117
            .s_axi_wvalid     ( axi_if.master.wvalid  ),  // input wire s_axi_wvalid
118
            .s_axi_wready     ( axi_if.master.wready  ),  // output wire s_axi_wready
119
 
120
            .s_axi_bresp      ( axi_if.master.bresp   ),  // output wire [1 : 0] s_axi_bresp
121
            .s_axi_bvalid     ( axi_if.master.bvalid  ),  // output wire s_axi_bvalid
122
            .s_axi_bready     ( axi_if.master.bready  ),  // input wire s_axi_bready
123
 
124
            .s_axi_araddr     ( axi_if.master.araddr  ),  // input wire [3 : 0] s_axi_araddr
125
            .s_axi_arvalid    ( axi_if.master.arvalid ),  // input wire s_axi_arvalid
126
            .s_axi_arready    ( axi_if.master.arready ),  // output wire s_axi_arready
127
 
128
            .s_axi_rdata      ( axi_if.master.rdata   ),  // output wire [31 : 0] s_axi_rdata
129
            .s_axi_rresp      ( axi_if.master.rresp   ),  // output wire [1 : 0] s_axi_rresp
130
            .s_axi_rvalid     ( axi_if.master.rvalid  ),  // output wire s_axi_rvalid
131
            .s_axi_rready     ( axi_if.master.rready  ),  // input wire s_axi_rready
132
 
133
            .rx               ( uart_rx        ),  // input wire rx
134
            .tx               ( uart_tx        )   // output wire tx
135
        );
136
 
137
 
138
    task init_axi_if();
139
        axi_if.awaddr = 4'h0;
140
        axi_if.awvalid = 1'b0;
141
        axi_if.wdata = 32'h0;
142
        axi_if.wstrb = 4'h0;
143
        axi_if.wvalid = 1'b0;
144
        axi_if.bready = 1'b0;
145
        axi_if.araddr = 4'h0;
146
        axi_if.arvalid = 1'b0;
147
        axi_if.rready = 1'b0;
148
    endtask
149
 
150
    task set_key(input logic[127:0] key);
151
        axi_wr(`TxFIFO_ADDR, `CMD_SET_KEY);
152
        wait_tx_fifo_empty();
153
        for (int i=0; i<16; i++) begin
154
            axi_wr(`TxFIFO_ADDR, key[127:120]);
155
            key[127:0] = {key[120:0], 8'h00};
156
        end
157
        wait_tx_fifo_empty();
158
    endtask
159
 
160
    task set_plain_text(input logic[127:0] plain_text_data);
161
        axi_wr(`TxFIFO_ADDR, `CMD_ENC_DATA);
162
        wait_tx_fifo_empty();
163
        for (int i=0; i<16; i++) begin
164
            axi_wr(`TxFIFO_ADDR, plain_text_data[127:120]);
165
            plain_text_data[127:0] = {plain_text_data[120:0], 8'h00};
166
        end
167
        wait_tx_fifo_empty();
168
    endtask
169
 
170
    task get_received_data(output logic[127:0] cipher_data);
171
        logic [7:0] buff;
172
        wait_rx_fifo_full();
173
        cipher_data = 128'h0;
174
        for (int i=0; i<16; i++) begin
175
            axi_rd(`RxFIFO_ADDR, buff);
176
            cipher_data[127:0] = {cipher_data[120:0], buff};
177
        end
178
    endtask
179
 
180
    task get_status(output logic [7:0] status);
181
        axi_wr(`TxFIFO_ADDR, `CMD_GET_STAT);
182
        wait_rx_fifo_not_empty();
183
        axi_rd(`RxFIFO_ADDR, status);
184
    endtask
185
 
186
    task wait_tx_fifo_empty();
187
        axi_rd(`STAT_REG_ADDR, rddata);
188
        while (~rddata[`STAT_REG_TxFifoEmptyBit]) begin
189
            wait(interrupt);
190
            axi_rd(`STAT_REG_ADDR, rddata);
191
        end
192
    endtask
193
 
194
    task wait_rx_fifo_full();
195
        axi_rd(`STAT_REG_ADDR, rddata);
196
        while (~rddata[`STAT_REG_RxFifoFullBit]) begin
197
            //wait(interrupt);
198
            #200us;
199
            axi_rd(`STAT_REG_ADDR, rddata);
200
        end
201
    endtask
202
 
203
    task wait_rx_fifo_not_empty();
204
        axi_rd(`STAT_REG_ADDR, rddata);
205
        while (~rddata[`STAT_REG_RxFifoValidDataBit]) begin
206
            wait(interrupt);
207
            axi_rd(`STAT_REG_ADDR, rddata);
208
        end
209
    endtask
210
 
211
    task wait_rx_fifo_empty();
212
        axi_rd(`STAT_REG_ADDR, rddata);
213
        while (rddata[`STAT_REG_RxFifoValidDataBit]) begin
214
            axi_rd(`RxFIFO_ADDR, rddata);
215
            axi_rd(`STAT_REG_ADDR, rddata);
216
        end
217
    endtask
218
 
219
    task axi_wr(input logic [3:0] addr, input logic [7:0] data);
220
        @(posedge uart_clk);#(1ns);
221
        axi_if.awaddr = addr;
222
        axi_if.awvalid = 1'b1;
223
        axi_if.wdata = {24'h0, data};
224
        axi_if.wstrb = 4'hF;
225
        axi_if.wvalid = 1'b1;
226
        axi_if.bready = 1'b1;
227
        wait (axi_if.awready & axi_if.wready);
228
        @(posedge uart_clk); #(1ns);
229
        axi_if.awaddr = 4'h0;
230
        axi_if.awvalid = 1'b0;
231
        axi_if.wdata = 8'h0;
232
        axi_if.wstrb = 4'h0;
233
        axi_if.wvalid = 1'b0;
234
        wait (axi_if.master.bvalid && (axi_if.bresp==`AXI_RESP_OKAY));
235
        @(posedge uart_clk);#(1ns);
236
        axi_if.bready = 1'b0;
237
    endtask
238
 
239
    task axi_rd(input logic [3:0] addr, output logic [7:0] data);
240
        @(posedge uart_clk);#(1ns);
241
        axi_if.araddr = addr;
242
        axi_if.arvalid = 1'b1;
243
        axi_if.rready = 1'b1;
244
        wait (axi_if.arready);
245
        @(posedge uart_clk);#(1ns);
246
        axi_if.araddr = 4'h0;
247
        axi_if.arvalid = 1'b0;
248
        wait (axi_if.master.rvalid && (axi_if.rresp==`AXI_RESP_OKAY));
249
        @(posedge uart_clk);#(1ns);
250
        data = axi_if.rdata[7:0];
251
        axi_if.rready = 1'b0;
252
    endtask
253
 
254
endmodule

powered by: WebSVN 2.1.0

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