SlideShare una empresa de Scribd logo
1 de 50
Communication Channels
按一下以編輯母片副標題樣式

林敬倫 , 蘇文鈺
成大資訊
2010/12
Without Channels
•

One can still exchange data among modules.

•

Problems:
–

Data access may not be well scheduled.

–

It is possible that multiple processes try to access but clear order is not set up.

–

Events can be used to set up the order but it is likely that events may be
missed.

–

No handshaking mechanism is embedded.

–

It does not map to HW architecture.

–

And so on….
Using channels
•

•

•

•

For all communication issues, it is recommended to solve the
above problems using channels.
Channel is a SystemC embedded mechanism.
Can be used to map to real HW architecture and
communication protocols.
Two basic types of channels are provided:
–

Primitive

–

Hierarchical
Primitive Channels
•

For “primitive” type, no process, hierarchy,
and so on in order to make the channels fast.

•

Inherit from the base class, sc_prim_channel.

•

Three simple SystemC channels:
–

sc_mutex

–

sc_semaphore

–

sc_fifo
sc_mutex
•

•

•

•

•

Mutex is a program object allowing multiple threads to share a common
resource without colliding.
During elaboration, a mutex is created. Then, any process wants to use
the resource must lock the mutex to prevent others from accessing the
same source. After its access, the process must unlock the mutex to let
others access the resource.
When a process try to access a locked mutex, it is prevented until the
mutex is unlocked.
In SystemC, both blocking and unblocking types are supported.
No signal is available to indicate that a mutex is available. SO, using
trylock may be a method but it may slow down the simulation.
sc_mutex syntax
•

sc_mutex name_of_mutex
–

–

name_of_mutex.trylock();//non-blocking

–

•

name_of_mutex.lock();//blocking

name_of_mutex.unlock();

下圖是一個簡單的 bus based 的範例,其中
有兩個 masters 加上一個 slave 以及一個簡
單的 bus arbiter
Mutex_bus
Arbitration:
Using sc_mutex

master0

master1

slave
Main.cpp
slave slave0("slave0");
bus bus0("bus0");

#include <systemc.h>
#include "master0.h"
#include "master1.h"
#include "slave.h"
#include "bus.h"
int sc_main (int argc , char *argv[])
{
sc_clock clk("clk0", 1 , SC_NS ,
0.5);

master0.clk(clk);
master1.clk(clk);
master0.write_port(bus0);
master1.write_port(bus0);
bus0.write_port(slave0);

master0 master0("master0");
master1 master1("master1");

sc_start(50, SC_NS);
cout << endl << endl;
return 0;
}
Master0.h
#ifndef MASTER0_H
#define MASTER0_H
#include <systemc.h>
#include "bus_if.h"
class master0 : public sc_module
{
public:
// clk
sc_in_clk
clk;

void master0::t1()
{
while(1){
wait();
sc_time_stamp().print();
printf("master0 request!n");
write_port->write(1,32);

// port declaration
sc_port<bus_if,1> write_port;
void t1();
SC_HAS_PROCESS(master0);

master0(sc_module_name
name)
{
SC_THREAD(t1);
sensitive << clk.pos();
}
};

wait(11,SC_NS);
sc_time_stamp().print();
printf("master0 request!n");
write_port->write(5,53);
wait(11,SC_NS);
}
}
#endif // MASTER0_H
Master1.h
#ifndef MASTER1_H
#define MASTER1_H
#include <systemc.h>
#include "bus_if.h"
class master1 : public sc_module
{
public:
// clk
sc_in_clk
clk;

};

master1(sc_module_name name)
{
SC_THREAD(t1);
sensitive << clk.pos();
}

void master1::t1()
{
while(1){

wait();

// port declaration
sc_port<bus_if,1> write_port;

sc_time_stamp().print();
printf("master1 request!n");
write_port->write(3,60);

void t1();

wait(10,SC_NS);

SC_HAS_PROCESS(master1);

sc_time_stamp().print();
printf("master1 request!n");
write_port->write(5,44);
}

wait(10,SC_NS);

}
#endif // MASTER1_H
Bus.h & Bus_if.h
#ifndef BUS_H
#define BUS_H
#include <systemc.h>
#include "bus_if.h"
class bus :public bus_if, public sc_module
{
public:
// port declaration
sc_port<bus_if,1> write_port;

data);

// bus_if function
void write(unsigned addr, int
// constructor
bus(sc_module_name);

private:

// sc_mutex declaration
sc_mutex bus_mutex;

};
#endif // BUS_H

#ifndef BUS_IF_H
#define BUS_IF_H
#include <systemc.h>
class bus_if : public sc_interface
{
// pure virtual function
public:
virtual void write(unsigned addr, int data) = 0;
};
#endif // BUS_IF_H
Bus.cpp
#include "bus.h"
bus::bus(sc_module_name nm) : sc_module(nm)
{
}
void bus::write(unsigned addr, int data)
{
// sc_mutex lock process, wait for unlock
bus_mutex.lock();
write_port->write(addr,data);

}

// sc_mutex unlock
bus_mutex.unlock();
Slave.h
#ifndef SLAVE_H
#define SLAVE_H
#include <systemc.h>
#include "bus_if.h"
class slave : public sc_module , public bus_if
{
public:
void write(unsigned addr, int data);
slave(sc_module_name name)
{
for(int a = 0 ; a<32 ; a++)
{
memory[a] = 0;
}
}

private:
int memory[32];
};
void slave::write(unsigned addr, int data)
{
memory[addr] = data;
wait(2, SC_NS);
sc_time_stamp().print();
printf(" slave get data %d at addr %d !n",data,addr);
}
#endif // SLAVE_H
result
sc_semaphore
•

To have more than one resources to choose from, one can use
semaphore.

•

Mutex here is one special case of semaphore.

•

When a process finishes with a resource, it must post a notice.

•

Syntax: sc_semaphore name_or_semaphore(count)
–

name_of_semaphore.wait(); //blocking

–

name_of_semaphore.trywait(); //non-blocking

–

name_of_semaphore.get_value();// return # of free semaphores

–

name_of_semaphore.post(); //when free a resource
Simple Bus Model
•

一樣是一個簡單的 Bus Model 的範例 , 因為
要求是可以有好幾個 Modules 同時進來 ,
所以可以用 Semaphore 來實現 .

09/12/9
Sem_bus
Arbitration:
Using sc_semaphore

master0

master1

slave

