risc-v-tlm/inc/Timer.h

71 lines
1.4 KiB
C
Raw Normal View History

2019-01-13 08:30:49 +08:00
/*!
\file Timer.h
\brief Basic TLM-2 Timer module
\author Màrius Montón
\date January 2019
*/
// SPDX-License-Identifier: GPL-3.0-or-later
2019-01-13 08:30:49 +08:00
#ifndef __TIMER_H__
#define __TIMER_H__
#include <iostream>
#include <fstream>
#define SC_INCLUDE_DYNAMIC_PROCESSES
#include "systemc"
#include "tlm.h"
#include "tlm_utils/simple_target_socket.h"
#include "BusCtrl.h"
/**
* @brief Simple timer peripheral
*
* It runs a 1 ns (nanoseconds) pace
*
*/
class Timer: sc_core::sc_module {
2019-01-13 08:30:49 +08:00
public:
// TLM-2 socket, defaults to 32-bits wide, base protocol
tlm_utils::simple_target_socket<Timer> socket;
2019-01-22 19:43:05 +08:00
tlm_utils::simple_initiator_socket<Timer> irq_line;
2019-01-13 08:30:49 +08:00
/**
*
* @brief Constructor
* @param name module name
*/
2021-04-26 01:52:12 +08:00
explicit Timer(sc_core::sc_module_name const &name);
2019-01-13 08:30:49 +08:00
/**
* @brief Waits for event timer_event and triggers an IRQ
*
* Waits for event timer_event and triggers an IRQ (if it is not already
* triggered).
* After that, it posts the timer_event to 20 ns in the future to clear the IRQ
* line.
*
*/
2021-04-26 01:52:12 +08:00
[[noreturn]] void run();
2019-01-13 08:30:49 +08:00
/**
*
* @brief TLM-2.0 socket implementation
* @param trans TLM-2.0 transaction
* @param delay transaction delay time
*/
virtual void b_transport(tlm::tlm_generic_payload &trans,
sc_core::sc_time &delay);
2019-01-13 08:30:49 +08:00
private:
sc_dt::sc_uint<64> m_mtime; /**< mtime register */
sc_dt::sc_uint<64> m_mtimecmp; /**< mtimecmp register */
sc_core::sc_event timer_event; /**< event */
2019-01-13 08:30:49 +08:00
};
#endif