본문 바로가기
Digital Hardware Design/System verilog

Control - loop

by 꿀벌이목표 2022. 10. 9.
반응형

Ⅰ. Loop의 종류

- 여러 언어들의 Loop 형태를 모두 가지고 있다고 볼 수 있다.

    + C언어, Python 등 일반적인 프로그래밍 언어에서 사용되는 loop 형태와 거의 유사하거나 동일함

 

forever 무한루프
repeat 주어진 수 만큼 loop
while C언어와 동일, 조건이 불만족할때 까지 Loop
for C언어와 동일, 조건이 불만족할때 까지 Loop
do while C언어와 동일, 조건이 불만족할때 까지 Loop
* while과 다른점은 최초 1번은 loop를 수행
foreach array 형태의 변수를 가지고 사용하는데, 자동적으로 0에서부터 array의 가장 끝 element까지 loop를 수행

Ⅱ. while / do-while

- C언어와 형태 및 사용법이 동일하므로 간단하게만 설명드리겠습니다.

- while : 조건이 만족할 때까지 loop 동작 수행

- do-while : 조건이 만족할 때까지 loop 동작 수행, 위와 다른 점은 최초 1번은 loop를 수행한다는 점

while (<조건>) begin
	// 동작 구현
end

do begin
	// 동작 구현
end while (<조건>);

ⅰ. Simulation

- 예제를 참고하여 간단한 simulation 진행.

 

module sverilog_while();
	initial begin
		int cnt_do_while = 0;
		int cnt_while = 0;
		do begin
			$display("cnt_do_while = %0d", cnt_do_while);
			cnt_do_while++;
		end while (cnt_do_while == 0);
		
		
		while (cnt_while < 10) begin
			$display ("cnt_while = %0d", cnt_while);
			cnt_while++;
		end
	end
endmodule

- 결과는 아래 참고하세요!

더보기

# run 1000ns
cnt_do_while = 0
cnt_while = 0
cnt_while = 1
cnt_while = 2
cnt_while = 3
cnt_while = 4
cnt_while = 5
cnt_while = 6
cnt_while = 7
cnt_while = 8
cnt_while = 9

Ⅲ. for

- C언어와 형태 및 사용법이 동일하므로 간단하게만 설명드리겠습니다.

- 조건이 만족할 때까지 loop 동작 수행 (*while과 동일하나, 모양이 다릅니다!)

for ( [초기화]; <조건>; [수정내용])
	// 실행하는 내용이 1개이면, begin-end 생략가능

for ( [초기화]; <조건>; [수정내용])
begin
	// 실행하는 내용이 2개 이상이면, begin-end 추가
end

ⅰ. Simulation

- 예제를 참고하여 간단한 simulation 진행.

module sverilog_for();
	string for_ex1 [5] = '{"AAAAAAAAAAA", "BBBBBBBBBBB", "CCCCCCCCCCCC", "DDDDDDDDDDDD", "EEEEEEEEEEE"};
	string for_ex2 [10] = '{"AAAAAAAAAAA", "BBBBBBBBBBB", "CCCCCCCCCCCC", "DDDDDDDDDDDD", 
							"EEEEEEEEEEE", "FFFFFFFFFFF", "GGGGGGGGGGGG", "GGGGGGGGGGGG",
							"IIIIIIIIIII", "JJJJJJJJJJJ"};
	initial
	begin
		for (int i = 0, j = 2; i < $size(for_ex1); i++)
		begin
			for_ex1[i][j] = "0";
			$display ("for_ex1[%0d] = %s, %0dth index replaced by 0", i, for_ex1[i], j);
		end
		$display ("=================EXAM2===========");
		for (int i = 0, j = for_ex2[i].len() - 1; i < $size(for_ex2); i++, j--)
		begin
			for_ex2[i][j] = "0";
			$display ("for_ex2[%0d] = %s, %0dth index replaced by 0", i, for_ex2[i], j);
		end
	end
endmodule

- 결과는 아래 참고하세요!

더보기

run all
for_ex1[0] = AA0AAAAAAAA, 2th index replaced by 0
for_ex1[1] = BB0BBBBBBBB, 2th index replaced by 0
for_ex1[2] = CC0CCCCCCCCC, 2th index replaced by 0
for_ex1[3] = DD0DDDDDDDDD, 2th index replaced by 0
for_ex1[4] = EE0EEEEEEEE, 2th index replaced by 0
=================EXAM2===========
for_ex2[0] = AAAAAAAAAA0, 10th index replaced by 0
for_ex2[1] = BBBBBBBBB0B, 9th index replaced by 0
for_ex2[2] = CCCCCCCC0CCC, 8th index replaced by 0
for_ex2[3] = DDDDDDD0DDDD, 7th index replaced by 0
for_ex2[4] = EEEEEE0EEEE, 6th index replaced by 0
for_ex2[5] = FFFFF0FFFFF, 5th index replaced by 0
for_ex2[6] = GGGG0GGGGGGG, 4th index replaced by 0
for_ex2[7] = GGG0GGGGGGGG, 3th index replaced by 0
for_ex2[8] = II0IIIIIIII, 2th index replaced by 0
for_ex2[9] = J0JJJJJJJJJ, 1th index replaced by 0