09/12/9
Main.cpp
slave slave0("slave0");
bus bus0("bus0");

#include <systemc.h>
#include "master0.h"
#include "master1.h"
#include "slave.h"
#include "bus.h"

master0.clk(clk);
master1.clk(clk);
master0.write_port(bus0);
master1.write_port(bus0);
bus0.write_port(slave0);

int sc_main (int argc , char *argv[])
{
sc_clock clk("clk0", 1 , SC_NS ,
0.5);

sc_start(50, SC_NS);
cout << endl << endl;
return 0;

master0 master0("master0");
master1 master1("master1");
}
#ifndef MASTER0_H
#define MASTER0_H
#include <systemc.h>
#include "bus_if.h"

Master0.h

class master0 : public sc_module
{
public:
// clk
sc_in_clk
clk;

void master0::t1()
{
while(1){
wait();
sc_time_stamp().print();
printf("master0 request!n");
write_port->write(1,32);

// port declaration
sc_port<bus_if,1> write_port;
void t1();
SC_HAS_PROCESS(master0);
master0(sc_module_name name)
{
SC_THREAD(t1);
sensitive << clk.pos();
}
};

wait(11,SC_NS);
sc_time_stamp().print();
printf("master0 request!n");
write_port->write(5,53);
wait(11,SC_NS);
}
}
#endif // MASTER0_H
Master1.h
#ifndef MASTER1_H
#define MASTER1_H
#include <systemc.h>
#include "bus_if.h"
class master1 : public sc_module
{
public:
// clk
sc_in_clk
clk;

};

master1(sc_module_name name)
{
SC_THREAD(t1);
sensitive << clk.pos();
}

void master1::t1()
{
while(1){

wait();
sc_time_stamp().print();
printf("master1 request!n");
write_port->write(3,60);

// port declaration
sc_port<bus_if,1>
write_port;

wait(10,SC_NS);

void t1();

sc_time_stamp().print();
printf("master1 request!n");
write_port->write(5,44);

SC_HAS_PROCESS(master1);

}

wait(10,SC_NS);

}
#endif // MASTER1_H
Bus.h & Bus_if.h
#ifndef BUS_H
#define BUS_H
#include <systemc.h>
#include "bus_if.h"
class bus :public bus_if, public sc_module
{
public:
// port declaration
sc_port<bus_if,1> write_port;

data);

// bus_if function
void write(unsigned addr, int
// constructor
bus(sc_module_name);

private:

// sc_semaphore declaration
sc_semaphore write_sem;

};
#endif // BUS_H

#ifndef BUS_IF_H
#define BUS_IF_H
#include <systemc.h>
class bus_if : public sc_interface
{
// pure virtual function
public:
virtual void write(unsigned addr, int data) = 0;
};
#endif // BUS_IF_H
Bus.cpp
#include "bus.h"
// write_sem constructor assign count = 1
bus::bus(sc_module_name nm) : sc_module(nm), write_sem(1)
{
}
void bus::write(unsigned addr, int data)
{
// sc_semaphore.wait, count-- (1=>0)
write_sem.wait();
write_port->write(addr,data);

}

// sc_semaphore.post, count++ (0=>1)
write_sem.post();
Slave.h
#ifndef SLAVE_H
#define SLAVE_H
#include <systemc.h>
#include "bus_if.h"
class slave : public sc_module , public bus_if
{
public:
void write(unsigned addr, int data);
slave(sc_module_name name)
{
for(int a = 0 ; a<32 ; a++)
{
memory[a] = 0;
}
}

private:
int memory[32];
};
void slave::write(unsigned addr, int data)
{
memory[addr] = data;
wait(2, SC_NS);
sc_time_stamp().print();
printf(" slave get data %d at addr %d !n",data,addr);
}
#endif // SLAVE_H
result
SC_FIFO
•

Good for architecture modeling

•

Suitable for data flow modeling too.

•

Simple to implement.

•

Default sc_fifo depth is 16, with its data type specified.

•

The data type of sc_fifo can be complex structure.

•

It can be used to buffer data between two processing units,
data packets in communication networks, and so on.
Bus Wrapper
•

接續上面的 Bus Model, 接到 Bus 的 Module
有一個 Wrapper, Wrapper 上有一個 FIFO 來
當 buffer, 這樣就可以運用 sc_fifo 來當練習
了.
FIFO_bus
Arbitration:
Using wrapper(sc_fifo)

master0

master1

wrapper

slave
Main.cpp
#include <systemc.h>
#include "master0.h"
#include "master1.h"
#include "wrapper.h"
#include "slave.h"
#include "bus.h"

wrapper wrapper0("wrapper0");
slave slave0("slave0");
bus bus0("bus0");

int sc_main (int argc , char *argv[])
{
sc_clock clk0("clk0", 1 , SC_NS ,
0.5);

master0.write_port(wrapper0);
master1.write_port(wrapper0);
wrapper0.write_port(bus0);
bus0.write_port(slave0);

master0
master0("master0");
master1
master1("master1");

sc_start(50, SC_NS);
cout << endl << endl;
return 0;

master0.clk(clk0);
master1.clk(clk0);
wrapper0.clk(clk0);

}
#ifndef MASTER0_H
#define MASTER0_H
#include <systemc.h>
#include "bus_if.h"

Master0.h

class master0 : public sc_module
{
public:
// clk
sc_in_clk
clk;

void master0::t1()
{
while(1){
wait();
sc_time_stamp().print();
printf("master0 request!n");
write_port->write(1,32);

// port declaration
sc_port<bus_if,1> write_port;
void t1();
SC_HAS_PROCESS(master0);
master0(sc_module_name name)
{
SC_THREAD(t1);
sensitive << clk.pos();
}
};

wait(11,SC_NS);
sc_time_stamp().print();
printf("master0 request!n");
write_port->write(5,53);
wait(11,SC_NS);
}
}
#endif // MASTER0_H
Master1.h
#ifndef MASTER1_H
#define MASTER1_H
#include <systemc.h>
#include "bus_if.h"
class master1 : public sc_module
{
public:
// clk
sc_in_clk
clk;

master1(sc_module_name name)
{
SC_THREAD(t1);
sensitive << clk.pos();
}

};
void master1::t1()
{
while(1){
wait();
sc_time_stamp().print();
printf("master1 request!n");
write_port->write(3,60);

// port declaration
sc_port<bus_if,1>
write_port;

wait(10,SC_NS);

void t1();

sc_time_stamp().print();
printf("master1 request!n");
write_port->write(5,44);

SC_HAS_PROCESS(master1);

wait(10,SC_NS);
}
}
#endif // MASTER1_H
Wrapper.h
SC_HAS_PROCESS(wrapper);

