Mã có thể tổng hợp và mã không thể tổng hợp (Synthesizable vs. Non-Synthesizable Code)

Mã có thể tổng hợp và mã không thể tổng hợp (Synthesizable vs. Non-Synthesizable Code)

Tìm hiểu cách viết mã có thể chạy trên FPGA hoặc ASIC.

Khi viết mã Verilog hoặc VHDL, bạn đang viết mã sẽ được tổng hợp thành các cổng logic, thanh ghi, RAM và các phần tử phần cứng khác. Chương trình thực hiện quá trình này được gọi là công cụ tổng hợp (synthesis tool). Nhiệm vụ của công cụ tổng hợp là chuyển đổi mã Verilog hoặc VHDL thành một cấu trúc phần cứng có thể được triển khai trên FPGA. Tuy nhiên, một số cấu trúc trong Verilog và VHDL không thể được tổng hợp thành phần cứng. Mã sử dụng những cấu trúc này được gọi là mã không thể tổng hợp (non-synthesizable code).

Vậy tại sao các ngôn ngữ này lại hỗ trợ những cấu trúc không thể tổng hợp? Lý do là chúng giúp testbench (môi trường kiểm thử mô phỏng) trở nên mạnh mẽ và linh hoạt hơn. Khi viết testbench để mô phỏng, việc sử dụng các cấu trúc không thể tổng hợp thường giúp đơn giản hóa quá trình kiểm thử và cho phép thực hiện các thao tác dễ dàng hơn.

Câu lệnh trì hoãn

Một trong những ví dụ cơ bản nhất về mã không thể tổng hợp là câu lệnh trì hoãn. FPGA không thể trực tiếp thực hiện một lệnh chờ theo thời gian mô phỏng, chẳng hạn như chờ 10 ns. Thay vào đó, để tạo ra khoảng thời gian trễ xác định trong phần cứng, bạn thường cần sử dụng tín hiệu xung nhịp và các flip-flop kết hợp với bộ đếm. Dưới đây là ví dụ về cách chuyển đổi mã có câu lệnh trì hoãn thành mã có thể tổng hợp bằng công cụ tổng hợp phần cứng.

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

‍
Câu lệnh lặp

Một loại cấu trúc khác mà các nhà thiết kế mạch số mới vào nghề thường sử dụng chưa đúng cách là các câu lệnh lặp, chẳng hạn như while, for và repeat. Trong mã có thể tổng hợp, vòng lặp không hoạt động giống như vòng lặp trong các ngôn ngữ lập trình phần mềm như C. Đây là một trong những vấn đề lớn mà các nhà thiết kế phần cứng mới thường gặp phải. Họ đã quen với việc sử dụng vòng lặp for trong C nên cho rằng vòng lặp trong Verilog và VHDL cũng hoạt động tương tự.

Cần lưu ý rằng vòng lặp trong mô tả phần cứng không hoạt động giống như vòng lặp trong phần mềm. Trong quá trình tổng hợp, vòng lặp có thể được khai triển thành nhiều phần tử phần cứng hoặc nhiều phép toán được kết nối với nhau, thay vì được thực thi tuần tự như một chương trình phần mềm. Vì vậy, bạn cần hiểu rõ cách thức hoạt động của từng loại vòng lặp trước khi sử dụng chúng trong thiết kế phần cứng.

Hiểu rõ sự khác biệt giữa mã có thể tổng hợp và mã không thể tổng hợp là điều rất quan trọng đối với một nhà thiết kế mạch số. Khi viết mã nhằm triển khai trên FPGA, hãy sử dụng các cấu trúc được công cụ tổng hợp hỗ trợ và bảo đảm rằng chúng mô tả đúng phần cứng mong muốn.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat. Aenean faucibus nibh et justo cursus id rutrum lorem imperdiet. Nunc ut sem vitae risus tristique posuere.

Win a Raspberry Pi!

Answer 5 questions for your chance to win!
Question 1

What color is the sky?

Tìm kiếm bằng danh mục

Chọn danh mục