Tại sao Verilog này giảm 30 macrocell và hàng trăm điều khoản sản phẩm?


8

Tôi có một dự án tiêu thụ 34 macrocells của Xilinx Coolrunner II. Tôi nhận thấy tôi có một lỗi và theo dõi nó xuống:

assign rlever = RL[0] ? 3'b000 :
                RL[1] ? 3'b001 :
                RL[2] ? 3'b010 :
                RL[3] ? 3'b011 :
                RL[4] ? 3'b100 :
                RL[5] ? 3'b101 :
                RL[6] ? 3'b110 :
                        3'b111;

assign llever = LL[0] ? 3'b000 :
                LL[1] ? 3'b001 :
                LL[2] ? 3'b010 :
                LL[3] ? 3'b011 :
                LL[4] ? 3'b100 :
                LL[5] ? 3'b101 :
                        3'b110 ;

Lỗi là rleverlleverrộng một bit, và tôi cần chúng rộng ba bit. Tôi ngớ ngẩn quá. Tôi đã thay đổi mã thành:

wire [2:0] rlever ...
wire [2:0] llever ...

Vì vậy, có đủ bit. Tuy nhiên, khi tôi xây dựng lại dự án, sự thay đổi này đã tiêu tốn của tôi hơn 30 macrocell và hàng trăm điều khoản sản phẩm. Bất cứ ai có thể giải thích những gì tôi đã làm sai?

(Tin vui là giờ đây nó mô phỏng chính xác ... :-P)

BIÊN TẬP -

Tôi cho rằng tôi thất vọng vì khoảng thời gian tôi nghĩ rằng tôi bắt đầu hiểu Verilog và CPLD, điều gì đó xảy ra cho thấy tôi rõ ràng không có hiểu biết.

assign outp[0] = inp[0] | inp[2] | inp[4] | inp[6];
assign outp[1] = inp[1] | inp[2] | inp[5] | inp[6];
assign outp[2] = inp[3] | inp[4] | inp[5] | inp[6];

Logic để thực hiện ba dòng đó xảy ra hai lần. Điều đó có nghĩa là mỗi 6 dòng Verilog tiêu thụ khoảng 6 macrocell và 32 thuật ngữ sản phẩm mỗi dòng .

EDIT 2 - Theo đề xuất của @ ThePhoton về công tắc tối ưu hóa, đây là thông tin từ các trang tóm tắt do ISE sản xuất:

Synthesizing Unit <mux1>.
    Related source file is "mux1.v".
    Found 3-bit 1-of-9 priority encoder for signal <code>.
Unit <mux1> synthesized.
(snip!)
# Priority Encoders                                    : 2
 3-bit 1-of-9 priority encoder                         : 2

Vì vậy, rõ ràng mã được công nhận là một cái gì đó đặc biệt. Thiết kế vẫn đang tiêu thụ tài nguyên to lớn, tuy nhiên.

EDIT 3 -

Tôi đã tạo một sơ đồ mới chỉ bao gồm mux mà @thePhoton khuyên dùng. Tổng hợp sản xuất sử dụng tài nguyên không đáng kể. Tôi cũng đã tổng hợp các mô-đun được đề xuất bởi @Michael Karas. Điều này cũng tạo ra việc sử dụng không đáng kể. Vì vậy, một số sự tỉnh táo là phổ biến.

Rõ ràng, việc tôi sử dụng các giá trị đòn bẩy đang gây ra sự bối rối. Nhiều hơn để đến.

Chỉnh sửa cuối cùng

