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
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
", ®1, ®2, ®3);
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會讓你備感親切。