Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Industrial programming >> VHDL

Verifikasi acak terbatas

Verifikasi acak terbatas adalah strategi testbench yang mengandalkan menghasilkan transaksi pseudo-acak untuk perangkat yang diuji (DUT). Tujuannya adalah untuk mencapai cakupan fungsional dari sejumlah peristiwa yang telah ditentukan sebelumnya melalui interaksi acak dengan DUT.

Open Source VHDL Verification Methodology (OSVVM) adalah pustaka VHDL gratis yang mencakup sejumlah paket praktis untuk membuat bangku tes acak terbatas. Kami sangat tertarik dengan RandomPkg dan CoveragePck, yang akan kami gunakan dalam artikel ini. Saya sarankan untuk mengunjungi halaman OSVVM GitHub untuk mempelajari lebih lanjut tentang fitur perpustakaan ini.

Perangkat sedang diuji

Saya akan terjun langsung ke contoh untuk menjelaskan dengan lebih baik bagaimana testbench acak yang dibatasi berbeda dari testbench klasik, yang menggunakan tes terarah. Kami membuat ring buffer FIFO di artikel sebelumnya di blog ini, tetapi kami tidak membuat testbench pemeriksaan mandiri untuk memverifikasi kebenaran modul.

Kami akan membuat testbench yang tepat untuk ring buffer FIFO yang menggunakan verifikasi acak terbatas.

entity ring_buffer is
  generic (
    RAM_WIDTH : natural;
    RAM_DEPTH : natural
  );
  port (
    clk : in std_logic;
    rst : in std_logic;

    -- Write port
    wr_en : in std_logic;
    wr_data : in std_logic_vector(RAM_WIDTH - 1 downto 0);

    -- Read port
    rd_en : in std_logic;
    rd_valid : out std_logic;
    rd_data : out std_logic_vector(RAM_WIDTH - 1 downto 0);

    -- Flags
    empty : out std_logic;
    empty_next : out std_logic;
    full : out std_logic;
    full_next : out std_logic;

    -- The number of elements in the FIFO
    fill_count : out integer range RAM_DEPTH - 1 downto 0
  );
end ring_buffer;

Entitas modul buffer cincin ditunjukkan pada kode di atas. Kami akan memperlakukan DUT sebagai kotak hitam, artinya kami tidak akan mengasumsikan pengetahuan tentang bagaimana DUT diimplementasikan. Bagaimanapun, artikel ini adalah tentang testbench, bukan ring buffer FIFO.

Kami akan membuat instance DUT di testbench dengan menggunakan metode instance entitas. Instansiasinya sepele, jadi saya akan menghilangkan kode untuk saat ini, tetapi dapat diunduh nanti di artikel ini.

Generik DUT akan dipetakan ke nilai berikut:

Strategi testbench

Mari kita melalui strategi pengujian sebelum kita mulai menerapkan apa pun. Gambar di bawah ini menunjukkan konsep utama dari testbench yang akan kita buat.

Kami akan melakukan transaksi penulisan acak di sisi input DUT. Data input akan disetel ke nilai acak pada setiap siklus clock, dan strobo pada input pengaktifan tulis akan berdurasi acak.

Demikian pula, kami akan melakukan pembacaan secara acak. Kami akan menegaskan sinyal pengaktifan baca dalam ledakan yang berlangsung selama sejumlah siklus jam acak.

Akan ada model perilaku yang paralel dengan DUT. Ini adalah FIFO yang diimplementasikan secara berbeda dari buffer cincin yang digunakan di DUT, tetapi masih memiliki antarmuka yang sama. Berbeda dengan DUT, model perilaku tidak harus dapat disintesis. Ini memberi kita kebebasan untuk menggunakan fitur pemrograman VHDL tingkat lanjut untuk membuatnya.

