21 / 37 · Khái niệm
function automatic và biểu thức tái sử dụng
Viết hàm không tiêu thụ thời gian mô phỏng, kiểm tra độ rộng, dấu và tham chiếu độc lập.
Bài học miễn phí. Đăng ký để lưu tiến độ học tập.
Tái sử dụng tính toán nhưng giữ hợp đồng rõ
Hàm SystemVerilog trả giá trị mà không tiêu thụ thời gian mô phỏng. Trong RTL tổ hợp tổng hợp được, dùng đầu vào rõ, gán giá trị trả về trên mọi nhánh, không có delay hay điều khiển sự kiện. automatic tách đối số và biến cục bộ mỗi lần gọi, không thêm thanh ghi hay chu kỳ. Vòng lặp cố định tính XOR tám bit làm parity tổ hợp.
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 bỏ data[7] rồi thêm parity: vẫn tám bit, không phải mã hóa chín bit giữ toàn bộ dữ liệu. Hàm đúng vẫn có thể được gọi theo cách mất thông tin.
Độ rộng và dấu của giá trị trả
Giá trị trả là logic một bit. Cộng hai đầu vào tám bit không dấu, giữ carry, cần chín bit trả về. Gọi hàm không tự mở rộng đích hay giữ carry. Đặt quy tắc độ rộng và hằng gần giao diện; tránh phụ thuộc ẩn vào tín hiệu toàn cục thay đổi, gây khó tái sử dụng và kiểm tra.
Lời gọi không buộc chia sẻ nối tiếp
Hai lời gọi không bắt tổng hợp một bộ tính dùng luân phiên. Công cụ có thể tối ưu logic tổ hợp; chia sẻ nối tiếp cần giao thức nhận, trạng thái và thời điểm kết quả. Không suy ra diện tích hay thông lượng từ số lời gọi. Task trong testbench có thể đợi sự kiện; hàm và task có thời gian có vai trò khác nhau. Bài sau dùng task tạo kích thích ở cạnh xuống và quan sát sau cạnh lên.
Thực hành: tham chiếu khác
data=0,1,3,8'h80,8'hFF phải cho parity 0,1,0,1,0. Với 8'h80, with_parity=8'h01 vì bit cao bị bỏ và parity=1. Thử mọi 256 giá trị bằng đếm bit bật trong số nguyên rồi lấy dư 2, không gọi parity8 của DUT. Đổi giới hạn vòng thành 7:8'h80 phải thất bại, dù giá trị thấp có thể che lỗi. Sau đó mở đầu ra chín bit bằng {data, parity8(data)} và cập nhật mô hình: đổi giao diện, không chỉ định dạng.