21 / 37 · Konsep
function automatic dan ekspresi pakai ulang
Tulis fungsi tanpa waktu simulasi serta periksa lebar, tanda dan kemandirian acuan.
Pelajaran dapat dibaca gratis. Daftar untuk menyimpan progres.
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.
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)};
endmodulewith_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.