Batasan waktu ASIC melalui SDC: Bagaimana cara menentukan jam multipleks dengan benar?

10

pengantar

Setelah menemukan banyak informasi, kadang-kadang bertentangan atau tidak lengkap di internet dan di beberapa kelas pelatihan tentang cara membuat batasan waktu dalam format SDC dengan benar, saya ingin meminta bantuan komunitas EE dengan beberapa struktur penghasil jam umum yang saya temui.

Saya tahu bahwa ada perbedaan tentang bagaimana seseorang akan mengimplementasikan fungsionalitas tertentu pada ASIC atau FPGA (saya telah bekerja dengan keduanya), tetapi saya pikir harus ada cara yang umum dan benar untuk membatasi waktu dari struktur yang diberikan , terlepas dari teknologi yang mendasarinya - beri tahu saya jika saya salah.

Ada juga beberapa perbedaan antara alat yang berbeda untuk implementasi dan analisis waktu dari vendor yang berbeda (meskipun Synopsys menawarkan kode sumber parser SDC), tetapi saya berharap bahwa mereka terutama merupakan masalah sintaksis yang dapat dilihat dalam dokumentasi.

Pertanyaan

Ini adalah tentang struktur multiplexer jam berikut, yang merupakan bagian dari modul clkgen yang lagi-lagi merupakan bagian dari desain yang lebih besar: Skema jam multiplexer

Sementara ext_clkinput diasumsikan dihasilkan secara eksternal ke desain (masuk melalui pin input), clk0dan clk4sinyal juga dihasilkan dan digunakan oleh modul clkgen (lihat pertanyaan jam riak terkait saya untuk detail) dan telah dikaitkan dengan batasan jam bernama baseclkdan div4clk, masing-masing.

Pertanyaannya adalah bagaimana cara menentukan batasan-batasan sehingga timing analyzer

  1. Memperlakukan cpu_clksebagai jam multipleks yang dapat menjadi salah satu jam sumber ( fast_clkatau slow_clkatau ext_clk), dengan mempertimbangkan penundaan gerbang AND dan OR yang berbeda.
  2. Sementara pada saat yang sama tidak memotong jalur antara jam sumber yang digunakan di tempat lain dalam desain.

Sementara kasus paling sederhana dari multiplexer clock on-chip tampaknya hanyaset_clock_groups membutuhkan pernyataan SDC :

set_clock_groups -logically_exclusive -group {baseclk} -group {div4clk} -group {ext_clk}

... dalam struktur yang diberikan, ini diperumit oleh fakta bahwa clk0(melalui fast_clkoutput) dan clk4(via slow_clk) masih digunakan dalam desain, bahkan jika cpu_clkdikonfigurasikan menjadi ext_clkketika hanya use_extdinyatakan.

Seperti dijelaskan di sini , set_clock_groupsperintah seperti di atas akan menyebabkan yang berikut:

Perintah ini setara dengan memanggil set_false_path dari setiap jam di setiap grup ke setiap jam di setiap grup lain dan sebaliknya

... yang salah, karena jam lain masih digunakan di tempat lain.

informasi tambahan

The use_clk0, use_clk4dan use_extmasukan yang dihasilkan sedemikian rupa bahwa hanya satu dari mereka yang tinggi pada waktu tertentu. Meskipun ini dapat digunakan untuk menghentikan semua jam jika semua use_*input rendah, fokus pertanyaan ini adalah pada properti multiplexing jam dari struktur ini.

The X2 contoh (buffer sederhana) dalam skema hanya tempat-dudukan untuk menyoroti isu tempat & rute otomatis alat yang biasanya gratis ke tempat buffer di mana saja (seperti antara and_cpu_1/zdan or_cpu1/in2pin). Idealnya, batasan waktu harus tidak terpengaruh oleh itu.

FriendFX
sumber
Bisakah Anda mencoba membuatnya lebih ringkas dengan mempersempitnya ke pertanyaan yang sangat spesifik, sangat sempit? Sulit bagi saya untuk memahami apa itu informasi penting, dan apa yang sebenarnya Anda kejar di sini.
travisbartley
@ trav1s: Saya merestrukturisasi pertanyaannya. Tolong beri tahu saya jika Anda membutuhkan klarifikasi.
FriendFX

Jawaban:

3

Tentukan pembagian dengan 1 jam pada and_ * nets dan nyatakan mereka secara fisik eksklusif. Kompiler Cadence RTL menangani situasi dengan benar dengan membuat 3 jalur waktu untuk register yang di-clocking oleh cpu_clk (masing-masing satu jalur untuk satu jam). Register yang digerakkan langsung oleh clk0, clk4 dan clk_ext memiliki arc timingnya sendiri.

create_generated_clock -source [get_ports clk0] \
-divide_by 1 -name and_clk0    [get_pins and_cpu_1/Y]

create_generated_clock -source [get_ports clk4] \
-divide_by 1 -name and_clk4    [get_pins and_cpu_2/Y]

create_generated_clock -source [get_ports clk_ext] \
-divide_by 1 -name and_clk_ext [get_pins and_cpu_ext1/Y]

set_clock_groups \
-physically_exclusive \
-group [get_clocks and_clk0] \
-group [get_clocks and_clk4] \
-group [get_clocks and_clk_ext]
Revanth Kamaraj
sumber
Terima kasih atas saran Anda. Sayangnya saya saat ini tidak dapat memverifikasi ini, tetapi konsep Anda terlihat cukup menjanjikan bagi saya. Bisakah Anda memeriksa apakah jalur antara cast_clk, cpu_clkdan slow_clkmasih diperiksa (yaitu bukan pengecualian karena kelompok jam eksklusif), sementara pada saat yang sama dibatasi oleh jam input masing-masing? Pada akhirnya, saya mencari jawaban otoritatif untuk pertanyaan ini.
FriendFX
@ FriendsFX Saya sudah menguji kode dalam kompiler RTL dan jalur disimpulkan dengan benar.
Revanth Kamaraj
Sekadar memberi tahu Anda, saya menambahkan beberapa informasi tentang multiplexer jam sel tunggal dan solusi (setidaknya untuk beberapa alat).
FriendFX
1

Meskipun ini adalah utas lama yang belum dijawab ... ini mencakup beberapa pemahaman dasar tentang sinkronisasi vs jam async

  • Pada dasarnya, jam Synchronous harus tetap disinkronkan dalam fase dengan penundaan minimal ditambahkan sehingga Mux'ing tidak membuat kesalahan.
    • Ini sering dilakukan dengan resampling semua sumber jam yang terjaga keamanannya pada jam kecepatan penuh.
  • Jam Asynch tidak penting untuk menentukan waktu, jadi penundaan diizinkan. seperti Penghitung Riak.

masukkan deskripsi gambar di sini

Tony Stewart Sunnyskyguy EE75
sumber
Terima kasih telah melihat pertanyaan lama ini. Dalam kasus saya, saya tidak (ingin) menyinkronkan kembali jam dengan jam kecepatan penuh, seperti yang ditunjukkan dalam rangkaian. Namun masih hilang adalah bagian utama dari pertanyaan saya, yaitu pernyataan SDC yang benar untuk membatasi rangkaian ini dengan mempertimbangkan sinkronisitas jam sumber serta mereka digunakan dalam desain sinkron yang sama, karena set_clock_groupstautan contoh yang disebutkan mengklaim memotong secara salah jalur antara jam ini.
FriendFX