hạn chế thời gian cho các mạch đồng bộ hóa xe buýt


10

Tôi có một mạch đồng bộ hóa xe buýt để vượt qua một thanh ghi rộng trên các miền đồng hồ.

Tôi sẽ cung cấp một mô tả đơn giản hóa, bỏ qua logic đặt lại không đồng bộ.

Dữ liệu được tạo ra trên một đồng hồ. Các bản cập nhật có rất nhiều (ít nhất một chục) cạnh đồng hồ:

PROCESS (src_clk)
BEGIN
   IF RISING_EDGE(clock) THEN
      IF computation_done THEN
          data <= computation;
          ready_spin <= NOT ready_spin;
      END IF;
   END IF;
END PROCESS;

Tín hiệu điều khiển cho dữ liệu mới, được mã hóa NRZI (vì vậy một từ hợp lệ trên bus tương ứng với chuyển đổi trên tín hiệu điều khiển). Tín hiệu điều khiển đi qua chuỗi DFF hoạt động như một bộ đồng bộ hóa.

PROCESS (dest_clk)
BEGIN
   IF RISING_EDGE(dest_clk) THEN
      ready_spin_q3 <= ready_spin_q2;
      ready_spin_q2 <= ready_spin_q1;
      ready_spin_q1 <= ready_spin;
   END IF;
END PROCESS;

Mạch đồng bộ hóa giới thiệu độ trễ ngắn, cung cấp nhiều thời gian để bus dữ liệu ổn định; bus dữ liệu được lấy mẫu trực tiếp mà không có rủi ro về tính di động:

PROCESS (dest_clk)
BEGIN
   IF RISING_EDGE(dest_clk) THEN
      IF ready_spin_q3 /= ready_spin_q2 THEN
         rx_data <= data;
      END IF;
   END IF;
END PROCESS;

Điều này biên dịch và hoạt động tốt khi được tổng hợp thành một Cyclone II FPGA. Tuy nhiên, TimeQuest báo cáo thiết lập và giữ vi phạm thời gian, vì nó không nhận ra trình đồng bộ hóa. Tệ hơn, hướng dẫn sử dụng Quartus nói

Tập trung vào việc cải thiện các con đường cho thấy sự chậm chạp tồi tệ nhất. Fitter làm việc chăm chỉ nhất trên những con đường với sự chậm chạp tồi tệ nhất. Nếu bạn sửa các đường dẫn này, Fitter có thể cải thiện các đường dẫn thời gian thất bại khác trong thiết kế.

Vì vậy, tôi muốn thêm các ràng buộc thời gian phù hợp vào dự án của mình để Quartus sẽ dành nỗ lực Fitter của mình cho các lĩnh vực khác của thiết kế.

Tôi khá chắc chắn đó set_multicycle_pathlà lệnh SDC (Synopsis Design Constraint) thích hợp, vì các dòng dữ liệu sẽ có nhiều chu kỳ của đồng hồ đích để ổn định, nhưng tôi không thể tìm thấy bất kỳ ví dụ hoàn chỉnh nào sử dụng lệnh này để mô tả logic vượt qua miền đồng hồ .

Tôi thực sự đánh giá cao một số hướng dẫn về cách viết các ràng buộc thời gian SDC cho đồng bộ hóa. Nếu bạn thấy một vấn đề với phương pháp này, xin vui lòng cho tôi biết điều đó.


Chi tiết đồng hồ:

Trình tạo đồng hồ bên ngoài: Hai kênh, refclk = 20 MHz, refclk2 = refclk / 2 (10 MHz và có liên quan).

Altera PLL: src_clk = refclk * 9/5 = 36 MHz

Altera PLL: Dest_clk = refclk2 * 10 = 100 MHz

Tôi cũng có dữ liệu đi theo hướng khác, với 100 MHz src_clk và 36 MHz Dest_clk.


TL; DR: các ràng buộc thời gian SDC chính xác cho mã trên là gì?


1
Điều này sẽ tốt hơn trên trang web Thiết kế đồ họa được đề xuất nhưng đề xuất đó chưa đạt đến phiên bản beta.
Ben Voigt

Bạn có thể đăng định nghĩa đồng hồ cho src_clk và Dest_clk không? Chúng có liên quan theo bất kỳ cách nào (bội số đồng bộ)? Nếu chúng không liên quan đến đồng hồ thì nên sử dụng set_false_path trong tình huống này.
Andy

@Andy: Tôi đã thêm một số chi tiết. Cảm ơn đã giúp với điều này.
Ben Voigt

Câu trả lời:


9

Tôi không có kinh nghiệm với Quartus, vì vậy hãy coi đây là lời khuyên chung.

Khi làm việc trên các đường dẫn giữa các miền đồng hồ, các công cụ thời gian sẽ mở rộng đồng hồ thành bội số chung nhỏ nhất của chúng và chọn cặp cạnh gần nhất.

