SystemC-n-BehaviorCoding_Fall2021_Section5_HLS
SystemC-n-BehaviorCoding_Fall2021_Section5_HLS
A First Example
y” + 3xy’ + 3y = 0 in the interval [0, a] with step-
size dx and initial values X(0) = x; y(0) = y; y’(0) = u
diffeq {
read (x, y, u, dx, a);
repeat {
x1 = x + dx;
Behavior u1 = u – ( 3 * x * u * dx ) – ( 3 * y * dx );
Code y1 = y + u * dx;
c = x1 < a;
x = x1; u = u1; y = y1;
}
until ( c );
write y;
}
Synthesized
Circuit
* ALU Steering & Memory Control Unit
+ 5
IIR Filter
mid y
x + +
a1 a2
+ * * +
* *
b1 b2
+ 6
Behavior States
!enable mid = 0;
mid1 = 0;
mid2 = 0;
Behavior Code
0 Single
mid = 0; Cycle
enable
mid1 = 0;
mid2 = 0; !enable Multiple
Cycles
while (1) {
wait();
x = input.read();
y = mid + a2 *
while (1) {
mid1
wait();
+ b2 * mid2; 1 y = mid + a2 *
mid = x + a1 *
mid1
mid1
+ b2 * mid2;
+ b1 * mid2;
mid = x + a1 *
mid2 = mid1;
mid1 = mid;
enable mid1
+ b1 * mid2;
output.write(y);
mid2 = mid1;
}
mid1 = mid;
}
+ 8
enable 0 break;
case 1:
!enable x = input.read();
tmp0 = a2 * mid1;
tmp1 = b2 * mid2;
x = input.read();
state = 2; break;
tmp0 = a2 * mid1; case 2:
tmp1 = b2 * mid2; tmp2 = a1 * mid1;
state = 2 tmp3 = b1 * mid2;
0 0
sel8 sel7
* * wait();
x = input.read();
y = mid + a2 * mid1 + b2 *
0 mid2;
input mid = x + a1 * mid1 + b1 *
sel6
mid2;
mid2 = mid1;
tmp0 tmp4 tmp1 mid tmp2 tmp5 tmp3 x
mid1 = mid;
output.write(y);
sel2 sel3 sel4 sel5
}
}
1 enable
+
+
y
=
output
+ FSM & Behavior Code 11
+
Drag picture to placeholder or click ico
Synthesizable Subset
+ 13
SC_MODULE Processes
SC_METHOD supported
SC_THREAD not supported
SC_CTHREAD supported
+ 16
SC_METHOD
Blocking,
no wait()
No sc_in_clk type port
Signals in the sensitivity list are synthesized as
synchronous signals
With at least one sc_in_clk type port
Must be listed in the sensitivity list with positive or
negative triggering specified
Other signals in the sensitivity list are synthesized as
asynchronous signals
sc_out_clk type port removed in SystemC 2.1
+ 18
SC_CTHREAD
Non-blocking,with wait()
Clock pin must be specified
Sensitivity list, if any, is asynchronous
Reset pin if specified
reset_signal_is(reset, true); // 2.1
async_reset_signal_is(reset, true); // 2.3
wait();§
wait(no_of_cycles);§
wait(signal_in_sensitivity_list);§
wait_until()is removed from SystemC 2.1
Modeling Reset
// IIR.h void iir()
SC_MODULE(IIR) {
{ //Reset
sc_in<sc_uint<32> > input; mid = 0; mid1 = 0; mid2 = 0;
sc_out<sc_uint<32> > output; // Function body
sc_in<bool> enable; while (1) {
sc_in<bool> clk; wait();
void iir(); x = input.read();
sc_uint<32> x, y; y = mid + a2 * mid1 + b2 * mid2;
sc_signal<sc_uint<32> > mid, mid = x + a1 * mid1 + b1 * mid2;
mid1, mid2 = mid1;
mid2;
mid1 = mid;
sc_uint<32> a1, a2, b1, b2;
output.write(y);
SC_CTOR(IIR) {
}
SC_CTHREAD(iir, clk.pos());
}
reset_signal_is(enable, false);
a1 = 354; a2 = 1799;
b1 = 573; b2 = 1254;
}
};
+ 21
Operators Supported:
Unary +, - Floating Point Types
Arithmatic +, -, *, /, %, ++, --, Not Supported
Shift: <<, >>
Logic: <, <=, >, >=, ==, !=, &, ~
Conditional a ? b : c
+ 22
Declaration
+ Derived Module 28
+Other Important Supported Features 29
Virtual function
+ 30
Pointers
int32_t bit_depth = 8;
int32_t row, col;
void filter_copy_p2p::filter_copy() {
// Data structure defined in SC_MODULE
sc_int<32> bit_depth = 8;
sc_int<32> row, col;
sc_int<32> srcI = 0; dstI = 0;
sc_int<16> *srcP = &src[0], *dstP = &dst[0];
+
Drag picture to placeholder or click ico
Events
+ 34
Event Usage
A, B & C: Processes
B D: Channel
D
A
C
SC_MODULE(two-proc) {
#ifdef BLOCKING
sc_uint<8> a, b;
#else
sc_signal<sc_uint<8> > a, b;
#endif
…
SC_METHOD(proc1);
SC_METHOD(proc2);
}
void proc1() {
a = a + 1;
…
}
void proc2() {
b = a; // non-deterministic if blocking
… // deterministic only if non-blocking
}
36
+
Drag picture to placeholder or click ico
A 8-1 Multiplexer
sc_in<sc_uint<4> > nbits;
…
for (i=0; i<nbits.read(); i++) {
switch (i) {
case 0: buf = inp[0].read();
break;
case 1: buf = inp[1].read();
break;
case 2: buf = inp[2].read();
break;
case 3: buf = inp[3].read();
break; 3
case 4: buf = inp[4].read();
break;
case 5: buf = inp[5].read();
break;
case 6: buf = inp[6].read();
break;
case 7: buf = inp[7].read();
break;
}
}
+ 38
4
+ 39
A Fix in SW Mindset
if (i < 8)
buf = inp[i];
3
<
}
3
+ 40
A Fix in HW Mindset
buf = inp[i];
3
41
Issues with
Macro Architecture
+ 42
Specification
Data
M S
Application/ Data Data Application/
Stimuli transmit receiver Sink
S M
Acknowledge
+ 43
Macro Architecture 1
timer
Data
M S
Acknowledge
+ 44
Macro Architecture 2
timer
Data
M S
Acknowledge
Key Point
Notice
+
Drag picture to placeholder or click ico
RTL Modeling
+ 48
D Flip-Flop, No Reset
#include "systemc.h“
SC_MODULE (DFF_P) {
sc_in<bool> D;
sc_out<sc_uint<1> > Q;
sc_in<bool> clock;
#include "systemc.h"
SC_MODULE (DFF_AH_AR) {
sc_in<bool> D, reset;
sc_out<bool> Q;
sc_in<bool> clock;
sc_signal<bool> reg;
void dff_ah_ar () {
if (reset.read()) {
reg = 0; Q.write(0);
} else {
reg = D; Q.write(reg);
} }
SC_CTOR (DFF_AH_AR) {
SC_METHOD (dff_ah_ar);
sensitive << clock.pos() <<
reset.pos();
}
};
+ 50
#include "systemc.h"
SC_MODULE (DFF_AL_AR) {
sc_in<bool> D, reset;
sc_out<bool> Q;
sc_in<bool> clock;
sc_signal<bool> reg;
void dff_al_ar () {
if (!reset.read()) {
reg = 0; Q.write(0);
} else {
reg = D; Q.write(reg);
} }
SC_CTOR (DFF_AL_AR) {
SC_METHOD (dff_al_ar);
sensitive << clock.pos();
sensitive << reset.neg();
}
};
+ 51
sc_signal<bool> reg;
void dff_ah_sr () {
if (reset.read()) {
reg = 0;
Q.write(reg);
} else {
reg = D;
Q.write(reg);
} }
SC_CTOR (DFF_AH_SR) {
SC_METHOD (dff_ah_sr);
sensitive << clock.pos();
}
};
+ 53
#include "systemc.h"
SC_MODULE (DFF_AL_SR) {
sc_in<bool> D, reset;
sc_out<bool> Q;
sc_in<bool> clock;
sc_signal<bool> reg;
void dff_al_sr () {
if (!reset.read()) {
reg = 0; Q.write(reg);
} else {
reg = D; Q.write(reg);
} }
SC_CTOR (DFF_AL_SR) {
SC_METHOD (dff_al_sr);
sensitive << clock.pos();
}
};
+ 54
JK Flip-Flop Spec
D Latch
#include "systemc.h“
SC_MODULE (D_LATCH) {
sc_in<bool> D;
sc_out<bool> Q;
sc_in<bool> clock; // clock
port
void d_latch() {
if (clock.read())
Q.write(D.read());
}
SC_CTOR (D_LATCH) {
SC_METHOD (d_latch);
sensitive << clock;
}
};
+ 59
SR Latch Spec
+ 60
SR Latch
#include "systemc.h"
SC_MODULE( SR_LATCH ) {
sc_in<bool> reset, set;
sc_out<bool> Q;
void sr_latch () {
if (reset.read() == 0)
Q.write(0);
else if (set.read() == 0)
Q.write(1);
}
SC_CTOR( SR_LATCH ) {
SC_METHOD( sr_latch );
sensitive << reset << set;
}
};
+ 61
#include "systemc.h"
SC_MODULE( D_LATCH4 ) {
sc_in<sc_uint<4> > D;
sc_out<sc_uint<4> > Q;
void d_latch4 () {
switch (D.read()) {
case 0: Q.write(0x01); break;
case 1: Q.write(0x02); break;
case 2: Q.write(0x04); break;
case 3: Q.write(0x08); break;
} }
SC_CTOR( D_LATCH4 ) {
SC_METHOD( d_latch4 );
sensitive << D;
}
};
+ 62
A Three-State Buffer
#include "systemc.h"
SC_MODULE( TRISTATE_BUF ) {
sc_in<bool> ctrl;
sc_in<sc_logic> data;
sc_out<sc_logic> out;
void tristate_buf () {
if (ctrl.read())
out.write(data.read());
else
out.write(sc_logic_Z);
}
SC_CTOR( TRISTATE_BUF ) {
SC_METHOD( tristate_buf );
sensitive << ctrl << data;
}
};
+
End of 5th Section
Thanks to you all!
63