1
Praktikum: Entwicklung interaktiver eingebetteter Systeme
SystemC Tutorial
Joachim Falk (falk@cs.fau.de)
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
eingebetteter Systeme SystemC Tutorial Joachim Falk ( - - PowerPoint PPT Presentation
Praktikum: Entwicklung interaktiver eingebetteter Systeme SystemC Tutorial Joachim Falk ( falk@cs.fau.de ) Friedrich-Alexander-Universitt Erlangen-Nrnberg Joachim Falk 1 Agenda Motivation Brief SystemC Overview The
1
Joachim Falk (falk@cs.fau.de)
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
2
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
3
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
4
Testbench
Testbench Hardware (HDL) System specification in C or C++ Software (C, C++)
5
Testbench Synthesizable SystemC System specification in SystemC Software (SystemC, C++) Refine Refine Refine Refine
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
6
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
Specification model Component assembly model Bus-functio- nal model Bus-arbitra- tion model Implementa- tion model Cycle accu- rate compu- tation model Timing accuracy of computation Timing accuracy of communication untimed timed cycle untimed timed cycle Lukai Cai and Daniel Gajski.
modeling: an overview. In Proc.
New York, NY, USA, 19-24.
7
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
8
http://www.systemc.org
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
9
Master & Slave Library Verification Library TLM Library Application Spec. Libraries Elementary Channels Signal, Buffer FIFO Mutex, Semaphore Data Types Arbitrary prec. integers Arbitrary prec. bit vectors
2 valued logic 4 valued logic
Fixed-point numbers Core Language Modules Ports Interfaces Channels Processes Events
ANSI C++ Language Features
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
10
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
11
e0 t0 e1 t1 e2 t2 t3 e4 t4 e5 t5 e8 e3 e6 e7
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
12
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
SystemC Events
sc_event ev1 sc_event ev2 sc_event ev3 sc_event ev4 sc_event ev5 sc_event _startup // Somewhere in your code void module1::amethod() { // Do something } void module2::amethod1() { ev5.notify(SC_ZERO_TIME); ev4.notify(10, SC_NS) } // Somewhere in your code void module2::amethod2() { // Do something }
Elaborate
13
Elaborate
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
sc_start SystemC Events
sc_event ev1 sc_event ev2 sc_event ev3 sc_event ev4 sc_event ev5 // Somewhere in your code void module1::amethod() { // Do something } void module2::amethod1() { ev5.notify(SC_ZERO_TIME); ev4.notify(10, SC_NS) } // Somewhere in your code void module2::amethod2() { wait(ev5); } _startup
0ns,0 Simulation Find next event and execute code.
sc_event _startup int sc_main( int argc, char *argv[]) { … // Elaboration stuff sc_start(); // call it … }
14
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
SystemC Events
sc_event ev1 sc_event ev2 sc_event ev3 sc_event ev4 sc_event ev5 // Somewhere in your code void module1::amethod() { // Do something }
0ns,0
ev5
0ns,1
// Somewhere in your code void module2::amethod2() { wait(ev5); } void module2::amethod1() { ev5.notify(SC_ZERO_TIME); ev4.notify(10, SC_NS) } ev4
10ns,0
_startup
Elaborate
int sc_main( int argc, char *argv[]) { … // Elaboration stuff sc_start(); // call it … }
sc_start Simulation Find next event and execute code.
15
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
SystemC Events
sc_event ev1 sc_event ev2 sc_event ev3
0ns,0 0ns,1
// Somewhere in your code void module2::amethod2() { wait(ev5); } ev4
10ns,0
sc_event _startup // Somewhere in your code void module1::amethod() { wait(ev4); } _startup ev5
Elaborate
int sc_main( int argc, char *argv[]) { … // Elaboration stuff sc_start(); // call it … }
sc_start Simulation Find next event and execute code.
16
Elaborate
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
int sc_main( int argc, char *argv[]) { … // Elaboration stuff sc_start(); // call it … }
sc_start SystemC Events
sc_event ev1 sc_event ev2 sc_event ev3
Simulation Find next event and execute code. 0ns,1
ev4
10ns,0
sc_event _startup // Somewhere in your code void module1::amethod() { wait(ev4); } ev5 // Somewhere in your code void module2::amethod2() { wait(ev5); } sc_event ev5 sc_event ev4 int sc_main( int argc, char *argv[]) { … // Elaboration stuff sc_start(); // sc_start returns … // Do cleanup here }
17
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
Syntax: sc_time t(v, u); v: Integer or double representing the numerical time value. u: Specifies the unit of the numerical time value v.
18
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
// Example 1: sc_time tm1(10, SC_NS); // time object representing 10ns sc_time tm2(10, SC_MS); // time object representing 10ms // Example 2: sc_time tm3(2*tm1); // time object representing 20ns sc_time tm4(42); // time object representing 42 default time units // Example 3: sc_time tm5(5, SC_MS); cout << tm5 << endl; // output: 5 ms // Example 3: cout << sc_time_stamp() << endl; // output the current simulation time.
19
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
Syntax: sc_event ev;
sc_event ev1; // create an event sc_event ev2; // create another event ev1 = ev2; // Compile ERROR (events are not assignable) sc_event ev3(ev1); // Compile ERROR (events are not copyable)
20
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
Syntax: ev.notify(); ev.notify(SC_ZERO_TIME); ev.notify(t); ev.notify(v, u); v: Integer or double representing the numerical time value. u: Specifies the unit of the tme value v, e.g., SC_NS. t: An object of type sc_time. Syntax: ev.cancel();
21
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
e0 t,0 e2 t,1 e1 e3 t+sc_time(v,u),0 e3 t+sc_time(v-10,u),0
22
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
Syntax: sc_event ev1, ev2, … sc_event_or_list &eo = ev1 | ev2 | …; ev1,ev2,…: Objects of type sc_event. Syntax: sc_event ev1, ev2, … sc_event_and_list &ea = ev1 & ev2 & …; ev1,ev2,…: Objects of type sc_event.
23
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
// Example (assuming the context of a thread process) wait(ev1 | ev2); // Ok wait till either event ev1 or ev2 is triggered. wait(ev1 & ev2); // Ok wait till both events have been triggered. { sc_event_and_list &ea = ev1 & ev2; wait(ea); // This call works but after it ea will have been freed. wait(ea); // SIGSEGV } { sc_event_or_list &eo = ev1 | ev2 | ev3; if (flag) wait(eo); //else // memory leak } // Example (assuming the context of a method process) // Ok trigger process again if // either event ev1 or ev2 is triggered // or if 30 NS have expired. next_trigger(30, SC_NS, ev1 | ev2);
24
Process2
(SC_THREAD)
Process1
(SC_METHOD)
Simulator
Startup Start the simulation (sc_start()) Simulationsende Simulation return; wait(); return; wait();
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
sc_main
25
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
26
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
channel module module Behavior resides here. Communication is implemented here. May contain processes. May contain processes if it is a hierarchical channel.
27
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
equivalent
Syntax: struct module : public sc_module { // the class body };
// Somewhere in SystemC #define SC_MODULE(user_module_name) \ struct user_module_name: ::sc_core::sc_module
Syntax: SC_MODULE(module) { // the class body }; use at implemen- tation level use at higher levels
28
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
Syntax: class hir_channel : public sc_channel, public channel_if_1, public channel_if_2, … { // implement interfaces }; Syntax: class channel : public sc_prim_channel, public channel_if_1, public channel_if_2, … { // implement interfaces };
// Somewhere in SystemC namespace sc_core { typedef sc_module sc_channel; } // namespace sc_core
As sc_channel is a typedef for sc_module, there is no clear distinction between a hierarchical channel and a behavior (module), as both derive from the same base class sc_module.
29
channel
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
module module
class module_b : public sc_module { void bar(); }; class module_a : public sc_module { void foo() {modb.bar();} }; // somewhere in your code … module_a moda(“moda”); module_b modb(“modb”); …
module
30
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
channel module module
port Interfaces provided by the channel
class module_b : public sc_module { sc_port<channel_if_2> p; … void foo() { // use interface p->iface_2_method(); } … }; class module_a : public sc_module { sc_port<channel_if_1> p; … void foo() { // use interface p->iface_1_method(); } … }; class channel : public sc_prim_channel , public channel_if_1 , public channel_if_2 { … // implement interfaces void iface1_method(); void iface2_method(); … };
port Channel implements interfaces.
31
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
class channel_if_2 : public virtual sc_interface { // declare pure virtual virtual void iface2_method() = 0; }; class channel_if_1 : public virtual sc_interface { // declare pure virtual virtual void iface1_method() = 0; }; class channel : public sc_prim_channel , public channel_if_1 , public channel_if_2 { … // implement interfaces void iface1_method(); void iface2_method(); … };
32
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
equivalent
Syntax: struct module : public sc_module { … SC_HAS_PROCESS(module); module(sc_module_name n) : sc_module(n) { // constructor body } … }; Syntax: SC_MODULE(module) { … SC_CTOR(module) { // constructor body } … }; use at implemen- tation level use at higher levels
// Somewhere in SystemC #define SC_HAS_PROCESS(user_module_name) \ typedef user_module_name SC_CURRENT_USER_MODULE #define SC_CTOR(user_module_name) \ typedef user_module_name SC_CURRENT_USER_MODULE; \ user_module_name( ::sc_core::sc_module_name )
33
// Header file adder.h SC_MODULE(adder) { // Input ports // Output ports SC_CTOR(adder) { // body of constructor } }; // somewhere in your code #include "adder.h" // instantiating the adder adder add1("add1");
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
SC_CTOR automatically generates a constructor taking an arbitrary string (the instance name) as an argument.
34
// Header file adder.h class adder : public sc_module { public: // Input ports // Output ports SC_HAS_PROCESS(adder); // now without SC_CTOR macro adder(sc_module_name nm) : sc_module(nm) { /* body of constructor */ } // cannot be done with SC_CTOR! adder(sc_module_name nm, int delay) : sc_module(nm) { /* body of constructor */ } }; // somewhere in your code #include "adder.h" // instantiating some adders adder add1("add1"); adder add2("add2", 2);
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
Arbitrary string argument is used for run-time error messages by the simulation kernel. It is good practice to use the instance name as the argument!
35
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
36
hierarchical module
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
channel
class hir_module: public sc_module { sc_port<channel_if> p1, p2; sub_module moda, modb; channel chan; hir_module(sc_module_name name): sc_module(name) , moda(“moda”), modb(“modb”) { moda.pa(p1); modb.pb(p2); moda.pb(chan); modb.pa(chan); } };
sub module moda sub module modb hierarchical module
class sub_module : public sc_module { sc_port<channel_if> pa; sc_port<channel_if> pb; … SC_CTOR(sub_module) { // constructor body } … };
37
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
hierarchical module channel
class hir_module: public sc_module { sc_port<channel_if> p1, p2; sub_module moda, modb; channel chan; hir_module(sc_module_name name): sc_module(name) , moda(“moda”), modb(“modb”), chan(“chan”) { moda.pa(p1); modb.pb(p2); moda.pb(chan); modb.pa(chan); } };
sub module moda sub module modb
class sub_module : public sc_module { sc_port<channel_if> pa; sc_port<channel_if> pb; … SC_CTOR(sub_module) { // constructor body } … };
Assume this is called “hir” Then this is “hir.moda”. And then this is “hir.modb”. Even channels may be named “hir.chan”.
38
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
Syntax: SC_MODULE(my_mod) { public: … // Port are class vars sc_port<T, N> p; … };
Note that some special ports derived from sc_port exists. These ports are for some channels defined by SystemC (more later).
39
Mapping by position syntax: instance_name(channel_name[, channel_name[, ...]]); instance_name << channel_name [<< channel_name [<< ...]]; Mapping by name syntax: instance_name.port_name(channel_name); [instance_name.port_name(channel_name);]
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
40
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
41
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
42
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
Syntax: sc_fifo<T> fifo_name(depth = 16); depth: optional, default 16. Encodes the number of items which can be stored in the FIFO. T: The type of data stored in the FIFO.
sc_fifo<bool> a; // a FIFO for boolean values (size 16) sc_fifo<sc_int<8> > b(10);// a FIFO for signed 8bit integers (size 10) sc_fifo<my_type> c(42);// a FIFO which stores 42 items of type my_type
A space is required by the C++ compiler.
43
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
Declaration as data members of the module: SC_MODULE(my_mod) { sc_port<sc_fifo_in_if<T> > port_name_1; sc_port<sc_fifo_out_if<T> > port_name_2; }; T: The type of data stored in the connected FIFO.
sc_port<sc_fifo_in_if<int> > in; // input port of type int sc_port<sc_fifo_out_if<bool> >
// output port of type bool int i = in->read();
44
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
sc_fifo_in<int> in; // input port of type int sc_fifo_out<bool>
// output port of type bool int i = in.read(); // equivalent to int i = in->read();
// equivalent to out->write(i);
Declaration as data members of the module: SC_MODULE(my_mod) { sc_fifo_in<T> port_name_1; sc_fifo_out<T> port_name_2; }; T: The type of data stored in the connected FIFO.
45
sc_fifo_in_if<T>
Method Description
void read(T&) T read() blocking read. Blocks until at least one sample is stored in the FIFO bool nb_read(T&) non-blocking read. Returns true if a sample was available int num_available() number of samples in FIFO
sc_fifo_out_if<T>
Method Description
void write(const T&) blocking write. Blocks until at least
bool nb_write(const T&) non-blocking write. Returns true if sample could be written int num_free() number of free spaces in FIFO
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
46
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
Syntax: sc_signal<T> signal_name; T: The type of data transmitted by the signal.
sc_signal<bool> a; // a boolean signal sc_signal<sc_int<8> > b; // a signal for 8bit signed integers sc_signal<my_type> c; // a signal of user defined type
A space is required by the C++ compiler.
47
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
Declaration as data members of the module: SC_MODULE(my_mod) {
sc_port<sc_signal_in_if<T> > p1; sc_port<sc_signal_out_if<T> > p2; sc_port<sc_signal_inout_if<T> > p3;
}; T: The type of data transmitted by the connected HW signal
sc_port<sc_signal_in_if<int> > in; // input port of type int sc_port<sc_signal_out_if<bool> > out; // output port of type bool int i = in->read();
48
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
sc_in<int> in; // input port of type int sc_out<bool>
// output port of type bool int i = in.read(); // equivalent to int i = in->read();
// equivalent to out->write(i);
Declaration as data members of the module: SC_MODULE(my_mod) {
sc_in<T> p1; sc_out<T> p2; Sc_inout<T> p3;
}; T: The type of data transmitted by the connected HW signal
49
sc_signal_in_if<T>
Method Description
const T& read() bool event()
sc_signal_out/inout_if<T> additionally has
Method Description
void write(const T&) write a value to the signal
sc_signal_in/out/inout_if<bool/sc_logic> adds
Method Description
bool posedge()
returns true on a positive edge (change from 0 to 1)
bool negedge()
returns true on a negative edge(change from 1 to 0)
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
read the current value from the signal return true if the value of the signal has changed
50
the value of the last write will be visible
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
// Example (assuming the context of a process) // write the value 10 to signal sig sig.write(10); // write 11 to sig. The value 10 will never be visible outside // the process, because it is overwritten by 11 sig.write(11);
51
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
sc_signal<bool> reset; if(reset.event() && reset.read()) cout << "reset" << endl; sc_signal<bool> reset; if(reset.posedge()) cout << "reset" << endl;
equivalent
52
53
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
54
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
react on event notify event
to make use of events a mechanism to react on events is needed!
55
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
SC_MODULE(my_module) { sc_in<bool> clk; void proc_method(); void proc_thread(); void proc_cthread(); SC_CTOR(my_module) { SC_METHOD(proc_method); sensitive << clk.pos(); SC_THREAD(proc_thread); sensitive << clk.pos(); SC_CTHREAD(proc_cthread, clk.pos()); } };
static sensitivity
56
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
process activation sensitivity list event1 event2
process activation on events in a sensitivity list
57
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
Syntax: SC_CTOR(module_name) { SC_METHOD(method_name); SC_THREAD(thread_name); SC_CTHREAD(cthread_name, edge); } edge: An edge of a bit signal, e.g., signal.pos() or signal.neg()
58
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
Syntax: SC_CTOR(module_name) { SC_METHOD(method_name); dont_intialize(); SC_THREAD(thread_name); dont_intialize(); }
59
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
Syntax: sensitive(chan|event|edge); sensitive << chan|event|edge [<< chan|event|edge ...]; chan: An object of type sc_interface or sc_port. event: An object of type sc_event. edge: An edge of a bit signal, e.g., signal.pos() or signal.neg().
60
(in terms of internal simulation time).
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
61
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
62
next time the process is reactivated execution will continue after the wait statement which caused the suspension.
(in terms of internal simulation time)
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
63
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
64
next time the process is reactivated execution will continue after the wait statement which caused the suspension.
(in terms of internal simulation time)
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
65
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
66
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
67
at least one event in the sensitivity list is triggered.
for one clock cycle.
for n clock cycles.
event ev is triggered.
a time period t (sc_time (v, u)).
event ev is triggered or time period t (sc_time (v, u)) has expired, whichever comes first.
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
68
call in the method to switch back to static sensitivity.
triggered again exactly when the event ev is triggered.
triggered again exactly after a delay of time period t (sc_time (v, u)).
triggered again exactly when the event ev is triggered or when a delay
sensitivity.
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
69
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
70
71
72
73
Syntax: sc_int<nr. bits> variable_name; sc_uint<nr. bits> variable_name; sc_bigint<nr. bits> variable_name; sc_biguint<nr. bits> variable_name;
sc_int<3> a; // a is a 3bit signed integer sc_uint<3> b; // b is a 3bit unsigned integer sc_int<2> c; // c is a 2bit signed integer a = 3; // a = 3 a[2] = 0, a[1] = 1, a[0] = 1 a = "0b011"; // a = 3 a[2] = 0, a[1] = 1, a[0] = 1 b = a; // b = 3 b[2] = 0, b[1] = 1, b[0] = 1 c = a; // c = -1 c[1] = 1, c[0] = 1 a = -1; // a = -1 a[2] = 1, a[1] = 1, a[0] = 1 b = a; // b = 7 b[2] = 1, b[1] = 1, b[0] = 1 c = a; // c = -1 c[1] = 1, c[0] = 1
74
logic false
logic true
logic false
logic true
unknown
high impedance
75
Syntax: bool variable_name; sc_logic variable_name;
// This is a model of a Tri-state driver. sc_logic triState(bool control, bool data) { sc_logic ts_out; if (control == false) { ts_out = ’Z’; // Set the drive to Z } else { ts_out = data; // Set the drive to data } return ts_out; }
76
77
Syntax: sc_bv<nr. bits> variable_name; sc_lv<nr. bits> variable_name;
sc_bv<3> a; // a 3bit bit vector sc_lv<3> b; // a 3bit logic vector a = 3; // a[2] = 0, a[1] = 1, a[0] = 1 a = "010"; // a[2] = 0, a[1] = 1, a[0] = 0 b = a; // b[2] = 0, b[1] = 1, b[0] = 0 b = "01X"; // b[2] = 0, b[1] = 1, b[0] = X b = "00X1"; // b[2] = 0, b[1] = X, b[0] = 1 // NOTE: b="0X1" is a hex. 1 a = b; // A run-time warning is issued that 'X‘ // cannot be converted!
78
79
Syntax: sc_fixed<wl, iwl, q_mode, o_mode, n_bits> variable_name; sc_ufixed<wl, iwl, q_mode, o_mode, n_bits> variable_name; wl: Specifies the total word length used for number representation
iwl: Specifies the number of bits to the left of the decimal point
q_mode: Specifies the quantization mode
n_bits: Specifies the number of saturated bits (for wrapping overflow modes) Syntax: sc_fix variable_name; sc_fix variable_name(wl, iwl, q_mode, o_mode, n_bits); sc_fix variable_name(param_obj); wl, iwl, q_mode, o_mode, n_bits: Same as for sc_(u)fixed<> param_obj: An object of class sc_fxtype_params
80
// To enable fixed point support you have to define the symbol // SC_INCLUDE_FX before including the systemc header. #define SC_INCLUDE_FX #include <systemc.h> // define a fixed point number parameter set p sc_fxtype_params p(9,5,SC_RND,SC_SAT); // define a fixed point number using the parameter set p sc_fix x(p); // do an equivalent definition without a predefined parameter set sc_fix y(9,5,SC_RND,SC_SAT); // If the parameters are known at compile time then the // sc_fixed* types should be used! sc_fixed<9, 5, SC_RND, SC_SAT> a; sc_fixed_fast<9, 5, SC_RND, SC_SAT> b;
81
X X X X X X X X X X X X X X s s s s s X X X X
‘s’ stands for sign bits wl = 9, iwl = 5 wl = 5, iwl = 9 wl = 4, iwl = -5
82
Overview of Quantization Modes
Name Description SC_RND Rounding to plus infinity SC_RND_ZERO Rounding to zero SC_RND_MIN_INF Rounding to minus infinity SC_RND_INF Rounding to infinity SC_RND_CONV Convergent Rounding SC_TRN Truncation SC_TRN_ZERO Truncation to zero
83
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
0.5 1 1.5
0.5 1 1.5 Floating point sc\_fixed<3,2,rndmode,SC\_SAT,0> SC\_RND SC\_RND\_ZERO SC\_RND\_MIN\_INF SC\_RND\_INF
sc_fixed<3,2,rndmode,SC_SAT>
Fixed Point Number Floating Point Number
SC_RND SC_RND_ZERO SC_RND_MIN_INF SC_RND_INF
84
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
0.5 1 1.5
0.5 1 1.5 Floating point sc\_fixed<3,2,rndmode,SC\_SAT,0> SC\_RND SC\_RND\_CONV SC\_TRN SC\_TRN\_ZERO
sc_fixed<3,2,rndmode,SC_SAT>
Fixed Point Number Floating Point Number
SC_RND SC_RND_CONV SC_TRN SC_TRN_ZERO
85
Name Description SC_SAT Saturation SC_SAT_ZERO Saturation to zero SC_SAT_SYM Symmetrical saturation SC_WRAP Wrap around SC_WRAP_SM Sign magnitude wrap around
Overview of Overflow Modes
86
1 2 3 4
1 2 3 4 5 6 Floating point sc\_fixed<3,2,SC\_RND,ovflmode,0> SC\_SAT SC\_SAT\_ZERO SC\_SAT\_SYM SC\_WRAP SC\_WRAP\_SM
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
sc_fixed<3,2,SC_RND,ovflmode,0>
Fixed Point Number Floating Point Number
SC_SAT SC_SAT_ZERO SC_SAT_SYM SC_WRAP SC_WRAP_SM
87
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
1 2 3 4
1 2 3 4 5 6 Floating point sc\_fixed<3,2,SC\_RND,ovflmode,1> SC\_SAT SC\_SAT\_ZERO SC\_SAT\_SYM SC\_WRAP SC\_WRAP\_SM
sc_fixed<3,2,SC_RND,ovflmode,1>
Fixed Point Number
SC_SAT SC_SAT_ZERO SC_SAT_SYM SC_WRAP SC_WRAP_SM
Floating Point Number
88
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
1 2 3 4
1 2 3 4 5 6 Floating point sc\_fixed<3,2,SC\_RND,ovflmode,2> SC\_SAT SC\_SAT\_ZERO SC\_SAT\_SYM SC\_WRAP SC\_WRAP\_SM
sc_fixed<3,2,SC_RND,ovflmode,2>
Fixed Point Number
SC_SAT SC_SAT_ZERO SC_SAT_SYM SC_WRAP SC_WRAP_SM
Floating Point Number