Kami akan membandingkan output dari DUT dengan output dari model perilaku dalam proses terpisah. Proses ini akan bertanggung jawab untuk melakukan perbandingan ini pada setiap siklus clock dengan menggunakan pernyataan tegas. Jika kedua implementasi FIFO berperilaku berbeda setiap saat, kegagalan pernyataan akan menyebabkan simulasi berakhir dengan kesalahan.

Terakhir, kami akan mengumpulkan data cakupan fungsional dengan mengamati transaksi yang masuk dan keluar dari DUT. Titik cakupan fungsional dapat berarti, misalnya, membaca dan menulis secara bersamaan, atau bahwa FIFO diisi setidaknya sekali. Kami akan memantau peristiwa ini dalam proses sequencer testbench utama kami. Simulasi akan dihentikan ketika semua peristiwa cakupan fungsional yang kami pantau telah terjadi.

Mengimpor perpustakaan OSVVM

Pustaka OSVVM dapat digunakan dengan simulator apa pun yang mendukung VHDL-2008. Ini mungkin sudah disertakan dengan pustaka default yang disertakan dengan simulator Anda. Ini termasuk dalam ModelSim PE Student Edition, yang dapat diunduh secara gratis dari Mentor Graphics.

ModelSim dikirimkan dengan versi OSVVM yang lebih lama, tetapi tidak apa-apa, ia memiliki semua yang kami butuhkan. Kami hanya dapat melanjutkan dan mengimpor paket acak dan cakupan seperti ini:

library osvvm;
use osvvm.RandomPkg.all;
use osvvm.CoveragePkg.all;

Versi terbaru dari perpustakaan OSVVM selalu dapat diunduh dari halaman GitHub. Lakukan ini jika simulator Anda tidak menyertakannya, atau jika Anda ingin menggunakan fitur perpustakaan terbaru.

Mendeklarasikan variabel OSSVM

Pustaka OSVVM berisi paket dengan tipe yang dilindungi. Variabel yang dibuat dari ini akan dibatasi dalam ruang lingkup untuk proses di mana mereka didefinisikan. Oleh karena itu, kami akan mendeklarasikannya sebagai variabel bersama di wilayah deklaratif arsitektur testbench, seperti yang ditunjukkan pada kode di bawah ini.

 -- OSVVM variables
  shared variable rv : RandomPType;
  shared variable bin1, bin2, bin3, bin4, bin5, bin6 : CovPType;

rv variabel tipe RandomPType adalah untuk menghasilkan nilai acak. Kami hanya membutuhkan salah satu dari ini, karena kami dapat menggunakan objek yang sama di setiap proses di mana kami perlu menghasilkan nilai acak. Baris kode terakhir mendeklarasikan enam variabel bertipe CovPType .

Kami mendeklarasikan enam variabel cakupan karena kami akan memiliki enam tujuan cakupan, kami akan merujuk ke objek ini sebagai «bins». Variabel bersama harus diinisialisasi sebelum dapat digunakan untuk mengumpulkan data cakupan. Kami melakukan ini dengan memanggil AddBins prosedur pada masing-masing CovPType tempat sampah.

    -- Set up coverage bins
    bin1.AddBins("Write while empty", ONE_BIN);
    bin2.AddBins("Read while full", ONE_BIN);
    bin3.AddBins("Read and write while almost empty", ONE_BIN);
    bin4.AddBins("Read and write while almost full", ONE_BIN);
    bin5.AddBins("Read without write when almost empty", ONE_BIN);
    bin6.AddBins("Write without read when almost full", ONE_BIN);

Kami menyediakan deskripsi string bin cakupan sebagai parameter pertama ke AddBins prosedur. String ini akan muncul kembali di akhir simulasi ketika kami mencetak statistik untuk setiap nampan cakupan. Seperti yang dapat Anda lihat dari deskripsi teks, kita akan menggunakan tempat sampah untuk memeriksa apakah beberapa kasus sudut yang sangat spesifik telah terjadi atau tidak.

