Verilog의 시스템 작업은 실제 회로와 연결되지 않은 모델에 추가 기능을 삽입하는 데 사용되는 작업입니다.
Verilog에는 세 가지 주요 시스템 작업 그룹이 있습니다.
(1) 텍스트 출력
(2) 파일 입출력
(3) 시뮬레이션 제어.
모든 시스템 작업은 $로 시작하며 시뮬레이션 중에만 사용됩니다. 이러한 작업은 합성기에 의해 무시되므로 실제 회로 모델에 포함될 수 있습니다. 모든 시스템 작업은 절차 블록 내에 있어야 합니다.
텍스트 출력
텍스트 출력 시스템 작업은 문자열과 변수 값을 시뮬레이션 도구의 콘솔이나 스크립트에 인쇄하는 데 사용됩니다. 구문은 인쇄할 텍스트 문자열을 나타내는 데 큰따옴표("")가 사용되는 ANSI C를 따릅니다. 문자열에는 변수 외에 표준 텍스트를 입력할 수 있습니다. 변수는 두 가지 방법으로 인쇄할 수 있습니다. 첫 번째는 시스템 작업 함수의 변수를 큰따옴표 외부에 간단히 나열하는 것입니다.
이 사용법에서 작업이 다른 기본 형식으로 사용되지 않는 한 인쇄되는 기본 형식은 10진수입니다. 변수를 인쇄하는 두 번째 방법은 텍스트 문자열 내에서입니다. 이 사용법에서는 값을 인쇄하는 형식을 나타내는 문자열에 고유한 코드가 삽입됩니다. 문자열 뒤에는 문자열 내의 코드에 위치적으로 해당하는 변수 이름의 쉼표로 구분된 목록이 나열됩니다. 다음은 가장 일반적으로 사용되는 텍스트 출력 시스템 작업입니다.
Task | Description |
$display() | Print text string when statement is encountered and append a newline. |
$displayb() | Same as $display, but default format of any arguments is binary. |
$displayo() | Same as $display, but default format of any arguments is octal. |
$displayh() | Same as $display, but default format of any arguments is hexadecimal. |
$write() | Same as $display, but the string is printed without a newline. |
$writeb() | Same as $write, but default format of any arguments is binary. |
$writeo() | Same as $write, but default format of any arguments is octal. |
$writeh() | Same as $write, but default format of any arguments is hexadecimal. |
$strobe() | Same as $display, but printing occurs after all simulation events are executed. |
$strobeb() | Same as $strobe, but default format of any arguments is binary. |
$strobeo() | Same as $strobe, but default format of any arguments is octal. |
$strobeh() | Same as $strobe, but default format of any arguments is hexadecimal. |
$monitor() | Same as $display, but printing occurs when the value of an argument changes. |
$monitorb() | Same as $monitor, but default format of any arguments is binary. |
$monitoro() | Same as $monitor, but default format of any arguments is octal. |
$monitorh() | Same as $monitor, but default format of any arguments is hexadecimal. |
$monitoron | Begin tracking argument changes in subsequent $monitor tasks. |
$monitoroff | Stop tracking argument changes in subsequent $monitor tasks. |
다음은 문자열 내에서 변수를 인쇄하기 위한 가장 일반적인 텍스트 형식화 코드 목록입니다.
Code | Format |
%b | Binary values |
%o | Octal values |
%d | Decimal values |
%h | Hexadecimal values |
%f | Real values using decimal form |
%e | Real values using exponential form |
%t | Time values |
%s | Character strings |
%m | Hierarchical name of scope (no argument required when printing) |
%l | Configuration library binding (no argument required when printing) |
이러한 코드의 형식 문자는 대소문자를 구분하지 않습니다(즉, %d 및 %D는 동일함). 이러한 각 형식 지정 코드에는 선행 및 후행 숫자의 잘림에 대한 정보도 포함될 수 있습니다.
숫자가 잘리면 반올림됩니다. 서식 구문은 다음과 같습니다.
%<number_of_leading_digits>.<number_of_trailing_digits><format_code_letter>
텍스트 출력 시스템 작업과 함께 사용하기 위해 지원되는 문자열 형식화 및 문자 이스케이프 세트도 있습니다.
Code | Description |
\n | Print a new line. |
\t | Print a tab. |
\” | Print a quote (“). |
\cr | Print a backslash (\). |
%% | Print a percent sign (%) |
다음은 일반적인 텍스트 출력 시스템 작업을 사용하는 일련의 예입니다. 이러한 예에서 A = 3(정수) 및 B = 45.6789(실수)와 같이 두 개의 변수가 선언되고 초기화되었다고 가정합니다. Verilog는 32비트 코드를 사용하여 정수 및 실수 유형을 나타냅니다.
$display("Hello World"); $display("A = %b", A); $display("A = %o", A); $display("A = %d", A); $display("A = %h", A); $display("A = %4.0b", A); $display("B = %f", B); $display("B = %2.0f", B); $display("B = %2.1f", B); $display("B = %2.2f", B); $display("B = %e", B); $display("B = %1.0e", B); $display("B = %1.1e", B); $display("B = %2.2e", B); $write("A is ", A, "\n"); $writeb("A is ", A, "\n"); $write("A is ", A, "\n"); $writeb("A is ", A, "\n"); |
// Will print: Hello World // This will print: A = 0000000000000000000000000000011 // This will print: A = 00000000003 // This will print: A = 3 // This will print: A = 00000003 // This will print: A = 0011 // This will print: B = 45.678900 // This will print: B = 46 // This will print: B = 45.7 // This will print: B = 45.68 // This will print: B = 4.567890e+001 // This will print: B = 5e+001 // This will print: B = 4.6e+001 // This will print: B = 4.57e+001 // This will print: A is 3 // This will print: A is 00000000000000000000000000000011 // Will print: A is 00000000003 // Will print: A is 00000003 |
파일 입출력
파일 I/O 시스템 작업을 통해 Verilog 모듈은 파일이 ANSI C에서 처리되는 것과 동일한 방식으로 데이터 파일을 생성 및/또는 액세스할 수 있습니다. 이는 시뮬레이션 결과가 크고 반대로 파일에 저장해야 할 때 유용합니다. 파형 또는 스크립트 창에서 보기 이는 복잡한 자극 벡터를 외부 파일에서 읽어 테스트 중인 장치로 구동해야 하는 경우에도 유용합니다. Verilog는 다음 파일 I/O 시스템 작업 기능을 지원합니다.
Task | Description |
$fopen() | Opens a file and returns a unique file descriptor. |
$fclose() | Closes the file associated with the descriptor. |
$fdisplay() | Same as $display but statements are directed to the file descriptor. |
$fwrite() | Same as $write but statements are directed to the file descriptor. |
$fstrobe() | Same as $strobe but statements are directed to the file descriptor. |
$fmonitor() | Same as $monitor but statements are directed to the file descriptor. |
$readmemb() | Read binary data from file and insert into previously defined memory array. |
$readmemh() | Read hexadecimal data from file and insert into previously defined memory array. |
$fopen() 함수는 기존 파일을 만들고 열거나 엽니다. 열리는 각 파일에는 다른 I/O 기능에서 파일을 식별하는 데 사용되는 파일 설명자라는 고유 정수가 제공됩니다. $fopen을 처음 사용하기 전에 정수를 선언해야 합니다. 파일 이름 인수는 필수이며 큰따옴표 안에 제공됩니다. 기본적으로 파일은 쓰기 위해 열립니다. 파일 이름이 없으면 생성됩니다. 파일 이름이 있으면 덮어씁니다. 기존 파일 열기 및 파일 추가를 포함하여 파일 열기에 대한 특정 작업을 제공하는 선택적 file_type을 제공할 수 있습니다. 다음은 $fopen()에 대해 지원되는 코드입니다.
$fopen types | Description |
“r” or “rb” | Open file for reading. |
“w” or “wb” | Create for writing. |
“a” or “ab” | Open for writing and append to the end of file. |
“r+” or “r+b” or “rb+” | Open for update, reading or writing file. |
“w+” or “w+b” or “wb+” | Create for update. |
“a+” or “a+b” or “ab+” | Open or create for update, append to the end of file. |
파일이 열리면 $fdisplay(), $fwrite(), $fstrobe() 및 $fmonitor() 작업을 사용하여 파일에 데이터를 쓸 수 있습니다. 이러한 함수에는 두 개의 인수가 필요합니다. 첫 번째 인수는 파일 설명자이고 두 번째 인수는 기록할 정보입니다. 정보는 I/O 시스템 작업과 동일한 구문을 따릅니다.
다음 예제에서는 파일을 만들고 데이터를 쓰는 방법을 보여줍니다. 이 예제에서는 "Data_out.txt"라는 새 파일을 만들고 변수 A와 B의 값으로 두 줄의 텍스트를 작성합니다.
integer A = 3;
real B = 45.6789;
integer FILE_1;
initial
begin
FILE_1 = $fopen("Data_out.txt", "w");
$fdisplay(FILE_1, "A is %d", A);
$fdisplay(FILE_1, "B is %f", B);
$fclose(FILE_1);
end
파일에서 데이터를 읽을 때 $readmemb() 및 $readmemh() 함수를 사용할 수 있습니다. 이러한 작업을 수행하려면 파일 내용을 읽을 수 있는 스토리지 배열을 선언해야 합니다. 이러한 작업에는 두 개의 인수가 있습니다. 첫 번째는 파일 이름이고 두 번째 인수는 파일 내용을 저장할 스토리지 배열의 이름입니다.
다음 예는 파일의 내용을 "메모리"라는 스토리지 어레이로 읽는 방법을 보여줍니다. 파일에 각각 3비트 벡터가 포함된 8개의 줄이 있다고 가정합니다. 벡터는 000에서 시작하여 111로 증가하며 각 기호는 $readmemb() 작업을 사용하여 이진으로 해석됩니다. 스토리지 어레이 "메모리"는 reg 유형의 8 x 3 어레이로 선언됩니다. $readmemb() 작업은 파일의 각 줄을 "메모리" 내의 각 3비트 벡터 위치에 삽입합니다. 데이터가 저장되는 방식을 설명하기 위해 이 예제에는 저장 요소의 내용을 기록에 인쇄하는 두 번째 절차 블록도 포함되어 있습니다.
reg[2:0] memory[7:0];
initial
begin: Read_Block
$readmemb("Data_in.txt", memory);
end
initial
begin: Print_Block
$display("printing memory %b", memory[0]); // This will print “000”
$display("printing memory %b", memory[1]); // This will print “001”
$display("printing memory %b", memory[2]); // This will print “010”
$display("printing memory %b", memory[3]); // This will print “011”
$display("printing memory %b", memory[4]); // This will print “100”
$display("printing memory %b", memory[5]); // This will print “101”
$display("printing memory %b", memory[6]); // This will print “110”
$display("printing memory %b", memory[7]); // This will print “111”
end
시뮬레이션 제어 및 모니터링
Verilog는 또한 일련의 시뮬레이션 제어 및 모니터링 작업을 제공합니다. 다음은 이 그룹에서 가장 일반적으로 사용되는 작업입니다.
Task | Description |
$finish() | Finishes simulation and exits. |
$stop() | Halts the simulation and enters an interactive debug mode. |
$time() | Returns the current simulation time as a 64-bit vector. |
$stime() | Returns the current simulation time as a 32-bit integer. |
$realtime() | Returns the current simulation time as a 32-bit real number. |
$timeformat() | Controls the format used by the %t code in print statements. The arguments are: (<unit>, <precision>, <suffix>, <min_field_width>) where: <unit> 0 = 1 s -1 = 100 ms -2 = 10 ms -3 = 1 ms -4 = 100 μs -5 = 10 μs -6 = 1 μs -7 = 100 ns -8 = 10 ns -9 = 1 ns -10 = 100 ps -11 = 10ps -12 = 1ps -13 = 100fs -14 = 10fs -15 = 1fs <precision> The number of decimal points to display. <suffix> A string to be appended to time to indicate units. <min_field_width> The minimum number of characters to display |
다음은 이러한 작업을 사용할 수 있는 방법의 예를 보여줍니다.
initial
begin
$timeformat (-9, 2, "ns", 10);
$display("Stimulus starting at time: %t", $time);
#10 A_TB=0; B_TB=0; C_TB=0;
#10 A_TB=0; B_TB=0; C_TB=1;
#10 A_TB=0; B_TB=1; C_TB=0;
#10 A_TB=0; B_TB=1; C_TB=1;
#10 A_TB=1; B_TB=0; C_TB=0;
#10 A_TB=1; B_TB=0; C_TB=1;
#10 A_TB=1; B_TB=1; C_TB=0;
#10 A_TB=1; B_TB=1; C_TB=1;
$display("Simulation stopping at time: %t", $time);
end
이 예에서는 시뮬레이터 결과에 다음 명령문이 인쇄됩니다.
Stimulus starting at time: 0.00ns
Simulation stopping at time: 80.00ns
'프로그래밍 언어 > Verilog' 카테고리의 다른 글
[Verilog 학습] Verilog 연산자 1 (0) | 2022.04.04 |
---|---|
[Verilog 학습] Test Benches (0) | 2022.04.03 |
[Verilog 학습] 조건부 프로그래밍 구조 (0) | 2022.04.01 |
[Verilog 학습] 순차 기능 모델링 – 절차적 할당 2 (0) | 2022.03.31 |
[Verilog 학습] 순차 기능 모델링 – 절차적 할당 1 (0) | 2022.03.30 |