2017-06-15 38 views
0

我不能用Verilog讀取文本文件,該文件包含以下內容:讀了Verilog HDL文本文件

b05_test.dut.n509 0

我擋在與fgets指令scan_faults = $fgets(file_faults , string , data);,因爲它不起作用,我試圖用fsancf沒有任何積極的結果。

請幫忙嗎?


全碼:

integer file_faults; 
integer scan_faults; 
wire data; 

initial begin 
    file_faults = $fopen("faults.txt", "r"); 
    if (file_faults == 0) begin 
    $display("data_file handle was NULL"); 
    $finish; 
    end 
end 

always @(*) begin 
    if (!$feof(file_faults)) begin 
    scan_faults = $fgets(file_faults , data); 
    end 
    else begin 
    $finish; 
    $fclose(file_faults); 
    end 
end 
+2

安置自己的完整的,可運行的代碼:https://stackoverflow.com/help/mcve – toolic

+1

'$ fgets'只接受2個參數,而不是3是指遊離IEEE標準1800-2012,第21.3.4.2節「一次讀一行」。 – toolic

+0

謝謝你的回答,但我沒有看到模擬中的任何差異,我不明白爲什麼。其實我試圖給電路注入一個故障,但它不起作用。你能幫我解決這個問題嗎? – ouijdane

回答

1

IEEE Std 1800-2012 § 21.3.4.2 同時讀一本線:

一號線可以從文件中使用讀取$fgets 。例如:

integer code; 
code = $fgets (str, fd);
讀取由 fd指定入變量 str直到 str文件字符被填充,或換行字符被讀出並傳送到 str,或者遇到 EOF條件。如果 str的長度不是整數個字節,則不使用最重要的部分字節來確定大小。
如果從文件中讀取錯誤,則 code設置爲零。否則,讀取的字符數將返回 code。應用程序可以調用 $ferror來確定最新錯誤的原因(見21.3.7)。

因此,您的代碼需要看起來像這樣:

integer file_faults; 
integer scan_faults; 
reg [7:0] data; // needs to be an "integral number of bytes in length" 

initial begin 
    file_faults = $fopen("faults.txt", "r"); 
    if (file_faults == 0) begin 
    $display("data_file handle was NULL"); 
    $finish; 
    end 
    while (!$feof(file_faults)) begin 
    scan_faults = $fgets(data, file_faults); // arg order was wrong in original 
    $display("scan_faults: %0d data: %s", scan_faults, data); 
    end 
    $fclose(file_faults); // Close file before finish 
    $finish; 
end 

如果你想從一個到了變量(一個或多個),當它incounters特定的格式,然後看看$fscanf。見IEEE Std 1800-2012 § 21.3.4.3 閱讀格式的數據

+0

非常感謝你,這真的很有幫助。 – ouijdane

+0

@ouijdane,如果我的回答滿足問題,請檢查接受答案圖標。投票並接受答案是在本網站和其他堆棧交換站點上表達謝意的最佳方式。 – Greg