如何从verilog中的文件中读取特殊字符?

时间:2016-07-24 11:12:44

标签: file-io verilog system-verilog

在测试时,我写了一个测试verilog文件,从文件中读取一些数据。该文件有一些以' ###'开头的标题行。包含8个浮点数的重复行全部采用文本格式。如下。..

### kr = 0 ##
279.430 243.666 246.522 234.073 218.708 211.012 212.915 222.156
227.269 225.331 212.973 203.453 203.286 219.196 236.336 236.591
236.760 240.655 234.219 226.415 222.691 225.924 229.316 223.291
223.373 229.256 229.021 221.693 208.506 208.094 217.843 232.213
...
-0.000 -0.000 -0.000 -0.000 -0.000 -0.000 -0.000 -0.000
-0.000 -0.000 -0.000 -0.000 -0.000 -0.000 -0.000 2.624
### kr = 1 ##
192.269 28.298 0.356 -0.000 -0.000 -0.000 -0.000 -0.000
-0.000 -0.000 -0.000 -0.000 -0.000 -0.000 9.506 -0.000
-0.000 -0.000 -0.000 -0.000 -0.000 -0.000 -0.000 -0.000
-0.000 2.147 2.839 1.402 0.004 16.810 37.424 47.157
...

读取文件的代码如下所示(实际上,我必须阅读许多文件,但下面是一个简单的代码来测试某些方面。)。 (我使用系统verilog)

integer file;
integer c;
initial begin
    fname = $sformatf("ext1/L02_Convolution_B0_FN%03d.txt",3);
    $dislay("fname = %s", fname);
    file = $fopen(fname, "r");
    c = $fgetc(file);
    while (c != `EOF)
        begin
        if (c == '#')
            r = $fgets(line, `MAX_LINE_LENGTH, file);
        else
            begin
            r = $ungetc(c, file);
            r = $fscanf(file, "%f %f %f %f %f %f %f %f", v0, v1, v2, v3, v4, v5, v6, v7);
            $display("%f %f %f %f %f %f %f %f \n",v0, v1, v2, v3, v4, v5, v6, v7);
            c = $fgetc(file);
            end
        end
    end
    r = $fclose(file);
end

当我编译它时,我收到此错误:

ncvlog -SV tb_conv.v
ncvlog: 12.20-s008: (c) Copyright 1995-2013 Cadence Design Systems, Inc.
        if (c == '#')
                  |
ncvlog: *E,BADBSE (tb_conv.v,47|12): illegal base specification: (#) [2.5][2.5.1(IEEE)].

编译器认为' c'是一个整数,我应该有一个像0x或0的基本指标。但我想测试它是否是一个特殊的角色'#'。我怎么能这样做?

1 个答案:

答案 0 :(得分:1)

将变量c声明为string。因为您正在使用获取角色的$fgetc(file);。字符串比较的常用语法是使用双引号,如c== "#"