工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Industrial programming >> Verilog

Verilog ファイルの IO 操作

Verilog には、ファイルを開く、ファイルに値を出力する、ファイルから値を読み取る、他の変数にロードする、ファイルを閉じることができるシステム タスクと関数があります。

ファイルの開閉

  
  
module tb;
	// Declare a variable to store the file handler
	integer fd;
	
	initial begin
		// Open a new file by the name "my_file.txt" 
		// with "write" permissions, and store the file
		// handler pointer in variable "fd"
		fd = $fopen("my_file.txt", "w");
		
		// Close the file handle pointed to by "fd"
		$fclose(fd);
	end
endmodule

  

ファイルモードを開く

引数 説明
「r」または「rb」 閲覧用に開く
"w" または "wb" 書き込み用の新しいファイルを作成します。ファイルが存在する場合は、長さ 0 に切り詰めて上書きします
「a」または「ab」 ファイルが存在する場合は追加 (EOF で書き込み用に開く)、存在しない場合は新しいファイルを作成
「r+」、「r+b」または「rb+」 読み書き両方可能
"w+"、"w+b" または "wb+" 更新のために切り捨てるか作成する
「a+」、「a+b」、または「ab+」 追加、または EOF での更新用に新しいファイルを作成

ファイルの書き方

関数 説明
$fdisplay $display と同様に、代わりにファイルに書き込みます
$fwrite $write と同様に、代わりにファイルに書き込みます
$fstrobe $strobe と同様に、代わりにファイルに書き込みます
$fmonitor $monitor と同様に、代わりにファイルに書き込みます

上記の各システム関数は、基数 10 進数で値を出力します。また、値を 2 進数、8 進数、16 進数で出力する 3 つのバージョンもあります。

関数 説明
$fdisplay() デフォルトで 10 進数で出力
$fdisplayb() バイナリで出力
$fdisplayo() 8 進数で表示
$fdisplayh() 16 進数で表示
  
  
module tb;
	integer  	fd;
	integer 	i;
	reg [7:0] 	my_var;
	
	initial begin
		// Create a new file
		fd = $fopen("my_file.txt", "w");
		my_var = 0;
		
      $fdisplay(fd, "Value displayed with $fdisplay");
		#10 my_var = 8'h1A;
		$fdisplay(fd, my_var);      // Displays in decimal
		$fdisplayb(fd, my_var); 	// Displays in binary
		$fdisplayo(fd, my_var); 	// Displays in octal
		$fdisplayh(fd, my_var); 	// Displays in hex
		
	  // $fwrite does not print the newline char '
' automatically at 
	  // the end of each line; So we can predict all the values printed
	  // below to appear on the same line
      $fdisplay(fd, "Value displayed with $fwrite");
		#10 my_var = 8'h2B;
		$fwrite(fd, my_var);
		$fwriteb(fd, my_var);
		$fwriteo(fd, my_var);
		$fwriteh(fd, my_var);
		
     
      // Jump to new line with '
', and print with strobe which takes
      // the final value of the variable after non-blocking assignments
      // are done
      $fdisplay(fd, "
Value displayed with $fstrobe");
		#10 my_var <= 8'h3C;
		$fstrobe(fd, my_var);
		$fstrobeb(fd, my_var);
		$fstrobeo(fd, my_var);
		$fstrobeh(fd, my_var);
		
      #10 $fdisplay(fd, "Value displayed with $fmonitor");
	  $fmonitor(fd, my_var);
		
		for(i = 0; i < 5; i= i+1) begin
			#5 my_var <= i;
		end
      
      #10 $fclose(fd);
	end
endmodule

  
シミュレーションログ
Value displayed with $fdisplay
26
00011010
032
1a
Value displayed with $fwrite
 43001010110532b
Value displayed with $fstrobe
 60
00111100
074
3c
Value displayed with $fmonitor
 60
  0
  1
  2
  3
  4

ファイルの読み方

セリフを読む

システム関数 $fgets [hl]fd[/hd] で指定されたファイルから変数 str に文字を読み取り、str が満たされるまで、または改行文字が読み取られて str に転送されるまで、または EOF 条件が検出されるまで。

読み取り中にエラーが発生すると、コード 0 が返されます。それ以外の場合は、読み取った文字数を返します。

EOF の検出

システム関数 $feof EOF が見つかった場合はゼロ以外の値を返し、それ以外の場合は引数として指定されたファイル記述子に対してゼロを返します。

  
  
module tb;
	reg[8*45:1] str;
	integer  	fd;
	
	initial begin
	  fd = $fopen("my_file.txt", "r");
	  
	  // Keep reading lines until EOF is found
      while (! $feof(fd)) begin
      
      	// Get current line into the variable 'str'
        $fgets(str, fd);
        
        // Display contents of the variable
        $display("%0s", str);
      end
      $fclose(fd);
	end
endmodule

  

fdisplay への複数の引数

$fdisplay に複数の変数を与える場合 、指定された順序ですべての変数をスペースなしで次々に出力するだけです。

  
  
module tb;
  reg [3:0] a, b, c, d;
  reg [8*30:0] str;
  integer fd;
  
  initial begin
    a = 4'ha;
    b = 4'hb;
    c = 4'hc;
    d = 4'hd;
    
    fd = $fopen("my_file.txt", "w");
    $fdisplay(fd, a, b, c, d);
    $fclose(fd);
  end
endmodule

  
シミュレーションログ
10111213

データを文字列にフォーマットする

$sformat の最初の引数 システム関数は、結果が配置される変数名です。 2 番目の引数は format_string です これは、次の引数を文字列にフォーマットする方法を示します。

  
  
module tb;
	reg [8*19:0] str;
	reg [3:0] a, b;
	
	
	initial begin
		a = 4'hA;
		b = 4'hB;
		
		// Format 'a' and 'b' into a string given
		// by the format, and store into 'str' variable
		$sformat(str, "a=%0d b=0x%0h", a, b);
		$display("%0s", str);
	end
endmodule

  
シミュレーションログ
xcelium> run
a=10 b=0xb
xmsim: *W,RNQUIE: Simulation is complete.


Verilog

  1. Verilog チュートリアル
  2. Verilog 連結
  3. Verilog 割り当て
  4. Verilog ブロッキング &ノンブロッキング
  5. Verilog 関数
  6. Verilog タスク
  7. Verilog クロック ジェネレーター
  8. Verilog 数学関数
  9. Verilog タイムフォーマット
  10. Verilog タイムスケール スコープ
  11. Verilog ハローワールド