Mendeteksi register yang tidak diatur ulang

8

Saat menulis Verilog, saya menggunakan berbagai "linter" yang akan memberikan kesalahan dan peringatan. Ini adalah simulator saya (ModelSim), kompiler saya (Quartus II), bersama dengan linter (Verilator). Bersama-sama, saya memiliki cakupan yang baik untuk perangkap umum, seperti ketidakcocokan ukuran bus dan kait disimpulkan.

Sayangnya, tidak satu pun dari tiga alat mendeteksi register yang tidak diatur ulang. Untuk melihat apa yang saya maksud, pertimbangkan yang berikut ini.

reg a;
reg b;

always @(posedge clk_i or posedge rst_i) begin
  if(rst_i) begin
    a <= 1'b0; // Reset a
    // Ooops, forgot to reset b
  end else begin
    // Do stuff with a and b
  end
end

Bagaimana saya dapat memiliki alat saya secara otomatis mendeteksi register yang tidak diatur ulang?

Randomblue
sumber
2
"register yang tidak diatur ulang" tidak selalu merupakan hal yang buruk (setidaknya dalam desain silikon), yang mungkin menjadi alasan mengapa mereka bukan peringatan di alat serat. Secara umum Anda hanya ingin mengatur ulang register yang perlu diatur ulang, karena menambahkan pengaturan ulang ke sandal jepit meningkatkan area mereka dan beban pada jaringan reset. Jika Anda memiliki bus data 256-bit dan sinyal 'valid' satu bit, tidak perlu mengatur ulang data jika Anda menyetel ulang valid.
Tim
Synplicity (alat sintesis) memberikan peringatan tentang hal-hal seperti itu. Mengganggu karena mereka sering disengaja ... tetapi dapat membantu dengan situasi Anda (dengan asumsi Synplicity tidak Verilog, saya belum pernah mencoba)
Brian Drummond
Pertanyaannya menyatakan bahwa berbagai jenis linter sedang digunakan, ModelSim, Quartus II, dan Verilator. Alat-alat ini memiliki kemampuan menyikat terbatas, dan jenis masalah yang mereka periksa cukup sempit.
travisbartley

Jawaban:

3

Tak satu pun dari alat yang Anda sebutkan adalah alat linting sungguhan. Alat-alat ini tidak seharusnya memberi Anda cakupan linting yang baik.

Saya melihat dua alat linting komersial dan keduanya memiliki aturan untuk mendeteksi non-reset jepit.

Saya melihat tiga opsi:

  1. Jika jawaban oleh David Kessner bekerja untuk Anda - cara untuk pergi.
  2. Dapatkan alat linting yang layak yang akan melakukan pekerjaan.
  3. Tulis skrip yang akan mendeteksi jepit yang tidak disetel ulang.

Sekarang, # 2 mungkin tidak sesederhana itu. Saya tidak tahu apakah ada linter bebas yang bagus di luar sana, dan yang profesional mahal dan akan membawa Anda banyak waktu untuk pengaturan.

# 3 adalah pendekatan yang akan saya gunakan. Jika Anda tahu bahasa skrip apa pun (Perl, Python, ...) Anda perlu paling banyak satu hari untuk menulis skrip yang mencari jepit yang tidak disetel ulang. Jika Anda tidak tahu bahasa skrip apa pun, ada StackOverflow di mana Anda dapat meminta bantuan - beberapa hari dan Anda selesai. Ini juga akan menambahkan alat lain ke dalam kotak alat pribadi Anda yang sangat dihargai di kalangan desainer front-end - penulisan skrip pemrosesan teks.

Semoga berhasil!

Vasiliy
sumber
4

Ketika saya menjalankan Modelsim pada desain VHDL saya, itu memberi saya peringatan pada Waktu = 0ps tentang logika dengan sinyal input tipe 'X' atau 'U'. Saya lupa pesan peringatan yang tepat. Melewati peringatan ini dapat memberi tahu saya apa yang tidak saya inisialisasi.


sumber
1

Saya mengandalkan tes fungsional daripada alat linting untuk ini, saya cenderung beralih ulang dan memainkan kembali bagian-bagian dari bangku tes. Jika perangkat berfungsi dengan benar setelah reset, maka Anda telah cukup mereset ruang status, atau bangku tes Anda tidak bagus!

shuckc
sumber
0

Terkadang alat desain akan menampilkan serangkaian laporan yang memberi Anda segala macam info menarik. Misalnya, Xilinx mungkin menyebutnya sebagai Laporan Peta, yang memberi tahu Anda komponen logis apa yang dipetakan ke komponen fisik apa.

Pada contoh di atas, reg a akan dipetakan ke FDCE (Flip flop, D, dengan Asynchronous Clear, dan clock Enable), sementara reg b akan dipetakan ke FDE (Flip flop, D, dan clock Enable). Ini akan memberi tahu Anda bahwa reg b tidak memiliki reset.

ajs410
sumber