热度 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