blob: 3c4c484877ad63c194ef32b3ef3472843f8df3a0 [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"
param_list: [
{ name: "RegFile",
type: "otbn_pkg::regfile_e",
default: "otbn_pkg::RegFileFF",
desc: "Selection of the register file implementation. See otbn_pkg.sv."
local: "false",
expose: "true"
}
]
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.
Software should read this register before clearing the err
interrupt to avoid race conditions.
Possible values:
- 0x0 (ErrCodeNoError): No error occurred.
- 0x1 (ErrCodeBadDataAddr): Load or store to invalid address
'''
}
]
} // 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?
'''
}
}
]
}