Mengapa Verilog ini mengurangi 30 macrocell dan ratusan istilah produk?

8

Saya punya proyek yang menghabiskan 34 dari sel-sel Xilinx Coolrunner II. Saya perhatikan saya memiliki kesalahan dan melacaknya sebagai berikut:

assign rlever = RL[0] ? 3'b000 :
                RL[1] ? 3'b001 :
                RL[2] ? 3'b010 :
                RL[3] ? 3'b011 :
                RL[4] ? 3'b100 :
                RL[5] ? 3'b101 :
                RL[6] ? 3'b110 :
                        3'b111;

assign llever = LL[0] ? 3'b000 :
                LL[1] ? 3'b001 :
                LL[2] ? 3'b010 :
                LL[3] ? 3'b011 :
                LL[4] ? 3'b100 :
                LL[5] ? 3'b101 :
                        3'b110 ;

Kesalahannya adalah itu rleverdan lleverlebar satu bit, dan saya membutuhkannya lebar tiga bit. Saya konyol. Saya mengubah kode menjadi:

wire [2:0] rlever ...
wire [2:0] llever ...

jadi ada cukup bit. Namun, ketika saya membangun kembali proyek, perubahan ini menghabiskan lebih dari 30 macrocell dan ratusan istilah produk. Adakah yang bisa menjelaskan kesalahan saya?

(Berita baiknya adalah sekarang disimulasikan dengan benar ... :-P)

EDIT -

Saya kira saya frustrasi karena kira-kira saat saya mulai memahami Verilog dan CPLD, sesuatu terjadi yang menunjukkan saya jelas tidak mengerti.

assign outp[0] = inp[0] | inp[2] | inp[4] | inp[6];
assign outp[1] = inp[1] | inp[2] | inp[5] | inp[6];
assign outp[2] = inp[3] | inp[4] | inp[5] | inp[6];

Logika untuk mengimplementasikan ketiga garis tersebut terjadi dua kali. Itu berarti bahwa masing-masing dari 6 baris Verilog mengkonsumsi sekitar 6 macrocell dan masing-masing 32 istilah produk .

EDIT 2 - Sesuai saran ThePhoton tentang sakelar optimisasi, berikut adalah informasi dari halaman ringkasan yang dihasilkan oleh ISE:

Synthesizing Unit <mux1>.
    Related source file is "mux1.v".
    Found 3-bit 1-of-9 priority encoder for signal <code>.
Unit <mux1> synthesized.
(snip!)
# Priority Encoders                                    : 2
 3-bit 1-of-9 priority encoder                         : 2

Jadi jelas kode itu dikenali sebagai sesuatu yang istimewa. Desainnya masih menghabiskan sumber daya yang luar biasa.

EDIT 3 -

Saya membuat skema baru termasuk hanya mux yang direkomendasikan oleh @thePhoton. Sintesis menghasilkan penggunaan sumber daya yang tidak signifikan. Saya juga mensintesis modul yang direkomendasikan oleh @Michael Karas. Ini juga menghasilkan penggunaan yang tidak signifikan. Jadi beberapa kewarasan berlaku.

Jelas, penggunaan nilai tuas saya menyebabkan kekhawatiran. Akan datang lebih banyak lagi.

Edit Terakhir

Desainnya tidak lagi gila. Namun saya tidak yakin apa yang terjadi. Saya membuat banyak perubahan untuk mengimplementasikan algoritma baru. Salah satu faktor yang berkontribusi adalah 'ROM' dari 111 elemen 15-bit. Ini mengkonsumsi sejumlah kecil macrocell tetapi banyakpersyaratan produk - hampir semua yang tersedia di xc2c64a. Saya mencari ini tetapi tidak menyadarinya. Saya percaya kesalahan saya disembunyikan oleh optimasi. 'Tuas' yang saya bicarakan digunakan untuk memilih nilai dari ROM. Saya berhipotesis bahwa ketika saya mengimplementasikan encoder prioritas 1-bit (rusak), ISE mengoptimalkan beberapa ROM. Itu mungkin tipuan, tapi itu satu-satunya penjelasan yang bisa saya pikirkan. Pengoptimalan ini mengurangi penggunaan sumber daya secara nyata dan menidurkan saya untuk mengharapkan garis dasar tertentu. Ketika saya memperbaiki encoder prioritas (sesuai utas ini,) saya melihat overhead encoder prioritas dan ROM yang sebelumnya telah dioptimalkan dan menghubungkan ini dengan yang sebelumnya secara eksklusif.

Setelah semua ini, saya bagus di macrocell tetapi telah menghabiskan persyaratan produk saya. Setengah dari ROM adalah sebuah kemewahan, sungguh, karena itu hanya comp 2 dari babak pertama. Saya menghapus nilai negatif, menggantinya di tempat lain dengan perhitungan sederhana. Ini memungkinkan saya untuk berdagang macrocell untuk persyaratan produk.

