Synthesizable For 루프 및 생성

에 대한 질문

Verilog 언어와 Zedboard를 타겟 보드로 사용하고 있습니다.

내가 아는 한 , for 루프를 합성 할 수 있으며 합성 도구는 for 루프를 루프 언 롤링과 같은 중복 된 명령 시퀀스로 변환합니다.

예 :

for ( i = 0; i < 4; i=i+1) begin mem[i] = i; end will be translated to mem[0] = 0; mem[1] = 1; mem[2] = 2; mem[3] = 3; 

그러므로 내가 아는 한, 리소스가 다중이지만 동일한 목적의 게이트를 추론 할 수있는 경우 for 루프를 사용할 수 있습니다.

그러나 Verilog에서 생성하는 것 같습니다. 여러 인스턴스를 의미 할뿐만 아니라 for 루프와 동일한 여러 명령어도 사용할 수 있습니다.

생성은 모듈의 여러 인스턴스 만 암시 할 수 있으며 for 루프는 사용할 수 없음을 이해합니다. 그 목적을 위해.

그럼 generate + for 루프와 for 루프의 차이점은 무엇입니까? 나는 둘 다 루프 풀기처럼 작동한다고 생각합니다. 눈에 띄는 차이가 있습니까? 차이가 없다면 루프 언 롤링을 유도하는 데 선호되는 코딩 스타일은 무엇입니까?

코멘트

  • 명확성을 위해 ' s : 추측합니다. 예 : Verilog / VHDL에서 RAM을 암시하면 합성 소프트웨어가 Verilog / VHDL에서 해당 RAM을 추론합니다. 매우 흔한 실수이며 배울 가치가 있습니다.

답변

Verilog for-loop는 특정 조건에서 완벽하게 합성 할 수 있습니다.

  • 루프 내에서 모든 절차 문을 사용할 수 있습니다 (예 : if-else).
  • 루프 수 사전 정의 여야합니다.
    • 제한 표현식은 루프 변수와 상수 또는 매개 변수 간의 비교 여야합니다.
    • 단계 할당은 루프 값을 일정한 양만큼 증가시켜야합니다.
  • 각 루프의 동일한 변수에 다른 값을 할당 할 수 있습니다 (예 : 루프 변수에서 색인 계산).
  • 합성 목적을 위해 루프가 평가됩니다. 제로 시간에 – 즉, 카운터를 만들려고하면 최종 값만 볼 수 있습니다.

절차 적 블록에서 for 루프를 사용하는지 여부에 관계없이 동일한 규칙이 적용됩니다. 생성 블록에서.

절차 적 블록, initialalways에서 완료되면 for 루프를 사용하여 배열의 요소를 변경하거나 (예와 같이) 동일한 값을 여러 번 변경할 수 있습니다. 예를 들면 다음과 같습니다.

for (idx = 0; idx < 4; idx=idx+1) begin a = a + b[idx]; c = c + 2; //You can change more than one variable in a for loop end 

이 예에서 결과 하드웨어는 4 개의 배열 인덱스의 값을 합산하는 가산기 체인이됩니다.

핵심은 for 루프에서 새 변수 나 모듈을 만들 수 없다는 것입니다. 이 규칙은 for 루프뿐만 아니라 일반적으로 절차 블록에 적용됩니다 (예 : 절차 블록에서 변수를 선언 할 수 없음).

 

반면 생성 블록은 변수 생성 및 모듈 인스턴스화를 허용합니다. 즉, 생성 블록에서 generate for 루프를 사용하여 모듈을 추론 할 수 있습니다. 이것이 유일한 차이점입니다.

for 루프를 생성하려면 genvar를 루프 변수로 사용해야합니다 (즉, 각 루프를 계산하는 데 사용하는 값). 또한 for 루프에 이름을 지정해야합니다.

for (loopVal = 0; loopVal < 4; loopVal = loopVal + 1) begin : loopName 

이 이름은 루프에서 인스턴스화하는 모든 하드웨어에 추가됩니다. 따라서 bob라는 인스턴스를 만드는 경우 위의 루프는 인스턴스를 만듭니다.

loopName[0]|bob loopName[1]|bob loopName[2]|bob loopName[3]|bob 

고유 한 이름을 가진 인스턴스.

 

생성 및 절차 for 루프 모두 사용자가 말한대로 루프 언 롤링을 수행합니다. 차이점은 단순히 사용 방법입니다. 절차 적 블록 (예 : 메모리 초기화)에서 절차 적 블록을 사용할 수 있습니다. Generate는 블록 생성에서만 사용할 수 있습니다.

유용하고 선호되는 것입니다. 하나는 다른 것을 대체 할 수 없습니다.

코멘트

  • 생성을 생각하는 또 다른 방법은 일종의 전처리 기인 verilog 컴파일러입니다. div id = “22b279d41e”>

' 블록을 포함하는 블록을 인스턴스화하는 지점에서 ' 항목을 실행합니다. ' 생성-실행 시간에 발생하지 않음 ' (절차 적 루프와 달리)

  • @Taniwha 절차 적 루프는 ' t 실행 시간에도 실행되지 않습니다. 컴파일러에 의해 언 롤링됩니다. 결국 하드웨어로 귀결됩니다. 또한 전처리기를 generate 문과 혼동하지 마십시오. ' 동일한 개념-Verilog에는 if-else 유형 문을 포함하는 전처리 기가 있습니다.
  • @TomCarpenter 훌륭한 답변에 감사드립니다. 생성 for 루프를 제외한 모든 요점을 이해할 수있었습니다.for 루프 바로 앞에 begin : something 을 추가해야하는 것 같지만 모듈 인스턴스화에서 어떻게 작동하는지 이해할 수 없습니다. loopName이 변수입니까 아니면 문자열입니까? 그리고 [1]에서 [4]까지 색인화하는 방법.
  • @JaeHyukLee loopName는 인스턴스 이름이나 신호 이름과 같은 텍스트입니다. 원하는 모든 것이 될 수 있습니다.
  • @TomCarpenter-컴파일러에 따라 다릅니다. ' 게이트를 컴파일하는 경우 예, ' 시뮬레이션을 위해 코드를 컴파일하지 않을 가능성이 높습니다 (면책 조항, ' Verilog 컴파일러를 작성했습니다)
  • 답글 남기기

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