Thiết kế không còn điên rồ. Tôi không chắc chắn những gì đã xảy ra, tuy nhiên. Tôi đã thực hiện rất nhiều thay đổi để thực hiện các thuật toán mới. Một yếu tố góp phần là 'ROM' gồm 111 phần tử 15 bit. Điều này tiêu thụ một số lượng lớn các macrocell nhưng rất nhiềuvề các điều khoản sản phẩm - gần như tất cả những điều khoản có sẵn trên xc2c64a. Tôi tìm kiếm cái này nhưng không nhận thấy nó. Tôi tin rằng lỗi của tôi đã được ẩn bằng cách tối ưu hóa. 'Đòn bẩy' mà tôi đang nói đến được sử dụng để chọn các giá trị từ ROM. Tôi đưa ra giả thuyết rằng khi tôi triển khai bộ mã hóa ưu tiên 1 bit (bị vỡ), ISE đã tối ưu hóa một số ROM. Đó sẽ là một mẹo khá khó, nhưng đó là lời giải thích duy nhất tôi có thể nghĩ ra. Tối ưu hóa này làm giảm việc sử dụng tài nguyên một cách rõ rệt và khiến tôi mong đợi một dòng cơ sở nhất định. Khi tôi sửa bộ mã hóa ưu tiên (theo chủ đề này), tôi đã thấy chi phí hoạt động của bộ mã hóa ưu tiên và ROM trước đây đã được tối ưu hóa và chỉ dành riêng cho bộ mã hóa này.

Sau tất cả những điều này, tôi đã rất giỏi về macrocell nhưng đã làm cạn kiệt các điều khoản sản phẩm của tôi. Một nửa số ROM là một thứ xa xỉ, thực sự, vì nó chỉ là 2 phần của nửa đầu. Tôi đã loại bỏ các giá trị âm, thay thế chúng ở nơi khác bằng một phép tính đơn giản. Điều này cho phép tôi giao dịch macrocell cho các điều khoản sản phẩm.

Hiện tại, điều này phù hợp với xc2c64a; Tôi đã sử dụng 81% và 84% macrocells và các điều khoản sản phẩm tương ứng. Tất nhiên, bây giờ tôi phải kiểm tra nó để đảm bảo nó làm những gì tôi muốn ...

Cảm ơn ThePhoton và Michael Karas đã hỗ trợ. Ngoài sự hỗ trợ về mặt đạo đức mà họ cho vay để giúp tôi giải quyết vấn đề này, tôi đã học được từ tài liệu Xilinx ThePhoton đăng và tôi đã triển khai bộ mã hóa ưu tiên do Michael đề xuất.


Không phải mọi dấu hỏi ở đó đều ngụ ý một bộ ghép kênh một cách hiệu quả, và về mặt cấu trúc, bạn cũng đã xếp tầng cho chúng? Có bao nhiêu tế bào vĩ mô mà bạn mong đợi nó sẽ mất?
Abbeyatcu

Tôi không biết công trình nên tiêu thụ bao nhiêu macrocell. Tuy nhiên, xem xét dự án của tôi hiện đang tiêu thụ 34 macrocell bao gồm cả hai bộ ghép kênh '1 bit' đó và đây là một phần nhỏ của dự án, tôi rất ngạc nhiên về kết quả này.
Tony Enni

Bạn đang sử dụng công cụ gì?
Photon

ISE của Xilinx ...
Tony Enni

Trong mã trong chỉnh sửa của bạn, tôi nghĩ rằng bạn muốn |thay vì ||.
Photon

Câu trả lời:


7

Mã bạn hiển thị về cơ bản là một bộ mã hóa ưu tiên. Nghĩa là, nó có đầu vào của nhiều tín hiệu và đầu ra của nó cho biết tín hiệu nào được đặt, ưu tiên cho tín hiệu được đặt ở bên trái nhất nếu có nhiều tín hiệu được đặt.

Tuy nhiên, tôi thấy các định nghĩa mâu thuẫn về hành vi tiêu chuẩn cho mạch này ở hai nơi tôi đã kiểm tra.

Theo Wikipedia , bộ mã hóa ưu tiên tiêu chuẩn đánh số đầu vào của nó từ 1. Nghĩa là, nếu bit đầu vào ít quan trọng nhất được đặt, nó sẽ xuất 1, không phải 0. Bộ mã hóa ưu tiên Wikipedia xuất ra 0 khi không có bit đầu vào nào được đặt.

