1、$fwrite 向文件写入数据 $fdisplay 格式:$fwrite(fid,"%h%hn",dout_r1,dout_r2);
(1)fwrite是需要触发条件的,需要手动添加换行。
(2)如果写放文件的格式为%d,则认为是无符号数,如下例: wire [27:0] data; fp_re = $fopen("dout.txt","w"); always @(posedge clk) begin if(dout_rdy == 1'b1) $fwrite(fileid,"%d",data); end
如果要输出有符号数据,需要将信号定义为有符号数。
eg:wire signed [27:0] data;
(3)输出顶层文件中例化的信号(或下一级例化的文件的信号)
eg:$fwrite(file_id,"%d%12dn",u_coef_update.ekxdn_i,
u_coef_update.u_mult.mult_out);
在文件coef_update中定义的信号或REG ekxdn_i,如果要输出有符号数,
要在coef_update中把ekxdn_i定义为signed;
在文件coef_update文件中例化文件u_mult,输出相应的信号mult_out. 2、$fscanf 从文件中读取数据 (1)读取格式为按行读取,一行读完之后再转向下一行; (2)读取也是需要触发条件的; always @ ( posedge clk ) begin if(cnt_test == 3'd7) begin $fscanf(coef_file,"%d%d%d%d",coef01_i,coef01_q,coef02_i,coef02_q); $fscanf(ref_file,"%d%d%d%d",ref01_i,ref01_q,ref02_i,ref02_q); end end 3、$fopen 打开文件 (1) 在读写文件之前,一定要用fopen打开文件 (2)读写路径的设置 file_id = $fopen("F:/modelsim/coef.txt"),注意这里的斜杠方向。
4、$random
random_function ::= $random [ ( seed ) ]
$random产生一个32位的有符号数,seed可以是reg,integer,time类型
Example 1—Where b is greater than 0, the expression ($random % b) gives a number in the following range: [(-b+1): (b-1)].
产生–59 到59的数: reg [23:0] rand; rand = $random % 60; Example 2—用连接符产生 0 to 59: reg [23:0] rand; rand = {$random} % 60;
=====================================
操作实例:
=====================================
integer step_file; //文件要定义成integer
//open the fileInitialBeginstep_file = $fopen("F:/Company/Src/txt/step.v","r"); file_ekxdn =$fopen("F:/Company/Src/txt/ekxdn.v","w");end always #5 clk = !clk; //read data from file
always @ ( posedge clk )//read from the file begin if( cnt_test[2:0] == 0 ) $fscanf(step_file,"%d%d",ref01_i,ref01_q); end
//write data to file wire signed[24:0] ekxdn_i,ekxdn_q; always @( posedge clk ) begin if( cnt_test[2:0] == 3'b111 ) $fwrite(nx_coef_file,"%d%12dn",nx01_coef_i,nx01_coef_q);end
读写文件的数据格式如下:
以下点要注意:
1、可能由于加密的原因,读不了txt文件,只能读。V的了
2、打开文件的$fopen语句必须放在initial 中才可以
3、必须注意路径中斜杠的方向“/”
4、相对路径的设置(请参考积累中的“相对路径与绝对路径”)
5、如果读入的是有符号数,那么要把数据的类型定义为signed
全部0条评论
快来发表一下你的评论吧 !