본문 바로가기
HW Design/1. Verilog HDL Basic

[Loops] 1. 베릴로그 loop문

by 한PU 2024. 1. 16.
728x90
반응형
  • loop
    • for loop
    • while loop
    • forever loop
    • repeat loop
      • 데이터가 할당되는 방식을 제어
      • sequential statements
        • always, initial block 등의 procedural blocks 안에서 사용 가능

Loops in Verilog

  • for loop 는 코드 블록을 정해진 횟수만큼 실행.
    • repeat 키워드를 사용할 수 도 있음.
      • for loops를 선호.
  • while loop 는 조건이 참인 동안 코드 블록을 실행.

Verilog forever loop

  • 무한히 돌아가는 코드 블록을 만들기 위해 사용.
    • clock 신호 생성 등.
  • not be synthesized -> 테스트벤치 코드에서만 사용 가능.
forever begin
    // code here
end

Forever loop example

  • 10MHz clock 신호 생성.
    • 먼저 신호를 초기 값에 할당.
    • forever block을 사용해 일정 간격으로 신호 인버팅.
      • 10MHz의 반주기 : 500ns
initial begin
    clock = 1'b0;
    forever begin
        #500 clk = ~clk;
    end
end
  • initial block (복습)
    • 시뮬레이션이 시작될 때 한 번 실행됨.
    • 테스트벤치 코드는 always 블록보다 initial 블록을 훨씬 많이 사용.
      • 일반적으로 테스트를 한번만 실행하면 됨.
  • # 기호를 통해 delay 모델링 (복습)
    • timescale compiler directive 를 통해 시간 단위 정의.
    • 1ns / 1ps

Verilog repeat loop

  • 코드 블록을 정해진 횟수만큼 실행.
    • loop 선언 시 실행 횟수를 지정.
  • 테스트벤치에서 일반적으로 사용되지만, synthesizable code 에서도 사용 가능.
    • synthesizable code 에서는 반복 구조를 설명하는 데에만 사용할 수 있음을 주의. (?)
repeat (<number>) begin
    // code here
end
  • <\number>
    • 반복 횟수 지정.
  • for loop와 매우 유사.
    • 차이점 : for loop에는 reference 가능한 로컬 변수가 포함.
      • 이 변수의 값은 루프를 반복할 때 마다 업데이트.
      • i++ 느낌.
    • 로컬 변수 i 를 활용하지 않는 경우 repeat loop가 조금 더 간결.

Repeat Loop Example

  • 다른 신호의 rising edge 시 토글하려는 신호.
  • 토글 동작은 총 6번만 적용되도록 함.
repeat (6) begin
    @(posedge sig_a)
    sig_b = ~sig_b;
end
  • @ 기호
    • 이벤트가 발생할 때까지 기다리라는 것.

Verilog while Loop

  • 주어진 조건이 참인 동안 코드 블록 실행.
    • 조건은 루프 시작 전에 평가.
  • not synthesizable
    • 테스트벤치에서 stimulus를 생성하기 위해 자주 사용.
while <condition> begin
    // code here
end
  • <\condition>
    • 조건문 작성

while loop Example

  • 0에서 3으로 증가하는 정수형 변수를 생성.
  • 루프를 반복할 때마다 변수의 값을 출력.
  • 간단한 예시
while (iter < 4) begin
    $display("iter = %0d", iter);
    iter = iter + 1;
end
  • 테스트벤치 코드
module loop_example;
    integer iter;

    initial begin
        iter = 0;

        while (iter < 4) begin
            $display("iter = %0d", iter);
            iter = iter + 1;
        end
    end

endmodule

Verilog For Loop

  • 코드 블록을 정해진 횟수만큼 실행.
  • 테스트벤치에서 일반적으로 사용.
  • synthesizable code 에서도 사용 가능.
    • 하드웨어 섹션 복제에 사용.
      • shift register.
  • 로컬 변수 존재.
for (<initial_condition>; <stop_condition>; <increment>) begin
    // code here
end
  • <\initial_condition>
    • 루프 변수의 초기값 설정.
      • 루프에서 사용하는 변수를 먼저 선언해야 코드에서 사용 가능.
  • <\stop_condition>
    • 실행되는 횟수를 결정.
  • <\increment>
    • 루프 변수가 업데이트되는 방식을 결정.

Verilog for loop example

  • 4bit serial shift register.
    • verilog array 로도 구현 가능.
      • 변수를 배열에 할당하고 배열 위치를 밀면 됨.
// input이 첫번째 register로 들어감.
shift[0] <= circuit_in;

// shifting
for (i = 1; i < 4; i = i + 1) begin
    shift[i] <= shift[i-1];
end
  • non-blocking 할당을 사용.
    • shift register는 sequential logic 이기 때문
    • always block 내에서 작성해야 함.
      • <= 사용
728x90
반응형