Sự khác biệt giữa chặn và chặn chặn gán Verilog


15

Tôi đã đọc trang này http://www.asic-world.com/verilog/verilog_one_day3.html khi tôi gặp những điều sau:

Chúng ta thường phải thiết lập lại flip-flop, do đó, mỗi khi đồng hồ thực hiện quá trình chuyển đổi từ 0 sang 1 (posedge), chúng ta kiểm tra xem thiết lập lại có được xác nhận (thiết lập lại đồng bộ) không, sau đó chúng ta tiếp tục với logic thông thường. Nếu chúng ta nhìn kỹ, chúng ta sẽ thấy rằng trong trường hợp logic tổ hợp, chúng ta có "=" cho phép gán và đối với khối tuần tự, chúng ta có toán tử "<=". Chà, "=" đang chặn gán và "<=" là bỏ chặn gán. "=" thực thi mã tuần tự bên trong một bắt đầu / kết thúc, trong khi việc bỏ chặn "<=" thực thi song song.

Tôi khá chắc chắn rằng các bài tập không chặn là tuần tự trong khi việc chặn bài tập là song song. Rốt cuộc, bạn có thể thực hiện các bài tập chặn với các câu lệnh gán bên ngoài các khối luôn và các câu lệnh đó chạy song song. Đây có phải là một sai lầm, hoặc là hành vi khác nhau trong một khối luôn luôn? Và, nếu hành vi IS khác bên trong một khối luôn, các phép gán không chặn có thể được thực hiện bên ngoài một khối luôn không?

Câu trả lời:


21

khá chắc chắn rằng các bài tập không chặn là tuần tự trong khi việc chặn bài tập là song song.

Chặn nhiệm vụ thực thi "theo chuỗi" vì một nhiệm vụ chặn chặn thực thi lệnh sau cho đến khi hoàn thành. Do đó, kết quả của câu lệnh tiếp theo có thể phụ thuộc vào câu đầu tiên được hoàn thành.

Nhiệm vụ không chặn thực thi song song vì nó mô tả các nhiệm vụ mà tất cả xảy ra cùng một lúc. Kết quả của một tuyên bố trên dòng thứ 2 sẽ không phụ thuộc vào kết quả của tuyên bố trên dòng thứ nhất. Thay vào đó, dòng thứ 2 sẽ thực thi như thể dòng thứ 1 chưa xảy ra.


Vậy những gì về bài tập gán? Có phải họ chỉ trong một lớp học của riêng mình?
Ngôi sao trống

4
Có, các assigncâu lệnh xảy ra bên ngoài các khối luôn và thường được sử dụng để mô tả logic logic tổ hợp (không chốt) (trong khi luôn luôn chặn, với một số ngoại lệ, mô tả logic tuần tự). AFAIK, các assigncâu lệnh luôn luôn thực thi "song song" bất cứ khi nào LHS của chúng có giá trị thay đổi.
Photon

Được rồi ... Tôi bắt đầu có ấn tượng rằng Verilog không phải là ngôn ngữ được thiết kế thanh lịch nhất. Điều này sẽ giống như học C là.
Ngôi sao trống

1
Verilog được thiết kế để "mô tả" phần cứng đã tồn tại. Sử dụng nó như một ngôn ngữ để thiết kế (tổng hợp) phần cứng là một hack.
Photon

4
nếu Verilog "thích học C" là một vấn đề, hãy xem VHDL. Một số người có sở thích khá mạnh mẽ cho người này hay người kia. Đối với một số người, VHDL chỉ là quá dài dòng. Đối với tôi, nó tốt hơn nhiều nghĩ ra. (ví dụ ngữ nghĩa gán tín hiệu / biến rõ ràng hơn nhiều so với chặn / không chẳng hạn). stackoverflow.com/questions/13954193/ Lờisigasi.com/content/vhdls-crown-jewel Bạn có thể thích nó hoặc ghét nó. Nhưng nó đáng để xem.
Brian Drumond

6

Các câu lệnh gán không phải là "chặn" hoặc "không chặn", chúng là "liên tục". Đầu ra của một câu lệnh gán luôn bằng với chức năng được chỉ định của các đầu vào của nó. Bài tập "chặn" và "không chặn" chỉ tồn tại trong các khối luôn.

Một nhiệm vụ chặn sẽ ảnh hưởng ngay lập tức nó được xử lý. Việc gán không chặn diễn ra vào cuối quá trình xử lý "đồng bằng thời gian" hiện tại.