Untuk saat ini, hal ini cocok dengan xc2c64a; Saya telah menggunakan masing-masing 81% dan 84% dari sel-sel makro dan produk saya. Tentu saja, sekarang saya harus mengujinya untuk memastikan itu melakukan apa yang saya inginkan ...

Terima kasih kepada ThePhoton dan Michael Karas untuk bantuannya. Selain dukungan moral yang mereka pinjam untuk membantu saya menyelesaikan masalah ini, saya telah belajar dari dokumen Xilinx yang diposting ThePhoton, dan saya mengimplementasikan encoder prioritas yang disarankan oleh Michael.

Tony Ennis
sumber
bukankah setiap tanda tanya di sana secara efektif menyiratkan multiplekser, dan secara struktural Anda juga telah membuatnya menjadi multiplexer? Berapa banyak sel makro yang Anda harapkan untuk diambil?
vicatcu
Saya tidak tahu berapa banyak macrocell yang harus dikonsumsi oleh konstruk. Namun, mengingat proyek saya saat ini mengkonsumsi 34 macrocell termasuk dua multiplexor '1 bit', dan ini adalah bagian kecil dari proyek, saya terkejut dengan hasil ini.
Tony Ennis
Alat apa yang Anda gunakan?
The Photon
ISE Xilinx ...
Tony Ennis
Dalam kode di suntingan Anda, saya pikir Anda ingin |bukan ||.
The Photon

Jawaban:

7

Kode yang Anda perlihatkan pada dasarnya adalah encoder prioritas. Yaitu, ia memiliki input dari banyak sinyal, dan outputnya menunjukkan sinyal mana yang diatur, memberikan prioritas pada sinyal paling kiri jika lebih dari satu diatur.

Namun, saya melihat definisi yang saling bertentangan dari perilaku standar untuk sirkuit ini di dua tempat yang saya periksa.

Menurut Wikipedia , encoder prioritas standar menomori inputnya dari 1. Artinya, jika bit input paling signifikan diset, output 1, bukan 0. Encoder prioritas Wikipedia menghasilkan 0 ketika tidak ada bit input yang ditetapkan.

