150 likes | 315 Views
Hardware/Software Codesign with SystemC. HM-ES-th1 Les 3. SystemC Module. Elementary building blocks. event. i n port. module. trigger. process. Beschrijft gedrag. read. write. Bijvoorbeeld: waarde op in port wijzigt. out port. SystemC SC_MODULE.
E N D
Hardware/Software Codesignwith SystemC HM-ES-th1 Les 3
SystemC Module • Elementary building blocks event in port module trigger process Beschrijft gedrag read write Bijvoorbeeld: waarde op in port wijzigt out port
SystemCSC_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 constructorgedefinieerd m.b.v. sensitive.
1 bit full adder • Schema op poortniveau
1 bit full adder tempD SC_MODULE(Adder) { sc_out<sc_logic> S, Cout; sc_in<sc_logic> A, B, Cin; SC_CTOR(Adder) { SC_METHOD(add); sensitive<< A << B << Cin; } private: voidadd() { sc_logictempC, 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); } }; tempE tempC 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.
1 bit full adder SC_MODULE(Adder) { sc_out<sc_logic> S, Cout; sc_in<sc_logic> A, B, Cin; SC_CTOR(Adder) { SC_METHOD(add); sensitive<< A << B << Cin; } private: voidadd() { // zonder lokale variabelen S.write(A.read() ^ B.read() ^ Cin.read()); Cout.write(A.read() & B.read() | Cin.read() & (A.read() ^ B.read())); } };
1 bit full adder SC_MODULE(Adder) { sc_out<sc_logic> S, Cout; sc_in<sc_logic> A, B, Cin; SC_CTOR(Adder) { SC_METHOD(add); sensitive<< A << B << Cin; } private: voidadd() { // m.b.v. impliciete type conversies en operator overloading S = A ^ B ^ Cin; Cout = A & B | Cin& (A ^ B); } }; Raad ik niet aan
Testbench • We gebruiken een testbench om (één of meerdere) module(s) te testen. Testbench TA TB TCin Adder Cin A B S Cout
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 SystemCkernel. Namelijk aan het begin van de simulatie.
Testbench voor 1 bit full adder SC_MODULE(Testbench) { sc_out<sc_logic> TA, TB, TCin; SC_CTOR(Testbench) { SC_THREAD(testprocess); } private: voidtestprocess() { 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); } };
Programma voor 1 bit full adder intsc_main(intargc, char *argv[]) { sc_signal<sc_logic> A, B, Cin; sc_signal<sc_logic> S, Cout; Adderadder("adder"); adder.A(A); adder.B(B); adder.Cin(Cin); adder.S(S); adder.Cout(Cout); Testbenchtb("tb"); tb.TA(A); tb.TB(B); tb.TCin(Cin); tb A B channels Cin TA TB TCin adder Cin A B S Cout channels S Cout
Programma voor 1 bit full adder // Record (trace) signals for verification autotf= 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); return0; }
Betere testbench • Geautomatiseerde module test (unit test). Testbench Rapporteert fout of OK Adder Huiswerk: Schrijf een automatische testbench voor SC_MODULE(Adder) Cin A B S Cout