Sintesis aneh ketika bekerja dengan FPGA

Saat ini, ada dua bahasa deskripsi perangkat keras yang paling umum: Verilog / SystemVerilog dan VHDL. Bahasa deskripsi perangkat keras itu sendiri adalah cara yang cukup universal, tetapi apakah ini selalu terjadi? Dan apa yang bisa "tidak universalitas" dari bahasa deskripsi perangkat keras bergantung?

Gagasan menulis artikel ini muncul selama sintesis satu proyek di lingkungan pengembangan yang berbeda, sebagai hasil dari hasil yang berbeda diperoleh. Karena modul sumber cukup banyak, modul uji volume yang lebih kecil ditulis untuk menunjukkan hasilnya, tetapi sintesis yang menyebabkan peringatan / kesalahan yang sama. Sebagai modul uji, register 4-bit dengan reset asinkron digunakan, dan Libero SoC 18.1, Quartus Prime 17.1, Vivado 2017.4.1 dipilih sebagai lingkungan pengembangan.

Pertama, varian yang menggambarkan modul semacam itu dalam bahasa Verilog disajikan, teks yang dirasakan dengan benar oleh lingkungan pengembangan yang dipilih:

module test1 ( input clk, input arst, input [3:0] data, output reg [3:0] q ); always @( posedge clk or negedge arst ) begin if ( ~ arst ) begin q <= 4'h0 ; end else begin q <= data ; end end endmodule 

Sebagai hasil dari sintesis modul ini, skema berikut diperoleh:

  1. Libero SoC v11.8

    test1 Libero SoC

  2. Kuartus Prime 17.1

    test1 quartus prime

  3. Vivado 2017.4.1

    test1 vivado


Di semua sirkuit yang disintesis untuk test1, D-trigger digunakan baik dengan input reset terbalik (Quartus Prime) atau dengan penambahan inverter (VERIFIC_INV dalam kasus Libero SoC dan LUT1 dalam kasus Vivado).

Apakah rangkaian yang disintesis akan berbeda jika pemeriksaan status pengaturan ulang asinkron diubah? Untuk melakukan ini, ubah teks modul test1 ke deskripsi modul test2:

 module test2 ( input clk, input arst, input [3:0] data, output reg [3:0] q ); always @(posedge clk or negedge arst) begin if (arst) begin q<=data; end else begin q<=4'h0; end end endmodule 

Dapat diasumsikan bahwa sintesis modul test2 tidak boleh berbeda dari sintesis modul test1, karena logika deskripsi kedua modul tidak saling bertentangan. Namun, sintesis modul test2 membuahkan hasil sebagai berikut:

  1. Libero SoC v11.8
    Sirkuit disintesis, tetapi pesan peringatan berikut "Edge and condition mismatch (CG136)" muncul dalam pesan. Peringatan ini menunjukkan ketidakcocokan daftar sensitivitas dan verifikasi kondisi reset. Namun, rangkaian yang disintesis tidak berbeda dari modul test1.

    test2 Libero SoC

  2. Kuartus Prime 17.1

    Sintesis rangkaian gagal dengan kesalahan:

    "Kesalahan (10200): Kesalahan Pernyataan Kondisional Verilog HDL di test2.v (10): tidak dapat mencocokkan operand dalam kondisi dengan tepi yang sesuai dalam kontrol acara terlampir dari selalu membangun." Teks kesalahannya mirip dengan peringatan yang dikeluarkan oleh Libero SoC.
  3. Vivado 2017.4.1

    Sintesis sirkuit dilakukan dengan peringatan:

    "[Synth 8-5788] Mendaftar q_reg dalam pengujian modul memiliki Atur dan reset dengan prioritas yang sama. Ini dapat menyebabkan ketidakcocokan simulasi. Pertimbangkan menulis ulang kode ["/home/vlasovdv0111/project_1/project_1.srcs/sources_1/new/test2.v":10]." Mirip dengan Libero SoC dan Quartus Prime, peringatan serupa dikeluarkan. Selain itu, peringatan itu mengatakan tentang kemungkinan perbedaan antara hasil pemodelan dan bekerja di perangkat keras, sebagai akibatnya diusulkan untuk menulis ulang kode modul.

    test2 vivado


Setelah menjelaskan modul test1 dan test2, muncul ide untuk memeriksa apa yang akan terjadi jika kita mensintesis kode berikut:

 module test3 ( input clk, input arst, input [3:0] data, output reg [3:0] q ); always @(posedge clk or negedge arst) begin if (arst) begin q<=4'h0; end else begin q<=data; end end endmodule 

