© Harry Broeders.
Deze pagina is bestemd voor studenten van de Haagse Hogeschool - Academie voor Technology, Innovation & Society Delft groep E-EMSYS = minor Embedded Systems.
Deze handleidig gaat ervan uit dat de SystemC library al geinstalleerd en gecompileerd is. Begin hier als dit niet het geval is.
Thuis heb je de SystemC library waarschijnlijk geïnstalleerd in het directory C:\systemc-2.3.0. In lokaal 1.049 op de academie TISD van de HHS is de SystemC library ook geïnstalleerd in het directory C:\systemc-2.3.0. In lokaal 1.052 op de academie TISD van de HHS is de SystemC library geïnstalleerd in Q:\Grp_Elektrotechniek\Embedded_systems\systemc-2.3.0.
_CRT_SECURE_NO_WARNINGS;
Dit voorkomt dat
de Visual C++ compiler warnings geeft bij alle functies waar in de laatste
C standaard (C11) zogenoemde veilige (secure) versies van zijn gedefinieerd.
Zie eventueel hier:
Secure string
functies in C11.#include <systemc>
using namespace sc_core;
using namespace sc_dt;
using namespace std;
/* Simple DFF */
SC_MODULE(dff) {
/* Model of a Data Flip-Flop that reacts on a negative edge of the clock signal clk */
sc_in_clk
clk;
sc_in<sc_logic> din;
sc_out<sc_logic> dout;
SC_CTOR(dff) {
SC_METHOD(on_clk_neg);
sensitive << clk.neg();
/* Execute process on_clk_neg on every negative edge of the clock signal clk */
}
private:
void on_clk_neg() {
/* Behavior of DFF */
dout.write(din.read());
}
};
SC_MODULE(tb_dff) {
/* Test bench for the DFF */
sc_clock clk;
sc_signal<sc_logic> din;
sc_signal<sc_logic> dout;
SC_CTOR(tb_dff):
clk("clk",10,SC_NS,0.5), DUT("dff") {
/* Connect test bench with DFF which is the device under test (DUT)*/DUT.din(din);
DUT.dout(dout);
DUT.clk(clk);
SC_THREAD(main);
}
private:
dff DUT;
void main() {
/* test script */
din.write(SC_LOGIC_0);
wait(31, SC_NS);
din.write(SC_LOGIC_1);
wait(42, SC_NS);
din.write(SC_LOGIC_0);
}
};
int sc_main(int argc, char* argv[]) {
tb_dff TB("tb_dff");
/* Trace (record) signals */
sc_trace_file *tf(sc_create_vcd_trace_file("trace"));
tf->set_time_unit(1, SC_NS);
sc_trace(tf, TB.clk, "clk");
sc_trace(tf, TB.din, "din");
sc_trace(tf, TB.dout, "dout");
sc_start(100, SC_NS);
sc_close_vcd_trace_file(tf);
cin.get();
return 0;
}
Dit is een low level (gate level) SystemC model van een
D
flip-flop. Dit is een eenvoudig geheugen-element. Het signaal op de ingang
din
wordt alleen overgenomen op de uitgang dout
bij een negatieve flank op de clock ingang clk
.
dout
signaal voor
de eerste negatieve flank niet gedefinieerd is. Breidt de D flip-flop uit
met een asynchrone reset
ingang. De uitgang dout
moet meteen laag worden als de reset
ingang hoog wordt.
Zolang de reset
ingang hoog is blijft de uitgang
dout
laag. Als de reset
ingang laag is dan "onthoud"
de uitgang dout
zijn waarde totdat er een negatieve flank komt
op de clock ingang clk
. Breidt ook de test bench uit zodat de
aangepaste D flip-flop getest kan worden. Bedenk dat de waarde van de reset
ingang ook undefined (SC_LOGIC_X
) of high-impedance
(SC_LOGIC_Z
) kan zijn.
din.write(SC_LOGIC_0);
reset.write(SC_LOGIC_1);
wait(4, SC_NS);
reset.write(SC_LOGIC_0);
wait(13, SC_NS);
din.write(SC_LOGIC_1);
wait(12, SC_NS);
din.write(SC_LOGIC_0);
wait(18, SC_NS);
din.write(SC_LOGIC_1);
wait(20, SC_NS);
reset.write(SC_LOGIC_1);
wait(14, SC_NS);
reset.write(SC_LOGIC_0);
moet de uitvoer als volgt zijn: