차단과 비 차단 할당의 차이점 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.