2011-11-04 33 views
5

Tôi không phải là chuyên gia Verilog, và tôi đã tự hỏi nếu ai đó biết cách nào để tăng giá trị thì tốt hơn. Xin lỗi nếu câu hỏi này quá đơn giản.Thực hành tốt nhất của Verilog - Tăng thêm một biến

Way A:

Trong một khối logic tổ hợp, có lẽ trong một máy nhà nước:

//some condition 
count_next = count + 1; 

Và rồi đâu đó trong một khối liên tục:

count <= count_next; 

Hoặc Way B:
Khối kết hợp:

//some condition 
count_en = 1; 

tuần tự khối:

if (count_en == 1) 
    count <= count + 1; 

Tôi đã thấy Way Một thường xuyên hơn. Một lợi ích tiềm năng của Way B là nếu bạn đang tăng cùng một biến ở nhiều nơi trong máy trạng thái của bạn, có lẽ nó sẽ chỉ sử dụng một trình bổ sung thay vì nhiều; hay là sai?

Phương pháp nào được ưa thích hơn và tại sao? Có hoặc có một nhược điểm đáng kể?

Cảm ơn bạn.

Trả lời

1

Một lợi ích tiềm năng của Way B là nếu bạn đang tăng cùng biến ở nhiều nơi trong máy nhà nước của bạn, có lẽ nó sẽ chỉ sử dụng một bộ cộng thay vì nhiều; hay là sai?

Bất kỳ công cụ tổng hợp nào sẽ cố gắng chia sẻ tài nguyên tự động. Làm thế nào họ làm như vậy phụ thuộc vào công cụ và mã được viết. Đây là tài liệu mô tả một số tính năng của Design Compiler.Lưu ý rằng trong một số trường hợp, ít diện tích hơn có nghĩa là thời gian tồi tệ hơn.

Phương pháp nào được ưa thích hơn và tại sao? Có hoặc có một nhược điểm đáng kể?

Tùy theo. Verilog (cho tổng hợp) là một phương tiện để thực hiện một số mạch logic nhưng spec không xác định chính xác cách thức này được thực hiện. Cách A có thể giống như cách B trên một FPGA nhưng Way A không phù hợp với thiết kế công suất thấp trên ASIC do việc gán tuần tự vô điều kiện. Sử dụng thiết lập lại lưới là gần như là một yêu cầu trên một ASIC nhưng kể từ khi nhiều FPGA bắt đầu trong một nhà nước được biết đến, bạn có thể tiết kiệm khá nhiều tài nguyên bằng cách không có chúng.

+0

Bạn sử dụng cách nào? –

+0

Bạn nên sử dụng tài liệu công cụ tổng hợp của bạn đề xuất. –

1

Tôi sử dụng Way A trong mã Verilog của mình. Các khối liên tiếp của tôi hầu như không có logic trong chúng; họ chỉ định các thanh ghi dựa trên các giá trị của "dây điện tử" được tính toán trong tổ hợp luôn chặn. Chỉ có ít hơn để đi sai theo cách này. Và với Verilog, chúng tôi cần tất cả sự giúp đỡ mà chúng tôi có thể nhận được.

1

Định nghĩa của bạn về "tốt hơn" là gì? Nó có thể là hiệu suất tốt hơn (tần số tối đa nhanh hơn của mạch tổng hợp), diện tích nhỏ hơn (ít cổng logic hơn) hoặc thực thi mô phỏng nhanh hơn.

Hãy xem xét trường hợp diện tích nhỏ hơn cho Xilinx và Altera FPGAs. Đăng ký trong các gia đình FPGA có cho phép nhập. Trong "Cách B" của bạn, * count_en * sẽ được ánh xạ trực tiếp vào đầu vào đăng ký đó, điều này sẽ dẫn đến các cổng logic ít hơn. Về cơ bản, "Cách B" cung cấp thêm "gợi ý" cho một công cụ tổng hợp làm thế nào để tổng hợp tốt hơn mạch đó. Cũng có thể là hầu hết các công cụ tổng hợp FPGA (tôi đang nói về Xilinx XST, Altera MAP, Mentor Precision, và Synopsys Synplify) sẽ suy ra chính xác thanh ghi cho phép nhập từ "Cách A".

Nếu * count_en * được tổng hợp thành bật đầu vào đăng ký, điều đó sẽ dẫn đến hiệu suất tốt hơn của mạch, vì logic tăng truy cập của bạn sẽ có mức logic ít hơn.

Cảm ơn

+0

Tôi không chắc mình hiểu ý của bạn là gì. Dường như với tôi tín hiệu count_en sẽ cho phép Adder, chứ không phải đăng ký. Bạn có thể giải thích thêm? Cảm ơn bạn. –

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