Ⅳ. forever

- Verilog HDH에서 있는 forever와 형태 및 사용법이 동일하므로 간단하게만 설명드리겠습니다.

- 무한 loop를 수행합니다.

    + 무한 loop 이기 떄문에, loop를 벗어나기 위해서는 break 문을 사용하여야 합니다!

- 추가적으로 이야기를 더 드리면, forever는 class 내에서 procedure block들 내에서 사용됩니다!

    + 'always'를 class 내에서 procedure block에서 사용을 못하기 때문이죠!

forever
	// 1개의 수행 문장

forever
begin
	// 2개 이상의 수행 문장
end

 

Ⅴ. repeat

- Verilog HDH에서 있는 forever와 형태 및 사용법이 동일하므로 간단하게만 설명드리겠습니다.

- 주어진 횟수만큼만 loop를 반복합니다.

repeat (<number>)
	// 1개의 수행문장

repeat (<loop 수행 횟수>) 
begin
	// 2개 이상의 수행 문장
end

- repeat는 아래의 for문과 동일하다고 할 수 있습니다. 왜냐하면 loop를 수행하는 횟수는 이미 정해졌으니까요.

for (int i = 0; i < number; i++) begin
	// Code
end

ⅰ. Simulation

- 예제를 참고하여 간단한 simulation 진행.

module sverilog_repeat();
	bit clk;
	always #10 clk = ~clk;

	initial begin
		bit [2:0] num = $random;

		$display ("[%0t] Repeat loop is going to start with num = %0d", $time, num);
		repeat (num) @(posedge clk);
		$display ("[%0t] Repeat loop has finished", $time);
		$finish;
	end
endmodule

- 결과는 아래 참고하세요!

더보기

run all
[0] Repeat loop is going to start with num = 4
[70000] Repeat loop has finished

Ⅵ. foreach

- python에서의 "for in a"와 매우 유사하다고 생각하시면 쉽습니다. (*이때 a는 array를 의미)

- array 형태의 변수를 이용하여 loop를 수행할 시 매우 유용합니다.

- 자동적으로 0에서부터 array의 마지막 index까지 증가시켜가면서 loop 동작을 수행합니다.

foreach(<variable>[<iterator>])
	// 1개의 수행 문장

foreach(<variable>[<iterator>]) 
begin
	// 2개 이상의 수행 문장
end

ⅰ. Simulation

- 예제를 참고하여 간단한 simulation 진행.

module sverilog_foreach();
	int array_1d[5] = '{10, 20, 30, 40, 50};
	int array_2d[5][2] = '{'{1,2}, '{3,4}, '{5,6}, '{7,8}, '{9,10}};
	int sum	= 0;

	initial
	begin
		$display ("example 1============================");
		foreach (array_1d[i])
			$display ("array_1d[%0d] = %0d", i, array_1d[i]);
			
		$display ("example 2============================");
		foreach (array_1d[l_index])
		begin
			sum += array_1d[l_index];
			$display ("array_1d[%0d] = %0d, sum = %0d", l_index, array_1d[l_index], sum);
		end
		
		$display ("example 3============================");
		foreach (array_2d[i])
			foreach (array_2d[i][j])
				$display("array_2d[%0d][%0d] = %0d", i, j, array_2d[i][j]);
	end
endmodule

- 결과는 아래 참고하세요!

더보기

# run 1000ns
example 1============================
array_1d[0] = 10
array_1d[1] = 20
array_1d[2] = 30
array_1d[3] = 40
array_1d[4] = 50
example 2============================
array_1d[0] = 10, sum = 10
array_1d[1] = 20, sum = 30
array_1d[2] = 30, sum = 60
array_1d[3] = 40, sum = 100
array_1d[4] = 50, sum = 150
example 3============================
array_2d[0][0] = 1
array_2d[0][1] = 2
array_2d[1][0] = 3
array_2d[1][1] = 4
array_2d[2][0] = 5
array_2d[2][1] = 6
array_2d[3][0] = 7
array_2d[3][1] = 8
array_2d[4][0] = 9
array_2d[4][1] = 10

반응형

'Digital Hardware Design > System verilog' 카테고리의 다른 글

Control-Case  (0) 2022.10.24
Control - condition  (0) 2022.10.11
Data type(3)  (0) 2022.10.09
data type(2)  (0) 2022.10.03
Data type  (0) 2022.09.21

댓글