Jump to content

TRANG

Members
  • Content Count

    52
  • Joined

  • Last visited

  • Days Won

    1

Everything posted by TRANG

  1. Hi all, I have 2 models, model A and model B Model A has an output port out_A (bool) Model B has an input port in_B (bool) when integrate, I will instance 3 objects of Model A, 1 object of Model B //file @connection.cpp ... void initializeENV(){ ... objA_1 = new ModelA("objA_1"); objA_2 = new ModelA("objA_2"); objA_3 = new ModelA("objA_3"); objB = new ModelB("objB"); ... } the value of in_B = objA_1->out_A or objA_2->out_A or objA_3->out_A I think that, if I bind as below . It is wrong. Because of when objA_1->out_A is change then affect to obj_2->out_A and objA_3->out_A. Is my understand correct? //file @connection.cpp ... sc_signal<bool> sig_1; sc_signal<bool> sig_2; sc_signal<bool> sig_3; void initializeENV(){ ... objA_1 = new ModelA("objA_1"); objA_2 = new ModelA("objA_2"); objA_3 = new ModelA("objA_3"); objB = new ModelB("objB"); objA_1->out_A(sig_1); objA_2->out_A(sig_2); objA_3->out_A(sig_3); objB->in_B(sig_1); objB->in_B(sig_2); objB->in_B(sig_3); ... } How to resolve it? How to bind 3 out_A ports to in_B port? .I can't use SC_METHOD in this case. Thank all.
  2. TRANG

    Initial value port

    Hi all, sc_in<type> input; sc_out<type> output; sc_signal<type> signal; Do you need set Initial value ( use write(0); ) for output and signal port or it auto set 0 when declare? Thank all.
  3. Master and Slave use same clock, so I think Slave need only care data_in. class slave : public sc_module { public: sc_in<bool> clk; sc_in<uint32_t> data_in; slave(sc_module_name name):clk("clk"),data_in("data_in"){ SC_HAS_PROCESS(slave); SC_METHOD(run); dont_initialize(); sensitive << data_in; } void run(){ cout<<hex<<data_in.read()<<endl; } ~slave(){ } }; or class slave : public sc_module { public: sc_in<bool> clk; sc_in<uint32_t> data_in; slave(sc_module_name name):clk("clk"),data_in("data_in"){ SC_HAS_PROCESS(slave); SC_THREAD(run); dont_initialize(); sensitive << data_in; } void run(){ cout<<hex<<data_in.read()<<endl; } ~slave(){ } };
  4. TRANG

    timer with systemC

    Hi all, I'm using systemC to build timer model. ( Timer support compares match, overflow, underflow) //constructor SC_METHOD(evaluate_method); dont_initialize(); sensitive << m_evaluate; SC_METHOD(update_method); dont_initialize(); sensitive << m_update; void GTimer::evaluate_method() { //check if compare match if(CNT_value == compare_match_value){ compare_match_handling(); } ... m_update.notify((double)period * compare_match_value, time_unit); } void GTimer::update_method() { CNT_value = get_counter_value(); m_evaluate.notify(); } GT_API unsigned int GTimer::get_counter_value() { unsigned int value; sc_time current_time = sc_time_stamp(); value = (current_time.to_double() - start_time.to_double()) / period; return value; } Ex: I set compare_match_value = 2; period = 1000.0 time_unit = SC_PS when I start timer and simulate on 2* period sc_start(2*period ,time_unit) compare match don't occur. because the time simulate is over but m_update event not trigger. If I start timer and simulate on 3* period compare match occur. Do you have any idea? ( I want to compare match occur when I start timer and simulate on 2*period) Thank all.
  5. TRANG

    timer with systemC

    Thank for your support,
  6. TRANG

    timer with systemC

    I'm sorry make you confused. Summary: if my test case is: sc_start(2*period,time_unit); while (sc_pending_activity_at_current_time()) { sc_start(SC_ZERO_TIME); } or sc_start(3*period,time_unit); then compare match occur.( is correct) If my test case is: sc_start(2*period,time_unit); then compare match don't occur . I want to my source code detect when time simulate near the over to pending to execute event m_update before over.
  7. TRANG

    timer with systemC

    i try : void GTimer::end_of_simulation() { while (sc_pending_activity_at_current_time()) { sc_start(SC_ZERO_TIME); } } But It is not true? My problem is the time simulates is over before trigger event. I want to force trigger event before end simulate.
  8. TRANG

    timer with systemC

    Thanks @Philipp A Hartmann it is OK if I use : sc_start(2*period,time_unit); while( sc_pending_activity_at_current_time() ) sc_start( SC_ZERO_TIME ); But I want to pending in my code. Is it possible?
  9. TRANG

    timer with systemC

    Thank @Eyck I understand that. Do you have any idea for this problem? How to resolve? Thanks very much.
  10. TRANG

    Scope of SC_HAS_PROCESS

    Hi @CapUnderPantsRLZ in 1666-2011.pdf So, I think @David Black is exactly. https://stackoverflow.com/questions/45308468/systemc-multiple-module-implementations-in-single-cpp-file
  11. Hi all, I try code bellow SC_METHOD(APMMethod); sensitive << mAPMEvent; ... void APMMethod(){ printf("Reset port\n"); ... } ... void Initialize() { for(unsigned int i=0; i< 50; i++){ mAPM_reg[i].value = 0; printf("Initialize %s\n",mAPM_reg[i].name); } } ... void EnableReset(){ //reset port mAPMEvent.notify(SC_ZERO_TIME); //initialize reg Initialize(); } When EnableReset occur. My output is: Intialize APM_REG1 Intialize APM_REG2 ... Reset port I try with mAPMEvent.notify(); But the same output. 1. why Initialize() call before APMMethod(). 2. when to use notiffy() or notify(SC_ZERO_TIME)? Thanks all.
  12. TRANG

    How to Method work with event?

    Thank you so much, @David Black
  13. Hi all, Can you explain about ideas of "Timing annotation", "Temporal decoupling", "Quantum keeper"? How do you use it?.
  14. TRANG

    sensitivity list

    I can't see that because my lib is 2.3.1. So, with 2.3.1, we don't have a solution. Thank Philipp.
  15. TRANG

    sensitivity list

    Hi @David Black, If I have sc_event event1; sc_event event2; ... SC_METHOD( My_method ); sensitive << event1 << event2; dont_initialize(); How to detect My_method sensitive by event1 or event2?
  16. TRANG

    sensitivity list

    sensitive<< rd_addr I think above code is illegal. You can declare event. If new value rd_addr != old value rd_addr then notify event .
  17. I read some source code. class TlmExtension : public tlm_extension<TlmExtension> { ... }; void setExtension(tlm::tlm_generic_payload &in, tlm::tlm_generic_payload &out) { TlmExtension *input = (TlmExtension *)0; TlmExtension *output = new TlmExtension; in.get_extension(input); if (input != NULL) { output->setNum(input->getNum()); output->setChannel(input->getChannel()); out.set_extension(output); } } I think above code is wrong. Because of when exit setExtension function. We cant delete object create by new operator (output ) How to resolve this problem? Thanks. BR.
  18. TRANG

    TLM extension

    Thank @Eyck As your comment, my understand that 1. It is done in the destructor of the the tlm_generic_payload ( both AT and LT style ) 2. The other option is to call free_all_extensions() after transaction completed ( only AT style ) Is it correct? Thanks.
  19. Dear all, Can you explain the difference between ? sc_signal<unsigned int > port1; and sc_signal<sc_uint<32> > port2; When to use port1 and port2?
  20. TRANG

    sc_uint and unsigned int

    Thanks.
  21. I'm learning simple socket with 2 examples: ex1: https://www.doulos.com/knowhow/systemc/tlm2/tutorial__3/tlm2_getting_started_3.cpp ex2: in lib : systemc-2.3.3\examples\tlm\common\include\models\SimpleBusLT.h I know that : //Initiator tlm_utils::simple_initiator_socket<Initiator> initiator_socket; ... tlmTrans.set_data_length(emdata_length); tlmTrans.set_data_ptr(emdata_ptr); initiator_socket->b_transport(tlmTrans, localTime); ... //Target tlm_utils::simple_target_socket<Target> target_socket; ... target_socket.register_b_transport(this, &Target::b_transport); ... virtual void b_transport(tlm::tlm_generic_payload& trans, sc_time& delay) { //receive data from tlmTrans Initiator } I only understand "register_b_transport" function. But I see others function , Can you explain it? and how to use? //Initiator initiator_socket.register_invalidate_direct_mem_ptr(this, &Initiator::invalidateDMIPointers); ... //Target target_socket.register_b_transport(this, &Target::initiatorBTransport); target_socket.register_transport_dbg(this, &Target::transportDebug); target_socket.register_get_direct_mem_ptr(this, &Target::getDMIPointer);
  22. TRANG

    simple socket

    Thank for your help @AmeyaVS @Philipp A Hartmann Thanks so much!!!
  23. Hi all, I want to understand more about simple_initiator_sọket and simple_target_socket. How is it working?? Suppose, "Model A 3 initiator" --> <-- "3 target Model B" Case 1: //Model A tlm_utils::simple_initiator_socket_tagged<ModelA>* initiator_socket[3]; ... // Model B tlm_utils::simple_target_socket_tagged<ModelB>* target_socket[3]; ... //bind for(int i=0;i<3;i++){ objA->initiator_socket[i]->bind(objB->target_socket[i]); } Case 2: //Model A tlm_utils::simple_initiator_socket_tagged<ModelA>* initiator_socket1; tlm_utils::simple_initiator_socket_tagged<ModelA>* initiator_socket2; tlm_utils::simple_initiator_socket_tagged<ModelA>* initiator_socket3; ... // Model B tlm_utils::simple_target_socket_tagged<ModelB>* target_socket1; tlm_utils::simple_target_socket_tagged<ModelB>* target_socket2; tlm_utils::simple_target_socket_tagged<ModelB>* target_socket3; ... //bind objA->initiator_socket1->bind(objB->target_socket2) objA->initiator_socket2->bind(objB->target_socket3) objA->initiator_socket3->bind(objB->target_socket1) Question 1: Is both above code is correct? Question 2: In case 2, I set "bind" between Model A and Model B (unordered declare, initiator_socket1 with target_socket2 ,..... ). Is it right? Thanks all.
  24. TRANG

    simple socket

    Thanks @AmeyaVS how to set base name for each initiator_socket? Suppose, I have initiator_socket[4]. I only initialize initiator_socket as bellow code. sc_core::sc_vector< tlm_utils::simple_initiator_socket_tagged<Router > > initiator_socket; ... /// Router::Router():initiator_socket("initiator_socket",4) {} I can't set base name for each initiator_socket as my expected. ex: initiator_socket[0] : " initiator_0_socket" initiator_socket [ 1] : " initiator_1_socket" initiator_socket [ 2] : " initiator_2_socket" initiator_socket [ 3] : " initiator_3_socket"
  25. TRANG

    simple socket

    I change simple_initiator_socket_tagged<Router>* initiator_socket[N_TARGETS]; to: sc_vector< simple_initiator_socket_tagged<Router >* > initiator_socket; but cannot. Error C2825 'T': must be a class or namespace when followed by '::' ..\..\libs\systemc-2.3.2\src\sysc\utils\sc_vector.h 502
×