Làm thế nào để tránh chốt trong quá trình tổng hợp


9

Tôi muốn thiết kế một khối logic tổ hợp bằng VHDL, nhưng đôi khi kết quả tổng hợp có chứa một chốt không chủ ý.

Những hướng dẫn mã hóa nào tôi cần phải tuân theo để tránh bộ tổng hợp suy ra các chốt?

Ví dụ: trong đoạn mã nhỏ, tôi có nên sử dụng câu lệnh if-other không?


Nếu ai đó có thể nhận được những gì tôi cố gắng hỏi, xin vui lòng thông báo cho tôi

Tôi không chắc ý của bạn là gì từ ví dụ của bạn. Vui lòng kiểm tra để đảm bảo việc viết lại phù hợp với mục đích ban đầu của bạn.
W5VO

@fatai, tôi đã nhận xét, có một phương pháp cụ thể để xóa tài khoản của bạn có sẵn trên meta.stackexchange.com. Tôi đã liên kết với câu hỏi cuối cùng mà tôi đã được gắn cờ. Người điều hành trên trang web không có sức mạnh này, bao giờ. Điều này đòi hỏi phải liên hệ với nhóm dev.
Kortuk

Câu trả lời:


13

Để tránh chốt, bạn cần đảm bảo tất cả các kết quả đầu ra của bạn được gán tại tất cả các nhánh có thể của mã.

ví dụ,

if a = '1' then
   b(0) <= '1';
else
   b(1 downto 0) <= "00";
end if;

sẽ tạo ra một chốt, vì trong điều kiện đầu tiên, giá trị của b (1) không được chỉ định, vì vậy trình biên dịch quyết định bạn muốn giữ giá trị trước đó của b (1) ở đó. Một cách để viết cái này sẽ không tạo ra chốt là:

if a = '1' then
   b <= prev_b;
   b(0) <= '1';
else
   b(1 downto 0) <= "00";
end if;

...

if rising_edge (clk)
    prev_b <= b;
end if;

Ở đây bạn nói rõ rằng b nên giữ lại giá trị cũ và sau đó ghi đè b (0) bằng giá trị mới.

Một cách khác là đưa ra ba giá trị mặc định, như trong câu trả lời của @ TomiJ.

Nếu bạn đăng mã bạn đang nhận được một chốt, chúng tôi có thể giúp bạn tìm lý do cụ thể.


Tôi không nghĩ rằng cách tiếp cận của b <= bbạn sẽ tránh được một chốt, vì nó vẫn đòi hỏi phải duy trì trạng thái của tín hiệu.
Tomi Junnila

Bạn có thể đúng; Tôi đã quá quen với logic đồng hồ. Tôi sẽ chỉnh sửa.
fbo

6

Nếu bạn đang sử dụng các quy trình cho logic tổ hợp (và tôi khuyên bạn chỉ vì lý do này) thì hãy đảm bảo mọi đường dẫn trong quy trình đều gán một cái gì đó cho mọi tín hiệu mà quá trình điều khiển. Không có kết quả đầu ra nào có thể phụ thuộc vào bất kỳ đầu ra nào từ "lần trước" mà quá trình đã chạy.

Mặt khác, bạn suy ra một chốt vì lần tiếp theo quy trình được lên lịch, nó phải giữ giá trị của tín hiệu không nhận được giá trị mới trong khoảng thời gian qua.

Tôi thích giữ logic kết hợp hoàn toàn như các bài tập liên tục và sử dụng các quy trình cho logic có xung nhịp, sau đó tôi không nhận được chốt.


5

Bốn quy tắc để tránh chốt:

  • Đừng đọc từ các tín hiệu mà bạn viết.
  • Có một danh sách độ nhạy chính xác (tất cả các tín hiệu mà bạn đọc phải nằm trong danh sách độ nhạy)
  • Đảm bảo rằng tất cả các tín hiệu mà bài viết của bạn được gán trong mọi đường dẫn. (ví dụ: trong mỗi nhánh của câu lệnh if-other-statement)
  • Đối với các quy trình sử dụng biến, hãy đảm bảo mọi biến được khởi tạo một giá trị mặc định trước khi đọc nó (trong một biến hoặc tín hiệu khác).

Ngoài ra, nếu bạn có một số quy trình kết hợp, hãy đảm bảo bạn không tạo vòng lặp.

Một số kiểu mã hóa có thể giúp bạn tuân theo các quy tắc này, ví dụ như kiểu trong câu trả lời của @ TomiJ. Như @Martin Thompson chỉ ra, có thể tốt hơn để tránh logic kết hợp tất cả cùng nhau. Thay vào đó, đặt mọi thứ trong một quy trình đồng hồ.


+1 Bộ quy tắc đẹp. Bạn có đồng ý rằng quy tắc số 2 của bạn (về danh sách độ nhạy) thực sự quan trọng để đảm bảo kết quả nhất quán giữa tổng hợp và mô phỏng, nhưng không thực sự tạo ra sự khác biệt về suy luận của chốt?
rick

@rick AFAIK, không có gì đảm bảo công cụ tổng hợp sẽ làm gì với danh sách độ nhạy không đầy đủ. Tiêu chuẩn IEEE cho Tổng hợp VHDL (1076.6-1999) nói rằng: "Danh sách độ nhạy quá trình sẽ chứa tất cả các tín hiệu được đọc trong câu lệnh quy trình. Các quy trình có danh sách độ nhạy không đầy đủ không được hỗ trợ." Điều đó nói rằng, tôi biết rằng các công cụ tổng hợp nhất định (có lẽ là tất cả?) Chấp nhận danh sách độ nhạy không đầy đủ, nhưng chỉ cần bỏ qua danh sách độ nhạy tất cả cùng nhau. Nếu bạn dựa vào hành vi đó thay vì tiêu chuẩn IEEE chặt chẽ hơn, tôi đoán tuyên bố của bạn sẽ đúng.
Philippe

Cảm ơn, điều đó nghe có vẻ đúng, nó sẽ làm cho mô hình của tôi không tuân thủ tiêu chuẩn đó. Nó chỉ khiến tôi tò mò vì tất cả các công cụ tổng hợp mà tôi đã thấy cho đến nay đều bỏ qua danh sách độ nhạy, nhưng tôi đã nghe tin đồn rằng một số có thể suy ra chốt.
rick

3

Như đã được @fbo và @Martin Thompson chỉ ra, bạn cần đảm bảo mọi tín hiệu do quá trình điều khiển được gán một số giá trị trong mỗi nhánh của quy trình và giá trị đó không được phụ thuộc vào trạng thái trước của bất kỳ đầu ra nào của quá trình.

Cách dễ nhất để đảm bảo điều này là gán một số giá trị mặc định cho mỗi đầu ra ở đầu quá trình, ví dụ (ví dụ đồng chọn của fbo):

COMBO: process(a)
begin
    b <= (others => '0'); -- Assign default value to b
    if a = '1' then
        b(0) <= '1';
    else
        b(1 downto 0) <= "00";
    end if;
end process COMBO;

1
Đây là một phương pháp tốt mà tôi thường sử dụng. Tuy nhiên, đôi khi, một cảnh báo chốt có thể cho bạn biết rằng bạn đã quên gán một số bit, trong khi phương pháp này có thể khiến lỗi khó tìm hơn. Ví dụ: nếu bạn chỉ định riêng tất cả các bit của tín hiệu rộng và vô tình bị nhầm lẫn.
fbo

2
Chỉ trong một quá trình kết hợp. Trong một quy trình đồng hồ, bạn suy ra một flipflop, có thể chính xác những gì bạn muốn.
Martin Thompson
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.