AddBins adalah prosedur kelebihan beban yang dapat digunakan untuk membuat beberapa papan skor dalam variabel bin. Namun, kami hanya akan memiliki satu papan skor yang terkait dengan setiap bin. Oleh karena itu, kami akan menyediakan konstanta kenyamanan ONE_BIN sebagai parameter ke AddBins prosedur. Ini akan menginisialisasi CovPType variabel dengan satu bin masing-masing. Papan skor yang diwakili oleh tempat sampah dianggap tertutup ketika peristiwa yang mereka pantau telah terjadi setidaknya satu kali.

Membuat input acak

Mari kita mulai dengan membuat proses yang menghasilkan data input ke DUT. Buffer cincin FIFO dirancang untuk mengabaikan upaya penimpaan dan pembacaan berlebihan. Oleh karena itu, kita cukup menulis data acak dalam semburan durasi acak. Kita tidak perlu memikirkan apakah DUT benar-benar siap menyerap data atau tidak.

  PROC_WRITE : process
  begin
    wr_en <= rv.RandSlv(1)(1) and not rst;

    for i in 0 to rv.RandInt(0, 2 * RAM_DEPTH) loop
      wr_data <= rv.RandSlv(RAM_WIDTH);
      wait until rising_edge(clk);
    end loop;
  end process;

Satu-satunya pertimbangan yang diambil proses ini adalah bahwa DUT tidak di-reset. Kami secara acak mengaktifkan atau menonaktifkan sinyal pengaktifan tulis di baris pertama proses ini, tetapi hanya akan diaktifkan jika rst adalah '0' .

For-loop berikutnya akan menulis data acak ke DUT untuk jumlah siklus clock acak, bahkan jika sinyal pengaktifan tidak aktif. Kita bisa melakukan ini karena DUT seharusnya mengabaikan wr_data port kecuali wr_en sinyal '1' . Setelah for-loop, program akan mengulang kembali ke awal proses, memicu transaksi penulisan acak lainnya.

Melakukan pembacaan acak

Proses yang membaca data dari DUT mirip dengan proses menulis. Kami dapat secara acak mengaktifkan rd_en sinyal setiap saat karena DUT dirancang untuk mengabaikan upaya membaca saat kosong. Data yang muncul pada rd_data port sebenarnya tidak diperiksa. Proses ini hanya mengontrol sinyal aktifkan baca.

  PROC_READ : process
  begin
    rd_en <= rv.RandSlv(1)(1) and not rst;

    for i in 0 to rv.RandInt(0, 2 * RAM_DEPTH) loop
      wait until rising_edge(clk);
    end loop;
  end process;

Verifikasi perilaku

Kami akan membangun model perilaku DUT dalam testbench kami untuk memverifikasi perilakunya. Ini adalah strategi testbench yang terkenal. Pertama, kami memberi makan model perilaku secara bersamaan dengan input yang sama dengan DUT. Kemudian, kita dapat membandingkan output dari keduanya untuk memeriksa apakah DUT memiliki perilaku yang benar.

Gambar di atas menunjukkan tata letak dasar dari testbench tersebut. Model perilaku bekerja secara paralel dengan DUT. Kami menggunakannya sebagai cetak biru untuk memeriksa keluaran dari DUT.

FIFO bangku ujian

Kami akan menggunakan daftar tertaut untuk menerapkan model perilaku. Daftar tertaut tidak dapat disintesis, tetapi sangat cocok untuk testbenches. Anda mungkin ingat Cara membuat Daftar Tertaut di VHDL artikel jika Anda adalah pembaca tetap blog ini. Kami akan menggunakan kode darinya untuk mengimplementasikan model perilaku untuk ring buffer FIFO.

package DataStructures is
   type LinkedList is protected
 
      procedure Push(constant Data : in integer);
      impure function Pop return integer;
      impure function IsEmpty return boolean;
 
   end protected;
end package DataStructures;

