Làm thế nào là các câu lệnh Verilog luôn luôn được triển khai trong phần cứng?


8

alwaysTuyên bố Verilog , cụ thể là

always @(/* condition */)
    /* block of code */

thực hiện block of codebất cứ khi nào conditionhài lòng. Làm thế nào là một alwayskhối như vậy được thực hiện trong phần cứng?


Tôi nghĩ nó phụ thuộc rất nhiều vào cái gì block of code..
m.Alin

1
Và cho dù điều kiện là posedge xhay chỉx
Justin

@Justin: Giả sử không có posedge.
Randomblue

Câu trả lời:


16

Đầu tiên, lưu ý rằng không phải tất cả các thiết kế Verilog đều có thể tổng hợp được. Thông thường, chỉ có một tập hợp con rất cụ thể của các cấu trúc có thể được sử dụng trong một thiết kế sẽ được hiện thực hóa trong phần cứng.

Một hạn chế quan trọng xuất hiện là mọi regbiến chỉ có thể được gán cho tối đa một alwayscâu lệnh. Nói cách khác, regs có ái lực với alwayscác khối.

Các loại alwayskhối sau đây thường có thể được sử dụng.

always @(*) begin
    // combinational
end

always @(posedge clk) begin
    // sequential
end

Trong trường hợp trước, *chỉ ra rằng khối nên được thực thi bất cứ khi nào bất kỳ tín hiệu nào được sử dụng trong khối thay đổi hoặc, tương tự, khối phải được thực hiện liên tục. Do đó, regcác s có ái lực với alwayscác khối tổ hợp được triển khai dưới dạng các tín hiệu được tính từ các tín hiệu khác sử dụng logic tổ hợp, tức là các cổng.

Các thanh ghi có ái lực với alwayscác khối của loại thứ hai, mặt khác, là đầu ra của các flip-flop được đặt ở cạnh tăng của clk(cạnh giảm nếu negedgeđược sử dụng). Đầu vào của flip-flop, một lần nữa, được tính toán với logic tổ hợp từ các tín hiệu khác.

Hãy xem xét những điều sau đây, ví dụ hơi khó hiểu.

reg out, out_n;
always @(*) begin
    out_n = !out;
end
always @(posedge clk) begin
    out <= !out;
end

Ở đây, out_nđược liên kết với alwayskhối đầu tiên , outvới khối thứ hai. out_nsẽ được thực hiện với một cổng KHÔNG duy nhất sẽ lái out_nvà được điều khiển từ đó out(lưu ý rằng đó là logic tổ hợp thuần túy). Mặt khác, outsẽ được điều khiển bởi một flip-flop đồng hồ từ clk. Đầu vào của flip-flop sẽ lại được tính bằng cổng KHÔNG từout (được điều khiển bởi flip-flop đã nói ở trên). Tối ưu hóa tổng hợp sẽ kết hợp hai cổng KHÔNG và sử dụng một cổng KHÔNG và một cổng lật.

Tùy thuộc vào phần cứng bạn có sẵn, các loại cấu trúc khác có thể được sử dụng. Ví dụ: nếu flip-flop có bộ đặt lại không đồng bộ, cấu trúc sau đây cũng có thể được tổng hợp.

always @(posedge clk or posedge rst) begin
    if (rst)
        // reset
    else
        // sequential
end

Cảm ơn. Về *, tôi nghĩ rằng nó chỉ ra rằng khối nên được thực thi bất cứ khi nào bất kỳ tín hiệu nào trong khối thay đổi (trái ngược với thiết kế ).
Randomblue

@Randomblue, bạn nói đúng, tôi sẽ sửa câu trả lời. Lưu ý, tuy nhiên, hai là tương đương trong hành vi.
avakar

Thật; đủ công bằng!
Randomblue

2

An always khối thường được sử dụng để mô tả một flip-flop, chốt hoặc bộ ghép kênh. Mã sẽ được thực hiện với một flip-flop, chốt hoặc bộ ghép kênh.

Trong một đồ họa, một flip-flop và một chốt thường chỉ là hai cấu hình khác nhau của một thiết bị thanh ghi đa năng hơn. Một bộ ghép kênh sẽ được xây dựng từ một hoặc nhiều phần tử logic mục đích chung (LUT).

Nói chung, có hai cách để thiết kế với Verilog:

  1. Hình dung logic bạn muốn về các cổng và thanh ghi, sau đó tìm ra cách mô tả nó trong Verilog. Các sách hướng dẫn tổng hợp từ các nhà cung cấp đồ họa hoặc nhà cung cấp công cụ tổng hợp cung cấp tấm nồi hơi cho các cấu trúc phổ biến nhất mà bạn có thể muốn làm việc với.

  2. Chỉ cần viết Verilog và đừng lo lắng về phần cứng bên dưới trông như thế nào. Tuy nhiên, ngay cả khi bạn làm điều này, bạn vẫn phải biết cái gì là không thể tổng hợp được. Vì vậy, một lần nữa, bạn sẽ tìm đến bản soạn sẵn được cung cấp bởi nhà cung cấp công cụ của bạn và điều chỉnh nó cho ứng dụng của bạn.

BIÊN TẬP

