// WARNING: this is auto-generated code! // See https://github.com/rdolbeau/VexRiscvBPluginGenerator/ package vexriscv.plugin import spinal.core._ import vexriscv.{Stageable, DecoderService, VexRiscv} object CryptoZknePlugin { object CryptoZkneCtrlaesEnum extends SpinalEnum(binarySequential) { val CTRL_aes32esi, CTRL_aes32esmi = newElement() } object CryptoZkneCtrlEnum extends SpinalEnum(binarySequential) { val CTRL_aes = newElement() } object CryptoZkneCtrlaes extends Stageable(CryptoZkneCtrlaesEnum()) object CryptoZkneCtrl extends Stageable(CryptoZkneCtrlEnum()) // Prologue // massive MUX implementing FT0 def fun_aesft0_raw(in:Bits) : Bits = { val x = in(7 downto 0) val r = (x).mux( B"8'x00" -> B"24'xa563c6", B"8'x01" -> B"24'x847cf8", B"8'x02" -> B"24'x9977ee", B"8'x03" -> B"24'x8d7bf6", B"8'x04" -> B"24'x0df2ff", B"8'x05" -> B"24'xbd6bd6", B"8'x06" -> B"24'xb16fde", B"8'x07" -> B"24'x54c591", B"8'x08" -> B"24'x503060", B"8'x09" -> B"24'x030102", B"8'x0a" -> B"24'xa967ce", B"8'x0b" -> B"24'x7d2b56", B"8'x0c" -> B"24'x19fee7", B"8'x0d" -> B"24'x62d7b5", B"8'x0e" -> B"24'xe6ab4d", B"8'x0f" -> B"24'x9a76ec", B"8'x10" -> B"24'x45ca8f", B"8'x11" -> B"24'x9d821f", B"8'x12" -> B"24'x40c989", B"8'x13" -> B"24'x877dfa", B"8'x14" -> B"24'x15faef", B"8'x15" -> B"24'xeb59b2", B"8'x16" -> B"24'xc9478e", B"8'x17" -> B"24'x0bf0fb", B"8'x18" -> B"24'xecad41", B"8'x19" -> B"24'x67d4b3", B"8'x1a" -> B"24'xfda25f", B"8'x1b" -> B"24'xeaaf45", B"8'x1c" -> B"24'xbf9c23", B"8'x1d" -> B"24'xf7a453", B"8'x1e" -> B"24'x9672e4", B"8'x1f" -> B"24'x5bc09b", B"8'x20" -> B"24'xc2b775", B"8'x21" -> B"24'x1cfde1", B"8'x22" -> B"24'xae933d", B"8'x23" -> B"24'x6a264c", B"8'x24" -> B"24'x5a366c", B"8'x25" -> B"24'x413f7e", B"8'x26" -> B"24'x02f7f5", B"8'x27" -> B"24'x4fcc83", B"8'x28" -> B"24'x5c3468", B"8'x29" -> B"24'xf4a551", B"8'x2a" -> B"24'x34e5d1", B"8'x2b" -> B"24'x08f1f9", B"8'x2c" -> B"24'x9371e2", B"8'x2d" -> B"24'x73d8ab", B"8'x2e" -> B"24'x533162", B"8'x2f" -> B"24'x3f152a", B"8'x30" -> B"24'x0c0408", B"8'x31" -> B"24'x52c795", B"8'x32" -> B"24'x652346", B"8'x33" -> B"24'x5ec39d", B"8'x34" -> B"24'x281830", B"8'x35" -> B"24'xa19637", B"8'x36" -> B"24'x0f050a", B"8'x37" -> B"24'xb59a2f", B"8'x38" -> B"24'x09070e", B"8'x39" -> B"24'x361224", B"8'x3a" -> B"24'x9b801b", B"8'x3b" -> B"24'x3de2df", B"8'x3c" -> B"24'x26ebcd", B"8'x3d" -> B"24'x69274e", B"8'x3e" -> B"24'xcdb27f", B"8'x3f" -> B"24'x9f75ea", B"8'x40" -> B"24'x1b0912", B"8'x41" -> B"24'x9e831d", B"8'x42" -> B"24'x742c58", B"8'x43" -> B"24'x2e1a34", B"8'x44" -> B"24'x2d1b36", B"8'x45" -> B"24'xb26edc", B"8'x46" -> B"24'xee5ab4", B"8'x47" -> B"24'xfba05b", B"8'x48" -> B"24'xf652a4", B"8'x49" -> B"24'x4d3b76", B"8'x4a" -> B"24'x61d6b7", B"8'x4b" -> B"24'xceb37d", B"8'x4c" -> B"24'x7b2952", B"8'x4d" -> B"24'x3ee3dd", B"8'x4e" -> B"24'x712f5e", B"8'x4f" -> B"24'x978413", B"8'x50" -> B"24'xf553a6", B"8'x51" -> B"24'x68d1b9", B"8'x52" -> B"24'x000000", B"8'x53" -> B"24'x2cedc1", B"8'x54" -> B"24'x602040", B"8'x55" -> B"24'x1ffce3", B"8'x56" -> B"24'xc8b179", B"8'x57" -> B"24'xed5bb6", B"8'x58" -> B"24'xbe6ad4", B"8'x59" -> B"24'x46cb8d", B"8'x5a" -> B"24'xd9be67", B"8'x5b" -> B"24'x4b3972", B"8'x5c" -> B"24'xde4a94", B"8'x5d" -> B"24'xd44c98", B"8'x5e" -> B"24'xe858b0", B"8'x5f" -> B"24'x4acf85", B"8'x60" -> B"24'x6bd0bb", B"8'x61" -> B"24'x2aefc5", B"8'x62" -> B"24'xe5aa4f", B"8'x63" -> B"24'x16fbed", B"8'x64" -> B"24'xc54386", B"8'x65" -> B"24'xd74d9a", B"8'x66" -> B"24'x553366", B"8'x67" -> B"24'x948511", B"8'x68" -> B"24'xcf458a", B"8'x69" -> B"24'x10f9e9", B"8'x6a" -> B"24'x060204", B"8'x6b" -> B"24'x817ffe", B"8'x6c" -> B"24'xf050a0", B"8'x6d" -> B"24'x443c78", B"8'x6e" -> B"24'xba9f25", B"8'x6f" -> B"24'xe3a84b", B"8'x70" -> B"24'xf351a2", B"8'x71" -> B"24'xfea35d", B"8'x72" -> B"24'xc04080", B"8'x73" -> B"24'x8a8f05", B"8'x74" -> B"24'xad923f", B"8'x75" -> B"24'xbc9d21", B"8'x76" -> B"24'x483870", B"8'x77" -> B"24'x04f5f1", B"8'x78" -> B"24'xdfbc63", B"8'x79" -> B"24'xc1b677", B"8'x7a" -> B"24'x75daaf", B"8'x7b" -> B"24'x632142", B"8'x7c" -> B"24'x301020", B"8'x7d" -> B"24'x1affe5", B"8'x7e" -> B"24'x0ef3fd", B"8'x7f" -> B"24'x6dd2bf", B"8'x80" -> B"24'x4ccd81", B"8'x81" -> B"24'x140c18", B"8'x82" -> B"24'x351326", B"8'x83" -> B"24'x2fecc3", B"8'x84" -> B"24'xe15fbe", B"8'x85" -> B"24'xa29735", B"8'x86" -> B"24'xcc4488", B"8'x87" -> B"24'x39172e", B"8'x88" -> B"24'x57c493", B"8'x89" -> B"24'xf2a755", B"8'x8a" -> B"24'x827efc", B"8'x8b" -> B"24'x473d7a", B"8'x8c" -> B"24'xac64c8", B"8'x8d" -> B"24'xe75dba", B"8'x8e" -> B"24'x2b1932", B"8'x8f" -> B"24'x9573e6", B"8'x90" -> B"24'xa060c0", B"8'x91" -> B"24'x988119", B"8'x92" -> B"24'xd14f9e", B"8'x93" -> B"24'x7fdca3", B"8'x94" -> B"24'x662244", B"8'x95" -> B"24'x7e2a54", B"8'x96" -> B"24'xab903b", B"8'x97" -> B"24'x83880b", B"8'x98" -> B"24'xca468c", B"8'x99" -> B"24'x29eec7", B"8'x9a" -> B"24'xd3b86b", B"8'x9b" -> B"24'x3c1428", B"8'x9c" -> B"24'x79dea7", B"8'x9d" -> B"24'xe25ebc", B"8'x9e" -> B"24'x1d0b16", B"8'x9f" -> B"24'x76dbad", B"8'xa0" -> B"24'x3be0db", B"8'xa1" -> B"24'x563264", B"8'xa2" -> B"24'x4e3a74", B"8'xa3" -> B"24'x1e0a14", B"8'xa4" -> B"24'xdb4992", B"8'xa5" -> B"24'x0a060c", B"8'xa6" -> B"24'x6c2448", B"8'xa7" -> B"24'xe45cb8", B"8'xa8" -> B"24'x5dc29f", B"8'xa9" -> B"24'x6ed3bd", B"8'xaa" -> B"24'xefac43", B"8'xab" -> B"24'xa662c4", B"8'xac" -> B"24'xa89139", B"8'xad" -> B"24'xa49531", B"8'xae" -> B"24'x37e4d3", B"8'xaf" -> B"24'x8b79f2", B"8'xb0" -> B"24'x32e7d5", B"8'xb1" -> B"24'x43c88b", B"8'xb2" -> B"24'x59376e", B"8'xb3" -> B"24'xb76dda", B"8'xb4" -> B"24'x8c8d01", B"8'xb5" -> B"24'x64d5b1", B"8'xb6" -> B"24'xd24e9c", B"8'xb7" -> B"24'xe0a949", B"8'xb8" -> B"24'xb46cd8", B"8'xb9" -> B"24'xfa56ac", B"8'xba" -> B"24'x07f4f3", B"8'xbb" -> B"24'x25eacf", B"8'xbc" -> B"24'xaf65ca", B"8'xbd" -> B"24'x8e7af4", B"8'xbe" -> B"24'xe9ae47", B"8'xbf" -> B"24'x180810", B"8'xc0" -> B"24'xd5ba6f", B"8'xc1" -> B"24'x8878f0", B"8'xc2" -> B"24'x6f254a", B"8'xc3" -> B"24'x722e5c", B"8'xc4" -> B"24'x241c38", B"8'xc5" -> B"24'xf1a657", B"8'xc6" -> B"24'xc7b473", B"8'xc7" -> B"24'x51c697", B"8'xc8" -> B"24'x23e8cb", B"8'xc9" -> B"24'x7cdda1", B"8'xca" -> B"24'x9c74e8", B"8'xcb" -> B"24'x211f3e", B"8'xcc" -> B"24'xdd4b96", B"8'xcd" -> B"24'xdcbd61", B"8'xce" -> B"24'x868b0d", B"8'xcf" -> B"24'x858a0f", B"8'xd0" -> B"24'x9070e0", B"8'xd1" -> B"24'x423e7c", B"8'xd2" -> B"24'xc4b571", B"8'xd3" -> B"24'xaa66cc", B"8'xd4" -> B"24'xd84890", B"8'xd5" -> B"24'x050306", B"8'xd6" -> B"24'x01f6f7", B"8'xd7" -> B"24'x120e1c", B"8'xd8" -> B"24'xa361c2", B"8'xd9" -> B"24'x5f356a", B"8'xda" -> B"24'xf957ae", B"8'xdb" -> B"24'xd0b969", B"8'xdc" -> B"24'x918617", B"8'xdd" -> B"24'x58c199", B"8'xde" -> B"24'x271d3a", B"8'xdf" -> B"24'xb99e27", B"8'xe0" -> B"24'x38e1d9", B"8'xe1" -> B"24'x13f8eb", B"8'xe2" -> B"24'xb3982b", B"8'xe3" -> B"24'x331122", B"8'xe4" -> B"24'xbb69d2", B"8'xe5" -> B"24'x70d9a9", B"8'xe6" -> B"24'x898e07", B"8'xe7" -> B"24'xa79433", B"8'xe8" -> B"24'xb69b2d", B"8'xe9" -> B"24'x221e3c", B"8'xea" -> B"24'x928715", B"8'xeb" -> B"24'x20e9c9", B"8'xec" -> B"24'x49ce87", B"8'xed" -> B"24'xff55aa", B"8'xee" -> B"24'x782850", B"8'xef" -> B"24'x7adfa5", B"8'xf0" -> B"24'x8f8c03", B"8'xf1" -> B"24'xf8a159", B"8'xf2" -> B"24'x808909", B"8'xf3" -> B"24'x170d1a", B"8'xf4" -> B"24'xdabf65", B"8'xf5" -> B"24'x31e6d7", B"8'xf6" -> B"24'xc64284", B"8'xf7" -> B"24'xb868d0", B"8'xf8" -> B"24'xc34182", B"8'xf9" -> B"24'xb09929", B"8'xfa" -> B"24'x772d5a", B"8'xfb" -> B"24'x110f1e", B"8'xfc" -> B"24'xcbb07b", B"8'xfd" -> B"24'xfc54a8", B"8'xfe" -> B"24'xd6bb6d", B"8'xff" -> B"24'x3a162c") r // return value; } def fun_aes32esmi(rs1: Bits, rs2: Bits, sel: Bits) : Bits = { val idx = (sel).mux( B"2'b00" -> rs1( 7 downto 0), B"2'b01" -> rs1(15 downto 8), B"2'b10" -> rs1(23 downto 16), B"2'b11" -> rs1(31 downto 24) ) val x = fun_aesft0_raw(idx) val r = (sel).mux( B"2'b00" -> x(23 downto 8) ## x(15 downto 0), B"2'b01" -> x(15 downto 8) ## x(15 downto 0) ## x(23 downto 16), B"2'b10" -> x(15 downto 0) ## x(23 downto 8), B"2'b11" -> x( 7 downto 0) ## x(23 downto 8) ## x(15 downto 8) ) r ^ rs2 // return value } // reuse the middle column of FT0 as FSb def fun_aes32esi(rs1: Bits, rs2: Bits, sel: Bits) : Bits = { val idx = (sel).mux( B"2'b00" -> rs1( 7 downto 0), B"2'b01" -> rs1(15 downto 8), B"2'b10" -> rs1(23 downto 16), B"2'b11" -> rs1(31 downto 24) ) val x = fun_aesft0_raw(idx)(15 downto 8) val r = (sel).mux( B"2'b00" -> x.resize(32), B"2'b01" -> (x << 8).resize(32), B"2'b10" -> (x << 16).resize(32), B"2'b11" -> (x << 24).resize(32) ) r ^ rs2 // return value } // even more massive MUX implementing RT0 def fun_aesrt0_raw(in:Bits) : Bits = { val x = in(7 downto 0) val r = (x).mux( B"8'x00" -> B"32'x50a7f451", B"8'x01" -> B"32'x5365417e", B"8'x02" -> B"32'xc3a4171a", B"8'x03" -> B"32'x965e273a", B"8'x04" -> B"32'xcb6bab3b", B"8'x05" -> B"32'xf1459d1f", B"8'x06" -> B"32'xab58faac", B"8'x07" -> B"32'x9303e34b", B"8'x08" -> B"32'x55fa3020", B"8'x09" -> B"32'xf66d76ad", B"8'x0a" -> B"32'x9176cc88", B"8'x0b" -> B"32'x254c02f5", B"8'x0c" -> B"32'xfcd7e54f", B"8'x0d" -> B"32'xd7cb2ac5", B"8'x0e" -> B"32'x80443526", B"8'x0f" -> B"32'x8fa362b5", B"8'x10" -> B"32'x495ab1de", B"8'x11" -> B"32'x671bba25", B"8'x12" -> B"32'x980eea45", B"8'x13" -> B"32'xe1c0fe5d", B"8'x14" -> B"32'x02752fc3", B"8'x15" -> B"32'x12f04c81", B"8'x16" -> B"32'xa397468d", B"8'x17" -> B"32'xc6f9d36b", B"8'x18" -> B"32'xe75f8f03", B"8'x19" -> B"32'x959c9215", B"8'x1a" -> B"32'xeb7a6dbf", B"8'x1b" -> B"32'xda595295", B"8'x1c" -> B"32'x2d83bed4", B"8'x1d" -> B"32'xd3217458", B"8'x1e" -> B"32'x2969e049", B"8'x1f" -> B"32'x44c8c98e", B"8'x20" -> B"32'x6a89c275", B"8'x21" -> B"32'x78798ef4", B"8'x22" -> B"32'x6b3e5899", B"8'x23" -> B"32'xdd71b927", B"8'x24" -> B"32'xb64fe1be", B"8'x25" -> B"32'x17ad88f0", B"8'x26" -> B"32'x66ac20c9", B"8'x27" -> B"32'xb43ace7d", B"8'x28" -> B"32'x184adf63", B"8'x29" -> B"32'x82311ae5", B"8'x2a" -> B"32'x60335197", B"8'x2b" -> B"32'x457f5362", B"8'x2c" -> B"32'xe07764b1", B"8'x2d" -> B"32'x84ae6bbb", B"8'x2e" -> B"32'x1ca081fe", B"8'x2f" -> B"32'x942b08f9", B"8'x30" -> B"32'x58684870", B"8'x31" -> B"32'x19fd458f", B"8'x32" -> B"32'x876cde94", B"8'x33" -> B"32'xb7f87b52", B"8'x34" -> B"32'x23d373ab", B"8'x35" -> B"32'xe2024b72", B"8'x36" -> B"32'x578f1fe3", B"8'x37" -> B"32'x2aab5566", B"8'x38" -> B"32'x0728ebb2", B"8'x39" -> B"32'x03c2b52f", B"8'x3a" -> B"32'x9a7bc586", B"8'x3b" -> B"32'xa50837d3", B"8'x3c" -> B"32'xf2872830", B"8'x3d" -> B"32'xb2a5bf23", B"8'x3e" -> B"32'xba6a0302", B"8'x3f" -> B"32'x5c8216ed", B"8'x40" -> B"32'x2b1ccf8a", B"8'x41" -> B"32'x92b479a7", B"8'x42" -> B"32'xf0f207f3", B"8'x43" -> B"32'xa1e2694e", B"8'x44" -> B"32'xcdf4da65", B"8'x45" -> B"32'xd5be0506", B"8'x46" -> B"32'x1f6234d1", B"8'x47" -> B"32'x8afea6c4", B"8'x48" -> B"32'x9d532e34", B"8'x49" -> B"32'xa055f3a2", B"8'x4a" -> B"32'x32e18a05", B"8'x4b" -> B"32'x75ebf6a4", B"8'x4c" -> B"32'x39ec830b", B"8'x4d" -> B"32'xaaef6040", B"8'x4e" -> B"32'x069f715e", B"8'x4f" -> B"32'x51106ebd", B"8'x50" -> B"32'xf98a213e", B"8'x51" -> B"32'x3d06dd96", B"8'x52" -> B"32'xae053edd", B"8'x53" -> B"32'x46bde64d", B"8'x54" -> B"32'xb58d5491", B"8'x55" -> B"32'x055dc471", B"8'x56" -> B"32'x6fd40604", B"8'x57" -> B"32'xff155060", B"8'x58" -> B"32'x24fb9819", B"8'x59" -> B"32'x97e9bdd6", B"8'x5a" -> B"32'xcc434089", B"8'x5b" -> B"32'x779ed967", B"8'x5c" -> B"32'xbd42e8b0", B"8'x5d" -> B"32'x888b8907", B"8'x5e" -> B"32'x385b19e7", B"8'x5f" -> B"32'xdbeec879", B"8'x60" -> B"32'x470a7ca1", B"8'x61" -> B"32'xe90f427c", B"8'x62" -> B"32'xc91e84f8", B"8'x63" -> B"32'x00000000", B"8'x64" -> B"32'x83868009", B"8'x65" -> B"32'x48ed2b32", B"8'x66" -> B"32'xac70111e", B"8'x67" -> B"32'x4e725a6c", B"8'x68" -> B"32'xfbff0efd", B"8'x69" -> B"32'x5638850f", B"8'x6a" -> B"32'x1ed5ae3d", B"8'x6b" -> B"32'x27392d36", B"8'x6c" -> B"32'x64d90f0a", B"8'x6d" -> B"32'x21a65c68", B"8'x6e" -> B"32'xd1545b9b", B"8'x6f" -> B"32'x3a2e3624", B"8'x70" -> B"32'xb1670a0c", B"8'x71" -> B"32'x0fe75793", B"8'x72" -> B"32'xd296eeb4", B"8'x73" -> B"32'x9e919b1b", B"8'x74" -> B"32'x4fc5c080", B"8'x75" -> B"32'xa220dc61", B"8'x76" -> B"32'x694b775a", B"8'x77" -> B"32'x161a121c", B"8'x78" -> B"32'x0aba93e2", B"8'x79" -> B"32'xe52aa0c0", B"8'x7a" -> B"32'x43e0223c", B"8'x7b" -> B"32'x1d171b12", B"8'x7c" -> B"32'x0b0d090e", B"8'x7d" -> B"32'xadc78bf2", B"8'x7e" -> B"32'xb9a8b62d", B"8'x7f" -> B"32'xc8a91e14", B"8'x80" -> B"32'x8519f157", B"8'x81" -> B"32'x4c0775af", B"8'x82" -> B"32'xbbdd99ee", B"8'x83" -> B"32'xfd607fa3", B"8'x84" -> B"32'x9f2601f7", B"8'x85" -> B"32'xbcf5725c", B"8'x86" -> B"32'xc53b6644", B"8'x87" -> B"32'x347efb5b", B"8'x88" -> B"32'x7629438b", B"8'x89" -> B"32'xdcc623cb", B"8'x8a" -> B"32'x68fcedb6", B"8'x8b" -> B"32'x63f1e4b8", B"8'x8c" -> B"32'xcadc31d7", B"8'x8d" -> B"32'x10856342", B"8'x8e" -> B"32'x40229713", B"8'x8f" -> B"32'x2011c684", B"8'x90" -> B"32'x7d244a85", B"8'x91" -> B"32'xf83dbbd2", B"8'x92" -> B"32'x1132f9ae", B"8'x93" -> B"32'x6da129c7", B"8'x94" -> B"32'x4b2f9e1d", B"8'x95" -> B"32'xf330b2dc", B"8'x96" -> B"32'xec52860d", B"8'x97" -> B"32'xd0e3c177", B"8'x98" -> B"32'x6c16b32b", B"8'x99" -> B"32'x99b970a9", B"8'x9a" -> B"32'xfa489411", B"8'x9b" -> B"32'x2264e947", B"8'x9c" -> B"32'xc48cfca8", B"8'x9d" -> B"32'x1a3ff0a0", B"8'x9e" -> B"32'xd82c7d56", B"8'x9f" -> B"32'xef903322", B"8'xa0" -> B"32'xc74e4987", B"8'xa1" -> B"32'xc1d138d9", B"8'xa2" -> B"32'xfea2ca8c", B"8'xa3" -> B"32'x360bd498", B"8'xa4" -> B"32'xcf81f5a6", B"8'xa5" -> B"32'x28de7aa5", B"8'xa6" -> B"32'x268eb7da", B"8'xa7" -> B"32'xa4bfad3f", B"8'xa8" -> B"32'xe49d3a2c", B"8'xa9" -> B"32'x0d927850", B"8'xaa" -> B"32'x9bcc5f6a", B"8'xab" -> B"32'x62467e54", B"8'xac" -> B"32'xc2138df6", B"8'xad" -> B"32'xe8b8d890", B"8'xae" -> B"32'x5ef7392e", B"8'xaf" -> B"32'xf5afc382", B"8'xb0" -> B"32'xbe805d9f", B"8'xb1" -> B"32'x7c93d069", B"8'xb2" -> B"32'xa92dd56f", B"8'xb3" -> B"32'xb31225cf", B"8'xb4" -> B"32'x3b99acc8", B"8'xb5" -> B"32'xa77d1810", B"8'xb6" -> B"32'x6e639ce8", B"8'xb7" -> B"32'x7bbb3bdb", B"8'xb8" -> B"32'x097826cd", B"8'xb9" -> B"32'xf418596e", B"8'xba" -> B"32'x01b79aec", B"8'xbb" -> B"32'xa89a4f83", B"8'xbc" -> B"32'x656e95e6", B"8'xbd" -> B"32'x7ee6ffaa", B"8'xbe" -> B"32'x08cfbc21", B"8'xbf" -> B"32'xe6e815ef", B"8'xc0" -> B"32'xd99be7ba", B"8'xc1" -> B"32'xce366f4a", B"8'xc2" -> B"32'xd4099fea", B"8'xc3" -> B"32'xd67cb029", B"8'xc4" -> B"32'xafb2a431", B"8'xc5" -> B"32'x31233f2a", B"8'xc6" -> B"32'x3094a5c6", B"8'xc7" -> B"32'xc066a235", B"8'xc8" -> B"32'x37bc4e74", B"8'xc9" -> B"32'xa6ca82fc", B"8'xca" -> B"32'xb0d090e0", B"8'xcb" -> B"32'x15d8a733", B"8'xcc" -> B"32'x4a9804f1", B"8'xcd" -> B"32'xf7daec41", B"8'xce" -> B"32'x0e50cd7f", B"8'xcf" -> B"32'x2ff69117", B"8'xd0" -> B"32'x8dd64d76", B"8'xd1" -> B"32'x4db0ef43", B"8'xd2" -> B"32'x544daacc", B"8'xd3" -> B"32'xdf0496e4", B"8'xd4" -> B"32'xe3b5d19e", B"8'xd5" -> B"32'x1b886a4c", B"8'xd6" -> B"32'xb81f2cc1", B"8'xd7" -> B"32'x7f516546", B"8'xd8" -> B"32'x04ea5e9d", B"8'xd9" -> B"32'x5d358c01", B"8'xda" -> B"32'x737487fa", B"8'xdb" -> B"32'x2e410bfb", B"8'xdc" -> B"32'x5a1d67b3", B"8'xdd" -> B"32'x52d2db92", B"8'xde" -> B"32'x335610e9", B"8'xdf" -> B"32'x1347d66d", B"8'xe0" -> B"32'x8c61d79a", B"8'xe1" -> B"32'x7a0ca137", B"8'xe2" -> B"32'x8e14f859", B"8'xe3" -> B"32'x893c13eb", B"8'xe4" -> B"32'xee27a9ce", B"8'xe5" -> B"32'x35c961b7", B"8'xe6" -> B"32'xede51ce1", B"8'xe7" -> B"32'x3cb1477a", B"8'xe8" -> B"32'x59dfd29c", B"8'xe9" -> B"32'x3f73f255", B"8'xea" -> B"32'x79ce1418", B"8'xeb" -> B"32'xbf37c773", B"8'xec" -> B"32'xeacdf753", B"8'xed" -> B"32'x5baafd5f", B"8'xee" -> B"32'x146f3ddf", B"8'xef" -> B"32'x86db4478", B"8'xf0" -> B"32'x81f3afca", B"8'xf1" -> B"32'x3ec468b9", B"8'xf2" -> B"32'x2c342438", B"8'xf3" -> B"32'x5f40a3c2", B"8'xf4" -> B"32'x72c31d16", B"8'xf5" -> B"32'x0c25e2bc", B"8'xf6" -> B"32'x8b493c28", B"8'xf7" -> B"32'x41950dff", B"8'xf8" -> B"32'x7101a839", B"8'xf9" -> B"32'xdeb30c08", B"8'xfa" -> B"32'x9ce4b4d8", B"8'xfb" -> B"32'x90c15664", B"8'xfc" -> B"32'x6184cb7b", B"8'xfd" -> B"32'x70b632d5", B"8'xfe" -> B"32'x745c6c48", B"8'xff" -> B"32'x4257b8d0" ) r // return value; } def fun_aes32dsmi(rs1: Bits, rs2: Bits, sel: Bits) : Bits = { val idx = (sel).mux( B"2'b00" -> rs1( 7 downto 0), B"2'b01" -> rs1(15 downto 8), B"2'b10" -> rs1(23 downto 16), B"2'b11" -> rs1(31 downto 24) ) val x = fun_aesrt0_raw(idx) val r = (sel).mux( B"2'b00" -> x(31 downto 0), B"2'b01" -> x(23 downto 0) ## x(31 downto 24), B"2'b10" -> x(15 downto 0) ## x(31 downto 16), B"2'b11" -> x( 7 downto 0) ## x(31 downto 8) ) r ^ rs2 // return value } def fun_aesrsb_raw(in:Bits) : Bits = { val x = in(7 downto 0) val r = (x).mux( B"8'x00" -> B"8'x52", B"8'x01" -> B"8'x09", B"8'x02" -> B"8'x6a", B"8'x03" -> B"8'xd5", B"8'x04" -> B"8'x30", B"8'x05" -> B"8'x36", B"8'x06" -> B"8'xa5", B"8'x07" -> B"8'x38", B"8'x08" -> B"8'xbf", B"8'x09" -> B"8'x40", B"8'x0a" -> B"8'xa3", B"8'x0b" -> B"8'x9e", B"8'x0c" -> B"8'x81", B"8'x0d" -> B"8'xf3", B"8'x0e" -> B"8'xd7", B"8'x0f" -> B"8'xfb", B"8'x10" -> B"8'x7c", B"8'x11" -> B"8'xe3", B"8'x12" -> B"8'x39", B"8'x13" -> B"8'x82", B"8'x14" -> B"8'x9b", B"8'x15" -> B"8'x2f", B"8'x16" -> B"8'xff", B"8'x17" -> B"8'x87", B"8'x18" -> B"8'x34", B"8'x19" -> B"8'x8e", B"8'x1a" -> B"8'x43", B"8'x1b" -> B"8'x44", B"8'x1c" -> B"8'xc4", B"8'x1d" -> B"8'xde", B"8'x1e" -> B"8'xe9", B"8'x1f" -> B"8'xcb", B"8'x20" -> B"8'x54", B"8'x21" -> B"8'x7b", B"8'x22" -> B"8'x94", B"8'x23" -> B"8'x32", B"8'x24" -> B"8'xa6", B"8'x25" -> B"8'xc2", B"8'x26" -> B"8'x23", B"8'x27" -> B"8'x3d", B"8'x28" -> B"8'xee", B"8'x29" -> B"8'x4c", B"8'x2a" -> B"8'x95", B"8'x2b" -> B"8'x0b", B"8'x2c" -> B"8'x42", B"8'x2d" -> B"8'xfa", B"8'x2e" -> B"8'xc3", B"8'x2f" -> B"8'x4e", B"8'x30" -> B"8'x08", B"8'x31" -> B"8'x2e", B"8'x32" -> B"8'xa1", B"8'x33" -> B"8'x66", B"8'x34" -> B"8'x28", B"8'x35" -> B"8'xd9", B"8'x36" -> B"8'x24", B"8'x37" -> B"8'xb2", B"8'x38" -> B"8'x76", B"8'x39" -> B"8'x5b", B"8'x3a" -> B"8'xa2", B"8'x3b" -> B"8'x49", B"8'x3c" -> B"8'x6d", B"8'x3d" -> B"8'x8b", B"8'x3e" -> B"8'xd1", B"8'x3f" -> B"8'x25", B"8'x40" -> B"8'x72", B"8'x41" -> B"8'xf8", B"8'x42" -> B"8'xf6", B"8'x43" -> B"8'x64", B"8'x44" -> B"8'x86", B"8'x45" -> B"8'x68", B"8'x46" -> B"8'x98", B"8'x47" -> B"8'x16", B"8'x48" -> B"8'xd4", B"8'x49" -> B"8'xa4", B"8'x4a" -> B"8'x5c", B"8'x4b" -> B"8'xcc", B"8'x4c" -> B"8'x5d", B"8'x4d" -> B"8'x65", B"8'x4e" -> B"8'xb6", B"8'x4f" -> B"8'x92", B"8'x50" -> B"8'x6c", B"8'x51" -> B"8'x70", B"8'x52" -> B"8'x48", B"8'x53" -> B"8'x50", B"8'x54" -> B"8'xfd", B"8'x55" -> B"8'xed", B"8'x56" -> B"8'xb9", B"8'x57" -> B"8'xda", B"8'x58" -> B"8'x5e", B"8'x59" -> B"8'x15", B"8'x5a" -> B"8'x46", B"8'x5b" -> B"8'x57", B"8'x5c" -> B"8'xa7", B"8'x5d" -> B"8'x8d", B"8'x5e" -> B"8'x9d", B"8'x5f" -> B"8'x84", B"8'x60" -> B"8'x90", B"8'x61" -> B"8'xd8", B"8'x62" -> B"8'xab", B"8'x63" -> B"8'x00", B"8'x64" -> B"8'x8c", B"8'x65" -> B"8'xbc", B"8'x66" -> B"8'xd3", B"8'x67" -> B"8'x0a", B"8'x68" -> B"8'xf7", B"8'x69" -> B"8'xe4", B"8'x6a" -> B"8'x58", B"8'x6b" -> B"8'x05", B"8'x6c" -> B"8'xb8", B"8'x6d" -> B"8'xb3", B"8'x6e" -> B"8'x45", B"8'x6f" -> B"8'x06", B"8'x70" -> B"8'xd0", B"8'x71" -> B"8'x2c", B"8'x72" -> B"8'x1e", B"8'x73" -> B"8'x8f", B"8'x74" -> B"8'xca", B"8'x75" -> B"8'x3f", B"8'x76" -> B"8'x0f", B"8'x77" -> B"8'x02", B"8'x78" -> B"8'xc1", B"8'x79" -> B"8'xaf", B"8'x7a" -> B"8'xbd", B"8'x7b" -> B"8'x03", B"8'x7c" -> B"8'x01", B"8'x7d" -> B"8'x13", B"8'x7e" -> B"8'x8a", B"8'x7f" -> B"8'x6b", B"8'x80" -> B"8'x3a", B"8'x81" -> B"8'x91", B"8'x82" -> B"8'x11", B"8'x83" -> B"8'x41", B"8'x84" -> B"8'x4f", B"8'x85" -> B"8'x67", B"8'x86" -> B"8'xdc", B"8'x87" -> B"8'xea", B"8'x88" -> B"8'x97", B"8'x89" -> B"8'xf2", B"8'x8a" -> B"8'xcf", B"8'x8b" -> B"8'xce", B"8'x8c" -> B"8'xf0", B"8'x8d" -> B"8'xb4", B"8'x8e" -> B"8'xe6", B"8'x8f" -> B"8'x73", B"8'x90" -> B"8'x96", B"8'x91" -> B"8'xac", B"8'x92" -> B"8'x74", B"8'x93" -> B"8'x22", B"8'x94" -> B"8'xe7", B"8'x95" -> B"8'xad", B"8'x96" -> B"8'x35", B"8'x97" -> B"8'x85", B"8'x98" -> B"8'xe2", B"8'x99" -> B"8'xf9", B"8'x9a" -> B"8'x37", B"8'x9b" -> B"8'xe8", B"8'x9c" -> B"8'x1c", B"8'x9d" -> B"8'x75", B"8'x9e" -> B"8'xdf", B"8'x9f" -> B"8'x6e", B"8'xa0" -> B"8'x47", B"8'xa1" -> B"8'xf1", B"8'xa2" -> B"8'x1a", B"8'xa3" -> B"8'x71", B"8'xa4" -> B"8'x1d", B"8'xa5" -> B"8'x29", B"8'xa6" -> B"8'xc5", B"8'xa7" -> B"8'x89", B"8'xa8" -> B"8'x6f", B"8'xa9" -> B"8'xb7", B"8'xaa" -> B"8'x62", B"8'xab" -> B"8'x0e", B"8'xac" -> B"8'xaa", B"8'xad" -> B"8'x18", B"8'xae" -> B"8'xbe", B"8'xaf" -> B"8'x1b", B"8'xb0" -> B"8'xfc", B"8'xb1" -> B"8'x56", B"8'xb2" -> B"8'x3e", B"8'xb3" -> B"8'x4b", B"8'xb4" -> B"8'xc6", B"8'xb5" -> B"8'xd2", B"8'xb6" -> B"8'x79", B"8'xb7" -> B"8'x20", B"8'xb8" -> B"8'x9a", B"8'xb9" -> B"8'xdb", B"8'xba" -> B"8'xc0", B"8'xbb" -> B"8'xfe", B"8'xbc" -> B"8'x78", B"8'xbd" -> B"8'xcd", B"8'xbe" -> B"8'x5a", B"8'xbf" -> B"8'xf4", B"8'xc0" -> B"8'x1f", B"8'xc1" -> B"8'xdd", B"8'xc2" -> B"8'xa8", B"8'xc3" -> B"8'x33", B"8'xc4" -> B"8'x88", B"8'xc5" -> B"8'x07", B"8'xc6" -> B"8'xc7", B"8'xc7" -> B"8'x31", B"8'xc8" -> B"8'xb1", B"8'xc9" -> B"8'x12", B"8'xca" -> B"8'x10", B"8'xcb" -> B"8'x59", B"8'xcc" -> B"8'x27", B"8'xcd" -> B"8'x80", B"8'xce" -> B"8'xec", B"8'xcf" -> B"8'x5f", B"8'xd0" -> B"8'x60", B"8'xd1" -> B"8'x51", B"8'xd2" -> B"8'x7f", B"8'xd3" -> B"8'xa9", B"8'xd4" -> B"8'x19", B"8'xd5" -> B"8'xb5", B"8'xd6" -> B"8'x4a", B"8'xd7" -> B"8'x0d", B"8'xd8" -> B"8'x2d", B"8'xd9" -> B"8'xe5", B"8'xda" -> B"8'x7a", B"8'xdb" -> B"8'x9f", B"8'xdc" -> B"8'x93", B"8'xdd" -> B"8'xc9", B"8'xde" -> B"8'x9c", B"8'xdf" -> B"8'xef", B"8'xe0" -> B"8'xa0", B"8'xe1" -> B"8'xe0", B"8'xe2" -> B"8'x3b", B"8'xe3" -> B"8'x4d", B"8'xe4" -> B"8'xae", B"8'xe5" -> B"8'x2a", B"8'xe6" -> B"8'xf5", B"8'xe7" -> B"8'xb0", B"8'xe8" -> B"8'xc8", B"8'xe9" -> B"8'xeb", B"8'xea" -> B"8'xbb", B"8'xeb" -> B"8'x3c", B"8'xec" -> B"8'x83", B"8'xed" -> B"8'x53", B"8'xee" -> B"8'x99", B"8'xef" -> B"8'x61", B"8'xf0" -> B"8'x17", B"8'xf1" -> B"8'x2b", B"8'xf2" -> B"8'x04", B"8'xf3" -> B"8'x7e", B"8'xf4" -> B"8'xba", B"8'xf5" -> B"8'x77", B"8'xf6" -> B"8'xd6", B"8'xf7" -> B"8'x26", B"8'xf8" -> B"8'xe1", B"8'xf9" -> B"8'x69", B"8'xfa" -> B"8'x14", B"8'xfb" -> B"8'x63", B"8'xfc" -> B"8'x55", B"8'xfd" -> B"8'x21", B"8'xfe" -> B"8'x0c", B"8'xff" -> B"8'x7d" ) r // return value } def fun_aes32dsi(rs1: Bits, rs2: Bits, sel: Bits) : Bits = { val idx = (sel).mux( B"2'b00" -> rs1( 7 downto 0), B"2'b01" -> rs1(15 downto 8), B"2'b10" -> rs1(23 downto 16), B"2'b11" -> rs1(31 downto 24) ) val x = fun_aesrsb_raw(idx) val r = (sel).mux( B"2'b00" -> x.resize(32), B"2'b01" -> (x << 8).resize(32), B"2'b10" -> (x << 16).resize(32), B"2'b11" -> (x << 24).resize(32) ) r ^ rs2 // return value } // End prologue } // object Plugin class CryptoZknePlugin(earlyInjection : Boolean = true) extends Plugin[VexRiscv] { import CryptoZknePlugin._ object IS_CryptoZkne extends Stageable(Bool) object CryptoZkne_FINAL_OUTPUT extends Stageable(Bits(32 bits)) override def setup(pipeline: VexRiscv): Unit = { import pipeline.config._ val immediateActions = List[(Stageable[_ <: BaseType],Any)]( SRC1_CTRL -> Src1CtrlEnum.RS, SRC2_CTRL -> Src2CtrlEnum.IMI, REGFILE_WRITE_VALID -> True, BYPASSABLE_EXECUTE_STAGE -> Bool(earlyInjection), BYPASSABLE_MEMORY_STAGE -> True, RS1_USE -> True, IS_CryptoZkne -> True ) val binaryActions = List[(Stageable[_ <: BaseType],Any)]( SRC1_CTRL -> Src1CtrlEnum.RS, SRC2_CTRL -> Src2CtrlEnum.RS, REGFILE_WRITE_VALID -> True, BYPASSABLE_EXECUTE_STAGE -> Bool(earlyInjection), BYPASSABLE_MEMORY_STAGE -> True, RS1_USE -> True, RS2_USE -> True, IS_CryptoZkne -> True ) val unaryActions = List[(Stageable[_ <: BaseType],Any)]( SRC1_CTRL -> Src1CtrlEnum.RS, REGFILE_WRITE_VALID -> True, BYPASSABLE_EXECUTE_STAGE -> Bool(earlyInjection), BYPASSABLE_MEMORY_STAGE -> True, RS1_USE -> True, IS_CryptoZkne -> True ) val ternaryActions = List[(Stageable[_ <: BaseType],Any)]( SRC1_CTRL -> Src1CtrlEnum.RS, SRC2_CTRL -> Src2CtrlEnum.RS, SRC3_CTRL -> Src3CtrlEnum.RS, REGFILE_WRITE_VALID -> True, BYPASSABLE_EXECUTE_STAGE -> Bool(earlyInjection), BYPASSABLE_MEMORY_STAGE -> True, RS1_USE -> True, RS2_USE -> True, RS3_USE -> True, IS_CryptoZkne -> True ) val immTernaryActions = List[(Stageable[_ <: BaseType],Any)]( SRC1_CTRL -> Src1CtrlEnum.RS, SRC2_CTRL -> Src2CtrlEnum.IMI, SRC3_CTRL -> Src3CtrlEnum.RS, REGFILE_WRITE_VALID -> True, BYPASSABLE_EXECUTE_STAGE -> Bool(earlyInjection), BYPASSABLE_MEMORY_STAGE -> True, RS1_USE -> True, RS3_USE -> True, IS_CryptoZkne -> True ) def aes32esmi_KEY = M"--11011----------000-----0110011" def aes32esi_KEY = M"--11001----------000-----0110011" val decoderService = pipeline.service(classOf[DecoderService]) decoderService.addDefault(IS_CryptoZkne, False) decoderService.add(List( aes32esmi_KEY -> (binaryActions ++ List(CryptoZkneCtrl -> CryptoZkneCtrlEnum.CTRL_aes, CryptoZkneCtrlaes -> CryptoZkneCtrlaesEnum.CTRL_aes32esmi)), aes32esi_KEY -> (binaryActions ++ List(CryptoZkneCtrl -> CryptoZkneCtrlEnum.CTRL_aes, CryptoZkneCtrlaes -> CryptoZkneCtrlaesEnum.CTRL_aes32esi)) )) } // override def setup override def build(pipeline: VexRiscv): Unit = { import pipeline._ import pipeline.config._ execute plug new Area{ import execute._ val val_aes = input(CryptoZkneCtrlaes).mux( CryptoZkneCtrlaesEnum.CTRL_aes32esi -> fun_aes32esi(input(SRC2), input(SRC1), input(INSTRUCTION)(31 downto 30)).asBits, CryptoZkneCtrlaesEnum.CTRL_aes32esmi -> fun_aes32esmi(input(SRC2), input(SRC1), input(INSTRUCTION)(31 downto 30)).asBits ) // mux aes insert(CryptoZkne_FINAL_OUTPUT) := val_aes.asBits } // execute plug newArea val injectionStage = if(earlyInjection) execute else memory injectionStage plug new Area { import injectionStage._ when (arbitration.isValid && input(IS_CryptoZkne)) { output(REGFILE_WRITE_DATA) := input(CryptoZkne_FINAL_OUTPUT) } // when input is } // injectionStage plug newArea } // override def build } // class Plugin