Tại sao các chốt được suy luận xấu?


22

Trình biên dịch của tôi phàn nàn về các chốt được suy ra trong các vòng kết hợp của tôi ( always @(*), trong Verilog). Tôi cũng được cho biết rằng tốt nhất nên tránh các chốt được suy luận.

Chính xác thì điều gì là sai với các chốt được suy luận? Họ chắc chắn làm cho các vòng kết hợp dễ viết hơn.


Sẽ rất tốt nếu bao gồm một ví dụ HDL về những gì bạn đang làm
shuckc

Tôi đã nhận thấy câu hỏi này đã được trích dẫn một vài lần gần đây. Đối với bất kỳ ai không phải là chuyên gia theo cách này, lưu ý rằng tất cả các câu trả lời, ngoài Oli Glaser, là một số kết hợp không chính xác và / hoặc không có ích.
EML

Ít hơn là nên tránh các chốt được suy luận và nói chung là nên tránh các chốt trong suốt nói chung trừ khi bạn biết chính xác những gì bạn đang làm an toàn tuyệt đối).
Peter Green

Câu trả lời:


20

"Chốt" khác với "Flip-Flop" ở chỗ FF chỉ thay đổi đầu ra của nó để đáp ứng với cạnh đồng hồ. Một chốt có thể thay đổi đầu ra của nó để đáp ứng với thứ khác ngoài đồng hồ. Ví dụ, SR-Latch có một bộ và đầu vào thiết lập lại và nếu một trong số chúng đang hoạt động thì đầu ra có thể thay đổi. Trong trường hợp SR-FF chỉ đáp ứng với một bộ hoặc đặt lại khi đó cũng có cạnh đồng hồ.

Trong một đồ họa, bạn muốn logic của mình được đồng bộ hóa hoàn toàn. Có nghĩa là tất cả các thành phần lưu trữ (như FF) đều được tạo xung nhịp từ một nguồn đồng hồ duy nhất. Bất cứ điều gì không đồng bộ với đồng hồ đó cần phải được xử lý rất cẩn thận nếu không sẽ xảy ra lỗi thời gian.

Một chốt về cơ bản là một yếu tố lưu trữ không đồng bộ. Nó không có đầu vào đồng hồ, và do đó không thể được đồng bộ hóa với bất kỳ đồng hồ nào. Tôi nên lưu ý rằng có FF với các đầu vào đặt lại và đặt lại không đồng bộ, và các đầu vào này phải được xử lý cẩn thận như các chốt thông thường.

Đi sâu vào tất cả các vấn đề thời gian mà chốt có thể gây ra là vượt xa những gì có thể được đề cập ở đây, nhưng tôi xin đưa ra một ví dụ:

Giả sử bạn có SR-Latch và bạn muốn đặt nó mỗi khi bộ đếm 8 bit đạt đến một giá trị nhất định. Tôi không chắc mã Verilog sẽ là gì, nhưng trong VHDL, mã là: set <= '1' khi Count = "11010010" khác '0'; Tín hiệu đặt đó đi đến đầu vào đã đặt trên SR-Latch của chúng tôi.

Logic được tạo ra hoàn toàn là tổ hợp; một hỗn hợp của cổng và cổng, hoặc cổng và bộ biến tần (Hoặc LUT). Nhưng các đường dẫn tín hiệu thông qua logic tổ hợp đó không phải lúc nào cũng hoàn hảo và tín hiệu "đặt" có thể bị trục trặc trên đó. Đường dẫn tín hiệu qua một nhóm cổng cụ thể có thể mất nhiều thời gian hơn nhóm khác, khiến đầu ra được thiết lập hoạt động trong một thời gian ngắn trước khi đầu ra lắng xuống trạng thái cuối cùng.

Sự cố đầu ra này có thể khiến SR-Latch của chúng ta được thiết lập, mặc dù nó không được phép. Nếu chúng ta chuyển từ SR-Latch sang SR-FF, đồng hồ tắt cùng một đồng hồ với bộ đếm, thì SR-FF sẽ đợi một chu kỳ toàn bộ đồng hồ trước khi thay đổi trạng thái. Về bản chất, nó sẽ chờ tín hiệu đặt ổn định trước khi nhìn vào nó.

Nếu các đường dẫn thông qua logic tổ hợp cho tín hiệu đặt chỉ được định tuyến khác nhau (gây ra độ trễ khác nhau), thì hành vi trục trặc cũng sẽ thay đổi. Logic có thể hoạt động tốt, nhưng sau đó vì bạn đã thay đổi một thứ hoàn toàn không liên quan nên logic này được định tuyến khác và do đó, lỗi xuất hiện. Nhiệt độ và điện áp cũng sẽ thay đổi thời gian tín hiệu, và do đó có thể thay đổi hành vi trục trặc.