Đối với các đường dẫn từ đồng hồ 36 MHz (27.777 ns) đến đồng hồ 100 MHz (10 ns), nếu tôi thực hiện các phép tính nhanh của mình một cách chính xác, cặp cạnh tăng gần nhất là 138.888 ns trên đồng hồ nguồn và 140 ns trên đồng hồ đích. Đó thực sự là một ràng buộc 900 MHz cho những đường dẫn đó! Tùy thuộc vào làm tròn (hoặc cho đồng hồ không có mối quan hệ), nó có thể đi ra tồi tệ hơn thế.

Có ít nhất ba cách để viết các ràng buộc cho cấu trúc này. Tôi sẽ gọi đồng hồ fast_clkslow_clknhư tôi nghĩ điều đó rõ ràng hơn để minh họa.

Tùy chọn 1: vô hiệu hóa thời gian với set_false_path

Giải pháp đơn giản nhất là sử dụng set_false_pathđể vô hiệu hóa thời gian giữa các đồng hồ:

set_false_path -from [get_clocks fast_clk] -to [get_clocks slow_clk]
set_false_path -from [get_clocks slow_clk] -to [get_clocks fast_clk]

Điều này không hoàn toàn chính xác, vì có các yêu cầu về thời gian để bộ đồng bộ hóa hoạt động chính xác. Nếu việc thực hiện vật lý làm trì hoãn dữ liệu quá nhiều so với tín hiệu điều khiển, thì bộ đồng bộ hóa sẽ không hoạt động. Tuy nhiên, vì không có bất kỳ logic nào trên đường dẫn, không chắc rằng ràng buộc thời gian sẽ bị vi phạm. set_false_paththường được sử dụng cho loại cấu trúc này, ngay cả trong các ASIC, trong đó nỗ lực so với sự đánh đổi rủi ro đối với các thất bại có xác suất thấp là thận trọng hơn so với các GPU.

Tùy chọn 2: thư giãn các ràng buộc với set_multicycle_path

Bạn có thể cho phép thêm thời gian cho một số đường dẫn nhất định với set_multicycle_path. Thông thường hơn là sử dụng các đường dẫn nhiều bánh xe với các đồng hồ liên quan chặt chẽ (ví dụ: tương tác đồng hồ 1X và 2X), nhưng nó sẽ hoạt động ở đây nếu công cụ hỗ trợ đủ.

set_multicycle_path 2 -from [get_clocks slow_clk] -to [get_clocks fast_clk] -end -setup
set_multicycle_path 1 -from [get_clocks slow_clk] -to [get_clocks fast_clk] -end -hold

Mối quan hệ cạnh mặc định để thiết lập là chu kỳ đơn, tức là set_multicycle_path 1. Các lệnh này cho phép thêm một chu kỳ của đồng hồ điểm cuối ( -end) cho các đường dẫn thiết lập. Việc -holdđiều chỉnh với số một ít hơn ràng buộc thiết lập hầu như luôn luôn cần thiết khi thiết lập các đường dẫn đa chu kỳ, để xem chi tiết bên dưới.

Để hạn chế các đường dẫn theo hướng khác tương tự (nới lỏng các ràng buộc theo một khoảng thời gian của đồng hồ nhanh hơn), hãy đổi -endthành -start:

set_multicycle_path 2 -from [get_clocks fast_clk] -to [get_clocks slow_clk] -start -setup
set_multicycle_path 1 -from [get_clocks fast_clk] -to [get_clocks slow_clk] -start -hold

Tùy chọn 3: chỉ định yêu cầu trực tiếp với set_max_delay

Điều này tương tự như hiệu ứng của set_multicycle_pathnhưng tiết kiệm phải suy nghĩ thông qua các mối quan hệ cạnh và ảnh hưởng đến các ràng buộc giữ.

set_max_delay 10 -from [get_clocks fast_clk] -to [get_clocks slow_clk]
set_max_delay 10 -from [get_clocks slow_clk] -to [get_clocks fast_clk]

Bạn có thể muốn ghép cái này với set_min_delaykiểm tra giữ hoặc để lại kiểm tra giữ mặc định. Bạn cũng có thể làm set_false_path -holdđể vô hiệu hóa kiểm tra giữ, nếu công cụ của bạn hỗ trợ nó.


Thông tin chi tiết về lựa chọn cạnh cho đường dẫn nhiều chu kỳ

Để hiểu điều chỉnh giữ được ghép nối với mỗi điều chỉnh thiết lập, hãy xem xét ví dụ đơn giản này với mối quan hệ 3: 2. Mỗi chữ số đại diện cho một cạnh đồng hồ tăng:

1     2     3
4   5   6   7

Kiểm tra thiết lập mặc định sử dụng các cạnh 2 và 6. Kiểm tra giữ mặc định sử dụng các cạnh 1 và 4.

