이 페이지를 읽었습니다. http://www.asic-world.com/verilog/verilog_one_day3.html 다음을 발견했을 때 :
일반적으로 플립 플롭을 재설정해야하므로 시계가 0에서 1로 전환 (포즈 지), 리셋이 어서 트 (동기 리셋)되었는지 확인한 다음 정상 논리로 진행합니다. 자세히 살펴보면 조합 논리의 경우 할당에는 “=”가 있고 순차 블록에는 “< =”연산자가 있음을 알 수 있습니다. 음, “=”은 할당을 차단하고 “< =”는 비 차단 할당입니다. “=”는 시작 / 끝 내에서 순차적으로 코드를 실행하는 반면 비 차단 “< =”는 병렬로 실행됩니다.
비 차단 할당은 순차적이고 차단 할당은 병렬이라고 확신했습니다. 결국 always 블록 외부의 assign 문을 사용하여 차단 할당을 할 수 있으며 모두 병렬로 실행됩니다. 이것은 실수입니까, 아니면 always 블록 내에서 동작이 다른가요? 그리고 always 블록 안에서 동작이 다른 경우, always 블록 외부에서 nonblocking 할당을 할 수 있습니까?
Answer
비 차단 할당은 순차적이고 차단 할당은 병렬이라고 확신했습니다.
차단 할당은 완료 될 때까지 다음 명령문의 실행을 차단 하기 때문에 “연속”으로 실행됩니다. 따라서 다음 명령문의 결과는 완료되는 첫 번째 명령문에 따라 달라질 수 있습니다.
비 차단 할당은 동시에 발생하는 할당을 설명하기 때문에 병렬로 실행됩니다. 두 번째 줄의 명령문 결과는 첫 번째 줄의 명령문 결과에 의존하지 않습니다. 대신 두 번째 줄은 첫 번째 줄이 아직 발생하지 않은 것처럼 실행됩니다.
코멘트
답변
Assign 문은 “차단”또는 “비 차단”이 아니며 “연속적”입니다. 할당 문의 출력은 항상 입력의 지정된 기능과 동일합니다. “차단”및 “비 차단”할당은 항상 블록 내에 만 존재합니다.
차단 할당은 처리되는 즉시 적용됩니다. nonblocking 할당은 현재 “시간 델타”처리가 끝날 때 발생합니다.
항상 블록을 사용하여 조합 또는 순차 논리를 모델링 할 수 있습니다 (systemverilog에는이를 명시 적으로 만들기 위해 always_comb 및 always_ff가 있음). 조합 논리는 일반적으로 =를 사용하는 것이 더 효율적이지만 일반적으로 중요하지 않습니다.
순차 논리를 모델링 할 때 (예 : 항상 @ (posedge clk)) 일반적으로 비 차단 어설 션을 사용합니다. “클럭 에지 이전의 상태”측면에서 “클럭 에지 이후의 상태”를 결정합니다.
순차 항상 블록의 차단 할당을 “변수”로 사용하는 것이 유용 할 때가 있습니다. 이렇게하면 명심해야 할 두 가지 주요 규칙이 있습니다.
- 할당 된 always 블록 외부에서 순차적 인 always 블록 내부의 차단 할당으로 설정된 reg.
- 동일한 reg에 차단 및 비 차단 할당을 혼합하지 마십시오.
이러한 규칙을 위반하면 시뮬레이션과 합성간에 합성 실패 및 / 또는 동작 차이가 발생할 수 있습니다.
댓글
- " " 순차적 내부 차단 할당으로 설정된 reg에 액세스하지 않음 항상 차단 외부에서 항상 차단 " " 설명해 주 시겠어요?
- 다른 순차적 인 항상 블록에는 정의 된 주문. 따라서 하나의 always 블록에서 다른 always 블록에서 차단 어설 션으로 설정된 " reg "를 읽으면 예측할 수없는 동작이 발생합니다.
- 시뮬레이션에서 작동하는 것처럼 보이더라도 합성 도구는이를보고 " nope "라고 말해야합니다. 중간 변수에 로컬 정규식을 사용하고 읽기 전에 항상 모든 시계에 할당되어 있는지 확인하여 ' 저장소 '는 묵시적입니다.
- 최소한 쿼터스에서 IIRC는 오류가 아닌 경고로만 간주됩니다.
- 조합 논리에서 비 차단 할당을 사용해서는 안되며 잠길 수 있습니다. 시뮬레이션. 자세한 내용은 다음 답변을 참조하십시오. electronics.stackexchange.com/a/506047/238188
답변
차단 할당 이라는 용어는 차단 이라는 단어가 시간순 논리를 암시하는 것처럼 보이기 때문에 사람들을 혼란스럽게합니다. 그러나 합성 논리에서는 이를 의미하지 않습니다. 왜냐하면 모든 것이 병렬 .
아마도 덜 혼동되는 용어는 즉시 할당 일 것입니다. 그래도 조합 논리의 중간 결과를 지연된 할당 을 가질 수있는 불투명 한 메모리 요소 (예 : 클럭 레지스터)에 대한 입력.
법적 관점에서 보면 모든 것이 매우 잘 작동합니다. 사실 always_comb
div 내에서도 =
를 차단 (시간순) 작업으로 간주 할 수 있습니다. > 시퀀스. 그러나 시간 순차와 병렬의 차이는 이 경우 always_comb
블록은 명령 시퀀스가 안정된 상태로 수렴 될 때까지 반복되도록 정의됩니다. 이는 하드웨어 회로가 정확히 수행하는 작업입니다 (타이밍 요구 사항을 충족하는 경우).
Verilog (특히 SystemVerilog)는 매우 간단하고 필요한 관용구를 알게되면 사용하기 쉽습니다. 언어의 소위 행동 요소와 관련된 용어의 현명한 사용을지나 치면됩니다.
assign
문은 always 블록 외부에서 발생하며 일반적으로 조합 (잠금 해제)을 설명하는 데 사용됩니다. ) 로직 (일부 예외를 제외하고 항상 블록은 순차적 로직을 설명 함). AFAIK,assign
문은 LHS에 값이 변경 될 때마다 항상 " 병렬 "을 실행합니다. .