Tuy nhiên, Hướng dẫn sử dụng XST của Xilinx (trang 80), xác định bộ mã hóa ưu tiên gần hơn với những gì bạn đã mã hóa. Các đầu vào được đánh số từ 0, vì vậy khi lsb của đầu vào được đặt, nó sẽ cho đầu ra 0. Tuy nhiên, định nghĩa Xilinx không đưa ra thông số kỹ thuật nào cho đầu ra khi tất cả các bit đầu vào đều rõ ràng (Mã của bạn sẽ xuất 3'd7).

Tất nhiên, hướng dẫn sử dụng Xilinx sẽ xác định phần mềm tổng hợp Xilinx đang mong đợi điều gì. Điểm chính là một lệnh đặc biệt (*priority_extract ="force"*)được yêu cầu cho XST để nhận ra cấu trúc này và tạo ra kết quả tổng hợp tối ưu.

Đây là mẫu được đề xuất của Xilinx cho bộ mã hóa ưu tiên 8 đến 3:

(* priority_extract="force" *)
module v_priority_encoder_1 (sel, code);
input [7:0] sel;
output [2:0] code;
reg [2:0] code;
always @(sel)
begin
    if (sel[0]) code = 3b000;
    else if (sel[1]) code = 3b001;
    else if (sel[2]) code = 3b010;
    else if (sel[3]) code = 3b011;
    else if (sel[4]) code = 3b100;
    else if (sel[5]) code = 3b101;
    else if (sel[6]) code = 3b110;
    else if (sel[7]) code = 3b111;
    else code = 3bxxx;
end
endmodule

Nếu bạn có thể sắp xếp lại logic xung quanh để cho phép bạn sử dụng kiểu mã hóa được đề xuất của Xilinx, đó có lẽ là cách tốt nhất để có kết quả tốt hơn.

Tôi nghĩ bạn có thể có được điều này bằng cách khởi tạo mô-đun mã hóa Xilinx với

v_priority_encoder_1 pe_inst (.sel({~|{RL[6:0]}, RL[6:0]}), .code(rlever));

Tôi đã kết hợp tất cả các bit RL[6:0]để có được một bit đầu vào thứ 8 sẽ kích hoạt đầu ra 3'b111 khi tất cả các bit RL ở mức thấp.

Đối với lleverlogic, có lẽ bạn có thể giảm mức sử dụng tài nguyên bằng cách tạo mô-đun mã hóa đã sửa đổi, theo mẫu Xilinx, nhưng chỉ yêu cầu 7 bit đầu vào (6 bit của bạn LLcộng với một bit bổ sung tăng cao khi 6 bit còn lại đều ở mức thấp).

Sử dụng mẫu này giả định phiên bản ISE mà bạn có đang sử dụng công cụ tổng hợp XST. Có vẻ như họ thay đổi các công cụ tổng hợp trên mỗi vòng quay chính của ISE, vì vậy hãy kiểm tra xem tài liệu tôi liên kết có thực sự tương ứng với phiên bản ISE của bạn không. Nếu không, hãy kiểm tra kiểu được đề xuất trong tài liệu của bạn để xem công cụ của bạn mong đợi điều gì.


Cảm ơn, điều đó sẽ mất một thời gian để tiêu hóa. ISE của tôi đang sử dụng XST mặc dù tôi không biết phiên bản nào.
Tony Enni

Chìa khóa đang có (* priority_extract="force" *)và có lẽ cũng rõ ràng bao gồm cả đầu ra không quan tâm mặc dù bạn bao gồm mọi đầu vào có thể. (Không có nó, XST có thể đang cố gắng tạo một bảng tra cứu hoàn chỉnh, đó là lý do tại sao rất nhiều thuật ngữ sản phẩm) Trước tiên hãy thử thêm tùy chọn không quan tâm. Nếu nó không hoạt động, thì hãy thử sử dụng chính xác nồi hơi Xilinx.
Photon

Tôi đã thực hiện một bản rip hoàn chỉnh của mã ở trên và không nhận được kết quả cải thiện. Các trang tóm tắt ISE chỉ ra MUX đã được công nhận, mặc dù sự công nhận không mạnh như các cấu trúc khác. Tôi sẽ đăng thông tin liên quan trong vài phút nữa.
Tony Enni

chỉnh sửa - bỏ qua nhận xét ở trên về 'sự công nhận mạnh mẽ' - nó ở đó, tôi vừa bỏ lỡ nó đêm qua; Tôi làm lại công việc và thực tế đang hoạt động chính xác.
Tony Enni

6

Câu trả lời của ThePhoton là một câu trả lời xuất sắc. Tôi muốn thêm một số thông tin bổ sung ở đây để bạn xem xét. Điều này xuất phát từ thực tế là mặc dù chúng ta có các thiết bị đồ họa và CPLD ưa thích sử dụng HDL và các công cụ tổng hợp, nhưng có thể có thông tin để xem xét kỹ những thứ được thiết kế từ nhiều năm trước. Ở lại với tôi trong khi tôi đi qua đề nghị này vào cuối của tôi.

Có những phần logic riêng biệt thực hiện chức năng mã hóa ưu tiên. Logic được thực hiện bởi các bộ phận này đã có từ rất lâu khi việc giảm số lượng bóng bán dẫn xuống mức tối thiểu là điều cần thiết. Bạn có thể tìm kiếm trên web các phần logic với các số phần chung như 74HC148 hoặc MC14532B để tìm các bảng dữ liệu bao gồm các sơ đồ logic tương đương cho các phần này. Sơ đồ dưới đây là một ví dụ được lấy từ bảng dữ liệu TI cho phần 74HC148 .

nhập mô tả hình ảnh ở đây

Logic này thực hiện bảng chân lý sau (lấy từ cùng một bảng dữ liệu):

nhập mô tả hình ảnh ở đây

Lưu ý rằng họ phần trên sử dụng tín hiệu đầu vào hoạt động thấp. Một bảng dữ liệu khác cho phần MC14532B của ON S bán dẫn hiển thị bảng chân lý cho chức năng mã hóa bằng các tín hiệu đầu vào cao đang hoạt động tương tự như ví dụ Verilog của bạn.

nhập mô tả hình ảnh ở đây

Bảng dữ liệu tương tự hiển thị các phương trình logic cho MC14532B như sau:

nhập mô tả hình ảnh ở đây

Bạn có thể muốn xem xét mã hóa các phương trình tương tự trực tiếp vào mã Verilog của mình để xem nó so sánh với ví dụ hiện tại của bạn như thế nào. Nó rất có khả năng dẫn đến một kết quả thuận lợi hơn nhiều.


Cảm ơn, tôi sẽ làm như vậy. Vấn đề này đang giết chết tôi. Tôi tin rằng nó đã được tổng hợp hiệu quả hơn trước đây. Và sau đó tôi đã thay đổi một cái gì đó. / selfbonk
Tony

Cảm ơn, tôi đã thực hiện nó. Thật không may, nó không tạo ra sự khác biệt về vật chất.
Tony Enni

Câu trả lời tốt đẹp. Hãy Tony thấy chỉ có bao nhiêu về sản phẩm đó nên cần phải thực hiện logic này. Tony, nếu bạn sử dụng phương pháp soạn thảo của Xilinx hoặc phương trình của Michael và bạn vẫn đang tạo ra hàng trăm thuật ngữ sản phẩm, thì bạn cần tìm kiếm một sự thay đổi tinh tế ở một nơi khác trong mã của bạn có thể gây ra vấn đề; hoặc người khác nhìn rất kỹ vào tệp nhật ký tổng hợp để xem có điều gì đang xảy ra mà bạn không mong đợi không.
Photon

Tôi hoàn toàn đồng ý với @ThePhoton. Tôi đã hosed một cái gì đó. Tôi chắc chắn rằng tôi có thể làm điều này được sử dụng để làm việc - tôi thậm chí không nhận thấy mức tiêu thụ quá nhỏ. Ồ, đó là một cái cớ tốt để bắt đầu hiểu thêm về thông tin Tóm tắt.
Tony Enni
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.