100 likes | 217 Views
Σχεδίαση hardware και προγραμματισμός. βασικές (αλλά σύγχρονες) μεθοδολογίες Βασίλης Παλιουράς. Διαχείριση πολυπλοκότητας - Z ητήματα και τεχνικές. Αφαιρετικότητα ( abstraction) Αυξητική ανάπτυξη incremental development, progressive refinement
E N D
Σχεδίαση hardware και προγραμματισμός βασικές (αλλά σύγχρονες)μεθοδολογίες Βασίλης Παλιουράς
Διαχείριση πολυπλοκότητας -Zητήματα και τεχνικές • Αφαιρετικότητα (abstraction) • Αυξητική ανάπτυξη • incremental development, progressive refinement • Έλεγχος ορθής λειτουργίας και διασφάλιση ποιότητας • Πώς διασφαλίζουμε ότι το σχεδιάσαμε το σύστημα σωστά; • υλικό ή λογισμικό ή οποιοσδήποτε συνδυασμός • Τι θα πει «σωστή» λύση; • Αξιοποίηση διαθέσιμων δομικών στοιχείων (reusability) • Δυνατότητες επέκτασης – τροποποίησης • Οι τεχνικές δεν αφορούν μόνο το λογισμικό! • Εφαρμόζονται στο σύνολο των συστημάτων που σχεδιάζει ο μηχανικός.
Καθημερινότητατου μηχανικού • Προδιαγραφές και εξομοιώσεις συστημάτων σε C/C++,matlab,SystemC,... • Περιγραφή υλικού σε VHDL,verilog, SystemC,... • γράφουμε απευθείας μοντέλα ή μέσω scripts (perl,...) αλλά και matlab ή C • παράγουμε οδηγίες προς τον εξομοιωτή με script • Eπεξεργασία μοντέλων HDL με εργαλεία αυτόματης σχεδίασης (EDA), • περιγραφή ενεργειών βελτιστοποίησης σε γλώσσα χαρακτηριστική του εργαλείου • κτλ.
C, C++, matlab, SystemC... // dff.v module dff(clock, reset, din, dout); input clock, reset, din; output dout; reg dout; always @(posedge clock or reset) begin if (reset) dout<= 1'b0; else dout = din; end endmodule ? HDLs (verilog,VHDL, SystemC) ... EDA
counter σε SystemC #include "systemc.h" class counter : public sc_module { int value; public: sc_in<bool> clk; sc_in<bool> count; sc_in<bool> reset; sc_out<int> 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); } } };
module process process module module process process process process process process process module
// dff.v module dff(clock, reset, din, dout); input clock, reset, din; output dout; reg dout; always @(posedge clock or reset) begin if (reset) dout<= 1'b0; else dout = din; end endmodule // dff.h #include "systemc.h“ SC_MODULE(dff) { sc_in <bool> clock; sc_in <bool> reset; sc_in <bool> din; sc_out <bool> dout; void do_dff( ) { if (reset) dout = false; elseif (clock.event()) dout=din; } SC_CTOR(dff) { SC_METHOD(do_dff); sensitive(reset); sensitive_pos(clock); } } Verilog vs. SystemC
testbench.h #include "systemc.h" SC_MODULE(testbench) { sc_out<int> add; sc_out<bool> en; sc_out<bool> rw; sc_out<bool> we; sc_inout_rv<16> data; sc_in<bool> clock; void do_test(); SC_CTOR(testbench) { SC_CTHREAD(do_test,clock.pos()); } private: int read_cycle(int); void write_cycle(int, int); };
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"); } }