VHDL: bilangan bulat untuk sintesis?

17

Saya agak bingung apakah saya harus menggunakan bilangan bulat di VHDL untuk sinyal dan porta sintesis, dll.

Saya menggunakan std_logic di pelabuhan tingkat atas, tetapi secara internal saya telah menggunakan bilangan bulat berkisar di semua tempat. Namun, saya telah menemukan beberapa referensi kepada orang-orang yang mengatakan Anda hanya boleh menggunakan kode yang ditandatangani / tidak ditandatangani untuk sintesis.

Saya telah pergi dan mengerjakan ulang proyek saya saat ini untuk menggunakan yang tidak ditandatangani ... dan, yah, itu terasa lebih buruk.

Apakah praktik buruk menggunakan bilangan bulat? Apa masalahnya? Apakah ada ketidakpastian berapa lebar alat akan memetakan bilangan bulat?

Darron
sumber
Pertanyaan bagus. Saya sendiri sudah bertanya-tanya. Saya mulai dengan menggunakan bilangan bulat, tipe positif dan lainnya di semua tempat tetapi ternyata sangat berbulu untuk disintesis dengan benar. Saya berharap seseorang dapat menjelaskan mengapa semua orang akhirnya menggunakan std_logic dalam bahasa yang sangat diketik.
Trygve Laugstøl
1
Ya. Bukankah itu gila? Sangat diketik dalam praktik saat ini cenderung menghasilkan banyak DATA_I <= TO_UNSIGNED (32010, DATA_I'LENGTH); ketik barang ... itu tidak mengganggu siapa pun? :) Ini sepertinya banyak bagasi yang tidak perlu. (Terutama ketika menambahkan STD_LOGIC_VECTOR () ke dalamnya ) Saya sudah menyatakan jenis dan ukuran saya, ini harus DATA_I <= 32010; Itu harus implisit. Pergi antara ditandatangani / tidak ditandatangani, dll dapat dan harus eksplisit ... tetapi penugasan atau operasi yang tidak ambigu pada bilangan bulat harus implisit.
darron

Jawaban:

15

Integer baik-baik saja dalam sintesis, saya menggunakannya sepanjang waktu.

Saya menggunakan std_logic di port level atas, tetapi secara internal saya menggunakan bilangan bulat berkisar di semua tempat

Tidak apa-apa!

Waspadalah:

  • Anda mensimulasikan dulu bukan :) - Jenis integer tidak secara otomatis "roll-over" dalam simulasi - ini adalah kesalahan untuk keluar dari rentang yang Anda tentukan untuk mereka. Jika Anda ingin perilaku roll-over, Anda harus kode itu secara eksplisit.
  • -(231-1)+231-1-231unsignedsigned
  • Jika Anda tidak membatasi mereka, Anda kadang - kadang bisa berakhir dengan penghitung 32-bit di mana sedikit akan melakukan (jika synth dan alat-alat berikutnya tidak dapat "melihat" bahwa mereka dapat mengoptimalkan bit jauh).

Sisi baiknya:

  • Mereka jauh lebih cepat untuk disimulasikan daripada vektor yang tidak ditandatangani / ditandatangani
  • Mereka tidak secara otomatis terguling dalam simulasi (ya, itu ada di kedua daftar :). Ini berguna - misalnya Anda mendapat peringatan dini bahwa penghitung Anda terlalu kecil.

Ketika Anda menggunakan jenis vektor, Anda menggunakan ieee.numeric_std, bukanieee.std_logic_arith ?

Saya menggunakan integers di mana saya bisa, tetapi jika saya secara eksplisit ingin "roll-over n-bit counters", saya cenderung menggunakannya unsigned.

Martin Thompson
sumber
Ya, saya menggunakan numeric_std. Saya kira saya sebagian besar khawatir tentang alat Xilinx ... mereka masih menghasilkan std_logic_vector untuk semuanya dan "UNSIGNED" bahkan tidak ada dalam penyorotan sintaksis.
darron
1
@dronon Jangan khawatir tentang penyorotan sintaksis. Editor dan stabilo sintaksisnya adalah perangkat lunak yang sama sekali berbeda dari alat sintesis. Juga, unsigned adalah "hanya" tipe data. Ini adalah bagian dari perpustakaan standar, bukan bahasa itu sendiri.
Philippe
Bukankah batas bawah -2 ^ 32 +1? Jika itu -2 ^ 31 - 1 Anda hanya perlu satu bit lagi untuk mewakili hanya satu nomor - sangat aneh.
Bregalad
@Bregalad - tangkapan yang bagus - itu salah selama beberapa waktu!
Martin Thompson
@ MartinThompson Atau mungkin Anda dapat menuliskannya sebagai - (2 ^ 32-1) jika Anda lebih suka menyimpan tanda minus.
Bregalad
7