Deskripsi register semacam itu tidak logis, karena reset pemicu dalam hal ini terjadi ketika garis reset tidak aktif.

Hasil sintesis adalah sebagai berikut:

  1. Libero SoC v11.8

    Sintesis sirkuit tidak dilakukan dengan kesalahan: "Logika untuk q [3: 0] tidak cocok dengan flip-flop standar (CL123)", sehingga menolak untuk mensintesis sirkuit, mengutip tidak adanya jenis pemicu yang diperlukan untuk sintesis.
  2. Kuartus Prime 17.1

    Sirkuit tidak disintesis dengan kesalahan berikut: "Kesalahan (10200): Kesalahan pernyataan kondisional Verilog HDL di test3.v (9): tidak dapat mencocokkan operan dalam kondisi dengan tepi yang sesuai dalam kontrol acara penutup selalu membangun" . Teks kesalahan ini tidak berbeda dari teks kesalahan untuk modul test2.
  3. Vivado 2017.4.1

    Skema disintesis tanpa kesalahan:

    test3 vivado


Namun, apa yang akan terjadi jika kami menjelaskan modul di mana daftar sensitivitas tidak bertentangan dengan pemeriksaan kondisi reset, tetapi pemicu diatur ulang ketika garis reset tidak aktif, seperti dalam kasus deskripsi modul test3. Deskripsi modul test4 tersebut adalah sebagai berikut:

 module test4 ( input clk, input arst, input [3:0] data, output reg [3:0] q ); always @( posedge clk or negedge arst ) begin if ( ~ arst ) begin q <= data ; end else begin q <= 4'h0 ; end end endmodule 

Selama sintesis, hasil berikut diperoleh:

  1. Libero SoC v11.8

    Sintesis sirkuit dilakukan dengan peringatan:

    β€œSinyal yang ditemukan diidentifikasi sebagai Jam sistem yang mengontrol 4 elemen berurutan termasuk q_1 [3]. Menggunakan jam ini, yang tidak memiliki batasan waktu yang ditentukan, dapat berdampak buruk pada kinerja desain. (MT532). "

    test4 Libero SoC

  2. Kuartus Prime 17.1

    Sebagai hasil dari sintesis sirkuit, peringatan diterima:

    Β«Warning (13004): Presettable and clearable registers converted to equivalent circuits with latches. Registers power-up to an undefined state, and DEVCLRn places the registers in an undefined state.
    Warning (13310): Register "q[0]~reg0" is converted into an equivalent circuit using register "q[0]~reg0_emulated" and latch "q[0]~1"
    Warning (13310): Register "q[1]~reg0" is converted into an equivalent circuit using register "q[1]~reg0_emulated" and latch "q[1]~1"
    Warning (13310): Register "q[2]~reg0" is converted into an equivalent circuit using register "q[2]~reg0_emulated" and latch "q[2]~1"
    Warning (13310): Register "q[3]~reg0" is converted into an equivalent circuit using register "q[3]~reg0_emulated" and latch "q[3]~1"Β»

    Semua peringatan yang dijelaskan di atas sesuai dengan fakta bahwa kait digunakan sebagai pengganti pemicu.

    test4 quartus prime

  3. Vivado 2017.4.1

    Sirkuit disintesis dengan satu peringatan:

    "[Synth 8-5788] Daftarkan q_reg dalam pengujian modul memiliki Atur dan setel ulang dengan prioritas yang sama. Ini dapat menyebabkan ketidakcocokan simulasi. Pertimbangkan menulis ulang kode ["/home/vlasovdv0111/project_1/project_1.srcs/sources_1/new/test.v":11]." Teks kesalahan ini mengulangi teks kesalahan untuk modul test2.

    test4 vivado


Dari semua percobaan yang dijelaskan, kesimpulan berikut dapat ditarik:

  1. Bahasa Verilog adalah bahasa deskripsi perangkat keras universal, yang keterbatasannya adalah kemampuan lingkungan pengembangan itu sendiri;
  2. untuk deskripsi peralatan yang benar, perlu untuk mengetahui sintaks bahasa, serta menganalisis daftar peringatan dan kesalahan yang terjadi pada setiap tahap pembangunan proyek.

Source: https://habr.com/ru/post/id413007/


All Articles