Câu trả lời của Avakar là một câu hỏi hay hơn cho câu hỏi của bạn, nhưng điều này đã thúc đẩy một số cuộc thảo luận thú vị về sự khác biệt giữa Xilinx và Altera vì vậy tôi sẽ không xóa nó.


"Flip-flop và chốt thường chỉ là hai cấu hình khác nhau" Có phải vậy không? Tôi hy vọng chốt sẽ được thực hiện với LUT (cẩn thận nếu LUT không bị trục trặc).
avakar

@avakar, tôi biết rằng trong tất cả các Xilinx (hoặc ít nhất là tất cả những cái gần đây), các chốt sử dụng phần cứng giống như một flip-flop, chỉ khác nhau một bit trong dòng bit cấu hình. Tôi không chắc chắn về các thương hiệu khác.
Kevin Cathcart

Hừm. Một số thiết kế Altera cũ hơn có đường dẫn phản hồi cho phép LUT được sử dụng để thực hiện các chốt. Có vẻ như việc định tuyến chính có thể cần thiết để thực hiện các chốt trong các thiết kế mới hơn. Mặc dù vậy, điều này không đáng ngạc nhiên, vì trong thiết kế RTL hiện đại, các chốt thực tế (chứ không phải dép xỏ ngón) hiếm khi được mong muốn.
Kevin Cathcart

@avakar, tôi quen thuộc hơn với Xilinx, nơi thiết bị đăng ký có thể được cấu hình là flip-flop hoặc chốt. Nếu điều đó không thể xảy ra ở Altera hoặc một số nhà cung cấp khác, thì nó sẽ khiến cho lời khuyên chung "không thiết kế có chốt" thậm chí còn mạnh mẽ hơn.
Photon

@KevinCathcart và Photon: Tôi thấy, tôi không quen thuộc với Xilinx, chỉ với loạt Altera Cyclone, không có mạch chốt chuyên dụng.
avakar

0

Như đã nói không phải tất cả các khối luôn được tổng hợp. Ngoài ra còn có một số khối mà các công cụ tổng hợp sẽ chấp nhận nhưng sẽ tạo ra kết quả khác với những gì một trình giả lập sẽ tạo ra.

Đầu tiên ra khỏi danh sách nhạy cảm. Quy tắc thông thường là nó phải chỉ chứa các cấu trúc phát hiện cạnh (và thường có một lựa chọn hạn chế các kết hợp có thể) hoặc nó phải chứa (có thể thông qua việc sử dụng * hoặc system_ của systemverilog) mỗi tín hiệu được sử dụng làm đầu vào cho khối. Chúng tôi gọi khối trước là khối tổ hợp và khối sau là khối liên tiếp hoặc khối. Thông thường nếu bạn chỉ bao gồm một tập hợp con đầu vào trong một công cụ tổng hợp khối tổ hợp sẽ chỉ bỏ qua bạn và hành động như thể danh sách đầy đủ đã được chỉ định (tạo ra sự không phù hợp mô phỏng / tổng hợp)

Chặn thứ hai so với bài tập noblocking. Trong một khối tổ hợp, sự khác biệt không quan trọng lắm, nhưng trong một khối liên tiếp, nó rất quan trọng.

Trong một mô hình bài tập không chặn khối tuần tự, một thanh ghi khá trực tiếp trong khi chặn các biến mô hình bài tập (có thể hoặc không bao hàm các thanh ghi tùy theo thứ tự cài đặt và đọc). Như một quy tắc, một "reg" được thiết lập bằng cách sử dụng các xác nhận chặn trong một khối tuần tự chỉ nên được đọc trong cùng một khối và các giả định chặn và không chặn không được trộn lẫn trên cùng một "reg".

Trộn các nhiệm vụ chặn và bỏ chặn cho cùng một mục có thể gây ra lỗi tổng hợp. Thực hiện một giả định chặn trong một khối và đọc nó trong một khối khác có khả năng gây ra sự không phù hợp mô phỏng / tổng hợp (và thậm chí có thể không khớp giữa các lần chạy mô phỏng khác nhau).

Bây giờ chúng ta có các quy tắc cơ bản theo cách chúng ta có thể xem xét cách trình biên dịch biến mã thành logic.

Bước đầu tiên là hủy bỏ tất cả các vòng lặp. Điều này có nghĩa là các vòng lặp phải có số lần lặp tối đa có thể được xác định tại thời điểm tổng hợp hoặc bạn sẽ bị lỗi tổng hợp.

Sau đó, công cụ có thể phân tích luồng điều khiển của khối và biến nó thành luồng dữ liệu. Mỗi biến trở thành một hoặc nhiều tín hiệu. Mỗi câu lệnh if hoặc cấu trúc tương tự trở thành một hoặc nhiều bộ ghép kênh chọn tập kết quả nào sẽ thực sự được sử dụng.

Công cụ sau đó có thể sẽ thử và áp dụng một số lựa chọn.

Trong bộ tứ, bạn có thể thấy kết quả của quá trình này sau khi xây dựng dự án của mình bằng cách đi vào "công cụ-> người xem netlist-> người xem rtl".

Sau khi tạo biểu diễn cấu trúc này theo các yếu tố logic trừu tượng, công cụ sau đó sẽ chuyển sang ánh xạ các phần tử trừu tượng đó lên các tài nguyên mà chip thực sự có.

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.