blob: 5a7cd9afb3979094929e481d2664c1fec33d8e29 [file] [log] [blame]
// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0
{ name: "otbn"
clock_primary: "clk_i"
bus_device: "tlul"
bus_host: "none"
interrupt_list: [
{ name: "done"
desc: "OTBN has completed the operation"
}
{ name: "err"
desc: "An error occurred. Read the ERR_CODE register for error details."
}
]
alert_list: [
{ name: "imem_uncorrectable"
desc: "Uncorrectable error in the instruction memory detected."
}
{ name: "dmem_uncorrectable"
desc: "Uncorrectable error in the data memory detected."
}
{ name: "reg_uncorrectable"
desc: "Uncorrectable error in one of the register files detected."
}
]
inter_signal_list: [
// TODO: CSRNG isn't committed yet, depends on assumed interface done for
// AES in https://github.com/lowRISC/opentitan/pull/2140.
/*{ name: "entropy",
type: "req_rsp",
act: "req",
package: "csrng_pkg",
struct: "csrng_entropy",
width: "1"
},*/
// OTBN is not performing any operation and can be clock/power-gated.
{ name: "idle",
type: "uni",
struct: "logic",
width: "1",
act: "req",
},
],
regwidth: "32"
registers: [
{ name: "CMD"
desc: "command register",
swaccess: "r0w1c",
hwaccess: "hro",
hwext: "true",
hwqe: "true",
fields: [
{ bits: "0"
name: "start"
desc: '''
Start the operation
The completion is signalled by the done interrupt.
'''
tags: [// Do not randomly start big num operations
"excl:CsrNonInitTests:CsrExclWrite"],
}
{ bits: "1",
name: "dummy",
desc: '''
Reggen doesn't generate sub-fields with only a single field
specified; instead, the whole register is taken as a field, leading
to signals like `hw2reg.status.d` instead of
`hw2reg.status.start.d`. Since we expect to add more commands later,
we force the generation of fields with this dummy field for now.
'''
}
],
}
{ name: "STATUS",
desc: "Status",
swaccess: "ro",
hwaccess: "hwo",
hwext: "true",
fields: [
{ bits: "0",
name: "busy",
desc: "OTBN is performing an operation."
}
{ bits: "1",
name: "dummy",
desc: '''
See !!CMD.dummy for details.
'''
}
]
} // register : status
{ name: "ERR_CODE",
desc: "Error Code",
swaccess: "ro",
hwaccess: "hwo",
fields: [
{ bits: "31:0",
name: "err_code",
desc: '''
The error cause if an error occurred.
TODO: Define error codes.
Software should read this register before clearing the err
interrupt to avoid race conditions.
'''
}
]
} // register : err_code
{ name: "START_ADDR",
desc: "Start byte address in the instruction memory",
swaccess: "wo",
hwaccess: "hro",
fields: [
{ bits: "31:0",
name: "start_addr",
resval: 0,
desc: '''
Byte address in the instruction memory OTBN starts to execute from
when instructed to do so with the !!CMD.start .
'''
}
]
} // register : start_addr
// Give IMEM and DMEM 1 MB address space, each, to allow for easy expansion
// of the actual IMEM and DMEM sizes without changing the address map.
{ skipto: "0x100000" }
{ window: {
name: "IMEM"
items: "1024" // 4 kB
swaccess: "rw",
byte-write: "false",
desc: '''
Instruction Memory.
Not accessible during the operation of the engine.
TODO: Discuss and document behavior in that case. Alert? Ignore?
'''
}
}
{ skipto: "0x200000" }
{ window: {
name: "DMEM"
items: "1024" // 4 kB
swaccess: "rw",
byte-write: "false",
desc: '''
Data Memory.
Not accessible during the operation of the engine.
TODO: Discuss and document behavior in that case. Alert? Ignore?
'''
}
}
]
}