![]() |
![]() |
TOP > Verilog > $writememhと$writememb |
![]() |
![]() |
レジスタ配列の内容の書き出し
システム・タスクを用いて外部ファイルにレジスタ配列の内容を書き出す事ができる。
(書式) $writememh ("出力ファイル名", メモリ名, [開始アドレス], [終了アドレス]);
開始アドレスと終了アドレスは、省略できる。指定した場合、データを格納するメモリの番地を指定する。
外部ファイルを読み込ませる例は以下の通り。格納するメモリは、32ビットの10個のアドレスを持つ。
外部ファイルの書き込みのテスト
module testbench; reg CLK; reg RST; reg WFLAG; wire [11:0] ADDR; wire [31:0] XDATA; DUMMY_ROM DUMMY_ROM( .CLK(CLK), .RST(RST), .ADDR(ADDR), .XDATA(XDATA), .WFLAG(WFLAG) ); DUMMY_ADDR DUMMY_ADDR( .CLK(CLK), .RST(RST), .XADDR(ADDR) ); parameter STEP = 10; always #(STEP / 2) CLK = ~CLK; initial begin $dumpfile("wave.vcd"); $dumpvars(0, testbench); $monitor ("%t: CLK = %b, RST = %b , ADDR = %h, XDATA = %h", $time, CLK, RST, ADDR, XDATA); CLK = 0; RST = 0; WFLAG = 0; #10 RST = 1; #10 #100 WFLAG = 1; #20 $finish; end endmodule //ファイルに読み込み・書き込みするROM module DUMMY_ROM(CLK, RST, ADDR, XDATA, WFLAG); input CLK; input RST; input WFLAG; input [11:0] ADDR; output [31:0] XDATA; reg [31:0]ROM[0:9]; reg [31:0] XDATA; initial $readmemh("test.hex", ROM); always @(posedge CLK) begin if (~RST) XDATA <= 32'h0; else if (WFLAG) $writememb("dump.bin", ROM, 2, 3); else XDATA <= ROM[ADDR]; end endmodule //ROMアドレス生成 module DUMMY_ADDR(CLK, RST, XADDR); input CLK; input RST; output [11:0]XADDR; reg [11:0]XADDR; always @(posedge CLK) begin if (~RST) XADDR <= 12'h0; else if (XADDR == 12'ha) XADDR <= 12'h0; else XADDR <= XADDR + 1; end endmodule //以下はtest.hexの内容 0_0_0_0_0_0_0_0 0_0_0_0_0_0_0_1 0_0_0_0_0_0_0_2 0_0_0_0_0_0_0_3 0_0_0_0_0_0_0_4 0_0_0_0_0_0_0_5 0_0_0_0_0_0_0_6 0_0_0_0_0_0_0_7 0_0_0_0_0_0_0_8 0_0_0_0_0_0_0_9 |
![]() |
![]() |
Copyright 2007 ためになるホームページ All Rights Reserved. |