Adapted simple_system to demonstrate use of tlm_target by reference and
by ingeritance
This commit is contained in:
parent
7c32c6aab2
commit
792a40d3f1
10
.cproject
10
.cproject
@ -163,7 +163,6 @@
|
||||
<buildTargets>
|
||||
<target name="all" path="build" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
||||
<buildCommand>make</buildCommand>
|
||||
<buildArguments/>
|
||||
<buildTarget>all</buildTarget>
|
||||
<stopOnError>true</stopOnError>
|
||||
<useDefaultCommand>true</useDefaultCommand>
|
||||
@ -171,12 +170,19 @@
|
||||
</target>
|
||||
<target name="all VERBOSE=1" path="build" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
||||
<buildCommand>make</buildCommand>
|
||||
<buildArguments/>
|
||||
<buildTarget>all VERBOSE=1</buildTarget>
|
||||
<stopOnError>true</stopOnError>
|
||||
<useDefaultCommand>true</useDefaultCommand>
|
||||
<runAllBuilders>true</runAllBuilders>
|
||||
</target>
|
||||
<target name="clean" path="build" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
||||
<buildCommand>make</buildCommand>
|
||||
<buildArguments/>
|
||||
<buildTarget>clean</buildTarget>
|
||||
<stopOnError>true</stopOnError>
|
||||
<useDefaultCommand>true</useDefaultCommand>
|
||||
<runAllBuilders>true</runAllBuilders>
|
||||
</target>
|
||||
</buildTargets>
|
||||
</storageModule>
|
||||
</cproject>
|
||||
|
@ -26,7 +26,6 @@ add_executable (simple_system
|
||||
sc_main.cpp
|
||||
)
|
||||
|
||||
|
||||
# Link the executable to the sc_components library. Since the sc_components library has
|
||||
# public include directories we will use those link directories when building
|
||||
# simple_system
|
||||
|
@ -19,18 +19,16 @@
|
||||
|
||||
#include <util/bit_field.h>
|
||||
#include <sysc/register.h>
|
||||
#include <sysc/tlmtarget.h>
|
||||
#include <sysc/utilities.h>
|
||||
#include <sysc/tlm_target.h>
|
||||
|
||||
namespace sysc {
|
||||
|
||||
template<unsigned BUSWIDTH=32>
|
||||
class gpio_regs :
|
||||
public sc_core::sc_module,
|
||||
public sysc::tlm_target<BUSWIDTH>,
|
||||
public sysc::resetable
|
||||
{
|
||||
protected:
|
||||
public:
|
||||
// storage declarations
|
||||
uint32_t r_value;
|
||||
|
||||
@ -86,17 +84,19 @@ protected:
|
||||
sysc::sc_register<uint32_t> out_xor;
|
||||
|
||||
gpio_regs(sc_core::sc_module_name nm);
|
||||
protected:
|
||||
sc_core::sc_time clk;
|
||||
|
||||
template<unsigned BUSWIDTH=32>
|
||||
void registerResources(sysc::tlm_target<BUSWIDTH>& target);
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// member functions
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
template<unsigned BUSWIDTH>
|
||||
gpio_regs<BUSWIDTH>::gpio_regs(sc_core::sc_module_name nm)
|
||||
inline sysc::gpio_regs::gpio_regs(sc_core::sc_module_name nm)
|
||||
: sc_core::sc_module(nm)
|
||||
, sysc::tlm_target<BUSWIDTH>(clk)
|
||||
, NAMED(value, r_value, 0, *this)
|
||||
, NAMED(input_en, r_input_en, 0, *this)
|
||||
, NAMED(output_en, r_output_en, 0, *this)
|
||||
@ -115,24 +115,27 @@ gpio_regs<BUSWIDTH>::gpio_regs(sc_core::sc_module_name nm)
|
||||
, NAMED(iof_sel, r_iof_sel, 0, *this)
|
||||
, NAMED(out_xor, r_out_xor, 0, *this)
|
||||
{
|
||||
this->socket_map.addEntry(&value, 0x0UL, 0x4UL);
|
||||
this->socket_map.addEntry(&input_en, 0x4UL, 0x4UL);
|
||||
this->socket_map.addEntry(&output_en, 0x8UL, 0x4UL);
|
||||
this->socket_map.addEntry(&port, 0xcUL, 0x4UL);
|
||||
this->socket_map.addEntry(&pue, 0x10UL, 0x4UL);
|
||||
this->socket_map.addEntry(&ds, 0x14UL, 0x4UL);
|
||||
this->socket_map.addEntry(&rise_ie, 0x18UL, 0x4UL);
|
||||
this->socket_map.addEntry(&rise_ip, 0x1cUL, 0x4UL);
|
||||
this->socket_map.addEntry(&fall_ie, 0x20UL, 0x4UL);
|
||||
this->socket_map.addEntry(&fall_ip, 0x24UL, 0x4UL);
|
||||
this->socket_map.addEntry(&high_ie, 0x28UL, 0x4UL);
|
||||
this->socket_map.addEntry(&high_ip, 0x2cUL, 0x4UL);
|
||||
this->socket_map.addEntry(&low_ie, 0x30UL, 0x4UL);
|
||||
this->socket_map.addEntry(&low_ip, 0x34UL, 0x4UL);
|
||||
this->socket_map.addEntry(&iof_en, 0x38UL, 0x4UL);
|
||||
this->socket_map.addEntry(&iof_sel, 0x3cUL, 0x4UL);
|
||||
this->socket_map.addEntry(&out_xor, 0x40UL, 0x4UL);
|
||||
}
|
||||
|
||||
template<unsigned BUSWIDTH>
|
||||
inline void sysc::gpio_regs::registerResources(sysc::tlm_target<BUSWIDTH>& target) {
|
||||
target.addResource(value, 0x0UL, 0x4UL);
|
||||
target.addResource(input_en, 0x4UL, 0x4UL);
|
||||
target.addResource(output_en, 0x8UL, 0x4UL);
|
||||
target.addResource(port, 0xcUL, 0x4UL);
|
||||
target.addResource(pue, 0x10UL, 0x4UL);
|
||||
target.addResource(ds, 0x14UL, 0x4UL);
|
||||
target.addResource(rise_ie, 0x18UL, 0x4UL);
|
||||
target.addResource(rise_ip, 0x1cUL, 0x4UL);
|
||||
target.addResource(fall_ie, 0x20UL, 0x4UL);
|
||||
target.addResource(fall_ip, 0x24UL, 0x4UL);
|
||||
target.addResource(high_ie, 0x28UL, 0x4UL);
|
||||
target.addResource(high_ip, 0x2cUL, 0x4UL);
|
||||
target.addResource(low_ie, 0x30UL, 0x4UL);
|
||||
target.addResource(low_ip, 0x34UL, 0x4UL);
|
||||
target.addResource(iof_en, 0x38UL, 0x4UL);
|
||||
target.addResource(iof_sel, 0x3cUL, 0x4UL);
|
||||
target.addResource(out_xor, 0x40UL, 0x4UL);
|
||||
}
|
||||
|
||||
#endif // _GPIO_REGS_H_
|
||||
|
@ -19,8 +19,8 @@
|
||||
|
||||
#include <util/bit_field.h>
|
||||
#include <sysc/register.h>
|
||||
#include <sysc/tlmtarget.h>
|
||||
#include <sysc/utilities.h>
|
||||
#include <sysc/tlm_target.h>
|
||||
|
||||
namespace sysc {
|
||||
|
||||
|
@ -19,8 +19,8 @@
|
||||
|
||||
#include <util/bit_field.h>
|
||||
#include <sysc/register.h>
|
||||
#include <sysc/tlmtarget.h>
|
||||
#include <sysc/utilities.h>
|
||||
#include <sysc/tlm_target.h>
|
||||
|
||||
namespace sysc {
|
||||
|
||||
|
@ -15,22 +15,35 @@
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "gpio.h"
|
||||
#include "gen/gpio_regs.h"
|
||||
#include "sysc/utilities.h"
|
||||
|
||||
namespace sysc {
|
||||
|
||||
gpio::gpio(sc_core::sc_module_name nm)
|
||||
: gpio_regs<>(nm)
|
||||
: sc_core::sc_module(nm)
|
||||
, tlm_target<>(clk)
|
||||
, NAMED(clk_i)
|
||||
, NAMEDD(gpio_regs, regs)
|
||||
{
|
||||
regs->registerResources(*this);
|
||||
SC_METHOD(clock_cb);
|
||||
sensitive<<clk_i;
|
||||
SC_METHOD(reset_cb);
|
||||
sensitive<<rst_i;
|
||||
}
|
||||
|
||||
gpio::~gpio() {
|
||||
}
|
||||
|
||||
void gpio::clock_cb() {
|
||||
this->clk=clk_i.read();
|
||||
}
|
||||
|
||||
void gpio::reset_cb() {
|
||||
if(rst_i.read())
|
||||
regs->reset_start();
|
||||
else
|
||||
regs->reset_stop();
|
||||
}
|
||||
|
||||
} /* namespace sysc */
|
||||
|
@ -17,18 +17,24 @@
|
||||
#ifndef _GPIO_H_
|
||||
#define _GPIO_H_
|
||||
|
||||
#include "gen/gpio_regs.h"
|
||||
#include <sysc/tlm_target.h>
|
||||
|
||||
namespace sysc {
|
||||
|
||||
class gpio: public gpio_regs<> {
|
||||
class gpio_regs;
|
||||
|
||||
class gpio: public sc_core::sc_module, public tlm_target<> {
|
||||
public:
|
||||
SC_HAS_PROCESS(gpio);
|
||||
sc_core::sc_in<sc_core::sc_time> clk_i;
|
||||
sc_core::sc_in<bool> rst_i;
|
||||
gpio(sc_core::sc_module_name nm);
|
||||
virtual ~gpio();
|
||||
protected:
|
||||
void clock_cb();
|
||||
void reset_cb();
|
||||
sc_core::sc_time clk;
|
||||
std::unique_ptr<gpio_regs> regs;
|
||||
};
|
||||
|
||||
} /* namespace sysc */
|
||||
|
@ -22,8 +22,11 @@
|
||||
|
||||
#include "simple_system.h"
|
||||
#include <sysc/tracer.h>
|
||||
#include "sysc/scv_tr_db.h"
|
||||
#include <sysc/scv_tr_db.h>
|
||||
#include <sr_report/sr_report.h>
|
||||
#include <boost/program_options.hpp>
|
||||
#include <sysc/report.h>
|
||||
#include <sstream>
|
||||
|
||||
using namespace sysc;
|
||||
namespace po = boost::program_options;
|
||||
@ -35,6 +38,8 @@ const size_t ERROR_UNHANDLED_EXCEPTION = 2;
|
||||
} // namespace
|
||||
|
||||
int sc_main(int argc, char* argv[]){
|
||||
// sc_report_handler::set_handler(my_report_handler);
|
||||
sysc::Logger::reporting_level()=log::DEBUG;
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
// CLI argument parsing
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
@ -66,11 +71,13 @@ int sc_main(int argc, char* argv[]){
|
||||
// instantiate top level
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
simple_system i_simple_system("i_simple_system");
|
||||
//sr_report_handler::add_sc_object_to_filter(&i_simple_system.i_master, sc_core::SC_WARNING, sc_core::SC_MEDIUM);
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
// run simulation
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
sc_start(sc_core::sc_time(100, sc_core::SC_NS));
|
||||
|
||||
if(!sc_end_of_simulation_invoked()) sc_stop();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -32,6 +32,7 @@ simple_system::simple_system(sc_core::sc_module_name nm)
|
||||
, NAMED(i_spi)
|
||||
, NAMED(i_gpio)
|
||||
, NAMED(s_clk)
|
||||
, NAMED(s_rst)
|
||||
{
|
||||
i_master.intor(i_router.target[0]);
|
||||
size_t i=0;
|
||||
@ -43,10 +44,17 @@ simple_system::simple_system(sc_core::sc_module_name nm)
|
||||
i_uart.clk_i(s_clk);
|
||||
i_spi.clk_i(s_clk);
|
||||
i_gpio.clk_i(s_clk);
|
||||
s_clk.write(sc_core::sc_time(10, sc_core::SC_NS));
|
||||
s_clk.write(10_ns);
|
||||
i_gpio.rst_i(s_rst);
|
||||
i_master.rst_i(s_rst);
|
||||
|
||||
SC_THREAD(gen_reset);
|
||||
}
|
||||
|
||||
simple_system::~simple_system() {
|
||||
void simple_system::gen_reset() {
|
||||
s_rst=true;
|
||||
wait(10_ns);
|
||||
s_rst=false;
|
||||
}
|
||||
|
||||
} /* namespace sysc */
|
||||
|
@ -37,15 +37,19 @@ namespace sysc {
|
||||
|
||||
class simple_system: public sc_core::sc_module {
|
||||
public:
|
||||
SC_HAS_PROCESS(simple_system);
|
||||
|
||||
test_initiator i_master;
|
||||
router<> i_router;
|
||||
uart i_uart;
|
||||
spi i_spi;
|
||||
gpio i_gpio;
|
||||
sc_core::sc_signal<sc_core::sc_time> s_clk;
|
||||
sc_core::sc_signal<bool> s_rst;
|
||||
|
||||
simple_system(sc_core::sc_module_name nm);
|
||||
virtual ~simple_system();
|
||||
protected:
|
||||
void gen_reset();
|
||||
|
||||
#include "gen/e300_plat_t.h"
|
||||
};
|
||||
|
@ -21,6 +21,7 @@
|
||||
*/
|
||||
|
||||
#include "test_initiator.h"
|
||||
#include <sr_report/sr_report.h>
|
||||
#include <sysc/utilities.h>
|
||||
#include <array>
|
||||
|
||||
@ -29,15 +30,19 @@ namespace sysc {
|
||||
test_initiator::test_initiator(sc_core::sc_module_name nm)
|
||||
: sc_core::sc_module(nm)
|
||||
, NAMED(intor)
|
||||
, NAMED(rst_i)
|
||||
{
|
||||
SC_THREAD(run);
|
||||
|
||||
}
|
||||
|
||||
void test_initiator::run() {
|
||||
wait(10, sc_core::SC_NS);
|
||||
if(rst_i.read()==false) wait(rst_i.posedge_event());
|
||||
wait(rst_i.negedge_event());
|
||||
wait(10_ns);
|
||||
tlm::tlm_generic_payload gp;
|
||||
std::array<uint8_t, 4> data;
|
||||
srInfo()("group", "comm")("read access");
|
||||
gp.set_command(tlm::TLM_READ_COMMAND);
|
||||
gp.set_address(0x10012000);
|
||||
gp.set_data_ptr(data.data());
|
||||
@ -45,7 +50,13 @@ void test_initiator::run() {
|
||||
gp.set_streaming_width(4);
|
||||
sc_core::sc_time delay;
|
||||
intor->b_transport(gp, delay);
|
||||
wait(10, sc_core::SC_NS);
|
||||
wait(10_ns);
|
||||
srWarn()("group", "comm")("write access");
|
||||
gp.set_command(tlm::TLM_WRITE_COMMAND);
|
||||
gp.set_address(0x10012000);
|
||||
data[0]=0xA5;
|
||||
intor->b_transport(gp, delay);
|
||||
wait(10_ns);
|
||||
}
|
||||
|
||||
} /* namespace sysc */
|
||||
|
@ -23,8 +23,8 @@
|
||||
#ifndef _TEST_INITIATOR_H_
|
||||
#define _TEST_INITIATOR_H_
|
||||
|
||||
#include <sysc/utilities.h>
|
||||
#include <tlm_utils/simple_initiator_socket.h>
|
||||
#include <systemc>
|
||||
|
||||
namespace sysc {
|
||||
|
||||
@ -33,6 +33,7 @@ public:
|
||||
SC_HAS_PROCESS(test_initiator);
|
||||
tlm_utils::simple_initiator_socket<test_initiator, 32> intor;
|
||||
|
||||
sc_core::sc_in<bool> rst_i;
|
||||
test_initiator(sc_core::sc_module_name nm);
|
||||
protected:
|
||||
void run();
|
||||
|
@ -1 +1 @@
|
||||
Subproject commit 5f7387ab7e3dfc2ff6a7cac6fbe834ed7ec8ae36
|
||||
Subproject commit 48428f097659421db15d1eeac3a74fdd653db6e5
|
Loading…
Reference in New Issue
Block a user