Σχεδιασμός Συστημάτων VLSI — Ιούνιος 2025¶
Μεταγραφή της εξέτασης Ιουνίου 2025 από τις φωτογραφίες IMG_8129.jpg και IMG_8130.jpg (χειρόγραφο θέμα).
IMG_8129.jpg¶
Θέματα VLSI 2 June 2025
Θέμα 1¶
[Σχήμα: αγκύλη που ομαδοποιεί τα ερωτήματα 1–3]
1.–3. Να βρούμε το λάθος σε verilog κώδικα αν υπάρχει
-
FSM: Έδινε κυματομορφή clk και input και ήθελε να βρούμε την ακολουθία των states απο τις οποίες πέρασε
π.χ. \(S_0 \rightarrow S_1 \rightarrow S_1 \rightarrow S_0\) -
Έδινε verilog κώδικα και έπρεπε να βρούμε τι τιμές θα έχουν κάποια σήματα σε κάθε clock cycle.
-
Έδινε δυο snippets verilog: ένα με blocking statements και delays και ένα με fork-join με delays.
Έπρεπε να βρούμε πόσο πρέπει να είναι τα delay1 και delay2 στο πρώτο snippet για να δίνουν και τα δύο τις ίδιες κυματομορφές. -
Είχε ένα snippet κώδικα με for και έπρεπε να πούμε αν είναι synthesizable και αν είναι να κάνουμε το ίδιο με ένα assign
-
Έπρεπε να περιγράψουμε αυτό σε verilog
[Σχήμα: Αλυσίδα αθροιστών (+) με διανύσματα εισόδου \(a_0, a_1, a_2, a_3, \dots, a_N\) πλάτους 4 bit και τελική έξοδο sum]
Θέμα 2.¶
-
Έδινε verilog και για το κύκλωμα που περιγράφει έπρεπε να βρούμε \(f_{clk\_max}\) και αν υπάρχει hold violation
-
Να πούμε τι είναι τα systolic arrays, να δώσουμε ένα παράδειγμα χρήσης τους και να πούμε τι διαφορές έχουν με pipelined κυκλώματα.
IMG_8130.jpg¶
Θέμα 3.¶
Να σχεδιάσουμε και να περιγράψουμε σε verilog ένα 4-bit πολλαπλασιαστή που χρησιμοποιεί την τεχνική Modified Booth Encoding.
Θέμα 4.¶
Να σχεδιάσουμε έναν carry skip adder, να πούμε ποιο είναι το critical path και delay και να το περιγράψουμε σε verilog.
Λύσεις (⚪ AI, μη επαληθευμένο)
Κατάσταση: ⚪ AI, μη επαληθευμένο Πηγή: λύσεις AI (antigravity-gemini, deepseek-flash), ανεξάρτητη επανάληψη και αντιπαραβολή· καμία δεν έχει ελεγχθεί από άνθρωπο
Προσοχή
Λύση από AI — ελέγξτε την· δεν έχει επαληθευτεί από άνθρωπο. Η ένδειξη «δύο λύσεις συμφωνούν» δεν σημαίνει ότι η απάντηση είναι σωστή.
AI λύσεις — 2025-06¶
Οι λύσεις γράφτηκαν από μοντέλα AI και δεν έχουν ελεγχθεί από άνθρωπο. Η αρίθμηση ακολουθεί το αρχείο θεμάτων.
Θέμα 1¶
Αξιοπιστία: δεν λύθηκε
1.1–1.3. Δεν λύθηκε: λείπει ο Verilog κώδικας των τριών snippets.
1.4. Δεν λύθηκε: λείπει η κυματομορφή \(clk/input\) και η περιγραφή/διάγραμμα του FSM.
1.5. Δεν λύθηκε: λείπει ο κώδικας Verilog και το ζητούμενο κύκλωμα.
1.6. Δεν λύθηκε: λείπουν τα δύο snippets Verilog και οι συγκεκριμένες τιμές/καθυστερήσεις.
1.7. Δεν λύθηκε: λείπει το snippet με τη for.
1.8. Παραδοχή: το σχήμα παριστά αλυσιδωτό άθροισμα των \(a_0+\cdots+a_N\), όπου κάθε \(a_i\) είναι unsigned 4 bit. Για να μην υπάρχει υπερχείλιση, η έξοδος έχει πλάτος \(4+\lceil\log_2(N+1)\rceil\) bit. Verilog:
module sum_chain #(
parameter N = 4,
parameter OUT_W = 4 + $clog2(N+1)
)(
input wire [4*(N+1)-1:0] a, // a[0] στο [3:0], a[1] στο [7:4], ...
output reg [OUT_W-1:0] sum
);
integer i;
always @* begin
sum = {OUT_W{1'b0}};
for (i = 0; i <= N; i = i + 1)
sum = sum + a[4*i +: 4];
end
endmodule
Θέμα 2¶
Αξιοπιστία: δεν λύθηκε
2.1. Δεν λύθηκε: λείπει ο Verilog κώδικας του κυκλώματος και τα χαρακτηριστικά χρόνου (καθυστερήσεις πυλών, setup/hold, \(t_{cq}\) κ.λπ.), ώστε να υπολογιστούν \(f_{clk\_max}\) και hold violation.
2.2. Τα systolic arrays είναι κανονικές, συνήθως 1D ή 2D, συστοιχίες όμοιων επεξεργαστικών στοιχείων (PEs) που επικοινωνούν τοπικά με γειτονικά στοιχεία και λειτουργούν συγχρονισμένα, με δεδομένα να “ρέουν” ρυθμικά από PE σε PE. Κάθε PE εκτελεί απλή πράξη και προωθεί δεδομένα/μερικά αποτελέσματα. Χρησιμοποιούνται π.χ. σε πολλαπλασιασμό πινάκων, convolution/IIR-FIR filters, FFT, sorting, dynamic programming. Διαφέρουν από τα κλασικά pipelined κυκλώματα στο ότι το pipeline είναι γραμμικό και κάθε βαθμίδα έχει διαφορετική λειτουργία, ενώ στο systolic array έχουμε χωρικό παραλληλισμό σε κανονική τοπολογία με τοπικές συνδέσεις, υψηλό throughput, modularity και scalability· συχνά το systolic array είναι και το ίδιο εσωτερικά pipelined.
Θέμα 3¶
Αξιοπιστία: δύο ανεξάρτητες λύσεις συμφωνούν · εμπιστοσύνη λύτη: μέτρια
Παραδοχή: \(X,Y\) είναι signed 4-bit και το γινόμενο είναι signed 8-bit. Στο Modified Booth radix-4 προσθέτουμε \(y_{-1}=0\) και σχηματίζουμε δύο τρίδες: [ (y_1,y_0,y_{-1}),\qquad (y_3,y_2,y_1). ] Η κωδικοποίηση κάθε τρίδας \(c\) δίνει ψηφίο \(d\in\{-2,-1,0,+1,+2\}\): [ \begin{array}{c|c} c & d\\hline 000,111 & 0\ 001,010 & +1\ 011 & +2\ 100 & -2\ 101,110 & -1 \end{array} ] Τα μερικά γινόμενα είναι \(PP_i=d_iX\) και το τελικό αποτέλεσμα [ P=PP_0+4\,PP_1. ] Χρειάζονται 6 bit για κάθε \(PP_i\) ώστε να καλύπτεται και η περίπτωση \(+2(-8)=+16\). Verilog:
module booth_mult4 (
input signed [3:0] x,
input signed [3:0] y,
output signed [7:0] p
);
wire [2:0] code0 = {y[1], y[0], 1'b0};
wire [2:0] code1 = {y[3], y[2], y[1]};
function signed [5:0] pp;
input signed [3:0] xf;
input [2:0] c;
begin
case (c)
3'b000, 3'b111: pp = 6'sd0;
3'b001, 3'b010: pp = {{2{xf[3]}}, xf}; // +x
3'b011: pp = {{1{xf[3]}}, xf, 1'b0}; // +2x
3'b100: pp = -{{1{xf[3]}}, xf, 1'b0}; // -2x
3'b101, 3'b110: pp = -{{2{xf[3]}}, xf}; // -x
default: pp = 6'sd0;
endcase
end
endfunction
wire signed [5:0] pp0 = pp(x, code0);
wire signed [5:0] pp1 = pp(x, code1);
wire signed [7:0] pp0_ext = {{2{pp0[5]}}, pp0};
wire signed [7:0] pp1_ext = {{2{pp1[5]}}, pp1};
assign p = pp0_ext + (pp1_ext <<< 2);
endmodule
Θέμα 4¶
Αξιοπιστία: 2 από 3 ανεξάρτητες λύσεις συμφωνούν (η άλλη διαφωνούσε) · εμπιστοσύνη λύτη: μέτρια
Παραδοχή: ζητείται ενδεικτικά 16-bit carry skip adder με 4-bit blocks. Για κάθε block ορίζουμε [ p_i=a_i\oplus b_i,\qquad g_i=a_i b_i. ] Το carry ενός block διαδίδεται με ripple εσωτερικά, αλλά αν [ P_{\text{block}}=p_0p_1p_2p_3=1, ] τότε το carry-in του block προσπερνά το block μέσω multiplexer: [ c_{\text{out}}=P_{\text{block}}\,?\,c_{\text{in}}:c_{\text{ripple,out}}. ] Το critical path είναι: carry που παράγεται στο πρώτο block → ripple μέχρι το τέλος του πρώτου block → skip από τα ενδιάμεσα blocks → ripple στο τελευταίο block → τελικό sum/carry. Για \(K\) blocks μεγέθους \(B\) και \(t_c\) καθυστέρηση διάδοσης carry, \(t_{\text{mux}}\) καθυστέρηση skip-mux, \(t_{\oplus}\) καθυστέρηση XOR: [ D_{\text{sum}} \approx t_{pg}+B t_c+(K-2)t_{\text{mux}}+(B-1)t_c+t_{\oplus}, ] [ D_{c_{\text{out}}} \approx t_{pg}+B t_c+(K-2)t_{\text{mux}}+B t_c. ] Για 16 bit και 4-bit blocks (\(B=4,K=4\)): [ D_{\text{sum}}\approx t_{pg}+7t_c+2t_{\text{mux}}+t_{\oplus}, \qquad D_{c_{\text{out}}}\approx t_{pg}+8t_c+2t_{\text{mux}}. ] Verilog για 16-bit carry skip adder:
```verilog module csa16 ( input wire [15:0] a, b, input wire cin, output wire [15:0] sum, output wire cout ); wire [15:0] p = a ^ b; wire [15:0] g = a & b; wire [16:0] c;
assign c[0] = cin;
// Block 0: bits 0..3
wire r0_1 = g[0] | (p[0] & c[0]);
wire r0_2 = g[1] | (p[1] & r0_1);
wire r0_3 = g[2] | (p[2] & r0_2);
wire r0_4 = g[3] | (p[3] & r0_3);
assign c[4] = (p[3] & p[2] & p[1] & p[0]) ? c[0] : r0_4;
assign sum[0] = p[0] ^ c[0];
assign sum[1] = p[1] ^ r0_1;
assign sum[2] = p[2] ^ r0_2;
assign sum[3] = p[3] ^ r0_3;
// Block 1: bits 4..7
wire r1_1 = g[4] | (p[4] & c[4]);
wire r1_2 = g[5] | (p[5] & r1_1);
wire r1_3 = g[6] | (p[6] & r1_2);
wire r1_4 = g[7] | (p[7] & r1_3);
assign c[8] = (p[7] & p[6] & p[5] & p[4]) ? c[4] : r1_4;
assign sum[4] = p[4] ^ c[4];
assign sum[5] = p[5] ^ r1_1;
assign sum[6] = p[6] ^ r1_2;
assign sum[7] = p[7] ^ r1_3;
// Block 2: bits 8..11
wire r2_1 = g[8] | (p[8] & c[8]);
wire r2_2 = g[9] | (p[9] & r2_1);
wire r2_3 = g[10] | (p[10] & r2_2);
wire r2_4 = g[11] | (p[11] & r2_3);
assign c[12] = (p[11] & p[10] & p[9] & p[8]) ? c[8] : r2_4;
assign sum[8] = p[8] ^ c[8];
assign sum[9] = p[9] ^ r2_1;
assign sum[10] = p[10] ^ r2_2;
assign sum[11] = p[11] ^ r2_3;
// Block 3: bits 12..15
wire r3_1 = g[12] | (p[12] & c[12]);
wire r3_2 = g[13] | (p[13] & r3_1);
wire r3_3 = g[14] | (p[14] & r3_2);
wire r3_4 = g[15] | (p[15] & r3_3);
assign c[16] = (p[15] & p[14] & p[13] & p[12]) ? c[12] : r3_4;
assign sum[12] = p[12] ^ c[12];
assign sum[13] = p[13] ^ r3_1;
assign sum[14] = p[14] ^ r3_2;
assign sum[15] = p[15] ^ r3_3;
assign cout = c[16];
endmodule