blob: 6b17270cb4a6ff35d1589f40691ce89e6e8f6bd5 [file] [log] [blame]
// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0
//
# AES register template
{
name: "aes",
clock_primary: "clk_i",
bus_device: "tlul",
regwidth: "32",
param_list: [
{ name: "NumRegsKey",
type: "int",
default: "8",
desc: "Number registers for key",
local: "true"
},
{ name: "NumRegsData",
type: "int",
default: "4",
desc: "Number registers for input and output data",
local: "true"
}
],
registers: [
##############################################################################
# initial key registers
{ multireg: {
name: "KEY",
desc: '''
Initial Key Registers.
Loaded into the internal Full Key register upon starting encryption/decryption of the next block.
All key registers must be written at least once when the key is changed, regardless of key length (write 0 for unusued bits).
The order in which the registers are updated does not matter.
Can only be updated when the AES unit is idle.
If the AES unit is non-idle, writes to these registers are ignored.
'''
count: "NumRegsKey",
cname: "KEY",
swaccess: "wo",
hwaccess: "hrw",
hwext: "true",
hwqe: "true",
fields: [
{ bits: "31:0", name: "key", desc: "Initial Key" }
],
}
},
##############################################################################
# input data registers
{ multireg: {
name: "DATA_IN",
desc: '''
Input Data Registers.
If MANUAL_OPERATION=0 (see Control Register), the AES unit automatically starts encryption/decryption after these register have been written.
Each register has to be written at least once.
The order in which the registers are written does not matter.
Loaded into the internal State register upon starting encryption/decryption of the next block.
After that, the processor can update the Input Data Register.
'''
count: "NumRegsData",
cname: "DATA_IN",
swaccess: "wo",
hwaccess: "hrw",
hwqe: "true",
fields: [
{ bits: "31:0", name: "data_in", desc: "Input Data" }
],
}
},
##############################################################################
# output data registers
{ multireg: {
name: "DATA_OUT",
desc: '''
Output Data Register.
Holds the output data produced by the AES unit during the last encryption/decryption operation.
If MANUAL_OPERATION=0 (see Control Register), the AES unit is stalled when the previous output data has not yet been read and is about to be overwritten.
Each register has to be read at least once.
The order in which the registers are read does not matter.
'''
count: "NumRegsData",
cname: "DATA_OUT",
swaccess: "ro",
hwaccess: "hrw",
hwext: "true",
hwre: "true",
fields: [
{ bits: "31:0", name: "data_out", desc: "Output Data" }
],
}
},
##############################################################################
# control and status registers
{ name: "CTRL",
desc: '''
Control Register. Can only be updated when the AES unit is idle. If the
AES unit is non-idle, writes to this register are ignored.
'''
swaccess: "rw",
hwaccess: "hrw",
hwext: "true",
hwqe: "true",
fields: [
{ bits: "0",
name: "OPERATION",
desc: '''
Select encryption(0) or decryption(1) operation of AES unit.
'''
}
{ bits: "3:1",
name: "KEY_LEN",
resval: "1",
hwaccess: "hrw",
desc: '''
3-bit one-hot field to select AES key length: 128 bit (3'b001), 192 bit (3'b010)
or 256 bit (3'b100). Invalid input values, i.e., value with multiple bits set,
value 3'b000, and value 3'b010 in case 192-bit keys are not supported (because
disabled at compile time) are mapped to 3'b001.
'''
}
{ bits: "4",
name: "MANUAL_OPERATION",
desc: '''
Controls whether the AES unit is operated in normal/automatic mode (0) or fully manual mode (1).
In automatic mode (0), the AES unit automatically i) starts to encrypt/decrypt when it receives new input data, and ii) stalls during the last encryption/decryption cycle if the previous output data has not yet been read.
This is the most efficient mode to operate in.
In manual mode (1), the AES unit i) only starts to encrypt/decrypt after receiving a start trigger (see Trigger Register), and ii) overwrites previous output data irrespective of whether it has been read out or not.
This mode is useful if software needs full control over the AES unit.
'''
}
]
},
{ name: "TRIGGER",
desc: '''
Trigger Register.
Each bit is individually cleared to 0 when executing the corresponding trigger.
'''
swaccess: "wo",
hwaccess: "hrw",
fields: [
{ bits: "0",
name: "START",
desc: '''
Keep AES unit paused (0) or trigger the encryption/decryption of one data block (1).
This trigger is ignored if MANUAL_OPERATION=0 (see Control Register).
'''
}
{ bits: "1",
name: "KEY_CLEAR",
desc: '''
Keep current values in Initial Key, internal Full Key and Decryption Key registers (0)
or clear those registers (1).
'''
}
{ bits: "2",
name: "DATA_IN_CLEAR",
desc: '''
Keep current values in input registers (0) or clear those registers (1).
'''
}
{ bits: "3",
name: "DATA_OUT_CLEAR",
desc: '''
Keep current values in output registers (0) or clear those registers (1).
'''
}
]
},
{ name: "STATUS",
desc: "Status Register",
swaccess: "ro",
hwaccess: "hwo",
fields: [
{ bits: "0",
name: "IDLE",
resval: "1",
desc: '''
The AES unit is idle (1) or busy (0).
'''
}
{ bits: "1",
name: "STALL",
desc: '''
The AES unit is not stalled (0) or stalled (1) because there is previous
output data that must be read by the processor before the AES unit can
overwrite this data.
'''
}
{ bits: "2",
name: "OUTPUT_VALID",
desc: '''
The AES unit has no valid output (0) or has valid output data (1).
'''
}
{ bits: "3",
name: "INPUT_READY",
resval: "1",
desc: '''
The AES unit is ready (1) to receive new data input via the DATA_IN registers or
the present values in the DATA_IN registers have not yet been loaded into the
module (0).
'''
}
]
},
],
}