Deklarasi paket untuk FIFO Daftar Tertaut ditunjukkan pada kode di atas. Ini adalah tipe yang dilindungi yang memiliki tiga fungsi; Push, Pop, dan IsEmpty. Ini digunakan untuk menambahkan dan menghapus elemen dari FIFO, serta untuk memeriksa apakah ada elemen nol yang tersisa di dalamnya.

  -- Testbench FIFO that emulates the DUT
  shared variable fifo : LinkedList;

Jenis yang dilindungi adalah konstruksi seperti kelas di VHDL. Kami akan membuat objek dari linked list dengan mendeklarasikan variabel bersama di wilayah deklaratif dari testbench, seperti yang ditunjukkan pada kode di atas.

Model perilaku

Untuk sepenuhnya meniru perilaku buffer cincin FIFO, kami mendeklarasikan dua sinyal baru yang mencerminkan sinyal output DUT. Sinyal pertama berisi data keluaran dari model perilaku, dan yang kedua adalah sinyal valid terkait.

  -- Testbench FIFO signals
  signal fifo_out : integer;
  signal fifo_out_valid : std_logic := '0';

Kode di atas menunjukkan deklarasi dua sinyal keluaran dari model perilaku. Kami tidak memerlukan sinyal input khusus untuk model perilaku, karena mereka sama dengan yang terhubung ke DUT. Kami menggunakan sinyal untuk meniru keluaran DUT karena memungkinkan kami mengumpulkan data cakupan dengan mudah, seperti yang akan kita lihat nanti di artikel ini.

PROC_BEHAVIORAL_MODEL : process
begin
  wait until rising_edge(clk) and rst = '0';

  -- Emulate a write
  if wr_en = '1' and full = '0' then
    fifo.Push(to_integer(unsigned(wr_data)));
    report "Push " & integer'image(to_integer(unsigned(wr_data)));
  end if;
    
  -- Emulate a read
  if rd_en = '1' and empty = '0' then
    fifo_out <= fifo.Pop;
    fifo_out_valid <= '1';
  else
    fifo_out_valid <= '0';
  end if;
  
end process;

Proses yang mengimplementasikan model perilaku ring buffer FIFO ditunjukkan pada kode di atas. Proses ini akan dipicu pada setiap peningkatan jam, jika sinyal reset tidak aktif.

Model perilaku mendorong nilai baru ke FIFO testbench setiap kali wr_en sinyal ditegaskan saat full sinyal '0' . Demikian pula, logika baca dalam proses model perilaku bekerja dengan mendengarkan rd_en dan empty sinyal. Yang terakhir dikendalikan oleh DUT, tetapi kami akan memverifikasi bahwa itu berfungsi dalam proses selanjutnya yang akan kami buat.

Memeriksa keluaran

Semua logika yang bertanggung jawab untuk memeriksa output DUT dikumpulkan dalam proses bernama «PROC_VERIFY». Kami menggunakan pernyataan tegas untuk memeriksa apakah keluaran DUT cocok dengan keluaran dari model perilaku. Kami juga memeriksa apakah DUT dan model perilaku setuju ketika FIFO kosong.

Kode untuk proses verifikasi ditunjukkan di bawah ini.

PROC_VERIFY : process
begin
  wait until rising_edge(clk) and rst = '0';
  
  -- Check that DUT and TB FIFO are reporting empty simultaneously
  assert (empty = '1' and fifo.IsEmpty) or
         (empty = '0' and not fifo.IsEmpty)
    report "empty=" & std_logic'image(empty) 
      & " while fifo.IsEmpty=" & boolean'image(fifo.IsEmpty)
    severity failure;

  -- Check that the valid signals are matching
  assert rd_valid = fifo_out_valid
    report "rd_valid=" & std_logic'image(rd_valid) 
      & " while fifo_out_valid=" & std_logic'image(fifo_out_valid)
    severity failure;

  -- Check that the output from the DUT matches the TB FIFO
  if rd_valid then
    assert fifo_out = to_integer(unsigned(rd_data))
      report "rd_data=" & integer'image(to_integer(unsigned(rd_data)))
        & " while fifo_out=" & integer'image(fifo_out)
      severity failure;
      report "Pop " & integer'image(fifo_out);
  end if;