luôn luôn có thể sử dụng các khối để mô hình hóa logic logic tổ hợp hoặc tuần tự (systemverilog has always_comb và always_ff để làm cho điều này rõ ràng). Khi mô hình hóa logic tổ hợp, nó thường hiệu quả hơn để sử dụng = nhưng nó thường không thực sự quan trọng.

Khi mô hình hóa logic tuần tự (ví dụ: luôn luôn @ (posedge clk)), bạn thường sử dụng các xác nhận không chặn. Điều này cho phép bạn hủy bỏ "trạng thái sau cạnh đồng hồ" về mặt "trạng thái trước cạnh đồng hồ".

Đôi khi rất hữu ích khi sử dụng các bài tập chặn trong chuỗi liên tục luôn chặn dưới dạng "biến". Nếu bạn làm điều này thì có hai quy tắc chính cần ghi nhớ.

  1. Không truy cập vào một reg được thiết lập với việc chặn các bài tập bên trong một khối luôn tuần tự từ bên ngoài khối luôn được gán.
  2. Không trộn lẫn các bài tập chặn và bỏ chặn cho cùng một reg.

Việc phá vỡ các quy tắc này có thể dẫn đến thất bại tổng hợp và / hoặc khác biệt về hành vi giữa mô phỏng và tổng hợp.


"" Không truy cập một reg được thiết lập với việc chặn các bài tập bên trong một chuỗi luôn luôn bị chặn từ bên ngoài khối luôn được gán. "" Bạn có thể giải thích nó không?
dùng125575

Các chuỗi liên tục khác nhau luôn không có thứ tự xác định. Vì vậy, đọc một "reg" được thiết lập với một giả định chặn trong một khối luôn luôn từ khối khác luôn luôn sẽ dẫn đến hành vi không thể đo lường được.
Peter Green

Và ngay cả khi nó có vẻ hoạt động trong mô phỏng, một công cụ tổng hợp nên nhìn vào đó và nói "không". Tôi sử dụng regs cục bộ cho các vars trung gian đó và đảm bảo rằng chúng luôn được gán cho mỗi đồng hồ trước khi được đọc, để không có 'lưu trữ' được ngụ ý.
greggo

IIRC ít nhất trong bộ tứ, nó chỉ được coi là một cảnh báo không phải là một lỗi.
Peter Green

5

Thuật ngữ Chặn phân công khiến mọi người nhầm lẫn vì việc chặn từ dường như gợi ý logic theo trình tự thời gian. Nhưng trong logic tổng hợp, nó không có nghĩa này , bởi vì mọi thứ hoạt động song song .

Có lẽ một thuật ngữ ít gây nhầm lẫn sẽ được chỉ định ngay lập tức , nó vẫn phân biệt các kết quả trung gian của logic tổ hợp với các yếu tố bộ nhớ không trong suốt (ví dụ như các thanh ghi có xung nhịp), có thể bị trễ gán .

Từ quan điểm pháp lý, tất cả hoạt động rất độc đáo. Trên thực tế, bạn có thể coi đó =là một hoạt động chặn (tuần tự thời gian) ngay cả trong always_combcác chuỗi. Tuy nhiên, sự khác biệt giữa tuần tự thời gian và song song hoàn toàn không có sự khác biệt trong trường hợp này bởi vì always_combkhối được xác định lặp lại cho đến khi chuỗi lệnh hội tụ ở trạng thái ổn định - đó chính xác là những gì mạch phần cứng sẽ làm (nếu đáp ứng thời gian yêu cầu).

Tập hợp con tổng hợp của Verilog (và đặc biệt là SystemVerilog) cực kỳ đơn giản và dễ sử dụng - một khi bạn biết các thành ngữ cần thiết. Bạn chỉ cần vượt qua việc sử dụng thuật ngữ thông minh liên quan đến các yếu tố hành vi được gọi là trong ngôn ngữ.


Trong các kiểu mã hóa hành vi ( so với RTL ), sự khác biệt giữa chặn và không chặn có thể liên quan. Trong một số trường hợp, công cụ tổng hợp có thể suy ra RTL tương đương về chức năng từ các thiết kế thành phần hành vi.
tộc 21/07/2015

Tất nhiên, chế độ thủ tục của SystemVerilog, đặc biệt áp dụng cho các initialcâu lệnh trong programcác khối, chỉ sử dụng phép gán chặn (tuần tự theo thời gian) . Điều này rất hữu ích cho thiết kế testbench , nhưng thường không dành cho đặc tả RTL.
tộ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.