2012-12-19 28 views
10

Có thể hai hoặc nhiều lần chạy tuần tự cho một quy trình trong VHDL không?Quy trình có nằm trong VHDL reentrant không?

Điều gì sẽ xảy ra nếu một sự kiện khác xảy ra (trên danh sách tín hiệu nhạy cảm) trong khi quá trình thực thi tuần tự không hoàn thành?

Có thể hoặc mô hình VHDL của tôi cho quy trình hoàn toàn sai?

+0

Bạn có thể muốn làm rõ câu hỏi của mình – briantyler

+0

Bạn có thể làm rõ bằng một số mã ví dụ về tình huống không? Tôi tin rằng tôi biết những gì bạn đang yêu cầu, nhưng thật khó để trả lời mà không có vấn đề cụ thể. –

Trả lời

39

Sẽ không có sự kiện nào xảy ra trong khi quá trình đang chạy!

Khi một quá trình bị đánh thức bởi một sự kiện, nó chạy đến khi hoàn thành ("quá trình kết thúc") hoặc tuyên bố "chờ" rõ ràng và chuyển sang chế độ ngủ. Điều này có nghĩa là, thời gian ZERO. Điều đó có nghĩa là nếu bạn có vòng lặp trong quá trình của bạn, chúng được bỏ hoàn toàn một cách hiệu quả, và khi bạn tổng hợp, bạn sẽ tạo ra đủ phần cứng để chạy EVERY lặp song song. Ngoài ra, bất kỳ thủ tục, chức năng, vv, mất thời gian không - trừ khi họ có một tuyên bố "chờ đợi" rõ ràng (trong trường hợp đó quá trình đình chỉ tại "chờ đợi", như thể các thủ tục đã được inlined).

Trong suốt quá trình này, tất cả các tín hiệu đều có giá trị ban đầu khi quá trình thức dậy và mọi bài tập tín hiệu được lưu trữ, sẽ xảy ra sau. (Biến cập nhật ngay lập tức; các câu lệnh sau trong quá trình xem giá trị mới).

Khi quá trình tạm dừng (tại "chờ" hoặc "quá trình kết thúc"), không có gì xảy ra cho đến khi TẤT CẢ các quy trình khác cũng bị tạm ngưng. (Nhưng hãy nhớ rằng tất cả đều mất thời gian không!). Nếu một quá trình đình chỉ ở "quá trình kết thúc" nó sẽ khởi động lại từ đầu khi danh sách độ nhạy của nó đánh thức nó. Nếu nó tạm dừng ở "chờ" rõ ràng, "chờ" sẽ chỉ định một sự kiện hoặc thời gian trong tương lai, sẽ khởi động lại sau khi "Chờ". (LƯU Ý: 1: không trộn danh sách độ nhạy và kiểu Chờ trong cùng một quá trình 2: Đợi đến khi một số sự kiện có thể tổng hợp (mặc dù một số công cụ có thể phản đối); Đợi một thời gian chỉ là mô phỏng)

THEN tất cả chỉ định tín hiệu được thực hiện. Vì tất cả các quá trình đang ngủ, điều này giúp loại bỏ tất cả các điều kiện chủng tộc và các mối nguy hiểm về thời gian. Một số các bài tập (như '1' cho đồng hồ) sẽ gây ra các sự kiện được sắp xếp theo các quy trình nhạy cảm với chúng.

Sau khi tất cả các phép gán tín hiệu được thực hiện, thời gian chuyển tiếp một dấu ngắn vô hạn (được gọi là chu trình delta), và sau đó tất cả các quá trình với sự kiện đã lên lịch được đánh thức.

Điều này tiếp tục cho đến khi một chu kỳ delta xảy ra trong đó NO sự kiện mới được lên lịch, và cuối cùng mô phỏng có thể tiến lên bằng một bước thời gian thực.

Như vậy

process(clk) 
begin 
if rising_edge(clk) then 
    A <= B; 
    B <= A; 
end if; 
end process; 

là nguy hại trực tiếp miễn phí trong VHDL.

Nếu bạn cần sử dụng Verilog, hãy lưu ý rằng một số điều này xảy ra khác nhau ở đó và bạn không thể dựa vào cùng mức dự đoán trong kết quả mô phỏng.