Điều này không chắc chắn trong thời gian là lý do tại sao bạn nên tránh chốt trong logic của bạn. FF's an toàn hơn nhiều để sử dụng. Đây là lý do tại sao trình biên dịch của bạn cảnh báo bạn về các chốt, vì rất dễ nhầm lẫn một chốt và bạn có thể không muốn nó ở đó.

Tất nhiên, đôi khi chốt được yêu cầu. Bạn chỉ cần sử dụng chúng rất hiếm khi, chỉ khi hoàn toàn cần thiết, và sau đó bạn phải thiết kế logic đúng để không xảy ra trục trặc.


Tôi hy vọng rằng nếu người ta chỉ định rõ ràng một chốt trong verilog hoặc ngôn ngữ khác và nếu một người thiết kế một mạch sao cho nó hoạt động chính xác với bất kỳ sự kết hợp nào của độ trễ tổ hợp cho chốt (nghĩa là bất cứ điều gì tạo ra tín hiệu sẽ được kết hợp cho chốt, sẽ làm như vậy theo cách mà ngay cả với sự kết hợp trong trường hợp xấu nhất của đường dẫn logic độ trễ bằng 0 và đường dẫn logic độ trễ tối đa, các yêu cầu về thời gian cho chốt vẫn được đáp ứng), bộ tổng hợp sẽ tạo ra một mạch làm việc trong đó bản thân chốt có độ trễ không âm. Tuy nhiên, nếu ...
supercat

... người ta sử dụng logic tổ hợp và phản hồi mà không chỉ định bất kỳ nút nào phải có độ trễ không âm, bất cứ điều gì có thể xảy ra. Tôi đánh giá cao logic đồng bộ này dễ thiết kế hơn async, nhưng nhiều thiết bị cần tắt đồng hồ khi chúng ngủ để tiết kiệm điện, mà không bị chết hoàn toàn. Thật thú vị khi có một thiết bị hoàn toàn đồng bộ, nhưng được liên kết với mỗi pin một vài đầu ra logic để "chạy nếu pin cao" và "chạy nếu pin thấp", cùng với khả năng tạo đồng hồ nếu bất kỳ pin chỉ ra một là cần thiết.
supercat

Một khả năng như vậy sẽ giảm thiểu phần lớn nhu cầu về logic không đồng bộ, vì một đầu vào xuất hiện trong khi thiết bị đang ngủ có thể cung cấp năng lượng cho bộ dao động bên trong và mạch chỉ đủ lâu để đầu vào được xử lý và thừa nhận. Một tính năng như vậy sẽ linh hoạt hơn nhiều so với việc có một pin "đánh thức" duy nhất, nhưng các thiết kế đánh thức đơn dường như là chuẩn mực. Liệu một cách tiếp cận đa thức như tôi mô tả có tiêu thụ silicon dư thừa không? Tôi nghĩ rằng yêu cầu silicon sẽ khá nhỏ so với mọi thứ khác trên chip.
supercat

13

Điều gì làm cho một chốt suy luận?
Đối với logic tổ hợp, đầu ra của mạch là một chức năng chỉ đầu vào và không được chứa bất kỳ bộ nhớ hoặc trạng thái bên trong (chốt).

Trong Verilog, một biến sẽ giữ giá trị trước đó nếu nó không được gán giá trị trong một khối luôn . Một chốt phải được tạo để lưu trữ giá trị hiện tại này.

Một câu lệnh if- other không đầy đủ sẽ tạo ra các chốt. Một câu lệnh if-other được coi là "không đầy đủ" nếu trạng thái đầu ra không được xác định cho tất cả các điều kiện đầu vào có thể. Điều tương tự cũng xảy ra với một câu lệnh tình huống không đầy đủ hoặc một câu lệnh tình huống không có mặc định: item.

Tại sao các chốt được suy luận xấu?
Các chốt được suy luận có thể đóng vai trò là một 'dấu hiệu cảnh báo' rằng thiết kế logic có thể không được thực hiện như dự định. Mộttuyên bốquan trọng nếu khác hoặc trường hợp có thể bị thiếu trong thiết kế.

Chốt có thể dẫn đến các vấn đề thời gian và điều kiện cuộc đua. Chúng có thể dẫn đến phản hồi kết hợp - định tuyến đầu ra trở lại đầu vào - có thể không dự đoán được.

Để tránh tạo ra các chốt được suy luận:

  • Bao gồm tất cả các nhánh của câu lệnh if hoặc case
  • Gán một giá trị cho mọi tín hiệu đầu ra trong mỗi nhánh
  • Sử dụng các bài tập mặc định khi bắt đầu thủ tục, vì vậy mọi tín hiệu sẽ được chỉ định.

Một số phần được diễn giải từ "Nguyên mẫu đồ họa bằng ví dụ Verilog" của P. Chu


