• Testbench 文件读写


    1.  读操作

    读操作用到的语句是:$readmemb()或$readmemh()。

    以$readmemb()为例,它的调用为

              $readmemb("file_name",memory)

               file_name:可以是.txt、.doc等格式的文件,但必须遵守ROM的规范,即其内容形式必须如下:           

       @00  01010_01001010010010101010

       @01  000010100101001001_0010010

            .......

       @0f  0010101010101_010010010010

             其中:@后紧跟的ROM单元的地址,它必须用十六进制表示。在ROM单元地址与其后  的二进制比特流串之间至少要有一个空格(亦可以有回车);比特流可以用"_"隔开,以增强程序的可读性。

               memory:memory的声明格式为:

               reg[WORD_LEN-1 : 0]  my_rom [WORD_NUM-1 : 0];

             其中:WORD_LEN代表的是每一个ROM向量的长度,即二进制流的长度;WORD_NUM代表的是ROM向量的个数。

             值得注意的是执行完$readmemb()指令后文件中的对应单元就一次性的存储到my_rom当中。在后续的处理中my_rom只能通过其地址访问,一次性地读取对应地址上的向量,如my_rom[k];而不能访问到具体的每一位或几位,如my_rom[k][n];如果要取其中的某一位,可通过将ROM得向量赋给以个寄存器组,再进行引用,需强调的是ROM单元存储文件中向量的时候,将文件二进制串前头的数据存于高位,将二进制串中末尾的数据存于低位。

    一般情况下,可由matlab生成内存文件。

    例如:以下是一个简单的.m文件,生成test.txt 后将该txt 文件保存到Quartus II 工程中的modelsim文件夹下,注意,不管testbench.v文件保存在哪里,该txt文件必须保存在modelsim文件夹下!!!

               clear all
               clc
               fid = fopen('test.txt','wt');
                 for i  = 0 : 63
                        fprintf(fid,'@%x   %s ',i,dec2bin(i,6));
               end
               fclose(fid); 

    testbench.v code

    integer read_addr; 

    reg [7:0] mem[63:0]; // a 8-bit,

    initial

    begin

             $readmemb ( "test.txt", mem );

    end

        always@(posedge clk_x2 or posedge reset) 

        begin 

            if(reset) 

            begin    

                read_addr <= 0;

    din <= 8'd0;

            end 

            else 

            begin 

                if(read_addr <= 63) 

                begin 

                    read_addr <= read_addr + 1; 

                    din <= mem[read_addr];  

                end 

            end 

        end        

            

    2. 写操作

    写操作用用到的操作主要有$fopen(),$fdisplay()和$fclose()。

    $fopen()用于打开一个待写入得文件,并返回一个整型句柄,如:

           integer fid;//定义一个整型变量

           fid = $fopen("my_file");

    $fdisplay()用于向一个打开的文件写入一个向量,如:

            $fdisplay(fid,"%b",data_out);

        $display()将根据data_out的长度向fid指向的文件输入一个data_out长度的向量(每次写入后就加一个回车)。同时和$readmemb相似的,写入的向量索引高的放文件头,索引低的放文件尾。

    $fclose()用于关闭文件,每次文件操作结束后一定要关闭文件。

    testbench.v

        integer i=0;

       integer w_file; 

       initial w_file = $fopen("data_out.txt"); 

       always@(posedge clk_x2 or posedge reset) 

      begin 

            $fdisplay(w_file,"%h",i); 

            i <= i+1;

            if(i == 8'd255)    //共写入256个数据 

            begin

                 $fclose(w_file);

                $stop; 

             end

        end   

  • 相关阅读:
    招行面试
    今日头条面试[教育岗]
    四方精创 面试
    ArrayList 源码
    redis缓存,穿透,击穿,雪崩
    hashMap
    集合整理
    阿里CBU技术部一面
    网安面试
    php递归获取顶级父类id
  • 原文地址:https://www.cnblogs.com/chuanchuan304/p/5880614.html
Copyright © 2020-2023  润新知