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


15

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

우리는 일반적으로 플립 플롭을 재설정해야하므로 클럭이 0에서 1로 전환 될 때마다 (포지션) 재설정이 선언되어 있는지 (동기 재설정) 확인한 다음 일반 논리로 진행합니다. 자세히 살펴보면 조합 논리의 경우 할당에 "="가 있고 순차 블록에는 "<="연산자가 있음을 알 수 있습니다. "="는 할당을 차단하고 있으며 "<="는 차단을 해제하는 할당입니다. "="는 시작 / 종료 코드 내에서 순차적으로 코드를 실행하지만 비 차단 "<="은 병렬로 실행됩니다.

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

답변:


21

차단 할당이 병렬 인 동안 비 차단 할당이 순차적임을 확신했습니다.

차단 할당하기 때문에 "시리즈에서"할당이 실행을 차단 블록의 다음 명령문의 실행이 완료 될 때까지. 따라서 다음 진술의 결과는 첫 번째 진술의 결과에 따라 달라질 수 있습니다.

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


할당 문은 어떻습니까? 그들은 단지 자신의 전체 클래스에 있습니까?
Void Star

4
예. assign명령문은 항상 블록 외부에서 발생하며 일반적으로 조합형 (래칭되지 않은) 논리를 설명하는 데 사용됩니다 (일부 예외를 제외하고는 항상 순차적 논리를 설명하는 블록). AFAIK, assign진술은 LHS에 가치가 변경 될 때마다 항상 "병렬"로 실행됩니다.
광자

좋아 ... Verilog가 가장 우아하게 설계된 언어가 아니라는 인상을 받기 시작했습니다. 이것은 C를 배우는 것과 같습니다.
Void Star

1
Verilog는 이미 존재하는 하드웨어를 "설명"하도록 설계되었습니다. 하드웨어를 설계 (합성)하기위한 언어로 사용하는 것은 해킹입니다.
광자

4
Verilog "like learning C"가 문제인 경우 VHDL을 살펴보십시오. 어떤 사람들은 어느 한쪽을 선호하는 사람들이 있습니다. 어떤 사람들에게는 VHDL이 너무 장황합니다. 나에게 그것은 훨씬 더 나은 생각입니다. (신호 / 변수 할당 의미론은 차단 / 비 예제보다 훨씬 명확합니다). stackoverflow.com/questions/13954193/…sigasi.com/content/vhdls-crown-jewel 선호하거나 싫어할 수 있습니다. 그러나 볼만한 가치가 있습니다.
Brian Drummond

6

대 입문은 "차단"또는 "비 차단"이 아니며 "연속"입니다. assign 문의 출력은 항상 지정된 입력 함수와 같습니다. "차단"및 "비 차단"할당은 항상 블록 내에 만 존재합니다.

차단 할당은 처리 즉시 적용됩니다. 비 차단 할당은 현재 "시간 델타"처리가 끝날 때 발생합니다.

always 블록은 조합 논리 또는 순차 논리를 모델링하는 데 사용할 수 있습니다 (systemverilog에는 always_comb 및 always_ff가있어이를 명시 적으로 나타냄). 조합 논리를 모델링 할 때 일반적으로 사용하는 것이 더 효율적이지만 = 실제로는 중요하지 않습니다.

순차적 로직을 모델링 할 때 (예 : 항상 @ (posedge clk)) 일반적으로 비 차단 어설 션을 사용합니다. 이것에 의해, 「클록 엣지 전의 상태」로 「클록 엣지 후의 상태」를 결정할 수 있습니다.

순차적 할당 블록에서 차단 할당을 항상 "변수"로 사용하는 것이 유용한 경우가 있습니다. 이렇게하면 명심해야 할 두 가지 주요 규칙이 있습니다.

  1. 할당 된 상시 블록 외부에서 순차 상시 블록 내부에 차단 지정으로 설정된 reg에 액세스하지 마십시오.
  2. 차단과 비 차단 할당을 같은 레지스 터에 혼합하지 마십시오.

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


""순차 항상 블록 내부에서 블록 지정이 설정된 reg에 액세스하지 마십시오. 할당 된 항상 블록 외부에서. ""설명해 주시겠습니까? "
user125575

서로 다른 순차 블록에는 정의 된 순서가 없습니다. 따라서 항상 하나의 블록에서 다른 블록을 차단하는 "reg"세트를 읽으면 예측할 수없는 동작이 발생합니다.
피터 그린

그리고 그것이 시뮬레이션에서 작동하는 것처럼 보이더라도, 합성 도구는 그것을보고 "nope"라고 말해야합니다. 나는 중간 var에 로컬 reg를 사용하고, 읽기 전에 모든 시계에 항상 할당되어 있는지 확인하십시오. 따라서 '저장'이 암시되지 않습니다.
greggo

IIRC에서 적어도 석영에서는 오류가 아니라 경고로만 간주됩니다.
Peter Green

5

차단 이라는 용어는 사람들을 혼란스럽게합니다. 차단 이라는 단어 는 시간 순차 논리를 암시하는 것처럼 보입니다. 그러나 합성 된 논리에서 모든 것이 병렬로 작동 하기 때문에 이것이 의미하는 것은 아닙니다 .

혼동이 적은 용어는 즉각적인 할당 일 수 있으며, 할당에서 지연 될 수있는 비 투명 메모리 요소 (예 : 클럭 된 레지스터)의 입력과 조합 논리의 중간 결과를 여전히 차별화 할 수 있습니다 .

법적인 관점에서 보면 모든 것이 아주 훌륭하게 작동합니다. 실제로 시퀀스 내에서도 블로킹 (시간 순차) 작업으로 간주 할 =수 있습니다 . 그러나 명령 시퀀스가 ​​안정적인 상태로 수렴 될 때까지 블록이 반복되도록 정의 되기 때문에 시간 순차와 병렬의 구별 은이 경우에 전혀 차이없습니다. 요구 사항).always_combalways_comb

필요한 관용구를 알고 나면 Verilog의 합성 가능한 하위 집합 (특히 SystemVerilog)은 매우 간단 하고 사용하기 쉽습니다. 언어의 소위 행동 요소 와 관련된 용어를 영리하게 사용 하면됩니다.


에서 행동 코딩 스타일 ( 같은 RTL에 비해 ), 차단과 관련이있을 수 있습니다 비 차단의 차이. 일부 경우에, 합성 툴은 행동 컴포넌트 설계로부터 기능적으로 동등한 RTL을 추론 할 수있다.
nobar

물론 블록 내 명령문에 적용 할 수있는 SystemVerilog 의 절차 모드 는 (시간 순차) 블로킹 할당을 독점적으로 사용합니다. 이것은 테스트 벤치 설계에 유용 하지만 일반적으로 RTL 스펙 에는 유용 하지 않습니다. initialprogram
nobar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.