এই পর্বে যা শিখবেন
- Clock-এর period, frequency, duty cycle আর edge; flip-flop-এর tsetup, thold, tpcq, tccq আর combinational logic-এর tpd, tcd — Harris & Harris-এর লেখার নিয়মে
- Setup আর hold-এর শর্ত timing diagram থেকে প্রমাণ করা, fmax বের করা, hold violation ধরা আর buffer দিয়ে সারানো
- Clock skew আর jitter কীভাবে দুই শর্ত বদলায়; ছোট একটি gate-netlist-এ critical path আর slack নিজে হিসাব করা
- Clock tree, H-tree, PLL আর clock gating — আর কেন সাধারণ AND gate দিয়ে clock বন্ধ করা বিপজ্জনক
- Metastability, MTBF-এর হিসাব, two-flip-flop synchronizer, clock domain crossing আর switch debouncing
১ · কেন synchronous নকশা — একটি সাধারণ ছন্দের শক্তি
পর্ব ০৮-এ (Logic gate আর transistor) দেখেছেন, প্রতিটি gate-এর output বদলাতে সময় লাগে — propagation delay. পর্ব ১০-এ (আরও সরলীকরণ) দেখেছেন, বিভিন্ন পথের delay আলাদা বলে output-এ ক্ষণিকের ভুল মান — glitch বা static hazard — দেখা দিতে পারে। এখন ভাবুন একটি CPU-র কথা, যেখানে কোটি কোটি gate, আর প্রতিটি সংকেত ভিন্ন সময়ে পৌঁছায়। কোন মুহূর্তে কোন তারের মান “সঠিক”, তা বলবেন কীভাবে?
উত্তর হলো synchronous নকশা। Circuit-কে দুই ধরনের অংশে ভাগ করা হয়: স্মৃতি রাখার flip-flop (বা register), আর তাদের মাঝের combinational logic. সব flip-flop একটিই সাধারণ সংকেত শোনে — clock. Clock-এর প্রতিটি উঠন্ত ধারে (rising edge) সব flip-flop একসাথে তাদের ইনপুটের মান তুলে নেয়, আর পরের ধার পর্যন্ত সেটি ধরে রাখে। দুই ধারের মাঝখানে combinational logic যা খুশি করুক — glitch হোক, মান দশবার উল্টাক — কিছু যায় আসে না, যদি পরের ধারের একটু আগে সব স্থির হয়ে যায়।
একটি অর্কেস্ট্রা ভাবুন। পঞ্চাশজন বাদক নিজের নিজের গতিতে বাজালে শুধু হট্টগোল। কন্ডাক্টরের ছড়ির প্রতিটি দোলায় সবাই একসাথে পরের তালে যান — দুই দোলার মাঝে কে কীভাবে আঙুল সরালেন, শ্রোতা তা টের পান না। অথবা রেলের সময়সূচি: কমলাপুর থেকে ট্রেন ঠিক ৭:০০-এ ছাড়ে, টঙ্গী পৌঁছায় ৭:৩০-এর আগে, আর ৭:৩০-এ পরের অংশের যাত্রা শুরু হয়। মাঝপথে ট্রেন কোথায় একটু থামল, তাতে সমস্যা নেই — শর্ত একটাই: পরের সময়-চিহ্নের আগে পৌঁছানো। Clock হলো সেই কন্ডাক্টর বা সময়সূচি, আর এই পর্বের পুরো গণিত ওই একটি শর্তকে নিখুঁতভাবে লেখা।
এর বিকল্প asynchronous নকশা — যেখানে কোনো সাধারণ clock নেই, প্রতিটি অংশ “কাজ শেষ” সংকেত দিয়ে পরের অংশকে জাগায়। এটি সম্ভব, আর কিছু জায়গায় ব্যবহারও হয় (ভাবনার প্রশ্ন ০১), কিন্তু প্রতিটি glitch সেখানে সত্যিকারের ঘটনা, তাই নকশা আর যাচাই অনেক কঠিন। এজন্য প্রায় সব CPU, GPU আর microcontroller synchronous. পর্ব ১৫-এ (Latch আর flip-flop) flip-flop-এর ভেতরের গঠন, পর্ব ১৬-এ register ও counter, আর পর্ব ১৭-এ finite state machine — সবই এই একটি ধারণার ওপর দাঁড়িয়ে। এই পর্বে প্রশ্ন: clock কত দ্রুত চালানো যায়, আর কোথায় এই নিখুঁত ছবি ভেঙে পড়ে?
Clock সংকেত — period, frequency, duty cycle আর edge
Clock হলো নিয়মিত ছন্দে 0 আর 1-এর মধ্যে ওঠানামা করা একটি বর্গাকার তরঙ্গ। এর চারটি মাপ জানলেই চলে:
- Period Tc (clock cycle time) — এক উঠন্ত ধার থেকে পরের উঠন্ত ধার পর্যন্ত সময়।
- Frequency f = ১ / Tc (clock rate) — প্রতি সেকেন্ডে কতগুলো cycle. Tc = ১ ns হলে f = ১ GHz; Tc = ২৫০ ps হলে f = ৪ GHz.
- Duty cycle — একটি period-এর কত অংশ clock 1 থাকে। বেশিরভাগ clock ৫০%, অর্থাৎ অর্ধেক সময় 1, অর্ধেক সময় 0.
- Edge — 0 থেকে 1-এ ওঠা হলো rising edge, 1 থেকে 0-তে নামা falling edge. এই পর্বের সব flip-flop rising-edge-triggered — অর্থাৎ শুধু উঠন্ত ধারেই মান নেয়।
পর্ব ০৩-এ (পারফরম্যান্স মাপা) CPU time = instruction count × CPI × Tc সূত্রে clock rate একটি গুণক হিসেবে এসেছিল — বলা হয়েছিল, clock দ্রুত হলে প্রোগ্রাম দ্রুত চলে। কিন্তু Tc কে ঠিক করে? মার্কেটিং বিভাগ নয় — circuit-এর ভেতরের সবচেয়ে ধীর পথ। সেটিই এখন হিসাব করব। (Clock সংকেত আসে একটি স্ফটিক বা crystal oscillator আর chip-এর ভেতরের PLL থেকে — অংশ ৭-এ।)
২ · ছয়টি timing সংখ্যা — flip-flop আর logic-এর delay
Flip-flop আদর্শ যন্ত্র নয়। উঠন্ত ধারে “ছবি তোলার” জন্য তার ইনপুট D-কে ধারের একটু আগে থেকে একটু পর পর্যন্ত স্থির থাকতে হয় — ক্যামেরার সামনে নড়াচড়া করলে যেমন ছবি ঝাপসা হয়। আবার ছবি তোলার পর output Q-তে নতুন মান দেখাতেও একটু সময় লাগে। এই কোর্সে Harris & Harris-এর বই (Digital Design and Computer Architecture)-এর লেখার নিয়ম ব্যবহার করা হচ্ছে, যা পাঠ্যবই আর ইন্টারভিউতে বহুল প্রচলিত:
| প্রতীক | নাম | অর্থ | এই পর্বের উদাহরণ-মান |
|---|---|---|---|
| tsetup | Setup time | Clock edge-এর আগে D-কে অন্তত এতক্ষণ স্থির থাকতে হবে | ৬০ ps |
| thold | Hold time | Clock edge-এর পরে D-কে অন্তত এতক্ষণ স্থির থাকতে হবে | ৪০ ps |
| tpcq | Clock-to-Q propagation delay | Edge-এর পর Q নতুন মানে স্থির হতে সবচেয়ে বেশি যত সময় লাগে | ৫০ ps |
| tccq | Clock-to-Q contamination delay | Edge-এর পর Q বদলাতে শুরু করতে সবচেয়ে কম যত সময় লাগে | ৩০ ps |
| tpd | Logic-এর propagation delay | Combinational logic-এর ধীরতম পথ — ইনপুট বদলের পর output স্থির হওয়ার সর্বোচ্চ সময় | পথ অনুযায়ী |
| tcd | Logic-এর contamination delay | দ্রুততম পথ — ইনপুট বদলের পর output বদলাতে শুরু করার সর্বনিম্ন সময় | পথ অনুযায়ী |
শেষ দুটি পর্ব ০৮-এর পুরোনো বন্ধু; প্রথম চারটি flip-flop-এর datasheet বা standard-cell library থেকে আসে। প্রথম দুটি একসাথে edge-এর চারপাশে একটি “নিষিদ্ধ জানালা” তৈরি করে — aperture (tsetup + thold চওড়া), যার ভেতরে D বদলানো চলবে না। tpcq আর tccq-কে একসাথে clock-to-Q delay বলে। মনে রাখার কৌশল: “p” মানে propagation = সবচেয়ে দেরি (setup-এর হিসাবে লাগে), “c” মানে contamination = সবচেয়ে আগে (hold-এর হিসাবে লাগে)। কখনো কখনো hold time ০ বা ঋণাত্মকও হয় — মানে edge-এর ঠিক পরেই D বদলালেও সমস্যা নেই।
সাধারণ ভুল: “tcd হলো tpd-এর গড়” বা “একটি gate-এর একটাই delay” ভাবা। একই gate-এর দুটি সংখ্যা থাকে: সবচেয়ে খারাপ (ধীর) আর সবচেয়ে ভালো (দ্রুত)। তাপমাত্রা, voltage, ইনপুটের ধরন আর তৈরির সময়ের বৈচিত্র্যে আসল delay এই দুইয়ের মাঝে যেকোনো জায়গায় পড়তে পারে। Setup-এর হিসাব সবচেয়ে ধীর ক্ষেত্র ধরে, hold-এর হিসাব সবচেয়ে দ্রুত ক্ষেত্র ধরে — দুটিই একসাথে নিরাপদ হতে হবে।
৩ · Setup-এর শর্ত — clock সর্বোচ্চ কত দ্রুত চলতে পারে
সবচেয়ে সাধারণ ছবিটি নিন: একটি register R1, তার পরে কিছু combinational logic, তারপর আরেকটি register R2. দুটিই একই clock পায়। R1 একটি edge-এ নতুন মান ছাড়ে (launch); সেই মান logic পেরিয়ে R2-র D-তে পৌঁছায়, আর R2 পরের edge-এ সেটি ধরে (capture).
প্রমাণ (derivation). R1-এর launch edge-কে সময় ০ ধরুন। সবচেয়ে খারাপ ক্ষেত্রে R1-এর Q স্থির হয় tpcq-তে। তারপর ধীরতম পথ দিয়ে খবর পৌঁছাতে আরও tpd লাগে, তাই R2-র D স্থির হয় tpcq + tpd-তে। R2-র capture edge আসে Tc-তে, আর তার দাবি — D স্থির থাকতে হবে Tc − tsetup-এর আগেই। অতএব
tpcq + tpd ≤ Tc − tsetup ⇔ Tc ≥ tpcq + tpd + tsetup, fmax = ১ / Tc,min
এখানে tpd হলো সব R→R পথের মধ্যে সবচেয়ে বড়টি — critical path. tpcq + tsetup অংশটিকে বলে sequencing overhead: প্রতিটি cycle-এ register নিজেই যে সময় খেয়ে ফেলে, যা কোনো কাজের হিসাবে যায় না। নিচের stepper-এ পুরো একটি cycle দেখুন — এখানে tpd = ২৪০ ps, tcd = ৩০ ps (পর্ব ১১-এর ৩২ বিট বহুস্তর CLA, প্রতি gate ২০ ps ধরে) আর Tc = ৪০০ ps. প্রতিটি অক্ষর ১০ ps; x মানে মান বদলাচ্ছে (অনিশ্চিত), = মানে স্থির; s setup-জানালা, h hold-জানালা।
ps 0 50 100 150 200 250 300 350 400 450 CLK ‾ Q1 = D2 = win R1 samples its D at t = 0 and will put a NEW value on Q1. D2 still shows the result of the OLD Q1.
ps 0 50 100 150 200 250 300 350 400 450
CLK ‾‾‾‾‾‾
Q1 ===xx=
D2 ======
win
Q1 may start changing at tccq = 30 ps,
Q1 is surely new at tpcq = 50 ps.
ps 0 50 100 150 200 250 300 350 400 450 CLK ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾__________ Q1 ===xx========================= D2 ======xxxxxxxxxxxxxxxxxxxxxxx= D2 may start changing at tccq + tcd = 30 + 30 = 60 ps D2 is surely stable at tpcq + tpd = 50 + 240 = 290 ps
ps 0 50 100 150 200 250 300 350 400 450 CLK ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾____________________ Q1 ===xx=================================== D2 ======xxxxxxxxxxxxxxxxxxxxxxx=========== win ssssss setup window starts at Tc - tsetup = 400 - 60 = 340 ps D2 stable at 290 ps -> setup slack = 340 - 290 = 50 ps minimum Tc = 50 + 240 + 60 = 350 ps -> fmax = 2.857 GHz
ps 0 50 100 150 200 250 300 350 400 450 CLK ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾____________________‾‾‾‾‾‾‾‾ Q1 ===xx======================================xx=== D2 ======xxxxxxxxxxxxxxxxxxxxxxx=================xx win sssssshhhh R2 captures the stable D2 at 400 ps. Same edge: R1 launches again. hold window ends at 400 + thold = 440 ps D2 next changes at 400 + 30 + 30 = 460 ps -> hold slack = 20 ps
- Launch. সময় ০-তে উঠন্ত ধার। R1 তার D-র মান তুলে নেয় আর Q1-এ নতুন মান পাঠানোর প্রস্তুতি নেয়। এই মুহূর্তে D2-তে তখনো পুরোনো Q1-এর হিসাবের ফল — যেটি R2 ঠিক এই edge-এই ধরেছে।
- Clock-to-Q. Q1 সবচেয়ে আগে ৩০ ps-এ (tccq) বদলাতে শুরু করতে পারে, আর ৫০ ps-এ (tpcq) নিশ্চিতভাবে নতুন মানে স্থির। মাঝের ২০ ps অনিশ্চিত —
xx. - Logic-এর ভেতর দিয়ে। দ্রুততম পথ দিয়ে প্রথম পরিবর্তন D2-তে পৌঁছায় ৩০ + ৩০ = ৬০ ps-এ; ধীরতম পথ (adder-এর carry-শিকল) শেষ হয় ৫০ + ২৪০ = ২৯০ ps-এ। এই পুরো সময় D2 glitch করতে পারে — synchronous নকশায় তাতে কোনো ক্ষতি নেই।
- Setup-জানালা। R2 চায় D2 ৪০০ − ৬০ = ৩৪০ ps থেকে স্থির থাকুক। D2 স্থির হয়েছে ২৯০ ps-এ, তাই হাতে ৫০ ps বাড়তি — একে বলে setup slack. Clock আরও ৫০ ps ছোট করা যেত: Tc,min = ৫০ + ২৪০ + ৬০ = ৩৫০ ps, অর্থাৎ fmax ≈ ২.৮৬ GHz.
- Capture আর hold. ৪০০ ps-এ R2 স্থির D2 ধরে নেয়। কিন্তু একই edge-এ R1 আবার নতুন মান ছাড়ে! R2 চায় D2 ৪৪০ ps পর্যন্ত না বদলাক (thold = ৪০)। নতুন পরিবর্তন D2-তে আসতে পারে ৪০০ + ৩০ + ৩০ = ৪৬০ ps-এ, তাই hold slack ২০ ps. এই দ্বিতীয় শর্তটির কথাই অংশ ৪-এ।
উদাহরণ ১ — ripple বনাম CLA (পর্ব ১১-এর সাথে মিলিয়ে)। ধরুন প্রতিটি gate-এর delay ২০ ps (বোঝানোর জন্য ধরা মান), আর flip-flop-এর tpcq = ৫০, tsetup = ৬০ ps. পর্ব ১১-এ (Adder) হিসাব করা হয়েছিল ৩২ বিট ripple-carry adder-এর সবচেয়ে খারাপ delay 2n + 1 = ৬৫ gate delay, আর বহুস্তর carry-lookahead-এর ১২ gate delay. দুই register-এর মাঝে adder বসালে:
- Ripple: tpd = ৬৫ × ২০ = ১,৩০০ ps → Tc ≥ ৫০ + ১,৩০০ + ৬০ = ১,৪১০ ps → fmax ≈ ৭০৯ MHz.
- CLA: tpd = ১২ × ২০ = ২৪০ ps → Tc ≥ ৩৫০ ps → fmax ≈ ২.৮৬ GHz.
লক্ষ করুন sequencing overhead-এর (১১০ ps) ভাগ: ripple-এর cycle-এ মাত্র ৭.৮%, কিন্তু CLA-র cycle-এ ৩১.৪%. Logic যত দ্রুত হয়, register-এর নিজের খরচ তত বড় হয়ে দেখা দেয় — পর্ব ৩৫-এ (pipelining) ঠিক এই কারণেই pipeline-এর ধাপ অসীম বাড়ানো যায় না।
উদাহরণ ২ — উল্টো প্রশ্ন। ২ GHz-এ চালাতে চাইলে (Tc = ৫০০ ps) দুই register-এর মাঝে সর্বোচ্চ কত logic রাখা যায়? tpd ≤ ৫০০ − ৫০ − ৬০ = ৩৯০ ps, অর্থাৎ ২০ ps-এর gate হলে সর্বোচ্চ ১৯টি স্তর (৩৯০ / ২০ = ১৯.৫, পূর্ণ স্তর ১৯)। নকশাকারীরা ঠিক এভাবে “logic depth”-এর বাজেট ভাগ করেন।
নিচের calculator একই flip-flop (tpcq = ৫০, tccq = ৩০, tsetup = ৬০, thold = ৪০ ps) নিয়ে কয়েকটি পরিস্থিতিতে দুই শর্তই যাচাই করে। এখনই সব সারি না বুঝলেও চলবে — hold আর skew-এর সারিগুলো পরের দুই অংশে ব্যাখ্যা করা হবে।
// Register-to-register timing check (all times in ps).
// Setup: Tc >= tpcq + tpd + tsetup + tskew
// Hold : tccq + tcd >= thold + tskew (no Tc in it!)
const FF = { tpcq: 50, tccq: 30, tsetup: 60, thold: 40 };
function check(name, tpd, tcd, skew, fGHz) {
const Tc = 1000 / fGHz; // clock period in ps
const TcMin = FF.tpcq + tpd + FF.tsetup + skew;
const setupSlack = Tc - TcMin;
const holdSlack = FF.tccq + tcd - (FF.thold + skew);
const tag = s => (s >= 0 ? "PASS" : "FAIL");
console.log(name.padEnd(24) + String(TcMin).padStart(6) +
(1e6 / TcMin).toFixed(0).padStart(7) + String(Tc.toFixed(0)).padStart(6) +
`${setupSlack.toFixed(0).padStart(7)} ${tag(setupSlack)}` +
`${holdSlack.toFixed(0).padStart(6)} ${tag(holdSlack)}`);
}
console.log("scenario TcMin fmax Tc setup-slack hold-slack");
console.log(" (ps) (MHz) (ps)");
check("ripple-32 @1GHz", 1300, 30, 0, 1); // 65 gates x 20 ps
check("CLA-32 @1GHz", 240, 30, 0, 1); // 12 gates x 20 ps
check("FF->FF wire @1GHz", 0, 0, 0, 1); // shift register, no logic
check("FF->buf->FF @1GHz", 25, 15, 0, 1); // one delay buffer added
check("CLA-32 skew50 @2GHz", 240, 30, 50, 2);
check("CLA-32 skew50 @1GHz", 240, 30, 50, 1); // slower clock: hold still fails
check("CLA-32 skew50 +2buf", 240, 60, 50, 2); // pad only the short pathsআউটপুট:
scenario TcMin fmax Tc setup-slack hold-slack
(ps) (MHz) (ps)
ripple-32 @1GHz 1410 709 1000 -410 FAIL 20 PASS
CLA-32 @1GHz 350 2857 1000 650 PASS 20 PASS
FF->FF wire @1GHz 110 9091 1000 890 PASS -10 FAIL
FF->buf->FF @1GHz 135 7407 1000 865 PASS 5 PASS
CLA-32 skew50 @2GHz 400 2500 500 100 PASS -30 FAIL
CLA-32 skew50 @1GHz 400 2500 1000 600 PASS -30 FAIL
CLA-32 skew50 +2buf 400 2500 500 100 PASS 0 PASS
প্রথম দুই সারি উদাহরণ ১-এর হিসাব মেলায়: ripple-এর Tc,min ১,৪১০ ps, তাই ১ GHz-এ (Tc = ১,০০০) setup slack −৪১০ — FAIL; CLA-র ৩৫০ ps, slack +৬৫০. তৃতীয় সারিতে মাঝে কোনো logic নেই (shift register): setup নিয়ে চিন্তাই নেই (fmax ৯ GHz-এর বেশি), অথচ hold slack −১০ — FAIL. চতুর্থ সারিতে একটি buffer (tcd = ১৫) বসাতেই hold +৫ — PASS. পঞ্চম আর ষষ্ঠ সারি সবচেয়ে শিক্ষণীয়: ৫০ ps skew-এ hold slack −৩০, আর clock ২ GHz থেকে ১ GHz-এ নামালেও hold slack ঠিক −৩০-ই থাকে — setup slack বাড়ে, hold slack এক চুলও নড়ে না। শেষ সারিতে শুধু ছোট পথে দুটি buffer (tcd ৩০ → ৬০) বসানোয় hold slack ঠিক ০ — সীমানায় হলেও PASS, আর critical path (tpd = ২৪০) অপরিবর্তিত।
৪ · Hold-এর শর্ত — যখন পথ খুব বেশি দ্রুত
Setup-এর ভয় হলো “দেরিতে পৌঁছানো”। Hold-এর ভয় উল্টো: খুব তাড়াতাড়ি পৌঁছানো। একই edge-এ R1 নতুন মান ছাড়ে আর R2 পুরোনো মান ধরে। R1-এর নতুন মান যদি এত দ্রুত R2-র D-তে চলে আসে যে R2-র hold-জানালা তখনো শেষ হয়নি, তাহলে R2 পুরোনো মানের বদলে নতুনটা ধরে ফেলতে পারে — বা দুইয়ের মাঝামাঝি কোনো অবস্থায় আটকে যেতে পারে (অংশ ৮)।
প্রমাণ। Edge সময় ০-তে। সবচেয়ে আগে R1-এর Q বদলায় tccq-তে; দ্রুততম পথ দিয়ে সেই পরিবর্তন R2-র D-তে পৌঁছায় tccq + tcd-তে। R2 চায় D অন্তত thold পর্যন্ত না বদলাক। অতএব
tccq + tcd ≥ thold ⇔ tcd ≥ thold − tccq
সূত্রে Tc কোথাও নেই! কারণ দুই পক্ষই — R1-এর launch আর R2-র hold-জানালা — একই edge-এর ঘটনা। Clock ধীর বা দ্রুত করলে দুটিই একসাথে সরে। তাই setup violation হলে clock ধীর করে chip চালানো যায় (কম গতিতে বিক্রি করা যায়), কিন্তু hold violation থাকলে chip কোনো গতিতেই নির্ভরযোগ্য নয় — নতুন করে নকশা আর তৈরি করতে হয় (ভাবনার প্রশ্ন ০৩)।
D1 ──► [R1] ──Q1──────────► [R2] ──► Q2
▲ (wire: tpd = tcd = 0) ▲
CLK ────┴────────────────────────────┘
before the edge: D1 = 0, Q1 = 1, Q2 = 0
correct result after the edge: Q1 = 0, Q2 = 1 (the old Q1)
ps 0 25 50 75 100 CLK ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ hold(R2) hhhhhhhh R2 needs D2 (= Q1) to stay at the OLD value 1 from 0 ps until thold = 40 ps
ps 0 25 50 75 100 CLK ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ Q1 = D2 ======xxxx========== hold(R2) hhhhhhhh Q1 starts changing at tccq = 30 ps, inside the hold window hold slack = tccq + tcd - thold = 30 + 0 - 40 = -10 ps
R2 may capture: 1 (correct, by luck)
0 (wrong: the bit skipped a stage)
or hang in between (metastable)
slower clock (Tc = 10 ns instead of 1 ns)?
-> same 30 ps vs 40 ps race -> still broken
[R1] ──Q1──[buf: tcd 15, tpd 25]──► [R2] ps 0 25 50 75 100 CLK ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ Q1 ======xxxx========== D2 =========xxxxxx===== hold(R2) hhhhhhhh D2 starts changing at 30 + 15 = 45 ps > 40 ps hold slack = +5 ps; cost: Tc min grows 110 -> 135 ps
- সবচেয়ে বিপজ্জনক পথ। পর্ব ১৬-এর shift register-এ এক flip-flop-এর Q সরাসরি পরেরটির D-তে যায় — মাঝে কোনো gate নেই, তাই tcd = ০. Edge-এর পর সঠিক ফল: Q2 পায় পুরোনো Q1 (1), আর Q1 পায় D1 (0).
- একই edge, দুই কাজ। R1 আর R2 একই মুহূর্তে মান নেয়। R2-র দাবি: তার D (অর্থাৎ Q1) ০ থেকে ৪০ ps পর্যন্ত পুরোনো মান 1-এ থাকুক।
- দৌড়ে হার। R1 নিজেই ৩০ ps-এ (tccq) Q1 বদলাতে শুরু করে — R2-র hold-জানালার ১০ ps আগে। Hold slack = ৩০ + ০ − ৪০ = −১০ ps. এটি একটি race: নতুন মান পুরোনো মানকে “ধাক্কা দিয়ে” সরিয়ে দিচ্ছে।
- ফল অনির্ভরযোগ্য। R2 ভাগ্যক্রমে ঠিক মান, ভুল মান (বিট একটি ধাপ লাফিয়ে গেল) অথবা metastable অবস্থা পেতে পারে। Clock ১০ গুণ ধীর করলেও প্রথম ৪০ ps-এর এই দৌড় হুবহু একই থাকে — তাই সমস্যাও থাকে।
- সমাধান — ইচ্ছাকৃত delay. পথে একটি delay buffer (tcd = ১৫, tpd = ২৫ ps) বসালে D2 বদলায় ৪৫ ps-এ, hold-জানালার পরে — slack +৫ ps. দাম: এই পথের setup-এর চাহিদা ১১০ থেকে ১৩৫ ps-এ বাড়ে, যা এখানে তুচ্ছ। আধুনিক tool নিজেই শুধু ছোট পথগুলোতে এমন buffer বসায় (hold fixing).
বাস্তবে অনেক flip-flop-এ tccq ≥ thold রাখা হয়, যাতে সরাসরি জোড়া flip-flop-ও নিরাপদ থাকে। কিন্তু পরের অংশে দেখবেন, clock skew এলে সেই নিরাপত্তা আর থাকে না।
৫ · Clock skew আর jitter — একই clock, ভিন্ন সময়ে
এতক্ষণ ধরে নিয়েছি, clock edge সব flip-flop-এ ঠিক একই মুহূর্তে পৌঁছায়। বাস্তবে clock একটি তার — chip-এর এক কোণ থেকে অন্য কোণে যেতে তার-দৈর্ঘ্য আর buffer-এর কারণে সময় লাগে। দুই flip-flop-এ clock পৌঁছানোর সময়ের পার্থক্যকে বলে clock skew. সংজ্ঞা নিন δ = (capture register-এ clock পৌঁছানোর সময়) − (launch register-এ clock পৌঁছানোর সময়)।
- Positive skew (δ > ০) — capture-এর clock দেরিতে আসে। Setup-এর হাতে বাড়তি δ সময়: Tc ≥ tpcq + tpd + tsetup − δ. কিন্তু hold-জানালাও δ দেরিতে শেষ হয়: tccq + tcd ≥ thold + δ — hold কঠিন হলো।
- Negative skew (δ < ০) — capture-এর clock আগে আসে। Setup কঠিন হয় (|δ| যোগ হয়), hold সহজ হয়।
অর্থাৎ skew একদিকে যা দেয়, অন্যদিকে তা কেড়ে নেয়। আর chip-এ হাজার হাজার পথ; কোন পথে কোন দিকের skew, তা তৈরির বৈচিত্র্য আর তাপমাত্রায় বদলাতে পারে। তাই Harris & Harris নিরাপদ (conservative) রূপটি দেন — skew-এর চিহ্ন অজানা ধরে, |δ| ≤ tskew হলে দুই শর্তেই সবচেয়ে খারাপটা:
Tc ≥ tpcq + tpd + tsetup + tskew · tccq + tcd ≥ thold + tskew
উদাহরণ ৩ — skew-এর হিসাব। একই CLA পথ (tpd = ২৪০, tcd = ৩০) আর একই flip-flop (tpcq = ৫০, tccq = ৩০, tsetup = ৬০, thold = ৪০ ps).
- δ = +৫০ ps (জানা, positive): Tc ≥ ৫০ + ২৪০ + ৬০ − ৫০ = ৩০০ ps (setup-এ লাভ)। Hold: ৩০ + ৩০ = ৬০ বনাম ৪০ + ৫০ = ৯০ → slack −৩০ ps — violation.
- δ = −৫০ ps (জানা, negative): Tc ≥ ৪০০ ps; hold: ৬০ ≥ ৪০ − ৫০ = −১০ → slack +৭০ ps — নিরাপদ।
- চিহ্ন অজানা, tskew = ৫০ ps: দুই খারাপ একসাথে — Tc ≥ ৪০০ ps (fmax ২.৫ GHz) আর hold slack −৩০ ps. অংশ ৩-এর calculator-এর পঞ্চম সারি ঠিক এটিই। সমাধান: ছোট পথে অন্তত ৩০ ps tcd যোগ — যেমন দুটি ১৫ ps-এর buffer (শেষ সারি, slack ০)।
Clock jitter হলো আরেক রকম অনিশ্চয়তা: একই flip-flop-এ পরপর দুটি edge-এর ব্যবধান ঠিক Tc না হয়ে একটু কমবেশি হওয়া (oscillator আর PLL-এর noise, power supply-র ওঠানামা)। Setup-এর হিসাব দুটি ভিন্ন edge-এর মাঝের সময়ের ওপর নির্ভর করে, তাই jitter সেখান থেকে সময় কেড়ে নেয় — নকশাকারীরা Tc-এর বাজেটে jitter-এর জন্যও একটি অংশ রাখেন। Hold-এর হিসাব একই edge-এর, তাই সাধারণত cycle-থেকে-cycle jitter সেখানে প্রভাব ফেলে না। Tool-এ skew আর jitter প্রায়ই একসাথে “clock uncertainty” নামে একটি বাজেট হিসেবে দেওয়া হয়।
Skew কি সবসময় শত্রু? না। দক্ষ নকশাকারী ইচ্ছে করে কোনো ধীর পথের capture register-এর clock একটু দেরিতে দেন (useful skew), যাতে সেই পথ পাশের cycle থেকে একটু সময় “ধার” পায় — অবশ্যই পরের পথের setup আর এই পথের hold-এর হিসাব মিলিয়ে। আধুনিক tool এটি স্বয়ংক্রিয়ভাবেও করতে পারে।
৬ · Critical path আর static timing analysis — tool কী হিসাব করে
একটি আসল chip-এ কোটি কোটি register-থেকে-register পথ। প্রতিটির জন্য simulation চালিয়ে সব ইনপুট পরীক্ষা করা অসম্ভব — ৬৪ বিটের দুই ইনপুটেই ২১২৮ সমাবেশ। তাই শিল্পে ব্যবহার হয় static timing analysis (STA): ইনপুটের মান না দেখে শুধু circuit-এর গঠন (netlist) আর প্রতিটি gate-এর delay দিয়ে সবচেয়ে খারাপ আর সবচেয়ে ভালো সময় হিসাব করা। “Static” মানে মান নিয়ে simulation নয়, গঠন দেখে হিসাব।
পদ্ধতিটি একটি graph algorithm — gate-গুলো নোড, তার হলো edge, আর graph-এ কোনো চক্র নেই (চক্র থাকলে তা register দিয়ে ভাঙা থাকে)। টপোলজিক্যাল ক্রমে (ইনপুট থেকে output-এর দিকে) প্রতিটি নোডে দুটি সংখ্যা বসান:
- Max arrival time = (ইনপুটগুলোর max arrival-এর বৃহত্তম) + gate-এর tpd. শুরুতে প্রতিটি launch register-এর output-এ tpcq.
- Min arrival time = (ইনপুটগুলোর min arrival-এর ক্ষুদ্রতম) + gate-এর tcd. শুরুতে tccq.
তারপর capture register-এ required time-এর সাথে তুলনা: setup-এর জন্য required = Tc − tsetup − tskew, hold-এর জন্য required = thold + tskew. Slack = required − arrival (setup), বা arrival − required (hold) — ঋণাত্মক slack মানে violation. Critical path পেতে প্রতিটি নোডে “কোন ইনপুট সবচেয়ে দেরিতে এল” মনে রেখে output থেকে পেছনে হাঁটতে হয়। পর্ব ১১-এর ripple adder-এ delay ইনপুট-নির্ভর ছিল; STA ইচ্ছে করেই সেটি উপেক্ষা করে সবচেয়ে খারাপটা ধরে — নিরাপদ, তবে কখনো কখনো একটু বেশি সাবধানী।
নিচের ছোট netlist নিন। Launch register চারটি সংকেত a, b, c, d দেয়; capture register দুটি সংকেত Y আর Z নেয়। Flip-flop আগের মতোই, Tc = ২৯০ ps, tskew = ১৫ ps. প্রতিটি gate-এর পাশে (tpd, tcd) ps-এ:
g1 = NAND(a, b) (30, 20)
g2 = INV(c) (15, 10)
g3 = NOR(g1, g2) (40, 25)
g4 = XOR(g3, d) (60, 40)
Y = AND(g4, g2) (45, 30) -> capture FF
Z = AND(c, d) (45, 20) -> capture FF
node max min a 50 30 b 50 30 c 50 30 d 50 30 max = tpcq = 50, min = tccq = 30 (all launched by one edge)
node max min g1 max(50,50)+30 = 80 min(30,30)+20 = 50 g2 50+15 = 65 30+10 = 40 latest input of g1: a (b ties at 50)
node max min g3 max(80,65)+40 = 120 min(50,40)+25 = 65 g4 max(120,50)+60 = 180 min(65,30)+40 = 70 g3 waits for g1 (80), not g2 (65) g4's EARLIEST change comes from d (30), not g3
node max min Y max(180,65)+45 = 225 min(70,40)+30 = 70 Z max(50,50)+45 = 95 min(30,30)+20 = 50
Y <- g4 (180) <- g3 (120) <- g1 (80) <- a (50)
critical path: a -> g1 -> g3 -> g4 -> Y
delay = 50 + 30 + 40 + 60 + 45 = 225 ps
setup required = Tc - tsetup - tskew = 290 - 60 - 15 = 215 hold required = thold + tskew = 40 + 15 = 55 Y: setup 215 - 225 = -10 VIOLATION hold 70 - 55 = +15 ok Z: setup 215 - 95 = +120 ok hold 50 - 55 = -5 VIOLATION
- শুরুর মান। চারটি সংকেতই একই edge-এ launch হয়, তাই সবার সবচেয়ে দেরির সময় tpcq = ৫০ আর সবচেয়ে আগের সময় tccq = ৩০ ps.
- প্রথম স্তর। g1-এর max = দুই ইনপুটের বড়টি (৫০) + ৩০ = ৮০; min = ছোটটি (৩০) + ২০ = ৫০. g2 একটি inverter: max ৬৫, min ৪০. a আর b দুটিই ৫০-এ আসে — সমান হলে যেকোনো একটিকে critical ধরা যায়; এখানে a.
- Max-এ বড়, min-এ ছোট। g3-এর max-এ দেরির ইনপুট g1 (৮০), তাই ১২০. g4-এর max-এ g3 (১২০) + ৬০ = ১৮০. কিন্তু g4-এর min-এ d সরাসরি ৩০-এ আসে, তাই ৩০ + ৪০ = ৭০ — দ্রুততম পথ আর ধীরতম পথ ভিন্ন ইনপুট দিয়ে যায়।
- Output-এ পৌঁছানো। Y: max ২২৫, min ৭০. Z: মাত্র একটি gate, max ৯৫, min ৫০ — একটি খুব ছোট পথ।
- Critical path. প্রতিটি নোডের “সবচেয়ে দেরির ইনপুট” ধরে Y থেকে পেছনে: g4 → g3 → g1 → a. মোট ৫০ + ৩০ + ৪০ + ৬০ + ৪৫ = ২২৫ ps. গতি বাড়াতে চাইলে এই পথের gate-গুলোই দ্রুত করতে হবে; Z-এর gate দ্রুত করে কোনো লাভ নেই।
- Slack. Y-এর setup slack −১০ (clock ১০ ps ধীর করুন বা পথ ছোট করুন), Z-এর hold slack −৫ (Z-এর পথে buffer লাগবে)। একই circuit-এ দুই ধরনের সমস্যা একসাথে — আর দুটির সমাধানও ভিন্ন। Tc,min = ২২৫ + ৬০ + ১৫ = ৩০০ ps.
এই হিসাবটিই কোডে — একটি টপোলজিক্যাল ক্রমের loop, প্রতিটি নোডে max আর min, তারপর পেছনে হাঁটা:
// Mini static timing analysis on a gate netlist (times in ps).
// Launch FFs drive a, b, c, d; capture FFs sample Y and Z.
const FF = { tpcq: 50, tccq: 30, tsetup: 60, thold: 40 };
const Tc = 290, tskew = 15; // clock period and skew budget
const net = [ // [name, type, inputs, tpd, tcd] (listed in topological order)
["g1", "NAND", ["a", "b"], 30, 20],
["g2", "INV", ["c"], 15, 10],
["g3", "NOR", ["g1", "g2"], 40, 25],
["g4", "XOR", ["g3", "d"], 60, 40],
["Y", "AND", ["g4", "g2"], 45, 30],
["Z", "AND", ["c", "d"], 45, 20],
];
const late = {}, early = {}, from = {};
for (const x of "abcd") { late[x] = FF.tpcq; early[x] = FF.tccq; }
for (const [n, type, ins, tpd, tcd] of net) {
const worst = ins.reduce((p, q) => (late[q] > late[p] ? q : p));
late[n] = late[worst] + tpd; // latest arrival
early[n] = Math.min(...ins.map(i => early[i])) + tcd; // earliest arrival
from[n] = worst;
console.log(`${n.padEnd(2)} ${type.padEnd(4)} max ${String(late[n]).padStart(3)}` +
` min ${String(early[n]).padStart(3)} (latest input: ${worst})`);
}
for (const out of ["Y", "Z"]) {
const path = [out];
while (from[path[0]]) path.unshift(from[path[0]]);
const setup = (Tc - FF.tsetup - tskew) - late[out]; // required - arrival
const hold = early[out] - (FF.thold + tskew); // arrival - required
console.log(`${out}: path ${path.join(" -> ")} | setup slack ${setup}` +
` ${setup < 0 ? "VIOLATION" : "ok"} | hold slack ${hold} ${hold < 0 ? "VIOLATION" : "ok"}`);
}আউটপুট:
g1 NAND max 80 min 50 (latest input: a)
g2 INV max 65 min 40 (latest input: c)
g3 NOR max 120 min 65 (latest input: g1)
g4 XOR max 180 min 70 (latest input: g3)
Y AND max 225 min 70 (latest input: g4)
Z AND max 95 min 50 (latest input: c)
Y: path a -> g1 -> g3 -> g4 -> Y | setup slack -10 VIOLATION | hold slack 15 ok
Z: path c -> Z | setup slack 120 ok | hold slack -5 VIOLATION
প্রতিটি সারি stepper-এর একটি ঘর মেলায়: Y-এর max ২২৫, min ৭০; Z-এর max ৯৫, min ৫০. পেছনে হাঁটার ফল a -> g1 -> g3 -> g4 -> Y — critical path. Y-এর setup slack −১০ (VIOLATION), কিন্তু hold slack +১৫; Z ঠিক উল্টো — setup-এ ১২০ ps বাড়তি, hold-এ −৫. Tc ৩০০ করলে Y-এর setup slack ০ হবে, কিন্তু Z-এর hold slack −৫-ই থাকবে — আবারও প্রমাণ, hold-এ clock-এর কোনো ভূমিকা নেই। আসল STA tool (যেমন Synopsys PrimeTime বা খোলা উৎসের OpenSTA) মূলত একই কাজ করে, তবে তারের delay, ইনপুট-সংকেতের slope, load, আর বহু “corner” (ধীর/দ্রুত transistor, উচ্চ/নিম্ন voltage ও তাপমাত্রা) ধরে।
৭ · Clock বিতরণ — clock tree, H-tree, PLL আর clock gating
একটি chip-এ clock-কে লক্ষ লক্ষ flip-flop-এ প্রায় একই সময়ে পৌঁছাতে হয়। একটি তারে এত flip-flop জুড়লে fan-out বিশাল, delay বিশাল, আর দূরের flip-flop অনেক দেরিতে clock পায় — বিশাল skew. তাই clock যায় একটি clock tree দিয়ে: মূল থেকে buffer, প্রতিটি buffer আরও কয়েকটি buffer চালায়, শেষে প্রতিটি পাতায় অল্প কয়েকটি flip-flop. লক্ষ্য — মূল থেকে প্রতিটি পাতার পথের delay সমান রাখা।
এর একটি সুন্দর জ্যামিতিক রূপ H-tree: chip-এর কেন্দ্র থেকে একটি “H” আঁকুন; H-এর চার কোণ থেকে আবার ছোট ছোট H, এভাবে বারবার। গঠন অনুযায়ী কেন্দ্র থেকে প্রতিটি কোণের তার-দৈর্ঘ্য সমান, তাই আদর্শ অবস্থায় skew শূন্য। বাস্তবে logic-এর অসমান বিন্যাস, তারের বৈচিত্র্য আর তাপমাত্রার পার্থক্যে কিছু skew থেকেই যায়; উচ্চ-গতির কিছু CPU-তে তাই tree-র শেষ স্তরে তারের একটি জাল (clock mesh) ব্যবহার করা হয়, যা পার্থক্যগুলো গড় করে দেয় — বেশি power-এর বিনিময়ে।
Clock আসে কোথা থেকে? Board-এ একটি crystal oscillator তুলনামূলক কম কিন্তু খুব স্থির frequency দেয় (প্রায়ই কয়েক MHz থেকে ১০০ MHz-এর মতো)। Chip-এর ভেতরে একটি PLL (phase-locked loop) সেটিকে গুণ করে — যেমন ১০০ MHz × ৪০ = ৪ GHz — আর নিজের output-কে reference-এর সাথে phase মিলিয়ে “তালাবদ্ধ” রাখে। অনেক ডেস্কটপ CPU-র “multiplier” কথাটি এখান থেকেই। PLL-এর output-এর ছোট কাঁপুনিই অংশ ৫-এর jitter-এর একটি বড় উৎস।
Clock gating — power বাঁচানো। পর্ব ০২-এর সূত্র মনে করুন: dynamic power ≈ α·C·V২·f, যেখানে α (activity factor) হলো প্রতি cycle-এ গড়ে কতটুকু capacitance পুরো একবার charge আর discharge হয়। সাধারণ data-তারে α প্রায়ই অনেক কম, কিন্তু clock-তার প্রতিটি cycle-এ একবার ওঠে আর একবার নামে — α = ১, সর্বোচ্চ, আর তার-জালও বিশাল। তাই chip-এর dynamic power-এর একটি বড় অংশ clock network-এই খরচ হতে পারে। যে block এই মুহূর্তে কাজ করছে না (যেমন floating-point unit, যখন প্রোগ্রাম শুধু integer হিসাব করছে), তার clock বন্ধ রাখলে বড় সাশ্রয় হয় — একে বলে clock gating.
সহজ বুদ্ধি: gclk = clk AND enable. কিন্তু এটি বিপজ্জনক! clk = 1 থাকাকালীন enable বদলালে gclk-এ একটি ছোট্ট বাড়তি pulse (glitch) বা কাটা pulse তৈরি হয় — আর flip-flop-এর কাছে clock-এর glitch মানে একটি বাড়তি, ভুল edge. তার ওপর AND gate-এর delay clock-পথে skew যোগ করে। সমাধান হলো integrated clock-gating cell (ICG): ভেতরে একটি latch, যা clk = 0 থাকাকালীন enable-এর মান নেয় আর clk = 1 থাকাকালীন সেটি আটকে রাখে; তারপর AND. ফলে enable শুধু clock-এর নিচু অংশে বদলাতে পারে, আর gated clock-এ সবসময় পূর্ণ, পরিষ্কার pulse. Synthesis tool আর standard-cell library এই cell সরবরাহ করে; হাতে লেখা “AND দিয়ে clock বন্ধ” প্রায় সব নকশা-নিয়মে নিষিদ্ধ।
| সময় | clk | enable | AND-এর gclk | ICG-এর gclk |
|---|---|---|---|---|
| cycle 1, clk উঁচু | 1 | 1 | 1 | 1 (latch-এ en = 1) |
| cycle 1-এর মাঝে enable নামল | 1 | 1 → 0 | pulse কেটে গেল (ছোট pulse) | 1 (latch বন্ধ, পুরোনো en ধরা) |
| cycle 1-এর শেষ ভাগে, clk নিচু অবস্থায় enable উঠল | 0 | 0 → 1 | 0 | 0 (latch নতুন en নেয়) |
| cycle 2, clk উঁচু অংশে enable-এ glitch | 1 | 1 → 0 → 1 | বাড়তি edge! | 1 (পূর্ণ, পরিষ্কার pulse) |
৮ · Metastability — যখন setup-hold মানা অসম্ভব
এতক্ষণের সব হিসাব ধরে নিয়েছে, D কখন বদলাবে তা আমরা জানি — কারণ সব কিছু একই clock থেকে আসে। কিন্তু পৃথিবী clock মানে না। একজন মানুষ যেকোনো মুহূর্তে বোতাম চাপেন; network-এর তার, sensor, বা অন্য clock-এ চলা আরেকটি chip যেকোনো সময় সংকেত পাঠায়। এমন asynchronous input-এর ক্ষেত্রে কোনো না কোনো সময় D ঠিক setup-hold জানালার ভেতরে বদলাবেই — এড়ানোর উপায় নেই।
তখন flip-flop-এর ভেতরে কী হয়? পর্ব ১৫-এ দেখেছেন, flip-flop-এর মূলে দুটি inverter একে অপরকে চালায় — একটি bistable circuit, যার দুটি স্থির অবস্থা (0 আর 1). জানালার ভেতরে D বদলালে circuit এই দুইয়ের মাঝখানের একটি অস্থির সাম্য-বিন্দুর কাছে পড়ে যেতে পারে, যেখানে output-এর voltage না 0, না 1. এই অবস্থার নাম metastability.
একটি পাহাড়ের চূড়ায় রাখা বল ভাবুন — দুই পাশে দুটি উপত্যকা, “0” আর “1”. বলকে আলতো ধাক্কা দিলে সেটি একদিকে গড়িয়ে যায়। কিন্তু ঠিক চূড়ায়, একদম নিখুঁত ভারসাম্যে রাখলে বলটি কিছুক্ষণ সেখানেই কাঁপতে থাকে — কোন দিকে পড়বে, কখন পড়বে, আগে থেকে বলা যায় না। চূড়া থেকে যত দূরে শুরু, তত দ্রুত পড়ে; চূড়ার যত কাছে, তত দেরি। শেষ পর্যন্ত বল কোনো এক দিকে পড়বেই (noise-ই তাকে ঠেলে দেয়), কিন্তু সেই সময়ের কোনো নির্দিষ্ট ঊর্ধ্বসীমা নেই।
গণিতে এই “গড়িয়ে পড়া” প্রায় সূচকীয় (exponential): metastable অবস্থা থেকে বের হতে t-এর বেশি সময় লাগার সম্ভাবনা প্রায় (T0 / Tc) · e−t/τ. এখানে τ (tau) হলো flip-flop-এর resolution time constant — তার ভেতরের inverter-জোড়া কত দ্রুত পার্থক্য বাড়ায় — আর T0 একটি জানালা-সংক্রান্ত ধ্রুবক; দুটিই মেপে বের করা হয়। প্রতি সেকেন্ডে fdata বার ইনপুট বদলালে ব্যর্থতার হার = fdata × সেই সম্ভাবনা, আর তার উল্টো হলো গড় ব্যর্থতা-বিরতি, MTBF (mean time between failures). Harris & Harris-এর রূপে, Tc = ১ / fclk বসিয়ে:
MTBF = etr / τ / (T0 · fclk · fdata)
tr হলো flip-flop-কে স্থির হওয়ার জন্য কত সময় দেওয়া হলো (resolution time). মূল কথা: tr সূচকে বসে। tr একটু বাড়ালেই MTBF বহুগুণ বাড়ে। একটি flip-flop-এর output সরাসরি logic-এ গেলে tr = Tc − tpd − tsetup — অল্প। সমাধান: প্রথম flip-flop-এর পরে আরেকটি flip-flop বসান, আর মাঝে কোনো logic রাখবেন না। প্রথমটি metastable হলেও তার হাতে প্রায় পুরো একটি cycle (tr ≈ Tc − tsetup) থাকে স্থির হওয়ার জন্য; দ্বিতীয়টি তখন একটি পরিষ্কার মান ধরে। এই জোড়ার নাম two-flip-flop synchronizer.
button ──► [FF1] ──meta──► [FF2] ──sync──► logic (async) ▲ ▲ clk ─────────┴────────────────┘ Tc = 2000 ps (500 MHz) before edge 1: async = 0, meta = 0, sync = 0
edge 1 at t = 0; async goes 0 -> 1 at t = -10 ps
(inside FF1's setup window: the last 100 ps before the edge)
async = 1
meta = M (about VDD/2, neither 0 nor 1)
sync = 0 (FF2 sampled the clean old meta = 0)
t = 0 ps meta = M
t = 300 ps meta = 1 (resolved; could have been 0)
t = 1900 ps FF2 setup window opens: meta is long stable
time allowed: tr = Tc - tsetup = 2000 - 100 = 1900 ps
logic sees sync = 0 the whole cycle (clean)
edge 2 at t = 2000 ps
FF2 samples meta = 1 (stable) -> sync = 1
FF1 samples async = 1 -> meta = 1
logic sees a clean 0 -> 1, one or two cycles late
if meta had resolved to 0 at 300 ps:
edge 2: FF2 gets 0 -> sync = 0, FF1 gets async = 1 -> meta = 1
edge 3: FF2 gets 1 -> sync = 1
either way: sync is always a clean 0 or 1;
the only cost is one extra cycle of delay
failure = meta still undecided after tr = 1900 ps
-> FF2 may go metastable too
P(still metastable) = (T0 / Tc) * e^(-tr / tau)
with tau = 50 ps: e^(-1900/50) = e^(-38) ~ 3e-17
-> this rare event is exactly what MTBF counts
- দুটি flip-flop, মাঝে কিছু নয়। Asynchronous বোতামের সংকেত প্রথমে FF1-এ, FF1-এর output (meta) সরাসরি FF2-তে, আর শুধু FF2-এর output (sync) বাকি circuit ব্যবহার করে। Tc = ২,০০০ ps, tsetup = ১০০ ps ধরা হলো।
- দুর্ভাগ্যের মুহূর্ত। Edge 1-এর মাত্র ১০ ps আগে বোতামের সংকেত 0 থেকে 1 হলো — setup জানালার ভেতরে। FF1 metastable (M): তার output মাঝামাঝি voltage-এ ঝুলছে। FF2 একই edge-এ পুরোনো, পরিষ্কার meta = 0 নিয়েছে, তাই sync = 0.
- সময়ই সমাধান। পাহাড়ের বল গড়িয়ে পড়ে — এখানে ৩০০ ps-এ meta = 1 (০-ও হতে পারত, আগে থেকে বলা যায় না)। FF2-এর setup-জানালা শুরু ১,৯০০ ps-এ, তাই FF1-এর হাতে স্থির হওয়ার জন্য tr = ১,৯০০ ps ছিল। এই পুরো সময় বাকি logic দেখেছে পরিষ্কার sync = 0.
- পরিষ্কার ফল। Edge 2-এ FF2 স্থির meta = 1 ধরে: sync = 1. বাকি logic কখনো M দেখেনি — দেখেছে একটি সাধারণ 0 → 1 বদল, বোতাম চাপার এক বা দুই cycle পরে।
- অন্য দিকে পড়লেও ক্ষতি নেই। M থেকে 0 হলে edge 2-এ sync = 0 থাকে, কিন্তু FF1 তখন বোতামের স্থির 1 ধরে; edge 3-এ sync = 1. Synchronizer “সঠিক cycle” কথা দেয় না, দেয় শুধু “পরিষ্কার মান” — আর asynchronous সংকেতের জন্য সেটুকুই যথেষ্ট।
- ব্যর্থতা কত বিরল? ব্যর্থ হয় শুধু তখন, যখন FF1 ১,৯০০ ps পরেও সিদ্ধান্তহীন। τ = ৫০ ps হলে e−৩৮ ≈ ৩ × ১০−১৭ — প্রায় অসম্ভব, কিন্তু শূন্য নয়। প্রতি সেকেন্ডে লক্ষ লক্ষবার এমন সুযোগ এলে এই ক্ষুদ্র সম্ভাবনাও গুনতে হয় — সেটিই MTBF-এর হিসাব।
সংখ্যা দিয়ে দেখা যাক। ধরুন τ = ৫০ ps, T0 = ১০০ ps, tsetup = ১০০ ps, আর asynchronous ইনপুট প্রতি সেকেন্ডে ১ কোটিবার (১০ MHz) বদলায় (মানগুলো বোঝানোর জন্য ধরা; আসল মান প্রতিটি process আর cell-এর জন্য মেপে datasheet-এ দেওয়া থাকে):
// Synchroniser MTBF: MTBF = e^(tr / tau) / (T0 * fclk * fdata)
// tr = time the (possibly metastable) flip-flop is allowed to settle.
const tau = 50e-12, T0 = 100e-12; // flip-flop constants
const fdata = 10e6; // async input changes 10 M/s
const tsetup = 100e-12, tlogic = 1500e-12; // capture setup, logic delay
function human(s) {
const units = [["years", 3.156e7], ["days", 86400], ["hours", 3600],
["min", 60], ["s", 1], ["ms", 1e-3], ["us", 1e-6]];
for (const [u, k] of units)
if (s >= k) return (s / k >= 1000 ? (s / k).toFixed(0) : (s / k).toPrecision(3)) + " " + u;
return s.toExponential(2) + " s";
}
function mtbf(label, fclk, tr) {
const m = Math.exp(tr / tau) / (T0 * fclk * fdata);
console.log(label.padEnd(26) + `tr = ${(tr * 1e12).toFixed(0).padStart(4)} ps` +
` MTBF = ${m.toExponential(2).padStart(8)} s = ${human(m)}`);
}
const T500 = 1 / 500e6, T1G = 1 / 1e9;
// one flip-flop: its output goes straight into 1500 ps of logic
mtbf("500 MHz, 1 FF + logic", 500e6, T500 - tlogic - tsetup);
// two flip-flops: the first one gets (almost) a whole cycle to settle
mtbf("500 MHz, 2 FF", 500e6, T500 - tsetup);
// same synchroniser, clock doubled: much less time to settle
mtbf("1 GHz, 2 FF", 1e9, T1G - tsetup);
// three flip-flops: roughly two settling windows in a row
mtbf("1 GHz, 3 FF", 1e9, 2 * (T1G - tsetup));আউটপুট:
500 MHz, 1 FF + logic tr = 400 ps MTBF = 5.96e-3 s = 5.96 ms
500 MHz, 2 FF tr = 1900 ps MTBF = 6.37e+10 s = 2019 years
1 GHz, 2 FF tr = 900 ps MTBF = 6.57e+1 s = 1.09 min
1 GHz, 3 FF tr = 1800 ps MTBF = 4.31e+9 s = 137 years
প্রথম সারি ভয়ংকর: একটি flip-flop-এর output সরাসরি ১,৫০০ ps-এর logic-এ গেলে tr মাত্র ৪০০ ps, আর MTBF ৫.৯৬ মিলিসেকেন্ড — প্রতি সেকেন্ডে প্রায় ১৬৮ বার ভুল! দ্বিতীয় সারিতে শুধু একটি flip-flop যোগ করে tr ১,৯০০ ps — MTBF প্রায় ২,০১৯ বছর। tr বেড়েছে ১,৫০০ ps, অর্থাৎ e১৫০০/৫০ = e৩০ ≈ ১.০৭ × ১০১৩ গুণ। তৃতীয় সারি সতর্কবাণী: একই synchronizer ১ GHz-এ চালালে tr নেমে ৯০০ ps, আর MTBF মাত্র ১.০৯ মিনিট — clock দ্বিগুণ করায় MTBF প্রায় ৯৭ কোটি গুণ কমল। চতুর্থ সারিতে তৃতীয় একটি flip-flop মোটামুটি আরেকটি স্থির-হওয়ার জানালা দেয় (এটি একটি আনুমানিক মডেল), MTBF আবার ১৩৭ বছর। তাই দ্রুত clock-এ, বা বিমান-চিকিৎসার মতো নিরাপত্তা-সংবেদনশীল নকশায়, তিন stage-এর synchronizer-ও ব্যবহার হয়।
Verilog-এ two-flip-flop synchronizer দেখতে খুবই সাধারণ — কিন্তু নিয়মগুলো কঠোর: মাঝের তারে (meta) কোনো logic নয়, দুটি flip-flop chip-এ পাশাপাশি বসানো, আর tool-কে জানানো যে এটি synchronizer (কিছু FPGA tool-এ, যেমন AMD/Xilinx Vivado-তে, ASYNC_REG নামের attribute দিয়ে; নির্মাতার নির্দেশিকায় শিকলের প্রতিটি flip-flop-এ এটি দেওয়ার কথা বলা হয়, নিচে ছোট রাখতে শুধু প্রথমটিতে দেখানো হলো):
// Two-flip-flop synchronizer for ONE asynchronous bit
module sync2 (input wire clk,
input wire rst_n, // active-low reset
input wire async_in, // from a button or another clock domain
output reg sync_out);
(* ASYNC_REG = "TRUE" *) reg meta; // stage 1: may go metastable
always @(posedge clk or negedge rst_n)
if (!rst_n) begin
meta <= 1'b0;
sync_out <= 1'b0;
end else begin
meta <= async_in; // never use 'meta' anywhere else
sync_out <= meta; // stage 2: clean 0 or 1 (almost always)
end
endmoduleClock domain crossing — এক clock থেকে আরেক clock-এ
আধুনিক SoC-তে একাধিক clock থাকে — CPU core, মেমরি controller, USB, display — প্রত্যেকের নিজস্ব frequency. একই clock-এ চলা অংশগুলোকে বলে একটি clock domain, আর এক domain থেকে আরেক domain-এ সংকেত পাঠানোকে clock domain crossing (CDC). গ্রহণকারী domain-এর কাছে প্রেরকের সংকেত asynchronous, তাই প্রতিটি crossing-এ synchronizer লাগে। কিন্তু সাবধান:
- এক বিট: two-flip-flop synchronizer যথেষ্ট — শর্ত, সংকেতটি গ্রহণকারী clock-এর অন্তত কয়েক cycle স্থির থাকে, নইলে ছোট pulse হারিয়ে যেতে পারে।
- অনেক বিট একসাথে (যেমন ৮ বিটের counter): প্রতিটি বিটে আলাদা synchronizer বসালে বিপদ। 0111 থেকে 1000-এ যাওয়ার সময় চারটি বিটই বদলায়; কোনো বিট পুরোনো, কোনোটি নতুন মান ধরলে গ্রহণকারী পেতে পারে 1111 বা 0000 — দুটি মানই সম্পূর্ণ ভুল।
- সমাধান ১ — handshake: ডেটা স্থির রেখে একটি এক-বিটের “req” সংকেত synchronize করে পাঠানো; গ্রহণকারী ডেটা নিয়ে “ack” ফেরত পাঠায়। ধীর, কিন্তু নিরাপদ।
- সমাধান ২ — asynchronous FIFO: দুই domain-এর মাঝে একটি ছোট মেমরি-সারি; লেখার pointer আর পড়ার pointer অন্য domain-এ পাঠানো হয় Gray code-এ (পর্ব ০৪, সংখ্যা পদ্ধতি)। Gray code-এ পরপর দুই মানে ঠিক একটি বিট বদলায়, তাই synchronizer হয় পুরোনো মান পায়, নয় নতুন মান — মাঝামাঝি আবর্জনা কখনো নয়। পুরোনো মান পেলে FIFO শুধু একটু সাবধানী (“প্রায় ভরা”) আচরণ করে, ভুল নয়।
Switch debouncing — বোতাম একবার চাপলে কেন দশবার পড়ে
একটি যান্ত্রিক সুইচ বা বোতামের ভেতরে দুটি ধাতব পাত। চাপ দিলে পাত দুটি ঠোকাঠুকি করে কয়েক মিলিসেকেন্ড লাফায় — সংযোগ হয়, ছেঁড়ে, আবার হয় — তারপর স্থির হয়। একে বলে switch bounce. মানুষের কাছে এটি একবার চাপ; কিন্তু ১০০ MHz-এর circuit-এর কাছে প্রতিটি লাফ আলাদা চাপ। লিফটের বোতাম একবার চাপলে যদি counter ৫ বাড়ে, তা-ই এই সমস্যা। (বোতাম asynchronous-ও, তাই প্রথমে synchronizer, তারপর debouncer.)
সমাধান debouncing: ইনপুট নতুন মান দেখালেই বিশ্বাস না করে অপেক্ষা করা, যতক্ষণ না পরপর N টি নমুনায় একই নতুন মান আসে। Hardware-এ এটি একটি counter (পর্ব ১৬, Register, shift register আর counter) বা একটি shift register, যার সব বিট সমান কি না দেখা হয়। নিচের simulator প্রতি ৫ ms-এ একটি নমুনা নেয়, আর N = ৪ (অর্থাৎ ২০ ms স্থিরতা) চায়:
// Counter debouncer: the clean output changes only after the raw
// (bouncy) input has shown the same new value for N samples in a row.
const N = 4; // e.g. 4 samples x 5 ms = 20 ms stable
const raw = "0000101101111111111110100100000000"; // one sample per 5 ms
let clean = 0, count = 0, out = "", events = [];
for (let i = 0; i < raw.length; i++) {
const x = +raw[i];
if (x === clean) count = 0; // same as output: nothing to do
else if (++count === N) { // new value held N samples: accept it
clean = x; count = 0;
events.push(`t=${i * 5} ms -> ${x}`);
}
out += clean;
}
let naive = 0; // edges a plain counter would see
for (let i = 1; i < raw.length; i++) if (raw[i - 1] === "0" && raw[i] === "1") naive++;
console.log("raw " + raw);
console.log("clean " + out);
console.log("rising edges in raw: " + naive + ", in clean: " +
(out.match(/01/g) || []).length);
console.log("accepted changes: " + events.join(", "));আউটপুট:
raw 0000101101111111111110100100000000
clean 0000000000001111111111111111100000
rising edges in raw: 5, in clean: 1
accepted changes: t=60 ms -> 1, t=145 ms -> 0
কাঁচা ইনপুটে ৫টি উঠন্ত ধার — একটি সাধারণ counter ৫টি চাপ গুনত। পরিষ্কার output-এ ঠিক একটি। চাপের শুরুর লাফগুলো (নমুনা ৪–৮) counter-কে বারবার শূন্যে ফিরিয়ে দেয়; নমুনা ৯ থেকে ১২ পরপর চারটি 1 আসায় ৬০ ms-এ output 1 হয়। ছাড়ার সময়ও একই — শেষ লাফের পর চারটি স্থির 0 পেয়ে ১৪৫ ms-এ output 0. দাম হলো দেরি: output ইনপুটের চেয়ে প্রায় N × ৫ ms পিছিয়ে থাকে, যা মানুষের কাছে টের পাওয়ার মতো নয়। যান্ত্রিক bounce সাধারণত কয়েক মিলিসেকেন্ডের মধ্যে থামে বলে মাপা হয়েছে, তবে সুইচভেদে অনেক আলাদা — তাই N আর নমুনার হার বেছে নেওয়ার আগে নির্দিষ্ট সুইচটি মেপে দেখা ভালো।
৯ · Clock আরও দ্রুত হয় না কেন — power, pipeline আর বাস্তবতা
সূত্রটি আবার দেখুন: Tc ≥ tpcq + tpd + tsetup + tskew. Clock দ্রুত করার দুটি পথ — gate দ্রুত করা (প্রযুক্তি), আর প্রতিটি cycle-এ logic কম রাখা (নকশা)। দ্বিতীয় পথের নাম pipelining: একটি লম্বা critical path-কে register দিয়ে কয়েক টুকরো করা, যাতে প্রতিটি টুকরোর tpd ছোট হয় (পর্ব ৩৫, pipelining-এ বিস্তারিত)। কিন্তু দুই পথই দেয়ালে ঠেকে:
- Sequencing overhead কমে না। Logic-কে k টুকরো করলে প্রতিটি টুকরো tpd/k, কিন্তু প্রতিটির সাথে পুরো tpcq + tsetup + tskew যোগ হয়। উদাহরণ ১-এর CLA-তেই overhead ছিল cycle-এর ৩১%; আরও ভাগ করলে প্রায় পুরো cycle register-এর খরচে যায়।
- Power. Dynamic power f-এর সমানুপাতিক, আর বেশি f-এর জন্য প্রায়ই voltage-ও বাড়াতে হয় — V২ দিয়ে। পর্ব ০২-এ (ইতিহাস আর প্রবণতা) দেখেছেন, ২০০০-এর দশকের মাঝামাঝি এই power wall-এ ধাক্কা খেয়ে ডেস্কটপ CPU-র clock কয়েক GHz-এ প্রায় থেমে যায়, আর শিল্প multicore-এর দিকে মোড় নেয়।
- গভীর pipeline-এর অন্য দাম। বেশি ধাপ মানে branch ভুল অনুমান হলে বেশি কাজ ফেলে দেওয়া (পর্ব ৩৭) আর বেশি hazard (পর্ব ৩৬)। তাই উচ্চ clock-এর লাভ প্রায়ই CPI বেড়ে গিয়ে কিছুটা হারিয়ে যায় — পর্ব ০৩-এর CPU-time সূত্রে দুটি গুণকই দেখতে হয়।
- Skew আর jitter স্থির খরচ। Clock tree যত বড়, skew-এর বাজেট তত; ২৫০ ps-এর cycle-এ ২০–৩০ ps-এর অনিশ্চয়তাও বড় অংশ।
আরও গভীরে: আসল chip-এ STA একটি “corner”-এ নয়, বহু corner-এ চালানো হয় — ধীর transistor + কম voltage + উচ্চ তাপমাত্রা (setup-এর জন্য সবচেয়ে খারাপ), দ্রুত transistor + উচ্চ voltage + কম তাপমাত্রা (প্রায়ই hold-এর জন্য সবচেয়ে খারাপ), আর তার সাথে on-chip variation-এর মার্জিন। আধুনিক CPU-তে clock সারাক্ষণ বদলায়: DVFS (dynamic voltage and frequency scaling) কাজের চাপ বুঝে voltage আর frequency একসাথে কমায়-বাড়ায়, আর কিছু নকশায় adaptive clocking voltage-এর হঠাৎ পতন টের পেলে কয়েক cycle-এর জন্য clock একটু ধীর করে দেয় বলে প্রকাশিত গবেষণায় জানা যায়। Latch-ভিত্তিক নকশায় (time borrowing) একটি ধীর ধাপ পাশের দ্রুত ধাপ থেকে সময় ধার নিতে পারে — উচ্চ-গতির custom circuit-এ এটি পুরোনো কৌশল।
১০ · AI-এর যুগে timing-এর হিসাব
AI টুল setup-hold-এর সংজ্ঞা ঠিকঠাক বলতে পারে, কিন্তু সংখ্যার হিসাবে প্রায়ই ভুল করে — বিশেষ করে কোন delay max আর কোনটি min, skew-এর চিহ্ন, আর hold-এ clock-এর ভূমিকা নিয়ে। নিচের ভুলগুলো চোখে পড়ার মতো ঘন ঘন দেখা যায়:
| AI-এর প্রচলিত ভুল | সঠিক কথা | কীভাবে ধরবেন |
|---|---|---|
| Hold violation সারাতে “clock ধীর করুন” বলা | Hold-এর শর্তে Tc নেই; ছোট পথে delay যোগ করতে হয় | সূত্রটি লিখে দেখুন Tc আছে কি না |
| Setup-এ tccq/tcd, বা hold-এ tpcq/tpd বসানো | Setup = সবচেয়ে দেরি (p), hold = সবচেয়ে আগে (c) | প্রতিটি পদের পাশে “max না min” লিখুন |
| Positive skew-কে দুই শর্তেই ক্ষতিকর বলা, বা উল্টো | জানা positive skew setup-এ সাহায্য করে, hold-এ ক্ষতি করে; অজানা হলে দুটিতেই খারাপটা ধরুন | δ-এর সংজ্ঞা (capture − launch) লিখে নিজে বসান |
| Critical path মানে “সবচেয়ে বেশি gate-এর পথ” | সবচেয়ে বেশি delay-এর পথ; কম gate-এর ধীর পথও হতে পারে | প্রতিটি নোডে arrival time হিসাব করুন |
| MTBF-এ tr-কে সূচকে না বসিয়ে গুণ করা, বা একক (ps বনাম s) গুলিয়ে ফেলা | etr/τ; সব সময় এক এককে | Script-এ নিজে চালিয়ে দেখুন |
| Multi-bit bus-এর প্রতিটি বিটে আলাদা synchronizer বসানো | Gray code, handshake বা async FIFO লাগে | 0111 → 1000 বদলে মিশ্র মান সম্ভব কি না ভাবুন |
Clock gating-এর জন্য assign gclk = clk & en; লেখা | Library-র ICG cell বা latch-ভিত্তিক gating | clk = 1 থাকাকালীন en বদলে waveform দেখুন |
AI-কে এমনভাবে প্রশ্ন করুন যাতে প্রতিটি পদ, একক আর ধাপ লেখা থাকে, আর আপনি নিজে মিলিয়ে নিতে পারেন:
AI-এর উত্তর হাতে পেলে — যাচাইয়ের চেকলিস্ট
পরীক্ষা ও ইন্টারভিউতে এই বিষয়ে প্রায়ই যা জিজ্ঞেস করা হয়:
- Setup আর hold time কী? — Clock edge-এর আগে (setup) আর পরে (hold) D-কে যতক্ষণ স্থির থাকতে হয়।
- সর্বোচ্চ clock frequency কীভাবে বের করবেন? — Tc ≥ tpcq + tpd + tsetup (+ tskew) থেকে fmax = ১ / Tc,min, যেখানে tpd critical path-এর delay.
- Hold violation clock ধীর করে সারানো যায় কি? — না; tccq + tcd ≥ thold (+ tskew)-এ Tc নেই। ছোট পথে buffer বসাতে হয়।
- Metastability কী, আর কীভাবে সামলাবেন? — Setup-hold ভাঙলে flip-flop-এর 0-1-এর মাঝে আটকে থাকা; এড়ানো যায় না, two-flip-flop synchronizer দিয়ে MTBF সূচকীয়ভাবে বাড়ানো যায়।
- Async FIFO-র pointer Gray code-এ কেন? — প্রতি বদলে একটি বিট বদলায়, তাই synchronize করা মান পুরোনো বা নতুন — কখনো মিশ্র আবর্জনা নয়।
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিয়ে নিজে কিছুক্ষণ ভাবুন — তারপর “→ উত্তর” চাপুন।
প্র ০১Clock ছাড়া কি কম্পিউটার বানানো যায়? যায় যদি, তবে প্রায় সবাই clock ব্যবহার করে কেন?
যায়, আর বানানোও হয়েছে। Asynchronous বা “self-timed” নকশায় কোনো সাধারণ clock নেই; প্রতিটি অংশ কাজ শেষ করে পরের অংশকে একটি “request” সংকেত দেয়, আর পরের অংশ নেওয়া হলে “acknowledge” ফেরত পাঠায় — দুই হাতের হাত-মেলানোর মতো (handshake). সবচেয়ে পরিচিত উদাহরণগুলোর একটি হলো ১৯৯০-এর দশকে University of Manchester-এ Steve Furber-এর দলের AMULET প্রকল্প — ARM instruction set-এর clock-হীন বাস্তবায়ন। গবেষণা আর কিছু বিশেষ বাণিজ্যিক chip-এও (যেমন কম-power-এর কিছু নিয়ন্ত্রক) এই ধারণা ব্যবহৃত হয়েছে বলে জানা যায়।
সুবিধাগুলো আকর্ষণীয়। প্রথমত, গড় গতি: পর্ব ১১-এর ripple adder সব ইনপুটে সবচেয়ে খারাপ সময় নেয় না, আর asynchronous নকশা কাজ শেষ হলেই এগোয় — synchronous নকশাকে সবসময় সবচেয়ে খারাপ পথের জন্য অপেক্ষা করতে হয়। দ্বিতীয়ত, power: কোনো বিশাল clock network সারাক্ষণ উল্টাচ্ছে না; কাজ না থাকলে circuit আপনা-আপনি চুপ। তৃতীয়ত, electromagnetic নির্গমন কম, কারণ সব flip-flop একই মুহূর্তে switch করে না।
তবু শিল্প synchronous-এ রয়ে গেছে, মূলত তিন কারণে। এক, যাচাই: synchronous নকশায় প্রতিটি পথ আলাদাভাবে একটি সরল অসমতা দিয়ে যাচাই করা যায় — এই পর্বের STA. Asynchronous নকশায় প্রতিটি glitch সত্যিকারের ঘটনা, তাই hazard-মুক্ত logic আর জটিল protocol-এর প্রমাণ লাগে। দুই, tool: কয়েক দশকের EDA শিল্প — synthesis, STA, test — synchronous মডেলের ওপর গড়া। তিন, test: chip তৈরির পর scan chain দিয়ে পরীক্ষাও clock-নির্ভর।
আজকের বাস্তব সমাধান মাঝামাঝি: GALS (globally asynchronous, locally synchronous) — প্রতিটি block নিজের clock-এ synchronous, আর block-গুলোর মাঝে asynchronous সংযোগ, synchronizer আর FIFO দিয়ে। এই পর্বের CDC অংশটি ঠিক এই সীমানার কথা।
মূল উপলব্ধি: Clock গতির জন্য নয়, চিন্তার সরলতার জন্য। একটি সাধারণ ছন্দ কোটি gate-এর আচরণকে কয়েকটি অসমতায় নামিয়ে আনে — আর সেই সরলতাই বড় chip বানানো সম্ভব করেছে।
প্র ০২২০০০-এর দশকের শুরুতে ১০ GHz CPU-র কথা শোনা যেত। Pipeline আরও গভীর করে সেখানে পৌঁছানো গেল না কেন?
Intel-এর Pentium 4 (NetBurst microarchitecture, ২০০০) ছিল উচ্চ clock-এর পেছনে ছোটার সবচেয়ে বিখ্যাত উদাহরণ। প্রথম সংস্করণে pipeline প্রায় ২০ ধাপের ছিল, ২০০৪ সালের Prescott সংস্করণে প্রায় ৩১ ধাপ। যুক্তি ছিল এই পর্বের সূত্র: প্রতিটি ধাপে logic কম, তাই tpd ছোট, তাই Tc ছোট। সেই সময় ভবিষ্যতে ১০ GHz-এর কাছাকাছি যাওয়ার কথা আলোচিত হতো। বাস্তবে বাণিজ্যিক Pentium 4 প্রায় ৩.৮ GHz-এ থামে, আর পরবর্তী একটি উচ্চ-clock নকশা (সাংকেতিক নাম Tejas) ২০০৪ সালে বাতিল হয় বলে প্রতিবেদনে জানা যায়।
প্রথম দেয়াল এই পর্বের অংশ ৯-এর হিসাব। Pipeline-এর প্রতিটি ধাপে tpcq + tsetup + tskew + jitter-এর খরচ স্থির। Logic-কে যত টুকরো করবেন, প্রতিটি টুকরো তত ছোট, কিন্তু এই স্থির খরচ প্রতিটি টুকরোতে আবার যোগ হয়। একসময় cycle-এর বেশির ভাগই register-এর খরচ, আর ধাপ বাড়িয়ে গতি প্রায় বাড়ে না।
দ্বিতীয় দেয়াল power. P ≈ α·C·V২·f; বেশি ধাপ মানে বেশি register, বেশি clock load (C বাড়ে), আর উচ্চ f-এ নির্ভরযোগ্য চলার জন্য প্রায়ই উচ্চ V. Prescott তার উচ্চ তাপ উৎপাদনের জন্য কুখ্যাত ছিল। পর্ব ০২-এর Dennard scaling-এর অবসানে transistor ছোট হলেও আর voltage কমছিল না, তাই power density দ্রুত বাড়ছিল।
তৃতীয় দেয়াল CPI. গভীর pipeline-এ একটি branch ভুল অনুমানে অনেক ধাপের কাজ ফেলে দিতে হয়, আর data dependency-তে অপেক্ষা বাড়ে। CPU time = IC × CPI × Tc; Tc কমলেও CPI বাড়লে লাভ কমে। Intel-এর পরের Core microarchitecture (২০০৬) তুলনামূলক ছোট pipeline আর কম clock নিয়ে বেশি কাজ-প্রতি-cycle করে Pentium 4-কে ছাড়িয়ে যায়।
মূল উপলব্ধি: Tc ≥ tpcq + tpd + tsetup + tskew শুধু একটি circuit-এর সূত্র নয় — এটি একটি শিল্পের দিক বদলের ব্যাখ্যা। স্থির overhead আর power-এর কাছে হেরে শিল্প clock থেকে সরে core-সংখ্যা আর IPC-র দিকে গেছে।
প্র ০৩Chip কারখানা থেকে ফেরার পর setup violation আর hold violation — কোনটি বেশি ভয়ংকর, আর কেন?
Hold violation অনেক বেশি ভয়ংকর। কারণ সূত্রে লুকিয়ে আছে। Setup-এর শর্ত Tc-নির্ভর: কোনো পথ প্রত্যাশার চেয়ে ধীর হলে clock একটু ধীর করে দিলেই chip ঠিকঠাক চলে। বাস্তবে শিল্প এটিকে একটি ব্যবসায়িক কৌশলেও পরিণত করেছে — speed binning. একই নকশার chip তৈরির বৈচিত্র্যে কিছু দ্রুত, কিছু ধীর হয়; কারখানায় পরীক্ষা করে দ্রুতগুলো উচ্চ clock-এ বেশি দামে, ধীরগুলো কম clock-এ কম দামে বিক্রি হয়। Overclocking-এর মূলেও এটি: অনেক chip তার লেবেলের চেয়ে কিছুটা বাড়তি setup slack নিয়ে আসে।
Hold-এর শর্তে Tc নেই। কোনো পথ খুব দ্রুত হলে আর skew-এর সাথে মিলে hold ভাঙলে, chip-কে ১০০ গুণ ধীর clock-এ চালালেও সেই flip-flop ভুল মান ধরবে — কারণ দৌড়টি একই edge-এর প্রথম কয়েক picosecond-এ। এমন chip সাধারণত সারানো যায় না; নকশা ঠিক করে নতুন mask বানিয়ে আবার তৈরি করতে হয় (respin), যা উন্নত process-এ খুবই ব্যয়বহুল আর বাজারে আসতে মাসের পর মাস দেরি করায়। কিছু নকশায় তাপমাত্রা বা voltage বদলে hold কিছুটা সামলানো যায়, কিন্তু সেটি নির্ভরযোগ্য সমাধান নয়।
এ কারণে physical design-এর প্রবাহে hold-কে খুব গুরুত্ব দেওয়া হয়। Clock tree তৈরির পরেই আসল skew জানা যায়; তখন tool প্রতিটি ছোট পথে hold-buffer বসায়, আর নিশ্চিত করে সেগুলো কোনো setup-পথ ধীর করছে না। STA চালানো হয় দ্রুততম corner-এ (দ্রুত transistor, উচ্চ voltage, কম তাপমাত্রা) — যেখানে পথগুলো সবচেয়ে দ্রুত, তাই hold সবচেয়ে বিপদে। Hold-এর হিসাবে অনেক সময় বাড়তি নিরাপত্তা-মার্জিনও রাখা হয়।
একটি মজার পরিণতি: chip যত দ্রুত তৈরি হয় (ভালো process), hold-এর বিপদ তত বাড়ে — ভালো খবর একটি নতুন সমস্যা নিয়ে আসে।
মূল উপলব্ধি: Setup ভাঙলে chip ধীর হয়; hold ভাঙলে chip ভুল হয়। প্রথমটি দাম কমায়, দ্বিতীয়টি chip-কে অকেজো করে — তাই hold-এর নিশ্চয়তা tape-out-এর আগেই দিতে হয়।
প্র ০৪Metastability-কে কি একেবারে দূর করা যায় না? আরও ভালো flip-flop বানালেই তো হয়?
না — আর এটি প্রকৌশলের সীমা নয়, পদার্থবিদ্যা আর গণিতের সীমা। একটি অবিচ্ছিন্ন (continuous) রাশি — এখানে D কখন বদলাল, সেই সময় — থেকে একটি বিচ্ছিন্ন (discrete) সিদ্ধান্ত — 0 না 1 — নিতে হলে, সীমার খুব কাছের ইনপুটে সিদ্ধান্ত নিতে ইচ্ছেমতো দীর্ঘ সময় লাগতেই পারে। Leslie Lamport “Buridan's Principle” নামের একটি লেখায় এই যুক্তিটি সাধারণভাবে তুলে ধরেন — দুই খড়ের গাদার ঠিক মাঝে দাঁড়ানো গাধার পুরোনো দার্শনিক ধাঁধা থেকে নাম। নির্দিষ্ট সময়ের মধ্যে সবসময় সিদ্ধান্ত নেয় এমন কোনো যন্ত্র তাই অসম্ভব।
ইতিহাসেও এর দাম আছে। ১৯৬০-এর দশকে কিছু কম্পিউটারে মাঝেমধ্যে ব্যাখ্যাহীন ব্যর্থতা দেখা যেত, যা পরে synchronizer আর arbiter-এর এই আচরণের সাথে যুক্ত বলে বোঝা যায়। ১৯৭৩ সালে T. J. Chaney আর C. E. Molnar IEEE Transactions on Computers-এ একটি প্রবন্ধে এই অস্বাভাবিক আচরণ পরীক্ষাগারে মেপে দেখান, যা metastability নিয়ে ব্যাপক সচেতনতার একটি মাইলফলক হিসেবে উদ্ধৃত হয়। তার আগে অনেক প্রকৌশলী ধরে নিতেন, একটি ভালো flip-flop সবসময় সময়মতো সিদ্ধান্ত নেয়।
তাহলে ভালো flip-flop কী দেয়? ছোট τ — ভেতরের inverter-জোড়া দ্রুত পার্থক্য বাড়ালে বল চূড়া থেকে দ্রুত গড়ায়। τ সূচকের হরে, তাই τ অর্ধেক হলে একই tr-এ সূচক দ্বিগুণ — MTBF বর্গের মতো বাড়ে। এজন্য library-তে বিশেষ “synchronizer flip-flop” থাকে, যার τ ছোট। কিন্তু যত ছোটই হোক, শূন্য নয়।
প্রকৌশলের উত্তর তাই সম্ভাবনার: ব্যর্থতাকে এত বিরল করুন যে তা পণ্যের জীবনকালে, সব ইউনিট মিলিয়েও, প্রায় কখনো ঘটবে না। দশ লাখ ডিভাইস বিক্রি হলে একটি ডিভাইসের MTBF ১,০০০ বছর হলেও পুরো বহরে গড়ে প্রায় প্রতি ৯ ঘণ্টায় একটি ব্যর্থতা! তাই নিরাপত্তা-সংবেদনশীল নকশায় তিন stage আর খুব বড় MTBF লক্ষ্য রাখা হয়।
মূল উপলব্ধি: Asynchronous জগতের সাথে প্রতিটি সংযোগে metastability একটি অনিবার্য ঝুঁকি। প্রকৌশল এটিকে দূর করে না, “পরিমাপ” করে — MTBF দিয়ে — আর যথেষ্ট বিরল করে।
প্র ০৫Clock network chip-এর power-এর এত বড় অংশ খায় কেন, আর আধুনিক chip এটি কীভাবে কমায়?
Dynamic power ≈ α·C·V২·f. Clock-তারের ক্ষেত্রে প্রতিটি পদই খারাপ দিকে। α — সাধারণ data-তার হয়তো কয়েক cycle-এ একবার উল্টায়, কিন্তু clock প্রতিটি cycle-এ ওঠে আর নামে; তার activity সর্বোচ্চ। C — clock তার chip-এর প্রতিটি কোণে যায়, লক্ষ লক্ষ flip-flop-এর ইনপুট চালায়, আর skew কম রাখতে প্রচুর বড় buffer ব্যবহার করে; মোট capacitance বিশাল। f — clock-ই সবচেয়ে উচ্চ frequency-র সংকেত। তাই বিভিন্ন প্রকাশিত বিশ্লেষণে উচ্চ-গতির chip-এ clock network-কে মোট dynamic power-এর একটি বড় ভাগ — কোনো কোনো নকশায় এক-তৃতীয়াংশ বা তারও বেশি — বলে উল্লেখ করা হয়; সঠিক অনুপাত নকশাভেদে অনেক আলাদা।
প্রথম কৌশল clock gating — অংশ ৭-এর ICG cell. কাজ না থাকা block-এর clock বন্ধ করলে সেখানকার clock-তার আর flip-flop দুটিরই switching বন্ধ। আজকের synthesis tool নিজেই “এই register-এর enable আছে” দেখে স্বয়ংক্রিয়ভাবে ICG বসায়। দ্বিতীয় কৌশল power gating — পুরো block-এর power সরবরাহই বন্ধ, যাতে leakage-ও না থাকে; তবে ফিরে আসতে সময় লাগে আর state হারায়।
তৃতীয় কৌশল DVFS: কাজের চাপ কম হলে PLL frequency কমায় আর voltage regulator voltage কমায়। V২-এর কারণে voltage কমানোর লাভই বেশি; কিন্তু কম voltage-এ gate ধীর, তাই f-ও কমাতে হয় — ঠিক এই পর্বের setup-এর শর্ত মেনে। আপনার ফোন যখন শুধু একটি বার্তা দেখাচ্ছে, তখন তার CPU core-গুলো প্রায়ই সর্বোচ্চের চেয়ে অনেক কম frequency-তে চলে, বা ছোট দক্ষ core-এ কাজ সরিয়ে দেওয়া হয়।
চতুর্থ, নকশার স্তরে: কম flip-flop (অপ্রয়োজনীয় register বাদ), latch-ভিত্তিক নকশা, আর কিছু গবেষণা ও বাণিজ্যিক নকশায় resonant clocking — clock-এর capacitance-কে একটি inductor-এর সাথে দোলায় রেখে শক্তির একটি অংশ ফেরত আনা।
মূল উপলব্ধি: Clock সবচেয়ে ব্যস্ত তার, তাই power বাঁচানোর সবচেয়ে বড় সুযোগও সেখানে। আর প্রতিটি কৌশল — gating থেকে DVFS — এই পর্বের timing-নিয়ম মেনেই কাজ করে।
অনুশীলন
পরীক্ষার ধাঁচে লেখা — আগে খাতায় সমাধান করুন, তারপর উত্তর মিলিয়ে নিন।
-
সর্বোচ্চ clock frequency (numerical): একটি synchronous circuit-এর flip-flop-এর tpcq = ৭০ ps, tccq = ৪০ ps, tsetup = ৫০ ps, thold = ৩০ ps. দুটি register-থেকে-register পথ: পথ A-তে ৪৫ ps-এর ৪টি gate পরপর; পথ B-তে ৯০ ps-এর একটি multiplexer, তারপর ৩০০ ps-এর একটি adder. (ক) প্রতিটি পথের ন্যূনতম Tc, (খ) circuit-এর fmax, (গ) ৩০ ps clock skew (চিহ্ন অজানা) থাকলে নতুন fmax বের করুন।
- (ক) পথ A: tpd = ৪ × ৪৫ = ১৮০ → Tc ≥ ৭০ + ১৮০ + ৫০ = ৩০০ ps. পথ B: tpd = ৯০ + ৩০০ = ৩৯০ → Tc ≥ ৭০ + ৩৯০ + ৫০ = ৫১০ ps.
- (খ) Clock সব পথের জন্য একটিই, তাই সবচেয়ে বড়টি নিতে হবে — পথ B critical path. fmax = ১ / ৫১০ ps ≈ ১.৯৬ GHz.
- (গ) Tc ≥ ৫১০ + ৩০ = ৫৪০ ps → fmax ≈ ১.৮৫ GHz. লক্ষ করুন, পথ A-কে দ্রুত করে কোনো লাভ নেই; লাভ পেতে পথ B (যেমন ripple-এর বদলে CLA) দ্রুত করতে হবে।
-
Skew-সহ hold-এর পরীক্ষা: একই flip-flop (tccq = ৪০ ps, thold = ৩০ ps). একটি পথে শুধু একটি inverter, যার tcd = ১৫ ps. Clock skew-এর সীমা ৪০ ps (চিহ্ন অজানা)। (ক) Hold slack বের করুন। (খ) Clock ১ GHz থেকে ৫০০ MHz-এ নামালে কী বদলায়? (গ) প্রতিটি buffer-এর tcd = ১০ ps হলে ন্যূনতম কয়টি buffer লাগবে?
(ক) tccq + tcd = ৪০ + ১৫ = ৫৫ ps; চাহিদা thold + tskew = ৩০ + ৪০ = ৭০ ps. Slack = ৫৫ − ৭০ = −১৫ ps — hold violation. Skew না থাকলে slack হতো +২৫ — অর্থাৎ skew-ই এখানে সমস্যা তৈরি করেছে।
(খ) কিছুই বদলায় না। Hold-এর শর্তে Tc নেই; slack −১৫-ই থাকে।
(গ) দরকার অন্তত ১৫ ps বাড়তি tcd. একটি buffer: −১৫ + ১০ = −৫ (এখনো FAIL); দুটি: −১৫ + ২০ = +৫ ps — PASS. তাই ২টি buffer. এগুলো শুধু এই ছোট পথে বসে, তাই critical path-এর setup-এর হিসাব বদলায় না (এই পথের tpd বাড়লেও সেটি এখনো অনেক ছোট)।
-
Critical path হাতে বের করুন (trace by hand): Launch register চারটি সংকেত a, b, c, d দেয় (tpcq = ৫০, tccq = ৩০ ps); capture register n5 নেয় (tsetup = ৬০, thold = ৪০ ps, skew নেই)। Gate (tpd, tcd): n1 = AND(a, b) (৪০, ২৫); n2 = OR(b, c) (৩৫, ২০); n3 = XOR(n1, c) (৫৫, ৩৫); n4 = NAND(n2, d) (৩০, ১৮); n5 = NOR(n3, n4) (৪৫, ৩০)। (ক) প্রতিটি নোডের max আর min arrival, (খ) critical path, (গ) Tc,min আর fmax, (ঘ) Tc = ২৪০ ps-এ setup slack আর hold slack বের করুন।
- (ক) n1: max ৫০ + ৪০ = ৯০, min ৩০ + ২৫ = ৫৫. n2: max ৮৫, min ৫০. n3: max(৯০, ৫০) + ৫৫ = ১৪৫, min(৫৫, ৩০) + ৩৫ = ৬৫. n4: max(৮৫, ৫০) + ৩০ = ১১৫, min(৫০, ৩০) + ১৮ = ৪৮. n5: max(১৪৫, ১১৫) + ৪৫ = ১৯০, min(৬৫, ৪৮) + ৩০ = ৭৮.
- (খ) পেছনে হেঁটে: n5 ← n3 (১৪৫) ← n1 (৯০) ← a (বা b, দুটিই ৫০)। Critical path: a → n1 → n3 → n5. লক্ষ করুন, n2-n4-এর পথে gate-সংখ্যা একই (তিনটি), তবু সেটি ধীরতম নয়।
- (গ) Tc,min = ১৯০ + ৬০ = ২৫০ ps → fmax = ৪ GHz.
- (ঘ) Setup slack = (২৪০ − ৬০) − ১৯০ = −১০ ps (violation). Hold slack = ৭৮ − ৪০ = +৩৮ ps (নিরাপদ)। ২৪০ ps-এ চালাতে critical path থেকে অন্তত ১০ ps কমাতে হবে — যেমন XOR-টিকে দ্রুত cell দিয়ে বদলে।
-
আউটপুট অনুমান করুন: অংশ ৩-এর timing calculator-এ (tpcq = ৫০, tccq = ৩০, tsetup = ৬০, thold = ৪০ ps) নিচের লাইনটি যোগ করলে কোন সারি ছাপবে? Hold-এর ফলটি কেন সীমানায়?
check("FF->2buf->FF @1GHz", 50, 30, 20, 1);FF->2buf->FF @1GHz 180 5556 1000 820 PASS 0 PASSTc,min = ৫০ + ৫০ + ৬০ + ২০ = ১৮০ ps, fmax = ১০৬ / ১৮০ ≈ ৫,৫৫৬ MHz; ১ GHz-এ setup slack ১,০০০ − ১৮০ = ৮২০. Hold slack = ৩০ + ৩০ − (৪০ + ২০) = ০ — কোডে শর্ত
s >= 0, তাই PASS. বাস্তবে শূন্য slack-এ কেউ chip পাঠায় না; tool সাধারণত একটি ছোট নিরাপত্তা-মার্জিন যোগ করে, যাতে তৈরির বৈচিত্র্যে পথটি একটু দ্রুত হলেও ভাঙে না।
নিজেকে যাচাই করুন
ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।
ক্রমএকটি register-থেকে-register পথে (tpcq + tpd < Tc − tsetup) এক cycle-এ ঘটনাগুলো যে ক্রমে ঘটে, সেই ক্রমে সাজান (▲▼ চেপে সরান)
- Launch edge: R1 তার D-র মান তুলে নেয়
- tpcq পরে R1-এর Q নতুন মানে স্থির হয়
- tpcq + tpd পরে R2-র D নতুন মানে স্থির হয়
- Tc − tsetup-এ R2-র setup-জানালা শুরু হয়
- Tc-তে capture edge: R2 মান ধরে, আর R1 পরের মান ছাড়ে
একটি flip-flop-এর tpcq = ৪০ ps আর tsetup = ৬০ ps. দুই register-এর মাঝের logic-এর critical path ৩০০ ps, skew নেই। সর্বোচ্চ clock frequency কত?
- ৩.৩৩ GHz
- ২.৫ GHz
- ৩.৫৭ GHz
- ২৫০ MHz
কারখানা থেকে আসা একটি chip-এ একটি পথে hold violation পাওয়া গেল। নিচের কোনটি এই chip-এ বা পরের নকশায় সমস্যাটি সত্যিই সমাধান করে?
- Clock frequency অর্ধেক করা
- Critical path-এ একটি pipeline register যোগ করা
- ছোট পথে delay buffer যোগ করে নকশা সংশোধন
- আরও দ্রুত (কম clock-to-Q) flip-flop ব্যবহার
Launch register-এর তুলনায় capture register-এ clock ৫০ ps দেরিতে পৌঁছায় (positive skew, মান জানা)। দুই timing শর্তে এর প্রভাব কী?
- Setup সহজ হয়, hold কঠিন হয়
- Setup কঠিন হয়, hold সহজ হয়
- দুটিই কঠিন হয়
- কোনোটিতেই প্রভাব নেই
MTBF = etr/τ / (T0 · fclk · fdata) সূত্রে τ = ৫০ ps. একটি synchronizer-এ দ্বিতীয় flip-flop যোগ করায় tr ৫০০ ps বাড়ল। MTBF প্রায় কত গুণ বাড়ে?
- ২ গুণ
- ১০ গুণ
- ১০,০০০,০০০,০০০ গুণ
- প্রায় ২২,০০০ গুণ
দুটি ভিন্ন clock domain-এর মাঝে asynchronous FIFO-র read আর write pointer অন্য domain-এ পাঠানোর আগে সাধারণত Gray code-এ রূপান্তর করা হয় কেন?
- Gray code-এ কম বিট লাগে বলে
- প্রতি বৃদ্ধিতে একটিমাত্র বিট বদলায়, তাই synchronize করা মান পুরোনো বা নতুন হয় — মিশ্র নয়
- Gray code ব্যবহার করলে synchronizer-এর আর দরকার হয় না
- Gray code-এ pointer যোগ-বিয়োগ দ্রুত হয় বলে
Power বাঁচাতে একটি block-এর clock বন্ধ করার জন্য gclk = clk AND enable লেখা বিপজ্জনক কেন?
- AND gate নিজেই অনেক বেশি power খরচ করে
- এতে flip-flop-এর setup time বেড়ে যায়
- clk উঁচু থাকাকালীন enable বদলালে gclk-এ glitch বা ভুল edge তৈরি হতে পারে
- Clock বন্ধ থাকলে flip-flop তার মান হারিয়ে ফেলে
শব্দকোষ
লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন — অর্থ দেখাবে। এই পর্বের সব নতুন শব্দ এখানে একসাথে:
মনে রাখুন
- Synchronous নকশা: সব flip-flop একই clock edge-এ মান নেয়; মাঝের logic-কে শুধু পরের edge-এর আগে স্থির হতে হয়। Clock: period Tc, f = ১ / Tc, duty cycle, rising/falling edge.
- Setup: Tc ≥ tpcq + tpd + tsetup (+ tskew); ধীরতম পথ (critical path) fmax ঠিক করে। tpcq + tsetup হলো sequencing overhead.
- Hold: tccq + tcd ≥ thold (+ tskew); Tc নেই, তাই clock ধীর করে সারে না — ছোট পথে buffer. Positive skew setup-এ সাহায্য করে, hold-এ ক্ষতি করে।
- STA: টপোলজিক্যাল ক্রমে max/min arrival, slack = required − arrival; ঋণাত্মক slack = violation. Clock tree/H-tree skew কমায়, PLL frequency গুণ করে, ICG cell glitch ছাড়া clock বন্ধ করে।
- Metastability: asynchronous ইনপুটে অনিবার্য; MTBF = etr/τ / (T0 fclk fdata). Two-flip-flop synchronizer এক বিটের জন্য; multi-bit-এ handshake বা Gray-pointer-এর async FIFO; বোতামে debouncer.
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- পর্ব ১৯ · প্রজেক্ট — traffic light আর vending machine controller নকশাপরবর্তী পর্বSequential logic-এর পুরো নকশা, timing-সহ।
- পর্ব ১৫ · Latch আর flip-flop — SR, D, JK, T আর edge-triggeringআগে পড়ুনFlip-flop-এর ভেতরের গঠন — setup-hold কোথা থেকে আসে।
- পর্ব ১১ · Adder — half adder, full adder, ripple carry আর carry-lookaheadআগে পড়ুনRipple বনাম CLA-র delay — critical path-এর আসল উদাহরণ।
- কম্পিউটার আর্কিটেকচার ও ডিজিটাল লজিক · কোর্স হোম৬২টি পর্বলজিক গেট থেকে pipeline আর cache — পুরো রোডম্যাপ।
- কম্পিউটার ফান্ডামেন্টালস · Sequential circuitপাশের ট্র্যাকশুরুর স্তরে flip-flop, register আর counter.
- অপারেটিং সিস্টেম · Hardware primerপাশের ট্র্যাকOS-এর দৃষ্টিতে CPU, clock আর interrupt.