HM-ES-th1 Les 3 Hardware/Software Codesign with SystemC
SystemC Module Elementary building blocks 18 in port out port module process read write event trigger Beschrijft gedrag Bijvoorbeeld: waarde op in port wijzigt
SystemC SC_MODULE Een module wordt gedefinieerd als een class m.b.v. de macro SC_MODULE(…). Een input port worden gedefinieerd als sc_in. Een output port worden gedefinieerd als sc_out. Een process wordt gedefinieerd als memberfunctie en geregistreerd in de constructor met de macro SC_METHOD. (Er zijn ook nog andere soorten processen.) De constructor wordt gedefinieerd m.b.v. de macro SC_CTOR(…). De events waardoor de SC_METHOD start worden in de constructor gedefinieerd m.b.v. sensitive. 19
1 bit full adder Schema op poortniveau 20
1 bit full adder SC_MODULE(Adder) { sc_out S, Cout; sc_in A, B, Cin; SC_CTOR(Adder) { SC_METHOD(add); sensitive << A << B << Cin; } private: void add() { sc_logic tempC, tempD, tempE; tempC = A.read() & B.read(); tempD = A.read() ^ B.read(); tempE = Cin.read() & tempD; S.write(tempD ^ Cin.read()); Cout.write(tempC | tempE); } }; 21 sc_logic is een 4-value type. Een variabele van het type sc_logic kan de waarde SC_LOGIC_0, SC_LOGIC_1, SC_LOGIC_X of SC_LOGIC_Z hebben. tempC tempD tempE
1 bit full adder SC_MODULE(Adder) { sc_out S, Cout; sc_in A, B, Cin; SC_CTOR(Adder) { SC_METHOD(add); sensitive << A << B << Cin; } private: void add() { // zonder lokale variabelen S.write(A.read() ^ B.read() ^ Cin.read()); Cout.write(A.read() & B.read() | Cin.read() & (A.read() ^ B.read())); } }; 22
1 bit full adder SC_MODULE(Adder) { sc_out S, Cout; sc_in A, B, Cin; SC_CTOR(Adder) { SC_METHOD(add); sensitive << A << B << Cin; } private: void add() { // m.b.v. impliciete type conversies en operator overloading S = A ^ B ^ Cin; Cout = A & B | Cin & (A ^ B); } }; 23 Raad ik niet aan
Testbench We gebruiken een testbench om (één of meerdere) module(s) te testen. 24 Adder AB Cin SCout Testbench TATBTCin
Wachten In de beschrijving van de testbench willen we kunnen wachten. Dit kan niet in een SC_METHOD maar wel in een SC_THREAD. Een SC_THREAD wordt slechts 1x aangeroepen door de SystemC kernel. Namelijk aan het begin van de simulatie. 25
Testbench voor 1 bit full adder SC_MODULE(Testbench) { sc_out TA, TB, TCin; SC_CTOR(Testbench) { SC_THREAD(testprocess); } private: void testprocess() { TA.write(SC_LOGIC_0); TB.write(SC_LOGIC_0); TCin.write(SC_LOGIC_0); wait(10, SC_NS); TA.write(SC_LOGIC_1); wait(10, SC_NS); TB.write(SC_LOGIC_1); wait(10, SC_NS); TCin.write(SC_LOGIC_1); wait(10, SC_NS); TA.write(SC_LOGIC_0); TB.write(SC_LOGIC_0); TCin.write(SC_LOGIC_0); } }; 26
Programma voor 1 bit full adder int sc_main(int argc, char *argv[]) { sc_signal A, B, Cin; sc_signal S, Cout; Adder adder("adder"); adder.A(A); adder.B(B); adder.Cin(Cin); adder.S(S); adder.Cout(Cout); Testbench tb("tb"); tb.TA(A); tb.TB(B); tb.TCin(Cin); 27 channels AB Cin SCout adder AB Cin SCout tb TATBTCin
Programma voor 1 bit full adder // Record (trace) signals for verification auto tf = sc_create_vcd_trace_file("trace"); tf->set_time_unit(1, SC_NS); sc_trace(tf, A, "A"); sc_trace(tf, B, "B"); sc_trace(tf, Cin, "Cin"); sc_trace(tf, S, "S"); sc_trace(tf, Cout, "Cout"); // Start the simulation for 200ns sc_start(200, SC_NS); sc_close_vcd_trace_file(tf); return 0; } 28
Output in GTKWave 29
Betere testbench Geautomatiseerde module test (unit test). 30 Adder AB Cin SCout Testbench Rapporteert fout of OK Huiswerk: Schrijf een automatische testbench voor SC_MODULE(Adder)