verilog y config
diff --git a/openlane/aes128/config.tcl b/openlane/aes128/config.tcl new file mode 100755 index 0000000..62a8a0c --- /dev/null +++ b/openlane/aes128/config.tcl
@@ -0,0 +1,55 @@ +# SPDX-FileCopyrightText: 2020 Efabless Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# SPDX-License-Identifier: Apache-2.0 + +set ::env(PDK) $::env(PDK) +set ::env(STD_CELL_LIBRARY) "sky130_fd_sc_hd" + +set script_dir [file dirname [file normalize [info script]]] + +set ::env(DESIGN_NAME) aes128 + +set ::env(VERILOG_FILES) "\ + $::env(CARAVEL_ROOT)/verilog/rtl/defines.v \ + $script_dir/../../verilog/rtl/aes128.v" + +set ::env(DESIGN_IS_CORE) 0 + +set ::env(CLOCK_PORT) "clk" +set ::env(CLOCK_NET) $::env(CLOCK_PORT) +set ::env(CLOCK_PERIOD) "10" + +set ::env(FP_SIZING) absolute +set ::env(DIE_AREA) "0 0 1900 1900" + +set ::env(PL_BASIC_PLACEMENT) 0 +set ::env(PL_TARGET_DENSITY) 0.40 + +# Maximum layer used for routing is metal 4. +# This is because this macro will be inserted in a top level (user_project_wrapper) +# where the PDN is planned on metal 5. So, to avoid having shorts between routes +# in this macro and the top level metal 5 stripes, we have to restrict routes to metal4. +# +set ::env(RT_MAX_LAYER) {met4} + +# You can draw more power domains if you need to +set ::env(VDD_NETS) [list {vccd1}] +set ::env(GND_NETS) [list {vssd1}] + +set ::env(DIODE_INSERTION_STRATEGY) 4 +# If you're going to use multiple power domains, then disable cvc run. +set ::env(RUN_CVC) 1 + +set ::env(GLB_RESIZER_HOLD_MAX_BUFFER_PERCENT) {60} +set ::env(GLB_RESIZER_TIMING_OPTIMIZATIONS) {1}
diff --git a/openlane/user_project_wrapper/config.tcl b/openlane/user_project_wrapper/config.tcl index 2b03104..f5370b0 100755 --- a/openlane/user_project_wrapper/config.tcl +++ b/openlane/user_project_wrapper/config.tcl
@@ -39,14 +39,14 @@ ## Clock configurations set ::env(CLOCK_PORT) "user_clock2" -set ::env(CLOCK_NET) "mprj.clk" +set ::env(CLOCK_NET) "aes128.clk" set ::env(CLOCK_PERIOD) "10" ## Internal Macros ### Macro PDN Connections set ::env(FP_PDN_MACRO_HOOKS) "\ - mprj vccd1 vssd1 vccd1 vssd1" + aes128 vccd1 vssd1 vccd1 vssd1" ### Macro Placement set ::env(MACRO_PLACEMENT_CFG) $script_dir/macro.cfg @@ -54,13 +54,13 @@ ### Black-box verilog and views set ::env(VERILOG_FILES_BLACKBOX) "\ $::env(CARAVEL_ROOT)/verilog/rtl/defines.v \ - $script_dir/../../verilog/rtl/user_proj_example.v" + $script_dir/../../verilog/rtl/aes128.v" set ::env(EXTRA_LEFS) "\ - $script_dir/../../lef/user_proj_example.lef" + $script_dir/../../lef/aes128.lef" set ::env(EXTRA_GDS_FILES) "\ - $script_dir/../../gds/user_proj_example.gds" + $script_dir/../../gds/aes128.gds" # set ::env(GLB_RT_MAXLAYER) 5 set ::env(RT_MAX_LAYER) {met4}
diff --git a/verilog/gl/user_project_wrapper.v b/verilog/gl/user_project_wrapper.v index ecae883..624acbe 100644 --- a/verilog/gl/user_project_wrapper.v +++ b/verilog/gl/user_project_wrapper.v
@@ -54,388 +54,10 @@ input [3:0] wbs_sel_i; - user_proj_example mprj (.vccd1(vccd1), + aes128 aes128 (.clk(wb_clk_i), + .vccd1(vccd1), .vssd1(vssd1), - .wb_clk_i(wb_clk_i), - .wb_rst_i(wb_rst_i), - .wbs_ack_o(wbs_ack_o), - .wbs_cyc_i(wbs_cyc_i), - .wbs_stb_i(wbs_stb_i), - .wbs_we_i(wbs_we_i), - .io_in({io_in[37], - io_in[36], - io_in[35], - io_in[34], - io_in[33], - io_in[32], - io_in[31], - io_in[30], - io_in[29], - io_in[28], - io_in[27], - io_in[26], - io_in[25], - io_in[24], - io_in[23], - io_in[22], - io_in[21], - io_in[20], - io_in[19], - io_in[18], - io_in[17], - io_in[16], - io_in[15], - io_in[14], - io_in[13], - io_in[12], - io_in[11], - io_in[10], - io_in[9], - io_in[8], - io_in[7], - io_in[6], - io_in[5], - io_in[4], - io_in[3], - io_in[2], - io_in[1], - io_in[0]}), - .io_oeb({io_oeb[37], - io_oeb[36], - io_oeb[35], - io_oeb[34], - io_oeb[33], - io_oeb[32], - io_oeb[31], - io_oeb[30], - io_oeb[29], - io_oeb[28], - io_oeb[27], - io_oeb[26], - io_oeb[25], - io_oeb[24], - io_oeb[23], - io_oeb[22], - io_oeb[21], - io_oeb[20], - io_oeb[19], - io_oeb[18], - io_oeb[17], - io_oeb[16], - io_oeb[15], - io_oeb[14], - io_oeb[13], - io_oeb[12], - io_oeb[11], - io_oeb[10], - io_oeb[9], - io_oeb[8], - io_oeb[7], - io_oeb[6], - io_oeb[5], - io_oeb[4], - io_oeb[3], - io_oeb[2], - io_oeb[1], - io_oeb[0]}), - .io_out({io_out[37], - io_out[36], - io_out[35], - io_out[34], - io_out[33], - io_out[32], - io_out[31], - io_out[30], - io_out[29], - io_out[28], - io_out[27], - io_out[26], - io_out[25], - io_out[24], - io_out[23], - io_out[22], - io_out[21], - io_out[20], - io_out[19], - io_out[18], - io_out[17], - io_out[16], - io_out[15], - io_out[14], - io_out[13], - io_out[12], - io_out[11], - io_out[10], - io_out[9], - io_out[8], - io_out[7], - io_out[6], - io_out[5], - io_out[4], - io_out[3], - io_out[2], - io_out[1], - io_out[0]}), - .irq({user_irq[2], - user_irq[1], - user_irq[0]}), - .la_data_in({la_data_in[127], - la_data_in[126], - la_data_in[125], - la_data_in[124], - la_data_in[123], - la_data_in[122], - la_data_in[121], - la_data_in[120], - la_data_in[119], - la_data_in[118], - la_data_in[117], - la_data_in[116], - la_data_in[115], - la_data_in[114], - la_data_in[113], - la_data_in[112], - la_data_in[111], - la_data_in[110], - la_data_in[109], - la_data_in[108], - la_data_in[107], - la_data_in[106], - la_data_in[105], - la_data_in[104], - la_data_in[103], - la_data_in[102], - la_data_in[101], - la_data_in[100], - la_data_in[99], - la_data_in[98], - la_data_in[97], - la_data_in[96], - la_data_in[95], - la_data_in[94], - la_data_in[93], - la_data_in[92], - la_data_in[91], - la_data_in[90], - la_data_in[89], - la_data_in[88], - la_data_in[87], - la_data_in[86], - la_data_in[85], - la_data_in[84], - la_data_in[83], - la_data_in[82], - la_data_in[81], - la_data_in[80], - la_data_in[79], - la_data_in[78], - la_data_in[77], - la_data_in[76], - la_data_in[75], - la_data_in[74], - la_data_in[73], - la_data_in[72], - la_data_in[71], - la_data_in[70], - la_data_in[69], - la_data_in[68], - la_data_in[67], - la_data_in[66], - la_data_in[65], - la_data_in[64], - la_data_in[63], - la_data_in[62], - la_data_in[61], - la_data_in[60], - la_data_in[59], - la_data_in[58], - la_data_in[57], - la_data_in[56], - la_data_in[55], - la_data_in[54], - la_data_in[53], - la_data_in[52], - la_data_in[51], - la_data_in[50], - la_data_in[49], - la_data_in[48], - la_data_in[47], - la_data_in[46], - la_data_in[45], - la_data_in[44], - la_data_in[43], - la_data_in[42], - la_data_in[41], - la_data_in[40], - la_data_in[39], - la_data_in[38], - la_data_in[37], - la_data_in[36], - la_data_in[35], - la_data_in[34], - la_data_in[33], - la_data_in[32], - la_data_in[31], - la_data_in[30], - la_data_in[29], - la_data_in[28], - la_data_in[27], - la_data_in[26], - la_data_in[25], - la_data_in[24], - la_data_in[23], - la_data_in[22], - la_data_in[21], - la_data_in[20], - la_data_in[19], - la_data_in[18], - la_data_in[17], - la_data_in[16], - la_data_in[15], - la_data_in[14], - la_data_in[13], - la_data_in[12], - la_data_in[11], - la_data_in[10], - la_data_in[9], - la_data_in[8], - la_data_in[7], - la_data_in[6], - la_data_in[5], - la_data_in[4], - la_data_in[3], - la_data_in[2], - la_data_in[1], - la_data_in[0]}), - .la_data_out({la_data_out[127], - la_data_out[126], - la_data_out[125], - la_data_out[124], - la_data_out[123], - la_data_out[122], - la_data_out[121], - la_data_out[120], - la_data_out[119], - la_data_out[118], - la_data_out[117], - la_data_out[116], - la_data_out[115], - la_data_out[114], - la_data_out[113], - la_data_out[112], - la_data_out[111], - la_data_out[110], - la_data_out[109], - la_data_out[108], - la_data_out[107], - la_data_out[106], - la_data_out[105], - la_data_out[104], - la_data_out[103], - la_data_out[102], - la_data_out[101], - la_data_out[100], - la_data_out[99], - la_data_out[98], - la_data_out[97], - la_data_out[96], - la_data_out[95], - la_data_out[94], - la_data_out[93], - la_data_out[92], - la_data_out[91], - la_data_out[90], - la_data_out[89], - la_data_out[88], - la_data_out[87], - la_data_out[86], - la_data_out[85], - la_data_out[84], - la_data_out[83], - la_data_out[82], - la_data_out[81], - la_data_out[80], - la_data_out[79], - la_data_out[78], - la_data_out[77], - la_data_out[76], - la_data_out[75], - la_data_out[74], - la_data_out[73], - la_data_out[72], - la_data_out[71], - la_data_out[70], - la_data_out[69], - la_data_out[68], - la_data_out[67], - la_data_out[66], - la_data_out[65], - la_data_out[64], - la_data_out[63], - la_data_out[62], - la_data_out[61], - la_data_out[60], - la_data_out[59], - la_data_out[58], - la_data_out[57], - la_data_out[56], - la_data_out[55], - la_data_out[54], - la_data_out[53], - la_data_out[52], - la_data_out[51], - la_data_out[50], - la_data_out[49], - la_data_out[48], - la_data_out[47], - la_data_out[46], - la_data_out[45], - la_data_out[44], - la_data_out[43], - la_data_out[42], - la_data_out[41], - la_data_out[40], - la_data_out[39], - la_data_out[38], - la_data_out[37], - la_data_out[36], - la_data_out[35], - la_data_out[34], - la_data_out[33], - la_data_out[32], - la_data_out[31], - la_data_out[30], - la_data_out[29], - la_data_out[28], - la_data_out[27], - la_data_out[26], - la_data_out[25], - la_data_out[24], - la_data_out[23], - la_data_out[22], - la_data_out[21], - la_data_out[20], - la_data_out[19], - la_data_out[18], - la_data_out[17], - la_data_out[16], - la_data_out[15], - la_data_out[14], - la_data_out[13], - la_data_out[12], - la_data_out[11], - la_data_out[10], - la_data_out[9], - la_data_out[8], - la_data_out[7], - la_data_out[6], - la_data_out[5], - la_data_out[4], - la_data_out[3], - la_data_out[2], - la_data_out[1], - la_data_out[0]}), - .la_oenb({la_oenb[127], + .key({la_oenb[127], la_oenb[126], la_oenb[125], la_oenb[124], @@ -563,104 +185,260 @@ la_oenb[2], la_oenb[1], la_oenb[0]}), - .wbs_adr_i({wbs_adr_i[31], - wbs_adr_i[30], - wbs_adr_i[29], - wbs_adr_i[28], - wbs_adr_i[27], - wbs_adr_i[26], - wbs_adr_i[25], - wbs_adr_i[24], - wbs_adr_i[23], - wbs_adr_i[22], - wbs_adr_i[21], - wbs_adr_i[20], - wbs_adr_i[19], - wbs_adr_i[18], - wbs_adr_i[17], - wbs_adr_i[16], - wbs_adr_i[15], - wbs_adr_i[14], - wbs_adr_i[13], - wbs_adr_i[12], - wbs_adr_i[11], - wbs_adr_i[10], - wbs_adr_i[9], - wbs_adr_i[8], - wbs_adr_i[7], - wbs_adr_i[6], - wbs_adr_i[5], - wbs_adr_i[4], - wbs_adr_i[3], - wbs_adr_i[2], - wbs_adr_i[1], - wbs_adr_i[0]}), - .wbs_dat_i({wbs_dat_i[31], - wbs_dat_i[30], - wbs_dat_i[29], - wbs_dat_i[28], - wbs_dat_i[27], - wbs_dat_i[26], - wbs_dat_i[25], - wbs_dat_i[24], - wbs_dat_i[23], - wbs_dat_i[22], - wbs_dat_i[21], - wbs_dat_i[20], - wbs_dat_i[19], - wbs_dat_i[18], - wbs_dat_i[17], - wbs_dat_i[16], - wbs_dat_i[15], - wbs_dat_i[14], - wbs_dat_i[13], - wbs_dat_i[12], - wbs_dat_i[11], - wbs_dat_i[10], - wbs_dat_i[9], - wbs_dat_i[8], - wbs_dat_i[7], - wbs_dat_i[6], - wbs_dat_i[5], - wbs_dat_i[4], - wbs_dat_i[3], - wbs_dat_i[2], - wbs_dat_i[1], - wbs_dat_i[0]}), - .wbs_dat_o({wbs_dat_o[31], - wbs_dat_o[30], - wbs_dat_o[29], - wbs_dat_o[28], - wbs_dat_o[27], - wbs_dat_o[26], - wbs_dat_o[25], - wbs_dat_o[24], - wbs_dat_o[23], - wbs_dat_o[22], - wbs_dat_o[21], - wbs_dat_o[20], - wbs_dat_o[19], - wbs_dat_o[18], - wbs_dat_o[17], - wbs_dat_o[16], - wbs_dat_o[15], - wbs_dat_o[14], - wbs_dat_o[13], - wbs_dat_o[12], - wbs_dat_o[11], - wbs_dat_o[10], - wbs_dat_o[9], - wbs_dat_o[8], - wbs_dat_o[7], - wbs_dat_o[6], - wbs_dat_o[5], - wbs_dat_o[4], - wbs_dat_o[3], - wbs_dat_o[2], - wbs_dat_o[1], - wbs_dat_o[0]}), - .wbs_sel_i({wbs_sel_i[3], - wbs_sel_i[2], - wbs_sel_i[1], - wbs_sel_i[0]})); + .out({la_data_out[127], + la_data_out[126], + la_data_out[125], + la_data_out[124], + la_data_out[123], + la_data_out[122], + la_data_out[121], + la_data_out[120], + la_data_out[119], + la_data_out[118], + la_data_out[117], + la_data_out[116], + la_data_out[115], + la_data_out[114], + la_data_out[113], + la_data_out[112], + la_data_out[111], + la_data_out[110], + la_data_out[109], + la_data_out[108], + la_data_out[107], + la_data_out[106], + la_data_out[105], + la_data_out[104], + la_data_out[103], + la_data_out[102], + la_data_out[101], + la_data_out[100], + la_data_out[99], + la_data_out[98], + la_data_out[97], + la_data_out[96], + la_data_out[95], + la_data_out[94], + la_data_out[93], + la_data_out[92], + la_data_out[91], + la_data_out[90], + la_data_out[89], + la_data_out[88], + la_data_out[87], + la_data_out[86], + la_data_out[85], + la_data_out[84], + la_data_out[83], + la_data_out[82], + la_data_out[81], + la_data_out[80], + la_data_out[79], + la_data_out[78], + la_data_out[77], + la_data_out[76], + la_data_out[75], + la_data_out[74], + la_data_out[73], + la_data_out[72], + la_data_out[71], + la_data_out[70], + la_data_out[69], + la_data_out[68], + la_data_out[67], + la_data_out[66], + la_data_out[65], + la_data_out[64], + la_data_out[63], + la_data_out[62], + la_data_out[61], + la_data_out[60], + la_data_out[59], + la_data_out[58], + la_data_out[57], + la_data_out[56], + la_data_out[55], + la_data_out[54], + la_data_out[53], + la_data_out[52], + la_data_out[51], + la_data_out[50], + la_data_out[49], + la_data_out[48], + la_data_out[47], + la_data_out[46], + la_data_out[45], + la_data_out[44], + la_data_out[43], + la_data_out[42], + la_data_out[41], + la_data_out[40], + la_data_out[39], + la_data_out[38], + la_data_out[37], + la_data_out[36], + la_data_out[35], + la_data_out[34], + la_data_out[33], + la_data_out[32], + la_data_out[31], + la_data_out[30], + la_data_out[29], + la_data_out[28], + la_data_out[27], + la_data_out[26], + la_data_out[25], + la_data_out[24], + la_data_out[23], + la_data_out[22], + la_data_out[21], + la_data_out[20], + la_data_out[19], + la_data_out[18], + la_data_out[17], + la_data_out[16], + la_data_out[15], + la_data_out[14], + la_data_out[13], + la_data_out[12], + la_data_out[11], + la_data_out[10], + la_data_out[9], + la_data_out[8], + la_data_out[7], + la_data_out[6], + la_data_out[5], + la_data_out[4], + la_data_out[3], + la_data_out[2], + la_data_out[1], + la_data_out[0]}), + .state({la_data_in[127], + la_data_in[126], + la_data_in[125], + la_data_in[124], + la_data_in[123], + la_data_in[122], + la_data_in[121], + la_data_in[120], + la_data_in[119], + la_data_in[118], + la_data_in[117], + la_data_in[116], + la_data_in[115], + la_data_in[114], + la_data_in[113], + la_data_in[112], + la_data_in[111], + la_data_in[110], + la_data_in[109], + la_data_in[108], + la_data_in[107], + la_data_in[106], + la_data_in[105], + la_data_in[104], + la_data_in[103], + la_data_in[102], + la_data_in[101], + la_data_in[100], + la_data_in[99], + la_data_in[98], + la_data_in[97], + la_data_in[96], + la_data_in[95], + la_data_in[94], + la_data_in[93], + la_data_in[92], + la_data_in[91], + la_data_in[90], + la_data_in[89], + la_data_in[88], + la_data_in[87], + la_data_in[86], + la_data_in[85], + la_data_in[84], + la_data_in[83], + la_data_in[82], + la_data_in[81], + la_data_in[80], + la_data_in[79], + la_data_in[78], + la_data_in[77], + la_data_in[76], + la_data_in[75], + la_data_in[74], + la_data_in[73], + la_data_in[72], + la_data_in[71], + la_data_in[70], + la_data_in[69], + la_data_in[68], + la_data_in[67], + la_data_in[66], + la_data_in[65], + la_data_in[64], + la_data_in[63], + la_data_in[62], + la_data_in[61], + la_data_in[60], + la_data_in[59], + la_data_in[58], + la_data_in[57], + la_data_in[56], + la_data_in[55], + la_data_in[54], + la_data_in[53], + la_data_in[52], + la_data_in[51], + la_data_in[50], + la_data_in[49], + la_data_in[48], + la_data_in[47], + la_data_in[46], + la_data_in[45], + la_data_in[44], + la_data_in[43], + la_data_in[42], + la_data_in[41], + la_data_in[40], + la_data_in[39], + la_data_in[38], + la_data_in[37], + la_data_in[36], + la_data_in[35], + la_data_in[34], + la_data_in[33], + la_data_in[32], + la_data_in[31], + la_data_in[30], + la_data_in[29], + la_data_in[28], + la_data_in[27], + la_data_in[26], + la_data_in[25], + la_data_in[24], + la_data_in[23], + la_data_in[22], + la_data_in[21], + la_data_in[20], + la_data_in[19], + la_data_in[18], + la_data_in[17], + la_data_in[16], + la_data_in[15], + la_data_in[14], + la_data_in[13], + la_data_in[12], + la_data_in[11], + la_data_in[10], + la_data_in[9], + la_data_in[8], + la_data_in[7], + la_data_in[6], + la_data_in[5], + la_data_in[4], + la_data_in[3], + la_data_in[2], + la_data_in[1], + la_data_in[0]})); endmodule
diff --git a/verilog/rtl/aes128.v b/verilog/rtl/aes128.v new file mode 100644 index 0000000..b72cc1b --- /dev/null +++ b/verilog/rtl/aes128.v
@@ -0,0 +1,906 @@ +/* + * Copyright 2012, Homer Hsing <homer.hsing@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +module aes128( +`ifdef USE_POWER_PINS + inout vccd1, // User area 1 1.8V supply + inout vssd1, // User area 1 digital ground +`endif + input clk, + input [127:0] state, + input [127:0] key, + output [127:0] out +); + reg [127:0] s0, k0; + wire [127:0] s1, s2, s3, s4, s5, s6, s7, s8, s9, + k1, k2, k3, k4, k5, k6, k7, k8, k9, + k0b, k1b, k2b, k3b, k4b, k5b, k6b, k7b, k8b, k9b; + + always @ (posedge clk) + begin + s0 <= state ^ key; + k0 <= key; + end + + expand_key_128 + a1 (clk, k0, k1, k0b, 8'h1), + a2 (clk, k1, k2, k1b, 8'h2), + a3 (clk, k2, k3, k2b, 8'h4), + a4 (clk, k3, k4, k3b, 8'h8), + a5 (clk, k4, k5, k4b, 8'h10), + a6 (clk, k5, k6, k5b, 8'h20), + a7 (clk, k6, k7, k6b, 8'h40), + a8 (clk, k7, k8, k7b, 8'h80), + a9 (clk, k8, k9, k8b, 8'h1b), + a10 (clk, k9, , k9b, 8'h36); + + one_round + r1 (clk, s0, k0b, s1), + r2 (clk, s1, k1b, s2), + r3 (clk, s2, k2b, s3), + r4 (clk, s3, k3b, s4), + r5 (clk, s4, k4b, s5), + r6 (clk, s5, k5b, s6), + r7 (clk, s6, k6b, s7), + r8 (clk, s7, k7b, s8), + r9 (clk, s8, k8b, s9); + + final_round + rf (clk, s9, k9b, out); +endmodule + +module expand_key_128(clk, in, out_1, out_2, rcon); + input clk; + input [127:0] in; + input [7:0] rcon; + output reg [127:0] out_1; + output [127:0] out_2; + wire [31:0] k0, k1, k2, k3, + v0, v1, v2, v3; + reg [31:0] k0a, k1a, k2a, k3a; + wire [31:0] k0b, k1b, k2b, k3b, k4a; + + assign {k0, k1, k2, k3} = in; + + assign v0 = {k0[31:24] ^ rcon, k0[23:0]}; + assign v1 = v0 ^ k1; + assign v2 = v1 ^ k2; + assign v3 = v2 ^ k3; + + always @ (posedge clk) + {k0a, k1a, k2a, k3a} <= {v0, v1, v2, v3}; + + S4 + S4_0 (clk, {k3[23:0], k3[31:24]}, k4a); + + assign k0b = k0a ^ k4a; + assign k1b = k1a ^ k4a; + assign k2b = k2a ^ k4a; + assign k3b = k3a ^ k4a; + + always @ (posedge clk) + out_1 <= {k0b, k1b, k2b, k3b}; + + assign out_2 = {k0b, k1b, k2b, k3b}; +endmodule + + + +/* one AES round for every two clock cycles */ +module one_round (clk, state_in, key, state_out); + input clk; + input [127:0] state_in, key; + output reg [127:0] state_out; + wire [31:0] s0, s1, s2, s3, + z0, z1, z2, z3, + p00, p01, p02, p03, + p10, p11, p12, p13, + p20, p21, p22, p23, + p30, p31, p32, p33, + k0, k1, k2, k3; + + assign {k0, k1, k2, k3} = key; + + assign {s0, s1, s2, s3} = state_in; + + table_lookup + t0 (clk, s0, p00, p01, p02, p03), + t1 (clk, s1, p10, p11, p12, p13), + t2 (clk, s2, p20, p21, p22, p23), + t3 (clk, s3, p30, p31, p32, p33); + + assign z0 = p00 ^ p11 ^ p22 ^ p33 ^ k0; + assign z1 = p03 ^ p10 ^ p21 ^ p32 ^ k1; + assign z2 = p02 ^ p13 ^ p20 ^ p31 ^ k2; + assign z3 = p01 ^ p12 ^ p23 ^ p30 ^ k3; + + always @ (posedge clk) + state_out <= {z0, z1, z2, z3}; +endmodule + +/* AES final round for every two clock cycles */ +module final_round (clk, state_in, key_in, state_out); + input clk; + input [127:0] state_in; + input [127:0] key_in; + output reg [127:0] state_out; + wire [31:0] s0, s1, s2, s3, + z0, z1, z2, z3, + k0, k1, k2, k3; + wire [7:0] p00, p01, p02, p03, + p10, p11, p12, p13, + p20, p21, p22, p23, + p30, p31, p32, p33; + + assign {k0, k1, k2, k3} = key_in; + + assign {s0, s1, s2, s3} = state_in; + + S4 + S4_1 (clk, s0, {p00, p01, p02, p03}), + S4_2 (clk, s1, {p10, p11, p12, p13}), + S4_3 (clk, s2, {p20, p21, p22, p23}), + S4_4 (clk, s3, {p30, p31, p32, p33}); + + assign z0 = {p00, p11, p22, p33} ^ k0; + assign z1 = {p10, p21, p32, p03} ^ k1; + assign z2 = {p20, p31, p02, p13} ^ k2; + assign z3 = {p30, p01, p12, p23} ^ k3; + + always @ (posedge clk) + state_out <= {z0, z1, z2, z3}; +endmodule + + + + +/*http://cs-www.cs.yale.edu/homes/peralta/CircuitStuff/CMT.html*/ +module S( + input clk, + input [7:0] in, + output reg [7:0] out + ); + + wire[0:7] s, x; + + assign x = in; + + always @ (posedge clk) + out <= s; + + wire [21:0] y; + wire [67:0] t; + wire [17:0] z; + + assign y[14] = x[3] ^ x[5]; + assign y[13] = x[0] ^ x[6]; + assign y[9] = x[0] ^ x[3]; + assign y[8] = x[0] ^ x[5]; + assign t[0] = x[1] ^ x[2]; + assign y[1] = t[0] ^ x[7]; + assign y[4] = y[1] ^ x[3]; + assign y[12] = y[13] ^ y[14]; + assign y[2] = y[1] ^ x[0]; + assign y[5] = y[1] ^ x[6]; + assign y[3] = y[5] ^ y[8]; + assign t[1] = x[4] ^ y[12]; + assign y[15] = t[1] ^ x[5]; + assign y[20] = t[1] ^ x[1]; + assign y[6] = y[15] ^ x[7]; + assign y[10] = y[15] ^ t[0]; + assign y[11] = y[20] ^ y[9]; + assign y[7] = x[7] ^ y[11]; + assign y[17] = y[10] ^ y[11]; + assign y[19] = y[10] ^ y[8]; + assign y[16] = t[0] ^ y[11]; + assign y[21] = y[13] ^ y[16]; + assign y[18] = x[0] ^ y[16]; + + assign t[2] = y[12] & y[15]; + assign t[3] = y[3] & y[6]; + assign t[4] = t[3] ^ t[2]; + assign t[5] = y[4] & x[7]; + assign t[6] = t[5] ^ t[2]; + assign t[7] = y[13] & y[16]; + assign t[8] = y[5] & y[1]; + assign t[9] = t[8] ^ t[7]; + assign t[10] = y[2] & y[7]; + assign t[11] = t[10] ^ t[7]; + assign t[12] = y[9] & y[11]; + assign t[13] = y[14] & y[17]; + assign t[14] = t[13] ^ t[12]; + assign t[15] = y[8] & y[10]; + assign t[16] = t[15] ^ t[12]; + assign t[17] = t[4] ^ t[14]; + assign t[18] = t[6] ^ t[16]; + assign t[19] = t[9] ^ t[14]; + assign t[20] = t[11] ^ t[16]; + assign t[21] = t[17] ^ y[20]; + assign t[22] = t[18] ^ y[19]; + assign t[23] = t[19] ^ y[21]; + assign t[24] = t[20] ^ y[18]; + + assign t[25] = t[21] ^ t[22]; + assign t[26] = t[21] & t[23]; + assign t[27] = t[24] ^ t[26]; + assign t[28] = t[25] & t[27]; + assign t[29] = t[28] ^ t[22]; + assign t[30] = t[23] ^ t[24]; + assign t[31] = t[22] ^ t[26]; + assign t[32] = t[31] & t[30]; + assign t[33] = t[32] ^ t[24]; + assign t[34] = t[23] ^ t[33]; + assign t[35] = t[27] ^ t[33]; + assign t[36] = t[24] & t[35]; + assign t[37] = t[36] ^ t[34]; + assign t[38] = t[27] ^ t[36]; + assign t[39] = t[29] & t[38]; + assign t[40] = t[25] ^ t[39]; + + assign t[41] = t[40] ^ t[37]; + assign t[42] = t[29] ^ t[33]; + assign t[43] = t[29] ^ t[40]; + assign t[44] = t[33] ^ t[37]; + assign t[45] = t[42] ^ t[41]; + assign z[0] = t[44] & y[15]; + assign z[1] = t[37] & y[6]; + assign z[2] = t[33] & x[7]; + assign z[3] = t[43] & y[16]; + assign z[4] = t[40] & y[1]; + assign z[5] = t[29] & y[7]; + assign z[6] = t[42] & y[11]; + assign z[7] = t[45] & y[17]; + assign z[8] = t[41] & y[10]; + assign z[9] = t[44] & y[12]; + assign z[10] = t[37] & y[3]; + assign z[11] = t[33] & y[4]; + assign z[12] = t[43] & y[13]; + assign z[13] = t[40] & y[5]; + assign z[14] = t[29] & y[2]; + assign z[15] = t[42] & y[9]; + assign z[16] = t[45] & y[14]; + assign z[17] = t[41] & y[8]; + + assign t[46] = z[15] ^ z[16]; + assign t[47] = z[10] ^ z[11]; + assign t[48] = z[5] ^ z[13]; + assign t[49] = z[9] ^ z[10]; + assign t[50] = z[2] ^ z[12]; + assign t[51] = z[2] ^ z[5]; + assign t[52] = z[7] ^ z[8]; + assign t[53] = z[0] ^ z[3]; + assign t[54] = z[6] ^ z[7]; + assign t[55] = z[16] ^ z[17]; + assign t[56] = z[12] ^ t[48]; + assign t[57] = t[50] ^ t[53]; + assign t[58] = z[4] ^ t[46]; + assign t[59] = z[3] ^ t[54]; + assign t[60] = t[46] ^ t[57]; + assign t[61] = z[14] ^ t[57]; + assign t[62] = t[52] ^ t[58]; + assign t[63] = t[49] ^ t[58]; + assign t[64] = z[4] ^ t[59]; + assign t[65] = t[61] ^ t[62]; + assign t[66] = z[1] ^ t[63]; + assign s[0] = t[59] ^ t[63]; + assign s[6] = ~t[56 ] ^ t[62]; + assign s[7] = ~t[48 ] ^ t[60]; + assign t[67] = t[64] ^ t[65]; + assign s[3] = t[53] ^ t[66]; + assign s[4] = t[51] ^ t[66]; + assign s[5] = t[47] ^ t[65]; + assign s[1] = ~t[64 ] ^ s[3]; + assign s[2] = ~t[55 ] ^ t[67]; + +endmodule + + +module xS (clk, in, out); //this is sbox times 2 + input clk; + input [7:0] in; + output [7:0] out; + + wire [7:0] out_2; + + S S_( + .clk(clk), + .in(in), + .out(out_2) + ); + + wire dummy; + + assign {dummy, out} = out_2[7]? {out_2, 1'b0}^9'h11b : {out_2, 1'b0}; //Finite Field Multiplication: https://www.cs.uaf.edu/2013/spring/cs463/lecture/02_11_groups_fields.html + + +endmodule + + + +module table_lookup (clk, state, p0, p1, p2, p3); + input clk; + input [31:0] state; + output [31:0] p0, p1, p2, p3; + wire [7:0] b0, b1, b2, b3; + + assign {b0, b1, b2, b3} = state; + T + t0 (clk, b0, {p0[23:0], p0[31:24]}), + t1 (clk, b1, {p1[15:0], p1[31:16]}), + t2 (clk, b2, {p2[7:0], p2[31:8]} ), + t3 (clk, b3, p3); +endmodule + +/* substitue four bytes in a word */ +module S4 (clk, in, out); + input clk; + input [31:0] in; + output [31:0] out; + + S + S_0 (clk, in[31:24], out[31:24]), + S_1 (clk, in[23:16], out[23:16]), + S_2 (clk, in[15:8], out[15:8] ), + S_3 (clk, in[7:0], out[7:0] ); +endmodule + +/* S_box, S_box, S_box*(x+1), S_box*x */ +module T (clk, in, out); + input clk; + input [7:0] in; + output [31:0] out; + + S + s0 (clk, in, out[31:24]); + assign out[23:16] = out[31:24]; + xS + s4 (clk, in, out[7:0]); + assign out[15:8] = out[23:16] ^ out[7:0]; +endmodule + +/* S box */ +module S_table (clk, in, out); //uses BRAM, implementation based on logic operations included in sbox.v + input clk; + input [7:0] in; + output reg [7:0] out; + + always @ (posedge clk) + case (in) + 8'h00: out <= 8'h63; + 8'h01: out <= 8'h7c; + 8'h02: out <= 8'h77; + 8'h03: out <= 8'h7b; + 8'h04: out <= 8'hf2; + 8'h05: out <= 8'h6b; + 8'h06: out <= 8'h6f; + 8'h07: out <= 8'hc5; + 8'h08: out <= 8'h30; + 8'h09: out <= 8'h01; + 8'h0a: out <= 8'h67; + 8'h0b: out <= 8'h2b; + 8'h0c: out <= 8'hfe; + 8'h0d: out <= 8'hd7; + 8'h0e: out <= 8'hab; + 8'h0f: out <= 8'h76; + 8'h10: out <= 8'hca; + 8'h11: out <= 8'h82; + 8'h12: out <= 8'hc9; + 8'h13: out <= 8'h7d; + 8'h14: out <= 8'hfa; + 8'h15: out <= 8'h59; + 8'h16: out <= 8'h47; + 8'h17: out <= 8'hf0; + 8'h18: out <= 8'had; + 8'h19: out <= 8'hd4; + 8'h1a: out <= 8'ha2; + 8'h1b: out <= 8'haf; + 8'h1c: out <= 8'h9c; + 8'h1d: out <= 8'ha4; + 8'h1e: out <= 8'h72; + 8'h1f: out <= 8'hc0; + 8'h20: out <= 8'hb7; + 8'h21: out <= 8'hfd; + 8'h22: out <= 8'h93; + 8'h23: out <= 8'h26; + 8'h24: out <= 8'h36; + 8'h25: out <= 8'h3f; + 8'h26: out <= 8'hf7; + 8'h27: out <= 8'hcc; + 8'h28: out <= 8'h34; + 8'h29: out <= 8'ha5; + 8'h2a: out <= 8'he5; + 8'h2b: out <= 8'hf1; + 8'h2c: out <= 8'h71; + 8'h2d: out <= 8'hd8; + 8'h2e: out <= 8'h31; + 8'h2f: out <= 8'h15; + 8'h30: out <= 8'h04; + 8'h31: out <= 8'hc7; + 8'h32: out <= 8'h23; + 8'h33: out <= 8'hc3; + 8'h34: out <= 8'h18; + 8'h35: out <= 8'h96; + 8'h36: out <= 8'h05; + 8'h37: out <= 8'h9a; + 8'h38: out <= 8'h07; + 8'h39: out <= 8'h12; + 8'h3a: out <= 8'h80; + 8'h3b: out <= 8'he2; + 8'h3c: out <= 8'heb; + 8'h3d: out <= 8'h27; + 8'h3e: out <= 8'hb2; + 8'h3f: out <= 8'h75; + 8'h40: out <= 8'h09; + 8'h41: out <= 8'h83; + 8'h42: out <= 8'h2c; + 8'h43: out <= 8'h1a; + 8'h44: out <= 8'h1b; + 8'h45: out <= 8'h6e; + 8'h46: out <= 8'h5a; + 8'h47: out <= 8'ha0; + 8'h48: out <= 8'h52; + 8'h49: out <= 8'h3b; + 8'h4a: out <= 8'hd6; + 8'h4b: out <= 8'hb3; + 8'h4c: out <= 8'h29; + 8'h4d: out <= 8'he3; + 8'h4e: out <= 8'h2f; + 8'h4f: out <= 8'h84; + 8'h50: out <= 8'h53; + 8'h51: out <= 8'hd1; + 8'h52: out <= 8'h00; + 8'h53: out <= 8'hed; + 8'h54: out <= 8'h20; + 8'h55: out <= 8'hfc; + 8'h56: out <= 8'hb1; + 8'h57: out <= 8'h5b; + 8'h58: out <= 8'h6a; + 8'h59: out <= 8'hcb; + 8'h5a: out <= 8'hbe; + 8'h5b: out <= 8'h39; + 8'h5c: out <= 8'h4a; + 8'h5d: out <= 8'h4c; + 8'h5e: out <= 8'h58; + 8'h5f: out <= 8'hcf; + 8'h60: out <= 8'hd0; + 8'h61: out <= 8'hef; + 8'h62: out <= 8'haa; + 8'h63: out <= 8'hfb; + 8'h64: out <= 8'h43; + 8'h65: out <= 8'h4d; + 8'h66: out <= 8'h33; + 8'h67: out <= 8'h85; + 8'h68: out <= 8'h45; + 8'h69: out <= 8'hf9; + 8'h6a: out <= 8'h02; + 8'h6b: out <= 8'h7f; + 8'h6c: out <= 8'h50; + 8'h6d: out <= 8'h3c; + 8'h6e: out <= 8'h9f; + 8'h6f: out <= 8'ha8; + 8'h70: out <= 8'h51; + 8'h71: out <= 8'ha3; + 8'h72: out <= 8'h40; + 8'h73: out <= 8'h8f; + 8'h74: out <= 8'h92; + 8'h75: out <= 8'h9d; + 8'h76: out <= 8'h38; + 8'h77: out <= 8'hf5; + 8'h78: out <= 8'hbc; + 8'h79: out <= 8'hb6; + 8'h7a: out <= 8'hda; + 8'h7b: out <= 8'h21; + 8'h7c: out <= 8'h10; + 8'h7d: out <= 8'hff; + 8'h7e: out <= 8'hf3; + 8'h7f: out <= 8'hd2; + 8'h80: out <= 8'hcd; + 8'h81: out <= 8'h0c; + 8'h82: out <= 8'h13; + 8'h83: out <= 8'hec; + 8'h84: out <= 8'h5f; + 8'h85: out <= 8'h97; + 8'h86: out <= 8'h44; + 8'h87: out <= 8'h17; + 8'h88: out <= 8'hc4; + 8'h89: out <= 8'ha7; + 8'h8a: out <= 8'h7e; + 8'h8b: out <= 8'h3d; + 8'h8c: out <= 8'h64; + 8'h8d: out <= 8'h5d; + 8'h8e: out <= 8'h19; + 8'h8f: out <= 8'h73; + 8'h90: out <= 8'h60; + 8'h91: out <= 8'h81; + 8'h92: out <= 8'h4f; + 8'h93: out <= 8'hdc; + 8'h94: out <= 8'h22; + 8'h95: out <= 8'h2a; + 8'h96: out <= 8'h90; + 8'h97: out <= 8'h88; + 8'h98: out <= 8'h46; + 8'h99: out <= 8'hee; + 8'h9a: out <= 8'hb8; + 8'h9b: out <= 8'h14; + 8'h9c: out <= 8'hde; + 8'h9d: out <= 8'h5e; + 8'h9e: out <= 8'h0b; + 8'h9f: out <= 8'hdb; + 8'ha0: out <= 8'he0; + 8'ha1: out <= 8'h32; + 8'ha2: out <= 8'h3a; + 8'ha3: out <= 8'h0a; + 8'ha4: out <= 8'h49; + 8'ha5: out <= 8'h06; + 8'ha6: out <= 8'h24; + 8'ha7: out <= 8'h5c; + 8'ha8: out <= 8'hc2; + 8'ha9: out <= 8'hd3; + 8'haa: out <= 8'hac; + 8'hab: out <= 8'h62; + 8'hac: out <= 8'h91; + 8'had: out <= 8'h95; + 8'hae: out <= 8'he4; + 8'haf: out <= 8'h79; + 8'hb0: out <= 8'he7; + 8'hb1: out <= 8'hc8; + 8'hb2: out <= 8'h37; + 8'hb3: out <= 8'h6d; + 8'hb4: out <= 8'h8d; + 8'hb5: out <= 8'hd5; + 8'hb6: out <= 8'h4e; + 8'hb7: out <= 8'ha9; + 8'hb8: out <= 8'h6c; + 8'hb9: out <= 8'h56; + 8'hba: out <= 8'hf4; + 8'hbb: out <= 8'hea; + 8'hbc: out <= 8'h65; + 8'hbd: out <= 8'h7a; + 8'hbe: out <= 8'hae; + 8'hbf: out <= 8'h08; + 8'hc0: out <= 8'hba; + 8'hc1: out <= 8'h78; + 8'hc2: out <= 8'h25; + 8'hc3: out <= 8'h2e; + 8'hc4: out <= 8'h1c; + 8'hc5: out <= 8'ha6; + 8'hc6: out <= 8'hb4; + 8'hc7: out <= 8'hc6; + 8'hc8: out <= 8'he8; + 8'hc9: out <= 8'hdd; + 8'hca: out <= 8'h74; + 8'hcb: out <= 8'h1f; + 8'hcc: out <= 8'h4b; + 8'hcd: out <= 8'hbd; + 8'hce: out <= 8'h8b; + 8'hcf: out <= 8'h8a; + 8'hd0: out <= 8'h70; + 8'hd1: out <= 8'h3e; + 8'hd2: out <= 8'hb5; + 8'hd3: out <= 8'h66; + 8'hd4: out <= 8'h48; + 8'hd5: out <= 8'h03; + 8'hd6: out <= 8'hf6; + 8'hd7: out <= 8'h0e; + 8'hd8: out <= 8'h61; + 8'hd9: out <= 8'h35; + 8'hda: out <= 8'h57; + 8'hdb: out <= 8'hb9; + 8'hdc: out <= 8'h86; + 8'hdd: out <= 8'hc1; + 8'hde: out <= 8'h1d; + 8'hdf: out <= 8'h9e; + 8'he0: out <= 8'he1; + 8'he1: out <= 8'hf8; + 8'he2: out <= 8'h98; + 8'he3: out <= 8'h11; + 8'he4: out <= 8'h69; + 8'he5: out <= 8'hd9; + 8'he6: out <= 8'h8e; + 8'he7: out <= 8'h94; + 8'he8: out <= 8'h9b; + 8'he9: out <= 8'h1e; + 8'hea: out <= 8'h87; + 8'heb: out <= 8'he9; + 8'hec: out <= 8'hce; + 8'hed: out <= 8'h55; + 8'hee: out <= 8'h28; + 8'hef: out <= 8'hdf; + 8'hf0: out <= 8'h8c; + 8'hf1: out <= 8'ha1; + 8'hf2: out <= 8'h89; + 8'hf3: out <= 8'h0d; + 8'hf4: out <= 8'hbf; + 8'hf5: out <= 8'he6; + 8'hf6: out <= 8'h42; + 8'hf7: out <= 8'h68; + 8'hf8: out <= 8'h41; + 8'hf9: out <= 8'h99; + 8'hfa: out <= 8'h2d; + 8'hfb: out <= 8'h0f; + 8'hfc: out <= 8'hb0; + 8'hfd: out <= 8'h54; + 8'hfe: out <= 8'hbb; + 8'hff: out <= 8'h16; + endcase +endmodule + +/* S box * x */ +module xS_table (clk, in, out); //uses BRAM, implementation based on logic operations included in sbox.v + input clk; + input [7:0] in; + output reg [7:0] out; + + always @ (posedge clk) + case (in) + 8'h00: out <= 8'hc6; + 8'h01: out <= 8'hf8; + 8'h02: out <= 8'hee; + 8'h03: out <= 8'hf6; + 8'h04: out <= 8'hff; + 8'h05: out <= 8'hd6; + 8'h06: out <= 8'hde; + 8'h07: out <= 8'h91; + 8'h08: out <= 8'h60; + 8'h09: out <= 8'h02; + 8'h0a: out <= 8'hce; + 8'h0b: out <= 8'h56; + 8'h0c: out <= 8'he7; + 8'h0d: out <= 8'hb5; + 8'h0e: out <= 8'h4d; + 8'h0f: out <= 8'hec; + 8'h10: out <= 8'h8f; + 8'h11: out <= 8'h1f; + 8'h12: out <= 8'h89; + 8'h13: out <= 8'hfa; + 8'h14: out <= 8'hef; + 8'h15: out <= 8'hb2; + 8'h16: out <= 8'h8e; + 8'h17: out <= 8'hfb; + 8'h18: out <= 8'h41; + 8'h19: out <= 8'hb3; + 8'h1a: out <= 8'h5f; + 8'h1b: out <= 8'h45; + 8'h1c: out <= 8'h23; + 8'h1d: out <= 8'h53; + 8'h1e: out <= 8'he4; + 8'h1f: out <= 8'h9b; + 8'h20: out <= 8'h75; + 8'h21: out <= 8'he1; + 8'h22: out <= 8'h3d; + 8'h23: out <= 8'h4c; + 8'h24: out <= 8'h6c; + 8'h25: out <= 8'h7e; + 8'h26: out <= 8'hf5; + 8'h27: out <= 8'h83; + 8'h28: out <= 8'h68; + 8'h29: out <= 8'h51; + 8'h2a: out <= 8'hd1; + 8'h2b: out <= 8'hf9; + 8'h2c: out <= 8'he2; + 8'h2d: out <= 8'hab; + 8'h2e: out <= 8'h62; + 8'h2f: out <= 8'h2a; + 8'h30: out <= 8'h08; + 8'h31: out <= 8'h95; + 8'h32: out <= 8'h46; + 8'h33: out <= 8'h9d; + 8'h34: out <= 8'h30; + 8'h35: out <= 8'h37; + 8'h36: out <= 8'h0a; + 8'h37: out <= 8'h2f; + 8'h38: out <= 8'h0e; + 8'h39: out <= 8'h24; + 8'h3a: out <= 8'h1b; + 8'h3b: out <= 8'hdf; + 8'h3c: out <= 8'hcd; + 8'h3d: out <= 8'h4e; + 8'h3e: out <= 8'h7f; + 8'h3f: out <= 8'hea; + 8'h40: out <= 8'h12; + 8'h41: out <= 8'h1d; + 8'h42: out <= 8'h58; + 8'h43: out <= 8'h34; + 8'h44: out <= 8'h36; + 8'h45: out <= 8'hdc; + 8'h46: out <= 8'hb4; + 8'h47: out <= 8'h5b; + 8'h48: out <= 8'ha4; + 8'h49: out <= 8'h76; + 8'h4a: out <= 8'hb7; + 8'h4b: out <= 8'h7d; + 8'h4c: out <= 8'h52; + 8'h4d: out <= 8'hdd; + 8'h4e: out <= 8'h5e; + 8'h4f: out <= 8'h13; + 8'h50: out <= 8'ha6; + 8'h51: out <= 8'hb9; + 8'h52: out <= 8'h00; + 8'h53: out <= 8'hc1; + 8'h54: out <= 8'h40; + 8'h55: out <= 8'he3; + 8'h56: out <= 8'h79; + 8'h57: out <= 8'hb6; + 8'h58: out <= 8'hd4; + 8'h59: out <= 8'h8d; + 8'h5a: out <= 8'h67; + 8'h5b: out <= 8'h72; + 8'h5c: out <= 8'h94; + 8'h5d: out <= 8'h98; + 8'h5e: out <= 8'hb0; + 8'h5f: out <= 8'h85; + 8'h60: out <= 8'hbb; + 8'h61: out <= 8'hc5; + 8'h62: out <= 8'h4f; + 8'h63: out <= 8'hed; + 8'h64: out <= 8'h86; + 8'h65: out <= 8'h9a; + 8'h66: out <= 8'h66; + 8'h67: out <= 8'h11; + 8'h68: out <= 8'h8a; + 8'h69: out <= 8'he9; + 8'h6a: out <= 8'h04; + 8'h6b: out <= 8'hfe; + 8'h6c: out <= 8'ha0; + 8'h6d: out <= 8'h78; + 8'h6e: out <= 8'h25; + 8'h6f: out <= 8'h4b; + 8'h70: out <= 8'ha2; + 8'h71: out <= 8'h5d; + 8'h72: out <= 8'h80; + 8'h73: out <= 8'h05; + 8'h74: out <= 8'h3f; + 8'h75: out <= 8'h21; + 8'h76: out <= 8'h70; + 8'h77: out <= 8'hf1; + 8'h78: out <= 8'h63; + 8'h79: out <= 8'h77; + 8'h7a: out <= 8'haf; + 8'h7b: out <= 8'h42; + 8'h7c: out <= 8'h20; + 8'h7d: out <= 8'he5; + 8'h7e: out <= 8'hfd; + 8'h7f: out <= 8'hbf; + 8'h80: out <= 8'h81; + 8'h81: out <= 8'h18; + 8'h82: out <= 8'h26; + 8'h83: out <= 8'hc3; + 8'h84: out <= 8'hbe; + 8'h85: out <= 8'h35; + 8'h86: out <= 8'h88; + 8'h87: out <= 8'h2e; + 8'h88: out <= 8'h93; + 8'h89: out <= 8'h55; + 8'h8a: out <= 8'hfc; + 8'h8b: out <= 8'h7a; + 8'h8c: out <= 8'hc8; + 8'h8d: out <= 8'hba; + 8'h8e: out <= 8'h32; + 8'h8f: out <= 8'he6; + 8'h90: out <= 8'hc0; + 8'h91: out <= 8'h19; + 8'h92: out <= 8'h9e; + 8'h93: out <= 8'ha3; + 8'h94: out <= 8'h44; + 8'h95: out <= 8'h54; + 8'h96: out <= 8'h3b; + 8'h97: out <= 8'h0b; + 8'h98: out <= 8'h8c; + 8'h99: out <= 8'hc7; + 8'h9a: out <= 8'h6b; + 8'h9b: out <= 8'h28; + 8'h9c: out <= 8'ha7; + 8'h9d: out <= 8'hbc; + 8'h9e: out <= 8'h16; + 8'h9f: out <= 8'had; + 8'ha0: out <= 8'hdb; + 8'ha1: out <= 8'h64; + 8'ha2: out <= 8'h74; + 8'ha3: out <= 8'h14; + 8'ha4: out <= 8'h92; + 8'ha5: out <= 8'h0c; + 8'ha6: out <= 8'h48; + 8'ha7: out <= 8'hb8; + 8'ha8: out <= 8'h9f; + 8'ha9: out <= 8'hbd; + 8'haa: out <= 8'h43; + 8'hab: out <= 8'hc4; + 8'hac: out <= 8'h39; + 8'had: out <= 8'h31; + 8'hae: out <= 8'hd3; + 8'haf: out <= 8'hf2; + 8'hb0: out <= 8'hd5; + 8'hb1: out <= 8'h8b; + 8'hb2: out <= 8'h6e; + 8'hb3: out <= 8'hda; + 8'hb4: out <= 8'h01; + 8'hb5: out <= 8'hb1; + 8'hb6: out <= 8'h9c; + 8'hb7: out <= 8'h49; + 8'hb8: out <= 8'hd8; + 8'hb9: out <= 8'hac; + 8'hba: out <= 8'hf3; + 8'hbb: out <= 8'hcf; + 8'hbc: out <= 8'hca; + 8'hbd: out <= 8'hf4; + 8'hbe: out <= 8'h47; + 8'hbf: out <= 8'h10; + 8'hc0: out <= 8'h6f; + 8'hc1: out <= 8'hf0; + 8'hc2: out <= 8'h4a; + 8'hc3: out <= 8'h5c; + 8'hc4: out <= 8'h38; + 8'hc5: out <= 8'h57; + 8'hc6: out <= 8'h73; + 8'hc7: out <= 8'h97; + 8'hc8: out <= 8'hcb; + 8'hc9: out <= 8'ha1; + 8'hca: out <= 8'he8; + 8'hcb: out <= 8'h3e; + 8'hcc: out <= 8'h96; + 8'hcd: out <= 8'h61; + 8'hce: out <= 8'h0d; + 8'hcf: out <= 8'h0f; + 8'hd0: out <= 8'he0; + 8'hd1: out <= 8'h7c; + 8'hd2: out <= 8'h71; + 8'hd3: out <= 8'hcc; + 8'hd4: out <= 8'h90; + 8'hd5: out <= 8'h06; + 8'hd6: out <= 8'hf7; + 8'hd7: out <= 8'h1c; + 8'hd8: out <= 8'hc2; + 8'hd9: out <= 8'h6a; + 8'hda: out <= 8'hae; + 8'hdb: out <= 8'h69; + 8'hdc: out <= 8'h17; + 8'hdd: out <= 8'h99; + 8'hde: out <= 8'h3a; + 8'hdf: out <= 8'h27; + 8'he0: out <= 8'hd9; + 8'he1: out <= 8'heb; + 8'he2: out <= 8'h2b; + 8'he3: out <= 8'h22; + 8'he4: out <= 8'hd2; + 8'he5: out <= 8'ha9; + 8'he6: out <= 8'h07; + 8'he7: out <= 8'h33; + 8'he8: out <= 8'h2d; + 8'he9: out <= 8'h3c; + 8'hea: out <= 8'h15; + 8'heb: out <= 8'hc9; + 8'hec: out <= 8'h87; + 8'hed: out <= 8'haa; + 8'hee: out <= 8'h50; + 8'hef: out <= 8'ha5; + 8'hf0: out <= 8'h03; + 8'hf1: out <= 8'h59; + 8'hf2: out <= 8'h09; + 8'hf3: out <= 8'h1a; + 8'hf4: out <= 8'h65; + 8'hf5: out <= 8'hd7; + 8'hf6: out <= 8'h84; + 8'hf7: out <= 8'hd0; + 8'hf8: out <= 8'h82; + 8'hf9: out <= 8'h29; + 8'hfa: out <= 8'h5a; + 8'hfb: out <= 8'h1e; + 8'hfc: out <= 8'h7b; + 8'hfd: out <= 8'ha8; + 8'hfe: out <= 8'h6d; + 8'hff: out <= 8'h2c; + endcase +endmodule