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 #include "uart_regs.h"
12 
13 // Use the first dt_rv_core_ibex_t enum, i.e. the first Ibex core instance.
14 static const dt_rv_core_ibex_t kRvCoreIbexDt = (dt_rv_core_ibex_t)0;
15 static_assert(kDtRvCoreIbexCount == 1, "Only single core tops are supported");
16 
17 static inline uintptr_t rv_core_ibex_base(void) {
18  return (uintptr_t)dt_rv_core_ibex_primary_reg_block(kRvCoreIbexDt);
19 }
20 
21 /**
22  * Device-specific symbol definitions for the DV simulation device.
23  */
24 
26 
27 // TODO: DV testbench completely randomizes these. Need to add code to
28 // retrieve these from a preloaded memory location set by the testbench.
29 
30 const uint64_t kClockFreqCpuMhz = 100;
31 
32 const uint64_t kClockFreqCpuHz = kClockFreqCpuMhz * 1000 * 1000;
33 
34 uint64_t to_cpu_cycles(uint64_t usec) { return usec * kClockFreqCpuMhz; }
35 
36 const uint64_t kClockFreqHiSpeedPeripheralHz = 96 * 1000 * 1000; // 96MHz
37 
38 const uint64_t kClockFreqPeripheralHz = 24 * 1000 * 1000; // 24MHz
39 
40 const uint64_t kClockFreqUsbHz = 48 * 1000 * 1000; // 48MHz
41 
42 const uint64_t kClockFreqAonHz = 200 * 1000; // 200kHz
43 
44 const uint64_t kUartBaudrate = 1 * 1000 * 1000; // 1Mbps
45 
46 const uint32_t kUartNCOValue =
47  CALCULATE_UART_NCO(kUartBaudrate, kClockFreqPeripheralHz);
48 
49 const uint32_t kUartBaud115K =
50  CALCULATE_UART_NCO(115200, kClockFreqPeripheralHz);
51 const uint32_t kUartBaud230K =
52  CALCULATE_UART_NCO(115200 * 2, kClockFreqPeripheralHz);
53 const uint32_t kUartBaud460K =
54  CALCULATE_UART_NCO(115200 * 4, kClockFreqPeripheralHz);
55 const uint32_t kUartBaud921K =
56  CALCULATE_UART_NCO(115200 * 8, kClockFreqPeripheralHz);
57 const uint32_t kUartBaud1M33 =
58  CALCULATE_UART_NCO(1333333, kClockFreqPeripheralHz);
59 const uint32_t kUartBaud1M50 =
60  CALCULATE_UART_NCO(1500000, kClockFreqPeripheralHz);
61 
63  kUartBaudrate, kClockFreqCpuHz, UART_PARAM_TX_FIFO_DEPTH);
64 
65 const uint32_t kAstCheckPollCpuCycles =
67 
68 uintptr_t device_test_status_address(void) {
69  return rv_core_ibex_base() + RV_CORE_IBEX_DV_SIM_WINDOW_REG_OFFSET;
70 }
71 
72 uintptr_t device_log_bypass_uart_address(void) {
73  return rv_core_ibex_base() + RV_CORE_IBEX_DV_SIM_WINDOW_REG_OFFSET + 0x04;
74 }
75 
76 void device_fpga_version_print(void) {}