end process;

Proses ini dipicu oleh naiknya tepi jam, seperti yang dapat kita lihat dari baris kode pertama. DUT adalah proses clock, dan logika downstream yang terhubung ke DUT juga diharapkan sinkron dengan sinyal clock. Oleh karena itu, masuk akal untuk memeriksa output pada tepi jam yang meningkat.

Blok kode kedua memeriksa apakah empty sinyal yang datang dari DUT ditegaskan hanya ketika FIFO testbench kosong. DUT dan model perilaku keduanya harus setuju bahwa FIFO kosong atau tidak untuk lulus tes ini.

Kemudian berikut perbandingan data yang dibaca sinyal valid. DUT dan model perilaku harus mengeluarkan data secara bersamaan, jika tidak ada yang salah.

Terakhir, kami memeriksa apakah data keluaran dari DUT cocok dengan elemen berikutnya yang kami keluarkan dari FIFO testbench. Ini, tentu saja, hanya terjadi jika rd_valid sinyal ditegaskan, artinya rd_data sinyal dapat diambil sampelnya.

Mengumpulkan data cakupan

Untuk mengontrol aliran utama testbench, kami akan membuat proses sequencer. Proses ini akan menginisialisasi tempat cakupan, menjalankan tes, dan menghentikan testbench ketika semua tujuan cakupan telah terpenuhi. Kode di bawah ini menunjukkan proses «PROC_SEQUENCER» yang lengkap.

PROC_SEQUENCER : process
begin

  -- Set up coverage bins
  bin1.AddBins("Write while empty", ONE_BIN);
  bin2.AddBins("Read while full", ONE_BIN);
  bin3.AddBins("Read and write while almost empty", ONE_BIN);
  bin4.AddBins("Read and write while almost full", ONE_BIN);
  bin5.AddBins("Read without write when almost empty", ONE_BIN);
  bin6.AddBins("Write without read when almost full", ONE_BIN);

  wait until rising_edge(clk);
  wait until rising_edge(clk);
  rst <= '0';
  wait until rising_edge(clk);

  loop
    wait until rising_edge(clk);

    -- Collect coverage data
    bin1.ICover(to_integer(wr_en = '1' and empty = '1'));
    bin2.ICover(to_integer(rd_en = '1' and full = '1'));
    bin3.ICover(to_integer(rd_en = '1' and wr_en = '1' and
                           empty = '0' and empty_next = '1'));
    bin4.ICover(to_integer(rd_en = '1' and wr_en = '1' and
                           full = '0' and full_next = '1'));
    bin5.ICover(to_integer(rd_en = '1' and wr_en = '0' and
                           empty = '0' and empty_next = '1'));
    bin6.ICover(to_integer(rd_en = '0' and wr_en = '1' and
                           full = '0' and full_next = '1'));

    -- Stop the test when all coverage goals have been met
    exit when
      bin1.IsCovered and
      bin2.IsCovered and
      bin3.IsCovered and
      bin4.IsCovered and
      bin5.IsCovered and
      bin6.IsCovered;
  end loop;
  
  report("Coverage goals met");

  -- Make sure that the DUT is empty before terminating the test
  wr_en <= force '0';
  rd_en <= force '1';
  loop
    wait until rising_edge(clk);
    exit when empty = '1';
  end loop;

  -- Print coverage data
  bin1.WriteBin;
  bin2.WriteBin;
  bin3.WriteBin;
  bin4.WriteBin;
  bin5.WriteBin;
  bin6.WriteBin;
  
  finish;
end process;

Pertama, kita menginisialisasi objek coverage bin dengan memanggil AddBins prosedur pada mereka, seperti yang telah kita bahas sebelumnya di artikel ini. Kemudian, setelah reset dirilis, kami melanjutkan untuk mengumpulkan data cakupan. Di setiap sisi naik jam, kode di dalam konstruksi loop akan dijalankan.

