2012-06-21 33 views
7

Nguyên tắc chung của ngón tay cái được đề cập trong tất cả các cuốn sách tôi đã đọc cho đến nay là bạn phải sử dụng các bài tập không chặn trong các khối luôn được điều khiển bởi mép nâng hoặc rìa của đồng hồ. Ngược lại, việc chặn nhiệm vụ phải được sử dụng để mô tả logic tổ hợp. Quy tắc này có ý nghĩa đối với tôi và các tác giả của các ví dụ làm theo nó một cách kỹ lưỡng.luôn @ * chặn với một bài tập không chặn duy nhất - tốt, xấu hoặc không liên quan?

Tuy nhiên, tôi phát hiện các mảnh sau của Verilog trong một trong những mã sản xuất:

always @* begin 
    in_ready <= out_ready || ~out_valid; 
end 

Lưu ý rằng non-blocking chuyển nhượng <= đang được sử dụng. Tôi không nghĩ rằng nó làm cho bất kỳ sự khác biệt trong trường hợp này bởi vì không có nhiều bài tập. Tuy nhiên, tôi dường như không thể tìm thấy bất kỳ lời giải thích nào cho điều này. Vì vậy, câu hỏi là - hiện nó hoặc không thực hiện bất kỳ sự khác biệt, cả trong phạm vi của một khối luôn cho trước và là một phần của thiết kế lớn hơn?

Trả lời

4

Thực hành không liên quan nhưng không tốt.

Tôi nghi ngờ rằng việc gán đơn sẽ gây ra bất kỳ tác dụng phụ nào. Khối luôn luôn kích hoạt cho bất kỳ thay đổi nào ở phía bên tay phải, cập nhật in_ready. Không có gì để chặn, do đó, không chặn sẽ không gây ra vấn đề.

Nếu một thiết kế lớn hơn có:

always @* begin 
    in_ready <= out_ready || ~out_valid ; 
    other_ready <= in_ready || other_ready ; 
end 

Tôi không quá chắc chắn, vì nó là tổ hợp nó chỉ có thể mất một bước đồng bằng thêm để giải quyết.

+0

Cảm ơn bạn. Vâng, ví dụ mã của bạn cho thấy chắc chắn không chỉ là một thực hành tồi nhưng sẽ không thực sự hoạt động như dự định trừ khi nó thực sự có ý định như thế, điều này không có ý nghĩa gì nhiều. Tôi tự hỏi ý kiến ​​của downvoter về cái này là gì. Bạn thực sự đúng. Tôi xác nhận tương tự như một phần của một câu hỏi lớn hơn của tôi về EE stackexchange (electronics.stackexchange.com/questions/34287/flip-flop-vs-combinatorial-description-what-exactly-is-the-difference/). Cảm ơn sự giúp đỡ của bạn! –

+0

Cảm ơn bạn đã phản hồi, Có 2 downvotes nhưng không có ý kiến ​​để nói lý do tại sao. – Morgan

7

Tất nhiên điều này vi phạm nguyên tắc mã hóa của tôi # 3: http://www.sunburst-design.com/papers/CummingsSNUG2000SJ_NBA.pdf) nhưng nó sẽ hoạt động.

Lý do để tránh sử dụng các phép gán nonblocking đối với logic combinational mã là hiệu suất mô phỏng. Trong ví dụ của Munkymorgy, sau khi kích hoạt khối luôn luôn, bạn sẽ đánh giá bên phải (RHS) của tất cả các phương trình, quay trở lại đầu khối luôn, cập nhật LHS của các phương trình, sẽ kích hoạt lại luôn luôn chặn, mà một lần nữa sẽ buộc các giả lập để đánh giá RHS của phương trình, đi đến đỉnh của khối luôn luôn, sau đó cập nhật LHS của phương trình. Đối với các khối lớn hơn, điều này có thể gây ra nhiều lần lặp thông qua khối luôn luôn, với hình phạt mô phỏng tương ứng.

Trong ví dụ 1 dòng đơn giản của bạn, không có hình phạt mô phỏng nội bộ, nhưng có thể có hình phạt chuyển nhượng chéo ở nơi khác.

Trình lập trình tốt sử dụng các thói quen mã hóa tốt nhất quán. Tôi sẽ thay đổi mã. Nếu thay đổi mã phá vỡ kết quả mô phỏng, thì có thêm những thói quen mã hóa xấu được chôn cất ở nơi khác trong mã. Mã không phải là mong manh.

Trân - Cliff Cummings - Verilog & SystemVerilog Guru

1

không nó xấu của nó lựa chọn của bạn nếu bạn hiểu được cách các mạch sẽ cư xử của nó rất tốt ví dụ như vậy

luôn @ * bắt đầu b < = a + c; a = b; cuối

  1. như vậy trong mẫu mã này mạch hoàn chỉnh phát triển bên trong luôn khối sẽ được kích hoạt khi bất cứ điều gì bên trong danh sách nhạy cảm đó là tất cả các đầu vào hoặc sẽ tăng hay giảm nó thay đổi trạng thái hiện tại của nó
  2. tại b < = a + c bây giờ ở đây một trình bổ sung đầy đủ sẽ được tạo bằng 'a' và 'c' làm đầu vào nhưng
  3. bây giờ thiết kế được tạo ra hoặc trình biên dịch tổng hợp mạch theo cách sao cho câu lệnh tiếp theo a = b ở đây dây được lấy ra từ giá trị cũ và không được lấy từ bản cập nhật b và được cung cấp cho một số ; rất đơn giản
  4. nếu bạn muốn như vậy để xảy ra bạn đều được chào đón để làm không có vấn đề sẽ đến trong synthesizable
Các vấn đề liên quan