| |
| // test taken from systemcaes from iwls2005 |
| |
| module subbytes_00(clk, reset, start_i, decrypt_i, data_i, ready_o, data_o, sbox_data_o, sbox_data_i, sbox_decrypt_o); |
| |
| input clk; |
| input reset; |
| input start_i; |
| input decrypt_i; |
| input [31:0] data_i; |
| output ready_o; |
| output [31:0] data_o; |
| output [7:0] sbox_data_o; |
| input [7:0] sbox_data_i; |
| output sbox_decrypt_o; |
| |
| reg ready_o; |
| reg [31:0] data_o; |
| reg [7:0] sbox_data_o; |
| reg sbox_decrypt_o; |
| |
| reg [1:0] state; |
| reg [1:0] next_state; |
| reg [31:0] data_reg; |
| reg [31:0] next_data_reg; |
| reg next_ready_o; |
| |
| always @(posedge clk or negedge reset) |
| begin |
| if (!reset) begin |
| data_reg = 0; |
| state = 0; |
| ready_o = 0; |
| end else begin |
| data_reg = next_data_reg; |
| state = next_state; |
| ready_o = next_ready_o; |
| end |
| end |
| |
| reg [31:0] data_i_var, data_reg_128; |
| reg [7:0] data_array [3:0]; |
| reg [7:0] data_reg_var [3:0]; |
| |
| always @(decrypt_i or start_i or state or data_i or sbox_data_i or data_reg) |
| begin |
| data_i_var = data_i; |
| |
| data_array[0] = data_i_var[ 31: 24]; |
| data_array[1] = data_i_var[ 23: 16]; |
| data_array[2] = data_i_var[ 15: 8]; |
| data_array[3] = data_i_var[ 7: 0]; |
| |
| data_reg_var[0] = data_reg[ 31: 24]; |
| data_reg_var[1] = data_reg[ 23: 16]; |
| data_reg_var[2] = data_reg[ 15: 8]; |
| data_reg_var[3] = data_reg[ 7: 0]; |
| |
| sbox_decrypt_o = decrypt_i; |
| sbox_data_o = data_array[state]; |
| next_state = state; |
| next_data_reg = data_reg; |
| |
| next_ready_o = 0; |
| data_o = data_reg; |
| |
| if (state) begin |
| if (start_i) begin |
| next_state = 1; |
| end |
| end else begin |
| data_reg_var[state] = sbox_data_i; |
| data_reg_128[ 31: 24] = data_reg_var[0]; |
| data_reg_128[ 23: 16] = data_reg_var[1]; |
| data_reg_128[ 15: 8] = data_reg_var[2]; |
| data_reg_128[ 7: 0] = data_reg_var[3]; |
| next_data_reg = data_reg_128; |
| next_state = state + 1; |
| end |
| end |
| |
| endmodule |