Trong tổng hợp, tất nhiên, chúng tôi tạo phần cứng sẽ mất một thời gian thực để thực thi quy trình này. Tuy nhiên, các công cụ tổng hợp và back-end (nơi và tuyến đường) đảm bảo hoặc tuân theo mô hình này một cách trung thực, hoặc thất bại và báo cáo lý do tại sao chúng không thành công. Ví dụ, họ sẽ thêm tất cả các sự chậm trễ thực sự và xác minh rằng tổng số ít hơn thời gian đồng hồ được chỉ định của bạn. (Trừ khi bạn đã đặt tốc độ đồng hồ quá cao!).Vì vậy, upshot là, miễn là các công cụ báo cáo thành công (và bạn đang thiết lập các ràng buộc thời gian như tốc độ đồng hồ chính xác), bạn có thể giả vờ mô hình "zero time" ở trên là đúng và hành vi phần cứng thực sẽ khớp với mô phỏng. Đảm bảo, lỗi công cụ chặn!

+4

Tại sao chính xác câu trả lời này không có trong mỗi hướng dẫn VHDL? Tôi đã làm công cụ với VHDL một thời gian và bạn vẫn làm rõ một số vấn đề cơ bản đối với tôi! –

+0

cảm ơn vì lời khen! –

+0

"Ví dụ, họ sẽ thêm tất cả các sự chậm trễ thực sự và xác minh rằng tổng số ít hơn thời gian đồng hồ được chỉ định của bạn. (Trừ khi bạn đã đặt tốc độ đồng hồ quá cao!)." Tôi không hiểu. Vì vậy, nếu bạn thiết lập tốc độ đồng hồ quá cao, sau đó họ sẽ cho phép một khoản tiền đó là cao hơn so với thời gian đồng hồ và sẽ không xác minh? –

5

Khi bắt đầu sử dụng VHDL (hoặc bất kỳ HDL nào khác cho vấn đề đó), điều cực kỳ quan trọng là loại bỏ tất cả các khái niệm về mã tuần tự, thay vào đó tập trung vào luồng dữ liệu thông qua phần cứng. Trong phần cứng, mọi thứ vốn đã song song (mọi thứ xảy ra đồng thời), nhưng sử dụng dữ liệu thay đổi liên tục (tín hiệu đầu vào) để tính toán kết quả thay đổi liên tục (tín hiệu đầu ra)!

Không đi sâu vào các chủ đề nâng cao hơn như biến, lệnh chờ, v.v., mọi thứ trong quá trình diễn ra đồng thời. Nếu những điều xung đột xảy ra trong cùng một quá trình (nhiều ghi vào cùng một tín hiệu), câu lệnh cuối cùng trong quá trình sẽ thắng, điều thường gây nhầm lẫn về mã "tuần tự" trong VHDL đến từ đó.

Điều này hoạt động do cách các giá trị được gán cho tín hiệu. Khi gán một giá trị cho một tín hiệu, giá trị của tín hiệu không thay đổi ngay lập tức! Thay vào đó, giá trị được gán sẽ được ghi nhớ và sẽ được cam kết là giá trị tín hiệu thực tế sau này (để chuẩn bị cho chu kỳ delta tiếp theo, đó là hiệu quả lượng tử tiếp theo của thời gian).

Vì chu kỳ delta tiếp theo sẽ không bắt đầu cho đến khi tất cả các quy trình từ chu kỳ delta trước đó đã hoàn thành, giá trị tín hiệu sẽ chỉ thay đổi khi không có tiến trình nào đang chạy. Khi tất cả các tín hiệu đã thay đổi, chu kỳ delta tiếp theo bắt đầu và bất kỳ quá trình nhạy cảm nào với một trong các tín hiệu đã thay đổi sẽ được thực hiện.

Nếu quá trình nhạy cảm với tín hiệu nó cũng ghi, bạn có cái được gọi là vòng tổ hợp, ví dụ: cổng nơi đầu ra cấp nguồn đầu vào. Đây là (gần như) luôn luôn là một lỗi trong mạch của bạn, và thường sẽ gây ra mô phỏng để nhập một vòng lặp delta-chu kỳ vô hạn.

Đó là tất cả những gì tôi sẽ viết ngay bây giờ, như câu trả lời của Brian Drummond vừa xuất hiện khi tôi viết bài này, nhưng vui lòng để lại nhận xét và tôi sẽ thêm một số chi tiết.

2

Khi một quá trình bắt đầu chạy (do một sự kiện), nó chạy đến khi kết thúc trước khi bất kỳ sự kiện khác được phép kích hoạt bất cứ điều gì khác.

+0

Đó có phải là _ mọi thứ khác_ trong toàn bộ 'thực thể' hoặc chỉ trong' quy trình'? – atomh33ls

+1

Chỉ cần quy trình.Khi quá trình kết thúc, bạn không có cách nào biết được quy trình nào đã sẵn sàng chạy cùng một chu kỳ delta sẽ được lên lịch tiếp theo. Nó có thể là một từ cùng một thực thể, nó có thể không. Và (miễn là bạn không sử dụng các biến chia sẻ) nó sẽ không thành vấn đề –

Các vấn đề liên quan