Altifigence Academy

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.

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.

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 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.

Lựa chọn áp dụng cho trình duyệt này. Có thể đổi ở chân trang bất cứ lúc nào.