原文地址为:
(原創) 如何讀取/寫入文字檔? (IC Design) (Verilog)
Abstract
Verilog雖然為硬體描述語言,亦提供讀取/寫入文字檔的功能。
Introduction
為什麼需要用Verilog讀取/寫入文字檔呢?主要用在寫Testbench,並且有兩個優點:
1.資料處理的個數不需寫死在Testbench內。
2.文字檔可以用其他更強大的語言產生,如C/C++、Python。
3.將資料輸出到文字檔後,可用其他語言分析,如C/C++、Python、Excel。
Verilog
1
/*
2
(C) OOMusou 2008
http://oomusou.cnblogs.com
3
4
Filename : FileIO_tb.v
5
Compiler : ModelSim SE 6.1f
6
Description : Demo how to access text file
7
Release : 02/11/2008 1.0
8
*/
9
10
`timescale
1
ns
/
1
ns
11
12
module FileIO_tb;
13
14
integer fp_r, fp_w, cnt;
15
reg [
7
:
0
] reg1, reg2, reg3;
16
17
initial begin
18
fp_r
=
$fopen(
"
data_in.txt
"
,
"
r
"
);
19
fp_w
=
$fopen(
"
data_out.txt
"
,
"
w
"
);
20
21
while
(
!
$feof(fp_r)) begin
22
cnt
=
$fscanf(fp_r,
"
%d %d %d
"
, reg1, reg2, reg3);
23
$display(
"
%d %d %d
"
, reg1, reg2, reg3);
24
$fwrite(fp_w,
"
%d %d %d\n
"
, reg3, reg2, reg1);
25
end
26
27
$fclose(fp_r);
28
$fclose(fp_w);
29
end
30
31
endmodule
Command Window
data_in.txt
1
2
3
4
5
6
data_out.txt
3
2
1
6
5
4
18行
fp_r
=
$fopen(
"
data_in.txt
"
,
"
r
"
);
fp_w
=
$fopen(
"
data_out.txt
"
,
"
w
"
);
$fopen()類似C語言的fopen(),連參數都一樣,主要用來開啟檔案,並取得file handle。
21行
while
(
!
$feof(fp_r)) begin
end
使用while迴圈,若不是最後一行,則一直讀取,類似c語言的while(!foef(fp_r)) {}。
22行
cnt
=
$fscanf(fp_r,
"
%d %d %d
"
, reg1, reg2, reg3);
$fscanf()類似C語言的fscanf(),連參數都一樣,可將資料從文字檔讀入變數;與C語言不同的是,$fscanf()傳回讀入的變數個數,一定得用一個變數去接,但C語言的fscanf()則可忽略。
23行
$display(
"
%d %d %d
"
, reg1, reg2, reg3);
$display()類似C語言的printf(),可將變數顯示在commanr window,並且自動換行。
24行
$fwrite(fp_w,
"
%d %d %d\n
"
, reg3, reg2, reg1);
$fwrite()類似C語言的fprintf(),可將變數寫入文字檔。
27行
$fclose(fp_r);
$fclose(fp_w);
$fclose()類似C語言的fclose(),可關閉檔案。
所對應的C語言
1
/*
2
(C) OOMusou 2008
http://oomusou.cnblogs.com
3
4
Filename : FileIO.c
5
Compiler : Visual C++ 8.0
6
Description : Demo how to access text file
7
Release : 02/11/2008 1.0
8
*/
9
10
#include
<
stdio.h
>
11
12
int
main() {
13
FILE
*
fp_r
=
fopen(
"
data_in.txt
"
,
"
r
"
);
14
FILE
*
fp_w
=
fopen(
"
data_out.txt
"
,
"
w
"
);
15
16
int
reg1, reg2, reg3;
17
while
(
!
feof(fp_r)) {
18
fscanf(fp_r,
"
%d %d %d
"
,
&
reg1,
&
reg2,
&
reg3);
19
printf(
"
%d %d %d\n
"
, reg1, reg2, reg3);
20
fprintf(fp_w,
"
%d %d %d\n
"
, reg3, reg2, reg1);
21
}
22
23
fclose(fp_r);
24
fclose(fp_w);
25
}
Conclusion
在COM、.NET之前,不同語言之間要合作,唯一的管道就是文字檔。Verilog是硬體語言,若要和軟體語言合作,又得使用文字檔這種古老的方法了。
Verilog是一個C-Like的語言,連system function也特意地跟C語言靠攏,本例又再度得到證明,Verilog程式碼幾乎與C語言一行一行的對應。若你原本熟悉軟體的C語言,又想切入硬體描述語言,Verilog會讓你備感親切。
See Also
(原創) 如何讀取/寫入文字檔? (C)
转载请注明本文地址:
(原創) 如何讀取/寫入文字檔? (IC Design) (Verilog)