(原創) 如何讀取/寫入文字檔? (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

console

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)

posted on 2008-02-11 10:32 真 OO无双 阅读(...) 评论(...) 编辑 收藏

导航

统计