차단 및 비 차단 할당의 차이점 Verilog

이 페이지를 읽었습니다. http://www.asic-world.com/verilog/verilog_one_day3.html 다음을 발견했을 때 :

일반적으로 플립 플롭을 재설정해야하므로 시계가 0에서 1로 전환 (포즈 지), 리셋이 어서 트 (동기 리셋)되었는지 확인한 다음 정상 논리로 진행합니다. 자세히 살펴보면 조합 논리의 경우 할당에는 “=”가 있고 순차 블록에는 “< =”연산자가 있음을 알 수 있습니다. 음, “=”은 할당을 차단하고 “< =”는 비 차단 할당입니다. “=”는 시작 / 끝 내에서 순차적으로 코드를 실행하는 반면 비 차단 “< =”는 병렬로 실행됩니다.

비 차단 할당은 순차적이고 차단 할당은 병렬이라고 확신했습니다. 결국 always 블록 외부의 assign 문을 사용하여 차단 할당을 할 수 있으며 모두 병렬로 실행됩니다. 이것은 실수입니까, 아니면 always 블록 내에서 동작이 다른가요? 그리고 always 블록 안에서 동작이 다른 경우, always 블록 외부에서 nonblocking 할당을 할 수 있습니까?

Answer

비 차단 할당은 순차적이고 차단 할당은 병렬이라고 확신했습니다.

차단 할당은 완료 될 때까지 다음 명령문의 실행을 차단 하기 때문에 “연속”으로 실행됩니다. 따라서 다음 명령문의 결과는 완료되는 첫 번째 명령문에 따라 달라질 수 있습니다.

비 차단 할당은 동시에 발생하는 할당을 설명하기 때문에 병렬로 실행됩니다. 두 번째 줄의 명령문 결과는 첫 번째 줄의 명령문 결과에 의존하지 않습니다. 대신 두 번째 줄은 첫 번째 줄이 아직 발생하지 않은 것처럼 실행됩니다.

코멘트

  • 그렇다면 assign 문은 어떻습니까? 그것들은 단지 자신의 전체 클래스에 속합니까?
  • 예, assign 문은 always 블록 외부에서 발생하며 일반적으로 조합 (잠금 해제)을 설명하는 데 사용됩니다. ) 로직 (일부 예외를 제외하고 항상 블록은 순차적 로직을 설명 함). AFAIK, assign 문은 LHS에 값이 변경 될 때마다 항상 " 병렬 "을 실행합니다. .
  • 알겠습니다. ' Verilog가 ' 가장 많지 않다는 인상을 받기 시작했습니다. 우아하게 디자인 된 언어. 이것은 C를 배우는 것과 같습니다.
  • Verilog는 이미 존재하는 하드웨어를 " 설명 "하도록 설계되었습니다. 하드웨어를 설계 (합성)하는 언어로 사용하는 것은 해킹입니다.
  • Verilog 인 경우 " 학습 C "가 문제입니다. VHDL을 살펴보십시오. 어떤 사람들은 둘 중 하나를 상당히 선호합니다. 어떤 사람들에게는 VHDL이 너무 장황합니다. 저에게는 ' 훨씬 더 잘 생각하고 있습니다. (예를 들어 신호 / 변수 할당 의미는 차단 / 비보다 훨씬 명확합니다). stackoverflow.com/questions/13954193/ … 시가시 .com / content / vhdls-crown-jewel 선호하거나 싫어할 수 있습니다. 하지만 ' 살펴볼 가치가 있습니다.

답변

Assign 문은 “차단”또는 “비 차단”이 아니며 “연속적”입니다. 할당 문의 출력은 항상 입력의 지정된 기능과 동일합니다. “차단”및 “비 차단”할당은 항상 블록 내에 만 존재합니다.

차단 할당은 처리되는 즉시 적용됩니다. nonblocking 할당은 현재 “시간 델타”처리가 끝날 때 발생합니다.

