Software APIs
device_sim_verilator.c
Go to the documentation of this file.
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 <assert.h>
6#include <stdbool.h>
7
8#include "dt/dt_rv_core_ibex.h"
10
11#include "rv_core_ibex_regs.h"
12
13// Use the first dt_rv_core_ibex_t enum, i.e. the first Ibex core instance.
14static const dt_rv_core_ibex_t kRvCoreIbexDt = (dt_rv_core_ibex_t)0;
15static_assert(kDtRvCoreIbexCount == 1, "Only single core tops are supported");
16
17static inline uintptr_t rv_core_ibex_base(void) {
18 return (uintptr_t)dt_rv_core_ibex_primary_reg_block(kRvCoreIbexDt);
19}
20
21/**
22 * @file
23 * @brief Device-specific symbol definitions for the Verilator device.
24 */
25
27
28// Changes to the clock frequency or UART baud rate must also be reflected at
29// `hw/top_earlgrey/rtl/chip_earlgrey_verilator.sv` and
30// `test/systemtest/earlgrey/test_sim_verilator.py`.
31#define CPU_FREQ_HZ 500 * 1000
32const uint64_t kClockFreqCpuHz = CPU_FREQ_HZ; // 500kHz
33
34// This function is specific for the frequency above. Notice since the cycle
35// time is 2 us we round up.
36uint64_t to_cpu_cycles(uint64_t usec) {
37 static_assert(CPU_FREQ_HZ == 500 * 1000,
38 "The verilator to_cpu_cycles function needs refactoring.");
39 return (usec + 1) / 2;
40}
41
42const uint64_t kClockFreqHiSpeedPeripheralHz = 500 * 1000; // 500kHz
43
44const uint64_t kClockFreqPeripheralHz = 125 * 1000; // 125kHz
45
46const uint64_t kClockFreqUsbHz = 500 * 1000; // 500kHz
47
48const uint64_t kClockFreqAonHz = 125 * 1000; // 125kHz
49
50const uint64_t kUartBaudrate = 7200;
51
52const uint32_t kUartNCOValue =
53 CALCULATE_UART_NCO(kUartBaudrate, kClockFreqPeripheralHz);
54
55const uint32_t kUartBaud115K =
56 CALCULATE_UART_NCO(115200, kClockFreqPeripheralHz);
57const uint32_t kUartBaud230K =
58 CALCULATE_UART_NCO(115200 * 2, kClockFreqPeripheralHz);
59const uint32_t kUartBaud460K =
60 CALCULATE_UART_NCO(115200 * 4, kClockFreqPeripheralHz);
61const uint32_t kUartBaud921K =
62 CALCULATE_UART_NCO(115200 * 8, kClockFreqPeripheralHz);
63const uint32_t kUartBaud1M33 =
64 CALCULATE_UART_NCO(1333333, kClockFreqPeripheralHz);
65const uint32_t kUartBaud1M50 =
66 CALCULATE_UART_NCO(1500000, kClockFreqPeripheralHz);
67
68const uint32_t kAstCheckPollCpuCycles =
70
72 return rv_core_ibex_base() + RV_CORE_IBEX_DV_SIM_WINDOW_REG_OFFSET;
73}
74
75uintptr_t device_log_bypass_uart_address(void) { return 0; }