侧边栏壁纸
    • 累计撰写 296 篇文章
    • 累计收到 520 条评论
    Verilog语言实现读写txt文件方法
    我的学记|刘航宇的博客

    Verilog语言实现读写txt文件方法

    刘航宇
    2024-04-14 / 0 评论 / 25 阅读 / 正在检测是否收录...

    随着项目难度递增,例如AI芯片设计,不免需要验证Verilog的功能性,那么输入可以是测试集.txt,输出为预测结果/精确率.txt。下面讲解一下Verilog如何实现读写txt文件

    一、读txt文件

    1、准备一个txt文件
    MATLAB上生成的txt文件的格式为每行一个数据,与coe文件不同的是,数据之间没有逗号。由于verilog的读txt的系统函数仅仅能识别十六进制和二进制数据,一般情况下,将数据转换为十六进制数比较方便。当数据为有符号数时,可以采用下面的方式生成txt文件:

    % 生成20个随机的int16类型数据
    data_signed = int16(randi([-32768, 32767], 1, 20));
    
    % 打开文件准备写入
    fid = fopen('data_signed.txt', 'w');
    
    % 将data_signed数组中的数据转换为无符号整数并以16进制格式写入文件
    fprintf(fid, '%04x\r\n', typecast(data_signed, 'uint16'));
    
    % 关闭文件
    fclose(fid);



    其中,typecast(int16(data_signed),‘uint16’) 可以将数据转变为补码形式。同时,需要注意的是,在换行中,需要采用’\r\n‘,不能仅仅使用’\r’
    2、在testbench上读写
    读txt文件时,一般选择先将txt中的数据置入寄存器memory中,然后按照地址读出memory中的数据。

    reg  [15:0] mem [0:1023];
    reg  [9:0] addr ;
    reg  [11:0]data_out ;
    initial
    begin
      $readmemh("E:/self-study/VIVADO_workspace/prj/data_signed.txt",mem);
      addr  = 10'd0;
    end
    always #10
    begin
      data_out  =  mem[addr][11:0];
      addr = addr + 10'd1;
    end

    需要注意的是,txt文件的地址不能出错,另外,注意地址分隔符需要用’/‘,windos系统中的’\‘需要对应改过来才能使用。

    二、写txt文件

    integer handle;
    initial
    begin
     handle  =  $fopen("E:/self-study/VIVADO_workspace/prj/data_out.txt");
    end
    always@(posedge sys_clk)
    begin
      if(data_in_valid)
        begin
          $fdisplay(handle,"%d",data_out);
        end
    end

    利用initial函数初始化handle的值,另外,地址分隔符同样要改回来。

    如果仿真之后,txt文件中并没有内容,可以尝试刷新一下txt文件。如果还没有内容出现,则就是txt文件没有关闭造成的,解决方法有两种:
    ①直接关闭xsim仿真程序,此时txt文件自动关闭,内容出现。
    ②使用$fclose函数关闭文件,如果使能变量aagc_in_valid是一段高电平信号,则可以检测该信号的下降沿,在此时关闭文件即可:

      reg [2:0] valid_reg;
      always@(posedge sys_clk)
        begin
          valid_reg    <=    {valid_reg[1:0],data_in_valid};
          if(valid_reg  == 3'b110)
            begin
              $fclose(handle);
            end
        end

    甚至于,直接写一个计数器,也是可以的。

    $display语句的使用

    在功能仿真阶段调试程序时,$display是很有用的一段程序,它和java,c语言中的打印语句使用方法是相似的,可以把变量和语句运行状况打在TCL log的窗口上,供调试者知晓代码运行情况。

    $display("here is a debugging point.");
    $display("%d", data_in);

    demo案例

    module wr_txt_tb;
      reg [15:0] mem [0:1023];
      reg [9:0] addr;
      reg [15:0] data_out;
      initial begin
        $readmemh("E:/Downloads/data_signed.txt", mem);
        addr = 10'd0;
      end
    
      always #10 begin
        if (addr < 10'd20) begin // 假设您只想读取前20个数据
          data_out = mem[addr][15:0];
          addr = addr + 10'd1;
          $display("here is a debugging point.");
          $display("%h", data_out); // 以十六进制形式打印
        end else begin
          $stop; // 结束仿真
        end
      end
    endmodule


    1
    C语言编译的四个步骤
    下一篇 » 2024-03-12

    评论 (0)

    取消