#ifndef WRAPPER_H
#define WRAPPER_H
#include <systemc.h>
#include "bus_if.h"
class wrapper : public sc_module , public bus_if
{
public:
// clk
sc_in_clk
clk;
// port declaration
sc_port<bus_if,1>

wrapper(sc_module_name name)
{
sc_fifo<unsigned> addr_fifo(10);
sc_fifo<int>
data_fifo(10);
SC_THREAD(t1);
sensitive << clk.pos();
}
private:
sc_fifo<unsigned> addr_fifo;
sc_fifo<int>
data_fifo;

write_port;

void t1();
void write(unsigned addr, int data);

};

unsigned addr_temp;
int data_temp;
Wrapper.h(cont’)
void wrapper::t1()
{
while(1)
{

}

}

wait();
sc_time_stamp().print();
printf(" wrapper request!n");
addr_temp = addr_fifo.read();
data_temp = data_fifo.read();
write_port->write(addr_temp,data_temp);
sc_time_stamp().print();
printf(" wrapper write %d in %d n",data_temp,addr_temp);

void wrapper::write(unsigned addr, int data)
{
sc_time_stamp().print();
printf(" fifo.write data = %d ; addr = %d n",data,addr);
addr_fifo.write(addr);
data_fifo.write(data);
}
#endif // WRAPPER_H
Bus.h & Bus_if.h
#ifndef BUS_H
#define BUS_H
#include <systemc.h>
#include "bus_if.h"

#ifndef BUS_IF_H
#define BUS_IF_H
#include <systemc.h>

class bus :public bus_if, public sc_module
{
public:
// port declaration
sc_port<bus_if,1> write_port;

class bus_if : public sc_interface
{
// pure virtual function
public:
virtual void write(unsigned addr, int data) = 0;
};

data);

// bus_if function
void write(unsigned addr, int
// constructor
bus(sc_module_name);

#endif // BUS_H

#endif // BUS_IF_H
Bus.cpp
#include "bus.h"
bus::bus(sc_module_name nm) : sc_module(nm), write_sem(1)
{
}
void bus::write(unsigned addr, int data)
{
write_port->write(addr,data);
}
Slave.h
#ifndef SLAVE_H
#define SLAVE_H

private:
int memory[32];
};

#include <systemc.h>
#include "bus_if.h"

