aes32d*, Zknd

This commit is contained in:
Romain Dolbeau 2021-02-16 12:57:24 -05:00
parent e1513ee5cf
commit 051a96c2fa
5 changed files with 2237 additions and 52 deletions

1006
CryptoZknd.scala Normal file

File diff suppressed because it is too large Load diff

View file

@ -19,7 +19,7 @@ object CryptoZknePlugin {
// Prologue
// massive MUX implementing FT0
def fun_aes_raw(in:Bits) : Bits = {
def fun_aesft0_raw(in:Bits) : Bits = {
val x = in(7 downto 0)
val r = (x).mux(
B"8'x00" -> B"24'xa563c6",
@ -281,48 +281,619 @@ object CryptoZknePlugin {
r // return value;
}
def fun_aesx_0(rs1: Bits, rs2: Bits) : Bits = {
def fun_aes32esmi0(rs1: Bits, rs2: Bits) : Bits = {
val idx = rs1(7 downto 0)
val r = fun_aes_raw(idx)
val r = fun_aesft0_raw(idx)
(r(23 downto 8) ## r(15 downto 0)) ^ rs2 // return value
}
def fun_aesx_1(rs1: Bits, rs2: Bits) : Bits = {
def fun_aes32esmi1(rs1: Bits, rs2: Bits) : Bits = {
val idx = rs1(15 downto 8)
val r = fun_aes_raw(idx)
val r = fun_aesft0_raw(idx)
(r(15 downto 8) ## r(15 downto 0) ## r(23 downto 16)) ^ rs2 // return value
}
def fun_aesx_2(rs1: Bits, rs2: Bits) : Bits = {
def fun_aes32esmi2(rs1: Bits, rs2: Bits) : Bits = {
val idx = rs1(23 downto 16)
val r = fun_aes_raw(idx)
val r = fun_aesft0_raw(idx)
(r(15 downto 0) ## r(23 downto 8)) ^ rs2 // return value
}
def fun_aesx_3(rs1: Bits, rs2: Bits) : Bits = {
def fun_aes32esmi3(rs1: Bits, rs2: Bits) : Bits = {
val idx = rs1(31 downto 24)
val r = fun_aes_raw(idx)
val r = fun_aesft0_raw(idx)
(r(7 downto 0) ## r(23 downto 8) ## r(15 downto 8)) ^ rs2 // return value
}
def fun_aesxnm_0(rs1: Bits, rs2: Bits) : Bits = {
// reuse the middle column of FT0 as FSb
def fun_aes32esi0(rs1: Bits, rs2: Bits) : Bits = {
val idx = rs1(7 downto 0)
val r = fun_aes_raw(idx)
val r = fun_aesft0_raw(idx)
(r(15 downto 8).resize(32) ) ^ rs2 // return value
}
def fun_aesxnm_1(rs1: Bits, rs2: Bits) : Bits = {
def fun_aes32esi1(rs1: Bits, rs2: Bits) : Bits = {
val idx = rs1(15 downto 8)
val r = fun_aes_raw(idx)
val r = fun_aesft0_raw(idx)
(r(15 downto 8).resize(32) |<< 8) ^ rs2 // return value
}
def fun_aesxnm_2(rs1: Bits, rs2: Bits) : Bits = {
def fun_aes32esi2(rs1: Bits, rs2: Bits) : Bits = {
val idx = rs1(23 downto 16)
val r = fun_aes_raw(idx)
val r = fun_aesft0_raw(idx)
(r(15 downto 8).resize(32) |<< 16) ^ rs2 // return value
}
def fun_aesxnm_3(rs1: Bits, rs2: Bits) : Bits = {
def fun_aes32esi3(rs1: Bits, rs2: Bits) : Bits = {
val idx = rs1(31 downto 24)
val r = fun_aes_raw(idx)
val r = fun_aesft0_raw(idx)
(r(15 downto 8).resize(32) |<< 24) ^ 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_aes32dsmi0(rs1: Bits, rs2: Bits) : Bits = {
val idx = rs1(7 downto 0)
val r = fun_aesrt0_raw(idx)
r(31 downto 0) ^ rs2 // return value
}
def fun_aes32dsmi1(rs1: Bits, rs2: Bits) : Bits = {
val idx = rs1(15 downto 8)
val r = fun_aesrt0_raw(idx)
(r(23 downto 0) ## r(31 downto 24)) ^ rs2 // return value
}
def fun_aes32dsmi2(rs1: Bits, rs2: Bits) : Bits = {
val idx = rs1(23 downto 16)
val r = fun_aesrt0_raw(idx)
(r(15 downto 0) ## r(31 downto 16)) ^ rs2 // return value
}
def fun_aes32dsmi3(rs1: Bits, rs2: Bits) : Bits = {
val idx = rs1(31 downto 24)
val r = fun_aesrt0_raw(idx)
(r(7 downto 0) ## r(31 downto 8)) ^ 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_aes32dsi0(rs1: Bits, rs2: Bits) : Bits = {
val idx = rs1(7 downto 0)
val r = fun_aesrsb_raw(idx)
(r.resize(32) ) ^ rs2 // return value
}
def fun_aes32dsi1(rs1: Bits, rs2: Bits) : Bits = {
val idx = rs1(15 downto 8)
val r = fun_aesrsb_raw(idx)
(r.resize(32) |<< 8) ^ rs2 // return value
}
def fun_aes32dsi2(rs1: Bits, rs2: Bits) : Bits = {
val idx = rs1(23 downto 16)
val r = fun_aesrsb_raw(idx)
(r.resize(32) |<< 16) ^ rs2 // return value
}
def fun_aes32dsi3(rs1: Bits, rs2: Bits) : Bits = {
val idx = rs1(31 downto 24)
val r = fun_aesrsb_raw(idx)
(r.resize(32) |<< 24) ^ rs2 // return value
}
// End prologue
} // object Plugin
class CryptoZknePlugin(earlyInjection : Boolean = true) extends Plugin[VexRiscv] {
@ -408,16 +979,16 @@ class CryptoZknePlugin(earlyInjection : Boolean = true) extends Plugin[VexRiscv]
execute plug new Area{
import execute._
val val_aes0 = input(CryptoZkneCtrlaes0).mux(
CryptoZkneCtrlaes0Enum.CTRL_aes32esmi0 -> fun_aesx_0(input(SRC2), input(SRC1)).asBits,
CryptoZkneCtrlaes0Enum.CTRL_aes32esmi1 -> fun_aesx_1(input(SRC2), input(SRC1)).asBits,
CryptoZkneCtrlaes0Enum.CTRL_aes32esmi2 -> fun_aesx_2(input(SRC2), input(SRC1)).asBits,
CryptoZkneCtrlaes0Enum.CTRL_aes32esmi3 -> fun_aesx_3(input(SRC2), input(SRC1)).asBits
CryptoZkneCtrlaes0Enum.CTRL_aes32esmi0 -> fun_aes32esmi0(input(SRC2), input(SRC1)).asBits,
CryptoZkneCtrlaes0Enum.CTRL_aes32esmi1 -> fun_aes32esmi1(input(SRC2), input(SRC1)).asBits,
CryptoZkneCtrlaes0Enum.CTRL_aes32esmi2 -> fun_aes32esmi2(input(SRC2), input(SRC1)).asBits,
CryptoZkneCtrlaes0Enum.CTRL_aes32esmi3 -> fun_aes32esmi3(input(SRC2), input(SRC1)).asBits
) // mux aes0
val val_aes1 = input(CryptoZkneCtrlaes1).mux(
CryptoZkneCtrlaes1Enum.CTRL_aes32esi0 -> fun_aesxnm_0(input(SRC2), input(SRC1)).asBits,
CryptoZkneCtrlaes1Enum.CTRL_aes32esi1 -> fun_aesxnm_1(input(SRC2), input(SRC1)).asBits,
CryptoZkneCtrlaes1Enum.CTRL_aes32esi2 -> fun_aesxnm_2(input(SRC2), input(SRC1)).asBits,
CryptoZkneCtrlaes1Enum.CTRL_aes32esi3 -> fun_aesxnm_3(input(SRC2), input(SRC1)).asBits
CryptoZkneCtrlaes1Enum.CTRL_aes32esi0 -> fun_aes32esi0(input(SRC2), input(SRC1)).asBits,
CryptoZkneCtrlaes1Enum.CTRL_aes32esi1 -> fun_aes32esi1(input(SRC2), input(SRC1)).asBits,
CryptoZkneCtrlaes1Enum.CTRL_aes32esi2 -> fun_aes32esi2(input(SRC2), input(SRC1)).asBits,
CryptoZkneCtrlaes1Enum.CTRL_aes32esi3 -> fun_aes32esi3(input(SRC2), input(SRC1)).asBits
) // mux aes1
insert(CryptoZkne_FINAL_OUTPUT) := input(CryptoZkneCtrl).mux(
CryptoZkneCtrlEnum.CTRL_aes0 -> val_aes0.asBits,

View file

@ -86,12 +86,15 @@ CryptoZkb.scala: gen_plugin data_bitmanip.txt data_bitmanip_ZbbOnly.txt
## CryptoZkg doesn't require clmulr, so not 100% the same as Zbc
CryptoZkg.scala: gen_plugin data_clmul.txt
./gen_plugin -n CryptoZkg -i data_clmul.txt -I clmul -I clmulh >| $@
./gen_plugin -n CryptoZkg -i data_clmul.txt -I CLMUL -I CLMULH >| $@
## Full Zkn not there yet, missing Zknd (AES decode)
CryptoZknd.scala: gen_plugin data_aes.txt
./gen_plugin -n CryptoZknd -i data_aes.txt -I Zknd >| $@
CryptoZkne.scala: gen_plugin data_aes.txt
./gen_plugin -n CryptoZkne -i data_aes.txt -I '*' >| $@
./gen_plugin -n CryptoZkne -i data_aes.txt -I Zkne >| $@
CryptoZknh.scala: gen_plugin data_sha.txt
./gen_plugin -n CryptoZknh -i data_sha.txt -I '*' >| $@

View file

@ -16,18 +16,36 @@ I aes32esi1 aes32esi1 0111001----------000000000110011 aes1 Zkne
I aes32esi2 aes32esi2 1011001----------000000000110011 aes1 Zkne
I aes32esi3 aes32esi3 1111001----------000000000110011 aes1 Zkne
S aes32esmi0 "fun_aesx_0(input(SRC2), input(SRC1))"
S aes32esmi1 "fun_aesx_1(input(SRC2), input(SRC1))"
S aes32esmi2 "fun_aesx_2(input(SRC2), input(SRC1))"
S aes32esmi3 "fun_aesx_3(input(SRC2), input(SRC1))"
S aes32esi0 "fun_aesxnm_0(input(SRC2), input(SRC1))"
S aes32esi1 "fun_aesxnm_1(input(SRC2), input(SRC1))"
S aes32esi2 "fun_aesxnm_2(input(SRC2), input(SRC1))"
S aes32esi3 "fun_aesxnm_3(input(SRC2), input(SRC1))"
I aes32dsmi0 aes32dsmi0 0011111----------000000000110011 aes0 Zknd
I aes32dsmi1 aes32dsmi1 0111111----------000000000110011 aes0 Zknd
I aes32dsmi2 aes32dsmi2 1011111----------000000000110011 aes0 Zknd
I aes32dsmi3 aes32dsmi3 1111111----------000000000110011 aes0 Zknd
I aes32dsi0 aes32dsi0 0011101----------000000000110011 aes1 Zknd
I aes32dsi1 aes32dsi1 0111101----------000000000110011 aes1 Zknd
I aes32dsi2 aes32dsi2 1011101----------000000000110011 aes1 Zknd
I aes32dsi3 aes32dsi3 1111101----------000000000110011 aes1 Zknd
S aes32esmi0 "fun_aes32esmi0(input(SRC2), input(SRC1))"
S aes32esmi1 "fun_aes32esmi1(input(SRC2), input(SRC1))"
S aes32esmi2 "fun_aes32esmi2(input(SRC2), input(SRC1))"
S aes32esmi3 "fun_aes32esmi3(input(SRC2), input(SRC1))"
S aes32esi0 "fun_aes32esi0(input(SRC2), input(SRC1))"
S aes32esi1 "fun_aes32esi1(input(SRC2), input(SRC1))"
S aes32esi2 "fun_aes32esi2(input(SRC2), input(SRC1))"
S aes32esi3 "fun_aes32esi3(input(SRC2), input(SRC1))"
S aes32dsmi0 "fun_aes32dsmi0(input(SRC2), input(SRC1))"
S aes32dsmi1 "fun_aes32dsmi1(input(SRC2), input(SRC1))"
S aes32dsmi2 "fun_aes32dsmi2(input(SRC2), input(SRC1))"
S aes32dsmi3 "fun_aes32dsmi3(input(SRC2), input(SRC1))"
S aes32dsi0 "fun_aes32dsi0(input(SRC2), input(SRC1))"
S aes32dsi1 "fun_aes32dsi1(input(SRC2), input(SRC1))"
S aes32dsi2 "fun_aes32dsi2(input(SRC2), input(SRC1))"
S aes32dsi3 "fun_aes32dsi3(input(SRC2), input(SRC1))"
P """
// massive MUX implementing FT0
def fun_aes_raw(in:Bits) : Bits = {
def fun_aesft0_raw(in:Bits) : Bits = {
val x = in(7 downto 0)
val r = (x).mux(
B"8'x00" -> B"24'xa563c6",
@ -289,45 +307,616 @@ P """
r // return value;
}
def fun_aesx_0(rs1: Bits, rs2: Bits) : Bits = {
def fun_aes32esmi0(rs1: Bits, rs2: Bits) : Bits = {
val idx = rs1(7 downto 0)
val r = fun_aes_raw(idx)
val r = fun_aesft0_raw(idx)
(r(23 downto 8) ## r(15 downto 0)) ^ rs2 // return value
}
def fun_aesx_1(rs1: Bits, rs2: Bits) : Bits = {
def fun_aes32esmi1(rs1: Bits, rs2: Bits) : Bits = {
val idx = rs1(15 downto 8)
val r = fun_aes_raw(idx)
val r = fun_aesft0_raw(idx)
(r(15 downto 8) ## r(15 downto 0) ## r(23 downto 16)) ^ rs2 // return value
}
def fun_aesx_2(rs1: Bits, rs2: Bits) : Bits = {
def fun_aes32esmi2(rs1: Bits, rs2: Bits) : Bits = {
val idx = rs1(23 downto 16)
val r = fun_aes_raw(idx)
val r = fun_aesft0_raw(idx)
(r(15 downto 0) ## r(23 downto 8)) ^ rs2 // return value
}
def fun_aesx_3(rs1: Bits, rs2: Bits) : Bits = {
def fun_aes32esmi3(rs1: Bits, rs2: Bits) : Bits = {
val idx = rs1(31 downto 24)
val r = fun_aes_raw(idx)
val r = fun_aesft0_raw(idx)
(r(7 downto 0) ## r(23 downto 8) ## r(15 downto 8)) ^ rs2 // return value
}
def fun_aesxnm_0(rs1: Bits, rs2: Bits) : Bits = {
// reuse the middle column of FT0 as FSb
def fun_aes32esi0(rs1: Bits, rs2: Bits) : Bits = {
val idx = rs1(7 downto 0)
val r = fun_aes_raw(idx)
val r = fun_aesft0_raw(idx)
(r(15 downto 8).resize(32) ) ^ rs2 // return value
}
def fun_aesxnm_1(rs1: Bits, rs2: Bits) : Bits = {
def fun_aes32esi1(rs1: Bits, rs2: Bits) : Bits = {
val idx = rs1(15 downto 8)
val r = fun_aes_raw(idx)
val r = fun_aesft0_raw(idx)
(r(15 downto 8).resize(32) |<< 8) ^ rs2 // return value
}
def fun_aesxnm_2(rs1: Bits, rs2: Bits) : Bits = {
def fun_aes32esi2(rs1: Bits, rs2: Bits) : Bits = {
val idx = rs1(23 downto 16)
val r = fun_aes_raw(idx)
val r = fun_aesft0_raw(idx)
(r(15 downto 8).resize(32) |<< 16) ^ rs2 // return value
}
def fun_aesxnm_3(rs1: Bits, rs2: Bits) : Bits = {
def fun_aes32esi3(rs1: Bits, rs2: Bits) : Bits = {
val idx = rs1(31 downto 24)
val r = fun_aes_raw(idx)
val r = fun_aesft0_raw(idx)
(r(15 downto 8).resize(32) |<< 24) ^ 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_aes32dsmi0(rs1: Bits, rs2: Bits) : Bits = {
val idx = rs1(7 downto 0)
val r = fun_aesrt0_raw(idx)
r(31 downto 0) ^ rs2 // return value
}
def fun_aes32dsmi1(rs1: Bits, rs2: Bits) : Bits = {
val idx = rs1(15 downto 8)
val r = fun_aesrt0_raw(idx)
(r(23 downto 0) ## r(31 downto 24)) ^ rs2 // return value
}
def fun_aes32dsmi2(rs1: Bits, rs2: Bits) : Bits = {
val idx = rs1(23 downto 16)
val r = fun_aesrt0_raw(idx)
(r(15 downto 0) ## r(31 downto 16)) ^ rs2 // return value
}
def fun_aes32dsmi3(rs1: Bits, rs2: Bits) : Bits = {
val idx = rs1(31 downto 24)
val r = fun_aesrt0_raw(idx)
(r(7 downto 0) ## r(31 downto 8)) ^ 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_aes32dsi0(rs1: Bits, rs2: Bits) : Bits = {
val idx = rs1(7 downto 0)
val r = fun_aesrsb_raw(idx)
(r.resize(32) ) ^ rs2 // return value
}
def fun_aes32dsi1(rs1: Bits, rs2: Bits) : Bits = {
val idx = rs1(15 downto 8)
val r = fun_aesrsb_raw(idx)
(r.resize(32) |<< 8) ^ rs2 // return value
}
def fun_aes32dsi2(rs1: Bits, rs2: Bits) : Bits = {
val idx = rs1(23 downto 16)
val r = fun_aesrsb_raw(idx)
(r.resize(32) |<< 16) ^ rs2 // return value
}
def fun_aes32dsi3(rs1: Bits, rs2: Bits) : Bits = {
val idx = rs1(31 downto 24)
val r = fun_aesrsb_raw(idx)
(r.resize(32) |<< 24) ^ rs2 // return value
}
"""

View file

@ -19,6 +19,22 @@ FUN2F(aes32esi0,AES32ESI0)
FUN2F(aes32esi1,AES32ESI1)
FUN2F(aes32esi2,AES32ESI2)
FUN2F(aes32esi3,AES32ESI3)
ASM2FMACRO(AES32DSMI0,0x3e000033)
ASM2FMACRO(AES32DSMI1,0x7e000033)
ASM2FMACRO(AES32DSMI2,0xbe000033)
ASM2FMACRO(AES32DSMI3,0xfe000033)
ASM2FMACRO(AES32DSI0,0x3a000033)
ASM2FMACRO(AES32DSI1,0x7a000033)
ASM2FMACRO(AES32DSI2,0xba000033)
ASM2FMACRO(AES32DSI3,0xfa000033)
FUN2F(aes32dsmi0,AES32DSMI0)
FUN2F(aes32dsmi1,AES32DSMI1)
FUN2F(aes32dsmi2,AES32DSMI2)
FUN2F(aes32dsmi3,AES32DSMI3)
FUN2F(aes32dsi0,AES32DSI0)
FUN2F(aes32dsi1,AES32DSI1)
FUN2F(aes32dsi2,AES32DSI2)
FUN2F(aes32dsi3,AES32DSI3)
ASM1MACRO(SHA256SIG0,0x10201013)
ASM1MACRO(SHA256SIG1,0x10301013)