verilog
Verilog에는 파일을 열고, 값을 파일로 출력하고, 파일에서 값을 읽고, 다른 변수로 로드하고, 파일을 닫을 수 있는 시스템 작업 및 기능이 있습니다.
module tb;
// Declare a variable to store the file handler
integer fd;
initial begin
// Open a new file by the name "my_file.txt"
// with "write" permissions, and store the file
// handler pointer in variable "fd"
fd = $fopen("my_file.txt", "w");
// Close the file handle pointed to by "fd"
$fclose(fd);
end
endmodule
인수 | 설명 |
---|---|
"r" 또는 "rb" | 읽기 위해 열기 |
"w" 또는 "wb" | 쓰기 위한 새 파일을 만듭니다. 파일이 있으면 길이가 0이 되도록 자르고 덮어씁니다. |
"a" 또는 "ab" | 파일이 존재하면 추가(EOF에서 쓰기 위해 열림), 그렇지 않으면 새 파일 생성 |
"r+", "r+b" 또는 "rb+" | 읽기와 쓰기 모두 가능 |
"w+", "w+b" 또는 "wb+" | 업데이트를 위해 자르거나 만들기 |
"a+", "a+b" 또는 "ab+" | EOF에서 업데이트할 새 파일 추가 또는 생성 |
함수 | 설명 |
---|---|
$f디스플레이 | $display와 유사, 대신 파일에 기록 |
$fwrite | $write와 유사, 대신 파일에 씁니다. |
$fstrobe | $strobe와 유사, 대신 파일에 기록 |
$fmonitor | $monitor와 유사, 대신 파일에 기록 |
위의 각 시스템 함수는 기수 십진수로 값을 인쇄합니다. 또한 이진, 8진 및 16진법으로 값을 인쇄하는 세 가지 다른 버전이 있습니다.
함수 | 설명 |
---|---|
$fdisplay() | 기본적으로 10진수로 인쇄 |
$fdisplayb() | 바이너리로 인쇄 |
$fdisplayo() | 8진수로 인쇄 |
$fdisplayh() | 16진수로 인쇄 |
module tb;
integer fd;
integer i;
reg [7:0] my_var;
initial begin
// Create a new file
fd = $fopen("my_file.txt", "w");
my_var = 0;
$fdisplay(fd, "Value displayed with $fdisplay");
#10 my_var = 8'h1A;
$fdisplay(fd, my_var); // Displays in decimal
$fdisplayb(fd, my_var); // Displays in binary
$fdisplayo(fd, my_var); // Displays in octal
$fdisplayh(fd, my_var); // Displays in hex
// $fwrite does not print the newline char '
' automatically at
// the end of each line; So we can predict all the values printed
// below to appear on the same line
$fdisplay(fd, "Value displayed with $fwrite");
#10 my_var = 8'h2B;
$fwrite(fd, my_var);
$fwriteb(fd, my_var);
$fwriteo(fd, my_var);
$fwriteh(fd, my_var);
// Jump to new line with '
', and print with strobe which takes
// the final value of the variable after non-blocking assignments
// are done
$fdisplay(fd, "
Value displayed with $fstrobe");
#10 my_var <= 8'h3C;
$fstrobe(fd, my_var);
$fstrobeb(fd, my_var);
$fstrobeo(fd, my_var);
$fstrobeh(fd, my_var);
#10 $fdisplay(fd, "Value displayed with $fmonitor");
$fmonitor(fd, my_var);
for(i = 0; i < 5; i= i+1) begin
#5 my_var <= i;
end
#10 $fclose(fd);
end
endmodule
시뮬레이션 로그 Value displayed with $fdisplay 26 00011010 032 1a Value displayed with $fwrite 43001010110532b Value displayed with $fstrobe 60 00111100 074 3c Value displayed with $fmonitor 60 0 1 2 3 4
시스템 기능 $fgets
[hl]fd[/hd]에 의해 지정된 파일의 문자를 str이 채워질 때까지 변수 str로 읽거나, 개행 문자를 읽어 str로 전송하거나, EOF 조건이 발생할 때까지 읽습니다.
읽는 동안 오류가 발생하면 코드 0을 반환합니다. 그렇지 않으면 읽은 문자 수를 반환합니다.
시스템 기능 $feof
EOF가 발견되면 0이 아닌 값을 반환하고, 인수로 주어진 파일 설명자에 대해 0을 반환합니다.
module tb;
reg[8*45:1] str;
integer fd;
initial begin
fd = $fopen("my_file.txt", "r");
// Keep reading lines until EOF is found
while (! $feof(fd)) begin
// Get current line into the variable 'str'
$fgets(str, fd);
// Display contents of the variable
$display("%0s", str);
end
$fclose(fd);
end
endmodule
$fdisplay
에 여러 변수가 주어졌을 때 , 단순히 공백 없이 주어진 순서대로 모든 변수를 인쇄합니다.
module tb;
reg [3:0] a, b, c, d;
reg [8*30:0] str;
integer fd;
initial begin
a = 4'ha;
b = 4'hb;
c = 4'hc;
d = 4'hd;
fd = $fopen("my_file.txt", "w");
$fdisplay(fd, a, b, c, d);
$fclose(fd);
end
endmodule
시뮬레이션 로그 10111213
$sformat
의 첫 번째 인수 시스템 함수는 결과가 배치되는 변수 이름입니다. 두 번째 인수는 format_string입니다. 다음 인수를 문자열로 형식화하는 방법을 알려줍니다.
module tb;
reg [8*19:0] str;
reg [3:0] a, b;
initial begin
a = 4'hA;
b = 4'hB;
// Format 'a' and 'b' into a string given
// by the format, and store into 'str' variable
$sformat(str, "a=%0d b=0x%0h", a, b);
$display("%0s", str);
end
endmodule
시뮬레이션 로그 xcelium> run a=10 b=0xb xmsim: *W,RNQUIE: Simulation is complete.
verilog
Verilog는 하드웨어 설명 언어이며 설계자가 RTL 설계를 시뮬레이션하여 논리 게이트로 변환할 필요가 없습니다. 시뮬레이션이 필요한 이유는 무엇입니까? 시뮬레이션은 RTL 코드가 의도한 대로 동작하는지 확인하기 위해 다른 시간에 다른 입력 자극을 설계에 적용하는 기술입니다. 기본적으로 시뮬레이션은 설계의 견고성을 검증하기 위해 잘 따라야 하는 기술입니다. 또한 가공된 칩이 실제 세계에서 사용되는 방식과 다양한 입력에 반응하는 방식과 유사합니다. 예를 들어, 위의 디자인은 출력 pe 보여진 바와 같이. 시뮬레이션을 통해
디자인 module pr_en ( input [7:0] a, input [7:0] b, input [7:0] c, input [7:0] d, input [1:0] sel, output reg [7:0] out); always @ (a or b or c or d or sel) begin if (sel == 2b00) out <= a; else if