Ⅰ. 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 |
댓글