(原創) 如何讀取/寫入文字檔? (IC Design) (Verilog)

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


转载请注明本文地址: (原創) 如何讀取/寫入文字檔? (IC Design) (Verilog)