Blok kode pertama di dalam loop adalah untuk mengumpulkan data cakupan. Kami dapat menghubungi ICover prosedur di nampan untuk merekam hit pada titik cakupan yang diwakilinya. Jika kita menyediakan parameter integer 0 , panggilan tidak akan berpengaruh. Jika kita menggunakan parameter integer 1 , itu akan dihitung sebagai klik.

Hanya ada satu «bin» di dalam setiap objek cakupan bin, karena kami menginisialisasinya menggunakan ONE_BIN konstan. Tempat sampah tunggal ini dapat dijangkau dengan menelepon ICover(1) . Kita dapat mendaftarkan hit atau miss pada titik cakupan dengan mengubah ekspresi Boolean kita menjadi bilangan bulat 1 atau 0 menggunakan to_integer fungsi

Setelah data cakupan direkam, kami memeriksa apakah semua tujuan cakupan telah terpenuhi dengan memanggil IsCovered berfungsi di semua tempat sampah. Kemudian, kita keluar dari loop jika semua sasaran cakupan telah terpenuhi.

Kami akan memastikan bahwa DUT kosong sebelum mengakhiri tes. Untuk mencapai ini, kami mengambil alih kendali dari proses penulis dan pembaca dengan memaksa wr_en sinyal ke '0' dan rd_en sinyal ke '1' .

Terakhir, kami mencetak statistik berapa kali setiap sasaran cakupan tercapai dengan memanggil WriteBin fungsi pada masing-masing nampan cakupan. finish kata kunci di akhir proses akan menyebabkan simulator menghentikan simulasi.

Menjalankan testbench

Anda dapat mengunduh seluruh proyek ModelSim dengan semua file VHDL dengan menggunakan formulir di bawah ini.

Setelah kita memuat proyek dengan menjalankan file do yang disertakan dalam Zip, kita dapat menjalankan testbench hanya dengan mengetikkan «runtb» di konsol ModelSim. Waktu pelaksanaan testbench akan acak karena tujuan cakupan dipukul secara acak. Namun, hasil tes dapat direproduksi karena sebenarnya urutan pseudo-acak yang digunakan.

Kami tidak menginisialisasi seed dalam kode kami, artinya nilai seed default akan digunakan untuk generator pseudo-acak. Anda dapat menyetel benih yang berbeda dengan memanggil InitSeed prosedur pada RandomPType objek, ini akan menghasilkan urutan acak yang berbeda.

Keluaran konsol

Output yang dicetak ke konsol ModelSim setelah kami memberikan perintah «runtb» ditunjukkan di bawah ini. Akan ada banyak dorongan acak ke dan muncul dari FIFO testbench saat simulasi sedang berjalan.

VSIM 2> runtb
# ** Warning: Design size of 15929 statements or 2 leaf instances exceeds
#             ModelSim PE Student Edition recommended capacity.
# Expect performance to be quite adversely affected.
# ** Note: Push 34910
#    Time: 790 ns  Iteration: 0  Instance: /ring_buffer_tb
...
# ** Note: Pop 37937
#    Time: 83100 ns  Iteration: 0  Instance: /ring_buffer_tb
# ** Note: Pop 13898
#    Time: 83110 ns  Iteration: 0  Instance: /ring_buffer_tb
# %% WriteBin: 
# %% Write while empty  Bin:(1)   Count = 2  AtLeast = 1
# 
# %% WriteBin: 
# %% Read while full  Bin:(1)   Count = 3  AtLeast = 1
# 
# %% WriteBin: 
# %% Read and write while almost empty  Bin:(1)   Count = 106  AtLeast = 1
# 
# %% WriteBin: 
# %% Read and write while almost full  Bin:(1)   Count = 1  AtLeast = 1
# 
# %% WriteBin: 
# %% Read without write when almost empty  Bin:(1)   Count = 1  AtLeast = 1
# 
# %% WriteBin: 
# %% Write without read when almost full  Bin:(1)   Count = 3  AtLeast = 1
#
# Break in Process PROC_SEQUENCER at C:/crv/ring_buffer_tb.vhd line 127

