Altifigence Academy

21 / 37 · Konsep

function automatic dan ekspresi pakai ulang

Tulis fungsi tanpa waktu simulasi serta periksa lebar, tanda dan kemandirian acuan.

Gunakan ulang hitungan tanpa menyembunyikan kontrak

Fungsi SystemVerilog mengembalikan nilai tanpa mengonsumsi waktu simulasi. Dalam RTL kombinasional yang dapat disintesis, gunakan masukan eksplisit, tugaskan keluaran pada setiap jalur dan jangan sertakan delay atau kontrol kejadian. automatic memisahkan argumen dan variabel lokal setiap pemanggilan, tanpa register atau siklus tambahan. Perulangan tetap menghitung XOR delapan bit sebagai paritas kombinasional.

SystemVerilog
module parity_function (
  input  logic [7:0] data,
  output logic       parity,
  output logic [7:0] with_parity
);
  function automatic logic parity8(input logic [7:0] value);
    logic p;
    integer bit_index;
    begin
      p = 1'b0;
      for (bit_index = 0; bit_index < 8; bit_index = bit_index + 1)
        p = p ^ value[bit_index];
      parity8 = p;
    end
  endfunction
  assign parity = parity8(data);
  assign with_parity = {data[6:0], parity8(data)};
endmodule

with_parity membuang data[7] lalu menambahkan paritas: tetap delapan bit, bukan pengkodean sembilan bit yang mempertahankan seluruh masukan. Fungsi dapat benar tetapi pemanggil kehilangan informasi.

Lebar dan tanda nilai balik

Keluaran adalah logic satu bit. Jumlah dua masukan tanpa tanda delapan bit yang mempertahankan carry memerlukan sembilan bit nilai balik. Pemanggilan fungsi tidak otomatis memperlebar tujuan. Letakkan aturan lebar dan konstanta dekat antarmuka; hindari ketergantungan tersembunyi pada sinyal global berubah-ubah yang mempersulit penggunaan ulang dan pengujian.

Pemanggilan bukan berbagi secara serial

Dua pemanggilan tidak memaksa sintesis membuat satu operator yang dipakai bergiliran. Alat dapat mengoptimalkan logika kombinasional; berbagi serial memerlukan penerimaan, keadaan dan waktu hasil. Jangan simpulkan luas atau throughput dari jumlah panggilan. Task testbench boleh menunggu kejadian; fungsi dan task berwaktu memiliki tugas berbeda. Pelajaran berikut memakai task untuk stimulus pada tepi turun dan pengamatan setelah naik.

Praktik: acuan berbeda

data=0,1,3,8'h80,8'hFF harus memberi paritas 0,1,0,1,0. Untuk 8'h80, with_parity=8'h01 karena bit tinggi dibuang dan parity=1. Uji semua 256 nilai dengan menghitung bit aktif sebagai integer lalu sisa bagi 2, tanpa memanggil parity8 dari DUT. Ganti batas loop menjadi 7:8'h80 harus gagal, walau nilai rendah tidak menunjukkan cacat. Setelah itu ubah keluaran menjadi sembilan bit {data, parity8(data)} dan perbarui model: ini perubahan antarmuka, bukan format.

Pilihan berlaku di peramban ini. Ubah kapan saja di bagian bawah halaman.