class slave : public sc_module , public bus_if
{
public:

void write(unsigned addr, int data);

09/12/9

void slave::write(unsigned addr, int data)
{
memory[addr] = data;
wait(2, SC_NS);
}
#endif // SLAVE_H
result

09/12/9
The use of Signals
•

•

•

•

When modeling signal on something like electronic
wire,
When concurrent executions of modules are
required and execution orders of modules are
important,
When using wait() and notify() cosumes too much
time,
When using FIFO consuming too much resources,
SystemC Simulation Kernel Work
Flow
Signal Channel
•

Signal channels use the update phase as a point of synchronization.

•

Each such channel has to store the current value and the new value.

•

•

•

•

The incoming value is stored into the new position instead of the current
position.
When in update phase (Kernel calls update_request()), the current value
is updated with the new value. Therefore, contention is resolved.
All these are done within a delta cycle.
If one writes to a channel and reads the channel within the same delta
cycle, one will find the result is not the value just been written.
sc_signal
•

•

•

When using write(), the evaluate-update is performed, too.
That is, it calls sc_prim_channle:: request_update() and
sc_signal::update().
sc_signal behaves like VHDL’ signal and Verilog’s reg. By the
way.
Only one process can write to a sc_signal in order to avoid
race condition.
sc_signal <datatype> name_of_signal;
name_of_signal.write(new_value);
name_of_signal.read(name_of_var);
sensitive << name_of_signal.default_event();
wait(name_of_signal.default_event);
………

09/12/9
SIGNAL_BUS
Bus 說明

m0

m1
enable1

addr

addr

data

data
enable0

CLK

enable_m
select

multiplexer
addr

used

data

s0

enable_s

arbiter
Signal Bus File

main.cpp
master0.h
master1.h
slave.h
arbiter.h
multiplexer.h
main.cpp
master0.h
master1.h
slave.h
arbiter.h
multiplexer.h
Channel 2010

Más contenido relacionado

La actualidad más candente

11 constructors in derived classes
11 constructors in derived classes11 constructors in derived classes
11 constructors in derived classesDocent Education
 
Session 8 assertion_based_verification_and_interfaces
Session 8 assertion_based_verification_and_interfacesSession 8 assertion_based_verification_and_interfaces
Session 8 assertion_based_verification_and_interfacesNirav Desai
 
Finding Bugs Faster with Assertion Based Verification (ABV)
Finding Bugs Faster with Assertion Based Verification (ABV)Finding Bugs Faster with Assertion Based Verification (ABV)
Finding Bugs Faster with Assertion Based Verification (ABV)DVClub
 
Session 9 advance_verification_features
Session 9 advance_verification_featuresSession 9 advance_verification_features
Session 9 advance_verification_featuresNirav Desai
 
Wishbone interface and bus cycles
Wishbone interface and bus cyclesWishbone interface and bus cycles
Wishbone interface and bus cyclesdennis gookyi
 
Session 6 sv_randomization
Session 6 sv_randomizationSession 6 sv_randomization
Session 6 sv_randomizationNirav Desai
 
Peripherals and interfacing
Peripherals  and interfacingPeripherals  and interfacing
Peripherals and interfacingRAMPRAKASHT1
 
Low power in vlsi with upf basics part 2
Low power in vlsi with upf basics part 2Low power in vlsi with upf basics part 2
Low power in vlsi with upf basics part 2SUNODH GARLAPATI
 
Superscalar and VLIW architectures
Superscalar and VLIW architecturesSuperscalar and VLIW architectures
Superscalar and VLIW architecturesAmit Kumar Rathi
 
Arteris Ncore Cache Coherent Interconnect - Technology Overview
Arteris Ncore Cache Coherent Interconnect - Technology OverviewArteris Ncore Cache Coherent Interconnect - Technology Overview
Arteris Ncore Cache Coherent Interconnect - Technology OverviewKurt Shuler
 
Verilog HDL Verification
Verilog HDL VerificationVerilog HDL Verification
Verilog HDL Verificationdennis gookyi
 
Uvm cookbook-systemverilog-guidelines-verification-academy
Uvm cookbook-systemverilog-guidelines-verification-academyUvm cookbook-systemverilog-guidelines-verification-academy
Uvm cookbook-systemverilog-guidelines-verification-academyRaghavendra Kamath
 
Low-Power Design and Verification
Low-Power Design and VerificationLow-Power Design and Verification
Low-Power Design and VerificationDVClub
 

La actualidad más candente (20)

I2C
I2CI2C
I2C
 
11 constructors in derived classes
11 constructors in derived classes11 constructors in derived classes
11 constructors in derived classes
 
Session 8 assertion_based_verification_and_interfaces
Session 8 assertion_based_verification_and_interfacesSession 8 assertion_based_verification_and_interfaces
Session 8 assertion_based_verification_and_interfaces
 
Block Drivers
Block DriversBlock Drivers
Block Drivers
 
PCIe DL_layer_3.0.1 (1)
PCIe DL_layer_3.0.1 (1)PCIe DL_layer_3.0.1 (1)
PCIe DL_layer_3.0.1 (1)
 
Finding Bugs Faster with Assertion Based Verification (ABV)
Finding Bugs Faster with Assertion Based Verification (ABV)Finding Bugs Faster with Assertion Based Verification (ABV)
Finding Bugs Faster with Assertion Based Verification (ABV)
 
Session 9 advance_verification_features
Session 9 advance_verification_featuresSession 9 advance_verification_features
Session 9 advance_verification_features
 
Verilog Tasks and functions
Verilog Tasks and functionsVerilog Tasks and functions
Verilog Tasks and functions
 
Linux Internals - Interview essentials 2.0
Linux Internals - Interview essentials 2.0Linux Internals - Interview essentials 2.0
Linux Internals - Interview essentials 2.0
 
Wishbone interface and bus cycles
Wishbone interface and bus cyclesWishbone interface and bus cycles
Wishbone interface and bus cycles
 
Session 6 sv_randomization
Session 6 sv_randomizationSession 6 sv_randomization
Session 6 sv_randomization
 
Java threads
Java threadsJava threads
Java threads
 
Peripherals and interfacing
Peripherals  and interfacingPeripherals  and interfacing
Peripherals and interfacing
 
Low power in vlsi with upf basics part 2
Low power in vlsi with upf basics part 2Low power in vlsi with upf basics part 2
Low power in vlsi with upf basics part 2
 
Superscalar and VLIW architectures
Superscalar and VLIW architecturesSuperscalar and VLIW architectures
Superscalar and VLIW architectures
 
Arteris Ncore Cache Coherent Interconnect - Technology Overview
Arteris Ncore Cache Coherent Interconnect - Technology OverviewArteris Ncore Cache Coherent Interconnect - Technology Overview
Arteris Ncore Cache Coherent Interconnect - Technology Overview
 
Verilog HDL Verification
Verilog HDL VerificationVerilog HDL Verification
Verilog HDL Verification
 
Uvm cookbook-systemverilog-guidelines-verification-academy
Uvm cookbook-systemverilog-guidelines-verification-academyUvm cookbook-systemverilog-guidelines-verification-academy
Uvm cookbook-systemverilog-guidelines-verification-academy
 
Low-Power Design and Verification
Low-Power Design and VerificationLow-Power Design and Verification
Low-Power Design and Verification
 
UML Modeling in Java
UML Modeling in JavaUML Modeling in Java
UML Modeling in Java
 

Destacado

Week1 Electronic System-level ESL Design and SystemC Begin
Week1 Electronic System-level ESL Design and SystemC BeginWeek1 Electronic System-level ESL Design and SystemC Begin
Week1 Electronic System-level ESL Design and SystemC Begin敬倫 林
 
C++ process new
C++ process newC++ process new
C++ process new敬倫 林
 
Systemc overview 2010
Systemc overview 2010Systemc overview 2010
Systemc overview 2010敬倫 林
 
Concurrency 2010
Concurrency 2010Concurrency 2010
Concurrency 2010敬倫 林
 
Transaction level modeling an overview
Transaction level modeling an overviewTransaction level modeling an overview
Transaction level modeling an overviewfagunp
 
Track c-High speed transaction-based hw-sw coverification -eve
Track c-High speed transaction-based hw-sw coverification -eveTrack c-High speed transaction-based hw-sw coverification -eve
Track c-High speed transaction-based hw-sw coverification -evechiportal
 
Top five reasons why every DV engineer will love the latest systemverilog 201...
Top five reasons why every DV engineer will love the latest systemverilog 201...Top five reasons why every DV engineer will love the latest systemverilog 201...
Top five reasons why every DV engineer will love the latest systemverilog 201...Srinivasan Venkataramanan
 
SystemVerilog Assertions (SVA) in the Design/Verification Process
SystemVerilog Assertions (SVA) in the Design/Verification ProcessSystemVerilog Assertions (SVA) in the Design/Verification Process
SystemVerilog Assertions (SVA) in the Design/Verification ProcessDVClub
 
A Systematic Approach to Creating Behavioral Models (white paper) v1.0
A Systematic Approach to Creating Behavioral Models (white paper) v1.0A Systematic Approach to Creating Behavioral Models (white paper) v1.0
A Systematic Approach to Creating Behavioral Models (white paper) v1.0Robert O. Peruzzi, PhD, PE, DFE
 
How to Connect SystemVerilog with Octave
How to Connect SystemVerilog with OctaveHow to Connect SystemVerilog with Octave
How to Connect SystemVerilog with OctaveAmiq Consulting
 
UVM Ral model usage
UVM Ral model usageUVM Ral model usage
UVM Ral model usageParth Pandya
 
UVM Update: Register Package
UVM Update: Register PackageUVM Update: Register Package
UVM Update: Register PackageDVClub
 
SystemVerilog Assertions verification with SVAUnit - DVCon US 2016 Tutorial
SystemVerilog Assertions verification with SVAUnit - DVCon US 2016 TutorialSystemVerilog Assertions verification with SVAUnit - DVCon US 2016 Tutorial
SystemVerilog Assertions verification with SVAUnit - DVCon US 2016 TutorialAmiq Consulting
 
Design and Implementation of an Advanced DMA Controller on AMBA-Based SoC
Design and Implementation of an Advanced DMA Controller on AMBA-Based SoCDesign and Implementation of an Advanced DMA Controller on AMBA-Based SoC
Design and Implementation of an Advanced DMA Controller on AMBA-Based SoCRabindranath Tagore University, Bhopal
 

Destacado (20)

Esl basics
Esl basicsEsl basics
Esl basics
 
Week1 Electronic System-level ESL Design and SystemC Begin
Week1 Electronic System-level ESL Design and SystemC BeginWeek1 Electronic System-level ESL Design and SystemC Begin
Week1 Electronic System-level ESL Design and SystemC Begin
 
C++ process new
C++ process newC++ process new
C++ process new
 
Systemc overview 2010
Systemc overview 2010Systemc overview 2010
Systemc overview 2010
 
Concurrency 2010
Concurrency 2010Concurrency 2010
Concurrency 2010
 
Transaction level modeling an overview
Transaction level modeling an overviewTransaction level modeling an overview
Transaction level modeling an overview
 
Track c-High speed transaction-based hw-sw coverification -eve
Track c-High speed transaction-based hw-sw coverification -eveTrack c-High speed transaction-based hw-sw coverification -eve
Track c-High speed transaction-based hw-sw coverification -eve
 
MixedSignal UVM Demo CDNLive
MixedSignal UVM Demo CDNLiveMixedSignal UVM Demo CDNLive
MixedSignal UVM Demo CDNLive
 
Top five reasons why every DV engineer will love the latest systemverilog 201...
Top five reasons why every DV engineer will love the latest systemverilog 201...Top five reasons why every DV engineer will love the latest systemverilog 201...
Top five reasons why every DV engineer will love the latest systemverilog 201...
 
SystemVerilog Assertions (SVA) in the Design/Verification Process
SystemVerilog Assertions (SVA) in the Design/Verification ProcessSystemVerilog Assertions (SVA) in the Design/Verification Process
SystemVerilog Assertions (SVA) in the Design/Verification Process
 
A Systematic Approach to Creating Behavioral Models (white paper) v1.0
A Systematic Approach to Creating Behavioral Models (white paper) v1.0A Systematic Approach to Creating Behavioral Models (white paper) v1.0
A Systematic Approach to Creating Behavioral Models (white paper) v1.0
 
How to Connect SystemVerilog with Octave
How to Connect SystemVerilog with OctaveHow to Connect SystemVerilog with Octave
How to Connect SystemVerilog with Octave
 
UVM Ral model usage
UVM Ral model usageUVM Ral model usage
UVM Ral model usage
 
UVM Update: Register Package
UVM Update: Register PackageUVM Update: Register Package
UVM Update: Register Package
 
SystemVerilog Assertions verification with SVAUnit - DVCon US 2016 Tutorial
SystemVerilog Assertions verification with SVAUnit - DVCon US 2016 TutorialSystemVerilog Assertions verification with SVAUnit - DVCon US 2016 Tutorial
SystemVerilog Assertions verification with SVAUnit - DVCon US 2016 Tutorial
 
stack
stackstack
stack
 
Design and Implementation of an Advanced DMA Controller on AMBA-Based SoC
Design and Implementation of an Advanced DMA Controller on AMBA-Based SoCDesign and Implementation of an Advanced DMA Controller on AMBA-Based SoC
Design and Implementation of an Advanced DMA Controller on AMBA-Based SoC
 
Queue
QueueQueue
Queue
 
Tree
TreeTree
Tree
 
Queue
QueueQueue
Queue
 

Similar a Channel 2010

Help Needed!UNIX Shell and History Feature This project consists.pdf
Help Needed!UNIX Shell and History Feature This project consists.pdfHelp Needed!UNIX Shell and History Feature This project consists.pdf
Help Needed!UNIX Shell and History Feature This project consists.pdfmohdjakirfb
 
Troubleshooting Complex Performance issues - Oracle SEG$ contention
Troubleshooting Complex Performance issues - Oracle SEG$ contentionTroubleshooting Complex Performance issues - Oracle SEG$ contention
Troubleshooting Complex Performance issues - Oracle SEG$ contentionTanel Poder
 
Udp socket programming(Florian)
Udp socket programming(Florian)Udp socket programming(Florian)
Udp socket programming(Florian)Flor Ian
 
Linux Serial Driver
Linux Serial DriverLinux Serial Driver
Linux Serial Driver艾鍗科技
 
A whirlwind tour of the LLVM optimizer
A whirlwind tour of the LLVM optimizerA whirlwind tour of the LLVM optimizer
A whirlwind tour of the LLVM optimizerNikita Popov
 
IOT Firmware: Best Pratices
IOT Firmware:  Best PraticesIOT Firmware:  Best Pratices
IOT Firmware: Best Praticesfarmckon
 
Embedded JavaScript
Embedded JavaScriptEmbedded JavaScript
Embedded JavaScriptJens Siebert
 
Linux kernel debugging
Linux kernel debuggingLinux kernel debugging
Linux kernel debuggingHao-Ran Liu
 
ISCA Final Presentaiton - Compilations
ISCA Final Presentaiton -  CompilationsISCA Final Presentaiton -  Compilations
ISCA Final Presentaiton - CompilationsHSA Foundation
 
Степан Кольцов — Rust — лучше, чем C++
Степан Кольцов — Rust — лучше, чем C++Степан Кольцов — Rust — лучше, чем C++
Степан Кольцов — Rust — лучше, чем C++Yandex
 
The Effect of Hierarchical Memory on the Design of Parallel Algorithms and th...
The Effect of Hierarchical Memory on the Design of Parallel Algorithms and th...The Effect of Hierarchical Memory on the Design of Parallel Algorithms and th...
The Effect of Hierarchical Memory on the Design of Parallel Algorithms and th...David Walker
 
Distributed Computing Patterns in R
Distributed Computing Patterns in RDistributed Computing Patterns in R
Distributed Computing Patterns in Rarmstrtw
 
Doing QoS Before Ceph Cluster QoS is available - David Byte, Alex Lau
Doing QoS Before Ceph Cluster QoS is available - David Byte, Alex LauDoing QoS Before Ceph Cluster QoS is available - David Byte, Alex Lau
Doing QoS Before Ceph Cluster QoS is available - David Byte, Alex LauCeph Community
 
various tricks for remote linux exploits  by Seok-Ha Lee (wh1ant)
various tricks for remote linux exploits  by Seok-Ha Lee (wh1ant)various tricks for remote linux exploits  by Seok-Ha Lee (wh1ant)
various tricks for remote linux exploits  by Seok-Ha Lee (wh1ant)CODE BLUE
 
Threaded Programming
Threaded ProgrammingThreaded Programming
Threaded ProgrammingSri Prasanna
 
(SAS) UNIX X Command Tips and Tricks
(SAS) UNIX X Command Tips and Tricks(SAS) UNIX X Command Tips and Tricks
(SAS) UNIX X Command Tips and TricksDavid Horvath
 

Similar a Channel 2010 (20)

Help Needed!UNIX Shell and History Feature This project consists.pdf
Help Needed!UNIX Shell and History Feature This project consists.pdfHelp Needed!UNIX Shell and History Feature This project consists.pdf
Help Needed!UNIX Shell and History Feature This project consists.pdf
 
Troubleshooting Complex Performance issues - Oracle SEG$ contention
Troubleshooting Complex Performance issues - Oracle SEG$ contentionTroubleshooting Complex Performance issues - Oracle SEG$ contention
Troubleshooting Complex Performance issues - Oracle SEG$ contention
 
Udp socket programming(Florian)
Udp socket programming(Florian)Udp socket programming(Florian)
Udp socket programming(Florian)
 
Linux Serial Driver
Linux Serial DriverLinux Serial Driver
Linux Serial Driver
 
A whirlwind tour of the LLVM optimizer
A whirlwind tour of the LLVM optimizerA whirlwind tour of the LLVM optimizer
A whirlwind tour of the LLVM optimizer
 
IOT Firmware: Best Pratices
IOT Firmware:  Best PraticesIOT Firmware:  Best Pratices
IOT Firmware: Best Pratices
 
Embedded JavaScript
Embedded JavaScriptEmbedded JavaScript
Embedded JavaScript
 
Lab
LabLab
Lab
 
Linux kernel debugging
Linux kernel debuggingLinux kernel debugging
Linux kernel debugging
 
ISCA Final Presentaiton - Compilations
ISCA Final Presentaiton -  CompilationsISCA Final Presentaiton -  Compilations
ISCA Final Presentaiton - Compilations
 
Степан Кольцов — Rust — лучше, чем C++
Степан Кольцов — Rust — лучше, чем C++Степан Кольцов — Rust — лучше, чем C++
Степан Кольцов — Rust — лучше, чем C++
 
Bluespec @waseda
Bluespec @wasedaBluespec @waseda
Bluespec @waseda
 
The Effect of Hierarchical Memory on the Design of Parallel Algorithms and th...
The Effect of Hierarchical Memory on the Design of Parallel Algorithms and th...The Effect of Hierarchical Memory on the Design of Parallel Algorithms and th...
The Effect of Hierarchical Memory on the Design of Parallel Algorithms and th...
 
Distributed Computing Patterns in R
Distributed Computing Patterns in RDistributed Computing Patterns in R
Distributed Computing Patterns in R
 
Doing QoS Before Ceph Cluster QoS is available - David Byte, Alex Lau
Doing QoS Before Ceph Cluster QoS is available - David Byte, Alex LauDoing QoS Before Ceph Cluster QoS is available - David Byte, Alex Lau
Doing QoS Before Ceph Cluster QoS is available - David Byte, Alex Lau
 
unit5 uc.pptx
unit5 uc.pptxunit5 uc.pptx
unit5 uc.pptx
 
various tricks for remote linux exploits  by Seok-Ha Lee (wh1ant)
various tricks for remote linux exploits  by Seok-Ha Lee (wh1ant)various tricks for remote linux exploits  by Seok-Ha Lee (wh1ant)
various tricks for remote linux exploits  by Seok-Ha Lee (wh1ant)
 
Threaded Programming
Threaded ProgrammingThreaded Programming
Threaded Programming
 
(SAS) UNIX X Command Tips and Tricks
(SAS) UNIX X Command Tips and Tricks(SAS) UNIX X Command Tips and Tricks
(SAS) UNIX X Command Tips and Tricks
 
Microkernel Development
Microkernel DevelopmentMicrokernel Development
Microkernel Development
 

Último

Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...DianaGray10
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityPrincipled Technologies
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUK Journal
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Enterprise Knowledge
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?Igalia
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?Antenna Manufacturer Coco
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Scriptwesley chun
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobeapidays
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CVKhem
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
Developing An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilDeveloping An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilV3cube
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdflior mazor
 

Último (20)

Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
Developing An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilDeveloping An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of Brazil
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 

Channel 2010