Jan Decaluwe menulis seluruh kertas putih tentang masalah bilangan bulat versus vektor bit. Saya berharap jawabannya akan menggunakan bilangan bulat bila memungkinkan . http://www.jandecaluwe.com/hdldesign/counting.html

Philippe
sumber
6

Tidak ada yang salah tentang menggunakan integer untuk RTL per se , tetapi ada beberapa alasan yang menghindarinya. Ini benar-benar pertanyaan tentang "praktik terbaik" subyektif dan pada akhirnya Anda harus mencari tahu sendiri apa yang Anda sukai. Sebagai bantuan untuk itu, saya akan membagikan pengalaman dan pemikiran saya tentang ini.

Pada prinsipnya , saya mendukung penggunaan bilangan bulat (dibatasi), juga saat menulis untuk sintesis. Saya terkadang melakukannya, tetapi dalam praktiknya , biasanya saya berpegang teguh pada signeddan unsigned. Saya akan menjelaskan mengapa.

Anda akan dipaksa untuk menggunakan tipe data vektor di bagian dari desain Anda:

  • Hampir tidak ada vendor-IP atau IP pihak ketiga yang akan menggunakan integertipe untuk port

  • Misalnya ketika mengirim data melalui BlockRam, bahkan jika Anda menyimpulkannya dan karenanya tidak perlu antarmuka ke IP / makro / primitif, Anda kemungkinan besar perlu mengonversi ke tipe vektor pula

  • Bahkan jika hal tersebut di atas berlaku, Anda akan sebagian besar perlu antarmuka untuk sesuatu yang lain di beberapa titik (port tingkat atas, jika tidak ada yang lain)

Karena Anda tidak dapat menggunakan integeruntuk desain penuh, Anda mungkin ingin melewatkan semuanya bersama-sama, karena:

  • Di beberapa titik, Anda harus tetap melakukan konversi, dan ini menghilangkan sebagian dari titik penggunaan integerdi tempat pertama

  • Juga, untuk simulasi, konversi ini biasanya akan dipanggil dengan vektor 'U'atau 'X', baik sebelum direset, atau di waktu lain, dan setiap panggilan fungsi semacam itu akan menghasilkan pesan peringatan dari fungsi paket, mengacaukan peringatan simulasi Anda / prompt

Kerugian menggunakaninteger :

  • Berlawanan dengan tipe vektor, bilangan bulat tidak memiliki 'U'dan 'X'; Saya menemukan mereka sangat membantu dalam simulasi. Anda melihat bagaimana sinyal yang tidak diinisialisasi merambat melalui desain, dan Anda mungkin akan bereaksi jika Anda melihat banyak sinyal yang tidak diinisialisasi setelah reset. Ini tidak akan menjadi masalah jika menggunakan bilangan bulat.

  • Dengan bilangan bulat, ada risiko ketidakcocokan simulasi / sintesis yang lebih besar saat menambahkan atau mengurangi yang mengakibatkan under- / overflow. (Seperti yang sudah ditunjukkan oleh orang lain.)

Kasus umum yang menurut saya integerbenar-benar menjadi pilihan yang baik:

  • Untuk men-debug sinyal / penghitung yang Anda monitor melalui chipScope / signalTap dll.

  • Benar-benar representasi internal penghitung, yang tidak pernah masuk atau keluar dari kode Anda sendiri. Ya, ada kasus seperti itu, misalnya jika Anda sedang menulis FIFO dan Anda menulis mati-hisab / membaca untuk membentuk sinyal full, empty, almostFulldll (namun aritmatika pada pointer adalah cara yang lebih baik daripada mati-hisab dalam hal ini. ..)

Kesimpulan saya sendiri: Saya kadang menggunakan integer, tetapi hemat, dan sebagian besar dalam kasus yang dijelaskan di atas. Saya tidak melihat banyak overhead dalam menggunakan unsigneddan signedbukannya integer, dan karena itu, biasanya menempel pada mereka.

Carl
sumber