Added signals for clock and reset
This commit is contained in:
parent
0120610f83
commit
3eb2e4b4f7
@ -5,7 +5,7 @@
|
|||||||
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
|
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
|
||||||
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
|
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
|
||||||
<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuildCommandParser" id="org.eclipse.cdt.managedbuilder.core.GCCBuildCommandParser" keep-relative-paths="false" name="CDT GCC Build Output Parser" parameter="(g?cc)|([gc]\+\+)|(clang)" prefer-non-shared="true"/>
|
<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuildCommandParser" id="org.eclipse.cdt.managedbuilder.core.GCCBuildCommandParser" keep-relative-paths="false" name="CDT GCC Build Output Parser" parameter="(g?cc)|([gc]\+\+)|(clang)" prefer-non-shared="true"/>
|
||||||
<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="-24234131794715112" id="org.eclipse.cdt.managedbuilder.core.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"" prefer-non-shared="true">
|
<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="90396921960217303" id="org.eclipse.cdt.managedbuilder.core.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"" prefer-non-shared="true">
|
||||||
<language-scope id="org.eclipse.cdt.core.gcc"/>
|
<language-scope id="org.eclipse.cdt.core.gcc"/>
|
||||||
<language-scope id="org.eclipse.cdt.core.g++"/>
|
<language-scope id="org.eclipse.cdt.core.g++"/>
|
||||||
</provider>
|
</provider>
|
||||||
@ -19,7 +19,7 @@
|
|||||||
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
|
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
|
||||||
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
|
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
|
||||||
<provider copy-of="extension" id="org.eclipse.cdt.managedbuilder.core.GCCBuildCommandParser"/>
|
<provider copy-of="extension" id="org.eclipse.cdt.managedbuilder.core.GCCBuildCommandParser"/>
|
||||||
<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="-24234131794715112" id="org.eclipse.cdt.managedbuilder.core.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"" prefer-non-shared="true">
|
<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="90396921960217303" id="org.eclipse.cdt.managedbuilder.core.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"" prefer-non-shared="true">
|
||||||
<language-scope id="org.eclipse.cdt.core.gcc"/>
|
<language-scope id="org.eclipse.cdt.core.gcc"/>
|
||||||
<language-scope id="org.eclipse.cdt.core.g++"/>
|
<language-scope id="org.eclipse.cdt.core.g++"/>
|
||||||
</provider>
|
</provider>
|
||||||
|
@ -2,6 +2,8 @@ set(LIB_SOURCES
|
|||||||
initiator.cpp
|
initiator.cpp
|
||||||
logging.cpp
|
logging.cpp
|
||||||
target.cpp
|
target.cpp
|
||||||
|
clkgen.cpp
|
||||||
|
resetgen.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
# Define two variables in order not to repeat ourselves.
|
# Define two variables in order not to repeat ourselves.
|
||||||
|
23
components/clkgen.cpp
Normal file
23
components/clkgen.cpp
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
/*
|
||||||
|
* clkgen.cpp
|
||||||
|
*
|
||||||
|
* Created on: 02.01.2019
|
||||||
|
* Author: eyck
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <clkgen.h>
|
||||||
|
#include <scc/utilities.h>
|
||||||
|
|
||||||
|
ClkGen::ClkGen(const sc_core::sc_module_name& nm)
|
||||||
|
: sc_core::sc_module(nm)
|
||||||
|
, clk_o("clk_o")
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
ClkGen::~ClkGen() {
|
||||||
|
// TODO Auto-generated destructor stub
|
||||||
|
}
|
||||||
|
|
||||||
|
void ClkGen::end_of_elabortation() {
|
||||||
|
clk_o.write(10_ns);
|
||||||
|
}
|
23
components/clkgen.h
Normal file
23
components/clkgen.h
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
/*
|
||||||
|
* clkgen.h
|
||||||
|
*
|
||||||
|
* Created on: 02.01.2019
|
||||||
|
* Author: eyck
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef COMPONENTS_CLKGEN_H_
|
||||||
|
#define COMPONENTS_CLKGEN_H_
|
||||||
|
|
||||||
|
#include <systemc>
|
||||||
|
|
||||||
|
class ClkGen: public sc_core::sc_module {
|
||||||
|
public:
|
||||||
|
sc_core::sc_out<sc_core::sc_time> clk_o;
|
||||||
|
|
||||||
|
ClkGen(const sc_core::sc_module_name&);
|
||||||
|
virtual ~ClkGen();
|
||||||
|
protected:
|
||||||
|
void end_of_elabortation();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* COMPONENTS_CLKGEN_H_ */
|
@ -8,8 +8,8 @@
|
|||||||
#ifndef COMPONENTS_H_
|
#ifndef COMPONENTS_H_
|
||||||
#define COMPONENTS_H_
|
#define COMPONENTS_H_
|
||||||
|
|
||||||
//#include "tx_example_mods.h"
|
#include "clkgen.h"
|
||||||
//#include "logging.h"
|
#include "resetgen.h"
|
||||||
#include "initiator.h"
|
#include "initiator.h"
|
||||||
#include "router.h"
|
#include "router.h"
|
||||||
#include "target.h"
|
#include "target.h"
|
||||||
|
@ -12,6 +12,8 @@
|
|||||||
|
|
||||||
Initiator::Initiator(::sc_core::sc_module_name nm)
|
Initiator::Initiator(::sc_core::sc_module_name nm)
|
||||||
: socket("socket") // Construct and name socket
|
: socket("socket") // Construct and name socket
|
||||||
|
, clk_i("clk_i")
|
||||||
|
, reset_i("reset_i")
|
||||||
, dmi_ptr_valid(false)
|
, dmi_ptr_valid(false)
|
||||||
{
|
{
|
||||||
// Register callbacks for incoming interface method calls
|
// Register callbacks for incoming interface method calls
|
||||||
@ -21,6 +23,7 @@ Initiator::Initiator(::sc_core::sc_module_name nm)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Initiator::thread_process() {
|
void Initiator::thread_process() {
|
||||||
|
wait(reset_i.negedge_event());
|
||||||
{
|
{
|
||||||
// TLM-2 generic payload transaction, reused across calls to b_transport, DMI and debug
|
// TLM-2 generic payload transaction, reused across calls to b_transport, DMI and debug
|
||||||
tlm::tlm_generic_payload* trans = new tlm::tlm_generic_payload;
|
tlm::tlm_generic_payload* trans = new tlm::tlm_generic_payload;
|
||||||
|
@ -17,6 +17,9 @@ struct Initiator: sc_module
|
|||||||
// TLM-2 socket, defaults to 32-bits wide, base protocol
|
// TLM-2 socket, defaults to 32-bits wide, base protocol
|
||||||
tlm_utils::simple_initiator_socket<Initiator> socket;
|
tlm_utils::simple_initiator_socket<Initiator> socket;
|
||||||
|
|
||||||
|
sc_core::sc_in<sc_core::sc_time> clk_i;
|
||||||
|
sc_core::sc_in<sc_dt::sc_logic> reset_i;
|
||||||
|
|
||||||
SC_HAS_PROCESS(Initiator);
|
SC_HAS_PROCESS(Initiator);
|
||||||
|
|
||||||
Initiator( ::sc_core::sc_module_name );
|
Initiator( ::sc_core::sc_module_name );
|
||||||
|
25
components/resetgen.cpp
Normal file
25
components/resetgen.cpp
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
/*
|
||||||
|
* resetgen.cpp
|
||||||
|
*
|
||||||
|
* Created on: 02.01.2019
|
||||||
|
* Author: eyck
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <resetgen.h>
|
||||||
|
#include <scc/utilities.h>
|
||||||
|
|
||||||
|
ResetGen::ResetGen(const sc_core::sc_module_name& nm)
|
||||||
|
: sc_core::sc_module(nm)
|
||||||
|
, reset_o("reset_o")
|
||||||
|
{
|
||||||
|
SC_THREAD(thread);
|
||||||
|
}
|
||||||
|
|
||||||
|
ResetGen::~ResetGen() {
|
||||||
|
}
|
||||||
|
|
||||||
|
void ResetGen::thread() {
|
||||||
|
reset_o=sc_dt::SC_LOGIC_1;
|
||||||
|
wait(100_ns);
|
||||||
|
reset_o=sc_dt::SC_LOGIC_0;
|
||||||
|
}
|
26
components/resetgen.h
Normal file
26
components/resetgen.h
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
/*
|
||||||
|
* resetgen.h
|
||||||
|
*
|
||||||
|
* Created on: 02.01.2019
|
||||||
|
* Author: eyck
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef COMPONENTS_RESETGEN_H_
|
||||||
|
#define COMPONENTS_RESETGEN_H_
|
||||||
|
|
||||||
|
#include <systemc>
|
||||||
|
|
||||||
|
class ResetGen: public sc_core::sc_module {
|
||||||
|
public:
|
||||||
|
SC_HAS_PROCESS(ResetGen);
|
||||||
|
|
||||||
|
sc_core::sc_out<sc_dt::sc_logic> reset_o;
|
||||||
|
|
||||||
|
ResetGen(const sc_core::sc_module_name&);
|
||||||
|
virtual ~ResetGen();
|
||||||
|
protected:
|
||||||
|
|
||||||
|
void thread();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* COMPONENTS_RESETGEN_H_ */
|
@ -27,9 +27,14 @@ struct Router: sc_module
|
|||||||
|
|
||||||
sc_core::sc_vector<tlm_utils::simple_initiator_socket_tagged<Router>> initiator_socket;
|
sc_core::sc_vector<tlm_utils::simple_initiator_socket_tagged<Router>> initiator_socket;
|
||||||
|
|
||||||
|
sc_core::sc_in<sc_core::sc_time> clk_i;
|
||||||
|
sc_core::sc_in<sc_dt::sc_logic> reset_i;
|
||||||
|
|
||||||
SC_CTOR(Router)
|
SC_CTOR(Router)
|
||||||
: target_socket("target_socket")
|
: target_socket("target_socket")
|
||||||
, initiator_socket("socket", N_TARGETS)
|
, initiator_socket("socket", N_TARGETS)
|
||||||
|
, clk_i("clk_i")
|
||||||
|
, reset_i("reset_i")
|
||||||
{
|
{
|
||||||
// Register callbacks for incoming interface method calls
|
// Register callbacks for incoming interface method calls
|
||||||
target_socket.register_b_transport( this, &Router::b_transport);
|
target_socket.register_b_transport( this, &Router::b_transport);
|
||||||
|
@ -1,18 +0,0 @@
|
|||||||
/*
|
|
||||||
* router_example.cpp
|
|
||||||
*
|
|
||||||
* Created on: 02.12.2018
|
|
||||||
* Author: eyck
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#include "top.h"
|
|
||||||
|
|
||||||
int sc_main(int argc, char* argv[])
|
|
||||||
{
|
|
||||||
Top top("top");
|
|
||||||
sc_start();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -66,7 +66,10 @@ bool Memory::get_direct_mem_ptr(tlm::tlm_generic_payload& trans,
|
|||||||
}
|
}
|
||||||
|
|
||||||
Memory::Memory(sc_core::sc_module_name nm)
|
Memory::Memory(sc_core::sc_module_name nm)
|
||||||
: socket("socket"), LATENCY(10, SC_NS)
|
: socket("socket")
|
||||||
|
, clk_i("clk_i")
|
||||||
|
, reset_i("reset_i")
|
||||||
|
, LATENCY(10, SC_NS)
|
||||||
{
|
{
|
||||||
// Register callbacks for incoming interface method calls
|
// Register callbacks for incoming interface method calls
|
||||||
socket.register_b_transport( this, &Memory::b_transport);
|
socket.register_b_transport( this, &Memory::b_transport);
|
||||||
|
@ -19,6 +19,9 @@ struct Memory: sc_module
|
|||||||
{
|
{
|
||||||
// TLM-2 socket, defaults to 32-bits wide, base protocol
|
// TLM-2 socket, defaults to 32-bits wide, base protocol
|
||||||
tlm_utils::simple_target_socket<Memory> socket;
|
tlm_utils::simple_target_socket<Memory> socket;
|
||||||
|
sc_core::sc_in<sc_core::sc_time> clk_i;
|
||||||
|
sc_core::sc_in<sc_dt::sc_logic> reset_i;
|
||||||
|
|
||||||
|
|
||||||
enum { SIZE = 256 };
|
enum { SIZE = 256 };
|
||||||
const sc_time LATENCY;
|
const sc_time LATENCY;
|
||||||
|
@ -1,33 +0,0 @@
|
|||||||
#ifndef TOP_H
|
|
||||||
#define TOP_H
|
|
||||||
|
|
||||||
#include "initiator.h"
|
|
||||||
#include "target.h"
|
|
||||||
#include "router.h"
|
|
||||||
|
|
||||||
SC_MODULE(Top)
|
|
||||||
{
|
|
||||||
Initiator* initiator;
|
|
||||||
Router<4>* router;
|
|
||||||
Memory* memory[4];
|
|
||||||
|
|
||||||
SC_CTOR(Top)
|
|
||||||
{
|
|
||||||
// Instantiate components
|
|
||||||
initiator = new Initiator("initiator");
|
|
||||||
router = new Router<4>("router");
|
|
||||||
for (int i = 0; i < 4; i++)
|
|
||||||
{
|
|
||||||
char txt[20];
|
|
||||||
sprintf(txt, "memory_%d", i);
|
|
||||||
memory[i] = new Memory(txt);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Bind sockets
|
|
||||||
initiator->socket.bind( router->target_socket );
|
|
||||||
for (int i = 0; i < 4; i++)
|
|
||||||
router->initiator_socket[i].bind( memory[i]->socket );
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
@ -1,44 +0,0 @@
|
|||||||
// -*- C++ -*- <this line is for emacs to recognize it as C++ code>
|
|
||||||
/*****************************************************************************
|
|
||||||
|
|
||||||
Licensed to Accellera Systems Initiative Inc. (Accellera)
|
|
||||||
under one or more contributor license agreements. See the
|
|
||||||
NOTICE file distributed with this work for additional
|
|
||||||
information regarding copyright ownership. Accellera licenses
|
|
||||||
this file to you under the Apache License, Version 2.0 (the
|
|
||||||
"License"); you may not use this file except in compliance
|
|
||||||
with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
|
||||||
specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
|
|
||||||
*****************************************************************************/
|
|
||||||
// this code compiles and runs with our latest prototype for this specification
|
|
||||||
|
|
||||||
#include "txtop.h"
|
|
||||||
|
|
||||||
int sc_main (int argc , char *argv[])
|
|
||||||
{
|
|
||||||
scv_startup();
|
|
||||||
|
|
||||||
scv_tr_text_init();
|
|
||||||
scv_tr_db db("transaction_example.txlog");
|
|
||||||
scv_tr_db::set_default_db(&db);
|
|
||||||
|
|
||||||
tx_top top("top");
|
|
||||||
|
|
||||||
// Accellera SystemC >=2.2 got picky about multiple drivers.
|
|
||||||
// Disable check for bus simulation.
|
|
||||||
sc_report_handler::set_actions(SC_ID_MORE_THAN_ONE_SIGNAL_DRIVER_, SC_DO_NOTHING);
|
|
||||||
// run the simulation
|
|
||||||
sc_start(1.0, SC_MS);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
@ -1,140 +0,0 @@
|
|||||||
// -*- C++ -*- <this line is for emacs to recognize it as C++ code>
|
|
||||||
/*****************************************************************************
|
|
||||||
|
|
||||||
Licensed to Accellera Systems Initiative Inc. (Accellera)
|
|
||||||
under one or more contributor license agreements. See the
|
|
||||||
NOTICE file distributed with this work for additional
|
|
||||||
information regarding copyright ownership. Accellera licenses
|
|
||||||
this file to you under the Apache License, Version 2.0 (the
|
|
||||||
"License"); you may not use this file except in compliance
|
|
||||||
with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
|
||||||
specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
|
|
||||||
*****************************************************************************/
|
|
||||||
// this code compiles and runs with our latest prototype for this specification
|
|
||||||
|
|
||||||
#include "tx_example_mods.h"
|
|
||||||
|
|
||||||
rw_task_if::data_t rw_pipelined_transactor::read(const rw_task_if::addr_t*
|
|
||||||
addr) {
|
|
||||||
addr_phase.lock();
|
|
||||||
scv_tr_handle h = read_gen.begin_transaction(*addr);
|
|
||||||
|
|
||||||
scv_tr_handle h1 = addr_gen.begin_transaction(*addr,"addr_phase",h);
|
|
||||||
wait(clk->posedge_event());
|
|
||||||
bus_addr = *addr;
|
|
||||||
addr_req = 1;
|
|
||||||
wait(addr_ack->posedge_event());
|
|
||||||
wait(clk->negedge_event());
|
|
||||||
addr_req = 0;
|
|
||||||
wait(addr_ack->negedge_event());
|
|
||||||
addr_gen.end_transaction(h1);
|
|
||||||
addr_phase.unlock();
|
|
||||||
|
|
||||||
data_phase.lock();
|
|
||||||
scv_tr_handle h2 = data_gen.begin_transaction("data_phase",h);
|
|
||||||
wait(data_rdy->posedge_event());
|
|
||||||
data_t data = bus_data.read();
|
|
||||||
wait(data_rdy->negedge_event());
|
|
||||||
data_gen.end_transaction(h2);
|
|
||||||
read_gen.end_transaction(h,data);
|
|
||||||
data_phase.unlock();
|
|
||||||
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
void rw_pipelined_transactor::write(const write_t * req) {
|
|
||||||
scv_tr_handle h = write_gen.begin_transaction(req->addr);
|
|
||||||
// ...
|
|
||||||
write_gen.end_transaction(h,req->data);
|
|
||||||
}
|
|
||||||
|
|
||||||
void test::main() {
|
|
||||||
// simple sequential tests
|
|
||||||
for (int i=0; i<3; i++) {
|
|
||||||
rw_task_if::addr_t addr = i;
|
|
||||||
rw_task_if::data_t data = transactor->read(&addr);
|
|
||||||
cout << "at time " << sc_time_stamp() << ": ";
|
|
||||||
cout << "received data : " << data << endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
scv_smart_ptr<rw_task_if::addr_t> addr;
|
|
||||||
for (int i=0; i<3; i++) {
|
|
||||||
|
|
||||||
addr->next();
|
|
||||||
rw_task_if::data_t data = transactor->read( addr->get_instance() );
|
|
||||||
cout << "data for address " << *addr << " is " << data << endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
scv_smart_ptr<rw_task_if::write_t> write;
|
|
||||||
for (int i=0; i<3; i++) {
|
|
||||||
write->next();
|
|
||||||
transactor->write( write->get_instance() );
|
|
||||||
cout << "send data : " << write->data << endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
scv_smart_ptr<int> data;
|
|
||||||
scv_bag<int> distribution;
|
|
||||||
distribution.push(1,40);
|
|
||||||
distribution.push(2,60);
|
|
||||||
data->set_mode(distribution);
|
|
||||||
for (int i=0;i<3; i++) { data->next(); process(data); }
|
|
||||||
}
|
|
||||||
|
|
||||||
void design::addr_phase() {
|
|
||||||
while (1) {
|
|
||||||
while (addr_req.read() != 1) {
|
|
||||||
wait(addr_req->value_changed_event());
|
|
||||||
}
|
|
||||||
sc_uint<8> _addr = bus_addr.read();
|
|
||||||
bool _rw = rw.read();
|
|
||||||
|
|
||||||
int cycle = rand() % 10 + 1;
|
|
||||||
while (cycle-- > 0) {
|
|
||||||
wait(clk->posedge_event());
|
|
||||||
}
|
|
||||||
|
|
||||||
addr_ack = 1;
|
|
||||||
wait(clk->posedge_event());
|
|
||||||
addr_ack = 0;
|
|
||||||
|
|
||||||
outstandingAddresses.push_back(_addr);
|
|
||||||
outstandingType.push_back(_rw);
|
|
||||||
cout << "at time " << sc_time_stamp() << ": ";
|
|
||||||
cout << "received request for memory address " << _addr << endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void design::data_phase() {
|
|
||||||
while (1) {
|
|
||||||
while (outstandingAddresses.empty()) {
|
|
||||||
wait(clk->posedge_event());
|
|
||||||
}
|
|
||||||
int cycle = rand() % 10 + 1;
|
|
||||||
while (cycle-- > 0) {
|
|
||||||
wait(clk->posedge_event());
|
|
||||||
}
|
|
||||||
if (outstandingType.front() == 0) {
|
|
||||||
cout << "reading memory address " << outstandingAddresses.front()
|
|
||||||
<< " with value " << memory[outstandingAddresses.front().to_ulong()] << endl;
|
|
||||||
bus_data = memory[outstandingAddresses.front().to_ulong()];
|
|
||||||
data_rdy = 1;
|
|
||||||
wait(clk->posedge_event());
|
|
||||||
data_rdy = 0;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
cout << "not implemented yet" << endl;
|
|
||||||
}
|
|
||||||
outstandingAddresses.pop_front();
|
|
||||||
outstandingType.pop_front();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,136 +0,0 @@
|
|||||||
// -*- C++ -*- <this line is for emacs to recognize it as C++ code>
|
|
||||||
/*****************************************************************************
|
|
||||||
|
|
||||||
Licensed to Accellera Systems Initiative Inc. (Accellera)
|
|
||||||
under one or more contributor license agreements. See the
|
|
||||||
NOTICE file distributed with this work for additional
|
|
||||||
information regarding copyright ownership. Accellera licenses
|
|
||||||
this file to you under the Apache License, Version 2.0 (the
|
|
||||||
"License"); you may not use this file except in compliance
|
|
||||||
with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing,
|
|
||||||
software distributed under the License is distributed on an
|
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
KIND, either express or implied. See the License for the
|
|
||||||
specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
|
|
||||||
*****************************************************************************/
|
|
||||||
// this code compiles and runs with our latest prototype for this specification
|
|
||||||
|
|
||||||
#include <scv.h>
|
|
||||||
#include <systemc.h>
|
|
||||||
|
|
||||||
// hack to fake a true fifo_mutex
|
|
||||||
#define fifo_mutex sc_mutex
|
|
||||||
|
|
||||||
const unsigned ram_size = 256;
|
|
||||||
|
|
||||||
class rw_task_if : virtual public sc_interface {
|
|
||||||
public:
|
|
||||||
typedef sc_uint<8> addr_t;
|
|
||||||
typedef sc_uint<8> data_t;
|
|
||||||
struct write_t {
|
|
||||||
addr_t addr;
|
|
||||||
data_t data;
|
|
||||||
};
|
|
||||||
|
|
||||||
virtual data_t read(const addr_t*) = 0;
|
|
||||||
virtual void write(const write_t*) = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
SCV_EXTENSIONS(rw_task_if::write_t) {
|
|
||||||
public:
|
|
||||||
scv_extensions<rw_task_if::addr_t> addr;
|
|
||||||
scv_extensions<rw_task_if::data_t> data;
|
|
||||||
SCV_EXTENSIONS_CTOR(rw_task_if::write_t) {
|
|
||||||
SCV_FIELD(addr);
|
|
||||||
SCV_FIELD(data);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class pipelined_bus_ports : public sc_module {
|
|
||||||
public:
|
|
||||||
sc_in< bool > clk;
|
|
||||||
sc_inout< bool > rw;
|
|
||||||
sc_inout< bool > addr_req;
|
|
||||||
sc_inout< bool > addr_ack;
|
|
||||||
sc_inout< sc_uint<8> > bus_addr;
|
|
||||||
sc_inout< bool > data_rdy;
|
|
||||||
sc_inout< sc_uint<8> > bus_data;
|
|
||||||
|
|
||||||
SC_CTOR(pipelined_bus_ports)
|
|
||||||
: clk("clk"), rw("rw"),
|
|
||||||
addr_req("addr_req"),
|
|
||||||
addr_ack("addr_ack"), bus_addr("bus_addr"),
|
|
||||||
data_rdy("data_rdy"), bus_data("bus_data") {}
|
|
||||||
};
|
|
||||||
|
|
||||||
class rw_pipelined_transactor
|
|
||||||
: public rw_task_if,
|
|
||||||
public pipelined_bus_ports {
|
|
||||||
|
|
||||||
fifo_mutex addr_phase;
|
|
||||||
fifo_mutex data_phase;
|
|
||||||
|
|
||||||
scv_tr_stream pipelined_stream;
|
|
||||||
scv_tr_stream addr_stream;
|
|
||||||
scv_tr_stream data_stream;
|
|
||||||
scv_tr_generator<sc_uint<8>, sc_uint<8> > read_gen;
|
|
||||||
scv_tr_generator<sc_uint<8>, sc_uint<8> > write_gen;
|
|
||||||
scv_tr_generator<sc_uint<8> > addr_gen;
|
|
||||||
scv_tr_generator<sc_uint<8> > data_gen;
|
|
||||||
|
|
||||||
public:
|
|
||||||
rw_pipelined_transactor(sc_module_name nm) :
|
|
||||||
pipelined_bus_ports(nm),
|
|
||||||
addr_phase("addr_phase"),
|
|
||||||
data_phase("data_phase"),
|
|
||||||
pipelined_stream("pipelined_stream", "transactor"),
|
|
||||||
addr_stream("addr_stream", "transactor"),
|
|
||||||
data_stream("data_stream", "transactor"),
|
|
||||||
read_gen("read",pipelined_stream,"addr","data"),
|
|
||||||
write_gen("write",pipelined_stream,"addr","data"),
|
|
||||||
addr_gen("addr",addr_stream,"addr"),
|
|
||||||
data_gen("data",data_stream,"data")
|
|
||||||
{}
|
|
||||||
virtual data_t read(const addr_t* p_addr);
|
|
||||||
virtual void write(const write_t * req);
|
|
||||||
};
|
|
||||||
class test : public sc_module {
|
|
||||||
public:
|
|
||||||
sc_port< rw_task_if > transactor;
|
|
||||||
SC_CTOR(test) {
|
|
||||||
SC_THREAD(main);
|
|
||||||
}
|
|
||||||
void main();
|
|
||||||
};
|
|
||||||
|
|
||||||
class write_constraint : virtual public scv_constraint_base {
|
|
||||||
public:
|
|
||||||
scv_smart_ptr<rw_task_if::write_t> write;
|
|
||||||
SCV_CONSTRAINT_CTOR(write_constraint) {
|
|
||||||
SCV_CONSTRAINT( write->addr() <= ram_size );
|
|
||||||
SCV_CONSTRAINT( write->addr() != write->data() );
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
inline void process(scv_smart_ptr<int> data) {}
|
|
||||||
class design : public pipelined_bus_ports {
|
|
||||||
std::list< sc_uint<8> > outstandingAddresses;
|
|
||||||
std::list< bool > outstandingType;
|
|
||||||
sc_uint<8> memory[ram_size];
|
|
||||||
|
|
||||||
public:
|
|
||||||
SC_HAS_PROCESS(design);
|
|
||||||
design(sc_module_name nm) : pipelined_bus_ports(nm) {
|
|
||||||
for (unsigned i=0; i<ram_size; ++i) { memory[i] = i; }
|
|
||||||
SC_THREAD(addr_phase);
|
|
||||||
SC_THREAD(data_phase);
|
|
||||||
}
|
|
||||||
void addr_phase();
|
|
||||||
void data_phase();
|
|
||||||
};
|
|
@ -1,49 +0,0 @@
|
|||||||
/*
|
|
||||||
* top1.cpp
|
|
||||||
*
|
|
||||||
* Created on: 02.12.2018
|
|
||||||
* Author: eyck
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "txtop.h"
|
|
||||||
using namespace sc_core;
|
|
||||||
|
|
||||||
tx_top::tx_top(sc_core::sc_module_name nm)
|
|
||||||
: sc_module(nm)
|
|
||||||
, clk("clk", 20.0, SC_NS, 0.5 ,0.0, SC_NS, true)
|
|
||||||
, rw("rw")
|
|
||||||
, addr_req("addr_reg")
|
|
||||||
, addr_ack("addr_ack")
|
|
||||||
, bus_addr("bus_addr")
|
|
||||||
, data_rdy("data_rdy")
|
|
||||||
, bus_data("bus_data")
|
|
||||||
, t("t")
|
|
||||||
, tr("tr")
|
|
||||||
, duv("duv")
|
|
||||||
{
|
|
||||||
// TODO Auto-generated constructor stub
|
|
||||||
// connect them up
|
|
||||||
t.transactor(tr);
|
|
||||||
|
|
||||||
tr.clk(clk);
|
|
||||||
tr.rw(rw);
|
|
||||||
tr.addr_req(addr_req);
|
|
||||||
tr.addr_ack(addr_ack);
|
|
||||||
tr.bus_addr(bus_addr);
|
|
||||||
tr.data_rdy(data_rdy);
|
|
||||||
tr.bus_data(bus_data);
|
|
||||||
|
|
||||||
duv.clk(clk);
|
|
||||||
duv.rw(rw);
|
|
||||||
duv.addr_req(addr_req);
|
|
||||||
duv.addr_ack(addr_ack);
|
|
||||||
duv.bus_addr(bus_addr);
|
|
||||||
duv.data_rdy(data_rdy);
|
|
||||||
duv.bus_data(bus_data);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
tx_top::~tx_top() {
|
|
||||||
// TODO Auto-generated destructor stub
|
|
||||||
}
|
|
||||||
|
|
@ -1,31 +0,0 @@
|
|||||||
/*
|
|
||||||
* top1.h
|
|
||||||
*
|
|
||||||
* Created on: 02.12.2018
|
|
||||||
* Author: eyck
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef TXTOP_H_
|
|
||||||
#define TXTOP_H_
|
|
||||||
|
|
||||||
#include "tx_example_mods.h"
|
|
||||||
#include <systemc>
|
|
||||||
|
|
||||||
class tx_top: public sc_core::sc_module {
|
|
||||||
public:
|
|
||||||
tx_top(sc_core::sc_module_name nm);
|
|
||||||
virtual ~tx_top();
|
|
||||||
sc_core::sc_clock clk;
|
|
||||||
sc_core::sc_signal< bool > rw;
|
|
||||||
sc_core::sc_signal< bool > addr_req;
|
|
||||||
sc_core::sc_signal< bool > addr_ack;
|
|
||||||
sc_core::sc_signal< sc_dt::sc_uint<8> > bus_addr;
|
|
||||||
sc_core::sc_signal< bool > data_rdy;
|
|
||||||
sc_core::sc_signal< sc_dt::sc_uint<8> > bus_data;
|
|
||||||
test t;
|
|
||||||
rw_pipelined_transactor tr;
|
|
||||||
design duv;
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /* TXTOP_H_ */
|
|
@ -1,41 +1,56 @@
|
|||||||
import os.path
|
import os.path
|
||||||
import cppyy
|
import logging
|
||||||
from cppyy import gbl as cpp
|
from cppyy import gbl as cpp
|
||||||
import pysysc as scpy
|
import pysysc
|
||||||
###############################################################################
|
###############################################################################
|
||||||
# setup and load
|
# setup and load
|
||||||
###############################################################################
|
###############################################################################
|
||||||
myDir = os.path.dirname( os.path.realpath(__file__))
|
myDir = os.path.dirname( os.path.realpath(__file__))
|
||||||
conan_err = scpy.read_config_from_conan(os.path.join(myDir, 'conanfile.txt'))
|
conan_err = pysysc.read_config_from_conan(os.path.join(myDir, 'conanfile.txt'))
|
||||||
scpy.load_systemc()
|
pysysc.load_systemc()
|
||||||
print("Loading SC-Components lib")
|
logging.debug("Loading SC-Components lib")
|
||||||
scpy.add_include_path(os.path.join(myDir, 'sc-components/incl'))
|
pysysc.add_include_path(os.path.join(myDir, 'sc-components/incl'))
|
||||||
scpy.add_library('scc.h', os.path.join(myDir, 'build/Debug/lib/libsc-components.so'))
|
pysysc.add_library('scc.h', os.path.join(myDir, 'build/Debug/lib/libsc-components.so'))
|
||||||
print("Loading Components lib")
|
logging.debug("Loading Components lib")
|
||||||
scpy.add_include_path(os.path.join(myDir, 'components'))
|
pysysc.add_include_path(os.path.join(myDir, 'components'))
|
||||||
scpy.add_library('components.h', os.path.join(myDir, 'build/Debug/lib/libcomponents.so'))
|
pysysc.add_library('components.h', os.path.join(myDir, 'build/Debug/lib/libcomponents.so'))
|
||||||
###############################################################################
|
###############################################################################
|
||||||
# configure
|
# configure
|
||||||
###############################################################################
|
###############################################################################
|
||||||
#cpp.IoRedirector.get().start()
|
|
||||||
cpp.scc.init_logging(cpp.logging.INFO, False);
|
cpp.scc.init_logging(cpp.logging.INFO, False);
|
||||||
|
#cpp.scc.init_logging(cpp.logging.WARNING, False);
|
||||||
cpp.sc_core.sc_report_handler.set_actions(cpp.sc_core.SC_ID_MORE_THAN_ONE_SIGNAL_DRIVER_, cpp.sc_core.SC_DO_NOTHING);
|
cpp.sc_core.sc_report_handler.set_actions(cpp.sc_core.SC_ID_MORE_THAN_ONE_SIGNAL_DRIVER_, cpp.sc_core.SC_DO_NOTHING);
|
||||||
###############################################################################
|
###############################################################################
|
||||||
# instantiate
|
# instantiate
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
clkgen = cpp.ClkGen(cpp.sc_core.sc_module_name("clk_gen"))
|
||||||
|
rstgen = cpp.ResetGen(cpp.sc_core.sc_module_name("rst_gen"))
|
||||||
initiator = cpp.Initiator(cpp.sc_core.sc_module_name("initiator"))
|
initiator = cpp.Initiator(cpp.sc_core.sc_module_name("initiator"))
|
||||||
memories = [cpp.Memory(cpp.sc_core.sc_module_name(name)) for name in ["mem0", "mem1", "mem2", "mem3"]]
|
memories = [cpp.Memory(cpp.sc_core.sc_module_name(name)) for name in ["mem0", "mem1", "mem2", "mem3"]]
|
||||||
router = cpp.Router[4](cpp.sc_core.sc_module_name("router"))
|
router = cpp.Router[4](cpp.sc_core.sc_module_name("router"))
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
# signals
|
||||||
|
##################‚‚‚sS#############################################################
|
||||||
|
sig_clk = cpp.sc_core.sc_signal[cpp.sc_core.sc_time]("clk")
|
||||||
|
sig_rst = cpp.sc_core.sc_signal[cpp.sc_dt.sc_logic]("rst")
|
||||||
|
###############################################################################
|
||||||
# connect it
|
# connect it
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
clkgen.clk_o(sig_clk)
|
||||||
|
rstgen.reset_o(sig_rst)
|
||||||
initiator.socket.bind(router.target_socket)
|
initiator.socket.bind(router.target_socket)
|
||||||
|
initiator.clk_i(sig_clk)
|
||||||
|
initiator.reset_i(sig_rst)
|
||||||
|
router.clk_i(sig_clk)
|
||||||
|
router.reset_i(sig_rst)
|
||||||
for idx,m in enumerate(memories):
|
for idx,m in enumerate(memories):
|
||||||
router.initiator_socket.at(idx).bind(m.socket)
|
router.initiator_socket.at(idx).bind(m.socket)
|
||||||
|
m.clk_i(sig_clk)
|
||||||
|
m.reset_i(sig_rst)
|
||||||
###############################################################################
|
###############################################################################
|
||||||
# run if it is standalone
|
# run if it is standalone
|
||||||
###############################################################################
|
###############################################################################
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
cpp.sc_core.sc_in_action=True
|
cpp.sc_core.sc_in_action=True
|
||||||
cpp.sc_core.sc_start()
|
cpp.sc_core.sc_start()
|
||||||
print("Done")
|
logging.debug("Done")
|
||||||
|
49
router_example2.py
Normal file
49
router_example2.py
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
import os.path
|
||||||
|
import logging
|
||||||
|
from cppyy import gbl as cpp
|
||||||
|
import pysysc
|
||||||
|
from pysysc.structural import Connection, Module, Signal
|
||||||
|
###############################################################################
|
||||||
|
# setup and load
|
||||||
|
###############################################################################
|
||||||
|
myDir = os.path.dirname( os.path.realpath(__file__))
|
||||||
|
conan_err = pysysc.read_config_from_conan(os.path.join(myDir, 'conanfile.txt'))
|
||||||
|
pysysc.load_systemc()
|
||||||
|
logging.debug("Loading SC-Components lib")
|
||||||
|
pysysc.add_include_path(os.path.join(myDir, 'sc-components/incl'))
|
||||||
|
pysysc.add_library('scc.h', os.path.join(myDir, 'build/Debug/lib/libsc-components.so'))
|
||||||
|
logging.debug("Loading Components lib")
|
||||||
|
pysysc.add_include_path(os.path.join(myDir, 'components'))
|
||||||
|
pysysc.add_library('components.h', os.path.join(myDir, 'build/Debug/lib/libcomponents.so'))
|
||||||
|
###############################################################################
|
||||||
|
# configure
|
||||||
|
###############################################################################
|
||||||
|
cpp.scc.init_logging(cpp.logging.INFO, False);
|
||||||
|
#cpp.scc.init_logging(cpp.logging.WARNING, False);
|
||||||
|
cpp.sc_core.sc_report_handler.set_actions(cpp.sc_core.SC_ID_MORE_THAN_ONE_SIGNAL_DRIVER_, cpp.sc_core.SC_DO_NOTHING);
|
||||||
|
###############################################################################
|
||||||
|
# instantiate
|
||||||
|
###############################################################################
|
||||||
|
clk_gen = Module(cpp.ClkGen).create("clk_gen")
|
||||||
|
rst_gen = Module(cpp.ResetGen).create("rst_gen")
|
||||||
|
initiator = Module(cpp.Initiator).create("initiator")
|
||||||
|
memories = [Module(cpp.Memory).create(name) for name in ["mem0", "mem1", "mem2", "mem3"]]
|
||||||
|
router = Module(cpp.Router[4]).create("router")
|
||||||
|
###############################################################################
|
||||||
|
# connect it
|
||||||
|
###############################################################################
|
||||||
|
clk = Signal("clk").src(clk_gen.clk_o).sink(initiator.clk_i).sink(router.clk_i)
|
||||||
|
[clk.sink(m.clk_i) for m in memories]
|
||||||
|
rst = Signal("rst").src(rst_gen.reset_o).sink(initiator.reset_i).sink(router.reset_i)
|
||||||
|
[rst.sink(m.reset_i) for m in memories]
|
||||||
|
Connection().src(initiator.socket).sink(router.target_socket)
|
||||||
|
for idx,m in enumerate(memories):
|
||||||
|
Connection().src(router.initiator_socket.at(idx)).sink(m.socket)
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
# run if it is standalone
|
||||||
|
###############################################################################
|
||||||
|
if __name__ == "__main__":
|
||||||
|
cpp.sc_core.sc_in_action=True
|
||||||
|
cpp.sc_core.sc_start()
|
||||||
|
logging.debug("Done")
|
@ -30,6 +30,7 @@ int sc_main(int argc, char *argv[]) {
|
|||||||
// configure logging
|
// configure logging
|
||||||
///////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////
|
||||||
scc::init_logging(logging::INFO);
|
scc::init_logging(logging::INFO);
|
||||||
|
//scc::init_logging(logging::WARNING);
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////
|
||||||
// instantiate top level
|
// instantiate top level
|
||||||
|
56
top/top.h
Normal file
56
top/top.h
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
#ifndef TOP_H
|
||||||
|
#define TOP_H
|
||||||
|
|
||||||
|
#include <clkgen.h>
|
||||||
|
#include <resetgen.h>
|
||||||
|
#include <initiator.h>
|
||||||
|
#include <target.h>
|
||||||
|
#include <router.h>
|
||||||
|
|
||||||
|
SC_MODULE(Top) {
|
||||||
|
|
||||||
|
ClkGen * clk_gen;
|
||||||
|
ResetGen* reset_gen;
|
||||||
|
Initiator* initiator;
|
||||||
|
Router<4>* router;
|
||||||
|
Memory* memory[4];
|
||||||
|
|
||||||
|
Top(const sc_core::sc_module_name& nm)
|
||||||
|
: sc_core::sc_module()
|
||||||
|
, clk("clk")
|
||||||
|
, reset("reset")
|
||||||
|
{
|
||||||
|
// Instantiate components
|
||||||
|
clk_gen=new ClkGen("clk_gen");
|
||||||
|
reset_gen=new ResetGen("reset_gen");
|
||||||
|
initiator = new Initiator("initiator");
|
||||||
|
router = new Router<4>("router");
|
||||||
|
for (int i = 0; i < 4; i++) {
|
||||||
|
char txt[20];
|
||||||
|
sprintf(txt, "memory_%d", i);
|
||||||
|
memory[i] = new Memory(txt);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Bind sockets
|
||||||
|
initiator->socket.bind(router->target_socket);
|
||||||
|
for (int i = 0; i < 4; i++)
|
||||||
|
router->initiator_socket[i].bind(memory[i]->socket);
|
||||||
|
// connect signals
|
||||||
|
clk_gen->clk_o(clk);
|
||||||
|
reset_gen->reset_o(reset);
|
||||||
|
initiator->clk_i(clk);
|
||||||
|
initiator->reset_i(reset);
|
||||||
|
|
||||||
|
router->clk_i(clk);
|
||||||
|
router->reset_i(reset);
|
||||||
|
|
||||||
|
for(auto& m: memory){
|
||||||
|
m->clk_i(clk);
|
||||||
|
m->reset_i(reset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sc_core::sc_signal<sc_core::sc_time> clk;
|
||||||
|
sc_core::sc_signal<sc_dt::sc_logic> reset;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue
Block a user