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

how to read special character from a file in verilog?

我写了一个测试 Verilog 文件,从文件中读取一些数据。该文件有一些以 ### 开头的 header 行和包含 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 或 0o 这样的基本指示符。但是,我想测试它是否是一个特殊字符'#'。我该怎么做?

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