2
"Tạo mẫu bằng các ví dụ Verilog" là một cuốn sách hay để tìm hiểu Verilog thực tế cho Tổng hợp. Nó có một số thiết kế ví dụ tốt từ các công cụ tổ hợp cơ bản đến tuần tự cơ bản, dẫn đến các thiết kế hữu ích như UART, VGA, bộ xử lý lõi mềm (Picoblaze) và thậm chí là một trò chơi Pong. Nó cũng bao gồm testbench cơ bản và mô phỏng. @Randomblue, bạn nên lấy một bản sao nếu bạn chưa có nó. Tôi tin rằng anh ấy cũng đã làm một phiên bản VHDL.
Oli Glaser

8

Chốt rất khó sử dụng trong các GPU hoặc CPLD, vì vậy nhiều người chỉ cần tránh chúng hoàn toàn. Một trong những lý do là nhiều GPU không có chốt tích hợp, do đó chúng được tạo ra từ các cổng logic - điều này có thể gây ra các vấn đề thời gian khó chịu.
Ngoài ra, bạn không có bất kỳ kiểm soát nào về độ trễ thời gian và điều kiện cuộc đua khi sử dụng chốt (trừ khi có yếu tố gốc)

Tôi sẽ khuyên bạn không nên sử dụng chốt trừ khi bạn hoàn toàn không thể làm gì nếu không có chúng (ví dụ: mượn thời gian để đáp ứng tần số xung nhịp tối đa cần thiết) và sử dụng các kỹ thuật mã hóa để vô tình suy ra các chốt ít có khả năng.


6

Các thiết kế logic tuần tự được xây dựng bằng cách sử dụng logic tổ hợp và phản hồi thường đưa ra một giả định có vẻ hợp lý khi sử dụng cổng vật lý: rằng đầu ra của cổng sẽ không thay đổi để đáp ứng với thay đổi đầu vào, cho đến khi sau đó đầu vào thực sự thay đổi. Có một số trường hợp giả định đó có thể không giữ được khi sử dụng cổng thực (ví dụ: nếu cổng NOR nhanh và biến tần nhanh đều được điều khiển bởi tín hiệu tăng chậm từ VSS đến VDD và nếu biến tần chuyển đổi ở mức 1,2 volt trong khi NOR cổng không chuyển đổi cho đến 1,7 volt, cổng NOR có thể thấy đầu ra của biến tần xuống thấp trước khi thấy tín hiệu tăng chậm tăng cao) nhưng các vấn đề như vậy thường có thể được giải quyết bằng cách thêm bộ đệm bất cứ khi nào thay đổi chậm tín hiệu được định tuyến đến nhiều hơn một đích. Không may,

Vấn đề là trừ khi có chỉ dẫn rõ ràng khác, trình biên dịch FPGA có thể tùy ý thay thế mạch tổ hợp bằng một mạch hoàn toàn khác có cùng trạng thái ổn định, nhưng có thể có thời gian hoàn toàn khác nhau. Ví dụ: giả sử một hàm tổ hợp F phức tạp có sáu đầu vào U đến Z. F được đưa trực tiếp vào mạch P và (F NAND Z) được đưa vào mạch Q. Trình biên dịch có thể nhận ra rằng giá trị được cung cấp cho Q sẽ chỉ phụ thuộc vào F khi Z cao và có thể tính hàm F 'giống như F ngoại trừ Z được giả định là cao; Q sau đó có thể được cho ăn bằng (F 'NAND Z) chứ không phải (F NAND Z). Hoàn toàn có thể là việc thực hiện P hiệu quả nhất sẽ có năm độ trễ cổng, nhưng việc thực hiện Q hiệu quả nhất sẽ chỉ có hai. Như vậy

Nếu một mạch có các vòng phản hồi kết hợp, trình biên dịch FPGA sẽ phải thêm các nút tín hiệu vật lý, về mặt vật lý, có độ trễ dương (không thể tồn tại vòng phản hồi trễ 0 trong thế giới thực), nhưng không có gì đảm bảo rằng các nút như vậy sẽ được thêm vào những nơi cần thiết để làm cho mạch hoạt động như mong muốn. Thậm chí cũng không có gì đảm bảo rằng một thay đổi nhỏ trong thiết kế sẽ không khiến trình biên dịch thay đổi từ vị trí tùy ý xảy ra trong thế giới thực, sang một vị trí tùy ý khác xảy ra lỗi.


0

Chi tiết về cách bắt chốt trong thiết kế được giải thích ngắn gọn trong liên kết này.

https://www.doulos.com/knhow/fpga/latches/


1
Chào mừng đến với EE.SE! Bạn có thể cải thiện câu trả lời của mình bằng cách bao gồm một số chi tiết có liên quan từ liên kết. Điều này đảm bảo rằng câu trả lời của bạn có chất lượng cao ngay cả khi trang gốc biến mất.
David
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.