Apakah ada cara untuk memicu kesalahan waktu kompilasi dalam Verilog secara kondisional?

9

Saya memiliki modul parameter di Verilog, di mana parameternya adalah laju jam dan laju penyegaran, yang digunakan untuk menghitung berapa banyak siklus tidak aktif yang disisipkan di antara contoh operasi berulang. Namun, sangat mudah untuk mengatur parameter yang tidak dapat dicapai (karena operasi membutuhkan waktu yang tidak sepele, sehingga pengulangan harus terjadi sebelum selesai), dan saat ini desain tidak memberikan umpan balik hal ini.

Saya bertanya-tanya apakah ada cara saya dapat memicu kesalahan selama sintesis (atau kompilasi sebelum simulasi) jika kondisi tidak dapat dipenuhi (yaitu jika satu localparam kurang dari yang lain)? Beberapa setara dengan C / C ++ populer kompilasi-waktu-menegaskan hack, mungkin

Jules
sumber

Jawaban:

10

Saya yakin ada beberapa cara untuk mengikat panggilan balik waktu kompilasi C / C ++. Namun, selama generateblok dukungan Anda (diperkenalkan di IEEE Std 1364-2001), maka Anda dapat melakukan sesuatu seperti berikut:

generate
if (CONDITION > MAX_ALLOWED /* your condition check */ ) begin
    illegal_parameter_condition_triggered_will_instantiate_an non_existing_module();
end
endgenerate

Jika kondisinya benar, maka kompiler akan memberikan kesalahan karena ada permintaan untuk sesuatu yang tidak ada. Jika kondisinya salah, maka operasi dilewati. Satu-satunya persyaratan adalah kode untuk kondisi ilegal mengikuti sintaks Verilog hukum dan kondisi ilegal tidak akan pernah secara tidak sah menjadi valid (karenanya nama modul yang panjang dan tidak ada).

Jika simulator dan alat sintesis Anda mendukung IEEE Std 1800-2009 (revisi SystemVerilog dirilis pada 2009) atau revisi yang lebih baru, maka Anda dapat menggunakan $error()dan memberikan pesan yang lebih bermakna untuk mengatasi kesalahan tersebut. Saya tidak yakin apakah ada vendor yang menerapkan fitur ini. Itu harus menjadi metode yang disukai setelah kebanyakan vendor menerapkan, oleh karena itu saya akan memberikan contoh:

generate
if (CONDITION > MAX_ALLOWED /* your condition check */ ) begin
    $error("%m ** Illegal Condition ** CONDITION(%d) > MAX_ALLOWED(%d)", CONDITION, MAX_ALLOWED);
end
endgenerate
Greg
sumber
1

Anda dapat melakukan sesuatu seperti ini:

module test();

  parameter VALUE=16;

  // VALUE should be between 16 and 64
  wire [64:16] range_for_value;
  assign range_for_value[VALUE] = 1'b0;

endmodule

Alat mungkin memperlakukan ini sedikit berbeda, tetapi jika VALUEtidak dalam kisaran yang diharapkan itu benar-benar harus menjadi kesalahan karena indeks bit untuk pernyataan penetapan akan keluar dari batas range_for_value.

dwikle
sumber
1

Benarkah tidak ada yang seperti "menegaskan" di Verilog? Ini hal yang sangat mendasar!

Jika alat Anda mendukung bahasa campuran, Anda bisa menambahkan modul yang hanya entitas VHDL dengan port atau generik yang diperlukan dan pernyataan ASSERT yang jelas. Untuk kondisi yang ditentukan waktu kompilasi atau elaborasi, ini akan bekerja sama baiknya dalam sim atau sintesis (setidaknya dengan XST atau Synplicity).

entity CheckSize is
   generic (depth : natural := 16);
   port (data : std_logic_vector);
end CheckSize;

architecture empty of CheckSize is
begin
   Assert depth * data'length <= 256 Report "Size too large!" 
      severity Failure;
end empty;

Tidak ada jawaban sejauh ini yang benar-benar memuaskan kecuali mungkin $ error "System Verilog 2009" () satu tapi ini mungkin yang termudah di berbagai alat terluas.

Brian Drummond
sumber