Statistik untuk semua nampan cakupan dicetak ketika semua sasaran cakupan telah terpenuhi. Beberapa tempat sampah hanya terkena satu kali, sementara satu telah dipukul 106 kali. Tetapi pada akhirnya, setiap tempat sampah telah terkena setidaknya satu kali. Dengan demikian, kami dapat mengetahui bahwa semua peristiwa yang telah kami tentukan untuk tempat cakupan telah diuji dan diverifikasi.

Bentuk gelombang

Mari kita periksa bentuk gelombang untuk mendapatkan gambaran tentang apa yang telah dilakukan oleh testbench. Gambar di bawah menunjukkan bentuk gelombang dengan fill_count sinyal direpresentasikan sebagai nilai analog. FIFO penuh ketika jejak untuk sinyal ini berada di atas, dan kosong ketika berada di bawah.

Seperti yang dapat kita lihat dari bentuk gelombang, buffer cincin diisi dan dikosongkan secara acak. Namun, kami tidak secara eksplisit memprogram kemiringan dan penurunan tingkat pengisian ini. Namun demikian, kami melihat pola interaksi organik dengan DUT.

Selengkapnya tentang verifikasi acak terbatas

Verifikasi acak terkendala adalah strategi testbench yang baik ketika vektor uji memiliki terlalu banyak permutasi untuk uji lengkap agar praktis. Interaksi acak menunjukkan perilaku yang lebih alami daripada uji kasus sudut terarah, tanpa mengorbankan akurasi.

Kita bisa yakin bahwa semua corner case telah terpenuhi, asalkan kita telah mengatur pendataan coverage dengan benar. Manfaat tambahannya adalah bahwa pengujian acak lebih cenderung mengekspos kelemahan dalam DUT yang tidak secara khusus Anda uji. Selama Anda mengetahui semua kasus sudut, Anda dapat membuat tes terarah untuk mereka. Tapi kasus sudut mudah diabaikan, dan saat itulah Anda bisa mendapatkan keuntungan dari metodologi verifikasi acak terbatas.

Artikel ini hanya menggores permukaan dari apa yang dapat Anda lakukan dengan verifikasi acak terbatas. Saya sarankan membaca dokumen di halaman OSVVM GitHub untuk menggali lebih dalam subjek.

Saya juga merekomendasikan kursus Advanced VHDL Testbenches and Verification dari SynthWorks, yang tidak berafiliasi dengan saya. Namun, saya telah menghadiri versi 5 hari dari kursus fisik ini. Kursus ini diajarkan oleh Jim Lewis, ketua VHDL Analysis and Standardization Group (VASG). Secara keseluruhan, investasi yang bagus untuk perusahaan mana pun yang ingin membawa bangku uji VHDL mereka ke tingkat berikutnya.


VHDL

  1. Irama kecepatan miliar gerbang verifikasi SoC
  2. Siemens menambahkan ke Veloce untuk verifikasi bantuan perangkat keras yang mulus
  3. Synopsys memungkinkan desain multi-die dengan IP HBM3 dan verifikasi
  4. Kontrol akses dengan QR, RFID, dan verifikasi suhu
  5. Sisi pemeliharaan yang tidak nyaman, tidak terduga, dan acak
  6. Cara Menghasilkan Angka Acak di Jawa
  7. Java 8 - Aliran
  8. Kontrol Fitur Bubut Tempat Tidur Miring Dengan Grafik Verifikasi
  9. Pemrosesan Isometrik Diferensial dan Verifikasi Simulasi Desain PCB Berkecepatan Tinggi
  10. Program Verifikasi Kinerja CAGI untuk Kompresor Rotary