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 루프를 사용하는지 여부에 관계없이 동일한 규칙이 적용됩니다. 생성 블록에서.
절차 적 블록, initial
및 always
에서 완료되면 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”>
' 블록을 포함하는 블록을 인스턴스화하는 지점에서 ' 항목을 실행합니다. ' 생성-실행 시간에 발생하지 않음 ' (절차 적 루프와 달리)
loopName
는 인스턴스 이름이나 신호 이름과 같은 텍스트입니다. 원하는 모든 것이 될 수 있습니다.