Download de presentatie
De presentatie wordt gedownload. Even geduld aub
GepubliceerdChristina Veenstra Laatst gewijzigd meer dan 10 jaar geleden
1
HM-ES-th1 Les 3 Hardware/Software Codesign with SystemC
2
SystemC Module Elementary building blocks 18 in port out port module process read write event trigger Beschrijft gedrag Bijvoorbeeld: waarde op in port wijzigt
3
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
4
1 bit full adder Schema op poortniveau 20
5
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
6
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
7
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
8
Testbench We gebruiken een testbench om (één of meerdere) module(s) te testen. 24 Adder AB Cin SCout Testbench TATBTCin
9
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
10
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
11
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
12
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
13
Output in GTKWave 29
14
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)
Verwante presentaties
© 2024 SlidePlayer.nl Inc.
All rights reserved.