  • 2. Without Channels • One can still exchange data among modules. • Problems: – Data access may not be well scheduled. – It is possible that multiple processes try to access but clear order is not set up. – Events can be used to set up the order but it is likely that events may be missed. – No handshaking mechanism is embedded. – It does not map to HW architecture. – And so on….
  • 3. Using channels • • • • For all communication issues, it is recommended to solve the above problems using channels. Channel is a SystemC embedded mechanism. Can be used to map to real HW architecture and communication protocols. Two basic types of channels are provided: – Primitive – Hierarchical
  • 4. Primitive Channels • For “primitive” type, no process, hierarchy, and so on in order to make the channels fast. • Inherit from the base class, sc_prim_channel. • Three simple SystemC channels: – sc_mutex – sc_semaphore – sc_fifo
  • 5. sc_mutex • • • • • Mutex is a program object allowing multiple threads to share a common resource without colliding. During elaboration, a mutex is created. Then, any process wants to use the resource must lock the mutex to prevent others from accessing the same source. After its access, the process must unlock the mutex to let others access the resource. When a process try to access a locked mutex, it is prevented until the mutex is unlocked. In SystemC, both blocking and unblocking types are supported. No signal is available to indicate that a mutex is available. SO, using trylock may be a method but it may slow down the simulation.
  • 8. Main.cpp slave slave0("slave0"); bus bus0("bus0"); #include <systemc.h> #include "master0.h" #include "master1.h" #include "slave.h" #include "bus.h" int sc_main (int argc , char *argv[]) { sc_clock clk("clk0", 1 , SC_NS , 0.5); master0.clk(clk); master1.clk(clk); master0.write_port(bus0); master1.write_port(bus0); bus0.write_port(slave0); master0 master0("master0"); master1 master1("master1"); sc_start(50, SC_NS); cout << endl << endl; return 0; }
  • 9. Master0.h #ifndef MASTER0_H #define MASTER0_H #include <systemc.h> #include "bus_if.h" class master0 : public sc_module { public: // clk sc_in_clk clk; void master0::t1() { while(1){ wait(); sc_time_stamp().print(); printf("master0 request!n"); write_port->write(1,32); // port declaration sc_port<bus_if,1> write_port; void t1(); SC_HAS_PROCESS(master0); master0(sc_module_name name) { SC_THREAD(t1); sensitive << clk.pos(); } }; wait(11,SC_NS); sc_time_stamp().print(); printf("master0 request!n"); write_port->write(5,53); wait(11,SC_NS); } } #endif // MASTER0_H
  • 10. Master1.h #ifndef MASTER1_H #define MASTER1_H #include <systemc.h> #include "bus_if.h" class master1 : public sc_module { public: // clk sc_in_clk clk; }; master1(sc_module_name name) { SC_THREAD(t1); sensitive << clk.pos(); } void master1::t1() { while(1){ wait(); // port declaration sc_port<bus_if,1> write_port; sc_time_stamp().print(); printf("master1 request!n"); write_port->write(3,60); void t1(); wait(10,SC_NS); SC_HAS_PROCESS(master1); sc_time_stamp().print(); printf("master1 request!n"); write_port->write(5,44); } wait(10,SC_NS); } #endif // MASTER1_H
  • 11. Bus.h & Bus_if.h #ifndef BUS_H #define BUS_H #include <systemc.h> #include "bus_if.h" class bus :public bus_if, public sc_module { public: // port declaration sc_port<bus_if,1> write_port; data); // bus_if function void write(unsigned addr, int // constructor bus(sc_module_name); private: // sc_mutex declaration sc_mutex bus_mutex; }; #endif // BUS_H #ifndef BUS_IF_H #define BUS_IF_H #include <systemc.h> class bus_if : public sc_interface { // pure virtual function public: virtual void write(unsigned addr, int data) = 0; }; #endif // BUS_IF_H
  • 12. Bus.cpp #include "bus.h" bus::bus(sc_module_name nm) : sc_module(nm) { } void bus::write(unsigned addr, int data) { // sc_mutex lock process, wait for unlock bus_mutex.lock(); write_port->write(addr,data); } // sc_mutex unlock bus_mutex.unlock();
  • 13. Slave.h #ifndef SLAVE_H #define SLAVE_H #include <systemc.h> #include "bus_if.h" class slave : public sc_module , public bus_if { public: void write(unsigned addr, int data); slave(sc_module_name name) { for(int a = 0 ; a<32 ; a++) { memory[a] = 0; } } private: int memory[32]; }; void slave::write(unsigned addr, int data) { memory[addr] = data; wait(2, SC_NS); sc_time_stamp().print(); printf(" slave get data %d at addr %d !n",data,addr); } #endif // SLAVE_H
  • 15. sc_semaphore • To have more than one resources to choose from, one can use semaphore. • Mutex here is one special case of semaphore. • When a process finishes with a resource, it must post a notice. • Syntax: sc_semaphore name_or_semaphore(count) – name_of_semaphore.wait(); //blocking – name_of_semaphore.trywait(); //non-blocking – name_of_semaphore.get_value();// return # of free semaphores – name_of_semaphore.post(); //when free a resource
  • 16. Simple Bus Model • 一樣是一個簡單的 Bus Model 的範例 , 因為 要求是可以有好幾個 Modules 同時進來 , 所以可以用 Semaphore 來實現 . 09/12/9
  • 18. Main.cpp slave slave0("slave0"); bus bus0("bus0"); #include <systemc.h> #include "master0.h" #include "master1.h" #include "slave.h" #include "bus.h" master0.clk(clk); master1.clk(clk); master0.write_port(bus0); master1.write_port(bus0); bus0.write_port(slave0); int sc_main (int argc , char *argv[]) { sc_clock clk("clk0", 1 , SC_NS , 0.5); sc_start(50, SC_NS); cout << endl << endl; return 0; master0 master0("master0"); master1 master1("master1"); }
  • 19. #ifndef MASTER0_H #define MASTER0_H #include <systemc.h> #include "bus_if.h" Master0.h class master0 : public sc_module { public: // clk sc_in_clk clk; void master0::t1() { while(1){ wait(); sc_time_stamp().print(); printf("master0 request!n"); write_port->write(1,32); // port declaration sc_port<bus_if,1> write_port; void t1(); SC_HAS_PROCESS(master0); master0(sc_module_name name) { SC_THREAD(t1); sensitive << clk.pos(); } }; wait(11,SC_NS); sc_time_stamp().print(); printf("master0 request!n"); write_port->write(5,53); wait(11,SC_NS); } } #endif // MASTER0_H
  • 20. Master1.h #ifndef MASTER1_H #define MASTER1_H #include <systemc.h> #include "bus_if.h" class master1 : public sc_module { public: // clk sc_in_clk clk; }; master1(sc_module_name name) { SC_THREAD(t1); sensitive << clk.pos(); } void master1::t1() { while(1){ wait(); sc_time_stamp().print(); printf("master1 request!n"); write_port->write(3,60); // port declaration sc_port<bus_if,1> write_port; wait(10,SC_NS); void t1(); sc_time_stamp().print(); printf("master1 request!n"); write_port->write(5,44); SC_HAS_PROCESS(master1); } wait(10,SC_NS); } #endif // MASTER1_H
  • 21. Bus.h & Bus_if.h #ifndef BUS_H #define BUS_H #include <systemc.h> #include "bus_if.h" class bus :public bus_if, public sc_module { public: // port declaration sc_port<bus_if,1> write_port; data); // bus_if function void write(unsigned addr, int // constructor bus(sc_module_name); private: // sc_semaphore declaration sc_semaphore write_sem; }; #endif // BUS_H #ifndef BUS_IF_H #define BUS_IF_H #include <systemc.h> class bus_if : public sc_interface { // pure virtual function public: virtual void write(unsigned addr, int data) = 0; }; #endif // BUS_IF_H
  • 22. Bus.cpp #include "bus.h" // write_sem constructor assign count = 1 bus::bus(sc_module_name nm) : sc_module(nm), write_sem(1) { } void bus::write(unsigned addr, int data) { // sc_semaphore.wait, count-- (1=>0) write_sem.wait(); write_port->write(addr,data); } // sc_semaphore.post, count++ (0=>1) write_sem.post();
  • 23. Slave.h #ifndef SLAVE_H #define SLAVE_H #include <systemc.h> #include "bus_if.h" class slave : public sc_module , public bus_if { public: void write(unsigned addr, int data); slave(sc_module_name name) { for(int a = 0 ; a<32 ; a++) { memory[a] = 0; } } private: int memory[32]; }; void slave::write(unsigned addr, int data) { memory[addr] = data; wait(2, SC_NS); sc_time_stamp().print(); printf(" slave get data %d at addr %d !n",data,addr); } #endif // SLAVE_H
  • 25. SC_FIFO • Good for architecture modeling • Suitable for data flow modeling too. • Simple to implement. • Default sc_fifo depth is 16, with its data type specified. • The data type of sc_fifo can be complex structure. • It can be used to buffer data between two processing units, data packets in communication networks, and so on.
  • 26. Bus Wrapper • 接續上面的 Bus Model, 接到 Bus 的 Module 有一個 Wrapper, Wrapper 上有一個 FIFO 來 當 buffer, 這樣就可以運用 sc_fifo 來當練習 了.
  • 28. Main.cpp #include <systemc.h> #include "master0.h" #include "master1.h" #include "wrapper.h" #include "slave.h" #include "bus.h" wrapper wrapper0("wrapper0"); slave slave0("slave0"); bus bus0("bus0"); int sc_main (int argc , char *argv[]) { sc_clock clk0("clk0", 1 , SC_NS , 0.5); master0.write_port(wrapper0); master1.write_port(wrapper0); wrapper0.write_port(bus0); bus0.write_port(slave0); master0 master0("master0"); master1 master1("master1"); sc_start(50, SC_NS); cout << endl << endl; return 0; master0.clk(clk0); master1.clk(clk0); wrapper0.clk(clk0); }
  • 29. #ifndef MASTER0_H #define MASTER0_H #include <systemc.h> #include "bus_if.h" Master0.h class master0 : public sc_module { public: // clk sc_in_clk clk; void master0::t1() { while(1){ wait(); sc_time_stamp().print(); printf("master0 request!n"); write_port->write(1,32); // port declaration sc_port<bus_if,1> write_port; void t1(); SC_HAS_PROCESS(master0); master0(sc_module_name name) { SC_THREAD(t1); sensitive << clk.pos(); } }; wait(11,SC_NS); sc_time_stamp().print(); printf("master0 request!n"); write_port->write(5,53); wait(11,SC_NS); } } #endif // MASTER0_H
  • 30. Master1.h #ifndef MASTER1_H #define MASTER1_H #include <systemc.h> #include "bus_if.h" class master1 : public sc_module { public: // clk sc_in_clk clk; master1(sc_module_name name) { SC_THREAD(t1); sensitive << clk.pos(); } }; void master1::t1() { while(1){ wait(); sc_time_stamp().print(); printf("master1 request!n"); write_port->write(3,60); // port declaration sc_port<bus_if,1> write_port; wait(10,SC_NS); void t1(); sc_time_stamp().print(); printf("master1 request!n"); write_port->write(5,44); SC_HAS_PROCESS(master1); wait(10,SC_NS); } } #endif // MASTER1_H
  • 31. Wrapper.h SC_HAS_PROCESS(wrapper); #ifndef WRAPPER_H #define WRAPPER_H #include <systemc.h> #include "bus_if.h" class wrapper : public sc_module , public bus_if { public: // clk sc_in_clk clk; // port declaration sc_port<bus_if,1> wrapper(sc_module_name name) { sc_fifo<unsigned> addr_fifo(10); sc_fifo<int> data_fifo(10); SC_THREAD(t1); sensitive << clk.pos(); } private: sc_fifo<unsigned> addr_fifo; sc_fifo<int> data_fifo; write_port; void t1(); void write(unsigned addr, int data); }; unsigned addr_temp; int data_temp;
  • 32. Wrapper.h(cont’) void wrapper::t1() { while(1) { } } wait(); sc_time_stamp().print(); printf(" wrapper request!n"); addr_temp = addr_fifo.read(); data_temp = data_fifo.read(); write_port->write(addr_temp,data_temp); sc_time_stamp().print(); printf(" wrapper write %d in %d n",data_temp,addr_temp); void wrapper::write(unsigned addr, int data) { sc_time_stamp().print(); printf(" fifo.write data = %d ; addr = %d n",data,addr); addr_fifo.write(addr); data_fifo.write(data); } #endif // WRAPPER_H
  • 33. Bus.h & Bus_if.h #ifndef BUS_H #define BUS_H #include <systemc.h> #include "bus_if.h" #ifndef BUS_IF_H #define BUS_IF_H #include <systemc.h> class bus :public bus_if, public sc_module { public: // port declaration sc_port<bus_if,1> write_port; class bus_if : public sc_interface { // pure virtual function public: virtual void write(unsigned addr, int data) = 0; }; data); // bus_if function void write(unsigned addr, int // constructor bus(sc_module_name); #endif // BUS_H #endif // BUS_IF_H
  • 34. Bus.cpp #include "bus.h" bus::bus(sc_module_name nm) : sc_module(nm), write_sem(1) { } void bus::write(unsigned addr, int data) { write_port->write(addr,data); }
  • 35. Slave.h #ifndef SLAVE_H #define SLAVE_H private: int memory[32]; }; #include <systemc.h> #include "bus_if.h" class slave : public sc_module , public bus_if { public: void write(unsigned addr, int data); 09/12/9 void slave::write(unsigned addr, int data) { memory[addr] = data; wait(2, SC_NS); } #endif // SLAVE_H
  • 37. The use of Signals • • • • When modeling signal on something like electronic wire, When concurrent executions of modules are required and execution orders of modules are important, When using wait() and notify() cosumes too much time, When using FIFO consuming too much resources,
  • 39. Signal Channel • Signal channels use the update phase as a point of synchronization. • Each such channel has to store the current value and the new value. • • • • The incoming value is stored into the new position instead of the current position. When in update phase (Kernel calls update_request()), the current value is updated with the new value. Therefore, contention is resolved. All these are done within a delta cycle. If one writes to a channel and reads the channel within the same delta cycle, one will find the result is not the value just been written.
  • 40. sc_signal • • • When using write(), the evaluate-update is performed, too. That is, it calls sc_prim_channle:: request_update() and sc_signal::update(). sc_signal behaves like VHDL’ signal and Verilog’s reg. By the way. Only one process can write to a sc_signal in order to avoid race condition. sc_signal <datatype> name_of_signal; name_of_signal.write(new_value); name_of_signal.read(name_of_var); sensitive << name_of_signal.default_event(); wait(name_of_signal.default_event); ……… 09/12/9