Panduan Pengguna Xilinx XST (hlm. 80), bagaimanapun, mendefinisikan encoder prioritas lebih dekat dengan apa yang Anda kodekan. Input diberi nomor dari 0, jadi ketika lsb input diatur, outputnya 0. Namun, definisi Xilinx tidak memberikan spesifikasi untuk output ketika semua bit input jelas (Kode Anda akan menampilkan 3'd7).

Panduan pengguna Xilinx, tentu saja, akan menentukan apa yang diharapkan oleh perangkat lunak sintesis Xilinx. Poin utamanya (*priority_extract ="force"*)adalah diperlukan arahan khusus untuk XST untuk mengenali struktur ini dan menghasilkan hasil sintesis yang optimal.

Inilah formulir yang direkomendasikan Xilinx untuk enkoder prioritas 8-ke-3:

(* priority_extract="force" *)
module v_priority_encoder_1 (sel, code);
input [7:0] sel;
output [2:0] code;
reg [2:0] code;
always @(sel)
begin
    if (sel[0]) code = 3b000;
    else if (sel[1]) code = 3b001;
    else if (sel[2]) code = 3b010;
    else if (sel[3]) code = 3b011;
    else if (sel[4]) code = 3b100;
    else if (sel[5]) code = 3b101;
    else if (sel[6]) code = 3b110;
    else if (sel[7]) code = 3b111;
    else code = 3bxxx;
end
endmodule

Jika Anda dapat mengatur ulang logika sekitarnya agar Anda dapat menggunakan gaya pengkodean yang disarankan Xilinx, itu mungkin cara terbaik untuk mendapatkan hasil yang lebih baik.

Saya pikir Anda bisa mendapatkan ini dengan instantiating modul encoder Xilinx dengan

v_priority_encoder_1 pe_inst (.sel({~|{RL[6:0]}, RL[6:0]}), .code(rlever));

Saya sudah nor'ed bersama semua bit RL[6:0]untuk mendapatkan bit input 8 yang akan memicu output 3'b111 ketika semua bit RL rendah.

Untuk lleverlogika, Anda mungkin dapat mengurangi penggunaan sumber daya dengan membuat modul encoder yang dimodifikasi, mengikuti template Xilinx, tetapi hanya membutuhkan 7 bit input (6 bit Anda LLditambah bit tambahan yang menjadi tinggi ketika 6 lainnya semuanya rendah).

Menggunakan template ini mengasumsikan versi ISE yang Anda miliki menggunakan mesin sintesis XST. Sepertinya mereka mengubah alat sintesis pada setiap putaran utama ISE, jadi periksa apakah dokumen yang saya tautkan benar-benar sesuai dengan versi ISE Anda. Jika tidak, periksa gaya yang disarankan dalam dokumentasi Anda untuk melihat apa yang diharapkan alat Anda.

Foton
sumber
Terima kasih, itu akan membutuhkan waktu untuk dicerna. ISE saya menggunakan XST meskipun saya tidak tahu versi mana.
Tony Ennis
Kuncinya adalah memiliki (* priority_extract="force" *)dan mungkin juga secara eksplisit memasukkan keluaran tidak peduli meskipun Anda mencakup setiap input yang mungkin. (Tanpanya, XST mungkin mencoba menghasilkan tabel pencarian lengkap, itulah sebabnya begitu banyak istilah produk) Coba tambahkan opsi tidak peduli dulu. Jika tidak berhasil, maka coba gunakan pelat Xilinx dengan tepat.
The Photon
Saya menerapkan rip lengkap dari kode di atas dan tidak mendapatkan hasil yang lebih baik. Halaman ringkasan ISE menunjukkan MUX dikenali, meskipun pengakuan itu tidak sekuat untuk konstruksi lainnya. Saya akan memposting informasi yang relevan dalam beberapa menit.
Tony Ennis
sunting - abaikan komentar di atas tentang 'pengakuan kuat' - itu ada, saya baru saja melewatkannya tadi malam; Saya redid pekerjaan dan kenyataan beroperasi dengan benar.
Tony Ennis
6

Jawaban Thehoton sangat bagus. Saya ingin menambahkan beberapa informasi tambahan di sini untuk pertimbangan Anda. Ini berasal dari fakta bahwa meskipun kita memiliki perangkat FPGA dan CPLD canggih yang menggunakan HDL dan alat systhesis dapat menjadi informatif untuk melihat secara dekat hal-hal yang dirancang bertahun-tahun yang lalu. Tetap bersamaku sementara aku berjalan melalui rekomendasi saya di akhir.

Ada bagian logika diskrit yang melakukan fungsi pengodean prioritas. Logika yang diterapkan oleh bagian-bagian ini telah ada sejak lama ketika sangat penting untuk mengurangi jumlah transistor hingga minimum. Anda dapat mencari di web untuk bagian logika dengan nomor bagian umum seperti 74HC148 atau MC14532B untuk menemukan lembar data yang menyertakan diagram logika setara untuk bagian ini. Diagram di bawah ini adalah salah satu contoh yang diambil dari lembar data TI untuk bagian 74HC148 .

masukkan deskripsi gambar di sini

Logika ini mengimplementasikan tabel kebenaran berikut (diambil dari lembar data yang sama):

masukkan deskripsi gambar di sini

Perhatikan bahwa keluarga bagian di atas menggunakan sinyal input aktif rendah. Lembar data lain untuk bagian ON Semiconductor MC14532B menunjukkan tabel kebenaran untuk fungsi encoder menggunakan sinyal input tinggi aktif mirip dengan contoh Verilog Anda.

masukkan deskripsi gambar di sini

Lembar data yang sama menunjukkan persamaan logika untuk MC14532B sebagai berikut:

masukkan deskripsi gambar di sini

Anda mungkin ingin mempertimbangkan untuk mengkode persamaan yang sama langsung ke kode Verilog Anda untuk melihat bagaimana membandingkannya dengan contoh Anda saat ini. Sangat mungkin menghasilkan hasil yang jauh lebih menguntungkan.

Michael Karas
sumber
Terima kasih, saya akan melakukannya. Masalah ini membunuhku. Saya percaya itu mensintesis lebih efisien sebelumnya. Dan kemudian aku mengubah sesuatu. / selfbonk
Tony Ennis
Terima kasih, saya sudah menerapkannya. Sayangnya, itu tidak membuat perbedaan materi.
Tony Ennis
Jawaban bagus. Mari kita lihat berapa banyak persyaratan produk yang harus diterapkan untuk logika ini. Tony, jika Anda menggunakan boilerplate Xilinx atau persamaan Michael, dan Anda masih menghasilkan ratusan istilah produk, maka Anda perlu mencari perubahan halus di tempat lain dalam kode Anda yang mungkin menyebabkan masalah; atau lihat dengan hati-hati file log sintesis untuk melihat apakah ada sesuatu yang tidak Anda harapkan.
The Photon
Saya setuju dengan @ThePhoton sepenuhnya. Saya telah menyembunyikan sesuatu. Saya yakin bahwa ini bisa berfungsi - saya bahkan tidak memperhatikan konsumsi yang begitu kecil. Oh well, itu alasan yang bagus untuk mulai lebih memahami informasi Ringkasan.
Tony Ennis