Σχεδίαση hardware και προγραμματισμός βασικές (αλλά σύγχρονες) μεθοδολογίες Βασίλης Παλιουράς
2 Διαχείριση πολυπλοκότητας - Zητήματα και τεχνικές Αφαιρετικότητα (abstraction) Αυξητική ανάπτυξη incremental development, progressive refinement Έλεγχος ορθής λειτουργίας και διασφάλιση ποιότητας Πώς διασφαλίζουμε ότι το σχεδιάσαμε το σύστημα σωστά; υλικό ή λογισμικό ή οποιοσδήποτε συνδυασμός Τι θα πει «σωστή» λύση; Αξιοποίηση διαθέσιμων δομικών στοιχείων (reusability) Δυνατότητες επέκτασης – τροποποίησης Οι τεχνικές δεν αφορούν μόνο το λογισμικό! Εφαρμόζονται στο σύνολο των συστημάτων που σχεδιάζει ο μηχανικός.
3 Καθημερινότητα του μηχανικού Προδιαγραφές και εξομοιώσεις συστημάτων σε C/C++, matlab, SystemC,... Περιγραφή υλικού σε VHDL, verilog, SystemC,... γράφουμε απευθείας μοντέλα ή μέσω scripts (perl,...) αλλά και matlab ή C παράγουμε οδηγίες προς τον εξομοιωτή με script Eπεξεργασία μοντέλων HDL με εργαλεία αυτόματης σχεδίασης (EDA), περιγραφή ενεργειών βελτιστοποίησης σε γλώσσα χαρακτηριστική του εργαλείου κτλ.
4 // dff.v module dff(clock, reset, din, dout); input clock, reset, din; output dout; reg dout; clock or reset) begin if (reset) dout<= 1'b0; elsedout = din; end endmodule C, C++, matlab, SystemC... HDLs (verilog,VHDL, SystemC)... ? EDA
5 counter σε SystemC #include "systemc.h" class counter : public sc_module { int value; public: sc_in clk; sc_in count; sc_in reset; sc_out q; SC_HAS_PROCESS(counter); counter(sc_module_name nm): sc_module(nm),value(0) { SC_METHOD(do_count); sensitive << clk.pos() << reset; } protected: void do_count(){ if (reset){ value = 0;} else if (count) { value++; q.write(value); } };
6 process module
7 Verilog vs. SystemC // dff.v module dff(clock, reset, din, dout); input clock, reset, din; output dout; reg dout; clock or reset) begin if (reset) dout<= 1'b0; elsedout = din; end endmodule // dff.h #include "systemc.h“ SC_MODULE(dff) { sc_in clock; sc_in reset; sc_in din; sc_out dout; void do_dff( ) { if (reset) dout = false; else if (clock.event()) dout=din; } SC_CTOR(dff) { SC_METHOD(do_dff); sensitive(reset); sensitive_pos(clock); }
8 testbench.h #include "systemc.h" SC_MODULE(testbench) { sc_out add; sc_out en; sc_out rw; sc_out we; sc_inout_rv data; sc_in clock; void do_test(); SC_CTOR(testbench) { SC_CTHREAD(do_test,clock.pos()); } private: int read_cycle(int); void write_cycle(int, int); };
9 testbench.cpp #include "testbench.h" void testbench::do_test() { int i, j, flag, tmpA, tmpDW, tmpDR; for(j=0; 1; j++) { flag=0; wait(2); tmpA=1; tmpDW=123; for (i=0;i<3;i++) read_cycle(tmpA+i+j); for (i=0;i<3;i++) write_cycle(tmpA+i+j,tmpDW+i+j); for (i=0;i<3;i++) { tmpDR=read_cycle(tmpA+i+j); if (tmpDR!=(tmpDW+i+j)) { fprintf(stderr, "error: expected0x%x, but 0x%x", tmpDW+i+j, tmpDR); flag =1; } if (!flag) fprintf(stderr, "test passed...Wn"); }
10