Bài 6: Mã tổng hợp và mã không tổng hợp được của ngôn ngữ lập trình FPGA

Mã tổng hợp và không thể tổng hợp? - Cách viết mã có thể chạy trên FPGA hoặc ASIC ?

Khi bạn viết mã Verilog hoặc VHDL, sau đó mã sẽ được dịch sang các cổng (Gates), Thanh ghi (Registers), RAM, vv... Chương trình thực hiện tác vụ này được gọi là Công cụ tổng hợp. Đó là công việc của công cụ tổng hợp mã Verilog hoặc VHDL và biến nó thành một cái gì đó mà FPGA có thể hiểu được. Tuy nhiên, có một số phần của ngôn ngữ Verilog và VHDL mà FPGA không thể thực hiện được và được gọi là mã không tổng hợp.

Vậy tại sao lại có ngôn ngữ chứa mã không tổng hợp được? Lý do là, mã không tổng hợp làm cho testbenches của bạn mạnh hơn (testbenches chủ yếu dùng cho mục đích mô phỏng, kiểm tra lỗi, ....) Khi bạn viết một testbench cho mô phỏng, thường sử dụng các cấu trúc mã không tổng hợp làm cho testbench của bạn tốt hơn và cho phép bạn thực hiện mọi việc dễ dàng hơn.

Ví dụ đoạn mã về Delay:

Đoạn mã không tổng hợp cơ bản nhất là câu lệnh Delay. FPGA không có khái niệm về thời gian, do đó không thể bảo ông FPGA hãy đợi tôi 100 nano giây. Thay vào đó, bạn cần phải sử dụng đồng hồ và flip-flops để đạt được mục đích của mình. Dưới đây là một ví dụ về mã không tổng hợp đã được chuyển đổi thành mã có thể được tổng hợp bởi các công cụ.

-- Non-Synthesizable Delay Statement:
r_Enable <= '0';
wait for 100 ns;
r_Enable <= '1';
-- Converted to Synthesizable code (assuming 100 MHz clock):
process (clock)
begin
  if rising_edge(clock) then
    if index < 10 then
      index    <= index + 1;
      r_Enable <= '0';
    else
      index    <= 0;
      r_Enable <= '1';
    end if;
  end if;
end process;

Vòng lặp:

Một đoạn mã khác mà các nhà thiết kế kỹ thuật số thường sử dụng sai là các câu lệnh lặp, chẳng hạn như while, for, repeat, ... Các vòng lặp trong mã synthesizable không thể được sử dụng giống như cách bạn có thể thấy chúng bằng ngôn ngữ phần mềm như C. Đây là một vấn đề lớn mà các nhà phát triển phần cứng mới có. Chúng ta đã nhìn thấy cho các vòng lặp hàng trăm lần trong C, nhưng đừng nghĩ rằng các vòng lặp này giống như trong Verilog và VHDL.

Vì sao? -  Vòng lặp KHÔNG hành xử theo cùng một cách trong phần cứng như trong phần mềm. Cho đến khi bạn hiểu các câu lệnh vòng lặp hoạt động như thế nào thì bạn không nên sử dụng chúng. Biết được sự khác biệt giữa mã synthesizable và không synthesizable là rất quan trọng để trở thành một nhà thiết kế kỹ thuật số tốt. Trên FPGA chỉ sử dụng các lệnh có thể tổng hợp mà thôi!

Chapichuse

Đam mê công nghệ

You may also like...

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *