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를 선호.
- repeat 키워드를 사용할 수 도 있음.
- 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가 조금 더 간결.
- 차이점 : for loop에는 reference 가능한 로컬 변수가 포함.
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 로도 구현 가능.
- 변수를 배열에 할당하고 배열 위치를 밀면 됨.
- 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
반응형
'Verilog HDL > 1. Verilog HDL Basic (문법)' 카테고리의 다른 글
[Verilog Tutorial] level-8 Loops 모음 (0) | 2024.01.16 |
---|---|
[Loops] 2. 예제 풀이 (0) | 2024.01.16 |
[Verilog Tutorial] level-7 Statement 모음 (0) | 2024.01.13 |
[Verilog Tutorial] level-6 Testbench 모음 (0) | 2024.01.13 |
[Statement] 3. 예제 풀이 (1) | 2024.01.13 |