UVM & RTL/Verilog HDL

[Verilog HDL] CH7 루프

Return 2022. 6. 14. 14:54

Introduce 

Verilog에는 4가지 형식의 루프문이 있다. 모든 루프 문장은 initail, always블록 안에 위치해야 한다.

  • while 
  • for 
  • repeat 
  • forever 

While 루프 

while-수식이 거짓이 될 때까지 수행한다. 다음은 while 루프의 사용법이다. 

// 0부터 127까지 카운트 예제 
integer count;

initial begin
    count = 0;
    while (count <128) begin 
        $display("Count = %d",count);
        count = count + 1;
    end
end

// 플래그에서 처음으로 1의 값을 갖는 비트를 찾는 예제 
`define TRUE 1'b1;
`define FALSE 1'b0;
reg[15:0] flag;
integer i;
reg continue;

initial begin 
    flag = 16'b 0010_0000_0000_0000;
    i = 0;
    continue = `TRUE;

    while((i<16)&&continue) begin 
        if(flag[i]) begin 
            $display("Ture bit at element number d%",i);
            continue = `FALSE;
        end
        i = i+1;
    end
end

For 루프 

for루프는 3가지 부분을 나뉜다. 

  • 초기화 상태 
  • 종료 상태가 참인지를 판단 
  • 제어 변수의 값을 바꾸기 위한 절차적 할당 
integer count ;

initial 
    for(count=0;count<128;count=count+1)
        $display("Count = %d",count);

for루프는 아래에서 처럼 배열이나 메모리를 초기화하는데 쓰일 수 있다. 

`define MAX_STATES 32
integer state [0:`MAX_STATES-1]; // 원소 0:31dmf 가진 정수형 배열 상태 
integer i;

initial begin
    for(i=0;i<32;i=i+2) // 모든 짝수 위치에 0으로 초기화 
        state[i] = 0;
    for(i=1;i<32;i=i+2) // 모든 홀수 위치에 1으로 초기화 
        state[i] = 1;
end

Repeat 루프 

repeat구조는 정해진 힛수만큼 루프를 수행한다. 일반적인 논리 수식의 루프에 쓰여 질 수 없다. 그런 상황에서는 while루프가 사용된다. repeat구조는 반드시 상수, 하나의 변수또는 하나의 값이 될 수 있는 숫자를 포함해야한다. 

// 데이터 버퍼 모듈의 예
// 데이터 시작 신호를 받은 후 다음 8cycle동안 데이터를 받는다. 

module data_buffer(
    parameter cycles = 8;
    input data_start;
    input [15:0] data;
    input clk;

    reg[15:0] buffer [0:7];
    integer i;
);

always @(posedge clk) begin 
    if(data_start) begin 
        i = 0;
        repeat(cycles) begin
            @(posedge clk) buffer[i] = data;
            i = i+1;
        end
    end
end
endmodule

Forever 루프 

루프는 어떤 수식도 포함하지 않고, $finish task를 만날 때까지 계속 수행한다. 이 루프는 항상 참값을 갖는 while(1)루프와 동일하다. forever루프는 일반적으로 타이밍 제어 구조와 같이 쓰인다. 사용법은 다음과 같다. 

// 클럭 생성 always대신 forever사용 
reg clock;

initial begin 
    clock = 1'b0;
    forever #10 clock = ~clock;
end

// 매 클럭의 상승엣지에서 두 개의 레지스터가 동기화 된다. 
reg clock;
reg x,y;

initial 
    forever @(posedge clock) x = y;