热度 1| ||
1.打开文件
integer file_id;
file_id = $fopen("file_path/file_name");
1). 文件使用方式由r,w,a,t,b,+六个字符拼成,各字符的含义是:
2.写入文件:$fmonitor,$fwrite,$fdisplay,$fstrobe
//$fmonitor只要有变化就一直记录
$fmonitor(file_id, "%format_char", parameter);
$fmonitor(file_id, "%m: %t in1=%d o1=%h", $time, in1, o1);
//$fwrite需要触发条件才记录
$fwrite(file_id, "%format_char", parameter);
//$fdisplay需要触发条件才记录
$fdisplay(file_id, "%format_char", parameter);
$fstrobe();
3.读取文件:$fread
integer file_id;
file_id = $fread("file_path/file_name", "r");
4.关闭文件:$fclose
$fclose(fjile_id);
5.由文件设定存储器初值:$readmemh,$readmemb
$readmemh("file_name", memory_name"); //初始化数据为十六进制
$readmemb("file_name", memory_name"); //初始化数据为二进制
6、文件显示:$monitor,$write,$display
$display,$write用于输出信息
$display("rvel = %h hex %d decimal",rvel,rvel);
$monitor($time, ,"rxd = %b txd = %b",rxd ,txd)
6、文件定位
$fseek,文件定位,可以从任意点对文件进行操作;
$fscanf,对文件一行进行读写。
7、退出仿真器$finish
8、随机数据产生:$random
$random一般的用法是:$ramdom % b ,其中 b>0.它给出了一个范围在(-b+1):(b-1)中的随机数。
例1:reg[23:0] rand; rand = $random % 60; 给出了一个范围在-59到59之间的随机数。
例2:reg[23:0] rand; rand = {$random} % 60; 通过位并接操作产生一个值在0到59之间的数。
例3:reg[23:0] rand; rand =
min+{$random}%(max-min+1);
1 下面是一些常见的应用:
2 1、读写文件
3 `timescale 1 ns/1 ns
4 module FileIO_tb;
5 integer fp_r, fp_w, cnt;
6 reg [7:0] reg1, reg2, reg3;
7 initial begin
8 fp_r = $fopen("data_in.txt", "r");
9 fp_w = $fopen("data_out.txt", "w");
10
11 while(!$feof(fp_r)) begin
12 cnt = $fscanf(fp_r, "%d %d %d", reg1, reg2, reg3);
13 $display("%d %d %d", reg1, reg2, reg3);
14 $fwrite(fp_w, "%d %d %d\n", reg3, reg2, reg1);
15 end
16
17 $fclose(fp_r);
18 $fclose(fp_w);
19 end
20 endmodule
21 2、
22 integer file, char;
23 reg eof;
24 initial begin
25 file = $fopenr("myfile.txt");
26 eof = 0;
27 while (eof == 0) begin
28 char = $fgetc(file);
29 eof = $feof (file);
30 $display ("%s", char);
31 end
32 end
33 3、文件处理定位
34 `define SEEK_SET 0
35 `define SEEK_CUR 1
36 `define SEEK_END 2
37 integer file, offset, position, r;
38 r = $fseek(file, 0, `SEEK_SET);
39 r = $fseek(file, 0, `SEEK_CUR);
40 r = $fseek(file, 0, `SEEK_END);
41 r = $fseek(file, position, `SEEK_SET);
42 4、
43 integer r, file, start, count;
44 reg [15:0] mem[0:10], r16;
45 r = $fread(file, mem[0], start, count);
46 r = $fread(file, r16);
47 5、
48 integer file, position;
49 position = $ftell(file);
50 6、
51 integer file, r, a, b;
52 reg [80*8:1] string;
53 file = $fopenw("output.log");
54 r = $sformat(string, "Formatted %d %x", a, b);
55 r = $sprintf(string, "Formatted %d %x", a, b);
56 r = $fprintf(file, "Formatted %d %x", a, b);
57 7、
58 integer file, r;
59 file = $fopenw("output.log");
60 r = $fflush(file);
61 8、
62 // This is a pattern file - read_pattern.pat
63 // time bin dec hex
64 10: 001 1 1
65 20.0: 010 20 020
66 50.02: 111 5 FFF
67 62.345: 100 4 DEADBEEF
68 75.789: XXX 2 ZzZzZzZz
69 `timescale 1ns / 10 ps
70 `define EOF 32'hFFFF_FFFF
71 `define NULL 0
72 `define MAX_LINE_LENGTH 1000
73
74 module read_pattern;
75 integer file, c, r;
76 reg [3:0] bin;
77 reg [31:0] dec, hex;
78 real real_time;
79 reg [8*`MAX_LINE_LENGTH:0] line;
80
81 initial
82 begin : file_block
83 $timeformat(-9, 3, "ns", 6);
84 $display("time bin decimal hex");
85 file = $fopenr("read_pattern.pat");
86 if (file == `NULL) // If error opening file
87 disable file_block; // Just quit
88
89 c = $fgetc(file);
90 while (c != `EOF)
91 begin
92
93 if (c == "/")
94 r = $fgets(line, `MAX_LINE_LENGTH, file);
95 else
96 begin
97 // Push the character back to the file then read the next time
98 r = $ungetc(c, file);
99 r = $fscanf(file," %f:\n", real_time);
100
101 // Wait until the absolute time in the file, then read stimulus
102 if ($realtime > real_time)
103 $display("Error - absolute time in file is out of order - %t",
104 real_time);
105 else
106 #(real_time - $realtime)
107 r = $fscanf(file," %b %d %h\n",bin,dec,hex);
108 end // if c else
109 c = $fgetc(file);
110 end // while not EOF
111
112 r = $fcloser(file);
113 end // initial
114
115 // Display changes to the signals
116 always @(bin or dec or hex)
117 $display("%t %b %d %h", $realtime, bin, dec, hex);
118
119 endmodule // read_pattern
120 9、自动比较输出结果
121 `define EOF 32'hFFFF_FFFF
122 `define NULL 0
123 `define MAX_LINE_LENGTH 1000
124 module compare;
125 integer file, r;
126 reg a, b, expect, clock;
127 wire out;
128 reg [`MAX_LINE_LENGTH*8:1];
129 parameter cycle = 20;
130
131 initial
132 begin : file_block
133 $display("Time Stim Expect Output");
134 clock = 0;
135
136 file = $fopenr("compare.pat");
137 if (file == `NULL)
138 disable file_block;
139
140 r = $fgets(line, MAX_LINE_LENGTH, file); // Skip comments
141 r = $fgets(line, MAX_LINE_LENGTH, file);
142
143 while (!$feof(file))
144 begin
145 // Wait until rising clock, read stimulus
146 @(posedge clock)
147 r = $fscanf(file, " %b %b %b\n", a, b, expect);
148
149 // Wait just before the end of cycle to do compare
150 #(cycle - 1)
151 $display("%d %b %b %b %b", $stime, a, b, expect, out);
152 $strobe_compare(expect, out);
153 end // while not EOF
154
155 r = $fcloser(file);
156 $stop;
157 end // initial
158
159 always #(cycle / 2) clock = !clock; // Clock generator
160
161 and #4 (out, a, b); // Circuit under test
162 endmodule // compare
163 10、从文件中读数据到mem(这个好像一般人用的最多了)
164 `define EOF 32'HFFFF_FFFF
165 `define MEM_SIZE 200_000
166 module load_mem;
167 integer file, i;
168 reg [7:0] mem[0:`MEM_SIZE];
169 reg [80*8:1] file_name;
170 initial
171 begin
172 file_name = "data.bin";
173 file = $fopenr(file_name);
174 i = $fread(file, mem[0]);
175 $display("Loaded %0d entries \n", i);
176 i = $fcloser(file);
177 $stop;
178 end endmodule // load_mem
/2