-
[SystemVerilog] 절차적 할당 1개발/SystemVerilog 2022. 1. 11. 22:15
시스템베릴로그에서 procedural statement 기능이 강화됐다.
기존 베릴로그는 begin .. end / fork .. join / task .. endtask 같은 코드블럭을 지정하는 키워드 쌍에서 시작 부분에만 블록에 label을 지정할 수 있었다. 시스템베릴로그에서는 블록의 끝에도 label을 지정할 수 있다.
// 베릴로그 문법 module test; initial begin : initial_block ... end endmodule // 시스템베릴로그 문법 module test; initial begin : initial_block ... end : initial_block endmodule // 시스템베릴로그 문법 module test; initial initial_block : begin // label 먼저 올 수도 있다. ... end : initial_block // 끝부분에는 label이 나중에 와야함 endmodule
특이한 점은 블록의 label을 지정할 때 블록의 시작 전에 label을 붙일 수 있다. 하지만 블록의 끝에는 무조건 label이 뒤에 와야한다.
루프 구문도 강화됐다고 한다.
// 베릴로그 int i; for (i = 0; i < 10; i=i+1) begin ... end // 시스템베릴로그 for (int i = 0; i < 10; i=i+1) begin ... end // 여러변수의 초기조건 및 step 지정 for (int i = 1; int j = 2; i + j < 100; i=i+1, j=j+2) begin ... end
대부분의 시스템베릴로그 책에선 for 루프의 내부에서 루프변수를 선언하고 초기화 할 수 있다고 하는데
그냥 베릴로그에서도 루프 내부에서 변수 선언 가능하다.
또 루프 내부에서 여러개의 변수 선언 및 스텝을 지정할 수 있다고 하는데 이거도 베릴로그에서 해보니까 된다.
C 언어처럼 do while 구문이 추가되었다.
사용법은 C언어랑 같다.
do cnt <= cnt + 1; while (enable); do cnt <= cnt + 1; if (cnt == 10) break; while (enable); do if (pass) continue; cnt <= cnt + 1; while (enable);
루프구문에 대해서 break, continue 키워드가 추가되었다.
기능은 C언어와 같다.
foreach 구문도 추가됐다.
특이하게 루프인덱스를 따로 선언할 필요 없이 바로 쓸 수 있다.
int arr[15:0]; foreach (arr[i]) // 변수 i 선언할 필요 없음 arr[i] = i; login arr2d [7:0][4:0]; foreach (arr2d[i, j]) // 2d array arr2d[i][j] = i + j;
루프변수 i는 루프 밖에서는 참조할 수 없다. 오직 루프 안에서만 존재하는 변수이다.
또한 루프변수는 read only 이다.
2차원 배열에 대해서도 인덱스가 순차적으로 순회한다.
'개발 > SystemVerilog' 카테고리의 다른 글
[SystemVerilog] 연산자 (0) 2022.01.13 [SystemVerilog] 절차적 할당 2 (0) 2022.01.11 [SystemVerilog] 데이터 타입 2 (0) 2022.01.10 [SystemVerilog] 데이터 타입 1 (0) 2022.01.10 [SystemVerilog] 시스템베릴로그 개요 (0) 2022.01.10