quic/qbox
Loading...
Searching...
No Matches
sifive_test.h
1/*
2 * This file is part of libqbox
3 * Copyright (c) 2024 Qualcomm Innovation Center, Inc. All Rights Reserved.
4 *
5 * SPDX-License-Identifier: BSD-3-Clause
6 */
7
8#ifndef _LIBQBOX_COMPONENTS_SIFIVE_TEST_H
9#define _LIBQBOX_COMPONENTS_SIFIVE_TEST_H
10
11#include <systemc>
12#include <cci_configuration>
13#include <module_factory_registery.h>
14#include <device.h>
15#include <ports/target.h>
16#include <ports/qemu-initiator-signal-socket.h>
17#include <tlm_utils/simple_initiator_socket.h>
18#include <tlm_utils/simple_target_socket.h>
19#include <tlm_sockets_buswidth.h>
20
21class sifive_test : public QemuDevice
22{
23private:
24 sc_core::sc_time last_reset;
25 sc_core::sc_event reset_ev;
26
27public:
28 QemuTargetSocket<> q_socket;
29 tlm_utils::simple_initiator_socket<sifive_test, DEFAULT_TLM_BUSWIDTH> initiator_socket;
30 tlm_utils::simple_target_socket<sifive_test, DEFAULT_TLM_BUSWIDTH> target_socket;
31 sc_core::sc_port<sc_core::sc_signal_inout_if<bool>, 0, sc_core::SC_ZERO_OR_MORE_BOUND> reset;
32
33 sifive_test(const sc_core::sc_module_name& name, sc_core::sc_object* o)
34 : sifive_test(name, *(dynamic_cast<QemuInstance*>(o)))
35 {
36 }
37 sifive_test(const sc_core::sc_module_name& n, QemuInstance& inst)
38 : QemuDevice(n, inst, "riscv.sifive.test")
39 , last_reset(sc_core::SC_ZERO_TIME)
40 , q_socket("mem", inst)
41 , initiator_socket("initiator_socket")
42 , target_socket("target_socket")
43 , reset("reset")
44 {
45 initiator_socket.bind(q_socket);
46 target_socket.register_b_transport(this, &sifive_test::b_transport);
47 SC_METHOD(do_reset);
48 sensitive << reset_ev;
50 }
51
52 void before_end_of_elaboration() override { QemuDevice::before_end_of_elaboration(); }
53
54 void end_of_elaboration() override
55 {
56 QemuDevice::set_sysbus_as_parent_bus();
57 QemuDevice::end_of_elaboration();
59 q_socket.init(sbd, 0);
60 }
61
62 void do_reset()
63 {
64 if (last_reset == sc_core::sc_time_stamp()) return;
65 SCP_INFO(())("Initiate Reset sequence");
66 for (int i = 0; i < reset.size(); i++) {
67 reset[i]->write(1);
68 }
69 for (int i = 0; i < reset.size(); i++) {
70 reset[i]->write(0);
71 }
72 last_reset = sc_core::sc_time_stamp();
73 }
74
75 void b_transport(tlm::tlm_generic_payload& trans, sc_core::sc_time& delay)
76 {
77 initiator_socket->b_transport(trans, delay);
78 sc_core::wait(sc_core::SC_ZERO_TIME);
79 if (trans.get_address() == 0x0) {
80 reset_ev.notify(sc_core::SC_ZERO_TIME);
81 }
82 }
83};
84
85extern "C" void module_register();
86
87#endif
QEMU device abstraction as a SystemC module.
Definition device.h:37
This class encapsulates a libqemu-cxx qemu::LibQemu instance. It handles QEMU parameters and instance...
Definition qemu-instance.h:89
Definition target.h:160
Definition libqemu-cxx.h:638
Definition sifive_test.h:22