//for v0.9.2 of K scalar I SM4ED SM4ED --11000----------000-----0110011 sm4 Zks Zksed I SM4KS SM4KS --11010----------000-----0110011 sm4 Zks Zksed S SM4ED "fun_sm4ed(input(SRC1), input(SRC2), input(INSTRUCTION)(31 downto 30))" S SM4KS "fun_sm4ks(input(SRC1), input(SRC2), input(INSTRUCTION)(31 downto 30))" P """ // massive MUX implementing SM4SBOX def fun_sm4sbox_raw(in:Bits) : Bits = { val x = in(7 downto 0) val r = (x).mux( B"8'x00" -> B"8'xD6", B"8'x01" -> B"8'x90", B"8'x02" -> B"8'xE9", B"8'x03" -> B"8'xFE", B"8'x04" -> B"8'xCC", B"8'x05" -> B"8'xE1", B"8'x06" -> B"8'x3D", B"8'x07" -> B"8'xB7", B"8'x08" -> B"8'x16", B"8'x09" -> B"8'xB6", B"8'x0a" -> B"8'x14", B"8'x0b" -> B"8'xC2", B"8'x0c" -> B"8'x28", B"8'x0d" -> B"8'xFB", B"8'x0e" -> B"8'x2C", B"8'x0f" -> B"8'x05", B"8'x10" -> B"8'x2B", B"8'x11" -> B"8'x67", B"8'x12" -> B"8'x9A", B"8'x13" -> B"8'x76", B"8'x14" -> B"8'x2A", B"8'x15" -> B"8'xBE", B"8'x16" -> B"8'x04", B"8'x17" -> B"8'xC3", B"8'x18" -> B"8'xAA", B"8'x19" -> B"8'x44", B"8'x1a" -> B"8'x13", B"8'x1b" -> B"8'x26", B"8'x1c" -> B"8'x49", B"8'x1d" -> B"8'x86", B"8'x1e" -> B"8'x06", B"8'x1f" -> B"8'x99", B"8'x20" -> B"8'x9C", B"8'x21" -> B"8'x42", B"8'x22" -> B"8'x50", B"8'x23" -> B"8'xF4", B"8'x24" -> B"8'x91", B"8'x25" -> B"8'xEF", B"8'x26" -> B"8'x98", B"8'x27" -> B"8'x7A", B"8'x28" -> B"8'x33", B"8'x29" -> B"8'x54", B"8'x2a" -> B"8'x0B", B"8'x2b" -> B"8'x43", B"8'x2c" -> B"8'xED", B"8'x2d" -> B"8'xCF", B"8'x2e" -> B"8'xAC", B"8'x2f" -> B"8'x62", B"8'x30" -> B"8'xE4", B"8'x31" -> B"8'xB3", B"8'x32" -> B"8'x1C", B"8'x33" -> B"8'xA9", B"8'x34" -> B"8'xC9", B"8'x35" -> B"8'x08", B"8'x36" -> B"8'xE8", B"8'x37" -> B"8'x95", B"8'x38" -> B"8'x80", B"8'x39" -> B"8'xDF", B"8'x3a" -> B"8'x94", B"8'x3b" -> B"8'xFA", B"8'x3c" -> B"8'x75", B"8'x3d" -> B"8'x8F", B"8'x3e" -> B"8'x3F", B"8'x3f" -> B"8'xA6", B"8'x40" -> B"8'x47", B"8'x41" -> B"8'x07", B"8'x42" -> B"8'xA7", B"8'x43" -> B"8'xFC", B"8'x44" -> B"8'xF3", B"8'x45" -> B"8'x73", B"8'x46" -> B"8'x17", B"8'x47" -> B"8'xBA", B"8'x48" -> B"8'x83", B"8'x49" -> B"8'x59", B"8'x4a" -> B"8'x3C", B"8'x4b" -> B"8'x19", B"8'x4c" -> B"8'xE6", B"8'x4d" -> B"8'x85", B"8'x4e" -> B"8'x4F", B"8'x4f" -> B"8'xA8", B"8'x50" -> B"8'x68", B"8'x51" -> B"8'x6B", B"8'x52" -> B"8'x81", B"8'x53" -> B"8'xB2", B"8'x54" -> B"8'x71", B"8'x55" -> B"8'x64", B"8'x56" -> B"8'xDA", B"8'x57" -> B"8'x8B", B"8'x58" -> B"8'xF8", B"8'x59" -> B"8'xEB", B"8'x5a" -> B"8'x0F", B"8'x5b" -> B"8'x4B", B"8'x5c" -> B"8'x70", B"8'x5d" -> B"8'x56", B"8'x5e" -> B"8'x9D", B"8'x5f" -> B"8'x35", B"8'x60" -> B"8'x1E", B"8'x61" -> B"8'x24", B"8'x62" -> B"8'x0E", B"8'x63" -> B"8'x5E", B"8'x64" -> B"8'x63", B"8'x65" -> B"8'x58", B"8'x66" -> B"8'xD1", B"8'x67" -> B"8'xA2", B"8'x68" -> B"8'x25", B"8'x69" -> B"8'x22", B"8'x6a" -> B"8'x7C", B"8'x6b" -> B"8'x3B", B"8'x6c" -> B"8'x01", B"8'x6d" -> B"8'x21", B"8'x6e" -> B"8'x78", B"8'x6f" -> B"8'x87", B"8'x70" -> B"8'xD4", B"8'x71" -> B"8'x00", B"8'x72" -> B"8'x46", B"8'x73" -> B"8'x57", B"8'x74" -> B"8'x9F", B"8'x75" -> B"8'xD3", B"8'x76" -> B"8'x27", B"8'x77" -> B"8'x52", B"8'x78" -> B"8'x4C", B"8'x79" -> B"8'x36", B"8'x7a" -> B"8'x02", B"8'x7b" -> B"8'xE7", B"8'x7c" -> B"8'xA0", B"8'x7d" -> B"8'xC4", B"8'x7e" -> B"8'xC8", B"8'x7f" -> B"8'x9E", B"8'x80" -> B"8'xEA", B"8'x81" -> B"8'xBF", B"8'x82" -> B"8'x8A", B"8'x83" -> B"8'xD2", B"8'x84" -> B"8'x40", B"8'x85" -> B"8'xC7", B"8'x86" -> B"8'x38", B"8'x87" -> B"8'xB5", B"8'x88" -> B"8'xA3", B"8'x89" -> B"8'xF7", B"8'x8a" -> B"8'xF2", B"8'x8b" -> B"8'xCE", B"8'x8c" -> B"8'xF9", B"8'x8d" -> B"8'x61", B"8'x8e" -> B"8'x15", B"8'x8f" -> B"8'xA1", B"8'x90" -> B"8'xE0", B"8'x91" -> B"8'xAE", B"8'x92" -> B"8'x5D", B"8'x93" -> B"8'xA4", B"8'x94" -> B"8'x9B", B"8'x95" -> B"8'x34", B"8'x96" -> B"8'x1A", B"8'x97" -> B"8'x55", B"8'x98" -> B"8'xAD", B"8'x99" -> B"8'x93", B"8'x9a" -> B"8'x32", B"8'x9b" -> B"8'x30", B"8'x9c" -> B"8'xF5", B"8'x9d" -> B"8'x8C", B"8'x9e" -> B"8'xB1", B"8'x9f" -> B"8'xE3", B"8'xa0" -> B"8'x1D", B"8'xa1" -> B"8'xF6", B"8'xa2" -> B"8'xE2", B"8'xa3" -> B"8'x2E", B"8'xa4" -> B"8'x82", B"8'xa5" -> B"8'x66", B"8'xa6" -> B"8'xCA", B"8'xa7" -> B"8'x60", B"8'xa8" -> B"8'xC0", B"8'xa9" -> B"8'x29", B"8'xaa" -> B"8'x23", B"8'xab" -> B"8'xAB", B"8'xac" -> B"8'x0D", B"8'xad" -> B"8'x53", B"8'xae" -> B"8'x4E", B"8'xaf" -> B"8'x6F", B"8'xb0" -> B"8'xD5", B"8'xb1" -> B"8'xDB", B"8'xb2" -> B"8'x37", B"8'xb3" -> B"8'x45", B"8'xb4" -> B"8'xDE", B"8'xb5" -> B"8'xFD", B"8'xb6" -> B"8'x8E", B"8'xb7" -> B"8'x2F", B"8'xb8" -> B"8'x03", B"8'xb9" -> B"8'xFF", B"8'xba" -> B"8'x6A", B"8'xbb" -> B"8'x72", B"8'xbc" -> B"8'x6D", B"8'xbd" -> B"8'x6C", B"8'xbe" -> B"8'x5B", B"8'xbf" -> B"8'x51", B"8'xc0" -> B"8'x8D", B"8'xc1" -> B"8'x1B", B"8'xc2" -> B"8'xAF", B"8'xc3" -> B"8'x92", B"8'xc4" -> B"8'xBB", B"8'xc5" -> B"8'xDD", B"8'xc6" -> B"8'xBC", B"8'xc7" -> B"8'x7F", B"8'xc8" -> B"8'x11", B"8'xc9" -> B"8'xD9", B"8'xca" -> B"8'x5C", B"8'xcb" -> B"8'x41", B"8'xcc" -> B"8'x1F", B"8'xcd" -> B"8'x10", B"8'xce" -> B"8'x5A", B"8'xcf" -> B"8'xD8", B"8'xd0" -> B"8'x0A", B"8'xd1" -> B"8'xC1", B"8'xd2" -> B"8'x31", B"8'xd3" -> B"8'x88", B"8'xd4" -> B"8'xA5", B"8'xd5" -> B"8'xCD", B"8'xd6" -> B"8'x7B", B"8'xd7" -> B"8'xBD", B"8'xd8" -> B"8'x2D", B"8'xd9" -> B"8'x74", B"8'xda" -> B"8'xD0", B"8'xdb" -> B"8'x12", B"8'xdc" -> B"8'xB8", B"8'xdd" -> B"8'xE5", B"8'xde" -> B"8'xB4", B"8'xdf" -> B"8'xB0", B"8'xe0" -> B"8'x89", B"8'xe1" -> B"8'x69", B"8'xe2" -> B"8'x97", B"8'xe3" -> B"8'x4A", B"8'xe4" -> B"8'x0C", B"8'xe5" -> B"8'x96", B"8'xe6" -> B"8'x77", B"8'xe7" -> B"8'x7E", B"8'xe8" -> B"8'x65", B"8'xe9" -> B"8'xB9", B"8'xea" -> B"8'xF1", B"8'xeb" -> B"8'x09", B"8'xec" -> B"8'xC5", B"8'xed" -> B"8'x6E", B"8'xee" -> B"8'xC6", B"8'xef" -> B"8'x84", B"8'xf0" -> B"8'x18", B"8'xf1" -> B"8'xF0", B"8'xf2" -> B"8'x7D", B"8'xf3" -> B"8'xEC", B"8'xf4" -> B"8'x3A", B"8'xf5" -> B"8'xDC", B"8'xf6" -> B"8'x4D", B"8'xf7" -> B"8'x20", B"8'xf8" -> B"8'x79", B"8'xf9" -> B"8'xEE", B"8'xfa" -> B"8'x5F", B"8'xfb" -> B"8'x3E", B"8'xfc" -> B"8'xD7", B"8'xfd" -> B"8'xCB", B"8'xfe" -> B"8'x39", B"8'xff" -> B"8'x48" ) r // return value } def fun_sm4ed(rs1:Bits, rs2:Bits, sel: Bits) : Bits = { val idx = (sel).mux( B"2'b00" -> rs2( 7 downto 0), B"2'b01" -> rs2(15 downto 8), B"2'b10" -> rs2(23 downto 16), B"2'b11" -> rs2(31 downto 24) ) val x = fun_sm4sbox_raw(idx) val y = x.resize(32) ^ (x << 8).resize(32) ^ (x << 2).resize(32) ^ (x << 18).resize(32) ^ ((x & B"8'x3F") << 26).resize(32) ^ ((x & B"8'xC0") << 10).resize(32) val r = (sel).mux( B"2'b00" -> y(31 downto 0), B"2'b01" -> y(23 downto 0) ## y(31 downto 24), B"2'b10" -> y(15 downto 0) ## y(31 downto 16), B"2'b11" -> y( 7 downto 0) ## y(31 downto 8) ) rs1 ^ r // return value } def fun_sm4ks(rs1:Bits, rs2:Bits, sel: Bits) : Bits = { val idx = (sel).mux( B"2'b00" -> rs2( 7 downto 0), B"2'b01" -> rs2(15 downto 8), B"2'b10" -> rs2(23 downto 16), B"2'b11" -> rs2(31 downto 24) ) val x = fun_sm4sbox_raw(idx) val y = x.resize(32) ^ ((x & B"8'x07" ) << 29).resize(32) ^ ((x & B"8'xFE" ) << 7).resize(32) ^ ((x & B"8'x01" ) << 23).resize(32) ^ ((x & B"8'xF8" ) << 13).resize(32) val r = (sel).mux( B"2'b00" -> y(31 downto 0), B"2'b01" -> y(23 downto 0) ## y(31 downto 24), B"2'b10" -> y(15 downto 0) ## y(31 downto 16), B"2'b11" -> y( 7 downto 0) ## y(31 downto 8) ) rs1 ^ r // return value } """