항상 블록을 사용하여 조합 또는 순차 논리를 모델링 할 수 있습니다 (systemverilog에는이를 명시 적으로 만들기 위해 always_comb 및 always_ff가 있음). 조합 논리는 일반적으로 =를 사용하는 것이 더 효율적이지만 일반적으로 중요하지 않습니다.

순차 논리를 모델링 할 때 (예 : 항상 @ (posedge clk)) 일반적으로 비 차단 어설 션을 사용합니다. “클럭 에지 이전의 상태”측면에서 “클럭 에지 이후의 상태”를 결정합니다.

순차 항상 블록의 차단 할당을 “변수”로 사용하는 것이 유용 할 때가 있습니다. 이렇게하면 명심해야 할 두 가지 주요 규칙이 있습니다.

  1. 할당 된 always 블록 외부에서 순차적 인 always 블록 내부의 차단 할당으로 설정된 reg.
  2. 동일한 reg에 차단 및 비 차단 할당을 혼합하지 마십시오.

이러한 규칙을 위반하면 시뮬레이션과 합성간에 합성 실패 및 / 또는 동작 차이가 발생할 수 있습니다.

댓글

  • " " 순차적 내부 차단 할당으로 설정된 reg에 액세스하지 않음 항상 차단 외부에서 항상 차단 " " 설명해 주 시겠어요?
  • 다른 순차적 인 항상 블록에는 정의 된 주문. 따라서 하나의 always 블록에서 다른 always 블록에서 차단 어설 션으로 설정된 " reg "를 읽으면 예측할 수없는 동작이 발생합니다.
  • 시뮬레이션에서 작동하는 것처럼 보이더라도 합성 도구는이를보고 " nope "라고 말해야합니다. 중간 변수에 로컬 정규식을 사용하고 읽기 전에 항상 모든 시계에 할당되어 있는지 확인하여 ' 저장소 '는 묵시적입니다.
  • 최소한 쿼터스에서 IIRC는 오류가 아닌 경고로만 간주됩니다.
  • 조합 논리에서 비 차단 할당을 사용해서는 안되며 잠길 수 있습니다. 시뮬레이션. 자세한 내용은 다음 답변을 참조하십시오. electronics.stackexchange.com/a/506047/238188

답변

차단 할당 이라는 용어는 차단 이라는 단어가 시간순 논리를 암시하는 것처럼 보이기 때문에 사람들을 혼란스럽게합니다. 그러나 합성 논리에서는 이를 의미하지 않습니다. 왜냐하면 모든 것이 병렬 .

아마도 덜 혼동되는 용어는 즉시 할당 일 것입니다. 그래도 조합 논리의 중간 결과를 지연된 할당 을 가질 수있는 불투명 한 메모리 요소 (예 : 클럭 레지스터)에 대한 입력.

법적 관점에서 보면 모든 것이 매우 잘 작동합니다. 사실 always_comb=를 차단 (시간순) 작업으로 간주 할 수 있습니다. > 시퀀스. 그러나 시간 순차와 병렬의 차이는 이 경우 always_comb 블록은 명령 시퀀스가 안정된 상태로 수렴 될 때까지 반복되도록 정의됩니다. 이는 하드웨어 회로가 정확히 수행하는 작업입니다 (타이밍 요구 사항을 충족하는 경우).

Verilog (특히 SystemVerilog)는 매우 간단하고 필요한 관용구를 알게되면 사용하기 쉽습니다. 언어의 소위 행동 요소와 관련된 용어의 현명한 사용을지나 치면됩니다.

댓글

  • 행동 코딩 스타일 ( RTL과 비교 )에서 차단과 비 차단의 구분이 관련 될 수 있습니다. 경우에 따라 합성 도구가 동작 구성 요소 설계에서 기능적으로 동일한 RTL을 추론 할 수 있습니다.
  • 물론 절차 SystemVerilog 모드, 특히 program 블록 내의 initial 문에 적용되며 (시간순) 차단 할당을 사용합니다. 독점적으로. 이것은 testbench 디자인에 유용하지만 일반적으로 RTL 사양에는 유용하지 않습니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다