2016-07-24 25 views
0

Während ich etwas getestet habe, habe ich eine Test-Verilog-Datei geschrieben, die einige Daten aus einer Datei liest. Die Datei hat einige Kopfzeilen, die mit '###' beginnen, und wiederholte Zeilen mit 8 Gleitkommazahlen, alle im Textformat. Wie unten ..Wie liest man ein Sonderzeichen aus einer Datei in Verilog?

### 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 
... 

Der Code liest die Datei wie unten ist (Eigentlich habe ich viele Dateien zu lesen, aber unten ist ein einfacher Code, einige Aspekte zu testen.). (Ich bin mit System 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 

Als ich es kompilieren, bekomme ich diesen Fehler:

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)]. 

der Compiler denkt 'c' eine ganze Zahl ist und sollte eine Base-Indikator wie 0x haben oder 0o, denke ich. Aber ich möchte testen, ob es ein Sonderzeichen "#" ist. Wie kann ich das machen?

+2

Haben Sie versucht, 'c' als' string' zu deklarieren und doppelte Anführungszeichen im Vergleich 'c ==" # "' zu verwenden. – sharvil111

+2

oh, das hat es gelöst. Vielen Dank! Ich hatte "String c" versucht, aber nicht auf "#" geändert. :) (Vielleicht möchten Sie Ihren Kommentar als Antwort erneut posten, dann kann ich ihn als Antwort markieren). –

Antwort

1

Deklarieren Sie die Variable c als string. Da Sie $fgetc(file); verwenden, erhält ein Zeichen. Eine allgemeine Syntax für den Zeichenfolgenvergleich verwendet doppelte Anführungszeichen wie c== "#".