verilog中文件的读写操作

————————————————
版权声明:本文为CSDN博主「FPGADesigner」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/fpgadesigner/article/details/80470972

版权声明:本文为CSDN博主「muyiwushui」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/muyiwushui/article/details/79417914

大部分编译器和仿真器在读文件的时候需要预先打开文件。在VIVADO自带仿真器中,读文件不需要预先打开要读取的文件,也不需要将文件加入VIVADO工程内部,只需要利用系统函数readmemh、readmemb就可以了(readmemh表示读取16进制数、readmemb表示读取二进制数)。函数使用方式例子1如下:

  reg [31:0] mem [0:100]
  $readmemh(“D:/…/filename.txt”,mem,0,100);

其中,“D:/…/”表示文件路径(注意是“/”,方向不能反,与windows系统中的文件路径使用的“\”不同。如果不指定路径,向上面程序一样直接写文件名字,那么该文件必须和testbench文件在同一路径下。);
“filename.txt”表示文件;
“mem”为预先定义的寄存器组;
“0”读取文件内容的初始地址;
“100”读取文件内容的结束地址。
读取文件格式最好是纯数据,且每一行最好只有一个数。对应不同的系统函数,数字需要对应的进制。

示例代码2如下:

integer i;   //数组坐标
reg [9:0] stimulus[1:data_num];  //数组形式存储读出的数据

initial 
begin
    $readmemb("SinIn.txt", stimulus);  //将txt文件中的数据存储在数组中
    i = 0;
    repeat(data_num) begin   //重复读取数组中的数据
        i = i + 1;
        din = stimulus[i]; 
        #clk_period;         //每个时钟读取一次
    end
end           

用“数组”来表述Verilog HDL中的定义并不准确,但对大多数人来说应该更好理解。可以将stimulus视作一个存储器,[9:0]定义了数据的位宽,[1:data_num]定义了存储器的深度。stimulus的定义应该与txt文件中的数据相匹配。txt文件中每行存储一个数据,则上述定义对应的是txt中存储了data_num个数据,每个数据的最大位宽为10bit。repeat(n) begin … end中的内容应该根据设计的需要编写。

将数据写入txt文件

示例代码如下:

​integer out_file;//定义文件句柄

initial

begin​

    out_file = $fopen("path/out_put_file.txt","w");​//获取文件句柄

end​

always @(条件)

……​

    $fwrite(out_file,"%d",$signed(reg_data))​​;      //fwrite写下一个数不会自动转行,可以加\n来转行
  // $fwrite(out_file,"%d",$signed(reg_data))​​;     //fdisplay则会自动转行
……

写入文件需要先用$fopen系统任务打开文件,这个系统任务在打开文件的同时会清空文件,并返回一个句柄,如果句柄为0则表示打开文件失败。

如果原来不存在该文件,则会自动创建该文件。

打开文件之后便可以用得到的句柄和$fdisplay系统任务向文件中写入数据。这个系统任务和我们在C++中常用的fprintf函数的用法很像。

上面的程序中是将数据转换为带符号数signed后再写入,必须说明转换与否是有差别的,如果按默认的unsigned的格式写入txt的是无符号数。

以下为近期代码中读写操作

 integer out_file; 
 
 initial begin
       out_file = $fopen("F:/2018_02/b1c_test/result.txt","w");
    end

某条件下:
      $fwrite(out_file,"%b\n",xor_bit); 
  • 2
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值