Software APIs
device_sim_dv.c
1// Copyright lowRISC contributors (OpenTitan project).
2// Licensed under the Apache License, Version 2.0, see LICENSE for details.
3// SPDX-License-Identifier: Apache-2.0
4
5#include <stdbool.h>
6
7#include "dt/dt_rv_core_ibex.h"
9
10#include "rv_core_ibex_regs.h"
11
12// Use the first dt_rv_core_ibex_t enum, i.e. the first Ibex core instance.
13static const dt_rv_core_ibex_t kRvCoreIbexDt = (dt_rv_core_ibex_t)0;
14static_assert(kDtRvCoreIbexCount == 1, "Only single core tops are supported");
15
16static inline uintptr_t rv_core_ibex_base(void) {
17 return (uintptr_t)dt_rv_core_ibex_primary_reg_block(kRvCoreIbexDt);
18}
19
20/**
21 * Device-specific symbol definitions for the DV simulation device.
22 */
23
25
26// TODO: DV testbench completely randomizes these. Need to add code to
27// retrieve these from a preloaded memory location set by the testbench.
28
29const uint64_t kClockFreqCpuMhz = 100;
30
31const uint64_t kClockFreqCpuHz = kClockFreqCpuMhz * 1000 * 1000;
32
33uint64_t to_cpu_cycles(uint64_t usec) { return usec * kClockFreqCpuMhz; }
34
35const uint64_t kClockFreqHiSpeedPeripheralHz = 96 * 1000 * 1000; // 96MHz
36
37const uint64_t kClockFreqPeripheralHz = 24 * 1000 * 1000; // 24MHz
38
39const uint64_t kClockFreqUsbHz = 48 * 1000 * 1000; // 48MHz
40
41const uint64_t kClockFreqAonHz = 200 * 1000; // 200kHz
42
43const uint64_t kUartBaudrate = 1 * 1000 * 1000; // 1Mbps
44
45const uint32_t kUartNCOValue =
46 CALCULATE_UART_NCO(kUartBaudrate, kClockFreqPeripheralHz);
47
48const uint32_t kUartBaud115K =
49 CALCULATE_UART_NCO(115200, kClockFreqPeripheralHz);
50const uint32_t kUartBaud230K =
51 CALCULATE_UART_NCO(115200 * 2, kClockFreqPeripheralHz);
52const uint32_t kUartBaud460K =
53 CALCULATE_UART_NCO(115200 * 4, kClockFreqPeripheralHz);
54const uint32_t kUartBaud921K =
55 CALCULATE_UART_NCO(115200 * 8, kClockFreqPeripheralHz);
56const uint32_t kUartBaud1M33 =
57 CALCULATE_UART_NCO(1333333, kClockFreqPeripheralHz);
58const uint32_t kUartBaud1M50 =
59 CALCULATE_UART_NCO(1500000, kClockFreqPeripheralHz);
60
61const uint32_t kAstCheckPollCpuCycles =
63
64uintptr_t device_test_status_address(void) {
65 return rv_core_ibex_base() + RV_CORE_IBEX_DV_SIM_WINDOW_REG_OFFSET;
66}
67
68uintptr_t device_log_bypass_uart_address(void) {
69 return rv_core_ibex_base() + RV_CORE_IBEX_DV_SIM_WINDOW_REG_OFFSET + 0x04;
70}