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會讓你備感親切。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值