Áp dụng ràng buộc nhiều chu kỳ là 2 với -endđiều chỉnh thiết lập mặc định và kiểm tra giữ để sử dụng cạnh tiếp theo sau khi sử dụng ban đầu, nghĩa là kiểm tra thiết lập hiện sử dụng các cạnh 2 và 7 và kiểm tra giữ sử dụng các cạnh 1 và 5. Đối với hai đồng hồ ở cùng tần số, điều chỉnh này có ý nghĩa - mỗi lần khởi chạy dữ liệu tương ứng với một lần chụp dữ liệu và nếu cạnh chụp được di chuyển ra một, kiểm tra giữ cũng sẽ di chuyển ra một. Loại ràng buộc này có thể có ý nghĩa đối với hai nhánh của một đồng hồ nếu một trong các nhánh có độ trễ lớn. Tuy nhiên, đối với tình huống ở đây, kiểm tra giữ bằng cách sử dụng các cạnh 1 và 5 là không mong muốn, vì cách duy nhất để khắc phục là thêm toàn bộ chu kỳ trễ của đồng hồ trên đường dẫn.

Ràng buộc giữ nhiều chu kỳ của 1 (đối với giữ, mặc định là 0) điều chỉnh cạnh của đồng hồ đích uesd để kiểm tra giữ ngược lại một cạnh. Sự kết hợp giữa các ràng buộc MCP thiết lập 2 chu kỳ và các ràng buộc MCP giữ 1 chu kỳ sẽ dẫn đến kiểm tra thiết lập sử dụng các cạnh 2 và 7 và kiểm tra giữ bằng các cạnh 1 và 4.


2

Tôi không biết câu trả lời cho Altera, nhưng ở Xilinx Land, bạn có thể đặt thời gian trễ từ một miền đồng hồ sang miền tiếp theo. Bạn sẽ phải làm việc toán học (nó phụ thuộc vào thiết kế), nhưng nó thường là ngắn nhất trong hai khoảng thời gian. Hãy nghĩ về thời gian này là độ lệch tối đa giữa hai tín hiệu bất kỳ (bao gồm cả tín hiệu điều khiển của bạn) và bạn có thể làm việc nếu mạch đồng bộ hóa của bạn sẽ có thể xử lý nó.

set_mulilot_path không phải là thứ chính xác để sử dụng vì điều đó thường sẽ xử lý các trường hợp khi cả nguồn và đích nằm trên cùng một miền đồng hồ. Một lần nữa, tôi dựa trên kinh nghiệm Xilinx của mình để số dặm của bạn có thể thay đổi.


1

Tôi nghĩ an toàn khi đặt set_false_path trên bộ đồng bộ hóa.

Ngoài ra, bạn có thể đặt "set_global_assocation -name SYNCHRONIZER_IDENTIFICATION AUTO" trong qsf để giúp Quartus phát hiện ra bộ đồng bộ hóa.


Nó sẽ trông như thế nào? set_false_path -from ready_spin -to ready_spin_q2? Và set_false_path -from data -to rx_data?
Ben Voigt

set_false_path -from src_clk -to ready_spinTôi không chắc chắn việc đặt đường dẫn sai trên dữ liệu là phù hợp vì bạn không đồng bộ hóa nó.
fbo

0

Tôi nghi ngờ vấn đề là trong khi bạn có thể biết rằng tín hiệu xe buýt sẽ không thay đổi ở bất cứ đâu gần điểm mà chúng bị khóa, phần mềm không biết điều đó. Đặt cược tốt nhất của bạn là có thể nói rõ với phần mềm rằng các tín hiệu bus đến được đồng bộ hóa với đồng hồ bus và vô hiệu hóa bất kỳ tối ưu hóa nào trước nơi bạn thực sự chốt chúng (một trình tối ưu hóa về mặt lý thuyết có thể thay thế mạch của bạn bằng một mạch tương đương nếu các đầu vào thực sự đồng bộ, nhưng có thể được ném cho một vòng lặp nếu chúng thay đổi theo chu kỳ đồng hồ mà mạch bạn đã vẽ không quan tâm).


Sẽ không phải set_multicycle_pathlà cách để nói cho bộ tổng hợp / bộ phân tích thời gian tần suất các tín hiệu nguồn có thể thay đổi? Và tôi không chắc ý của bạn là "đồng hồ xe buýt", có một tín hiệu xe buýt ở đây băng qua các miền đồng hồ, vậy bạn gọi đồng hồ nào là "đồng hồ xe buýt"? Tôi nghĩ bạn đã đúng rằng vẫn có thể có tính di động nếu trình tổng hợp giới thiệu sự cố trong các khoảng thời gian khi tôi không cập nhật data. Tôi đoán tôi có thể khởi tạo cụ thể các khối DFF ở đó :(
Ben Voigt

@BenVoigt: Tôi nghĩ rằng "set_multilot_path" thường được sử dụng để nói với trình xác nhận thời gian rằng một chuỗi logic tổ hợp giữa hai điểm chốt nên được phép lấy N (Tc) -Ts-Tp (N lần thời gian chu kỳ trừ đi thời gian lấy mẫu thời gian nhân giống) thay vì chỉ Tc-Ts-Th. Tôi không biết làm thế nào một thứ như vậy sẽ tương tác với chốt bởi các đồng hồ khác nhau.
supercat
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.