ISE 利用外部数据文件做测试的方法

来源:互联网 发布:vb modbus 编辑:程序博客网 时间:2024/06/05 18:11

太长不看版

以下是示例代码。

module Example;reg [287:0] msg [99:0];integer write_fID;integer read_fID;integer row_ptr;integer col_ptr;integer x;initial begin    write_fID = $fopen("out_codeword.txt","w");    //read_fID = $fopen("Test_Message.txt","r");    //x = $fread(msg,read_fID);    $readmemb("Test_Message.txt",msg);    row_ptr = 0;    col_ptr = 0;    repeat(100) begin        //repeat(288) begin            $fwrite(write_fID,"%b ",msg[row_ptr]);//[col_ptr]);            col_ptr = col_ptr + 1;        //end        row_ptr = row_ptr + 1;        col_ptr = 0;        $fwrite(write_fID,"\n");    end    $fclose(write_fID); //这句很重要endendmodule

其中Test_Message.txt放外部数据,读入到寄存器msg,再把msg输出到out_codeword.txt
Test_Message.txt格式如下

1100000100101001011111010101100111......【共288个0/1】0010100110100110101000111000011110............【共100行】

正文

模块文件写完了,就要去测试它,简单的小模块(比如什么加法器分频器),手写测试样例也无所谓,但是一旦逻辑复杂,而且要求测试严密,覆盖所有情况的时候,就需要专门的测试样例了。这些样例一般体积大,数量多,而且基本不是你写的。这就决定了,这些样例一般是以文件的形式给到你手上的。所以在testbench里就需要有接口拿到这些文件里的测试数据。

我们可以通过ISE的系统函数完成这个功能。
我们要用到的有以下几个系统函数

  • $readmemb 或者 $readmemh
  • $fopen
  • $fwrite
    下面逐个讲怎么用

一个完整的数据循环应该是这样的:

Created with Raphaël 2.1.0输入数据(文件)输入数据(寄存器)模块内处理输出数据(寄存器) 输出数据(文件)

文件->寄存器阶段,需要用到
$readmemb
用法如下:

reg [data_width-1 : 0] msg [data_count-1 : 0];$readmemb("TestFilePath/testFile.posfix",msg);

上面的两行代码,第一行定义了一个位宽为data_width,长度为data_count的寄存器组;
第二行把testFile.posfix里的数据读入了msg里
数据文件的格式参见博文一开始的“太长不看版”
注意readmemb是读入二进制数据,但不是读入二进制文件。就是说,测试数据只能有‘0’和‘1’,但是每个0/1需要占1个byte而不能是一个bit
如果需要读入的数据不是二进制的,可以用$readmemh,这个是读16进制的,读2~15进制的数据也可以用16进制的函数来读,不影响结果。

寄存器->处理->输出寄存器 阶段,不讲了,跟一般的测试是一样的。

输出寄存器->输出文件阶段 ,需要用到
$fopen
$fclose
$fwrite
用法如下:

integer write_fID;write_fID = $fopen("out_codeword.txt","w");$fwrite(write_fID,"%b ",msg[row_ptr]);

不需要过多解释,对C语言有基础性的了解就可以看懂上面的代码。

0 0